| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  | import { examinationStuAbsent, getExaminationItem, getExaminationStudentInfo } from '../api/userInfo'; | 
					
						
							|  |  |  |  | import router from '@ohos.router'; | 
					
						
							|  |  |  |  | import TopLogo from './compontents/TopLogo'; | 
					
						
							|  |  |  |  | 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 LoadingPopup from './compontents/judge/LoadingPopup'; | 
					
						
							|  |  |  |  | import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; | 
					
						
							| 
									
										
										
										
											2025-04-11 14:08:48 +08:00
										 |  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  | // import { initJudgeUdp } from '../common/utils/UdpJudge'; | 
					
						
							|  |  |  |  | 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 { 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'; | 
					
						
							|  |  |  |  | import errorMsgDialog from './compontents/errorMsgDialog'; | 
					
						
							| 
									
										
										
										
											2025-04-11 14:08:48 +08:00
										 |  |  |  | import { JudgeConfig } from '../config'; | 
					
						
							| 
									
										
										
										
											2025-04-10 10:28:07 +08:00
										 |  |  |  | 
 | 
					
						
							|  |  |  |  | @Entry | 
					
						
							|  |  |  |  | @Component | 
					
						
							|  |  |  |  | struct UserInfo { | 
					
						
							|  |  |  |  |   @State pageIndex: number = 0 | 
					
						
							|  |  |  |  |   @State ratio: number = 1700 / 960 | 
					
						
							|  |  |  |  |   @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 isLoadingPopupVisible: boolean = false; | 
					
						
							|  |  |  |  |   @State loadingText: string = '正在认证监管信息,请稍后...' | 
					
						
							|  |  |  |  |   @State sczbkf: SckType[] = [] | 
					
						
							|  |  |  |  |   @State currentUser: User = EmptyCandidateObject | 
					
						
							|  |  |  |  |   @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 | 
					
						
							|  |  |  |  |   @State ksksLimit: boolean = false | 
					
						
							|  |  |  |  |   @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 title = '' | 
					
						
							|  |  |  |  |   private type = '2' | 
					
						
							|  |  |  |  |   errorDialog: CustomDialogController = new CustomDialogController({ | 
					
						
							|  |  |  |  |     builder: errorMsgDialog({ | 
					
						
							|  |  |  |  |       title: this.title, | 
					
						
							|  |  |  |  |       type: this.type, | 
					
						
							|  |  |  |  |       cancel: () => { | 
					
						
							|  |  |  |  |       }, | 
					
						
							|  |  |  |  |       confirm: () => { | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     }), | 
					
						
							|  |  |  |  |     customStyle: true, | 
					
						
							|  |  |  |  |     alignment: DialogAlignment.Center, | 
					
						
							|  |  |  |  |   }, | 
					
						
							|  |  |  |  |   ) | 
					
						
							|  |  |  |  |   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 () => { | 
					
						
							|  |  |  |  |     if (this.ksksLimit) { | 
					
						
							|  |  |  |  |       return | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     try { | 
					
						
							|  |  |  |  |       await this.checkSignal() | 
					
						
							|  |  |  |  |       this.faceCompareSucess = 0 | 
					
						
							|  |  |  |  |       AppStorage.setOrCreate('statue', 2) | 
					
						
							|  |  |  |  |       if (!this.currentUser.xm) { | 
					
						
							|  |  |  |  |         return | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |       this.ksksLimit = true | 
					
						
							|  |  |  |  |       if (this.singlePlay) { | 
					
						
							|  |  |  |  |         this.currentUser.id = '0' | 
					
						
							| 
									
										
										
										
											2025-04-11 17:09:27 +08:00
										 |  |  |  |         console.log('开始考试') | 
					
						
							|  |  |  |  |         SqlInsertTable('USER', [this.currentUser]).catch((e: BusinessError) => { | 
					
						
							|  |  |  |  |           console.log("error", JSON.stringify(e)) | 
					
						
							|  |  |  |  |         }) | 
					
						
							| 
									
										
										
										
											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.ksksLimit = false | 
					
						
							|  |  |  |  |         this.stopDeviceById() | 
					
						
							|  |  |  |  |         return | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |       console.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) { | 
					
						
							|  |  |  |  |       console.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.ksksLimit = false | 
					
						
							|  |  |  |  |     this.currentUser = EmptyCandidateObject | 
					
						
							|  |  |  |  |     this.filePhoto = new FilePhoto(this.context); | 
					
						
							|  |  |  |  |     this.singlePlay = AppStorage.get<boolean>('singlePlay') || false | 
					
						
							| 
									
										
										
										
											2025-04-11 17:09:27 +08:00
										 |  |  |  |     console.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 | 
					
						
							|  |  |  |  |     console.log('routerParam', JSON.stringify(routerParam)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     if (!this.singlePlay) { | 
					
						
							|  |  |  |  |       if (routerParam.type != "1") { | 
					
						
							|  |  |  |  |         this.list = await GetSyncData<User>("USERLIST") | 
					
						
							|  |  |  |  |         const data = await GetSyncData<User>("USER") | 
					
						
							|  |  |  |  |         console.log('useruser,', JSON.stringify(this.list)) | 
					
						
							|  |  |  |  |         console.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 == '')) { | 
					
						
							|  |  |  |  |           console.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 () => { | 
					
						
							|  |  |  |  |       console.info('surenjun', 'userInfo收到UdpEvent事件') | 
					
						
							|  |  |  |  |       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 { | 
					
						
							|  |  |  |  |       console.error("zzctest Failed to Open Device"); | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   stopDeviceById() { | 
					
						
							|  |  |  |  |     if (this.faceFlag == '1') { | 
					
						
							|  |  |  |  |       testNapi.StopReadCard() | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   // 通过身份证获取当前学员 | 
					
						
							|  |  |  |  |   async getCurrentStudent(id: string) { | 
					
						
							|  |  |  |  |     let flag = false | 
					
						
							|  |  |  |  |     // this.pageIndex | 
					
						
							|  |  |  |  |     console.log('currentidid', id) | 
					
						
							|  |  |  |  |     this.list.map((res, index) => { | 
					
						
							|  |  |  |  |       console.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; | 
					
						
							|  |  |  |  |         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) { | 
					
						
							|  |  |  |  |     console.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) { | 
					
						
							|  |  |  |  |       // 收到身份证信息,填充页面 | 
					
						
							|  |  |  |  |       console.info(`zzctest Read Card 1`); | 
					
						
							|  |  |  |  |       let subIndex = ret.baseInfo.indexOf(":") | 
					
						
							|  |  |  |  |       let baseInfo: string = ret.baseInfo.substring(subIndex + 1, ret.baseInfo.length - 1); | 
					
						
							|  |  |  |  |       console.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) | 
					
						
							|  |  |  |  |       console.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; | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     console.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() { | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  |  |       console.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() { | 
					
						
							|  |  |  |  |     this.ksksLimit = false | 
					
						
							|  |  |  |  |     console.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.ksksLimit = false | 
					
						
							|  |  |  |  |     // this.isBoardPrePareSetPopupOpen=true | 
					
						
							|  |  |  |  |     this.isFirstBoardPrePareSetPopupBtnShow = false | 
					
						
							|  |  |  |  |     console.log('isFirstBoardPrePareSetPopupBtnShow', this.isFirstBoardPrePareSetPopupBtnShow, | 
					
						
							|  |  |  |  |       this.isBoardPrePareSetPopupOpen) | 
					
						
							|  |  |  |  |     this.startExam = false | 
					
						
							|  |  |  |  |     // await upDateTableByArray('USER', []) | 
					
						
							|  |  |  |  |     // await upDateTableByArray('USERLIST', []) | 
					
						
							|  |  |  |  |     await DB.clearTable('USER') | 
					
						
							|  |  |  |  |     await DB.clearTable('USERLIST') | 
					
						
							|  |  |  |  |     this.type = '2' | 
					
						
							|  |  |  |  |     this.errorDialog.open() | 
					
						
							|  |  |  |  |     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) => { | 
					
						
							|  |  |  |  |         console.log("temp log ", JSON.stringify(res)) | 
					
						
							|  |  |  |  |         this.errorDialog.close() | 
					
						
							|  |  |  |  |         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)) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         console.log("temp list", JSON.stringify(this.list)) | 
					
						
							|  |  |  |  |         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 || []) | 
					
						
							|  |  |  |  |         console.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 | 
					
						
							|  |  |  |  |         console.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 => { | 
					
						
							|  |  |  |  |         GetSyncData<User>("USER").then(data => { | 
					
						
							|  |  |  |  |           if (data?.[0]) { | 
					
						
							|  |  |  |  |             this.getCurrentStudent(data[0].sfzmhm) | 
					
						
							|  |  |  |  |           } | 
					
						
							|  |  |  |  |         }) | 
					
						
							|  |  |  |  |       }).catch((error: BusinessError) => { | 
					
						
							|  |  |  |  |         this.updateTimeLimit = false | 
					
						
							|  |  |  |  |         this.errorDialog.close() | 
					
						
							|  |  |  |  |         console.log('error12error' + error) | 
					
						
							|  |  |  |  |       }) | 
					
						
							|  |  |  |  |     } catch (error) { | 
					
						
							|  |  |  |  |       this.updateTimeLimit = false | 
					
						
							|  |  |  |  |       this.errorDialog.close() | 
					
						
							|  |  |  |  |       console.log('error14error' + error) | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   qkFn() { | 
					
						
							|  |  |  |  |     if (this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') { | 
					
						
							|  |  |  |  |       return | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     this.faceCompareSucess = 0 | 
					
						
							|  |  |  |  |     this.ksksLimit = false | 
					
						
							|  |  |  |  |     if (this.singlePlay) { | 
					
						
							|  |  |  |  |       this.qkFlag = false | 
					
						
							|  |  |  |  |       return | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     console.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 | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     console.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 || "" | 
					
						
							|  |  |  |  |       } | 
					
						
							| 
									
										
										
										
											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) => { | 
					
						
							|  |  |  |  |       console.log('error12error' + error) | 
					
						
							|  |  |  |  |     }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   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; | 
					
						
							|  |  |  |  |     this.isLoadingPopupVisible = true | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |     avPlayer.playAudio([`voice/监管通信中.mp3`], false, async () => { | 
					
						
							|  |  |  |  |       console.info('surenjun', '播放结束开始考试接口调用') | 
					
						
							|  |  |  |  |       // const { code, keystr, message } = await this.beginExam() || {}; | 
					
						
							|  |  |  |  |       const res = await this.beginExam() | 
					
						
							|  |  |  |  |       console.info('surenjun', '开始考试接口调用结束') | 
					
						
							|  |  |  |  |       //TODO code转换 | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       if (res.code != 1) { | 
					
						
							|  |  |  |  |         avPlayer.playAudio([res.code == -200 ? 'voice/photo_error.mp3' : 'voice/监管审核未通过.mp3']); | 
					
						
							|  |  |  |  |         this.isLoadingPopupVisible = false | 
					
						
							|  |  |  |  |         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.isLoadingPopupVisible = false | 
					
						
							|  |  |  |  |       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> { | 
					
						
							|  |  |  |  |     // const { examSubject, plateNo } = this.carInfo; | 
					
						
							|  |  |  |  |     const date = new Date() | 
					
						
							|  |  |  |  |     // const startHourTime = await getCurrentHourTime() | 
					
						
							|  |  |  |  |     const startHourTime = dayTs().format("HHmmssSSS") | 
					
						
							|  |  |  |  |     AppStorage.setOrCreate('startHourTime', startHourTime) | 
					
						
							|  |  |  |  |     const photoBase64 = await this.getPhoto(); | 
					
						
							|  |  |  |  |     if (photoBase64 == '') { | 
					
						
							|  |  |  |  |       this.ksksLimit = false | 
					
						
							|  |  |  |  |       this.isLoadingPopupVisible = false | 
					
						
							|  |  |  |  |       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(date).format("YYYY-MM-DD HH:mm:ss") || '', | 
					
						
							|  |  |  |  |       kchp: decodeURI(this.carInfo.plateNo || ""), | 
					
						
							|  |  |  |  |       Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || '' | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     const param: RegulatoryInterfaceParams = { | 
					
						
							|  |  |  |  |       drvexam, | 
					
						
							|  |  |  |  |       xtlb: '17', | 
					
						
							|  |  |  |  |       //接口序列号 | 
					
						
							|  |  |  |  |       jkxlh: this.jkxlh, | 
					
						
							|  |  |  |  |       //接口标识 | 
					
						
							|  |  |  |  |       jkid: '17C51', | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     console.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 this.checkSignal() | 
					
						
							|  |  |  |  |       this.isExamStart = true | 
					
						
							|  |  |  |  |       this.currentUser.id = '0' | 
					
						
							|  |  |  |  |       DB.insertData("USER", this.currentUser).then(() => { | 
					
						
							|  |  |  |  |         console.log("USER insert success",) | 
					
						
							|  |  |  |  |       }).catch((err: BusinessError) => { | 
					
						
							|  |  |  |  |         console.log("USER insert fail", JSON.stringify(err)) | 
					
						
							|  |  |  |  |       }) | 
					
						
							|  |  |  |  |       // await upDateTableByArray('USER', [this.currentUser]) | 
					
						
							|  |  |  |  |       console.log("User", JSON.stringify(this.currentUser)) | 
					
						
							|  |  |  |  |       // 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(){ | 
					
						
							|  |  |  |  |     .width(220 * this.ratio) | 
					
						
							|  |  |  |  |     .height(69 * this.ratio) | 
					
						
							|  |  |  |  |     .backgroundImage($r('app.media.button_nor')) | 
					
						
							|  |  |  |  |     .backgroundImageSize({ width: '100%', height: '100%' }) | 
					
						
							|  |  |  |  |     .margin({ bottom: 12 * this.ratio }) | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   build() { | 
					
						
							|  |  |  |  |     Column() { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       TopLogo({ outFlag: $outFlag }).margin({ bottom: 10 }) | 
					
						
							|  |  |  |  |       Row() { | 
					
						
							|  |  |  |  |         Row() { | 
					
						
							|  |  |  |  |           ForEach(this.dataList, (item: User) => { | 
					
						
							|  |  |  |  |             Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | 
					
						
							|  |  |  |  |               Column() { | 
					
						
							|  |  |  |  |                 CommText({ | 
					
						
							|  |  |  |  |                   ratio: this.ratio, | 
					
						
							|  |  |  |  |                   color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000', | 
					
						
							|  |  |  |  |                   text: item.lsh | 
					
						
							|  |  |  |  |                 }) | 
					
						
							|  |  |  |  |                 CommText({ | 
					
						
							|  |  |  |  |                   ratio: this.ratio, | 
					
						
							|  |  |  |  |                   color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000', | 
					
						
							|  |  |  |  |                   text: decodeURIComponent(item.xm) | 
					
						
							|  |  |  |  |                 }) | 
					
						
							|  |  |  |  |               } | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             .width(165 * this.ratio) | 
					
						
							|  |  |  |  |             .height(85 * this.ratio) | 
					
						
							|  |  |  |  |             .backgroundImage(item.sfzmhm != this.currentUser.sfzmhm ? $r('app.media.userbox2') : | 
					
						
							|  |  |  |  |             $r('app.media.userboxbg')) | 
					
						
							|  |  |  |  |             .backgroundImageSize({ width: '100%', height: '100%' }) | 
					
						
							|  |  |  |  |             .onClick(() => { | 
					
						
							|  |  |  |  |               console.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(640 * this.ratio).margin({ left: 30 * this.ratio }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         Image($r('app.media.dk_prev')) | 
					
						
							|  |  |  |  |           .width(90 * this.ratio) | 
					
						
							|  |  |  |  |           .height(70 * this.ratio) | 
					
						
							|  |  |  |  |           .margin({ left: 65 * this.ratio, right: 10 * this.ratio }) | 
					
						
							|  |  |  |  |           .onClick(() => { | 
					
						
							|  |  |  |  |             // this.avPlayer.playAudio(['button_media.wav']) | 
					
						
							|  |  |  |  |             this.prevClick() | 
					
						
							|  |  |  |  |           }) | 
					
						
							|  |  |  |  |         Image($r('app.media.dk_next')).width(90 * this.ratio).height(70 * this.ratio).onClick(() => { | 
					
						
							|  |  |  |  |           // this.avPlayer.playAudio(['button_media.wav']) | 
					
						
							|  |  |  |  |           this.nextClick() | 
					
						
							|  |  |  |  |         }) | 
					
						
							|  |  |  |  |       }.margin({ top: 40 * this.ratio, bottom: 10 * this.ratio }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       Flex({ justifyContent: FlexAlign.SpaceBetween }) { | 
					
						
							|  |  |  |  |         Row() { | 
					
						
							|  |  |  |  |           Column() { | 
					
						
							|  |  |  |  |             if (this.currentUser.kszp) { | 
					
						
							|  |  |  |  |               Avatar({ | 
					
						
							|  |  |  |  |                 ratio: this.ratio, | 
					
						
							|  |  |  |  |                 url: this.currentUser.kszp ? this.currentUser.kszp : '' | 
					
						
							|  |  |  |  |               }) | 
					
						
							|  |  |  |  |             } else { | 
					
						
							|  |  |  |  |               Avatar({ | 
					
						
							|  |  |  |  |                 ratio: this.ratio, | 
					
						
							|  |  |  |  |                 url: "" | 
					
						
							|  |  |  |  |               }) | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             if (this.currentUser.ksmjzp) { | 
					
						
							|  |  |  |  |               Avatar({ | 
					
						
							|  |  |  |  |                 ratio: this.ratio, | 
					
						
							|  |  |  |  |                 url: this.currentUser.ksmjzp ? this.currentUser.ksmjzp : '' | 
					
						
							|  |  |  |  |               }) | 
					
						
							|  |  |  |  |             } else { | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |               Avatar({ | 
					
						
							|  |  |  |  |                 ratio: this.ratio, | 
					
						
							|  |  |  |  |                 url: "" | 
					
						
							|  |  |  |  |               }) | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |           } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |           Column() { | 
					
						
							|  |  |  |  |             ForEach(this.labelBlocks, (item: LabelBlockType) => { | 
					
						
							|  |  |  |  |               LabelBlock({ | 
					
						
							|  |  |  |  |                 label: item.label, | 
					
						
							|  |  |  |  |                 ratio: this.ratio, | 
					
						
							|  |  |  |  |                 value: GetCurrentUserKeyValue(this.currentUser, item.key) | 
					
						
							|  |  |  |  |               }) | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  |           } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         .width(664 * this.ratio) | 
					
						
							|  |  |  |  |         .height(339 * this.ratio) | 
					
						
							|  |  |  |  |         .backgroundImage($r('app.media.dkbg')) | 
					
						
							|  |  |  |  |         .backgroundImageSize({ width: '100%', height: '100%' }) | 
					
						
							|  |  |  |  |         .margin({ left: 53 * this.ratio }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         Column() { | 
					
						
							|  |  |  |  |           imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.yydj_btn') }) | 
					
						
							|  |  |  |  |             .margin({ bottom: 12 * this.ratio }) | 
					
						
							|  |  |  |  |           imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.gx_btn') }) | 
					
						
							|  |  |  |  |             .margin({ bottom: 12 * this.ratio }) | 
					
						
							|  |  |  |  |             .onClick(() => { | 
					
						
							|  |  |  |  |               if (this.isExamStart && !this.singlePlay) { | 
					
						
							|  |  |  |  |                 return | 
					
						
							|  |  |  |  |               } | 
					
						
							|  |  |  |  |               this.faceCompareSucess = 0 | 
					
						
							|  |  |  |  |               this.numCount = 0 | 
					
						
							|  |  |  |  |               this.getExaminationStudentInfoFn() | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  |           imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.qk_btn') }) | 
					
						
							|  |  |  |  |             .margin({ bottom: 12 * this.ratio }) | 
					
						
							|  |  |  |  |             .onClick(() => { | 
					
						
							|  |  |  |  |               //  已开始考试不能缺考   已考过一次学员不能缺考                                                 车上不能缺考 | 
					
						
							|  |  |  |  |               if (this.ksksLimit || (this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') || | 
					
						
							|  |  |  |  |                 this.systemParam.Param770Str == '1') { | 
					
						
							|  |  |  |  |                 return | 
					
						
							|  |  |  |  |               } | 
					
						
							|  |  |  |  |               this.ksksLimit = true | 
					
						
							|  |  |  |  |               this.qkFlag = true | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |           if (this.isBoardPrePareSetPopupOpen && | 
					
						
							|  |  |  |  |             (this.isSecondBoardPrePareSetPopupOpen && this.currentUser.kssycs == '2') && | 
					
						
							|  |  |  |  |             !this.isFirstBoardPrePareSetPopupBtnShow) { | 
					
						
							|  |  |  |  |             imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.sczb_btn') }) | 
					
						
							|  |  |  |  |               .margin({ bottom: 12 * this.ratio }) | 
					
						
							|  |  |  |  |               .onClick(async () => { | 
					
						
							|  |  |  |  |                 if (this.systemParam.Param612Str == '1') { | 
					
						
							|  |  |  |  |                   return | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 await this.prePareSCZB() | 
					
						
							|  |  |  |  |               }) | 
					
						
							|  |  |  |  |           } else { | 
					
						
							|  |  |  |  |             imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.ksks_btn') }) | 
					
						
							|  |  |  |  |               .margin({ bottom: 12 * this.ratio }) | 
					
						
							|  |  |  |  |               .onClick(async () => { | 
					
						
							|  |  |  |  |                 if (this.systemParam.Param612Str == '1') { | 
					
						
							|  |  |  |  |                   return | 
					
						
							|  |  |  |  |                 } | 
					
						
							|  |  |  |  |                 await this.prePareExam() | 
					
						
							|  |  |  |  |               }) | 
					
						
							|  |  |  |  |           } | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       if (this.showFaceCompare) { | 
					
						
							|  |  |  |  |         FaceCompare({ | 
					
						
							|  |  |  |  |           sfzh: this.currentUser.sfzmhm, | 
					
						
							|  |  |  |  |           firstImage: this.currentUser.kszp, | 
					
						
							|  |  |  |  |           faceCompareSucess: $faceCompareSucess, | 
					
						
							|  |  |  |  |           getqkFlag: $getqkFlag, | 
					
						
							|  |  |  |  |           faceCatchImg: $faceCatchImg, | 
					
						
							|  |  |  |  |           showFaceCompare: $showFaceCompare, | 
					
						
							|  |  |  |  |           lsh: AppStorage.get<string>('lsh'), | 
					
						
							|  |  |  |  |         }) | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |       if (this.qkFlag) { | 
					
						
							|  |  |  |  |         Column() { | 
					
						
							|  |  |  |  |           Text('确认考生:' + this.currentUser.xm + '是否缺考') | 
					
						
							|  |  |  |  |             .fontSize(28 * this.ratio) | 
					
						
							|  |  |  |  |             .position({ x: 160 * this.ratio, y: 122 * this.ratio }) | 
					
						
							|  |  |  |  |           Row() { | 
					
						
							|  |  |  |  |             Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | 
					
						
							|  |  |  |  |               Text('  取   消  ').fontSize(24 * this.ratio).fontColor('#fff').width(100 * this.ratio) | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             .commStyle() | 
					
						
							|  |  |  |  |             .onClick(() => { | 
					
						
							|  |  |  |  |               this.ksksLimit = false | 
					
						
							|  |  |  |  |               this.qkFlag = false | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |             Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | 
					
						
							|  |  |  |  |               Text('  确   定  ').fontSize(24 * this.ratio).fontColor('#fff').width(100 * this.ratio) | 
					
						
							|  |  |  |  |             } | 
					
						
							|  |  |  |  |             .commStyle() | 
					
						
							|  |  |  |  |             .onClick(() => { | 
					
						
							|  |  |  |  |               // this.avPlayer.playAudio(['button_media.wav']) | 
					
						
							|  |  |  |  |               this.qkFn() | 
					
						
							|  |  |  |  |             }) | 
					
						
							|  |  |  |  |           }.position({ y: 265 * this.ratio, x: 115 * this.ratio }) | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |         } | 
					
						
							|  |  |  |  |         .width(660 * this.ratio) | 
					
						
							|  |  |  |  |         .height(360 * this.ratio) | 
					
						
							|  |  |  |  |         .position({ x: 150 * this.ratio, y: 98 * this.ratio }) | 
					
						
							|  |  |  |  |         .backgroundColor('#E6E3DF') | 
					
						
							|  |  |  |  |         .borderRadius(19 * this.ratio) | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       // 上车准备弹窗 | 
					
						
							|  |  |  |  |       if (this.isBoardPrePareSetPopupShow) { | 
					
						
							|  |  |  |  |         BoardPrePareSetPopup({ | 
					
						
							|  |  |  |  |           closePopup: () => { | 
					
						
							|  |  |  |  |             this.isBoardPrePareSetPopupShow = false; | 
					
						
							|  |  |  |  |           }, | 
					
						
							|  |  |  |  |           confirmMark: (kfdm: SckType[]) => { | 
					
						
							|  |  |  |  |             this.sczbkf = kfdm | 
					
						
							|  |  |  |  |           } | 
					
						
							|  |  |  |  |         }) | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |       // loading | 
					
						
							|  |  |  |  |       if (this.isLoadingPopupVisible) { | 
					
						
							|  |  |  |  |         LoadingPopup({ | 
					
						
							|  |  |  |  |           title: this.loadingText, | 
					
						
							|  |  |  |  |         }) | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |     .height('100%') | 
					
						
							|  |  |  |  |     .width('100%') | 
					
						
							|  |  |  |  |     .backgroundImage($r('app.media.bg')) | 
					
						
							|  |  |  |  |     .backgroundImageSize({ width: '100%', height: '100%' }) | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   private 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() | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 头像组件 | 
					
						
							|  |  |  |  | @Component | 
					
						
							|  |  |  |  | struct Avatar { | 
					
						
							|  |  |  |  |   @State ratio: number = 0 | 
					
						
							|  |  |  |  |   @State url: string = "" | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   build() { | 
					
						
							|  |  |  |  |     Row() { | 
					
						
							|  |  |  |  |       Image(this.url) | 
					
						
							|  |  |  |  |         .width(93 * this.ratio) | 
					
						
							|  |  |  |  |         .height(130.5 * this.ratio) | 
					
						
							|  |  |  |  |         .margin({ bottom: 10 * this.ratio, right: 58 * this.ratio, left: 55 * this.ratio }) | 
					
						
							|  |  |  |  |         .backgroundColor('orange') | 
					
						
							|  |  |  |  |         .border({ color: '#fff', width: 1, style: BorderStyle.Solid }) | 
					
						
							|  |  |  |  |         .syncLoad(true) | 
					
						
							|  |  |  |  |     } | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 横向滚动学员列表里面文字 | 
					
						
							|  |  |  |  | @Component | 
					
						
							|  |  |  |  | struct CommText { | 
					
						
							|  |  |  |  |   @Prop text: string | 
					
						
							|  |  |  |  |   @Prop color: string | 
					
						
							|  |  |  |  |   @Prop ratio: number | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   build() { | 
					
						
							|  |  |  |  |     Text(this.text) | 
					
						
							|  |  |  |  |       .fontSize(19.5 * this.ratio) | 
					
						
							|  |  |  |  |       .lineHeight(30 * this.ratio) | 
					
						
							|  |  |  |  |       .fontWeight(500) | 
					
						
							|  |  |  |  |       .fontColor(this.color) | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  | // 考生信息的labelBlock组件 | 
					
						
							|  |  |  |  | @Component | 
					
						
							|  |  |  |  | struct LabelBlock { | 
					
						
							|  |  |  |  |   @State label: string = '' | 
					
						
							|  |  |  |  |   @State ratio: number = 0 | 
					
						
							|  |  |  |  |   @Prop value: string = '' | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   @Styles | 
					
						
							|  |  |  |  |   commLabelStyle(){ | 
					
						
							|  |  |  |  |     .width(280 * this.ratio) | 
					
						
							|  |  |  |  |     .height(35 * this.ratio) | 
					
						
							|  |  |  |  |     .backgroundImageSize({ width: '100%', height: '100%' }) | 
					
						
							|  |  |  |  |     .backgroundImage($r('app.media.userbox')) | 
					
						
							|  |  |  |  |     .margin({ left: 8 * this.ratio }) | 
					
						
							|  |  |  |  |     .align(Alignment.Center) | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | 
 | 
					
						
							|  |  |  |  |   build() { | 
					
						
							|  |  |  |  |     Row() { | 
					
						
							|  |  |  |  |       Text(this.label).fontSize(20 * this.ratio).fontColor('#99948A') | 
					
						
							|  |  |  |  |       Row() { | 
					
						
							|  |  |  |  |         Text(decodeURIComponent(this.value || '') || '') | 
					
						
							|  |  |  |  |           .fontColor('#fff') | 
					
						
							|  |  |  |  |           .textAlign(TextAlign.Center) | 
					
						
							|  |  |  |  |           .width('100%') | 
					
						
							|  |  |  |  |           .fontSize(18 * this.ratio) | 
					
						
							|  |  |  |  |       } | 
					
						
							|  |  |  |  |       .commLabelStyle() | 
					
						
							|  |  |  |  |     }.margin({ bottom: 10 * this.ratio }) | 
					
						
							|  |  |  |  |   } | 
					
						
							|  |  |  |  | } | 
					
						
							|  |  |  |  | 
 |