fix: 重构评判

This commit is contained in:
wangzhongjie 2025-08-13 15:32:32 +08:00
parent 2fed7549d6
commit d56b107cbf
15 changed files with 892 additions and 171 deletions

View File

@ -41,7 +41,6 @@ export interface UDPParamType {
/** 扣分代码项 */
export interface KfdmType {
xmmcStr: string
xmdm: number
desc: string
@ -451,7 +450,7 @@ export interface JudgeUI {
systemparmArr: SYSTEMPARMARR[]
carinfoArr: CARINFO[]
kfArr: MarkRule[]
judgeConfigObj: object
judgeConfigObj: DefaultJudgeConfigObj
judgeConfig: SyssetConfig[]
projectsObj: ESObject
projects: ProjectInfo[]
@ -656,11 +655,19 @@ export interface JudgeXMJS {
xmhg: 0 | 1
}
export interface DeductionProjectConversionType {
desc: string
score: number
markcatalog: string
markserial: string
kfxh: string
}
export interface JudgeKf {
xmdm: number
kfdm?: string
markcatalog: string
type: 0 | 1 | 2 | 3
type?: 0 | 1 | 2 | 3
xmmcStr?: string
desc?: string
score?: number

View File

@ -19,7 +19,6 @@ import Prompt from '@system.prompt';
import { DifferentialAndSignal } from '../utils/business/DifferentialAndSignalWorker';
import { dConsole } from '../utils/LogWorker';
import CarLoadingComponent from './Index/Loading';
import { CreateFile } from '../utils/Common';
@Entry
@Component
@ -78,7 +77,6 @@ struct Index {
async onPageShow(): Promise<void> {
dConsole.log("权限首页 onPageShow2")
CreateFile("/mnt/hmdfs/100/account/device_view/local/files/duolun/logs/test.text")
if (!this.isPlay) {
this.avPlayer.playAudio(['welcome.wav'])
this.isPlay = true
@ -218,7 +216,6 @@ struct Index {
HeaderComponent({
shortLogo: false
})
CardComponent({
isSingle: this.singlePlay,
singleClick: () => {

View File

@ -141,4 +141,3 @@ export function CreateAlbum(fileHelper: FileHelper) {
fileHelper.createAlbum(date);
}

View File

@ -396,6 +396,7 @@ struct JudgePage {
Reflect.set(this.projectsObj, 1, project_1)
}
Reflect.set(this.judgeConfigObj, sys.v_no!, value)
dConsole.log("寻找", this.judgeConfigObj)
});
this.judgeConfig = syssetJudgeConfigArr;
}

View File

@ -0,0 +1,160 @@
import {
JudgeConfigObjKmItems,
JudgePerformInfo,
JudgeUI,
MarkRule,
PLCType,
ProcessDataEnumType,
RecordHandleType,
WorkerBackMessage,
WorkerBackMessageType
} from '../../model'
import FileUtils from '../../utils/FileUtils'
import VoiceAnnounce from '../judgeSDK/utils/voiceAnnouncements'
import common from '@ohos.app.ability.common'
import { JudgeStartFn } from './JudgeStart'
import { dConsole } from '../../utils/LogWorker'
import { JudgeTag } from '../../config'
import { examJudgeRealExam } from './JudgeSDKUtils'
import { JudgingFn, SetJudgeItem } from './JudgeIng'
import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignalWorker'
import { PlcStrToJson, PlcStrToWXJson } from './utils'
import { JudgeEndFn } from './JudgeEnd'
export default class JudgeBusiness {
public fileUtil: FileUtils
public avPlayer?: VoiceAnnounce
public performInfo?: JudgePerformInfo
public context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
//考试是否结束了
public isExamEnd: boolean
public isEndTip: boolean = false;
//是否手动结束考试
public isManual: boolean = false
public deductedPopShowTimer: number = 0;
public videoData?: RecordHandleType
//是否是考试模式
public isExam: boolean
// PLC原始数据
public plcStr: string = ""
public rmndg: 0 | 1 = 0
//所有的科目考试项目(大车&小车)
public kmItems: JudgeConfigObjKmItems
public xmmcStr: string = ""
public xmmcCode: string = ""
public xmmcSingleCode: string = ""
public xmmcEndCode?: string
public xmdm: string | number = ""
public xmxh: string = ""
public kfArr?: MarkRule[]
public carztStr: string
private judgeUI: JudgeUI
private tempData?: PLCType
private plcData?: PLCType
// 是否发送udp
private isUdpEnd: boolean = false
private mndgStr: string | undefined
constructor(judgeUI: JudgeUI) {
this.judgeUI = judgeUI
this.fileUtil = new FileUtils(judgeUI.context)
this.avPlayer = new VoiceAnnounce(this.context);
}
// 单机轨迹模式
public async SingleMachineTrajectory(strArr: string[]) {
let num = 2
const judgeTimer = setInterval(async () => {
const msgStr = strArr[num]
if (msgStr == '') {
dConsole.info(JudgeTag, '模拟数据考试结束')
clearInterval(judgeTimer)
this.JudgeEnd(true)
return
}
const msg: PLCType = JSON.parse(strArr[num]);
num++
// 4.过程数据
this.tempData = msg
this.judgeUI.sd = Math.floor(msg?.gps?.sd * 1.852) + '';
this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + ''
this.plcData = msg
AppStorage.setOrCreate('msgStr', '')
if (msg.method === 'examJudgeArtificialItem') {
SetJudgeItem(msg.itemno, msg.type)
}
if (msg.method === 'examJudgeArtificialMark') {
SetJudgeItem(msg.itemno, msg.serial)
}
await examJudgeRealExam(msg)
}, 200)
}
// 开始考试
public async JudgeStart(callBack: Function) {
// 处理考试前需要做的业务
// 调用开始考试
JudgeStartFn(callBack, this.judgeUI, this)
// 处理PLC数据
// 处理实时udp里的plc信号
DifferentialAndSignal.onMsg((data: string) => {
const result: WorkerBackMessage = JSON.parse(data)
if (result.type === WorkerBackMessageType.ObtainUdpData) {
this.HandlePLCData(result.data as string)
dConsole.writeProcessData(ProcessDataEnumType.PlcData, result.data as string)
}
})
this.JudgeEnd()
}
// 考试过程 callback优化
public async Judging(strData: string, callBack: Function) {
JudgingFn(strData, callBack, this.judgeUI, this)
}
// 结束考试
public JudgeEnd(isManual?: boolean) {
JudgeEndFn(this.judgeUI, this, isManual)
}
// 处理PLC数据
private async HandlePLCData(msg: string) {
const plcArr = msg.split(',')
if (plcArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const gpsPart = msg.split("#END$GPS,")[1];
const gpsStatus = gpsPart.split(",")[0];
if (gpsStatus === "4") {
dConsole.log(JudgeTag, "差分状态正常", gpsStatus)
this.judgeUI.isDwztRight = true
} else {
dConsole.log(JudgeTag, "差分状态异常", gpsStatus)
this.judgeUI.isDwztRight = false
}
// 记录原始PLC数据
dConsole.writeProcessData(ProcessDataEnumType.PlcData, msg)
const tempData = await PlcStrToJson(msg);
tempData.sensor.rmndg = this.rmndg;
tempData.sensor.mndg = this.mndgStr || "";
const wuXiDataStr = await PlcStrToWXJson(msg)
// 无锡所数据记录
dConsole.writeProcessData(ProcessDataEnumType.WuxiProgressData, wuXiDataStr)
this.plcData = tempData
this.tempData = tempData
this.plcStr = msg;
this.mndgStr = '';
this.rmndg = 0;
AppStorage.setOrCreate('msgStr', msg)
// 4.过程数据
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, JSON.stringify(this.plcData))
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? this.plcData.gps.sd : this.plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(this.plcData.sensor.dw as number) || 0) + ''
if (!this.isExamEnd) {
await examJudgeRealExam(this.plcData)
}
}
}

View File

@ -0,0 +1,110 @@
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
}
}
}
}
}

View File

@ -0,0 +1,154 @@
import { JudgeTag } from '../../config';
import { JudgeCallBackData, JudgeUI, KmItem, MarkRule, ProcessDataEnumType, ProjectInfo } from '../../model';
import { dConsole } from '../../utils/LogWorker';
import JudgeBusiness from './JudgeBusiness';
import { examJudgeArtificialItem } from './JudgeSDKUtils';
import { CurrentProjectConversion, DeductionProjectConversion } from './utils';
export const JudgingFn = async (strData: string, callBack: Function, judgeUI: JudgeUI, that: JudgeBusiness) => {
let examData: JudgeCallBackData = JSON.parse(strData);
const carzt = examData.carzt
const xmks = examData.xmks
const kf = examData.kf
const event = examData.event
const xmjs = examData.xmjs
const xmqx = examData.xmqx
const ksjs = examData.ksjs
const sound = examData.sound
const mndg = examData.mndg
const lane = examData.lane
const precast = examData.precast
const nongps = examData.nongps
//获取项目结束、项目开始代码
const xmdm = event == 2 ? xmjs.xmdm : xmks.xmdm
const xmxh = event == 2 ? xmjs.xmxh : xmks.xmxh;
let artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
const isManualProjectIn = artSubject3ProjectsCodesArr.includes(xmdm);
const examSubject = judgeUI.examSubject
const judgeConfigObj = judgeUI.judgeConfigObj
let project: ProjectInfo = Reflect.get(judgeUI.projectsObj, xmdm)
const xmmcCode = project.projectCodeCenter || "";
const kmItem: KmItem = Reflect.get(that.kmItems, xmmcCode)
switch (event) {
// 项目开始
case 1:
project.type = '2';
if (isManualProjectIn) {
//手动项目是否在进行中
judgeUI.isManualProjectIn = true
}
if (xmdm == 41 && examSubject == '3') {
that.rmndg = 1
}
judgeUI.currentXmdm = xmdm;
const xmmcStr = project.name || "";
const xmmcSingleCode = project.projectCode || "";
kmItem.status = 2;
that.xmmcStr = xmmcStr;
that.xmmcCode = xmmcCode;
that.xmmcSingleCode = xmmcSingleCode
that.xmmcEndCode = xmmcCode
that.xmdm = xmdm;
that.xmxh = xmxh;
judgeUI.isProjectIn = true
Reflect.set(judgeUI.projectsObj, xmdm, project)
Reflect.set(that.kmItems, xmmcCode || 0, kmItem)
break;
// 项目结束
case 2:
project.type = (xmjs.xmhg === 0 ? '4' : '3')
//计算项目是否全部结束
judgeUI.isProjectIn = (Reflect.ownKeys(judgeUI.projectsObj).filter((projectKey) => {
const fillProject: ProjectInfo = Reflect.get(judgeUI.projectsObj, projectKey)
return fillProject.type == '2'
}).length) > 0;
if (isManualProjectIn) {
judgeUI.isManualProjectIn = false
}
kmItem.status = 3;
//统计必考项目数量
that.xmmcStr = '无';
that.xmmcCode = '';
that.xmdm = '';
judgeUI.currentXmdm = undefined;
Reflect.set(judgeUI.projectsObj, xmdm, project)
Reflect.set(that.kmItems, xmmcCode, kmItem)
break;
// 扣分
case 3:
const thisKf = DeductionProjectConversion(`${kf.xmdm}_${kf.kfdm}`, judgeUI.markRuleListObj)
const kfObj: MarkRule = {
//扣分项目名称
xmmcStr: CurrentProjectConversion(kf.xmdm, judgeUI.projectsObj),
xmdm: kf.xmdm + "",
//扣分描述
desc: thisKf.desc,
//扣分分数
score: thisKf.score,
// 扣分无锡所代码
markcatalog: thisKf.markcatalog,
markserial: thisKf.markserial,
kfxh: thisKf.kfxh,
//扣分类型
type: kf.type
}
dConsole.log(JudgeTag, "扣分组装", kfObj)
that.kfArr?.push(kfObj)
dConsole.log(JudgeTag, "扣分类组装", that.kfArr)
judgeUI.totalScore += Number(thisKf?.score);
if (kf.xmdm != 20) {
const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, kf.xmdm)
const type = project.type;
project.type = (type == '3' || type == '4') ? '4' : '5'
Reflect.set(judgeUI.projectsObj, kf.xmdm, project)
}
break;
// 考试状态
case 4:
break;
// 考试结束
case 5:
break;
// 项目取消
case 6:
break;
// 语音播报和提示
case 7:
break;
// 模拟灯光事件
case 8:
break;
// 车道和路段变化
case 9:
break;
// 预进项目事件
case 10:
break;
// 差分事件
case 11:
break;
default:
83
break;
}
await callBack({
//项目名称 考车状态 扣分arr
xmmcStr: that.xmmcStr, carztStr: that.carztStr, kfArr: that.kfArr
});
}
//
export const SetJudgeItem = async (itemno: string, type: 1 | 2) => {
await examJudgeArtificialItem(Number(itemno), type);
const str = JSON.stringify({
method: 'examJudgeArtificialItem',
itemno: Number(itemno),
type
})
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, str)
dConsole.info(JudgeTag, `人工评判${type == 1 ? '进入' : '取消'}项目-${itemno}`)
}

