2025-04-10 10:28:07 +08:00
|
|
|
|
import { examinationStuAbsent, getExaminationItem, getExaminationStudentInfo } from '../api/userInfo';
|
|
|
|
|
|
import router from '@ohos.router';
|
|
|
|
|
|
import FaceCompare from './compontents/FaceCompare';
|
|
|
|
|
|
import { writeObjectOut } from '../api/judge';
|
|
|
|
|
|
import testNapi from '@ohos.idcard';
|
|
|
|
|
|
import IDCardSDK from '@ohos.idcard';
|
|
|
|
|
|
import common from '@ohos.app.ability.common';
|
|
|
|
|
|
import promptAction from '@ohos.promptAction';
|
|
|
|
|
|
import FilePhoto from './judgeSDK/utils/filePhoto';
|
|
|
|
|
|
|
|
|
|
|
|
import { CandidateData, EmptyCandidateObject } from '../mock/CandidateData';
|
|
|
|
|
|
import BoardPrePareSetPopup from './compontents/judge/BoardPrePareSetPopup';
|
|
|
|
|
|
import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements';
|
2025-04-11 14:08:48 +08:00
|
|
|
|
|
2025-04-10 10:28:07 +08:00
|
|
|
|
import imageBtn from './compontents/imageBtn';
|
|
|
|
|
|
import { CryptoJS } from '@ohos/crypto-js';
|
|
|
|
|
|
|
|
|
|
|
|
import {
|
|
|
|
|
|
BeginExamRequest,
|
|
|
|
|
|
CarInfoType,
|
2025-06-11 17:50:37 +08:00
|
|
|
|
CenterCallBackMsgType,
|
2025-04-10 10:28:07 +08:00
|
|
|
|
DrvexamType,
|
|
|
|
|
|
ExaminationStuAbsentParams,
|
|
|
|
|
|
ExaminerLoginInfo,
|
|
|
|
|
|
GetExaminationItemRsp,
|
|
|
|
|
|
IdCard,
|
|
|
|
|
|
LabelBlockType,
|
|
|
|
|
|
MASYSSETTableType,
|
|
|
|
|
|
RegulatoryInterfaceParams,
|
|
|
|
|
|
RouteParamsType,
|
|
|
|
|
|
SckType,
|
|
|
|
|
|
SystemParamType,
|
|
|
|
|
|
UDPParamType,
|
|
|
|
|
|
User
|
|
|
|
|
|
} from '../model';
|
|
|
|
|
|
import { BusinessError } from '@ohos.base';
|
|
|
|
|
|
import { GetSyncData, SqlInsertTable } from '../utils/table/Operation';
|
|
|
|
|
|
import { GetCurrentUserKeyValue } from './UserInfo/utils';
|
|
|
|
|
|
import dayTs from '../utils/Date';
|
|
|
|
|
|
import { GetCurrentTime, NumberToByteArray } from '../utils/Common';
|
|
|
|
|
|
import DB from '../utils/DbSql';
|
2025-04-10 15:10:31 +08:00
|
|
|
|
import { CenterUDPBusinessInstance } from '../utils/business/CenterUdpBusiness';
|
2025-04-10 10:28:07 +08:00
|
|
|
|
import { JudgeEmitterInstance } from '../utils/business/UdpEvent';
|
2025-07-04 10:50:33 +08:00
|
|
|
|
import { JudgeConfig, StartExamTag } from '../config';
|
2025-06-23 17:24:47 +08:00
|
|
|
|
import { dConsole } from '../utils/LogWorker';
|
2025-06-26 11:18:07 +08:00
|
|
|
|
import HeaderComponent from './compontents/Header';
|
|
|
|
|
|
import AvatarComponent from './UserInfo/Avatar';
|
|
|
|
|
|
import CommTextComponent from './UserInfo/CommText';
|
|
|
|
|
|
import LabelBlockComponent from './UserInfo/LabelBlock';
|
2025-06-26 14:27:10 +08:00
|
|
|
|
import CarLoadingDialog from './compontents/CarLoading';
|
2025-06-26 17:28:28 +08:00
|
|
|
|
import ConfirmDialog from './compontents/ConfirmDialog';
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
@Entry
|
|
|
|
|
|
@Component
|
2025-06-24 10:58:43 +08:00
|
|
|
|
struct UserInfoPage {
|
2025-04-10 10:28:07 +08:00
|
|
|
|
@State pageIndex: number = 0
|
|
|
|
|
|
@State index: number = 0
|
|
|
|
|
|
@State stepFlag: boolean = false;
|
|
|
|
|
|
@State errorMsg: string = ''
|
|
|
|
|
|
@State ksxtbh: string = ''
|
|
|
|
|
|
@State pic: string = ''
|
|
|
|
|
|
@State jkxlh: string = ''
|
|
|
|
|
|
@State @Watch('changeFaceCompareSuccess') faceCompareSucess: number = 0;
|
|
|
|
|
|
@State @Watch('changeQkfn') getqkFlag: boolean = false;
|
|
|
|
|
|
@State @Watch('outClick') outFlag: boolean = false;
|
|
|
|
|
|
@State showFaceCompare: boolean = false;
|
|
|
|
|
|
@State url: string = ''
|
|
|
|
|
|
@State lsh: string = ''
|
|
|
|
|
|
@State qkFlag: boolean = false
|
|
|
|
|
|
@State isBoardPrePareSetPopupOpen: boolean = false
|
|
|
|
|
|
@State isSecondBoardPrePareSetPopupOpen: boolean = false
|
|
|
|
|
|
@State isFirstBoardPrePareSetPopupBtnShow: boolean = false
|
|
|
|
|
|
@State isBoardPrePareSetPopupShow: boolean = false
|
|
|
|
|
|
@State loadingText: string = '正在认证监管信息,请稍后...'
|
|
|
|
|
|
@State sczbkf: SckType[] = []
|
|
|
|
|
|
@State currentUser: User = EmptyCandidateObject
|
2025-06-26 14:27:10 +08:00
|
|
|
|
// 开始考试弹窗
|
2025-06-26 17:28:28 +08:00
|
|
|
|
startExamDialogController: CustomDialogController = new CustomDialogController({
|
2025-06-26 14:27:10 +08:00
|
|
|
|
builder: CarLoadingDialog(),
|
2025-06-26 17:28:28 +08:00
|
|
|
|
autoCancel: false,
|
|
|
|
|
|
customStyle: true
|
2025-06-26 14:27:10 +08:00
|
|
|
|
})
|
2025-04-10 10:28:07 +08:00
|
|
|
|
@State dataList: Array<User> = []
|
|
|
|
|
|
@State list: Array<User> = []
|
|
|
|
|
|
@State name: string = 'initName';
|
|
|
|
|
|
@State sex: string = '';
|
|
|
|
|
|
@State callBackFlag: boolean = false;
|
|
|
|
|
|
@State born?: string = '';
|
|
|
|
|
|
@State address: string = '';
|
|
|
|
|
|
@State nation: string = '';
|
|
|
|
|
|
@State idCard: string = '';
|
|
|
|
|
|
@State grantDept: string = '';
|
|
|
|
|
|
//是否已经开始考试
|
|
|
|
|
|
@State isExamStart: boolean = false;
|
|
|
|
|
|
@State effectDate: string = '';
|
|
|
|
|
|
@State interval: number = -1;
|
|
|
|
|
|
@State studentRefreshStatue: string = '0';
|
|
|
|
|
|
@State photo: string = 'data:image/bmp;base64,';
|
|
|
|
|
|
@State numCount: number = 0;
|
|
|
|
|
|
@State signNum: number = 0;
|
|
|
|
|
|
@State isCanClick: boolean = true;
|
|
|
|
|
|
@State updateTimeLimit: boolean = false
|
2025-06-26 17:28:28 +08:00
|
|
|
|
// 缺考弹窗
|
|
|
|
|
|
missAnExamDialogController: CustomDialogController = new CustomDialogController({
|
|
|
|
|
|
builder: ConfirmDialog({
|
|
|
|
|
|
text: `确认考生:${this.currentUser.xm}是否缺考?`,
|
|
|
|
|
|
onConfirm: () => {
|
|
|
|
|
|
this.qkFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
}),
|
|
|
|
|
|
customStyle: true,
|
|
|
|
|
|
autoCancel: true
|
|
|
|
|
|
})
|
2025-04-10 10:28:07 +08:00
|
|
|
|
@State faceFlag: string = '0';
|
|
|
|
|
|
@State FaceOpenStatue: string = '0'; //是否开启人脸识别
|
|
|
|
|
|
@State faceCatchImg: string = ''
|
|
|
|
|
|
@State carInfo: CarInfoType = {
|
|
|
|
|
|
carId: '',
|
|
|
|
|
|
examinationRoomId: '',
|
|
|
|
|
|
plateNo: '',
|
|
|
|
|
|
isNeedCheck: '',
|
|
|
|
|
|
examSubject: ''
|
|
|
|
|
|
}
|
|
|
|
|
|
@State examinerLoginInfo: ExaminerLoginInfo = {
|
|
|
|
|
|
carId: '',
|
|
|
|
|
|
examinationRoomId: '',
|
|
|
|
|
|
plateNo: '',
|
|
|
|
|
|
isNeedCheck: '',
|
|
|
|
|
|
examSubject: ''
|
|
|
|
|
|
}
|
|
|
|
|
|
@State systemParam: SystemParamType = {
|
|
|
|
|
|
Param341: true,
|
|
|
|
|
|
Param803Str: '0',
|
|
|
|
|
|
Param612Str: '0',
|
|
|
|
|
|
Param770Str: '0',
|
|
|
|
|
|
Param305Str: '0',
|
|
|
|
|
|
Param352Str: '0',
|
|
|
|
|
|
Param828Str: '0',
|
|
|
|
|
|
Param830Str: '0',
|
|
|
|
|
|
Param364: '0',
|
|
|
|
|
|
Param398: '0'
|
|
|
|
|
|
}
|
|
|
|
|
|
@State startExam: boolean = false
|
|
|
|
|
|
@State singlePlay: boolean = false
|
2025-04-15 14:24:27 +08:00
|
|
|
|
private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
|
|
|
|
|
|
private filePhoto!: FilePhoto
|
|
|
|
|
|
// 过程照片拍照
|
|
|
|
|
|
getPhoto = async () => {
|
|
|
|
|
|
//单机模式返回空照片
|
|
|
|
|
|
if (this.singlePlay) {
|
|
|
|
|
|
return ''
|
|
|
|
|
|
} else {
|
|
|
|
|
|
const photoBase64: string = (await this.filePhoto.getPhoto()) || "";
|
|
|
|
|
|
return photoBase64
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
private avPlayer!: VoiceAnnounce
|
|
|
|
|
|
private labelBlocks: LabelBlockType[] = [
|
|
|
|
|
|
{ label: '考生姓名', key: 'xm' },
|
|
|
|
|
|
{ label: '身份证号', key: 'sfzmhm' },
|
|
|
|
|
|
{ label: ' 流 水 号 ', key: 'lsh' },
|
|
|
|
|
|
{ label: '考试路线', key: 'ksxl' },
|
|
|
|
|
|
{ label: '待考次数', key: 'kssycs' },
|
|
|
|
|
|
{ label: '考试员名', key: 'ksy2' },
|
|
|
|
|
|
]
|
2025-04-10 10:28:07 +08:00
|
|
|
|
//开始考试准备
|
|
|
|
|
|
prePareExam = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
await this.checkSignal()
|
|
|
|
|
|
this.faceCompareSucess = 0
|
|
|
|
|
|
AppStorage.setOrCreate('statue', 2)
|
|
|
|
|
|
if (!this.currentUser.xm) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
if (this.singlePlay) {
|
|
|
|
|
|
this.currentUser.id = '0'
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('开始考试')
|
2025-04-11 17:09:27 +08:00
|
|
|
|
SqlInsertTable('USER', [this.currentUser]).catch((e: BusinessError) => {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("error", JSON.stringify(e))
|
2025-04-11 17:09:27 +08:00
|
|
|
|
})
|
2025-04-10 10:28:07 +08:00
|
|
|
|
router.pushUrl({
|
|
|
|
|
|
url: this.carInfo.examSubject == '3' ? 'pages/Roads' : 'pages/Judge',
|
|
|
|
|
|
params: {
|
|
|
|
|
|
sczb: Number(this.isBoardPrePareSetPopupOpen),
|
|
|
|
|
|
kfdm: this.sczbkf,
|
|
|
|
|
|
}
|
|
|
|
|
|
}, router.RouterMode.Single);
|
|
|
|
|
|
this.stopDeviceById()
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('this.FaceOpenStatuethis.FaceOpenStatue', this.FaceOpenStatue)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
if (this.FaceOpenStatue != '0') {
|
|
|
|
|
|
// 同一学员连续第二次考试时不再验证身份
|
|
|
|
|
|
if (this.currentUser.kssycs == '1' && this.systemParam.Param830Str == '1') {
|
|
|
|
|
|
this.sfbdinterfaceFn()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.showFaceCompare = true
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.sfbdinterfaceFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (e) {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info('Throw Error', JSON.stringify(e))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
aboutToAppear() {
|
|
|
|
|
|
this.avPlayer = new VoiceAnnounce(this.context);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async onPageShow() {
|
|
|
|
|
|
this.isExamStart = false
|
|
|
|
|
|
this.startExam = false
|
|
|
|
|
|
this.updateTimeLimit = false
|
|
|
|
|
|
this.currentUser = EmptyCandidateObject
|
|
|
|
|
|
this.filePhoto = new FilePhoto(this.context);
|
|
|
|
|
|
this.singlePlay = AppStorage.get<boolean>('singlePlay') || false
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("this.singlePlay", this.singlePlay)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
this.examinerLoginInfo = AppStorage.get<ExaminerLoginInfo>('examinerInfo')!
|
|
|
|
|
|
this.carInfo = AppStorage.get<CarInfoType>('carInfo')!
|
|
|
|
|
|
//语音功能on
|
|
|
|
|
|
// new WebRTCVoice(this.context);
|
|
|
|
|
|
//初始化数据
|
|
|
|
|
|
this.initData()
|
|
|
|
|
|
//身份证读卡器初始化
|
|
|
|
|
|
// this.openDeviceByIDCard()
|
|
|
|
|
|
const routerParam: RouteParamsType = router.getParams() as RouteParamsType
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('routerParam', JSON.stringify(routerParam))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
if (!this.singlePlay) {
|
|
|
|
|
|
if (routerParam.type != "1") {
|
|
|
|
|
|
this.list = await GetSyncData<User>("USERLIST")
|
|
|
|
|
|
const data = await GetSyncData<User>("USER")
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('useruser,', JSON.stringify(this.list))
|
|
|
|
|
|
dConsole.log('useruser1,', JSON.stringify(data))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
const user = data[0]
|
|
|
|
|
|
if (user && Number(user.kssycs)) {
|
|
|
|
|
|
let flag = false
|
|
|
|
|
|
this.list.forEach(res => {
|
|
|
|
|
|
if (res.sfzmhm == user.sfzmhm) {
|
|
|
|
|
|
flag = true
|
|
|
|
|
|
res.kssycs = user.kssycs
|
|
|
|
|
|
this.getCurrentStudent(res.sfzmhm)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
if (!flag) {
|
|
|
|
|
|
this.currentUser = (this.list.length ? this.list[0] : EmptyCandidateObject)
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (user && (user.kssycs == '0' || user.kssycs == '')) {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('datadatadatadata')
|
2025-04-10 10:28:07 +08:00
|
|
|
|
this.list = this.list.filter(res => {
|
|
|
|
|
|
return res.sfzmhm != user.sfzmhm
|
|
|
|
|
|
})
|
|
|
|
|
|
this.pageIndex = 0
|
|
|
|
|
|
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
|
|
|
|
|
|
if (this.dataList.length) {
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.currentUser = this.dataList[0]
|
|
|
|
|
|
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm || ""
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', this.currentUser.lsh)
|
|
|
|
|
|
}, 200)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.currentUser = EmptyCandidateObject
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
this.list.forEach((res, index) => {
|
|
|
|
|
|
res.id = index.toString()
|
|
|
|
|
|
})
|
|
|
|
|
|
await SqlInsertTable("USERLIST", this.list || [])
|
|
|
|
|
|
} else {
|
|
|
|
|
|
await this.getExaminationStudentInfoFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 如果是单机模式则模拟假数据
|
|
|
|
|
|
//获取sysset表数据
|
|
|
|
|
|
this.initSysset()
|
|
|
|
|
|
|
|
|
|
|
|
//心跳处理
|
|
|
|
|
|
this.heartMsg()
|
|
|
|
|
|
|
|
|
|
|
|
// if(user[0]){
|
|
|
|
|
|
// // @ts-ignore
|
|
|
|
|
|
// this.currentUser=user
|
|
|
|
|
|
// }
|
|
|
|
|
|
this.sczbkf = [];
|
|
|
|
|
|
// initJudgeUdp()
|
|
|
|
|
|
// TODO UDP更改
|
|
|
|
|
|
//监听远程开始考试
|
|
|
|
|
|
JudgeEmitterInstance.onBeginExam(async () => {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info('surenjun', 'userInfo收到UdpEvent事件')
|
2025-04-10 10:28:07 +08:00
|
|
|
|
if (this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow) {
|
|
|
|
|
|
await this.prePareSCZB()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
await this.prePareExam()
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async onPageHide(): Promise<void> {
|
2025-04-10 15:10:31 +08:00
|
|
|
|
CenterUDPBusinessInstance.offMsg(this.onCenterMsg)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//身份证读卡器初始化
|
|
|
|
|
|
openDeviceByIDCard() {
|
|
|
|
|
|
AppStorage.setOrCreate('indexComponent', this)
|
|
|
|
|
|
// 应用启动时打开读卡设备
|
|
|
|
|
|
let ret = testNapi.OpenDevice();
|
|
|
|
|
|
if (ret == 0) {
|
|
|
|
|
|
testNapi.StartReadCard(this.onReadCard);
|
|
|
|
|
|
} else {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.error("zzctest Failed to Open Device");
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
stopDeviceById() {
|
|
|
|
|
|
if (this.faceFlag == '1') {
|
|
|
|
|
|
testNapi.StopReadCard()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 通过身份证获取当前学员
|
|
|
|
|
|
async getCurrentStudent(id: string) {
|
|
|
|
|
|
let flag = false
|
|
|
|
|
|
// this.pageIndex
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('currentidid', id)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
this.list.map((res, index) => {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('tttt', res.sfzmhm, res.xm)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
if (res.sfzmhm == id) {
|
|
|
|
|
|
flag = true
|
|
|
|
|
|
this.currentUser = EmptyCandidateObject
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.currentUser = res
|
|
|
|
|
|
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm || ""
|
|
|
|
|
|
}, 200)
|
|
|
|
|
|
|
|
|
|
|
|
this.examinerLoginInfo.ksyh = res.ksy1sfzmhm
|
|
|
|
|
|
AppStorage.setOrCreate('examinerInfo', this.examinerLoginInfo)
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', res.lsh)
|
|
|
|
|
|
// const { examSubject } = this.carInfo;
|
|
|
|
|
|
if (this.singlePlay) {
|
|
|
|
|
|
this.stopDeviceById()
|
|
|
|
|
|
router.pushUrl({
|
|
|
|
|
|
url: this.carInfo.examSubject == "3" ? 'pages/Roads' : 'pages/Judge',
|
|
|
|
|
|
params: {
|
|
|
|
|
|
sczb: Number(this.isBoardPrePareSetPopupOpen),
|
|
|
|
|
|
kfdm: this.sczbkf,
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}, router.RouterMode.Single);
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.pageIndex = Math.floor(index / 4)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
|
|
|
|
|
|
if (!flag) {
|
|
|
|
|
|
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', '0000000000000')
|
|
|
|
|
|
await SqlInsertTable('USER', [])
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.currentUser = this.list[0]
|
|
|
|
|
|
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm || ""
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', this.currentUser.lsh)
|
|
|
|
|
|
}, 200)
|
|
|
|
|
|
|
|
|
|
|
|
// promptAction.showToast({
|
|
|
|
|
|
// message: '未匹配到对应下载学员',
|
|
|
|
|
|
// duration: 3000
|
|
|
|
|
|
// });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
onReadCard(ret: IDCardSDK.IDCardInfo) {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info(`zzctest xx Read Card ret =${ret.status}`)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
let thisVar: IdCard = AppStorage.get('indexComponent')!;
|
|
|
|
|
|
|
|
|
|
|
|
if (ret.status == 0) { // status = 1 为读到身份证信息; status = 1 为身份证离开读卡器
|
|
|
|
|
|
// 收到身份证离开读卡器的事件通知,根据实际业务需要决定是否需要清空之前已读取的身份证信息。
|
|
|
|
|
|
// 如果身份证卡片离开读卡器时,需要继续保留UI界面上已读取到的身份信息,以下代码可以注释掉。
|
|
|
|
|
|
thisVar.name = "";
|
|
|
|
|
|
thisVar.sex = "";
|
|
|
|
|
|
thisVar.nation = "";
|
|
|
|
|
|
thisVar.born = "";
|
|
|
|
|
|
thisVar.address = "";
|
|
|
|
|
|
thisVar.idCard = "";
|
|
|
|
|
|
thisVar.photo = "";
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (ret.baseInfo.length > 2) {
|
|
|
|
|
|
// 收到身份证信息,填充页面
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info(`zzctest Read Card 1`);
|
2025-04-10 10:28:07 +08:00
|
|
|
|
let subIndex = ret.baseInfo.indexOf(":")
|
|
|
|
|
|
let baseInfo: string = ret.baseInfo.substring(subIndex + 1, ret.baseInfo.length - 1);
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info(`zzctest Read Card 2 baseInfo=${baseInfo}`);
|
2025-04-10 10:28:07 +08:00
|
|
|
|
let baseInfos: string[] = baseInfo.split("|");
|
|
|
|
|
|
thisVar.name = baseInfos[0];
|
|
|
|
|
|
thisVar.sex = baseInfos[1];
|
|
|
|
|
|
thisVar.nation = baseInfos[2];
|
|
|
|
|
|
thisVar.born = baseInfos[3];
|
|
|
|
|
|
thisVar.address = baseInfos[4];
|
|
|
|
|
|
thisVar.idCard = baseInfos[5];
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.getCurrentStudent(baseInfos[5])
|
|
|
|
|
|
}, 1000)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 身份证照片数据处理
|
|
|
|
|
|
if (ret.photo instanceof ArrayBuffer) {
|
|
|
|
|
|
let dataView = new DataView(ret.photo)
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info(`Read Card ret = length = ${dataView.byteLength}`)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
let str = ""
|
|
|
|
|
|
for (let i = 0; i < dataView.byteLength; ++i) {
|
|
|
|
|
|
let c = String.fromCharCode(dataView.getUint8(i))
|
|
|
|
|
|
if (c !== "\n") {
|
|
|
|
|
|
str += c
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
thisVar.photo += str;
|
|
|
|
|
|
}
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info(`zzctest Read Card end`);
|
2025-04-10 10:28:07 +08:00
|
|
|
|
return true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
changeQkfn() {
|
|
|
|
|
|
this.qkFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async initData() {
|
|
|
|
|
|
this.isFirstBoardPrePareSetPopupBtnShow = false;
|
|
|
|
|
|
this.stepFlag = false
|
|
|
|
|
|
this.faceCompareSucess = 0
|
|
|
|
|
|
this.showFaceCompare = false
|
|
|
|
|
|
this.lsh = '1111111111111'
|
|
|
|
|
|
this.callBackFlag = false
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', this.lsh)
|
|
|
|
|
|
AppStorage.setOrCreate('statue', 2)
|
|
|
|
|
|
// this.currentUser = EmptyCandidateObject
|
|
|
|
|
|
this.numCount = 0
|
|
|
|
|
|
if (this.singlePlay) {
|
|
|
|
|
|
// TODO 模拟假数据
|
|
|
|
|
|
this.list = CandidateData
|
|
|
|
|
|
this.pageIndex = 0
|
|
|
|
|
|
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
|
|
|
|
|
|
this.currentUser = this.dataList[0]
|
|
|
|
|
|
this.currentUser.ksy2 = ''
|
|
|
|
|
|
|
|
|
|
|
|
this.lsh = this.currentUser.lsh
|
|
|
|
|
|
this.examinerLoginInfo.ksyh = this.currentUser.ksy1sfzmhm
|
|
|
|
|
|
AppStorage.setOrCreate('examinerInfo', this.examinerLoginInfo)
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', this.lsh)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// const syssetParams = await getSyncData('MA_SYSSET');
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async heartMsg() {
|
2025-04-10 15:10:31 +08:00
|
|
|
|
CenterUDPBusinessInstance.onMsg(this.onCenterMsg)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//考点端查询缺考指令内容消息请求
|
|
|
|
|
|
getqkFn() {
|
|
|
|
|
|
let tmpList: Array<number> = [];
|
2025-04-11 16:23:23 +08:00
|
|
|
|
const number = AppStorage.get<number>('signNum')!
|
2025-04-10 10:28:07 +08:00
|
|
|
|
tmpList.push(NumberToByteArray(number, 1 * 8)[0])
|
|
|
|
|
|
const param: UDPParamType = {
|
|
|
|
|
|
id: 41,
|
|
|
|
|
|
list: tmpList,
|
|
|
|
|
|
carNo: this.carInfo.carNo as string,
|
|
|
|
|
|
placeId: this.carInfo.examinationRoomId as string
|
|
|
|
|
|
}
|
|
|
|
|
|
// globalThis.udpClient2.sendMsgExt(param, this.context)
|
2025-04-10 15:10:31 +08:00
|
|
|
|
CenterUDPBusinessInstance.sendData(param)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async initSysset() {
|
|
|
|
|
|
const that = this;
|
|
|
|
|
|
// DB.queryListBySql("select * from MA_SYSSET", ['id', 'v_no', 'v_name', 'v_value'].map(item => ({
|
|
|
|
|
|
// type: ColumnType.STRING,
|
|
|
|
|
|
// name: item,
|
|
|
|
|
|
// columnName: item
|
|
|
|
|
|
// }))).then((syssetParams: any) => {
|
|
|
|
|
|
GetSyncData<MASYSSETTableType>("MA_SYSSET").then((syssetParams: MASYSSETTableType[]) => {
|
|
|
|
|
|
const serialNumberArr = syssetParams.filter(sys => sys.v_no === '901')
|
|
|
|
|
|
that.jkxlh = serialNumberArr?.[0]?.v_value || ''
|
|
|
|
|
|
const ksxtbhArr = syssetParams.filter(sys => sys.v_no === '902')
|
|
|
|
|
|
that.ksxtbh = ksxtbhArr?.[0]?.v_value || '222'
|
|
|
|
|
|
const studentRefreshParam = syssetParams.filter(sys => sys.v_no === '452') //判断自动更新
|
|
|
|
|
|
that.studentRefreshStatue = studentRefreshParam?.[0]?.v_value || '0'
|
|
|
|
|
|
const openCheckFlagParam = syssetParams.filter(sys => sys.v_no == '17') //0
|
|
|
|
|
|
const openCheckFlag = openCheckFlagParam?.[0]?.v_value == '1' ? '1' : '0'
|
|
|
|
|
|
|
|
|
|
|
|
const faceParam = syssetParams.filter(sys => sys.v_no == '2413') //3
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('FaceOpenStatue', openCheckFlag, this.FaceOpenStatue)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
// 1身份证读卡器 2指纹 3人脸
|
|
|
|
|
|
if (openCheckFlag == '1') {
|
|
|
|
|
|
that.FaceOpenStatue = faceParam?.[0]?.v_value == '3' ? '1' : '0'
|
|
|
|
|
|
this.faceFlag = faceParam?.[0]?.v_value || '0'
|
|
|
|
|
|
if (faceParam?.[0]?.v_value == '1') {
|
|
|
|
|
|
that.openDeviceByIDCard()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// let a = await this.fileUtil.initFolder("/config/temptable")
|
|
|
|
|
|
// this.fileUtil.addFile("temp.log", JSON.stringify(syssetParams))
|
|
|
|
|
|
syssetParams.forEach(sys => {
|
|
|
|
|
|
//364 绕车一周评判时机(1-开始考试后判 2-开始考试前判)
|
|
|
|
|
|
if (sys.v_no === '364' && decodeURIComponent(sys.v_value || "") == '2') {
|
|
|
|
|
|
this.systemParam.Param364 = sys.v_value || ""
|
|
|
|
|
|
that.isBoardPrePareSetPopupOpen = true;
|
|
|
|
|
|
that.isFirstBoardPrePareSetPopupBtnShow = false
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//398参数为1 第二场考试上车准备不考
|
|
|
|
|
|
if (sys.v_no === '398' && decodeURIComponent(sys.v_value || "") == '1') {
|
|
|
|
|
|
that.systemParam.Param398 = decodeURIComponent(sys.v_value || "")
|
|
|
|
|
|
that.isSecondBoardPrePareSetPopupOpen = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 车上没有缺考功能
|
|
|
|
|
|
if (sys.v_no === '770') {
|
|
|
|
|
|
that.systemParam.Param770Str = sys.v_value || "";
|
|
|
|
|
|
}
|
|
|
|
|
|
// 开始考试前必须解开安全带或关车门
|
|
|
|
|
|
if (sys.v_no === '803') {
|
|
|
|
|
|
that.systemParam.Param803Str = sys.v_value + '';
|
|
|
|
|
|
}
|
|
|
|
|
|
//判断是否考生是否按顺序考试
|
|
|
|
|
|
if (sys.v_no === '341' && decodeURIComponent(sys.v_value || "") == '1') {
|
|
|
|
|
|
that.systemParam.Param341 = true
|
|
|
|
|
|
} else {
|
|
|
|
|
|
//todo
|
|
|
|
|
|
that.systemParam.Param341 = true
|
|
|
|
|
|
}
|
|
|
|
|
|
//开始考试触发方式
|
|
|
|
|
|
if (sys.v_no === '612') {
|
|
|
|
|
|
that.systemParam.Param612Str = decodeURIComponent(sys.v_value || "")
|
|
|
|
|
|
}
|
|
|
|
|
|
//车上考试过一次就不能缺考
|
|
|
|
|
|
if (sys.v_no === '352') {
|
|
|
|
|
|
that.systemParam.Param352Str = decodeURIComponent(sys.v_value || "")
|
|
|
|
|
|
}
|
|
|
|
|
|
//828考生待考界面,安全员显示考试员
|
|
|
|
|
|
if (sys.v_no === '828') {
|
|
|
|
|
|
that.systemParam.Param828Str = decodeURIComponent(sys.v_value || "")
|
|
|
|
|
|
if (that.systemParam.Param828Str == '1') {
|
|
|
|
|
|
that.labelBlocks[5].label = '安全员名'
|
|
|
|
|
|
} else {
|
|
|
|
|
|
that.labelBlocks[5].label = '考试员名'
|
|
|
|
|
|
}
|
|
|
|
|
|
that.labelBlocks = JSON.parse(JSON.stringify(this.labelBlocks))
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//视频保存天数
|
|
|
|
|
|
if (sys.v_no === '305') {
|
|
|
|
|
|
that.systemParam.Param305Str = decodeURIComponent(sys.v_value || "")
|
|
|
|
|
|
if (!Number(this.systemParam.Param305Str)) {
|
|
|
|
|
|
that.systemParam.Param305Str = '2'
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//0不自动更新 1自动更新(不限次数) 2没有考生更新2次
|
|
|
|
|
|
if (that.studentRefreshStatue == '2') {
|
|
|
|
|
|
if (that.list.length == 0) {
|
|
|
|
|
|
clearInterval(that.interval)
|
|
|
|
|
|
that.interval = setInterval(() => {
|
|
|
|
|
|
if (that.numCount < 3) {
|
|
|
|
|
|
that.numCount++
|
|
|
|
|
|
if (that.list.length == 0) {
|
|
|
|
|
|
that.getExaminationStudentInfoFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 5000)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
that.getExaminationStudentInfoFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (that.studentRefreshStatue == '1') {
|
|
|
|
|
|
if (that.list.length == 0) {
|
|
|
|
|
|
clearInterval(that.interval)
|
|
|
|
|
|
that.interval = setInterval(() => {
|
|
|
|
|
|
if (that.list.length == 0) {
|
|
|
|
|
|
that.getExaminationStudentInfoFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 5000)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
that.getExaminationStudentInfoFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// this.getExaminationItemFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//人脸比对窗口关闭
|
|
|
|
|
|
changeFaceCompareSuccess() {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('this.faceCompareSuces', this.faceCompareSucess, JSON.stringify(this.currentUser))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
if (this.faceCompareSucess > 0) {
|
|
|
|
|
|
//人脸比对通过
|
|
|
|
|
|
AppStorage.setOrCreate('statue', 4)
|
|
|
|
|
|
this.showFaceCompare = false
|
|
|
|
|
|
this.sfbdinterfaceFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
nextClick() {
|
|
|
|
|
|
if (this.list.length <= 4 || this.pageIndex == Math.floor(this.list.length / 4)) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
this.pageIndex++;
|
|
|
|
|
|
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
prevClick() {
|
|
|
|
|
|
if (this.list.length <= 4 || this.pageIndex == 0) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
this.pageIndex--;
|
|
|
|
|
|
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//获取下载考生
|
|
|
|
|
|
async getExaminationStudentInfoFn() {
|
|
|
|
|
|
if (this.singlePlay || this.updateTimeLimit) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
this.isExamStart = false
|
|
|
|
|
|
this.startExam = false
|
|
|
|
|
|
this.updateTimeLimit = false
|
|
|
|
|
|
// this.isBoardPrePareSetPopupOpen=true
|
|
|
|
|
|
this.isFirstBoardPrePareSetPopupBtnShow = false
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('isFirstBoardPrePareSetPopupBtnShow', this.isFirstBoardPrePareSetPopupBtnShow,
|
2025-04-10 10:28:07 +08:00
|
|
|
|
this.isBoardPrePareSetPopupOpen)
|
|
|
|
|
|
this.startExam = false
|
|
|
|
|
|
// await upDateTableByArray('USER', [])
|
|
|
|
|
|
// await upDateTableByArray('USERLIST', [])
|
|
|
|
|
|
await DB.clearTable('USER')
|
|
|
|
|
|
await DB.clearTable('USERLIST')
|
|
|
|
|
|
this.updateTimeLimit = true
|
|
|
|
|
|
let md5Message: string = CryptoJS.MD5(this.carInfo.carId! +
|
|
|
|
|
|
this.carInfo.examinationRoomId! +
|
|
|
|
|
|
this.examinerLoginInfo.username!).toString();
|
|
|
|
|
|
const param =
|
|
|
|
|
|
`<getExaminationStudentInfoReq><head><checkCode>${md5Message}</checkCode></head><body><carId>${this.carInfo.carId}</carId><examinationRoomId>${this.carInfo.examinationRoomId}</examinationRoomId><examinerName>${this.examinerLoginInfo.username}</examinerName><sfzmhm></sfzmhm></body></getExaminationStudentInfoReq>`
|
|
|
|
|
|
try {
|
|
|
|
|
|
getExaminationStudentInfo(param).then(async (res) => {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("temp log ", JSON.stringify(res))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.updateTimeLimit = false
|
|
|
|
|
|
}, 3000)
|
|
|
|
|
|
if (!res || res?.getExaminationStudentInfoRsp?.head?.resultCode == '1') {
|
|
|
|
|
|
this.dataList = []
|
|
|
|
|
|
this.list = []
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
let dataList: User[] = []
|
|
|
|
|
|
this.list = []
|
|
|
|
|
|
|
|
|
|
|
|
// for (let key in res.getExaminationStudentInfoRsp.body) {
|
|
|
|
|
|
// const a = res.getExaminationStudentInfoRsp.body[key]
|
|
|
|
|
|
// if (a instanceof Array) {
|
|
|
|
|
|
// dataList = a
|
|
|
|
|
|
// } else {
|
|
|
|
|
|
// dataList = [a]
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
for (const key of Object.keys(res.getExaminationStudentInfoRsp.body)) {
|
2025-04-15 14:24:27 +08:00
|
|
|
|
const a: User[] | User = Reflect.get(res.getExaminationStudentInfoRsp.body, key);
|
2025-04-10 10:28:07 +08:00
|
|
|
|
if (Array.isArray(a)) {
|
|
|
|
|
|
dataList = a;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dataList = [a];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (dataList.length) {
|
|
|
|
|
|
this.numCount = 0
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.list = JSON.parse(JSON.stringify(dataList))
|
|
|
|
|
|
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("temp list", JSON.stringify(this.list))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
this.list.forEach((listData, index) => {
|
|
|
|
|
|
//考过一次不允许切换学员
|
|
|
|
|
|
if (listData.kssycs == '1') {
|
|
|
|
|
|
|
|
|
|
|
|
this.startExam = true
|
|
|
|
|
|
}
|
|
|
|
|
|
listData.id = index.toString()
|
|
|
|
|
|
// for (let i in listData) {
|
|
|
|
|
|
// listData[i] = decodeURI(listData[i])
|
|
|
|
|
|
// }
|
|
|
|
|
|
Object.keys(listData).forEach((key) => {
|
|
|
|
|
|
Reflect.set(listData, key, decodeURI(Reflect.get(listData, key)));
|
|
|
|
|
|
});
|
|
|
|
|
|
if (this.systemParam.Param828Str == '1' || this.systemParam.Param828Str == '2') {
|
|
|
|
|
|
// listData.ksy2=listData.ksy1;
|
|
|
|
|
|
listData.ksy2 = this.examinerLoginInfo.kgxm || ""
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// listData.ksy2=listData.ksy2;
|
|
|
|
|
|
listData.ksy2 = this.examinerLoginInfo.kgxm || ""
|
|
|
|
|
|
}
|
|
|
|
|
|
listData.kszp = this.photo + listData.kszp
|
|
|
|
|
|
listData.ksmjzp = this.photo + listData.ksmjzp
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// await upDateTableByArray('USERLIST', this.list || [])
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("temp list", JSON.stringify(this.list))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
// await sqlInsertCommonFn("USERLIST", this.list || [])
|
|
|
|
|
|
await SqlInsertTable('USERLIST', this.list || [])
|
|
|
|
|
|
dataList = this.list.length > 4 ? this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) : this.list;
|
|
|
|
|
|
|
|
|
|
|
|
this.dataList = dataList
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("temp list", JSON.stringify(this.dataList))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
const user = this.dataList.filter(res => {
|
|
|
|
|
|
return res.kssycs == '1'
|
|
|
|
|
|
})
|
|
|
|
|
|
if (this.dataList.length) {
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.currentUser = user.length ? user[0] : this.dataList[0]
|
|
|
|
|
|
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm || ""
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', this.currentUser.lsh)
|
|
|
|
|
|
this.examinerLoginInfo.ksyh = this.currentUser.ksy1sfzmhm
|
|
|
|
|
|
AppStorage.setOrCreate('examinerInfo', this.examinerLoginInfo)
|
|
|
|
|
|
}, 200)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.currentUser = EmptyCandidateObject
|
|
|
|
|
|
}
|
|
|
|
|
|
//364 绕车一周评判时机(1-开始考试后判 2-开始考试前判)
|
|
|
|
|
|
if (this.systemParam.Param364 == '2') {
|
|
|
|
|
|
this.isBoardPrePareSetPopupOpen = true;
|
|
|
|
|
|
this.isFirstBoardPrePareSetPopupBtnShow = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//398参数为1 第二场考试上车准备不考
|
|
|
|
|
|
if (this.systemParam.Param398 == '1') {
|
|
|
|
|
|
this.isSecondBoardPrePareSetPopupOpen = true;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.pageIndex = 0
|
|
|
|
|
|
// getSyncData('USER').then(data => {
|
|
|
|
|
|
GetSyncData<User>("USER").then(data => {
|
|
|
|
|
|
if (data?.[0]) {
|
|
|
|
|
|
this.getCurrentStudent(data[0].sfzmhm)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}).catch((error: BusinessError) => {
|
|
|
|
|
|
this.updateTimeLimit = false
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('error12error' + error)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
})
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
|
this.updateTimeLimit = false
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('error14error' + error)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
qkFn() {
|
|
|
|
|
|
if (this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
this.faceCompareSucess = 0
|
|
|
|
|
|
if (this.singlePlay) {
|
|
|
|
|
|
this.qkFlag = false
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('JsonJson', JSON.stringify(this.currentUser))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
const param: ExaminationStuAbsentParams = {
|
|
|
|
|
|
carId: this.carInfo.carId || "",
|
|
|
|
|
|
sfzmhm: this.currentUser.sfzmhm,
|
|
|
|
|
|
examinationRoomId: this.carInfo.examinationRoomId || "",
|
|
|
|
|
|
username: this.examinerLoginInfo.username || "",
|
|
|
|
|
|
lsh: this.lsh
|
|
|
|
|
|
}
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('carNo1111', param)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
examinationStuAbsent(param).then(res => {
|
|
|
|
|
|
const arr = [this.signNum || 0, 1]
|
|
|
|
|
|
let tmpList: number[] = [];
|
|
|
|
|
|
tmpList.push(NumberToByteArray(arr[0], 1 * 8)[0])
|
|
|
|
|
|
tmpList.push(NumberToByteArray(arr[1] ?? 0, 1 * 8)[0])
|
|
|
|
|
|
|
|
|
|
|
|
const param: UDPParamType = {
|
|
|
|
|
|
id: 43,
|
|
|
|
|
|
list: tmpList,
|
|
|
|
|
|
carNo: this.carInfo.carNo || "",
|
|
|
|
|
|
placeId: this.carInfo.examinationRoomId || ""
|
|
|
|
|
|
}
|
2025-04-10 15:10:31 +08:00
|
|
|
|
CenterUDPBusinessInstance.sendData(param)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
// globalThis.udpClient2.sendMsgExt(param, this.context)
|
|
|
|
|
|
if (res.examinationStuAbsentRsp && res.examinationStuAbsentRsp.head &&
|
|
|
|
|
|
res.examinationStuAbsentRsp.head.resultCode == '0') {
|
|
|
|
|
|
this.pageIndex = 0
|
|
|
|
|
|
this.qkFlag = false
|
|
|
|
|
|
this.currentUser = EmptyCandidateObject
|
|
|
|
|
|
this.getExaminationStudentInfoFn()
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
}).catch((error: BusinessError) => {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log('error12error' + error)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
async getExaminationItemFn() {
|
|
|
|
|
|
if (!this.currentUser.lsh || this.singlePlay) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
// const { carId, examinationRoomId } = this.carInfo;
|
|
|
|
|
|
const examItems = await getExaminationItem({
|
|
|
|
|
|
time: GetCurrentTime() || "",
|
|
|
|
|
|
carId: this.carInfo.carId || "",
|
|
|
|
|
|
lsh: this.currentUser.lsh || '',
|
|
|
|
|
|
examinationRoomId: this.carInfo.examinationRoomId || ""
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
if (examItems?.getExaminationItemRsp?.body?.kssycs != 0) {
|
|
|
|
|
|
this.getExaminationStudentInfoFn()
|
|
|
|
|
|
} else {
|
|
|
|
|
|
this.dataList = []
|
|
|
|
|
|
this.currentUser = EmptyCandidateObject
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//身份比对
|
|
|
|
|
|
async sfbdinterfaceFn() {
|
|
|
|
|
|
AppStorage.setOrCreate('statue', 4)
|
|
|
|
|
|
this.stepFlag = true
|
|
|
|
|
|
let examItems: GetExaminationItemRsp = {
|
|
|
|
|
|
getExaminationItemRsp:
|
|
|
|
|
|
{
|
|
|
|
|
|
body: { ykxx: '' }
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
if (!this.singlePlay) {
|
|
|
|
|
|
//获取已考项目
|
|
|
|
|
|
examItems = await getExaminationItem({
|
|
|
|
|
|
time: GetCurrentTime(),
|
|
|
|
|
|
carId: this.carInfo.carId || "",
|
|
|
|
|
|
lsh: this.currentUser.lsh || '',
|
|
|
|
|
|
examinationRoomId: this.carInfo.examinationRoomId || ""
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
this.currentUser.id = '1'
|
|
|
|
|
|
const avPlayer = this.avPlayer;
|
2025-06-26 17:28:28 +08:00
|
|
|
|
this.startExamDialogController.open()
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
avPlayer.playAudio([`voice/监管通信中.mp3`], false, async () => {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info('surenjun', '播放结束开始考试接口调用')
|
2025-04-10 10:28:07 +08:00
|
|
|
|
// const { code, keystr, message } = await this.beginExam() || {};
|
|
|
|
|
|
const res = await this.beginExam()
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info('surenjun', '开始考试接口调用结束')
|
2025-04-10 10:28:07 +08:00
|
|
|
|
//TODO code转换
|
|
|
|
|
|
|
|
|
|
|
|
if (res.code != 1) {
|
|
|
|
|
|
avPlayer.playAudio([res.code == -200 ? 'voice/photo_error.mp3' : 'voice/监管审核未通过.mp3']);
|
2025-06-26 17:28:28 +08:00
|
|
|
|
this.startExamDialogController.close()
|
2025-04-10 10:28:07 +08:00
|
|
|
|
this.isExamStart = false
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: res.message,
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
this.currentUser.id = '0'
|
|
|
|
|
|
// await upDateTableByArray('USER', [this.currentUser])
|
|
|
|
|
|
await SqlInsertTable('USER', [this.currentUser])
|
|
|
|
|
|
this.stepFlag = false
|
2025-06-26 17:28:28 +08:00
|
|
|
|
this.startExamDialogController.close()
|
2025-04-10 10:28:07 +08:00
|
|
|
|
router.pushUrl({
|
|
|
|
|
|
url: 'pages/Judge',
|
|
|
|
|
|
params: {
|
|
|
|
|
|
examItems: examItems?.getExaminationItemRsp?.body?.ykxx,
|
|
|
|
|
|
sczb: Number(this.isBoardPrePareSetPopupOpen),
|
|
|
|
|
|
kfdm: this.sczbkf,
|
|
|
|
|
|
//真实监管项目
|
|
|
|
|
|
kString: decodeURIComponent(res.keystr || '')
|
|
|
|
|
|
}
|
|
|
|
|
|
}, router.RouterMode.Single);
|
|
|
|
|
|
this.updateTimeLimit = false
|
|
|
|
|
|
this.stopDeviceById()
|
|
|
|
|
|
this.stepFlag = false
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 检测车门、熄火信号
|
|
|
|
|
|
async checkSignal(): Promise<boolean> {
|
|
|
|
|
|
const Param803Str = this.systemParam.Param803Str
|
|
|
|
|
|
if (Param803Str === '') {
|
|
|
|
|
|
return true
|
|
|
|
|
|
}
|
|
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
if (JudgeConfig.isCheckFireOpen) {
|
|
|
|
|
|
resolve(true)
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
// TODO UDP缺失
|
|
|
|
|
|
// let plcValue = globalThis.udpClient.getCurrentMessage();
|
|
|
|
|
|
let plcValue = "";
|
|
|
|
|
|
const msgArr = plcValue.split(',').map(Number) || ''
|
|
|
|
|
|
const mkg = msgArr[14];
|
|
|
|
|
|
const fdjzs = msgArr[25];
|
|
|
|
|
|
const aqd = msgArr[19];
|
|
|
|
|
|
const jgd = msgArr[7];
|
|
|
|
|
|
const ygd = msgArr[8];
|
|
|
|
|
|
const ssc = msgArr[13];
|
|
|
|
|
|
const dw = msgArr[28];
|
|
|
|
|
|
// 开始考试信号检测
|
|
|
|
|
|
if (Param803Str !== '') {
|
|
|
|
|
|
//安全带
|
|
|
|
|
|
if (aqd == 1 && Param803Str.includes('1')) {
|
|
|
|
|
|
this.avPlayer.playAudio(['voice/请解开安全带.mp3'])
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: '请解开安全带',
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
reject(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
//门开关
|
|
|
|
|
|
if (mkg == 1 && Param803Str.includes('2')) {
|
|
|
|
|
|
this.avPlayer.playAudio(['voice/关门.mp3'])
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: '请关闭车门',
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
reject(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
//远、近光灯
|
|
|
|
|
|
if ((jgd == 1 || ygd == 1) && Param803Str.includes('3')) {
|
|
|
|
|
|
this.avPlayer.playAudio(['voice/请关闭远近光灯.mp3'])
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: '请关闭远近光灯',
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
reject(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
//拉手刹
|
|
|
|
|
|
if (ssc == 0 && Param803Str.includes('4')) {
|
|
|
|
|
|
this.avPlayer.playAudio(['voice/请拉手刹.mp3'])
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: '请拉手刹',
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
reject(false)
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//请点火
|
|
|
|
|
|
if (fdjzs <= 0 && Param803Str.includes('5')) {
|
|
|
|
|
|
this.avPlayer.playAudio(['voice/点火.mp3'])
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: '请点火',
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
reject(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
//置空档
|
|
|
|
|
|
if (dw != 0 && Param803Str.includes('6')) {
|
|
|
|
|
|
this.avPlayer.playAudio(['voice/请置空档.mp3'])
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: '请置空档',
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
reject(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//TODO 考前绕车一周信号检测
|
|
|
|
|
|
// if (isBoardPrePareSetPopupOpen) {
|
|
|
|
|
|
if (false) {
|
|
|
|
|
|
//请熄火
|
|
|
|
|
|
if (fdjzs > 0) {
|
|
|
|
|
|
this.avPlayer.playAudio(['voice/熄火.mp3'])
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: '请熄火',
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
reject(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
if (mkg == 1) {
|
|
|
|
|
|
this.avPlayer.playAudio(['voice/关门.mp3'])
|
|
|
|
|
|
promptAction.showToast({
|
|
|
|
|
|
message: '请关闭车门',
|
|
|
|
|
|
duration: 4000
|
|
|
|
|
|
})
|
|
|
|
|
|
reject(false)
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
resolve(true)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 开始考试
|
|
|
|
|
|
async beginExam(): Promise<BeginExamRequest> {
|
2025-07-04 10:50:33 +08:00
|
|
|
|
dConsole.log(StartExamTag, "开始考试")
|
2025-04-10 10:28:07 +08:00
|
|
|
|
const startHourTime = dayTs().format("HHmmssSSS")
|
|
|
|
|
|
AppStorage.setOrCreate('startHourTime', startHourTime)
|
|
|
|
|
|
const photoBase64 = await this.getPhoto();
|
|
|
|
|
|
if (photoBase64 == '') {
|
2025-07-04 10:50:33 +08:00
|
|
|
|
dConsole.log(StartExamTag, "拍照失败")
|
2025-06-26 17:28:28 +08:00
|
|
|
|
this.startExamDialogController.close()
|
2025-04-10 10:28:07 +08:00
|
|
|
|
return { code: -200 }
|
|
|
|
|
|
}
|
|
|
|
|
|
const drvexam: DrvexamType = {
|
|
|
|
|
|
lsh: "this.currentUser.lsh",
|
|
|
|
|
|
kskm: this.carInfo.examSubject,
|
|
|
|
|
|
ksxtbh: this.ksxtbh || '222',
|
|
|
|
|
|
sfzmhm: this.currentUser.sfzmhm || '',
|
|
|
|
|
|
ksysfzmhm: this.currentUser.ksy1sfzmhm || '',
|
|
|
|
|
|
ksxl: this.currentUser.xldm,
|
|
|
|
|
|
zp: photoBase64,
|
2025-06-26 14:27:10 +08:00
|
|
|
|
kssj: dayTs().format("YYYY-MM-DD HH:mm:ss") || '',
|
2025-04-10 10:28:07 +08:00
|
|
|
|
kchp: decodeURI(this.carInfo.plateNo || ""),
|
|
|
|
|
|
Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || ''
|
|
|
|
|
|
}
|
2025-07-04 10:50:33 +08:00
|
|
|
|
dConsole.log(StartExamTag, "开始考试参数", drvexam)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
const param: RegulatoryInterfaceParams = {
|
|
|
|
|
|
drvexam,
|
|
|
|
|
|
xtlb: '17',
|
|
|
|
|
|
//接口序列号
|
|
|
|
|
|
jkxlh: this.jkxlh,
|
|
|
|
|
|
//接口标识
|
|
|
|
|
|
jkid: '17C51',
|
|
|
|
|
|
}
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.info('surenjunjianguan', JSON.stringify(param))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
const temp = await writeObjectOut(param, "", this.context);
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', this.currentUser.lsh)
|
|
|
|
|
|
this.examinerLoginInfo.ksyh = this.currentUser.ksy1sfzmhm
|
|
|
|
|
|
AppStorage.setOrCreate('examinerInfo', this.examinerLoginInfo)
|
|
|
|
|
|
return temp
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//开始上车准备
|
|
|
|
|
|
prePareSCZB = async () => {
|
|
|
|
|
|
try {
|
|
|
|
|
|
await this.checkSignal()
|
|
|
|
|
|
this.isExamStart = true
|
|
|
|
|
|
this.currentUser.id = '0'
|
|
|
|
|
|
DB.insertData("USER", this.currentUser).then(() => {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("USER insert success",)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}).catch((err: BusinessError) => {
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("USER insert fail", JSON.stringify(err))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
})
|
|
|
|
|
|
// await upDateTableByArray('USER', [this.currentUser])
|
2025-06-23 17:24:47 +08:00
|
|
|
|
dConsole.log("User", JSON.stringify(this.currentUser))
|
2025-04-10 10:28:07 +08:00
|
|
|
|
// await sqlInsertCommonFn("USER", [this.currentUser])
|
|
|
|
|
|
AppStorage.setOrCreate('statue', 4)
|
|
|
|
|
|
this.isBoardPrePareSetPopupShow = true;
|
|
|
|
|
|
this.isFirstBoardPrePareSetPopupBtnShow = true;
|
|
|
|
|
|
this.stepFlag = false
|
|
|
|
|
|
this.stopDeviceById()
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
aboutToDisappear() {
|
|
|
|
|
|
this.outClick()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
outClick() {
|
|
|
|
|
|
clearInterval(this.interval)
|
|
|
|
|
|
this.stopDeviceById()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 几个按钮公共样式
|
|
|
|
|
|
@Styles
|
|
|
|
|
|
commStyle(){
|
2025-06-26 14:27:10 +08:00
|
|
|
|
.width(389)
|
|
|
|
|
|
.height(122)
|
2025-04-10 10:28:07 +08:00
|
|
|
|
.backgroundImage($r('app.media.button_nor'))
|
|
|
|
|
|
.backgroundImageSize({ width: '100%', height: '100%' })
|
2025-06-26 14:27:10 +08:00
|
|
|
|
.margin({ bottom: 21 })
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
build() {
|
|
|
|
|
|
Column() {
|
2025-06-26 11:18:07 +08:00
|
|
|
|
HeaderComponent({
|
|
|
|
|
|
shortLogo: true,
|
|
|
|
|
|
shouBackArea: true
|
|
|
|
|
|
})
|
|
|
|
|
|
Column() {
|
2025-04-10 10:28:07 +08:00
|
|
|
|
Row() {
|
2025-06-26 11:18:07 +08:00
|
|
|
|
Row() {
|
|
|
|
|
|
ForEach(this.dataList, (item: User) => {
|
|
|
|
|
|
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
|
|
|
|
|
|
Column() {
|
|
|
|
|
|
CommTextComponent({
|
|
|
|
|
|
color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000',
|
|
|
|
|
|
text: item.lsh
|
|
|
|
|
|
})
|
|
|
|
|
|
CommTextComponent({
|
|
|
|
|
|
color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000',
|
|
|
|
|
|
text: decodeURIComponent(item.xm)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
2025-06-26 14:27:10 +08:00
|
|
|
|
.width(292) // 165 * 1.770833 ≈ 292.187 → 292
|
|
|
|
|
|
.height(151) // 85 * 1.770833 ≈ 150.52 → 151
|
2025-06-26 11:18:07 +08:00
|
|
|
|
.backgroundImage(item.sfzmhm != this.currentUser.sfzmhm ? $r('app.media.userbox2') :
|
|
|
|
|
|
$r('app.media.userboxbg'))
|
|
|
|
|
|
.backgroundImageSize({ width: '100%', height: '100%' })
|
|
|
|
|
|
.onClick(() => {
|
|
|
|
|
|
dConsole.log('this.startExam', this.startExam, this.systemParam.Param364, this.isExamStart)
|
|
|
|
|
|
if ((this.isExamStart && !this.singlePlay && this.systemParam.Param341) ||
|
|
|
|
|
|
(this.startExam && this.systemParam.Param364 == '2')) {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
this.currentUser = EmptyCandidateObject
|
|
|
|
|
|
AppStorage.setOrCreate('lsh', item.lsh)
|
|
|
|
|
|
setTimeout(() => {
|
|
|
|
|
|
this.currentUser = item
|
|
|
|
|
|
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm || ""
|
|
|
|
|
|
}, 200)
|
|
|
|
|
|
})
|
2025-04-10 10:28:07 +08:00
|
|
|
|
})
|
2025-06-26 14:27:10 +08:00
|
|
|
|
}.width(1133) // 640 * 1.770833 ≈ 1133.33 → 1133
|
|
|
|
|
|
.margin({ left: 53 }) // 30 * 1.770833 ≈ 53.12 → 53
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
2025-06-26 11:18:07 +08:00
|
|
|
|
Image($r('app.media.dk_prev'))
|
2025-06-26 14:27:10 +08:00
|
|
|
|
.width(159)// 90 * 1.770833 ≈ 159.37 → 159
|
|
|
|
|
|
.height(124)// 70 * 1.770833 ≈ 123.96 → 124
|
|
|
|
|
|
.margin({ left: 115, right: 18 })// 65→115, 10→18
|
2025-06-26 11:18:07 +08:00
|
|
|
|
.onClick(() => {
|
|
|
|
|
|
this.prevClick()
|
|
|
|
|
|
})
|
2025-06-26 14:27:10 +08:00
|
|
|
|
Image($r('app.media.dk_next'))
|
|
|
|
|
|
.width(159)// 90→159
|
|
|
|
|
|
.height(124)// 70→124
|
|
|
|
|
|
.onClick(() => {
|
|
|
|
|
|
this.nextClick()
|
|
|
|
|
|
})
|
|
|
|
|
|
}.margin({ top: 71, bottom: 18 }) // 40→71, 10→18
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
2025-06-26 11:18:07 +08:00
|
|
|
|
Flex({ justifyContent: FlexAlign.SpaceBetween }) {
|
|
|
|
|
|
Row() {
|
|
|
|
|
|
Column() {
|
|
|
|
|
|
if (this.currentUser.kszp) {
|
|
|
|
|
|
AvatarComponent({
|
|
|
|
|
|
url: this.currentUser.kszp ? this.currentUser.kszp : ''
|
|
|
|
|
|
})
|
|
|
|
|
|
} else {
|
|
|
|
|
|
AvatarComponent({
|
|
|
|
|
|
url: ""
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
if (this.currentUser.ksmjzp) {
|
|
|
|
|
|
AvatarComponent({
|
|
|
|
|
|
url: this.currentUser.ksmjzp ? this.currentUser.ksmjzp : ''
|
|
|
|
|
|
})
|
|
|
|
|
|
} else {
|
|
|
|
|
|
AvatarComponent({
|
|
|
|
|
|
url: ""
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-26 11:18:07 +08:00
|
|
|
|
Column() {
|
|
|
|
|
|
ForEach(this.labelBlocks, (item: LabelBlockType) => {
|
|
|
|
|
|
LabelBlockComponent({
|
|
|
|
|
|
label: item.label,
|
|
|
|
|
|
value: GetCurrentUserKeyValue(this.currentUser, item.key)
|
|
|
|
|
|
})
|
2025-04-10 10:28:07 +08:00
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-06-26 14:27:10 +08:00
|
|
|
|
.width(1176) // 664→1176
|
|
|
|
|
|
.height(600) // 339→600
|
2025-06-26 11:18:07 +08:00
|
|
|
|
.backgroundImage($r('app.media.dkbg'))
|
|
|
|
|
|
.backgroundImageSize({ width: '100%', height: '100%' })
|
2025-06-26 14:27:10 +08:00
|
|
|
|
.margin({ left: 94 }) // 53→94
|
2025-04-10 10:28:07 +08:00
|
|
|
|
|
|
|
|
|
|
Column() {
|
2025-06-26 14:27:10 +08:00
|
|
|
|
imageBtn({ btnWidth: 390, btnHeight: 122, imgSrc: $r('app.media.yydj_btn') })// 220→390, 69→122
|
|
|
|
|
|
.margin({ bottom: 21 }) // 12→21
|
|
|
|
|
|
imageBtn({ btnWidth: 390, btnHeight: 122, imgSrc: $r('app.media.gx_btn') })
|
|
|
|
|
|
.margin({ bottom: 21 })
|
2025-06-26 11:18:07 +08:00
|
|
|
|
.onClick(() => {
|
|
|
|
|
|
if (this.isExamStart && !this.singlePlay) {
|
2025-04-10 10:28:07 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
2025-06-26 11:18:07 +08:00
|
|
|
|
this.faceCompareSucess = 0
|
|
|
|
|
|
this.numCount = 0
|
|
|
|
|
|
this.getExaminationStudentInfoFn()
|
2025-04-10 10:28:07 +08:00
|
|
|
|
})
|
2025-06-26 14:27:10 +08:00
|
|
|
|
imageBtn({ btnWidth: 390, btnHeight: 122, imgSrc: $r('app.media.qk_btn') })
|
|
|
|
|
|
.margin({ bottom: 21 })
|
2025-06-26 11:18:07 +08:00
|
|
|
|
.onClick(() => {
|
2025-06-26 17:28:28 +08:00
|
|
|
|
if ((this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') ||
|
2025-06-26 11:18:07 +08:00
|
|
|
|
this.systemParam.Param770Str == '1') {
|
2025-04-10 10:28:07 +08:00
|
|
|
|
return
|
|
|
|
|
|
}
|
2025-06-26 14:27:10 +08:00
|
|
|
|
// this.qkFlag = true
|
2025-06-26 17:28:28 +08:00
|
|
|
|
console.log("打开缺考")
|
2025-06-26 14:27:10 +08:00
|
|
|
|
this.missAnExamDialogController.open()
|
2025-04-10 10:28:07 +08:00
|
|
|
|
})
|
2025-06-26 11:18:07 +08:00
|
|
|
|
|
|
|
|
|
|
if (this.isBoardPrePareSetPopupOpen &&
|
|
|
|
|
|
(this.isSecondBoardPrePareSetPopupOpen && this.currentUser.kssycs == '2') &&
|
|
|
|
|
|
!this.isFirstBoardPrePareSetPopupBtnShow) {
|
2025-06-26 14:27:10 +08:00
|
|
|
|
imageBtn({ btnWidth: 390, btnHeight: 122, imgSrc: $r('app.media.sczb_btn') })
|
|
|
|
|
|
.margin({ bottom: 21 })
|
2025-06-26 11:18:07 +08:00
|
|
|
|
.onClick(async () => {
|
|
|
|
|
|
if (this.systemParam.Param612Str == '1') {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
await this.prePareSCZB()
|
|
|
|
|
|
})
|
|
|
|
|
|
} else {
|
2025-06-26 14:27:10 +08:00
|
|
|
|
imageBtn({ btnWidth: 390, btnHeight: 122, imgSrc: $r('app.media.ksks_btn') })
|
|
|
|
|
|
.margin({ bottom: 21 })
|
2025-06-26 11:18:07 +08:00
|
|
|
|
.onClick(async () => {
|
|
|
|
|
|
if (this.systemParam.Param612Str == '1') {
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
await this.prePareExam()
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
2025-04-10 10:28:07 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-06-26 11:18:07 +08:00
|
|
|
|
}.backgroundColor("#1E1E1E").width("100%").height("100%")
|
|
|
|
|
|
|
2025-04-10 10:28:07 +08:00
|
|
|
|
if (this.showFaceCompare) {
|
|
|
|
|
|
FaceCompare({
|
|
|
|
|
|
sfzh: this.currentUser.sfzmhm,
|
|
|
|
|
|
firstImage: this.currentUser.kszp,
|
2025-07-14 13:23:36 +08:00
|
|
|
|
faceCompareSuccess: $faceCompareSucess,
|
2025-04-10 10:28:07 +08:00
|
|
|
|
getqkFlag: $getqkFlag,
|
|
|
|
|
|
faceCatchImg: $faceCatchImg,
|
|
|
|
|
|
showFaceCompare: $showFaceCompare,
|
|
|
|
|
|
lsh: AppStorage.get<string>('lsh'),
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
if (this.isBoardPrePareSetPopupShow) {
|
|
|
|
|
|
BoardPrePareSetPopup({
|
|
|
|
|
|
closePopup: () => {
|
|
|
|
|
|
this.isBoardPrePareSetPopupShow = false;
|
|
|
|
|
|
},
|
|
|
|
|
|
confirmMark: (kfdm: SckType[]) => {
|
|
|
|
|
|
this.sczbkf = kfdm
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
.height('100%')
|
|
|
|
|
|
.width('100%')
|
|
|
|
|
|
.backgroundImage($r('app.media.bg'))
|
|
|
|
|
|
.backgroundImageSize({ width: '100%', height: '100%' })
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-06-11 17:50:37 +08:00
|
|
|
|
private onCenterMsg = (val: CenterCallBackMsgType) => {
|
2025-04-10 10:28:07 +08:00
|
|
|
|
if (val.id == 32) {
|
|
|
|
|
|
AppStorage.setOrCreate('signNum', val.body[1])
|
|
|
|
|
|
if (val.body[0] == 7) {
|
|
|
|
|
|
//缺考处理
|
|
|
|
|
|
this.getqkFn()
|
|
|
|
|
|
this.signNum = val.body[1]
|
|
|
|
|
|
}
|
|
|
|
|
|
} else if (val.id == 42) {
|
|
|
|
|
|
//收到中心缺考确认消息
|
|
|
|
|
|
this.qkFn()
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|