Merge remote-tracking branch 'origin/api10' into api10
This commit is contained in:
		
						commit
						313998c531
					
				| @ -4,7 +4,7 @@ import TopLogo from './compontents/TopLogo'; | ||||
| import testNapi from '@ohos.hiserialsdk'; | ||||
| import { DwMapData, PassData, RealNumData, StackValueData, WarnFlagData, WarnFlagTipData } from '../mock'; | ||||
| import { BaseInfoType, RouteParamsType } from '../model/Common'; | ||||
| import { CarCheckDataType, CarConfigurationParams, CarInfoType, SpzdType } from '../model'; | ||||
| import { CarCheckDataType, CarConfigurationParams, CarInfoType } from '../model'; | ||||
| import { BusinessError } from '@ohos.base'; | ||||
| import { voiceService } from '../utils/Voice'; | ||||
| import dayTs from '../utils/Date'; | ||||
| @ -144,7 +144,7 @@ struct Index { | ||||
|     const param: CarConfigurationParams = { | ||||
|       body: { | ||||
|         "carIdString": this.carInfo.carId || "", //考车ID | ||||
|         "deviceNo": baseInfo.deviceNo || "" | ||||
|         "deviceNo": baseInfo?.deviceNo || "" | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
| @ -221,8 +221,7 @@ struct Index { | ||||
|         } | ||||
|         return | ||||
|       } | ||||
| 
 | ||||
|       if (this.warnFlagTip.get(that.index).length > 1) { | ||||
|       if ((this.warnFlagTip.get(that.index) || []).length > 1) { | ||||
|         if (that.stachValue[that.index] != that.signArr[that.realNum[that.index]]) { | ||||
|           that.warnFlag[that.index] = '2' | ||||
|         } | ||||
| @ -327,9 +326,10 @@ struct Index { | ||||
|         // if (!flag) { | ||||
|         //   that.warnFlag[index] = '2'; | ||||
|         // } | ||||
|         const spzd: SpzdType = AppStorage.get('spzd')!; | ||||
|         const hasTruthyValue = Object.values(spzd).some((value: string) => value); | ||||
|         that.warnFlag[index] = hasTruthyValue ? '1' : '2'; | ||||
|         // TODO 视频遮挡 | ||||
|         // const spzd: SpzdType = AppStorage.get('spzd')!; | ||||
|         // const hasTruthyValue = Object.values(spzd).some((value: string) => value); | ||||
|         // that.warnFlag[index] = hasTruthyValue ? '1' : '2'; | ||||
|       } else { | ||||
|         that.warnFlag[index] = '2' | ||||
|       } | ||||
| @ -346,16 +346,16 @@ struct Index { | ||||
|     this.passArray[this.index] = true | ||||
|     this.passArray = JSON.parse(JSON.stringify(this.passArray)) | ||||
|     this.subFlag = true | ||||
|     let name: string = this.warnFlagTip.get(this.index)[0] | ||||
|     if (this.warnFlagTip.get(this.index).length == 1) { | ||||
|       this.vocObj.playAudio({ | ||||
|     let name: string = this.warnFlagTip.get(this.index)?.[0] || ''; | ||||
|     if (this.warnFlagTip.get(this.index)?.length == 1) { | ||||
|       this.vocObj!.playAudio({ | ||||
|         type: 1, | ||||
|         name, | ||||
|       }) | ||||
|     } else if (this.warnFlagTip.get(this.index).length == 2) { | ||||
|     } else if (this.warnFlagTip.get(this.index)?.length == 2) { | ||||
|       if (this.signArr[this.realNum[this.index]] && this.signArr[this.realNum[this.index]] != '0') { | ||||
|         name = this.warnFlagTip.get(this.index)[1] | ||||
|         this.vocObj.playAudio({ | ||||
|         name = this.warnFlagTip.get(this.index)?.[1] || ''; | ||||
|         this.vocObj!.playAudio({ | ||||
|           type: 1, | ||||
|           name, | ||||
|         }) | ||||
|  | ||||
| @ -94,7 +94,7 @@ struct Index { | ||||
|                     if (this.limit) { | ||||
|                       return | ||||
|                     } | ||||
|                     const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo') | ||||
|                     const carInfo: CarInfoType = AppStorage.get<CarInfoType>('carInfo')! | ||||
|                     let password: string = CryptoJS.MD5(this.inputTextArr[1]).toString(); | ||||
|                     const param: UserLoginType = { | ||||
|                       carId: carInfo.carId as string, | ||||
|  | ||||
| @ -44,7 +44,6 @@ struct Index { | ||||
|   @State fd: number = -1; | ||||
|   @State carInfo: CarInfoType = {}; | ||||
|   @State num: number = 0; | ||||
|   fileHelper: FileHelper = null; | ||||
|   errorDialog: CustomDialogController = new CustomDialogController({ | ||||
|     builder: errorMsgDialog({ | ||||
|       title: AppStorage.get('title'), | ||||
| @ -58,14 +57,15 @@ struct Index { | ||||
|     alignment: DialogAlignment.Center, | ||||
|   }, | ||||
|   ) | ||||
|   private fileHelper!: FileHelper | ||||
|   private interval = -1; | ||||
|   private avPlayer: VoiceAnnounce | ||||
|   private avPlayer!: VoiceAnnounce | ||||
|   private timeInfo: TimeSynchronizationRspBody | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
| 
 | ||||
|   async aboutToAppear() { | ||||
|     this.avPlayer = new VoiceAnnounce(); | ||||
|     this.ratio = AppStorage.get<number>('ratio') | ||||
|     this.avPlayer = new VoiceAnnounce(this.context); | ||||
|     this.ratio = AppStorage.get<number>('ratio') || 0 | ||||
|     this.initParamFlag = false | ||||
|     this.delLoading = false | ||||
|     this.dialogVisible = false | ||||
| @ -88,8 +88,8 @@ struct Index { | ||||
|   } | ||||
| 
 | ||||
|   async onPageShow(): Promise<void> { | ||||
|     this.singlePlay = AppStorage.get<boolean>('singlePlay') | ||||
|     this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo') | ||||
|     this.singlePlay = AppStorage.get<boolean>('singlePlay') || false | ||||
|     this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo')! | ||||
| 
 | ||||
|     UseAuth(this.context).then(() => { | ||||
|       this.initParams() | ||||
| @ -153,7 +153,7 @@ struct Index { | ||||
|             if (sys.v_no === '854') { | ||||
|               AppStorage.setOrCreate('param854Str', sys.v_value) | ||||
|             } | ||||
|             if (sys.v_no === '824' && decodeURIComponent(sys.v_value) == '0') { | ||||
|             if (sys.v_no === '824' && decodeURIComponent(sys.v_value || '') == '0') { | ||||
|               router.pushUrl({ | ||||
|                 url: 'pages/CarCheck', | ||||
|                 params: { | ||||
| @ -199,7 +199,7 @@ struct Index { | ||||
|   } | ||||
| 
 | ||||
|   async createAlbum() { | ||||
|     this.fileHelper = new FileHelper(); | ||||
|     this.fileHelper = new FileHelper(this.context); | ||||
|     const time = GetCurrentTime() | ||||
|     const date = time.split(' ')[0] | ||||
|     this.fileHelper.createAlbum('jt') | ||||
| @ -223,10 +223,10 @@ struct Index { | ||||
|     await GetDeviceInfo(this.context) | ||||
|     await GetCarInfo() | ||||
|     // getTCP() | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo') | ||||
|     this.deviceId = this.carInfo.carNo | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     this.deviceId = this.carInfo.carNo || "" | ||||
|     await SetCurrentTime() | ||||
|     this.timeInfo = AppStorage.get<TimeSynchronizationRspBody>('timeInfo') | ||||
|     this.timeInfo = AppStorage.get<TimeSynchronizationRspBody>('timeInfo')! | ||||
|     DrivingDataStorage.init(this.context) | ||||
|     DrivingDataStorage.initializeTheDrivingDataFolder() | ||||
|     setTimeout(() => { | ||||
|  | ||||
| @ -44,11 +44,11 @@ export async function GetCarInfo() { | ||||
|   let date = new Date(); | ||||
|   let params: ObtainCarExamInfoParams = { | ||||
|     time: dayTs(date).format("YYYY-MM-DD HH:mm:ss"), | ||||
|     deviceNo: AppStorage.get<string>('deviceNo') | ||||
|     deviceNo: AppStorage.get<string>('deviceNo') || "" | ||||
|   }; | ||||
|   let res: ApiResponseType = await obtainCarExamInfo(params) | ||||
|   if (res.obtainCarExamInfoRsp.body) { | ||||
|     const carInfo: ObtainCarExamInfoRspBody = res?.obtainCarExamInfoRsp?.body | ||||
|   if (res.obtainCarExamInfoRsp && res.obtainCarExamInfoRsp.body) { | ||||
|     const carInfo: ObtainCarExamInfoRspBody = res?.obtainCarExamInfoRsp?.body! | ||||
|     carInfo.plateNo = decodeURIComponent(carInfo.plateNo) | ||||
|     AppStorage.setOrCreate('carInfo', carInfo) | ||||
|   } | ||||
| @ -82,18 +82,25 @@ export async function UseAuth(context: common.UIAbilityContext): Promise<boolean | ||||
| 
 | ||||
| //获取时间同步 | ||||
| export async function SetCurrentTime(): Promise<void> { | ||||
|   let deviceNo: string = AppStorage.get<string>('deviceNo'); | ||||
|   let baseInfo: BaseInfoType = AppStorage.get<BaseInfoType>('baseInfo') | ||||
|   let deviceNo: string = AppStorage.get<string>('deviceNo')!; | ||||
|   let baseInfo: BaseInfoType = AppStorage.get<BaseInfoType>('baseInfo')! | ||||
|   let params: TimeSynchronizationParams = { | ||||
|     time: dayTs(new Date()).format("YYYY-MM-DD HH:mm:ss"), | ||||
|     deviceNo, | ||||
|     version: baseInfo.version, | ||||
|     judgeVersion: baseInfo.judgeVersion | ||||
|     version: baseInfo.version!, | ||||
|     judgeVersion: baseInfo.judgeVersion! | ||||
|   } | ||||
|   let res: ApiResponseType = await timeSynchronization(params); | ||||
|   AppStorage.setOrCreate<TimeSynchronizationRspBody>('timeInfo', res.timeSynchronizationRsp.body) | ||||
|   let currentTime = res.timeSynchronizationRsp.head.time; | ||||
|   let times = new Date(currentTime).getTime(); | ||||
|   if (res.timeSynchronizationRsp?.body) { | ||||
|     AppStorage.setOrCreate<TimeSynchronizationRspBody>('timeInfo', res.timeSynchronizationRsp.body); | ||||
|   } | ||||
|   let currentTime = res.timeSynchronizationRsp?.head?.time; | ||||
|   let times = 0 | ||||
|   if (currentTime) { | ||||
|     times = new Date(currentTime).getTime(); | ||||
|   } else { | ||||
|     console.error("currentTime is undefined"); | ||||
|   } | ||||
|   try { | ||||
|     await systemTime.setTime(times) | ||||
|   } catch (error) { | ||||
| @ -129,7 +136,7 @@ async function obtainSerialNumber(data: string) { | ||||
| 
 | ||||
| //设置流水号 | ||||
| export async function SetSerialNumber() { | ||||
|   const data = AppStorage.get<string>("liushuiNo"); | ||||
|   const data = AppStorage.get<string>("liushuiNo") || ""; | ||||
|   const serialNumberTime = AppStorage.get<string>("liushuiDate"); | ||||
|   obtainSerialNumber(data); | ||||
|   const date = dayTs().format('YYYY-MM-DD HH:mm:ss'); | ||||
|  | ||||
| @ -1,5 +1,4 @@ | ||||
| import router from '@ohos.router' | ||||
| import { CarCheckDataType } from '../model/CarCheck' | ||||
| import { BaseInfoType, CarInfoType } from '../model/Common' | ||||
| import TopLogo from './compontents/TopLogo' | ||||
| 
 | ||||
| @ -88,8 +87,8 @@ struct Index { | ||||
|   aboutToAppear() { | ||||
|     // this.vocObj = new voiceService(async (status, val, next) => { | ||||
|     // }); | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo') | ||||
|     this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo') | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     this.baseInfo = AppStorage.get<BaseInfoType>('baseInfo')! | ||||
|   } | ||||
| 
 | ||||
|   outClick() { | ||||
|  | ||||
| @ -22,7 +22,7 @@ struct Index { | ||||
|       '192.168.7.124', '20022', '192.168.7.170', '20122'] | ||||
|   @State @Watch('outClick') outFlag: boolean = false; | ||||
|   scroller: Scroller = new Scroller() | ||||
|   private fileUtil: FileUtils | ||||
|   private fileUtil!: FileUtils | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
| 
 | ||||
|   build() { | ||||
| @ -145,17 +145,17 @@ struct Index { | ||||
|     } else { | ||||
|       const result: EnvironmentConfigurationType = JSON.parse(data) | ||||
|       AppStorage.setOrCreate<EnvironmentConfigurationType>("EnvironmentConfiguration", result) | ||||
|       this.inputTextList1[9] = result.udplocalIp | ||||
|       this.inputTextList1[10] = result.udplocalIpPort | ||||
|       this.inputTextList1[7] = result.udpOppositeIp | ||||
|       this.inputTextList1[8] = result.udpOppositeIpPort | ||||
|       this.inputTextList1[0] = result.tcpOppositeIp | ||||
|       this.inputTextList1[1] = result.tcpOppositePort | ||||
|       this.inputTextList1[5] = result.gateway | ||||
|       this.inputTextList1[4] = result.netMask | ||||
|       this.inputTextList1[6] = result.dnsServers | ||||
|       this.inputTextList1[2] = result.centerIp | ||||
|       this.inputTextList1[3] = result.centerPort | ||||
|       this.inputTextList1[9] = result.udplocalIp ?? '' | ||||
|       this.inputTextList1[10] = result.udplocalIpPort ?? '' | ||||
|       this.inputTextList1[7] = result.udpOppositeIp ?? '' | ||||
|       this.inputTextList1[8] = result.udpOppositeIpPort ?? '' | ||||
|       this.inputTextList1[0] = result.tcpOppositeIp ?? '' | ||||
|       this.inputTextList1[1] = result.tcpOppositePort ?? '' | ||||
|       this.inputTextList1[5] = result.gateway ?? '' | ||||
|       this.inputTextList1[4] = result.netMask ?? '' | ||||
|       this.inputTextList1[6] = result.dnsServers ?? '' | ||||
|       this.inputTextList1[2] = result.centerIp ?? '' | ||||
|       this.inputTextList1[3] = result.centerPort ?? '' | ||||
|     } | ||||
| 
 | ||||
|     ethernet.getIfaceConfig("eth0").then(value => { | ||||
|  | ||||
| @ -15,7 +15,6 @@ import LoadingPopup from './compontents/judge/LoadingPopup'; | ||||
| import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; | ||||
| import { JudgeConfig } from './judgeSDK/utils/judgeConfig'; | ||||
| // import { initJudgeUdp } from '../common/utils/UdpJudge'; | ||||
| import errorMsgDialog from './compontents/errorMsgDialog'; | ||||
| import imageBtn from './compontents/imageBtn'; | ||||
| import { CryptoJS } from '@ohos/crypto-js'; | ||||
| 
 | ||||
| @ -45,6 +44,7 @@ import { GetCurrentTime, NumberToByteArray } from '../utils/Common'; | ||||
| import DB from '../utils/DbSql'; | ||||
| import { CenterUDPClientInstance } from '../utils/business/CenterUdpBusiness'; | ||||
| import { JudgeEmitterInstance } from '../utils/business/UdpEvent'; | ||||
| import errorMsgDialog from './compontents/errorMsgDialog'; | ||||
| 
 | ||||
| @Entry | ||||
| @Component | ||||
| @ -210,7 +210,7 @@ struct UserInfo { | ||||
|   ] | ||||
| 
 | ||||
|   aboutToAppear() { | ||||
|     this.avPlayer = new VoiceAnnounce(); | ||||
|     this.avPlayer = new VoiceAnnounce(this.context); | ||||
|   } | ||||
| 
 | ||||
|   async onPageShow() { | ||||
| @ -799,7 +799,7 @@ struct UserInfo { | ||||
|       const arr = [this.signNum || 0, 1] | ||||
|       let tmpList: number[] = []; | ||||
|       tmpList.push(NumberToByteArray(arr[0], 1 * 8)[0]) | ||||
|       tmpList.push(NumberToByteArray(arr[1], 1 * 8)[0]) | ||||
|       tmpList.push(NumberToByteArray(arr[1] ?? 0, 1 * 8)[0]) | ||||
| 
 | ||||
|       const param: UDPParamType = { | ||||
|         id: 43, | ||||
| @ -809,7 +809,8 @@ struct UserInfo { | ||||
|       } | ||||
|       CenterUDPClientInstance.sendData(param) | ||||
|       // globalThis.udpClient2.sendMsgExt(param, this.context) | ||||
|       if (res.examinationStuAbsentRsp.head.resultCode == '0') { | ||||
|       if (res.examinationStuAbsentRsp && res.examinationStuAbsentRsp.head && | ||||
|         res.examinationStuAbsentRsp.head.resultCode == '0') { | ||||
|         this.pageIndex = 0 | ||||
|         this.qkFlag = false | ||||
|         this.currentUser = EmptyCandidateObject | ||||
| @ -829,9 +830,9 @@ struct UserInfo { | ||||
|     // const { carId, examinationRoomId } = this.carInfo; | ||||
|     const examItems = await getExaminationItem({ | ||||
|       time: GetCurrentTime() || "", | ||||
|       carId: this.carInfo.carId, | ||||
|       carId: this.carInfo.carId || "", | ||||
|       lsh: this.currentUser.lsh || '', | ||||
|       examinationRoomId: this.carInfo.examinationRoomId | ||||
|       examinationRoomId: this.carInfo.examinationRoomId || "" | ||||
|     }); | ||||
| 
 | ||||
|     if (examItems?.getExaminationItemRsp?.body?.kssycs != 0) { | ||||
| @ -856,9 +857,9 @@ struct UserInfo { | ||||
|       //获取已考项目 | ||||
|       examItems = await getExaminationItem({ | ||||
|         time: GetCurrentTime(), | ||||
|         carId: this.carInfo.carId, | ||||
|         carId: this.carInfo.carId || "", | ||||
|         lsh: this.currentUser.lsh || '', | ||||
|         examinationRoomId: this.carInfo.examinationRoomId | ||||
|         examinationRoomId: this.carInfo.examinationRoomId || "" | ||||
|       }); | ||||
|     } | ||||
|     this.currentUser.id = '1' | ||||
| @ -1032,7 +1033,7 @@ struct UserInfo { | ||||
|       ksxl: this.currentUser.xldm, | ||||
|       zp: photoBase64, | ||||
|       kssj: dayTs(date).format("YYYY-MM-DD HH:mm:ss") || '', | ||||
|       kchp: decodeURI(this.carInfo.plateNo), | ||||
|       kchp: decodeURI(this.carInfo.plateNo || ""), | ||||
|       Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || '' | ||||
|     } | ||||
|     const param: RegulatoryInterfaceParams = { | ||||
| @ -1130,7 +1131,7 @@ struct UserInfo { | ||||
|               AppStorage.setOrCreate('lsh', item.lsh) | ||||
|               setTimeout(() => { | ||||
|                 this.currentUser = item | ||||
|                 this.currentUser.ksy2 = this.examinerLoginInfo.kgxm | ||||
|                 this.currentUser.ksy2 = this.examinerLoginInfo.kgxm || "" | ||||
| 
 | ||||
|               }, 200) | ||||
| 
 | ||||
|  | ||||
| @ -37,7 +37,7 @@ struct Index { | ||||
|     { key: '第三路' }, | ||||
|     { key: '第四路' }, | ||||
|   ] | ||||
|   private fileUtil: FileUtils | ||||
|   private fileUtil!: FileUtils | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
|   private controller1: VideoController = new VideoController() | ||||
|   private controller2: VideoController = new VideoController() | ||||
| @ -240,7 +240,7 @@ struct Index { | ||||
|               }.margin({ left: 5 * this.ratio, right: 10 * this.ratio }) | ||||
| 
 | ||||
|               Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) | ||||
|                 .select(this.param.faceFlag) | ||||
|                 .select(this.param.faceFlag || false) | ||||
|                 .width(22 * this.ratio) | ||||
|                 .height(22 * this.ratio) | ||||
|                 .onChange((value: boolean) => { | ||||
| @ -420,7 +420,7 @@ struct Index { | ||||
|                     Column() { | ||||
|                       Row() { | ||||
|                         Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) | ||||
|                           .select(this.param.videoRecord1) | ||||
|                           .select(this.param.videoRecord1 || false) | ||||
|                           .width(22 * this.ratio) | ||||
|                           .height(22 * this.ratio) | ||||
|                           .onChange((value: boolean) => { | ||||
| @ -429,7 +429,7 @@ struct Index { | ||||
|                           }) | ||||
|                         Text('一路').fontSize(16 * this.ratio).fontColor('#333333') | ||||
|                         Checkbox({ name: 'checkbox2', group: 'checkboxGroup' }) | ||||
|                           .select(this.param.videoRecord2) | ||||
|                           .select(this.param.videoRecord2 || false) | ||||
|                           .width(22 * this.ratio) | ||||
|                           .height(22 * this.ratio) | ||||
|                           .onChange((value: boolean) => { | ||||
| @ -441,7 +441,7 @@ struct Index { | ||||
| 
 | ||||
|                       Row() { | ||||
|                         Checkbox({ name: 'checkbox3', group: 'checkboxGroup' }) | ||||
|                           .select(this.param.videoRecord3) | ||||
|                           .select(this.param.videoRecord3 || false) | ||||
|                           .width(22 * this.ratio) | ||||
|                           .height(22 * this.ratio) | ||||
|                           .onChange((value: boolean) => { | ||||
| @ -450,7 +450,7 @@ struct Index { | ||||
|                           }) | ||||
|                         Text('三路').fontSize(16 * this.ratio).fontColor('#333333') | ||||
|                         Checkbox({ name: 'checkbox4', group: 'checkboxGroup' }) | ||||
|                           .select(this.param.videoRecord4) | ||||
|                           .select(this.param.videoRecord4 || false) | ||||
|                           .width(22 * this.ratio) | ||||
|                           .height(22 * this.ratio) | ||||
|                           .onChange((value: boolean) => { | ||||
| @ -469,7 +469,7 @@ struct Index { | ||||
|                     Column() { | ||||
|                       Row() { | ||||
|                         Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) | ||||
|                           .select(this.param.spzd1) | ||||
|                           .select(this.param.spzd1 || false) | ||||
|                           .width(22 * this.ratio) | ||||
|                           .height(22 * this.ratio) | ||||
|                           .onChange((value: boolean) => { | ||||
| @ -477,7 +477,7 @@ struct Index { | ||||
|                           }) | ||||
|                         Text('一路').fontSize(16 * this.ratio).fontColor('#333333') | ||||
|                         Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) | ||||
|                           .select(this.param.spzd2) | ||||
|                           .select(this.param.spzd2 || false) | ||||
|                           .width(22 * this.ratio) | ||||
|                           .height(22 * this.ratio) | ||||
|                           .onChange((value: boolean) => { | ||||
| @ -488,7 +488,7 @@ struct Index { | ||||
| 
 | ||||
|                       Row() { | ||||
|                         Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) | ||||
|                           .select(this.param.spzd3) | ||||
|                           .select(this.param.spzd3 || false) | ||||
|                           .width(22 * this.ratio) | ||||
|                           .height(22 * this.ratio) | ||||
|                           .onChange((value: boolean) => { | ||||
| @ -496,7 +496,7 @@ struct Index { | ||||
|                           }) | ||||
|                         Text('三路').fontSize(16 * this.ratio).fontColor('#333333') | ||||
|                         Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) | ||||
|                           .select(this.param.spzd4) | ||||
|                           .select(this.param.spzd4 || false) | ||||
|                           .width(22 * this.ratio) | ||||
|                           .height(22 * this.ratio) | ||||
|                           .onChange((value: boolean) => { | ||||
| @ -513,7 +513,7 @@ struct Index { | ||||
| 
 | ||||
|             Row() { | ||||
|               Checkbox({ name: 'checkbox1', group: 'checkboxGroup' }) | ||||
|                 .select(this.param.shuiying) | ||||
|                 .select(this.param.shuiying || false) | ||||
|                 .width(22 * this.ratio) | ||||
|                 .height(22 * this.ratio) | ||||
|                 .onChange((value: boolean) => { | ||||
| @ -591,7 +591,7 @@ struct Index { | ||||
| 
 | ||||
|   aboutToAppear() { | ||||
|     // this.ratio = globalThis.ratio | ||||
|     this.ratio = AppStorage.get<number>('ratio') | ||||
|     this.ratio = AppStorage.get<number>('ratio') || 0 | ||||
|     this.openFlag = true | ||||
|     const fileUtil = new FileUtils(this.context) | ||||
|     this.fileUtil = fileUtil | ||||
|  | ||||
| @ -41,9 +41,9 @@ export default struct FaceCompare { | ||||
|   @State carInfo: CarInfoType = {}; | ||||
|   @State param: VideoConfig = VideoConfigData | ||||
|   private times = 1; //人脸比对失败次数, 超过3次将不会自动比对,需要点击重新打开重新触发 | ||||
|   private vocObj: voiceService = null; | ||||
|   private vocObj!: voiceService; | ||||
|   private controller: VideoController = new VideoController() | ||||
|   private fileUtil: FileUtils | ||||
|   private fileUtil!: FileUtils | ||||
|   private interval: number = -1 | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
| 
 | ||||
| @ -175,7 +175,7 @@ export default struct FaceCompare { | ||||
| 
 | ||||
|   async aboutToAppear() { | ||||
|     const fileUtil = new FileUtils(this.context) | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo') | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     this.fileUtil = fileUtil | ||||
|     this.getVideoConfig() | ||||
|   } | ||||
| @ -195,13 +195,13 @@ export default struct FaceCompare { | ||||
|     faceCompare({ | ||||
|       sfzh: this.sfzh, | ||||
|       firstImage: this.firstImage.substr(22), | ||||
|       secondImage: data.base64, | ||||
|       secondImage: data.base64 || "", | ||||
|       type: "2", | ||||
|       verifyType: "1" | ||||
|     }) | ||||
|       .then(res => { | ||||
|         console.log('mmmmm8', JSON.stringify(res)) | ||||
|         if (res.imageCompareRsp.head.resultCode == '0') { | ||||
|         if (res.imageCompareRsp?.head?.resultCode == '0') { | ||||
|           this.controller.stop() | ||||
|           this.showFaceCompare = !this.showFaceCompare | ||||
|           this.showFaceCompareFlag = !this.showFaceCompareFlag | ||||
| @ -231,7 +231,9 @@ export default struct FaceCompare { | ||||
|     const str = this.lsh | ||||
|     console.log('this.lshbitbit', this.lsh, this.carInfo.carNo, this.carInfo.examinationRoomId) | ||||
|     for (let i = 0; i < str.length; i++) { | ||||
|       tmpList.push(NumberToByteArray(str.charCodeAt(i), 1 * 8)[0]) | ||||
|       if (str && str.charCodeAt(i) !== undefined) { | ||||
|         tmpList.push(NumberToByteArray(str.charCodeAt(i), 1 * 8)[0]); | ||||
|       } | ||||
|     } | ||||
|     const param: UDPParamType = { | ||||
|       id: 46, | ||||
| @ -282,34 +284,33 @@ export default struct FaceCompare { | ||||
| 
 | ||||
|   async getVideoConfig() { | ||||
|     console.log('faceEnterIn') | ||||
|     this.vocObj = new voiceService(async (status: string, val: string) => { | ||||
|     this.vocObj = new voiceService(async (status: string, val?: string) => { | ||||
|       if (status == 'idle') { | ||||
|         if (val == 'face_check.mp3' || val == 'face_fail.mp3') { | ||||
|         if (val === 'face_check.mp3' || val === 'face_fail.mp3') { | ||||
|           if (this.times >= 3) { | ||||
|             AppStorage.setOrCreate('statue', 3) | ||||
|             AppStorage.setOrCreate('statue', 3); | ||||
|             this.faceCompareSucess = -1; | ||||
|             this.vocObj && this.vocObj.playAudio({ | ||||
|               type: 1, | ||||
|               name: 'face_checking.wav' | ||||
|             }) | ||||
|             this.heartMsg() | ||||
|               name: 'face_checking.wav', | ||||
|             }); | ||||
|             this.heartMsg(); | ||||
|           } else { | ||||
|             setTimeout(() => { | ||||
|               this.faceComparFn() | ||||
|             }, 2000) | ||||
|               this.faceComparFn(); | ||||
|             }, 2000); | ||||
|           } | ||||
|         } else if (val == 'yzcg.wav') { | ||||
|           this.showFaceCompare = !this.showFaceCompare | ||||
|           this.showFaceCompareFlag = !this.showFaceCompareFlag | ||||
|           AppStorage.setOrCreate('statue', 4) | ||||
|         } else if (val === 'yzcg.wav') { | ||||
|           this.showFaceCompare = !this.showFaceCompare; | ||||
|           this.showFaceCompareFlag = !this.showFaceCompareFlag; | ||||
|           AppStorage.setOrCreate('statue', 4); | ||||
|           this.faceCompareSucess = 1; | ||||
|           this.vocObj && this.vocObj.releasePlayer() | ||||
| 
 | ||||
|         } else if (val == 'face_chekc_fail.wav') { | ||||
|           this.vocObj && this.vocObj.releasePlayer() | ||||
|           this.faceCompareSucess = -1 | ||||
|           this.showFaceCompare = !this.showFaceCompare | ||||
|           this.showFaceCompareFlag = !this.showFaceCompareFlag | ||||
|           this.vocObj && this.vocObj.releasePlayer(); | ||||
|         } else if (val === 'face_chekc_fail.wav') { | ||||
|           this.vocObj && this.vocObj.releasePlayer(); | ||||
|           this.faceCompareSucess = -1; | ||||
|           this.showFaceCompare = !this.showFaceCompare; | ||||
|           this.showFaceCompareFlag = !this.showFaceCompareFlag; | ||||
|         } | ||||
|       } | ||||
|     }, this.context); | ||||
|  | ||||
| @ -1,156 +1,173 @@ | ||||
| import router from '@ohos.router'; | ||||
| // import router from '@ohos.router'; | ||||
| 
 | ||||
| @CustomDialog | ||||
| export default struct errorMsgDialog { | ||||
|   dialogRatio: number = 0.8 | ||||
|   title?: string | ||||
|   type?: string | ||||
|   @State angle: number = 0 | ||||
|   private controller?: CustomDialogController | ||||
|   cancel: () => void = () => { | ||||
|   } | ||||
|   confirm: () => void = () => { | ||||
|   } | ||||
|   dialogRatio: number = 0.8 | ||||
|   title?: string | ||||
|   type: string //1 tip 2loading 3Dialog | ||||
|   @State angle: number = 0 | ||||
| 
 | ||||
|   @Styles | ||||
|   commStyle(){ | ||||
|     .width(220 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
|     .height(69 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
|     .backgroundImage($r('app.media.button_nor')) | ||||
|     .backgroundImageSize({ width: '100%', height: '100%' }) | ||||
|     // .margin({ bottom: 12 * this.ratio }) | ||||
|   } | ||||
| 
 | ||||
|   build() { | ||||
|     Column() { | ||||
|       if (this.title) { | ||||
|         Text(this.title) | ||||
|           .fontSize(30 * this.dialogRatio) | ||||
|           .margin(120 * this.dialogRatio) | ||||
|       } | ||||
|       if (this.type == '2') { | ||||
|         Image($r('app.media.open_loading')) | ||||
|           .width(200) | ||||
|           .rotate({ angle: this.angle }) | ||||
|           .height(200) | ||||
|           .animation({ | ||||
|             duration: 5000, // 动画时长 | ||||
|             curve: Curve.EaseOut, // 动画曲线 | ||||
|             delay: 500, // 动画延迟 | ||||
|             iterations: -1, // 播放次数 | ||||
|             playMode: PlayMode.Normal, // 动画模式 | ||||
|           }) | ||||
|           .margin(50) | ||||
|       } | ||||
|       if (this.type == '3') { | ||||
|         Row() { | ||||
|           Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | ||||
|             Text('  取   消  ') | ||||
|               .fontSize(24 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
|               .fontColor('#fff') | ||||
|               .width(60 * globalThis.ratio * this.dialogRatio) | ||||
|           } | ||||
|           .commStyle() | ||||
|           .onClick(() => { | ||||
|             if (this.controller != undefined) { | ||||
|               const errorCode = AppStorage.Get('errorMsg'); | ||||
|               // const errorCodeFlage=AppStorage.Get('errorCodeFlage'); | ||||
|               // console.log('errorCode',errorCode,errorCodeFlage) | ||||
|               if (errorCode == 0) { | ||||
|                 router.replaceUrl({ | ||||
|                   url: 'pages/Index', | ||||
|                 }, router.RouterMode.Single); | ||||
|                 router.clear(); | ||||
| 
 | ||||
|               } | ||||
|               this.cancel() | ||||
|               this.controller.close() | ||||
|             } | ||||
|           }).margin({ right: 10 * globalThis.ratio * this.dialogRatio }) | ||||
| 
 | ||||
|           Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | ||||
|             Text('  确   定  ') | ||||
|               .fontSize(24 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
|               .fontColor('#fff') | ||||
|               .width(60 * globalThis.ratio * this.dialogRatio) | ||||
|           } | ||||
|           .commStyle() | ||||
|           .onClick(() => { | ||||
|             const errorCode = AppStorage.Get('errorCode'); | ||||
|             const errorCodeFlage = AppStorage.Get('errorCodeFlage'); | ||||
|             console.log('errorCode', errorCode, errorCodeFlage) | ||||
|             if (errorCode == 0 && errorCodeFlage) { | ||||
|               router.replaceUrl({ | ||||
|                 url: 'pages/Index', | ||||
|               }, router.RouterMode.Single); | ||||
|               router.clear(); | ||||
| 
 | ||||
|             } | ||||
|             console.log('errorCode', errorCode, errorCodeFlage) | ||||
| 
 | ||||
|             if (this.controller != undefined) { | ||||
|               this.confirm() | ||||
|               this.controller.close() | ||||
|             } | ||||
|           } | ||||
| 
 | ||||
|           ) | ||||
|         } | ||||
| 
 | ||||
|         .padding({ bottom: 20 }) | ||||
|       } | ||||
|       if (this.type == '4') { | ||||
|         Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | ||||
|           Text('  确   定  ') | ||||
|             .fontSize(24 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
|             .fontColor('#fff') | ||||
|             .width(60 * globalThis.ratio * this.dialogRatio) | ||||
|         } | ||||
|         .commStyle() | ||||
|         .onClick(() => { | ||||
|           const errorCode = AppStorage.Get('errorCode'); | ||||
|           const errorCodeFlage = AppStorage.Get('errorCodeFlage'); | ||||
|           console.log('errorCode', errorCode, errorCodeFlage) | ||||
|           if (errorCode == 0 && errorCodeFlage) { | ||||
|             router.replaceUrl({ | ||||
|               url: 'pages/Index', | ||||
|             }, router.RouterMode.Single); | ||||
|             router.clear(); | ||||
| 
 | ||||
|           } | ||||
|           console.log('errorCode', errorCode, errorCodeFlage) | ||||
| 
 | ||||
|           if (this.controller != undefined) { | ||||
|             this.confirm() | ||||
|             this.controller.close() | ||||
|           } | ||||
|         } | ||||
|         ) | ||||
|       } | ||||
|     } | ||||
|     .backgroundColor('#E6E3DF') | ||||
|     .borderRadius(19 * globalThis.ratio) | ||||
|     .constraintSize({ minWidth: 520 }) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|   aboutToAppear() { | ||||
|     AppStorage.SetOrCreate('errorMsg', 0); | ||||
|     setTimeout(() => { | ||||
|       console.log('this.type', this.type, this.angle) | ||||
|       if (this.type == '2') { | ||||
|         this.angle = 360 | ||||
|       } | ||||
|     }, 1000) | ||||
|     if (this.type == '1') { | ||||
|       setTimeout(() => { | ||||
|         this.controller.close() | ||||
|       }, 2000) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   aboutToDisappear() { | ||||
|     this.title = '' | ||||
|     this.angle = 0 | ||||
|     AppStorage.SetOrCreate('errorCodeFlage', false); | ||||
|   } | ||||
| } | ||||
| // | ||||
| // @CustomDialog | ||||
| // export default struct errorMsgDialog { | ||||
| //   private controller?: CustomDialogController | ||||
| //   cancel: () => void = () => { | ||||
| //   } | ||||
| //   confirm: () => void = () => { | ||||
| //   } | ||||
| //   dialogRatio: number = 0.8 | ||||
| //   title?: string | ||||
| //   type: string //1 tip 2loading 3Dialog | ||||
| //   @State angle: number = 0 | ||||
| // | ||||
| //   @Styles | ||||
| //   commStyle(){ | ||||
| //     .width(220 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
| //     .height(69 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
| //     .backgroundImage($r('app.media.button_nor')) | ||||
| //     .backgroundImageSize({ width: '100%', height: '100%' }) | ||||
| //     // .margin({ bottom: 12 * this.ratio }) | ||||
| //   } | ||||
| // | ||||
| //   build() { | ||||
| //     Column() { | ||||
| //       if (this.title) { | ||||
| //         Text(this.title) | ||||
| //           .fontSize(30 * this.dialogRatio) | ||||
| //           .margin(120 * this.dialogRatio) | ||||
| //       } | ||||
| //       if (this.type == '2') { | ||||
| //         Image($r('app.media.open_loading')) | ||||
| //           .width(200) | ||||
| //           .rotate({ angle: this.angle }) | ||||
| //           .height(200) | ||||
| //           .animation({ | ||||
| //             duration: 5000, // 动画时长 | ||||
| //             curve: Curve.EaseOut, // 动画曲线 | ||||
| //             delay: 500, // 动画延迟 | ||||
| //             iterations: -1, // 播放次数 | ||||
| //             playMode: PlayMode.Normal, // 动画模式 | ||||
| //           }) | ||||
| //           .margin(50) | ||||
| //       } | ||||
| //       if (this.type == '3') { | ||||
| //         Row() { | ||||
| //           Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | ||||
| //             Text('  取   消  ') | ||||
| //               .fontSize(24 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
| //               .fontColor('#fff') | ||||
| //               .width(60 * globalThis.ratio * this.dialogRatio) | ||||
| //           } | ||||
| //           .commStyle() | ||||
| //           .onClick(() => { | ||||
| //             if (this.controller != undefined) { | ||||
| //               const errorCode = AppStorage.Get('errorMsg'); | ||||
| //               // const errorCodeFlage=AppStorage.Get('errorCodeFlage'); | ||||
| //               // console.log('errorCode',errorCode,errorCodeFlage) | ||||
| //               if (errorCode == 0) { | ||||
| //                 router.replaceUrl({ | ||||
| //                   url: 'pages/Index', | ||||
| //                 }, router.RouterMode.Single); | ||||
| //                 router.clear(); | ||||
| // | ||||
| //               } | ||||
| //               this.cancel() | ||||
| //               this.controller.close() | ||||
| //             } | ||||
| //           }).margin({ right: 10 * globalThis.ratio * this.dialogRatio }) | ||||
| // | ||||
| //           Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | ||||
| //             Text('  确   定  ') | ||||
| //               .fontSize(24 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
| //               .fontColor('#fff') | ||||
| //               .width(60 * globalThis.ratio * this.dialogRatio) | ||||
| //           } | ||||
| //           .commStyle() | ||||
| //           .onClick(() => { | ||||
| //             const errorCode = AppStorage.Get('errorCode'); | ||||
| //             const errorCodeFlage = AppStorage.Get('errorCodeFlage'); | ||||
| //             console.log('errorCode', errorCode, errorCodeFlage) | ||||
| //             if (errorCode == 0 && errorCodeFlage) { | ||||
| //               router.replaceUrl({ | ||||
| //                 url: 'pages/Index', | ||||
| //               }, router.RouterMode.Single); | ||||
| //               router.clear(); | ||||
| // | ||||
| //             } | ||||
| //             console.log('errorCode', errorCode, errorCodeFlage) | ||||
| // | ||||
| //             if (this.controller != undefined) { | ||||
| //               this.confirm() | ||||
| //               this.controller.close() | ||||
| //             } | ||||
| //           } | ||||
| // | ||||
| //           ) | ||||
| //         } | ||||
| // | ||||
| //         .padding({ bottom: 20 }) | ||||
| //       } | ||||
| //       if (this.type == '4') { | ||||
| //         Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { | ||||
| //           Text('  确   定  ') | ||||
| //             .fontSize(24 * globalThis.ratio * this.dialogRatio * 0.6) | ||||
| //             .fontColor('#fff') | ||||
| //             .width(60 * globalThis.ratio * this.dialogRatio) | ||||
| //         } | ||||
| //         .commStyle() | ||||
| //         .onClick(() => { | ||||
| //           const errorCode = AppStorage.Get('errorCode'); | ||||
| //           const errorCodeFlage = AppStorage.Get('errorCodeFlage'); | ||||
| //           console.log('errorCode', errorCode, errorCodeFlage) | ||||
| //           if (errorCode == 0 && errorCodeFlage) { | ||||
| //             router.replaceUrl({ | ||||
| //               url: 'pages/Index', | ||||
| //             }, router.RouterMode.Single); | ||||
| //             router.clear(); | ||||
| // | ||||
| //           } | ||||
| //           console.log('errorCode', errorCode, errorCodeFlage) | ||||
| // | ||||
| //           if (this.controller != undefined) { | ||||
| //             this.confirm() | ||||
| //             this.controller.close() | ||||
| //           } | ||||
| //         } | ||||
| //         ) | ||||
| //       } | ||||
| //     } | ||||
| //     .backgroundColor('#E6E3DF') | ||||
| //     .borderRadius(19 * globalThis.ratio) | ||||
| //     .constraintSize({ minWidth: 520 }) | ||||
| //   } | ||||
| // | ||||
| //   aboutToAppear() { | ||||
| //     AppStorage.SetOrCreate('errorMsg', 0); | ||||
| //     setTimeout(() => { | ||||
| //       console.log('this.type', this.type, this.angle) | ||||
| //       if (this.type == '2') { | ||||
| //         this.angle = 360 | ||||
| //       } | ||||
| //     }, 1000) | ||||
| //     if (this.type == '1') { | ||||
| //       setTimeout(() => { | ||||
| //         this.controller.close() | ||||
| //       }, 2000) | ||||
| //     } | ||||
| //   } | ||||
| // | ||||
| //   aboutToDisappear() { | ||||
| //     this.title = '' | ||||
| //     this.angle = 0 | ||||
| //     AppStorage.SetOrCreate('errorCodeFlage', false); | ||||
| //   } | ||||
| // } | ||||
| @ -83,7 +83,7 @@ export default struct DeductedPopup { | ||||
|   async aboutToAppear() { | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo') | ||||
|     this.singlePlay = AppStorage.get<boolean>('singlePlay') | ||||
|     this.avPlayer = new VoiceAnnounce(); | ||||
|     this.avPlayer = new VoiceAnnounce(this.context); | ||||
|     this.judgeTask = new JudgeTask(); | ||||
|     const mediaTest = new FilePhoto(this.context); | ||||
|     this.filePhoto = mediaTest | ||||
|  | ||||
| @ -1,198 +1,204 @@ | ||||
| import apiJudgeSdk from 'libJudgeSdk.so'; | ||||
| import Judge from '../../judgeSDK/utils/judgeReal'; | ||||
| import { MarkRule, Project, ProjectObj } from '../../judgeSDK/api/judgeSDK.d'; | ||||
| import common from '@ohos.app.ability.common'; | ||||
| import { | ||||
|   examJudgeMapSetScaling | ||||
| } from '../../judgeSDK/api' | ||||
| 
 | ||||
| interface RoadDataType { | ||||
|   name: string, | ||||
|   key: string | string[] | ||||
| } | ||||
| 
 | ||||
| // import apiJudgeSdk from 'libJudgeSdk.so'; | ||||
| // import Judge from '../../judgeSDK/utils/judgeReal'; | ||||
| // import { MarkRule, Project, ProjectObj } from '../../judgeSDK/api/judgeSDK.d'; | ||||
| // import common from '@ohos.app.ability.common'; | ||||
| // import { | ||||
| //   examJudgeMapSetScaling | ||||
| // } from '../../judgeSDK/api' | ||||
| // | ||||
| // interface RoadDataType { | ||||
| //   name: string, | ||||
| //   key: string | string[] | ||||
| // } | ||||
| @Component | ||||
| export default struct RealTime { | ||||
|   @State message: string = '开始绘制' | ||||
|   // 控制XComponent组件的创建和销毁 | ||||
|   @State draw: boolean = false | ||||
|   //监管接口序列号 | ||||
|   @State serialNumber: number = 0 | ||||
|   //模拟考试项目 | ||||
|   @State projects: Project[] = [] | ||||
|   @State projectsObj: ProjectObj = {} | ||||
|   @State markRuleListObj: MarkRule = {} | ||||
|   @State scaleNum: number = 100 | ||||
|   @State gpsActive: number = 1 | ||||
|   private widthNumber: string | number | Resource = 0 | ||||
|   private heightNumber: string | number | Resource = 0 | ||||
|   private context = getContext(this) as common.UIAbilityContext; | ||||
|   @State ratio: number = 1 | ||||
|   @State lane: Object = {} | ||||
|   @State timer:number = 0 | ||||
| 
 | ||||
|   constructor() { | ||||
|     super() | ||||
|   } | ||||
| 
 | ||||
|   // xcomponentController: XComponentController = new XComponentController() | ||||
| 
 | ||||
|   build() { | ||||
|     Row() { | ||||
|       Column() { | ||||
|         Row() { | ||||
|           Text('车道信息').fontColor(this.gpsActive == 0 ? '#2D3C5A' : '#fff').fontSize(20) | ||||
|         } | ||||
|         .width('100%') | ||||
|         .height(37) | ||||
|         .backgroundColor(this.gpsActive == 0 ? '#fff' : '#1A1A1A') | ||||
|         .margin({ top: 10 * this.ratio, right: 10 }) | ||||
|         .justifyContent(FlexAlign.Center) | ||||
| 
 | ||||
|         Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start }) { | ||||
|           ForEach(this.RoadData, (item) => { | ||||
|             Column() { | ||||
|               Text(`${item.name}:${this.getValues(item)}`) | ||||
|                 .fontSize(20) | ||||
|                 .lineHeight(30) | ||||
|                 .fontColor('#fff') | ||||
|             }.height(30).justifyContent(FlexAlign.Start).width('100%') | ||||
|           }) | ||||
|         }.margin({top:5}) | ||||
| 
 | ||||
|       }.width(168 * 1.5) | ||||
|       .height(this.heightNumber) | ||||
|       .backgroundColor('#282828') | ||||
|       .margin({ top: 6 * this.ratio, }) | ||||
| 
 | ||||
|       Column() { | ||||
|         if (this.draw) { | ||||
|           XComponent({ | ||||
|             id: 'duolun_plugin_id_draw', //显示轨迹窗口id名称,注意这个ID要和C++侧一致,不能变 | ||||
|             type: 'surface', | ||||
|             libraryname: 'JudgeSdk' | ||||
|             // libraryname: 'judgesdk' | ||||
|           }) | ||||
|             .width(this.widthNumber) | ||||
|             .height(this.heightNumber) | ||||
|             .onLoad(() => { | ||||
|               apiJudgeSdk.examJudgeMapSetDrawing(true); //停止绘制地图轨迹,false:表示结束绘制 | ||||
|             }) | ||||
|             .onDestroy(() => { | ||||
|               apiJudgeSdk.examJudgeMapSetDrawing(false); //停止绘制地图轨迹,false:表示结束绘制 | ||||
|               this.draw = false; | ||||
|             }) | ||||
|         } else { | ||||
|           Column() { | ||||
|           } | ||||
|           .width(this.widthNumber) | ||||
|           .height(this.heightNumber) | ||||
|         } | ||||
|       } | ||||
|       .width('100%') | ||||
|       .backgroundColor('#fff') | ||||
| 
 | ||||
|       Row(){ | ||||
|         Image($rawfile('judge/big.png')).width(60).onClick(()=>{ | ||||
|           this.scaleFn( -this.getScaleNum() ) | ||||
|         }) | ||||
|         Image($rawfile('judge/small.png')).width(60).onClick(()=>{ | ||||
|           this.scaleFn( this.getScaleNum() ) | ||||
|         }).margin({left:20}) | ||||
|       }.position({x:'32%',y:60}) | ||||
|     } | ||||
|     .height('100%') | ||||
|   } | ||||
| 
 | ||||
|   async aboutToDisappear() { | ||||
|     clearInterval(this.timer) | ||||
|   } | ||||
|   async aboutToAppear() { | ||||
|     const judge = new Judge(this) | ||||
|     let timer = setInterval(()=>{ | ||||
|       this.lane = AppStorage.get('laneData'); | ||||
|     },1000) | ||||
|     this.timer = timer | ||||
|   } | ||||
| 
 | ||||
|   getScaleNum = ()=>{ | ||||
|     const scaleNum = this.scaleNum; | ||||
|     if(scaleNum < 200){ | ||||
|       return 10 | ||||
|     } | ||||
|     if(scaleNum >= 200 && scaleNum < 400){ | ||||
|       return 30 | ||||
|     } | ||||
| 
 | ||||
|     if(scaleNum >= 400 && scaleNum < 600){ | ||||
|       return 50 | ||||
|     } | ||||
| 
 | ||||
|     if(scaleNum >= 600 && scaleNum < 800){ | ||||
|       return 70 | ||||
|     } | ||||
| 
 | ||||
|     if(scaleNum >= 800 && scaleNum < 1000){ | ||||
|       return 100 | ||||
|     } | ||||
| 
 | ||||
|     if(scaleNum >= 1000 && scaleNum < 2000){ | ||||
|       return 500 | ||||
|     } | ||||
|     if(scaleNum >= 2000 && scaleNum <= 5000){ | ||||
|       return 1000 | ||||
|     } | ||||
| 
 | ||||
|     return 1000 | ||||
|   } | ||||
| 
 | ||||
|   getValues(roadColumn) { | ||||
|     const lane = this.lane || {}; | ||||
|     let key = roadColumn.key; | ||||
|     let str = '' | ||||
|     if (Array.isArray(key)) { | ||||
|       key.forEach((k, index) => { | ||||
|         str += (lane[k] === undefined ? '' : lane[k]) + (index == key.length - 1 ? '' : '/') | ||||
|       }) | ||||
|     } else { | ||||
|       str = lane[key] === undefined ? '' : lane[key] | ||||
|     } | ||||
|     return str | ||||
|   } | ||||
| 
 | ||||
|   private RoadData: Array<RoadDataType> = [ | ||||
|     { name: '路段组号', key: 'MapRoad_Code_No' }, | ||||
|     { name: '路段编码', key: 'MapRoad_Name' }, | ||||
|     { name: '车轮压线', key: ['TouchLineType', 'TouchDir'] }, | ||||
|     { name: '车身碰线', key: ['TouchLineTypeCS', 'TouchLineDirCS'] }, | ||||
|     { name: '基准车道', key: ['BasePointInLaneNo', 'BaseLaneCount'] }, | ||||
|     { name: '前点车道', key: ['FrontPointLaneNo', 'FrontPointLaneCount'] }, | ||||
|     { name: '后车点道', key: ['BackPointLaneNo','BackPointLaneCount'] }, | ||||
|     { name: '左前/后车身距离', key: ['Body_LF_ToLeftEdge', 'Body_LB_ToLeftEdge'] }, | ||||
|     { name: '右前/后车身距离', key: ['Body_RF_ToRightEdge', 'Body_RB_ToRightEdge'] }, | ||||
|     { name: '右前/后车身边线', key: ['Body_RF_ToBaseLine','Body_RB_ToBaseLine'] }, | ||||
|     { name: '右前/后轮距离', key: ['Wheel_RF_ToRightEdge', 'Wheel_RB_ToRightEdge'] }, | ||||
|     { name: '右前/后轮边线', key: ['Wheel_RF_ToBaseLine', 'Wheel_RB_ToBaseLine'] }, | ||||
|     { name: '左前/后轮距离', key: ['Wheel_LF_ToRightEdge', 'Wheel_LB_ToRightEdge'] }, | ||||
|     { name: '左前/后轮边线', key: ['Wheel_LF_ToBaseLine', 'Wheel_LB_ToBaseLine'] }, | ||||
|     { name: '车道属性', key: ['BasePointInLaneDir', 'CrossLineAttr','DirInverse'] }, | ||||
|     { name: '形状', key: ['InShapeAttr', 'ShapeNo','ShapeNoWheel'] }, | ||||
|     { name: '路段点', key: ['CrossPointNo'] }, | ||||
|   ] | ||||
| 
 | ||||
|   scaleFn = async (num)=>{ | ||||
|     const scaleNum = this.scaleNum | ||||
|     if(scaleNum >0 && scaleNum < 5000){ | ||||
|       this.scaleNum += num; | ||||
|     } | ||||
|     if(scaleNum === 0 && num > 0){ | ||||
|       this.scaleNum += num; | ||||
|     } | ||||
|     if(scaleNum > 5000 && num < 0){ | ||||
|       this.scaleNum += num; | ||||
|     } | ||||
|     await examJudgeMapSetScaling(this.scaleNum); | ||||
|   } | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // | ||||
| // @Component | ||||
| // export default struct RealTime { | ||||
| //   @State message: string = '开始绘制' | ||||
| //   // 控制XComponent组件的创建和销毁 | ||||
| //   @State draw: boolean = false | ||||
| //   //监管接口序列号 | ||||
| //   @State serialNumber: number = 0 | ||||
| //   //模拟考试项目 | ||||
| //   @State projects: Project[] = [] | ||||
| //   @State projectsObj: ProjectObj = {} | ||||
| //   @State markRuleListObj: MarkRule = {} | ||||
| //   @State scaleNum: number = 100 | ||||
| //   @State gpsActive: number = 1 | ||||
| //   private widthNumber: string | number | Resource = 0 | ||||
| //   private heightNumber: string | number | Resource = 0 | ||||
| //   private context = getContext(this) as common.UIAbilityContext; | ||||
| //   @State ratio: number = 1 | ||||
| //   @State lane: Object = {} | ||||
| //   @State timer:number = 0 | ||||
| // | ||||
| //   constructor() { | ||||
| //     super() | ||||
| //   } | ||||
| // | ||||
| //   // xcomponentController: XComponentController = new XComponentController() | ||||
| // | ||||
| //   build() { | ||||
| //     Row() { | ||||
| //       Column() { | ||||
| //         Row() { | ||||
| //           Text('车道信息').fontColor(this.gpsActive == 0 ? '#2D3C5A' : '#fff').fontSize(20) | ||||
| //         } | ||||
| //         .width('100%') | ||||
| //         .height(37) | ||||
| //         .backgroundColor(this.gpsActive == 0 ? '#fff' : '#1A1A1A') | ||||
| //         .margin({ top: 10 * this.ratio, right: 10 }) | ||||
| //         .justifyContent(FlexAlign.Center) | ||||
| // | ||||
| //         Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Start }) { | ||||
| //           ForEach(this.RoadData, (item) => { | ||||
| //             Column() { | ||||
| //               Text(`${item.name}:${this.getValues(item)}`) | ||||
| //                 .fontSize(20) | ||||
| //                 .lineHeight(30) | ||||
| //                 .fontColor('#fff') | ||||
| //             }.height(30).justifyContent(FlexAlign.Start).width('100%') | ||||
| //           }) | ||||
| //         }.margin({top:5}) | ||||
| // | ||||
| //       }.width(168 * 1.5) | ||||
| //       .height(this.heightNumber) | ||||
| //       .backgroundColor('#282828') | ||||
| //       .margin({ top: 6 * this.ratio, }) | ||||
| // | ||||
| //       Column() { | ||||
| //         if (this.draw) { | ||||
| //           XComponent({ | ||||
| //             id: 'duolun_plugin_id_draw', //显示轨迹窗口id名称,注意这个ID要和C++侧一致,不能变 | ||||
| //             type: 'surface', | ||||
| //             libraryname: 'JudgeSdk' | ||||
| //             // libraryname: 'judgesdk' | ||||
| //           }) | ||||
| //             .width(this.widthNumber) | ||||
| //             .height(this.heightNumber) | ||||
| //             .onLoad(() => { | ||||
| //               apiJudgeSdk.examJudgeMapSetDrawing(true); //停止绘制地图轨迹,false:表示结束绘制 | ||||
| //             }) | ||||
| //             .onDestroy(() => { | ||||
| //               apiJudgeSdk.examJudgeMapSetDrawing(false); //停止绘制地图轨迹,false:表示结束绘制 | ||||
| //               this.draw = false; | ||||
| //             }) | ||||
| //         } else { | ||||
| //           Column() { | ||||
| //           } | ||||
| //           .width(this.widthNumber) | ||||
| //           .height(this.heightNumber) | ||||
| //         } | ||||
| //       } | ||||
| //       .width('100%') | ||||
| //       .backgroundColor('#fff') | ||||
| // | ||||
| //       Row(){ | ||||
| //         Image($rawfile('judge/big.png')).width(60).onClick(()=>{ | ||||
| //           this.scaleFn( -this.getScaleNum() ) | ||||
| //         }) | ||||
| //         Image($rawfile('judge/small.png')).width(60).onClick(()=>{ | ||||
| //           this.scaleFn( this.getScaleNum() ) | ||||
| //         }).margin({left:20}) | ||||
| //       }.position({x:'32%',y:60}) | ||||
| //     } | ||||
| //     .height('100%') | ||||
| //   } | ||||
| // | ||||
| //   async aboutToDisappear() { | ||||
| //     clearInterval(this.timer) | ||||
| //   } | ||||
| //   async aboutToAppear() { | ||||
| //     const judge = new Judge(this) | ||||
| //     let timer = setInterval(()=>{ | ||||
| //       this.lane = AppStorage.get('laneData'); | ||||
| //     },1000) | ||||
| //     this.timer = timer | ||||
| //   } | ||||
| // | ||||
| //   getScaleNum = ()=>{ | ||||
| //     const scaleNum = this.scaleNum; | ||||
| //     if(scaleNum < 200){ | ||||
| //       return 10 | ||||
| //     } | ||||
| //     if(scaleNum >= 200 && scaleNum < 400){ | ||||
| //       return 30 | ||||
| //     } | ||||
| // | ||||
| //     if(scaleNum >= 400 && scaleNum < 600){ | ||||
| //       return 50 | ||||
| //     } | ||||
| // | ||||
| //     if(scaleNum >= 600 && scaleNum < 800){ | ||||
| //       return 70 | ||||
| //     } | ||||
| // | ||||
| //     if(scaleNum >= 800 && scaleNum < 1000){ | ||||
| //       return 100 | ||||
| //     } | ||||
| // | ||||
| //     if(scaleNum >= 1000 && scaleNum < 2000){ | ||||
| //       return 500 | ||||
| //     } | ||||
| //     if(scaleNum >= 2000 && scaleNum <= 5000){ | ||||
| //       return 1000 | ||||
| //     } | ||||
| // | ||||
| //     return 1000 | ||||
| //   } | ||||
| // | ||||
| //   getValues(roadColumn) { | ||||
| //     const lane = this.lane || {}; | ||||
| //     let key = roadColumn.key; | ||||
| //     let str = '' | ||||
| //     if (Array.isArray(key)) { | ||||
| //       key.forEach((k, index) => { | ||||
| //         str += (lane[k] === undefined ? '' : lane[k]) + (index == key.length - 1 ? '' : '/') | ||||
| //       }) | ||||
| //     } else { | ||||
| //       str = lane[key] === undefined ? '' : lane[key] | ||||
| //     } | ||||
| //     return str | ||||
| //   } | ||||
| // | ||||
| //   private RoadData: Array<RoadDataType> = [ | ||||
| //     { name: '路段组号', key: 'MapRoad_Code_No' }, | ||||
| //     { name: '路段编码', key: 'MapRoad_Name' }, | ||||
| //     { name: '车轮压线', key: ['TouchLineType', 'TouchDir'] }, | ||||
| //     { name: '车身碰线', key: ['TouchLineTypeCS', 'TouchLineDirCS'] }, | ||||
| //     { name: '基准车道', key: ['BasePointInLaneNo', 'BaseLaneCount'] }, | ||||
| //     { name: '前点车道', key: ['FrontPointLaneNo', 'FrontPointLaneCount'] }, | ||||
| //     { name: '后车点道', key: ['BackPointLaneNo','BackPointLaneCount'] }, | ||||
| //     { name: '左前/后车身距离', key: ['Body_LF_ToLeftEdge', 'Body_LB_ToLeftEdge'] }, | ||||
| //     { name: '右前/后车身距离', key: ['Body_RF_ToRightEdge', 'Body_RB_ToRightEdge'] }, | ||||
| //     { name: '右前/后车身边线', key: ['Body_RF_ToBaseLine','Body_RB_ToBaseLine'] }, | ||||
| //     { name: '右前/后轮距离', key: ['Wheel_RF_ToRightEdge', 'Wheel_RB_ToRightEdge'] }, | ||||
| //     { name: '右前/后轮边线', key: ['Wheel_RF_ToBaseLine', 'Wheel_RB_ToBaseLine'] }, | ||||
| //     { name: '左前/后轮距离', key: ['Wheel_LF_ToRightEdge', 'Wheel_LB_ToRightEdge'] }, | ||||
| //     { name: '左前/后轮边线', key: ['Wheel_LF_ToBaseLine', 'Wheel_LB_ToBaseLine'] }, | ||||
| //     { name: '车道属性', key: ['BasePointInLaneDir', 'CrossLineAttr','DirInverse'] }, | ||||
| //     { name: '形状', key: ['InShapeAttr', 'ShapeNo','ShapeNoWheel'] }, | ||||
| //     { name: '路段点', key: ['CrossPointNo'] }, | ||||
| //   ] | ||||
| // | ||||
| //   scaleFn = async (num)=>{ | ||||
| //     const scaleNum = this.scaleNum | ||||
| //     if(scaleNum >0 && scaleNum < 5000){ | ||||
| //       this.scaleNum += num; | ||||
| //     } | ||||
| //     if(scaleNum === 0 && num > 0){ | ||||
| //       this.scaleNum += num; | ||||
| //     } | ||||
| //     if(scaleNum > 5000 && num < 0){ | ||||
| //       this.scaleNum += num; | ||||
| //     } | ||||
| //     await examJudgeMapSetScaling(this.scaleNum); | ||||
| //   } | ||||
| // | ||||
| // } | ||||
| // | ||||
|  | ||||
| @ -13,13 +13,7 @@ import { JudgeConfig } from './utils/judgeConfig'; | ||||
| import { LANE } from '../judgeSDK/api/judgeSDK.d'; | ||||
| import { GetSyncData, SqlInsertTable } from '../../utils/table/Operation'; | ||||
| 
 | ||||
| import { | ||||
|   getCarStatus, | ||||
|   getCenterProjectStatus, | ||||
|   plcStrToJson, | ||||
|   plcStrToWXJson, | ||||
|   promptWxCode | ||||
| } from './utils/judgeCommon'; | ||||
| import { getCarStatus, getCenterProjectStatus, plcStrToJson, plcStrToWXJson, promptWxCode } from './utils/judgeCommon'; | ||||
| 
 | ||||
| import { | ||||
|   examCalcGpsDistance, | ||||
| @ -53,6 +47,7 @@ import { | ||||
|   JudgeBeginObj, | ||||
|   JudgeCallBackData, | ||||
|   JudgeConfigObj, | ||||
|   JudgeConfigObjKmItems, | ||||
|   JudgeEventKf, | ||||
|   JudgeInitObj, | ||||
|   JudgeKFXM, | ||||
| @ -64,7 +59,6 @@ import { | ||||
|   JudgeXMJS, | ||||
|   Km3JudgeInitConfig, | ||||
|   KmItem, | ||||
|   JudgeConfigObjKmItems, | ||||
|   MarkRule, | ||||
|   Plc, | ||||
|   ProjectInfo, | ||||
| @ -185,38 +179,6 @@ export default class Judge { | ||||
|   private isExamEnd: boolean | ||||
|   // 是否发送udp | ||||
|   private isUdpEnd: boolean = false | ||||
|   // 处理udp plc信号 | ||||
|   handleUdp = async (msg: string) => { | ||||
|     console.info('plc信号', msg) | ||||
|     const stachArr = msg.split(',') | ||||
|     if (stachArr[0] != '#DN_GD' || this.isUdpEnd) { | ||||
|       return | ||||
|     } | ||||
|     const plcData = await this.getPlcData(msg); | ||||
|     // 4.过程数据 | ||||
|     await this.fileLog.setExamJudgeData(JSON.stringify(plcData)) | ||||
|     //检测到有无锡所设备接入,需要发送特定的数据,供检测 | ||||
|     // if (this.usbService.isWXUSBDevice) { | ||||
|     //   const str = await senorToWXDataStr(msg); | ||||
|     //   this.usbService.sendUSB(str) | ||||
|     // } | ||||
|     const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350') | ||||
|     this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + '' | ||||
|     this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + '' | ||||
|     //TODO 暂时关闭差分检测异常 | ||||
|     // await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt); | ||||
|     if (!this.isExamEnd) { | ||||
|       await examJudgeRealExam(plcData) | ||||
|     } | ||||
|     let udpIndex = AppStorage.get<number>('udpIndex'); | ||||
|     if (udpIndex % 5 === 0 && !this.isUdpEnd) { | ||||
|       // TODO UPD缺失 | ||||
|       // const judgeUdp = globalThis.judgeUdp | ||||
|       // const bytes = await this.getMessageHeartbeat(this.isExamEnd); | ||||
|       // judgeUdp.send(bytes) | ||||
|     } | ||||
|     AppStorage.setOrCreate('udpIndex', udpIndex++) | ||||
|   } | ||||
|   //是否手动结束考试 | ||||
|   private isManual: boolean | ||||
|   //UDP服务序列号 | ||||
| @ -264,6 +226,60 @@ export default class Judge { | ||||
|     console.info(judgeTag, '过程数据文件上传 end') | ||||
|   } | ||||
|   private judgeTask: JudgeTask | ||||
|   // 检测扣分、结束项目时该项目是否开始 | ||||
|   checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: JudgeEventKf) => { | ||||
|     if (xmdm == 20) { | ||||
|       return true | ||||
|     } | ||||
|     const judgeUI = this.judgeUI; | ||||
|     const judgeTask = this.judgeTask; | ||||
|     const projectsObj = this.judgeUI.projectsObj | ||||
|     const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm) | ||||
|     const isUpload = currentProject.isUpload | ||||
| 
 | ||||
|     //如果项目没有开始 | ||||
|     console.info('surenjun isUpload=>', isUpload) | ||||
|     if (!isUpload) { | ||||
|       console.info(judgeTag, '项目补传开始') | ||||
|       //项目开始补传 | ||||
|       judgeTask.addTask(async () => { | ||||
|         await this.beginProject(xmdm) | ||||
|       }, { | ||||
|         isDelay: true | ||||
|       }) | ||||
|       judgeTask.addTask(async () => { | ||||
|         await this.uploadProgressPhoto(xmdm) | ||||
|       }, { | ||||
|         isDelay: true | ||||
|       }) | ||||
|       currentProject.isUpload = true; | ||||
|       Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject) | ||||
|       //扣分补传 | ||||
|       if (currentType == 2) { | ||||
|         judgeTask.addTask(async () => { | ||||
|           await this.pointsDedute(xmdm, kf) | ||||
|         }, { | ||||
|           isDelay: true | ||||
|         }) | ||||
|       } | ||||
|       //扣分补传判断是否合格 不合格补传项目结束 | ||||
|       if (currentType == 1 || (currentType == 2 && this.totalScore < judgeUI.passingScore)) { | ||||
|         judgeTask.addTask(async () => { | ||||
|           await this.endProject(xmdm) | ||||
|         }, { | ||||
|           isDelay: true | ||||
|         }) | ||||
|         currentProject.isEnd = true; | ||||
|         Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject) | ||||
|       } | ||||
|       judgeTask.addTask(async () => { | ||||
|         this.checkExamIsEnd() | ||||
|       }) | ||||
|       return false; | ||||
|     } else { | ||||
|       return true | ||||
|     } | ||||
|   } | ||||
|   private tempData: Plc | ||||
|   //实时计算gps经纬度距离 | ||||
|   handDistance = async () => { | ||||
| @ -427,6 +443,38 @@ export default class Judge { | ||||
|     AppStorage.setOrCreate('msgStr', plc) | ||||
|     return tempData | ||||
|   } | ||||
|   // 处理udp plc信号 | ||||
|   handleUdp = async (msg: string) => { | ||||
|     console.info('plc信号', msg) | ||||
|     const stachArr = msg.split(',') | ||||
|     if (stachArr[0] != '#DN_GD' || this.isUdpEnd) { | ||||
|       return | ||||
|     } | ||||
|     const plcData = await this.getPlcData(msg); | ||||
|     // 4.过程数据 | ||||
|     await this.fileLog.setExamJudgeData(JSON.stringify(plcData)) | ||||
|     //检测到有无锡所设备接入,需要发送特定的数据,供检测 | ||||
|     // if (this.usbService.isWXUSBDevice) { | ||||
|     //   const str = await senorToWXDataStr(msg); | ||||
|     //   this.usbService.sendUSB(str) | ||||
|     // } | ||||
|     const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350') | ||||
|     this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + '' | ||||
|     this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + '' | ||||
|     //TODO 暂时关闭差分检测异常 | ||||
|     // await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt); | ||||
|     if (!this.isExamEnd) { | ||||
|       await examJudgeRealExam(plcData) | ||||
|     } | ||||
|     let udpIndex = AppStorage.get<number>('udpIndex'); | ||||
|     if (udpIndex % 5 === 0 && !this.isUdpEnd) { | ||||
|       // TODO UPD缺失 | ||||
|       // const judgeUdp = globalThis.judgeUdp | ||||
|       // const bytes = await this.getMessageHeartbeat(this.isExamEnd); | ||||
|       // judgeUdp.send(bytes) | ||||
|     } | ||||
|     AppStorage.setOrCreate('udpIndex', udpIndex++) | ||||
|   } | ||||
|   // 处理轨迹plc信号 | ||||
|   handleTrajectoryUdp = async (strArr: string[]) => { | ||||
|     // const { fileLog, setJudgeItem, setJudgeMark, endExam } = this; | ||||
| @ -465,9 +513,9 @@ export default class Judge { | ||||
|   } | ||||
|   //本地轨迹回放地址 | ||||
|   private trajectoryPath: string | ||||
|   //当前科目二的考试项目 | ||||
|   // private currentKm2ItemsObj: any | ||||
|   private isTrajectoryOpen: boolean; | ||||
|   //当前科目二的考试项目 | ||||
|   // 调代理接口是否断网了 | ||||
|   private isJudgeDisConnect: boolean; | ||||
|   // 断网数据补传 | ||||
| @ -482,67 +530,6 @@ export default class Judge { | ||||
|       const code = await writeObjectOut(JSON.parse(examDataStr)); | ||||
|     } | ||||
|   } | ||||
|   // 考试过程照片 | ||||
|   uploadProgressPhoto = async (ksxm: number) => { | ||||
|     const time = GetCurrentTime(); | ||||
|     const judgeUI = this.judgeUI | ||||
|     const plcData = this.plcData | ||||
|     const photoBase64 = await this.getPhoto(); | ||||
|     const carInfo = AppStorage.get<CarInfoType>('carInfo'); | ||||
| 
 | ||||
|     const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, ksxm) | ||||
|     const judgeConfig_305: number = Reflect.get(judgeUI.judgeConfigObj, '305') | ||||
|     const drvexam: DrvexamType = { | ||||
|       lsh: judgeUI.lsh, | ||||
|       kskm: carInfo.examSubject, | ||||
|       ksxm: project.projectCodeCenter, | ||||
|       sfzmhm: judgeUI.idCard, | ||||
|       kchp: encodeURI(carInfo.plateNo), | ||||
|       zpsj: time, | ||||
|       zp: photoBase64, | ||||
|       cs: Math.floor((judgeConfig_305 == 0 ? plcData.gps.sd : plcData.sensor.cs) * 1.852), | ||||
|       ksdd: encodeURI(judgeUI.ksdd) | ||||
|     } | ||||
|     const data: RegulatoryInterfaceParams = { | ||||
|       xtlb: '17', | ||||
|       jkxlh: judgeUI.serialNumber, | ||||
|       jkid: '17C54', | ||||
|       drvexam | ||||
|     }; | ||||
|     const temp: WR = await this.sendWriteObjectOut(data, this.filePath); | ||||
|     if (temp.code === 2300007) { | ||||
|       this.isJudgeDisConnect = true | ||||
|     } | ||||
|     promptWxCode('17C54', temp.code) | ||||
|     console.info(judgeTag, '上传照片 end') | ||||
|   } | ||||
|   private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] | ||||
|   private lane: LANE = { | ||||
|     road: '', num: 0, count: 0 | ||||
|   } | ||||
|   private videoData: RecordHandleType | ||||
|   private disConnectNum: number = 0; | ||||
|   //调用监管接口 | ||||
|   sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => { | ||||
|     const temp = await writeObjectOut(data, filePath); | ||||
|     console.log("wzj", JSON.stringify(temp)) | ||||
|     //断网&网络超时次数计算 | ||||
|     if (temp.code == 2300007 || temp.code == 2300028) { | ||||
|       this.disConnectNum += 1; | ||||
|       if (this.disConnectNum < 5) { | ||||
|         return await this.sendWriteObjectOut(data, filePath) | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if (this.disConnectNum >= 5) { | ||||
|       console.info('surenjun', '123') | ||||
|       this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!'; | ||||
|       this.judgeUI.disConnectErrorOpen = true | ||||
|     } | ||||
| 
 | ||||
|     this.disConnectNum = 0 | ||||
|     return temp | ||||
|   } | ||||
|   // 项目开始接口同步 | ||||
|   beginProject = async (ksxm: number) => { | ||||
|     const carInfo = AppStorage.get<CarInfoType>('carInfo'); | ||||
| @ -612,66 +599,73 @@ export default class Judge { | ||||
|     console.info(judgeTag, '项目结束 end') | ||||
|     promptWxCode('17C55', temp.code) | ||||
|   } | ||||
|   // 检测扣分、结束项目时该项目是否开始 | ||||
|   checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: JudgeEventKf) => { | ||||
|     if (xmdm == 20) { | ||||
|       return true | ||||
|   private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] | ||||
|   private lane: LANE = { | ||||
|     road: '', num: 0, count: 0 | ||||
|   } | ||||
|   private videoData: RecordHandleType | ||||
|   private disConnectNum: number = 0; | ||||
|   //调用监管接口 | ||||
|   sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => { | ||||
|     const temp = await writeObjectOut(data, filePath); | ||||
|     console.log("wzj", JSON.stringify(temp)) | ||||
|     //断网&网络超时次数计算 | ||||
|     if (temp.code == 2300007 || temp.code == 2300028) { | ||||
|       this.disConnectNum += 1; | ||||
|       if (this.disConnectNum < 5) { | ||||
|         return await this.sendWriteObjectOut(data, filePath) | ||||
|       } | ||||
|     } | ||||
|     const judgeUI = this.judgeUI; | ||||
|     const judgeTask = this.judgeTask; | ||||
|     const projectsObj = this.judgeUI.projectsObj | ||||
|     const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm) | ||||
|     const isUpload = currentProject.isUpload | ||||
| 
 | ||||
|     //如果项目没有开始 | ||||
|     console.info('surenjun isUpload=>', isUpload) | ||||
|     if (!isUpload) { | ||||
|       console.info(judgeTag, '项目补传开始') | ||||
|       //项目开始补传 | ||||
|       judgeTask.addTask(async () => { | ||||
|         await this.beginProject(xmdm) | ||||
|       }, { | ||||
|         isDelay: true | ||||
|       }) | ||||
|       judgeTask.addTask(async () => { | ||||
|         await this.uploadProgressPhoto(xmdm) | ||||
|       }, { | ||||
|         isDelay: true | ||||
|       }) | ||||
|       currentProject.isUpload = true; | ||||
|       Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject) | ||||
|       //扣分补传 | ||||
|       if (currentType == 2) { | ||||
|         judgeTask.addTask(async () => { | ||||
|           await this.pointsDedute(xmdm, kf) | ||||
|         }, { | ||||
|           isDelay: true | ||||
|         }) | ||||
|       } | ||||
|       //扣分补传判断是否合格 不合格补传项目结束 | ||||
|       if (currentType == 1 || (currentType == 2 && this.totalScore < judgeUI.passingScore)) { | ||||
|         judgeTask.addTask(async () => { | ||||
|           await this.endProject(xmdm) | ||||
|         }, { | ||||
|           isDelay: true | ||||
|         }) | ||||
|         currentProject.isEnd = true; | ||||
|         Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject) | ||||
|       } | ||||
|       judgeTask.addTask(async () => { | ||||
|         this.checkExamIsEnd() | ||||
|       }) | ||||
|       return false; | ||||
|     } else { | ||||
|       return true | ||||
|     if (this.disConnectNum >= 5) { | ||||
|       console.info('surenjun', '123') | ||||
|       this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!'; | ||||
|       this.judgeUI.disConnectErrorOpen = true | ||||
|     } | ||||
| 
 | ||||
|     this.disConnectNum = 0 | ||||
|     return temp | ||||
|   } | ||||
|   // 考试过程照片 | ||||
|   uploadProgressPhoto = async (ksxm: number) => { | ||||
|     const time = GetCurrentTime(); | ||||
|     const judgeUI = this.judgeUI | ||||
|     const plcData = this.plcData | ||||
|     const photoBase64 = await this.getPhoto(); | ||||
|     const carInfo = AppStorage.get<CarInfoType>('carInfo'); | ||||
| 
 | ||||
|     const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, ksxm) | ||||
|     const judgeConfig_305: number = Reflect.get(judgeUI.judgeConfigObj, '305') | ||||
|     const drvexam: DrvexamType = { | ||||
|       lsh: judgeUI.lsh, | ||||
|       kskm: carInfo.examSubject, | ||||
|       ksxm: project.projectCodeCenter, | ||||
|       sfzmhm: judgeUI.idCard, | ||||
|       kchp: encodeURI(carInfo.plateNo), | ||||
|       zpsj: time, | ||||
|       zp: photoBase64, | ||||
|       cs: Math.floor((judgeConfig_305 == 0 ? plcData.gps.sd : plcData.sensor.cs) * 1.852), | ||||
|       ksdd: encodeURI(judgeUI.ksdd) | ||||
|     } | ||||
|     const data: RegulatoryInterfaceParams = { | ||||
|       xtlb: '17', | ||||
|       jkxlh: judgeUI.serialNumber, | ||||
|       jkid: '17C54', | ||||
|       drvexam | ||||
|     }; | ||||
|     const temp: WR = await this.sendWriteObjectOut(data, this.filePath); | ||||
|     if (temp.code === 2300007) { | ||||
|       this.isJudgeDisConnect = true | ||||
|     } | ||||
|     promptWxCode('17C54', temp.code) | ||||
|     console.info(judgeTag, '上传照片 end') | ||||
|   } | ||||
| 
 | ||||
|   constructor(judgeUI: JudgeUI) { | ||||
|     this.serialIndex = 1; | ||||
|     this.judgeUI = judgeUI | ||||
|     //语音播放工具 | ||||
|     this.avPlayer = new VoiceAnnounce(); | ||||
|     this.avPlayer = new VoiceAnnounce(this.context); | ||||
|     //模型工具 | ||||
|     this.fileModel = new FileModel(judgeUI.context); | ||||
|     //文件工具 | ||||
|  | ||||
| @ -17,11 +17,11 @@ export default class VoiceAnnounce { | ||||
|   //队列时候立马终止 | ||||
|   private isStopped: Boolean | ||||
|   private queue: Queue[] | ||||
|   private newQueue: Queue[] | ||||
|   private pendingQueue: String[] | ||||
|   private callback: Function; | ||||
|   private newQueue?: Queue[] | ||||
|   private context: common.UIAbilityContext | ||||
| 
 | ||||
|   constructor() { | ||||
|   constructor(context: common.UIAbilityContext) { | ||||
|     this.context = context | ||||
|     this.isStopped = false; | ||||
|     this.queue = [] | ||||
|   } | ||||
| @ -60,16 +60,17 @@ export default class VoiceAnnounce { | ||||
|       const queue = this.queue; | ||||
|       const isStopped = this.isStopped; | ||||
|       const newQueue = this.newQueue; | ||||
|       const avPlayer = new AVPlayer(); | ||||
|       const avPlayer = new AVPlayer(this.context); | ||||
|       if (isStopped) { | ||||
|         //清空原来队列 | ||||
|         this.queue = newQueue | ||||
|         this.queue = newQueue ?? [] | ||||
|         this.isStopped = false; | ||||
|         await go() | ||||
|         return | ||||
|       } | ||||
|       console.info(TAG, '当前播放队列' + JSON.stringify(queue)) | ||||
|       await avPlayer.play(queue[0].url, queue[0].callback); | ||||
|       await avPlayer.play(queue[0].url, queue[0].callback || (() => { | ||||
|       })); | ||||
|       this.queue.shift(); | ||||
|       console.info(TAG, '当前播放队列播放完成退出'); | ||||
|       avPlayer.avPlayerStop(); | ||||
| @ -84,11 +85,11 @@ export default class VoiceAnnounce { | ||||
| 
 | ||||
| class AVPlayer { | ||||
|   public avPlayer?: media.AVPlayer; | ||||
|   private voiceUrl: string[]; | ||||
|   private voiceStatus: 'completed' | 'playing' | ||||
|   private endCallback: Function | ||||
|   private endCallback?: Function | ||||
|   private context: common.UIAbilityContext | ||||
| 
 | ||||
|   constructor() { | ||||
|   constructor(context: common.UIAbilityContext) { | ||||
|     this.context = context | ||||
|   } | ||||
| 
 | ||||
|   // 以下为使用资源管理接口获取打包在HAP内的媒体资源文件并通过fdSrc属性进行播放示例 | ||||
| @ -103,14 +104,14 @@ class AVPlayer { | ||||
|       // console.info('surenjun fdPath=>',fdPath) | ||||
|       console.info(TAG, 'audioPlayer => 准备加载资源播放') | ||||
|       audioPlayer.on('dataLoad', () => { | ||||
|         this.voiceStatus = 'playing' | ||||
|         // this.voiceStatus = 'playing' | ||||
|         console.info(TAG, 'audioPlayer => 播放资源开始') | ||||
|         audioPlayer.play() | ||||
|       }) | ||||
|       return new Promise(async (resolve) => { | ||||
|         audioPlayer.on('finish', () => { | ||||
|           console.info(TAG, 'audioPlayer => 播放资源播放') | ||||
|           this.voiceStatus = 'completed' | ||||
|           // this.voiceStatus = 'completed' | ||||
|           if (callback) { | ||||
|             callback() | ||||
|           } | ||||
| @ -131,8 +132,9 @@ class AVPlayer { | ||||
|           resolve(true) | ||||
|         }); | ||||
|         try { | ||||
|           const context: common.UIAbilityContext = AppStorage.get('context') | ||||
|           this.avPlayer.fdSrc = await context.resourceManager.getRawFd(name); | ||||
|           if (this.avPlayer) { | ||||
|             this.avPlayer.fdSrc = await this.context.resourceManager.getRawFd(name); | ||||
|           } | ||||
|         } catch (e) { | ||||
|           Prompt.showToast({ | ||||
|             message: `${name}语音文件不存在`, | ||||
| @ -164,7 +166,7 @@ class AVPlayer { | ||||
| 
 | ||||
|   //音频播放队列 | ||||
|   public releasePlayer() { | ||||
|     this.avPlayer.release(); | ||||
|     this.avPlayer!.release(); | ||||
|   } | ||||
| 
 | ||||
|   avPlayerStop = () => { | ||||
| @ -175,7 +177,7 @@ class AVPlayer { | ||||
| 
 | ||||
|   // 注册avplayer回调函数 | ||||
|   setAVPlayerCallback(callBack: Function) { | ||||
|     this.avPlayer.on('error', (err: BusinessError) => { | ||||
|     this.avPlayer!.on('error', (err: BusinessError) => { | ||||
|       console.log(TAG, '播放器错误', JSON.stringify(err)) | ||||
|       this.avPlayer && this.avPlayer.stop() | ||||
|       this.avPlayer && this.avPlayer.reset() | ||||
| @ -184,29 +186,29 @@ class AVPlayer { | ||||
| 
 | ||||
|     let num = 0; | ||||
|     // 状态机变化回调函数 | ||||
|     this.avPlayer.on('stateChange', async (state, reason) => { | ||||
|     this.avPlayer!.on('stateChange', async (state, reason) => { | ||||
|       const endCallback = this.endCallback; | ||||
|       switch (state) { | ||||
|         case 'idle': // 成功调用reset接口后触发该状态机上报 | ||||
|           break; | ||||
|         case 'initialized': // avplayer 设置播放源后触发该状态上报 | ||||
|           this.avPlayer.prepare() | ||||
|           this.avPlayer!.prepare() | ||||
|           break; | ||||
|         case 'prepared': // prepare调用成功后上报该状态机 | ||||
|           console.info(TAG, '播放资源播放') | ||||
|           this.avPlayer.play(); | ||||
|           this.voiceStatus = 'playing' | ||||
|           this.avPlayer!.play(); | ||||
|           // this.voiceStatus = 'playing' | ||||
|           break; | ||||
|         case 'playing': // play成功调用后触发该状态机上报 | ||||
|           break; | ||||
|         case 'paused': // pause成功调用后触发该状态机上报 | ||||
|           break; | ||||
|         case 'completed': // 播放结束后触发该状态机上报 | ||||
|           this.voiceStatus = 'completed' | ||||
|           this.avPlayer.stop(); //调用播放结束接口 | ||||
|           // this.voiceStatus = 'completed' | ||||
|           this.avPlayer!.stop(); //调用播放结束接口 | ||||
|           break; | ||||
|         case 'stopped': // stop接口成功调用后触发该状态机上报 | ||||
|           this.avPlayer.reset(); // 调用reset接口初始化avplayer状态 | ||||
|           this.avPlayer!.reset(); // 调用reset接口初始化avplayer状态 | ||||
|           console.info(TAG, '播放资源释放') | ||||
|           if (endCallback) { | ||||
|             endCallback() | ||||
|  | ||||
| @ -23,10 +23,9 @@ export class FileHelper { | ||||
|     photoAccessHelper.PhotoKeys.DATE_TRASHED, | ||||
|     photoAccessHelper.PhotoKeys.HIDDEN | ||||
|   ]; | ||||
|   private userFileMgr: photoAccessHelper.PhotoAccessHelper = undefined; | ||||
|   private userFileMgr!: photoAccessHelper.PhotoAccessHelper | ||||
| 
 | ||||
|   constructor() { | ||||
|     const context: common.UIAbilityContext = AppStorage.get('context') | ||||
|   constructor(context: common.UIAbilityContext) { | ||||
|     this.userFileMgr = photoAccessHelper.getPhotoAccessHelper(context); | ||||
|   } | ||||
| 
 | ||||
|  | ||||
| @ -81,7 +81,7 @@ export async function endRecordVideo(record_handleObj: RecordHandleType) { | ||||
| export async function saveStartRecordVideo(path: string, context?: common.UIAbilityContext): Promise<RecordHandleType> { | ||||
|   return new Promise(async (resolve, reject) => { | ||||
|     const fileUtil = new FileUtils(context) | ||||
|     const fileHelper = new FileHelper(); | ||||
|     const fileHelper = new FileHelper(context); | ||||
|     // const date = dateFormat(new Date).split(' ')[0] | ||||
|     const date = dayTs().format('YYYY-MM-DD HH:mm:ss').split(' ')[0] | ||||
|     fileHelper.createAlbum(date); | ||||
| @ -97,7 +97,7 @@ export async function saveStartRecordVideo(path: string, context?: common.UIAbil | ||||
|     for (let i = 1; i <= 4; i++) { | ||||
|       if (Reflect.get(param, 'videoRecord' + i)) { | ||||
|         // Reflect.set(record_handle, i, await getFileHandleCode(i, param, date, path, i)); | ||||
|         const data = await startRecordVideo(param, i, context, date, path, i); | ||||
|         const data = await startRecordVideo(param, i, context!, date, path, i); | ||||
|         Reflect.set(record_handle, i, data); | ||||
| 
 | ||||
|       } | ||||
| @ -129,7 +129,6 @@ interface takePhotoParam { | ||||
|  * @param callback | ||||
|  * @returns | ||||
|  */ | ||||
| const fileHelper = new FileHelper(); | ||||
| 
 | ||||
| export async function delPic(day: number, type: number, context?: common.UIAbilityContext) { | ||||
|   let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); | ||||
| @ -150,7 +149,7 @@ export async function delPic(day: number, type: number, context?: common.UIAbili | ||||
|   for (let i = 0; i <= albums.length; i++) { | ||||
|     let albumName = albums[i].albumName | ||||
|     if (IsDaysAgo(albumName, day) && albumName != 'jt' && albumName != 'pz') { | ||||
|       deleteAllFileByPiC(albumName, type) | ||||
|       deleteAllFileByPiC(albumName, type, context) | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -196,8 +195,8 @@ export async function takePhoto(param: VideoConfig, context: common.UIAbilityCon | ||||
| 
 | ||||
| 
 | ||||
| //type:1 是图片 2是视频 | ||||
| export async function deleteAllFileByPiC(dirName: string, type = 1) { | ||||
|   // const fileHelper = new FileHelper(); | ||||
| export async function deleteAllFileByPiC(dirName: string, type = 1, context: common.UIAbilityContext) { | ||||
|   const fileHelper = new FileHelper(context); | ||||
|   fileHelper.deleteFileOfAlbum(dirName, type); | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user