1382 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			1382 lines
		
	
	
		
			46 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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 MsgPopup from './compontents/judge/MsgPopup'
 | ||
| 
 | ||
| import {
 | ||
|   CARINFO,
 | ||
|   CDSBInfo,
 | ||
|   LANE,
 | ||
|   MAPITEMPOINTITEM,
 | ||
|   MAPPOINT,
 | ||
|   MarkRule,
 | ||
|   Project,
 | ||
|   ProjectObj,
 | ||
|   SYSSET,
 | ||
|   SYSTEMPARMARR
 | ||
| } from './judgeSDK/api/judgeSDK.d';
 | ||
| 
 | ||
| import { formatTime, getCurrentHourTime, getCurrentTime } from '../common/utils/tools';
 | ||
| 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 {
 | ||
|   // 考试模式 1:白考,2:夜考,3:增驾(模拟灯光未考),4:增驾(模拟灯光已考),5:满分学习
 | ||
|   private mode: number = 1
 | ||
|   // 夜考扣分
 | ||
|   private isYkkf: boolean = false
 | ||
| 
 | ||
|   async aboutToDisappear() {
 | ||
|     clearInterval(this.mileageTimer)
 | ||
|   }
 | ||
| 
 | ||
|   async aboutToAppear() {
 | ||
|     let currentParams: any = router.getParams();
 | ||
|     this.mode = Number(currentParams.mode)
 | ||
|     promptAction.showToast({
 | ||
|       message: "当前模式:" + this.mode
 | ||
|     })
 | ||
|     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()
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   // 查询考车信息
 | ||
|   async initCar() {
 | ||
|     const result = await getSyncData('ES_CARINFO')
 | ||
|     const carInfo = result[0] || {};
 | ||
|     this.carName = decodeURI(carInfo.carclass)
 | ||
|     this.carType = carInfo.kscx
 | ||
|     this.carinfoArr.push({
 | ||
|       CARID: carInfo.carid,
 | ||
|       IPADDR: '',
 | ||
|       CARCLASS: decodeURI(carInfo.carclass),
 | ||
|       KSCX: carInfo.kscx,
 | ||
|       CARNAME: decodeURI(carInfo.carname),
 | ||
|       FLAG: carInfo.flag,
 | ||
|       BK1: carInfo.bk1,
 | ||
|       BK2: carInfo.bk2,
 | ||
|     })
 | ||
|     console.info('surenjun =>carinfoArrr', JSON.stringify(this.carinfoArr))
 | ||
|   }
 | ||
| 
 | ||
|   // 获取考生信息
 | ||
|   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)
 | ||
|         })
 | ||
|       }
 | ||
| 
 | ||
|       //623 考试中是否可以查看轨迹画面(0-否+1-是)
 | ||
| 
 | ||
| 
 | ||
|       if (sys.v_no == '623') {
 | ||
|         this.syssetParam623 = value == '1' ? true : false
 | ||
|       }
 | ||
| 
 | ||
|       //科目三应行驶距离参数
 | ||
|       if (sys.v_no == '303') {
 | ||
|         this.examMileage = this.examMileage == '0' ? (sys.v_value + '') : this.examMileage;
 | ||
|       }
 | ||
| 
 | ||
|       // //地点版本参数
 | ||
|       // if (sys.v_no == '211') {
 | ||
|       //   this.syssetParam211 = decodeURIComponent(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]
 | ||
| 
 | ||
|           // 过滤考前绕车一周上车准备的扣分
 | ||
|           if (sczb == 1 && xmdm == '1') {
 | ||
|             return
 | ||
|           }
 | ||
| 
 | ||
|           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: SYSTEMPARMARR[] = sysParam || (await getSyncData('MA_SYSTEMPARM')) as SYSTEMPARMARR[]
 | ||
| 
 | ||
|     let currentParams: any = router.getParams();
 | ||
|     const {carName} = this;
 | ||
|     if (this.mode === 2) {
 | ||
|       this.totalScore = Number(currentParams.score) || this.totalScore
 | ||
|     }
 | ||
|     //小车车型列表
 | ||
|     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 && txt1 === carName) {
 | ||
|         carNo = no2 + ''
 | ||
|         this.carlist = carNo
 | ||
|       }
 | ||
