6 Commits

Author SHA1 Message Date
caozehui
03d1db3bb4 切换数据处理原则 2025-12-10 11:15:18 +08:00
caozehui
6334681dc5 微调 2025-12-09 09:58:29 +08:00
caozehui
211b727b47 误差切换时,生成检测报告 2025-12-08 10:56:35 +08:00
sjl
389857ac7e Merge branch 'master' of http://192.168.1.22:3000/ClientApps/pqs-9100_client 2025-12-05 11:04:11 +08:00
sjl
dde3f11bbe 1 2025-12-05 11:04:04 +08:00
sjl
ff90f51cf1 是否需要相序检测 2025-12-05 11:02:25 +08:00
7 changed files with 160 additions and 68 deletions

View File

@@ -83,7 +83,8 @@ export const reCalculate = (params: {
deviceId: string
code: string
patternId: string,
chnNum: string
chnNum?: string,
dataRuleId: string
}) => {
return http.post('/result/reCalculate', params, {loading: true})
}
@@ -115,6 +116,7 @@ export const getContrastResult = (params: {
waveNum: number | null
isWave: boolean
patternId: string
code: string
}) => {
return http.post('/result/getContrastResult', params, {loading: true})
}
@@ -130,7 +132,8 @@ export const changeErrorSystem = (params: {
deviceId: string
code: string
patternId: string,
chnNum: string
chnNum?: string,
dataRuleId: string
}) => {
return http.post('/result/changeErrorSystem', params, {loading: true})
}

View File

