Files
pqs-9100_client/frontend/src/views/home/components/comparePreTest.vue

536 lines
15 KiB
Vue
Raw Normal View History

2025-08-05 10:37:40 +08:00
<template>
<div>
<el-tabs type="border-card">
<el-tab-pane label="预检测项目">
<div class="form-grid">
<el-checkbox v-for="(item, index) in detectionOptions" v-model="item.selected" :key="index"
:label="item.name" disabled></el-checkbox>
</div>
</el-tab-pane>
</el-tabs>
<div class="test-dialog">
<div class="dialog-left">
<el-steps direction="vertical" :active="activeIndex" :process-status="currentStepStatus"
finish-status="success">
<el-step :status="step1" title="设备通讯校验"/>
2025-08-08 15:27:17 +08:00
<el-step :status="step2" title="模型一致性校验"/>
<el-step :status="step3" title="实时数据对齐验证"/>
<el-step :status="step4" title="相序校验"/>
2025-08-05 10:37:40 +08:00
<!-- <el-step :status="step6" title="遥控录波功能验证"/> -->
2025-08-08 15:27:17 +08:00
<el-step :status="step5" :title="ts === 'error'? '检测失败':ts === 'process'? '检测中':ts === 'success'? '检测成功':'待检测'"/>
2025-08-05 10:37:40 +08:00
</el-steps>
</div>
<div class="dialog-right">
<el-collapse v-model="collapseActiveName" accordion>
<el-collapse-item title="设备通讯校验" name="1">
<div class="div-log">
<p v-for="(item, index) in step1InitLog" :key="index"
:style="{ color: item.type === 'error' ? '#F56C6C' : 'var(--el-text-color-regular)' }">
{{ item.log }} <br/>
</p>
</div>
</el-collapse-item>
2025-08-08 15:27:17 +08:00
<el-collapse-item title="模型一致性校验" name="2">
2025-08-05 10:37:40 +08:00
<div class="div-log">
<p v-for="(item, index) in step2InitLog" :key="index"
:style="{ color: item.type === 'error' ? '#F56C6C' : 'var(--el-text-color-regular)' }">
{{ item.log }} <br/>
</p>
</div>
</el-collapse-item>
2025-08-08 15:27:17 +08:00
<el-collapse-item name="3">
2025-08-05 10:37:40 +08:00
<template #title>
实时数据对齐验证
2025-08-11 15:59:29 +08:00
<el-icon class="title-icon" @click="openDialog" v-if="isShowDialog"><InfoFilled/></el-icon>
2025-08-05 10:37:40 +08:00
</template>
<div class="div-log">
2025-08-08 15:27:17 +08:00
<p v-for="(item, index) in step3InitLog" :key="index"
2025-08-05 10:37:40 +08:00
:style="{ color: item.type === 'error' ? '#F56C6C' : 'var(--el-text-color-regular)' }">
{{ item.log }}
<br/>
</p>
</div>
</el-collapse-item>
2025-08-08 15:27:17 +08:00
<el-collapse-item title="相序校验" name="4">
2025-08-05 10:37:40 +08:00
<div class="div-log">
2025-08-08 15:27:17 +08:00
<p v-for="(item, index) in step4InitLog" :key="index"
2025-08-05 10:37:40 +08:00
:style="{ color: item.type === 'error' ? '#F56C6C' : 'var(--el-text-color-regular)' }">
{{ item.log }} <br/>
</p>
</div>
</el-collapse-item>
<!-- <el-collapse-item title="遥控录波功能验证" name="3">
<div class="div-log">
<p v-for="(item, index) in step3InitLog" :key="index"
:style="{ color: item.type === 'error' ? '#F56C6C' : 'var(--el-text-color-regular)' }">
{{ item.log.split('&&')[0] }}
<br v-if="item.log.includes('&&')"/>
&nbsp;&nbsp;&nbsp;&nbsp;{{ item.log.split('&&')[1] }}
<br v-if="item.log.includes('&&')"/>
&nbsp;&nbsp;&nbsp;&nbsp;{{ item.log.split('&&')[2] }}
</p>
</div>
</el-collapse-item> -->
</el-collapse>
</div>
</div>
</div>
2025-08-08 13:18:01 +08:00
<RealTimeData ref="realTimeDataRef" />
2025-08-05 10:37:40 +08:00
</template>
<script lang="tsx" setup name="preTest">
import {ElMessage, ElMessageBox, StepProps} from "element-plus";
2025-08-08 13:18:01 +08:00
import {defineExpose, PropType, ref, toRef, watch} from 'vue';
2025-08-05 10:37:40 +08:00
import RealTimeData from './realTimeDataAlign.vue'
const realTimeDataRef = ref()
const step1InitLog = ref([
{
type: 'info',
log: '暂无数据,等待检测开始',
},
])
const step2InitLog = ref([
{
type: 'info',
log: '暂无数据,等待检测开始',
},
])
const step3InitLog = ref([
{
type: 'info',
log: '暂无数据,等待检测开始',
},
])
const step4InitLog = ref([
{
type: 'info',
log: '暂无数据,等待检测开始',
},
])
2025-08-12 20:17:37 +08:00
const isShowDialog = ref(false)
2025-08-05 10:37:40 +08:00
const collapseActiveName = ref('1')
const activeIndex = ref(0)
const activeTotalNum = ref(5)
const step1 = ref<StepProps['status']>('wait')
const step2 = ref<StepProps['status']>('wait')
const step3 = ref<StepProps['status']>('wait')
const step4 = ref<StepProps['status']>('wait')
const step5 = ref<StepProps['status']>('wait')
2025-08-08 15:27:17 +08:00
2025-08-05 10:37:40 +08:00
//定义与预检测配置数组
const detectionOptions = ref([
{
id: 0,
name: "设备通讯校验",
selected: true,
},
{
id: 1,
name: "模型一致性校验",
selected: true,
},
{
2025-08-08 15:27:17 +08:00
id: 2,
2025-08-05 10:37:40 +08:00
name: "实时数据对齐验证",
selected: true,
},
{
2025-08-08 15:27:17 +08:00
id: 3,
2025-08-05 10:37:40 +08:00
name: "相序校验",
selected: true,
},
]);
const currentStepStatus = ref<'error' | 'finish' | 'wait' | 'success' | 'process'>('finish');
const props = defineProps({
testStatus: {
type: String,
default: 'wait'
},
webMsgSend: {
type: Object,
default: () => ({})
2025-08-08 13:18:01 +08:00
},
mapping: {
type: Object as PropType<Record<string, Record<string, string>>>,
default: () => ({})
2025-08-05 10:37:40 +08:00
}
})
const testStatus = toRef(props, 'testStatus');
const webMsgSend = toRef(props, 'webMsgSend');
const ts = ref('');
2025-08-12 20:17:37 +08:00
// 在 script setup 中定义接口
interface ChannelData {
devNum: string;
standardDevInfo: string;
dataList: {
timeDev: string | null;
uaDev: number | null;
ubDev: number | null;
ucDev: number | null;
timeStdDev: string | null;
uaStdDev: number | null;
ubStdDev: number | null;
ucStdDev: number | null;
}[];
}
interface DeviceData {
devName: string;
channelDataList: ChannelData[];
}
// 修改 testDataStructure 的类型声明
const testDataStructure = ref<Record<string, DeviceData>>({});
2025-08-05 10:37:40 +08:00
watch(webMsgSend, function (newValue, oldValue) {
2025-08-12 08:34:09 +08:00
console.log('webMsgSend', newValue)
2025-08-05 10:37:40 +08:00
if (testStatus.value !== 'waiting') {
2025-08-12 20:17:37 +08:00
if(newValue.code == 25004){
ElMessage.error('接收数据超时!')
ts.value = 'error'
step5.value = 'error'
}
2025-08-05 10:37:40 +08:00
switch (newValue.requestId) {
case 'yjc_sbtxjy':
switch (newValue.operateCode) {
2025-08-12 20:17:37 +08:00
case 'INIT_GATHER$02':
2025-08-05 10:37:40 +08:00
if (newValue.code == 10200) {
step1InitLog.value.push({
type: 'info',
log: newValue.data + '设备通讯校验成功!',
})
} else if (newValue.code == 10201) {
step1.value = 'process'
step1InitLog.value = [{
type: 'wait',
log: '正在进行设备通讯校验.....',
}];
} else if (newValue.code == 10550) {
step1InitLog.value.push({
type: 'error',
log: newValue.data + '设备连接异常!',
})
step1.value = 'error'
2025-08-11 15:59:29 +08:00
ts.value = 'error'
step5.value = 'error'
2025-08-05 10:37:40 +08:00
} else if (newValue.code == 10551) {
step1InitLog.value.push({
type: 'error',
log: newValue.data + '设备触发报告异常!',
})
step1.value = 'error'
ts.value = 'error'
2025-08-11 15:59:29 +08:00
step5.value = 'error'
2025-08-05 10:37:40 +08:00
} else if (newValue.code == 10552) {
2025-08-08 13:18:01 +08:00
step1InitLog.value = [{
2025-08-11 15:59:29 +08:00
type: 'error',
2025-08-05 10:37:40 +08:00
log: '存在已经初始化步骤,执行自动关闭,请重新发起检测!',
}];
step1.value = 'error'
ts.value = 'error'
2025-08-11 15:59:29 +08:00
step5.value = 'error'
2025-08-05 10:37:40 +08:00
} else if (newValue.code == 25001) {
activeIndex.value = 1
step1.value = 'success'
2025-08-06 15:18:27 +08:00
step2.value = 'process'
2025-08-05 10:37:40 +08:00
}
break;
}
break;
2025-08-11 15:59:29 +08:00
case 'yjc_mxyzxjy':
2025-08-06 15:18:27 +08:00
switch (newValue.operateCode){
case 'DATA_REQUEST$02':
2025-08-11 15:59:29 +08:00
if (newValue.code == 10200) { //单个监测点成功
2025-08-08 15:27:17 +08:00
step2InitLog.value.push({
2025-08-06 15:18:27 +08:00
type: 'info',
2025-08-12 20:17:37 +08:00
log: newValue.data + '模型一致性检验成功!',
2025-08-06 15:18:27 +08:00
})
2025-08-12 20:17:37 +08:00
}else if (newValue.code == 10201) {
step2.value = 'process'
step2InitLog.value = [{
type: 'wait',
log: '正在进行模型一致性校验.....',
}];
} else if (newValue.code == 25002) { //单个监测点失败
2025-08-11 15:59:29 +08:00
step2InitLog.value.push({
type: 'error',
2025-08-13 15:52:48 +08:00
log: newValue.data +'模型一致性检验失败!',
2025-08-11 15:59:29 +08:00
})
}else if (newValue.code == 25001) { //最终成功
2025-08-08 15:27:17 +08:00
step2.value = 'success'
step3.value = 'process'
activeIndex.value = 2
2025-08-11 15:59:29 +08:00
}else if (newValue.code == 25003) { //最终失败
step2.value = 'error'
ts.value = 'error'
step5.value = 'error'
2025-08-06 15:18:27 +08:00
}
break;
}
break;
2025-08-11 15:59:29 +08:00
case 'yjc_align':
2025-08-06 15:18:27 +08:00
switch (newValue.operateCode){
2025-08-11 15:59:29 +08:00
case 'DATA_REQUEST$02':
if (newValue.code == 10200) { //单个监测点成功
step3InitLog.value.push({
type: 'info',
2025-08-12 20:17:37 +08:00
log: newValue.data +'实时数据对齐检验成功!',
2025-08-11 15:59:29 +08:00
})
2025-08-12 20:17:37 +08:00
}else if (newValue.code == 10201) {
step3.value = 'process'
step3InitLog.value = [{
type: 'wait',
log: '正在进行实时数据对齐检验.....',
}];
2025-08-11 15:59:29 +08:00
}else if (newValue.code == 25002) { //单个监测点失败
step3InitLog.value.push({
type: 'error',
2025-08-13 15:52:48 +08:00
log: newValue.data + '实时数据对齐检验失败!',
2025-08-11 15:59:29 +08:00
})
2025-08-12 20:17:37 +08:00
}else if (newValue.code == 25001 && newValue.data) { //最终成功
isShowDialog.value = true
step3.value = 'success'
2025-08-11 15:59:29 +08:00
step4.value = 'process'
activeIndex.value = 3
2025-08-12 20:17:37 +08:00
testDataStructure.value = newValue.data
2025-08-11 15:59:29 +08:00
}else if (newValue.code == 25003) { //最终失败
2025-08-12 20:17:37 +08:00
isShowDialog.value = true
2025-08-11 15:59:29 +08:00
step3.value = 'error'
ts.value = 'error'
step5.value = 'error'
}
2025-08-06 15:18:27 +08:00
break;
}
break;
2025-08-05 10:37:40 +08:00
case 'YJC_xujy':
switch (newValue.operateCode) {
case 'DATA_REQUEST$02':
if (newValue.code == 10200) {
2025-08-08 15:27:17 +08:00
step4InitLog.value.push({
2025-08-11 15:59:29 +08:00
type: 'info',
2025-08-05 10:37:40 +08:00
log: newValue.data,
})
2025-08-12 20:17:37 +08:00
}else if (newValue.code == 10201) {
step4.value = 'process'
step4InitLog.value = [{
type: 'wait',
log: '正在进行相序性检.....',
}];
} else if(newValue.code == 25002){
2025-08-11 15:59:29 +08:00
step4InitLog.value.push({
type: 'error',
2025-08-13 15:52:48 +08:00
log: newValue.data + '相序校验失败!',
2025-08-11 15:59:29 +08:00
})
2025-08-05 10:37:40 +08:00
} else if (newValue.code == 25003) {
2025-08-08 15:27:17 +08:00
step4.value = 'error'
2025-08-05 10:37:40 +08:00
ts.value = 'error'
2025-08-08 15:27:17 +08:00
step5.value = 'error'
2025-08-05 10:37:40 +08:00
} else if (newValue.code == 25001) {
2025-08-08 15:27:17 +08:00
step4.value = 'success'
2025-08-05 10:37:40 +08:00
step5.value = 'success'
ts.value = 'success'
2025-08-11 15:59:29 +08:00
activeIndex.value = 4
2025-08-05 10:37:40 +08:00
}
break
}
break;
case 'quit':
break;
case 'connect':
switch (newValue.operateCode) {
2025-08-08 15:27:17 +08:00
case "Contrast_Dev":
2025-08-05 10:37:40 +08:00
step1.value = 'error'
step1InitLog.value = [{
type: 'error',
log: '设备服务端连接失败!',
}];
ts.value = 'error'
2025-08-08 15:27:17 +08:00
step5.value = 'error'
2025-08-05 10:37:40 +08:00
break;
}
break;
case 'unknown_operate':
break;
case 'error_flow_end':
ElMessageBox.alert(`设备连接异常,请检查设备连接情况!`, '检测失败', {
confirmButtonText: '确定',
type: 'error',
})
ts.value = 'error'
2025-08-08 15:27:17 +08:00
step5.value = 'error'
2025-08-05 10:37:40 +08:00
break;
case 'socket_timeout':
ElMessageBox.alert(`设备连接异常,请检查设备连接情况!`, '检测失败', {
confirmButtonText: '确定',
type: 'error',
})
ts.value = 'error'
2025-08-08 15:27:17 +08:00
step5.value = 'error'
2025-08-05 10:37:40 +08:00
break;
case 'server_error':
ElMessageBox.alert('服务端主动关闭连接!', '初始化失败', {
confirmButtonText: '确定',
type: 'error',
})
ts.value = 'error'
2025-08-08 15:27:17 +08:00
step5.value = 'error'
2025-08-05 10:37:40 +08:00
break;
case 'device_error':
ElMessageBox.alert('设备主动关闭连接!', '初始化失败', {
confirmButtonText: '确定',
type: 'error',
})
ts.value = 'error'
2025-08-08 15:27:17 +08:00
step5.value = 'error'
2025-08-05 10:37:40 +08:00
break;
}
}
})
watch(activeIndex, function (newValue, oldValue) {
if (newValue <= activeTotalNum.value - 2) {
collapseActiveName.value = (newValue + 1).toString()
} else {
2025-08-12 20:17:37 +08:00
collapseActiveName.value = newValue.toString()
2025-08-05 10:37:40 +08:00
}
})
//监听goods_sn的变化
watch(testStatus, function (newValue, oldValue) {
ts.value = props.testStatus;
if (ts.value === 'start') {
ts.value = 'process'
} else if (ts.value === 'waiting') {
activeIndex.value = 0
step1InitLog.value = [
{
type: 'info',
log: '暂无数据,等待检测开始',
},
]
step1.value = 'finish'
step2.value = 'wait'
step3.value = 'wait'
step4.value = 'wait'
step5.value = 'wait'
}
})
const emit = defineEmits(['update:testStatus']);
//监听sn
watch(ts, function (newValue, oldValue) {
//修改父组件
emit('update:testStatus', ts.value)
})
// 定义一个初始化参数的方法
function initializeParameters() {
activeIndex.value = 0
2025-08-12 20:17:37 +08:00
step1.value = 'wait'
2025-08-05 10:37:40 +08:00
step2.value = 'wait'
step3.value = 'wait'
step4.value = 'wait'
step5.value = 'wait'
step1InitLog.value = [
{
type: 'info',
log: '暂无数据,等待检测开始',
},
]
step2InitLog.value = [
{
type: 'info',
log: '暂无数据,等待检测开始',
},
]
step3InitLog.value = [
{
type: 'info',
log: '暂无数据,等待检测开始',
},
]
step4InitLog.value = [
{
type: 'info',
log: '暂无数据,等待检测开始',
},
]
2025-08-12 20:17:37 +08:00
// 清空实时数据对齐验证的数据
testDataStructure.value = {}
isShowDialog.value = false
2025-08-05 10:37:40 +08:00
}
const openDialog = () => {
2025-08-12 20:17:37 +08:00
realTimeDataRef.value.open(props.mapping,testDataStructure.value)
2025-08-05 10:37:40 +08:00
}
defineExpose({
initializeParameters,
});
</script>
<style scoped lang="scss">
.title-icon {
margin-left: 10px;
cursor: pointer;
font-size: 16px;
vertical-align: middle;
}
.test-dialog {
height: 350px;
display: flex;
flex-direction: row;
/* 横向排列 */
margin-top: 20px;
}
.dialog-left {
width: 15%;
margin-left: 20px;
}
.dialog-right {
margin-left: 20px;
width: 80%;
height: 100%;
}
.dialog-right :deep(.el-collapse-item__header) {
font-size: 16px;
}
.div-log {
height: 145px;
overflow-y: auto;
padding-left: 10px;
p {
margin: 5px 0;
font-size: 14px;
}
}
</style>