Compare commits
9 Commits
2025-11
...
cd33151920
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd33151920 | ||
|
|
0e0b753126 | ||
|
|
61ee760f52 | ||
|
|
03d1db3bb4 | ||
|
|
6334681dc5 | ||
|
|
211b727b47 | ||
|
|
389857ac7e | ||
|
|
dde3f11bbe | ||
|
|
ff90f51cf1 |
@@ -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})
|
||||
}
|
||||
|
||||
@@ -8,7 +8,9 @@
|
||||
import { onBeforeUnmount, onMounted, ref, watch } from 'vue'
|
||||
// import echarts from './echarts'
|
||||
import * as echarts from 'echarts' // 全引入
|
||||
// import 'echarts/lib/component/dataZoom'
|
||||
import 'echarts-gl'
|
||||
import 'echarts-liquidfill'
|
||||
import 'echarts/lib/component/dataZoom'
|
||||
|
||||
const color = [
|
||||
'var(--el-color-primary)',
|
||||
@@ -39,11 +41,13 @@ const resizeHandler = () => {
|
||||
})
|
||||
}
|
||||
const initChart = () => {
|
||||
|
||||
if (!props.isInterVal && !props.pieInterVal) {
|
||||
chart?.dispose()
|
||||
}
|
||||
// chart?.dispose()
|
||||
chart = echarts.init(chartRef.value as HTMLDivElement)
|
||||
|
||||
const options = {
|
||||
title: {
|
||||
left: 'center',
|
||||
|
||||
72
frontend/src/utils/echartMethod.ts
Normal file
72
frontend/src/utils/echartMethod.ts
Normal file
@@ -0,0 +1,72 @@
|
||||
const dataProcessing = (arr: any[]) => {
|
||||
return arr
|
||||
.filter(item => typeof item === 'number' || (typeof item === 'string' && !isNaN(parseFloat(item))))
|
||||
.map(item => (typeof item === 'number' ? item : parseFloat(item)))
|
||||
}
|
||||
|
||||
const calculateValue = (o: number, value: number, num: number, isMin: boolean) => {
|
||||
if (value === 0) {
|
||||
return 0
|
||||
} else if (value > 0 && Math.abs(value) < 1 && isMin == true) {
|
||||
return 0
|
||||
} else if (value > -1 && value < 0 && isMin == false) {
|
||||
return 0
|
||||
}
|
||||
|
||||
let base
|
||||
if (Math.abs(o) >= 100) {
|
||||
base = 100
|
||||
} else if (Math.abs(o) >= 10) {
|
||||
base = 10
|
||||
} else if (Math.abs(o) >= 1) {
|
||||
base = 1
|
||||
} else {
|
||||
const multiple = 1 / 0.1
|
||||
|
||||
base = Math.ceil(Math.abs(o) * multiple) / multiple
|
||||
}
|
||||
|
||||
let calculatedValue
|
||||
if (isMin) {
|
||||
if (value < 0) {
|
||||
calculatedValue = value + num * value
|
||||
} else {
|
||||
calculatedValue = value - num * value
|
||||
}
|
||||
} else {
|
||||
if (value < 0) {
|
||||
calculatedValue = value - num * value
|
||||
} else {
|
||||
calculatedValue = value + num * value
|
||||
}
|
||||
}
|
||||
|
||||
if (base === 0.1) {
|
||||
return parseFloat(calculatedValue.toFixed(1))
|
||||
} else if (isMin) {
|
||||
return Math.floor(calculatedValue / base) * base
|
||||
} else {
|
||||
return Math.ceil(calculatedValue / base) * base
|
||||
}
|
||||
}
|
||||
|
||||
// 处理y轴最大最小值
|
||||
export const yMethod = (arr: any) => {
|
||||
const num = 0.2
|
||||
const numList = dataProcessing(arr)
|
||||
let maxValue = 0
|
||||
let minValue = 0
|
||||
let max = 0
|
||||
let min = 0
|
||||
maxValue = Math.max(...numList)
|
||||
minValue = Math.min(...numList)
|
||||
const o = maxValue - minValue == 0 ? maxValue : maxValue - minValue
|
||||
min = calculateValue(o, minValue, num, true)
|
||||
|
||||
max = calculateValue(o, maxValue, num, false)
|
||||
|
||||
return [min, max]
|
||||
}
|
||||
|
||||
|
||||
|
||||
397
frontend/src/views/home/components/compareDataCheckChart.vue
Normal file
397
frontend/src/views/home/components/compareDataCheckChart.vue
Normal file
@@ -0,0 +1,397 @@
|
||||
<template>
|
||||
<!-- 历史趋势数据 -->
|
||||
<div class="history_chart">
|
||||
<MyEchart ref="historyChart" :options="echartsData"/>
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
|
||||
|
||||
import { nextTick, ref, watch } from 'vue'
|
||||
import { yMethod } from '@/utils/echartMethod'
|
||||
import MyEchart from '@/components/echarts/line/index.vue'
|
||||
import { CheckData } from '@/api/check/interface'
|
||||
|
||||
const prop = defineProps({
|
||||
tableData: {
|
||||
type: Array as () => CheckData.TableRow[],
|
||||
default: []
|
||||
},
|
||||
})
|
||||
|
||||
|
||||
const color = [
|
||||
'var(--el-color-primary)',
|
||||
'#07CCCA',
|
||||
'#00BFF5',
|
||||
'#FFBF00',
|
||||
'#77DA63',
|
||||
'#D5FF6B',
|
||||
'#Ff6600',
|
||||
'#FF9100',
|
||||
'#5B6E96',
|
||||
'#66FFCC',
|
||||
'#B3B3B3'
|
||||
]
|
||||
|
||||
const chartsList = ref<any>([])
|
||||
|
||||
const echartsData = ref<any>(null)
|
||||
//初始化趋势图
|
||||
const lineStyle = [{ type: 'solid' }, { type: 'dashed' }, { type: 'dotted' }]
|
||||
|
||||
const setEchart = () => {
|
||||
echartsData.value = {}
|
||||
// y轴单位数组
|
||||
let unitList: any = []
|
||||
|
||||
let groupedData = chartsList.value.reduce((acc: any, item: any) => {
|
||||
let key = ''
|
||||
if (item.phase == null) {
|
||||
key = item.unit
|
||||
} else {
|
||||
key = item.anotherName
|
||||
}
|
||||
|
||||
if (!acc[key]) {
|
||||
acc[key] = []
|
||||
}
|
||||
acc[key].push(item)
|
||||
return acc
|
||||
}, {})
|
||||
let result = Object.values(groupedData)
|
||||
if (chartsList.value.length > 0) {
|
||||
unitList = result.map((item: any) => {
|
||||
return item[0].unit
|
||||
})
|
||||
}
|
||||
|
||||
echartsData.value = {
|
||||
legend: {
|
||||
itemWidth: 20,
|
||||
itemHeight: 20,
|
||||
itemStyle: { opacity: 0 }, //去圆点
|
||||
type: 'scroll', // 开启滚动分页
|
||||
// orient: 'vertical', // 垂直排列
|
||||
top: 5,
|
||||
right: 70
|
||||
// width: 550,
|
||||
// height: 50
|
||||
},
|
||||
grid: {
|
||||
top: '30px',
|
||||
},
|
||||
tooltip: {
|
||||
axisPointer: {
|
||||
type: 'cross',
|
||||
label: {
|
||||
color: '#fff',
|
||||
fontSize: 16
|
||||
}
|
||||
},
|
||||
textStyle: {
|
||||
color: '#fff',
|
||||
fontStyle: 'normal',
|
||||
opacity: 0.35,
|
||||
fontSize: 14
|
||||
},
|
||||
backgroundColor: 'rgba(0,0,0,0.55)',
|
||||
borderWidth: 0,
|
||||
formatter(params: any) {
|
||||
const xname = params[0].value[0]
|
||||
let str = `${xname}<br>`
|
||||
params.forEach((el: any, index: any) => {
|
||||
let marker = ''
|
||||
|
||||
if (el.value[3] == 'dashed') {
|
||||
for (let i = 0; i < 3; i++) {
|
||||
marker += `<span style="display:inline-block;border: 2px ${el.color} solid;margin-right:5px;width:10px;height:0px;background-color:#ffffff00;"></span>`
|
||||
}
|
||||
} else {
|
||||
marker = `<span style="display:inline-block;border: 2px ${el.color} ${el.value[3]};margin-right:5px;width:40px;height:0px;background-color:#ffffff00;"></span>`
|
||||
}
|
||||
let unit = el.value[2] ? el.value[2] : ''
|
||||
str += `${marker}${el.seriesName.split('(')[0]}:${el.value[1]}${unit}
|
||||
<br>`
|
||||
})
|
||||
return str
|
||||
}
|
||||
},
|
||||
color: ['#DAA520', '#2E8B57', '#A52a2a', ...color],
|
||||
xAxis: {
|
||||
type: 'time',
|
||||
axisLabel: {
|
||||
formatter: function(value) {
|
||||
const date = new Date(value);
|
||||
const hours = String(date.getHours()).padStart(2, '0');
|
||||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||||
const seconds = String(date.getSeconds()).padStart(2, '0');
|
||||
return `${hours}:${minutes}:${seconds}`;
|
||||
},
|
||||
},
|
||||
splitNumber: 8
|
||||
},
|
||||
yAxis: [{}],
|
||||
|
||||
options: {
|
||||
series: []
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (chartsList.value.length > 0) {
|
||||
let yData: any = []
|
||||
echartsData.value.yAxis = []
|
||||
let setList = [...new Set(unitList)]
|
||||
|
||||
setList.forEach((item: any, index: any) => {
|
||||
if (index > 2) {
|
||||
echartsData.value.grid.right = (index - 1) * 80
|
||||
}
|
||||
yData.push([])
|
||||
let right = {
|
||||
position: 'right',
|
||||
offset: (index - 1) * 80
|
||||
}
|
||||
echartsData.value.yAxis.push({
|
||||
name: item,
|
||||
yAxisIndex: index,
|
||||
splitNumber: 5,
|
||||
minInterval: 1,
|
||||
splitLine: {
|
||||
show: false
|
||||
},
|
||||
...(index > 0 ? right : null)
|
||||
})
|
||||
})
|
||||
let ABCName = [
|
||||
...new Set(
|
||||
chartsList.value.map((item: any) => {
|
||||
return item.anotherName == '电压负序分量'
|
||||
? '电压不平衡'
|
||||
: item.anotherName == '电压正序分量'
|
||||
? '电压不平衡'
|
||||
: item.anotherName == '电压零序分量'
|
||||
? '电压不平衡'
|
||||
: item.anotherName
|
||||
})
|
||||
)
|
||||
]
|
||||
result.forEach((item: any, index: any) => {
|
||||
let yMethodList: any = []
|
||||
|
||||
let ABCList = Object.values(
|
||||
item.reduce((acc, item) => {
|
||||
let key = ''
|
||||
if (item.phase == null) {
|
||||
key = item.anotherName
|
||||
} else {
|
||||
key = item.phase
|
||||
}
|
||||
|
||||
if (!acc[key]) {
|
||||
acc[key] = []
|
||||
}
|
||||
acc[key].push(item)
|
||||
return acc
|
||||
}, {})
|
||||
)
|
||||
|
||||
ABCList.forEach((kk: any) => {
|
||||
let colorName = kk[0].phase?.charAt(0).toUpperCase()
|
||||
let lineS = ABCName.findIndex(
|
||||
item =>
|
||||
item ===
|
||||
(kk[0].anotherName == '电压负序分量'
|
||||
? '电压不平衡'
|
||||
: kk[0].anotherName == '电压正序分量'
|
||||
? '电压不平衡'
|
||||
: kk[0].anotherName == '电压零序分量'
|
||||
? '电压不平衡'
|
||||
: kk[0].anotherName)
|
||||
)
|
||||
let seriesList: any = []
|
||||
kk.forEach((cc: any) => {
|
||||
if (cc.statisticalData !== null) {
|
||||
yData[setList.indexOf(kk[0].unit)].push(cc.statisticalData?.toFixed(2))
|
||||
}
|
||||
|
||||
seriesList.push([cc.time, cc.statisticalData, cc.unit, lineStyle[lineS].type])
|
||||
})
|
||||
|
||||
|
||||
echartsData.value.options.series.push({
|
||||
name: kk[0].phase ? kk[0].phase + '相' + kk[0].anotherName : kk[0].anotherName,
|
||||
type: 'line',
|
||||
smooth: true,
|
||||
color:
|
||||
colorName == 'A' ? '#DAA520' : colorName == 'B' ? '#2E8B57' : colorName == 'C' ? '#A52a2a' : '',
|
||||
symbol: 'none',
|
||||
data: seriesList,
|
||||
lineStyle: lineStyle[lineS],
|
||||
yAxisIndex: setList.indexOf(kk[0].unit)
|
||||
})
|
||||
})
|
||||
})
|
||||
yData.forEach((item: any, index: any) => {
|
||||
let [min, max] = yMethod(item)
|
||||
echartsData.value.yAxis[index].min = min
|
||||
echartsData.value.yAxis[index].max = max
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 监听 tableData 变化并触发 setEchart
|
||||
watch(() => prop.tableData, (newTableData) => {
|
||||
// 处理数据转换
|
||||
const processedData: any[] = []
|
||||
|
||||
newTableData.forEach(item => {
|
||||
// 处理标准设备数据
|
||||
processDeviceData(item, '标准设备', item.uaStdDev, item.ubStdDev, item.ucStdDev, item.utStdDev, item.timeStdDev, item.unit)
|
||||
.forEach(data => processedData.push(data));
|
||||
// 处理被检设备数据
|
||||
processDeviceData(item, '被检设备', item.uaDev, item.ubDev, item.ucDev, item.utDev, item.timeDev, item.unit)
|
||||
.forEach(data => processedData.push(data));
|
||||
});
|
||||
// 更新 chartsList 数据
|
||||
chartsList.value = processedData
|
||||
// 延迟执行确保 DOM 已经渲染
|
||||
nextTick(() => {
|
||||
setTimeout(() => {
|
||||
setEchart()
|
||||
}, 100)
|
||||
})
|
||||
}, {
|
||||
immediate: true, // 立即执行一次
|
||||
deep: true // 深度监听
|
||||
})
|
||||
|
||||
|
||||
// 处理单个设备的数据
|
||||
function processDeviceData(
|
||||
item: any,
|
||||
deviceType: string,
|
||||
aValue: number | null,
|
||||
bValue: number | null,
|
||||
cValue: number | null,
|
||||
tValue: number | null,
|
||||
time: string,
|
||||
unit: string
|
||||
): any[] {
|
||||
const result: any[] = [];
|
||||
|
||||
// 判断各相是否存在有效数据
|
||||
const hasA = aValue !== null;
|
||||
const hasB = bValue !== null;
|
||||
const hasC = cValue !== null;
|
||||
const hasT = tValue !== null;
|
||||
|
||||
// 计算有多少相有数据
|
||||
const phaseCount = (hasA ? 1 : 0) + (hasB ? 1 : 0) + (hasC ? 1 : 0);
|
||||
// 时间四舍五入到秒
|
||||
const roundedTime = roundTimeToSecond(time);
|
||||
|
||||
if (hasA) {
|
||||
result.push({
|
||||
anotherName: deviceType,
|
||||
phase: phaseCount > 1 ? 'A' : null,
|
||||
statisticalData: aValue,
|
||||
time: roundedTime,
|
||||
unit: unit,
|
||||
});
|
||||
}
|
||||
|
||||
if (hasB) {
|
||||
result.push({
|
||||
anotherName: deviceType,
|
||||
phase: phaseCount > 1 ? 'B' : null,
|
||||
statisticalData: bValue,
|
||||
time: roundedTime,
|
||||
unit: unit,
|
||||
});
|
||||
}
|
||||
|
||||
if (hasC) {
|
||||
result.push({
|
||||
anotherName: deviceType,
|
||||
phase: phaseCount > 1 ? 'C' : null,
|
||||
statisticalData: cValue,
|
||||
time: roundedTime,
|
||||
unit: unit,
|
||||
});
|
||||
}
|
||||
|
||||
if (hasT) {
|
||||
result.push({
|
||||
anotherName: deviceType,
|
||||
phase: null,
|
||||
statisticalData: tValue,
|
||||
time: roundedTime,
|
||||
unit: unit,
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// 时间四舍五入到秒的辅助函数
|
||||
function roundTimeToSecond(timeStr: string): string {
|
||||
if (!timeStr) return timeStr;
|
||||
|
||||
try {
|
||||
// 直接使用本地时间解析,避免时区转换问题
|
||||
// 替换空格为 T 以符合 ISO 格式
|
||||
const isoString = timeStr.replace(' ', 'T');
|
||||
const date = new Date(isoString);
|
||||
|
||||
// 检查日期是否有效
|
||||
if (isNaN(date.getTime())) {
|
||||
return timeStr;
|
||||
}
|
||||
|
||||
// 获取毫秒部分
|
||||
const milliseconds = date.getMilliseconds();
|
||||
|
||||
// 如果毫秒数大于等于500,则加一秒
|
||||
if (milliseconds >= 500) {
|
||||
date.setSeconds(date.getSeconds() + 1);
|
||||
}
|
||||
|
||||
// 清除毫秒部分
|
||||
date.setMilliseconds(0);
|
||||
|
||||
// 手动格式化为 YYYY-MM-DD HH:mm:ss 格式(使用本地时间)
|
||||
const year = date.getFullYear();
|
||||
const month = String(date.getMonth() + 1).padStart(2, '0');
|
||||
const day = String(date.getDate()).padStart(2, '0');
|
||||
const hours = String(date.getHours()).padStart(2, '0');
|
||||
const minutes = String(date.getMinutes()).padStart(2, '0');
|
||||
const seconds = String(date.getSeconds()).padStart(2, '0');
|
||||
|
||||
const formattedTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
||||
|
||||
|
||||
return formattedTime;
|
||||
} catch (error) {
|
||||
// 如果解析失败,返回原始时间字符串
|
||||
console.error('时间解析错误:', error);
|
||||
return timeStr;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.history_chart {
|
||||
width: 100%;
|
||||
height: 360px; /* 明确指定高度 */
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
/* 或者设置最小高度 */
|
||||
.history_chart {
|
||||
width: 100%;
|
||||
min-height: 300px; /* 确保有最小高度 */
|
||||
margin-top: 10px;
|
||||
}
|
||||
</style>
|
||||
@@ -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>
|
||||
@@ -160,6 +173,12 @@
|
||||
:currentScriptTypeName="currentScriptTypeName"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="历史趋势" name="chartTab">
|
||||
<CompareDataCheckChart
|
||||
v-if="activeTab === 'chartTab'"
|
||||
:tableData="rawTableData.length == 0 ? [] : currentRawTableData"
|
||||
/>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
@@ -172,10 +191,11 @@ import { dialogBig } from '@/utils/elementBind'
|
||||
import { computed, reactive, ref } from 'vue'
|
||||
import CompareDataCheckResultTable from './compareDataCheckResultTable.vue'
|
||||
import CompareDataCheckRawDataTable from './compareDataCheckRawDataTable.vue'
|
||||
import CompareDataCheckChart from './compareDataCheckChart.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 {
|
||||
@@ -256,6 +276,7 @@ const currentRawTableData = computed(() => {
|
||||
})
|
||||
|
||||
const open = async (row: any, chnNum: string, deviceId: string | null, source: number) => {
|
||||
activeTab.value = 'resultTab'
|
||||
isWaveData.value = false
|
||||
pattern.value = dictStore.getDictData('Pattern').find(item => item.name === modeStore.currentMode)?.id ?? '' //获取数据字典中对应的id
|
||||
rowList.value = {}
|
||||
@@ -507,6 +528,7 @@ const getResults = async (code: any) => {
|
||||
// 判断是否为录波数据请求
|
||||
const isWaveDataRequest = code === 'wave_data' || isWaveData.value
|
||||
|
||||
|
||||
getContrastResult({
|
||||
planId: checkStore.plan.id,
|
||||
scriptType: rowList.value.scriptType,
|
||||
@@ -515,7 +537,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 +579,7 @@ const close = async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const handleErrorSysChange = async () => {
|
||||
const handleErrorSysChange = async (msg:string) => {
|
||||
changeErrorSystem({
|
||||
planId: checkStore.plan.id,
|
||||
scriptId: '',
|
||||
@@ -564,10 +587,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 +605,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 +615,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
|
||||
})
|
||||
|
||||
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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('数据导出成功');
|
||||
// 这里可以添加实际的数据导出逻辑
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user