import router from '@ohos.router'; import Prompt from '@system.prompt'; import common from '@ohos.app.ability.common'; import EndPoPup from './compontents/judge/EndPopup'; 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//judgeCommon'; import {uploadExamMileage} from '../api/judge' import DwztErrorPopup from './compontents/judge/DwztErrorPopup' import {debounce} from '../common/utils/tools' import { CARINFO, CDSBInfo, LANE, MAPITEMPOINTITEM, MAPPOINT, MarkRule, Project, ProjectObj, SYSSET, SYSTEMPARMARR } from './judgeSDK/api/judgeSDK.d'; 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/judgeConfig'; import FileUtil from '../common/utils/File'; import SignDisplayCom from './compontents/signDisplayCom'; import promptAction from '@ohos.promptAction'; @Entry @Component struct Index { async aboutToDisappear(){ clearInterval(this.mileageTimer) } async aboutToAppear() { globalThis.windowClass.setWindowSystemBarEnable([]) const time = await getCurrentTime() this.startTime = time.split(' ')[1] this.startFullTime = await getCurrentTime(1); this.startHourTime = await getCurrentHourTime() this.startExamTime = time setInterval(async () => { this.time = await getCurrentTime(); this.examTime += 1; }, 1000); //初始化数据库表 await this.initDb() //断点续考 await this.goDdxkItems() //初始化评判 const judge = await this.initJudge(); this.judge = judge } //初始化相关数据库表 async initDb() { const examSubject = globalThis.carInfo.examSubject; this.examSubject = examSubject; const {isTrajectoryOpen,trajectoryPath} = judgeConfig await this.initStudent(); await this.initCar(); //是否开启轨迹回放模式 if (isTrajectoryOpen) { this.initTrajectoryParam(trajectoryPath) } else { await this.initSystemParam() await this.initMarkRules(); await this.initSysset(); this.singlePlay = globalThis.singlePlay } await this.initCDSBInfo() await this.initItemInfo() // 科目三新增读取表数据 if (examSubject == 3) { await this.initMapPoint() await this.initMapPointItem() //定时上传考试里程 // let mileageTimer = setInterval(()=>{ // this.uploadMileage() // },5000) // this.mileageTimer = mileageTimer } } // 查询考车信息 async initCar() { const result = await getSyncData('ES_CARINFO') const carInfo = result[0] || {}; this.carName = decodeURI(carInfo.carclass) this.carType = carInfo.kscx this.carinfoArrr.push({ CARID: carInfo.carid, IPADDR: '', CARCLASS: decodeURI(carInfo.carclass), KSCX: carInfo.kscx, CARNAME: decodeURI(carInfo.carclass), FLAG: carInfo.flag, BK1: carInfo.bk1, BK2: carInfo.bk2, }) console.info('surenjun =>carinfoArrr',JSON.stringify( this.carinfoArrr)) } // 获取考生信息 async initStudent() { const students = await getSyncData('USER') const stuInfo = students[0] || {}; const {xm,sfzmhm,lsh,kszp,ksdd,kssycs,kslx,ksxl,xldm} = stuInfo; this.name = xm || '测试考生'; this.idCard = sfzmhm || '01234567891010'; this.lsh = globalThis.singlePlay?'0000000000000':lsh; this.kszp = kszp; this.ksdd = ksdd; this.kssycs = kssycs; this.ksxl = ksxl; this.wayno = ksxl; this.xldm = xldm; this.kslx = kslx; } // 获取扣分代码信息 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, markserial: mark.markserial, kfxh: mark.kfxh, OnlyOneKind: mark.onlyoneid * 1, NoCancelId: mark.nocancelid * 1, GPS_SID: mark.gps_sid == 0 ? false : true } //筛选出人工评判的扣分 if (Number(tempObj.markserial) > 100 && Number(tempObj.markserial) < 200) { this.manualMarkRules.push(tempObj) } this.markRuleListObj[`${mark.itemno}_${mark.markserial}`] = { ...tempObj, markserial: mark.markserial, }; }) } // 获取sysset表信息 async initSysset(sysset?: SYSSET[]) { const syssetParams = sysset || await getSyncData('MA_SYSSET') //@ts-ignore const serialNumberArr = syssetParams.filter(sys => sys.v_no === '901'); console.info('surenjun serialNumberArr' + JSON.stringify(serialNumberArr)) this.serialNumber = (serialNumberArr[0] && serialNumberArr[0].v_value) || ''; const {isTrajectoryOpen} = judgeConfig const syssetJudgeConfigArr = [] //@ts-ignore syssetParams.forEach((sys) => { if (isTrajectoryOpen) { sys.v_no = sys.key; sys.v_name = sys.name; sys.v_value = sys.value } const {v_no,v_value} = sys; const v_no_num = v_no * 1; const value = decodeURIComponent(v_value) if (v_no_num >= 10 && v_no_num <= 900) { syssetJudgeConfigArr.push({ key: v_no_num, value: value, name: decodeURI(sys.v_name) }) } //科目三应行驶距离参数 if (sys.v_no == '303') { 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; } //初始化systemParam表 async initSystemParam(sysParam?: SYSTEMPARMARR[]) { const systemParms: any = sysParam || await getSyncData('MA_SYSTEMPARM') console.info('surenjun => systemParms',JSON.stringify(systemParms)); let currentParams: any = router.getParams(); const {carName,carType,examSubject} = this; //小车车型列表 const sCarTypes = ['C1', 'C2', 'C5'] if (globalThis.singlePlay) { this.wayno = currentParams.wayno || 1; } //真实监管下发的项目 let kStringArr: string[] = (currentParams.kString?.split(',') || []).filter(item => item); console.info('surenjun kStringArr',JSON.stringify(kStringArr)) let isInExam = kStringArr.length > 0; const {isTrajectoryOpen} = judgeConfig let carNo = '', allItems = []; systemParms.forEach((systemParm) => { if (isTrajectoryOpen) { systemParm.no1 = systemParm.NO1 + ''; systemParm.no2 = systemParm.NO2 + ''; systemParm.no3 = systemParm.NO3 + ''; systemParm.txt1 = systemParm.TXT1; systemParm.txt2 = systemParm.TXT2; systemParm.txt3 = systemParm.TXT3; } const {no1,no2,no3,} = systemParm; const txt1 = decodeURI(systemParm.txt1) const txt2 = decodeURI(systemParm.txt2) //获取当前考车的no2 if (no1 == 3 && no3 == 1) { if (txt1 === carName) { carNo = no2 this.carlist = carNo console.info('surenjun carNo => ',carNo) } } //获取及格分数线 if(no1 == 3 && no3 == 3 && carNo === no2){ this.passingScore = Number(txt1) || 0; } //获取当前考车的考试项目 if (carNo !== '' && no1 == 3 && no2 == carNo && no3 == 10) { allItems = decodeURIComponent(systemParm.txt1).split(',').filter(txt => txt !== '') console.info('surenjun', JSON.stringify(allItems)) } if ( //科目二获取项目 (examSubject == 2 && allItems.length && no1 == 6 && allItems.includes(no2)) || //科目三获取项目 (examSubject == 3 && no1 == 6) ) { const name = decodeURI(systemParm.txt1) //小车过滤掉 夜间模拟行驶 if (sCarTypes.includes(carType) && name === '夜间行驶') { return } const currentProject = { name, abbreviation: decodeURI(systemParm.txt3), projectCode: no2, projectCodeCenter: txt2, //是否是必考 加减档设置成非必考 isRequired: no2== 14 ? false : allItems.includes(no2 + ''), //是否考过了 isEnd: false, //项目开始数据是否上传过 isUpload:false, } this.projectsObj[no2*1] = currentProject this.projectsCenterObj[txt2] = currentProject this.projects.push(currentProject); //真实监管下发考试项目 if(isInExam && !kStringArr.includes(txt2)){ this.projectsObj[no2*1].type = '3' this.projectsObj[no2*1].isUpload = true this.projectsObj[no2*1].isEnd = true this.projectsCenterObj[txt2].type = '3' this.projectsCenterObj[txt2].isUpload = true this.projectsCenterObj[txt2].isEnd = true this.isDdxk = true this.ddxkKsxmArr.push(txt2) } } this.systemparmArr.push({ 'NO1': no1 * 1, 'NO2': no2 * 1, 'NO3': no3 * 1, 'TXT1': decodeURIComponent(systemParm.txt1), 'TXT2': decodeURIComponent(systemParm.txt2), 'TXT3': decodeURIComponent(systemParm.txt3), }) }) const projects = this.projects; console.info('surenjun',JSON.stringify(this.ddxkKsxmArr)) if (!projects.length) { Prompt.showToast({ message: '读取数据库信息失败,请重新联网更新!', duration: 8000 }); router.back(); } } // 获取场地设备信息 async initCDSBInfo() { const cdsbParams = await getSyncData('MA_CDSBINFO') //只记录考试项目的模型 const projectsObj = this.projectsObj //@ts-ignore cdsbParams.forEach((cdsb) => { const key = decodeURI(cdsb.itemsno); const newKey = key.split('~').join('_') //@ts-ignore const xmdm = key.split('~')[0] * 1 if(projectsObj[xmdm]){ this.cdsbInfoObj[newKey] = { kdid: cdsb.kdid, sbbh: cdsb.sbbh, sbbm: cdsb.sbbm, itemsno: key, modelKey: newKey, xmdm, xmxh: key.split('~')[1], } } }) } // 获取itemInfo表信息 async initItemInfo(){ const infoParams = await getSyncData('MA_ITEMINFO'); const carlist = this.carlist; const projectsObj = this.projectsObj //@ts-ignore infoParams.forEach((info)=>{ const key = decodeURI(info.itemsno); const carlistArr = info.carlist === '' ? [] : (decodeURI(info.carlist).split(',') || []); const newKey = key.split('~').join('_') //@ts-ignore const xmdm = key.split('~')[0] * 1 if(projectsObj[xmdm] && (carlistArr.length == 0 || carlistArr.includes(carlist))){ this.itemInfoObj[newKey] = { modelKey: newKey, xmdm, xmxh: key.split('~')[1], } } }) } // 评判相关初始化 async initJudge() { const judge = new Judge(this); await judge.onJudgeFn(async (judgeData) => { const {xmmcStr,carztStr,kfArr} = judgeData; this.xmmcStr = xmmcStr; this.carztStr = carztStr; this.kfArr = kfArr; }); return judge } // 断点续考判断 async goDdxkItems() { const judgeConfigObj = this.judgeConfigObj const examSubject = this.examSubject //科目二强制开始断点续考 if (judgeConfigObj['432'] != 0 || examSubject == 2) { //断点续考判断 let currentParams: any = router.getParams(); const examItems: string = currentParams?.examItems; // 2024-01-03 16:29:26;0;20300,;2,4^2,4;null; if (examItems !== '' && examItems !== undefined) { console.info('surenjun examItems=>', JSON.stringify(examItems)) const examItemsArrs = examItems.split(';'); const startTime = examItemsArrs[0] const ddxkKsxmArr = examItemsArrs[2]?.split(',').filter(item => item) || [] const ddxkKfArr = examItemsArrs[3]?.split('^').filter(item => item) || [] if (judgeConfigObj['432'] == 2 || examSubject == 2) { //TODO 带项目带里程 if (ddxkKsxmArr?.length) { //断点续考 ddxkKsxmArr.forEach(xmdm => { const projectCode = this.projectsCenterObj[xmdm].projectCode if(this.projectsObj[projectCode]){ this.projectsObj[projectCode].type = '3' this.projectsObj[projectCode].isUpload = true this.projectsObj[projectCode].isEnd = true } }) this.ddxkKsxmArr = ddxkKsxmArr } } //扣分续考 ddxkKfArr.forEach((kf) => { const [xmdm, kfdm] = kf.split(',') const currentKf = this.markRuleListObj[`${xmdm}_${kfdm}`] const currentProject = this.projectsObj[xmdm] || { name: '通用评判' } if (this.projectsObj[xmdm]) { this.projectsObj[xmdm].type = '4' } 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.ddxkKfArr = ddxkKfArr this.ddxkTime = Date.parse(startTime); this.isDdxk = true } } } // 初始化mapPoint表 async initMapPoint() { const pointParams = await getSyncData('MA_MAP_POINT') //@ts-ignore pointParams.forEach(point => { const { point_no, gps_e, gps_n, point_no_f, point_type, road_code, gps_e_Location, gps_n_Location, f_gps_e, f_gps_n, passed } = point; this.mapPointArr.push({ point_no: point_no * 1, gps_e: gps_e * 1, gps_n: gps_n * 1, point_no_f: point_no_f * 1, point_type: point_type * 1, road_code, gps_e_Location: (gps_e_Location || 0) * 1, gps_n_Location: (gps_n_Location || 0) * 1, f_gps_e: f_gps_e * 1, f_gps_n: f_gps_n * 1, passed: passed * 1 }) }) } // 初始化mapPointItem表 async initMapPointItem() { const pointItemPoints = await getSyncData('MA_MAP_POINT_ITEM'); //@ts-ignore pointItemPoints.forEach(itemPoint => { const {point_no,itemno,itemno1,subname} = itemPoint this.mapPointItemArr.push({ point_no: point_no * 1, itemno: itemno * 1, itemno1: itemno1 * 1, subname }) }) } // 初始化本地systemparam表、markrule表 async initTrajectoryParam(trajectoryPath: string) { const {isTrajectoryOpen} = judgeConfig //轨迹回放读取 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) const beginDataObj = JSON.parse(beginData) const examSubject = globalThis.carInfo.examSubject; this.examSubject = isTrajectoryOpen ? (initDataObj.kskm * 1) : examSubject; globalThis.carInfo.examSubject = this.examSubject this.singlePlay = beginDataObj.exam == 0; this.carName = initDataObj.name; globalThis.singlePlay = beginDataObj.exam == 0; await this.initSystemParam(initDataObj.systemparm) await this.initMarkRules(initDataObj.mark); await this.initSysset(initDataObj.sysset); } // 上传考试里程 async uploadMileage(){ if(!globalThis.singlePlay){ const {lsh,startExamTime:kskssj,jl:kslc} = this const { carId ,examinationRoomId} = globalThis.carInfo; await uploadExamMileage({ carId,examinationRoomId, lsh,kskssj,kslc }) console.info('surenjun 考试里程上传成功') } } build() { Column() { Row() { Row() { Image($rawfile('judge/signal_logoS.png')).width(120) Text(this.time).fontColor('#CCB48F').fontSize(32).padding({ left: 10, right: 5 }) Image($rawfile(this.isDwztRight ? 'judge/xh_green.png' : 'judge/xh_red.png')).width(50) }.padding({ left: 20 }) Row() { Text(`当前项目:${this.xmmcStr || '无'} `).fontColor('#E5CCA1').fontSize(32) } } .width('100%') .height('96') .backgroundColor('#001A33') .padding({ left: 15, right: 15 }) .justifyContent(FlexAlign.SpaceBetween) .alignItems(VerticalAlign.Center) Row() { Row() { Column() { Row() { Column() { Row() { Text('考生姓名:').fontColor('#E5CCA1').fontSize(this.FONTSIZE) Text(this.name).fontColor('#FFF').fontSize(this.FONTSIZE) }.margin({ bottom: 10 }) Row() { Text('开始时间:').fontColor('#E5CCA1').fontSize(this.FONTSIZE) Text(this.startTime).fontColor('#FFF').fontSize(this.FONTSIZE) }.margin({ bottom: 10 }) if (this.examSubject == 3) { Row() { Text('考试路线:').fontColor('#E5CCA1').fontSize(this.FONTSIZE) Text(`线路${this.wayno}`).fontColor('#FFAD33').fontSize(this.FONTSIZE) } } }.width('45%').alignItems(HorizontalAlign.Start) Column() { Row() { Text('身份证号:').fontColor('#E5CCA1').fontSize(this.FONTSIZE) Text(this.idCard).fontColor('#FFF').fontSize(this.FONTSIZE) }.margin({ bottom: 10 }) Row() { Text('考试用时:').fontColor('#E5CCA1').fontSize(this.FONTSIZE) Text(formatTime(this.examTime)).fontColor('#FFF').fontSize(this.FONTSIZE) }.margin({ bottom: 10 }) if (this.examSubject == 3) { Row() { if (this.judgeConfigObj['375'] == '0') { Text(`应行驶:${this.examMileage}m`) .fontColor('#E5CCA1') .fontSize(this.FONTSIZE) .padding({ right: 20 }) } Text(`已行驶:${this.jl}m`).fontColor('#FFAD33').fontSize(this.FONTSIZE) } } }.alignItems(HorizontalAlign.Start) }.width('100%') Column() { Row() { Text(this.carztStr).fontColor('#FFA500').fontSize(this.FONTSIZE) if (this.judgeConfigObj['342'] == '0') { Text(`${this.dw}挡`).fontColor('#FFA500').fontSize(this.FONTSIZE).padding({ left: 15, right: 15 }) Text(`${this.sd}km/h`).fontColor('#FFA500').fontSize(this.FONTSIZE) } }.height(40) Row() { Flex({ direction: FlexDirection.Column }) { if (this.kfArr.length) { List({ scroller: this.kfArrScroller }) { ForEach(this.kfArr, (item) => { ListItem() { Column() { Row() { Text(item.xmmcStr).fontSize(this.BIGFONTSIZE).fontColor('#FFF') Text(`${item.score}分`).fontSize(this.BIGFONTSIZE).fontColor('#FFF') } .width('100%') .backgroundColor('#38260B') .justifyContent(FlexAlign.SpaceBetween) .padding({ top: 12, bottom: 12, left: 8, right: 5 }) Text(item.desc + `(${item.markcatalog})`) .fontSize(this.BIGFONTSIZE) .fontColor('#E5CBA1') .margin({ top: 10, bottom: 8, left: 5, right: 5 }) }.margin({ top: 15 }).alignItems(HorizontalAlign.Start) }.margin({ bottom: 25 }) }) }.padding({ left: 15, right: 15, top: 30, bottom: 5 }) } else { Column() { Row() { Text('暂无扣分项').fontSize(this.BIGFONTSIZE).fontColor('#FFF') } .width('100%') .backgroundColor('#38260B') .justifyContent(FlexAlign.SpaceBetween) .padding({ top: 12, bottom: 12, left: 8, right: 3 }) }.margin({ top: 35 }).padding({ left: 20, right: 20 }).alignItems(HorizontalAlign.Start) } } .backgroundImage($rawfile('judge/score_bg.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .width(514) .height(618) .padding({ top: 18, bottom: 15, left: 13, right: 14 }) //科目二 if (this.examSubject == 2) { Flex({ wrap: FlexWrap.Wrap, direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) { List({}) { ForEach(chunkArr(this.projects, 2), (item) => { ListItem() { Row() { Row() { //#FF7566 #00FFD5 #E6DECF // Text(this.projectsObj[item[0].projectCode]) Text(item[0].abbreviation) .fontSize(item[0].abbreviation.length > 5 ? 28 : 32) .fontColor(this.getProjectColor(this.projectsObj[item[0].projectCode].type)) } .backgroundImage($rawfile('judge/project_item.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .width('48.5%') .height(115) .margin({ bottom: 5 }) .justifyContent(FlexAlign.Center) if (item[1]) { Row() { //#FF7566 #00FFD5 #E6DECF Text(item[1].abbreviation) .fontSize(item[1].abbreviation.length > 5 ? 28 : 32) .fontColor(this.getProjectColor(this.projectsObj[item[1].projectCode].type)) } .backgroundImage($rawfile('judge/project_item.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .width('48.5%') .height(115) .margin({ left: 5, bottom: 5 }) .justifyContent(FlexAlign.Center) } } } }); } } .backgroundImage($rawfile('judge/project_bg.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .width('57%') .height('100%') .padding(30) .margin({ right: 10 }) } //科目三 if (this.examSubject == 3) { Column() { Flex({ wrap: FlexWrap.Wrap, direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) { List({}) { ForEach(this.projects, (project) => { ListItem() { Text(project.name) { } .fontColor(this.getProjectColor(this.projectsObj[project.projectCode].type)) .margin({ bottom: 3 }) .fontSize(22) }.margin({ bottom: 3 }) }) }.lanes(2).margin({ left: 25 }) } .width('100%') .height('57%') .backgroundImage($rawfile('judge/project_km3_bg.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .padding(30) .margin({ right: 5 }) if (this.projects.length) { Flex({ wrap: FlexWrap.Wrap, direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceAround }) { List() { ForEach(this.artSubject3Projects, (item, index) => { ListItem() { } .backgroundImage( $rawfile( `judge/km3/${this.getIsExitManualProject(index) ? (this.getIsEndManualProject(index)) : (item + '_gray')}.png` ), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .width(174) .height(118 * 0.95) .margin({ bottom: 8 }) .onClick(() => { this.setManualProjectFn(index) }) }) }.lanes(3).margin({ left: 5, top: 12 }) } } } .backgroundImage($rawfile('judge/project_bg.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .width(660) .height(640) .padding(44) .margin({ right: 10 }) } }.margin({ top: 15 }).height('80%').justifyContent(FlexAlign.SpaceBetween) }.width('100%').height('100%').alignItems(HorizontalAlign.Start).margin({ top: 10 }) }.height('100%').alignItems(HorizontalAlign.Start) }.width('75%').height('100%') Column() { Column() { Row() { Text(this.totalScore <= 0 ? '0' : this.totalScore + '').fontColor('#FFEECC').fontSize(55) Text('分').fontColor('#FFEECC').fontSize(30).padding({ top: 5 }) } .width(334) .height(120) .justifyContent(FlexAlign.Center) .alignItems(VerticalAlign.Center) .border({ width: 5, color: '#4D4136', radius: 30 }) .onClick(() => { this.signDisplayComVisible = true }) Row() { Image(this.kszp).width('85%').height('85%') } .width(226) .height(312) .backgroundImage($rawfile('judge/photo_bg.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .justifyContent(FlexAlign.Center) .alignItems(VerticalAlign.Center) .margin({ top: 30, bottom: 15 }) } Column() { if (this.examSubject == 3 && this.judgeConfigObj['342'] == '0') { Row() { Row() { } .width(60) .height(60) .backgroundImage($rawfile('judge/manual_judge.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) Text('人工评判').fontColor('#FFF').fontSize(32).padding({ right: 12 }) } .width(334) .height(110) .justifyContent(FlexAlign.Center) .alignItems(VerticalAlign.Center) .backgroundImage($rawfile('judge/button_nor.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .margin({ bottom: 10 }) .onClick(() => { this.isDeductedPopShow = true }) } Row() { Row() { } .width(60) .height(60) .backgroundImage($rawfile('judge/phone.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) Text('呼叫请求').fontColor('#FFF').fontSize(32).padding({ right: 12 }) } .width(334) .height(110) .justifyContent(FlexAlign.Center) .alignItems(VerticalAlign.Center) .backgroundImage($rawfile('judge/button_nor.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .margin({ bottom: 10 }) Row() { } .width(334) .height(100) .backgroundImage($rawfile('judge/anniu_nor.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '100%', height: '100%' }) .onClick(() => { if (this.judgeConfigObj['353'] == '0') { this.endPopupVisible = true } else { Prompt.showToast({ message: '车上不允许手动结束考试!', duration: 4000 }); } }) }.margin({ bottom: 30 }) } .width('25%') .height('100%') .justifyContent(FlexAlign.SpaceBetween) .alignItems(HorizontalAlign.Center) .margin({ bottom: 20 }) }.height('90%').justifyContent(FlexAlign.Start).padding({ top: 37, left: 60, bottom: 35, right: 60 }) //科目三人工扣分弹窗 if (this.isDeductedPopShow && this.examSubject == 3 && this.judgeConfigObj['342'] == '0') { DeductedPopup({ defaultTabIndex: this.defaultTabIndex, currentItems: Reflect.ownKeys(this.projectsObj).map(projectKey => { //@ts-ignore const project = this.projectsObj[projectKey] return project.type == '2' ? project.projectCode : undefined }).filter(project => project !== undefined), markRules: this.manualMarkRules, closePopup: () => { this.isDeductedPopShow = false; this.defaultTabIndex = 0; }, confirmMark: async (itemno, serial)=>{ clearTimeout(this.popTimer) this.popTimer = null this.popTimer = setTimeout(async ()=>{ const judge = this.judge await judge.setJudgeMark(itemno, serial); this.isDeductedPopShow = false this.popTimer = null; },500) } }) } if (this.signDisplayComVisible) { Column() { SignDisplayCom({ showBack: false, scaleNum: 1.8, msgStr: this.judge.plcStr || '', }).margin({ top: 100 }) Row() { } .width(240) .height(240) .position({ x: '81%', y: 80 }) .backgroundImage($rawfile('judge/close.png'), ImageRepeat.NoRepeat) .backgroundImageSize({ width: '33.33%', height: '33.33%' }) .onClick(() => { this.signDisplayComVisible = false }) }.width('100%').height('100%').position({ y: 0 }).backgroundColor('rgba(0,0,0,0.6)') } //科目三人工项目确认框 if (this.isAmplifyPopShow && this.examSubject == 3) { AmplifyPopup({ amplifyImgIndex: this.amplifiedImgIndex, confirmAmplify:async (amplify)=>{ clearTimeout(this.popTimer) this.popTimer = null this.popTimer = setTimeout(async ()=>{ const judge = this.judge await judge.setJudgeItem(amplify.projectCode, 1); this.isAmplifyPopShow = false this.popTimer = null; },500) }, closeAmplifyPop: () => { this.isAmplifyPopShow = false } }) } //结束考试弹窗 if (this.endPopupVisible) { EndPoPup({ title: '确定结束考试吗?', cancelFn: () => { this.endPopupVisible = false; }, confirmFn: async () => { if (this.judgeConfigObj['344'] == 1) { Prompt.showToast({ message: '考试未结束,不允许手动退出!', duration: 4000 }); return } this.endPopupVisible = false; this.loadingPopupVisible = true clearInterval(this.timer); clearInterval(globalThis.judgeTimer) this.judge.checkExamIsEnd(true); } }) } //loading 弹窗 if (this.loadingPopupVisible) { LoadingPopup({ title: '正在生成考试记录,请稍后...', }) } if(this.dwztErrorVisible){ DwztErrorPopup({ title:'当前差分状态异常,学员将无法正常进行考试评判,请将车辆行驶到开阔地,等待程序自检,差分正常后会自动关闭该对话框', cancelFn:()=>{ this.dwztErrorVisible = false; }, confirmFn:()=>{ clearInterval(this.timer); clearInterval(globalThis.judgeTimer) this.judge.checkExamIsEnd(true); }, }) } } .height('100%').backgroundColor('#000').justifyContent(FlexAlign.Start) } getProjectColor(type: string) { switch (type) { case '1': return '#E6DECF'; break; case '2': return '#FFAD33'; break; case '3': return '#ff109d0a'; break; case '4': return '#FF7566'; break; default: return '#E6DECF'; break; } } //人工项目操作 async setManualProjectFn(index: number) { const { judgeConfigObj, isManualProjectIn, getIsExitManualProject, artSubject3ProjectsCodesArr, currentXmdm, } = this; const projectCode = artSubject3ProjectsCodesArr[index]; if(index === 5) { console.info('surenjun 靠边停车状态=> ',getIsExitManualProject(index)) } if (getIsExitManualProject(index)) { // 正在进行的项目 取消项目 if (isManualProjectIn && projectCode === currentXmdm) { await this.judge.setJudgeItem(currentXmdm, 2); Prompt.showToast({ message: '项目取消', duration: 2000 }) return } // 靠边停车时候可以触发 if (judgeConfigObj['343'] === '0') { const xmmcStr = this.xmmcStr; if (xmmcStr == '无' || xmmcStr == '') { //512[6] 人工项目按钮放大确认 const param512 = (judgeConfigObj['512'] || '').split(','); console.info('surenjun',param512) if(param512[6] !== '0'){ this.amplifiedImgIndex = index; this.isAmplifyPopShow = true }else{ const judge = this.judge await judge.setJudgeItem(projectCode, 1); } } else { if (index === 5) { Prompt.showToast({ message: `${xmmcStr}未结束,不允许靠边停车`, duration: 8000 }); } } } else { this.amplifiedImgIndex = index; this.isAmplifyPopShow = true } } } // 获取是否能人工进项目 getIsExitManualProject = (index: number) => { const { judgeConfigObj, artSubject3ProjectsCodesArr, projectsObj, carztStr, isManualProjectIn, isProjectIn, currentXmdm, getProjectIsInRoad } = this; const projectCode = artSubject3ProjectsCodesArr[index]; if(projectsObj[projectCode] === undefined){ return false } const projectType = projectsObj[projectCode].type; //不允许人工触发的项目列表,以","分隔 const unExitManualProjects = judgeConfigObj['332'].split(',') || []; //直线行驶中不进其他考试项目(0-否 1-是) const param348 = judgeConfigObj['348'] || '0', //里程不够允许手工点靠边停车(0-否 1-是) param387 = judgeConfigObj['387'] || '0', //里程不够不报靠边停车(0-否+1-是+2-必考项目未完成且里程不够不报项目) param319 = judgeConfigObj['319'] || '0', //人工项目是否能取消 1:可取消; param340 = judgeConfigObj['340'] || '0', //307参数里设置的项目,项目已经做过,后续不能人工触发; param307 = (judgeConfigObj['307'] || '').split(','); //非行驶状态(没有速度),人工项目不能触发(按钮灰色) if (carztStr === '停车') { return false } //车上是否能进行人工操作(0-能1-不能人工评判2-不能人工进项目3-都不能) if (judgeConfigObj['342'] === '3' || judgeConfigObj['342'] === '2') { return false } //不允许人工触发的项目列表 if (unExitManualProjects.includes(artSubject3ProjectsCodesArr[index])) { return false } //项目进行中不能人工触发 if (isProjectIn) { if (param340 == 1) { if (isManualProjectIn && (currentXmdm == projectCode)) { return true } else { return false } } return false } //项目路段信息判断 if (!getProjectIsInRoad(projectCode + '')) { return false } //@ts-ignore 直线行驶中不进其他考试项目(0-否 1-是) if (param348 == '0' && projectsObj['9']?.type == 2) { return index === 0 ? true : false } //项目已经做过,后续不能人工触发 if (param307.includes(projectCode) && (projectType == '3' || projectType == '4')) { return false } //319不为0,或者387不为1,里程不够时,靠边停车项目不能触发 if ((param387 != '1' || param319 != '0') && index === 5) { const {examMileage,isRequiredProjectsEnd,jl} = this; //里程是否达标 && 必考项目是否全完成 return jl >= Number(examMileage) && isRequiredProjectsEnd } return true } // 判断项目是否在当前路段号 getProjectIsInRoad = (projectCode: string,) => { const { judgeConfigObj, lane:{ road, num, count } } = this; const projectRoads = { //直线行驶 '3': (judgeConfigObj['514']?.split(',') || []), //变更车道 '4': judgeConfigObj['515']?.split(',') || [], //超车 '10': judgeConfigObj['516']?.split(',') || [], //靠边停车 '11': judgeConfigObj['517']?.split(',') || [], //会车 '9': judgeConfigObj['518']?.split(',') || [], //掉头 '12': judgeConfigObj['519']?.split(',') || [], }; //未测绘得道路上或者不在差分状态 if (road === '') { return false } if(projectRoads[projectCode].length == 0){ return true } //设置了514-519参数,只能在设置的路段触发对应项目 if (projectRoads[projectCode].includes(road)) { //如果525为1,则514-519设置的路段不能触发对应项目 if (judgeConfigObj['525'] == '1') { return false } } else { return false } //405参数为2是,如果在最左侧车道,超车项目不能触发; if (projectCode == '10' && judgeConfigObj['405'] == '2' && (num === count) && num > 0 ) { return false } // 车道总数少于2条,超车和变道不能触发 if (projectCode == '10' || projectCode == '4') { if (count < 2) { return false } } return true } // 获取人工项目是否已做 getIsEndManualProject = (index: number) => { const projectName = this.artSubject3Projects[index]; const projectCode = this.artSubject3ProjectsCodesArr[index]; const type = this.projectsObj[projectCode].type if (type == '2') { return projectName } return (type == '3' || type == '4') ? `${projectName}_red` : `${projectName}_green`; } 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 startExamTime: 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 markcatalog: string }[] = [] @State name: string = '' @State idCard: string = '' @State singlePlay: boolean = false; @State totalScore: number = 100 //模拟考试项目 @State projects: Project[] = [] @State projectsObj: ProjectObj = {} @State projectsCenterObj: ProjectObj = {} @State markRuleListObj: MarkRule = {} @State cdsbInfoObj: CDSBInfo = {} @State itemInfoObj: 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 ksxl: string = '' @State kslx: string = '' //监管线路代码 @State xldm: 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[] = [] //手动项目是否在进行中 @State isManualProjectIn: boolean = false; //项目是否进行中 @State isProjectIn: boolean = false; //正在进行的项目代码 @State currentXmdm: string = '' // 必考项目除靠边停车是否全部完成 @State isRequiredProjectsEnd: boolean = false; // 考试项目是否全部完成 // @State isAllProjectsEnd: boolean = false; @State lane: LANE = { road: '', num: 0, count: 0 } @State roadData: Object = {}; //定位差分状态时候正常 @State isDwztRight: boolean = false; @State defaultTabIndex: number = 0; private context = getContext(this) as common.UIAbilityContext; public kfArrScroller: Scroller = new Scroller() //档位 @State dw: string = '' //速度 @State sd: string = '' @State mileageTimer: number = 0; @State passingScore: number = 80 @State dwztErrorVisible: boolean = false; @State popTimer:number =0; @State carlist:string= '' }