|       //获取及格分数线
 | ||
|       if (no1 == 3 && no3 == 3 && Number(carNo) == no2) {
 | ||
|         this.passingScore = Number(txt1) || 0;
 | ||
|       }
 | ||
|       //根据车型获取应行驶里程数
 | ||
|       if (no1 == 3 && no3 == 15 && Number(carNo) == no2) {
 | ||
|         let mileage = (decodeURI(systemParm.txt1) || '').split('^')
 | ||
|         if (this.mode === 1) {
 | ||
|           this.examMileage = mileage[1]
 | ||
|         } else if (this.mode === 2) {
 | ||
|           this.examMileage = mileage[2]
 | ||
|         } else {
 | ||
|           this.examMileage = mileage[0]
 | ||
|         }
 | ||
|       }
 | ||
|       // 满分学习里程
 | ||
|       if (this.mode === 5 && no1 == 3 && no2 == Number(carNo) && no3 == 63) {
 | ||
|         let data = decodeURI(systemParm.txt1)?.split("^")
 | ||
|         this.examMileage = data[1] || this.examMileage
 | ||
|       }
 | ||
|       //获取当前考车的考试项目
 | ||
|       if (this.mode === 2 && no1 == 3 && no2 == Number(carNo) && no3 == 46) {
 | ||
|         // 夜考必考项目读取
 | ||
|         allItems = decodeURIComponent(systemParm.txt1).split(',').filter(txt => txt !== '')
 | ||
|       } else if (this.mode !== 2 && no1 == 3 && no2 == Number(carNo) && no3 == 10) {
 | ||
|         // 其他模式必考项目获取
 | ||
|         allItems = decodeURIComponent(systemParm.txt1).split(',').filter(txt => txt !== '')
 | ||
|       } else if (this.mode == 5 && no1 == 3 && no2 == Number(carNo) && no3 == 63) {
 | ||
|         // 满分学习项目
 | ||
|         let data = decodeURI(systemParm.txt1)?.split("^").filter(item => item)
 | ||
|         allItems = data[0]?.split(",") || []
 | ||
|       }
 | ||
|       if (no1 == 6) {
 | ||
|         const name = decodeURI(systemParm.txt1)
 | ||
|         // 白考过滤掉夜间行驶
 | ||
|         if (this.mode !== 2 && no2 == 13) {
 | ||
|           return
 | ||
|         }
 | ||
|         // 模拟夜间驾驶
 | ||
|         if (this.mode !== 3 && this.mode !== 5 && no2 == 41) {
 | ||
|           return
 | ||
|         }
 | ||
|         let isRequired = allItems.includes(no2 + '')
 | ||
|         let isEnd = false
 | ||
|         let isUpload = false
 | ||
| 
 | ||
|         // 夜考除夜间行驶其他项目不需要重复上传
 | ||
|         if (this.mode === 2 && no2 != 13) {
 | ||
|           isUpload = true
 | ||
|         }
 | ||
|         // 夜考靠边停车设置为非必须
 | ||
|         if (this.mode === 2 && no2 == 11) {
 | ||
|           isRequired = false
 | ||
|         }
 | ||
|         // 加减档自动完成,为非必须项目
 | ||
|         if (no2 == 14) {
 | ||
|           isRequired = false
 | ||
|         }
 | ||
|         const currentProject: Project = {
 | ||
|           name,
 | ||
|           abbreviation: decodeURI(systemParm.txt3),
 | ||
|           projectCode: no2 + '',
 | ||
|           projectCodeCenter: txt2,
 | ||
|           // 白考夜间行驶非必考
 | ||
|           isRequired,
 | ||
|           //是否考过了
 | ||
|           isEnd,
 | ||
|           //项目开始数据是否上传过
 | ||
|           isUpload,
 | ||
|         }
 | ||
|         this.projectsObj[no2*1] = currentProject
 | ||
|         this.projectsCenterObj[txt2] = currentProject
 | ||
|         this.projects.push(currentProject);
 | ||
| 
 | ||
|         //真实监管下发考试项目
 | ||
|         if (isInExam && !(kStringArr.includes(txt2) || kStringArr.includes(no2 + ''))) {
 | ||
|           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.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),
 | ||
|       })
 | ||
