fix:过程数据方法补全部分

This commit is contained in:
wangzhongjie 2025-07-16 11:28:34 +08:00
parent 9696924932
commit 4832904345
10 changed files with 206 additions and 134 deletions

View File

@ -1,2 +1,2 @@
gitLog:
git log --since="2025-06-30 17:14" --until="2025-07-2 17:35" --pretty=format:"<details>%n <summary>%s</summary>%n <span style=\"color: #888;\">[提交人]:</span><span style=\"color: #333;\">%an</span><br>%n <span style=\"color: #888;\">[提交时间]:</span><span style=\"color: #333;\">%ad</span><br>%n <span style=\"color: #888;\">[提交版本]:</span><span style=\"color: #333;\">%h</span>%n</details>%n" --date=format:"%Y-%m-%d %H:%M" > release_note.md
git log --since="2025-06-30 17:14" --until="2025-07-15 10:00" --pretty=format:"<details>%n <summary>%s</summary>%n <span style=\"color: #888;\">[提交人]:</span><span style=\"color: #333;\">%an</span><br>%n <span style=\"color: #888;\">[提交时间]:</span><span style=\"color: #333;\">%ad</span><br>%n <span style=\"color: #888;\">[提交版本]:</span><span style=\"color: #333;\">%h</span>%n</details>%n" --date=format:"%Y-%m-%d %H:%M" > release_note.md

View File

@ -44,8 +44,6 @@ export enum WorkerMessageType {
Init = 'init',
// 初始化过程数据,初始化到人员以及人员里面各个目录
ProcessDataInit = 'processDataInit',
// 打开过程数据文件
OpenProcessDataFile = 'openProcessDataFile',
// 初始化考试过程
ExamProcessInit = 'examProcessInit'
}

View File

@ -19,6 +19,7 @@ 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
@ -77,6 +78,7 @@ 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

View File

