From 575d38f2fa4ce95847aba363957a5476cca6689a Mon Sep 17 00:00:00 2001 From: wangzhongjie Date: Tue, 19 Aug 2025 15:12:17 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E8=AF=84=E5=88=A4?= =?UTF-8?q?=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/ets/pages/Index.ets | 2 + .../main/ets/pages/Judge/JudgeBusiness.ets | 8 +- entry/src/main/ets/pages/Judge/JudgeIng.ets | 70 ++-- .../main/ets/pages/Judge/JudgeVariable.ets | 28 -- .../ets/pages/Judge/ProcessDataTaskPool.ets | 26 +- entry/src/main/ets/pages/Judge/utils.ets | 27 ++ .../ets/pages/compontents/TrajectoryView.ets | 6 +- entry/src/main/ets/pages/judgeSDK/judge.ets | 381 +++++++++--------- 8 files changed, 273 insertions(+), 275 deletions(-) delete mode 100644 entry/src/main/ets/pages/Judge/JudgeVariable.ets diff --git a/entry/src/main/ets/pages/Index.ets b/entry/src/main/ets/pages/Index.ets index c4769a5..d5ec638 100644 --- a/entry/src/main/ets/pages/Index.ets +++ b/entry/src/main/ets/pages/Index.ets @@ -39,6 +39,7 @@ struct Index { @State num: number = 0; @State isPlay: boolean = false; @State initWork: boolean = false + @State status: string = "开始" // 请求网络表等待弹窗 customDialogController: CustomDialogController = new CustomDialogController({ builder: CarLoadingComponent(), @@ -216,6 +217,7 @@ struct Index { HeaderComponent({ shortLogo: false }) + CardComponent({ isSingle: this.singlePlay, singleClick: () => { diff --git a/entry/src/main/ets/pages/Judge/JudgeBusiness.ets b/entry/src/main/ets/pages/Judge/JudgeBusiness.ets index b24bafb..528dd48 100644 --- a/entry/src/main/ets/pages/Judge/JudgeBusiness.ets +++ b/entry/src/main/ets/pages/Judge/JudgeBusiness.ets @@ -1,7 +1,9 @@ import { JudgeConfigObjKmItems, + JudgeKSJS, JudgePerformInfo, JudgeUI, + LANE, MarkRule, PLCType, ProcessDataEnumType, @@ -41,6 +43,9 @@ export default class JudgeBusiness { //所有的科目考试项目(大车&小车) public kmItems: JudgeConfigObjKmItems public xmmcStr: string = "" + public lane: LANE = { + road: '', num: 0, count: 0 + } public xmmcCode: string = "" public xmmcSingleCode: string = "" public xmmcEndCode?: string @@ -48,12 +53,13 @@ export default class JudgeBusiness { public xmxh: string = "" public kfArr?: MarkRule[] public carztStr: string + public ksjs?: JudgeKSJS + public mndgStr: string | undefined private judgeUI: JudgeUI private tempData?: PLCType private plcData?: PLCType // 是否发送udp private isUdpEnd: boolean = false - private mndgStr: string | undefined constructor(judgeUI: JudgeUI) { this.judgeUI = judgeUI diff --git a/entry/src/main/ets/pages/Judge/JudgeIng.ets b/entry/src/main/ets/pages/Judge/JudgeIng.ets index a4a8329..0ee9a29 100644 --- a/entry/src/main/ets/pages/Judge/JudgeIng.ets +++ b/entry/src/main/ets/pages/Judge/JudgeIng.ets @@ -3,7 +3,7 @@ import { JudgeCallBackData, JudgeUI, KmItem, MarkRule, ProcessDataEnumType, Proj import { dConsole } from '../../utils/LogWorker'; import JudgeBusiness from './JudgeBusiness'; import { examJudgeArtificialItem } from './JudgeSDKUtils'; -import { CurrentProjectConversion, DeductionProjectConversion } from './utils'; +import { CurrentProjectConversion, DeductionProjectConversion, GetCarStatus } from './utils'; export const JudgingFn = async (strData: string, callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) => { let examData: JudgeCallBackData = JSON.parse(strData); @@ -26,13 +26,9 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju const isManualProjectIn = artSubject3ProjectsCodesArr.includes(xmdm); const examSubject = judgeUI.examSubject const judgeConfigObj = judgeUI.judgeConfigObj - let project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm) - const xmmcCode = project.projectCodeCenter || ""; - const kmItem: KmItem = Reflect.get(that.kmItems, xmmcCode) - switch (event) { - // 项目开始 - case 1: + case 1: { + const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm) project.type = '2'; if (isManualProjectIn) { //手动项目是否在进行中 @@ -43,7 +39,9 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju } judgeUI.currentXmdm = xmdm; const xmmcStr = project.name || ""; + const xmmcCode = project.projectCodeCenter || ""; const xmmcSingleCode = project.projectCode || ""; + const kmItem: KmItem = Reflect.get(that.kmItems, xmmcCode) kmItem.status = 2; that.xmmcStr = xmmcStr; that.xmmcCode = xmmcCode; @@ -55,10 +53,11 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju Reflect.set(judgeUI.projectsObj, xmdm, project) Reflect.set(that.kmItems, xmmcCode || 0, kmItem) break; - // 项目结束 - case 2: + } + case 2: { + const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm) + const xmmcCode = project.projectCodeCenter || ""; project.type = (xmjs.xmhg === 0 ? '4' : '3') - //计算项目是否全部结束 judgeUI.isProjectIn = (Reflect.ownKeys(judgeUI.projectsObj).filter((projectKey) => { const fillProject: ProjectInfo = Reflect.get(judgeUI.projectsObj, projectKey) return fillProject.type == '2' @@ -66,8 +65,9 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju if (isManualProjectIn) { judgeUI.isManualProjectIn = false } + const kmItem: KmItem = Reflect.get(that.kmItems, xmmcCode) kmItem.status = 3; - //统计必考项目数量 + //统计必考项目数量 that.xmmcStr = '无'; that.xmmcCode = ''; that.xmdm = ''; @@ -75,8 +75,8 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju Reflect.set(judgeUI.projectsObj, xmdm, project) Reflect.set(that.kmItems, xmmcCode, kmItem) break; - // 扣分 - case 3: + } + case 3: { const thisKf = DeductionProjectConversion(`${kf.xmdm}_${kf.kfdm}`, judgeUI.markRuleListObj) const kfObj: MarkRule = { //扣分项目名称 @@ -103,34 +103,24 @@ export const JudgingFn = async (strData: string, callBack: Function, judgeUI: Ju project.type = (type == '3' || type == '4') ? '4' : '5' Reflect.set(judgeUI.projectsObj, kf.xmdm, project) } + } + case 4: { + that.carztStr = GetCarStatus(carzt); break; - // 考试状态 - case 4: - break; - // 考试结束 - case 5: - break; - // 项目取消 - case 6: - break; - // 语音播报和提示 - case 7: - break; - // 模拟灯光事件 - case 8: - break; - // 车道和路段变化 - case 9: - break; - // 预进项目事件 - case 10: - break; - // 差分事件 - case 11: - break; - default: - 83 - break; + } + case 5: { + + } + case 6: { + + } + case 7: { + + } + } + + // 考车状态 + if (event === 4) { } await callBack({ //项目名称 考车状态 扣分arr diff --git a/entry/src/main/ets/pages/Judge/JudgeVariable.ets b/entry/src/main/ets/pages/Judge/JudgeVariable.ets deleted file mode 100644 index fb241fa..0000000 --- a/entry/src/main/ets/pages/Judge/JudgeVariable.ets +++ /dev/null @@ -1,28 +0,0 @@ -import { testKm2Items, testKm3Items } from '../../mock'; -import { JudgeConfigObjKmItems, ProjectInfo, ProjectInfos } from '../../model'; - -class judgeVariable { - public rmndg: 0 | 1 = 0 - public kmItems: JudgeConfigObjKmItems = {} - public xmmcStr: string = "" - public xmmcEndCode?: string = "" - public xmxh: string = "" - public status: string = "开始" - - constructor() { - - } - - public initKmItems(examSubject: string, projectsCenterObj: ProjectInfos) { - (examSubject == '2' ? testKm2Items : testKm3Items).forEach(item => { - const projectCenterObj: ProjectInfo = Reflect.get(projectsCenterObj, item.code) - Reflect.set(this.kmItems, item.code, { - code: item.code, - status: projectCenterObj === undefined ? 0 : (projectCenterObj.isEnd ? 3 : 1) - }) - }) - - } -} - -export const JudgeVariable = new judgeVariable(); \ No newline at end of file diff --git a/entry/src/main/ets/pages/Judge/ProcessDataTaskPool.ets b/entry/src/main/ets/pages/Judge/ProcessDataTaskPool.ets index a9ced7b..a7ac838 100644 --- a/entry/src/main/ets/pages/Judge/ProcessDataTaskPool.ets +++ b/entry/src/main/ets/pages/Judge/ProcessDataTaskPool.ets @@ -11,7 +11,7 @@ export class ProcessDataTaskPool { private readonly maxRetries = 5; public addTask(dataItem: RegulatoryInterfaceParams): void { - console.info(`[Queue] 新任务已添加: ${JSON.stringify(dataItem)},当前队列长度: ${this.queue.length + 1}`); + dConsole.log(`[Queue] 新任务已添加: ${JSON.stringify(dataItem)},当前队列长度: ${this.queue.length + 1}`); this.queue.push(dataItem); // 将任务添加到队尾 this.triggerProcessing(); // 尝试启动处理流程 } @@ -22,7 +22,7 @@ export class ProcessDataTaskPool { */ private triggerProcessing(): void { if (this.isProcessing) { - console.log('[Queue] 处理器正在运行中,新任务将在稍后被处理。'); + dConsole.log('[Queue] 处理器正在运行中,新任务将在稍后被处理。'); return; // 如果已经在处理,则直接返回,新任务会被正在运行的循环消费掉 } // 使用 Promise.resolve().then() 来确保 processQueue 在下一个事件循环中异步执行 @@ -32,13 +32,13 @@ export class ProcessDataTaskPool { private async processQueue(): Promise { this.isProcessing = true; - console.log(`[Queue] 启动处理器... 待处理任务数: ${this.queue.length}`); + dConsole.log(`[Queue] 启动处理器... 待处理任务数: ${this.queue.length}`); while (this.queue.length > 0) { const taskData = this.queue[0]; // 查看队首任务 try { - console.log(`[Queue] 开始处理任务: ${JSON.stringify(taskData)}`); + dConsole.log(`[Queue] 开始处理任务: ${JSON.stringify(taskData)}`); // 此方法若成功则正常返回,若永久失败则会抛出错误 let obj: WuxiExamType = { xtlb: taskData.xtlb, @@ -52,11 +52,11 @@ export class ProcessDataTaskPool { await this.processSingleTaskWithRetries(taskData); // 任务成功,将其从队列中移除 this.queue.shift(); - console.log(`[Queue] ✅ 任务处理成功,已从队列移除。剩余任务: ${this.queue.length}`); + dConsole.log(`[Queue] ✅ 任务处理成功,已从队列移除。剩余任务: ${this.queue.length}`); } catch (error) { // 捕获到永久失败的错误 - console.error(`[Queue] 🔥 致命错误: ${(error as Error).message}`); - console.error('[Queue] 队列已停止,后续任务将不会被处理。'); + dConsole.error(`[Queue] 🔥 致命错误: ${(error as Error).message}`); + dConsole.error('[Queue] 队列已停止,后续任务将不会被处理。'); // (可选)可以在此处清空队列,防止下次意外启动时处理旧任务 this.queue = []; @@ -67,7 +67,7 @@ export class ProcessDataTaskPool { } this.isProcessing = false; - console.log('[Queue] 处理器已停止。'); + dConsole.log('[Queue] 处理器已停止。'); } private async processSingleTaskWithRetries(taskData: RegulatoryInterfaceParams): Promise { @@ -76,16 +76,16 @@ export class ProcessDataTaskPool { const attemptNum = attempt + 1; try { const attemptType = attempt === 0 ? '初次尝试' : `重试 ${attempt}`; - console.log(`[Queue] 开始上传 (${attemptType}, 总共第 ${attemptNum} 次): ${JSON.stringify(taskData)}`); + dConsole.log(`[Queue] 开始上传 (${attemptType}, 总共第 ${attemptNum} 次): ${JSON.stringify(taskData)}`); const result: WR = await taskpool.execute(uploadWorkerTask, taskData); dConsole.writeProcessData(ProcessDataEnumType.WuxiExam, JSON.stringify(result)) if (result.code === 1) { - console.log(`[Queue] ✔️ 上传成功 (在第 ${attemptNum} 次尝试)`); + dConsole.log(`[Queue] ✔️ 上传成功 (在第 ${attemptNum} 次尝试)`); return; // 成功,立即返回 } - console.warn(`[Queue] ❌ 上传失败 (第 ${attemptNum} 次)。响应: ${result.message}`); + dConsole.log(`[Queue] ❌ 上传失败 (第 ${attemptNum} 次)。响应: ${result.message}`); } catch (e) { - console.error(`[Queue] ❌ TaskPool 执行错误 (第 ${attemptNum} 次): ${e}`); + dConsole.error(`[Queue] ❌ TaskPool 执行错误 (第 ${attemptNum} 次): ${e}`); } // 如果这是最后一次尝试且依然失败,则不再等待,直接跳出循环去抛出错误 @@ -117,7 +117,7 @@ export async function uploadWorkerTask(data: RegulatoryInterfaceParams): Promise } catch (err) { // 捕获请求过程中可能出现的异常 const error = err as Error; - console.error(`[Worker] 上传时发生异常: ${error.message}`); + dConsole.error(`[Worker] 上传时发生异常: ${error.message}`); return { code: 20038 }; } } diff --git a/entry/src/main/ets/pages/Judge/utils.ets b/entry/src/main/ets/pages/Judge/utils.ets index dfb88e2..73e27c1 100644 --- a/entry/src/main/ets/pages/Judge/utils.ets +++ b/entry/src/main/ets/pages/Judge/utils.ets @@ -6,9 +6,11 @@ import { DefaultJudgeConfigObj, ExtendType, Gps, + JudgeSound, LANE, MarkRule, PLCType, + ProcessDataEnumType, ProjectInfo, ProjectInfos, ProjectRoads, @@ -18,6 +20,8 @@ import { import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common'; import dayTs from '../../utils/Date'; import { dConsole } from '../../utils/LogWorker'; +import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements'; +import { examJudgeSoundEnd } from './JudgeSDKUtils'; // 中心信号转换 @@ -852,4 +856,27 @@ export const DeductionProjectConversion = (code: string, markRuleListObj: object export const CurrentProjectConversion = (code: number, projectsObj: object): string => { const project: ProjectInfo = Reflect.get(projectsObj, code) return project?.abbreviation || '通用评判' +} + +/** + * 获取评判语音 + * @param sound - 评判音频对象 + * @param avPlayer - 语音播放器实例 + */ +export const PlayJudgeVoice = (sound: JudgeSound, avPlayer: VoiceAnnounce) => { + if (sound.type == 1) { + avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`], false, () => { + examJudgeSoundEnd({ + xmdm: sound.xmdm, code: sound.code[0], type: sound.type + }) + dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({ + method: 'examJudgeSoundEnd', + itemno: sound.xmdm, + code: sound.code[0], + type: sound.type, + })) + }) + } else { + avPlayer?.playAudio([`voice/${sound.code[0]}.mp3`]) + } } \ No newline at end of file diff --git a/entry/src/main/ets/pages/compontents/TrajectoryView.ets b/entry/src/main/ets/pages/compontents/TrajectoryView.ets index 6a8bfa9..faf8cc4 100644 --- a/entry/src/main/ets/pages/compontents/TrajectoryView.ets +++ b/entry/src/main/ets/pages/compontents/TrajectoryView.ets @@ -6,7 +6,7 @@ import { dConsole } from '../../utils/LogWorker' import { examJudgeMapSetDrawing, examJudgeMapSetScaling } from '../Judge/JudgeSDKUtils' import BlockComponent from './Block' import CoordinateComponent from './Coordinate' - +import libJudgeSdk from '@ohos.judgesdk' @Component export default struct TrajectoryViewComponent { @@ -175,11 +175,13 @@ struct trajectoryComponent { .height("100%") .onLoad(() => { dConsole.log("开始绘制") - examJudgeMapSetDrawing(true) + // examJudgeMapSetDrawing(true) + libJudgeSdk.examJudgeMapSetDrawing(true) }) .onDestroy(() => { dConsole.log("结束绘制") examJudgeMapSetDrawing(false) + libJudgeSdk.examJudgeMapSetDrawing(false) }) Row() { Image($rawfile('judge/big.png')).width(60).onClick(() => { diff --git a/entry/src/main/ets/pages/judgeSDK/judge.ets b/entry/src/main/ets/pages/judgeSDK/judge.ets index 291c471..352de01 100644 --- a/entry/src/main/ets/pages/judgeSDK/judge.ets +++ b/entry/src/main/ets/pages/judgeSDK/judge.ets @@ -52,9 +52,7 @@ import { WorkerBackMessageType, WR } from '../../model'; -import { DrivingDataStorage } from '../../utils/business/DrivingDataStorage'; import { - examCalcGpsDistance, examJudgeArtificialItem, examJudgeArtificialMark, examJudgeBeginExam, @@ -170,6 +168,48 @@ export default class Judge { private isExamEnd: boolean // 是否发送udp private isUdpEnd: boolean = false + // 处理udp plc信号 + handleUdp = async (msg: string) => { + const stachArr = msg.split(',') + if (stachArr[0] != '#DN_GD' || this.isUdpEnd) { + return + } + const gpsPart = msg.split("#END$GPS,")[1]; + const gpsStatus = gpsPart.split(",")[0]; + if (gpsStatus === "4") { + dConsole.log(JudgeTag, "差分状态正常", gpsStatus) + this.judgeUI.isDwztRight = true + } else { + dConsole.log(JudgeTag, "差分状态异常", gpsStatus) + this.judgeUI.isDwztRight = false + } + this.judgeUI.isDwztRight + const plcData = await this.getPlcData(msg); + // 4.过程数据 + // await this.fileLog?.setExamJudgeData(JSON.stringify(plcData)) + dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, 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('udpIndex') || 0; + // 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 = false //UDP服务序列号 @@ -214,6 +254,60 @@ export default class Judge { dConsole.info(JudgeTag, '过程数据文件上传 end') } private judgeTask: JudgeTask + // 检测扣分、结束项目时该项目是否开始 + checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => { + if (xmdm == 20) { + return true + } + const judgeUI = this.judgeUI; + const judgeTask = this.judgeTask; + const projectsObj: object = this.judgeUI.projectsObj + const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm) + const isUpload = currentProject.isUpload + + //如果项目没有开始 + dConsole.info(JudgeTag, 'surenjun isUpload=>', isUpload) + if (!isUpload) { + dConsole.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?: PLCType //实时计算gps经纬度距离 handDistance = async () => { @@ -222,16 +316,16 @@ export default class Judge { const tJD = ConvertDdmmToDecimalDegrees(this.tempData?.gps?.jd || 0) const tWD = ConvertDdmmToDecimalDegrees(this.tempData?.gps?.wd || 0) if (this.prevJd && dwzt == 4 && jdzt == 3) { - const distance = await examCalcGpsDistance({ - jd1: this.prevJd, - wd1: this.prevWd, - jd2: tJD, - wd2: tWD, - h: this.tempData?.gps?.hxj || 1, - }) + // const distance = await examCalcGpsDistance({ + // jd1: this.prevJd, + // wd1: this.prevWd, + // jd2: tJD, + // wd2: tWD, + // h: this.tempData?.gps?.hxj || 1, + // }) // const distanceClass = AppStorage.get('distanceClass') // distanceClass?.setTimeData(Number(((distance / 100).toFixed(2)))) - DrivingDataStorage.setDrivingProcessData(Number(((distance / 100).toFixed(2)))) + // DrivingDataStorage.setDrivingProcessData(Number(((distance / 100).toFixed(2)))) } this.prevJd = tJD; this.prevWd = tWD; @@ -264,47 +358,40 @@ export default class Judge { AppStorage.setOrCreate('msgStr', plc) return tempData } - // 处理udp plc信号 - handleUdp = async (msg: string) => { - const stachArr = msg.split(',') - if (stachArr[0] != '#DN_GD' || this.isUdpEnd) { - return - } - const gpsPart = msg.split("#END$GPS,")[1]; - const gpsStatus = gpsPart.split(",")[0]; - if (gpsStatus === "4") { - dConsole.log(JudgeTag, "差分状态正常", gpsStatus) - this.judgeUI.isDwztRight = true - } else { - dConsole.log(JudgeTag, "差分状态异常", gpsStatus) - this.judgeUI.isDwztRight = false - } - this.judgeUI.isDwztRight - const plcData = await this.getPlcData(msg); - // 4.过程数据 - // await this.fileLog?.setExamJudgeData(JSON.stringify(plcData)) - dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, 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('udpIndex') || 0; - // 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[]) => { + let num = 2; + const judgeTimer = setInterval(async () => { + const msgStr = strArr[num]; + if (msgStr == '') { + dConsole.info(JudgeTag, '模拟数据考试结束') + clearInterval(judgeTimer) + this.checkExamIsEnd(true) + return + } + const msg: PLCType = JSON.parse(strArr[num]); + num++ + // 4.过程数据 + this.tempData = msg + // this.judgeUI.isDwztRight = (msg?.gps?.dwzt == 4 && msg?.gps?.jdzt == 3); + this.judgeUI.sd = Math.floor(msg?.gps?.sd * 1.852) + ''; + this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + '' + this.plcData = msg + // this.judgeUI.isDwztRight = msg.gps.dwzt == 4; + AppStorage.setOrCreate('msgStr', '') + if (msg.method === 'examJudgeArtificialItem') { + this.setJudgeItem(msg.itemno, msg.type) + } + if (msg.method === 'examJudgeArtificialMark') { + this.setJudgeItem(msg.itemno, msg.serial) + } + await examJudgeRealExam(msg) + // const bytes = await this.getMessageHeartbeat(); + // bytes && globalThis.judgeUdp.send(bytes) + + }, 200) + // TODO 定时器缺失 + // globalThis.judgeTimer = judgeTimer; } private isEndTip: boolean = false; //本地轨迹回放地址 @@ -324,32 +411,6 @@ export default class Judge { const code = await writeObjectOut(JSON.parse(examDataStr), "", this.context); } } - private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] - private lane: LANE = { - road: '', num: 0, count: 0 - } - private disConnectNum: number = 0; - //调用监管接口 - sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => { - const temp = await writeObjectOut(data, filePath, this.context); - dConsole.log(JudgeTag, "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) { - dConsole.info('surenjun', '123') - this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!'; - this.judgeUI.disConnectErrorOpen = true - } - - this.disConnectNum = 0 - return temp - } // 项目开始接口同步 beginProject = async (ksxm: number) => { const carInfo = AppStorage.get('carInfo'); @@ -453,6 +514,32 @@ export default class Judge { UploadRegulatoryCodeConversion('17C54', temp.code || 0) dConsole.info(JudgeTag, '上传照片 end') } + private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] + private lane: LANE = { + road: '', num: 0, count: 0 + } + private disConnectNum: number = 0; + //调用监管接口 + sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => { + const temp = await writeObjectOut(data, filePath, this.context); + dConsole.log(JudgeTag, "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) { + dConsole.info('surenjun', '123') + this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!'; + this.judgeUI.disConnectErrorOpen = true + } + + this.disConnectNum = 0 + return temp + } private videoData?: RecordHandleType //当前科目二的考试项目 private deductedPopShowTimer: number = 0; @@ -566,95 +653,6 @@ export default class Judge { } } } - // 检测扣分、结束项目时该项目是否开始 - checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => { - if (xmdm == 20) { - return true - } - const judgeUI = this.judgeUI; - const judgeTask = this.judgeTask; - const projectsObj: object = this.judgeUI.projectsObj - const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm) - const isUpload = currentProject.isUpload - - //如果项目没有开始 - dConsole.info(JudgeTag, 'surenjun isUpload=>', isUpload) - if (!isUpload) { - dConsole.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 - } - } - // 处理轨迹plc信号 - handleTrajectoryUdp = async (strArr: string[]) => { - let num = 2; - const judgeTimer = setInterval(async () => { - const msgStr = strArr[num]; - if (msgStr == '') { - dConsole.info(JudgeTag, '模拟数据考试结束') - clearInterval(judgeTimer) - this.checkExamIsEnd(true) - return - } - const msg: PLCType = JSON.parse(strArr[num]); - num++ - // 4.过程数据 - this.tempData = msg - // this.judgeUI.isDwztRight = (msg?.gps?.dwzt == 4 && msg?.gps?.jdzt == 3); - this.judgeUI.sd = Math.floor(msg?.gps?.sd * 1.852) + ''; - this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + '' - this.plcData = msg - // this.judgeUI.isDwztRight = msg.gps.dwzt == 4; - AppStorage.setOrCreate('msgStr', '') - if (msg.method === 'examJudgeArtificialItem') { - this.setJudgeItem(msg.itemno, msg.type) - } - if (msg.method === 'examJudgeArtificialMark') { - this.setJudgeItem(msg.itemno, msg.serial) - } - await examJudgeRealExam(msg) - // const bytes = await this.getMessageHeartbeat(); - // bytes && globalThis.judgeUdp.send(bytes) - - }, 200) - // TODO 定时器缺失 - // globalThis.judgeTimer = judgeTimer; - } constructor(judgeUI: JudgeUI) { this.serialIndex = 1; @@ -866,7 +864,7 @@ export default class Judge { switch (event) { //项目开始 - case 1: + case 1: { const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm) project.type = '2'; if (isManualProjectIn) { @@ -892,7 +890,7 @@ export default class Judge { Reflect.set(this.judgeUI.projectsObj, xmdm, project) Reflect.set(this.kmItems, xmmcCode || 0, kmItem) break; - + } //项目结束 case 2: { const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm) @@ -921,7 +919,7 @@ export default class Judge { } //扣分 - case 3: + case 3: { const thisKf = this.getKfStr(`${kf.xmdm}_${kf.kfdm}`) const kfObj: MarkRule = { //扣分项目名称 @@ -939,7 +937,7 @@ export default class Judge { type: kf.type } dConsole.log(JudgeTag, "扣分组装", kfObj) - //扣分信息 + //扣分信息 this.kfArr?.push(kfObj) dConsole.log(JudgeTag, "扣分类组装", this.kfArr) this.judgeUI.totalScore += Number(thisKf?.score); @@ -950,23 +948,23 @@ export default class Judge { Reflect.set(this.judgeUI.projectsObj, kf.xmdm, project) } break; - + } //考车状态 - case 4: + case 4: { this.carztStr = GetCarStatus(carzt); break; - + } //考试结束 - case 5: + case 5: { this.ksjs = ksjs; - // await fileLog?.setExamJudgeData(JSON.stringify({ - // method: 'examJudgeEndExam' - // })) + // await fileLog?.setExamJudgeData(JSON.stringify({ + // method: 'examJudgeEndExam' + // })) dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify({ method: 'examJudgeEndExam' })) break; - + } //项目取消 case 6: { dConsole.info(JudgeTag, '项目取消'); @@ -985,21 +983,21 @@ export default class Judge { } //语音播放和提示 - case 7: + case 7: { this.goJudgeVoice(sound) break; - + } //模拟灯光事件 - case 8: + case 8: { this.setMndg(mndg) break; - + } //车道和路段变化 - case 9: + case 9: { this.judgeUI.lane = lane this.lane = lane; break; - + } //预进项目事件 case 10: { const param611: JudgeConfigObj = Reflect.get(judgeConfigObj, '611') || '' @@ -1126,9 +1124,9 @@ export default class Judge { } // 扣分 - case 3: + case 3: { dConsole.info(JudgeTag, 'surenjun', '扣分开始') - //扣分时实时播报语音(0-否+1-是) + //扣分时实时播报语音(0-否+1-是) const currentKf = kf[kfLen -1]; if (JudgeConfig.kfVoiceOpen || (examSubject == '2' && judgeConfigObj['618'] == '1') || (examSubject == '3' && judgeConfigObj['418'] == '1')) { @@ -1145,15 +1143,15 @@ export default class Judge { }) } break; - + } // 考车状态 case 4: break // 考试结束 - case 5: + case 5: { dConsole.info(JudgeTag, '考试结束') - //关闭录像 + //关闭录像 const singlePlay = AppStorage.get('singlePlay') if (!singlePlay && this.videoData) { await endRecordVideo(this.videoData) @@ -1163,9 +1161,10 @@ export default class Judge { AppStorage.setOrCreate('isJudge', false) await handEndExam() }) - // TODO待修改 - // clearInterval(globalThis.judgeTimer) + // TODO待修改 + // clearInterval(globalThis.judgeTimer) break + } default: break }