import common from '@ohos.app.ability.common'; import router from '@ohos.router'; import { getEsCarModel, getSyncData, } from '../common/service/initable'; import { getUDP, getUDP2 } from '../common/utils/GlobalUdp'; import { initJudgeUdp } from '../common/utils/UdpJudge'; import { judgeConfig } from './judgeSDK/utils/judgeConfig'; import { getTCP } from '../common/utils/GlobalTcp'; import promptAction from '@ohos.promptAction'; import errorMsgDialog from './compontents/errorMsgDialog'; import imageBtn from './compontents/imageBtn'; import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements'; import { BaseInfoType, centerCallBackMsgType } from '../model/Common'; import { CarInfoType, InitializeTheCentralTableType, MASYSSETTableType, TimeSynchronizationRspBody } from '../model'; import { GetCarInfo, GetDeviceInfo, SetCurrentTime, SetSerialNumber, UseAuth } from './Index/utils'; import { GetSyncData, InitializeTheCentralTable } from '../utils/table/Operation'; import { BusinessError } from '@ohos.base'; import { delPic } from '../utils/Video'; import { FileHelper } from '../utils/FileHelp'; import GetDistance from '../utils/business/GetDistance'; import { GetCurrentTime, NumberToByteArray } from '../utils/Common'; import { ObtainSignalData } from '../utils/business/ObtainSignalData'; import { CentralHeartbeat } from '../utils/business/CentralHeartbeat'; @Entry @Component struct Index { @State url: string = '' @State hasAuth: boolean = false; @State dialogVisiable: boolean = false; @State singlePlay: boolean = false; @State baseInfo: BaseInfoType = {}; @State deviceId: string = ''; @State angle: number = 0 @State dialogRatio: number = 0.8 @State ratio: number = 1700 / 960 @State delLoading: boolean = false @State loading: boolean = false @State initParamFlag: boolean = false @State fd: number = -1; @State carInfo: CarInfoType = {}; @State num: number = 0; fileHelper: FileHelper = null; errorDialog: CustomDialogController = new CustomDialogController({ builder: errorMsgDialog({ title: AppStorage.get('title'), type: AppStorage.get('type'), cancel: () => { }, confirm: () => { } }), customStyle: true, alignment: DialogAlignment.Center, }, ) private interval = -1; private avPlayer: VoiceAnnounce private timeInfo: TimeSynchronizationRspBody private context = getContext(this) as common.UIAbilityContext; @Styles commStyle(){ .width(220 * this.ratio * this.dialogRatio) .height(69 * this.ratio * this.dialogRatio) .backgroundImage($r('app.media.button_nor')) .backgroundImageSize({ width: '100%', height: '100%' }) // .margin({ bottom: 12 * this.ratio }) } build() { Column() { Column() { Row() { Image($r('app.media.logo')).width('30%').height('5.5%').margin({ left: 24 }) Row() { Image($r('app.media.btn_setting')).width('16.7%').height('12.2%') .onClick(async () => { // this.vocObj.playAudio({ // type: 1, // name: 'button_media.wav' // }) // deleteAllPicturesFn() if (this.loading) { return } router.pushUrl({ url: 'pages/Settings', }, router.RouterMode.Single); }) Image($r('app.media.btn_back')).width('14.4%').height('12.2%') .onClick(() => { // this.vocObj.playAudio({ // type: 1, // name: 'button_media.wav' // }) this.dialogVisiable = true }) } } .width('100%') .justifyContent(FlexAlign.SpaceBetween) } Column() { Row() { if (!this.singlePlay) { imageBtn({ btnWidth: '28%', btnHeight: '71%', imgSrc: $r('app.media.index_lw') }) .margin({ left: 80 * this.ratio }) .onClick(async () => { // this.vocObj.playAudio({ // type: 1, // name: 'button_media.wav' // }) // ||!this.initParamFlag if (this.loading) { // this.errorDialog.open() return } setTimeout(() => { this.angle = 360 }, 1000) this.angle = 0 if (!this.timeInfo) { AppStorage.setOrCreate('type', 1) AppStorage.setOrCreate('title', '时间同步接口连接失败') this.errorDialog.open() promptAction.showToast({ message: `时间同步接口连接失败`, duration: 3000 }); this.loading = false return } if (!this.carInfo) { promptAction.showToast({ message: `车辆信息接口获取失败`, duration: 3000 }); AppStorage.setOrCreate('type', 1) AppStorage.setOrCreate('title', '车辆信息接口获取失败') this.errorDialog.open() this.loading = false return } this.testXMLToJSONInWorker() }) } if (this.singlePlay) { imageBtn({ btnWidth: '28%', btnHeight: '71%', imgSrc: $r('app.media.index_dj') }) .margin({ left: 80 * this.ratio }) .onClick(() => { if (this.loading) { return } // this.vocObj.playAudio({ // type: 1, // name: 'button_media.wav' // }) if (judgeConfig.isTrajectoryOpen) { router.pushUrl({ url: 'pages/UserInfo', }, router.RouterMode.Single) return } //判断数据库是否有表数据,有则直接跳转,没有则读取本地数据 getSyncData('MA_SYSSET').then((data: Array) => { console.log('datadata', JSON.stringify(data)) if (data?.[0]) { router.pushUrl({ url: 'pages/UserInfo', }, router.RouterMode.Single) } else { this.testXMLToJSONInWorker() } }); }) } imageBtn({ btnWidth: '28%', btnHeight: '71%', imgSrc: $r('app.media.index_zj') }) .margin({ right: 80 * this.ratio }) .onClick(() => { if (this.loading) { return } // this.vocObj.playAudio({ // type: 1, // name: 'button_media.wav' // }) router.pushUrl({ url: 'pages/CarCheck' }, router.RouterMode.Single); }) } .width('100%') .justifyContent(FlexAlign.SpaceAround) } Column() { Row() { Column() { Text('V外壳:' + this.baseInfo.version) .fontColor('#CCAE7A') .fontSize(18 * this.ratio) .width('30%') .margin({ bottom: 10 }) Text('V评判:' + this.baseInfo.judgeVersion) .fontColor('#CCAE7A') .fontSize(18 * this.ratio) .width('30%') .margin({ bottom: 10 }) Text('授权信息:' + (this.baseInfo.hasAuth ? '已授权' : '未授权')) .fontColor('#CCAE7A') .fontSize(18 * this.ratio) .width('30%') } .margin({ left: 24 }) .gesture( GestureGroup(GestureMode.Exclusive, TapGesture({ count: 2 }) .onAction(() => { // takePhotoFn(this.context) this.singlePlay = !this.singlePlay AppStorage.setOrCreate('singlePlay', this.singlePlay) }) ) ) Text('考车号:' + this.deviceId) .fontColor('#CCAE7A') .fontSize(22 * this.ratio) .margin({ right: 24 }) } .width('100%') .justifyContent(FlexAlign.SpaceBetween) .margin({ bottom: 10 }) } // if (this.dialogVisiable) { Flex({ justifyContent: FlexAlign.Center }) { Text('确认是否退出应用') .fontSize(28 * this.ratio * this.dialogRatio) .margin({ top: 100 * this.ratio * this.dialogRatio }) Row() { Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { Text(' 取 消 ') .fontSize(24 * this.ratio * this.dialogRatio) .fontColor('#fff') .width(100 * this.ratio * this.dialogRatio) } .commStyle() .onClick(() => { this.dialogVisiable = false // this.vocObj.playAudio({ // type: 1, // name: 'button_media.wav' // }) }).margin({ right: 10 * this.ratio }) Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) { Text(' 确 定 ') .fontSize(24 * this.ratio * this.dialogRatio) .fontColor('#fff') .width(100 * this.ratio * this.dialogRatio) } .commStyle() .onClick(() => { // this.vocObj.playAudio({ // type: 1, // name: 'button_media.wav' // }) router.back() }) }.position({ y: 265 * this.ratio * this.dialogRatio, x: 115 * this.ratio * this.dialogRatio }) } .width(660 * this.ratio * this.dialogRatio) .height(360 * this.ratio * this.dialogRatio) .position({ x: 220 * this.ratio, y: 98 * this.ratio - 265 / 2 * (1 - this.ratio * this.dialogRatio) }) .backgroundColor('#E6E3DF') .borderRadius(19 * this.ratio * this.dialogRatio) } if (this.delLoading) { Column() { Image($r('app.media.open_loading')) .width(200 * this.ratio) .rotate({ angle: this.angle }) .height(200 * this.ratio) .animation({ duration: 5000, // 动画时长 curve: Curve.EaseOut, // 动画曲线 delay: 500, // 动画延迟 iterations: -1, // 播放次数 playMode: PlayMode.Normal, // 动画模式 }) .margin({ top: 30 * this.ratio }) Text('正在清理本地数据,请稍候……') .fontSize(24 * this.ratio) .margin({ top: 20 * this.ratio }) .fontWeight(400) } .visibility(this.delLoading ? Visibility.Visible : Visibility.Hidden) .width(660 * this.ratio) .height(360 * this.ratio) .position({ x: 150 * this.ratio, y: 98 * this.ratio }) .backgroundColor('#E6E3DF') .borderRadius(19 * this.ratio) } if (this.loading) { Column() { Image($r('app.media.open_loading')) .width(200 * this.ratio) .rotate({ angle: this.angle }) .height(200 * this.ratio) .animation({ duration: 5000, // 动画时长 curve: Curve.EaseOut, // 动画曲线 delay: 500, // 动画延迟 iterations: -1, // 播放次数 playMode: PlayMode.Normal, // 动画模式 }) .margin({ top: 30 * this.ratio }) Image($r('app.media.car')) .width(80 * this.ratio) .height(80 * this.ratio) .position({ x: 288 * this.ratio, y: 89 * this.ratio }) Text('获取考车信息,请稍候……') .fontSize(24 * this.ratio) .margin({ top: 20 * this.ratio }) .fontWeight(400) } .visibility(this.loading ? Visibility.Visible : Visibility.Hidden) .width(660 * this.ratio) .height(360 * this.ratio) .position({ x: 150 * this.ratio, y: 98 * this.ratio }) .backgroundColor('#E6E3DF') .borderRadius(19 * this.ratio) } } .width('100%') .height('100%') .justifyContent(FlexAlign.SpaceBetween) .backgroundImagePosition({ x: 0, y: 0 }) .backgroundImage($r('app.media.index_bg')) .backgroundImageSize({ width: '100%', height: '100%' }) } async aboutToAppear() { this.avPlayer = new VoiceAnnounce(); this.ratio = AppStorage.get('ratio') this.initParamFlag = false this.delLoading = false this.dialogVisiable = false this.angle = 0 this.loading = false AppStorage.set('lsh', '1111111111111') // TODO 未改 // globalThis.errorDialog = this.errorDialog // globalThis.udpEvent = new UdpEvent(); GetSyncData("MA_SYSSET").then((res: MASYSSETTableType[]) => { res.forEach((element) => { if (element.v_no === "305") { delPic(Number(element.v_value), 1, this.context) delPic(Number(element.v_value), 2, this.context) } }); }); } async testXMLToJSONInWorker() { if (this.loading) { return } // let mode=globalThis.timeInfo?.mode?globalThis.timeInfo?.mode:1 // console.log('mode',mode) const param: InitializeTheCentralTableType = { carId: this.carInfo?.carId, examinationRoomId: this.carInfo?.examinationRoomId, judgeVersion: this.baseInfo.judgeVersion, shellVersion: this.baseInfo.version, paraKdid: this.timeInfo?.paraKdid || this.timeInfo?.kdid, kdid: this.timeInfo?.kdid || this.timeInfo?.paraKdid, mode: this.timeInfo?.mode, context: this.context, host: AppStorage.get('host'), centerHost: this.timeInfo?.url, singlePlay: this.singlePlay } this.loading = true // getSingleCenterTable(param).then((ret) => { InitializeTheCentralTable(param).then((ret) => { if (ret) { GetSyncData("MA_SYSSET").then(data => { data.forEach(sys => { //判断是否能点开始考试 if (sys.v_no === '854') { AppStorage.setOrCreate('param854Str', sys.v_value) } if (sys.v_no === '824' && decodeURIComponent(sys.v_value) == '0') { router.pushUrl({ url: 'pages/CarCheck', params: { 'fromIndex': true } }, router.RouterMode.Single) } else { router.pushUrl({ url: 'pages/ExaminerLogin', }, router.RouterMode.Single) } }) }); } }) } async heartMsg() { // const signNum = AppStorage.get('signNum') // const statue = AppStorage.get('statue') // const lsh = AppStorage.get('lsh') // const arr = [signNum || 0, statue || 1] // let tmpList: number[] = []; // tmpList.push(NumberToByteArray(Number(arr[0]), 1 * 8)[0]) // tmpList.push(NumberToByteArray(Number(arr[1]), 1 * 8)[0]) // const str = lsh || '0000000000000' // for (let i = 0; i < str.length; i++) { // tmpList.push(NumberToByteArray(str.charCodeAt(i), 1 * 8)[0]) // } // TODO 未改 // const param = { // id: 31, // list: tmpList, // carNo: this.carInfo.carNo, // placeId: this.carInfo.examinationRoomId // } // globalThis.udpClient2.initHeartSendMsg(param,this.context) // if (globalThis.udpClient2.getStatus()) { // globalThis.udpClient2.sendMsgExt(param, this.context) // } } async onPageShow() { console.log('ttttt', 1111) this.singlePlay = AppStorage.get('singlePlay') this.baseInfo = AppStorage.get('baseInfo') // await this.userAuth(); UseAuth(this.context).then(() => { this.initParams() }).catch(() => { }); if (this.singlePlay == undefined || this.singlePlay == null) { // setVideoParam() console.log('diyidiy') this.context.resourceManager.getRawFileContent("welcome.wav") .then(() => { this.avPlayer.playAudio(['welcome.wav']) // this.vocObj.playAudio({ // type: 1, // name: 'welcome.wav' // }) // let rawFile = value; }) .catch((error: BusinessError) => { console.log("getRawFileContent promise error is " + error); }); this.singlePlay = false AppStorage.setOrCreate('singlePlay', false) } // this.loading = false this.num = 0 // const TcpClient: TcpClient =new TcpClient(result[0].tcplocalIp, result[0].tcplocalIpPort,result[0].tcpOppositeIp,result[0].tcpOppositePort) AppStorage.setOrCreate('lsh', '1111111111111') } async createAlbum() { this.fileHelper = new FileHelper(); const time = await GetCurrentTime() const date = time.split(' ')[0] this.fileHelper.createAlbum('jt') // this.fileHelper.createAlbum('2025-01-02') this.fileHelper.createAlbum('pz'); this.fileHelper.createAlbum(date); } async initParams() { //设置plc udp 同步requesthost // await getUDP(this.context, false) ObtainSignalData.init(); CentralHeartbeat.init(); CentralHeartbeat.sendHeartData() CentralHeartbeat.getData((data:centerCallBackMsgType)=>{ if (data.id == 32) { AppStorage.setOrCreate('signNum', data.body[1]) } },) this.loading = false await GetDeviceInfo(this.context) await GetCarInfo() // await getUDP2(this.context, false) getTCP() this.carInfo = AppStorage.get('carInfo') this.deviceId = this.carInfo.carNo // await setCurrentTime(); await SetCurrentTime() this.timeInfo = AppStorage.get('timeInfo') const distanceClass = AppStorage.get('distanceClass') if (!distanceClass) { const distanceClass = new GetDistance(this.context) await distanceClass.initFolder() AppStorage.setOrCreate('distanceClass', distanceClass) console.info('surenjun', 'distanceClass=>初始化完成') } setTimeout(() => { this.initParamFlag = true }, 3000) initJudgeUdp() // TODO 摄像头遮挡 // takePhotoFn(this.context) clearInterval(this.interval) this.interval = setInterval(() => { this.num++ // setliushuiNum() SetSerialNumber() // getliushuiNum(this.context) if (this.num >= 3) { this.heartMsg() } }, 1000) this.createAlbum() } async getModel() { const context = this.context; //下载模型 await getEsCarModel(context) } }