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 { CandidateData, EmptyCandidateObject } from '../mock/CandidateData'; import BoardPrePareSetPopup from './compontents/judge/BoardPrePareSetPopup'; import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; import imageBtn from './compontents/imageBtn'; import { CryptoJS } from '@ohos/crypto-js'; import { BeginExamRequest, CarInfoType, CenterCallBackMsgType, 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 { CheckSignal, GetCurrentUserKeyValue, InitializeExamProcessData } from './UserInfo/utils'; import dayTs from '../utils/Date'; import { GetCurrentTime, GetPhotoBase64, NumberToByteArray } from '../utils/Common'; import DB from '../utils/DbSql'; import { CenterUDPBusinessInstance } from '../utils/business/CenterUdpBusiness'; import { JudgeEmitterInstance } from '../utils/business/UdpEvent'; import { StartExamTag, UserInfoTag } from '../config'; import { dConsole } from '../utils/LogWorker'; import HeaderComponent from './compontents/Header'; import AvatarComponent from './UserInfo/Avatar'; import CommTextComponent from './UserInfo/CommText'; import LabelBlockComponent from './UserInfo/LabelBlock'; import CarLoadingDialog from './compontents/CarLoading'; import ConfirmDialog from './compontents/ConfirmDialog'; import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignalWorker'; import FaceRecognitionDialog from './UserInfo/FaceRecognition'; @Entry @Component struct UserInfoPage { @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 sczbkf: SckType[] = [] @State currentUser: User = EmptyCandidateObject // 开始考试弹窗 startExamDialogController: CustomDialogController = new CustomDialogController({ builder: CarLoadingDialog(), autoCancel: false, customStyle: true }) @State dataList: Array = [] @State list: Array = [] @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 // 缺考弹窗 missAnExamDialogController: CustomDialogController = new CustomDialogController({ builder: ConfirmDialog({ text: `确认考生:${this.currentUser.xm}是否缺考?`, onConfirm: () => { this.qkFn() } }), customStyle: true, autoCancel: true }) //TODO 人脸对比弹窗 faceCompareController: CustomDialogController = new CustomDialogController({ builder: FaceRecognitionDialog({ sfzh: this.currentUser.sfzmhm, firstImage: this.currentUser.kszp, lsh: AppStorage.get('lsh'), }), customStyle: true, autoCancel: true }) @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 private context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext; private avPlayer!: VoiceAnnounce private labelBlocks: LabelBlockType[] = [ { label: '考生姓名', key: 'xm' }, { label: '身份证号', key: 'sfzmhm' }, { label: ' 流 水 号 ', key: 'lsh' }, { label: '考试路线', key: 'ksxl' }, { label: '待考次数', key: 'kssycs' }, { label: '考试员名', key: 'ksy2' }, ] //开始考试准备 prePareExam = async () => { try { // await this.checkSignal() await CheckSignal(this.systemParam, this.avPlayer) DifferentialAndSignal.clearMsg() this.faceCompareSucess = 0 AppStorage.setOrCreate('statue', 2) if (!this.currentUser.xm) { return } if (this.singlePlay) { this.currentUser.id = '0' dConsole.log('开始考试3') SqlInsertTable('USER', [this.currentUser]).catch((e: BusinessError) => { dConsole.log("error", JSON.stringify(e)) }) // 初始化开始考试过程数据文件夹 InitializeExamProcessData(this.currentUser) 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 } dConsole.log('this.FaceOpenStatuethis.FaceOpenStatue', this.FaceOpenStatue) if (this.FaceOpenStatue != '0') { // 同一学员连续第二次考试时不再验证身份 if (this.currentUser.kssycs == '1' && this.systemParam.Param830Str == '1') { this.sfbdinterfaceFn() } else { this.showFaceCompare = true } } else { this.sfbdinterfaceFn() } } catch (e) { dConsole.info('Throw Error', JSON.stringify(e)) } } aboutToAppear() { this.avPlayer = new VoiceAnnounce(this.context); } async onPageShow() { this.isExamStart = false this.startExam = false this.updateTimeLimit = false this.currentUser = EmptyCandidateObject this.singlePlay = AppStorage.get('singlePlay') || false dConsole.log("this.singlePlay", this.singlePlay) this.examinerLoginInfo = AppStorage.get('examinerInfo')! this.carInfo = AppStorage.get('carInfo')! //语音功能on // new WebRTCVoice(this.context); //初始化数据 this.initData() //身份证读卡器初始化 // this.openDeviceByIDCard() const routerParam: RouteParamsType = router.getParams() as RouteParamsType dConsole.log('routerParam', JSON.stringify(routerParam)) if (!this.singlePlay) { if (routerParam.type != "1") { this.list = await GetSyncData("USERLIST") const data = await GetSyncData("USER") dConsole.log('useruser,', JSON.stringify(this.list)) dConsole.log('useruser1,', JSON.stringify(data)) 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 == '')) { dConsole.log('datadatadatadata') 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 () => { dConsole.info('surenjun', 'userInfo收到UdpEvent事件') if (this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow) { await this.prePareSCZB() } else { await this.prePareExam() } }) } async onPageHide(): Promise { CenterUDPBusinessInstance.offMsg(this.onCenterMsg) } //身份证读卡器初始化 openDeviceByIDCard() { AppStorage.setOrCreate('indexComponent', this) // 应用启动时打开读卡设备 let ret = testNapi.OpenDevice(); if (ret == 0) { testNapi.StartReadCard(this.onReadCard); } else { dConsole.error("zzctest Failed to Open Device"); } } stopDeviceById() { if (this.faceFlag == '1') { testNapi.StopReadCard() } } // 通过身份证获取当前学员 async getCurrentStudent(id: string) { let flag = false // this.pageIndex dConsole.log('currentidid', id) this.list.map((res, index) => { dConsole.log('tttt', res.sfzmhm, res.xm) 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; dConsole.log("开始考试2") if (this.singlePlay) { this.stopDeviceById() // 初始化开始考试过程数据文件夹 InitializeExamProcessData(this.currentUser) 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) { dConsole.info(`zzctest xx Read Card ret =${ret.status}`) 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) { // 收到身份证信息,填充页面 dConsole.info(`zzctest Read Card 1`); let subIndex = ret.baseInfo.indexOf(":") let baseInfo: string = ret.baseInfo.substring(subIndex + 1, ret.baseInfo.length - 1); dConsole.info(`zzctest Read Card 2 baseInfo=${baseInfo}`); 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) dConsole.info(`Read Card ret = length = ${dataView.byteLength}`) 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; } dConsole.info(`zzctest Read Card end`); 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() { CenterUDPBusinessInstance.onMsg(this.onCenterMsg) } //考点端查询缺考指令内容消息请求 getqkFn() { let tmpList: Array = []; const number = AppStorage.get('signNum')! 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) CenterUDPBusinessInstance.sendData(param) } async initSysset() { const that = this; GetSyncData("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 dConsole.log('FaceOpenStatue', openCheckFlag, this.FaceOpenStatue) // 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() { dConsole.log('this.faceCompareSuces', this.faceCompareSucess, JSON.stringify(this.currentUser)) 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 dConsole.log('isFirstBoardPrePareSetPopupBtnShow', this.isFirstBoardPrePareSetPopupBtnShow, this.isBoardPrePareSetPopupOpen) this.startExam = false 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 = `${md5Message}${this.carInfo.carId}${this.carInfo.examinationRoomId}${this.examinerLoginInfo.username}` try { getExaminationStudentInfo(param).then(async (res) => { dConsole.log("temp log ", JSON.stringify(res)) setTimeout(() => { this.updateTimeLimit = false }, 3000) if (!res || res?.getExaminationStudentInfoRsp?.head?.resultCode == '1') { this.dataList = [] this.list = [] return } let dataList: User[] = [] this.list = [] for (const key of Object.keys(res.getExaminationStudentInfoRsp.body)) { const a: User[] | User = Reflect.get(res.getExaminationStudentInfoRsp.body, key); if (Array.isArray(a)) { dataList = a; } else { dataList = [a]; } } if (dataList.length) { this.numCount = 0 } this.list = JSON.parse(JSON.stringify(dataList)) dConsole.log("temp list", JSON.stringify(this.list)) this.list.forEach((listData, index) => { //考过一次不允许切换学员 if (listData.kssycs == '1') { this.startExam = true } listData.id = index.toString() 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 || []) dConsole.log("temp list", JSON.stringify(this.list)) // 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 dConsole.log("temp list", JSON.stringify(this.dataList)) 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 => { if (data?.[0]) { this.getCurrentStudent(data[0].sfzmhm) } }) }).catch((error: BusinessError) => { this.updateTimeLimit = false dConsole.log('error12error' + error) }) } catch (error) { this.updateTimeLimit = false dConsole.log('error14error' + error) } } // 缺考 qkFn() { if (this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') { return } this.faceCompareSucess = 0 if (this.singlePlay) { this.qkFlag = false return } dConsole.log('JsonJson', JSON.stringify(this.currentUser)) const param: ExaminationStuAbsentParams = { carId: this.carInfo.carId || "", sfzmhm: this.currentUser.sfzmhm, examinationRoomId: this.carInfo.examinationRoomId || "", username: this.examinerLoginInfo.username || "", lsh: this.lsh, } dConsole.log('carNo1111', param) 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 || "" } CenterUDPBusinessInstance.sendData(param) // 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.missAnExamDialogController.close() this.getExaminationStudentInfoFn() return } }).catch((error: BusinessError) => { dConsole.log('error12error' + error) }) } onCenterMsg = (val: CenterCallBackMsgType) => { 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() } } async getExaminationItemFn() { if (!this.currentUser.lsh || this.singlePlay) { return } 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; this.startExamDialogController.open() avPlayer.playAudio([`voice/监管通信中.mp3`], false, async () => { dConsole.info('surenjun', '播放结束开始考试接口调用') const res = await this.beginExam() dConsole.info('surenjun', '开始考试接口调用结束', JSON.stringify(res)) //TODO code转换 if (res.code != 1) { avPlayer.playAudio([res.code == -200 ? 'voice/photo_error.mp3' : 'voice/监管审核未通过.mp3']); this.startExamDialogController.close() 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 this.startExamDialogController.close() // 初始化开始考试过程数据文件夹 InitializeExamProcessData(this.currentUser) 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 beginExam(): Promise { dConsole.log(StartExamTag, "开始考试") const startHourTime = dayTs().format("HHmmssSSS") AppStorage.setOrCreate('startHourTime', startHourTime) const photoBase64 = await GetPhotoBase64(this.context); if (photoBase64 == '') { dConsole.log(StartExamTag, "拍照失败") this.startExamDialogController.close() 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, kssj: dayTs().format("YYYY-MM-DD HH:mm:ss") || '', kchp: decodeURI(this.carInfo.plateNo || ""), Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || '' } dConsole.log(StartExamTag, "开始考试参数", drvexam) const param: RegulatoryInterfaceParams = { drvexam, xtlb: '17', //接口序列号 jkxlh: this.jkxlh, //接口标识 jkid: '17C51', } dConsole.info('surenjunjianguan', JSON.stringify(param)) 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 CheckSignal(this.systemParam, this.avPlayer) DifferentialAndSignal.clearMsg() this.isExamStart = true this.currentUser.id = '0' DB.insertData("USER", this.currentUser).then(() => { dConsole.log("USER insert success",) }).catch((err: BusinessError) => { dConsole.log("USER insert fail", JSON.stringify(err)) }) dConsole.log("User", JSON.stringify(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(){ .width(389) .height(122) .backgroundImage($r('app.media.button_nor')) .backgroundImageSize({ width: '100%', height: '100%' }) .margin({ bottom: 21 }) } build() { Column() { HeaderComponent({ shortLogo: true, shouBackArea: true }) Column() { Row() { 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) }) } } .width(292) // 165 * 1.770833 ≈ 292.187 → 292 .height(151) // 85 * 1.770833 ≈ 150.52 → 151 .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) }) }) }.width(1133) // 640 * 1.770833 ≈ 1133.33 → 1133 .margin({ left: 53 }) // 30 * 1.770833 ≈ 53.12 → 53 Image($r('app.media.dk_prev')) .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 .onClick(() => { this.prevClick() }) 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 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: "" }) } } Column() { ForEach(this.labelBlocks, (item: LabelBlockType) => { LabelBlockComponent({ label: item.label, value: GetCurrentUserKeyValue(this.currentUser, item.key) }) }) } } .width(1176) // 664→1176 .height(600) // 339→600 .backgroundImage($r('app.media.dkbg')) .backgroundImageSize({ width: '100%', height: '100%' }) .margin({ left: 94 }) // 53→94 Column() { 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 }) .onClick(() => { if (this.isExamStart && !this.singlePlay) { return } this.faceCompareSucess = 0 this.numCount = 0 this.getExaminationStudentInfoFn() }) imageBtn({ btnWidth: 390, btnHeight: 122, imgSrc: $r('app.media.qk_btn') }) .margin({ bottom: 21 }) .onClick(() => { if ((this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') || this.systemParam.Param770Str == '1') { return } // this.qkFlag = true console.log("打开缺考") this.missAnExamDialogController.open() }) if (this.isBoardPrePareSetPopupOpen && (this.isSecondBoardPrePareSetPopupOpen && this.currentUser.kssycs == '2') && !this.isFirstBoardPrePareSetPopupBtnShow) { imageBtn({ btnWidth: 390, btnHeight: 122, imgSrc: $r('app.media.sczb_btn') }) .margin({ bottom: 21 }) .onClick(async () => { if (this.systemParam.Param612Str == '1') { return } await this.prePareSCZB() }) } else { imageBtn({ btnWidth: 390, btnHeight: 122, imgSrc: $r('app.media.ksks_btn') }) .margin({ bottom: 21 }) .onClick(async () => { if (this.systemParam.Param612Str == '1') { dConsole.log(UserInfoTag, "不给开始考试") return } await this.prePareExam() }) } } } }.backgroundColor("#1E1E1E").width("100%").height("100%") if (this.showFaceCompare) { FaceCompare({ sfzh: this.currentUser.sfzmhm, firstImage: this.currentUser.kszp, faceCompareSuccess: $faceCompareSucess, getqkFlag: $getqkFlag, faceCatchImg: $faceCatchImg, showFaceCompare: $showFaceCompare, lsh: AppStorage.get('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%' }) } }