@@ -191,7 +191,7 @@ export default class SocketService {
*/
private config: SocketConfig = {
url: 'ws://127.0.0.1:7777/hello',
// url: 'ws://192.168.1.124:7777/hello',
//url: 'ws://192.168.1.124:7777/hello',
heartbeatInterval: 9000, // 9秒心跳间隔
reconnectDelay: 5000, // 5秒重连延迟
maxReconnectAttempts: 5, // 最多重连5次

View File

@@ -18,7 +18,7 @@
v-model="formContent.errorSysId"
placeholder="请选择误差体系"
autocomplete="off"
@change="handleErrorSysChange"
@change="handleErrorSysChange('切换误差体系成功')"
>
<el-option
v-for="option in pqErrorList"
@@ -29,7 +29,20 @@
</el-select>
</el-form-item>
<el-form-item label="数据原则">
<el-input v-model="formContent.dataRule" :disabled="true" />
<!-- <el-input v-model="formContent.dataRule" :disabled="true" />-->
<el-select
:disabled="checkStore.showDetailType === 2 || checkStore.showDetailType === 0"
v-model="formContent.dataRule"
placeholder="请选择数据原则"
autocomplete="off"
@change="handleErrorSysChange('切换数据处理原则成功')">
<el-option
v-for="item in dictStore.getDictData('Data_Rule')"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="设备名称">
<el-input v-model="formContent.deviceName" :disabled="true" />
@@ -55,7 +68,7 @@
</el-select>
</el-form-item>
<el-form-item v-if="checkStore.showDetailType === 1">
<el-button type="primary" :icon="Postcard">报告生成</el-button>
<el-button type="primary" :icon="Postcard" @click="handleGenerateReport">报告生成</el-button>
</el-form-item>
<el-form-item v-if="checkStore.showDetailType === 0">
<el-button type="primary" :icon="Histogram" @click="handleReCalculate">重新计算</el-button>
@@ -175,7 +188,7 @@ import CompareDataCheckRawDataTable from './compareDataCheckRawDataTable.vue'
import { CheckData } from '@/api/check/interface'
import { useCheckStore } from '@/stores/modules/check'
import { Histogram, Postcard } from '@element-plus/icons-vue'
import { getPqErrSysList } from '@/api/plan/plan'
import {generateDevReport, getPqErrSysList} from '@/api/plan/plan'
import { useModeStore } from '@/stores/modules/mode' // 引入模式 store
import { useDictStore } from '@/stores/modules/dict'
import {
@@ -392,6 +405,7 @@ const getBasicInformation = async (scriptType: any) => {
})
formContent.dataRule = res.data.dataRule
console.log('formContent.dataRule',formContent.dataRule)
formContent.deviceName = res.data.deviceName
formContent.errorSysId = res.data.errorSysId
chnMapList.value = res.data.chnMap
@@ -507,6 +521,7 @@ const getResults = async (code: any) => {
// 判断是否为录波数据请求
const isWaveDataRequest = code === 'wave_data' || isWaveData.value
console.log(checkStore.plan)
getContrastResult({
planId: checkStore.plan.id,
scriptType: rowList.value.scriptType,
@@ -515,7 +530,8 @@ const getResults = async (code: any) => {
num: formContent.num == '' ? null : formContent.num,
waveNum: isWaveDataRequest ? waveNumber.value : null,
isWave: isWaveDataRequest,
patternId: pattern.value
patternId: pattern.value,
code: checkStore.plan.code + (formContent.errorSysId!=checkStore.plan.errorSysId || formContent.dataRule!=checkStore.plan.dataRule? '_temp':'')
}).then((res: any) => {
let list: string[] = []
for (let key in res.data.resultMap) {
@@ -556,7 +572,7 @@ const close = async () => {
}
}
const handleErrorSysChange = async () => {
const handleErrorSysChange = async (msg:string) => {
changeErrorSystem({
planId: checkStore.plan.id,
scriptId: '',
@@ -564,10 +580,11 @@ const handleErrorSysChange = async () => {
deviceId: formContent.deviceId,
code: checkStore.plan.code + '',
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '',
chnNum: formContent.chnNum
chnNum: formContent.chnNum,
dataRuleId: formContent.dataRule
}).then(res => {
if (res.code === ResultEnum.SUCCESS) {
ElMessage.success('切换误差体系成功')
ElMessage.success(msg)
handleChnNumChange(formContent.chnNum)
}
})
@@ -581,7 +598,8 @@ const handleReCalculate = async () => {
deviceId: formContent.deviceId,
code: checkStore.plan.code + '',
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '',
chnNum: formContent.chnNum
chnNum: formContent.chnNum,
dataRuleId: formContent.dataRule,
}).then(res => {
if (res.code === ResultEnum.SUCCESS) {
ElMessage.success('重新计算成功!')
@@ -590,6 +608,20 @@ const handleReCalculate = async () => {
})
}
const handleGenerateReport = async () => {
generateDevReport({
planId: checkStore.plan.id,
devIdList: [formContent.deviceId],
scriptId: checkStore.plan.scriptId,
planCode: checkStore.plan.code + (formContent.errorSysId!=checkStore.plan.errorSysId ? '_temp':'')
}).then(res => {
if (res.code === ResultEnum.SUCCESS) {
ElMessage.success({ message: `报告生成成功!` })
handleChnNumChange(formContent.chnNum)
}
})
}
defineExpose({
open
})

View File

@@ -16,7 +16,7 @@
<el-step :status="step1" title="设备通讯校验"/>
<el-step :status="step2" title="模型一致性校验"/>
<el-step :status="step3" title="数据对齐验证" v-if="!props.onlyWave"/>
<el-step :status="step4" title="相序校验"/>
<el-step :status="step4" title="相序校验" v-if="props.xiangXuIsShow"/>
<!-- <el-step :status="step6" title="遥控录波功能验证"/> -->
<el-step :status="step5" :title="ts === 'error'? '检测失败':ts === 'process'? '检测中':ts === 'success'? '检测成功':'待检测'"/>
</el-steps>
@@ -52,7 +52,7 @@
</p>
</div>
</el-collapse-item>
<el-collapse-item title="相序校验" name="4">
<el-collapse-item title="相序校验" name="4" v-if="props.xiangXuIsShow">
<div class="div-log">
<p v-for="(item, index) in step4InitLog" :key="index"
:style="{ color: item.type === 'error' ? '#F56C6C' : 'var(--el-text-color-regular)' }">
@@ -84,6 +84,28 @@
import { ElMessage, ElMessageBox, StepProps } from 'element-plus'
import { computed, PropType, ref, toRef, watch } from 'vue'
import RealTimeData from './realTimeDataAlign.vue'
const props = defineProps({
testStatus: {
type: String,
default: 'wait'
},
webMsgSend: {
type: Object,
default: () => ({})
},
mapping: {
type: Object as PropType<Record<string, Record<string, string>>>,
default: () => ({})
},
onlyWave: {
type: Boolean,
default: false
},
xiangXuIsShow:{
type: Boolean,
default: false
}
})
const realTimeDataRef = ref()
@@ -122,10 +144,13 @@ const isShowDialog = ref(false)
const collapseActiveName = ref('1')
const activeIndex = ref(0)
const activeTotalNum = computed(() => {
let count = 4; // 基础步骤数:设备通讯校验、模型一致性校验、相序校验、最终状态
if (props.onlyWave) {
let count = 3; // 基础步骤数:设备通讯校验、模型一致性校验、最终状态
if (!props.onlyWave) {
count++; // 添加数据对齐验证步骤
}
if(props.xiangXuIsShow){//添加相序校验
count++;
}
return count;
});
const step1 = ref<StepProps['status']>('wait')
@@ -150,35 +175,18 @@ const detectionOptions = ref([
{
id: 2,
name: "数据对齐验证",
selected: true,
selected: !props.onlyWave,
},
{
id: 3,
name: "相序校验",
selected: true,
selected: props.xiangXuIsShow,
},
]);
const currentStepStatus = ref<'error' | 'finish' | 'wait' | 'success' | 'process'>('finish');
const props = defineProps({
testStatus: {
type: String,
default: 'wait'
},
webMsgSend: {
type: Object,
default: () => ({})
},
mapping: {
type: Object as PropType<Record<string, Record<string, string>>>,
default: () => ({})
},
onlyWave: {
type: Boolean,
default: false
}
})
const testStatus = toRef(props, 'testStatus');
@@ -332,6 +340,11 @@ watch(webMsgSend, function (newValue, oldValue) {
if (newValue.code == 25001) { //最终成功
step2.value = 'success'
step3.value = 'process'
if(props.onlyWave === true && props.xiangXuIsShow === false )//只有录波,相序不选
{
step5.value = 'success'
ts.value = 'success'
}
activeIndex.value = 2
}
if (newValue.code == 25003) { //最终失败
@@ -374,6 +387,11 @@ watch(webMsgSend, function (newValue, oldValue) {
isShowDialog.value = true
step3.value = 'success'
step4.value = 'process'
if(props.onlyWave === false && props.xiangXuIsShow === false )//相序不选
{
step5.value = 'success'
ts.value = 'success'
}
activeIndex.value = 3
testDataStructure.value = newValue.data
}
@@ -514,18 +532,30 @@ watch(webMsgSend, function (newValue, oldValue) {
// })
watch(activeIndex, function (newValue, oldValue) {
if(props.onlyWave === true)
if(props.onlyWave === true && props.xiangXuIsShow === false )
{
if (Number(collapseActiveName.value) < activeTotalNum.value - 2) {
if (Number(collapseActiveName.value) < activeTotalNum.value) {
if(newValue == 2){
collapseActiveName.value = '2'
}else{
collapseActiveName.value = (newValue + 1).toString()
}
}
}
else if(props.onlyWave === true && props.xiangXuIsShow === true )
{
if (Number(collapseActiveName.value) < activeTotalNum.value) {
if(newValue == 2){
collapseActiveName.value = '4'
}else{
collapseActiveName.value = (newValue + 1).toString()
}
}
} else
}
else
{
if (Number(collapseActiveName.value) < activeTotalNum.value) {
if (Number(collapseActiveName.value) < activeTotalNum.value - 1) {
collapseActiveName.value = (newValue + 1).toString()
}

View File

@@ -58,6 +58,7 @@
:webMsgSend="webMsgSend"
:mapping="channelMapping"
:onlyWave="onlyWave"
:xiangXuIsShow="xiangXuIsShow"
/>
</keep-alive>
<keep-alive>
@@ -170,6 +171,9 @@ const preTestRef = ref<InstanceType<typeof ComparePreTest> | null>(null)
const testRef: any = ref(null)
const windowWidth = ref(window.innerWidth)
const computedDialogWidth = ref(0)
const xiangXuIsShow = ref(true)//预检测是否展示相序检测
// 监听窗口大小变化
const handleResize = () => {
windowWidth.value = window.innerWidth
@@ -342,7 +346,8 @@ const handleSubmitAgain = async () => {
standardDevIds: standardDevIds.value,
pairs: pairs.value,
testItemList: [checkStore.selectTestItems.preTest, false, checkStore.selectTestItems.test],
userId: userStore.userInfo.id
userId: userStore.userInfo.id,
phaseCheck: xiangXuIsShow.value ? 1 : 0,
})
preTestStatus.value = 'start'
@@ -350,6 +355,26 @@ const handleSubmitAgain = async () => {
//开始检测
const handleSubmitFast = async () => {
try {
await ElMessageBox.confirm('是否需要进行相序检测?', '确认检测', {
confirmButtonText: '是',
cancelButtonText: '否',
distinguishCancelAndClose: true, // 区分取消和关闭操作
type: 'warning'
});
xiangXuIsShow.value = true;
} catch (action) {
// 区分用户点击关闭按钮和其他情况
if (action === 'cancel') {
// 用户点击了"否"按钮
xiangXuIsShow.value = false;
} else {
// 用户点击了关闭按钮或按了ESC键中断流程
return; // 直接返回,不继续执行后续代码
}
}
if (channelPairingRef.value) {
const res = await channelPairingRef.value.handleNext()
@@ -390,7 +415,8 @@ const handleSubmitFast = async () => {
pairs: pairs.value,
testItemList: [checkStore.selectTestItems.preTest, false, checkStore.selectTestItems.test],
userId: userStore.userInfo.id
userId: userStore.userInfo.id,
phaseCheck: xiangXuIsShow.value ? 1 : 0,
})
preTestStatus.value = 'start'
if (checkStore.selectTestItems.test) {
@@ -414,7 +440,8 @@ const handleSubmitFast = async () => {
pairs: pairs.value,
testItemList: [checkStore.selectTestItems.preTest, false, checkStore.selectTestItems.test],
userId: userStore.userInfo.id
userId: userStore.userInfo.id,
phaseCheck: xiangXuIsShow.value ? 1 : 0,
})
}
TestStatus.value = 'start'
@@ -508,8 +535,6 @@ const sendPause = () => {
pauseTest()
}
const sendResume = () => {
resumeTest({
userPageId: JwtUtil.getLoginName(),
devIds: checkStore.devices.map(item => item.deviceId),

View File

@@ -22,7 +22,7 @@
v-model="formContent.errorSysId"
placeholder="请选择误差体系"
autocomplete="off"
@change="handleErrorSysChange"
@change="handleErrorSysChange('切换误差体系成功')"
>
<el-option
v-for="option in pqErrorList"
@@ -33,7 +33,20 @@
</el-select>
</el-form-item>
<el-form-item label="数据原则">
<el-input v-model="formContent.dataRule" :disabled="true" />
<!-- <el-input v-model="formContent.dataRule" :disabled="true" />-->
<el-select
:disabled="checkStore.showDetailType === 2 || checkStore.showDetailType === 0"
v-model="formContent.dataRule"
placeholder="请选择数据原则"
autocomplete="off"
@change="handleErrorSysChange('切换数据处理原则成功')">
<el-option
v-for="item in dictStore.getDictData('Data_Rule')"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="设备名称">
<el-input v-model="formContent.deviceName" :disabled="true" />
@@ -203,7 +216,6 @@ const formContent = reactive<CheckData.DataCheck>({
})
// 原始误差体系id
let originErrorSysId: string = ''
let planCode: string = ''
// 谐波次数列表
// const harmNumList = reactive<{ value: string, label: string }[]>([])
// 当前选中的检测项
@@ -273,7 +285,7 @@ const handleNodeClick = async (data: any) => {
}
}
const handleErrorSysChange = async () => {
const handleErrorSysChange = async (msg:string) => {
changeErrorSystem({
planId: checkStore.plan.id,
@@ -281,15 +293,11 @@ const handleErrorSysChange = async () => {
errorSysId: formContent.errorSysId,
deviceId: deviceId,
code: checkStore.plan.code + '',
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? ''
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '',
dataRuleId: formContent.dataRule
}).then(res => {
if (res.code === ResultEnum.SUCCESS) {
ElMessage.success('切换误差体系成功')
if (originErrorSysId != formContent.errorSysId) {
planCode = checkStore.plan.code + '_temp'
} else {
planCode = checkStore.plan.code + ''
}
ElMessage.success(msg)
if (formContent.chnNum != chnList[0].value) {
formContent.chnNum = chnList[0].value
} else {
@@ -317,7 +325,7 @@ const handleChnNumChange = async () => {
devId: deviceId,
devNum: formContent.chnNum + '',
scriptType: originScriptType,
code: planCode
code: checkStore.plan.code + (formContent.errorSysId!=checkStore.plan.errorSysId || formContent.dataRule!=checkStore.plan.dataRule? '_temp':'')
})
updateTreeFly(resTreeDataTemp, 4)
updateTreeFly(resTreeDataTemp, 2)
@@ -379,7 +387,7 @@ const updateTableData = async () => {
scriptId: checkStore.plan.scriptId,
devId: deviceId,
devNum: formContent.chnNum + '',
code: planCode,
code: checkStore.plan.code + (formContent.errorSysId!=checkStore.plan.errorSysId || formContent.dataRule!=checkStore.plan.dataRule? '_temp':''),
index: parseInt(checkIndex.value)
})
@@ -473,7 +481,6 @@ const doCurrentCheckItemUpdate = (newVal: string) => {
}
const open = async (_deviceId: string, chnNum: string, _scriptType: string | null) => {
planCode = checkStore.plan.code + ''
deviceId = _deviceId
originScriptType = _scriptType
scriptType = _scriptType
@@ -510,7 +517,7 @@ const handleGenerateReport = async () => {
planId: checkStore.plan.id,
devIdList: [deviceId],
scriptId: checkStore.plan.scriptId,
planCode: planCode
planCode: checkStore.plan.code + (formContent.errorSysId!=checkStore.plan.errorSysId || formContent.dataRule!=checkStore.plan.dataRule? '_temp':'')
})
ElMessage.success({ message: `报告生成成功!` })
}
@@ -522,14 +529,10 @@ const handleReCalculate = async () => {
errorSysId: formContent.errorSysId,
deviceId: deviceId,
code: checkStore.plan.code + '',
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? ''
patternId: dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '',
dataRuleId: formContent.dataRule
}).then(res => {
ElMessage.success('重新计算成功!')
// if (originErrorSysId != formContent.errorSysId) {
// planCode = checkStore.plan.code + "_temp"
// } else {
// planCode = checkStore.plan.code + ''
// }
if (formContent.chnNum != chnList[0].value) {
formContent.chnNum = chnList[0].value
} else {
@@ -560,7 +563,6 @@ const close = async () => {
currentScriptTypeName.value = ''
currentDesc.value = ''
pqErrorList.length = 0
planCode = ''
visible.value = false

View File

@@ -262,7 +262,7 @@ const open = async (mapping : Record<string, Record<string, string>>,data : any)
// 导出数据
const exportData =async () => {
useDownload(exportAlignData, '原始数据', null, false, '.xlsx')
useDownload(exportAlignData, '对齐数据', null, false, '.xlsx')
ElMessage.success('数据导出成功');
// 这里可以添加实际的数据导出逻辑
};