|     })
 | ||
|     console.log("lixiao allItems", JSON.stringify(allItems))
 | ||
|     console.log("lixiao carNo examMileage", carNo, this.examMileage)
 | ||
|     const projects = this.projects;
 | ||
|     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() {
 | ||
|     let currentParams: any = router.getParams();
 | ||
|     if (!currentParams?.examItems) {
 | ||
|       return
 | ||
|     }
 | ||
|     const kfItems: string = currentParams?.examItems?.[0] || ""
 | ||
|     const examItems: string = currentParams?.examItems?.[1] || "";
 | ||
|     const nightScoreArr = examItems?.split(",").filter(item => item) || []
 | ||
|     const ddxkKfArr = kfItems.split(";")?.[3]?.split('^').filter(item => item) || []
 | ||
|     nightScoreArr.forEach((kf, index) => {
 | ||
|       this.isYkkf = true
 | ||
|       let xmdm = '';
 | ||
|       let kfdm = ''
 | ||
|       let currentKf
 | ||
|       Object.entries(this.markRuleListObj).forEach(([key, value]) => {
 | ||
|         if (value.markcatalog == kf) {
 | ||
|           [xmdm, kfdm] = key.split('_')
 | ||
|           currentKf = value
 | ||
|         }
 | ||
|       })
 | ||
|       const currentProject = this.projectsObj[xmdm] || { name: '通用评判' }
 | ||
|       if (this.projectsObj[xmdm]) {
 | ||
|         this.projectsObj[xmdm].ykType = '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
 | ||
|       })
 | ||
|       nightScoreArr[index] = xmdm + ',' + kfdm
 | ||
|     })
 | ||
