From fca8d0ed08acb6b7822a37926ccdaa3582a5a591 Mon Sep 17 00:00:00 2001 From: lixiao <932184220@qq.com> Date: Thu, 30 Oct 2025 16:10:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E8=BD=A6=E4=BB=A3=E7=A0=81=E5=90=88?= =?UTF-8?q?=E5=B9=B6=20=E5=B0=8F=E7=BA=A2=E7=90=83udp=E5=BC=80=E5=A7=8B?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/oh-package-lock.json5 | 2 +- entry/src/main/ets/model/Common.ets | 1 + entry/src/main/ets/model/Judge.ets | 2 +- entry/src/main/ets/model/Worker.ets | 2 + entry/src/main/ets/pages/Judge.ets | 2 - .../ets/pages/Judge/BaseJudgeBussines.ets | 69 +++-- .../main/ets/pages/Judge/JudgeBusiness.ets | 14 +- .../ets/pages/Judge/LargeJudgeBusiness.ets | 264 +++++++++--------- .../ets/pages/Judge/SmallJudgeBusiness.ets | 9 +- entry/src/main/ets/pages/Judge/utils.ets | 38 ++- entry/src/main/ets/pages/TerminalInfo.ets | 11 +- entry/src/main/ets/pages/UserInfo.ets | 4 +- .../ets/utils/business/JudgeUdpBusiness.ets | 18 +- .../ets/utils/business/ObtainUdpBusiness.ets | 55 +++- .../ets/workers/DifferentialCorrection.ets | 28 +- oh-package-lock.json5 | 18 +- 16 files changed, 342 insertions(+), 195 deletions(-) diff --git a/entry/oh-package-lock.json5 b/entry/oh-package-lock.json5 index 3f4c904..d5892e3 100644 --- a/entry/oh-package-lock.json5 +++ b/entry/oh-package-lock.json5 @@ -1,5 +1,5 @@ { - "lockfileVersion": 2, + "lockfileVersion": 1, "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", "specifiers": {}, "packages": {} diff --git a/entry/src/main/ets/model/Common.ets b/entry/src/main/ets/model/Common.ets index 56fa15c..21fcd0d 100644 --- a/entry/src/main/ets/model/Common.ets +++ b/entry/src/main/ets/model/Common.ets @@ -140,6 +140,7 @@ export interface EnvironmentConfigurationType { // 前置机响应后置机端口2 udplocalIpPortTwo?: string, udpOppositeIp?: string, + udpOppositeIpTwo?: string, // 后置机响应端口 udpOppositeIpPort?: string, diff --git a/entry/src/main/ets/model/Judge.ets b/entry/src/main/ets/model/Judge.ets index b27566d..a859ca0 100644 --- a/entry/src/main/ets/model/Judge.ets +++ b/entry/src/main/ets/model/Judge.ets @@ -659,7 +659,7 @@ export interface JudgeBeginObj { sczbkf?: JudgeKFXM[] dmndg: boolean mfxx: boolean - mfxxn: boolean + zeng: boolean } export interface JudgeXMJS { diff --git a/entry/src/main/ets/model/Worker.ets b/entry/src/main/ets/model/Worker.ets index 789fbc4..062ee73 100644 --- a/entry/src/main/ets/model/Worker.ets +++ b/entry/src/main/ets/model/Worker.ets @@ -72,6 +72,8 @@ export interface WorkerBackMessage { export enum WorkerBackMessageType { // 后置机信息 ObtainUdpData = 'obtainUdpData', + // 后置机GPS2消息 + ObtainUdpGps2Data = 'obtainUdpGps2Data', // 中心消息 CenterUdpData = 'centerUdpData', // 远程开始考试 diff --git a/entry/src/main/ets/pages/Judge.ets b/entry/src/main/ets/pages/Judge.ets index ce4463c..828f8be 100644 --- a/entry/src/main/ets/pages/Judge.ets +++ b/entry/src/main/ets/pages/Judge.ets @@ -149,7 +149,6 @@ export struct JudgePage { @State isErrorMsgEnd: boolean = false @State disConnectErrorOpen: boolean = false @State @Watch("laneSignalChange") laneSignal: PerLane = InitialPerLane - public udpStartTIme: string = "" public examTime: number = 0 public context = getContext(this) as common.UIAbilityContext; // 信号查看弹窗 @@ -214,7 +213,6 @@ export struct JudgePage { this.startFullTime = dayTs().format("YYYYMMDDHHmmss"); this.startTime = dayTs().format("YYYY-MM-DD HH:mm:ss") this.startExamTime = dayTs().format("YYYY-MM-DD HH:mm:ss") - this.udpStartTIme = dayTs().format("HHmmssSSS") //初始化数据库表 await this.initDb() //断点续考 diff --git a/entry/src/main/ets/pages/Judge/BaseJudgeBussines.ets b/entry/src/main/ets/pages/Judge/BaseJudgeBussines.ets index 55d2762..fd5ed69 100644 --- a/entry/src/main/ets/pages/Judge/BaseJudgeBussines.ets +++ b/entry/src/main/ets/pages/Judge/BaseJudgeBussines.ets @@ -36,6 +36,7 @@ import router from '@ohos.router' import { GetSyncData, UpdateTableByArray } from '../../utils/table/Operation' import { CurrentProjectConversion, DeductionProjectConversion, DetectingDifferences, GetCarStatus } from './utils' import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignalWorker' +import dayTs from '../../utils/Date' export interface GetSysSetResult { @@ -288,28 +289,7 @@ export class BaseJudge { return } that.avPlayer?.playAudio(['voice/exam_waiting.mp3'], judgeUI.singlePlay, async () => { - this.isUdpEnd = true - try { - if (!judgeUI.singlePlay) { - DifferentialAndSignal.sendMsg({ type: WorkerMessageDataType.JudgeSend, data: { - judgeUdpEnd: this.isUdpEnd, - judgeExamEnd: true, - performInfo: that.performInfo, - business: { - totalScore: that.judgeUI.totalScore, - kfArr: that.judgeUI.kfArr, - startTime: that.judgeUI.udpStartTIme, - xmmcSingleCode: that.xmmcSingleCode, - kmItems: that.kmItems, - examTime: that.judgeUI.examTime, - cdsbInfoObj: that.judgeUI.cdsbInfoObj!, - xmdm: that.xmdm, - xmxh: that.xmxh - } } }) - } - } catch (e) { - console.info(JudgeTag, JSON.stringify(e)) - } + if (judgeUI.singlePlay) { // 单机结束 await this.endExam(judgeUI, that) @@ -433,6 +413,29 @@ export class BaseJudge { throw new Error('End Loop') } }) + this.isUdpEnd = true + try { + if (!judgeUI.singlePlay) { + let startTime: Date = AppStorage.get("startTime") || new Date() + DifferentialAndSignal.sendMsg({ type: WorkerMessageDataType.JudgeSend, data: { + judgeUdpEnd: this.isUdpEnd, + judgeExamEnd: true, + performInfo: that.performInfo, + business: { + totalScore: that.judgeUI.totalScore, + kfArr: that.judgeUI.kfArr, + startTime: dayTs(startTime).format("HHmmssSSS"), + xmmcSingleCode: that.xmmcSingleCode, + kmItems: that.kmItems, + examTime: that.judgeUI.examTime, + cdsbInfoObj: that.judgeUI.cdsbInfoObj!, + xmdm: that.xmdm, + xmxh: that.xmxh + } } }) + } + } catch (e) { + console.info(JudgeTag, JSON.stringify(e)) + } } catch (e) { console.info(JudgeTag, JSON.stringify(e)) } @@ -441,6 +444,28 @@ export class BaseJudge { that.avPlayer?.playAudio([voiceURL], true, () => { setTimeout(() => { this.isUdpEnd = true + try { + if (!judgeUI.singlePlay) { + let startTime: Date = AppStorage.get("startTime") || new Date() + DifferentialAndSignal.sendMsg({ type: WorkerMessageDataType.JudgeSend, data: { + judgeUdpEnd: this.isUdpEnd, + judgeExamEnd: true, + performInfo: that.performInfo, + business: { + totalScore: that.judgeUI.totalScore, + kfArr: that.judgeUI.kfArr, + startTime: dayTs(startTime).format("HHmmssSSS"), + xmmcSingleCode: that.xmmcSingleCode, + kmItems: that.kmItems, + examTime: that.judgeUI.examTime, + cdsbInfoObj: that.judgeUI.cdsbInfoObj!, + xmdm: that.xmdm, + xmxh: that.xmxh + } } }) + } + } catch (e) { + console.info(JudgeTag, JSON.stringify(e)) + } dConsole.log(JudgeTag, "考试结束自动退出5") router.back(); }, param302 === "8" ? 3000 : 0) diff --git a/entry/src/main/ets/pages/Judge/JudgeBusiness.ets b/entry/src/main/ets/pages/Judge/JudgeBusiness.ets index f81f1f4..6c7a688 100644 --- a/entry/src/main/ets/pages/Judge/JudgeBusiness.ets +++ b/entry/src/main/ets/pages/Judge/JudgeBusiness.ets @@ -23,6 +23,7 @@ import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSigna import { PlcStrToJson, PlcStrToWXJson } from './utils' import { BaseJudgeImpl, SetJudgeItem } from './BaseJudgeBussines' import { JudgePage } from '../Judge' +import dayTs from '../../utils/Date' export default class JudgeBusiness { public mndgStr: string | undefined @@ -58,9 +59,8 @@ export default class JudgeBusiness { public plcData?: PLCType public totalScore: number = -1 public judgeUI: JudgePage - private tempData?: PLCType - // 是否发送udp private judgeBusiness: BaseJudgeImpl + private plc2Data?: string constructor(judgeUI: JudgePage) { this.judgeUI = judgeUI @@ -88,7 +88,6 @@ export default class JudgeBusiness { const msg: PLCType = JSON.parse(strArr[num]); num++ // 4.过程数据 - this.tempData = msg this.judgeUI.sd = Math.floor(msg?.gps?.sd * 1.852) + ''; this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + '' this.plcData = msg @@ -146,6 +145,9 @@ export default class JudgeBusiness { this.HandlePLCData(result.data as string) dConsole.writeProcessData(ProcessDataEnumType.PlcData, result.data as string) } + if (result.type === WorkerBackMessageType.ObtainUdpGps2Data) { + this.plc2Data = result.data as string + } } // 处理PLC数据 @@ -164,14 +166,13 @@ export default class JudgeBusiness { } // 记录原始PLC数据 dConsole.writeProcessData(ProcessDataEnumType.PlcData, msg) - const tempData = await PlcStrToJson(msg); + const tempData = await PlcStrToJson(msg, this.plc2Data); tempData.sensor.rmndg = this.rmndg; tempData.sensor.mndg = this.mndgStr || ""; const wuXiDataStr = await PlcStrToWXJson(msg) // 无锡所数据记录 dConsole.writeProcessData(ProcessDataEnumType.WuxiProgressData, wuXiDataStr) this.plcData = tempData - this.tempData = tempData this.plcStr = msg; this.mndgStr = ''; this.rmndg = 0; @@ -184,6 +185,7 @@ export default class JudgeBusiness { // dConsole.info("小红球过程数据1", this.judgeBusiness.getIsUdpEnd(), this.judgeUI.kfArr) + let startTime: Date = AppStorage.get("startTime") || new Date() DifferentialAndSignal.sendMsg({ type: WorkerMessageDataType.JudgeSend, data: { @@ -193,7 +195,7 @@ export default class JudgeBusiness { business: { totalScore: this.judgeUI.totalScore, kfArr: this.judgeUI.kfArr, - startTime: this.judgeUI.udpStartTIme, + startTime: dayTs(startTime).format("HHmmssSSS"), xmmcSingleCode: this.xmmcSingleCode, kmItems: this.kmItems, examTime: this.judgeUI.examTime, diff --git a/entry/src/main/ets/pages/Judge/LargeJudgeBusiness.ets b/entry/src/main/ets/pages/Judge/LargeJudgeBusiness.ets index 1ed88ef..ef53d82 100644 --- a/entry/src/main/ets/pages/Judge/LargeJudgeBusiness.ets +++ b/entry/src/main/ets/pages/Judge/LargeJudgeBusiness.ets @@ -1,9 +1,9 @@ import { JudgeConfig, JudgeTag } from '../../config'; import { + BaseInfoType, CAR_INFO, CarInfoType, CDSBInfo, - EnvironmentConfigurationType, ExaminerInfoType, ItemInfo, ItemInfos, @@ -21,7 +21,8 @@ import { ProjectInfos, RouteParamsType, SyssetConfig, - SYSTEM_PARAM + SYSTEM_PARAM, + EnvironmentConfigurationType } from '../../model'; import common from '@ohos.app.ability.common'; import { dConsole } from '../../utils/LogWorker'; @@ -44,6 +45,126 @@ export class LargeJudge extends BaseJudge implements BaseJudgeImpl { return super.getIsUdpEnd() } + private async GetJudgeBeginData(projects: Project[], carType: string, kssycs: string, isDdxk: boolean, ddxkTime: number, projectsCenterObj: Object, ddxkKsxmArr: string[], ddxkKfArr: string[], passingScore: number, wayno: number, name: string, lsh: string, idCard: string, isExam: boolean) { + const examinerInfo = AppStorage.get('examinerInfo') + const examinerName = examinerInfo?.name || "" + let currentParams: RouteParamsType = router.getParams() as RouteParamsType; + const sczb = currentParams.sczb; + const kfdm = currentParams.kfdm; + const ksxm: JudgeKSXM[] = projects.map(project => { + const temp: JudgeKSXM = { + xmdm: Number(project.projectCode), xmxh: '' + } + return temp + }) + const ykxm: number[] = (ddxkKsxmArr?.map(projectCenterCode => { + const currentProject: ProjectInfo = Reflect.get(projectsCenterObj, projectCenterCode) + return Number(currentProject.projectCode) + })) || []; + const kfxm: JudgeKFXM[] = isDdxk ? (ddxkKfArr?.map(kf => { + return { + xmdm: Number(kf.split(',')[0]), kfdm: kf.split(',')[1] + } as JudgeKFXM + })) : [] + const beginInfo: JudgeBeginObj = { + kgid: '012', + kgxm: decodeURI(examinerName || ''), + exam: isExam ? 1 : 0, + //是否回放 + replay: 0, + //生成的轨迹文件 + track: '', + xm: name, + sex: 0, + kslsh: lsh, + sfzmhm: idCard, + ksyy: '', + kscx: carType, + kkcs: Number(kssycs) || 2, + sfyk: 0, + ykkkcs: 1, + wayno: Number(wayno), + czlx: 0, + kskssj: await systemDateTime.getCurrentTime(), + passing: Number(passingScore), + ksxm, + //断点续考 + ddxk: isDdxk ? 1 : 0, + ddkssj: ddxkTime || 0, + ykxm, + kfxm, + yklc: 0, + special: [], + sczb: (sczb === undefined || sczb == '0') ? 0 : 1, + sczbkf: kfdm, + dmndg: this.mockLight, + mfxx: this.mode === 5, + zeng: this.mode === 3 || this.mode === 4 + } + dConsole.info(JudgeTag, '5.获取开始考试数据完成') + return beginInfo + }; + + private async GetJudgeInitData(context: common.UIAbilityContext, markRuleListObj: object, carType: string, carName: string, systemparmArr: SYSTEM_PARAM[], carinfoArr: CAR_INFO[], examSubject: string, itemInfoObj: ItemInfos, judgeConfig: SyssetConfig[], carlist: string, mapPointArr: MAPPOINT[], mapPointItemArr: MAPITEMPOINTITEM[]) { + const carInfo = AppStorage.get('carInfo'); + + let allitems: ItemInfo[] = []; + if (examSubject == '2' && itemInfoObj) { + const promiseItems = Reflect.ownKeys(itemInfoObj).map(async cdsbKey => { + const cdsb: CDSBInfo = Reflect.get(itemInfoObj, cdsbKey); + const model = await GetModelData(`/${cdsb.modelKey}.txt`, context); + const temp: ItemInfo = { + xmdm: cdsb?.xmdm || 0, + xmxh: cdsb?.xmxh || "", + model: model || "" + }; + return temp; + }); + // 等待所有的 Promise 解析完成 + allitems = await Promise.all(promiseItems); + } + + const mark: MarkRule[] = Object.values(markRuleListObj) + const initInfo: JudgeInitObj = { + sdkver: await examJudgeVersion(), + appver: AppStorage.get('EnvironmentConfigurationType')?.version || "", + kskm: Number(carInfo?.examSubject || "2"), + kchp: carInfo?.plateNo || "", + kchm: Number(carInfo?.carId || ""), + kscx: carType, + cxcode: '1', + name: carName, + carmodel: await GetModelData(`/${carType}.txt`, context) || "", + allitems, + iteminfo: [], + systemparm: systemparmArr, + mark, + sysset: judgeConfig, + itemInfoObj, + carlist: carlist, + carinfo: carinfoArr, + }; + let km3Config: Km3JudgeInitConfig = {} + if (examSubject == '3') { + km3Config = { + map_point: mapPointArr, + map_point_item: mapPointItemArr, + //科目三暂时为空 + iteminfo: [], + roads: await GetModelData('/Roads.txt', context) || "", + sharps: await GetModelData('/Sharps.txt', context) || "" + }; + initInfo.map_point = km3Config.map_point + initInfo.map_point_item = km3Config.map_point_item + initInfo.iteminfo = km3Config.iteminfo + initInfo.roads = km3Config.roads + initInfo.sharps = km3Config.sharps + } + // 获取科目三的评判配置 + dConsole.info(JudgeTag, '3.获取评判初始化数据完成') + return initInfo + }; + public async JudgeInit(judgeUI: JudgePage, that: JudgeBusiness): Promise { const systemParams = await GetSyncData('MA_SYSTEMPARM') let currentParams: RouteParamsType = router.getParams() as RouteParamsType; @@ -121,14 +242,14 @@ export class LargeJudge extends BaseJudge implements BaseJudgeImpl { } }) systemParams.forEach((systemParam) => { - // if (isTrajectoryOpen) { - // systemParam.no1 = systemParam.NO1; - // systemParam.no2 = systemParam.NO2; - // systemParam.no3 = systemParam.NO3; - // systemParam.txt1 = systemParam.TXT1; - // systemParam.txt2 = systemParam.TXT2; - // systemParam.txt3 = systemParam.TXT3; - // } + if (JudgeConfig.isTrajectoryOpen) { + systemParam.no1 = systemParam.NO1!.toString()!; + systemParam.no2 = systemParam.NO2!.toString()!; + systemParam.no3 = systemParam.NO3!.toString()!; + systemParam.txt1 = systemParam.TXT1!; + systemParam.txt2 = systemParam.TXT2!; + systemParam.txt3 = systemParam.TXT3!; + } const no1 = systemParam.no1; const no2 = systemParam.no2; const no3 = systemParam.no3; @@ -344,128 +465,5 @@ export class LargeJudge extends BaseJudge implements BaseJudgeImpl { super.judgeEnd(judgeUI, that, isManual) }; - private async GetJudgeBeginData(projects: Project[], carType: string, kssycs: string, isDdxk: boolean, ddxkTime: number, projectsCenterObj: Object, ddxkKsxmArr: string[], ddxkKfArr: string[], passingScore: number, wayno: number, name: string, lsh: string, idCard: string, isExam: boolean) { - const examinerInfo = AppStorage.get('examinerInfo') - const examinerName = examinerInfo?.name || "" - let currentParams: RouteParamsType = router.getParams() as RouteParamsType; - const sczb = currentParams.sczb; - const kfdm = currentParams.kfdm; - const ksxm: JudgeKSXM[] = projects.map(project => { - const temp: JudgeKSXM = { - xmdm: Number(project.projectCode), xmxh: '' - } - return temp - }) - const ykxm: number[] = (ddxkKsxmArr?.map(projectCenterCode => { - const currentProject: ProjectInfo = Reflect.get(projectsCenterObj, projectCenterCode) - return Number(currentProject.projectCode) - })) || []; - const kfxm: JudgeKFXM[] = isDdxk ? (ddxkKfArr?.map(kf => { - return { - xmdm: Number(kf.split(',')[0]), kfdm: kf.split(',')[1] - } as JudgeKFXM - })) : [] - const beginInfo: JudgeBeginObj = { - kgid: '012', - kgxm: decodeURI(examinerName || ''), - exam: isExam ? 1 : 0, - //是否回放 - replay: 0, - //生成的轨迹文件 - track: '', - xm: name, - sex: 0, - kslsh: lsh, - sfzmhm: idCard, - ksyy: '', - kscx: carType, - kkcs: Number(kssycs) || 2, - sfyk: 0, - ykkkcs: 1, - wayno: Number(wayno), - czlx: 0, - kskssj: await systemDateTime.getCurrentTime(), - passing: Number(passingScore), - ksxm, - //断点续考 - ddxk: isDdxk ? 1 : 0, - ddkssj: ddxkTime || 0, - ykxm, - kfxm, - yklc: 0, - special: [], - sczb: (sczb === undefined || sczb == '0') ? 0 : 1, - sczbkf: kfdm, - dmndg: this.mockLight, - mfxx: this.mode === 5, - mfxxn: this.mode === 3 || this.mode === 4 - } - dConsole.info(JudgeTag, '5.获取开始考试数据完成') - return beginInfo - }; - private async GetJudgeInitData(context: common.UIAbilityContext, markRuleListObj: object, carType: string, carName: string, systemparmArr: SYSTEM_PARAM[], carinfoArr: CAR_INFO[], examSubject: string, itemInfoObj: ItemInfos, judgeConfig: SyssetConfig[], carlist: string, mapPointArr: MAPPOINT[], mapPointItemArr: MAPITEMPOINTITEM[]) { - const carInfo = AppStorage.get('carInfo'); - const examType = carInfo?.examSubject == '2' ? 'km2' : 'km3' - - let allitems: ItemInfo[] = []; - if (examSubject == '2' && itemInfoObj) { - const promiseItems = Reflect.ownKeys(itemInfoObj).map(async cdsbKey => { - const cdsb: CDSBInfo = Reflect.get(itemInfoObj, cdsbKey); - const model = await GetModelData(`/${cdsb.modelKey}.txt`, context); - const temp: ItemInfo = { - xmdm: cdsb?.xmdm || 0, - xmxh: cdsb?.xmxh || "", - model: model || "" - }; - return temp; - }); - // 等待所有的 Promise 解析完成 - allitems = await Promise.all(promiseItems); - } - - //获取版本号 - const mark: MarkRule[] = Reflect.ownKeys(markRuleListObj).map(ruleKey => { - const current: MarkRule = Reflect.get(markRuleListObj, ruleKey) - return current - }) - const initInfo: JudgeInitObj = { - sdkver: await examJudgeVersion(), - appver: AppStorage.get('EnvironmentConfigurationType')?.version || "", - kskm: Number(carInfo?.examSubject || "2"), - kchp: carInfo?.plateNo || "", - kchm: Number(carInfo?.carId || ""), - kscx: carType, - cxcode: '1', - name: carName, - carmodel: await GetModelData(`/${carType}.txt`, context) || "", - allitems, - iteminfo: [], - systemparm: systemparmArr, - mark, - sysset: judgeConfig, - itemInfoObj, - carlist: carlist, - carinfo: carinfoArr, - }; - let km3Config: Km3JudgeInitConfig = {} - if (examSubject == '3') { - km3Config = { - map_point: mapPointArr, - map_point_item: mapPointItemArr, - //科目三暂时为空 - iteminfo: [], - roads: await GetModelData('/Roads.txt', context) || "", - sharps: await GetModelData('/Sharps.txt', context) || "" - }; - initInfo.map_point = km3Config.map_point - initInfo.map_point_item = km3Config.map_point_item - initInfo.iteminfo = km3Config.iteminfo - initInfo.roads = km3Config.roads - initInfo.sharps = km3Config.sharps - } - // 获取科目三的评判配置 - dConsole.info(JudgeTag, '3.获取评判初始化数据完成') - return initInfo - }; } \ No newline at end of file diff --git a/entry/src/main/ets/pages/Judge/SmallJudgeBusiness.ets b/entry/src/main/ets/pages/Judge/SmallJudgeBusiness.ets index 45769da..0b8da64 100644 --- a/entry/src/main/ets/pages/Judge/SmallJudgeBusiness.ets +++ b/entry/src/main/ets/pages/Judge/SmallJudgeBusiness.ets @@ -94,7 +94,7 @@ export class SmallJudge extends BaseJudge implements BaseJudgeImpl { sczbkf: kfdm, dmndg: false, mfxx: false, - mfxxn: false + zeng: false } dConsole.info(JudgeTag, '5.获取开始考试数据完成') return beginInfo @@ -102,7 +102,6 @@ export class SmallJudge extends BaseJudge implements BaseJudgeImpl { public async GetJudgeInitData(context: common.UIAbilityContext, markRuleListObj: object, carType: string, carName: string, systemparmArr: SYSTEM_PARAM[], carinfoArr: CAR_INFO[], examSubject: string, itemInfoObj: ItemInfos, judgeConfig: SyssetConfig[], carlist: string, mapPointArr: MAPPOINT[], mapPointItemArr: MAPITEMPOINTITEM[]) { const carInfo = AppStorage.get('carInfo'); - const examType = carInfo?.examSubject == '2' ? 'km2' : 'km3' dConsole.log(JudgeTag, "itemInfoObj", itemInfoObj) let allitems: ItemInfo[] = []; if (examSubject == '2' && itemInfoObj) { @@ -121,11 +120,6 @@ export class SmallJudge extends BaseJudge implements BaseJudgeImpl { allitems = await Promise.all(promiseItems); } - //获取版本号 - // const mark: MarkRule[] = Reflect.ownKeys(markRuleListObj).map(ruleKey => { - // const current: MarkRule = Reflect.get(markRuleListObj, ruleKey) - // return current - // }) const mark: MarkRule[] = Object.values(markRuleListObj) const initInfo: JudgeInitObj = { sdkver: await examJudgeVersion(), @@ -329,7 +323,6 @@ export class SmallJudge extends BaseJudge implements BaseJudgeImpl { } public async JudgeEnd(judgeUI: JudgePage, that: JudgeBusiness, isManual?: boolean) { - dConsole.info(JudgeTag, '收到远程结束考试消息2') super.judgeEnd(judgeUI, that, isManual) }; } diff --git a/entry/src/main/ets/pages/Judge/utils.ets b/entry/src/main/ets/pages/Judge/utils.ets index 406671d..7be5310 100644 --- a/entry/src/main/ets/pages/Judge/utils.ets +++ b/entry/src/main/ets/pages/Judge/utils.ets @@ -468,8 +468,9 @@ export function UploadRegulatoryCodeConversion( /** * 将PLC字符串转换为JSON对象 */ -export const PlcStrToJson = async (plc: string) => { +export const PlcStrToJson = async (plc: string, plc2?: string) => { const plcArr = plc.split(',') + const plc2Arr = plc2?.split(",") || [] const p = plcArr.map((val, key) => { if (key !== 27 && key !== 92) { return Number(val); @@ -477,6 +478,16 @@ export const PlcStrToJson = async (plc: string) => { return 0; // 或者返回 undefined,根据需求选择 } }); + let gps2p: number[] = [] + if (plc2) { + gps2p = plc2Arr.map((val, key) => { + if (key !== 27 && key !== 92) { + return Number(val); + } else { + return 0; // 或者返回 undefined,根据需求选择 + } + }); + } const time = await systemTime.getCurrentTime() const gps2: Gps = TestRealExam.gps2 const radar: Radar = TestRealExam.radar @@ -553,7 +564,30 @@ export const PlcStrToJson = async (plc: string) => { // 角度搜星数 jdsxs: Number(plcArr[92].split('-')[1]) || 0 }, - gps2: gps2, + gps2: plc2 ? { + //办卡类型 定位差分状态 + bklx: gps2p[56], + dwzt: gps2p[83], + // 角度差分状态 + jdzt: Number(plc2Arr[92].split('-')[0]), + //gps数据 + //gps时间 经度 纬度 航向角 俯仰角 海拔高 高度差 速度 + sj: time, + jd: gps2p[96], + wd: gps2p[95], + hxj: gps2p[90], + fyj: gps2p[91], + hbg: gps2p[85], + gdc: gps2p[86], + sd: gps2p[97], + //龄期 经度因子 纬度因子 定位搜星数 + age: gps2p[87], + jdyz: gps2p[89], + wdyz: gps2p[88], + dwsxs: gps2p[84] || 0, + // 角度搜星数 + jdsxs: Number(plc2Arr[92].split('-')[1]) || 0 + } : gps2, vision, radar, extend diff --git a/entry/src/main/ets/pages/TerminalInfo.ets b/entry/src/main/ets/pages/TerminalInfo.ets index f2b5b47..185228c 100644 --- a/entry/src/main/ets/pages/TerminalInfo.ets +++ b/entry/src/main/ets/pages/TerminalInfo.ets @@ -93,6 +93,15 @@ struct TerminalInfoPage { this.config.udpOppositeIp = value; } }) + if (this.config.carType === "4") { + blockComponent({ + label: "后置机2IP", + value: this.config.udpOppositeIpTwo, + change: (value: string) => { + this.config.udpOppositeIpTwo = value; + } + }) + } blockComponent({ label: "后置机响应端口", value: this.config.udpOppositeIpPort, @@ -102,7 +111,7 @@ struct TerminalInfoPage { }) if (this.config.carType === "4") { blockComponent({ - label: "后置机响应端口2", + label: "后置机2响应端口", value: this.config.udpOppositeIpPortTwo, change: (value: string) => { this.config.udpOppositeIpPortTwo = value; diff --git a/entry/src/main/ets/pages/UserInfo.ets b/entry/src/main/ets/pages/UserInfo.ets index 21fedef..69fcfc0 100644 --- a/entry/src/main/ets/pages/UserInfo.ets +++ b/entry/src/main/ets/pages/UserInfo.ets @@ -987,6 +987,8 @@ struct UserInfoPage { this.startExamDialogController.close() return { code: -200 } } + let startTime = new Date() + AppStorage.setOrCreate("startTime", startTime) const drvexam: DrvexamType = { lsh: this.currentUser.lsh, kskm: this.carInfo.examSubject, @@ -995,7 +997,7 @@ struct UserInfoPage { ksysfzmhm: this.currentUser.ksy1sfzmhm || '', ksxl: this.currentUser.xldm, zp: photoBase64, - kssj: dayTs().format("YYYY-MM-DD HH:mm:ss") || '', + kssj: dayTs(startTime).format("YYYY-MM-DD HH:mm:ss") || '', kchp: decodeURI(this.carInfo.plateNo || ""), Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || '' } diff --git a/entry/src/main/ets/utils/business/JudgeUdpBusiness.ets b/entry/src/main/ets/utils/business/JudgeUdpBusiness.ets index d64e418..f3d4426 100644 --- a/entry/src/main/ets/utils/business/JudgeUdpBusiness.ets +++ b/entry/src/main/ets/utils/business/JudgeUdpBusiness.ets @@ -45,8 +45,7 @@ class JudgeUdpBusiness { return JudgeUdpBusiness.instance } - async getMessageHeartbeat(msg: string): Promise { - // dConsole.info(Tag, msg, this.lsh) + async getMessageHeartbeat(msg: string, gps2?: string): Promise { if (!this.business || !this.performInfo) { return this.getOBDMessageHeart(msg) } @@ -60,6 +59,7 @@ class JudgeUdpBusiness { const ascsbxhArr = StringToASCII(this.getSbxh(this.business.xmdm, this.business.xmxh)) const plcData = await this.getPlcData(msg); + const plc2Data = await this.getPlcData(gps2 || "") let param: number[] = [plcData.sensor.zfxd, plcData.sensor.yfxd, plcData.sensor.shtd, plcData.sensor.ygd, plcData.sensor.jgd, plcData.sensor.skd, plcData.sensor.dh1, plcData.sensor.dh2, plcData.sensor.lhq, plcData.sensor.jsc, plcData.sensor.ssc, plcData.sensor.fsc, plcData.sensor.lb, plcData.sensor.mkg, plcData.sensor.aqd] .concat(GetDwStatusType(plcData.sensor.dw)) .concat([0, 0, plcData.sensor.ygq, plcData.sensor.wd, 0]) @@ -67,6 +67,13 @@ class JudgeUdpBusiness { const translateProject = this.getTranslateProject(1); const translateJd = Number(this.convertGpsCoord2(plcData.gps.wd).toFixed(gpsDigit)) * Math.pow(10, gpsDigit); const translateWd = Number(this.convertGpsCoord2(plcData.gps.jd).toFixed(gpsDigit)) * Math.pow(10, gpsDigit) + let translateGps2Jd: number = 0 + let translateGps2Wd: number = 0 + if (gps2) { + translateGps2Jd = Number(this.convertGpsCoord2(plc2Data.gps.wd).toFixed(gpsDigit)) * Math.pow(10, gpsDigit); + translateGps2Wd = Number(this.convertGpsCoord2(plc2Data.gps.jd).toFixed(gpsDigit)) * Math.pow(10, gpsDigit) + } + const translateProjects = translateProject.map(numStr => NumberToByteArray(parseInt(numStr, 2), 8)[0]) let tempSd = Number((plcData.gps.sd * 1.852).toFixed(0)) if (tempSd < 1) { @@ -114,10 +121,13 @@ class JudgeUdpBusiness { NumberToByteArray(this.business.kfArr.length, 8), //n个扣分序号 this.business.kfArr.map(kf => NumberToByteArray(kf.kfxh!, 8)[0]), + + //牵引车第二gps精度、纬度 - NumberToByteArray(0, 4 * 8), NumberToByteArray(0, 4 * 8), + NumberToByteArray(translateGps2Jd, 4 * 8), + NumberToByteArray(translateGps2Wd, 4 * 8), //牵引车第二航向角 - NumberToByteArray(0, 2 * 8), + NumberToByteArray(plc2Data?.gps?.hxj || 0, 2 * 8), //摩托压线 Byte[20], NumberToByteArray(0, 20 * 8), //考试用时 diff --git a/entry/src/main/ets/utils/business/ObtainUdpBusiness.ets b/entry/src/main/ets/utils/business/ObtainUdpBusiness.ets index 16d2862..460bca1 100644 --- a/entry/src/main/ets/utils/business/ObtainUdpBusiness.ets +++ b/entry/src/main/ets/utils/business/ObtainUdpBusiness.ets @@ -6,14 +6,17 @@ import UdpClient from '../UdpUtils' class ObtainUdpBusiness { // 三代机UDP private thirdGenerationMachineUdp?: UdpClient + private thirdGenerationMachineUdpGps2?: UdpClient // 几代机 private modelNo: string = "3" + private config?: EnvironmentConfigurationType constructor() { this.modelNo = GlobalConfig.modelNo || "" } init(config: EnvironmentConfigurationType) { + this.config = config switch (this.modelNo) { case "0": this.initSecondaryBoard() @@ -52,6 +55,25 @@ class ObtainUdpBusiness { } } + onGps2Msg(callback: (data: string) => void) { + switch (this.modelNo) { + case "0": + this.onSecondaryBoardMsg(callback) + break + case "1": + this.onFirstGenerationMsg(callback) + break + case "2": + this.onSecondGenerationMsg(callback) + break + case "3": + this.onThirdGenerationGps2Msg(callback) + break + default: + break + } + } + offMsg(cb: Function) { switch (this.modelNo) { case "0": @@ -61,7 +83,23 @@ class ObtainUdpBusiness { case "2": break case "3": - this.thirdGenerationMachineUdp!.offMsg(cb) + this.thirdGenerationMachineUdpGps2!.offMsg(cb) + break + default: + break + } + } + + offGps2Msg(cb: Function) { + switch (this.modelNo) { + case "0": + break + case "1": + break + case "2": + break + case "3": + this.thirdGenerationMachineUdpGps2!.offMsg(cb) break default: break @@ -99,6 +137,7 @@ class ObtainUdpBusiness { break case "3": this.thirdGenerationMachineUdp!.close() + this.thirdGenerationMachineUdpGps2?.close() break default: break @@ -120,8 +159,6 @@ class ObtainUdpBusiness { // 三代机udp初始化 private initThirdGeneration(config: EnvironmentConfigurationType) { try { - // let config: EnvironmentConfigurationType = - // AppStorage.get("EnvironmentConfiguration")! console.log("获取udp设置", JSON.stringify(config)) this.thirdGenerationMachineUdp = new UdpClient() this.thirdGenerationMachineUdp.create(config.udplocalIp!, config.udplocalIpPort!, config.udpOppositeIp!, @@ -130,6 +167,11 @@ class ObtainUdpBusiness { } catch (e) { console.error(UDPTag, "三代机 udp失败") } + if (config.carType === "4") { + this.thirdGenerationMachineUdpGps2 = new UdpClient() + this.thirdGenerationMachineUdpGps2.create(config.udplocalIp!, config.udplocalIpPortTwo!, config.udpOppositeIpTwo!, config.udpOppositeIpPortTwo!) + this.thirdGenerationMachineUdpGps2.setDealMethod(this.dealThirdGenerationMsg) + } } private dealSecondaryBoardMsg() { @@ -176,6 +218,10 @@ class ObtainUdpBusiness { this.thirdGenerationMachineUdp!.onMsg(cb) } + private onThirdGenerationGps2Msg(cb: Function) { + this.thirdGenerationMachineUdpGps2!.onMsg(cb) + } + private sendSecondaryBoardMsg(data: string | ArrayBuffer) { } @@ -190,6 +236,9 @@ class ObtainUdpBusiness { private sendThirdGenerationMsg(data: string | ArrayBuffer) { this.thirdGenerationMachineUdp!.sendMsg(data) + if (this.config?.carType === '4') { + this.thirdGenerationMachineUdpGps2!.sendMsg(data) + } } } diff --git a/entry/src/main/ets/workers/DifferentialCorrection.ets b/entry/src/main/ets/workers/DifferentialCorrection.ets index acdb7f7..1636201 100644 --- a/entry/src/main/ets/workers/DifferentialCorrection.ets +++ b/entry/src/main/ets/workers/DifferentialCorrection.ets @@ -29,6 +29,7 @@ let udpLsh = 1 let udpIndex = 0 let kfDirective: number | undefined = undefined let signNum: number = 0 +let gps2: string | undefined = undefined function checkLsh() { let now = dayTs(new Date()).format().split(" ")[0] @@ -88,6 +89,9 @@ workerPort.onmessage = async (e: MessageEvents) => { // 初始化函数 function initFn(result: InitData) { + if (result.config?.carType === '4') { + + } // 初始化差分校正TCP DifferentialSignal.init(result.config!); // 定时发送TCP消息 @@ -136,7 +140,7 @@ function getDataFn(config: EnvironmentConfigurationType) { } if (udpIndex % 5 === 0) { checkLsh() - let byte = await JudgeUdpBusinessInstance.getMessageHeartbeat(data) + let byte = await JudgeUdpBusinessInstance.getMessageHeartbeat(data, gps2) JudgeUdpBusinessInstance.sendData(byte, udpLsh) } udpIndex++ @@ -148,6 +152,28 @@ function getDataFn(config: EnvironmentConfigurationType) { } as WorkerBackMessage)) } }) + if (config.carType === '4') { + ObtainUdpBusinessInstance.onGps2Msg(async (data: string) => { + if (data !== "" && config.carType !== "2") { + try { + const res = await SerialPortService.getData() + if (res.length > 0) { + const dataArray = data.split(","); + dataArray[28] = res[9].toString(); + data = dataArray.join(","); + } + } catch (err) { + console.error(SerialPortTag, "获取档位信号失败", err) + } + gps2 = data + workerPort.postMessage( + JSON.stringify({ + type: WorkerBackMessageType.ObtainUdpGps2Data, + data: data + } as WorkerBackMessage)) + } + }) + } // 中心UDP回执消息 CenterUDPBusinessInstance.onMsg((data: CenterCallBackMsgType) => { // TODO diff --git a/oh-package-lock.json5 b/oh-package-lock.json5 index b959024..f76874c 100644 --- a/oh-package-lock.json5 +++ b/oh-package-lock.json5 @@ -1,20 +1,18 @@ { - "lockfileVersion": 2, + "lockfileVersion": 1, "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", "specifiers": { - "@ohos/hypium@1.0.19": "@ohos/hypium@1.0.19", - "@ohos/crypto-js@2.0.3": "@ohos/crypto-js@2.0.3" + "@ohos/crypto-js@2.0.3": "@ohos/crypto-js@2.0.3", + "@ohos/hypium@1.0.19": "@ohos/hypium@1.0.19" }, "packages": { - "@ohos/hypium@1.0.19": { - "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.19.har", - "integrity": "sha512-cEjDgLFCm3cWZDeRXk7agBUkPqjWxUo6AQeiu0gEkb3J8ESqlduQLSIXeo3cCsm8U/asL7iKjF85ZyOuufAGSQ==", - "registryType": "ohpm" - }, "@ohos/crypto-js@2.0.3": { "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/crypto-js/-/crypto-js-2.0.3.har", - "integrity": "sha512-LuHaR1kD5PxnOXnuR1fWvPwGtbed9Q/QGzk6JOh8y5Wdzvi8brPesODZiaWf9scOVRHsbTPOtZw91vWB35p1vQ==", - "registryType": "ohpm" + "integrity": "sha512-LuHaR1kD5PxnOXnuR1fWvPwGtbed9Q/QGzk6JOh8y5Wdzvi8brPesODZiaWf9scOVRHsbTPOtZw91vWB35p1vQ==" + }, + "@ohos/hypium@1.0.19": { + "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.19.har", + "integrity": "sha512-cEjDgLFCm3cWZDeRXk7agBUkPqjWxUo6AQeiu0gEkb3J8ESqlduQLSIXeo3cCsm8U/asL7iKjF85ZyOuufAGSQ==" } } } \ No newline at end of file