This commit is contained in:
guanj
2025-08-26 15:16:25 +08:00
3 changed files with 321 additions and 164 deletions

View File

@@ -34,6 +34,7 @@ export namespace Plan {
Check_By?:string;//计划检测人
progress?: number; // 进度百分比,例如 75
children?: ResPlan[];
testConfig?: PlanTestConfig;
}
// 检测计划 + 分页
@@ -42,6 +43,7 @@ export namespace Plan {
}
export interface ReqPlan extends ResPlan {
datasourceIds:string;
sourceIds: string | null;
@@ -54,5 +56,14 @@ export namespace Plan {
devIds: string[];
}
export interface PlanTestConfig {
planId: string;
waveRecord: number;
realTime: number;
statistics: number;
flicker: number;
maxTime: number;
}
}

View File

@@ -174,10 +174,10 @@ function handleFatalError(stepRef: any, logRef: any, message: string) {
stepRef.value = 'error';
ts.value = 'error';
step5.value = 'error';
logRef.value = [{
logRef.value.push({
type: 'error',
log: message
}];
});
}
/**
@@ -349,10 +349,10 @@ watch(webMsgSend, function (newValue, oldValue) {
} else if (newValue.code == 10201) {
step4.value = 'process'
step4InitLog.value = [{
step4InitLog.value.push({
type: 'wait',
log: '源参数下发中.....',
}];
});
} else if (newValue.code == 10552) {
ElMessage.error("存在已经初始化步骤,已经自动关闭,请重新发起检测!")
handleFatalError(step4, step4InitLog, '存在已经初始化步骤,执行自动关闭,请重新发起检测!')
@@ -373,10 +373,10 @@ watch(webMsgSend, function (newValue, oldValue) {
})
} else if (newValue.code == 10201) {
step4.value = 'process'
step4InitLog.value = [{
step4InitLog.value.push({
type: 'wait',
log: '获取数据相序校验数据!',
}];
});
} else if (newValue.code == 25003) {
handleFatalError(step4, step4InitLog, '相序校验未通过!')
} else if (newValue.code == 25001) {

View File

@@ -1,55 +1,55 @@
<template>
<!-- 基础信息弹出框 -->
<el-dialog
:title="dialogTitle"
v-if="dialogVisible"
v-model="dialogVisible"
@close="close"
v-bind="dialogBig"
:title="dialogTitle"
align-center
v-bind="dialogBig"
@close="close"
>
<el-form ref="dialogFormRef" :model="formContent" :rules="rules">
<el-row :gutter="24">
<el-col :span="10">
<el-form :model="formContent" ref="dialogFormRef" :rules="rules">
<el-form-item label="名称" prop="name" :label-width="110">
<el-form-item :label-width="110" label="名称" prop="name">
<el-input
v-model="formContent.name"
placeholder="请输入名称"
autocomplete="off"
maxlength="32"
placeholder="请输入名称"
show-word-limit
/>
</el-form-item>
<el-form-item label="标准设备" prop="standardDevIds" :label-width="110" v-if="selectByMode" >
<el-form-item v-if="selectByMode" :label-width="110" label="标准设备" prop="standardDevIds">
<el-select
v-model="formContent.standardDevIds"
multiple
filterable
collapse-tags
:max-collapse-tags="2"
placeholder="请选择标准设备"
clearable
:disabled="planType == 2"
:max-collapse-tags="2"
clearable
collapse-tags
filterable
multiple
placeholder="请选择标准设备"
>
<el-option
v-for="option in pqStandardDevArray"
:key="option.value"
:disabled="subPlanBindStandardDev.includes(option.label)"
:label="option.label"
:value="option.value"
:disabled="subPlanBindStandardDev.includes(option.label)"
/>
</el-select>
</el-form-item>
<el-form-item label="测试项" prop="testItems" :label-width="110" v-if="selectByMode">
<el-form-item v-if="selectByMode" :label-width="110" label="测试项" prop="testItems">
<el-select
filterable
v-model="formContent.testItems"
multiple
collapse-tags
:max-collapse-tags="3"
:disabled="planType != 0"
placeholder="请选择测试项"
:max-collapse-tags="3"
clearable
collapse-tags
filterable
multiple
placeholder="请选择测试项"
>
<el-option
v-for="(option, index) in secondLevelOptions"
@@ -59,14 +59,14 @@
/>
</el-select>
</el-form-item>
<el-form-item label="检测源" prop="sourceIds" :label-width="110" v-if="!selectByMode">
<el-form-item v-if="!selectByMode" :label-width="110" label="检测源" prop="sourceIds">
<el-select
filterable
v-model="formContent.sourceIds"
:multiple="selectByMode"
collapse-tags
placeholder="请选择检测源"
clearable
collapse-tags
filterable
placeholder="请选择检测源"
>
<el-option
v-for="(option, index) in pqSourceArray"
@@ -76,17 +76,17 @@
/>
</el-select>
</el-form-item>
<el-form-item label="数据源" prop="datasourceIds" :label-width="110">
<el-form-item :label-width="110" label="数据源" prop="datasourceIds">
<el-select
filterable
v-model="formContent.datasourceIds"
:multiple="selectByMode"
:max-collapse-tags="2"
:disabled="planType != 0"
collapse-tags
placeholder="请选择数据源"
:max-collapse-tags="2"
:multiple="selectByMode"
autocomplete="off"
clearable
collapse-tags
filterable
placeholder="请选择数据源"
@change="handleDataSourceChange"
>
<el-option
@@ -97,13 +97,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="检测脚本" prop="scriptId" :label-width="110" v-if="!selectByMode">
<el-form-item v-if="!selectByMode" :label-width="110" label="检测脚本" prop="scriptId">
<el-select
v-model="formContent.scriptId"
placeholder="请选择检测脚本"
autocomplete="off"
:disabled="isSelectDisabled"
autocomplete="off"
clearable
placeholder="请选择检测脚本"
>
<el-option
v-for="(option, index) in pqScriptArray"
@@ -113,14 +113,14 @@
/>
</el-select>
</el-form-item>
<el-form-item label="误差体系" prop="errorSysId" :label-width="110">
<el-form-item :label-width="110" label="误差体系" prop="errorSysId">
<el-select
filterable
v-model="formContent.errorSysId"
placeholder="请选择误差体系"
autocomplete="off"
:disabled="isSelectDisabled"
autocomplete="off"
clearable
filterable
placeholder="请选择误差体系"
>
<el-option
v-for="(option, index) in pqErrorArray"
@@ -130,13 +130,13 @@
/>
</el-select>
</el-form-item>
<el-form-item label="数据处理原则" prop="dataRule" :label-width="110">
<el-form-item :label-width="110" label="数据处理原则" prop="dataRule">
<el-select
v-model="formContent.dataRule"
placeholder="请选择数据处理原则"
autocomplete="off"
:disabled="isSelectDisabled"
autocomplete="off"
clearable
placeholder="请选择数据处理原则"
>
<el-option
v-for="item in dictStore.getDictData('Data_Rule')"
@@ -146,7 +146,7 @@
/>
</el-select>
</el-form-item>
<el-form-item label="守时检测" :label-width="110" prop="timeCheck">
<el-form-item :label-width="110" label="守时检测" prop="timeCheck">
<el-radio-group v-model="formContent.timeCheck" :disabled="planType != 0">
<el-radio :value="1"></el-radio>
<el-radio :value="0"></el-radio>
@@ -159,16 +159,16 @@
</el-radio-group>
</el-form-item> -->
<el-form-item
v-if="formContent.associateReport === 1"
:label-width="110"
label="模版名称"
prop="reportTemplateName"
:label-width="110"
v-if="formContent.associateReport === 1"
>
<el-select
v-model="formContent.reportTemplateName"
placeholder="请选择报告模版"
autocomplete="off"
:disabled="planType != 0"
autocomplete="off"
placeholder="请选择报告模版"
>
<el-option
v-for="(option, index) in pqReportName"
@@ -178,25 +178,24 @@
/>
</el-select>
</el-form-item>
</el-form>
</el-col>
<el-col :span="14">
<el-transfer
v-model="value"
filterable
:filter-method="filterMethod"
filter-placeholder="请输入内容搜索"
:data="allData"
:filter-method="filterMethod"
:titles="['未绑定被检设备', '已绑定被检设备']"
filter-placeholder="请输入内容搜索"
filterable
>
<template #default="{ option }">
<div style="display: flex; align-items: center; justify-content: space-between">
<span>
{{ JSON.parse(option.label).manufacturer }} - {{ JSON.parse(option.label).name }}
</span>
<el-tooltip placement="top" effect="light">
<el-tooltip effect="light" placement="top">
<template #content>
<el-descriptions size="small" title="被检设备详情" border>
<el-descriptions border size="small" title="被检设备详情">
<el-descriptions-item label="设备名称">
{{ JSON.parse(option.label).name }}
</el-descriptions-item>
@@ -214,36 +213,38 @@
</el-descriptions-item>
</el-descriptions>
</template>
<el-icon><Warning /></el-icon>
<el-icon>
<Warning />
</el-icon>
</el-tooltip>
</div>
</template>
<template #left-footer v-if="planType === 0">
<template v-if="planType === 0" #left-footer>
<el-button
class="transfer-footer"
v-if="modeStore.currentMode !== '比对式'"
size="small"
type="primary"
v-auth.plan="'import'"
:icon="Download"
class="transfer-footer"
size="small"
type="primary"
@click="importFile('')"
>
导入被检设备
</el-button>
<el-button
class="transfer-footer"
v-if="modeStore.currentMode === '比对式'"
size="small"
type="primary"
v-auth.plan="'import'"
:icon="Download"
class="transfer-footer"
size="small"
type="primary"
@click="importFile('比对式')"
>
导入被检设备
</el-button>
</template>
<template #right-footer v-if="planType === 0">
<template v-if="planType === 0" #right-footer>
<el-text></el-text>
</template>
<template #left-empty>
@@ -255,6 +256,108 @@
</el-transfer>
</el-col>
</el-row>
<el-row v-if="modeStore.currentMode === '比对式'">
<el-col :span="24">
<el-collapse v-model="activeNames">
<el-collapse-item name="1" title="检测配置">
<el-row>
<el-col :span="8">
<el-form-item
:label-width="140"
label="检测最大次数"
label-position="right"
prop="testConfig.maxTime"
>
<el-input-number
:disabled="isSelectDisabled"
style="width: 240px"
v-model="formContent.testConfig.maxTime"
:precision="0"
:step="1"
:min="1"
placeholder="请输入检测最大次数"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
:label-width="140"
label="录波数据有效组数"
label-position="right"
prop="testConfig.waveRecord"
>
<el-input-number
:disabled="isSelectDisabled"
style="width: 240px"
v-model="formContent.testConfig.waveRecord"
:precision="0"
:step="1"
:min="1"
placeholder="请输入录波数据有效组数"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
:label-width="140"
label="实时数据有效组数"
label-position="right"
prop="testConfig.realTime"
>
<el-input-number
:disabled="isSelectDisabled"
style="width: 240px"
v-model="formContent.testConfig.realTime"
:precision="0"
:step="1"
:min="1"
placeholder="请输入实时数据有效组数"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
:label-width="140"
label="统计数据有效组数"
label-position="right"
prop="testConfig.statistics"
>
<el-input-number
:disabled="isSelectDisabled"
style="width: 240px"
v-model="formContent.testConfig.statistics"
:precision="0"
:step="1"
:min="1"
placeholder="请输入统计数据有效组数"
/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item
:label-width="140"
label="闪变数据有效组数"
label-position="right"
prop="testConfig.flicker"
>
<el-input-number
:disabled="isSelectDisabled"
style="width: 240px"
v-model="formContent.testConfig.flicker"
:precision="0"
:step="1"
:min="1"
placeholder="请输入闪变数据有效组数"
/>
</el-form-item>
</el-col>
</el-row>
</el-collapse-item>
</el-collapse>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="close()"> </el-button>
@@ -265,7 +368,7 @@
</el-dialog>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import {CascaderOption, ElMessage, type FormItemRule} from 'element-plus'
import {computed, defineProps, reactive, ref} from 'vue'
import {dialogBig} from '@/utils/elementBind'
@@ -295,6 +398,8 @@ import { getDictTreeByCode } from '@/api/system/dictionary/dictTree'
import {getAllUser} from '@/api/user/user'
import ImportExcel from '@/components/ImportExcel/index.vue'
import {downloadTemplate, importPqDev} from '@/api/device/device/index'
import {getTestConfig} from '@/api/system/base'
import {getRegRes} from '@/api/system/versionRegister'
const modeStore = useModeStore()
const AppSceneStore = useAppSceneStore()
@@ -326,6 +431,7 @@ const allData = ref<[any[], any[]]>([])
const isSelectDisabled = ref(false)
const planType = ref<number>(0)
const subPlanBindStandardDev = ref<any>([]) //哪些标准设备已经被子计划绑定
const activeNames = ref(['1'])
const generateData = () => {
const manufacturerDict = dictStore.getDictData('Dev_Manufacturers')
@@ -408,7 +514,15 @@ function useMetaInfo() {
standardDevIds: [],
standardDevMap: new Map<string, number>(),
testItems: [],
Check_By: ''
Check_By: '',
testConfig: {
planId: '',
waveRecord: 0,
realTime: 0,
statistics: 0,
flicker: 0,
maxTime: 3
}
})
return { dialogVisible, titleType, formContent }
}
@@ -447,7 +561,15 @@ const resetFormContent = () => {
standardDevMap: new Map<string, number>(),
testItemNameStr: '',
testItems: [],
Check_By: ''
Check_By: '',
testConfig: {
planId: '',
waveRecord: 0,
realTime: 0,
statistics: 0,
flicker: 0,
maxTime: 3
}
})
}
@@ -470,7 +592,12 @@ const baseRules: Record<string, Array<FormItemRule>> = {
errorSysId: [{ required: true, message: '误差体系必选!', trigger: 'change' }],
dataRule: [{ required: true, message: '数据处理原则必选!', trigger: 'change' }],
standardDevIds: [{ required: true, message: '标准设备必选!', trigger: 'change' }],
testItems: [{ required: true, message: '测试项必选!', trigger: 'change' }]
testItems: [{ required: true, message: '测试项必选!', trigger: 'change' }],
'testConfig.maxTime': [{ required: true, message: '检测最大次数必填!', trigger: 'blur' }],
'testConfig.waveRecord': [{ required: true, message: '录波数据有效组数必填!', trigger: 'blur' }],
'testConfig.realTime': [{ required: true, message: '实时数据有效组数必填!', trigger: 'blur' }],
'testConfig.statistics': [{ required: true, message: '统计数据有效组数必填!', trigger: 'blur' }],
'testConfig.flicker': [{ required: true, message: '闪变数据有效组数必填!', trigger: 'blur' }]
}
// 使用计算属性根据 scene 动态生成规则
@@ -615,20 +742,36 @@ const open = async (sign: string, data: Plan.ReqPlan, currentMode: string, plan:
PqErrSys_Result,
pqDevList_Result,
pqReportName_Result,
pqStandardDev_Result
pqStandardDev_Result,
sysTestConfig_Result,
sysRegRes_Result
if (mode.value === '比对式') {
const commonResults = await Promise.all([
getPqErrSysList(),
getUnboundPqDevList(data),
getPqReportAllName(),
getAllPqStandardDev()
getAllPqStandardDev(),
getTestConfig(),
getRegRes({ type: patternId })
])
;[PqErrSys_Result, pqDevList_Result, pqReportName_Result, pqStandardDev_Result] = commonResults
;[
PqErrSys_Result,
pqDevList_Result,
pqReportName_Result,
pqStandardDev_Result,
sysTestConfig_Result,
sysRegRes_Result
] = commonResults
// 比对式下这两个接口不需要
pqSource_Result = { data: [] }
PqScript_Result = { data: [] }
formContent.testConfig.maxTime = sysTestConfig_Result.data?.maxTime
formContent.testConfig.waveRecord = sysRegRes_Result.data?.waveRecord
formContent.testConfig.realTime = sysRegRes_Result.data?.realTime
formContent.testConfig.statistics = sysRegRes_Result.data?.statistics
formContent.testConfig.flicker = sysRegRes_Result.data?.flicker
} else {
const commonResults = await Promise.all([
getTestSourceList(data),
@@ -822,6 +965,7 @@ const convertToOptions = (dictTree: Dict.ResDictTree[]): CascaderOption[] => {
remark: item.remark
}))
}
function pqToArray() {
const sourceArray1 = Array.isArray(pqSourceList.value) ? pqSourceList.value : []
// 将 pqSource_Result 转换成 { label, value } 数组
@@ -949,7 +1093,7 @@ const props = defineProps<{
}>()
</script>
<style scoped lang="scss">
<style lang="scss" scoped>
// :deep(.dialog-small .el-dialog__body){
// max-height: 330px !important;
// }
@@ -957,10 +1101,12 @@ const props = defineProps<{
--el-transfer-panel-width: 250px;
--el-transfer-panel-body-height: 315px;
}
.transfer-footer {
margin-left: 15px;
padding: 6px 5px;
}
:deep(.el-transfer-panel__footer) {
display: flex;
justify-content: center;