View File

@ -0,0 +1,249 @@
//开始评判
import { JudgeConfig, JudgeTag } from '../../config';
import {
BaseInfoType,
CARINFO,
CarInfoType,
CDSBInfo,
ExaminerInfoType,
ItemInfo,
ItemInfos,
JudgeBeginObj,
JudgeInitObj,
JudgeKFXM,
JudgeKSXM,
JudgeUI,
Km3JudgeInitConfig,
MAPITEMPOINTITEM,
MAPPOINT,
MarkRule,
ProcessDataEnumType,
ProjectInfo,
RouteParamsType,
SyssetConfig,
SYSTEMPARMARR
} from '../../model';
import common from '@ohos.app.ability.common';
import { dConsole } from '../../utils/LogWorker';
import {
examJudgeBeginExam,
examJudgeInit,
examJudgeSetLogCallback,
examJudgeSetPerformCallback,
examJudgeSetRealExamCallback,
examJudgeVersion
} from './JudgeSDKUtils';
import FileModel from '../judgeSDK/utils/fileModel';
import JudgeBusiness from './JudgeBusiness';
import { saveStartRecordVideo } from '../../utils/Video';
import router from '@ohos.router';
import systemTime from '@ohos.systemTime';
export const JudgeStartFn = async (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 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 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
}
}
// 获取评判开始考试数据
const GetJudgeBeginData = async (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 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
}
// 获取评判初始化数据
const GetJudgeInitData = async (context: common.UIAbilityContext, markRuleListObj: object, carType: string, carName: string, systemparmArr: SYSTEMPARMARR[], carinfoArr: CARINFO[], 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
}
export const GetModelData = (modelName: string, context: common.UIAbilityContext): string => {
try {
return new FileModel(context).getModelContent(JudgeConfig.modelPath, modelName);
} catch (e) {
// 可根据实际需求,返回空字符串或抛出异常
dConsole.error(JudgeTag, `获取模型数据失败: ${modelName}`, e.message)
return '';
}
};

