Compare commits

...

3 Commits

Author SHA1 Message Date
wangzhongjie
423845af7b fix: 优化评判一些显示 2025-06-19 16:53:49 +08:00
wangzhongjie
6470eb1280 fix: 日志系统 2025-06-19 14:10:26 +08:00
wangzhongjie
6b6385fc43 fix: 设置界面选项添加 2025-06-19 10:16:59 +08:00
13 changed files with 408 additions and 192 deletions

View File

@ -34,4 +34,13 @@ export const EntryTag = '[Entry]';
export const WorkerTag = '[Worker]';
//中心udp
export const CenterUdpTag = '[CenterUdpBusiness]'
export const CenterUdpTag = '[CenterUdpBusiness]'
//TerminalInfo
export const TerminalInfoTag = '[TerminalInfo]';
// CommonFile
export const CommonFileTag = '[CommonFile]';
//首页
export const HomeTag = '[Home]';

View File

@ -17,4 +17,78 @@ export interface OtherMessageType {
export interface WorkerBackMessage {
type: string;
data: string | CenterCallBackMsgType
}
export interface LogWorkerMessage {
type: WorkerMessageType;
data?: string;
}
//枚举
export enum WorkerMessageType {
Log = 'log',
Error = 'error',
Warn = 'warn',
Info = 'info',
// 初始化 初始化文件夹到/mnt/hmdfs/100/account/device_view/local/files/duolun/logs/2024_10_12
Init = 'init',
// 初始化过程数据,初始化到人员以及人员里面各个目录
ProcessDataInit = 'processDataInit',
// 打开过程数据文件
OpenProcessDataFile = 'openProcessDataFile',
}
export interface LogPathType {
// log文件
log?: string
// error文件
error?: string
// 四合一原始数据
four_one_log_byte_data?: string;
// 四合一转换数据
four_one_log_data?: string;
// 评判数据
judge_exam_data?: string;
// 评判日志
judge_log_data?: string
// 评判事件回调日志
judge_progress_callback_data?: string;
// plc数据
plc_data?: string
// 无锡所数据
wuxi_exam_data?: string
// 无锡所过程轨迹数据
wuxi_progress_data?: string;
}
export interface LogFileFd {
// log文件
log?: number
// error文件
error?: number
// 四合一原始数据
four_one_log_byte_data?: number;
// 四合一转换数据
four_one_log_data?: number;
// 评判数据
judge_exam_data?: number;
// 评判日志
judge_log_data?: number
// 评判事件回调日志
judge_progress_callback_data?: number;
// plc数据
plc_data?: number
// 无锡所数据
wuxi_exam_data?: number
// 无锡所过程轨迹数据
wuxi_progress_data?: number;
}

View File

@ -1,7 +1,7 @@
import common from '@ohos.app.ability.common';
import router from '@ohos.router';
import { JudgeConfig } from '../config';
import { HomeTag, JudgeConfig } from '../config';
import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements';
import { BaseInfoType } from '../model/Common';
import { CarInfoType, InitializeTheCentralTableType, MASYSSETTableType, TimeSynchronizationRspBody } from '../model';
@ -38,6 +38,7 @@ struct Index {
@State carInfo: CarInfoType = {};
@State num: number = 0;
@State isPlay: boolean = false;
@State initWork: boolean = false
// 请求网络表等待弹窗
customDialogController: CustomDialogController = new CustomDialogController({
builder: LoadingComponent(),
@ -163,9 +164,16 @@ struct Index {
}
}, router.RouterMode.Single)
} else {
router.pushUrl({
url: 'pages/ExaminerLogin',
}, router.RouterMode.Single)
if (this.singlePlay) {
router.pushUrl({
url: 'pages/UserInfo',
}, router.RouterMode.Single)
} else {
router.pushUrl({
url: 'pages/ExaminerLogin',
}, router.RouterMode.Single)
}
}
})
});
@ -194,7 +202,10 @@ struct Index {
// CenterUDPBusinessInstance.startHeartBeat()
CreateAlbum(this.fileHelper)
// 启动worker通道
DifferentialAndSignal.init()
if (!this.initWork) {
DifferentialAndSignal.init()
this.initWork = true
}
DifferentialAndSignal.onMsg(() => {
console.log("外层接受")
})
@ -212,9 +223,11 @@ struct Index {
CardComponent({
isSingle: this.singlePlay,
singleClick: () => {
console.log(HomeTag, "单机模式点击")
this.singlePlayerTraining()
},
networkingClick: () => {
console.log(HomeTag, "联网考试点击")
this.onlineExam()
}
})
@ -225,6 +238,7 @@ struct Index {
hasAuth: this.baseInfo.hasAuth,
examCarNumber: this.deviceId,
versionClick: () => {
console.log(HomeTag, "版本号点击事件")
this.singlePlay = !this.singlePlay
AppStorage.setOrCreate('singlePlay', this.singlePlay)
}

View File

@ -19,7 +19,7 @@ export default struct BottomMessageComponent {
Text('授权信息:' + (this.hasAuth ? "已授权" : "未授权")).textCommonStyle()
}.gesture(
GestureGroup(GestureMode.Exclusive,
TapGesture({ count: 2 })
TapGesture({ count: 5 })
.onAction(() => {
this.versionClick && this.versionClick()
})

View File

@ -43,7 +43,7 @@ import {
} from '../model';
import { GetSyncData } from '../utils/table/Operation';
import dayTs from '../utils/Date';
import { CutArray, GetCurrentTime } from '../utils/Common';
import { CutArray, FormatTimeFlexible, GetCurrentTime } from '../utils/Common';
import FileUtils from '../utils/FileUtils';
@ -158,16 +158,14 @@ struct Index {
}
async aboutToAppear() {
const time = GetCurrentTime()
this.carInfo = AppStorage.get<CarInfoType>('carInfo')!
this.singlePlay = AppStorage.get<boolean>('singlePlay')!
this.startTime = time.split(' ')[1]
this.startFullTime = GetCurrentTime(1);
// this.startHourTime = await getCurrentHourTime()
this.startTime = dayTs().format("HHmmssSSS")
this.startExamTime = time
this.startTime = dayTs().format("YYYY-MM-DD HH:mm:ss")
this.startExamTime = dayTs().format("YYYY-MM-DD HH:mm:ss")
setInterval(async () => {
this.time = GetCurrentTime();
this.time = dayTs().format("YYYY-MM-DD HH:mm:ss");
this.examTime += 1;
}, 1000);
//初始化数据库表
@ -214,6 +212,7 @@ struct Index {
const result = await GetSyncData<ES_CARINFOType>("ES_CARINFO")
const carInfo = result[0] || {};
this.carName = decodeURI(carInfo.carclass!)
console.log("查看carType", carInfo.cartype)
this.carType = carInfo.kscx!
this.carinfoArr.push({
CARID: carInfo.carid!,
@ -709,8 +708,7 @@ struct Index {
Row() {
Text('考试用时:').fontColor('#E5CCA1').fontSize(this.FONTSIZE)
// Text(formatTime(this.examTime)).fontColor('#FFF').fontSize(this.FONTSIZE)
Text(dayTs(this.examTime).format("YYYY-MM-DD HH:mm:ss")).fontColor('#FFF').fontSize(this.FONTSIZE)
Text(FormatTimeFlexible(this.examTime)).fontColor('#FFF').fontSize(this.FONTSIZE)
}.margin({ bottom: 10 })
if (this.examSubject == "3") {

View File

@ -2,7 +2,7 @@ import HeaderComponent from './compontents/Header';
import { CommonListType, EnvironmentConfigurationType } from '../model';
import common from '@ohos.app.ability.common';
import FileUtils from '../utils/FileUtils';
import { GlobalConfig } from '../config';
import { GlobalConfig, TerminalInfoTag } from '../config';
import ethernet from '@ohos.net.ethernet';
import { BusinessError } from '@ohos.base';
import Prompt from '@system.prompt';
@ -17,7 +17,7 @@ struct TerminalInfoPage {
async aboutToAppear() {
this.fileUtil = new FileUtils(this.context)
const data = await this.fileUtil.readFile(GlobalConfig.commonFileWriteAddress + '/config/ipConfig.txt');
console.log("data", data)
console.log(TerminalInfoTag, "data", data)
if (data) {
this.config = JSON.parse(data)
AppStorage.setOrCreate<EnvironmentConfigurationType>("EnvironmentConfiguration", this.config)
@ -34,10 +34,6 @@ struct TerminalInfoPage {
shortLogo: true,
shouBackArea: true
})
// TODO
// 差分是否开启
// 车型
// 大车需要UDP两个端口
Column() {
Column() {
Flex({
@ -198,7 +194,7 @@ struct TerminalInfoPage {
Row() {
Image($r('app.media.bc')).height(80).objectFit(ImageFit.Contain).onClick(() => {
console.log("保存配置", JSON.stringify(this.config))
console.log(TerminalInfoTag, "保存配置", JSON.stringify(this.config))
AppStorage.setOrCreate<EnvironmentConfigurationType>("EnvironmentConfiguration", this.config)
this.fileUtil.addFile(GlobalConfig.commonFileWriteAddress + '/config/ipConfig.txt', JSON.stringify(this.config))
ethernet.setIfaceConfig("eth0", {

View File

@ -34,7 +34,7 @@ import { uploadExamProgressData, writeObjectOut } from '../../api/judge';
import { endRecordVideo, saveStartRecordVideo } from '../../utils/Video';
import common from '@ohos.app.ability.common';
import { ConvertDdmmToDecimalDegrees, GetCurrentTime,DeepClone } from '../../utils/Common';
import { ConvertDdmmToDecimalDegrees, DeepClone, GetCurrentTime } from '../../utils/Common';
import UsbService from '../../utils/USB';
import FileUtils from '../../utils/FileUtils';
import {
@ -179,38 +179,6 @@ export default class Judge {
private isExamEnd: boolean
// 是否发送udp
private isUdpEnd: boolean = false
// 处理udp plc信号
handleUdp = async (msg: string) => {
console.info('plc信号', msg)
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const plcData = await this.getPlcData(msg);
// 4.过程数据
await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
//检测到有无锡所设备接入,需要发送特定的数据,供检测
// if (this.usbService.isWXUSBDevice) {
// const str = await senorToWXDataStr(msg);
// this.usbService.sendUSB(str)
// }
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + ''
//TODO 暂时关闭差分检测异常
// await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt);
if (!this.isExamEnd) {
await examJudgeRealExam(plcData)
}
let udpIndex = AppStorage.get<number>('udpIndex') || 0;
if (udpIndex % 5 === 0 && !this.isUdpEnd) {
// TODO UPD缺失
// const judgeUdp = globalThis.judgeUdp
// const bytes = await this.getMessageHeartbeat(this.isExamEnd);
// judgeUdp.send(bytes)
}
AppStorage.setOrCreate('udpIndex', udpIndex++)
}
//是否手动结束考试
private isManual: boolean = false
//UDP服务序列号
@ -258,6 +226,60 @@ export default class Judge {
console.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
//如果项目没有开始
console.info('surenjun isUpload=>', isUpload)
if (!isUpload) {
console.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?: Plc
//实时计算gps经纬度距离
handDistance = async () => {
@ -421,6 +443,38 @@ export default class Judge {
AppStorage.setOrCreate('msgStr', plc)
return tempData
}
// 处理udp plc信号
handleUdp = async (msg: string) => {
console.info('plc信号', msg)
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const plcData = await this.getPlcData(msg);
// 4.过程数据
await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
//检测到有无锡所设备接入,需要发送特定的数据,供检测
// if (this.usbService.isWXUSBDevice) {
// const str = await senorToWXDataStr(msg);
// this.usbService.sendUSB(str)
// }
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + ''
//TODO 暂时关闭差分检测异常
// await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt);
if (!this.isExamEnd) {
await examJudgeRealExam(plcData)
}
let udpIndex = AppStorage.get<number>('udpIndex') || 0;
if (udpIndex % 5 === 0 && !this.isUdpEnd) {
// TODO UPD缺失
// const judgeUdp = globalThis.judgeUdp
// const bytes = await this.getMessageHeartbeat(this.isExamEnd);
// judgeUdp.send(bytes)
}
AppStorage.setOrCreate('udpIndex', udpIndex++)
}
// 处理轨迹plc信号
handleTrajectoryUdp = async (strArr: string[]) => {
// const { fileLog, setJudgeItem, setJudgeMark, endExam } = this;
@ -459,9 +513,9 @@ export default class Judge {
}
//本地轨迹回放地址
private trajectoryPath: string
//当前科目二的考试项目
// private currentKm2ItemsObj: any
private isTrajectoryOpen: boolean;
//当前科目二的考试项目
// 调代理接口是否断网了
private isJudgeDisConnect: boolean = false;
// 断网数据补传
@ -476,67 +530,6 @@ export default class Judge {
const code = await writeObjectOut(JSON.parse(examDataStr), "", this.context);
}
}
// 考试过程照片
uploadProgressPhoto = async (ksxm: number) => {
const time = GetCurrentTime();
const judgeUI = this.judgeUI
const plcData = this.plcData
const photoBase64 = await this.getPhoto();
const carInfo = AppStorage.get<CarInfoType>('carInfo');
const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, ksxm)
const judgeConfig_305: number = Reflect.get(judgeUI.judgeConfigObj, '305')
const drvexam: DrvexamType = {
lsh: judgeUI.lsh,
kskm: carInfo?.examSubject || "2",
ksxm: project.projectCodeCenter,
sfzmhm: judgeUI.idCard,
kchp: encodeURI(carInfo?.plateNo || ""),
zpsj: time,
zp: photoBase64,
cs: Math.floor((judgeConfig_305 == 0 ? (plcData?.gps?.sd || 0) : (plcData?.sensor?.cs || 0)) * 1.852),
ksdd: encodeURI(judgeUI.ksdd)
}
const data: RegulatoryInterfaceParams = {
xtlb: '17',
jkxlh: judgeUI.serialNumber,
jkid: '17C54',
drvexam
};
const temp: WR = await this.sendWriteObjectOut(data, this.filePath);
if (temp.code === 2300007) {
this.isJudgeDisConnect = true
}
promptWxCode('17C54', temp.code || 0)
console.info(judgeTag, '上传照片 end')
}
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);
console.log("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) {
console.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');
@ -606,59 +599,66 @@ export default class Judge {
console.info(judgeTag, '项目结束 end')
promptWxCode('17C55', temp.code || 0)
}
// 检测扣分、结束项目时该项目是否开始
checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => {
if (xmdm == 20) {
return true
private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
private lane: LANE = {
road: '', num: 0, count: 0
}
private videoData?: RecordHandleType
private disConnectNum: number = 0;
//调用监管接口
sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => {
const temp = await writeObjectOut(data, filePath, this.context);
console.log("wzj", JSON.stringify(temp))
//断网&网络超时次数计算
if (temp.code == 2300007 || temp.code == 2300028) {
this.disConnectNum += 1;
if (this.disConnectNum < 5) {
return await this.sendWriteObjectOut(data, filePath)
}
}
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
//如果项目没有开始
console.info('surenjun isUpload=>', isUpload)
if (!isUpload) {
console.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
if (this.disConnectNum >= 5) {
console.info('surenjun', '123')
this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!';
this.judgeUI.disConnectErrorOpen = true
}
this.disConnectNum = 0
return temp
}
// 考试过程照片
uploadProgressPhoto = async (ksxm: number) => {
const time = GetCurrentTime();
const judgeUI = this.judgeUI
const plcData = this.plcData
const photoBase64 = await this.getPhoto();
const carInfo = AppStorage.get<CarInfoType>('carInfo');
const project: ProjectInfo = Reflect.get(judgeUI.projectsObj, ksxm)
const judgeConfig_305: number = Reflect.get(judgeUI.judgeConfigObj, '305')
const drvexam: DrvexamType = {
lsh: judgeUI.lsh,
kskm: carInfo?.examSubject || "2",
ksxm: project.projectCodeCenter,
sfzmhm: judgeUI.idCard,
kchp: encodeURI(carInfo?.plateNo || ""),
zpsj: time,
zp: photoBase64,
cs: Math.floor((judgeConfig_305 == 0 ? (plcData?.gps?.sd || 0) : (plcData?.sensor?.cs || 0)) * 1.852),
ksdd: encodeURI(judgeUI.ksdd)
}
const data: RegulatoryInterfaceParams = {
xtlb: '17',
jkxlh: judgeUI.serialNumber,
jkid: '17C54',
drvexam
};
const temp: WR = await this.sendWriteObjectOut(data, this.filePath);
if (temp.code === 2300007) {
this.isJudgeDisConnect = true
}
promptWxCode('17C54', temp.code || 0)
console.info(judgeTag, '上传照片 end')
}
constructor(judgeUI: JudgeUI) {

View File

@ -1,4 +1,7 @@
import dayTs from './Date';
import fs from '@ohos.file.fs';
import { BusinessError } from '@ohos.base';
import { CommonFileTag } from '../config';
enum timeType {
fulltime = 1
@ -155,4 +158,67 @@ export function DeepClone<T extends Object>(target: T): T {
}
// 如果是原始值,则直接返回
return target;
}
/*
* 检查文件或目录是否存在
* @param path 文件或目录的路径
* @return 返回一个 Promise解析为 true 如果存在,否则为 false
*/
export function IsExit(path: string): Promise<boolean> {
return new Promise((resolve, reject) => {
try {
let res = fs.accessSync(path);
if (res) {
console.info(CommonFileTag, "file exists");
resolve(true);
} else {
console.info(CommonFileTag, "file not exists");
resolve(false);
}
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(CommonFileTag, "accessSync failed with error message: " + err.message + ", error code: " + err.code);
reject(false);
}
});
}
/**
* 创建文件夹
* @param path 文件夹路径
* @return 返回一个 Promise解析为 true 如果创建成功,否则为 false
*/
export function CreateDir(path: string): Promise<boolean> {
return new Promise((resolve, reject) => {
try {
fs.mkdirSync(path);
console.info(CommonFileTag, "Directory created successfully");
resolve(true);
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error(CommonFileTag, "mkdirSync failed with error message: " + err.message + ", error code: " + err.code);
reject(false);
}
});
}
/*
* 将秒数转换为灵活的时间格式HH:MM:SS
* @param seconds 要转换的秒数
* @return 返回格式化后的时间字符串
*/
export function FormatTimeFlexible(seconds: number): string {
if (seconds < 0) throw new Error("秒数不能为负数");
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
const secs = seconds % 60;
// 强制使用两位数格式化,确保始终是 HH:MM:SS
const formattedHours = hours.toString().padStart(2, '0');
const formattedMinutes = minutes.toString().padStart(2, '0');
const formattedSeconds = secs.toString().padStart(2, '0');
return `${formattedHours}:${formattedMinutes}:${formattedSeconds}`;
}

View File

@ -145,4 +145,5 @@ export default class FileUtils {
duration: 4000,
})
}
}
}

View File

@ -1,4 +1,10 @@
import dayTs from '../Date'
import worker from '@ohos.worker'
import { LogWorkerMessage, WorkerMessageType } from '../../model'
class logWorker {
private workerInstance = new worker.ThreadWorker("entry/ets/workers/Log.ets")
// 正常日志
log(msg: string) {
console.log(msg)
@ -18,6 +24,23 @@ class logWorker {
error(msg: string) {
console.error(msg)
}
// 初始化板子,需要判断duolun是否存在,不存在则创建
init() {
this.workerInstance = new worker.ThreadWorker("entry/ets/workers/Log.ets");
let data: LogWorkerMessage = {
type: WorkerMessageType.Init
}
this.workerInstance.postMessage(JSON.stringify(data))
}
// 过程数据初始化
processDataInit(carNo: string, name: string) {
let date = dayTs().format("YYYY_MM_DD_HH_mm_ss");
// 组装文件夹名 2025_06_18_09_14_36_2506474075216_371427200311275216_王宏伟
let folderName = `${date}_${carNo}_${name}`;
// 内部包含文件
}
}
export const dConsole = new logWorker();

View File

@ -103,12 +103,9 @@ export async function InitializeTheCentralTable(params: InitializeTheCentralTabl
let flag = false
// 单机模式
if (params.singlePlay) {
const tableList =
['MA_SYSSET', 'MA_SYSTEMPARM', 'MA_MARKRULE', 'MA_MARKRULESET', 'ES_CARINFO', 'MA_MAP_ROAD', 'MA_MAP_ROAD_LANE',
'MAP_SUBITEM', 'MA_T_CARPARMSET', 'MA_MAP_ITEMCLASS', 'MA_MAP_POINT', 'MA_MAP_POINT_ITEM'];
const tableList = ['MA_SYSSET', 'MA_SYSTEMPARM', 'MA_MARKRULE', 'MA_MARKRULESET', 'ES_CARINFO', 'MA_MAP_ROAD', 'MA_MAP_ROAD_LANE', 'MAP_SUBITEM', 'MA_T_CARPARMSET', 'MA_MAP_ITEMCLASS', 'MA_MAP_POINT', 'MA_MAP_POINT_ITEM']
for (let i = 0; i <= tableList.length - 1; i++) {
const data =
await fileUtil.readFile(GlobalConfig.commonFileWriteAddress + `/config/tableList/${tableList[i]}.txt`);
const data = await fileUtil.readFile(GlobalConfig.commonFileWriteAddress + `/config/tableList/${tableList[i]}.txt`);
flag = await SqlInsertTable(tableList[i], JSON.parse(data) || [])
}
if (!flag) {

View File

@ -1,30 +1,68 @@
import worker, { ThreadWorkerGlobalScope, MessageEvents, ErrorEvent } from '@ohos.worker';
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 dayTs from '../utils/Date';
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
/**
* Defines the event handler to be called when the worker thread receives a message sent by the host thread.
* The event handler is executed in the worker thread.
*
* @param e message data
*/
workerPort.onmessage = (e: MessageEvents) => {
// 日志文件目录
let logPaths: LogPathType = {
log: `${GlobalConfig.commonFileWriteAddress}/logs/${dayTs().format("YYYY_MM_DD")}/log/log.log`,
error: `${GlobalConfig.commonFileWriteAddress}/logs/${dayTs().format("YYYY_MM_DD")}/log/error.log`,
}
let logFileFd: LogFileFd = {}
const result: LogWorkerMessage = JSON.parse(e.data);
if (result.type === WorkerMessageType.Init) {
Init()
}
if (result.type === WorkerMessageType.OpenProcessDataFile) {
OpenProcessDataFile(logPaths, logFileFd, result.data || "")
}
}
// 初始化
async function Init() {
// /mnt/hmdfs/100/account/device_view/local/files/duolun/logs/2024_10_12
// 创建duolun文件夹 /mnt/hmdfs/100/account/device_view/local/files/duolun
const basePath = GlobalConfig.commonFileWriteAddress;
const isExit = await IsExit(basePath!);
if (!isExit) {
// 创建文件夹
await CreateDir(basePath!)
}
// 创建logs文件夹/mnt/hmdfs/100/account/device_view/local/files/duolun/logs
let logPath = `${basePath}/logs`;
const logIsExit = await IsExit(logPath!);
if (!logIsExit) {
// 创建logs文件夹
await CreateDir(logPath);
}
// 创建日期文件夹/mnt/hmdfs/100/account/device_view/local/files/duolun/logs/2024_10_12
let date = dayTs().format("YYYY_MM_DD");
const folderName = `${GlobalConfig.commonFileWriteAddress}/logs/${date}`;
const folderIsExit = await IsExit(folderName!);
if (!folderIsExit) {
// 创建日期文件夹
await CreateDir(folderName);
}
// 创建log文件夹/mnt/hmdfs/100/account/device_view/local/files/duolun/logs/2024_10_12/log
const logFilePath = `${folderName}/log`;
const logDirIsExit = await IsExit(logFilePath);
if (!logDirIsExit) {
// 创建log文件夹
await CreateDir(logFilePath);
}
}
function OpenProcessDataFile(logPaths: LogPathType, logFileFd: LogFileFd, name: string) {
}
/**
* Defines the event handler to be called when the worker receives a message that cannot be deserialized.
* The event handler is executed in the worker thread.
*
* @param e message data
*/
workerPort.onmessageerror = (e: MessageEvents) => {
}
/**
* Defines the event handler to be called when an exception occurs during worker execution.
* The event handler is executed in the worker thread.
*
* @param e error message
*/
workerPort.onerror = (e: ErrorEvent) => {
}