Compare commits
	
		
			4 Commits
		
	
	
		
			756ced2469
			...
			f03ace7f04
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | f03ace7f04 | ||
|  | b0692d358c | ||
|  | 98813fe361 | ||
|  | b2b7950d81 | 
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @ -1,2 +1,2 @@ | ||||
| gitLog: | ||||
| 	  git log --since="2025-06-27 15:02" --until="2025-06-30 17:14"  --pretty=format:"<details>%n    <summary>%s</summary>%n     <span style=\"color: #888;\">[提交人]:</span><span style=\"color: #333;\">%an</span><br>%n     <span style=\"color: #888;\">[提交时间]:</span><span style=\"color: #333;\">%ad</span><br>%n    <span style=\"color: #888;\">[提交版本]:</span><span style=\"color: #333;\">%h</span>%n</details>%n" --date=format:"%Y-%m-%d %H:%M" > release_note.md | ||||
| 	  git log --since="2025-06-30 17:14" --until="2025-07-1 17:14"  --pretty=format:"<details>%n    <summary>%s</summary>%n     <span style=\"color: #888;\">[提交人]:</span><span style=\"color: #333;\">%an</span><br>%n     <span style=\"color: #888;\">[提交时间]:</span><span style=\"color: #333;\">%ad</span><br>%n    <span style=\"color: #888;\">[提交版本]:</span><span style=\"color: #333;\">%h</span>%n</details>%n" --date=format:"%Y-%m-%d %H:%M" > release_note.md | ||||
| @ -477,7 +477,7 @@ export interface JudgeUI { | ||||
|   ksdd: string | ||||
|   errorMsg: string | ||||
|   name: string | ||||
|   kfArrScroller: Scroller | ||||
|   // kfArrScroller: Scroller | ||||
|   disConnectErrorOpen: boolean | ||||
|   currentXmdm?: number | ||||
|   isRequiredProjectsEnd: boolean | ||||
| @ -582,10 +582,6 @@ export interface ItemInfos { | ||||
|   '1'?: ItemInfo | ||||
| } | ||||
| 
 | ||||
| // export const defaultCdsbInfoObj:DefaultJudgeConfigObj = { | ||||
| // | ||||
| // } | ||||
| 
 | ||||
| 
 | ||||
| /****** 评判初始化数据*****/ | ||||
| export interface JudgeInitObj extends Km3JudgeInitConfig { | ||||
|  | ||||
| @ -15,10 +15,10 @@ import { JudgeEmitterInstance } from '../utils/business/UdpEvent'; | ||||
| import HeaderComponent from './compontents/Header'; | ||||
| import CardComponent from './Index/Card'; | ||||
| import BottomMessageComponent from './Index/BottomMessage'; | ||||
| import LoadingComponent from './Index/Loading'; | ||||
| import Prompt from '@system.prompt'; | ||||
| import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignalWorker'; | ||||
| import { dConsole } from '../utils/LogWorker'; | ||||
| import CarLoadingComponent from './Index/Loading'; | ||||
| 
 | ||||
| @Entry | ||||
| @Component | ||||
| @ -41,7 +41,7 @@ struct Index { | ||||
|   @State initWork: boolean = false | ||||
|   // 请求网络表等待弹窗 | ||||
|   customDialogController: CustomDialogController = new CustomDialogController({ | ||||
|     builder: LoadingComponent(), | ||||
|     builder: CarLoadingComponent(), | ||||
|     customStyle: true, | ||||
|     alignment: DialogAlignment.Center, | ||||
|     autoCancel: true | ||||
| @ -222,10 +222,24 @@ struct Index { | ||||
|       CardComponent({ | ||||
|         isSingle: this.singlePlay, | ||||
|         singleClick: () => { | ||||
|           if (this.deviceId === "") { | ||||
|             Prompt.showToast({ | ||||
|               message: `未获取到车辆信息,请检查网络!`, | ||||
|               duration: 3000 | ||||
|             }); | ||||
|             return | ||||
|           } | ||||
|           dConsole.log(HomeTag, "单机模式点击") | ||||
|           this.singlePlayerTraining() | ||||
|         }, | ||||
|         networkingClick: () => { | ||||
|           if (this.deviceId === "") { | ||||
|             Prompt.showToast({ | ||||
|               message: `未获取到车辆信息,请检查网络!`, | ||||
|               duration: 3000 | ||||
|             }); | ||||
|             return | ||||
|           } | ||||
|           dConsole.log(HomeTag, "联网考试点击") | ||||
|           this.onlineExam() | ||||
|         } | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| @CustomDialog | ||||
| export default struct LoadingComponent { | ||||
| export default struct CarLoadingComponent { | ||||
|   @State angle: number = 0 | ||||
|   private controller?: CustomDialogController; | ||||
| 
 | ||||
|  | ||||
| @ -24,8 +24,6 @@ import { | ||||
|   LANE, | ||||
|   MA_CDSBINFOType, | ||||
|   MA_ITEMINFOType, | ||||
|   MA_MAP_POINT_ITEMType, | ||||
|   MA_MAP_POINTType, | ||||
|   MA_SYSTEMPARMType, | ||||
|   MAPITEMPOINTITEM, | ||||
|   MAPPOINT, | ||||
| @ -35,7 +33,6 @@ import { | ||||
|   Project, | ||||
|   ProjectInfo, | ||||
|   ProjectInfos, | ||||
|   ProjectRoads, | ||||
|   RouteParamsType, | ||||
|   SYSSET, | ||||
|   SyssetConfig, | ||||
| @ -44,13 +41,19 @@ import { | ||||
| } from '../model'; | ||||
| import { GetSyncData } from '../utils/table/Operation'; | ||||
| import dayTs from '../utils/Date'; | ||||
| import { CutArray, FormatTimeFlexible, GetCurrentTime } from '../utils/Common'; | ||||
| import { GetCurrentTime } from '../utils/Common'; | ||||
| import FileUtils from '../utils/FileUtils'; | ||||
| import SignalTrajectoryDialog from './Judge/SignalTrajectoryDialog'; | ||||
| import { DefaultJudgeConfigData } from '../mock'; | ||||
| import { dConsole } from '../utils/LogWorker'; | ||||
| import ConfirmDialog from './compontents/ConfirmDialog'; | ||||
| import CarLoadingDialog from './compontents/CarLoading'; | ||||
| import HeaderComponent from './compontents/Header'; | ||||
| import MessageComponent from './Judge/Message'; | ||||
| import OperatingAreaComponent from './Judge/OperatingArea'; | ||||
| import JudgeAndProjectComponent from './Judge/JudgeAndProject'; | ||||
| import { GetIsExitManualProject } from './Judge/utils'; | ||||
| import { InitMapPoint, InitMapPointItem } from './Judge/TableUtils'; | ||||
| 
 | ||||
| 
 | ||||
| @Entry | ||||
| @ -59,12 +62,7 @@ struct JudgePage { | ||||
|   scroller: Scroller = new Scroller() | ||||
|   //页面通用字体大小 | ||||
|   @State wayno: number = 0 | ||||
|   @State FONTSIZE: number = 30 | ||||
|   @State BIGFONTSIZE: number = 32 | ||||
|   @State isDdxk: boolean = false; | ||||
|   @State time: string = '' | ||||
|   //考试用时 | ||||
|   @State examTime: number = 0 | ||||
|   //开始时间 | ||||
|   @State startTime: string = '00:00:00' | ||||
|   @State startFullTime: string = '' | ||||
| @ -136,7 +134,6 @@ struct JudgePage { | ||||
|   //定位差分状态时候正常 | ||||
|   @State isDwztRight: boolean = true; | ||||
|   @State defaultTabIndex: number = 0; | ||||
|   public kfArrScroller: Scroller = new Scroller() | ||||
|   //档位 | ||||
|   @State dw: string = '' | ||||
|   //速度 | ||||
| @ -207,13 +204,9 @@ struct JudgePage { | ||||
|     this.carInfo = AppStorage.get<CarInfoType>('carInfo')! | ||||
|     this.singlePlay = AppStorage.get<boolean>('singlePlay')! | ||||
|     this.startFullTime = GetCurrentTime(1); | ||||
|     // this.startHourTime = await getCurrentHourTime() | ||||
|     this.startTime = dayTs().format("YYYY-MM-DD HH:mm:ss") | ||||
|     this.startExamTime = dayTs().format("YYYY-MM-DD HH:mm:ss") | ||||
|     setInterval(async () => { | ||||
|       this.time = dayTs().format("YYYY-MM-DD HH:mm:ss"); | ||||
|       this.examTime += 1; | ||||
|     }, 1000); | ||||
| 
 | ||||
|     //初始化数据库表 | ||||
|     await this.initDb() | ||||
|     //断点续考 | ||||
| @ -242,8 +235,8 @@ struct JudgePage { | ||||
| 
 | ||||
|     // 科目三新增读取表数据 | ||||
|     if (this.examSubject == '3') { | ||||
|       await this.initMapPoint() | ||||
|       await this.initMapPointItem() | ||||
|       this.mapPointArr = await InitMapPoint() | ||||
|       this.mapPointItemArr = await InitMapPointItem() | ||||
|       //定时上传考试里程 | ||||
|       // let mileageTimer = setInterval(()=>{ | ||||
|       //   this.uploadMileage() | ||||
| @ -254,7 +247,6 @@ struct JudgePage { | ||||
| 
 | ||||
|   // 查询考车信息 | ||||
|   async initCar() { | ||||
|     // const result = await getSyncData('ES_CARINFO') | ||||
|     const result = await GetSyncData<ES_CARINFOType>("ES_CARINFO") | ||||
|     const carInfo = result[0] || {}; | ||||
|     this.carName = decodeURI(carInfo.carclass!) | ||||
| @ -414,7 +406,6 @@ struct JudgePage { | ||||
|         systemParm.txt2 = systemParm.TXT2!; | ||||
|         systemParm.txt3 = systemParm.TXT3!; | ||||
|       } | ||||
|       // const { no1, no2, no3, } = systemParm; | ||||
|       const txt1 = decodeURI(systemParm.txt1 || "") | ||||
|       const txt2 = decodeURI(systemParm.txt2 || "") | ||||
| 
 | ||||
| @ -622,40 +613,6 @@ struct JudgePage { | ||||
| 
 | ||||
|   } | ||||
| 
 | ||||
|   // 初始化mapPoint表 | ||||
|   async initMapPoint() { | ||||
|     const pointParams: MA_MAP_POINTType[] = await GetSyncData<MA_MAP_POINTType>('MA_MAP_POINT') | ||||
|     pointParams.forEach(item => { | ||||
| 
 | ||||
|       this.mapPointArr.push({ | ||||
|         point_no: Number(item.point_no), | ||||
|         gps_e: Number(item.gps_e), | ||||
|         gps_n: Number(item.gps_n), | ||||
|         point_no_f: Number(item.point_no_f), | ||||
|         point_type: Number(item.point_type), | ||||
|         road_code: item.road_code!, | ||||
|         gps_e_Location: Number(item.gps_e_location), | ||||
|         gps_n_Location: Number(item.gps_n_location), | ||||
|         f_gps_e: Number(item.f_gps_e), | ||||
|         f_gps_n: Number(item.f_gps_n), | ||||
|         passed: Number(item.passed) | ||||
|       }) | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   // 初始化mapPointItem表 | ||||
|   async initMapPointItem() { | ||||
|     const pointItemPoints: MA_MAP_POINT_ITEMType[] = await GetSyncData<MA_MAP_POINT_ITEMType>('MA_MAP_POINT_ITEM'); | ||||
|     pointItemPoints.forEach(item => { | ||||
|       this.mapPointItemArr.push({ | ||||
|         point_no: Number(item.point_no), | ||||
|         itemno: Number(item.itemno), | ||||
|         itemno1: Number(item.itemno1), | ||||
|         subname: item.subname! | ||||
|       }) | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   // 初始化本地systemparam表、markrule表 | ||||
|   async initTrajectoryParam(trajectoryPath: string) { | ||||
|     const isTrajectoryOpen = JudgeConfig.isTrajectoryOpen | ||||
| @ -695,375 +652,84 @@ struct JudgePage { | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // 信号区域 | ||||
|   @Builder | ||||
|   logoExpansionBuilder() { | ||||
|     Image($rawfile(this.isDwztRight ? 'judge/xh_green.png' : 'judge/xh_red.png')).width(50).margin({ | ||||
|       left: 10 | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   // 当前项目 | ||||
|   @Builder | ||||
|   backAreaBuilder() { | ||||
|     Text(`当前项目:${this.xmmcStr || '无'} `).fontColor('#E5CCA1').fontSize(34) | ||||
|   } | ||||
| 
 | ||||
|   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) | ||||
| 
 | ||||
|       HeaderComponent({ | ||||
|         logoExpansionBuilder: this.logoExpansionBuilder, | ||||
|         customizeReturnArea: true, | ||||
|         backAreaBuilder: this.backAreaBuilder | ||||
|       }) | ||||
|       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(FormatTimeFlexible(this.examTime)).fontColor('#FFF').fontSize(this.FONTSIZE) | ||||
|                 }.margin({ bottom: 10 }) | ||||
| 
 | ||||
|                 if (this.examSubject == "3") { | ||||
|                   Row() { | ||||
|                     if (Reflect.get(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 (Reflect.get(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: MarkRule) => { | ||||
|                         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 | ||||
|             // 考生信息展示区域 | ||||
|             MessageComponent({ | ||||
|               name: this.name, | ||||
|               idCard: this.idCard, | ||||
|               startTime: this.startTime, | ||||
|               examSubject: this.examSubject, | ||||
|               examMileage: this.examMileage, | ||||
|               jl: this.jl, | ||||
|               wayno: this.wayno, | ||||
|               judgeConfigObj: this.judgeConfigObj, | ||||
|             }) | ||||
| 
 | ||||
|                             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(CutArray(this.projects, 2), (item: [ProjectInfo, ProjectInfo]) => { | ||||
|                         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(item[0])) | ||||
|                             } | ||||
|                             .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(item[1])) | ||||
|                               } | ||||
|                               .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: ProjectInfo) => { | ||||
|                           ListItem() { | ||||
|                             Text(project.name) { | ||||
|                             } | ||||
|                             .fontColor(this.getProjectColor(project)) | ||||
|                             .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: string, 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.vocObj.playAudio({ | ||||
|                               //   type: 1, | ||||
|                               //   name: 'button_media.wav' | ||||
|                               // }) | ||||
|             //  扣分列表和评判列表 | ||||
|             JudgeAndProjectComponent({ | ||||
|               carztStr: this.carztStr, | ||||
|               judgeConfigObj: this.judgeConfigObj, | ||||
|               dw: this.dw, | ||||
|               sd: this.sd, | ||||
|               kfArr: this.kfArr, | ||||
|               examSubject: this.examSubject, | ||||
|               projects: this.projects, | ||||
|               artSubject3Projects: this.artSubject3Projects, | ||||
|               artSubject3ProjectsCodesArr: this.artSubject3ProjectsCodesArr, | ||||
|               projectsObj: this.projectsObj, | ||||
|               isManualProjectIn: this.isManualProjectIn, | ||||
|               isProjectIn: this.isProjectIn, | ||||
|               jl: this.jl, | ||||
|               examMileage: this.examMileage, | ||||
|               isRequiredProjectsEnd: this.isRequiredProjectsEnd, | ||||
|               lane: this.lane, | ||||
|               examClick: (index: number) => { | ||||
|                 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.vocObj.playAudio({ | ||||
|               //   type: 1, | ||||
|               //   name: 'button_media.wav' | ||||
|               // }) | ||||
|         //   操作区域,分数显示区域 | ||||
|         OperatingAreaComponent({ | ||||
|           totalScore: this.totalScore, | ||||
|           kszp: this.kszp, | ||||
|           examSubject: this.examSubject, | ||||
|           singlePlay: this.singlePlay, | ||||
|           judgeConfigObj: this.judgeConfigObj, | ||||
|           signalViewingClick: () => { | ||||
|             this.signalTrajectoryDialogController.open() | ||||
|             }) | ||||
| 
 | ||||
|             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.vocObj.playAudio({ | ||||
|                 //   type: 1, | ||||
|                 //   name: 'button_media.wav' | ||||
|                 // }) | ||||
|           }, | ||||
|           artificialEvaluationClick: () => { | ||||
|             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 (Reflect.get(this.judgeConfigObj, '353') == '0') { | ||||
|           }, | ||||
|           endTheExamClick: () => { | ||||
|             this.endExamDialogController.open() | ||||
|               } 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) | ||||
| @ -1152,43 +818,23 @@ struct JudgePage { | ||||
|           }, | ||||
|         }) | ||||
|       } | ||||
| 
 | ||||
|       if (this.disConnectErrorOpen) { | ||||
| 
 | ||||
|       } | ||||
|     } | ||||
|     .height('100%').backgroundColor('#000').justifyContent(FlexAlign.Start) | ||||
|   } | ||||
| 
 | ||||
|   getProjectColor(project: ProjectInfo) { | ||||
|     const type = project.type; | ||||
|     switch (type) { | ||||
|       case '1': | ||||
|         return '#E6DECF'; | ||||
|       case '2': | ||||
|         return '#FFAD33'; | ||||
|       case '3': | ||||
|         return '#ff109d0a'; | ||||
|       case '4': | ||||
|         return '#FF7566'; | ||||
|       default: | ||||
|         return '#E6DECF'; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   //人工项目操作 | ||||
|   async setManualProjectFn(index: number) { | ||||
|     const isManualProjectIn = this.isManualProjectIn; | ||||
|     const getIsExitManualProject = this.getIsExitManualProject; | ||||
|     const artSubject3ProjectsCodesArr = this.artSubject3ProjectsCodesArr; | ||||
|     const projectsObj = this.projectsObj; | ||||
| 
 | ||||
|     const projectCode = artSubject3ProjectsCodesArr[index] | ||||
|     let sideParkingStatus = GetIsExitManualProject(index, this.judgeConfigObj, this.artSubject3ProjectsCodesArr, this.projectsObj, this.carztStr, this.isManualProjectIn, this.isProjectIn, this.jl, this.examMileage, this.isRequiredProjectsEnd, this.lane) | ||||
|     if (index === 5) { | ||||
|       dConsole.info(JudgeTag, 'surenjun 靠边停车状态=> ', getIsExitManualProject(index)) | ||||
|       dConsole.info(JudgeTag, 'surenjun 靠边停车状态=> ', sideParkingStatus) | ||||
|     } | ||||
|     const currentProject: ProjectInfo = Reflect.get(projectsObj, projectCode) | ||||
|     if (getIsExitManualProject(index)) { | ||||
|     if (sideParkingStatus) { | ||||
|       // 正在进行的项目 取消项目 | ||||
|       if (isManualProjectIn && currentProject.type == '2') { | ||||
|         //判断人工是否能取消项目 && 当前项目有扣分的不能取消 | ||||
| @ -1230,184 +876,5 @@ struct JudgePage { | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // 获取是否能人工进项目 | ||||
|   getIsExitManualProject = (index: number) => { | ||||
| 
 | ||||
|     const judgeConfigObj = this.judgeConfigObj; | ||||
|     const artSubject3ProjectsCodesArr = this.artSubject3ProjectsCodesArr; | ||||
|     const projectsObj = this.projectsObj; | ||||
|     const carztStr = this.carztStr; | ||||
|     const isManualProjectIn = this.isManualProjectIn; | ||||
|     const isProjectIn = this.isProjectIn; | ||||
|     const getProjectIsInRoad = this.getProjectIsInRoad; | ||||
| 
 | ||||
|     const projectCode = artSubject3ProjectsCodesArr[index]; | ||||
|     const currentProject: ProjectInfo = Reflect.get(projectsObj, projectCode) | ||||
|     if (currentProject === undefined) { | ||||
|       return false | ||||
|     } | ||||
|     const projectType = currentProject.type; | ||||
| 
 | ||||
|     //不允许人工触发的项目列表,以","分隔 | ||||
|     const unExitManualProjects: string[] = Reflect.get(this.judgeConfigObj, '332').split(',') || []; | ||||
|     //直线行驶中不进其他考试项目(0-否 1-是) | ||||
|     const param348: string = Reflect.get(this.judgeConfigObj, '348') || '0', | ||||
|       //里程不够允许手工点靠边停车(0-否 1-是) | ||||
|       param387: string = Reflect.get(this.judgeConfigObj, '387') || '0', | ||||
|       //里程不够不报靠边停车(0-否+1-是+2-必考项目未完成且里程不够不报项目) | ||||
|       param319: string = Reflect.get(this.judgeConfigObj, '319') || '0', | ||||
|       //人工项目是否能取消 1:可取消; | ||||
|       param340: string = Reflect.get(this.judgeConfigObj, '340') || '0', | ||||
|       //307参数里设置的项目,项目已经做过,后续不能人工触发; | ||||
|       param307: string[] = (Reflect.get(this.judgeConfigObj, '307') || '').split(','); | ||||
| 
 | ||||
|     //非行驶状态(没有速度),人工项目不能触发(按钮灰色) | ||||
|     if (carztStr === '停车') { | ||||
|       return false | ||||
|     } | ||||
| 
 | ||||
|     //车上是否能进行人工操作(0-能1-不能人工评判2-不能人工进项目3-都不能) | ||||
|     if (Reflect.get(this.judgeConfigObj, '342') === '3' || Reflect.get(this.judgeConfigObj, '342') === '2') { | ||||
|       return false | ||||
|     } | ||||
| 
 | ||||
|     //不允许人工触发的项目列表 | ||||
|     if (unExitManualProjects.includes(artSubject3ProjectsCodesArr[index])) { | ||||
|       return false | ||||
|     } | ||||
| 
 | ||||
|     //项目进行中不能人工触发 | ||||
|     if (isProjectIn) { | ||||
|       if (param340 == '1') { | ||||
|         if (isManualProjectIn && (currentProject.type == '2')) { | ||||
|           return true | ||||
|         } else { | ||||
|           return false | ||||
|         } | ||||
|       } | ||||
|       return false | ||||
|     } | ||||
| 
 | ||||
|     //项目路段信息判断 | ||||
|     if (!getProjectIsInRoad(projectCode + '')) { | ||||
|       return false | ||||
|     } | ||||
| 
 | ||||
|     const project_9: ProjectInfo = Reflect.get(projectsObj, '9') | ||||
|     // 直线行驶中不进其他考试项目(0-否 1-是) | ||||
|     if (param348 == '0' && project_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 = this.examMileage | ||||
|       const isRequiredProjectsEnd = this.isRequiredProjectsEnd | ||||
|       const jl = this.jl | ||||
|       //里程是否达标 && 必考项目是否全完成 | ||||
|       return jl >= Number(examMileage) && isRequiredProjectsEnd | ||||
|     } | ||||
|     return true | ||||
|   } | ||||
|   // 判断项目是否在当前路段号 | ||||
|   getProjectIsInRoad = (projectCode: string,) => { | ||||
|     const judgeConfigObj = this.judgeConfigObj; | ||||
|     const lane = this.lane; | ||||
|     const road = lane.road; | ||||
|     const num = lane.num; | ||||
|     const count = lane.count; | ||||
| 
 | ||||
|     const param_3: string[] = (Reflect.get(this.judgeConfigObj, '514')?.split(',') || []); | ||||
|     const param_4: string[] = (Reflect.get(this.judgeConfigObj, '515')?.split(',') || []); | ||||
|     const param_10: string[] = (Reflect.get(this.judgeConfigObj, '516')?.split(',') || []); | ||||
|     const param_11: string[] = (Reflect.get(this.judgeConfigObj, '517')?.split(',') || []); | ||||
|     const param_9: string[] = (Reflect.get(this.judgeConfigObj, '518')?.split(',') || []); | ||||
|     const param_12: string[] = (Reflect.get(this.judgeConfigObj, '519')?.split(',') || []); | ||||
| 
 | ||||
|     const projectRoads: ProjectRoads = { | ||||
|       //直线行驶 | ||||
|       param_3, | ||||
|       //变更车道 | ||||
|       param_4, | ||||
|       //超车 | ||||
|       param_10, | ||||
|       //靠边停车 | ||||
|       param_11, | ||||
|       //会车 | ||||
|       param_9, | ||||
|       //掉头 | ||||
|       param_12, | ||||
|     }; | ||||
| 
 | ||||
| 
 | ||||
|     //未测绘得道路上或者不在差分状态 | ||||
|     if (road === '') { | ||||
|       return false | ||||
|     } | ||||
|     const currentProjectRoad: string[] = Reflect.get(projectRoads, `param_${projectCode}`) | ||||
|     if (currentProjectRoad.length == 0) { | ||||
|       return true | ||||
|     } | ||||
| 
 | ||||
|     //设置了514-519参数,只能在设置的路段触发对应项目 | ||||
|     if (currentProjectRoad.includes(road)) { | ||||
|       //如果525为1,则514-519设置的路段不能触发对应项目 | ||||
|       if (Reflect.get(this.judgeConfigObj, '525') == '1') { | ||||
|         return false | ||||
|       } | ||||
|     } else { | ||||
|       return false | ||||
|     } | ||||
| 
 | ||||
|     //405参数为2是,如果在最左侧车道,超车项目不能触发; | ||||
|     if (projectCode == '10' && | ||||
|       Reflect.get(this.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 currentProject: ProjectInfo = Reflect.get(this.projectsObj, projectCode) | ||||
|     const type = currentProject.type | ||||
|     if (type == '2') { | ||||
|       return projectName | ||||
|     } | ||||
|     return (type == '3' || type == '4') ? `${projectName}_red` : `${projectName}_green`; | ||||
|   } | ||||
|   // 获取是否能进行人工评判 | ||||
|   getIsManualKf = () => { | ||||
|     if (this.examSubject == '3') { | ||||
|       //杭州训练模式不允许人工评判 | ||||
|       if (this.singlePlay && Reflect.get(this.judgeConfigObj, '211') == 'zjhz') { | ||||
|         return false | ||||
|       } | ||||
|       if (Reflect.get(this.judgeConfigObj, '342') == '0') { | ||||
|         return true | ||||
|       } | ||||
|       return false | ||||
|     } else { | ||||
|       return false | ||||
|     } | ||||
|   } | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										254
									
								
								entry/src/main/ets/pages/Judge/JudgeAndProject.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										254
									
								
								entry/src/main/ets/pages/Judge/JudgeAndProject.ets
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,254 @@ | ||||
| import { JudgeTag } from '../../config'; | ||||
| import { DefaultJudgeConfigObj, LANE, MarkRule, ProjectInfo, ProjectInfos } from '../../model'; | ||||
| import { CutArray } from '../../utils/Common'; | ||||
| import { dConsole } from '../../utils/LogWorker'; | ||||
| import { GetIsEndManualProject, GetIsExitManualProject } from './utils'; | ||||
| 
 | ||||
| @Component | ||||
| export default struct JudgeAndProjectComponent { | ||||
|   public kfArrScroller: Scroller = new Scroller() | ||||
|   @Prop carztStr: string | ||||
|   @Prop judgeConfigObj: DefaultJudgeConfigObj | ||||
|   @Prop dw: string | ||||
|   @Prop sd: string | ||||
|   @Prop @Watch("scrollLengthChange") kfArr: MarkRule[] | ||||
|   @Prop examSubject: string | ||||
|   @Prop projects: ProjectInfo[] | ||||
|   @Prop artSubject3Projects: string[] | ||||
|   @Prop artSubject3ProjectsCodesArr: string[] | ||||
|   @Prop projectsObj: ProjectInfos | ||||
|   @Prop isManualProjectIn: boolean | ||||
|   @Prop isProjectIn: boolean | ||||
|   @Prop jl: number | ||||
|   @Prop examMileage: string | ||||
|   @Prop isRequiredProjectsEnd: boolean | ||||
|   @Prop lane: LANE | ||||
|   examClick: (index: number) => void = (index: number) => { | ||||
|   } | ||||
| 
 | ||||
|   scrollLengthChange(data: MarkRule[]) { | ||||
|     dConsole.log(JudgeTag, "容器滚动", data.length) | ||||
|     if (data.length > 4) { | ||||
|       this.kfArrScroller.scrollTo({ | ||||
|         yOffset: 999999, xOffset: 0 | ||||
|       }) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   getProjectColor(project: ProjectInfo) { | ||||
|     const type = project.type; | ||||
|     switch (type) { | ||||
|       case '1': | ||||
|         return '#E6DECF'; | ||||
|       case '2': | ||||
|         return '#FFAD33'; | ||||
|       case '3': | ||||
|         return '#ff109d0a'; | ||||
|       case '4': | ||||
|         return '#FF7566'; | ||||
|       default: | ||||
|         return '#E6DECF'; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   build() { | ||||
|     Column() { | ||||
|       Row() { | ||||
|         Text(this.carztStr).fontColor('#FFA500').fontSize(30) | ||||
|         if (Reflect.get(this.judgeConfigObj, '342') == '0') { | ||||
|           Text(`${this.dw}挡`).fontColor('#FFA500').fontSize(30).padding({ left: 15, right: 15 }) | ||||
|           Text(`${this.sd}km/h`).fontColor('#FFA500').fontSize(30) | ||||
|         } | ||||
|       }.height(40) | ||||
| 
 | ||||
|       Row() { | ||||
|         Flex({ direction: FlexDirection.Column }) { | ||||
|           if (this.kfArr.length) { | ||||
|             List({ scroller: this.kfArrScroller }) { | ||||
|               ForEach(this.kfArr, (item: MarkRule) => { | ||||
|                 ListItem() { | ||||
|                   Column() { | ||||
|                     Row() { | ||||
|                       Text(item.xmmcStr).fontSize(32).fontColor('#FFF') | ||||
|                       Text(`${item.score}分`).fontSize(32).fontColor('#FFF') | ||||
|                     } | ||||
|                     .width('100%') | ||||
|                     .backgroundColor('#38260B') | ||||
|                     .justifyContent(FlexAlign.SpaceBetween) | ||||
|                     .padding({ | ||||
|                       top: 12, | ||||
|                       bottom: 12, | ||||
|                       left: 8, | ||||
|                       right: 5 | ||||
|                     }) | ||||
| 
 | ||||
|                     Text(item.desc + `(${item.markcatalog})`) | ||||
|                       .fontSize(32) | ||||
|                       .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(32).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(CutArray(this.projects, 2), (item: [ProjectInfo, ProjectInfo]) => { | ||||
|                 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(item[0])) | ||||
|                     } | ||||
|                     .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(item[1])) | ||||
|                       } | ||||
|                       .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: ProjectInfo) => { | ||||
|                   ListItem() { | ||||
|                     Text(project.name) { | ||||
|                     } | ||||
|                     .fontColor(this.getProjectColor(project)) | ||||
|                     .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: string, index) => { | ||||
|                     ListItem() { | ||||
|                     } | ||||
|                     // $rawfile( | ||||
|                     //   `judge/km3/${this.getIsExitManualProject(index) ? (this.getIsEndManualProject(index)) : | ||||
|                     //     (item + '_gray')}.png` | ||||
|                     // ) | ||||
|                     .backgroundImage( | ||||
|                       $rawfile( | ||||
|                         `judge/km3/${GetIsExitManualProject(index, this.judgeConfigObj, this.artSubject3ProjectsCodesArr, this.projectsObj, this.carztStr, this.isManualProjectIn, this.isProjectIn, this.jl, this.examMileage, this.isRequiredProjectsEnd, this.lane) ? (GetIsEndManualProject(index, this.artSubject3Projects, this.artSubject3ProjectsCodesArr, this.projectsObj)) : | ||||
|                           (item + '_gray')}.png` | ||||
|                       ), ImageRepeat.NoRepeat) | ||||
|                     .backgroundImageSize({ width: '100%', height: '100%' }) | ||||
|                     .width(174) | ||||
|                     .height(118 * 0.95) | ||||
|                     .margin({ bottom: 8 }) | ||||
|                     .onClick(() => { | ||||
|                       // this.vocObj.playAudio({ | ||||
|                       //   type: 1, | ||||
|                       //   name: 'button_media.wav' | ||||
|                       // }) | ||||
|                       this.examClick(index) | ||||
|                       // 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 }) | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,8 @@ | ||||
| @CustomDialog | ||||
| export default struct ManualConfirmationOfSubjectThreeProjectsDialog { | ||||
|   private controller?: CustomDialogController | ||||
| 
 | ||||
|   build() { | ||||
| 
 | ||||
|   } | ||||
| } | ||||
							
								
								
									
										71
									
								
								entry/src/main/ets/pages/Judge/Message.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								entry/src/main/ets/pages/Judge/Message.ets
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,71 @@ | ||||
| import { DefaultJudgeConfigObj } from '../../model' | ||||
| import { FormatTimeFlexible } from '../../utils/Common' | ||||
| 
 | ||||
| @Component | ||||
| export default struct MessageComponent { | ||||
|   @Prop name: string | ||||
|   @Prop startTime: string | ||||
|   @Prop idCard: string | ||||
|   @State examTime: number = 0 | ||||
|   @Prop examSubject: string | ||||
|   @Prop examMileage: string | ||||
|   @Prop jl: number | ||||
|   @Prop wayno: number | ||||
|   @Prop judgeConfigObj: DefaultJudgeConfigObj | ||||
| 
 | ||||
|   aboutToAppear(): void { | ||||
|     setInterval(async () => { | ||||
|       this.examTime += 1; | ||||
|     }, 1000); | ||||
|   } | ||||
| 
 | ||||
|   build() { | ||||
|     Row() { | ||||
|       Column() { | ||||
|         Row() { | ||||
|           Text('考生姓名:').fontColor('#E5CCA1').fontSize(30) | ||||
|           Text(this.name).fontColor('#FFF').fontSize(30) | ||||
|         }.margin({ bottom: 10 }) | ||||
| 
 | ||||
|         Row() { | ||||
|           Text('开始时间:').fontColor('#E5CCA1').fontSize(30) | ||||
|           Text(this.startTime).fontColor('#FFF').fontSize(30) | ||||
|         }.margin({ bottom: 10 }) | ||||
| 
 | ||||
|         if (this.examSubject == "3") { | ||||
|           Row() { | ||||
|             Text('考试路线:').fontColor('#E5CCA1').fontSize(30) | ||||
|             Text(`线路${this.wayno || 3}`).fontColor('#FFAD33').fontSize(30) | ||||
|           } | ||||
|         } | ||||
| 
 | ||||
|       }.width('45%').alignItems(HorizontalAlign.Start) | ||||
| 
 | ||||
|       Column() { | ||||
|         Row() { | ||||
|           Text('身份证号:').fontColor('#E5CCA1').fontSize(30) | ||||
|           Text(this.idCard).fontColor('#FFF').fontSize(30) | ||||
|         }.margin({ bottom: 10 }) | ||||
| 
 | ||||
|         Row() { | ||||
|           Text('考试用时:').fontColor('#E5CCA1').fontSize(30) | ||||
|           Text(FormatTimeFlexible(this.examTime)).fontColor('#FFF').fontSize(30) | ||||
|         }.margin({ bottom: 10 }) | ||||
| 
 | ||||
|         if (this.examSubject == "3") { | ||||
|           Row() { | ||||
|             if (Reflect.get(this.judgeConfigObj, '375') == '0') { | ||||
|               Text(`应行驶:${this.examMileage}m`) | ||||
|                 .fontColor('#E5CCA1') | ||||
|                 .fontSize(30) | ||||
|                 .padding({ right: 20 }) | ||||
|             } | ||||
|             Text(`已行驶:${this.jl}m`).fontColor('#FFAD33').fontSize(30) | ||||
|           } | ||||
|         } | ||||
| 
 | ||||
|       }.alignItems(HorizontalAlign.Start) | ||||
| 
 | ||||
|     }.width('100%') | ||||
|   } | ||||
| } | ||||
							
								
								
									
										134
									
								
								entry/src/main/ets/pages/Judge/OperatingArea.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								entry/src/main/ets/pages/Judge/OperatingArea.ets
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,134 @@ | ||||
| import { DefaultJudgeConfigObj } from '../../model' | ||||
| import Prompt from '@system.prompt' | ||||
| 
 | ||||
| @Component | ||||
| export default struct OperatingAreaComponent { | ||||
|   @Prop totalScore: number | ||||
|   @Prop kszp: string | ||||
|   @Prop examSubject: string | ||||
|   @Prop singlePlay: boolean | ||||
|   @Prop judgeConfigObj: DefaultJudgeConfigObj | ||||
|   // 信号查看 | ||||
|   signalViewingClick: () => void = () => { | ||||
|   } | ||||
|   // 人工评判 | ||||
|   artificialEvaluationClick: () => void = () => { | ||||
|   } | ||||
|   // 结束考试 | ||||
|   endTheExamClick: () => void = () => { | ||||
|   } | ||||
|   // 获取是否能进行人工评判 | ||||
|   getIsManualKf = () => { | ||||
|     if (this.examSubject == '3') { | ||||
|       //杭州训练模式不允许人工评判 | ||||
|       if (this.singlePlay && Reflect.get(this.judgeConfigObj, '211') == 'zjhz') { | ||||
|         return false | ||||
|       } | ||||
|       if (Reflect.get(this.judgeConfigObj, '342') == '0') { | ||||
|         return true | ||||
|       } | ||||
|       return false | ||||
|     } else { | ||||
|       return false | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   build() { | ||||
|     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.signalTrajectoryDialogController.open() | ||||
|           this.signalViewingClick() | ||||
|         }) | ||||
| 
 | ||||
|         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 | ||||
|             this.artificialEvaluationClick() | ||||
|           }) | ||||
|         } | ||||
| 
 | ||||
|         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 (Reflect.get(this.judgeConfigObj, '353') == '0') { | ||||
|             // this.endExamDialogController.open() | ||||
|             this.endTheExamClick() | ||||
|           } else { | ||||
|             Prompt.showToast({ | ||||
|               message: '车上不允许手动结束考试!', | ||||
|               duration: 4000 | ||||
|             }); | ||||
|           } | ||||
|         }) | ||||
|       }.margin({ bottom: 30 }) | ||||
| 
 | ||||
|     } | ||||
|     .width('25%') | ||||
|     .height('100%') | ||||
|     .justifyContent(FlexAlign.SpaceBetween) | ||||
|     .alignItems(HorizontalAlign.Center) | ||||
|     .margin({ bottom: 20 }) | ||||
|   } | ||||
| } | ||||
| @ -0,0 +1,8 @@ | ||||
| @CustomDialog | ||||
| export default struct SubjectThreeManualDeductionOfPointsDialog { | ||||
|   private controller?: CustomDialogController | ||||
| 
 | ||||
|   build() { | ||||
| 
 | ||||
|   } | ||||
| } | ||||
							
								
								
									
										40
									
								
								entry/src/main/ets/pages/Judge/TableUtils.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								entry/src/main/ets/pages/Judge/TableUtils.ets
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,40 @@ | ||||
| import { MA_MAP_POINT_ITEMType, MA_MAP_POINTType, MAPITEMPOINTITEM, MAPPOINT } from '../../model'; | ||||
| import { GetSyncData } from '../../utils/table/Operation'; | ||||
| 
 | ||||
| /** | ||||
|  * 初始化mapPoint表 | ||||
|  * @returns {Promise<MAPPOINT[]>} 返回mapPoint表数据 | ||||
|  */ | ||||
| export const InitMapPoint = async (): Promise<MAPPOINT[]> => { | ||||
|   const pointParams = await GetSyncData<MA_MAP_POINTType>('MA_MAP_POINT'); | ||||
|   if (pointParams.length === 0) return []; | ||||
| 
 | ||||
|   return pointParams.map(item => ({ | ||||
|     point_no: Number(item.point_no), | ||||
|     gps_e: Number(item.gps_e), | ||||
|     gps_n: Number(item.gps_n), | ||||
|     point_no_f: Number(item.point_no_f), | ||||
|     point_type: Number(item.point_type), | ||||
|     road_code: item.road_code || "", | ||||
|     gps_e_Location: Number(item.gps_e_location), | ||||
|     gps_n_Location: Number(item.gps_n_location), | ||||
|     f_gps_e: Number(item.f_gps_e), | ||||
|     f_gps_n: Number(item.f_gps_n), | ||||
|     passed: Number(item.passed), | ||||
|   } as MAPPOINT)); | ||||
| }; | ||||
| 
 | ||||
| /** | ||||
|  * 初始化mapPointItem表 | ||||
|  * @returns {Promise<MAPITEMPOINTITEM[]>} 返回mapPointItem表数据 | ||||
|  */ | ||||
| export const InitMapPointItem = async (): Promise<MAPITEMPOINTITEM[]> => { | ||||
|   const pointItemPoints: MA_MAP_POINT_ITEMType[] = await GetSyncData<MA_MAP_POINT_ITEMType>('MA_MAP_POINT_ITEM'); | ||||
|   if (pointItemPoints.length === 0) return []; | ||||
|   return pointItemPoints.map(item => ({ | ||||
|     point_no: Number(item.point_no), | ||||
|     itemno: Number(item.itemno), | ||||
|     itemno1: Number(item.itemno1), | ||||
|     subname: item.subname ?? "" | ||||
|   } as MAPITEMPOINTITEM)) | ||||
| } | ||||
| @ -1,6 +1,18 @@ | ||||
| import systemTime from '@ohos.systemDateTime'; | ||||
| import { TestRealExam } from '../../mock'; | ||||
| import { CarInfoType, ExtendType, Gps, LANE, PLCType, Radar, Vision } from '../../model'; | ||||
| import { | ||||
|   CarInfoType, | ||||
|   DefaultJudgeConfigObj, | ||||
|   ExtendType, | ||||
|   Gps, | ||||
|   LANE, | ||||
|   PLCType, | ||||
|   ProjectInfo, | ||||
|   ProjectInfos, | ||||
|   ProjectRoads, | ||||
|   Radar, | ||||
|   Vision | ||||
| } from '../../model'; | ||||
| import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common'; | ||||
| import dayTs from '../../utils/Date'; | ||||
| import { dConsole } from '../../utils/LogWorker'; | ||||
| @ -445,7 +457,9 @@ export function UploadRegulatoryCodeConversion( | ||||
|   // }); | ||||
| } | ||||
| 
 | ||||
| // 获取plc数据 | ||||
| /** | ||||
|  * 将PLC字符串转换为JSON对象 | ||||
|  */ | ||||
| export const PlcStrToJson = async (plc: string) => { | ||||
|   const plcArr = plc.split(',') | ||||
|   const p = plcArr.map((val, key) => { | ||||
| @ -456,54 +470,6 @@ export const PlcStrToJson = async (plc: string) => { | ||||
|     } | ||||
|   }); | ||||
|   const time = await systemTime.getCurrentTime() | ||||
| 
 | ||||
| 
 | ||||
|   // const sensor: Sensor = { | ||||
|   //   //安全带     车门门开关   手刹        脚刹        副刹       离合器      喇叭      示宽灯     近光灯     远光灯 | ||||
|   //   aqd: p[19], | ||||
|   //   mkg: p[14], | ||||
|   //   ssc: p[13], | ||||
|   //   jsc: p[12], | ||||
|   //   fsc: p[18], | ||||
|   //   lhq: p[17], | ||||
|   //   lb: p[4], | ||||
|   //   skd: p[9], | ||||
|   //   jgd: p[7], | ||||
|   //   ygd: p[8], | ||||
|   //   //左方向灯   右方向灯     双跳灯      雾灯        雨刮器      点火1     点火2      发动机转速     档位       车速 | ||||
|   //   zfxd: p[2], | ||||
|   //   yfxd: p[3], | ||||
|   //   shtd: p[20], | ||||
|   //   wd: p[10], | ||||
|   //   ygq: p[11], | ||||
|   //   dh1: p[5], | ||||
|   //   dh2: p[6], | ||||
|   //   fdjzs: p[25], | ||||
|   //   dw: p[28], | ||||
|   //   cs: p[23], | ||||
|   //   // 方向盘 | ||||
|   //   fxp: Number(plcArr[27].split('_')[0]), | ||||
|   //   //累计脉冲   溜车脉冲   超声波左后     超声波右后     超声波右前     超声波左前    座椅    仪表盘   后视镜   倒车镜   光照  雨量 | ||||
|   //   ljmc: p[24], | ||||
|   //   lcmc: 0, | ||||
|   //   csbzh: p[32], | ||||
|   //   csbyh: p[30], | ||||
|   //   csbyq: p[31], | ||||
|   //   csbzq: p[29], | ||||
|   //   zy: 0, | ||||
|   //   tbp: 0, | ||||
|   //   hsj: 0, | ||||
|   //   dcj: 0, | ||||
|   //   gx: 0, | ||||
|   //   yl: 0, | ||||
|   //   //TODO 数据待替换 油压  闪灯 信号灯 | ||||
|   //   yy: 0, | ||||
|   //   sde: 0, | ||||
|   //   xhd: '', | ||||
|   //   rmndg: 0, | ||||
|   //   wav: 0, | ||||
|   //   mndg: '' | ||||
|   // } | ||||
|   const gps2: Gps = TestRealExam.gps2 | ||||
|   const radar: Radar = TestRealExam.radar | ||||
|   const vision: Vision = TestRealExam.vision | ||||
| @ -704,3 +670,165 @@ export function sendRed() { | ||||
|   const arrRedBuffer = ArrayToByteArray(arrRed).buffer | ||||
|   // globalThis.lightLineUdp.send(arrRedBuffer); | ||||
| } | ||||
| 
 | ||||
| // 获取是否能人工进项目 | ||||
| export const GetIsExitManualProject = (index: number, judgeConfigObj: DefaultJudgeConfigObj, artSubject3ProjectsCodesArr: string[], projectsObj: ProjectInfos, carztStr: string, isManualProjectIn: boolean, isProjectIn: boolean, jl: number, examMileage: string, isRequiredProjectsEnd: boolean, lane: LANE): boolean => { | ||||
|   // const judgeConfigObj = this.judgeConfigObj; | ||||
|   // const artSubject3ProjectsCodesArr = this.artSubject3ProjectsCodesArr; | ||||
|   // const projectsObj = this.projectsObj; | ||||
|   // const carztStr = this.carztStr; | ||||
|   // const isManualProjectIn = this.isManualProjectIn; | ||||
|   // const isProjectIn = this.isProjectIn; | ||||
|   // const getProjectIsInRoad = this.getProjectIsInRoad; | ||||
| 
 | ||||
|   const projectCode = artSubject3ProjectsCodesArr[index]; | ||||
|   const currentProject: ProjectInfo = Reflect.get(projectsObj, projectCode) | ||||
|   if (currentProject === undefined) { | ||||
|     return false | ||||
|   } | ||||
|   const projectType = currentProject.type; | ||||
| 
 | ||||
|   //不允许人工触发的项目列表,以","分隔 | ||||
|   // TODO 可能会出错 | ||||
|   const unExitManualProjects: string[] = (Reflect.get(judgeConfigObj, '332') || '').split(','); | ||||
|   //直线行驶中不进其他考试项目(0-否 1-是) | ||||
|   const param348: string = Reflect.get(judgeConfigObj, '348') || '0', | ||||
|     //里程不够允许手工点靠边停车(0-否 1-是) | ||||
|     param387: string = Reflect.get(judgeConfigObj, '387') || '0', | ||||
|     //里程不够不报靠边停车(0-否+1-是+2-必考项目未完成且里程不够不报项目) | ||||
|     param319: string = Reflect.get(judgeConfigObj, '319') || '0', | ||||
|     //人工项目是否能取消 1:可取消; | ||||
|     param340: string = Reflect.get(judgeConfigObj, '340') || '0', | ||||
|     //307参数里设置的项目,项目已经做过,后续不能人工触发; | ||||
|     param307: string[] = (Reflect.get(judgeConfigObj, '307') || '').split(','); | ||||
| 
 | ||||
|   //非行驶状态(没有速度),人工项目不能触发(按钮灰色) | ||||
|   if (carztStr === '停车') { | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   //车上是否能进行人工操作(0-能1-不能人工评判2-不能人工进项目3-都不能) | ||||
|   if (Reflect.get(judgeConfigObj, '342') === '3' || Reflect.get(judgeConfigObj, '342') === '2') { | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   //不允许人工触发的项目列表 | ||||
|   if (unExitManualProjects.includes(artSubject3ProjectsCodesArr[index])) { | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   //项目进行中不能人工触发 | ||||
|   if (isProjectIn) { | ||||
|     if (param340 == '1') { | ||||
|       if (isManualProjectIn && (currentProject.type == '2')) { | ||||
|         return true | ||||
|       } else { | ||||
|         return false | ||||
|       } | ||||
|     } | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   //项目路段信息判断 | ||||
|   if (!GetProjectIsInRoad(projectCode + '', lane, judgeConfigObj)) { | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   const project_9: ProjectInfo = Reflect.get(projectsObj, '9') | ||||
|   // 直线行驶中不进其他考试项目(0-否 1-是) | ||||
|   if (param348 == '0' && project_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) { | ||||
|     //里程是否达标 && 必考项目是否全完成 | ||||
|     return jl >= Number(examMileage) && isRequiredProjectsEnd | ||||
|   } | ||||
|   return true | ||||
| } | ||||
| 
 | ||||
| // 判断项目是否在当前路段号 | ||||
| export const GetProjectIsInRoad = (projectCode: string, lane: LANE, judgeConfigObj: DefaultJudgeConfigObj): boolean => { | ||||
| 
 | ||||
|   // const lane = this.lane; | ||||
|   const road = lane.road; | ||||
|   const num = lane.num; | ||||
|   const count = lane.count; | ||||
| 
 | ||||
|   const param_3: string[] = (Reflect.get(judgeConfigObj, '514')?.split(',') || []); | ||||
|   const param_4: string[] = (Reflect.get(judgeConfigObj, '515')?.split(',') || []); | ||||
|   const param_10: string[] = (Reflect.get(judgeConfigObj, '516')?.split(',') || []); | ||||
|   const param_11: string[] = (Reflect.get(judgeConfigObj, '517')?.split(',') || []); | ||||
|   const param_9: string[] = (Reflect.get(judgeConfigObj, '518')?.split(',') || []); | ||||
|   const param_12: string[] = (Reflect.get(judgeConfigObj, '519')?.split(',') || []); | ||||
| 
 | ||||
|   const projectRoads: ProjectRoads = { | ||||
|     //直线行驶 | ||||
|     param_3, | ||||
|     //变更车道 | ||||
|     param_4, | ||||
|     //超车 | ||||
|     param_10, | ||||
|     //靠边停车 | ||||
|     param_11, | ||||
|     //会车 | ||||
|     param_9, | ||||
|     //掉头 | ||||
|     param_12, | ||||
|   }; | ||||
| 
 | ||||
| 
 | ||||
|   //未测绘得道路上或者不在差分状态 | ||||
|   if (road === '') { | ||||
|     return false | ||||
|   } | ||||
|   const currentProjectRoad: string[] = Reflect.get(projectRoads, `param_${projectCode}`) | ||||
|   if (currentProjectRoad.length == 0) { | ||||
|     return true | ||||
|   } | ||||
| 
 | ||||
|   //设置了514-519参数,只能在设置的路段触发对应项目 | ||||
|   if (currentProjectRoad.includes(road)) { | ||||
|     //如果525为1,则514-519设置的路段不能触发对应项目 | ||||
|     if (Reflect.get(judgeConfigObj, '525') == '1') { | ||||
|       return false | ||||
|     } | ||||
|   } else { | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   //405参数为2是,如果在最左侧车道,超车项目不能触发; | ||||
|   if (projectCode == '10' && | ||||
|     Reflect.get(judgeConfigObj, '405') == '2' && | ||||
|     (num === count) && | ||||
|     num > 0 | ||||
|   ) { | ||||
|     return false | ||||
|   } | ||||
| 
 | ||||
|   // 车道总数少于2条,超车和变道不能触发 | ||||
|   if (projectCode == '10' || projectCode == '4') { | ||||
|     if (count < 2) { | ||||
|       return false | ||||
|     } | ||||
|   } | ||||
|   return true | ||||
| } | ||||
| 
 | ||||
| // 获取人工项目是否已做 | ||||
| export const GetIsEndManualProject = (index: number, artSubject3Projects: string[], artSubject3ProjectsCodesArr: string[], projectsObj: ProjectInfos): string => { | ||||
|   const projectName = artSubject3Projects[index]; | ||||
|   const projectCode = artSubject3ProjectsCodesArr[index]; | ||||
|   const currentProject: ProjectInfo = Reflect.get(projectsObj, projectCode) | ||||
|   const type = currentProject.type | ||||
|   if (type == '2') { | ||||
|     return projectName | ||||
|   } | ||||
|   return (type == '3' || type == '4') ? `${projectName}_red` : `${projectName}_green`; | ||||
| } | ||||
| @ -67,7 +67,7 @@ export default struct HeaderComponent { | ||||
|             .fontColor("#fff") | ||||
|             .margin({ | ||||
|               left: 10 | ||||
|             }).fontSize(16) | ||||
|             }).fontSize(20) | ||||
|           if (this.logoExpansionBuilder) { | ||||
|             this.logoExpansionBuilder() | ||||
|           } | ||||
|  | ||||
| @ -184,37 +184,6 @@ export default class Judge { | ||||
|   private isExamEnd: boolean | ||||
|   // 是否发送udp | ||||
|   private isUdpEnd: boolean = false | ||||
|   // 处理udp plc信号 | ||||
|   handleUdp = async (msg: string) => { | ||||
|     const stachArr = msg.split(',') | ||||
|     if (stachArr[0] != '#DN_GD' || this.isUdpEnd) { | ||||
|       return | ||||
|     } | ||||
|     const plcData = await this.getPlcData(msg); | ||||
|     // 4.过程数据 | ||||
|     await this.fileLog?.setExamJudgeData(JSON.stringify(plcData)) | ||||
|     //检测到有无锡所设备接入,需要发送特定的数据,供检测 | ||||
|     // if (this.usbService.isWXUSBDevice) { | ||||
|     //   const str = await senorToWXDataStr(msg); | ||||
|     //   this.usbService.sendUSB(str) | ||||
|     // } | ||||
|     const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350') | ||||
|     this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + '' | ||||
|     this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + '' | ||||
|     //TODO 暂时关闭差分检测异常 | ||||
|     // await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt); | ||||
|     if (!this.isExamEnd) { | ||||
|       await examJudgeRealExam(plcData) | ||||
|     } | ||||
|     // let udpIndex = AppStorage.get<number>('udpIndex') || 0; | ||||
|     // if (udpIndex % 5 === 0 && !this.isUdpEnd) { | ||||
|     // TODO UPD缺失 | ||||
|     // const judgeUdp = globalThis.judgeUdp | ||||
|     // const bytes = await this.getMessageHeartbeat(this.isExamEnd); | ||||
|     // judgeUdp.send(bytes) | ||||
|     // } | ||||
|     // AppStorage.setOrCreate('udpIndex', udpIndex++) | ||||
|   } | ||||
|   //是否手动结束考试 | ||||
|   private isManual: boolean = false | ||||
|   //UDP服务序列号 | ||||
| @ -261,6 +230,31 @@ export default class Judge { | ||||
|     dConsole.info(JudgeTag, '过程数据文件上传 end') | ||||
|   } | ||||
|   private judgeTask: JudgeTask | ||||
|   private tempData?: PLCType | ||||
|   //实时计算gps经纬度距离 | ||||
|   handDistance = async () => { | ||||
|     const dwzt = this.tempData?.gps?.dwzt || ""; | ||||
|     const jdzt = this.tempData?.gps?.jdzt || ""; | ||||
|     const tJD = ConvertDdmmToDecimalDegrees(this.tempData?.gps?.jd || 0) | ||||
|     const tWD = ConvertDdmmToDecimalDegrees(this.tempData?.gps?.wd || 0) | ||||
|     if (this.prevJd && dwzt == 4 && jdzt == 3) { | ||||
|       const distance = await examCalcGpsDistance({ | ||||
|         jd1: this.prevJd, | ||||
|         wd1: this.prevWd, | ||||
|         jd2: tJD, | ||||
|         wd2: tWD, | ||||
|         h: this.tempData?.gps?.hxj || 1, | ||||
|       }) | ||||
|       // const distanceClass = AppStorage.get<DistanceClass>('distanceClass') | ||||
|       // distanceClass?.setTimeData(Number(((distance / 100).toFixed(2)))) | ||||
|       DrivingDataStorage.setDrivingProcessData(Number(((distance / 100).toFixed(2)))) | ||||
|     } | ||||
|     this.prevJd = tJD; | ||||
|     this.prevWd = tWD; | ||||
|   } | ||||
|   private performInfo?: JudgePerformInfo | ||||
|   private isEndTip: boolean = false; | ||||
|   private deductedPopShowTimer: number = 0; | ||||
|   // 校验考试是否结束 | ||||
|   checkExamIsEnd = | ||||
|     async (isManual?: boolean) => { | ||||
| @ -374,85 +368,6 @@ export default class Judge { | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|   private tempData?: PLCType | ||||
|   //实时计算gps经纬度距离 | ||||
|   handDistance = async () => { | ||||
|     const dwzt = this.tempData?.gps?.dwzt || ""; | ||||
|     const jdzt = this.tempData?.gps?.jdzt || ""; | ||||
|     const tJD = ConvertDdmmToDecimalDegrees(this.tempData?.gps?.jd || 0) | ||||
|     const tWD = ConvertDdmmToDecimalDegrees(this.tempData?.gps?.wd || 0) | ||||
|     if (this.prevJd && dwzt == 4 && jdzt == 3) { | ||||
|       const distance = await examCalcGpsDistance({ | ||||
|         jd1: this.prevJd, | ||||
|         wd1: this.prevWd, | ||||
|         jd2: tJD, | ||||
|         wd2: tWD, | ||||
|         h: this.tempData?.gps?.hxj || 1, | ||||
|       }) | ||||
|       // const distanceClass = AppStorage.get<DistanceClass>('distanceClass') | ||||
|       // distanceClass?.setTimeData(Number(((distance / 100).toFixed(2)))) | ||||
|       DrivingDataStorage.setDrivingProcessData(Number(((distance / 100).toFixed(2)))) | ||||
|     } | ||||
|     this.prevJd = tJD; | ||||
|     this.prevWd = tWD; | ||||
|   } | ||||
|   private performInfo?: JudgePerformInfo | ||||
|   private isEndTip: boolean = false; | ||||
|   private deductedPopShowTimer: number = 0; | ||||
|   // 检测扣分、结束项目时该项目是否开始 | ||||
|   checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => { | ||||
|     if (xmdm == 20) { | ||||
|       return true | ||||
|     } | ||||
|     const judgeUI = this.judgeUI; | ||||
|     const judgeTask = this.judgeTask; | ||||
|     const projectsObj: object = this.judgeUI.projectsObj | ||||
|     const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm) | ||||
|     const isUpload = currentProject.isUpload | ||||
| 
 | ||||
|     //如果项目没有开始 | ||||
|     dConsole.info(JudgeTag, 'surenjun isUpload=>', isUpload) | ||||
|     if (!isUpload) { | ||||
|       dConsole.info(JudgeTag, '项目补传开始') | ||||
|       //项目开始补传 | ||||
|       judgeTask.addTask(async () => { | ||||
|         await this.beginProject(xmdm) | ||||
|       }, { | ||||
|         isDelay: true | ||||
|       }) | ||||
|       judgeTask.addTask(async () => { | ||||
|         await this.uploadProgressPhoto(xmdm) | ||||
|       }, { | ||||
|         isDelay: true | ||||
|       }) | ||||
|       currentProject.isUpload = true; | ||||
|       Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject) | ||||
|       //扣分补传 | ||||
|       if (currentType == 2) { | ||||
|         judgeTask.addTask(async () => { | ||||
|           await this.pointsDedute(xmdm, kf!) | ||||
|         }, { | ||||
|           isDelay: true | ||||
|         }) | ||||
|       } | ||||
|       //扣分补传判断是否合格 不合格补传项目结束 | ||||
|       if (currentType == 1 || (currentType == 2 && this.totalScore < judgeUI.passingScore)) { | ||||
|         judgeTask.addTask(async () => { | ||||
|           await this.endProject(xmdm) | ||||
|         }, { | ||||
|           isDelay: true | ||||
|         }) | ||||
|         currentProject.isEnd = true; | ||||
|         Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject) | ||||
|       } | ||||
|       judgeTask.addTask(async () => { | ||||
|         this.checkExamIsEnd() | ||||
|       }) | ||||
|       return false; | ||||
|     } else { | ||||
|       return true | ||||
|     } | ||||
|   } | ||||
|   private ksjs?: JudgeKSJS | ||||
|   private kfArr?: MarkRule[] | ||||
|   //所有的科目考试项目(大车&小车) | ||||
| @ -478,6 +393,37 @@ export default class Judge { | ||||
|     AppStorage.setOrCreate('msgStr', plc) | ||||
|     return tempData | ||||
|   } | ||||
|   // 处理udp plc信号 | ||||
|   handleUdp = async (msg: string) => { | ||||
|     const stachArr = msg.split(',') | ||||
|     if (stachArr[0] != '#DN_GD' || this.isUdpEnd) { | ||||
|       return | ||||
|     } | ||||
|     const plcData = await this.getPlcData(msg); | ||||
|     // 4.过程数据 | ||||
|     await this.fileLog?.setExamJudgeData(JSON.stringify(plcData)) | ||||
|     //检测到有无锡所设备接入,需要发送特定的数据,供检测 | ||||
|     // if (this.usbService.isWXUSBDevice) { | ||||
|     //   const str = await senorToWXDataStr(msg); | ||||
|     //   this.usbService.sendUSB(str) | ||||
|     // } | ||||
|     const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350') | ||||
|     this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + '' | ||||
|     this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + '' | ||||
|     //TODO 暂时关闭差分检测异常 | ||||
|     // await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt); | ||||
|     if (!this.isExamEnd) { | ||||
|       await examJudgeRealExam(plcData) | ||||
|     } | ||||
|     // let udpIndex = AppStorage.get<number>('udpIndex') || 0; | ||||
|     // if (udpIndex % 5 === 0 && !this.isUdpEnd) { | ||||
|     // TODO UPD缺失 | ||||
|     // const judgeUdp = globalThis.judgeUdp | ||||
|     // const bytes = await this.getMessageHeartbeat(this.isExamEnd); | ||||
|     // judgeUdp.send(bytes) | ||||
|     // } | ||||
|     // AppStorage.setOrCreate('udpIndex', udpIndex++) | ||||
|   } | ||||
|   // 处理轨迹plc信号 | ||||
|   handleTrajectoryUdp = async (strArr: string[]) => { | ||||
|     let num = 2; | ||||
| @ -515,9 +461,9 @@ export default class Judge { | ||||
|   } | ||||
|   //本地轨迹回放地址 | ||||
|   private trajectoryPath: string | ||||
|   //当前科目二的考试项目 | ||||
|   // private currentKm2ItemsObj: any | ||||
|   private isTrajectoryOpen: boolean; | ||||
|   //当前科目二的考试项目 | ||||
|   // 调代理接口是否断网了 | ||||
|   private isJudgeDisConnect: boolean = false; | ||||
|   // 断网数据补传 | ||||
| @ -532,33 +478,6 @@ export default class Judge { | ||||
|       const code = await writeObjectOut(JSON.parse(examDataStr), "", this.context); | ||||
|     } | ||||
|   } | ||||
|   private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] | ||||
|   private lane: LANE = { | ||||
|     road: '', num: 0, count: 0 | ||||
|   } | ||||
|   private videoData?: RecordHandleType | ||||
|   private disConnectNum: number = 0; | ||||
|   //调用监管接口 | ||||
|   sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => { | ||||
|     const temp = await writeObjectOut(data, filePath, this.context); | ||||
|     dConsole.log(JudgeTag, "wzj", JSON.stringify(temp)) | ||||
|     //断网&网络超时次数计算 | ||||
|     if (temp.code == 2300007 || temp.code == 2300028) { | ||||
|       this.disConnectNum += 1; | ||||
|       if (this.disConnectNum < 5) { | ||||
|         return await this.sendWriteObjectOut(data, filePath) | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if (this.disConnectNum >= 5) { | ||||
|       dConsole.info('surenjun', '123') | ||||
|       this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!'; | ||||
|       this.judgeUI.disConnectErrorOpen = true | ||||
|     } | ||||
| 
 | ||||
|     this.disConnectNum = 0 | ||||
|     return temp | ||||
|   } | ||||
|   // 项目开始接口同步 | ||||
|   beginProject = async (ksxm: number) => { | ||||
|     const carInfo = AppStorage.get<CarInfoType>('carInfo'); | ||||
| @ -662,6 +581,87 @@ export default class Judge { | ||||
|     UploadRegulatoryCodeConversion('17C54', temp.code || 0) | ||||
|     dConsole.info(JudgeTag, '上传照片 end') | ||||
|   } | ||||
|   // 检测扣分、结束项目时该项目是否开始 | ||||
|   checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => { | ||||
|     if (xmdm == 20) { | ||||
|       return true | ||||
|     } | ||||
|     const judgeUI = this.judgeUI; | ||||
|     const judgeTask = this.judgeTask; | ||||
|     const projectsObj: object = this.judgeUI.projectsObj | ||||
|     const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm) | ||||
|     const isUpload = currentProject.isUpload | ||||
| 
 | ||||
|     //如果项目没有开始 | ||||
|     dConsole.info(JudgeTag, 'surenjun isUpload=>', isUpload) | ||||
|     if (!isUpload) { | ||||
|       dConsole.info(JudgeTag, '项目补传开始') | ||||
|       //项目开始补传 | ||||
|       judgeTask.addTask(async () => { | ||||
|         await this.beginProject(xmdm) | ||||
|       }, { | ||||
|         isDelay: true | ||||
|       }) | ||||
|       judgeTask.addTask(async () => { | ||||
|         await this.uploadProgressPhoto(xmdm) | ||||
|       }, { | ||||
|         isDelay: true | ||||
|       }) | ||||
|       currentProject.isUpload = true; | ||||
|       Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject) | ||||
|       //扣分补传 | ||||
|       if (currentType == 2) { | ||||
|         judgeTask.addTask(async () => { | ||||
|           await this.pointsDedute(xmdm, kf!) | ||||
|         }, { | ||||
|           isDelay: true | ||||
|         }) | ||||
|       } | ||||
|       //扣分补传判断是否合格 不合格补传项目结束 | ||||
|       if (currentType == 1 || (currentType == 2 && this.totalScore < judgeUI.passingScore)) { | ||||
|         judgeTask.addTask(async () => { | ||||
|           await this.endProject(xmdm) | ||||
|         }, { | ||||
|           isDelay: true | ||||
|         }) | ||||
|         currentProject.isEnd = true; | ||||
|         Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject) | ||||
|       } | ||||
|       judgeTask.addTask(async () => { | ||||
|         this.checkExamIsEnd() | ||||
|       }) | ||||
|       return false; | ||||
|     } else { | ||||
|       return true | ||||
|     } | ||||
|   } | ||||
|   private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11] | ||||
|   private lane: LANE = { | ||||
|     road: '', num: 0, count: 0 | ||||
|   } | ||||
|   private videoData?: RecordHandleType | ||||
|   private disConnectNum: number = 0; | ||||
|   //调用监管接口 | ||||
|   sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => { | ||||
|     const temp = await writeObjectOut(data, filePath, this.context); | ||||
|     dConsole.log(JudgeTag, "wzj", JSON.stringify(temp)) | ||||
|     //断网&网络超时次数计算 | ||||
|     if (temp.code == 2300007 || temp.code == 2300028) { | ||||
|       this.disConnectNum += 1; | ||||
|       if (this.disConnectNum < 5) { | ||||
|         return await this.sendWriteObjectOut(data, filePath) | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     if (this.disConnectNum >= 5) { | ||||
|       dConsole.info('surenjun', '123') | ||||
|       this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!'; | ||||
|       this.judgeUI.disConnectErrorOpen = true | ||||
|     } | ||||
| 
 | ||||
|     this.disConnectNum = 0 | ||||
|     return temp | ||||
|   } | ||||
| 
 | ||||
|   constructor(judgeUI: JudgeUI) { | ||||
|     this.serialIndex = 1; | ||||
| @ -1205,11 +1205,11 @@ export default class Judge { | ||||
|           break | ||||
|       } | ||||
|       if (event == 2 || event == 3) { | ||||
|         setTimeout(() => { | ||||
|           this.judgeUI.kfArrScroller.scrollTo({ | ||||
|             yOffset: 999999, xOffset: 0 | ||||
|           }) | ||||
|         }, 500) | ||||
|         // setTimeout(() => { | ||||
|         //   this.judgeUI.kfArrScroller.scrollTo({ | ||||
|         //     yOffset: 999999, xOffset: 0 | ||||
|         //   }) | ||||
|         // }, 500) | ||||
|         //统计必考项目完成数量 | ||||
|         await this.setCountItems(); | ||||
|         await checkExamIsEnd() | ||||
| @ -1325,6 +1325,7 @@ export default class Judge { | ||||
|   public handEndExam = async () => { | ||||
|     dConsole.info(JudgeTag, '处理考试结束 handEndExam') | ||||
|     // this.judgeUI.loadingPopupVisible = true; | ||||
|     dConsole.log(JudgeTag, ' 打开车辆loading1') | ||||
|     this.judgeUI.generateExamRecordsDialogController.open() | ||||
|     // this.judgeUI.endPopupVisible = false; | ||||
|     this.judgeUI.endExamDialogController.close() | ||||
| @ -1456,13 +1457,15 @@ export default class Judge { | ||||
|       this.isUdpEnd = true; | ||||
|       closeAllFiles() | ||||
|       // this.judgeUI.loadingPopupVisible = false; | ||||
|       dConsole.log(JudgeTag, ' 关闭车辆loading1') | ||||
|       this.judgeUI.generateExamRecordsDialogController.close() | ||||
|       return | ||||
|     } | ||||
|     dConsole.info(JudgeTag, '考试结束 end') | ||||
|     const param302: string = Reflect.get(judgeConfigObj, '302') | ||||
|     // judgeUI.loadingPopupVisible = true; | ||||
|     judgeUI.generateExamRecordsDialogController.open() | ||||
|     dConsole.log(JudgeTag, ' 打开车辆loading2') | ||||
|     // judgeUI.generateExamRecordsDialogController.open() | ||||
|     let currentKssycs = '0'; | ||||
|     let voiceURL = '' | ||||
|     if (examSubject == '2') { | ||||
| @ -1563,6 +1566,8 @@ export default class Judge { | ||||
|         setTimeout(() => { | ||||
|           this.isUdpEnd = true | ||||
|           closeAllFiles() | ||||
|           dConsole.log(JudgeTag, ' 关闭车辆loading2') | ||||
|           this.judgeUI.generateExamRecordsDialogController.close() | ||||
|           router.back(); | ||||
|         }, param302 == '8' ? 3000 : 0) | ||||
|       }) | ||||
|  | ||||
| @ -13,43 +13,68 @@ interface QUEUE { | ||||
| type GoTask = (currentTask: QUEUE) => Promise<boolean> | ||||
| 
 | ||||
| export default class JudgeTask { | ||||
|   //执行任务 | ||||
|   goTask: GoTask = async (currentTask: QUEUE) => { | ||||
|     const fn = currentTask.fn; | ||||
|     const delayConfig = currentTask.delayConfig || { | ||||
|       isDelay: false, delayTime: 1000 | ||||
|     } | ||||
|     const isDelay = delayConfig.isDelay | ||||
|     const delayTime = delayConfig.delayTime | ||||
| 
 | ||||
|     return false | ||||
|   } | ||||
|   private queue?: QUEUE[] = [] | ||||
|   private status: string | ||||
|   private queue: QUEUE[] = []; | ||||
|   private status: string = 'end'; | ||||
|   private isExecuting: boolean = false; | ||||
|   // 改为迭代方式执行队列 | ||||
|   executeQueue = async () => { | ||||
|     const queue = this.queue; | ||||
|     const executeQueue = this.executeQueue | ||||
|     if (queue?.length) { | ||||
|       for (const currentTask of queue) { | ||||
|         await this.goTask(currentTask) | ||||
|         this.queue?.shift() | ||||
|         await executeQueue() | ||||
|     if (this.isExecuting) return; | ||||
| 
 | ||||
|     this.isExecuting = true; | ||||
|     this.status = 'running'; | ||||
| 
 | ||||
|     while (this.queue.length > 0) { | ||||
|       const currentTask = this.queue[0]; | ||||
|       try { | ||||
|         await this.goTask(currentTask); | ||||
|       } finally { | ||||
|         this.queue.shift(); | ||||
|       } | ||||
|     } else { | ||||
|       this.status = 'end' | ||||
|     } | ||||
| 
 | ||||
|     this.status = 'end'; | ||||
|     this.isExecuting = false; | ||||
|   } | ||||
|   addTask = async (fn: Function, delayConfig?: DelayConfig) => { | ||||
|     this.queue?.push({ | ||||
|       fn, delayConfig | ||||
|     this.queue.push({ | ||||
|       fn, | ||||
|       delayConfig | ||||
|     }); | ||||
|     if (this.status == 'end' && this.queue?.length === 1) { | ||||
| 
 | ||||
|     // 如果当前没有在执行,就启动执行 | ||||
|     if (!this.isExecuting) { | ||||
|       await this.executeQueue(); | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   constructor() { | ||||
|     this.queue = [] | ||||
|     this.status = 'end' | ||||
|     this.queue = []; | ||||
|     this.status = 'end'; | ||||
|     this.isExecuting = false; | ||||
|   } | ||||
| 
 | ||||
|   // 执行任务 | ||||
|   goTask: GoTask = async (currentTask: QUEUE) => { | ||||
|     try { | ||||
|       const fn = currentTask.fn; | ||||
|       const delayConfig = currentTask.delayConfig || { | ||||
|         isDelay: false, delayTime: 1000 | ||||
|       } | ||||
| 
 | ||||
|       // 实际执行任务函数 | ||||
|       await fn(); | ||||
| 
 | ||||
|       // 处理延迟逻辑 | ||||
|       if (delayConfig.isDelay && delayConfig.delayTime) { | ||||
|         await new Promise<void>(resolve => { | ||||
|           setTimeout(resolve, delayConfig.delayTime); | ||||
|         }); | ||||
|       } | ||||
| 
 | ||||
|       return true; | ||||
|     } catch (error) { | ||||
|       console.error(TAG, '任务执行失败:', error); | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| } | ||||
| @ -1,55 +1,13 @@ | ||||
| <details> | ||||
|     <summary>fix: 档位信号处理,信号显示界面无法进入问题解决</summary> | ||||
|     <summary>fix: 评判日志</summary> | ||||
|      <span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-30 16:50</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">b92d31b</span> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-07-01 11:08</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">756ced2</span> | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|     <summary>fix: 档位信号处理</summary> | ||||
|     <summary>fix: 补全完善类型系统</summary> | ||||
|      <span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-30 16:41</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">c717b16</span> | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|     <summary>fix: 完善worker关闭性能优化,完善读取串口代码</summary> | ||||
|      <span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-30 09:55</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">078ec1a</span> | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|     <summary>fix: 修改版本参数</summary> | ||||
|      <span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-30 09:10</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">fd2f75d</span> | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|     <summary>fix: 解决页面有输入法会自动弹出自动聚焦影响体验问题</summary> | ||||
|      <span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-27 17:29</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">f1fc2f9</span> | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|     <summary>fix: 完善版本发布</summary> | ||||
|      <span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-27 16:01</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">e34297a</span> | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|     <summary>fix: 完善版本发布</summary> | ||||
|      <span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-27 15:02</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">4705de0</span> | ||||
| </details> | ||||
| 
 | ||||
| <details> | ||||
|     <summary>fix: 增加调试模式设置</summary> | ||||
|      <span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-27 15:02</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">0809571</span> | ||||
|      <span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-30 17:15</span><br> | ||||
|     <span style="color: #888;">[提交版本]:</span><span style="color: #333;">03d3f09</span> | ||||
| </details> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user