Compare commits

..

No commits in common. "120dd1e4e6f289aed16500dd0eba8a9d33862797" and "69157d2d8e60aa03fdb25f86a06fa13b0b1135bc" have entirely different histories.

3 changed files with 186 additions and 309 deletions

View File

@ -25,25 +25,17 @@ export function getCheckParas(deviceId, inputTime) {
}
// 获取设备列表
export function getDeviceList(lineId) {
export function getDeviceList() {
return request({
url: `/Check/deviceList?lineID=${lineId}`,
method: 'get'
});
}
// 获取产线列表
export function getLineList() {
return request({
url: '/Check/lineInfoList',
url: '/Check/deviceList',
method: 'get'
});
}
// 导出excel
export function exportExcel(deviceId, inputTime, shift, lineId) {
export function exportExcel(deviceId, inputTime, shift) {
return request({
url: `/Check/Export/Juice?deviceTypeId=${deviceId}&inputTime=${inputTime}&shift=${shift}&lineId=${lineId}`,
url: `/Check/Export/Juice?deviceTypeId=${deviceId}&inputTime=${inputTime}&shift=${shift}`,
method: 'get',
responseType: 'arraybuffer' // 关键:设置响应类型为 arraybuffer
});
@ -52,21 +44,9 @@ export function exportExcel(deviceId, inputTime, shift, lineId) {
// 报警相关接口
// 时间点确认点检,传递多个 alarmId
export function sharpConfirm(alarmIdList, confirmTime, checkUser) {
const params = new URLSearchParams();
// 添加 alarmId 参数
alarmIdList.forEach(id => params.append('alarmIdList', id));
// 添加其他参数
if (confirmTime) {
params.append('confirmTime', confirmTime);
}
if (checkUser) {
params.append('checkUser', checkUser);
}
const alarmIdParams = alarmIdList.map(id => `alarmIdList=${id}`).join('&');
return request({
url: `/Check/sharpConfirm?${params.toString()}`,
url: `/Check/sharpConfirm?${alarmIdParams}&checkUser=${checkUser}`,
method: 'post'
});
}

View File

@ -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:8082/api', // 家用测试接口
// baseURL: 'http://39.105.9.124:8090/api', // 家用测试接口
baseURL: '/api',
timeout: 5000, // 请求超时时间
headers: {

View File

@ -6,11 +6,6 @@
<IxDateInput label="日期" name="date" :value="currentDate" class="input-spacing" @dateChange="handleDateChange">
</IxDateInput>
<!-- 产线选择框 -->
<IxSelect Outline id="lineSelect" v-model="selectedLineId" label="产线" hideListHeader="true" class="input-spacing" @valueChange="handleLineChange">
<IxSelectItem v-for="line in lineList" :key="line.id" :label="line.aliasName" :value="line.id"></IxSelectItem>
</IxSelect>
<!-- 班次选择框 -->
<IxSelect Outline id="triggerId" v-model="shift" label="班次" hideListHeader="true" class="input-spacing" @valueChange="handleShiftChange">
<IxSelectItem icon="sun" label="白班" value="0"></IxSelectItem>
@ -30,7 +25,7 @@
</div>
<div class="header_right">
<!-- 设备列表按钮 -->
<span v-for="(item) in deviceList" :key="item.id">
<span v-for="(item, index) in deviceList" :key="item.id">
<IxButton :outline="selectedDeviceTypeId !== item.id" class="btn-style" @click="handleDeviceListChange(item.id)">
{{ item.name }}
</IxButton>
@ -38,11 +33,7 @@
</div>
</div>
<div class="inspection-table">
<div v-if="isLoading" class="loading-container">
<IxSpinner></IxSpinner>
<span class="loading-text">数据加载中...</span>
</div>
<div v-else class="table-container">
<div class="table-container">
<!-- 表头部分 -->
<div class="table-row fixed-row">
<span class="fixed-width title-width"></span>
@ -50,8 +41,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[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 :disabled="confirmedHours.includes(hour) || hourCheckStatus[hour] !== null" class="custom-button" @click="handleInspection(hour, index)">
{{ hourCheckStatus[hour] !== null ? hourCheckTime[hour] : '确认' }}
</IxButton>
</span>
</div>
@ -99,9 +90,9 @@
import moment from 'moment';
import momentTimezone from 'moment-timezone';
import { ref, computed, getCurrentInstance, onMounted, defineEmits, onUnmounted } from 'vue';
import { IxDatePicker, IxButton, IxDropdownItem, IxEventList, IxEventListItem, IxSelect, IxSelectItem, IxDateInput, IxSpinner } from '@siemens/ix-vue';
import { IxDatePicker, IxButton, IxDropdownItem, IxEventList, IxEventListItem, IxSelect, IxSelectItem, IxDateInput } from '@siemens/ix-vue';
import InspectionForm from './InspectionForm.vue';
import { getInspectionCurrent, getInspectionData, getCheckParas, getLineList, getDeviceList, exportExcel, sharpConfirm, alarmReasonConfirm } from '@/api/inspection';
import { getInspectionCurrent, getInspectionData, getCheckParas, getDeviceList, exportExcel, sharpConfirm, alarmReasonConfirm } from '@/api/inspection';
const emit = defineEmits(['send-data']);
@ -126,10 +117,6 @@ const defaultShift = currentHour >= 7 && currentHour < 19 ? '0' : '1'; // 早班
const shift = ref(defaultShift); //
const status = ref('0'); // status
// 线
const lineList = ref([]);
const selectedLineId = ref(null);
//
const deviceList = ref([]);
const selectedDeviceTypeId = ref(null);
@ -191,42 +178,32 @@ const confirmedHours = ref([]);
const confirmedTimes = ref({});
//
const hourCheckStatus = ref({}); // { [deviceId: string]: { [recordTime: string]: number } }
const hourCheckTime = ref({}); // { [deviceId: string]: { [recordTime: string]: string } }
const hourCheckStatus = ref({});
const hourCheckTime = ref({});
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}`;
};
//
const isLoading = ref(true);
//
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 = [];
//
// 0 null/undefined
if (hourCheckValid.value[selectedDeviceTypeId.value]?.[hour] === 0) {
if (hourCheckValid.value[hour] !== 1) {
showWarningMessage('存在设备异常,无法执行点检操作!');
return;
}
// checkStatus0
// checkStatus0
if (inspectionItems.value.some(item => item.data[hour]?.checkStatus === 0)) {
showWarningMessage('存在报警数据未处理,无法执行点检操作!');
return;
@ -238,26 +215,14 @@ const handleInspection = (hour, index) => {
currentAlarmIds.push(alarmId.value[deviceId][hour]);
}
});
console.log("🚀 ~ handleInspection ~ currentAlarmIds:", currentAlarmIds)
showConfirmMessage('确认要执行点检操作吗?', async () => {
const confirmTime = moment().tz(timezone).format('YYYY-MM-DD HH:mm');
await sharpConfirm(currentAlarmIds, confirmTime, 'admin').then(() => {
await sharpConfirm(currentAlarmIds, 'admin').then(() => {
confirmedHours.value.push(selectedItemTime.value);
confirmedTimes.value[selectedItemTime.value] = moment().tz(timezone).format('HH:mm');
//
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('点检确认失败,请稍后重试');
hourCheckStatus.value[hour] = 1; //
hourCheckTime.value[hour] = confirmedTimes.value[selectedItemTime.value]; //
});
}, () => {
showWarningMessage('取消点检操作');
@ -319,182 +284,6 @@ const showConfirmMessage = (message, onConfirm, onCancel) => {
proxy.$message.confirm(message, onConfirm, onCancel);
};
//
const fetchCheckParams = async (deviceId, dateValue) => {
try {
const params = await getCheckParas(deviceId, dateValue);
if (params.data) {
//
paramsCache.value = {};
params.data.forEach(param => {
paramsCache.value[param.keyname] = {
projectName: param.projectName,
referenceValue: param.referenceValue,
unit: param.unit
};
});
return true;
} else {
showWarningMessage('获取设备具体信息失败!');
return false;
}
} catch (error) {
console.error('Error fetching check params:', error);
return false;
}
};
//
const fetchCurrentValues = async () => {
try {
const deviceId = selectedDeviceTypeId.value;
const dateValue = selectedDate.value || currentDate;
const response = await getInspectionCurrent(deviceId, dateValue);
if (response.data) {
const currentValueList = response.data;
const currentValues = {};
currentValueList.forEach(item => {
// null
for (const [key, value] of Object.entries(item.data)) {
if (value !== null) {
currentValues[key] = value;
}
}
});
//
inspectionItems.value.forEach(item => {
// 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('获取当前设备当前值失败!');
}
} catch (error) {
console.error('Error fetching current values:', error);
}
};
//
const fetchInspectionData = async () => {
try {
isLoading.value = true;
const deviceTypeId = selectedDeviceTypeId.value;
const shiftValue = shift.value;
const dateValue = selectedDate.value || currentDate;
//
await fetchCheckParams(deviceTypeId, dateValue);
const response = await getInspectionData(deviceTypeId, dateValue, shiftValue);
if (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;
//
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;
//
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.value === null) continue;
// 使 checkParamId
const uniqueKey = valueObj.checkParamId.toString();
// 使
const paramInfo = paramsCache.value[name] || { projectName: name, referenceValue: 0, unit: '' };
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[uniqueKey].data[recordTime] = {
value: valueObj.value,
checkStatus: valueObj.checkStatus,
checkText: valueObj.checkText,
checkParamId: valueObj.checkParamId,
checkUser: valueObj.checkUser,
deviceId: record.deviceId,
};
}
});
inspectionItems.value = Object.values(itemsMap);
//
await fetchCurrentValues();
} else {
showWarningMessage('获取点检数据失败!');
}
} catch (error) {
console.error('Error fetching inspection data:', error);
} finally {
isLoading.value = false;
}
};
//
const handleSearch = async () => {
try {
isLoading.value = true;
await fetchInspectionData();
} catch (error) {
showWarningMessage('数据刷新失败');
console.error('Error refreshing data:', error);
} finally {
isLoading.value = false;
}
};
//
const handleDateChange = (event) => {
selectedDate.value = event.target.value;
@ -502,13 +291,6 @@ const handleDateChange = (event) => {
fetchCurrentValues();
};
// 线
const handleLineChange = (event) => {
selectedLineId.value = event.detail;
fetchInspectionData();
fetchCurrentValues();
};
//
const handleShiftChange = (event) => {
shift.value = event.detail;
@ -523,24 +305,10 @@ const handleDeviceListChange = (id) => {
fetchCurrentValues();
};
const fetchLineList = async () => {
try {
const response = await getLineList();
if (response.code === 200) {
lineList.value = response.data;
selectedLineId.value = lineList.value[0].id; // 线
} else {
showWarningMessage('获取产线列表失败!');
}
} catch (error) {
console.error('Error fetching line list:', error);
}
};
//
const fetchDeviceList = async () => {
try {
const response = await getDeviceList(selectedLineId.value);
const response = await getDeviceList();
if (response.code === 200) {
deviceList.value = response.data;
selectedDeviceTypeId.value = deviceList.value[0].id; //
@ -552,6 +320,126 @@ const fetchDeviceList = async () => {
}
};
//
const fetchCurrentValues = async () => {
try {
const deviceId = selectedDeviceTypeId.value; // ID
const dateValue = selectedDate.value || currentDate;
const response = await getInspectionCurrent(deviceId, dateValue);
const params = await getCheckParas(deviceId, dateValue);
if (response.data) {
const currentValueList = response.data;
console.log("🚀 ~ fetchCurrentValues ~ currentValueList:", currentValueList)
const currentValues = {};
currentValueList.forEach(item => {
// null
for (const [key, value] of Object.entries(item.data)) {
if (value !== null) {
currentValues[key] = value;
}
}
});
console.log("🚀 ~ fetchCurrentValues ~ currentValues:", currentValues)
inspectionItems.value.forEach(item => {
item.current = formatNumberWithCommas(currentValues?.[item.name]) || '--'; // currentValues
});
} else {
showWarningMessage('获取当前设备当前值失败!');
}
if (params.data) {
const paramData = params.data;
inspectionItems.value.forEach(item => {
const param = paramData.find(param => {
return param.keyname === item.name;
});
if (param) {
item.label = param.projectDescription;
item.reference = param.referenceValue;
item.unit = param.unit;
}
});
} else {
showWarningMessage('获取设备具体信息失败!');
}
} catch (error) {
console.error('Error fetching current values:', error);
}
};
//
const fetchInspectionData = async () => {
try {
const deviceTypeId = selectedDeviceTypeId.value; // ID
const shiftValue = shift.value;
const dateValue = selectedDate.value || currentDate;
const response = await getInspectionData(deviceTypeId, dateValue, shiftValue);
if (response.data) {
const inspectionData = response.data;
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 (!alarmId.value[deviceId]) {
alarmId.value[deviceId] = {} // ID
}
alarmId.value[deviceId][recordTime] = record.alarmId;
hourCheckValid.value[recordTime] = record.hourCheckValid;
for (const [name, valueObj] of Object.entries(data)) {
if (valueObj === null || valueObj.valule === null) continue; // null
if (!itemsMap[name]) {
itemsMap[name] = {
name,
label: name, // label
reference: 0,
current: 0,
unit: '', //
data: {}
};
}
itemsMap[name].data[recordTime] = {
value: valueObj.valule,
checkStatus: valueObj.checkStatus,
checkText: valueObj.checkText,
checkParamId: valueObj.checkParamId,
checkUser: valueObj.checkUser,
deviceId: record.deviceId,
// hourCheckStatus: valueObj.hourCheckStatus,
// hourCheckTime: valueObj.hourCheckTime
};
}
});
inspectionItems.value = Object.values(itemsMap);
} else {
showWarningMessage('获取点检数据失败!');
}
} catch (error) {
console.error('Error fetching inspection data:', error);
}
};
//
const handleSearch = async () => {
try {
await Promise.all([fetchInspectionData(), fetchCurrentValues()]);
// showInfoMessage('');
} catch (error) {
showWarningMessage('数据刷新失败');
console.error('Error refreshing data:', error);
}
};
const handleExport = () => {
// inspectionItems.value
if (inspectionItems.value.some(item => Object.values(item.data).some(data => data.checkStatus === 0))) {
@ -560,7 +448,7 @@ const handleExport = () => {
}
showInfoMessage('导出全部');
exportExcel(selectedDeviceTypeId.value, selectedDate.value || currentDate, shift.value, selectedLineId.value)
exportExcel(selectedDeviceTypeId.value, selectedDate.value || currentDate, shift.value)
.then((response) => {
if (response) {
//
@ -589,18 +477,51 @@ const getDeviceNameById = (id) => {
return device ? device.name : '';
};
// let autoUpdateInterval = null;
onMounted(async () => {
isLoading.value = true;
try {
await fetchLineList();
await fetchDeviceList();
await handleSearch();
sendDataToParent();
} finally {
isLoading.value = false;
}
// const setupAutoUpdate = () => {
// if (isAutoUpdate.value) {
// autoUpdateInterval = setInterval(() => {
// fetchCurrentValues();
// fetchInspectionData();
// }, 60000); //
// } else if (autoUpdateInterval) {
// clearInterval(autoUpdateInterval);
// autoUpdateInterval = null;
// }
// };
// setupAutoUpdate();
// update-history
// window.addEventListener('update-history', (event) => {
// isAutoUpdate.value = false;
// selectedDate.value = event.detail;
// fetchCurrentValues();
// fetchInspectionData();
// setupAutoUpdate();
// });
// reset
// window.addEventListener('reset', (event) => {
// isAutoUpdate.value = true;
// selectedDate.value = moment().tz(timezone).format('YYYY-MM-DD HH:mm');
// fetchCurrentValues();
// fetchInspectionData();
// setupAutoUpdate();
// });
});
// onUnmounted(() => {
// if (autoUpdateInterval) {
// clearInterval(autoUpdateInterval);
// }
// });
</script>
<style scoped>
@ -733,15 +654,6 @@ 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;
@ -787,19 +699,4 @@ onMounted(async () => {
.alarm-cell-title {
--theme-color-success: red;
}
/* 添加加载状态样式 */
.loading-container {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
height: 100%;
width: 100%;
}
.loading-text {
margin-top: 1rem;
font-size: 1.2rem;
}
</style>