fix: 人脸对比窗口
This commit is contained in:
		
							parent
							
								
									2d912d4ea3
								
							
						
					
					
						commit
						658e59760b
					
				| @ -68,3 +68,6 @@ export const SignDisplayTag = '[SignDisplay]'; | ||||
| 
 | ||||
| //开始考试 | ||||
| export const StartExamTag = '[StartExam]' | ||||
| 
 | ||||
| //人脸对比 | ||||
| export const FaceCompareTag = '[FaceCompare]'; | ||||
| @ -50,6 +50,7 @@ import LabelBlockComponent from './UserInfo/LabelBlock'; | ||||
| import CarLoadingDialog from './compontents/CarLoading'; | ||||
| import ConfirmDialog from './compontents/ConfirmDialog'; | ||||
| import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignalWorker'; | ||||
| import FaceRecognitionDialog from './UserInfo/FaceRecognition'; | ||||
| 
 | ||||
| @Entry | ||||
| @Component | ||||
| @ -72,7 +73,6 @@ struct UserInfoPage { | ||||
|   @State isSecondBoardPrePareSetPopupOpen: boolean = false | ||||
|   @State isFirstBoardPrePareSetPopupBtnShow: boolean = false | ||||
|   @State isBoardPrePareSetPopupShow: boolean = false | ||||
|   @State loadingText: string = '正在认证监管信息,请稍后...' | ||||
|   @State sczbkf: SckType[] = [] | ||||
|   @State currentUser: User = EmptyCandidateObject | ||||
|   // 开始考试弹窗 | ||||
| @ -112,6 +112,16 @@ struct UserInfoPage { | ||||
|     customStyle: true, | ||||
|     autoCancel: true | ||||
|   }) | ||||
|   // 人脸对比弹窗 | ||||
|   faceCompareController: CustomDialogController = new CustomDialogController({ | ||||
|     builder: FaceRecognitionDialog({ | ||||
|       sfzh: this.currentUser.sfzmhm, | ||||
|       firstImage: this.currentUser.kszp, | ||||
|       lsh: AppStorage.get<string>('lsh'), | ||||
|     }), | ||||
|     customStyle: true, | ||||
|     autoCancel: true | ||||
|   }) | ||||
|   @State faceFlag: string = '0'; | ||||
|   @State FaceOpenStatue: string = '0'; //是否开启人脸识别 | ||||
|   @State faceCatchImg: string = '' | ||||
| @ -490,11 +500,6 @@ struct UserInfoPage { | ||||
| 
 | ||||
|   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 || '' | ||||
| @ -647,8 +652,6 @@ struct UserInfoPage { | ||||
|     dConsole.log('isFirstBoardPrePareSetPopupBtnShow', this.isFirstBoardPrePareSetPopupBtnShow, | ||||
|       this.isBoardPrePareSetPopupOpen) | ||||
|     this.startExam = false | ||||
|     // await upDateTableByArray('USER', []) | ||||
|     // await upDateTableByArray('USERLIST', []) | ||||
|     await DB.clearTable('USER') | ||||
|     await DB.clearTable('USERLIST') | ||||
|     this.updateTimeLimit = true | ||||
| @ -689,7 +692,6 @@ struct UserInfoPage { | ||||
|         this.list.forEach((listData, index) => { | ||||
|           //考过一次不允许切换学员 | ||||
|           if (listData.kssycs == '1') { | ||||
| 
 | ||||
|             this.startExam = true | ||||
|           } | ||||
|           listData.id = index.toString() | ||||
| @ -743,7 +745,6 @@ struct UserInfoPage { | ||||
|         } | ||||
| 
 | ||||
|         this.pageIndex = 0 | ||||
|         // getSyncData('USER').then(data => { | ||||
|         GetSyncData<User>("USER").then(data => { | ||||
|           if (data?.[0]) { | ||||
|             this.getCurrentStudent(data[0].sfzmhm) | ||||
| @ -759,6 +760,7 @@ struct UserInfoPage { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // 缺考 | ||||
|   qkFn() { | ||||
|     if (this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') { | ||||
|       return | ||||
| @ -806,11 +808,24 @@ struct UserInfoPage { | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   onCenterMsg = (val: CenterCallBackMsgType) => { | ||||
|     if (val.id == 32) { | ||||
|       AppStorage.setOrCreate('signNum', val.body[1]) | ||||
|       if (val.body[0] == 7) { | ||||
|         //缺考处理 | ||||
|         this.getqkFn() | ||||
|         this.signNum = val.body[1] | ||||
|       } | ||||
|     } else if (val.id == 42) { | ||||
|       //收到中心缺考确认消息 | ||||
|       this.qkFn() | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   async getExaminationItemFn() { | ||||
|     if (!this.currentUser.lsh || this.singlePlay) { | ||||
|       return | ||||
|     } | ||||
|     // const { carId, examinationRoomId } = this.carInfo; | ||||
|     const examItems = await getExaminationItem({ | ||||
|       time: GetCurrentTime() || "", | ||||
|       carId: this.carInfo.carId || "", | ||||
| @ -930,7 +945,6 @@ struct UserInfoPage { | ||||
|   //开始上车准备 | ||||
|   prePareSCZB = async () => { | ||||
|     try { | ||||
|       // await this.checkSignal() | ||||
|       await CheckSignal(this.systemParam, this.avPlayer) | ||||
|       DifferentialAndSignal.clearMsg() | ||||
|       this.isExamStart = true | ||||
| @ -940,9 +954,7 @@ struct UserInfoPage { | ||||
|       }).catch((err: BusinessError) => { | ||||
|         dConsole.log("USER insert fail", JSON.stringify(err)) | ||||
|       }) | ||||
|       // await upDateTableByArray('USER', [this.currentUser]) | ||||
|       dConsole.log("User", JSON.stringify(this.currentUser)) | ||||
|       // await sqlInsertCommonFn("USER", [this.currentUser]) | ||||
|       AppStorage.setOrCreate('statue', 4) | ||||
|       this.isBoardPrePareSetPopupShow = true; | ||||
|       this.isFirstBoardPrePareSetPopupBtnShow = true; | ||||
| @ -1147,20 +1159,6 @@ struct UserInfoPage { | ||||
|     .backgroundImage($r('app.media.bg')) | ||||
|     .backgroundImageSize({ width: '100%', height: '100%' }) | ||||
|   } | ||||
| 
 | ||||
|   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() | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										279
									
								
								entry/src/main/ets/pages/UserInfo/FaceRecognition.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										279
									
								
								entry/src/main/ets/pages/UserInfo/FaceRecognition.ets
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,279 @@ | ||||
| /** | ||||
|  * 人脸识别弹窗 | ||||
|  */ | ||||
| import common from '@ohos.app.ability.common'; | ||||
| import { faceCompare } from '../../api/userInfo'; | ||||
| import { FaceCompareTag, GlobalConfig } from '../../config'; | ||||
| import { VideoConfigData } from '../../mock'; | ||||
| import { CarInfoType, CenterCallBackMsgType, UDPParamType, VideoConfig } from '../../model'; | ||||
| import { CenterUDPBusinessInstance } from '../../utils/business/CenterUdpBusiness'; | ||||
| import { NumberToByteArray } from '../../utils/Common'; | ||||
| import FileUtils from '../../utils/FileUtils'; | ||||
| import { dConsole } from '../../utils/LogWorker'; | ||||
| import { takePhoto, takePhotoParam } from '../../utils/Video'; | ||||
| import { voiceService } from '../../utils/Voice'; | ||||
| 
 | ||||
| @CustomDialog | ||||
| export default struct FaceRecognitionDialog { | ||||
|   // 身份证号 | ||||
|   @Prop sfzh: string; | ||||
|   // 第一张图片 | ||||
|   @Prop firstImage: string; | ||||
|   // 流水号 | ||||
|   @Prop lsh: string; | ||||
|   @State videoConfig: VideoConfig = VideoConfigData | ||||
|   @State previewUri: Resource = $r('app.media.index_bg') | ||||
|   @State base64: string = '' | ||||
|   // 回调标志位 | ||||
|   @State callBackFlag: boolean = false; | ||||
|   // 车辆信息 | ||||
|   @State carInfo: CarInfoType = {}; | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
|   private controller?: CustomDialogController; | ||||
|   private videoController: VideoController = new VideoController() | ||||
|   private fileUtil!: FileUtils | ||||
|   private voiceController!: voiceService | ||||
|   // 人脸对比失败次数 | ||||
|   private times: number = 0 | ||||
|   // 采集照片定时器 | ||||
|   private interval: number = -1 | ||||
|   // 人脸对比成功 | ||||
|   FacialComparisonSuccess: () => void = () => { | ||||
|   } | ||||
|   // 人脸对比失败 | ||||
|   FacialComparisonFailure: () => void = () => { | ||||
|   } | ||||
| 
 | ||||
|   aboutToAppear(): void { | ||||
|     const fileUtil = new FileUtils(this.context) | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     this.fileUtil = fileUtil | ||||
|     this.getConfig() | ||||
|   } | ||||
| 
 | ||||
|   async getConfig() { | ||||
|     try { | ||||
|       this.voiceController = new voiceService(async (status: string, val?: string) => { | ||||
|         if (status == 'idle') { | ||||
|           if (val === 'face_check.mp3' || val === 'face_fail.mp3') { | ||||
|             if (this.times >= 3) { | ||||
|               AppStorage.setOrCreate('statue', 3); | ||||
|               this.FacialComparisonFailure() | ||||
|               this.voiceController && this.voiceController.playAudio({ | ||||
|                 type: 1, | ||||
|                 name: 'face_checking.wav', | ||||
|               }); | ||||
|               this.heartMsg(); | ||||
|             } else { | ||||
|               setTimeout(() => { | ||||
|                 this.faceCompareFn(); | ||||
|               }, 2000); | ||||
|             } | ||||
|           } else if (val === 'yzcg.wav') { | ||||
|             // 人脸对比成功 | ||||
|             AppStorage.setOrCreate('statue', 4); | ||||
|             this.FacialComparisonSuccess() | ||||
|             this.controller?.close(); | ||||
|           } else if (val === 'face_chekc_fail.wav') { | ||||
|             //   人脸对比失败 | ||||
|             this.FacialComparisonFailure() | ||||
|             this.controller?.close(); | ||||
|           } | ||||
|         } | ||||
|       }, this.context) | ||||
|       const data = await this.fileUtil.readFile(GlobalConfig.commonFileWriteAddress + '/config/config3.txt'); | ||||
|       dConsole.log('faceEnterIn,data', data) | ||||
| 
 | ||||
|       setTimeout(() => { | ||||
|         this.voiceController && this.voiceController.playAudio({ | ||||
|           type: 1, | ||||
|           name: 'face_check.mp3' | ||||
|         }) | ||||
|       }, 1000) | ||||
|       this.videoConfig = JSON.parse(data) | ||||
|       this.videoController.start() | ||||
|     } catch (e) { | ||||
|       dConsole.error(FaceCompareTag, "人脸识别弹窗获取配置失败", e) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   async faceCompareFn() { | ||||
|     this.videoConfig.pztd = this.videoConfig.rlls | ||||
|     const data: takePhotoParam = await takePhoto(this.videoConfig, this.context, 'jt/', 1,) | ||||
|     this.base64 = "data:image/jpeg;base64," + (data?.base64 || "") | ||||
|     dConsole.log(FaceCompareTag, "人脸拿到的图片", this.base64) | ||||
|     const result = await faceCompare({ | ||||
|       sfzh: this.sfzh.toString(), | ||||
|       firstImage: this.firstImage.slice(22), | ||||
|       secondImage: data?.base64 || "", | ||||
|       type: "2", | ||||
|       verifyType: "1" | ||||
|     }) | ||||
|     if (result.imageCompareRsp?.head?.resultCode == '0') { | ||||
|       this.videoController.stop() | ||||
|       this.controller.close() | ||||
|       this.FacialComparisonSuccess() | ||||
|       this.voiceController.playAudio({ | ||||
|         type: 1, | ||||
|         name: 'yzcg.wav' | ||||
|       }) | ||||
|     } else { | ||||
|       this.times++; | ||||
|       this.voiceController.playAudio({ | ||||
|         type: 1, | ||||
|         name: 'face_fail.mp3' | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   async heartMsg() { | ||||
|     let tmpList: number[] = [] | ||||
|     for (let i = 0; i < this.lsh.length; i++) { | ||||
|       if (this.lsh && this.lsh.charCodeAt(i) !== undefined) { | ||||
|         tmpList.push(NumberToByteArray(this.lsh.charCodeAt(i), 1 * 8)[0]); | ||||
|       } | ||||
|     } | ||||
|     const param: UDPParamType = { | ||||
|       id: 46, | ||||
|       list: tmpList, | ||||
|       carNo: this.carInfo.carNo || "", | ||||
|       placeId: this.carInfo.examinationRoomId || "", | ||||
|       sendCallback: () => { | ||||
|         this.callBackFlag = true | ||||
|       } | ||||
|     } | ||||
|     CenterUDPBusinessInstance.sendData(param) | ||||
|     clearInterval(this.interval) | ||||
|     this.interval = setInterval(() => { | ||||
|       if (this.callBackFlag) { | ||||
|         const param2: UDPParamType = { | ||||
|           id: 47, | ||||
|           list: tmpList, | ||||
|           carNo: this.carInfo.carNo || "", | ||||
|           placeId: this.carInfo.examinationRoomId || "", | ||||
|         } | ||||
|         CenterUDPBusinessInstance.sendData(param2) | ||||
|       } | ||||
|     }, 1000) | ||||
|     CenterUDPBusinessInstance.onMsg(this.getUdpMsg) | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   getUdpMsg = (val: CenterCallBackMsgType) => { | ||||
|     if (AppStorage.get('statue') != 3) { | ||||
|       return | ||||
|     } | ||||
|     if (val.id === 48) { | ||||
|       if (val.body[13] == 1) { | ||||
|         this.voiceController && this.voiceController.releasePlayer() | ||||
|         this.controller?.close() | ||||
|         this.FacialComparisonFailure() | ||||
|         clearInterval(this.interval) | ||||
|       } else if (val.body[13] == 1 && this.callBackFlag) { | ||||
|         AppStorage.setOrCreate('statue', 2) | ||||
|         this.voiceController && this.voiceController.playAudio({ | ||||
|           type: 1, | ||||
|           name: 'face_chekc_fail.wav' | ||||
|         }) | ||||
|         this.controller.close() | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   aboutToDisappear(): void { | ||||
|     clearInterval(this.interval) | ||||
|     CenterUDPBusinessInstance.offMsg(this.getUdpMsg) | ||||
|   } | ||||
| 
 | ||||
|   build() { | ||||
|     Column() { | ||||
|       Column() { | ||||
|         // 标题 | ||||
|         Row() { | ||||
|           Text("照片对比").fontSize(24).fontWeight(FontWeight.Bold) | ||||
|         }.height(80) | ||||
| 
 | ||||
|         //  视频图片 | ||||
|         Flex({ | ||||
|           alignItems: ItemAlign.Center, | ||||
|           justifyContent: FlexAlign.Center | ||||
|         }) { | ||||
|           // 视频 | ||||
|           Video({ | ||||
|             src: `rtsp://${this.videoConfig.userName}:${this.videoConfig.pwd}@${this.videoConfig.ip}:${this.videoConfig.port}/h264/ch${this.videoConfig.rlls}/main/av_stream`, | ||||
|             previewUri: this.previewUri, | ||||
|             currentProgressRate: PlaybackSpeed.Speed_Forward_1_00_X, | ||||
|             controller: this.videoController, | ||||
|           }) | ||||
|             .muted(true) | ||||
|             .autoPlay(true) | ||||
|             .controls(true) | ||||
|             .height("100%") | ||||
|             .width(600) | ||||
|           //   图片 | ||||
|           Row() { | ||||
|             Image(this.base64).height("100%").width("100%") | ||||
|           } | ||||
|           .height("100%") | ||||
|           .width(600) | ||||
|           .backgroundColor(Color.Black) | ||||
|           .margin({ | ||||
|             left: 20 | ||||
|           }) | ||||
|         }.width("100%").height(400) | ||||
| 
 | ||||
|         Text("正在等待拍照...").fontWeight(FontWeight.Bold).fontSize(24).margin({ | ||||
|           top: 20, | ||||
|           bottom: 20 | ||||
|         }).fontColor("#CC7E00") | ||||
|         Flex({ | ||||
|           justifyContent: FlexAlign.SpaceBetween, | ||||
|           alignItems: ItemAlign.Center | ||||
|         }) { | ||||
|           Text("若验证无响应,点击此处").fontSize(24) | ||||
|           Row() { | ||||
|             Text("重新打开").fontSize(20).fontColor("#fff") | ||||
|           } | ||||
|           .width(200) | ||||
|           .height(80) | ||||
|           .backgroundImage($r("app.media.nor")) | ||||
|           .backgroundImageSize({ | ||||
|             width: "100%", | ||||
|             height: "100%" | ||||
|           }) | ||||
|           .justifyContent(FlexAlign.Center) | ||||
|           .alignItems(VerticalAlign.Center) | ||||
|           .onClick(() => { | ||||
|             this.times = 1; | ||||
|             this.videoController.stop() | ||||
|             this.voiceController && this.voiceController.releasePlayer() | ||||
|             this.FacialComparisonFailure() | ||||
|             AppStorage.setOrCreate('statue', 2) | ||||
|             this.controller?.close(); | ||||
|           }) | ||||
|         }.backgroundColor("#CBC4B9").borderRadius({ | ||||
|           bottomLeft: 20, | ||||
|           bottomRight: 20 | ||||
|         }) | ||||
|         .padding({ | ||||
|           left: 20, | ||||
|           right: 20, | ||||
|           top: 10, | ||||
|           bottom: 10 | ||||
|         }) | ||||
|       }.backgroundColor("#E5E3DF").borderRadius(20) | ||||
| 
 | ||||
|       //   关闭按钮 | ||||
|       Row() { | ||||
|         Image($r('app.media.close')).width(80).height(80) | ||||
|       }.margin({ | ||||
|         top: 50 | ||||
|       }).onClick(() => { | ||||
|         this.FacialComparisonFailure() | ||||
|         this.videoController && this.videoController.stop(); | ||||
|         this.controller?.close(); | ||||
|         AppStorage.setOrCreate('statue', 2) | ||||
|       }) | ||||
|     }.width("80%") | ||||
|   } | ||||
| } | ||||
							
								
								
									
										12
									
								
								entry/src/main/ets/pages/UserInfo/GetReadyToBoardTheCar.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								entry/src/main/ets/pages/UserInfo/GetReadyToBoardTheCar.ets
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| /** | ||||
|  * 上车准备弹窗 | ||||
|  */ | ||||
| 
 | ||||
| @CustomDialog | ||||
| export default struct GetReadyToBoardTheCarDialog { | ||||
|   private controller?: CustomDialogController; | ||||
| 
 | ||||
|   build() { | ||||
| 
 | ||||
|   } | ||||
| } | ||||
| @ -1,9 +0,0 @@ | ||||
| // 开始考试弹窗 | ||||
| 
 | ||||
| @CustomDialog | ||||
| export default struct StartTheExamDialog { | ||||
|   private controller?: CustomDialogController; | ||||
| 
 | ||||
|   build() { | ||||
|   } | ||||
| } | ||||
| @ -559,6 +559,4 @@ export default struct DeductedPopup { | ||||
|   } | ||||
|   private confirmMark: Function = (itemno: number, serial: string) => { | ||||
|   } | ||||
|   private endLoading: Function = () => { | ||||
|   } | ||||
| } | ||||
| @ -1,18 +0,0 @@ | ||||
| @Component | ||||
| export default struct LoadingPopup { | ||||
|   constructor() { | ||||
|     super() | ||||
|   } | ||||
| 
 | ||||
|   private title:string = '' | ||||
| 
 | ||||
|   build(){ | ||||
|     Column(){ | ||||
|       Column(){ | ||||
|         Image($rawfile('judge/loading-car.gif')).width(250).margin({top:20,bottom:20}) | ||||
|         Text(this.title).fontSize(32).margin({top:15}) | ||||
|       }.width('45%').height('50%').backgroundColor('#E6E3DF').borderRadius(38).position({y:'27.5%',x:'25%'}).justifyContent(FlexAlign.Center) | ||||
| 
 | ||||
|     }.width('100%').height('100%').position({y:0}).backgroundColor('rgba(0,0,0,0.7)') | ||||
|   } | ||||
| } | ||||
| @ -1,25 +0,0 @@ | ||||
| 
 | ||||
| @Component | ||||
| export default struct EndPopup { | ||||
|   constructor() { | ||||
|     super() | ||||
|   } | ||||
| 
 | ||||
|   private title:string = '' | ||||
|   private cancelFn:(event?: ClickEvent) => void | ||||
|   private confirmFn:(event?: ClickEvent) => void | ||||
| 
 | ||||
|   build(){ | ||||
|     Column(){ | ||||
|       Column(){ | ||||
|         Text(this.title).fontSize(38).margin({bottom:20}) | ||||
|         Row(){}.height(50) | ||||
|         Row(){ | ||||
|           Text('取消').backgroundImage($rawfile('judge/end-btn.png'),ImageRepeat.NoRepeat).backgroundImageSize({width:'100%',height:'100%'}).width(250).height(100).fontSize(30).fontColor('#FFF').textAlign(TextAlign.Center).onClick(this.cancelFn) | ||||
|           Text('确定').backgroundImage($rawfile('judge/end-btn.png'),ImageRepeat.NoRepeat).backgroundImageSize({width:'100%',height:'100%'}).width(250).height(100).fontSize(30).fontColor('#FFF').textAlign(TextAlign.Center).margin({left:45}).onClick(this.confirmFn) | ||||
|         } | ||||
|       }.width('80%').height('70%').backgroundColor('#E6E3DF').borderRadius(38).position({y:'12%',x:'10%'}).justifyContent(FlexAlign.Center) | ||||
| 
 | ||||
|     }.width('100%').height('100%').position({y:0}).backgroundColor('rgba(0,0,0,0.7)') | ||||
|   } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user