@ -35,7 +35,7 @@ import {
} from '../model';
import { BusinessError } from '@ohos.base';
import { GetSyncData, SqlInsertTable } from '../utils/table/Operation';
import { GetCurrentUserKeyValue } from './UserInfo/utils';
import { GetCurrentUserKeyValue, InitializeExamProcessData } from './UserInfo/utils';
import dayTs from '../utils/Date';
import { GetCurrentTime, NumberToByteArray } from '../utils/Common';
import DB from '../utils/DbSql';
@ -174,10 +174,12 @@ struct UserInfoPage {
}
if (this.singlePlay) {
this.currentUser.id = '0'
dConsole.log('开始考试')
dConsole.log('开始考试3')
SqlInsertTable('USER', [this.currentUser]).catch((e: BusinessError) => {
dConsole.log("error", JSON.stringify(e))
})
// 初始化开始考试过程数据文件夹
InitializeExamProcessData(this.currentUser)
router.pushUrl({
url: this.carInfo.examSubject == '3' ? 'pages/Roads' : 'pages/Judge',
params: {
@ -342,8 +344,11 @@ struct UserInfoPage {
AppStorage.setOrCreate('examinerInfo', this.examinerLoginInfo)
AppStorage.setOrCreate('lsh', res.lsh)
// const { examSubject } = this.carInfo;
dConsole.log("开始考试2")
if (this.singlePlay) {
this.stopDeviceById()
// 初始化开始考试过程数据文件夹
InitializeExamProcessData(this.currentUser)
router.pushUrl({
url: this.carInfo.examSubject == "3" ? 'pages/Roads' : 'pages/Judge',
params: {
@ -874,6 +879,8 @@ struct UserInfoPage {
await SqlInsertTable('USER', [this.currentUser])
this.stepFlag = false
this.startExamDialogController.close()
// 初始化开始考试过程数据文件夹
InitializeExamProcessData(this.currentUser)
router.pushUrl({
url: 'pages/Judge',
params: {

View File

@ -1,4 +1,7 @@
import { UserInfoTag } from '../../config';
import { User } from '../../model';
import dayTs from '../../utils/Date';
import { dConsole } from '../../utils/LogWorker';
export const GetCurrentUserKeyValue = (user: User, key: string): string => {
switch (key) {
@ -51,4 +54,14 @@ export const GetCurrentUserKeyValue = (user: User, key: string): string => {
default:
return '';
}
}
export const InitializeExamProcessData = (user: User) => {
// 初始化考试过程数据
// 2025_07_04_11_35_26_0000000000000_342323199501470011_测试学员1
let date = dayTs().format("YYYY_MM_DD_HH_mm_ss")
const examDir: string = date + "_" + user.lsh + "_" + user.sfzmhm + "_" + user.xm
dConsole.log(UserInfoTag, "过程数据文件夹名", examDir)
dConsole.initExam(examDir)
dConsole.log("开始考试1")
}

View File

@ -230,37 +230,6 @@ export default class Judge {
dConsole.info(JudgeTag, '过程数据文件上传 end')
}
private judgeTask: JudgeTask
// 处理udp plc信号
handleUdp = async (msg: string) => {
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const plcData = await this.getPlcData(msg);
// 4.过程数据
await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
//检测到有无锡所设备接入,需要发送特定的数据,供检测
// if (this.usbService.isWXUSBDevice) {
// const str = await senorToWXDataStr(msg);
// this.usbService.sendUSB(str)
// }
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + ''
//TODO 暂时关闭差分检测异常
// await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt);
if (!this.isExamEnd) {
await examJudgeRealExam(plcData)
}
// let udpIndex = AppStorage.get<number>('udpIndex') || 0;
// if (udpIndex % 5 === 0 && !this.isUdpEnd) {
// TODO UPD缺失
// const judgeUdp = globalThis.judgeUdp
// const bytes = await this.getMessageHeartbeat(this.isExamEnd);
// judgeUdp.send(bytes)
// }
// AppStorage.setOrCreate('udpIndex', udpIndex++)
}
// 检测扣分、结束项目时该项目是否开始
checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => {
if (xmdm == 20) {
@ -338,6 +307,116 @@ export default class Judge {
this.prevWd = tWD;
}
private performInfo?: JudgePerformInfo
private ksjs?: JudgeKSJS
private kfArr?: MarkRule[]
//所有的科目考试项目(大车&小车)
private kmItems: JudgeConfigObjKmItems
private plcData?: PLCType
// 处理udp plc信号
handleUdp = async (msg: string) => {
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const plcData = await this.getPlcData(msg);
// 4.过程数据
await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
//检测到有无锡所设备接入,需要发送特定的数据,供检测
// if (this.usbService.isWXUSBDevice) {
// const str = await senorToWXDataStr(msg);
// this.usbService.sendUSB(str)
// }
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + ''
//TODO 暂时关闭差分检测异常
// await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt);
if (!this.isExamEnd) {
await examJudgeRealExam(plcData)
}
// let udpIndex = AppStorage.get<number>('udpIndex') || 0;
// if (udpIndex % 5 === 0 && !this.isUdpEnd) {
// TODO UPD缺失
// const judgeUdp = globalThis.judgeUdp
// const bytes = await this.getMessageHeartbeat(this.isExamEnd);
// judgeUdp.send(bytes)
// }
// AppStorage.setOrCreate('udpIndex', udpIndex++)
}
// 获取plc数据
getPlcData = async (plc: string) => {
await this.fileLog?.setPlcProgressData(plc)
//plc字符串转化成评判初始化数据
const tempData = await PlcStrToJson(plc);
//模拟灯光回放时刻
tempData.sensor.rmndg = this.rmndg;
//模拟灯灯光灯光项目
tempData.sensor.mndg = this.mndgStr || "";
//plc字符串转化成无锡所过程数据
const wuXiDataStr = await PlcStrToWXJson(plc)
this.plcData = tempData
await this.fileLog?.setExamJudgeWuxiProgressData(wuXiDataStr)
this.tempData = tempData
this.plcStr = plc;
this.mndgStr = '';
this.rmndg = 0;
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;
}
private isEndTip: boolean = false;
//本地轨迹回放地址
private trajectoryPath: string
// private currentKm2ItemsObj: any
private isTrajectoryOpen: boolean;
// 调代理接口是否断网了
private isJudgeDisConnect: boolean = false;
// 断网数据补传
uploadDisConnectData = async () => {
if (!this.isJudgeDisConnect) {
return
}
const folderPath = this.fileLog?.folderPath
const examDataStr = await this.fileUtil.readFile(`${folderPath}/wuxi_dis_progress_data.txt`);
const examDataArr = examDataStr.split('\n');
for (let examDataStr of examDataArr) {
const code = await writeObjectOut(JSON.parse(examDataStr), "", this.context);
}
}
// 校验考试是否结束
checkExamIsEnd = async (isManual?: boolean) => {
dConsole.log(JudgeTag, "校验考试是否结束")
@ -453,86 +532,14 @@ export default class Judge {
}
}
}
private ksjs?: JudgeKSJS
private kfArr?: MarkRule[]
//所有的科目考试项目(大车&小车)
private kmItems: JudgeConfigObjKmItems
private plcData?: PLCType
// 获取plc数据
getPlcData = async (plc: string) => {
await this.fileLog?.setPlcProgressData(plc)
//plc字符串转化成评判初始化数据
const tempData = await PlcStrToJson(plc);
//模拟灯光回放时刻
tempData.sensor.rmndg = this.rmndg;
//模拟灯灯光灯光项目
tempData.sensor.mndg = this.mndgStr || "";
//plc字符串转化成无锡所过程数据
const wuXiDataStr = await PlcStrToWXJson(plc)
this.plcData = tempData
await this.fileLog?.setExamJudgeWuxiProgressData(wuXiDataStr)
this.tempData = tempData
this.plcStr = plc;
this.mndgStr = '';
this.rmndg = 0;
AppStorage.setOrCreate('msgStr', plc)
return tempData
}
private isEndTip: boolean = false;
// 处理轨迹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;
}
//本地轨迹回放地址
private trajectoryPath: string
// private currentKm2ItemsObj: any
private isTrajectoryOpen: boolean;
//当前科目二的考试项目
// 调代理接口是否断网了
private isJudgeDisConnect: boolean = false;
// 断网数据补传
uploadDisConnectData = async () => {
if (!this.isJudgeDisConnect) {
return
}
const folderPath = this.fileLog?.folderPath
const examDataStr = await this.fileUtil.readFile(`${folderPath}/wuxi_dis_progress_data.txt`);
const examDataArr = examDataStr.split('\n');
for (let examDataStr of examDataArr) {
const code = await writeObjectOut(JSON.parse(examDataStr), "", this.context);
}
private deductedPopShowTimer: number = 0;
private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
private lane: LANE = {
road: '', num: 0, count: 0
}
private videoData?: RecordHandleType
private disConnectNum: number = 0;
// 项目开始接口同步
beginProject = async (ksxm: number) => {
const carInfo = AppStorage.get<CarInfoType>('carInfo');
@ -636,13 +643,6 @@ export default class Judge {
UploadRegulatoryCodeConversion('17C54', temp.code || 0)
dConsole.info(JudgeTag, '上传照片 end')
}
private deductedPopShowTimer: number = 0;
private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
private lane: LANE = {
road: '', num: 0, count: 0
}
private videoData?: RecordHandleType
private disConnectNum: number = 0;
//调用监管接口
sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => {
const temp = await writeObjectOut(data, filePath, this.context);

View File

@ -222,9 +222,16 @@ export function CreateDir(path: string): Promise<boolean> {
* @params path 文件具体路径
* @return 返回一个Promise
*/
export function CreateFile(path: string): Promise<boolean> {
export function CreateFile(path: string): Promise<number> {
return new Promise((resolve, reject) => {
try {
let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.APPEND | fs.OpenMode.CREATE)
console.log(CommonFileTag, "创建文件成功", path)
resolve(file.fd)
} catch (e) {
console.log(CommonFileTag, "创建文件失败")
reject(-1)
}
})
}

View File

@ -44,7 +44,7 @@ class logWorker {
console.log(`当前环境配置初始化: ${isOpenLog}`);
this.isLogEnabled = isOpenLog;
if (this.isLogEnabled === "1") {
this.workerInstance = new worker.ThreadWorker("entry/ets/workers/Log.ets");
this.workerInstance = new worker.ThreadWorker("entry/ets/workers/Log.ets")
let data: LogWorkerMessage = {
type: WorkerMessageType.Init
}
@ -52,6 +52,17 @@ class logWorker {
}
}
// 初始化考试过程数据文件夹以及文件
initExam(dirName: string) {
let data: LogWorkerMessage = {
type: WorkerMessageType.ExamProcessInit,
studentDirName: dirName
}
if (this.isLogEnabled === "1") {
this.workerInstance?.postMessage(JSON.stringify(data))
}
}
// 过程数据初始化
processDataInit(carNo: string, name: string) {
let date = dayTs().format("YYYY_MM_DD_HH_mm_ss");

View File

@ -1,11 +1,12 @@
import worker, { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope } from '@ohos.worker';
import { GlobalConfig } from '../config';
import { LogFileFd, LogPathType, LogWorkerMessage, WorkerMessageType } from '../model';
import { CreateDir, IsExit } from '../utils/Common';
import { CreateDir, CreateFile, IsExit } from '../utils/Common';
import dayTs from '../utils/Date';
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
const fileNameArr: string[] = ["four_one_log_byte_data.text", "four_one_log_data.txt", "judge_exam_data.txt", "judge_log_data.txt", "judge_progress_callback_data.txt", "plc_data.txt", "wuxi_exam_data.txt", "wuxi_progress_data.txt"]
let fileFdArr: number[] = []
workerPort.onmessage = (e: MessageEvents) => {
console.log("日志系统worker收到消息")
// 日志文件目录
@ -18,9 +19,6 @@ workerPort.onmessage = (e: MessageEvents) => {
if (result.type === WorkerMessageType.Init) {
InitLog()
}
if (result.type === WorkerMessageType.OpenProcessDataFile) {
OpenProcessDataFile(logPaths, logFileFd, result.data || "")
}
if (result.type === WorkerMessageType.ExamProcessInit && result.studentDirName) {
InitExam(result.studentDirName)
}
@ -69,13 +67,14 @@ async function InitExam(dirName: string) {
await CreateDir(path);
}
// 创建几个文件
let fileNameArr: string[] = ["four_one_log_byte_data.text", "four_one_log_data.txt", "judge_exam_data.txt", "judge_log_data.txt", "judge_progress_callback_data.txt", "plc_data.txt", "wuxi_exam_data.txt", "wuxi_progress_data.txt"]
fileNameArr.forEach(async (item: string, index: number) => {
let filePath = path + "/" + item
console.log("创建文件", filePath)
let result = await CreateFile(filePath)
fileFdArr[index] = result
})
}
function OpenProcessDataFile(logPaths: LogPathType, logFileFd: LogFileFd, name: string) {
}
workerPort.onmessageerror = (e: MessageEvents) => {
}

View File

@ -1,3 +1,38 @@
<details>
<summary>fix: 隐藏部分快速打印</summary>
<span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br>
<span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-07-14 13:23</span><br>
<span style="color: #888;">[提交版本]:</span><span style="color: #333;">78be17b</span>
</details>
<details>
<summary>fix: 增加request打印请求信息</summary>
<span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br>
<span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-07-04 16:31</span><br>
<span style="color: #888;">[提交版本]:</span><span style="color: #333;">8838072</span>
</details>
<details>
<summary>fix: 后置机拿不到信号问题</summary>
<span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br>
<span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-06-26 14:27</span><br>
<span style="color: #888;">[提交版本]:</span><span style="color: #333;">a52a13e</span>
</details>
<details>
<summary>fix: 优化打印以及评判一个弹窗问题</summary>
<span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br>
<span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-07-04 13:49</span><br>
<span style="color: #888;">[提交版本]:</span><span style="color: #333;">7bd3689</span>
</details>
<details>
<summary>fix: 增加一些日志</summary>
<span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br>
<span style="color: #888;">[提交时间]:</span><span style="color: #333;">2025-07-04 10:50</span><br>
<span style="color: #888;">[提交版本]:</span><span style="color: #333;">af8b112</span>
</details>
<details>
<summary>fix: 优化首页获取车辆后才可以进入联网以及单机逻辑</summary>
<span style="color: #888;">[提交人]:</span><span style="color: #333;">wangzhongjie</span><br>