|     if (this.judgeConfigObj['432'] != 0) {
 | ||
|       ddxkKfArr.forEach((kf) => {
 | ||
|         this.isDdxk = true
 | ||
|         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 = [...nightScoreArr, ...ddxkKfArr]
 | ||
|   }
 | ||
| 
 | ||
|   // 初始化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
 | ||
|       })
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   build() {
 | ||
|     Column() {
 | ||
|       Row() {
 | ||
|         Row() {
 | ||
|           Image($rawfile('judge/signal_logoS.png')).width(120)
 | ||
|           Text(this.time).fontColor('#CCB48F').fontSize(34).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(34)
 | ||
|         }
 | ||
|       }
 | ||
|       .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 || 3}`).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 })
 | ||
| 
 | ||
|                 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]))
 | ||
|                           .margin({ bottom: 2 })
 | ||
|                           .fontSize(24)
 | ||
|                         }.margin({ bottom: 2 })
 | ||
|                       })
 | ||
|                     }.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.getIsManualKf()) {
 | ||
|               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(() => {
 | ||
|               // this.vocObj.playAudio({
 | ||
|               //   type: 1,
 | ||
|               //   name: 'button_media.wav'
 | ||
|               // })
 | ||
|               if (this.judgeConfigObj['353'] == '0' || this.singlePlay) {
 | ||
|                 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 || '',
 | ||
|             showTrajectory: globalThis.singlePlay ? true : (this.syssetParam623),
 | ||
|           }).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.vocObj.playAudio({
 | ||
|             //   type: 1,
 | ||
|             //   name: 'button_media.wav'
 | ||
|             // })
 | ||
|             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.isErrorMsgEnd) {
 | ||
|               this.judge.closeAllFiles()
 | ||
|               router.back()
 | ||
|               return
 | ||
|             }
 | ||
|             if (this.judgeConfigObj['344'] == 1 && this.totalScore < 100 && !this.singlePlay) {
 | ||
|               Prompt.showToast({
 | ||
|                 message: '考试未结束,不允许手动退出!',
 | ||
|                 duration: 4000
 | ||
|               });
 | ||
|               return
 | ||
|             }
 | ||
|             this.endPopupVisible = false;
 | ||
|             this.loadingPopupVisible = true
 | ||
|             clearInterval(this.timer);
 | ||
|             clearInterval(globalThis.judgeTimer)
 | ||
|             try {
 | ||
|               this.judge.checkExamIsEnd(true);
 | ||
|             } catch (e) {
 | ||
|               this.judge.closeAllFiles()
 | ||
|               router.back()
 | ||
|             }
 | ||
| 
 | ||
|           }
 | ||
|         })
 | ||
|       }
 | ||
| 
 | ||
|       //loading 弹窗
 | ||
|       if (this.loadingPopupVisible) {
 | ||
|         LoadingPopup({
 | ||
|           title: '正在生成考试记录,请稍后...',
 | ||
|         })
 | ||
|       }
 | ||
| 
 | ||
|       if (this.errorMsg) {
 | ||
|         MsgPopup({
 | ||
|           title: this.errorMsg,
 | ||
|           confirmFn: () => {
 | ||
|             this.errorMsg = ''
 | ||
|             this.isErrorMsgEnd = true;
 | ||
|             if (this.disConnectErrorOpen) {
 | ||
|               globalThis.context.terminateSelf()
 | ||
|             } else {
 | ||
|               router.back()
 | ||
|             }
 | ||
|           },
 | ||
|         })
 | ||
|       }
 | ||
| 
 | ||
|       if (this.dwztErrorVisible) {
 | ||
|         DwztErrorPopup({
 | ||
|           title: '当前差分状态异常,学员将无法正常进行考试评判,请将车辆行驶到开阔地,等待程序自检,差分正常后会自动关闭该对话框',
 | ||
|           cancelFn: () => {
 | ||
|             this.dwztErrorVisible = false;
 | ||
|           },
 | ||
|           confirmFn: () => {
 | ||
|             clearInterval(this.timer);
 | ||
|             clearInterval(globalThis.judgeTimer)
 | ||
|             this.judge.checkExamIsEnd(true);
 | ||
|           },
 | ||
|         })
 | ||
|       }
 | ||
| 
 | ||
|       if (this.disConnectErrorOpen) {
 | ||
| 
 | ||
|       }
 | ||
|     }
 | ||
|     .height('100%').backgroundColor('#000').justifyContent(FlexAlign.Start)
 | ||
|   }
 | ||
| 
 | ||
|   getProjectColor(project: Project) {
 | ||
|     let type = (this.mode === 2 ? project.ykType : project.type)
 | ||
|     switch (type) {
 | ||
|       case '1':
 | ||
|         return '#E6DECF';
 | ||
|         break;
 | ||
|       case '2':
 | ||
|         return '#FFAD33';
 | ||
|         break;
 | ||
|       case '3':
 | ||
|         return '#ff109d0a';
 | ||
|         break;
 | ||
|       case '4':
 | ||
|         return '#FF7566';
 | ||
|         break;
 | ||
|       case '5':
 | ||
|         return '#FF7566'
 | ||
|         break;
 | ||
|       default:
 | ||
|         return '#E6DECF';
 | ||
|         break;
 | ||
|     }
 | ||
|   }
 | ||
| 
 | ||
|   //人工项目操作
 | ||
|   async setManualProjectFn(index: number) {
 | ||
|     const {
 | ||
|       judgeConfigObj,
 | ||
|       isManualProjectIn,
 | ||
|       getIsExitManualProject,
 | ||
|       artSubject3ProjectsCodesArr,
 | ||
|       projectsObj
 | ||
|     } = this;
 | ||
|     const projectCode = artSubject3ProjectsCodesArr[index];
 | ||
|     if (index === 5) {
 | ||
|       console.info('surenjun 靠边停车状态=> ', getIsExitManualProject(index))
 | ||
|     }
 | ||
|     if (getIsExitManualProject(index)) {
 | ||
|       // 正在进行的项目 取消项目
 | ||
|       if (isManualProjectIn && projectsObj[projectCode].type == '2') {
 | ||
|         //判断人工是否能取消项目 && 当前项目有扣分的不能取消
 | ||
|         if (judgeConfigObj['340'] == 1 && projectsObj[projectCode].type != '5') {
 | ||
|           await this.judge.setJudgeItem(projectCode, 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 projectCode = this.artSubject3ProjectsCodesArr[index];
 | ||
|     if (this.projectsObj[projectCode] === undefined) {
 | ||
|       return false
 | ||
|     }
 | ||
|     const projectType = this.projectsObj[projectCode].type;
 | ||
| 
 | ||
|     //不允许人工触发的项目列表,以","分隔
 | ||
|     const unExitManualProjects = this.judgeConfigObj['332'].split(',') || [];
 | ||
|     //直线行驶中不进其他考试项目(0-否 1-是)
 | ||
|     const param348 = this.judgeConfigObj['348'] || '0',
 | ||
|       //里程不够允许手工点靠边停车(0-否 1-是)
 | ||
|       param387 = this.judgeConfigObj['387'] || '0',
 | ||
|       //里程不够不报靠边停车(0-否+1-是+2-必考项目未完成且里程不够不报项目)
 | ||
|       param319 = this.judgeConfigObj['319'] || '0',
 | ||
|       //人工项目是否能取消 1:可取消;
 | ||
|       param340 = this.judgeConfigObj['340'] || '0',
 | ||
|       //307参数里设置的项目,项目已经做过,后续不能人工触发;
 | ||
|       param307 = (this.judgeConfigObj['307'] || '').split(',');
 | ||
| 
 | ||
|     //非行驶状态(没有速度),人工项目不能触发(按钮灰色)
 | ||
|     if (this.carztStr === '停车') {
 | ||
|       return false
 | ||
|     }
 | ||
| 
 | ||
|     //车上是否能进行人工操作(0-能1-不能人工评判2-不能人工进项目3-都不能)
 | ||
|     if (this.judgeConfigObj['342'] === '3' || this.judgeConfigObj['342'] === '2') {
 | ||
|       return false
 | ||
|     }
 | ||
| 
 | ||
|     //不允许人工触发的项目列表
 | ||
|     if (unExitManualProjects.includes(this.artSubject3ProjectsCodesArr[index])) {
 | ||
|       return false
 | ||
|     }
 | ||
| 
 | ||
|     //项目进行中不能人工触发
 | ||
|     if (this.isProjectIn && this.projectsObj['13']?.type != '2') {
 | ||
|       if (param340 == 1) {
 | ||
|         if (this.isManualProjectIn && (this.projectsObj[projectCode].type == '2')) {
 | ||
|           return true
 | ||
|         } else {
 | ||
|           return false
 | ||
|         }
 | ||
|       }
 | ||
|       return false
 | ||
|     }
 | ||
| 
 | ||
|     //项目路段信息判断
 | ||
|     if (!this.getProjectIsInRoad(projectCode + '')) {
 | ||
|       return false
 | ||
|     }
 | ||
| 
 | ||
|     // 直线行驶中不进其他考试项目(0-否 1-是)
 | ||
|     if (param348 == '0' && this.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
 | ||
|     }
 | ||
|     console.log("lixiao getIsExitManualProject true", index)
 | ||
|     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`;
 | ||
|   }
 | ||
