fix: 评判代码抽离优化

This commit is contained in:
wangzhongjie 2025-07-02 15:53:11 +08:00
parent 98813fe361
commit b0692d358c
9 changed files with 634 additions and 547 deletions

View File

@ -477,7 +477,7 @@ export interface JudgeUI {
ksdd: string
errorMsg: string
name: string
kfArrScroller: Scroller
// kfArrScroller: Scroller
disConnectErrorOpen: boolean
currentXmdm?: number
isRequiredProjectsEnd: boolean

View File

@ -24,8 +24,6 @@ import {
LANE,
MA_CDSBINFOType,
MA_ITEMINFOType,
MA_MAP_POINT_ITEMType,
MA_MAP_POINTType,
MA_SYSTEMPARMType,
MAPITEMPOINTITEM,
MAPPOINT,
@ -35,7 +33,6 @@ import {
Project,
ProjectInfo,
ProjectInfos,
ProjectRoads,
RouteParamsType,
SYSSET,
SyssetConfig,
@ -44,7 +41,7 @@ import {
} from '../model';
import { GetSyncData } from '../utils/table/Operation';
import dayTs from '../utils/Date';
import { CutArray, GetCurrentTime } from '../utils/Common';
import { GetCurrentTime } from '../utils/Common';
import FileUtils from '../utils/FileUtils';
import SignalTrajectoryDialog from './Judge/SignalTrajectoryDialog';
import { DefaultJudgeConfigData } from '../mock';
@ -54,6 +51,9 @@ import CarLoadingDialog from './compontents/CarLoading';
import HeaderComponent from './compontents/Header';
import MessageComponent from './Judge/Message';
import OperatingAreaComponent from './Judge/OperatingArea';
import JudgeAndProjectComponent from './Judge/JudgeAndProject';
import { GetIsExitManualProject } from './Judge/utils';
import { InitMapPoint, InitMapPointItem } from './Judge/TableUtils';
@Entry
@ -62,8 +62,6 @@ struct JudgePage {
scroller: Scroller = new Scroller()
//页面通用字体大小
@State wayno: number = 0
@State FONTSIZE: number = 30
@State BIGFONTSIZE: number = 32
@State isDdxk: boolean = false;
@State time: string = ''
//考试用时
@ -139,7 +137,6 @@ struct JudgePage {
//定位差分状态时候正常
@State isDwztRight: boolean = true;
@State defaultTabIndex: number = 0;
public kfArrScroller: Scroller = new Scroller()
//档位
@State dw: string = ''
//速度
@ -246,8 +243,8 @@ struct JudgePage {
// 科目三新增读取表数据
if (this.examSubject == '3') {
await this.initMapPoint()
await this.initMapPointItem()
this.mapPointArr = await InitMapPoint()
this.mapPointItemArr = await InitMapPointItem()
//定时上传考试里程
// let mileageTimer = setInterval(()=>{
// this.uploadMileage()
@ -624,40 +621,6 @@ struct JudgePage {
}
// 初始化mapPoint表
async initMapPoint() {
const pointParams: MA_MAP_POINTType[] = await GetSyncData<MA_MAP_POINTType>('MA_MAP_POINT')
pointParams.forEach(item => {
this.mapPointArr.push({
point_no: Number(item.point_no),
gps_e: Number(item.gps_e),
gps_n: Number(item.gps_n),
point_no_f: Number(item.point_no_f),
point_type: Number(item.point_type),
road_code: item.road_code!,
gps_e_Location: Number(item.gps_e_location),
gps_n_Location: Number(item.gps_n_location),
f_gps_e: Number(item.f_gps_e),
f_gps_n: Number(item.f_gps_n),
passed: Number(item.passed)
})
})
}
// 初始化mapPointItem表
async initMapPointItem() {
const pointItemPoints: MA_MAP_POINT_ITEMType[] = await GetSyncData<MA_MAP_POINT_ITEMType>('MA_MAP_POINT_ITEM');
pointItemPoints.forEach(item => {
this.mapPointItemArr.push({
point_no: Number(item.point_no),
itemno: Number(item.itemno),
itemno1: Number(item.itemno1),
subname: item.subname!
})
})
}
// 初始化本地systemparam表、markrule表
async initTrajectoryParam(trajectoryPath: string) {
const isTrajectoryOpen = JudgeConfig.isTrajectoryOpen
@ -734,199 +697,28 @@ struct JudgePage {
wayno: this.wayno,
judgeConfigObj: this.judgeConfigObj,
})
Column() {
Row() {
Text(this.carztStr).fontColor('#FFA500').fontSize(this.FONTSIZE)
if (Reflect.get(this.judgeConfigObj, '342') == '0') {
Text(`${this.dw}挡`).fontColor('#FFA500').fontSize(this.FONTSIZE).padding({ left: 15, right: 15 })
Text(`${this.sd}km/h`).fontColor('#FFA500').fontSize(this.FONTSIZE)
}
}.height(40)
Row() {
Flex({ direction: FlexDirection.Column }) {
if (this.kfArr.length) {
List({ scroller: this.kfArrScroller }) {
ForEach(this.kfArr, (item: MarkRule) => {
ListItem() {
Column() {
Row() {
Text(item.xmmcStr).fontSize(this.BIGFONTSIZE).fontColor('#FFF')
Text(`${item.score}分`).fontSize(this.BIGFONTSIZE).fontColor('#FFF')
}
.width('100%')
.backgroundColor('#38260B')
.justifyContent(FlexAlign.SpaceBetween)
.padding({
top: 12,
bottom: 12,
left: 8,
right: 5
})
Text(item.desc + `(${item.markcatalog})`)
.fontSize(this.BIGFONTSIZE)
.fontColor('#E5CBA1')
.margin({
top: 10,
bottom: 8,
left: 5,
right: 5
})
}.margin({ top: 15 }).alignItems(HorizontalAlign.Start)
}.margin({ bottom: 25 })
})
}
.padding({
left: 15,
right: 15,
top: 30,
bottom: 5
})
} else {
Column() {
Row() {
Text('暂无扣分项').fontSize(this.BIGFONTSIZE).fontColor('#FFF')
}
.width('100%')
.backgroundColor('#38260B')
.justifyContent(FlexAlign.SpaceBetween)
.padding({
top: 12,
bottom: 12,
left: 8,
right: 3
})
}.margin({ top: 35 }).padding({ left: 20, right: 20 }).alignItems(HorizontalAlign.Start)
}
}
.backgroundImage($rawfile('judge/score_bg.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width(514)
.height(618)
.padding({
top: 18,
bottom: 15,
left: 13,
right: 14
})
//科目二
if (this.examSubject == "2") {
Flex({ wrap: FlexWrap.Wrap, direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) {
List({}) {
ForEach(CutArray(this.projects, 2), (item: [ProjectInfo, ProjectInfo]) => {
ListItem() {
Row() {
Row() {
//#FF7566 #00FFD5 #E6DECF
// Text(this.projectsObj[item[0].projectCode])
Text(item[0].abbreviation)
.fontSize(item[0].abbreviation!.length > 5 ? 28 : 32)
.fontColor(this.getProjectColor(item[0]))
}
.backgroundImage($rawfile('judge/project_item.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width('48.5%')
.height(115)
.margin({ bottom: 5 })
.justifyContent(FlexAlign.Center)
if (item[1]) {
Row() {
//#FF7566 #00FFD5 #E6DECF
Text(item[1].abbreviation)
.fontSize(item[1].abbreviation.length > 5 ? 28 : 32)
.fontColor(this.getProjectColor(item[1]))
}
.backgroundImage($rawfile('judge/project_item.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width('48.5%')
.height(115)
.margin({ left: 5, bottom: 5 })
.justifyContent(FlexAlign.Center)
}
}
}
});
}
}
.backgroundImage($rawfile('judge/project_bg.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width('57%')
.height('100%')
.padding(30)
.margin({ right: 10 })
}
//科目三
if (this.examSubject == '3') {
Column() {
Flex({
wrap: FlexWrap.Wrap,
direction: FlexDirection.Row,
justifyContent: FlexAlign.SpaceBetween
}) {
List({}) {
ForEach(this.projects, (project: ProjectInfo) => {
ListItem() {
Text(project.name) {
}
.fontColor(this.getProjectColor(project))
.margin({ bottom: 2 })
.fontSize(24)
}.margin({ bottom: 2 })
})
}.lanes(2).margin({ left: 25 })
}
.width('100%')
.height('57%')
.backgroundImage($rawfile('judge/project_km3_bg.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.padding(30)
.margin({ right: 5 })
if (this.projects.length) {
Flex({
wrap: FlexWrap.Wrap,
direction: FlexDirection.Row,
justifyContent: FlexAlign.SpaceAround
}) {
List() {
ForEach(this.artSubject3Projects, (item: string, index) => {
ListItem() {
}
.backgroundImage(
$rawfile(
`judge/km3/${this.getIsExitManualProject(index) ? (this.getIsEndManualProject(index)) :
(item + '_gray')}.png`
), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width(174)
.height(118 * 0.95)
.margin({ bottom: 8 })
.onClick(() => {
// this.vocObj.playAudio({
// type: 1,
// name: 'button_media.wav'
// })
this.setManualProjectFn(index)
})
})
}.lanes(3).margin({ left: 5, top: 12 })
}
}
}
.backgroundImage($rawfile('judge/project_bg.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width(660)
.height(640)
.padding(44)
.margin({ right: 10 })
}
}.margin({ top: 15 }).height('80%').justifyContent(FlexAlign.SpaceBetween)
}.width('100%').height('100%').alignItems(HorizontalAlign.Start).margin({ top: 10 })
// 扣分列表和评判列表
JudgeAndProjectComponent({
carztStr: this.carztStr,
judgeConfigObj: this.judgeConfigObj,
dw: this.dw,
sd: this.sd,
kfArr: this.kfArr,
examSubject: this.examSubject,
projects: this.projects,
artSubject3Projects: this.artSubject3Projects,
artSubject3ProjectsCodesArr: this.artSubject3ProjectsCodesArr,
projectsObj: this.projectsObj,
isManualProjectIn: this.isManualProjectIn,
isProjectIn: this.isProjectIn,
jl: this.jl,
examMileage: this.examMileage,
isRequiredProjectsEnd: this.isRequiredProjectsEnd,
lane: this.lane,
examClick: (index: number) => {
this.setManualProjectFn(index)
}
})
}.height('100%').alignItems(HorizontalAlign.Start)
}.width('75%').height('100%')
@ -1035,43 +827,23 @@ struct JudgePage {
},
})
}
if (this.disConnectErrorOpen) {
}
}
.height('100%').backgroundColor('#000').justifyContent(FlexAlign.Start)
}
getProjectColor(project: ProjectInfo) {
const type = project.type;
switch (type) {
case '1':
return '#E6DECF';
case '2':
return '#FFAD33';
case '3':
return '#ff109d0a';
case '4':
return '#FF7566';
default:
return '#E6DECF';
}
}
//人工项目操作
async setManualProjectFn(index: number) {
const isManualProjectIn = this.isManualProjectIn;
const getIsExitManualProject = this.getIsExitManualProject;
const artSubject3ProjectsCodesArr = this.artSubject3ProjectsCodesArr;
const projectsObj = this.projectsObj;
const projectCode = artSubject3ProjectsCodesArr[index]
let sideParkingStatus = GetIsExitManualProject(index, this.judgeConfigObj, this.artSubject3ProjectsCodesArr, this.projectsObj, this.carztStr, this.isManualProjectIn, this.isProjectIn, this.jl, this.examMileage, this.isRequiredProjectsEnd, this.lane)
if (index === 5) {
dConsole.info(JudgeTag, 'surenjun 靠边停车状态=> ', getIsExitManualProject(index))
dConsole.info(JudgeTag, 'surenjun 靠边停车状态=> ', sideParkingStatus)
}
const currentProject: ProjectInfo = Reflect.get(projectsObj, projectCode)
if (getIsExitManualProject(index)) {
if (sideParkingStatus) {
// 正在进行的项目 取消项目
if (isManualProjectIn && currentProject.type == '2') {
//判断人工是否能取消项目 && 当前项目有扣分的不能取消
@ -1113,169 +885,5 @@ struct JudgePage {
}
}
}
// 获取是否能人工进项目
getIsExitManualProject = (index: number) => {
const judgeConfigObj = this.judgeConfigObj;
const artSubject3ProjectsCodesArr = this.artSubject3ProjectsCodesArr;
const projectsObj = this.projectsObj;
const carztStr = this.carztStr;
const isManualProjectIn = this.isManualProjectIn;
const isProjectIn = this.isProjectIn;
const getProjectIsInRoad = this.getProjectIsInRoad;
const projectCode = artSubject3ProjectsCodesArr[index];
const currentProject: ProjectInfo = Reflect.get(projectsObj, projectCode)
if (currentProject === undefined) {
return false
}
const projectType = currentProject.type;
//不允许人工触发的项目列表,以","分隔
const unExitManualProjects: string[] = Reflect.get(this.judgeConfigObj, '332').split(',') || [];
//直线行驶中不进其他考试项目(0-否 1-是)
const param348: string = Reflect.get(this.judgeConfigObj, '348') || '0',
//里程不够允许手工点靠边停车0-否 1-是)
param387: string = Reflect.get(this.judgeConfigObj, '387') || '0',
//里程不够不报靠边停车0-否+1-是+2-必考项目未完成且里程不够不报项目)
param319: string = Reflect.get(this.judgeConfigObj, '319') || '0',
//人工项目是否能取消 1:可取消;
param340: string = Reflect.get(this.judgeConfigObj, '340') || '0',
//307参数里设置的项目项目已经做过后续不能人工触发
param307: string[] = (Reflect.get(this.judgeConfigObj, '307') || '').split(',');
//非行驶状态(没有速度),人工项目不能触发(按钮灰色)
if (carztStr === '停车') {
return false
}
//车上是否能进行人工操作(0-能1-不能人工评判2-不能人工进项目3-都不能)
if (Reflect.get(this.judgeConfigObj, '342') === '3' || Reflect.get(this.judgeConfigObj, '342') === '2') {
return false
}
//不允许人工触发的项目列表
if (unExitManualProjects.includes(artSubject3ProjectsCodesArr[index])) {
return false
}
//项目进行中不能人工触发
if (isProjectIn) {
if (param340 == '1') {
if (isManualProjectIn && (currentProject.type == '2')) {
return true
} else {
return false
}
}
return false
}
//项目路段信息判断
if (!getProjectIsInRoad(projectCode + '')) {
return false
}
const project_9: ProjectInfo = Reflect.get(projectsObj, '9')
// 直线行驶中不进其他考试项目(0-否 1-是)
if (param348 == '0' && project_9.type == '2') {
return index === 0 ? true : false
}
//项目已经做过,后续不能人工触发
if (param307.includes(projectCode) && (projectType == '3' || projectType == '4')) {
return false
}
//319不为0或者387不为1里程不够时靠边停车项目不能触发
if ((param387 != '1' || param319 != '0') && index === 5) {
const examMileage = this.examMileage
const isRequiredProjectsEnd = this.isRequiredProjectsEnd
const jl = this.jl
//里程是否达标 && 必考项目是否全完成
return jl >= Number(examMileage) && isRequiredProjectsEnd
}
return true
}
// 判断项目是否在当前路段号
getProjectIsInRoad = (projectCode: string,) => {
const judgeConfigObj = this.judgeConfigObj;
const lane = this.lane;
const road = lane.road;
const num = lane.num;
const count = lane.count;
const param_3: string[] = (Reflect.get(this.judgeConfigObj, '514')?.split(',') || []);
const param_4: string[] = (Reflect.get(this.judgeConfigObj, '515')?.split(',') || []);
const param_10: string[] = (Reflect.get(this.judgeConfigObj, '516')?.split(',') || []);
const param_11: string[] = (Reflect.get(this.judgeConfigObj, '517')?.split(',') || []);
const param_9: string[] = (Reflect.get(this.judgeConfigObj, '518')?.split(',') || []);
const param_12: string[] = (Reflect.get(this.judgeConfigObj, '519')?.split(',') || []);
const projectRoads: ProjectRoads = {
//直线行驶
param_3,
//变更车道
param_4,
//超车
param_10,
//靠边停车
param_11,
//会车
param_9,
//掉头
param_12,
};
//未测绘得道路上或者不在差分状态
if (road === '') {
return false
}
const currentProjectRoad: string[] = Reflect.get(projectRoads, `param_${projectCode}`)
if (currentProjectRoad.length == 0) {
return true
}
//设置了514-519参数只能在设置的路段触发对应项目
if (currentProjectRoad.includes(road)) {
//如果525为1则514-519设置的路段不能触发对应项目
if (Reflect.get(this.judgeConfigObj, '525') == '1') {
return false
}
} else {
return false
}
//405参数为2是如果在最左侧车道超车项目不能触发;
if (projectCode == '10' &&
Reflect.get(this.judgeConfigObj, '405') == '2' &&
(num === count) &&
num > 0
) {
return false
}
// 车道总数少于2条超车和变道不能触发
if (projectCode == '10' || projectCode == '4') {
if (count < 2) {
return false
}
}
return true
}
// 获取人工项目是否已做
getIsEndManualProject = (index: number) => {
const projectName = this.artSubject3Projects[index];
const projectCode = this.artSubject3ProjectsCodesArr[index];
const currentProject: ProjectInfo = Reflect.get(this.projectsObj, projectCode)
const type = currentProject.type
if (type == '2') {
return projectName
}
return (type == '3' || type == '4') ? `${projectName}_red` : `${projectName}_green`;
}
}

View File

@ -0,0 +1,254 @@
import { JudgeTag } from '../../config';
import { DefaultJudgeConfigObj, LANE, MarkRule, ProjectInfo, ProjectInfos } from '../../model';
import { CutArray } from '../../utils/Common';
import { dConsole } from '../../utils/LogWorker';
import { GetIsEndManualProject, GetIsExitManualProject } from './utils';
@Component
export default struct JudgeAndProjectComponent {
public kfArrScroller: Scroller = new Scroller()
@Prop carztStr: string
@Prop judgeConfigObj: DefaultJudgeConfigObj
@Prop dw: string
@Prop sd: string
@Prop @Watch("scrollLengthChange") kfArr: MarkRule[]
@Prop examSubject: string
@Prop projects: ProjectInfo[]
@Prop artSubject3Projects: string[]
@Prop artSubject3ProjectsCodesArr: string[]
@Prop projectsObj: ProjectInfos
@Prop isManualProjectIn: boolean
@Prop isProjectIn: boolean
@Prop jl: number
@Prop examMileage: string
@Prop isRequiredProjectsEnd: boolean
@Prop lane: LANE
examClick: (index: number) => void = (index: number) => {
}
scrollLengthChange(data: MarkRule[]) {
dConsole.log(JudgeTag, "容器滚动", data.length)
if (data.length > 4) {
this.kfArrScroller.scrollTo({
yOffset: 999999, xOffset: 0
})
}
}
getProjectColor(project: ProjectInfo) {
const type = project.type;
switch (type) {
case '1':
return '#E6DECF';
case '2':
return '#FFAD33';
case '3':
return '#ff109d0a';
case '4':
return '#FF7566';
default:
return '#E6DECF';
}
}
build() {
Column() {
Row() {
Text(this.carztStr).fontColor('#FFA500').fontSize(30)
if (Reflect.get(this.judgeConfigObj, '342') == '0') {
Text(`${this.dw}挡`).fontColor('#FFA500').fontSize(30).padding({ left: 15, right: 15 })
Text(`${this.sd}km/h`).fontColor('#FFA500').fontSize(30)
}
}.height(40)
Row() {
Flex({ direction: FlexDirection.Column }) {
if (this.kfArr.length) {
List({ scroller: this.kfArrScroller }) {
ForEach(this.kfArr, (item: MarkRule) => {
ListItem() {
Column() {
Row() {
Text(item.xmmcStr).fontSize(32).fontColor('#FFF')
Text(`${item.score}分`).fontSize(32).fontColor('#FFF')
}
.width('100%')
.backgroundColor('#38260B')
.justifyContent(FlexAlign.SpaceBetween)
.padding({
top: 12,
bottom: 12,
left: 8,
right: 5
})
Text(item.desc + `(${item.markcatalog})`)
.fontSize(32)
.fontColor('#E5CBA1')
.margin({
top: 10,
bottom: 8,
left: 5,
right: 5
})
}.margin({ top: 15 }).alignItems(HorizontalAlign.Start)
}.margin({ bottom: 25 })
})
}
.padding({
left: 15,
right: 15,
top: 30,
bottom: 5
})
} else {
Column() {
Row() {
Text('暂无扣分项').fontSize(32).fontColor('#FFF')
}
.width('100%')
.backgroundColor('#38260B')
.justifyContent(FlexAlign.SpaceBetween)
.padding({
top: 12,
bottom: 12,
left: 8,
right: 3
})
}.margin({ top: 35 }).padding({ left: 20, right: 20 }).alignItems(HorizontalAlign.Start)
}
}
.backgroundImage($rawfile('judge/score_bg.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width(514)
.height(618)
.padding({
top: 18,
bottom: 15,
left: 13,
right: 14
})
//科目二
if (this.examSubject == "2") {
Flex({ wrap: FlexWrap.Wrap, direction: FlexDirection.Row, justifyContent: FlexAlign.SpaceBetween }) {
List({}) {
ForEach(CutArray(this.projects, 2), (item: [ProjectInfo, ProjectInfo]) => {
ListItem() {
Row() {
Row() {
//#FF7566 #00FFD5 #E6DECF
// Text(this.projectsObj[item[0].projectCode])
Text(item[0].abbreviation)
.fontSize(item[0].abbreviation!.length > 5 ? 28 : 32)
.fontColor(this.getProjectColor(item[0]))
}
.backgroundImage($rawfile('judge/project_item.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width('48.5%')
.height(115)
.margin({ bottom: 5 })
.justifyContent(FlexAlign.Center)
if (item[1]) {
Row() {
//#FF7566 #00FFD5 #E6DECF
Text(item[1].abbreviation)
.fontSize(item[1].abbreviation.length > 5 ? 28 : 32)
.fontColor(this.getProjectColor(item[1]))
}
.backgroundImage($rawfile('judge/project_item.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width('48.5%')
.height(115)
.margin({ left: 5, bottom: 5 })
.justifyContent(FlexAlign.Center)
}
}
}
});
}
}
.backgroundImage($rawfile('judge/project_bg.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width('57%')
.height('100%')
.padding(30)
.margin({ right: 10 })
}
//科目三
if (this.examSubject == '3') {
Column() {
Flex({
wrap: FlexWrap.Wrap,
direction: FlexDirection.Row,
justifyContent: FlexAlign.SpaceBetween
}) {
List({}) {
ForEach(this.projects, (project: ProjectInfo) => {
ListItem() {
Text(project.name) {
}
.fontColor(this.getProjectColor(project))
.margin({ bottom: 2 })
.fontSize(24)
}.margin({ bottom: 2 })
})
}.lanes(2).margin({ left: 25 })
}
.width('100%')
.height('57%')
.backgroundImage($rawfile('judge/project_km3_bg.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.padding(30)
.margin({ right: 5 })
if (this.projects.length) {
Flex({
wrap: FlexWrap.Wrap,
direction: FlexDirection.Row,
justifyContent: FlexAlign.SpaceAround
}) {
List() {
ForEach(this.artSubject3Projects, (item: string, index) => {
ListItem() {
}
// $rawfile(
// `judge/km3/${this.getIsExitManualProject(index) ? (this.getIsEndManualProject(index)) :
// (item + '_gray')}.png`
// )
.backgroundImage(
$rawfile(
`judge/km3/${GetIsExitManualProject(index, this.judgeConfigObj, this.artSubject3ProjectsCodesArr, this.projectsObj, this.carztStr, this.isManualProjectIn, this.isProjectIn, this.jl, this.examMileage, this.isRequiredProjectsEnd, this.lane) ? (GetIsEndManualProject(index, this.artSubject3Projects, this.artSubject3ProjectsCodesArr, this.projectsObj)) :
(item + '_gray')}.png`
), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width(174)
.height(118 * 0.95)
.margin({ bottom: 8 })
.onClick(() => {
// this.vocObj.playAudio({
// type: 1,
// name: 'button_media.wav'
// })
this.examClick(index)
// this.setManualProjectFn(index)
})
})
}.lanes(3).margin({ left: 5, top: 12 })
}
}
}
.backgroundImage($rawfile('judge/project_bg.png'), ImageRepeat.NoRepeat)
.backgroundImageSize({ width: '100%', height: '100%' })
.width(660)
.height(640)
.padding(44)
.margin({ right: 10 })
}
}.margin({ top: 15 }).height('80%').justifyContent(FlexAlign.SpaceBetween)
}.width('100%').height('100%').alignItems(HorizontalAlign.Start).margin({ top: 10 })
}
}

View File

@ -0,0 +1,8 @@
@CustomDialog
export default struct ManualConfirmationOfSubjectThreeProjectsDialog {
private controller?: CustomDialogController
build() {
}
}

View File

@ -82,10 +82,6 @@ export default struct OperatingAreaComponent {
.backgroundImageSize({ width: '100%', height: '100%' })
.margin({ bottom: 10 })
.onClick(() => {
// this.vocObj.playAudio({
// type: 1,
// name: 'button_media.wav'
// })
// this.isDeductedPopShow = true
this.artificialEvaluationClick()
})

View File

@ -0,0 +1,8 @@
@CustomDialog
export default struct SubjectThreeManualDeductionOfPointsDialog {
private controller?: CustomDialogController
build() {
}
}

View File

@ -0,0 +1,40 @@
import { MA_MAP_POINT_ITEMType, MA_MAP_POINTType, MAPITEMPOINTITEM, MAPPOINT } from '../../model';
import { GetSyncData } from '../../utils/table/Operation';
/**
* 初始化mapPoint表
* @returns {Promise<MAPPOINT[]>} 返回mapPoint表数据
*/
export const InitMapPoint = async (): Promise<MAPPOINT[]> => {
const pointParams = await GetSyncData<MA_MAP_POINTType>('MA_MAP_POINT');
if (pointParams.length === 0) return [];
return pointParams.map(item => ({
point_no: Number(item.point_no),
gps_e: Number(item.gps_e),
gps_n: Number(item.gps_n),
point_no_f: Number(item.point_no_f),
point_type: Number(item.point_type),
road_code: item.road_code || "",
gps_e_Location: Number(item.gps_e_location),
gps_n_Location: Number(item.gps_n_location),
f_gps_e: Number(item.f_gps_e),
f_gps_n: Number(item.f_gps_n),
passed: Number(item.passed),
} as MAPPOINT));
};
/**
* 初始化mapPointItem表
* @returns {Promise<MAPITEMPOINTITEM[]>} 返回mapPointItem表数据
*/
export const InitMapPointItem = async (): Promise<MAPITEMPOINTITEM[]> => {
const pointItemPoints: MA_MAP_POINT_ITEMType[] = await GetSyncData<MA_MAP_POINT_ITEMType>('MA_MAP_POINT_ITEM');
if (pointItemPoints.length === 0) return [];
return pointItemPoints.map(item => ({
point_no: Number(item.point_no),
itemno: Number(item.itemno),
itemno1: Number(item.itemno1),
subname: item.subname ?? ""
} as MAPITEMPOINTITEM))
}

View File

@ -1,6 +1,18 @@
import systemTime from '@ohos.systemDateTime';
import { TestRealExam } from '../../mock';
import { CarInfoType, ExtendType, Gps, LANE, PLCType, Radar, Vision } from '../../model';
import {
CarInfoType,
DefaultJudgeConfigObj,
ExtendType,
Gps,
LANE,
PLCType,
ProjectInfo,
ProjectInfos,
ProjectRoads,
Radar,
Vision
} from '../../model';
import { ArrayToByteArray, NumberToByteArray } from '../../utils/Common';
import dayTs from '../../utils/Date';
import { dConsole } from '../../utils/LogWorker';
@ -658,3 +670,164 @@ export function sendRed() {
const arrRedBuffer = ArrayToByteArray(arrRed).buffer
// globalThis.lightLineUdp.send(arrRedBuffer);
}
// 获取是否能人工进项目
export const GetIsExitManualProject = (index: number, judgeConfigObj: DefaultJudgeConfigObj, artSubject3ProjectsCodesArr: string[], projectsObj: ProjectInfos, carztStr: string, isManualProjectIn: boolean, isProjectIn: boolean, jl: number, examMileage: string, isRequiredProjectsEnd: boolean, lane: LANE): boolean => {
// const judgeConfigObj = this.judgeConfigObj;
// const artSubject3ProjectsCodesArr = this.artSubject3ProjectsCodesArr;
// const projectsObj = this.projectsObj;
// const carztStr = this.carztStr;
// const isManualProjectIn = this.isManualProjectIn;
// const isProjectIn = this.isProjectIn;
// const getProjectIsInRoad = this.getProjectIsInRoad;
const projectCode = artSubject3ProjectsCodesArr[index];
const currentProject: ProjectInfo = Reflect.get(projectsObj, projectCode)
if (currentProject === undefined) {
return false
}
const projectType = currentProject.type;
//不允许人工触发的项目列表,以","分隔
const unExitManualProjects: string[] = Reflect.get(judgeConfigObj, '332').split(',') || [];
//直线行驶中不进其他考试项目(0-否 1-是)
const param348: string = Reflect.get(judgeConfigObj, '348') || '0',
//里程不够允许手工点靠边停车0-否 1-是)
param387: string = Reflect.get(judgeConfigObj, '387') || '0',
//里程不够不报靠边停车0-否+1-是+2-必考项目未完成且里程不够不报项目)
param319: string = Reflect.get(judgeConfigObj, '319') || '0',
//人工项目是否能取消 1:可取消;
param340: string = Reflect.get(judgeConfigObj, '340') || '0',
//307参数里设置的项目项目已经做过后续不能人工触发
param307: string[] = (Reflect.get(judgeConfigObj, '307') || '').split(',');
//非行驶状态(没有速度),人工项目不能触发(按钮灰色)
if (carztStr === '停车') {
return false
}
//车上是否能进行人工操作(0-能1-不能人工评判2-不能人工进项目3-都不能)
if (Reflect.get(judgeConfigObj, '342') === '3' || Reflect.get(judgeConfigObj, '342') === '2') {
return false
}
//不允许人工触发的项目列表
if (unExitManualProjects.includes(artSubject3ProjectsCodesArr[index])) {
return false
}
//项目进行中不能人工触发
if (isProjectIn) {
if (param340 == '1') {
if (isManualProjectIn && (currentProject.type == '2')) {
return true
} else {
return false
}
}
return false
}
//项目路段信息判断
if (!GetProjectIsInRoad(projectCode + '', lane, judgeConfigObj)) {
return false
}
const project_9: ProjectInfo = Reflect.get(projectsObj, '9')
// 直线行驶中不进其他考试项目(0-否 1-是)
if (param348 == '0' && project_9.type == '2') {
return index === 0 ? true : false
}
//项目已经做过,后续不能人工触发
if (param307.includes(projectCode) && (projectType == '3' || projectType == '4')) {
return false
}
//319不为0或者387不为1里程不够时靠边停车项目不能触发
if ((param387 != '1' || param319 != '0') && index === 5) {
//里程是否达标 && 必考项目是否全完成
return jl >= Number(examMileage) && isRequiredProjectsEnd
}
return true
}
// 判断项目是否在当前路段号
export const GetProjectIsInRoad = (projectCode: string, lane: LANE, judgeConfigObj: DefaultJudgeConfigObj): boolean => {
// const lane = this.lane;
const road = lane.road;
const num = lane.num;
const count = lane.count;
const param_3: string[] = (Reflect.get(judgeConfigObj, '514')?.split(',') || []);
const param_4: string[] = (Reflect.get(judgeConfigObj, '515')?.split(',') || []);
const param_10: string[] = (Reflect.get(judgeConfigObj, '516')?.split(',') || []);
const param_11: string[] = (Reflect.get(judgeConfigObj, '517')?.split(',') || []);
const param_9: string[] = (Reflect.get(judgeConfigObj, '518')?.split(',') || []);
const param_12: string[] = (Reflect.get(judgeConfigObj, '519')?.split(',') || []);
const projectRoads: ProjectRoads = {
//直线行驶
param_3,
//变更车道
param_4,
//超车
param_10,
//靠边停车
param_11,
//会车
param_9,
//掉头
param_12,
};
//未测绘得道路上或者不在差分状态
if (road === '') {
return false
}
const currentProjectRoad: string[] = Reflect.get(projectRoads, `param_${projectCode}`)
if (currentProjectRoad.length == 0) {
return true
}
//设置了514-519参数只能在设置的路段触发对应项目
if (currentProjectRoad.includes(road)) {
//如果525为1则514-519设置的路段不能触发对应项目
if (Reflect.get(judgeConfigObj, '525') == '1') {
return false
}
} else {
return false
}
//405参数为2是如果在最左侧车道超车项目不能触发;
if (projectCode == '10' &&
Reflect.get(judgeConfigObj, '405') == '2' &&
(num === count) &&
num > 0
) {
return false
}
// 车道总数少于2条超车和变道不能触发
if (projectCode == '10' || projectCode == '4') {
if (count < 2) {
return false
}
}
return true
}
// 获取人工项目是否已做
export const GetIsEndManualProject = (index: number, artSubject3Projects: string[], artSubject3ProjectsCodesArr: string[], projectsObj: ProjectInfos): string => {
const projectName = artSubject3Projects[index];
const projectCode = artSubject3ProjectsCodesArr[index];
const currentProject: ProjectInfo = Reflect.get(projectsObj, projectCode)
const type = currentProject.type
if (type == '2') {
return projectName
}
return (type == '3' || type == '4') ? `${projectName}_red` : `${projectName}_green`;
}

View File

@ -184,37 +184,6 @@ export default class Judge {
private isExamEnd: boolean
// 是否发送udp
private isUdpEnd: boolean = false
// 处理udp plc信号
handleUdp = async (msg: string) => {
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const plcData = await this.getPlcData(msg);
// 4.过程数据
await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
//检测到有无锡所设备接入,需要发送特定的数据,供检测
// if (this.usbService.isWXUSBDevice) {
// const str = await senorToWXDataStr(msg);
// this.usbService.sendUSB(str)
// }
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + ''
//TODO 暂时关闭差分检测异常
// await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt);
if (!this.isExamEnd) {
await examJudgeRealExam(plcData)
}
// let udpIndex = AppStorage.get<number>('udpIndex') || 0;
// if (udpIndex % 5 === 0 && !this.isUdpEnd) {
// TODO UPD缺失
// const judgeUdp = globalThis.judgeUdp
// const bytes = await this.getMessageHeartbeat(this.isExamEnd);
// judgeUdp.send(bytes)
// }
// AppStorage.setOrCreate('udpIndex', udpIndex++)
}
//是否手动结束考试
private isManual: boolean = false
//UDP服务序列号
@ -261,60 +230,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 () => {
@ -478,6 +393,37 @@ export default class Judge {
AppStorage.setOrCreate('msgStr', plc)
return tempData
}
// 处理udp plc信号
handleUdp = async (msg: string) => {
const stachArr = msg.split(',')
if (stachArr[0] != '#DN_GD' || this.isUdpEnd) {
return
}
const plcData = await this.getPlcData(msg);
// 4.过程数据
await this.fileLog?.setExamJudgeData(JSON.stringify(plcData))
//检测到有无锡所设备接入,需要发送特定的数据,供检测
// if (this.usbService.isWXUSBDevice) {
// const str = await senorToWXDataStr(msg);
// this.usbService.sendUSB(str)
// }
const param350: number = Reflect.get(this.judgeUI.judgeConfigObj, '350')
this.judgeUI.sd = ((param350 == 0 ? plcData.gps.sd : plcData.sensor.cs) as number * 1.852).toFixed(0) + ''
this.judgeUI.dw = (Math.floor(plcData.sensor.dw as number) || 0) + ''
//TODO 暂时关闭差分检测异常
// await this.checkDwzt(plcData.gps.dwzt,plcData.gps.jdzt);
if (!this.isExamEnd) {
await examJudgeRealExam(plcData)
}
// let udpIndex = AppStorage.get<number>('udpIndex') || 0;
// if (udpIndex % 5 === 0 && !this.isUdpEnd) {
// TODO UPD缺失
// const judgeUdp = globalThis.judgeUdp
// const bytes = await this.getMessageHeartbeat(this.isExamEnd);
// judgeUdp.send(bytes)
// }
// AppStorage.setOrCreate('udpIndex', udpIndex++)
}
// 处理轨迹plc信号
handleTrajectoryUdp = async (strArr: string[]) => {
let num = 2;
@ -515,9 +461,9 @@ export default class Judge {
}
//本地轨迹回放地址
private trajectoryPath: string
//当前科目二的考试项目
// private currentKm2ItemsObj: any
private isTrajectoryOpen: boolean;
//当前科目二的考试项目
// 调代理接口是否断网了
private isJudgeDisConnect: boolean = false;
// 断网数据补传
@ -532,33 +478,6 @@ export default class Judge {
const code = await writeObjectOut(JSON.parse(examDataStr), "", this.context);
}
}
private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
private lane: LANE = {
road: '', num: 0, count: 0
}
private videoData?: RecordHandleType
private disConnectNum: number = 0;
//调用监管接口
sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => {
const temp = await writeObjectOut(data, filePath, this.context);
dConsole.log(JudgeTag, "wzj", JSON.stringify(temp))
//断网&网络超时次数计算
if (temp.code == 2300007 || temp.code == 2300028) {
this.disConnectNum += 1;
if (this.disConnectNum < 5) {
return await this.sendWriteObjectOut(data, filePath)
}
}
if (this.disConnectNum >= 5) {
dConsole.info('surenjun', '123')
this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!';
this.judgeUI.disConnectErrorOpen = true
}
this.disConnectNum = 0
return temp
}
// 项目开始接口同步
beginProject = async (ksxm: number) => {
const carInfo = AppStorage.get<CarInfoType>('carInfo');
@ -662,6 +581,87 @@ export default class Judge {
UploadRegulatoryCodeConversion('17C54', temp.code || 0)
dConsole.info(JudgeTag, '上传照片 end')
}
// 检测扣分、结束项目时该项目是否开始
checkProjectIsStart = async (xmdm: number, currentType: 1 | 2, kf?: MarkRule) => {
if (xmdm == 20) {
return true
}
const judgeUI = this.judgeUI;
const judgeTask = this.judgeTask;
const projectsObj: object = this.judgeUI.projectsObj
const currentProject: ProjectInfo = Reflect.get(projectsObj, xmdm)
const isUpload = currentProject.isUpload
//如果项目没有开始
dConsole.info(JudgeTag, 'surenjun isUpload=>', isUpload)
if (!isUpload) {
dConsole.info(JudgeTag, '项目补传开始')
//项目开始补传
judgeTask.addTask(async () => {
await this.beginProject(xmdm)
}, {
isDelay: true
})
judgeTask.addTask(async () => {
await this.uploadProgressPhoto(xmdm)
}, {
isDelay: true
})
currentProject.isUpload = true;
Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject)
//扣分补传
if (currentType == 2) {
judgeTask.addTask(async () => {
await this.pointsDedute(xmdm, kf!)
}, {
isDelay: true
})
}
//扣分补传判断是否合格 不合格补传项目结束
if (currentType == 1 || (currentType == 2 && this.totalScore < judgeUI.passingScore)) {
judgeTask.addTask(async () => {
await this.endProject(xmdm)
}, {
isDelay: true
})
currentProject.isEnd = true;
Reflect.set(this.judgeUI.projectsObj, xmdm, currentProject)
}
judgeTask.addTask(async () => {
this.checkExamIsEnd()
})
return false;
} else {
return true
}
}
private artSubject3ProjectsCodesArr: number[] = [3, 9, 4, 10, 12, 11]
private lane: LANE = {
road: '', num: 0, count: 0
}
private videoData?: RecordHandleType
private disConnectNum: number = 0;
//调用监管接口
sendWriteObjectOut: SendWriteObjectOut = async (data, filePath) => {
const temp = await writeObjectOut(data, filePath, this.context);
dConsole.log(JudgeTag, "wzj", JSON.stringify(temp))
//断网&网络超时次数计算
if (temp.code == 2300007 || temp.code == 2300028) {
this.disConnectNum += 1;
if (this.disConnectNum < 5) {
return await this.sendWriteObjectOut(data, filePath)
}
}
if (this.disConnectNum >= 5) {
dConsole.info('surenjun', '123')
this.judgeUI.errorMsg = '当前的考试过程信息网络传输异常,程序点击确认将重启!';
this.judgeUI.disConnectErrorOpen = true
}
this.disConnectNum = 0
return temp
}
constructor(judgeUI: JudgeUI) {
this.serialIndex = 1;
@ -1205,11 +1205,11 @@ export default class Judge {
break
}
if (event == 2 || event == 3) {
setTimeout(() => {
this.judgeUI.kfArrScroller.scrollTo({
yOffset: 999999, xOffset: 0
})
}, 500)
// setTimeout(() => {
// this.judgeUI.kfArrScroller.scrollTo({
// yOffset: 999999, xOffset: 0
// })
// }, 500)
//统计必考项目完成数量
await this.setCountItems();
await checkExamIsEnd()