1408 lines
46 KiB
Plaintext
Raw Normal View History

2024-07-02 10:42:53 +08:00
import { examinationStuAbsent, getExaminationItem, getExaminationStudentInfo } from '../api/userInfo';
import router from '@ohos.router';
import TopLogo from './compontents/TopLogo';
2024-01-05 11:11:15 +08:00
import Md5 from '../common/utils/md5';
2024-07-02 10:42:53 +08:00
import FaceCompare from './compontents/FaceCompare';
import { writeObjectOut } from '../api/judge';
import testNapi from '@ohos.idcard';
2025-02-11 16:52:41 +08:00
import IDCardSDK from '@ohos.idcard';
2024-01-05 11:11:15 +08:00
import common from '@ohos.app.ability.common';
2024-07-02 10:42:53 +08:00
import promptAction from '@ohos.promptAction';
2024-07-31 13:47:40 +08:00
import FilePhoto from './judgeSDK/utils/filePhoto';
import { sqlInsertCommonFn, upDateTableByArray } from '../common/service/initable';
2024-07-02 10:42:53 +08:00
import { CandidateData, EmptyCandidateObject } from '../mock/CandidateData';
2024-08-14 17:26:27 +08:00
import BoardPrePareSetPopup from './compontents/judge/BoardPrePareSetPopup';
2024-07-31 13:47:40 +08:00
import LoadingPopup from './compontents/judge/LoadingPopup';
import VoiceAnnounce from './judgeSDK/utils/voiceAnnouncements';
import { judgeConfig } from './judgeSDK/utils/judgeConfig';
2024-08-08 20:12:19 +08:00
import { initJudgeUdp } from '../common/utils/UdpJudge';
2025-01-20 08:50:40 +08:00
import errorMsgDialog from './compontents/errorMsgDialog';
import imageBtn from './compontents/imageBtn';
2025-03-26 13:43:47 +08:00
import {
BeginExamRequest,
CarInfoType,
DrvexamType,
ExaminationStuAbsentParams,
ExaminerLoginInfo,
GetExaminationItemRsp,
IdCard,
LabelBlockType,
MASYSSETTableType,
QKParamType,
RegulatoryInterfaceParams,
RouteParamsType,
SckType,
SystemParamType,
UDPParamType,
User
} from '../model';
2025-02-18 10:47:28 +08:00
import { BusinessError } from '@ohos.base';
import { GetSyncData } from '../utils/table/Operation';
import { GetCurrentUserKeyValue } from './UserInfo/utils';
import dayTs from '../utils/Date';
import { GetCurrentTime, NumberToByteArray } from '../utils/Common';
2025-03-26 13:43:47 +08:00
import FileUtils from '../utils/FileUtils';
import DB from '../utils/DbSql';
2025-02-19 13:24:07 +08:00
2024-01-05 11:11:15 +08:00
@Entry
@Component
2024-06-27 20:53:36 +08:00
struct UserInfo {
2024-01-05 11:11:15 +08:00
@State pageIndex: number = 0
2024-05-16 09:53:10 +08:00
@State ratio: number = 1700 / 960
2024-01-05 11:11:15 +08:00
@State index: number = 0
2025-01-20 08:50:40 +08:00
@State stepFlag: boolean = false;
2024-01-05 11:11:15 +08:00
@State errorMsg: string = ''
@State ksxtbh: string = ''
@State pic: string = ''
@State jkxlh: string = ''
2024-02-22 17:33:10 +08:00
@State @Watch('changeFaceCompareSuccess') faceCompareSucess: number = 0;
2024-01-31 14:35:16 +08:00
@State @Watch('changeQkfn') getqkFlag: boolean = false;
2024-01-05 11:11:15 +08:00
@State @Watch('outClick') outFlag: boolean = false;
@State showFaceCompare: boolean = false;
@State url: string = ''
@State lsh: string = ''
@State qkFlag: boolean = false
2024-07-05 09:34:03 +08:00
@State isBoardPrePareSetPopupOpen: boolean = false
2025-01-02 17:50:08 +08:00
@State isSecondBoardPrePareSetPopupOpen: boolean = false
2024-07-05 09:34:03 +08:00
@State isFirstBoardPrePareSetPopupBtnShow: boolean = false
@State isBoardPrePareSetPopupShow: boolean = false
2024-08-14 17:26:27 +08:00
@State isLoadingPopupVisible: boolean = false;
@State loadingText: string = '正在认证监管信息,请稍后...'
2025-02-11 16:52:41 +08:00
@State sczbkf: SckType[] = []
2024-02-23 10:03:43 +08:00
@State currentUser: User = EmptyCandidateObject
@State dataList: Array<User> = []
@State list: Array<User> = []
2024-01-05 11:11:15 +08:00
@State name: string = 'initName';
@State sex: string = '';
@State callBackFlag: boolean = false;
2024-01-05 11:11:15 +08:00
@State born?: string = '';
@State address: string = '';
@State nation: string = '';
@State idCard: string = '';
@State grantDept: string = '';
2024-07-31 13:47:40 +08:00
//是否已经开始考试
2024-08-14 17:26:27 +08:00
@State isExamStart: boolean = false;
2024-01-05 11:11:15 +08:00
@State effectDate: string = '';
2025-02-11 16:52:41 +08:00
@State interval: number = -1;
2024-01-31 14:35:16 +08:00
@State studentRefreshStatue: string = '0';
2024-01-05 11:11:15 +08:00
@State photo: string = 'data:image/bmp;base64,';
2024-01-31 14:35:16 +08:00
@State numCount: number = 0;
@State signNum: number = 0;
2024-01-05 11:11:15 +08:00
@State isCanClick: boolean = true;
2024-08-13 11:50:38 +08:00
@State updateTimeLimit: boolean = false
2024-08-20 09:12:02 +08:00
@State ksksLimit: boolean = false
2024-05-09 13:42:56 +08:00
@State faceFlag: string = '0';
2024-07-02 10:42:53 +08:00
@State FaceOpenStatue: string = '0'; //是否开启人脸识别
@State faceCatchImg: string = ''
2025-02-19 13:24:07 +08:00
@State carInfo: CarInfoType = {
2025-02-18 13:43:20 +08:00
carId: '',
examinationRoomId: '',
plateNo: '',
isNeedCheck: '',
2025-02-19 13:24:07 +08:00
examSubject: ''
2025-02-18 13:43:20 +08:00
}
2025-02-19 13:09:24 +08:00
@State examinerLoginInfo: ExaminerLoginInfo = {
2025-02-18 13:43:20 +08:00
carId: '',
examinationRoomId: '',
plateNo: '',
isNeedCheck: '',
2025-02-19 13:30:32 +08:00
examSubject: ''
2025-02-18 13:43:20 +08:00
}
2025-02-11 16:52:41 +08:00
@State systemParam: SystemParamType = {
Param341: true,
Param803Str: '0',
Param612Str: '0',
Param770Str: '0',
Param305Str: '0',
Param352Str: '0',
Param828Str: '0',
Param830Str: '0',
Param364: '0',
Param398: '0'
2024-10-28 17:11:22 +08:00
}
2025-01-04 14:27:45 +08:00
@State startExam: boolean = false
2025-02-12 10:48:27 +08:00
@State singlePlay: boolean = false
2025-01-20 08:50:40 +08:00
//开始考试准备
prePareExam = async () => {
if (this.ksksLimit) {
return
}
console.log('routerParamrouterParam')
try {
await this.checkSignal()
this.faceCompareSucess = 0
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('statue', 2)
2025-01-20 08:50:40 +08:00
if (!this.currentUser.xm) {
return
}
this.ksksLimit = true
2025-02-12 10:48:27 +08:00
if (this.singlePlay) {
2025-02-18 10:47:28 +08:00
// const { examSubject } = this.carInfo;
2025-01-20 08:50:40 +08:00
this.currentUser.id = '0'
await upDateTableByArray('USER', [this.currentUser])
router.pushUrl({
2025-02-19 13:24:07 +08:00
url: this.carInfo.examSubject == '3' ? 'pages/Roads' : 'pages/Judge',
2025-01-20 08:50:40 +08:00
params: {
sczb: Number(this.isBoardPrePareSetPopupOpen),
kfdm: this.sczbkf,
}
}, router.RouterMode.Single);
this.ksksLimit = false
this.stopDeviceById()
return
}
console.log('this.FaceOpenStatuethis.FaceOpenStatue', this.FaceOpenStatue)
if (this.FaceOpenStatue != '0') {
// 同一学员连续第二次考试时不再验证身份
if (this.currentUser.kssycs == '1' && this.systemParam.Param830Str == '1') {
this.sfbdinterfaceFn()
} else {
this.showFaceCompare = true
}
} else {
this.sfbdinterfaceFn()
}
} catch (e) {
console.info('Throw Error', JSON.stringify(e))
}
}
2025-03-26 13:43:47 +08:00
private fileUtil: FileUtils
2025-01-20 08:50:40 +08:00
private title = ''
private type = '2'
2024-08-19 09:32:41 +08:00
errorDialog: CustomDialogController = new CustomDialogController({
builder: errorMsgDialog({
title: this.title,
type: this.type,
cancel: () => {
},
confirm: () => {
}
}),
customStyle: true,
alignment: DialogAlignment.Center,
},
)
2025-01-20 08:50:40 +08:00
private filePhoto: FilePhoto
2025-02-11 16:52:41 +08:00
// 过程照片拍照
getPhoto = async (empty?: boolean) => {
//单机模式返回空照片
2025-02-12 10:48:27 +08:00
if (this.singlePlay) {
2025-02-11 16:52:41 +08:00
return ''
} else {
const photoBase64: string = await this.filePhoto.getPhoto();
2025-02-11 16:52:41 +08:00
return photoBase64
}
}
2025-02-19 13:24:07 +08:00
private avPlayer: VoiceAnnounce
2025-01-20 08:50:40 +08:00
private context = getContext(this) as common.UIAbilityContext;
2025-02-11 16:52:41 +08:00
private labelBlocks: LabelBlockType[] = [
2025-01-20 08:50:40 +08:00
{ label: '考生姓名', key: 'xm' },
{ label: '身份证号', key: 'sfzmhm' },
{ label: ' 流 水 号 ', key: 'lsh' },
{ label: '考试路线', key: 'ksxl' },
{ label: '待考次数', key: 'kssycs' },
{ label: '考试员名', key: 'ksy2' },
]
2025-01-04 14:27:45 +08:00
aboutToAppear() {
2025-03-26 13:43:47 +08:00
this.fileUtil = new FileUtils(this.context)
2025-01-02 11:01:09 +08:00
this.avPlayer = new VoiceAnnounce();
}
2025-01-04 14:27:45 +08:00
2024-03-05 15:44:53 +08:00
async onPageShow() {
2025-01-03 17:24:11 +08:00
this.isExamStart = false
2025-01-04 14:27:45 +08:00
this.startExam = false
2024-08-21 11:57:03 +08:00
this.updateTimeLimit = false
this.ksksLimit = false
2025-01-04 14:27:45 +08:00
this.currentUser = EmptyCandidateObject
2024-08-02 11:05:23 +08:00
this.filePhoto = new FilePhoto(this.context);
2025-03-26 14:48:56 +08:00
this.singlePlay = AppStorage.get<boolean>('singlePlay')
this.examinerLoginInfo = AppStorage.get<ExaminerLoginInfo>('examinerLoginInfo')
this.carInfo = AppStorage.get<CarInfoType>('carInfo')
2024-08-26 19:27:23 +08:00
//语音功能on
2025-01-07 12:11:39 +08:00
// new WebRTCVoice(this.context);
2024-02-23 10:43:11 +08:00
//初始化数据
this.initData()
//身份证读卡器初始化
2024-03-05 15:44:53 +08:00
// this.openDeviceByIDCard()
const routerParam: RouteParamsType = router.getParams() as RouteParamsType
2024-08-21 11:57:03 +08:00
console.log('routerParam', JSON.stringify(routerParam))
2024-08-22 15:24:15 +08:00
2025-02-12 10:48:27 +08:00
if (!this.singlePlay) {
if (routerParam.type != "1") {
// this.list = await getSyncData('USERLIST')
this.list = await GetSyncData<User>("USERLIST")
// const data = await getSyncData('USER')
const data = await GetSyncData<User>("USER")
2025-01-04 14:27:45 +08:00
console.log('useruser,', JSON.stringify(this.list))
console.log('useruser1,', JSON.stringify(data))
2024-08-27 19:41:15 +08:00
2024-08-21 11:57:03 +08:00
const user = data[0]
if (user && Number(user.kssycs)) {
2025-01-04 14:27:45 +08:00
let flag = false
2024-08-21 11:57:03 +08:00
this.list.forEach(res => {
if (res.sfzmhm == user.sfzmhm) {
2025-01-04 14:27:45 +08:00
flag = true
2024-08-21 11:57:03 +08:00
res.kssycs = user.kssycs
2024-08-20 10:16:07 +08:00
this.getCurrentStudent(res.sfzmhm)
}
})
2025-01-04 14:27:45 +08:00
if (!flag) {
this.currentUser = (this.list.length ? this.list[0] : EmptyCandidateObject)
2024-08-27 19:41:15 +08:00
}
2025-01-20 08:50:40 +08:00
} else if (user && (user.kssycs == '0' || user.kssycs == '')) {
2024-08-20 10:16:07 +08:00
console.log('datadatadatadata')
2024-08-21 11:57:03 +08:00
this.list = this.list.filter(res => {
return res.sfzmhm != user.sfzmhm
2024-08-20 10:16:07 +08:00
})
2024-08-21 11:57:03 +08:00
this.pageIndex = 0
2024-08-20 10:16:07 +08:00
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
2025-01-06 13:55:39 +08:00
if (this.dataList.length) {
2025-01-20 08:50:40 +08:00
setTimeout(() => {
2025-01-06 13:55:39 +08:00
this.currentUser = this.dataList[0]
2025-02-12 10:48:27 +08:00
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('lsh', this.currentUser.lsh)
2025-01-20 08:50:40 +08:00
}, 200)
2025-01-06 13:55:39 +08:00
} else {
this.currentUser = EmptyCandidateObject
2024-08-20 09:12:02 +08:00
}
}
2024-08-21 11:57:03 +08:00
this.list.forEach((res, index) => {
res.id = index.toString()
2024-08-20 10:16:07 +08:00
})
2024-08-21 11:57:03 +08:00
await upDateTableByArray('USERLIST', this.list || [])
} else {
2025-01-02 17:50:08 +08:00
await this.getExaminationStudentInfoFn()
2024-08-19 14:54:11 +08:00
}
2024-08-19 09:32:41 +08:00
}
2024-08-20 09:12:02 +08:00
2024-08-19 09:32:41 +08:00
2024-02-23 10:03:43 +08:00
// 如果是单机模式则模拟假数据
2024-06-04 15:56:50 +08:00
//获取sysset表数据
this.initSysset()
2024-08-19 09:32:41 +08:00
2024-06-04 15:56:50 +08:00
//心跳处理
2024-03-05 15:44:53 +08:00
this.heartMsg()
2024-08-19 09:32:41 +08:00
// if(user[0]){
// // @ts-ignore
// this.currentUser=user
// }
2024-07-31 13:47:40 +08:00
this.sczbkf = [];
2024-08-19 10:11:22 +08:00
initJudgeUdp()
// TODO UDP更改
2024-11-18 15:16:42 +08:00
//监听远程开始考试
// globalThis.udpEvent.onBeginExam(async () => {
// console.info('surenjun', 'userInfo收到UdpEvent事件')
// if (this.isBoardPrePareSetPopupOpen && !this.isFirstBoardPrePareSetPopupBtnShow) {
// await this.prePareSCZB()
// } else {
// await this.prePareExam()
// }
// })
2024-11-18 15:16:42 +08:00
}
2024-07-02 10:42:53 +08:00
2024-02-23 10:43:11 +08:00
//身份证读卡器初始化
2024-07-02 10:42:53 +08:00
openDeviceByIDCard() {
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('indexComponent', this)
2024-02-23 10:43:11 +08:00
// 应用启动时打开读卡设备
let ret = testNapi.OpenDevice();
if (ret == 0) {
testNapi.StartReadCard(this.onReadCard);
} else {
console.error("zzctest Failed to Open Device");
2024-02-21 14:51:32 +08:00
}
2024-01-05 11:11:15 +08:00
}
2024-07-02 10:42:53 +08:00
stopDeviceById() {
if (this.faceFlag == '1') {
testNapi.StopReadCard()
2024-05-09 13:42:56 +08:00
}
2024-03-05 15:44:53 +08:00
}
2024-07-02 10:42:53 +08:00
2024-02-23 10:43:11 +08:00
// 通过身份证获取当前学员
async getCurrentStudent(id: string) {
2024-02-23 10:43:11 +08:00
let flag = false
2024-08-15 13:42:36 +08:00
// this.pageIndex
2025-01-04 14:27:45 +08:00
console.log('currentidid', id)
2024-02-23 10:43:11 +08:00
this.list.map((res, index) => {
2025-01-04 14:27:45 +08:00
console.log('tttt', res.sfzmhm, res.xm)
2024-02-23 10:43:11 +08:00
if (res.sfzmhm == id) {
flag = true
2025-01-04 14:27:45 +08:00
this.currentUser = EmptyCandidateObject
setTimeout(() => {
2025-01-03 17:24:11 +08:00
this.currentUser = res
2025-02-12 10:48:27 +08:00
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm
2025-01-04 14:27:45 +08:00
}, 200)
2025-01-03 17:24:11 +08:00
2025-02-12 10:48:27 +08:00
this.examinerLoginInfo.ksyh = res.ksy1sfzmhm
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('examinerLoginInfo', this.examinerLoginInfo)
AppStorage.setOrCreate('lsh', res.lsh)
// const { examSubject } = this.carInfo;
2025-02-12 10:48:27 +08:00
if (this.singlePlay) {
2024-03-05 15:44:53 +08:00
this.stopDeviceById()
2024-02-23 10:43:11 +08:00
router.pushUrl({
url: this.carInfo.examSubject == "3" ? 'pages/Roads' : 'pages/Judge',
2024-08-02 11:05:23 +08:00
params: {
sczb: Number(this.isBoardPrePareSetPopupOpen),
2024-08-19 10:11:22 +08:00
kfdm: this.sczbkf,
2024-07-16 15:02:36 +08:00
}
2024-02-23 10:43:11 +08:00
}, router.RouterMode.Single);
return
2024-02-21 14:51:32 +08:00
}
2024-02-23 10:43:11 +08:00
this.pageIndex = Math.floor(index / 4)
}
})
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
if (!flag) {
2025-02-12 10:48:27 +08:00
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('lsh', '0000000000000')
2024-08-15 13:42:36 +08:00
await upDateTableByArray('USER', [])
2025-01-04 14:27:45 +08:00
setTimeout(() => {
2024-08-27 19:41:15 +08:00
this.currentUser = this.list[0]
2025-02-12 10:48:27 +08:00
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('lsh', this.currentUser.lsh)
2025-01-04 14:27:45 +08:00
}, 200)
2024-08-27 19:41:15 +08:00
2024-08-15 13:42:36 +08:00
// promptAction.showToast({
// message: '未匹配到对应下载学员',
// duration: 3000
// });
2024-01-05 11:11:15 +08:00
}
}
2024-07-02 10:42:53 +08:00
2025-02-11 16:52:41 +08:00
onReadCard(ret: IDCardSDK.IDCardInfo) {
2024-01-05 11:11:15 +08:00
console.info(`zzctest xx Read Card ret =${ret.status}`)
2025-02-19 13:30:32 +08:00
let thisVar: IdCard = AppStorage.get('indexComponent');
2024-01-05 11:11:15 +08:00
if (ret.status == 0) { // status = 1 为读到身份证信息; status = 1 为身份证离开读卡器
2024-01-05 11:11:15 +08:00
// 收到身份证离开读卡器的事件通知,根据实际业务需要决定是否需要清空之前已读取的身份证信息。
// 如果身份证卡片离开读卡器时需要继续保留UI界面上已读取到的身份信息以下代码可以注释掉。
thisVar.name = "";
thisVar.sex = "";
thisVar.nation = "";
thisVar.born = "";
thisVar.address = "";
thisVar.idCard = "";
thisVar.photo = "";
return true;
}
if (ret.baseInfo.length > 2) {
// 收到身份证信息,填充页面
console.info(`zzctest Read Card 1`);
let subIndex = ret.baseInfo.indexOf(":")
let baseInfo: string = ret.baseInfo.substring(subIndex + 1, ret.baseInfo.length - 1);
console.info(`zzctest Read Card 2 baseInfo=${baseInfo}`);
let baseInfos: string[] = baseInfo.split("|");
thisVar.name = baseInfos[0];
thisVar.sex = baseInfos[1];
thisVar.nation = baseInfos[2];
thisVar.born = baseInfos[3];
thisVar.address = baseInfos[4];
thisVar.idCard = baseInfos[5];
setTimeout(() => {
this.getCurrentStudent(baseInfos[5])
}, 1000)
2024-01-05 11:11:15 +08:00
}
// 身份证照片数据处理
if (ret.photo instanceof ArrayBuffer) {
let dataView = new DataView(ret.photo)
console.info(`Read Card ret = length = ${dataView.byteLength}`)
let str = ""
for (let i = 0; i < dataView.byteLength; ++i) {
2024-01-05 11:11:15 +08:00
let c = String.fromCharCode(dataView.getUint8(i))
if (c !== "\n") {
str += c
}
}
thisVar.photo += str;
}
console.info(`zzctest Read Card end`);
return true;
}
2024-02-21 14:51:32 +08:00
2024-02-23 10:43:11 +08:00
changeQkfn() {
this.qkFn()
}
2024-07-02 10:42:53 +08:00
2024-07-05 09:34:03 +08:00
async initData() {
this.isFirstBoardPrePareSetPopupBtnShow = false;
2024-02-23 10:43:11 +08:00
this.stepFlag = false
this.faceCompareSucess = 0
this.showFaceCompare = false
2024-08-19 10:11:22 +08:00
this.lsh = '1111111111111'
2024-02-23 10:43:11 +08:00
this.callBackFlag = false
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('lsh', this.lsh)
AppStorage.setOrCreate('statue', 2)
2024-05-09 13:42:56 +08:00
// this.currentUser = EmptyCandidateObject
2024-02-23 10:43:11 +08:00
this.numCount = 0
2025-02-19 13:24:07 +08:00
if (this.singlePlay) {
2024-02-26 15:01:27 +08:00
// TODO 模拟假数据
this.list = CandidateData
this.pageIndex = 0
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
this.currentUser = this.dataList[0]
2025-01-04 14:27:45 +08:00
this.currentUser.ksy2 = ''
2024-12-05 13:51:36 +08:00
2024-02-26 15:01:27 +08:00
this.lsh = this.currentUser.lsh
2025-02-18 10:47:28 +08:00
this.examinerLoginInfo.ksyh = this.currentUser.ksy1sfzmhm
AppStorage.setOrCreate('examinerLoginInfo', this.examinerLoginInfo)
AppStorage.setOrCreate('lsh', this.lsh)
2024-02-26 15:01:27 +08:00
}
2024-08-19 09:32:41 +08:00
// const syssetParams = await getSyncData('MA_SYSSET');
2024-07-05 09:34:03 +08:00
2024-02-23 10:43:11 +08:00
}
async heartMsg() {
// TODO UDP缺失
// globalThis.udpClient2 & globalThis.udpClient2.setMsgCallBack(async (val) => {
// if (val.id == '32') {
// AppStorage.setOrCreate('signNum', val.body[1])
// if (val.body[0] == '7') {
// //缺考处理
// this.getqkFn()
// this.signNum = val.body[1]
// }
// } else if (val.id == '42') {
// //收到中心缺考确认消息
// console.log('qkfnqkfn', val.body[0])
// this.qkFn()
// }
// })
2024-02-23 10:43:11 +08:00
}
2024-07-02 10:42:53 +08:00
2024-06-04 15:56:50 +08:00
//考点端查询缺考指令内容消息请求
2024-02-23 10:43:11 +08:00
getqkFn() {
2025-02-11 16:52:41 +08:00
let tmpList: Array<number> = [];
2025-03-26 14:48:56 +08:00
tmpList.push(NumberToByteArray(AppStorage.get<number>('signNum'), 1 * 8)[0])
2025-02-11 16:52:41 +08:00
const param: QKParamType = {
2024-02-23 10:43:11 +08:00
id: 41,
list: tmpList,
2025-02-12 10:48:27 +08:00
carNo: this.carInfo.carNo as string,
placeId: this.carInfo.examinationRoomId as string
2024-02-23 10:43:11 +08:00
}
// TODO UDP缺失
// globalThis.udpClient2.sendMsgExt(param, this.context)
2024-02-23 10:43:11 +08:00
}
2024-02-21 14:51:32 +08:00
async initSysset() {
2024-01-05 11:11:15 +08:00
const that = this;
// DB.queryListBySql("select * from MA_SYSSET", ['id', 'v_no', 'v_name', 'v_value'].map(item => ({
// type: ColumnType.STRING,
// name: item,
// columnName: item
// }))).then((syssetParams: any) => {
GetSyncData<MASYSSETTableType>("MA_SYSSET").then((syssetParams: MASYSSETTableType[]) => {
2025-01-20 08:50:40 +08:00
const serialNumberArr = syssetParams.filter(sys => sys.v_no === '901')
that.jkxlh = serialNumberArr?.[0]?.v_value || ''
const ksxtbhArr = syssetParams.filter(sys => sys.v_no === '902')
that.ksxtbh = ksxtbhArr?.[0]?.v_value || '222'
const studentRefreshParam = syssetParams.filter(sys => sys.v_no === '452') //判断自动更新
that.studentRefreshStatue = studentRefreshParam?.[0]?.v_value || '0'
const openCheckFlagParam = syssetParams.filter(sys => sys.v_no == '17') //0
const openCheckFlag = openCheckFlagParam?.[0]?.v_value == '1' ? '1' : '0'
const faceParam = syssetParams.filter(sys => sys.v_no == '2413') //3
console.log('FaceOpenStatue', openCheckFlag, this.FaceOpenStatue)
// 1身份证读卡器 2指纹 3人脸
if (openCheckFlag == '1') {
that.FaceOpenStatue = faceParam?.[0]?.v_value == '3' ? '1' : '0'
this.faceFlag = faceParam?.[0]?.v_value || '0'
if (faceParam?.[0]?.v_value == '1') {
that.openDeviceByIDCard()
}
}
// let a = await this.fileUtil.initFolder("/config/temptable")
// this.fileUtil.addFile("temp.log", JSON.stringify(syssetParams))
syssetParams.forEach(sys => {
//364 绕车一周评判时机(1-开始考试后判 2-开始考试前判)
if (sys.v_no === '364' && decodeURIComponent(sys.v_value) == '2') {
this.systemParam.Param364 = sys.v_value
that.isBoardPrePareSetPopupOpen = true;
that.isFirstBoardPrePareSetPopupBtnShow = false
2024-11-20 13:44:40 +08:00
}
2024-10-28 13:47:03 +08:00
2025-01-20 08:50:40 +08:00
//398参数为1 第二场考试上车准备不考
if (sys.v_no === '398' && decodeURIComponent(sys.v_value) == '1') {
that.systemParam.Param398 = decodeURIComponent(sys.v_value)
that.isSecondBoardPrePareSetPopupOpen = true;
}
2024-11-26 15:35:05 +08:00
2025-01-20 08:50:40 +08:00
// 车上没有缺考功能
if (sys.v_no === '770') {
that.systemParam.Param770Str = sys.v_value;
}
// 开始考试前必须解开安全带或关车门
if (sys.v_no === '803') {
that.systemParam.Param803Str = sys.v_value + '';
}
//判断是否考生是否按顺序考试
if (sys.v_no === '341' && decodeURIComponent(sys.v_value) == '1') {
that.systemParam.Param341 = true
} else {
//todo
that.systemParam.Param341 = true
}
//开始考试触发方式
if (sys.v_no === '612') {
that.systemParam.Param612Str = decodeURIComponent(sys.v_value)
}
//车上考试过一次就不能缺考
if (sys.v_no === '352') {
that.systemParam.Param352Str = decodeURIComponent(sys.v_value)
}
//828考生待考界面安全员显示考试员
if (sys.v_no === '828') {
that.systemParam.Param828Str = decodeURIComponent(sys.v_value)
if (that.systemParam.Param828Str == '1') {
that.labelBlocks[5].label = '安全员名'
2025-01-04 14:27:45 +08:00
} else {
2025-01-20 08:50:40 +08:00
that.labelBlocks[5].label = '考试员名'
2024-10-28 13:47:03 +08:00
}
2025-01-20 08:50:40 +08:00
that.labelBlocks = JSON.parse(JSON.stringify(this.labelBlocks))
2024-10-28 13:47:03 +08:00
2025-01-20 08:50:40 +08:00
}
//视频保存天数
if (sys.v_no === '305') {
that.systemParam.Param305Str = decodeURIComponent(sys.v_value)
if (!Number(this.systemParam.Param305Str)) {
that.systemParam.Param305Str = '2'
2024-10-28 13:47:03 +08:00
}
2025-01-20 08:50:40 +08:00
}
})
2024-08-12 14:46:16 +08:00
2024-08-23 09:37:47 +08:00
2025-01-20 08:50:40 +08:00
//0不自动更新 1自动更新不限次数 2没有考生更新2次
if (that.studentRefreshStatue == '2') {
if (that.list.length == 0) {
clearInterval(that.interval)
that.interval = setInterval(() => {
if (that.numCount < 3) {
that.numCount++
2025-01-04 14:27:45 +08:00
if (that.list.length == 0) {
2024-09-03 19:28:07 +08:00
that.getExaminationStudentInfoFn()
2024-09-06 15:42:06 +08:00
}
2025-01-20 08:50:40 +08:00
}
}, 5000)
2024-07-02 10:42:53 +08:00
} else {
2025-01-20 08:50:40 +08:00
that.getExaminationStudentInfoFn()
2024-01-31 14:35:16 +08:00
}
2025-01-20 08:50:40 +08:00
} else if (that.studentRefreshStatue == '1') {
if (that.list.length == 0) {
clearInterval(that.interval)
that.interval = setInterval(() => {
if (that.list.length == 0) {
that.getExaminationStudentInfoFn()
}
}, 5000)
} else {
that.getExaminationStudentInfoFn()
}
} else {
// this.getExaminationItemFn()
}
2024-01-05 11:11:15 +08:00
})
}
2024-07-02 10:42:53 +08:00
//人脸比对窗口关闭
2024-02-22 17:33:10 +08:00
changeFaceCompareSuccess() {
2024-11-18 15:16:42 +08:00
this.ksksLimit = false
2024-02-21 14:51:32 +08:00
console.log('this.faceCompareSuces', this.faceCompareSucess, JSON.stringify(this.currentUser))
if (this.faceCompareSucess > 0) {
2024-07-02 10:42:53 +08:00
//人脸比对通过
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('statue', 4)
2024-08-26 19:27:23 +08:00
this.showFaceCompare = false
2024-01-05 11:11:15 +08:00
this.sfbdinterfaceFn()
}
}
nextClick() {
2024-02-21 14:51:32 +08:00
if (this.list.length <= 4 || this.pageIndex == Math.floor(this.list.length / 4)) {
2024-01-05 11:11:15 +08:00
return
}
this.pageIndex++;
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
}
prevClick() {
2024-02-21 14:51:32 +08:00
if (this.list.length <= 4 || this.pageIndex == 0) {
2024-01-05 11:11:15 +08:00
return
}
this.pageIndex--;
this.dataList = this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4)
}
2024-07-02 10:42:53 +08:00
//获取下载考生
2024-08-19 09:32:41 +08:00
async getExaminationStudentInfoFn() {
2025-02-12 10:48:27 +08:00
if (this.singlePlay || this.updateTimeLimit) {
2024-01-05 11:11:15 +08:00
return
}
2025-01-20 08:50:40 +08:00
this.isExamStart = false
this.startExam = false
this.updateTimeLimit = false
this.ksksLimit = false
2025-01-01 16:18:52 +08:00
// this.isBoardPrePareSetPopupOpen=true
2025-01-04 14:27:45 +08:00
this.isFirstBoardPrePareSetPopupBtnShow = false
2025-02-11 09:09:34 +08:00
console.log('isFirstBoardPrePareSetPopupBtnShow', this.isFirstBoardPrePareSetPopupBtnShow,
this.isBoardPrePareSetPopupOpen)
2025-01-04 14:27:45 +08:00
this.startExam = false
2025-01-20 08:50:40 +08:00
// await upDateTableByArray('USER', [])
// await upDateTableByArray('USERLIST', [])
await DB.clearTable('USER')
await DB.clearTable('USERLIST')
2024-08-21 11:57:03 +08:00
this.type = '2'
2024-08-19 09:32:41 +08:00
this.errorDialog.open()
2024-08-20 11:26:12 +08:00
this.updateTimeLimit = true
2025-02-12 10:48:27 +08:00
const param = `<getExaminationStudentInfoReq><head><checkCode>${Md5.Instance.get_md5(this.carInfo.carId +
this.carInfo.examinationRoomId +
this.examinerLoginInfo.username)}</checkCode></head><body><carId>${this.carInfo.carId}</carId><examinationRoomId>${this.carInfo.examinationRoomId}</examinationRoomId><examinerName>${this.examinerLoginInfo.username}</examinerName><sfzmhm></sfzmhm></body></getExaminationStudentInfoReq>`
2024-08-21 11:57:03 +08:00
try {
getExaminationStudentInfo(param).then(async (res) => {
2025-01-20 08:50:40 +08:00
console.log("temp log ", JSON.stringify(res))
2024-08-21 11:57:03 +08:00
this.errorDialog.close()
setTimeout(() => {
this.updateTimeLimit = false
}, 3000)
if (!res || res?.getExaminationStudentInfoRsp?.head?.resultCode == '1') {
2024-09-12 11:27:42 +08:00
this.dataList = []
this.list = []
2024-08-21 11:57:03 +08:00
return
2024-01-05 11:11:15 +08:00
}
let dataList: User[] = []
2024-08-21 11:57:03 +08:00
this.list = []
2024-01-05 11:11:15 +08:00
// for (let key in res.getExaminationStudentInfoRsp.body) {
// const a = res.getExaminationStudentInfoRsp.body[key]
// if (a instanceof Array) {
// dataList = a
// } else {
// dataList = [a]
// }
// }
for (const key of Object.keys(res.getExaminationStudentInfoRsp.body)) {
const a: User[] | User = res.getExaminationStudentInfoRsp.body[key];
if (Array.isArray(a)) {
dataList = a;
2024-08-21 11:57:03 +08:00
} else {
dataList = [a];
2024-08-21 11:57:03 +08:00
}
}
if (dataList.length) {
this.numCount = 0
2024-01-05 11:11:15 +08:00
}
2024-08-10 14:00:18 +08:00
2024-08-21 11:57:03 +08:00
this.list = JSON.parse(JSON.stringify(dataList))
2025-01-20 08:50:40 +08:00
console.log("temp list", JSON.stringify(this.list))
2024-08-21 11:57:03 +08:00
this.list.forEach((listData, index) => {
2025-01-01 10:40:23 +08:00
//考过一次不允许切换学员
2025-01-04 14:27:45 +08:00
if (listData.kssycs == '1') {
2025-01-20 08:50:40 +08:00
2025-01-04 14:27:45 +08:00
this.startExam = true
2025-01-01 10:40:23 +08:00
}
2024-08-21 11:57:03 +08:00
listData.id = index.toString()
// for (let i in listData) {
// listData[i] = decodeURI(listData[i])
// }
Object.keys(listData).forEach((key) => {
Reflect.set(listData, key, decodeURI(Reflect.get(listData, key)));
});
2025-01-04 14:27:45 +08:00
if (this.systemParam.Param828Str == '1' || this.systemParam.Param828Str == '2') {
2024-12-20 13:28:03 +08:00
// listData.ksy2=listData.ksy1;
2025-02-12 10:48:27 +08:00
listData.ksy2 = this.examinerLoginInfo.kgxm
2025-01-04 14:27:45 +08:00
} else {
2024-12-20 13:28:03 +08:00
// listData.ksy2=listData.ksy2;
2025-02-12 10:48:27 +08:00
listData.ksy2 = this.examinerLoginInfo.kgxm
2024-10-28 13:47:03 +08:00
}
2024-08-21 11:57:03 +08:00
listData.kszp = this.photo + listData.kszp
listData.ksmjzp = this.photo + listData.ksmjzp
})
2025-01-20 08:50:40 +08:00
// await upDateTableByArray('USERLIST', this.list || [])
console.log("temp list", JSON.stringify(this.list))
await sqlInsertCommonFn("USERLIST", this.list || [])
2024-08-21 11:57:03 +08:00
dataList = this.list.length > 4 ? this.list.slice(this.pageIndex * 4, this.pageIndex * 4 + 4) : this.list;
2024-01-31 14:35:16 +08:00
2024-08-21 11:57:03 +08:00
this.dataList = dataList
2025-01-20 08:50:40 +08:00
console.log("temp list", JSON.stringify(this.dataList))
2025-01-04 14:27:45 +08:00
const user = this.dataList.filter(res => {
2025-01-07 15:50:48 +08:00
return res.kssycs == '1'
2025-01-04 14:27:45 +08:00
})
if (this.dataList.length) {
2025-02-12 10:48:27 +08:00
setTimeout(() => {
2025-02-18 10:47:28 +08:00
this.currentUser = user.length ? user[0] : this.dataList[0]
2025-02-12 10:48:27 +08:00
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('lsh', this.currentUser.lsh)
this.examinerLoginInfo.ksyh = this.currentUser.ksy1sfzmhm
AppStorage.setOrCreate('examinerLoginInfo', this.examinerLoginInfo)
2025-02-12 10:48:27 +08:00
}, 200)
2025-01-04 14:27:45 +08:00
} else {
this.currentUser = EmptyCandidateObject
2024-08-10 14:00:18 +08:00
}
2025-01-01 16:18:52 +08:00
//364 绕车一周评判时机(1-开始考试后判 2-开始考试前判)
if (this.systemParam.Param364 == '2') {
this.isBoardPrePareSetPopupOpen = true;
2025-01-02 17:50:08 +08:00
this.isFirstBoardPrePareSetPopupBtnShow = false;
2025-01-01 16:18:52 +08:00
}
2024-08-27 19:41:15 +08:00
2025-01-01 16:18:52 +08:00
//398参数为1 第二场考试上车准备不考
2025-01-04 14:27:45 +08:00
if (this.systemParam.Param398 == '1') {
2025-01-02 17:50:08 +08:00
this.isSecondBoardPrePareSetPopupOpen = true;
2025-01-01 16:18:52 +08:00
}
2025-01-02 17:50:08 +08:00
2024-08-21 11:57:03 +08:00
this.pageIndex = 0
// getSyncData('USER').then(data => {
GetSyncData<User>("USER").then(data => {
2024-08-21 11:57:03 +08:00
if (data?.[0]) {
this.getCurrentStudent(data[0].sfzmhm)
}
})
}).catch((error: BusinessError) => {
2024-08-21 11:57:03 +08:00
this.updateTimeLimit = false
this.errorDialog.close()
console.log('error12error' + error)
2024-08-10 14:00:18 +08:00
})
2024-08-21 11:57:03 +08:00
} catch (error) {
2024-08-20 11:26:12 +08:00
this.updateTimeLimit = false
2024-08-21 11:57:03 +08:00
this.errorDialog.close()
console.log('error14error' + error)
}
2024-01-05 11:11:15 +08:00
}
2024-07-02 10:42:53 +08:00
2024-01-05 11:11:15 +08:00
qkFn() {
2025-01-04 14:27:45 +08:00
if (this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') {
2024-10-28 13:47:03 +08:00
return
}
2024-02-21 14:51:32 +08:00
this.faceCompareSucess = 0
2024-08-21 11:57:03 +08:00
this.ksksLimit = false
2025-02-12 10:48:27 +08:00
if (this.singlePlay) {
2024-02-21 14:51:32 +08:00
this.qkFlag = false
2024-01-05 11:11:15 +08:00
return
}
2024-02-21 14:51:32 +08:00
console.log('JsonJson', JSON.stringify(this.currentUser))
const param: ExaminationStuAbsentParams = {
carId: this.carInfo.carId,
sfzmhm: this.currentUser.sfzmhm,
examinationRoomId: this.carInfo.examinationRoomId,
username: this.examinerLoginInfo.username,
lsh: this.lsh
}
console.log('carNo1111', param)
2024-01-31 14:35:16 +08:00
2024-01-05 11:11:15 +08:00
examinationStuAbsent(param).then(res => {
const arr = [this.signNum || 0, 1]
let tmpList: number[] = [];
tmpList.push(NumberToByteArray(arr[0], 1 * 8)[0])
tmpList.push(NumberToByteArray(arr[1], 1 * 8)[0])
2025-02-12 10:48:27 +08:00
const param: UDPParamType = {
2024-02-21 14:51:32 +08:00
id: 43,
list: tmpList,
2025-02-12 10:48:27 +08:00
carNo: this.carInfo.carNo,
placeId: this.carInfo.examinationRoomId
2024-02-21 14:51:32 +08:00
}
2024-01-31 14:35:16 +08:00
2024-07-09 11:11:31 +08:00
globalThis.udpClient2.sendMsgExt(param, this.context)
if (res.examinationStuAbsentRsp.head.resultCode == '0') {
2024-01-05 11:11:15 +08:00
this.pageIndex = 0
2024-02-21 14:51:32 +08:00
this.qkFlag = false
2024-02-23 10:03:43 +08:00
this.currentUser = EmptyCandidateObject
2024-01-05 11:11:15 +08:00
this.getExaminationStudentInfoFn()
return
}
2025-02-18 10:47:28 +08:00
}).catch((error: BusinessError) => {
2024-01-05 11:11:15 +08:00
console.log('error12error' + error)
})
}
2024-07-02 10:42:53 +08:00
async getExaminationItemFn() {
2025-02-12 10:48:27 +08:00
if (!this.currentUser.lsh || this.singlePlay) {
2024-05-09 13:42:56 +08:00
return
}
// const { carId, examinationRoomId } = this.carInfo;
2024-05-09 13:42:56 +08:00
const examItems = await getExaminationItem({
time: await GetCurrentTime() || "",
carId: this.carInfo.carId,
2024-05-09 13:42:56 +08:00
lsh: this.currentUser.lsh || '',
examinationRoomId: this.carInfo.examinationRoomId
2024-05-09 13:42:56 +08:00
});
2024-07-31 13:47:40 +08:00
2024-07-02 10:42:53 +08:00
if (examItems?.getExaminationItemRsp?.body?.kssycs != 0) {
2024-05-09 13:42:56 +08:00
this.getExaminationStudentInfoFn()
2024-07-02 10:42:53 +08:00
} else {
this.dataList = []
2024-05-09 13:42:56 +08:00
this.currentUser = EmptyCandidateObject
}
}
2024-07-02 10:42:53 +08:00
2024-02-23 10:43:11 +08:00
//身份比对
async sfbdinterfaceFn() {
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('statue', 4)
this.stepFlag = true
let examItems: GetExaminationItemRsp = {
getExaminationItemRsp:
{
body: { ykxx: '' }
}
};
2025-02-12 10:48:27 +08:00
if (!this.singlePlay) {
2024-07-31 13:47:40 +08:00
//获取已考项目
examItems = await getExaminationItem({
time: await GetCurrentTime(),
carId: this.carInfo.carId,
2024-07-31 13:47:40 +08:00
lsh: this.currentUser.lsh || '',
examinationRoomId: this.carInfo.examinationRoomId
2024-07-31 13:47:40 +08:00
});
}
this.currentUser.id = '1'
2024-08-02 11:28:09 +08:00
const avPlayer = this.avPlayer;
this.isLoadingPopupVisible = true
2024-12-31 17:51:25 +08:00
2024-08-14 17:26:27 +08:00
avPlayer.playAudio([`voice/监管通信中.mp3`], false, async () => {
2025-01-04 14:27:45 +08:00
console.info('surenjun', '播放结束开始考试接口调用')
// const { code, keystr, message } = await this.beginExam() || {};
const res = await this.beginExam()
2025-01-04 14:27:45 +08:00
console.info('surenjun', '开始考试接口调用结束')
//TODO code转换
2025-01-02 17:50:08 +08:00
if (res.code != 1) {
avPlayer.playAudio([res.code == -200 ? 'voice/photo_error.mp3' : 'voice/监管审核未通过.mp3']);
2024-12-31 17:51:25 +08:00
this.isLoadingPopupVisible = false
this.isExamStart = false
2024-08-02 11:28:09 +08:00
promptAction.showToast({
message: res.message,
2024-08-14 17:26:27 +08:00
duration: 4000
2024-08-02 11:28:09 +08:00
})
return
2024-07-31 13:47:40 +08:00
}
2024-08-21 11:57:03 +08:00
this.currentUser.id = '0'
2024-08-02 11:28:09 +08:00
await upDateTableByArray('USER', [this.currentUser])
this.stepFlag = false
this.isLoadingPopupVisible = false
router.pushUrl({
url: 'pages/Judge',
params: {
examItems: examItems?.getExaminationItemRsp?.body?.ykxx,
sczb: Number(this.isBoardPrePareSetPopupOpen),
2024-08-19 10:11:22 +08:00
kfdm: this.sczbkf,
//真实监管项目
kString: decodeURIComponent(res.keystr || '')
2024-08-02 11:28:09 +08:00
}
}, router.RouterMode.Single);
2024-08-21 11:57:03 +08:00
this.updateTimeLimit = false
2024-08-02 11:28:09 +08:00
this.stopDeviceById()
this.stepFlag = false
})
2024-07-31 13:47:40 +08:00
}
// 检测车门、熄火信号
2024-08-02 11:05:23 +08:00
async checkSignal(): Promise<boolean> {
// const { isCheckFireOpen } = judgeConfig
// const { systemParam } = this;
const Param803Str = this.systemParam.Param803Str
2024-08-14 17:26:27 +08:00
if (Param803Str === '') {
2024-08-12 10:19:31 +08:00
return true
}
2024-08-14 17:26:27 +08:00
return new Promise((resolve, reject) => {
if (judgeConfig.isCheckFireOpen) {
2024-07-31 13:47:40 +08:00
resolve(true)
2024-08-12 10:19:31 +08:00
return
2024-08-02 11:28:09 +08:00
}
// TODO UDP缺失
// let plcValue = globalThis.udpClient.getCurrentMessage();
let plcValue = "";
const msgArr = plcValue.split(',').map(Number) || ''
2024-08-02 11:28:09 +08:00
const mkg = msgArr[14];
const fdjzs = msgArr[25];
2024-08-12 10:19:31 +08:00
const aqd = msgArr[19];
const jgd = msgArr[7];
const ygd = msgArr[8];
const ssc = msgArr[13];
const dw = msgArr[28];
// 开始考试信号检测
2024-08-14 17:26:27 +08:00
if (Param803Str !== '') {
2024-08-12 10:19:31 +08:00
//安全带
2024-08-14 17:26:27 +08:00
if (aqd == 1 && Param803Str.includes('1')) {
2024-08-12 10:19:31 +08:00
this.avPlayer.playAudio(['voice/请解开安全带.mp3'])
promptAction.showToast({
2024-08-14 17:26:27 +08:00
message: '请解开安全带',
duration: 4000
2024-08-12 10:19:31 +08:00
})
reject(false)
}
//门开关
2024-08-14 17:26:27 +08:00
if (mkg == 1 && Param803Str.includes('2')) {
2024-08-12 10:19:31 +08:00
this.avPlayer.playAudio(['voice/关门.mp3'])
promptAction.showToast({
2024-08-14 17:26:27 +08:00
message: '请关闭车门',
duration: 4000
2024-08-12 10:19:31 +08:00
})
reject(false)
}
//远、近光灯
2024-08-14 17:26:27 +08:00
if ((jgd == 1 || ygd == 1) && Param803Str.includes('3')) {
2024-08-12 10:19:31 +08:00
this.avPlayer.playAudio(['voice/请关闭远近光灯.mp3'])
promptAction.showToast({
2024-08-14 17:26:27 +08:00
message: '请关闭远近光灯',
duration: 4000
2024-08-12 10:19:31 +08:00
})
reject(false)
}
//拉手刹
2024-08-14 17:26:27 +08:00
if (ssc == 0 && Param803Str.includes('4')) {
2024-08-12 10:19:31 +08:00
this.avPlayer.playAudio(['voice/请拉手刹.mp3'])
promptAction.showToast({
2024-08-14 17:26:27 +08:00
message: '请拉手刹',
duration: 4000
2024-08-12 10:19:31 +08:00
})
reject(false)
}
//请点火
if (fdjzs <= 0 && Param803Str.includes('5')) {
2024-08-12 10:19:31 +08:00
this.avPlayer.playAudio(['voice/点火.mp3'])
promptAction.showToast({
2024-08-14 17:26:27 +08:00
message: '请点火',
duration: 4000
2024-08-12 10:19:31 +08:00
})
reject(false)
}
//置空档
2024-08-14 17:26:27 +08:00
if (dw != 0 && Param803Str.includes('6')) {
2024-08-12 10:19:31 +08:00
this.avPlayer.playAudio(['voice/请置空档.mp3'])
promptAction.showToast({
2024-08-14 17:26:27 +08:00
message: '请置空档',
duration: 4000
2024-08-12 10:19:31 +08:00
})
reject(false)
}
2024-08-02 11:28:09 +08:00
}
//TODO 考前绕车一周信号检测
// if (isBoardPrePareSetPopupOpen) {
if (false) {
2024-08-12 10:19:31 +08:00
//请熄火
if (fdjzs > 0) {
2024-08-12 10:19:31 +08:00
this.avPlayer.playAudio(['voice/熄火.mp3'])
promptAction.showToast({
2024-08-14 17:26:27 +08:00
message: '请熄火',
duration: 4000
2024-08-12 10:19:31 +08:00
})
reject(false)
}
2024-08-14 17:26:27 +08:00
if (mkg == 1) {
2024-08-12 10:19:31 +08:00
this.avPlayer.playAudio(['voice/关门.mp3'])
promptAction.showToast({
2024-08-14 17:26:27 +08:00
message: '请关闭车门',
duration: 4000
2024-08-12 10:19:31 +08:00
})
reject(false)
}
2024-07-31 13:47:40 +08:00
}
2024-08-12 10:19:31 +08:00
resolve(true)
2024-07-31 13:47:40 +08:00
})
}
2024-08-02 11:05:23 +08:00
2024-07-31 13:47:40 +08:00
// 开始考试
async beginExam(): Promise<BeginExamRequest> {
// const { examSubject, plateNo } = this.carInfo;
2024-07-31 13:47:40 +08:00
const date = new Date()
// const startHourTime = await getCurrentHourTime()
const startHourTime = dayTs().format("HHmmssSSS")
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('startHourTime', startHourTime)
2024-07-31 13:47:40 +08:00
const photoBase64 = await this.getPhoto();
2025-01-04 14:27:45 +08:00
if (photoBase64 == '') {
this.ksksLimit = false
this.isLoadingPopupVisible = false
return { code: -200 }
2024-12-24 16:43:59 +08:00
}
const drvexam: DrvexamType = {
lsh: "this.currentUser.lsh",
kskm: this.carInfo.examSubject,
2024-01-05 11:11:15 +08:00
ksxtbh: this.ksxtbh || '222',
sfzmhm: this.currentUser.sfzmhm || '',
ksysfzmhm: this.currentUser.ksy1sfzmhm || '',
2024-08-16 08:53:46 +08:00
ksxl: this.currentUser.xldm,
2024-07-31 13:47:40 +08:00
zp: photoBase64,
kssj: dayTs(date).format("YYYY-MM-DD HH:mm:ss") || '',
kchp: decodeURI(this.carInfo.plateNo),
2024-02-22 17:33:10 +08:00
Ksy2sfzmhm: this.currentUser.ksy2sfzmhm || ''
2024-01-05 11:11:15 +08:00
}
const param: RegulatoryInterfaceParams = {
2024-07-31 13:47:40 +08:00
drvexam,
2024-01-05 11:11:15 +08:00
xtlb: '17',
//接口序列号
2024-09-02 19:23:56 +08:00
jkxlh: this.jkxlh,
2024-01-05 11:11:15 +08:00
//接口标识
jkid: '17C51',
}
2024-12-20 13:28:03 +08:00
console.info('surenjunjianguan', JSON.stringify(param))
2024-08-12 10:19:31 +08:00
const temp = await writeObjectOut(param);
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('lsh', this.currentUser.lsh)
this.examinerLoginInfo.ksyh = this.currentUser.ksy1sfzmhm
AppStorage.setOrCreate('examinerLoginInfo', this.examinerLoginInfo)
2024-08-12 10:19:31 +08:00
return temp
2024-01-05 11:11:15 +08:00
}
2024-07-02 10:42:53 +08:00
//开始上车准备
2024-11-18 15:16:42 +08:00
prePareSCZB = async () => {
try {
await this.checkSignal()
this.isExamStart = true
this.currentUser.id = '0'
2025-01-20 08:50:40 +08:00
DB.insertData("USER", this.currentUser).then(res => {
console.log("USER insert success",)
}).catch((err: BusinessError) => {
2025-01-20 08:50:40 +08:00
console.log("USER insert fail", JSON.stringify(err))
})
// await upDateTableByArray('USER', [this.currentUser])
console.log("User", JSON.stringify(this.currentUser))
// await sqlInsertCommonFn("USER", [this.currentUser])
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('statue', 4)
this.isBoardPrePareSetPopupShow = true;
this.isFirstBoardPrePareSetPopupBtnShow = true;
this.stepFlag = false
this.stopDeviceById()
} catch (e) {
}
}
2024-02-23 10:43:11 +08:00
aboutToDisappear() {
this.outClick()
}
2024-07-02 10:42:53 +08:00
2024-02-23 10:43:11 +08:00
outClick() {
clearInterval(this.interval)
2024-03-05 15:44:53 +08:00
this.stopDeviceById()
// TODO 缺失UDP
// globalThis.udpClient2 && globalThis.udpClient2?.setMsgCallBack(() => {
// })
2024-02-23 10:43:11 +08:00
}
2024-07-02 10:42:53 +08:00
2024-02-22 17:33:10 +08:00
// 几个按钮公共样式
@Styles
commStyle(){
.width(220 * this.ratio)
.height(69 * this.ratio)
.backgroundImage($r('app.media.button_nor'))
.backgroundImageSize({ width: '100%', height: '100%' })
.margin({ bottom: 12 * this.ratio })
}
2024-01-05 11:11:15 +08:00
build() {
Column() {
2024-07-05 09:34:03 +08:00
TopLogo({ outFlag: $outFlag }).margin({ bottom: 10 })
2024-01-05 11:11:15 +08:00
Row() {
Row() {
ForEach(this.dataList, (item: User) => {
2024-01-05 11:11:15 +08:00
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
Column() {
2024-02-22 17:33:10 +08:00
CommText({
ratio: this.ratio,
color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000',
text: item.lsh
})
CommText({
ratio: this.ratio,
color: item.sfzmhm != this.currentUser.sfzmhm ? '#FFFFFF' : '#000000',
text: decodeURIComponent(item.xm)
})
2024-01-05 11:11:15 +08:00
}
}
.width(165 * this.ratio)
.height(85 * this.ratio)
2025-02-11 09:09:34 +08:00
.backgroundImage(item.sfzmhm != this.currentUser.sfzmhm ? $r('app.media.userbox2') :
$r('app.media.userboxbg'))
2024-01-05 11:11:15 +08:00
.backgroundImageSize({ width: '100%', height: '100%' })
.onClick(() => {
2025-01-04 14:27:45 +08:00
console.log('this.startExam', this.startExam, this.systemParam.Param364, this.isExamStart)
2025-02-12 10:48:27 +08:00
if ((this.isExamStart && !this.singlePlay && this.systemParam.Param341) ||
2025-02-11 09:09:34 +08:00
(this.startExam && this.systemParam.Param364 == '2')) {
2024-08-10 14:00:18 +08:00
return
}
2025-01-04 14:27:45 +08:00
this.currentUser = EmptyCandidateObject
2025-02-18 10:47:28 +08:00
AppStorage.setOrCreate('lsh', item.lsh)
2025-01-04 14:27:45 +08:00
setTimeout(() => {
2024-08-27 19:41:15 +08:00
this.currentUser = item
2025-02-12 10:48:27 +08:00
this.currentUser.ksy2 = this.examinerLoginInfo.kgxm
2024-12-05 13:51:36 +08:00
2025-01-04 14:27:45 +08:00
}, 200)
2024-08-19 10:11:22 +08:00
2024-01-05 11:11:15 +08:00
})
})
}.width(640 * this.ratio).margin({ left: 30 * this.ratio })
Image($r('app.media.dk_prev'))
.width(90 * this.ratio)
.height(70 * this.ratio)
.margin({ left: 65 * this.ratio, right: 10 * this.ratio })
2024-01-05 11:11:15 +08:00
.onClick(() => {
2024-12-29 21:43:12 +08:00
// this.avPlayer.playAudio(['button_media.wav'])
2024-01-05 11:11:15 +08:00
this.prevClick()
})
Image($r('app.media.dk_next')).width(90 * this.ratio).height(70 * this.ratio).onClick(() => {
2024-12-30 15:32:14 +08:00
// this.avPlayer.playAudio(['button_media.wav'])
2024-01-05 11:11:15 +08:00
this.nextClick()
})
}.margin({ top: 40 * this.ratio, bottom: 10 * this.ratio })
Flex({ justifyContent: FlexAlign.SpaceBetween }) {
Row() {
Column() {
if (this.currentUser.kszp) {
2024-02-22 17:33:10 +08:00
Avatar({
ratio: this.ratio,
url: this.currentUser.kszp ? this.currentUser.kszp : ''
2024-02-22 17:33:10 +08:00
})
2024-02-21 14:51:32 +08:00
} else {
2024-02-22 17:33:10 +08:00
Avatar({
ratio: this.ratio,
url: ""
})
2024-01-31 14:35:16 +08:00
}
if (this.currentUser.ksmjzp) {
2024-02-22 17:33:10 +08:00
Avatar({
ratio: this.ratio,
url: this.currentUser.ksmjzp ? this.currentUser.ksmjzp : ''
2024-02-22 17:33:10 +08:00
})
2024-02-21 14:51:32 +08:00
} else {
2024-05-09 13:42:56 +08:00
2024-02-22 17:33:10 +08:00
Avatar({
ratio: this.ratio,
url: ""
})
2024-01-31 14:35:16 +08:00
}
2024-01-05 11:11:15 +08:00
}
Column() {
ForEach(this.labelBlocks, (item: LabelBlockType) => {
LabelBlock({
label: item.label,
ratio: this.ratio,
value: GetCurrentUserKeyValue(this.currentUser, item.key)
})
2024-02-22 17:33:10 +08:00
})
2024-01-05 11:11:15 +08:00
}
}
.width(664 * this.ratio)
.height(339 * this.ratio)
.backgroundImage($r('app.media.dkbg'))
.backgroundImageSize({ width: '100%', height: '100%' })
.margin({ left: 53 * this.ratio })
Column() {
2025-01-01 16:18:52 +08:00
// Image($r('app.media.yydj_btn'))
// .commStyle()
2025-01-04 14:27:45 +08:00
imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.yydj_btn') })
.margin({ bottom: 12 * this.ratio })
2025-01-01 16:18:52 +08:00
// Image($r('app.media.gx_btn'))
// .commStyle()
2025-01-04 14:27:45 +08:00
imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.gx_btn') })
.margin({ bottom: 12 * this.ratio })
2024-02-21 14:51:32 +08:00
.onClick(() => {
2024-12-29 21:43:12 +08:00
// this.avPlayer.playAudio(['button_media.wav'])
2025-02-12 10:48:27 +08:00
if (this.isExamStart && !this.singlePlay) {
2024-09-12 13:30:04 +08:00
return
}
2024-02-21 14:51:32 +08:00
this.faceCompareSucess = 0
this.numCount = 0
this.getExaminationStudentInfoFn()
})
2025-01-01 16:18:52 +08:00
// Image($r('app.media.qk_btn'))
// .commStyle()
2025-01-04 14:27:45 +08:00
imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.qk_btn') })
.margin({ bottom: 12 * this.ratio })
2024-01-05 11:11:15 +08:00
.onClick(() => {
2024-12-29 21:43:12 +08:00
// this.avPlayer.playAudio(['button_media.wav'])
2024-10-28 17:11:22 +08:00
// 已开始考试不能缺考 已考过一次学员不能缺考 车上不能缺考
2025-02-11 09:09:34 +08:00
if (this.ksksLimit || (this.systemParam.Param352Str == '1' && this.currentUser.kssycs == '1') ||
this.systemParam.Param770Str == '1') {
2024-08-20 09:12:02 +08:00
return
}
2024-08-21 11:57:03 +08:00
this.ksksLimit = true
2024-02-21 14:51:32 +08:00
this.qkFlag = true
2024-01-05 11:11:15 +08:00
})
2024-07-05 09:34:03 +08:00
2025-02-11 09:09:34 +08:00
if (this.isBoardPrePareSetPopupOpen &&
(this.isSecondBoardPrePareSetPopupOpen && this.currentUser.kssycs == '2') &&
!this.isFirstBoardPrePareSetPopupBtnShow) {
2024-07-05 09:34:03 +08:00
//上车准备
2025-01-01 16:18:52 +08:00
// Image($r('app.media.sczb_btn')).commStyle()
2025-01-04 14:27:45 +08:00
imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.sczb_btn') })
.margin({ bottom: 12 * this.ratio })
2025-01-01 16:18:52 +08:00
.onClick(async () => {
2025-01-04 14:27:45 +08:00
if (this.systemParam.Param612Str == '1') {
2025-01-02 17:50:08 +08:00
return
}
await this.prePareSCZB()
})
2024-08-02 11:05:23 +08:00
} else {
2025-01-01 16:18:52 +08:00
// Image($r('app.media.ksks_btn'))
// .commStyle()
2025-01-04 14:27:45 +08:00
imageBtn({ btnWidth: 220 * this.ratio, btnHeight: 69 * this.ratio, imgSrc: $r('app.media.ksks_btn') })
.margin({ bottom: 12 * this.ratio })
2024-07-31 13:47:40 +08:00
.onClick(async () => {
2025-01-04 14:27:45 +08:00
if (this.systemParam.Param612Str == '1') {
2024-08-20 09:12:02 +08:00
return
}
await this.prePareExam()
2024-07-05 09:34:03 +08:00
})
}
2024-01-05 11:11:15 +08:00
}
}
if (this.showFaceCompare) {
FaceCompare({
sfzh: this.currentUser.sfzmhm,
firstImage: this.currentUser.kszp,
faceCompareSucess: $faceCompareSucess,
getqkFlag: $getqkFlag,
faceCatchImg: $faceCatchImg,
2024-02-23 16:12:22 +08:00
showFaceCompare: $showFaceCompare,
2025-03-26 14:48:56 +08:00
lsh: AppStorage.get<string>('lsh'),
})
2024-01-05 11:11:15 +08:00
}
if (this.qkFlag) {
Column() {
Text('确认考生:' + this.currentUser.xm + '是否缺考')
.fontSize(28 * this.ratio)
.position({ x: 160 * this.ratio, y: 122 * this.ratio })
Row() {
2024-01-05 11:11:15 +08:00
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
Text(' 取 消 ').fontSize(24 * this.ratio).fontColor('#fff').width(100 * this.ratio)
}
2024-02-22 17:33:10 +08:00
.commStyle()
2024-02-21 14:51:32 +08:00
.onClick(() => {
2024-12-30 15:32:14 +08:00
// this.avPlayer.playAudio(['button_media.wav'])
2024-08-21 11:57:03 +08:00
this.ksksLimit = false
2024-02-21 14:51:32 +08:00
this.qkFlag = false
2024-01-05 11:11:15 +08:00
})
2024-01-05 11:11:15 +08:00
Flex({ justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
Text(' 确 定 ').fontSize(24 * this.ratio).fontColor('#fff').width(100 * this.ratio)
}
2024-02-22 17:33:10 +08:00
.commStyle()
2024-02-21 14:51:32 +08:00
.onClick(() => {
2024-12-30 15:32:14 +08:00
// this.avPlayer.playAudio(['button_media.wav'])
2024-01-05 11:11:15 +08:00
this.qkFn()
})
}.position({ y: 265 * this.ratio, x: 115 * this.ratio })
2024-01-05 11:11:15 +08:00
}
.width(660 * this.ratio)
2024-01-05 11:11:15 +08:00
.height(360 * this.ratio)
.position({ x: 150 * this.ratio, y: 98 * this.ratio })
.backgroundColor('#E6E3DF')
.borderRadius(19 * this.ratio)
}
2024-07-05 09:34:03 +08:00
2024-07-31 13:47:40 +08:00
// 上车准备弹窗
2024-08-02 11:05:23 +08:00
if (this.isBoardPrePareSetPopupShow) {
2024-07-05 09:34:03 +08:00
BoardPrePareSetPopup({
closePopup: () => {
2024-07-31 13:47:40 +08:00
this.isBoardPrePareSetPopupShow = false;
2024-07-05 09:34:03 +08:00
},
confirmMark: (kfdm: SckType[]) => {
2024-07-31 13:47:40 +08:00
this.sczbkf = kfdm
2024-07-05 09:34:03 +08:00
}
})
}
2024-07-31 13:47:40 +08:00
// loading
2024-08-14 17:26:27 +08:00
if (this.isLoadingPopupVisible) {
2024-08-02 11:28:09 +08:00
LoadingPopup({
title: this.loadingText,
})
}
2024-01-05 11:11:15 +08:00
}
.height('100%')
.width('100%')
.backgroundImage($r('app.media.bg'))
.backgroundImageSize({ width: '100%', height: '100%' })
}
2024-02-22 17:33:10 +08:00
}
// 头像组件
@Component
struct Avatar {
@State ratio: number = 0
@State url: string = ""
build() {
Row() {
Image(this.url)
.width(93 * this.ratio)
.height(130.5 * this.ratio)
.margin({ bottom: 10 * this.ratio, right: 58 * this.ratio, left: 55 * this.ratio })
.backgroundColor('orange')
.border({ color: '#fff', width: 1, style: BorderStyle.Solid })
2024-08-27 19:41:15 +08:00
.syncLoad(true)
2024-02-22 17:33:10 +08:00
}
}
}
// 横向滚动学员列表里面文字
@Component
struct CommText {
2024-05-09 13:42:56 +08:00
@Prop text: string
@Prop color: string
@Prop ratio: number
2024-02-22 17:33:10 +08:00
build() {
Text(this.text)
2024-08-14 17:26:27 +08:00
.fontSize(19.5 * this.ratio)
2024-02-22 17:33:10 +08:00
.lineHeight(30 * this.ratio)
.fontWeight(500)
.fontColor(this.color)
}
}
// 考生信息的labelBlock组件
@Component
struct LabelBlock {
@State label: string = ''
@State ratio: number = 0
@Prop value: string = ''
@Styles
commLabelStyle(){
.width(280 * this.ratio)
.height(35 * this.ratio)
.backgroundImageSize({ width: '100%', height: '100%' })
.backgroundImage($r('app.media.userbox'))
.margin({ left: 8 * this.ratio })
.align(Alignment.Center)
}
build() {
Row() {
2024-08-15 17:55:47 +08:00
Text(this.label).fontSize(20 * this.ratio).fontColor('#99948A')
2024-02-22 17:33:10 +08:00
Row() {
2025-01-04 14:27:45 +08:00
Text(decodeURIComponent(this.value || '') || '')
2024-08-21 11:57:03 +08:00
.fontColor('#fff')
.textAlign(TextAlign.Center)
.width('100%')
.fontSize(18 * this.ratio)
2024-02-22 17:33:10 +08:00
}
.commLabelStyle()
}.margin({ bottom: 10 * this.ratio })
}
2024-10-28 17:11:22 +08:00
}