View File

@ -0,0 +1,28 @@
import { testKm2Items, testKm3Items } from '../../mock';
import { JudgeConfigObjKmItems, ProjectInfo, ProjectInfos } from '../../model';
class judgeVariable {
public rmndg: 0 | 1 = 0
public kmItems: JudgeConfigObjKmItems = {}
public xmmcStr: string = ""
public xmmcEndCode?: string = ""
public xmxh: string = ""
public status: string = "开始"
constructor() {
}
public initKmItems(examSubject: string, projectsCenterObj: ProjectInfos) {
(examSubject == '2' ? testKm2Items : testKm3Items).forEach(item => {
const projectCenterObj: ProjectInfo = Reflect.get(projectsCenterObj, item.code)
Reflect.set(this.kmItems, item.code, {
code: item.code,
status: projectCenterObj === undefined ? 0 : (projectCenterObj.isEnd ? 3 : 1)
})
})
}
}
export const JudgeVariable = new judgeVariable();

View File

@ -2,25 +2,22 @@ import systemTime from '@ohos.systemDateTime';
import { TestRealExam } from '../../mock';
import {
CarInfoType,
DeductionProjectConversionType,
DefaultJudgeConfigObj,
ExtendType,
Gps,
LANE,
MarkRule,
PLCType,
ProjectInfo,
ProjectInfos,
ProjectRoads,
Radar,
VideoConfig,
Vision
} from '../../model';
import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common';
import dayTs from '../../utils/Date';
import { dConsole } from '../../utils/LogWorker';
import common from '@ohos.app.ability.common';
import { JudgeConfig, JudgeTag } from '../../config';
import { takePhoto } from '../../utils/Video';
import Prompt from '@system.prompt';
// 中心信号转换
@ -838,3 +835,21 @@ export const GetIsEndManualProject = (index: number, artSubject3Projects: string
return (type == '3' || type == '4') ? `${projectName}_red` : `${projectName}_green`;
}
//扣分项目转换
export const DeductionProjectConversion = (code: string, markRuleListObj: object): DeductionProjectConversionType => {
const thisMark: MarkRule = Reflect.get(markRuleListObj, code)
return {
desc: thisMark.markshow,
score: thisMark.markreal,
markcatalog: thisMark.markcatalog,
markserial: thisMark.markserial,
kfxh: thisMark.kfxh
}
}
//当前项目转换
export const CurrentProjectConversion = (code: number, projectsObj: object): string => {
const project: ProjectInfo = Reflect.get(projectsObj, code)
return project?.abbreviation || '通用评判'
}

