新评判重构
This commit is contained in:
		
							parent
							
								
									9617c63ebb
								
							
						
					
					
						commit
						33459e85ec
					
				| @ -1,5 +1,5 @@ | |||||||
| { | { | ||||||
|   "lockfileVersion": 2, |   "lockfileVersion": 1, | ||||||
|   "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", |   "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", | ||||||
|   "specifiers": {}, |   "specifiers": {}, | ||||||
|   "packages": {} |   "packages": {} | ||||||
|  | |||||||
| @ -104,6 +104,8 @@ export interface RouteParamsType { | |||||||
|   kString?: string; |   kString?: string; | ||||||
|   examItems?: string; |   examItems?: string; | ||||||
|   fromIndex?: boolean; |   fromIndex?: boolean; | ||||||
|  |   mode?: number | ||||||
|  |   score?: number | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // 车辆信息 | // 车辆信息 | ||||||
|  | |||||||
| @ -2,28 +2,29 @@ import { | |||||||
|   JudgeConfigObjKmItems, |   JudgeConfigObjKmItems, | ||||||
|   JudgeKSJS, |   JudgeKSJS, | ||||||
|   JudgePerformInfo, |   JudgePerformInfo, | ||||||
|   JudgeUI, |  | ||||||
|   LANE, |   LANE, | ||||||
|   MarkRule, |   MarkRule, | ||||||
|   PLCType, |   PLCType, | ||||||
|   ProcessDataEnumType, |   ProcessDataEnumType, | ||||||
|   RecordHandleType, |   RecordHandleType, | ||||||
|   WorkerBackMessage, |   WorkerBackMessage, | ||||||
|   WorkerBackMessageType |   WorkerBackMessageType, | ||||||
|  |   RouteParamsType | ||||||
| } from '../../model' | } from '../../model' | ||||||
| import FileUtils from '../../utils/FileUtils' | import FileUtils from '../../utils/FileUtils' | ||||||
| import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements' | import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements' | ||||||
| import common from '@ohos.app.ability.common' | import common from '@ohos.app.ability.common' | ||||||
| import { LargeJudge, RouterParam, SmallJudge } from './JudgeStart' | import { LargeJudge } from './LargeJudgeBusiness' | ||||||
|  | import { SmallJudge } from './SmallJudgeBusiness' | ||||||
| import { dConsole } from '../../utils/LogWorker' | import { dConsole } from '../../utils/LogWorker' | ||||||
| import { JudgeTag } from '../../config' | import { JudgeTag } from '../../config' | ||||||
| import { examJudgeRealExam } from './JudgeSDKUtils' | import { examJudgeRealExam } from './JudgeSDKUtils' | ||||||
| import { JudgingFn, SetJudgeItem } from './JudgeIng' | import { SetJudgeItem } from './JudgeIng' | ||||||
| import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignalWorker' | import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignalWorker' | ||||||
| import { PlcStrToJson, PlcStrToWXJson } from './utils' | import { PlcStrToJson, PlcStrToWXJson } from './utils' | ||||||
| import { JudgeEndFn } from './JudgeEnd' |  | ||||||
| import { BaseJudge } from './Typing' | import { BaseJudge } from './Typing' | ||||||
| import router from '@ohos.router' | import router from '@ohos.router' | ||||||
|  | import { JudgePage } from '../Judge'; | ||||||
| 
 | 
 | ||||||
| export default class JudgeBusiness { | export default class JudgeBusiness { | ||||||
|   public mndgStr: string | undefined |   public mndgStr: string | undefined | ||||||
| @ -58,13 +59,13 @@ export default class JudgeBusiness { | |||||||
|   public carztStr: string |   public carztStr: string | ||||||
|   public ksjs?: JudgeKSJS |   public ksjs?: JudgeKSJS | ||||||
|   public plcData?: PLCType |   public plcData?: PLCType | ||||||
|   private judgeUI: JudgeUI |   private judgeUI: JudgePage | ||||||
|   private tempData?: PLCType |   private tempData?: PLCType | ||||||
|   // 是否发送udp |   // 是否发送udp | ||||||
|   private isUdpEnd: boolean = false |   private isUdpEnd: boolean = false | ||||||
|   judgeBusiness: BaseJudge |   private judgeBusiness: BaseJudge | ||||||
| 
 | 
 | ||||||
|   constructor(judgeUI: JudgeUI) { |   constructor(judgeUI: JudgePage) { | ||||||
|     this.judgeUI = judgeUI |     this.judgeUI = judgeUI | ||||||
|     this.fileUtil = new FileUtils(judgeUI.context) |     this.fileUtil = new FileUtils(judgeUI.context) | ||||||
|     this.avPlayer = new VoiceAnnounce(this.context); |     this.avPlayer = new VoiceAnnounce(this.context); | ||||||
| @ -106,7 +107,7 @@ export default class JudgeBusiness { | |||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public async JudgeInit() { |   public async JudgeInit() { | ||||||
|     let currentParams: RouterParam = router.getParams() as RouterParam; |     let currentParams: RouteParamsType = router.getParams() as RouteParamsType; | ||||||
|     this.judgeBusiness.JudgeInit(currentParams.mode, this.judgeUI.carName) |     this.judgeBusiness.JudgeInit(currentParams.mode, this.judgeUI.carName) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
| @ -129,12 +130,12 @@ export default class JudgeBusiness { | |||||||
| 
 | 
 | ||||||
|   // 考试过程 callback优化 |   // 考试过程 callback优化 | ||||||
|   public async Judging(strData: string, callBack: Function) { |   public async Judging(strData: string, callBack: Function) { | ||||||
|     JudgingFn(strData, callBack, this.judgeUI, this) |     this.judgeBusiness.Judging(strData, callBack, this.judgeUI, this) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // 结束考试 |   // 结束考试 | ||||||
|   public JudgeEnd(isManual?: boolean) { |   public JudgeEnd(isManual?: boolean) { | ||||||
|     JudgeEndFn(this.judgeUI, this, isManual) |     this.judgeBusiness.JudgeEnd(this.judgeUI, this, isManual) | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   // 处理PLC数据 |   // 处理PLC数据 | ||||||
|  | |||||||
| @ -1,110 +0,0 @@ | |||||||
| import { JudgeTag } from '../../config' |  | ||||||
| import { JudgeUI } from '../../model' |  | ||||||
| import { dConsole } from '../../utils/LogWorker' |  | ||||||
| import JudgeBusiness from './JudgeBusiness' |  | ||||||
| import { examJudgeEndExam } from './JudgeSDKUtils' |  | ||||||
| 
 |  | ||||||
| export const JudgeEndFn = async (judgeUI: JudgeUI, that: JudgeBusiness, isManual?: boolean) => { |  | ||||||
|   const isAllProjectsEnd = judgeUI.isAllProjectsEnd |  | ||||||
|   const examSubject = judgeUI.examSubject |  | ||||||
|   const singlePlay = judgeUI.singlePlay |  | ||||||
|   const totalScore = Number(judgeUI.totalScore) |  | ||||||
|   const judgeConfigObj = judgeUI.judgeConfigObj |  | ||||||
|   const examMileage = Number(judgeUI.examMileage) |  | ||||||
|   const passingScore = Number(judgeUI.passingScore) |  | ||||||
|   const jl = judgeUI.jl |  | ||||||
|   if (that.isExamEnd) { |  | ||||||
|     return |  | ||||||
|   } |  | ||||||
|   if (isManual) { |  | ||||||
|     // 考试不合格 |  | ||||||
|     await examJudgeEndExam() |  | ||||||
|     that.isExamEnd = true |  | ||||||
|     that.isManual = true |  | ||||||
|   } else { |  | ||||||
|     const param302: number = Reflect.get(judgeConfigObj, '302') |  | ||||||
|     const param342: number = Reflect.get(judgeConfigObj, '342') |  | ||||||
|     const param512: number[] = (Reflect.get(judgeConfigObj, '512') || '').split(','); |  | ||||||
| 
 |  | ||||||
|     //单机模式 |  | ||||||
|     if (singlePlay) { |  | ||||||
|       dConsole.info(JudgeTag + ' 单机模式结束 => ', isAllProjectsEnd) |  | ||||||
|       if (isAllProjectsEnd && jl >= examMileage) { |  | ||||||
|         //成绩合格 |  | ||||||
|         if (totalScore >= passingScore && !that.isEndTip) { |  | ||||||
|           if (examSubject == '3' && (param342 == 0 || param342 == 2) && |  | ||||||
|             (param302 != 6 && param302 != 7 && param302 != 8)) { |  | ||||||
|             if (param512[7] != 0) { |  | ||||||
|               clearTimeout(that.deductedPopShowTimer) |  | ||||||
|               that.avPlayer?.playAudio(['voice/综合评判.mp3']) |  | ||||||
|               judgeUI.isDeductedPopShow = true |  | ||||||
|               judgeUI.defaultTabIndex = 1 |  | ||||||
|               that.isEndTip = true |  | ||||||
|               return |  | ||||||
|             } |  | ||||||
|           } else { |  | ||||||
|             await examJudgeEndExam() |  | ||||||
|             that.isExamEnd = true |  | ||||||
|             return |  | ||||||
|           } |  | ||||||
|         } else { |  | ||||||
|           if (examSubject == '3' && (param302 == 4 || param302 == 5 || param302 == 7 || param302 == 8)) { |  | ||||||
|             await examJudgeEndExam() |  | ||||||
|             that.isExamEnd = true |  | ||||||
|             return |  | ||||||
|           } |  | ||||||
|         } |  | ||||||
|         await examJudgeEndExam() |  | ||||||
|         that.isExamEnd = true |  | ||||||
|       } |  | ||||||
|     } else { |  | ||||||
|       //成绩不合格 |  | ||||||
|       if (totalScore < passingScore) { |  | ||||||
|         //科目三不合格报靠边停车 |  | ||||||
|         if (examSubject == '3' && param302 == 1) { |  | ||||||
|           that.avPlayer?.playAudio([`voice/考试结束.mp3`]); |  | ||||||
|           return |  | ||||||
|         } |  | ||||||
|         await examJudgeEndExam() |  | ||||||
|         that.isExamEnd = true |  | ||||||
|         return |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       //成绩合格 |  | ||||||
|       if (isAllProjectsEnd && totalScore >= passingScore && !that.isEndTip) { |  | ||||||
|         if (examSubject == '2') { |  | ||||||
|           await examJudgeEndExam() |  | ||||||
|           that.isExamEnd = true |  | ||||||
|           return |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         //考试里程判断 |  | ||||||
|         if (examSubject == '3' && jl < examMileage) { |  | ||||||
|           return |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         //考试合格自动退出 |  | ||||||
|         if (examSubject == '3' && (param302 == 4 || param302 == 7) || param302 == 8) { |  | ||||||
|           await examJudgeEndExam() |  | ||||||
|           that.isExamEnd = true |  | ||||||
|           return |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         if (examSubject == '3' && (param342 == 0 || param342 == 2) && |  | ||||||
|           (param302 != 6 && param302 != 7 && param302 != 8)) { |  | ||||||
|           if (param512[7] != 0) { |  | ||||||
|             clearTimeout(that.deductedPopShowTimer) |  | ||||||
|             judgeUI.isDeductedPopShow = false |  | ||||||
|             that.avPlayer?.playAudio(['voice/综合评判.mp3']) |  | ||||||
|             judgeUI.isDeductedPopShow = true |  | ||||||
|             judgeUI.defaultTabIndex = 1 |  | ||||||
|             that.isEndTip = true |  | ||||||
|           } |  | ||||||
|         } else { |  | ||||||
|           await examJudgeEndExam() |  | ||||||
|           that.isExamEnd = true |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @ -1,4 +1,3 @@ | |||||||
| //开始评判 |  | ||||||
| import { JudgeConfig, JudgeTag } from '../../config'; | import { JudgeConfig, JudgeTag } from '../../config'; | ||||||
| import { | import { | ||||||
|   BaseInfoType, |   BaseInfoType, | ||||||
| @ -12,7 +11,6 @@ import { | |||||||
|   JudgeInitObj, |   JudgeInitObj, | ||||||
|   JudgeKFXM, |   JudgeKFXM, | ||||||
|   JudgeKSXM, |   JudgeKSXM, | ||||||
|   JudgeUI, |  | ||||||
|   Km3JudgeInitConfig, |   Km3JudgeInitConfig, | ||||||
|   MAPITEMPOINTITEM, |   MAPITEMPOINTITEM, | ||||||
|   MAPPOINT, |   MAPPOINT, | ||||||
| @ -42,227 +40,11 @@ import { GetModelData } from './utils'; | |||||||
| import { BaseJudge, GetSysSetResult } from './Typing'; | import { BaseJudge, GetSysSetResult } from './Typing'; | ||||||
| import { GetSyncData } from '../../utils/table/Operation'; | import { GetSyncData } from '../../utils/table/Operation'; | ||||||
| import promptAction from '@ohos.promptAction'; | import promptAction from '@ohos.promptAction'; | ||||||
|  | import { JudgePage } from '../Judge'; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| export  interface RouterParam { | export class LargeJudge implements BaseJudge { | ||||||
|   mode: number |   private async GetJudgeBeginData(projects: Project[], carType: string, kssycs: string, isDdxk: boolean, ddxkTime: number, projectsCenterObj: Object, ddxkKsxmArr: string[], ddxkKfArr: string[], passingScore: number, wayno: number, name: string, lsh: string, idCard: string, isExam: boolean) { | ||||||
|   score: number |  | ||||||
|   kString: string |  | ||||||
|   wayno: number |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| export class SmallJudge implements BaseJudge { |  | ||||||
|   public async JudgeInit(mode: number, carName: string): Promise<GetSysSetResult> { |  | ||||||
|     const systemParams = await GetSyncData<SYSTEM_PARAM>('MA_SYSTEMPARM') |  | ||||||
|     let currentParams: RouterParam = router.getParams() as RouterParam; |  | ||||||
|     let totalScore: number |  | ||||||
|     let wayno: number |  | ||||||
|     let mockLight: boolean |  | ||||||
|     let carlist: string |  | ||||||
|     let passingScore: number |  | ||||||
|     let examMileage: string |  | ||||||
|     let projectsObj: Array<Project> |  | ||||||
|     let projectsCenterObj: Array<String> |  | ||||||
|     let ddxkKsxmArr: Array<string> |  | ||||||
|     let singlePlay: boolean = AppStorage.get("singlePlay") |  | ||||||
|     let systemparmArr: Array<SYSTEM_PARAM> = [] |  | ||||||
|     let projects: Array<Project> = [] |  | ||||||
|     let examSubject: string = "" |  | ||||||
|     if (mode === 2) { |  | ||||||
|       totalScore = Number(currentParams.score) || totalScore |  | ||||||
|     } |  | ||||||
|     if (singlePlay) { |  | ||||||
|       wayno = currentParams.wayno || 1; |  | ||||||
|     } |  | ||||||
|     if (singlePlay) { |  | ||||||
|       wayno = Number(currentParams.wayno) || 1; |  | ||||||
|     } |  | ||||||
|     //真实监管下发的项目 |  | ||||||
|     let kStringArr: string[] = (currentParams.kString?.split(',') || []).filter(item => item); |  | ||||||
|     let isInExam = kStringArr.length > 0; |  | ||||||
|     let carNo: number, allItems: string[] = []; |  | ||||||
|     systemParams.forEach((systemParam) => { |  | ||||||
|       if (JudgeConfig.isTrajectoryOpen) { |  | ||||||
|         systemParam.no1 = systemParam.NO1!; |  | ||||||
|         systemParam.no2 = systemParam.NO2!; |  | ||||||
|         systemParam.no3 = systemParam.NO3!; |  | ||||||
|         systemParam.txt1 = systemParam.TXT1!; |  | ||||||
|         systemParam.txt2 = systemParam.TXT2!; |  | ||||||
|         systemParam.txt3 = systemParam.TXT3!; |  | ||||||
|       } |  | ||||||
|       const txt1 = decodeURI(systemParam.txt1 || "") |  | ||||||
|       const txt2 = decodeURI(systemParam.txt2 || "") |  | ||||||
| 
 |  | ||||||
|       const no1 = systemParam.no1; |  | ||||||
|       const no2 = systemParam.no2; |  | ||||||
|       const no3 = systemParam.no3; |  | ||||||
| 
 |  | ||||||
|       //获取当前考车的no2 |  | ||||||
|       if (no1 == 3 && no3 == 1) { |  | ||||||
|         if (txt1 === carName) { |  | ||||||
|           carNo = no2 |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       //获取及格分数线 |  | ||||||
|       if (no1 == 3 && no3 == 3 && carNo === no2) { |  | ||||||
|         passingScore = Number(txt1) || 0; |  | ||||||
|       } |  | ||||||
|       //根据车型获取应行驶里程数 |  | ||||||
|       if (no1 == 3 && no3 == 15 && carNo === no2) { |  | ||||||
|         examMileage = ((decodeURI(systemParam.txt1 || "")) || '').split('^')[0]; |  | ||||||
|       } |  | ||||||
|       //获取当前考车的考试项目 |  | ||||||
|       if (carNo && no1 === 3 && no2 == carNo && no3 === 10) { |  | ||||||
|         allItems = decodeURIComponent(systemParam.txt1 || "").split(',').filter(txt => txt !== '') |  | ||||||
|         dConsole.info(JudgeTag, '考试项目', allItems) |  | ||||||
|       } |  | ||||||
|       if ( |  | ||||||
|       //科目二获取项目 |  | ||||||
|         (examSubject == "2" && allItems.length && no1 === 6 && allItems.includes(no2 + "" || "")) |  | ||||||
|           || |  | ||||||
|           //科目三获取项目 |  | ||||||
|           (examSubject == "3" && no1 === 6) |  | ||||||
|       ) { |  | ||||||
|         const name = decodeURI(systemParam.txt1 || "") |  | ||||||
|         //小车过滤掉 夜间模拟行驶 |  | ||||||
|         if (name === '夜间行驶') { |  | ||||||
|           return |  | ||||||
|         } |  | ||||||
|         const currentProject: Project = { |  | ||||||
|           name, |  | ||||||
|           abbreviation: decodeURI(systemParam.txt3 || ""), |  | ||||||
|           projectCode: no2 + '', |  | ||||||
|           projectCodeCenter: txt2, |  | ||||||
|           //是否是必考  加减档设置成非必考 |  | ||||||
|           isRequired: no2 === 14 ? false : allItems.includes(no2 + ''), |  | ||||||
|           //是否考过了 |  | ||||||
|           isEnd: false, |  | ||||||
|           //项目开始数据是否上传过 |  | ||||||
|           isUpload: false, |  | ||||||
|         } |  | ||||||
|         const no2Num = Number(no2) |  | ||||||
|         //真实监管下发考试项目 |  | ||||||
|         if (isInExam && !(kStringArr.includes(txt2) || kStringArr.includes(no2 + ''))) { |  | ||||||
|           dConsole.info(JudgeTag, 'surenjun =>', txt2) |  | ||||||
|           dConsole.info(JudgeTag, 'surenjun => no2', no2) |  | ||||||
|           currentProject.type = '3' |  | ||||||
|           currentProject.isUpload = true |  | ||||||
|           currentProject.isEnd = true |  | ||||||
|           ddxkKsxmArr.push(txt2) |  | ||||||
|         } |  | ||||||
|         Reflect.set(projectsObj, no2Num, currentProject) |  | ||||||
|         Reflect.set(projectsCenterObj, txt2, currentProject) |  | ||||||
|         projects.push(currentProject); |  | ||||||
|       } |  | ||||||
|       systemparmArr.push({ |  | ||||||
|         NO1: Number(no1), |  | ||||||
|         NO2: Number(no2), |  | ||||||
|         NO3: Number(no3), |  | ||||||
|         TXT1: decodeURIComponent(systemParam.txt1 || ""), |  | ||||||
|         TXT2: decodeURIComponent(systemParam.txt2 || ""), |  | ||||||
|         TXT3: decodeURIComponent(systemParam.txt3 || ""), |  | ||||||
|       }) |  | ||||||
|     }) |  | ||||||
|     if (!projects.length) { |  | ||||||
|       promptAction.showToast({ |  | ||||||
|         message: '读取数据库信息失败,请重新联网更新!', |  | ||||||
|         duration: 8000 |  | ||||||
|       }); |  | ||||||
|       dConsole.log(JudgeTag, "router back3") |  | ||||||
|       router.back(); |  | ||||||
|     } |  | ||||||
|     return { |  | ||||||
|       totalScore, |  | ||||||
|       wayno, |  | ||||||
|       mockLight, |  | ||||||
|       carlist, |  | ||||||
|       passingScore, |  | ||||||
|       examMileage, |  | ||||||
|       projectsObj, |  | ||||||
|       projectsCenterObj, |  | ||||||
|       ddxkKsxmArr, |  | ||||||
|       singlePlay, |  | ||||||
|       systemparmArr, |  | ||||||
|       projects, |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public async JudgeStart(callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) { |  | ||||||
|     const name = judgeUI.name |  | ||||||
|     const kssycs = judgeUI.kssycs |  | ||||||
|     const manualMarkRules = judgeUI.manualMarkRules |  | ||||||
|     // 处理单机模式 |  | ||||||
|     const isTrajectoryOpen = JudgeConfig.isTrajectoryOpen; |  | ||||||
|     const isJudgeInitBool = AppStorage.get<boolean>('isJudgeInitBool'); |  | ||||||
|     const trajectoryPath = JudgeConfig.trajectoryPath; |  | ||||||
|     let strArr: string[] = []; |  | ||||||
|     if (isTrajectoryOpen) { |  | ||||||
|       const folderPath = await that.fileUtil.initFolder(trajectoryPath); |  | ||||||
|       const str: string = await that.fileUtil.readFile(folderPath) |  | ||||||
|       strArr = str.split('\n') |  | ||||||
|     } |  | ||||||
|     //日志回调 |  | ||||||
|     dConsole.info(JudgeTag, '1.进入评判入口') |  | ||||||
|     await examJudgeSetLogCallback(6, async (level: number, info: string, len: number) => { |  | ||||||
|       dConsole.log(JudgeTag, '评判日志:' + info) |  | ||||||
|       dConsole.writeProcessData(ProcessDataEnumType.JudgeLogData, info) |  | ||||||
|     }) |  | ||||||
| 
 |  | ||||||
|     dConsole.info(JudgeTag, '2.注册日志回调完成') |  | ||||||
| 
 |  | ||||||
|     let initInfo: JudgeInitObj = isTrajectoryOpen ? JSON.parse(strArr[0]) : await this.GetJudgeInitData(judgeUI.context, judgeUI.markRuleListObj, judgeUI.carType, judgeUI.carName, judgeUI.systemparmArr, judgeUI.carinfoArr, judgeUI.examSubject, judgeUI.itemInfoObj, judgeUI.judgeConfig, judgeUI.carlist, judgeUI.mapPointArr, judgeUI.mapPointItemArr); |  | ||||||
|     //相关评判初始化只做一次 |  | ||||||
|     if (!isJudgeInitBool) { |  | ||||||
|       dConsole.log(JudgeTag, "评判初始化参数", initInfo) |  | ||||||
|       await examJudgeInit(initInfo); |  | ||||||
|       AppStorage.setOrCreate('isJudgeInitBool', true) |  | ||||||
|       dConsole.info(JudgeTag, '4.评判初始化完成') |  | ||||||
|     } |  | ||||||
|     AppStorage.setOrCreate('isJudge', true) |  | ||||||
|     // 2.评判过程回调 |  | ||||||
|     await examJudgeSetRealExamCallback(async (strData: string, len: number) => { |  | ||||||
|       // 评判回调日志 |  | ||||||
|       dConsole.writeProcessData(ProcessDataEnumType.JudgeProgressCallbackData, strData) |  | ||||||
|       dConsole.info(JudgeTag, '评判回调数据', strData) |  | ||||||
|       await that.Judging(strData, callBack) |  | ||||||
|     }) |  | ||||||
|     await examJudgeSetPerformCallback(async (info: string) => { |  | ||||||
|       dConsole.info('评判实时数据', info) |  | ||||||
|       that.performInfo = JSON.parse(info) |  | ||||||
|       const jl = Math.floor((that.performInfo.qjjl + that.performInfo.dcjl) / 100); |  | ||||||
|       if (jl > Number(judgeUI.examMileage)) { |  | ||||||
|         that.JudgeEnd() |  | ||||||
|       } |  | ||||||
|       judgeUI.jl = jl |  | ||||||
|       judgeUI.laneSignal = that.performInfo.lane |  | ||||||
|     }) |  | ||||||
|     let beginExamInfo: JudgeBeginObj | undefined = undefined |  | ||||||
|     // 3.开始考试 |  | ||||||
|     if (isTrajectoryOpen) { |  | ||||||
|       beginExamInfo = JSON.parse(strArr[1]) |  | ||||||
|       beginExamInfo && (beginExamInfo.replay = 1) |  | ||||||
|     } else { |  | ||||||
|       beginExamInfo = await this.GetJudgeBeginData(judgeUI.projects, judgeUI.carType, judgeUI.kssycs, judgeUI.isDdxk, judgeUI.ddxkTime, judgeUI.projectsCenterObj, judgeUI.ddxkKsxmArr, judgeUI.ddxkKfArr, judgeUI.passingScore, judgeUI.wayno, judgeUI.name, judgeUI.lsh, judgeUI.idCard, that.isExam) |  | ||||||
|     } |  | ||||||
|     if (beginExamInfo) { |  | ||||||
|       await examJudgeBeginExam(beginExamInfo); |  | ||||||
|     } |  | ||||||
|     dConsole.info(JudgeTag, '6.开始考试注册完成') |  | ||||||
|     that.avPlayer?.playAudio([judgeUI.singlePlay ? 'voice/ksks.wav' : 'voice/监管成功.mp3']) |  | ||||||
|     if (!judgeUI.singlePlay) { |  | ||||||
|       that.videoData = await saveStartRecordVideo(`${name}_${kssycs}`, that.context) |  | ||||||
|     } |  | ||||||
|     judgeUI.draw = true |  | ||||||
|     // 处理单机泡轨迹模式 |  | ||||||
|     if (isTrajectoryOpen) { |  | ||||||
|       that.SingleMachineTrajectory(strArr) |  | ||||||
|       return |  | ||||||
|     } |  | ||||||
|   }; |  | ||||||
| 
 |  | ||||||
|   public async GetJudgeBeginData(projects: ProjectInfo[], carType: string, kssycs: string, isDdxk: boolean, ddxkTime: number, projectsCenterObj: Object, ddxkKsxmArr: string[], ddxkKfArr: string[], passingScore: number, wayno: number, name: string, lsh: string, idCard: string, isExam: boolean) { |  | ||||||
|     const examinerInfo = AppStorage.get<ExaminerInfoType>('examinerInfo') |     const examinerInfo = AppStorage.get<ExaminerInfoType>('examinerInfo') | ||||||
|     const examinerName = examinerInfo?.name || "" |     const examinerName = examinerInfo?.name || "" | ||||||
|     let currentParams: RouteParamsType = router.getParams() as RouteParamsType; |     let currentParams: RouteParamsType = router.getParams() as RouteParamsType; | ||||||
| @ -322,7 +104,7 @@ export class SmallJudge implements BaseJudge { | |||||||
|     return beginInfo |     return beginInfo | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   public async GetJudgeInitData(context: common.UIAbilityContext, markRuleListObj: object, carType: string, carName: string, systemparmArr: SYSTEM_PARAM[], carinfoArr: CAR_INFO[], examSubject: string, itemInfoObj: ItemInfos, judgeConfig: SyssetConfig[], carlist: string, mapPointArr: MAPPOINT[], mapPointItemArr: MAPITEMPOINTITEM[]) { |   private async GetJudgeInitData(context: common.UIAbilityContext, markRuleListObj: object, carType: string, carName: string, systemparmArr: SYSTEM_PARAM[], carinfoArr: CAR_INFO[], examSubject: string, itemInfoObj: ItemInfos, judgeConfig: SyssetConfig[], carlist: string, mapPointArr: MAPPOINT[], mapPointItemArr: MAPITEMPOINTITEM[]) { | ||||||
|     const carInfo = AppStorage.get<CarInfoType>('carInfo'); |     const carInfo = AppStorage.get<CarInfoType>('carInfo'); | ||||||
|     const examType = carInfo?.examSubject == '2' ? 'km2' : 'km3' |     const examType = carInfo?.examSubject == '2' ? 'km2' : 'km3' | ||||||
| 
 | 
 | ||||||
| @ -384,13 +166,10 @@ export class SmallJudge implements BaseJudge { | |||||||
|     dConsole.info(JudgeTag, '3.获取评判初始化数据完成') |     dConsole.info(JudgeTag, '3.获取评判初始化数据完成') | ||||||
|     return initInfo |     return initInfo | ||||||
|   }; |   }; | ||||||
| } |  | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| export class LargeJudge implements BaseJudge { |  | ||||||
|   public async JudgeInit(mode: number, carName: string): Promise<GetSysSetResult> { |   public async JudgeInit(mode: number, carName: string): Promise<GetSysSetResult> { | ||||||
|     const systemParams = await GetSyncData<SYSTEM_PARAM>('MA_SYSTEMPARM') |     const systemParams = await GetSyncData<SYSTEM_PARAM>('MA_SYSTEMPARM') | ||||||
|     let currentParams: RouterParam = router.getParams() as RouterParam; |     let currentParams: RouteParamsType = router.getParams() as RouteParamsType; | ||||||
|     let totalScore: number |     let totalScore: number | ||||||
|     let wayno: number |     let wayno: number | ||||||
|     let mockLight: boolean |     let mockLight: boolean | ||||||
| @ -407,7 +186,7 @@ export class LargeJudge implements BaseJudge { | |||||||
|       totalScore = Number(currentParams.score) || totalScore |       totalScore = Number(currentParams.score) || totalScore | ||||||
|     } |     } | ||||||
|     if (singlePlay) { |     if (singlePlay) { | ||||||
|       wayno = currentParams.wayno || 1; |       wayno = Number(currentParams.wayno) || 1; | ||||||
|     } |     } | ||||||
|     //真实监管下发的项目 |     //真实监管下发的项目 | ||||||
|     let kStringArr: string[] = (currentParams.kString?.split(',') || []).filter(item => item); |     let kStringArr: string[] = (currentParams.kString?.split(',') || []).filter(item => item); | ||||||
| @ -563,7 +342,7 @@ export class LargeJudge implements BaseJudge { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public async JudgeStart(callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) { |   public async JudgeStart(callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) { | ||||||
|     const name = judgeUI.name |     const name = judgeUI.name | ||||||
|     const kssycs = judgeUI.kssycs |     const kssycs = judgeUI.kssycs | ||||||
|     // 处理远程扣分使用 |     // 处理远程扣分使用 | ||||||
| @ -637,126 +416,11 @@ export class LargeJudge implements BaseJudge { | |||||||
|     } |     } | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|   public async GetJudgeBeginData(projects: ProjectInfo[], carType: string, kssycs: string, isDdxk: boolean, ddxkTime: number, projectsCenterObj: Object, ddxkKsxmArr: string[], ddxkKfArr: string[], passingScore: number, wayno: number, name: string, lsh: string, idCard: string, isExam: boolean) { |   public async Judging(strData: string, callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) { | ||||||
|     const examinerInfo = AppStorage.get<ExaminerInfoType>('examinerInfo') |  | ||||||
|     const examinerName = examinerInfo?.name || "" |  | ||||||
|     let currentParams: RouteParamsType = router.getParams() as RouteParamsType; |  | ||||||
|     const sczb = currentParams.sczb; |  | ||||||
|     const kfdm = currentParams.kfdm; |  | ||||||
|     const ksxm: JudgeKSXM[] = projects.map(project => { |  | ||||||
|       const temp: JudgeKSXM = { |  | ||||||
|         xmdm: Number(project.projectCode), xmxh: '' |  | ||||||
|       } |  | ||||||
|       return temp |  | ||||||
|     }) |  | ||||||
|     const ykxm: number[] = (ddxkKsxmArr?.map(projectCenterCode => { |  | ||||||
|       const currentProject: ProjectInfo = Reflect.get(projectsCenterObj, projectCenterCode) |  | ||||||
|       return Number(currentProject.projectCode) |  | ||||||
|     })) || []; |  | ||||||
|     const kfxm: JudgeKFXM[] = isDdxk ? (ddxkKfArr?.map(kf => { |  | ||||||
|       return { |  | ||||||
|         xmdm: Number(kf.split(',')[0]), kfdm: kf.split(',')[1] |  | ||||||
|       } as JudgeKFXM |  | ||||||
|     })) : [] |  | ||||||
|     const beginInfo: JudgeBeginObj = { |  | ||||||
|       kgid: '012', |  | ||||||
|       kgxm: decodeURI(examinerName || ''), |  | ||||||
|       exam: isExam ? 1 : 0, |  | ||||||
|       //是否回放 |  | ||||||
|       replay: 0, |  | ||||||
|       //生成的轨迹文件 |  | ||||||
|       track: '', |  | ||||||
|       xm: name, |  | ||||||
|       sex: 0, |  | ||||||
|       kslsh: lsh, |  | ||||||
|       sfzmhm: idCard, |  | ||||||
|       ksyy: '', |  | ||||||
|       kscx: carType, |  | ||||||
|       kkcs: Number(kssycs) || 2, |  | ||||||
|       sfyk: 0, |  | ||||||
|       ykkkcs: 1, |  | ||||||
|       wayno: Number(wayno), |  | ||||||
|       czlx: 0, |  | ||||||
|       kskssj: await systemTime.getCurrentTime(), |  | ||||||
|       passing: Number(passingScore), |  | ||||||
|       ksxm, |  | ||||||
|       //断点续考 |  | ||||||
|       ddxk: isDdxk ? 1 : 0, |  | ||||||
|       ddkssj: ddxkTime || 0, |  | ||||||
|       ykxm, |  | ||||||
|       kfxm, |  | ||||||
|       yklc: 0, |  | ||||||
|       special: [], |  | ||||||
|       sczb: (sczb === undefined || sczb == '0') ? 0 : 1, |  | ||||||
|       sczbkf: kfdm, |  | ||||||
|       dmndg: false, |  | ||||||
|       mfxx: false, |  | ||||||
|       mfxxn: false |  | ||||||
|     } |  | ||||||
|     dConsole.info(JudgeTag, '5.获取开始考试数据完成') |  | ||||||
|     return beginInfo |  | ||||||
|   }; |  | ||||||
| 
 | 
 | ||||||
|   public async GetJudgeInitData(context: common.UIAbilityContext, markRuleListObj: object, carType: string, carName: string, systemparmArr: SYSTEM_PARAM[], carinfoArr: CAR_INFO[], examSubject: string, itemInfoObj: ItemInfos, judgeConfig: SyssetConfig[], carlist: string, mapPointArr: MAPPOINT[], mapPointItemArr: MAPITEMPOINTITEM[]) { |  | ||||||
|     const carInfo = AppStorage.get<CarInfoType>('carInfo'); |  | ||||||
|     const examType = carInfo?.examSubject == '2' ? 'km2' : 'km3' |  | ||||||
| 
 |  | ||||||
|     let allitems: ItemInfo[] = []; |  | ||||||
|     if (examSubject == '2' && itemInfoObj) { |  | ||||||
|       allitems = Reflect.ownKeys(itemInfoObj).map(cdsbKey => { |  | ||||||
|         const cdsb: CDSBInfo = Reflect.get(itemInfoObj, cdsbKey); |  | ||||||
|         const model = GetModelData(`${examType}/${cdsb.modelKey}.txt`, context) |  | ||||||
|         const temp: ItemInfo = { |  | ||||||
|           xmdm: cdsb?.xmdm || 0, |  | ||||||
|           xmxh: cdsb?.xmxh || "", |  | ||||||
|           model: model || "" |  | ||||||
|         } |  | ||||||
|         return temp |  | ||||||
|       }) |  | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|     //获取版本号 |   public async JudgeEnd(judgeUI: JudgePage, that: JudgeBusiness, isManual?: boolean) { | ||||||
|     const mark: MarkRule[] = Reflect.ownKeys(markRuleListObj).map(ruleKey => { | 
 | ||||||
|       const current: MarkRule = Reflect.get(markRuleListObj, ruleKey) |  | ||||||
|       return current |  | ||||||
|     }) |  | ||||||
|     const initInfo: JudgeInitObj = { |  | ||||||
|       sdkver: await examJudgeVersion(), |  | ||||||
|       appver: AppStorage.get<BaseInfoType>('baseInfo')?.version || "", |  | ||||||
|       kskm: Number(carInfo?.examSubject || "2"), |  | ||||||
|       kchp: carInfo?.plateNo || "", |  | ||||||
|       kchm: Number(carInfo?.carId || ""), |  | ||||||
|       kscx: carType, |  | ||||||
|       cxcode: '1', |  | ||||||
|       name: carName, |  | ||||||
|       carmodel: GetModelData(`${examType}/${carType}.txt`, context) || "", |  | ||||||
|       allitems, |  | ||||||
|       iteminfo: [], |  | ||||||
|       systemparm: systemparmArr, |  | ||||||
|       mark, |  | ||||||
|       sysset: judgeConfig, |  | ||||||
|       itemInfoObj, |  | ||||||
|       carlist: carlist, |  | ||||||
|       carinfo: carinfoArr, |  | ||||||
|     }; |  | ||||||
|     let km3Config: Km3JudgeInitConfig = {} |  | ||||||
|     if (examSubject == '3') { |  | ||||||
|       km3Config = { |  | ||||||
|         map_point: mapPointArr, |  | ||||||
|         map_point_item: mapPointItemArr, |  | ||||||
|         //科目三暂时为空 |  | ||||||
|         iteminfo: [], |  | ||||||
|         roads: GetModelData('km3/Roads.txt', context) || "", |  | ||||||
|         sharps: GetModelData('km3/Sharps.txt', context) || "" |  | ||||||
|       }; |  | ||||||
|       initInfo.map_point = km3Config.map_point |  | ||||||
|       initInfo.map_point_item = km3Config.map_point_item |  | ||||||
|       initInfo.iteminfo = km3Config.iteminfo |  | ||||||
|       initInfo.roads = km3Config.roads |  | ||||||
|       initInfo.sharps = km3Config.sharps |  | ||||||
|     } |  | ||||||
|     // 获取科目三的评判配置 |  | ||||||
|     dConsole.info(JudgeTag, '3.获取评判初始化数据完成') |  | ||||||
|     return initInfo |  | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
							
								
								
									
										486
									
								
								entry/src/main/ets/pages/Judge/SmallJudgeBusiness.ets
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										486
									
								
								entry/src/main/ets/pages/Judge/SmallJudgeBusiness.ets
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,486 @@ | |||||||
|  | import { JudgeConfig, JudgeTag } from '../../config'; | ||||||
|  | import { | ||||||
|  |   BaseInfoType, | ||||||
|  |   CAR_INFO, | ||||||
|  |   CarInfoType, | ||||||
|  |   CDSBInfo, | ||||||
|  |   ExaminerInfoType, | ||||||
|  |   ItemInfo, | ||||||
|  |   ItemInfos, | ||||||
|  |   JudgeBeginObj, | ||||||
|  |   JudgeInitObj, | ||||||
|  |   JudgeKFXM, | ||||||
|  |   JudgeKSXM, | ||||||
|  |   Km3JudgeInitConfig, | ||||||
|  |   MAPITEMPOINTITEM, | ||||||
|  |   MAPPOINT, | ||||||
|  |   MarkRule, | ||||||
|  |   ProcessDataEnumType, | ||||||
|  |   ProjectInfo, | ||||||
|  |   RouteParamsType, | ||||||
|  |   SyssetConfig, | ||||||
|  |   SYSTEM_PARAM, | ||||||
|  |   Project | ||||||
|  | } from '../../model'; | ||||||
|  | import common from '@ohos.app.ability.common'; | ||||||
|  | import { dConsole } from '../../utils/LogWorker'; | ||||||
|  | import { | ||||||
|  |   examJudgeBeginExam, | ||||||
|  |   examJudgeEndExam, | ||||||
|  |   examJudgeInit, | ||||||
|  |   examJudgeSetLogCallback, | ||||||
|  |   examJudgeSetPerformCallback, | ||||||
|  |   examJudgeSetRealExamCallback, | ||||||
|  |   examJudgeVersion | ||||||
|  | } from './JudgeSDKUtils'; | ||||||
|  | import JudgeBusiness from './JudgeBusiness'; | ||||||
|  | import { saveStartRecordVideo } from '../../utils/Video'; | ||||||
|  | import router from '@ohos.router'; | ||||||
|  | import systemTime from '@ohos.systemTime'; | ||||||
|  | import { GetModelData } from './utils'; | ||||||
|  | import { BaseJudge, GetSysSetResult } from './Typing'; | ||||||
|  | import { GetSyncData } from '../../utils/table/Operation'; | ||||||
|  | import promptAction from '@ohos.promptAction'; | ||||||
|  | import { JudgePage } from '../Judge'; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | export class SmallJudge implements BaseJudge { | ||||||
|  |   public async GetJudgeBeginData(projects: Project[], carType: string, kssycs: string, isDdxk: boolean, ddxkTime: number, projectsCenterObj: Object, ddxkKsxmArr: string[], ddxkKfArr: string[], passingScore: number, wayno: number, name: string, lsh: string, idCard: string, isExam: boolean) { | ||||||
|  |     const examinerInfo = AppStorage.get<ExaminerInfoType>('examinerInfo') | ||||||
|  |     const examinerName = examinerInfo?.name || "" | ||||||
|  |     let currentParams: RouteParamsType = router.getParams() as RouteParamsType; | ||||||
|  |     const sczb = currentParams.sczb; | ||||||
|  |     const kfdm = currentParams.kfdm; | ||||||
|  |     const ksxm: JudgeKSXM[] = projects.map(project => { | ||||||
|  |       const temp: JudgeKSXM = { | ||||||
|  |         xmdm: Number(project.projectCode), xmxh: '' | ||||||
|  |       } | ||||||
|  |       return temp | ||||||
|  |     }) | ||||||
|  |     const ykxm: number[] = (ddxkKsxmArr?.map(projectCenterCode => { | ||||||
|  |       const currentProject: ProjectInfo = Reflect.get(projectsCenterObj, projectCenterCode) | ||||||
|  |       return Number(currentProject.projectCode) | ||||||
|  |     })) || []; | ||||||
|  |     const kfxm: JudgeKFXM[] = isDdxk ? (ddxkKfArr?.map(kf => { | ||||||
|  |       return { | ||||||
|  |         xmdm: Number(kf.split(',')[0]), kfdm: kf.split(',')[1] | ||||||
|  |       } as JudgeKFXM | ||||||
|  |     })) : [] | ||||||
|  |     const beginInfo: JudgeBeginObj = { | ||||||
|  |       kgid: '012', | ||||||
|  |       kgxm: decodeURI(examinerName || ''), | ||||||
|  |       exam: isExam ? 1 : 0, | ||||||
|  |       //是否回放 | ||||||
|  |       replay: 0, | ||||||
|  |       //生成的轨迹文件 | ||||||
|  |       track: '', | ||||||
|  |       xm: name, | ||||||
|  |       sex: 0, | ||||||
|  |       kslsh: lsh, | ||||||
|  |       sfzmhm: idCard, | ||||||
|  |       ksyy: '', | ||||||
|  |       kscx: carType, | ||||||
|  |       kkcs: Number(kssycs) || 2, | ||||||
|  |       sfyk: 0, | ||||||
|  |       ykkkcs: 1, | ||||||
|  |       wayno: Number(wayno), | ||||||
|  |       czlx: 0, | ||||||
|  |       kskssj: await systemTime.getCurrentTime(), | ||||||
|  |       passing: Number(passingScore), | ||||||
|  |       ksxm, | ||||||
|  |       //断点续考 | ||||||
|  |       ddxk: isDdxk ? 1 : 0, | ||||||
|  |       ddkssj: ddxkTime || 0, | ||||||
|  |       ykxm, | ||||||
|  |       kfxm, | ||||||
|  |       yklc: 0, | ||||||
|  |       special: [], | ||||||
|  |       sczb: (sczb === undefined || sczb == '0') ? 0 : 1, | ||||||
|  |       sczbkf: kfdm, | ||||||
|  |       dmndg: false, | ||||||
|  |       mfxx: false, | ||||||
|  |       mfxxn: false | ||||||
|  |     } | ||||||
|  |     dConsole.info(JudgeTag, '5.获取开始考试数据完成') | ||||||
|  |     return beginInfo | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   public async GetJudgeInitData(context: common.UIAbilityContext, markRuleListObj: object, carType: string, carName: string, systemparmArr: SYSTEM_PARAM[], carinfoArr: CAR_INFO[], examSubject: string, itemInfoObj: ItemInfos, judgeConfig: SyssetConfig[], carlist: string, mapPointArr: MAPPOINT[], mapPointItemArr: MAPITEMPOINTITEM[]) { | ||||||
|  |     const carInfo = AppStorage.get<CarInfoType>('carInfo'); | ||||||
|  |     const examType = carInfo?.examSubject == '2' ? 'km2' : 'km3' | ||||||
|  | 
 | ||||||
|  |     let allitems: ItemInfo[] = []; | ||||||
|  |     if (examSubject == '2' && itemInfoObj) { | ||||||
|  |       allitems = Reflect.ownKeys(itemInfoObj).map(cdsbKey => { | ||||||
|  |         const cdsb: CDSBInfo = Reflect.get(itemInfoObj, cdsbKey); | ||||||
|  |         const model = GetModelData(`${examType}/${cdsb.modelKey}.txt`, context) | ||||||
|  |         const temp: ItemInfo = { | ||||||
|  |           xmdm: cdsb?.xmdm || 0, | ||||||
|  |           xmxh: cdsb?.xmxh || "", | ||||||
|  |           model: model || "" | ||||||
|  |         } | ||||||
|  |         return temp | ||||||
|  |       }) | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //获取版本号 | ||||||
|  |     const mark: MarkRule[] = Reflect.ownKeys(markRuleListObj).map(ruleKey => { | ||||||
|  |       const current: MarkRule = Reflect.get(markRuleListObj, ruleKey) | ||||||
|  |       return current | ||||||
|  |     }) | ||||||
|  |     const initInfo: JudgeInitObj = { | ||||||
|  |       sdkver: await examJudgeVersion(), | ||||||
|  |       appver: AppStorage.get<BaseInfoType>('baseInfo')?.version || "", | ||||||
|  |       kskm: Number(carInfo?.examSubject || "2"), | ||||||
|  |       kchp: carInfo?.plateNo || "", | ||||||
|  |       kchm: Number(carInfo?.carId || ""), | ||||||
|  |       kscx: carType, | ||||||
|  |       cxcode: '1', | ||||||
|  |       name: carName, | ||||||
|  |       carmodel: GetModelData(`${examType}/${carType}.txt`, context) || "", | ||||||
|  |       allitems, | ||||||
|  |       iteminfo: [], | ||||||
|  |       systemparm: systemparmArr, | ||||||
|  |       mark, | ||||||
|  |       sysset: judgeConfig, | ||||||
|  |       itemInfoObj, | ||||||
|  |       carlist: carlist, | ||||||
|  |       carinfo: carinfoArr, | ||||||
|  |     }; | ||||||
|  |     let km3Config: Km3JudgeInitConfig = {} | ||||||
|  |     if (examSubject == '3') { | ||||||
|  |       km3Config = { | ||||||
|  |         map_point: mapPointArr, | ||||||
|  |         map_point_item: mapPointItemArr, | ||||||
|  |         //科目三暂时为空 | ||||||
|  |         iteminfo: [], | ||||||
|  |         roads: GetModelData('km3/Roads.txt', context) || "", | ||||||
|  |         sharps: GetModelData('km3/Sharps.txt', context) || "" | ||||||
|  |       }; | ||||||
|  |       initInfo.map_point = km3Config.map_point | ||||||
|  |       initInfo.map_point_item = km3Config.map_point_item | ||||||
|  |       initInfo.iteminfo = km3Config.iteminfo | ||||||
|  |       initInfo.roads = km3Config.roads | ||||||
|  |       initInfo.sharps = km3Config.sharps | ||||||
|  |     } | ||||||
|  |     // 获取科目三的评判配置 | ||||||
|  |     dConsole.info(JudgeTag, '3.获取评判初始化数据完成') | ||||||
|  |     return initInfo | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   public async JudgeInit(mode: number, carName: string): Promise<GetSysSetResult> { | ||||||
|  |     const systemParams = await GetSyncData<SYSTEM_PARAM>('MA_SYSTEMPARM') | ||||||
|  |     let currentParams: RouteParamsType = router.getParams() as RouteParamsType; | ||||||
|  |     let totalScore: number | ||||||
|  |     let wayno: number | ||||||
|  |     let mockLight: boolean | ||||||
|  |     let carlist: string | ||||||
|  |     let passingScore: number | ||||||
|  |     let examMileage: string | ||||||
|  |     let projectsObj: Array<Project> | ||||||
|  |     let projectsCenterObj: Array<String> | ||||||
|  |     let ddxkKsxmArr: Array<string> | ||||||
|  |     let singlePlay: boolean = AppStorage.get("singlePlay") | ||||||
|  |     let systemparmArr: Array<SYSTEM_PARAM> = [] | ||||||
|  |     let projects: Array<Project> = [] | ||||||
|  |     let examSubject: string = "" | ||||||
|  |     if (mode === 2) { | ||||||
|  |       totalScore = Number(currentParams.score) || totalScore | ||||||
|  |     } | ||||||
|  |     if (singlePlay) { | ||||||
|  |       wayno = Number(currentParams.wayno) || 1; | ||||||
|  |     } | ||||||
|  |     //真实监管下发的项目 | ||||||
|  |     let kStringArr: string[] = (currentParams.kString?.split(',') || []).filter(item => item); | ||||||
|  |     let isInExam = kStringArr.length > 0; | ||||||
|  |     let carNo: number, allItems: string[] = []; | ||||||
|  |     systemParams.forEach((systemParam) => { | ||||||
|  |       if (JudgeConfig.isTrajectoryOpen) { | ||||||
|  |         systemParam.no1 = systemParam.NO1!; | ||||||
|  |         systemParam.no2 = systemParam.NO2!; | ||||||
|  |         systemParam.no3 = systemParam.NO3!; | ||||||
|  |         systemParam.txt1 = systemParam.TXT1!; | ||||||
|  |         systemParam.txt2 = systemParam.TXT2!; | ||||||
|  |         systemParam.txt3 = systemParam.TXT3!; | ||||||
|  |       } | ||||||
|  |       const txt1 = decodeURI(systemParam.txt1 || "") | ||||||
|  |       const txt2 = decodeURI(systemParam.txt2 || "") | ||||||
|  | 
 | ||||||
|  |       const no1 = systemParam.no1; | ||||||
|  |       const no2 = systemParam.no2; | ||||||
|  |       const no3 = systemParam.no3; | ||||||
|  | 
 | ||||||
|  |       //获取当前考车的no2 | ||||||
|  |       if (no1 == 3 && no3 == 1) { | ||||||
|  |         if (txt1 === carName) { | ||||||
|  |           carNo = no2 | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       //获取及格分数线 | ||||||
|  |       if (no1 == 3 && no3 == 3 && carNo === no2) { | ||||||
|  |         passingScore = Number(txt1) || 0; | ||||||
|  |       } | ||||||
|  |       //根据车型获取应行驶里程数 | ||||||
|  |       if (no1 == 3 && no3 == 15 && carNo === no2) { | ||||||
|  |         examMileage = ((decodeURI(systemParam.txt1 || "")) || '').split('^')[0]; | ||||||
|  |       } | ||||||
|  |       //获取当前考车的考试项目 | ||||||
|  |       if (carNo && no1 === 3 && no2 == carNo && no3 === 10) { | ||||||
|  |         allItems = decodeURIComponent(systemParam.txt1 || "").split(',').filter(txt => txt !== '') | ||||||
|  |         dConsole.info(JudgeTag, '考试项目', allItems) | ||||||
|  |       } | ||||||
|  |       if ( | ||||||
|  |       //科目二获取项目 | ||||||
|  |         (examSubject == "2" && allItems.length && no1 === 6 && allItems.includes(no2 + "" || "")) | ||||||
|  |           || | ||||||
|  |           //科目三获取项目 | ||||||
|  |           (examSubject == "3" && no1 === 6) | ||||||
|  |       ) { | ||||||
|  |         const name = decodeURI(systemParam.txt1 || "") | ||||||
|  |         //小车过滤掉 夜间模拟行驶 | ||||||
|  |         if (name === '夜间行驶') { | ||||||
|  |           return | ||||||
|  |         } | ||||||
|  |         const currentProject: Project = { | ||||||
|  |           name, | ||||||
|  |           abbreviation: decodeURI(systemParam.txt3 || ""), | ||||||
|  |           projectCode: no2 + '', | ||||||
|  |           projectCodeCenter: txt2, | ||||||
|  |           //是否是必考  加减档设置成非必考 | ||||||
|  |           isRequired: no2 === 14 ? false : allItems.includes(no2 + ''), | ||||||
|  |           //是否考过了 | ||||||
|  |           isEnd: false, | ||||||
|  |           //项目开始数据是否上传过 | ||||||
|  |           isUpload: false, | ||||||
|  |         } | ||||||
|  |         const no2Num = Number(no2) | ||||||
|  |         //真实监管下发考试项目 | ||||||
|  |         if (isInExam && !(kStringArr.includes(txt2) || kStringArr.includes(no2 + ''))) { | ||||||
|  |           dConsole.info(JudgeTag, 'surenjun =>', txt2) | ||||||
|  |           dConsole.info(JudgeTag, 'surenjun => no2', no2) | ||||||
|  |           currentProject.type = '3' | ||||||
|  |           currentProject.isUpload = true | ||||||
|  |           currentProject.isEnd = true | ||||||
|  |           ddxkKsxmArr.push(txt2) | ||||||
|  |         } | ||||||
|  |         Reflect.set(projectsObj, no2Num, currentProject) | ||||||
|  |         Reflect.set(projectsCenterObj, txt2, currentProject) | ||||||
|  |         projects.push(currentProject); | ||||||
|  |       } | ||||||
|  |       systemparmArr.push({ | ||||||
|  |         NO1: Number(no1), | ||||||
|  |         NO2: Number(no2), | ||||||
|  |         NO3: Number(no3), | ||||||
|  |         TXT1: decodeURIComponent(systemParam.txt1 || ""), | ||||||
|  |         TXT2: decodeURIComponent(systemParam.txt2 || ""), | ||||||
|  |         TXT3: decodeURIComponent(systemParam.txt3 || ""), | ||||||
|  |       }) | ||||||
|  |     }) | ||||||
|  |     if (!projects.length) { | ||||||
|  |       promptAction.showToast({ | ||||||
|  |         message: '读取数据库信息失败,请重新联网更新!', | ||||||
|  |         duration: 8000 | ||||||
|  |       }); | ||||||
|  |       dConsole.log(JudgeTag, "router back3") | ||||||
|  |       router.back(); | ||||||
|  |     } | ||||||
|  |     return { | ||||||
|  |       totalScore, | ||||||
|  |       wayno, | ||||||
|  |       mockLight, | ||||||
|  |       carlist, | ||||||
|  |       passingScore, | ||||||
|  |       examMileage, | ||||||
|  |       projectsObj, | ||||||
|  |       projectsCenterObj, | ||||||
|  |       ddxkKsxmArr, | ||||||
|  |       singlePlay, | ||||||
|  |       systemparmArr, | ||||||
|  |       projects, | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   public async JudgeStart(callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) { | ||||||
|  |     const name = judgeUI.name | ||||||
|  |     const kssycs = judgeUI.kssycs | ||||||
|  |     const manualMarkRules = judgeUI.manualMarkRules | ||||||
|  |     // 处理单机模式 | ||||||
|  |     const isTrajectoryOpen = JudgeConfig.isTrajectoryOpen; | ||||||
|  |     const isJudgeInitBool = AppStorage.get<boolean>('isJudgeInitBool'); | ||||||
|  |     const trajectoryPath = JudgeConfig.trajectoryPath; | ||||||
|  |     let strArr: string[] = []; | ||||||
|  |     if (isTrajectoryOpen) { | ||||||
|  |       const folderPath = await that.fileUtil.initFolder(trajectoryPath); | ||||||
|  |       const str: string = await that.fileUtil.readFile(folderPath) | ||||||
|  |       strArr = str.split('\n') | ||||||
|  |     } | ||||||
|  |     //日志回调 | ||||||
|  |     dConsole.info(JudgeTag, '1.进入评判入口') | ||||||
|  |     await examJudgeSetLogCallback(6, async (level: number, info: string, len: number) => { | ||||||
|  |       dConsole.log(JudgeTag, '评判日志:' + info) | ||||||
|  |       dConsole.writeProcessData(ProcessDataEnumType.JudgeLogData, info) | ||||||
|  |     }) | ||||||
|  | 
 | ||||||
|  |     dConsole.info(JudgeTag, '2.注册日志回调完成') | ||||||
|  | 
 | ||||||
|  |     let initInfo: JudgeInitObj = isTrajectoryOpen ? JSON.parse(strArr[0]) : await this.GetJudgeInitData(judgeUI.context, judgeUI.markRuleListObj, judgeUI.carType, judgeUI.carName, judgeUI.systemparmArr, judgeUI.carinfoArr, judgeUI.examSubject, judgeUI.itemInfoObj, judgeUI.judgeConfig, judgeUI.carlist, judgeUI.mapPointArr, judgeUI.mapPointItemArr); | ||||||
|  |     //相关评判初始化只做一次 | ||||||
|  |     if (!isJudgeInitBool) { | ||||||
|  |       dConsole.log(JudgeTag, "评判初始化参数", initInfo) | ||||||
|  |       await examJudgeInit(initInfo); | ||||||
|  |       AppStorage.setOrCreate('isJudgeInitBool', true) | ||||||
|  |       dConsole.info(JudgeTag, '4.评判初始化完成') | ||||||
|  |     } | ||||||
|  |     AppStorage.setOrCreate('isJudge', true) | ||||||
|  |     // 2.评判过程回调 | ||||||
|  |     await examJudgeSetRealExamCallback(async (strData: string, len: number) => { | ||||||
|  |       // 评判回调日志 | ||||||
|  |       dConsole.writeProcessData(ProcessDataEnumType.JudgeProgressCallbackData, strData) | ||||||
|  |       dConsole.info(JudgeTag, '评判回调数据', strData) | ||||||
|  |       await that.Judging(strData, callBack) | ||||||
|  |     }) | ||||||
|  |     await examJudgeSetPerformCallback(async (info: string) => { | ||||||
|  |       dConsole.info('评判实时数据', info) | ||||||
|  |       that.performInfo = JSON.parse(info) | ||||||
|  |       const jl = Math.floor((that.performInfo.qjjl + that.performInfo.dcjl) / 100); | ||||||
|  |       if (jl > Number(judgeUI.examMileage)) { | ||||||
|  |         that.JudgeEnd() | ||||||
|  |       } | ||||||
|  |       judgeUI.jl = jl | ||||||
|  |       judgeUI.laneSignal = that.performInfo.lane | ||||||
|  |     }) | ||||||
|  |     let beginExamInfo: JudgeBeginObj | undefined = undefined | ||||||
|  |     // 3.开始考试 | ||||||
|  |     if (isTrajectoryOpen) { | ||||||
|  |       beginExamInfo = JSON.parse(strArr[1]) | ||||||
|  |       beginExamInfo && (beginExamInfo.replay = 1) | ||||||
|  |     } else { | ||||||
|  |       beginExamInfo = await this.GetJudgeBeginData(judgeUI.projects, judgeUI.carType, judgeUI.kssycs, judgeUI.isDdxk, judgeUI.ddxkTime, judgeUI.projectsCenterObj, judgeUI.ddxkKsxmArr, judgeUI.ddxkKfArr, judgeUI.passingScore, judgeUI.wayno, judgeUI.name, judgeUI.lsh, judgeUI.idCard, that.isExam) | ||||||
|  |     } | ||||||
|  |     if (beginExamInfo) { | ||||||
|  |       await examJudgeBeginExam(beginExamInfo); | ||||||
|  |     } | ||||||
|  |     dConsole.info(JudgeTag, '6.开始考试注册完成') | ||||||
|  |     that.avPlayer?.playAudio([judgeUI.singlePlay ? 'voice/ksks.wav' : 'voice/监管成功.mp3']) | ||||||
|  |     if (!judgeUI.singlePlay) { | ||||||
|  |       that.videoData = await saveStartRecordVideo(`${name}_${kssycs}`, that.context) | ||||||
|  |     } | ||||||
|  |     judgeUI.draw = true | ||||||
|  |     // 处理单机泡轨迹模式 | ||||||
|  |     if (isTrajectoryOpen) { | ||||||
|  |       that.SingleMachineTrajectory(strArr) | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  | 
 | ||||||
|  |   public async Judging(strData: string, callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) { | ||||||
|  | 
 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   public async JudgeEnd(judgeUI: JudgePage, that: JudgeBusiness, isManual?: boolean) { | ||||||
|  |     const isAllProjectsEnd = judgeUI.isAllProjectsEnd | ||||||
|  |     const examSubject = judgeUI.examSubject | ||||||
|  |     const singlePlay = judgeUI.singlePlay | ||||||
|  |     const totalScore = Number(judgeUI.totalScore) | ||||||
|  |     const judgeConfigObj = judgeUI.judgeConfigObj | ||||||
|  |     const examMileage = Number(judgeUI.examMileage) | ||||||
|  |     const passingScore = Number(judgeUI.passingScore) | ||||||
|  |     const jl = judgeUI.jl | ||||||
|  |     if (that.isExamEnd) { | ||||||
|  |       return | ||||||
|  |     } | ||||||
|  |     if (isManual) { | ||||||
|  |       // 考试不合格 | ||||||
|  |       await examJudgeEndExam() | ||||||
|  |       that.isExamEnd = true | ||||||
|  |       that.isManual = true | ||||||
|  |     } else { | ||||||
|  |       const param302: number = Reflect.get(judgeConfigObj, '302') | ||||||
|  |       const param342: number = Reflect.get(judgeConfigObj, '342') | ||||||
|  |       const param512: number[] = (Reflect.get(judgeConfigObj, '512') || '').split(','); | ||||||
|  | 
 | ||||||
|  |       //单机模式 | ||||||
|  |       if (singlePlay) { | ||||||
|  |         dConsole.info(JudgeTag + ' 单机模式结束 => ', isAllProjectsEnd) | ||||||
|  |         if (isAllProjectsEnd && jl >= examMileage) { | ||||||
|  |           //成绩合格 | ||||||
|  |           if (totalScore >= passingScore && !that.isEndTip) { | ||||||
|  |             if (examSubject == '3' && (param342 == 0 || param342 == 2) && | ||||||
|  |               (param302 != 6 && param302 != 7 && param302 != 8)) { | ||||||
|  |               if (param512[7] != 0) { | ||||||
|  |                 clearTimeout(that.deductedPopShowTimer) | ||||||
|  |                 that.avPlayer?.playAudio(['voice/综合评判.mp3']) | ||||||
|  |                 judgeUI.isDeductedPopShow = true | ||||||
|  |                 judgeUI.defaultTabIndex = 1 | ||||||
|  |                 that.isEndTip = true | ||||||
|  |                 return | ||||||
|  |               } | ||||||
|  |             } else { | ||||||
|  |               await examJudgeEndExam() | ||||||
|  |               that.isExamEnd = true | ||||||
|  |               return | ||||||
|  |             } | ||||||
|  |           } else { | ||||||
|  |             if (examSubject == '3' && (param302 == 4 || param302 == 5 || param302 == 7 || param302 == 8)) { | ||||||
|  |               await examJudgeEndExam() | ||||||
|  |               that.isExamEnd = true | ||||||
|  |               return | ||||||
|  |             } | ||||||
|  |           } | ||||||
|  |           await examJudgeEndExam() | ||||||
|  |           that.isExamEnd = true | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         //成绩不合格 | ||||||
|  |         if (totalScore < passingScore) { | ||||||
|  |           //科目三不合格报靠边停车 | ||||||
|  |           if (examSubject == '3' && param302 == 1) { | ||||||
|  |             that.avPlayer?.playAudio([`voice/考试结束.mp3`]); | ||||||
|  |             return | ||||||
|  |           } | ||||||
|  |           await examJudgeEndExam() | ||||||
|  |           that.isExamEnd = true | ||||||
|  |           return | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         //成绩合格 | ||||||
|  |         if (isAllProjectsEnd && totalScore >= passingScore && !that.isEndTip) { | ||||||
|  |           if (examSubject == '2') { | ||||||
|  |             await examJudgeEndExam() | ||||||
|  |             that.isExamEnd = true | ||||||
|  |             return | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|  |           //考试里程判断 | ||||||
|  |           if (examSubject == '3' && jl < examMileage) { | ||||||
|  |             return | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|  |           //考试合格自动退出 | ||||||
|  |           if (examSubject == '3' && (param302 == 4 || param302 == 7) || param302 == 8) { | ||||||
|  |             await examJudgeEndExam() | ||||||
|  |             that.isExamEnd = true | ||||||
|  |             return | ||||||
|  |           } | ||||||
|  | 
 | ||||||
|  |           if (examSubject == '3' && (param342 == 0 || param342 == 2) && | ||||||
|  |             (param302 != 6 && param302 != 7 && param302 != 8)) { | ||||||
|  |             if (param512[7] != 0) { | ||||||
|  |               clearTimeout(that.deductedPopShowTimer) | ||||||
|  |               judgeUI.isDeductedPopShow = false | ||||||
|  |               that.avPlayer?.playAudio(['voice/综合评判.mp3']) | ||||||
|  |               judgeUI.isDeductedPopShow = true | ||||||
|  |               judgeUI.defaultTabIndex = 1 | ||||||
|  |               that.isEndTip = true | ||||||
|  |             } | ||||||
|  |           } else { | ||||||
|  |             await examJudgeEndExam() | ||||||
|  |             that.isExamEnd = true | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }; | ||||||
|  | } | ||||||
| @ -1,5 +1,6 @@ | |||||||
| import { JudgeUI, Project, SYSTEM_PARAM, } from '../../model' | import { Project, SYSTEM_PARAM, } from '../../model' | ||||||
| import JudgeBusiness from './JudgeBusiness' | import JudgeBusiness from './JudgeBusiness' | ||||||
|  | import { JudgePage } from "../Judge" | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| export interface GetSysSetResult { | export interface GetSysSetResult { | ||||||
| @ -19,5 +20,7 @@ export  interface GetSysSetResult { | |||||||
| 
 | 
 | ||||||
| export interface BaseJudge { | export interface BaseJudge { | ||||||
|   JudgeInit: (mode: number, carName: string) => Promise<GetSysSetResult> |   JudgeInit: (mode: number, carName: string) => Promise<GetSysSetResult> | ||||||
|   JudgeStart: (callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) => void |   JudgeStart: (callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) => void | ||||||
|  |   Judging: (strData: string, callBack: Function, judgeUI: JudgePage, that: JudgeBusiness) => void | ||||||
|  |   JudgeEnd: (judgeUI: JudgePage, that: JudgeBusiness, isManual?: boolean) => void | ||||||
| } | } | ||||||
| @ -1,20 +1,18 @@ | |||||||
| { | { | ||||||
|   "lockfileVersion": 2, |   "lockfileVersion": 1, | ||||||
|   "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", |   "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", | ||||||
|   "specifiers": { |   "specifiers": { | ||||||
|     "@ohos/crypto-js@2.0.3": "@ohos/crypto-js@2.0.3", |     "@ohos/crypto-js@2.0.3": "@ohos/crypto-js@2.0.3", | ||||||
|     "@ohos/hypium@1.0.19": "@ohos/hypium@1.0.19" |     "@ohos/hypium@1.0.19": "@ohos/hypium@1.0.19" | ||||||
|   }, |   }, | ||||||
|   "packages": { |   "packages": { | ||||||
|     "@ohos/hypium@1.0.19": { |  | ||||||
|       "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.19.har", |  | ||||||
|       "integrity": "sha512-cEjDgLFCm3cWZDeRXk7agBUkPqjWxUo6AQeiu0gEkb3J8ESqlduQLSIXeo3cCsm8U/asL7iKjF85ZyOuufAGSQ==", |  | ||||||
|       "registryType": "ohpm" |  | ||||||
|     }, |  | ||||||
|     "@ohos/crypto-js@2.0.3": { |     "@ohos/crypto-js@2.0.3": { | ||||||
|       "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/crypto-js/-/crypto-js-2.0.3.har", |       "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/crypto-js/-/crypto-js-2.0.3.har", | ||||||
|       "integrity": "sha512-LuHaR1kD5PxnOXnuR1fWvPwGtbed9Q/QGzk6JOh8y5Wdzvi8brPesODZiaWf9scOVRHsbTPOtZw91vWB35p1vQ==", |       "integrity": "sha512-LuHaR1kD5PxnOXnuR1fWvPwGtbed9Q/QGzk6JOh8y5Wdzvi8brPesODZiaWf9scOVRHsbTPOtZw91vWB35p1vQ==" | ||||||
|       "registryType": "ohpm" |     }, | ||||||
|  |     "@ohos/hypium@1.0.19": { | ||||||
|  |       "resolved": "https://ohpm.openharmony.cn/ohpm/@ohos/hypium/-/hypium-1.0.19.har", | ||||||
|  |       "integrity": "sha512-cEjDgLFCm3cWZDeRXk7agBUkPqjWxUo6AQeiu0gEkb3J8ESqlduQLSIXeo3cCsm8U/asL7iKjF85ZyOuufAGSQ==" | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user