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

391 lines
14 KiB
Vue
Raw Normal View History

2025-08-08 13:18:01 +08:00
<template>
2025-08-22 15:33:57 +08:00
<el-dialog
:append-to-body="appendToBody"
class="dialog"
title="数据查询"
:model-value="visible"
@close="close"
v-bind="dialogBig"
:draggable="false"
width="1400px"
>
<div class="data-check-dialog">
<div>
<el-form :model="formContent" label-width="auto" class="form-three">
<el-form-item label="误差体系">
<el-select
:disabled="checkStore.showDetailType === 2 || checkStore.showDetailType === 0"
v-model="formContent.errorSysId"
placeholder="请选择误差体系"
autocomplete="off"
>
<el-option
v-for="option in pqErrorList"
:key="option.id"
:label="option.name"
:value="option.id"
/>
</el-select>
</el-form-item>
<el-form-item label="数据原则">
<el-input v-model="formContent.dataRule" :disabled="true" />
</el-form-item>
<el-form-item label="设备名称">
<el-input v-model="formContent.deviceName" :disabled="true" />
</el-form-item>
<el-form-item label="通道号">
2025-08-26 10:37:13 +08:00
<el-select v-model="formContent.chnNum" @change="getResults" :disabled="sourceKey == 1">
2025-08-22 15:33:57 +08:00
<el-option v-for="item in chnList" :key="item" :label="item" :value="item" />
</el-select>
</el-form-item>
2025-08-26 10:37:13 +08:00
<el-form-item label="检测次数" :disabled="sourceKey == 1">
2025-08-22 16:21:57 +08:00
<el-select v-model="formContent.num" clearable @change="getResults">
<el-option
v-for="item in chnMapList[formContent.chnNum]"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
2025-08-22 15:33:57 +08:00
<el-form-item v-if="checkStore.showDetailType === 1">
<el-button type="primary" :icon="Postcard">报告生成</el-button>
</el-form-item>
<el-form-item v-if="checkStore.showDetailType === 0">
<el-button type="primary" :icon="Histogram">重新计算</el-button>
</el-form-item>
</el-form>
</div>
<div class="data-check-body">
2025-08-26 10:37:13 +08:00
<div class="content-left-tree" v-if="sourceKey == 2">
2025-08-25 11:35:38 +08:00
<el-tree
style="width: 200px"
:data="scriptData"
:props="defaultProps"
highlight-current
node-key="id"
ref="treeRef"
@node-click="handleNodeClick"
/>
</div>
2025-08-22 15:33:57 +08:00
<div class="content-right">
<div class="content-right-title">
<div style="width: 840px">
<span class="content-right-title-text">当前检测项目</span>
<span style="color: var(--el-color-primary)">{{ rowList.scriptName }}</span>
</div>
<el-form-item
style="margin-left: 280px; margin-bottom: 0px !important; width: 280px"
label="测试项"
>
<el-select v-model="currentCheckItem">
<el-option
v-for="item in tesList"
:key="item"
:label="item.replace(/\.0$/, '')"
:value="item"
/>
</el-select>
</el-form-item>
</div>
<div class="content-right-Tabs">
<el-tabs type="border-card" v-model="activeTab">
<el-tab-pane label="检测结果" name="resultTab">
<CompareDataCheckResultTable
:tableData="currentCheckResultData"
2025-08-26 10:37:13 +08:00
:currentCheckItem="currentCheckItem"
2025-08-22 15:33:57 +08:00
:currentScriptTypeName="currentScriptTypeName"
2025-08-26 10:37:13 +08:00
v-if="activeTab === 'resultTab'"
2025-08-22 15:33:57 +08:00
/>
</el-tab-pane>
<el-tab-pane label="原始数据" name="rawDataTab">
<CompareDataCheckRawDataTable
2025-08-26 10:37:13 +08:00
v-if="activeTab === 'rawDataTab'"
2025-08-22 16:21:57 +08:00
:tableData="currentRawTableData"
2025-08-26 10:37:13 +08:00
:currentCheckItem="currentCheckItem"
2025-08-22 15:33:57 +08:00
:currentScriptTypeName="currentScriptTypeName"
@exportRawDataHandler="exportRawDataHandler"
/>
</el-tab-pane>
</el-tabs>
</div>
</div>
2025-08-11 15:59:29 +08:00
</div>
2025-08-08 13:18:01 +08:00
</div>
2025-08-22 15:33:57 +08:00
</el-dialog>
2025-08-08 13:18:01 +08:00
</template>
2025-08-22 15:33:57 +08:00
<script setup lang="ts">
import { dialogBig } from '@/utils/elementBind'
import { reactive, ref, watch, computed } from 'vue'
2025-08-08 13:18:01 +08:00
import CompareDataCheckResultTable from './compareDataCheckResultTable.vue'
import CompareDataCheckRawDataTable from './compareDataCheckRawDataTable.vue'
2025-08-22 15:33:57 +08:00
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 { useModeStore } from '@/stores/modules/mode' // 引入模式 store
import { useDictStore } from '@/stores/modules/dict'
import { getContrastFormContent, getContrastResult, getBigTestItem } from '@/api/check/test'
const { appendToBody } = withDefaults(
defineProps<{
appendToBody: boolean
}>(),
{ appendToBody: true }
)
2025-08-08 13:18:01 +08:00
const checkStore = useCheckStore()
2025-08-22 15:33:57 +08:00
const modeStore = useModeStore()
const dictStore = useDictStore()
2025-08-08 13:18:01 +08:00
const visible = ref(false)
const treeRef = ref()
2025-08-25 11:35:38 +08:00
2025-08-22 15:33:57 +08:00
const pqErrorList = reactive<{ id: string; name: string }[]>([])
2025-08-11 15:59:29 +08:00
const activeTab = ref('resultTab')
const currentCheckItem = ref<any>()
2025-08-22 15:33:57 +08:00
const rowList: any = ref([])
2025-08-14 15:02:58 +08:00
let scriptType: string | null = null
2025-08-11 15:59:29 +08:00
2025-08-25 11:35:38 +08:00
const defaultProps = {
children: 'children',
label: 'scriptName'
}
2025-08-22 16:21:57 +08:00
const chnMapList: any = ref({})
2025-08-08 13:18:01 +08:00
// 表单数据
const formContent = reactive<CheckData.DataCheck>({
2025-08-22 15:33:57 +08:00
scriptName: '',
errorSysId: '',
dataRule: '',
deviceName: '',
chnNum: '',
deviceId: '',
2025-08-22 16:21:57 +08:00
num: ''
2025-08-08 13:18:01 +08:00
})
2025-08-26 10:37:13 +08:00
const sourceKey = ref(1) //1:正式检测进入页面 2:检测数据查询进入
2025-08-08 13:18:01 +08:00
// 通道下拉列表
2025-08-22 15:33:57 +08:00
const chnList: any = ref([])
2025-08-08 13:18:01 +08:00
// 当前检测项目名称
const currentScriptTypeName = ref('')
// 检测结果表格数据
2025-08-22 15:33:57 +08:00
const checkResultData = ref<CheckData.CheckResult[]>([])
2025-08-25 11:35:38 +08:00
// 检测脚本配置数据
const scriptData = ref<CheckData.ScriptItem[]>([])
2025-08-08 13:18:01 +08:00
// 原始数据表格数据
2025-08-22 15:33:57 +08:00
const rawTableData = ref<CheckData.RawDataItem[]>([])
const tesList: any = ref([])
// 检测结果
const currentCheckResultData = computed(() => {
const data = checkResultData.value[currentCheckItem.value]
return Array.isArray(data) ? data : []
})
2025-08-22 16:21:57 +08:00
const currentRawTableData = computed(() => {
const data = rawTableData.value[currentCheckItem.value]
return Array.isArray(data) ? data : []
})
2025-08-25 11:35:38 +08:00
2025-08-22 15:33:57 +08:00
const open = async (row: any, chnNum: string, deviceId: string | null, source: number) => {
2025-08-25 11:35:38 +08:00
rowList.value = {}
formContent.deviceId = deviceId || ''
formContent.chnNum = chnNum
2025-08-26 10:37:13 +08:00
sourceKey.value = source
2025-08-22 15:33:57 +08:00
if (source == 1) {
// 正式检测进入页面
rowList.value = row
2025-08-25 11:35:38 +08:00
} else if (source == 2) {
// 检测数据查询进入
await initScriptData(row)
2025-08-11 15:59:29 +08:00
}
2025-08-22 15:33:57 +08:00
visible.value = true
scriptType = null
formContent.errorSysId = checkStore.plan.errorSysId
pqErrorList.length = 0
// 获取误差体系
let { data: resPqErrorList } = await getPqErrSysList()
Object.assign(pqErrorList, resPqErrorList)
// 获取基本信息
await getBasicInformation()
2025-08-25 11:35:38 +08:00
}
// 查询大项树
const initScriptData = async (row: any) => {
const pattern = dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? ''
let response: any = await getBigTestItem({
reCheckType: checkStore.reCheckType,
planId: checkStore.plan.id,
devIds: checkStore.devices.map(item => item.deviceId),
patternId: pattern
})
// 格式化脚本数据
let temp = response.data.map((item: any) => {
return {
...item,
scriptName: item.scriptName
}
})
rowList.value.scriptName = temp[0].scriptName
rowList.value.scriptType = temp[0].id
// 保存脚本数据并设置总数
scriptData.value = temp
setTimeout(() => {
treeRef.value?.setCurrentKey(temp[0].id)
}, 0)
2025-08-22 15:33:57 +08:00
}
//获取基本信息
const getBasicInformation = async () => {
getContrastFormContent({
planId: checkStore.plan.id,
scriptType: rowList.value.scriptType,
deviceId: formContent.deviceId,
chnNum: formContent.chnNum,
num: formContent.num ?? null
}).then((res: any) => {
formContent.dataRule = res.data.dataRule
formContent.deviceName = res.data.deviceName
formContent.errorSysId = res.data.errorSysId
2025-08-22 16:21:57 +08:00
chnMapList.value = res.data.chnMap
2025-08-26 10:37:13 +08:00
formContent.num = res.data.checkNum
2025-08-22 15:33:57 +08:00
let chnMap: string[] = []
for (let key in res.data.chnMap) {
chnMap.push(key)
}
chnList.value = chnMap
2025-08-25 11:35:38 +08:00
formContent.chnNum = formContent.chnNum == null ? chnList.value[0] : formContent.chnNum
// 查询表格数据
getResults()
2025-08-22 15:33:57 +08:00
})
}
2025-08-25 11:35:38 +08:00
// 左边树变化
const handleNodeClick = (data: any) => {
rowList.value.scriptName = data.scriptName
rowList.value.scriptType = data.id
getResults()
2025-08-22 15:33:57 +08:00
}
// 获取结果
const getResults = async () => {
2025-08-22 16:21:57 +08:00
checkResultData.value = []
rawTableData.value = []
2025-08-22 15:33:57 +08:00
getContrastResult({
planId: checkStore.plan.id,
scriptType: rowList.value.scriptType,
deviceId: formContent.deviceId,
chnNum: formContent.chnNum,
2025-08-22 16:21:57 +08:00
num: formContent.num == '' ? null : formContent.num
2025-08-22 15:33:57 +08:00
}).then((res: any) => {
let list: string[] = []
for (let key in res.data.resultMap) {
list.push(key)
}
currentCheckItem.value = list[0]
tesList.value = list
checkResultData.value = res.data.resultMap
rawTableData.value = res.data.rawDataMap
})
2025-08-14 15:02:58 +08:00
}
const close = () => {
2025-08-22 15:33:57 +08:00
visible.value = false
// 可以在这里添加其他清理逻辑
2025-08-08 13:18:01 +08:00
}
defineExpose({
2025-08-22 15:33:57 +08:00
open
2025-08-08 13:18:01 +08:00
})
</script>
<style lang="scss" scoped>
.dialog {
display: flex;
flex-direction: column;
2025-08-22 15:33:57 +08:00
.data-check-dialog {
2025-08-08 13:18:01 +08:00
display: flex;
flex-direction: column;
2025-08-22 15:33:57 +08:00
.data-check-head {
display: flex;
flex-direction: row;
width: 100%;
2025-08-08 13:18:01 +08:00
}
2025-08-22 15:33:57 +08:00
.data-check-body {
height: 500px;
width: 100%;
display: flex;
flex-direction: row;
.content-left-tree {
width: 18%;
display: flex;
flex-direction: column;
align-items: center;
max-height: 495px;
padding: 10px 0.5% 0px 0.5%;
border: 1px solid #ccc;
overflow-y: auto;
overflow-x: auto;
.content-tree {
width: 100%;
height: 100%;
margin-top: 10px;
.custom-tree-node {
overflow-x: hidden !important;
white-space: nowrap !important;
text-overflow: ellipsis !important;
}
}
}
.content-right {
width: 82%;
margin-left: 10px;
flex: 1;
.content-right-title {
display: flex;
padding: 10px 0;
margin-top: 0px;
line-height: 1.5;
.content-right-title-text {
font-size: 14px;
font-weight: bold;
}
}
}
.content-right-Tabs {
box-sizing: border-box;
margin-top: 10px;
margin-bottom: 10px;
2025-08-25 11:35:38 +08:00
display: flex;
.el-tabs {
width: 100%;
}
}
.content-left {
height: 100%;
border: 1px solid #e0e0e0;
padding: 10px;
margin-right: 10px;
height: 410px;
overflow-y: auto;
2025-08-22 15:33:57 +08:00
}
2025-08-08 13:18:01 +08:00
}
}
}
2025-08-25 11:35:38 +08:00
:deep(.el-tabs--border-card > .el-tabs__content) {
height: 367px;
}
2025-08-08 13:18:01 +08:00
</style>