From 120dd1e4e6f289aed16500dd0eba8a9d33862797 Mon Sep 17 00:00:00 2001 From: Zhao Zhao Shen Date: Fri, 18 Jul 2025 15:44:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=E5=AF=BC=E5=87=BAExc?= =?UTF-8?q?el=E6=8E=A5=E5=8F=A3=EF=BC=8C=E6=96=B0=E5=A2=9ElineId=E5=8F=82?= =?UTF-8?q?=E6=95=B0=EF=BC=9B=E4=BC=98=E5=8C=96sharpConfirm=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=8F=82=E6=95=B0=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/inspection.js | 20 +++++-- src/utils/request.js | 2 +- src/views/Inspection/index.vue | 105 +++++++++++++++++++++++++-------- 3 files changed, 99 insertions(+), 28 deletions(-) diff --git a/src/api/inspection.js b/src/api/inspection.js index 71fa48f..a5a6a29 100644 --- a/src/api/inspection.js +++ b/src/api/inspection.js @@ -41,9 +41,9 @@ export function getLineList() { } // 导出excel -export function exportExcel(deviceId, inputTime, shift) { +export function exportExcel(deviceId, inputTime, shift, lineId) { return request({ - url: `/Check/Export/Juice?deviceTypeId=${deviceId}&inputTime=${inputTime}&shift=${shift}`, + url: `/Check/Export/Juice?deviceTypeId=${deviceId}&inputTime=${inputTime}&shift=${shift}&lineId=${lineId}`, method: 'get', responseType: 'arraybuffer' // 关键:设置响应类型为 arraybuffer }); @@ -52,9 +52,21 @@ export function exportExcel(deviceId, inputTime, shift) { // 报警相关接口 // 时间点确认点检,传递多个 alarmId export function sharpConfirm(alarmIdList, confirmTime, checkUser) { - const alarmIdParams = alarmIdList.map(id => `alarmIdList=${id}`).join('&'); + const params = new URLSearchParams(); + + // 添加 alarmId 参数 + alarmIdList.forEach(id => params.append('alarmIdList', id)); + + // 添加其他参数 + if (confirmTime) { + params.append('confirmTime', confirmTime); + } + if (checkUser) { + params.append('checkUser', checkUser); + } + return request({ - url: `/Check/sharpConfirm?${alarmIdParams}&checkUser=${checkUser}`, + url: `/Check/sharpConfirm?${params.toString()}`, method: 'post' }); } diff --git a/src/utils/request.js b/src/utils/request.js index b252789..c3f0acd 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -2,7 +2,7 @@ import axios from 'axios'; const service = axios.create({ // baseURL: 'http://192.168.1.199:8080/api', // 办公室测试接口 - // baseURL: 'http://39.105.9.124:8090/api', // 家用测试接口 + // baseURL: 'http://39.105.9.124:8082/api', // 家用测试接口 baseURL: '/api', timeout: 5000, // 请求超时时间 headers: { diff --git a/src/views/Inspection/index.vue b/src/views/Inspection/index.vue index cb9a466..5c40877 100644 --- a/src/views/Inspection/index.vue +++ b/src/views/Inspection/index.vue @@ -50,8 +50,8 @@ - - {{ hourCheckStatus[hour] !== null ? hourCheckTime[hour] : '确认' }} + + {{ (hourCheckStatus[selectedDeviceTypeId]?.[hour] !== null && hourCheckTime[selectedDeviceTypeId]?.[hour] !== null) ? hourCheckTime[selectedDeviceTypeId]?.[hour] : '确认' }} @@ -191,13 +191,15 @@ const confirmedHours = ref([]); const confirmedTimes = ref({}); // 点检状态 -const hourCheckStatus = ref({}); -const hourCheckTime = ref({}); +const hourCheckStatus = ref({}); // 改为双层结构:{ [deviceId: string]: { [recordTime: string]: number } } +const hourCheckTime = ref({}); // 改为双层结构:{ [deviceId: string]: { [recordTime: string]: string } } const alarmId = ref({}); // 改为双层结构:{ [deviceId: string]: { [recordTime: string]: number } } const hourCheckValid = ref({}); const formatTime = (time) => { + if (!time) return null; // 如果时间为空,返回 null const date = new Date(time); + if (isNaN(date.getTime())) return null; // 如果时间无效,返回 null const hours = date.getHours().toString().padStart(2, '0'); const minutes = date.getMinutes().toString().padStart(2, '0'); return `${hours}:${minutes}`; @@ -211,18 +213,20 @@ const paramsCache = ref({}); // 点检按钮点击事件 const handleInspection = (hour, index) => { - selectedItemName.value = inspectionItems.value[index].label; + selectedItemName.value = inspectionItems.value[index]?.label || ''; selectedItemTime.value = hour; selectedItemIndex.value = index; // 保存当前索引 // 获取当前时间点所有设备报警ID const currentAlarmIds = []; // 校验是否已经确认异常数据 - if (hourCheckValid.value[hour] !== 1) { + // 只有明确为 0 时才表示存在设备异常,null/undefined 表示正常 + if (hourCheckValid.value[selectedDeviceTypeId.value]?.[hour] === 0) { showWarningMessage('存在设备异常,无法执行点检操作!'); return; } - // 校验这个时刻这一列有咩有报警未处理的数据,也就是checkStatus为0的数据 + + // 校验这个时刻这一列有没有报警未处理的数据,也就是checkStatus为0的数据 if (inspectionItems.value.some(item => item.data[hour]?.checkStatus === 0)) { showWarningMessage('存在报警数据未处理,无法执行点检操作!'); return; @@ -234,14 +238,26 @@ const handleInspection = (hour, index) => { currentAlarmIds.push(alarmId.value[deviceId][hour]); } }); - console.log("🚀 ~ handleInspection ~ currentAlarmIds:", currentAlarmIds) showConfirmMessage('确认要执行点检操作吗?', async () => { - await sharpConfirm(currentAlarmIds, 'admin').then(() => { + const confirmTime = moment().tz(timezone).format('YYYY-MM-DD HH:mm'); + await sharpConfirm(currentAlarmIds, confirmTime, 'admin').then(() => { confirmedHours.value.push(selectedItemTime.value); confirmedTimes.value[selectedItemTime.value] = moment().tz(timezone).format('HH:mm'); - hourCheckStatus.value[hour] = 1; // 更新点检状态 - hourCheckTime.value[hour] = confirmedTimes.value[selectedItemTime.value]; // 更新点检时间 + + // 按设备更新点检状态 + if (!hourCheckStatus.value[selectedDeviceTypeId.value]) { + hourCheckStatus.value[selectedDeviceTypeId.value] = {}; + } + if (!hourCheckTime.value[selectedDeviceTypeId.value]) { + hourCheckTime.value[selectedDeviceTypeId.value] = {}; + } + + hourCheckStatus.value[selectedDeviceTypeId.value][hour] = 1; // 更新当前设备的点检状态 + hourCheckTime.value[selectedDeviceTypeId.value][hour] = confirmedTimes.value[selectedItemTime.value]; // 更新当前设备的点检时间 + }).catch((error) => { + console.error('点检确认失败:', error); + showWarningMessage('点检确认失败,请稍后重试'); }); }, () => { showWarningMessage('取消点检操作'); @@ -349,7 +365,20 @@ const fetchCurrentValues = async () => { // 更新当前值 inspectionItems.value.forEach(item => { - item.current = formatNumberWithCommas(currentValues?.[item.name]) || '--'; + // 通过 checkParamId 查找对应的当前值 + let currentValue = '--'; + for (const [key, value] of Object.entries(currentValues)) { + // 需要通过 checkParamId 匹配,因为 key 可能不同 + if (item.checkParamId && value !== null) { + // 这里需要根据实际的参数映射关系来匹配 + // 暂时使用原始名称匹配 + if (item.originalName === key) { + currentValue = value; + break; + } + } + } + item.current = formatNumberWithCommas(currentValue) || '--'; }); } else { showWarningMessage('获取当前设备当前值失败!'); @@ -373,41 +402,63 @@ const fetchInspectionData = async () => { const response = await getInspectionData(deviceTypeId, dateValue, shiftValue); if (response.data) { - const inspectionData = response.data; + const inspectionData = response.data.filter(record => record.lineId === selectedLineId.value); const itemsMap = {}; inspectionData.forEach(record => { const recordTime = record.recordTime; const data = record.data; const deviceId = record.deviceId; - hourCheckStatus.value[recordTime] = record.hourCheckStatus; - hourCheckTime.value[recordTime] = formatTime(record.hourCheckTime); + // 按设备分组存储点检状态 + if (!hourCheckStatus.value[deviceId]) { + hourCheckStatus.value[deviceId] = {}; + } + if (!hourCheckTime.value[deviceId]) { + hourCheckTime.value[deviceId] = {}; + } + + // 只有在本地没有设置过的情况下,才使用服务器数据 + if (hourCheckStatus.value[deviceId][recordTime] === undefined) { + hourCheckStatus.value[deviceId][recordTime] = record.hourCheckStatus; + } + if (hourCheckTime.value[deviceId][recordTime] === undefined) { + hourCheckTime.value[deviceId][recordTime] = formatTime(record.hourCheckTime); + } if (!alarmId.value[deviceId]) { alarmId.value[deviceId] = {} } alarmId.value[deviceId][recordTime] = record.alarmId; - hourCheckValid.value[recordTime] = record.hourCheckValid; + // 按设备分组存储点检有效状态 + if (!hourCheckValid.value[deviceId]) { + hourCheckValid.value[deviceId] = {}; + } + hourCheckValid.value[deviceId][recordTime] = record.hourCheckValid; for (const [name, valueObj] of Object.entries(data)) { - if (valueObj === null || valueObj.valule === null) continue; + if (valueObj === null || valueObj.value === null) continue; + + // 使用 checkParamId 作为唯一标识,避免不同设备间参数覆盖 + const uniqueKey = valueObj.checkParamId.toString(); // 使用参数缓存获取项目名称和其他信息 const paramInfo = paramsCache.value[name] || { projectName: name, referenceValue: 0, unit: '' }; - if (!itemsMap[name]) { - itemsMap[name] = { - name, + if (!itemsMap[uniqueKey]) { + itemsMap[uniqueKey] = { + name: uniqueKey, + originalName: name, // 保留原始名称用于调试 label: paramInfo.projectName, // 直接使用中文名称 reference: paramInfo.referenceValue, current: 0, unit: paramInfo.unit, + checkParamId: valueObj.checkParamId, data: {} }; } - itemsMap[name].data[recordTime] = { + itemsMap[uniqueKey].data[recordTime] = { value: valueObj.value, checkStatus: valueObj.checkStatus, checkText: valueObj.checkText, @@ -419,7 +470,6 @@ const fetchInspectionData = async () => { }); inspectionItems.value = Object.values(itemsMap); - // 更新当前值 await fetchCurrentValues(); } else { @@ -510,7 +560,7 @@ const handleExport = () => { } showInfoMessage('导出全部'); - exportExcel(selectedDeviceTypeId.value, selectedDate.value || currentDate, shift.value) + exportExcel(selectedDeviceTypeId.value, selectedDate.value || currentDate, shift.value, selectedLineId.value) .then((response) => { if (response) { // 有数据的处理 @@ -683,6 +733,15 @@ onMounted(async () => { --theme-btn-primary--background--hover: #FFA849; } +/* 禁用状态的按钮样式 */ +.custom-button[disabled] { + --theme-btn-primary--background: #666666 !important; + --theme-btn-primary--background--hover: #666666 !important; + --theme-btn-primary--color: #999999 !important; + cursor: not-allowed !important; + opacity: 0.6 !important; +} + .drop-down { width: calc(25% - 1.25rem); background-color: #23233C;