|   // 获取是否能进行人工评判
 | ||
|   getIsManualKf = () => {
 | ||
|     const {examSubject} = this;
 | ||
|     if (examSubject == 3) {
 | ||
|       //杭州训练模式不允许人工评判
 | ||
|       if (globalThis.singlePlay && this.judgeConfigObj['211'] == 'zjhz') {
 | ||
|         return false
 | ||
|       }
 | ||
|       if (this.judgeConfigObj['342'] == '0') {
 | ||
|         return true
 | ||
|       }
 | ||
|     } else {
 | ||
|       return false
 | ||
|     }
 | ||
|   }
 | ||
|   scroller: Scroller = new Scroller()
 | ||
|   //页面通用字体大小
 | ||
|   @State wayno: number = 0
 | ||
|   @State FONTSIZE: number = 30
 | ||
|   @State BIGFONTSIZE: number = 32
 | ||
|   //结束考试弹窗
 | ||
|   @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 syssetParam623: boolean = false;
 | ||
|   @State syssetParam211: string = '';
 | ||
|   @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 carinfoArr: 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 = true;
 | ||
|   @State defaultTabIndex: number = 0;
 | ||
|   private context = getContext(this) as common.UIAbilityContext;
 | ||
|   public kfArrScroller: Scroller = new Scroller()
 | ||
|   private vocObj = null;
 | ||
|   //档位
 | ||
|   @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 = ''
 | ||
|   @State errorMsg: string = ''
 | ||
|   @State isErrorMsgEnd: boolean = false
 | ||
|   @State disConnectErrorOpen: boolean = false
 | ||
| }
 |