View File

@ -3,10 +3,11 @@ import { GPSData } from '../../mock'
import { PerLane, RoadDataType, SignalDataType, WorkerBackMessage, WorkerBackMessageType } from '../../model'
import { DifferentialAndSignal } from '../../utils/business/DifferentialAndSignalWorker'
import { dConsole } from '../../utils/LogWorker'
import { examJudgeMapSetDrawing, examJudgeMapSetScaling } from '../Judge/JudgeUtils'
import { examJudgeMapSetDrawing, examJudgeMapSetScaling } from '../Judge/JudgeSDKUtils'
import BlockComponent from './Block'
import CoordinateComponent from './Coordinate'
@Component
export default struct TrajectoryViewComponent {
// GPS信号

View File

@ -66,7 +66,7 @@ import {
examJudgeSetRealExamCallback,
examJudgeSoundEnd,
examJudgeVersion
} from '../Judge/JudgeUtils';
} from '../Judge/JudgeSDKUtils';
import {
GetCarStatus,
GetCenterProjectStatus,
@ -142,7 +142,7 @@ export default class Judge {
switch (code) {
//结束考试方式
case 306:
if (judgeConfigObj[code] == 5) {
if (Reflect.get(judgeConfigObj, code) == 5) {
//靠边停车
avPlayer?.playAudio(['voice/406001.mp3'])
}
@ -170,48 +170,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 gpsPart = msg.split("#END$GPS,")[1];
const gpsStatus = gpsPart.split(",")[0];
if (gpsStatus === "4") {
dConsole.log(JudgeTag, "差分状态正常", gpsStatus)
this.judgeUI.isDwztRight = true
} else {
dConsole.log(JudgeTag, "差分状态异常", gpsStatus)
this.judgeUI.isDwztRight = false
}
this.judgeUI.isDwztRight
const plcData = await this.getPlcData(msg);
// 4.过程数据
// await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, 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服务序列号
@ -256,60 +214,6 @@ export default class Judge {
dConsole.info(JudgeTag, '过程数据文件上传 end')
}
private judgeTask: JudgeTask
// 检测扣分、结束项目时该项目是否开始
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 tempData?: PLCType
//实时计算gps经纬度距离
handDistance = async () => {
@ -360,40 +264,47 @@ export default class Judge {
AppStorage.setOrCreate('msgStr', plc)
return tempData
}
// 处理轨迹plc信号
handleTrajectoryUdp = async (strArr: string[]) => {
let num = 2;
const judgeTimer = setInterval(async () => {
const msgStr = strArr[num];
if (msgStr == '') {
dConsole.info(JudgeTag, '模拟数据考试结束')
clearInterval(judgeTimer)
this.checkExamIsEnd(true)
return
}
const msg: PLCType = JSON.parse(strArr[num]);
num++
// 4.过程数据
this.tempData = msg
// this.judgeUI.isDwztRight = (msg?.gps?.dwzt == 4 && msg?.gps?.jdzt == 3);
this.judgeUI.sd = Math.floor(msg?.gps?.sd * 1.852) + '';
this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + ''
this.plcData = msg
// this.judgeUI.isDwztRight = msg.gps.dwzt == 4;
AppStorage.setOrCreate('msgStr', '')
if (msg.method === 'examJudgeArtificialItem') {
this.setJudgeItem(msg.itemno, msg.type)
}
if (msg.method === 'examJudgeArtificialMark') {
this.setJudgeItem(msg.itemno, msg.serial)
}
await examJudgeRealExam(msg)
// const bytes = await this.getMessageHeartbeat();
// bytes && globalThis.judgeUdp.send(bytes)
}, 200)
// TODO 定时器缺失
// globalThis.judgeTimer = judgeTimer;
// 处理udp plc信号
handleUdp = async (msg: string) => {
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const gpsPart = msg.split("#END$GPS,")[1];
const gpsStatus = gpsPart.split(",")[0];
if (gpsStatus === "4") {
dConsole.log(JudgeTag, "差分状态正常", gpsStatus)
this.judgeUI.isDwztRight = true
} else {
dConsole.log(JudgeTag, "差分状态异常", gpsStatus)
this.judgeUI.isDwztRight = false
}
this.judgeUI.isDwztRight
const plcData = await this.getPlcData(msg);
// 4.过程数据
// await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
dConsole.writeProcessData(ProcessDataEnumType.JudgeExamData, 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 isEndTip: boolean = false;
//本地轨迹回放地址
@ -413,6 +324,32 @@ 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 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');
@ -516,32 +453,6 @@ export default class Judge {
UploadRegulatoryCodeConversion('17C54', temp.code || 0)
dConsole.info(JudgeTag, '上传照片 end')
}
private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
private lane: LANE = {
road: '', num: 0, count: 0
}
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
}
private videoData?: RecordHandleType
//当前科目二的考试项目
private deductedPopShowTimer: number = 0;
@ -655,6 +566,95 @@ export default class Judge {
}
}
}
// 检测扣分、结束项目时该项目是否开始
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
}
}
// 处理轨迹plc信号
handleTrajectoryUdp = async (strArr: string[]) => {
let num = 2;
const judgeTimer = setInterval(async () => {
const msgStr = strArr[num];
if (msgStr == '') {
dConsole.info(JudgeTag, '模拟数据考试结束')
clearInterval(judgeTimer)
this.checkExamIsEnd(true)
return
}
const msg: PLCType = JSON.parse(strArr[num]);
num++
// 4.过程数据
this.tempData = msg
// this.judgeUI.isDwztRight = (msg?.gps?.dwzt == 4 && msg?.gps?.jdzt == 3);
this.judgeUI.sd = Math.floor(msg?.gps?.sd * 1.852) + '';
this.judgeUI.dw = Math.floor(msg?.sensor?.dw) + ''
this.plcData = msg
// this.judgeUI.isDwztRight = msg.gps.dwzt == 4;
AppStorage.setOrCreate('msgStr', '')
if (msg.method === 'examJudgeArtificialItem') {
this.setJudgeItem(msg.itemno, msg.type)
}
if (msg.method === 'examJudgeArtificialMark') {
this.setJudgeItem(msg.itemno, msg.serial)
}
await examJudgeRealExam(msg)
// const bytes = await this.getMessageHeartbeat();
// bytes && globalThis.judgeUdp.send(bytes)
}, 200)
// TODO 定时器缺失
// globalThis.judgeTimer = judgeTimer;
}
constructor(judgeUI: JudgeUI) {
this.serialIndex = 1;

Binary file not shown.

Binary file not shown.