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 f3446f1..5af0840 100644 --- a/entry/src/main/ets/model/Common.ets +++ b/entry/src/main/ets/model/Common.ets @@ -104,6 +104,8 @@ export interface RouteParamsType { kString?: string; examItems?: string; fromIndex?: boolean; + mode?: number + score?: number } // 车辆信息 diff --git a/entry/src/main/ets/pages/Judge/JudgeBusiness.ets b/entry/src/main/ets/pages/Judge/JudgeBusiness.ets index 27cfbf2..48e2f98 100644 --- a/entry/src/main/ets/pages/Judge/JudgeBusiness.ets +++ b/entry/src/main/ets/pages/Judge/JudgeBusiness.ets @@ -2,28 +2,29 @@ import { JudgeConfigObjKmItems, JudgeKSJS, JudgePerformInfo, - JudgeUI, LANE, MarkRule, PLCType, ProcessDataEnumType, RecordHandleType, WorkerBackMessage, - WorkerBackMessageType + WorkerBackMessageType, + RouteParamsType } from '../../model' import FileUtils from '../../utils/FileUtils' import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements' import common from '@ohos.app.ability.common' -import { LargeJudge, RouterParam, SmallJudge } from './JudgeStart' +import { LargeJudge } from './LargeJudgeBusiness' +import { SmallJudge } from './SmallJudgeBusiness' import { dConsole } from '../../utils/LogWorker' import { JudgeTag } from '../../config' import { examJudgeRealExam } from './JudgeSDKUtils' -import { JudgingFn, SetJudgeItem } from './JudgeIng' +import { SetJudgeItem } from './JudgeIng' import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignalWorker' import { PlcStrToJson, PlcStrToWXJson } from './utils' -import { JudgeEndFn } from './JudgeEnd' import { BaseJudge } from './Typing' import router from '@ohos.router' +import { JudgePage } from '../Judge'; export default class JudgeBusiness { public mndgStr: string | undefined @@ -58,13 +59,13 @@ export default class JudgeBusiness { public carztStr: string public ksjs?: JudgeKSJS public plcData?: PLCType - private judgeUI: JudgeUI + private judgeUI: JudgePage private tempData?: PLCType // 是否发送udp private isUdpEnd: boolean = false - judgeBusiness: BaseJudge + private judgeBusiness: BaseJudge - constructor(judgeUI: JudgeUI) { + constructor(judgeUI: JudgePage) { this.judgeUI = judgeUI this.fileUtil = new FileUtils(judgeUI.context) this.avPlayer = new VoiceAnnounce(this.context); @@ -106,7 +107,7 @@ export default class JudgeBusiness { } public async JudgeInit() { - let currentParams: RouterParam = router.getParams() as RouterParam; + let currentParams: RouteParamsType = router.getParams() as RouteParamsType; this.judgeBusiness.JudgeInit(currentParams.mode, this.judgeUI.carName) } @@ -129,12 +130,12 @@ export default class JudgeBusiness { // 考试过程 callback优化 public async Judging(strData: string, callBack: Function) { - JudgingFn(strData, callBack, this.judgeUI, this) + this.judgeBusiness.Judging(strData, callBack, this.judgeUI, this) } // 结束考试 public JudgeEnd(isManual?: boolean) { - JudgeEndFn(this.judgeUI, this, isManual) + this.judgeBusiness.JudgeEnd(this.judgeUI, this, isManual) } // 处理PLC数据 diff --git a/entry/src/main/ets/pages/Judge/JudgeEnd.ets b/entry/src/main/ets/pages/Judge/JudgeEnd.ets deleted file mode 100644 index b224356..0000000 --- a/entry/src/main/ets/pages/Judge/JudgeEnd.ets +++ /dev/null @@ -1,110 +0,0 @@ -import { JudgeTag } from '../../config' -import { JudgeUI } from '../../model' -import { dConsole } from '../../utils/LogWorker' -import JudgeBusiness from './JudgeBusiness' -import { examJudgeEndExam } from './JudgeSDKUtils' - -export const JudgeEndFn = async (judgeUI: JudgeUI, that: JudgeBusiness, isManual?: boolean) => { - const isAllProjectsEnd = judgeUI.isAllProjectsEnd - const examSubject = judgeUI.examSubject - const singlePlay = judgeUI.singlePlay - const totalScore = Number(judgeUI.totalScore) - const judgeConfigObj = judgeUI.judgeConfigObj - const examMileage = Number(judgeUI.examMileage) - const passingScore = Number(judgeUI.passingScore) - const jl = judgeUI.jl - if (that.isExamEnd) { - return - } - if (isManual) { - // 考试不合格 - await examJudgeEndExam() - that.isExamEnd = true - that.isManual = true - } else { - const param302: number = Reflect.get(judgeConfigObj, '302') - const param342: number = Reflect.get(judgeConfigObj, '342') - const param512: number[] = (Reflect.get(judgeConfigObj, '512') || '').split(','); - - //单机模式 - if (singlePlay) { - dConsole.info(JudgeTag + ' 单机模式结束 => ', isAllProjectsEnd) - if (isAllProjectsEnd && jl >= examMileage) { - //成绩合格 - if (totalScore >= passingScore && !that.isEndTip) { - if (examSubject == '3' && (param342 == 0 || param342 == 2) && - (param302 != 6 && param302 != 7 && param302 != 8)) { - if (param512[7] != 0) { - clearTimeout(that.deductedPopShowTimer) - that.avPlayer?.playAudio(['voice/综合评判.mp3']) - judgeUI.isDeductedPopShow = true - judgeUI.defaultTabIndex = 1 - that.isEndTip = true - return - } - } else { - await examJudgeEndExam() - that.isExamEnd = true - return - } - } else { - if (examSubject == '3' && (param302 == 4 || param302 == 5 || param302 == 7 || param302 == 8)) { - await examJudgeEndExam() - that.isExamEnd = true - return - } - } - await examJudgeEndExam() - that.isExamEnd = true - } - } else { - //成绩不合格 - if (totalScore < passingScore) { - //科目三不合格报靠边停车 - if (examSubject == '3' && param302 == 1) { - that.avPlayer?.playAudio([`voice/考试结束.mp3`]); - return - } - await examJudgeEndExam() - that.isExamEnd = true - return - } - - //成绩合格 - if (isAllProjectsEnd && totalScore >= passingScore && !that.isEndTip) { - if (examSubject == '2') { - await examJudgeEndExam() - that.isExamEnd = true - return - } - - //考试里程判断 - if (examSubject == '3' && jl < examMileage) { - return - } - - //考试合格自动退出 - if (examSubject == '3' && (param302 == 4 || param302 == 7) || param302 == 8) { - await examJudgeEndExam() - that.isExamEnd = true - return - } - - if (examSubject == '3' && (param342 == 0 || param342 == 2) && - (param302 != 6 && param302 != 7 && param302 != 8)) { - if (param512[7] != 0) { - clearTimeout(that.deductedPopShowTimer) - judgeUI.isDeductedPopShow = false - that.avPlayer?.playAudio(['voice/综合评判.mp3']) - judgeUI.isDeductedPopShow = true - judgeUI.defaultTabIndex = 1 - that.isEndTip = true - } - } else { - await examJudgeEndExam() - that.isExamEnd = true - } - } - } - } -} \ No newline at end of file diff --git a/entry/src/main/ets/pages/Judge/JudgeStart.ets b/entry/src/main/ets/pages/Judge/LargeJudgeBusiness.ets similarity index 51% rename from entry/src/main/ets/pages/Judge/JudgeStart.ets rename to entry/src/main/ets/pages/Judge/LargeJudgeBusiness.ets index 9127c6b..2f55c18 100644 --- a/entry/src/main/ets/pages/Judge/JudgeStart.ets +++ b/entry/src/main/ets/pages/Judge/LargeJudgeBusiness.ets @@ -1,4 +1,3 @@ -//开始评判 import { JudgeConfig, JudgeTag } from '../../config'; import { BaseInfoType, @@ -12,7 +11,6 @@ import { JudgeInitObj, JudgeKFXM, JudgeKSXM, - JudgeUI, Km3JudgeInitConfig, MAPITEMPOINTITEM, MAPPOINT, @@ -42,227 +40,11 @@ import { GetModelData } from './utils'; import { BaseJudge, GetSysSetResult } from './Typing'; import { GetSyncData } from '../../utils/table/Operation'; import promptAction from '@ohos.promptAction'; +import { JudgePage } from '../Judge'; -export interface RouterParam { - mode: number - score: number - kString: string - wayno: number -} - - -export class SmallJudge implements BaseJudge { - public async JudgeInit(mode: number, carName: string): Promise { - const systemParams = await GetSyncData('MA_SYSTEMPARM') - let currentParams: RouterParam = router.getParams() as RouterParam; - let totalScore: number - let wayno: number - let mockLight: boolean - let carlist: string - let passingScore: number - let examMileage: string - let projectsObj: Array - let projectsCenterObj: Array - let ddxkKsxmArr: Array - let singlePlay: boolean = AppStorage.get("singlePlay") - let systemparmArr: Array = [] - let projects: Array = [] - let examSubject: string = "" - if (mode === 2) { - totalScore = Number(currentParams.score) || totalScore - } - if (singlePlay) { - wayno = currentParams.wayno || 1; - } - if (singlePlay) { - wayno = Number(currentParams.wayno) || 1; - } - //真实监管下发的项目 - let kStringArr: string[] = (currentParams.kString?.split(',') || []).filter(item => item); - let isInExam = kStringArr.length > 0; - let carNo: number, allItems: string[] = []; - systemParams.forEach((systemParam) => { - if (JudgeConfig.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!; - } - const txt1 = decodeURI(systemParam.txt1 || "") - const txt2 = decodeURI(systemParam.txt2 || "") - - const no1 = systemParam.no1; - const no2 = systemParam.no2; - const no3 = systemParam.no3; - - //获取当前考车的no2 - if (no1 == 3 && no3 == 1) { - if (txt1 === carName) { - carNo = no2 - } - } - - //获取及格分数线 - if (no1 == 3 && no3 == 3 && carNo === no2) { - passingScore = Number(txt1) || 0; - } - //根据车型获取应行驶里程数 - if (no1 == 3 && no3 == 15 && carNo === no2) { - examMileage = ((decodeURI(systemParam.txt1 || "")) || '').split('^')[0]; - } - //获取当前考车的考试项目 - if (carNo && no1 === 3 && no2 == carNo && no3 === 10) { - allItems = decodeURIComponent(systemParam.txt1 || "").split(',').filter(txt => txt !== '') - dConsole.info(JudgeTag, '考试项目', allItems) - } - if ( - //科目二获取项目 - (examSubject == "2" && allItems.length && no1 === 6 && allItems.includes(no2 + "" || "")) - || - //科目三获取项目 - (examSubject == "3" && no1 === 6) - ) { - const name = decodeURI(systemParam.txt1 || "") - //小车过滤掉 夜间模拟行驶 - if (name === '夜间行驶') { - return - } - const currentProject: Project = { - name, - abbreviation: decodeURI(systemParam.txt3 || ""), - projectCode: no2 + '', - projectCodeCenter: txt2, - //是否是必考 加减档设置成非必考 - isRequired: no2 === 14 ? false : allItems.includes(no2 + ''), - //是否考过了 - isEnd: false, - //项目开始数据是否上传过 - isUpload: false, - } - const no2Num = Number(no2) - //真实监管下发考试项目 - if (isInExam && !(kStringArr.includes(txt2) || kStringArr.includes(no2 + ''))) { - dConsole.info(JudgeTag, 'surenjun =>', txt2) - dConsole.info(JudgeTag, 'surenjun => no2', no2) - currentProject.type = '3' - currentProject.isUpload = true - currentProject.isEnd = true - ddxkKsxmArr.push(txt2) - } - Reflect.set(projectsObj, no2Num, currentProject) - Reflect.set(projectsCenterObj, txt2, currentProject) - projects.push(currentProject); - } - systemparmArr.push({ - NO1: Number(no1), - NO2: Number(no2), - NO3: Number(no3), - TXT1: decodeURIComponent(systemParam.txt1 || ""), - TXT2: decodeURIComponent(systemParam.txt2 || ""), - TXT3: decodeURIComponent(systemParam.txt3 || ""), - }) - }) - if (!projects.length) { - promptAction.showToast({ - message: '读取数据库信息失败,请重新联网更新!', - duration: 8000 - }); - dConsole.log(JudgeTag, "router back3") - router.back(); - } - return { - totalScore, - wayno, - mockLight, - carlist, - passingScore, - examMileage, - projectsObj, - projectsCenterObj, - ddxkKsxmArr, - singlePlay, - systemparmArr, - projects, - } - } - - public async JudgeStart(callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) { - const name = judgeUI.name - const kssycs = judgeUI.kssycs - const manualMarkRules = judgeUI.manualMarkRules - // 处理单机模式 - const isTrajectoryOpen = JudgeConfig.isTrajectoryOpen; - const isJudgeInitBool = AppStorage.get('isJudgeInitBool'); - const trajectoryPath = JudgeConfig.trajectoryPath; - let strArr: string[] = []; - if (isTrajectoryOpen) { - const folderPath = await that.fileUtil.initFolder(trajectoryPath); - const str: string = await that.fileUtil.readFile(folderPath) - strArr = str.split('\n') - } - //日志回调 - dConsole.info(JudgeTag, '1.进入评判入口') - await examJudgeSetLogCallback(6, async (level: number, info: string, len: number) => { - dConsole.log(JudgeTag, '评判日志:' + info) - dConsole.writeProcessData(ProcessDataEnumType.JudgeLogData, info) - }) - - dConsole.info(JudgeTag, '2.注册日志回调完成') - - let initInfo: JudgeInitObj = isTrajectoryOpen ? JSON.parse(strArr[0]) : await this.GetJudgeInitData(judgeUI.context, judgeUI.markRuleListObj, judgeUI.carType, judgeUI.carName, judgeUI.systemparmArr, judgeUI.carinfoArr, judgeUI.examSubject, judgeUI.itemInfoObj, judgeUI.judgeConfig, judgeUI.carlist, judgeUI.mapPointArr, judgeUI.mapPointItemArr); - //相关评判初始化只做一次 - if (!isJudgeInitBool) { - dConsole.log(JudgeTag, "评判初始化参数", initInfo) - await examJudgeInit(initInfo); - AppStorage.setOrCreate('isJudgeInitBool', true) - dConsole.info(JudgeTag, '4.评判初始化完成') - } - AppStorage.setOrCreate('isJudge', true) - // 2.评判过程回调 - await examJudgeSetRealExamCallback(async (strData: string, len: number) => { - // 评判回调日志 - dConsole.writeProcessData(ProcessDataEnumType.JudgeProgressCallbackData, strData) - dConsole.info(JudgeTag, '评判回调数据', strData) - await that.Judging(strData, callBack) - }) - await examJudgeSetPerformCallback(async (info: string) => { - dConsole.info('评判实时数据', info) - that.performInfo = JSON.parse(info) - const jl = Math.floor((that.performInfo.qjjl + that.performInfo.dcjl) / 100); - if (jl > Number(judgeUI.examMileage)) { - that.JudgeEnd() - } - judgeUI.jl = jl - judgeUI.laneSignal = that.performInfo.lane - }) - let beginExamInfo: JudgeBeginObj | undefined = undefined - // 3.开始考试 - if (isTrajectoryOpen) { - beginExamInfo = JSON.parse(strArr[1]) - beginExamInfo && (beginExamInfo.replay = 1) - } else { - beginExamInfo = await this.GetJudgeBeginData(judgeUI.projects, judgeUI.carType, judgeUI.kssycs, judgeUI.isDdxk, judgeUI.ddxkTime, judgeUI.projectsCenterObj, judgeUI.ddxkKsxmArr, judgeUI.ddxkKfArr, judgeUI.passingScore, judgeUI.wayno, judgeUI.name, judgeUI.lsh, judgeUI.idCard, that.isExam) - } - if (beginExamInfo) { - await examJudgeBeginExam(beginExamInfo); - } - dConsole.info(JudgeTag, '6.开始考试注册完成') - that.avPlayer?.playAudio([judgeUI.singlePlay ? 'voice/ksks.wav' : 'voice/监管成功.mp3']) - if (!judgeUI.singlePlay) { - that.videoData = await saveStartRecordVideo(`${name}_${kssycs}`, that.context) - } - judgeUI.draw = true - // 处理单机泡轨迹模式 - if (isTrajectoryOpen) { - that.SingleMachineTrajectory(strArr) - return - } - }; - - public async GetJudgeBeginData(projects: ProjectInfo[], 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) { +export class LargeJudge implements BaseJudge { + 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; @@ -322,7 +104,7 @@ export class SmallJudge implements BaseJudge { return beginInfo }; - 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[]) { + 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' @@ -384,13 +166,10 @@ export class SmallJudge implements BaseJudge { dConsole.info(JudgeTag, '3.获取评判初始化数据完成') return initInfo }; -} - -export class LargeJudge implements BaseJudge { public async JudgeInit(mode: number, carName: string): Promise { const systemParams = await GetSyncData('MA_SYSTEMPARM') - let currentParams: RouterParam = router.getParams() as RouterParam; + let currentParams: RouteParamsType = router.getParams() as RouteParamsType; let totalScore: number let wayno: number let mockLight: boolean @@ -407,7 +186,7 @@ export class LargeJudge implements BaseJudge { totalScore = Number(currentParams.score) || totalScore } if (singlePlay) { - wayno = currentParams.wayno || 1; + wayno = Number(currentParams.wayno) || 1; } //真实监管下发的项目 let kStringArr: string[] = (currentParams.kString?.split(',') || []).filter(item => item); @@ -563,7 +342,7 @@ export class LargeJudge implements BaseJudge { } } - public async JudgeStart(callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) { + public async JudgeStart(callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) { const name = judgeUI.name const kssycs = judgeUI.kssycs // 处理远程扣分使用 @@ -637,126 +416,11 @@ export class LargeJudge implements BaseJudge { } }; - public async GetJudgeBeginData(projects: ProjectInfo[], 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 systemTime.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: false, - mfxx: false, - mfxxn: false - } - dConsole.info(JudgeTag, '5.获取开始考试数据完成') - return beginInfo - }; + public async Judging(strData: string, callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) { - 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' + } - let allitems: ItemInfo[] = []; - if (examSubject == '2' && itemInfoObj) { - allitems = Reflect.ownKeys(itemInfoObj).map(cdsbKey => { - const cdsb: CDSBInfo = Reflect.get(itemInfoObj, cdsbKey); - const model = GetModelData(`${examType}/${cdsb.modelKey}.txt`, context) - const temp: ItemInfo = { - xmdm: cdsb?.xmdm || 0, - xmxh: cdsb?.xmxh || "", - model: model || "" - } - return temp - }) - } + public async JudgeEnd(judgeUI: JudgePage, that: JudgeBusiness, isManual?: boolean) { - //获取版本号 - 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('baseInfo')?.version || "", - kskm: Number(carInfo?.examSubject || "2"), - kchp: carInfo?.plateNo || "", - kchm: Number(carInfo?.carId || ""), - kscx: carType, - cxcode: '1', - name: carName, - carmodel: GetModelData(`${examType}/${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: GetModelData('km3/Roads.txt', context) || "", - sharps: GetModelData('km3/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 new file mode 100644 index 0000000..545ddbb --- /dev/null +++ b/entry/src/main/ets/pages/Judge/SmallJudgeBusiness.ets @@ -0,0 +1,486 @@ +import { JudgeConfig, JudgeTag } from '../../config'; +import { + BaseInfoType, + CAR_INFO, + CarInfoType, + CDSBInfo, + ExaminerInfoType, + ItemInfo, + ItemInfos, + JudgeBeginObj, + JudgeInitObj, + JudgeKFXM, + JudgeKSXM, + Km3JudgeInitConfig, + MAPITEMPOINTITEM, + MAPPOINT, + MarkRule, + ProcessDataEnumType, + ProjectInfo, + RouteParamsType, + SyssetConfig, + SYSTEM_PARAM, + Project +} from '../../model'; +import common from '@ohos.app.ability.common'; +import { dConsole } from '../../utils/LogWorker'; +import { + examJudgeBeginExam, + examJudgeEndExam, + examJudgeInit, + examJudgeSetLogCallback, + examJudgeSetPerformCallback, + examJudgeSetRealExamCallback, + examJudgeVersion +} from './JudgeSDKUtils'; +import JudgeBusiness from './JudgeBusiness'; +import { saveStartRecordVideo } from '../../utils/Video'; +import router from '@ohos.router'; +import systemTime from '@ohos.systemTime'; +import { GetModelData } from './utils'; +import { BaseJudge, GetSysSetResult } from './Typing'; +import { GetSyncData } from '../../utils/table/Operation'; +import promptAction from '@ohos.promptAction'; +import { JudgePage } from '../Judge'; + + +export class SmallJudge implements BaseJudge { + public 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 systemTime.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: false, + mfxx: false, + mfxxn: false + } + dConsole.info(JudgeTag, '5.获取开始考试数据完成') + return beginInfo + }; + + 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' + + let allitems: ItemInfo[] = []; + if (examSubject == '2' && itemInfoObj) { + allitems = Reflect.ownKeys(itemInfoObj).map(cdsbKey => { + const cdsb: CDSBInfo = Reflect.get(itemInfoObj, cdsbKey); + const model = GetModelData(`${examType}/${cdsb.modelKey}.txt`, context) + const temp: ItemInfo = { + xmdm: cdsb?.xmdm || 0, + xmxh: cdsb?.xmxh || "", + model: model || "" + } + return temp + }) + } + + //获取版本号 + 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('baseInfo')?.version || "", + kskm: Number(carInfo?.examSubject || "2"), + kchp: carInfo?.plateNo || "", + kchm: Number(carInfo?.carId || ""), + kscx: carType, + cxcode: '1', + name: carName, + carmodel: GetModelData(`${examType}/${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: GetModelData('km3/Roads.txt', context) || "", + sharps: GetModelData('km3/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(mode: number, carName: string): Promise { + const systemParams = await GetSyncData('MA_SYSTEMPARM') + let currentParams: RouteParamsType = router.getParams() as RouteParamsType; + let totalScore: number + let wayno: number + let mockLight: boolean + let carlist: string + let passingScore: number + let examMileage: string + let projectsObj: Array + let projectsCenterObj: Array + let ddxkKsxmArr: Array + let singlePlay: boolean = AppStorage.get("singlePlay") + let systemparmArr: Array = [] + let projects: Array = [] + let examSubject: string = "" + if (mode === 2) { + totalScore = Number(currentParams.score) || totalScore + } + if (singlePlay) { + wayno = Number(currentParams.wayno) || 1; + } + //真实监管下发的项目 + let kStringArr: string[] = (currentParams.kString?.split(',') || []).filter(item => item); + let isInExam = kStringArr.length > 0; + let carNo: number, allItems: string[] = []; + systemParams.forEach((systemParam) => { + if (JudgeConfig.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!; + } + const txt1 = decodeURI(systemParam.txt1 || "") + const txt2 = decodeURI(systemParam.txt2 || "") + + const no1 = systemParam.no1; + const no2 = systemParam.no2; + const no3 = systemParam.no3; + + //获取当前考车的no2 + if (no1 == 3 && no3 == 1) { + if (txt1 === carName) { + carNo = no2 + } + } + + //获取及格分数线 + if (no1 == 3 && no3 == 3 && carNo === no2) { + passingScore = Number(txt1) || 0; + } + //根据车型获取应行驶里程数 + if (no1 == 3 && no3 == 15 && carNo === no2) { + examMileage = ((decodeURI(systemParam.txt1 || "")) || '').split('^')[0]; + } + //获取当前考车的考试项目 + if (carNo && no1 === 3 && no2 == carNo && no3 === 10) { + allItems = decodeURIComponent(systemParam.txt1 || "").split(',').filter(txt => txt !== '') + dConsole.info(JudgeTag, '考试项目', allItems) + } + if ( + //科目二获取项目 + (examSubject == "2" && allItems.length && no1 === 6 && allItems.includes(no2 + "" || "")) + || + //科目三获取项目 + (examSubject == "3" && no1 === 6) + ) { + const name = decodeURI(systemParam.txt1 || "") + //小车过滤掉 夜间模拟行驶 + if (name === '夜间行驶') { + return + } + const currentProject: Project = { + name, + abbreviation: decodeURI(systemParam.txt3 || ""), + projectCode: no2 + '', + projectCodeCenter: txt2, + //是否是必考 加减档设置成非必考 + isRequired: no2 === 14 ? false : allItems.includes(no2 + ''), + //是否考过了 + isEnd: false, + //项目开始数据是否上传过 + isUpload: false, + } + const no2Num = Number(no2) + //真实监管下发考试项目 + if (isInExam && !(kStringArr.includes(txt2) || kStringArr.includes(no2 + ''))) { + dConsole.info(JudgeTag, 'surenjun =>', txt2) + dConsole.info(JudgeTag, 'surenjun => no2', no2) + currentProject.type = '3' + currentProject.isUpload = true + currentProject.isEnd = true + ddxkKsxmArr.push(txt2) + } + Reflect.set(projectsObj, no2Num, currentProject) + Reflect.set(projectsCenterObj, txt2, currentProject) + projects.push(currentProject); + } + systemparmArr.push({ + NO1: Number(no1), + NO2: Number(no2), + NO3: Number(no3), + TXT1: decodeURIComponent(systemParam.txt1 || ""), + TXT2: decodeURIComponent(systemParam.txt2 || ""), + TXT3: decodeURIComponent(systemParam.txt3 || ""), + }) + }) + if (!projects.length) { + promptAction.showToast({ + message: '读取数据库信息失败,请重新联网更新!', + duration: 8000 + }); + dConsole.log(JudgeTag, "router back3") + router.back(); + } + return { + totalScore, + wayno, + mockLight, + carlist, + passingScore, + examMileage, + projectsObj, + projectsCenterObj, + ddxkKsxmArr, + singlePlay, + systemparmArr, + projects, + } + } + + public async JudgeStart(callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) { + const name = judgeUI.name + const kssycs = judgeUI.kssycs + const manualMarkRules = judgeUI.manualMarkRules + // 处理单机模式 + const isTrajectoryOpen = JudgeConfig.isTrajectoryOpen; + const isJudgeInitBool = AppStorage.get('isJudgeInitBool'); + const trajectoryPath = JudgeConfig.trajectoryPath; + let strArr: string[] = []; + if (isTrajectoryOpen) { + const folderPath = await that.fileUtil.initFolder(trajectoryPath); + const str: string = await that.fileUtil.readFile(folderPath) + strArr = str.split('\n') + } + //日志回调 + dConsole.info(JudgeTag, '1.进入评判入口') + await examJudgeSetLogCallback(6, async (level: number, info: string, len: number) => { + dConsole.log(JudgeTag, '评判日志:' + info) + dConsole.writeProcessData(ProcessDataEnumType.JudgeLogData, info) + }) + + dConsole.info(JudgeTag, '2.注册日志回调完成') + + let initInfo: JudgeInitObj = isTrajectoryOpen ? JSON.parse(strArr[0]) : await this.GetJudgeInitData(judgeUI.context, judgeUI.markRuleListObj, judgeUI.carType, judgeUI.carName, judgeUI.systemparmArr, judgeUI.carinfoArr, judgeUI.examSubject, judgeUI.itemInfoObj, judgeUI.judgeConfig, judgeUI.carlist, judgeUI.mapPointArr, judgeUI.mapPointItemArr); + //相关评判初始化只做一次 + if (!isJudgeInitBool) { + dConsole.log(JudgeTag, "评判初始化参数", initInfo) + await examJudgeInit(initInfo); + AppStorage.setOrCreate('isJudgeInitBool', true) + dConsole.info(JudgeTag, '4.评判初始化完成') + } + AppStorage.setOrCreate('isJudge', true) + // 2.评判过程回调 + await examJudgeSetRealExamCallback(async (strData: string, len: number) => { + // 评判回调日志 + dConsole.writeProcessData(ProcessDataEnumType.JudgeProgressCallbackData, strData) + dConsole.info(JudgeTag, '评判回调数据', strData) + await that.Judging(strData, callBack) + }) + await examJudgeSetPerformCallback(async (info: string) => { + dConsole.info('评判实时数据', info) + that.performInfo = JSON.parse(info) + const jl = Math.floor((that.performInfo.qjjl + that.performInfo.dcjl) / 100); + if (jl > Number(judgeUI.examMileage)) { + that.JudgeEnd() + } + judgeUI.jl = jl + judgeUI.laneSignal = that.performInfo.lane + }) + let beginExamInfo: JudgeBeginObj | undefined = undefined + // 3.开始考试 + if (isTrajectoryOpen) { + beginExamInfo = JSON.parse(strArr[1]) + beginExamInfo && (beginExamInfo.replay = 1) + } else { + beginExamInfo = await this.GetJudgeBeginData(judgeUI.projects, judgeUI.carType, judgeUI.kssycs, judgeUI.isDdxk, judgeUI.ddxkTime, judgeUI.projectsCenterObj, judgeUI.ddxkKsxmArr, judgeUI.ddxkKfArr, judgeUI.passingScore, judgeUI.wayno, judgeUI.name, judgeUI.lsh, judgeUI.idCard, that.isExam) + } + if (beginExamInfo) { + await examJudgeBeginExam(beginExamInfo); + } + dConsole.info(JudgeTag, '6.开始考试注册完成') + that.avPlayer?.playAudio([judgeUI.singlePlay ? 'voice/ksks.wav' : 'voice/监管成功.mp3']) + if (!judgeUI.singlePlay) { + that.videoData = await saveStartRecordVideo(`${name}_${kssycs}`, that.context) + } + judgeUI.draw = true + // 处理单机泡轨迹模式 + if (isTrajectoryOpen) { + that.SingleMachineTrajectory(strArr) + return + } + }; + + public async Judging(strData: string, callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) { + + } + + + public async JudgeEnd(judgeUI: JudgePage, that: JudgeBusiness, isManual?: boolean) { + const isAllProjectsEnd = judgeUI.isAllProjectsEnd + const examSubject = judgeUI.examSubject + const singlePlay = judgeUI.singlePlay + const totalScore = Number(judgeUI.totalScore) + const judgeConfigObj = judgeUI.judgeConfigObj + const examMileage = Number(judgeUI.examMileage) + const passingScore = Number(judgeUI.passingScore) + const jl = judgeUI.jl + if (that.isExamEnd) { + return + } + if (isManual) { + // 考试不合格 + await examJudgeEndExam() + that.isExamEnd = true + that.isManual = true + } else { + const param302: number = Reflect.get(judgeConfigObj, '302') + const param342: number = Reflect.get(judgeConfigObj, '342') + const param512: number[] = (Reflect.get(judgeConfigObj, '512') || '').split(','); + + //单机模式 + if (singlePlay) { + dConsole.info(JudgeTag + ' 单机模式结束 => ', isAllProjectsEnd) + if (isAllProjectsEnd && jl >= examMileage) { + //成绩合格 + if (totalScore >= passingScore && !that.isEndTip) { + if (examSubject == '3' && (param342 == 0 || param342 == 2) && + (param302 != 6 && param302 != 7 && param302 != 8)) { + if (param512[7] != 0) { + clearTimeout(that.deductedPopShowTimer) + that.avPlayer?.playAudio(['voice/综合评判.mp3']) + judgeUI.isDeductedPopShow = true + judgeUI.defaultTabIndex = 1 + that.isEndTip = true + return + } + } else { + await examJudgeEndExam() + that.isExamEnd = true + return + } + } else { + if (examSubject == '3' && (param302 == 4 || param302 == 5 || param302 == 7 || param302 == 8)) { + await examJudgeEndExam() + that.isExamEnd = true + return + } + } + await examJudgeEndExam() + that.isExamEnd = true + } + } else { + //成绩不合格 + if (totalScore < passingScore) { + //科目三不合格报靠边停车 + if (examSubject == '3' && param302 == 1) { + that.avPlayer?.playAudio([`voice/考试结束.mp3`]); + return + } + await examJudgeEndExam() + that.isExamEnd = true + return + } + + //成绩合格 + if (isAllProjectsEnd && totalScore >= passingScore && !that.isEndTip) { + if (examSubject == '2') { + await examJudgeEndExam() + that.isExamEnd = true + return + } + + //考试里程判断 + if (examSubject == '3' && jl < examMileage) { + return + } + + //考试合格自动退出 + if (examSubject == '3' && (param302 == 4 || param302 == 7) || param302 == 8) { + await examJudgeEndExam() + that.isExamEnd = true + return + } + + if (examSubject == '3' && (param342 == 0 || param342 == 2) && + (param302 != 6 && param302 != 7 && param302 != 8)) { + if (param512[7] != 0) { + clearTimeout(that.deductedPopShowTimer) + judgeUI.isDeductedPopShow = false + that.avPlayer?.playAudio(['voice/综合评判.mp3']) + judgeUI.isDeductedPopShow = true + judgeUI.defaultTabIndex = 1 + that.isEndTip = true + } + } else { + await examJudgeEndExam() + that.isExamEnd = true + } + } + } + } + }; +} diff --git a/entry/src/main/ets/pages/Judge/Typing.ets b/entry/src/main/ets/pages/Judge/Typing.ets index 3415889..af79696 100644 --- a/entry/src/main/ets/pages/Judge/Typing.ets +++ b/entry/src/main/ets/pages/Judge/Typing.ets @@ -1,8 +1,9 @@ -import { JudgeUI, Project, SYSTEM_PARAM, } from '../../model' +import { Project, SYSTEM_PARAM, } from '../../model' import JudgeBusiness from './JudgeBusiness' +import { JudgePage } from "../Judge" -export interface GetSysSetResult { +export interface GetSysSetResult { totalScore: number wayno: number mockLight: boolean @@ -19,5 +20,7 @@ export interface GetSysSetResult { export interface BaseJudge { JudgeInit: (mode: number, carName: string) => Promise - JudgeStart: (callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) => void + JudgeStart: (callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) => void + Judging: (strData: string, callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) => void + JudgeEnd: (judgeUI: JudgePage, that: JudgeBusiness, isManual?: boolean) => void } \ No newline at end of file diff --git a/oh-package-lock.json5 b/oh-package-lock.json5 index d61f840..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/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