feat: 更新导出Excel接口,新增lineId参数;优化sharpConfirm接口参数处理
This commit is contained in:
parent
5ad5237fb7
commit
120dd1e4e6
|
@ -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'
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -50,8 +50,8 @@
|
|||
<span class="fixed-width"></span>
|
||||
<span class="fixed-width"></span>
|
||||
<span class="fixed-width" v-for="(hour, index) in hours" :key="hour">
|
||||
<IxButton :disabled="confirmedHours.includes(hour) || hourCheckStatus[hour] !== null" class="custom-button" @click="handleInspection(hour, index)">
|
||||
{{ hourCheckStatus[hour] !== null ? hourCheckTime[hour] : '确认' }}
|
||||
<IxButton :disabled="confirmedHours.includes(hour) || (hourCheckStatus[selectedDeviceTypeId]?.[hour] !== null && hourCheckTime[selectedDeviceTypeId]?.[hour] !== null) || hourCheckValid[selectedDeviceTypeId]?.[hour] === 0" class="custom-button" @click="handleInspection(hour, index)">
|
||||
{{ (hourCheckStatus[selectedDeviceTypeId]?.[hour] !== null && hourCheckTime[selectedDeviceTypeId]?.[hour] !== null) ? hourCheckTime[selectedDeviceTypeId]?.[hour] : '确认' }}
|
||||
</IxButton>
|
||||
</span>
|
||||
</div>
|
||||
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue