From 4a72761601c4bcbfb69885d44eddaae387bf30b1 Mon Sep 17 00:00:00 2001 From: surenjun Date: Fri, 5 Jul 2024 09:34:03 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=B5=8E=E5=8D=97=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- entry/src/main/ets/common/service/initable.ts | 2 +- entry/src/main/ets/common/utils/request.ts | 2 +- entry/src/main/ets/pages/Judge.ets | 189 ++++++---- entry/src/main/ets/pages/Roads.ets | 26 +- entry/src/main/ets/pages/UserInfo.ets | 146 +++++--- .../ets/pages/compontents/SignDisplayCom.ets | 2 +- .../judge/BoardPrePareSetPopup.ets | 349 ++++++++++++++++++ .../ets/pages/compontents/judge/RealTime.ets | 2 +- .../src/main/ets/pages/judgeSDK/api/index.ts | 20 + .../main/ets/pages/judgeSDK/api/judgeSDK.d.ts | 12 +- entry/src/main/ets/pages/judgeSDK/judge.ts | 316 ++++++++-------- .../utils/{file-log.ts => fileLog.ts} | 0 .../utils/{file-model.ts => fileModel.ts} | 0 .../utils/{file-photo.ts => filePhoto.ts} | 0 .../utils/{judge-common.ts => judgeCommon.ts} | 0 .../utils/{judge-config.ts => judgeConfig.ts} | 2 +- .../utils/{judge-real.ts => judgeReal.ts} | 7 +- .../utils/{judge-task.ts => judgeTask.ts} | 0 .../pages/judgeSDK/utils/simulate-lights.ts | 27 -- ...announcements.ts => voiceAnnouncements.ts} | 2 +- .../main/resources/base/media/sczb_btn.png | Bin 0 -> 39799 bytes 21 files changed, 762 insertions(+), 342 deletions(-) create mode 100644 entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets rename entry/src/main/ets/pages/judgeSDK/utils/{file-log.ts => fileLog.ts} (100%) rename entry/src/main/ets/pages/judgeSDK/utils/{file-model.ts => fileModel.ts} (100%) rename entry/src/main/ets/pages/judgeSDK/utils/{file-photo.ts => filePhoto.ts} (100%) rename entry/src/main/ets/pages/judgeSDK/utils/{judge-common.ts => judgeCommon.ts} (100%) rename entry/src/main/ets/pages/judgeSDK/utils/{judge-config.ts => judgeConfig.ts} (92%) rename entry/src/main/ets/pages/judgeSDK/utils/{judge-real.ts => judgeReal.ts} (87%) rename entry/src/main/ets/pages/judgeSDK/utils/{judge-task.ts => judgeTask.ts} (100%) delete mode 100644 entry/src/main/ets/pages/judgeSDK/utils/simulate-lights.ts rename entry/src/main/ets/pages/judgeSDK/utils/{voice-announcements.ts => voiceAnnouncements.ts} (98%) create mode 100644 entry/src/main/resources/base/media/sczb_btn.png diff --git a/entry/src/main/ets/common/service/initable.ts b/entry/src/main/ets/common/service/initable.ts index 76815dc8..6d28d3c3 100644 --- a/entry/src/main/ets/common/service/initable.ts +++ b/entry/src/main/ets/common/service/initable.ts @@ -28,7 +28,7 @@ import DeviceInfoTable from '../constants/DeviceInfoTable' import USER from '../constants/USER' import util from '@ohos.util'; import zlib from '@ohos.zlib'; -import FileModel from '../../pages/judgeSDK/utils/file-model'; +import FileModel from '../../pages/judgeSDK/utils/fileModel'; // @ts-nocheck //读表 //参数平台 diff --git a/entry/src/main/ets/common/utils/request.ts b/entry/src/main/ets/common/utils/request.ts index bb95ff22..732f6c04 100644 --- a/entry/src/main/ets/common/utils/request.ts +++ b/entry/src/main/ets/common/utils/request.ts @@ -1,7 +1,7 @@ import http from '@ohos.net.http'; import convertxml from '@ohos.convertxml'; import prompt from '@ohos.prompt' -import { sendGreen } from '../../pages/judgeSDK/utils/judge-common'; +import { sendGreen } from '../../pages/judgeSDK/utils/judgeCommon'; import {GlobalConfig} from '../../config/index' const config = { host:GlobalConfig.host, diff --git a/entry/src/main/ets/pages/Judge.ets b/entry/src/main/ets/pages/Judge.ets index 7ea3cdbd..931fe70a 100644 --- a/entry/src/main/ets/pages/Judge.ets +++ b/entry/src/main/ets/pages/Judge.ets @@ -6,7 +6,7 @@ import LoadingPopup from './compontents/judge/LoadingPopup'; import DeductedPopup from './compontents/judge/DeductionPopup'; import AmplifyPopup from './compontents/judge/AmplifyPopup'; import Judge from './judgeSDK/judge'; -import { defaultJudgeConfigObj } from './judgeSDK/utils//judge-common'; +import { defaultJudgeConfigObj } from './judgeSDK/utils//judgeCommon'; import { CARINFO, CDSBInfo, @@ -21,7 +21,7 @@ import { import { chunkArr, formatTime, getCurrentHourTime, getCurrentTime } from '../common/utils/tools'; import { examJudgeEndExam } from './judgeSDK/api/index'; import { getSyncData } from '../common/service/initable'; -import { judgeConfig } from './judgeSDK/utils/judge-config'; +import { judgeConfig } from './judgeSDK/utils/judgeConfig'; import FileUtil from '../common/utils/File'; import SignDisplayCom from './compontents/signDisplayCom'; @@ -29,78 +29,6 @@ import SignDisplayCom from './compontents/signDisplayCom'; @Entry @Component struct Index { - scroller: Scroller = new Scroller() - //页面通用字体大小 - @State FONTSIZE: number = 28 - @State BIGFONTSIZE: number = 28 - //结束考试弹窗 - @State endPopupVisible: boolean = false - //等待弹窗(考试及格,考试不及格使用) - @State loadingPopupVisible: boolean = false - //实时轨迹弹窗 - @State signDisplayComVisible: boolean = false - @State isDdxk: boolean = false; - @State time: string = '' - //考试用时 - @State examTime: number = 0 - //开始时间 - @State startTime: string = '00:00:00' - @State startFullTime: string = '' - @State startHourTime: string = '' - //科目类型 - @State examSubject: 2 | 3 = 3; - @State ddxkTime: number = 0; - @State ddxkKsxmArr: string[] = [''] - @State ddxkKfArr: string[] = [''] - @State xmmcStr: string = '' - @State carztStr: string = '' - @State kfArr: { - xmmcStr?: string, - score: string, - desc: string - }[] = [] - @State name: string = '' - @State idCard: string = '' - @State totalScore: number = 100 - //模拟考试项目 - @State projects: Project[] = [] - @State projectsObj: ProjectObj = {} - @State projectsCenterObj: ProjectObj = {} - @State markRuleListObj: MarkRule = {} - @State cdsbInfoObj: CDSBInfo = {} - @State timer: number = 0 - @State judgeConfig: { [k: string]: string }[] = [] - @State judgeConfigObj: { [k: string]: any } = defaultJudgeConfigObj - //流水号 - @State lsh: string = '' - @State kszp: string = '' - @State ksdd: string = '' - @State kssycs: string = '' - @State kslx: string = '' - //监管接口序列号 - @State serialNumber: number = 0 - @State carType: string = '' - @State carName: string = '' - @State isDeductedPopShow: boolean = false - @State isAmplifyPopShow: boolean = false - @State amplifiedImgIndex: number = 0 - @State judge: any = {} - //行驶距离 - @State jl: number = 0 - //应考里程 - @State examMileage: string = '0' - @State artSubject3Projects: string[] = ['直线', '会车', '变道', '超车', '掉头', '停车'] - @State artSubject3ProjectsCodesArr: string[] = ['3', '9', '4', '10', '12', '11'] - @State manualMarkRules: MarkRule[] = [] - //科目三评判初始化数据 - @State systemparmArr: SYSTEMPARMARR[] = [] - @State mapPointItemArr: MAPITEMPOINTITEM[] = [] - @State carinfoArrr: CARINFO[] = [] - @State mapPointArr: MAPPOINT[] = [] - private context = getContext(this) as common.UIAbilityContext; - private img: ImageBitmap = new ImageBitmap("/resources/base/media/1.png") - //已考的考试项目 - private wantInfos = [] async aboutToAppear() { globalThis.windowClass.setWindowSystemBarEnable(['']) @@ -121,6 +49,8 @@ struct Index { //断点续考 await this.goDdxkItems() + + //初始化评判 const judge = await this.initJudge(); this.judge = judge @@ -200,10 +130,9 @@ struct Index { NoCancelId: mark.nocancelid * 1, GPS_SID: mark.gps_sid == 0 ? false : true } - const markserial = mark.markserial * 1; //筛选出人工评判的扣分 - if (markserial > 100 && markserial < 200) { + if (Number(tempObj.markserial) > 100 && Number(tempObj.markserial) < 200) { this.manualMarkRules.push(tempObj) } this.markRuleListObj[`${mark.itemno}_${mark.markserial}`] = { @@ -244,6 +173,33 @@ struct Index { this.examMileage = sys.v_value + ''; } + //364 绕车一周评判时机(1-开始考试后判 2-开始考试前判) + if(sys.v_no == '364' && sys.v_value == 2 ){ + let currentParams: any = router.getParams(); + const {sczb,kfdm} = currentParams; + kfdm.forEach(kf => { + const {xmdm, kfdm} = kf + const currentKf = this.markRuleListObj[`${xmdm}_${kfdm}`]; + const currentProject = this.projectsObj[xmdm] + this.kfArr.push({ + //扣分项目名称 + xmmcStr: currentProject.name, + //@ts-ignore + xmdm, + desc: currentKf.markshow, + score: currentKf.markreal, + markcatalog: currentKf.markcatalog, + markserial: currentKf.markserial, + kfxh: currentKf.kfxh + }) + this.totalScore += currentKf.markreal * 1; + }) + this.projectsObj['1'].type = kfdm.length ? '4':'3'; + this.projectsObj = { + ...this.projectsObj + } + } + this.judgeConfigObj[sys.v_no] = value }); this.judgeConfig = syssetJudgeConfigArr; @@ -300,7 +256,8 @@ struct Index { //初始化systemParam表 async initSystemKm3Param(sysParam?: SYSTEMPARMARR[]) { const systemParms: any = sysParam || await getSyncData('MA_SYSTEMPARM') - + let currentParams: any = router.getParams(); + this.wayno = currentParams.wayno const {isTrajectoryOpen} = judgeConfig systemParms.forEach((systemParm) => { @@ -538,7 +495,7 @@ struct Index { if (this.examSubject == 3) { Row() { Text('考试路线:').fontColor('#E5CCA1').fontSize(this.FONTSIZE) - Text(`线路${globalThis.carInfo.wayno}`).fontColor('#FFAD33').fontSize(this.FONTSIZE) + Text(`线路${this.wayno}`).fontColor('#FFAD33').fontSize(this.FONTSIZE) } } @@ -905,6 +862,7 @@ struct Index { if (this.isDeductedPopShow) { DeductedPopup({ currentItems: Reflect.ownKeys(this.projectsObj).map(projectKey => { + //@ts-ignore const project = this.projectsObj[projectKey] return project.type == '2' ? project.projectCode : '' }).filter(project => project !== ''), @@ -974,6 +932,7 @@ struct Index { return false } + //@ts-ignore if (param348 == '0' && projectsObj['9']?.type == 2) { return index === 0 ? true : false } @@ -985,4 +944,78 @@ struct Index { return true } + + scroller: Scroller = new Scroller() + //页面通用字体大小 + @State wayno:number = 0 + @State FONTSIZE: number = 28 + @State BIGFONTSIZE: number = 28 + //结束考试弹窗 + @State endPopupVisible: boolean = false + //等待弹窗(考试及格,考试不及格使用) + @State loadingPopupVisible: boolean = false + //实时轨迹弹窗 + @State signDisplayComVisible: boolean = false + @State isDdxk: boolean = false; + @State time: string = '' + //考试用时 + @State examTime: number = 0 + //开始时间 + @State startTime: string = '00:00:00' + @State startFullTime: string = '' + @State startHourTime: string = '' + //科目类型 + @State examSubject: 2 | 3 = 3; + @State ddxkTime: number = 0; + @State ddxkKsxmArr: string[] = [''] + @State ddxkKfArr: string[] = [''] + @State xmmcStr: string = '' + @State carztStr: string = '' + @State kfArr: { + xmmcStr?: string, + score: string, + desc: string + }[] = [] + @State name: string = '' + @State idCard: string = '' + @State totalScore: number = 100 + //模拟考试项目 + @State projects: Project[] = [] + @State projectsObj: ProjectObj = {} + @State projectsCenterObj: ProjectObj = {} + @State markRuleListObj: MarkRule = {} + @State cdsbInfoObj: CDSBInfo = {} + @State timer: number = 0 + @State judgeConfig: { [k: string]: string }[] = [] + @State judgeConfigObj: { [k: string]: any } = defaultJudgeConfigObj + //流水号 + @State lsh: string = '' + @State kszp: string = '' + @State ksdd: string = '' + @State kssycs: string = '' + @State kslx: string = '' + //监管接口序列号 + @State serialNumber: number = 0 + @State carType: string = '' + @State carName: string = '' + @State isDeductedPopShow: boolean = false + @State isAmplifyPopShow: boolean = false + @State amplifiedImgIndex: number = 0 + @State judge: any = {} + //行驶距离 + @State jl: number = 0 + //应考里程 + @State examMileage: string = '0' + @State artSubject3Projects: string[] = ['直线', '会车', '变道', '超车', '掉头', '停车'] + @State artSubject3ProjectsCodesArr: string[] = ['3', '9', '4', '10', '12', '11'] + @State manualMarkRules: MarkRule[] = [] + //科目三评判初始化数据 + @State systemparmArr: SYSTEMPARMARR[] = [] + @State mapPointItemArr: MAPITEMPOINTITEM[] = [] + @State carinfoArrr: CARINFO[] = [] + @State mapPointArr: MAPPOINT[] = [] + private context = getContext(this) as common.UIAbilityContext; + private img: ImageBitmap = new ImageBitmap("/resources/base/media/1.png") + //已考的考试项目 + private wantInfos = [] } diff --git a/entry/src/main/ets/pages/Roads.ets b/entry/src/main/ets/pages/Roads.ets index 3d0e2cf1..ee85a8ba 100644 --- a/entry/src/main/ets/pages/Roads.ets +++ b/entry/src/main/ets/pages/Roads.ets @@ -24,7 +24,6 @@ export default struct Index { const {no1,no2,no3,txt1,txt2} = systemParm; if (no1 == 4) { const temp = { no2, no3, txt1: decodeURI(txt1), txt2 } - console.info('surenjun', JSON.stringify(temp)) this.roadObj[no2] = no2 } }) @@ -57,10 +56,8 @@ export default struct Index { const roadArr = Reflect.ownKeys(this.roadObj).map((roadKey) => { return this.roadObj[roadKey] }); - globalThis.carInfo.wayno = roadArr[Math.floor(Math.random()*roadArr.length)]; - router.pushUrl({ - url: 'pages/Judge', - }, router.RouterMode.Single); + const wayno = roadArr[Math.floor(Math.random()*roadArr.length)]; + this.goJudge(wayno) }) ForEach(Reflect.ownKeys(this.roadObj), (roadIndex) => { ListItem() { @@ -81,10 +78,7 @@ export default struct Index { .height(220) .margin({ left: 5, bottom: 10 }) .onClick(async () => { - globalThis.carInfo.wayno = this.roadObj[roadIndex]; - router.pushUrl({ - url: 'pages/Judge', - }, router.RouterMode.Single); + this.goJudge(this.roadObj[roadIndex]) }) }) }.lanes(8).margin({ top: 50, left: 15 }) @@ -95,6 +89,18 @@ export default struct Index { } - outClick() { + goJudge(wayno) { + let currentParams: any = router.getParams() || {}; + const {sczb,kfdm} = currentParams; + router.replaceUrl({ + url: 'pages/Judge', + params:{ + sczb, + kfdm, + wayno + } + }, router.RouterMode.Single); + } + outClick(){} } \ No newline at end of file diff --git a/entry/src/main/ets/pages/UserInfo.ets b/entry/src/main/ets/pages/UserInfo.ets index b5f5cca0..d78c8ac0 100644 --- a/entry/src/main/ets/pages/UserInfo.ets +++ b/entry/src/main/ets/pages/UserInfo.ets @@ -14,8 +14,9 @@ import common from '@ohos.app.ability.common'; import { User } from './interfaces'; import WebRTCVoice from './webRTC/'; import promptAction from '@ohos.promptAction'; +import { getSyncData } from '../common/service/initable'; import { CandidateData, EmptyCandidateObject } from '../mock/CandidateData'; - +import BoardPrePareSetPopup from './compontents/judge/BoardPrePareSetPopup' @Entry @Component struct UserInfo { @@ -34,6 +35,10 @@ struct UserInfo { @State url: string = '' @State lsh: string = '' @State qkFlag: boolean = false + @State isBoardPrePareSetPopupOpen: boolean = false + @State isFirstBoardPrePareSetPopupBtnShow: boolean = false + @State isBoardPrePareSetPopupShow: boolean = false + @State sczbkf:{xmdm:number,kfdm:string}[] = [] @State currentUser: User = EmptyCandidateObject @State dataList: Array = [] @State list: Array = [] @@ -194,7 +199,9 @@ struct UserInfo { this.qkFn() } - initData() { + async initData() { + this.sczbkf = [] + this.isFirstBoardPrePareSetPopupBtnShow = false; this.stepFlag = false this.faceCompareSucess = 0 this.showFaceCompare = false @@ -216,6 +223,15 @@ struct UserInfo { } else { // this.getExaminationStudentInfoFn() } + const syssetParams = await getSyncData('MA_SYSSET'); + //@ts-ignore + syssetParams.forEach(sys => { + //364 绕车一周评判时机(1-开始考试后判 2-开始考试前判) + if(sys.v_no === '364'){ + this.isBoardPrePareSetPopupOpen = true; + } + }) + } async heartMsg() { @@ -531,6 +547,7 @@ struct UserInfo { build() { Column() { + TopLogo({ outFlag: $outFlag }).margin({ bottom: 10 }) Row() { Row() { @@ -627,54 +644,72 @@ struct UserInfo { .onClick(() => { this.qkFlag = true }) - Image($r('app.media.ksks_btn')) - .commStyle() - .onClick(() => { - this.faceCompareSucess = 0 - globalThis.statue = 2 - if (!this.currentUser.xm) { - return - } - // if(globalThis.spzdFlag){ - // promptAction.showToast({ - // message: '摄像头被遮挡', - // duration: 2000 - // }); - // return - // } - //TODO 科目三先写死 - globalThis.carInfo.examSubject = 3; - if (globalThis.singlePlay) { - const {examSubject} = globalThis.carInfo; - this.AccountTable.query('0', (result) => { - if (result.length == 0) { - this.AccountTable.insertData(this.currentUser, (id) => { - this.AccountTable.query('0', (result) => { - router.pushUrl({ - url: examSubject == 3 ? 'pages/Roads':'pages/Judge', - }, router.RouterMode.Single); - this.stopDeviceById() - }) - }) - } else { - this.AccountTable.updateData(this.currentUser, (id) => { - this.AccountTable.query('0', (result) => { - router.pushUrl({ - url: examSubject == 3?'pages/Roads':'pages/Judge', - }, router.RouterMode.Single); - this.stopDeviceById() - }) - }) - } - }) - return - } - if (this.FaceOpenStatue != '0') { - this.showFaceCompare = true - } else { - this.sfbdinterfaceFn() - } + + if( this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow){ + //上车准备 + Image($r('app.media.sczb_btn')).commStyle().onClick(()=>{ + this.isBoardPrePareSetPopupShow = true; + this.isFirstBoardPrePareSetPopupBtnShow = true; }) + }else{ + Image($r('app.media.ksks_btn')) + .commStyle() + .onClick(() => { + this.faceCompareSucess = 0 + globalThis.statue = 2 + if (!this.currentUser.xm) { + return + } + // if(globalThis.spzdFlag){ + // promptAction.showToast({ + // message: '摄像头被遮挡', + // duration: 2000 + // }); + // return + // } + //TODO 科目三先写死 + globalThis.carInfo.examSubject = 3; + if (globalThis.singlePlay) { + const {examSubject} = globalThis.carInfo; + this.AccountTable.query('0', (result) => { + if (result.length == 0) { + this.AccountTable.insertData(this.currentUser, (id) => { + this.AccountTable.query('0', (result) => { + router.pushUrl({ + url: examSubject == 3 ? 'pages/Roads':'pages/Judge', + params:{ + sczb:Number(this.isBoardPrePareSetPopupOpen), + kfdm:this.sczbkf + } + }, router.RouterMode.Single); + this.stopDeviceById() + }) + }) + } else { + this.AccountTable.updateData(this.currentUser, (id) => { + this.AccountTable.query('0', (result) => { + router.pushUrl({ + url: examSubject == 3?'pages/Roads':'pages/Judge', + params:{ + sczb:Number(this.isBoardPrePareSetPopupOpen), + kfdm:this.sczbkf + } + }, router.RouterMode.Single); + this.stopDeviceById() + }) + }) + } + }) + return + } + if (this.FaceOpenStatue != '0') { + this.showFaceCompare = true + } else { + this.sfbdinterfaceFn() + } + }) + } + } } @@ -719,6 +754,19 @@ struct UserInfo { .backgroundColor('#E6E3DF') .borderRadius(19 * this.ratio) } + + // 上车准备 + if(this.isBoardPrePareSetPopupShow){ + BoardPrePareSetPopup({ + closePopup:()=>{ + this.isBoardPrePareSetPopupShow = false + }, + confirmMark:(kfdm)=>{ + this.sczbkf= kfdm + } + }) + } + } .height('100%') .width('100%') diff --git a/entry/src/main/ets/pages/compontents/SignDisplayCom.ets b/entry/src/main/ets/pages/compontents/SignDisplayCom.ets index cb308267..934bec84 100644 --- a/entry/src/main/ets/pages/compontents/SignDisplayCom.ets +++ b/entry/src/main/ets/pages/compontents/SignDisplayCom.ets @@ -1,6 +1,6 @@ import router from '@ohos.router'; import UdpClient from '../../common/utils/UdpClient'; -import FileLog from '../judgeSDK/utils/file-log'; +import FileLog from '../judgeSDK/utils/fileLog'; import RealTime from '../compontents/judge/RealTime'; import { GPSData, SignalData } from '../../mock'; import { SignalDataType } from '../../model'; diff --git a/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets b/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets new file mode 100644 index 00000000..96b87056 --- /dev/null +++ b/entry/src/main/ets/pages/compontents/judge/BoardPrePareSetPopup.ets @@ -0,0 +1,349 @@ +import { getSyncData } from '../../../common/service/initable'; +import { judgeConfig } from '../../judgeSDK/utils/judgeConfig'; +import FileUtil from '../../../common/utils/File'; +import common from '@ohos.app.ability.common'; +import VoiceAnnounce from '../../judgeSDK/utils/voiceAnnouncements'; + +import { + MarkRule, + SYSSET, +} from '../../judgeSDK/api/judgeSDK.d'; + +interface SEL { + fontColor: string + bgColor: string +} + +@Component +export default struct DeductedPopup { + private context = getContext(this) as common.UIAbilityContext; + private avPlayer + @State name: string = '' + @State idCard: string = '' + @State lsh: string = '' + @State kszp: string = '' + @State ksdd: string = '' + @State kssycs: string = '' + @State kslx: string = '' + @State kfdmArr: { + xmdm: number, + kfdm: string, + markreal: number + }[] = [] + //开始考试前判绕车一周评判是否开启 + @State isOpen: boolean = false + //监管序列号 + @State serialNumber: number = 0; + @State examSubject: number = 2; + @State markRuleListObj: MarkRule = {} + @State fontSize: number = 25 + @State unselected: SEL = { fontColor: '#000000', bgColor: '#CCC4B8' } + @State selected: SEL = { fontColor: '#FFAD33', bgColor: '#26231E' } + @State currentIndex: number = 0 + @State currentPageIndex: number = 0 + //通用评判扣分 + @State currentUniversalPageIndex: number = 0; + @State universalMarkRules: MarkRule[] = [] + @State manualMarkRules: MarkRule[] = [] + @State lineBg: Array = ['#4D4136', '#26231E'] + @State selectedLine: number = undefined + private closePopup: Function = () => { + } + private confirmMark: Function = (itemno: number, serial: string) => { + } + @State selectedLineStyle: SEL = { + fontColor: '#FFF', + bgColor: '#B36E00' + } + + aboutToAppear() { + //上车准备 + // this.universalMarkRules = this.markRules.filter(item => this.currentItems.includes(item.itemno+'')) + const {isTrajectoryOpen} = judgeConfig; + if (isTrajectoryOpen) { + this.initDb() + } else { + this.initSysset() + this.initMarkRules() + } + this.avPlayer = new VoiceAnnounce(); + } + + //本地数据初始化 + async initDb() { + const {isTrajectoryOpen,trajectoryPath} = judgeConfig + const examSubject = globalThis.carInfo.examSubject; + //轨迹回放读取 systemparam表、markrule表 + const fileUtil = new FileUtil(this.context); + const folderPath = await fileUtil.initFolder(trajectoryPath); + const str = await fileUtil.readFile(folderPath); + const strArr = str.split('\n'); + const [initData, beginData] = [strArr[0], strArr[1]]; + const initDataObj = JSON.parse(initData); + this.examSubject = isTrajectoryOpen ? (initDataObj.kskm * 1) : examSubject; + await this.initMarkRules(initDataObj.mark); + await this.initSysset(initDataObj.sysset); + await this.initStudent() + } + + //获取sysset表数据 + async initSysset(sysset?: SYSSET[]) { + const syssetParams = sysset || await getSyncData('MA_SYSSET'); + //@ts-ignore + syssetParams.forEach(sys => { + //监管序列号 + if (sys.v_no === '901') { + this.serialNumber = sys.v_value || '123456' + } + + //364 绕车一周评判时机(1-开始考试后判 2-开始考试前判) + if (sys.v_no === '364') { + const isOpen = sys.v_value == 2 + if (isOpen) { + this.avPlayer.playAudio(['voice/上车准备.mp3']) + } + + } + }) + } + + //获取markrule表数据 + async initMarkRules(markRules ?: MarkRule[]) { + const markRuleParams = markRules || (await getSyncData('MA_MARKRULE') as MarkRule[]) + + markRuleParams.forEach(mark => { + const tempObj = { + itemno: mark.itemno * 1, + markcatalog: mark.markcatalog, + markshow: decodeURI(mark.markshow), + markreal: mark.markreal * 1, + markstandard: mark.markstandard * 1, + markserial: mark.markserial, + kfxh: mark.kfxh, + OnlyOneKind: mark.onlyoneid * 1, + NoCancelId: mark.nocancelid * 1, + GPS_SID: mark.gps_sid == 0 ? false : true + } + + if (mark.itemno == 1) { + this.markRuleListObj[`${mark.itemno}_${mark.markserial}`] = { + ...tempObj, + markserial: mark.markserial, + }; + this.universalMarkRules.push(tempObj) + } + + }) + + } + + // 获取考生信息 + async initStudent() { + const students = await getSyncData('USER') + const stuInfo = students[0] || {}; + const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx} = stuInfo; + this.name = xm || '测试考生'; + this.idCard = sfzmhm || '01234567891010'; + this.lsh = lsh; + this.kszp = kszp; + this.ksdd = ksdd; + this.kssycs = kssycs; + this.kslx = kslx; + } + + //上一页 下一页 + goPage(typeIndex) { + const currentIndex = this.currentIndex + if (currentIndex) { + //通用评判 + typeIndex ? (this.currentUniversalPageIndex += 1) : (this.currentUniversalPageIndex -= 1) + } else { + typeIndex ? (this.currentPageIndex += 1) : (this.currentPageIndex -= 1) + } + this.selectedLine = -1 + } + + //选中扣分项 + getSelectedLine(index) { + const {selectedLine,selectedLineStyle,lineBg} = this; + if (selectedLine === index) { + return selectedLineStyle.bgColor + } + if (index % 2 === 0) { + return lineBg[0] + } else { + return lineBg[1] + } + } + + //获取当前页的数据 + getCurrentMarkRuleList() { + const {currentIndex,currentUniversalPageIndex,currentPageIndex,universalMarkRules} = this; + if (currentIndex) { + //通用评判 + return universalMarkRules.slice(currentUniversalPageIndex * 7, (currentUniversalPageIndex + 1) * 7) + } else { + return universalMarkRules.slice(currentPageIndex * 7, (currentPageIndex + 1) * 7) + } + } + + build() { + Column() { + Column() { + Column() { + Row() { + Row() { + ForEach(['人工评判'], (text, index) => { + + Row() { + Text(text) + .fontColor(index === this.currentIndex ? this.selected.fontColor : this.unselected.fontColor) + .fontSize(this.fontSize) + .fontWeight(500) + } + .width(180) + .height(70) + .backgroundColor(index === this.currentIndex ? this.selected.bgColor : this.unselected.bgColor) + .justifyContent(FlexAlign.Center) + .justifyContent(FlexAlign.Center) + .borderRadius({ topLeft: 20, topRight: 20 }) + .margin({ right: 10 }) + .onClick(() => { + this.currentIndex = index; + this.selectedLine = -1; + // if(index === 1) { + // this.universalMarkRules = this.markRules.filter(item => item.itemno == 20 ) + // }else{ + // this.universalMarkRules = this.markRules.filter(item => this.currentItems.includes(item.itemno+'')) + // } + }) + }) + } + + Row() { + if ( + (Math.ceil(this.universalMarkRules.length / 7 - 1)) >= (this.currentIndex ? this.currentUniversalPageIndex : this.currentPageIndex) && + (this.currentIndex ? this.currentUniversalPageIndex : this.currentPageIndex) > 0 + ) { + Row() { + Row() { + }.width(36).height(36).backgroundImage($rawfile(`judge/km3/zuo_nor.png`)).margin({ left: 24, top: 4 }) + + Text('上一页') { + }.fontColor('#FFF').fontSize(this.fontSize) + } + .width(160) + .height(80) + .justifyContent(FlexAlign.Start) + .alignItems(VerticalAlign.Center) + .backgroundImage($rawfile(`judge/km3/button_nor.png`)) + .backgroundImageSize({ width: '100%', height: '100%' }) + .onClick(() => { + this.goPage(0) + }) + } + + if ( + (Math.ceil(this.universalMarkRules.length / 7 - 1)) > (this.currentIndex ? this.currentUniversalPageIndex : this.currentPageIndex) + ) { + Row() { + Text('下一页') { + }.fontColor('#FFF').fontSize(this.fontSize).padding({ left: 30 }) + + Row() { + }.width(36).height(36).backgroundImage($rawfile(`judge/km3/you_nor.png`)).margin({ left: 4, top: 4 }) + } + .width(160) + .height(80) + .justifyContent(FlexAlign.Start) + .alignItems(VerticalAlign.Center) + .backgroundImage($rawfile(`judge/km3/button_nor.png`)) + .backgroundImageSize({ width: '100%', height: '100%' }) + .onClick(() => { + this.goPage(1) + }) + } + + Row() { + Text('扣 分') { + }.fontColor('#FFF').fontSize(this.fontSize).padding({ left: 49 }) + } + .width(160) + .height(80) + .justifyContent(FlexAlign.Start) + .alignItems(VerticalAlign.Center) + .backgroundImage($rawfile(`judge/km3/button_nor.png`)) + .backgroundImageSize({ width: '100%', height: '100%' }) + .onClick(() => { + const index = this.currentIndex ? this.currentUniversalPageIndex : this.currentPageIndex; + const mark = this.universalMarkRules[index * 7 + this.selectedLine]; + const {avPlayer,kssycs} = this; + this.kfdmArr.push({ xmdm: 1, kfdm: mark.markserial, markreal: mark.markreal }) + + //计算总扣分 + let score = this.kfdmArr.reduce((p, n) => { + p += n.markreal + return p + }, 0); + avPlayer.playAudio([`voice/${mark.markcatalog}.mp3`]); + console.info('surenjun',score) + if(!globalThis.singlePlay){ + if (score < -90) { + avPlayer.playAudio([ + 'voice/exam_waiting.mp3', + kssycs == '1' ? 'voice/unqualified_one.wav' : 'voice/unqualified_two.wav' + ]); + + }; + } + + this.confirmMark(this.kfdmArr.map((kf) => ({ + xmdm:kf.xmdm, + kfdm:kf.kfdm, + }))) + + }) + } + }.width('100%').justifyContent(FlexAlign.SpaceBetween) + + Column() { + ForEach(this.getCurrentMarkRuleList(), (item, index) => { + Row() { + Text(`${item.markshow} (${item.markcatalog})`).fontColor('#FFF').fontSize(this.fontSize).fontWeight(500) + Row() { + Text(item.markreal + '').fontColor('#FFF').fontSize(this.fontSize).fontWeight(500) + } + } + .width('100%') + .height(75) + .justifyContent(FlexAlign.SpaceBetween) + .alignItems(VerticalAlign.Center) + .padding({ left: 20, right: 20 }) + .backgroundColor(this.getSelectedLine(index)) + .onClick(() => { + this.selectedLine = index + }) + }) + } + } + } + .width(1300) + .height(710) + .position({ x: '15%', y: '10%' }) + .backgroundColor('#E6E3DF') + .padding({ top: 15, bottom: 15, left: 25, right: 25 }) + .borderRadius(20) + + Row() { + } + .width(100) + .height(100) + .position({ y: '85%', x: '50%' }) + .backgroundImage($rawfile('judge/km3/close_nor.png')) + .backgroundImageSize({ width: '100%', height: '100%' }) + .onClick(() => { + this.closePopup() + }) + }.width('100%').height('100%').position({ y: 0 }).backgroundColor('rgba(0,0,0,0.7)') + } +} \ No newline at end of file diff --git a/entry/src/main/ets/pages/compontents/judge/RealTime.ets b/entry/src/main/ets/pages/compontents/judge/RealTime.ets index 9a69e4b2..7f17973a 100644 --- a/entry/src/main/ets/pages/compontents/judge/RealTime.ets +++ b/entry/src/main/ets/pages/compontents/judge/RealTime.ets @@ -1,5 +1,5 @@ import apiJudgeSdk from 'libJudgeSdk.so'; -import Judge from '../../judgeSDK/utils/judge-real'; +import Judge from '../../judgeSDK/utils/judgeReal'; import { MarkRule, Project, ProjectObj } from '../../judgeSDK/api/judgeSDK.d'; import common from '@ohos.app.ability.common'; diff --git a/entry/src/main/ets/pages/judgeSDK/api/index.ts b/entry/src/main/ets/pages/judgeSDK/api/index.ts index 6ca305c4..e9cb7df2 100644 --- a/entry/src/main/ets/pages/judgeSDK/api/index.ts +++ b/entry/src/main/ets/pages/judgeSDK/api/index.ts @@ -170,6 +170,26 @@ export async function examJudgeSetPerformCallback(fn){ const temp = libJudgeSdk.examJudgeSetPerformCallback(fn); return await handle(temp,'examJudgeSetPerformCallback') } + +/** + * + * @desc 语音播报结束 + * / + */ + +export async function examJudgeSoundEnd(param:{ + //项目代码 + itemno:number, + //语音码 + code:string, + //语音类型 + type:number, +}){ + const {itemno,code,type} = param; + const temp = libJudgeSdk.examJudgeSoundEnd(itemno,code,type); + return await handle(temp,'examJudgeSoundEnd') +} + /* * @desc通用处理函数 * diff --git a/entry/src/main/ets/pages/judgeSDK/api/judgeSDK.d.ts b/entry/src/main/ets/pages/judgeSDK/api/judgeSDK.d.ts index 4a49c751..ba4eace8 100644 --- a/entry/src/main/ets/pages/judgeSDK/api/judgeSDK.d.ts +++ b/entry/src/main/ets/pages/judgeSDK/api/judgeSDK.d.ts @@ -16,7 +16,8 @@ export interface MarkRule{ itemno?:number markcatalog?:string markshow?:string - markserial?:number + markserial?:string + markstandard?:number, markreal?:number kfxh?:string onlyoneid?:number @@ -118,7 +119,8 @@ export interface EXAMDATA{ sound:{ xmdm:number, //语音播放文件代码 - code:string + code:string, + type:number }, //模拟灯光 mndg:string @@ -138,7 +140,9 @@ export interface SOUND { //项目代码 xmdm:number //语音播放提示代码 - code:string + code:string, + //0:普通,1:模拟灯光 + type:number } export interface SYSSET { v_no:string, @@ -147,7 +151,7 @@ export interface SYSSET { } export interface ProjectObj { - [k:any]:Project + [k:string]:Project } diff --git a/entry/src/main/ets/pages/judgeSDK/judge.ts b/entry/src/main/ets/pages/judgeSDK/judge.ts index 4330a17f..8d1d683d 100644 --- a/entry/src/main/ets/pages/judgeSDK/judge.ts +++ b/entry/src/main/ets/pages/judgeSDK/judge.ts @@ -6,15 +6,14 @@ import buffer from '@ohos.buffer'; import { testKmItems, testMarkRules } from './dataTest/index'; import { EXAMDATA, SOUND } from './api/judgeSDK'; -import VoiceAnnounce from './utils/voice-announcements'; -import FileModel from './utils/file-model'; -import FilePhoto from './utils/file-photo'; +import VoiceAnnounce from './utils/voiceAnnouncements'; +import FileModel from './utils/fileModel'; +import FilePhoto from './utils/filePhoto'; import FileUtil from '../../common/utils/File'; -import FileLog from '../judgeSDK/utils/file-log'; +import FileLog from './utils/fileLog'; -import JudgeTask from './utils/judge-task'; -import SimulateLights from './utils/simulate-lights'; -import { judgeConfig } from './utils/judge-config'; +import JudgeTask from './utils/judgeTask'; +import { judgeConfig } from './utils/judgeConfig'; import { uploadExamProgressData, writeObjectOut } from '../../api/judge'; import { @@ -36,35 +35,33 @@ import { plcStrToWXJson, promptWxCode, senorToWXDataStr -} from './utils/judge-common'; +} from './utils/judgeCommon'; import { examJudgeArtificialItem, examJudgeArtificialMark, examJudgeBeginExam, examJudgeEndExam, examJudgeInit, - examJudgeMapSetParam, - examJudgeMapSetScaling, + examJudgeSoundEnd, examJudgeRealExam, examJudgeSetLogCallback, examJudgeSetPerformCallback, examJudgeSetRealExamCallback } from './api/index'; import UsbService from '../../common/service/usbService'; + import Prompt from '@system.prompt'; const judgeTag = 'SURENJUN_JUDGE' export default class Judge { - constructor(judgeUI) { this.serialIndex = 1; this.judgeUI = judgeUI //语音播放工具 this.avPlayer = new VoiceAnnounce(); - new SimulateLights(this.avPlayer) //模型工具 this.fileModel = new FileModel(judgeUI.context); //文件工具 @@ -133,7 +130,7 @@ export default class Judge { console.info(judgeTag, '2.注册日志回调完成') let initInfo = isTrajectoryOpen ? JSON.parse(strArr[0]) : await this.getJudgeInitData(); - console.log('SURENJUN_JUDGE',isJudgeInitBool,isTrajectoryOpen,JSON.stringify(initInfo)) + //相关评判初始化只做一次 if (!isJudgeInitBool) { await fileLog.setExamJudgeData(initInfo) @@ -141,6 +138,7 @@ export default class Judge { globalThis.isJudgeInitBool = true console.info(judgeTag, '4.评判初始化完成') } else { + await fileLog.setExamJudgeData(initInfo) } globalThis.isJudge = true @@ -157,35 +155,140 @@ export default class Judge { this.performInfo = performInfo this.judgeUI.jl = Math.ceil((performInfo.qjjl + performInfo.dcjl) / 100) }) + // 3.开始考试 let beginExamInfo = isTrajectoryOpen ? { ...JSON.parse(strArr[1]), replay: 1 } : await getJudgeBeginData() - console.log(judgeTag,'22222',JSON.stringify(beginExamInfo),strArr[1]) - await fileLog.setExamJudgeData(beginExamInfo) - console.log(judgeTag,'333333') - await examJudgeBeginExam(beginExamInfo); - console.log(judgeTag,'4444444') + await fileLog.setExamJudgeData(beginExamInfo) + await examJudgeBeginExam(beginExamInfo); console.info(judgeTag, '6.开始考试注册完成') avPlayer.playAudio(['voice/ksks.WAV']) + this.judgeUI.draw = true + // 处理轨迹plc信息 if (isTrajectoryOpen) { handleTrajectoryUdp(strArr); return } + // 处理实时udp里的plc信号 globalThis.udpClient.onMessage(async (msg) => { handleUdp(msg) }) - } + // 获取评判初始化数据 + getJudgeInitData = async () => { + const {getModelData,getKm3JudgeInitConfig} = this + const carInfo = globalThis.carInfo; + const { examSubject,plateNo,carId } = carInfo; + const {fileLog} = this + const judgeUI = this.judgeUI + const {projectsObj,cdsbInfoObj,markRuleListObj,carType,carName} = judgeUI + const examType = examSubject == 2 ? 'km2' : 'km3' + + let allitems = []; + + if (examSubject == 2) { + allitems = Reflect.ownKeys(cdsbInfoObj).map(cdsbKey => { + const cdsb = cdsbInfoObj[cdsbKey]; + const {xmdm,xmxh,modelKey} = cdsb + return { + xmdm, xmxh, model: getModelData(`${examType}/${modelKey}.txt`) + } + }) + } + const initInfo = { + kskm: examSubject * 1, + kchp: plateNo, + kchm: carId * 1, + kscx: carType, + cxcode: '1', + name: carName, + carmodel: getModelData(`${examType}/${carType}.txt`), + allitems, + mark: Reflect.ownKeys(markRuleListObj).map(ruleKey => (markRuleListObj[ruleKey])) || testMarkRules, + sysset: judgeUI.judgeConfig, + }; + + let km3Config = {} + + if (examSubject) { + km3Config = await getKm3JudgeInitConfig(); + } + // 获取科目三的评判配置 + console.info(judgeTag, '3.获取评判初始化数据完成') + return { + ...initInfo, + ...km3Config, + } + } + // 获取开始考试数据 + getJudgeBeginData = async () => { + const {code,name:examinerName} = globalThis.examinerInfo; + let currentParams: any = router.getParams(); + const {sczb,kfdm} = currentParams; + const {isExam} = this; + const judgeUI = this.judgeUI + const {projects,carType,isDdxk,ddxkTime,projectsCenterObj,ddxkKsxmArr,ddxkKfArr} = judgeUI; + const beginInfo = { + kgid: '012', + kgxm: decodeURI(examinerName || ''), + exam: isExam ? 1 : 0, + //是否回放 + replay: 0, + //生成的轨迹文件 + track: '', + xm: judgeUI.name, + sex: 0, + kslsh: judgeUI.lsh, + sfzmhm: judgeUI.idCard, + ksyy: '', + kscx: carType, + kkcs: 1, + sfyk: 0, + ykkkcs: 1, + wayno: judgeUI.wayno * 1, + czlx: 0, + kskssj: await systemTime.getCurrentTime(), + ksxm: projects.map(project => { + return { + xmdm: project.projectCode * 1, + xmxh: '', + } + }), + //断点续考 + ddxk: isDdxk ? 1 : 0, + ddkssj: ddxkTime, + ykxm: isDdxk ? (ddxkKsxmArr?.map(projectCenterCode => (projectsCenterObj[projectCenterCode]?.projectCode) * 1)) : [], + kfxm: isDdxk ? (ddxkKfArr?.map(kf => { + const [xmdm, kfdm] = kf.split(',') + return { + xmdm: xmdm * 1, + kfdm + } + })) : [], + yklc: 0, + special: [], + //TODO 科目三参数临时写死 + sczb: (sczb === undefined || sczb == 0)?0:1, + sczbkf:kfdm, + dmndg: false, + nitem1: false, + nitem41: false, + mfxx: false, + mfxxn: false + } + console.info(judgeTag, '5.获取开始考试数据完成') + return beginInfo + } // 项目开始接口同步 beginProject = async (ksxm) => { const carInfo = globalThis.carInfo; @@ -326,28 +429,29 @@ export default class Judge { fileLog.setExamJudgeWuxiData(data) console.info(judgeTag, '上传照片 end') } - // 评判语音提示 goJudgeVoice = async (sound: SOUND) => { - const {avPlayer} = this; - const {xmdm,code} = sound; + const {avPlayer,fileLog} = this; + const {xmdm,code,type} = sound; //判断是不是模拟灯光语音 - const isLight = code.slice(0, 3) === '417'; - if (isLight) { + console.info(judgeTag,JSON.stringify(sound)) + if(type == 1){ console.info(judgeTag, '模拟灯光开始播放:' + code) } avPlayer.playAudio([`voice/${code}.mp3`], true, () => { - if (isLight) { + if (type == 1) { console.info(judgeTag, '播放结束:' + code) - setTimeout(() => { - this.wav = 1; + console.info(judgeTag,JSON.stringify({itemno:xmdm,code,type})) + examJudgeSoundEnd({itemno:xmdm,code,type}) + fileLog.setExamJudgeData({ + method: 'examJudgeArtificialItem', + itemno: xmdm, + type }) + this.wav = 0; } }) - - } - // 处理考试结束 public handEndExam = async (isManual?: Boolean) => { const {isExam,judgeUI,endExam,handleSEP,avPlayer} = this; @@ -380,26 +484,6 @@ export default class Judge { } } - - // 当前项目转换 - getDqxmStr = (type) => { - const projectsObj = this.judgeUI.projectsObj - return projectsObj[type]?.abbreviation || '通用评判' - } - - // 扣分项目转换 - getKfStr = (code) => { - const markRuleListObj = this.judgeUI.markRuleListObj; - const thisMark = markRuleListObj[code] - return { - desc: thisMark.markshow, - score: thisMark.markreal, - markcatalog: thisMark.markcatalog, - markserial: thisMark.markserial, - kfxh: thisMark.kfxh - } - } - // 考试结束 public endExam = async (isManual?: Boolean) => { const carInfo = globalThis.carInfo; @@ -449,55 +533,23 @@ export default class Judge { }, 3000) } - - // 获取评判初始化数据 - getJudgeInitData = async () => { - const {getModelData,getKm3JudgeInitConfig} = this - const carInfo = globalThis.carInfo; - const { examSubject,plateNo,carId } = carInfo; - const {fileLog} = this - const judgeUI = this.judgeUI - const {projectsObj,cdsbInfoObj,markRuleListObj,carType,carName} = judgeUI - - const examType = examSubject == 2 ? 'km2' : 'km3' - - let allitems = []; - - if (examSubject == 2) { - allitems = Reflect.ownKeys(cdsbInfoObj).map(cdsbKey => { - const cdsb = cdsbInfoObj[cdsbKey]; - const {xmdm,xmxh,modelKey} = cdsb - return { - xmdm, xmxh, model: getModelData(`${examType}/${modelKey}.txt`) - } - }) - } - const initInfo = { - kskm: examSubject * 1, - kchp: plateNo, - kchm: carId * 1, - kscx: carType, - cxcode: '1', - name: carName, - carmodel: getModelData(`${examType}/${carType}.txt`), - allitems, - mark: Reflect.ownKeys(markRuleListObj).map(ruleKey => (markRuleListObj[ruleKey])) || testMarkRules, - sysset: judgeUI.judgeConfig, - }; - - let km3Config = {} - - if (examSubject) { - km3Config = await getKm3JudgeInitConfig(); - } - // 获取科目三的评判配置 - console.info(judgeTag, '3.获取评判初始化数据完成') + // 当前项目转换 + getDqxmStr = (type) => { + const projectsObj = this.judgeUI.projectsObj + return projectsObj[type]?.abbreviation || '通用评判' + } + // 扣分项目转换 + getKfStr = (code) => { + const markRuleListObj = this.judgeUI.markRuleListObj; + const thisMark = markRuleListObj[code] return { - ...initInfo, - ...km3Config, + desc: thisMark.markshow, + score: thisMark.markreal, + markcatalog: thisMark.markcatalog, + markserial: thisMark.markserial, + kfxh: thisMark.kfxh } } - // 消息心跳发送 getMessageHeartbeat = async (isEnd?: Boolean) => { const carInfo = globalThis.carInfo; @@ -597,66 +649,6 @@ export default class Judge { this.serialIndex += 1; return Array2Byte(tempArr) } - - // 获取开始考试数据 - getJudgeBeginData = async () => { - console.log('globalThis.carInfo.wayno',globalThis.carInfo.wayno) - const {code,name:examinerName} = globalThis.examinerInfo; - const {isExam,isTrajectoryOpen} = this; - const judgeUI = this.judgeUI - const {projects,carType,isDdxk,ddxkTime,projectsCenterObj,ddxkKsxmArr,ddxkKfArr} = judgeUI; - const beginInfo = { - kgid: '012', - kgxm: decodeURI(examinerName || ''), - exam: isExam ? 1 : 0, - //是否回放 - replay: 0, - //生成的轨迹文件 - track: '', - xm: judgeUI.name, - sex: 0, - kslsh: judgeUI.lsh, - sfzmhm: judgeUI.idCard, - ksyy: '', - kscx: carType, - kkcs: 1, - sfyk: 0, - ykkkcs: 1, - wayno: Number(globalThis.carInfo.wayno)|| 0, - czlx: 0, - kskssj: await systemTime.getCurrentTime(), - ksxm: projects.map(project => { - return { - xmdm: project.projectCode * 1, - xmxh: '', - } - }), - //断点续考 - ddxk: isDdxk ? 1 : 0, - ddkssj: ddxkTime, - ykxm: isDdxk ? (ddxkKsxmArr?.map(projectCenterCode => (projectsCenterObj[projectCenterCode]?.projectCode) * 1)) : [], - kfxm: isDdxk ? (ddxkKfArr?.map(kf => { - const [xmdm, kfdm] = kf.split(',') - return { - xmdm: xmdm * 1, - kfdm - } - })) : [], - yklc: 0, - special: [], - //TODO 科目三参数临时写死 - sczb: 0, - sczbkf: [], - dmndg: false, - nitem1: false, - nitem41: false, - mfxx: false, - mfxxn: false - } - console.info(judgeTag, '5.获取开始考试数据完成') - return beginInfo - } - //获取场地序号 getSbxh = (ksxm, xmxh) => { const {judgeUI} = this; @@ -671,7 +663,6 @@ export default class Judge { const sbxh = currentCdsb.sbbh || '00000000' return sbxh } - getSbbm = (ksxm, xmxh) => { const {judgeUI} = this; const {cdsbInfoObj,projectsObj} = judgeUI; @@ -684,7 +675,6 @@ export default class Judge { const sbxh = currentCdsb.sbbm || '00000000' return sbxh } - // 中心所有项目转换 getTranslateProject = () => { // const {testKmItems} = this; @@ -707,13 +697,11 @@ export default class Judge { } return arr.map(numStr => parseInt(numStr, 2)); } - // 获取考试项目详情 getProjectInfo = (projectCode) => { const judgeUI = this.judgeUI; return judgeUI.projectsObj[projectCode] } - // 获取模型数据 getModelData = (modelName) => { const modelPath = this.modelPath @@ -744,7 +732,6 @@ export default class Judge { itemno: itemno * 1, type: 1 }) - console.info(judgeTag, `人工评判进入项目-${itemno}`) } @@ -864,8 +851,6 @@ export default class Judge { } } - public plcStr: string - private judgeUI // 更改考试状态 goVoiceAnnounce = async (event, xmdm, kf, xmjs) => { const {projectsObj,judgeConfigObj} = this.judgeUI; @@ -931,7 +916,6 @@ export default class Judge { break } } - // 获取plc数据 getPlcData = async (plc: string) => { const {fileLog,mndgStr,rmndg,wav} = this; @@ -960,7 +944,6 @@ export default class Judge { // 处理轨迹plc信号 handleTrajectoryUdp = async (strArr) => { const {fileLog} = this; - console.log('kkkkk') let num = 2; const {usbService} = this; const judgeTimer = setInterval(async () => { @@ -1088,7 +1071,8 @@ export default class Judge { judgeUI.projectsObj = deepClone(copyProjectsObj) } } - + public plcStr: string + private judgeUI private fileLog private totalScore: number private folderPath: string diff --git a/entry/src/main/ets/pages/judgeSDK/utils/file-log.ts b/entry/src/main/ets/pages/judgeSDK/utils/fileLog.ts similarity index 100% rename from entry/src/main/ets/pages/judgeSDK/utils/file-log.ts rename to entry/src/main/ets/pages/judgeSDK/utils/fileLog.ts diff --git a/entry/src/main/ets/pages/judgeSDK/utils/file-model.ts b/entry/src/main/ets/pages/judgeSDK/utils/fileModel.ts similarity index 100% rename from entry/src/main/ets/pages/judgeSDK/utils/file-model.ts rename to entry/src/main/ets/pages/judgeSDK/utils/fileModel.ts diff --git a/entry/src/main/ets/pages/judgeSDK/utils/file-photo.ts b/entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ts similarity index 100% rename from entry/src/main/ets/pages/judgeSDK/utils/file-photo.ts rename to entry/src/main/ets/pages/judgeSDK/utils/filePhoto.ts diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judge-common.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts similarity index 100% rename from entry/src/main/ets/pages/judgeSDK/utils/judge-common.ts rename to entry/src/main/ets/pages/judgeSDK/utils/judgeCommon.ts diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judge-config.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts similarity index 92% rename from entry/src/main/ets/pages/judgeSDK/utils/judge-config.ts rename to entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts index 91a24376..08c40c34 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judge-config.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeConfig.ts @@ -9,7 +9,7 @@ export const judgeConfig = { // 本地模型地址 modelPath: 'models/model_enc', // 轨迹回放地址 - trajectoryPath: 'logs/2024_06_18/0000000000001_342323199501470011_测试学员1_2024_06_26_10_04_23/judge_exam_data.txt' + trajectoryPath: 'logs/2024_06_18/0000000000001_342323199501470011_测试学员1_2024_07_03_14_55_22/judge_exam_data.txt' } //0000000000001_342323199501470011_测试学员1_2024_04_28_10_59_44 // 模拟灯光轨迹 diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judge-real.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts similarity index 87% rename from entry/src/main/ets/pages/judgeSDK/utils/judge-real.ts rename to entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts index 28ada877..76f23752 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/judge-real.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/judgeReal.ts @@ -5,7 +5,7 @@ import { import systemTime from '@ohos.systemDateTime'; import FileUtil from '../../../common/utils/File' -import FileModel from './../utils/file-model' +import FileModel from './fileModel' import {testRealExam} from '../dataTest/index' const judgeTag = 'SURENJUN_JUDGE' @@ -27,11 +27,14 @@ export default class JudgeImg { } async init(){ + const isJudgeInitBool = globalThis.isJudgeInitBool; const {judgeUI} = this; - console.info(judgeTag,'1.进入绘制入口') + console.info(judgeTag,'1.进入评判入口') + await examJudgeMapSetParam(640, 480); //设置参数宽、高 await examJudgeMapSetScaling(120); //设置缩放比例,一般默认填100(就是100%的意思) ,数字越大视野越大,数字越小视野越小,不能为0 judgeUI.draw = true + } //获取评判初始化数据 diff --git a/entry/src/main/ets/pages/judgeSDK/utils/judge-task.ts b/entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts similarity index 100% rename from entry/src/main/ets/pages/judgeSDK/utils/judge-task.ts rename to entry/src/main/ets/pages/judgeSDK/utils/judgeTask.ts diff --git a/entry/src/main/ets/pages/judgeSDK/utils/simulate-lights.ts b/entry/src/main/ets/pages/judgeSDK/utils/simulate-lights.ts deleted file mode 100644 index 96903f15..00000000 --- a/entry/src/main/ets/pages/judgeSDK/utils/simulate-lights.ts +++ /dev/null @@ -1,27 +0,0 @@ -import VoiceAnnounce from './voice-announcements' - -// 模拟灯光 -export default class SimulateLights{ - - //模拟灯光播放5个 - private avPlayer - - //语音文件存放目录 - private voiceDir:string = 'judge/km3/lights' - - constructor(avPlayer) { - this.avPlayer = avPlayer; - this.playLight() - } - - //播放灯光语音 - public async playLight(){ - - } - - //获取随机播放序号 - private async getRandomIndex(){ - - } - -} \ No newline at end of file diff --git a/entry/src/main/ets/pages/judgeSDK/utils/voice-announcements.ts b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts similarity index 98% rename from entry/src/main/ets/pages/judgeSDK/utils/voice-announcements.ts rename to entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts index 16a14643..7be0b853 100644 --- a/entry/src/main/ets/pages/judgeSDK/utils/voice-announcements.ts +++ b/entry/src/main/ets/pages/judgeSDK/utils/voiceAnnouncements.ts @@ -16,7 +16,7 @@ export default class VoiceAnnounce{ this.queue = [] } - async playAudio(urls:string[],shit,callback:Function){ + async playAudio(urls:string[],shit?:boolean,callback?:Function){ const {isStopped,queue} = this; this.callback = callback if(shit){ diff --git a/entry/src/main/resources/base/media/sczb_btn.png b/entry/src/main/resources/base/media/sczb_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..bd3dee617562c8efb924d1e5c3bedf172bace8b5 GIT binary patch literal 39799 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 kE@G3~|3m&1($w{cmRaNSkYj)D4tRQ$