From 8ef070c84a703c4a8b838bf9320d68d00a7d6dca Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 28 五月 2026 11:15:32 +0800
Subject: [PATCH] 设备巡检去掉高度限制
---
src/views/productionManagement/workOrder/index.vue | 227 +++++++++++++++++++++++++++++++++++++++-----------------
1 files changed, 159 insertions(+), 68 deletions(-)
diff --git a/src/views/productionManagement/workOrder/index.vue b/src/views/productionManagement/workOrder/index.vue
index 6fdccc0..88564ea 100644
--- a/src/views/productionManagement/workOrder/index.vue
+++ b/src/views/productionManagement/workOrder/index.vue
@@ -192,6 +192,7 @@
step="1"
placeholder="璇疯緭鍏ユ湰娆$敓浜ф暟閲�"
style="width: 100%"
+ :class="{ 'over-limit': reportForm.quantity > reportForm.planQuantity }"
@input="handleQuantityInput"
/>
</el-form-item>
@@ -218,6 +219,18 @@
step="1"
placeholder="璇疯緭鍏ユ姤搴熸暟閲�"
@input="handleScrapQtyInput"
+ />
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="鍔犳斁鏁�" prop="addQty">
+ <el-input
+ v-model.number="reportForm.addQty"
+ type="number"
+ min="0"
+ step="1"
+ placeholder="璇疯緭鍏ュ姞鏀炬暟"
/>
</el-form-item>
</el-col>
@@ -263,24 +276,24 @@
<!-- </el-form-item>-->
<!-- </el-col>-->
- <el-col :span="12">
- <el-form-item label="瀹℃牳浜�" prop="auditUserId">
- <el-select
- v-model="reportForm.auditUserId"
- placeholder="璇烽�夋嫨瀹℃牳浜�"
- clearable
- filterable
- @change="handleReviewerIdChange"
- >
- <el-option
- v-for="user in userOptions"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId"
- />
- </el-select>
- </el-form-item>
- </el-col>
+<!-- <el-col :span="12">-->
+<!-- <el-form-item label="瀹℃牳浜�" prop="auditUserId">-->
+<!-- <el-select-->
+<!-- v-model="reportForm.auditUserId"-->
+<!-- placeholder="璇烽�夋嫨瀹℃牳浜�"-->
+<!-- clearable-->
+<!-- filterable-->
+<!-- @change="handleReviewerIdChange"-->
+<!-- >-->
+<!-- <el-option-->
+<!-- v-for="user in userOptions"-->
+<!-- :key="user.userId"-->
+<!-- :label="user.nickName"-->
+<!-- :value="user.userId"-->
+<!-- />-->
+<!-- </el-select>-->
+<!-- </el-form-item>-->
+<!-- </el-col>-->
</el-row>
</el-form>
@@ -326,11 +339,11 @@
</template>
</el-dialog>
<el-dialog v-model="scheduleDialogVisible"
- :title="`鐢熶骇鎺掍骇(宸ュ崟缂栧彿:${currentReportRowData?.workOrderNo || '-'})`"
+ :title="scheduleDialogTitle"
width="1000px"
:close-on-click-modal="false">
<div class="schedule-panel">
- <el-row style="margin-bottom: 12px;">
+ <el-row v-if="!isScheduleHistoryMode" style="margin-bottom: 12px;">
<el-col>
<el-button type="primary" plain :disabled="scheduleLoading || scheduleSaving" @click="addScheduleRow">
鏂板涓�琛�
@@ -347,7 +360,7 @@
filterable
clearable
style="width: 100%"
- :disabled="scheduleSaving"
+ :disabled="scheduleSaving || isScheduleHistoryMode"
@change="val => handleScheduleDeviceChange(val, row)"
>
<el-option
@@ -362,7 +375,18 @@
<el-table-column label="鏈涓婃満浜�" min-width="220">
<template #default="{ row }">
+ <div v-if="isScheduleHistoryMode" class="schedule-user-tags">
+ <el-tag
+ v-for="(userId, index) in row.userIds"
+ :key="`${userId}-${index}`"
+ type="primary"
+ >
+ {{ resolveScheduleUserName(userId) }}
+ </el-tag>
+ <span v-if="!row.userIds?.length">-</span>
+ </div>
<el-select
+ v-else
v-model="row.userIds"
placeholder="璇烽�夋嫨涓婃満浜�"
filterable
@@ -392,12 +416,12 @@
format="YYYY-MM-DD HH:mm:ss"
placeholder="璇烽�夋嫨涓婃満鏃堕棿"
style="width: 100%"
- :disabled="scheduleSaving"
+ :disabled="scheduleSaving || isScheduleHistoryMode"
/>
</template>
</el-table-column>
- <el-table-column label="鎿嶄綔" width="110" align="center">
+ <el-table-column v-if="!isScheduleHistoryMode" label="鎿嶄綔" width="110" align="center">
<template #default="{ row }">
<el-button
link
@@ -413,7 +437,7 @@
</el-table>
<Pagination
- v-show="schedulePage.total > 0"
+ v-show="isScheduleHistoryMode && schedulePage.total > 0"
style="margin-top: 12px"
:total="schedulePage.total"
:page="schedulePage.current"
@@ -424,8 +448,13 @@
<template #footer>
<span class="dialog-footer">
- <el-button type="primary" :loading="scheduleSaving" @click="handleSaveSchedule">淇濆瓨鎺掍骇</el-button>
- <el-button :disabled="scheduleSaving" @click="scheduleDialogVisible = false">鍙栨秷</el-button>
+ <template v-if="isScheduleHistoryMode">
+ <el-button @click="scheduleDialogVisible = false">鍏抽棴</el-button>
+ </template>
+ <template v-else>
+ <el-button type="primary" :loading="scheduleSaving" @click="handleSaveSchedule">淇濆瓨鎺掍骇</el-button>
+ <el-button :disabled="scheduleSaving" @click="scheduleDialogVisible = false">鍙栨秷</el-button>
+ </template>
</span>
</template>
</el-dialog>
@@ -623,17 +652,12 @@
return;
}
- const first = scheduleRows.value[0] || {};
- const deviceId = first.deviceId || currentReportRowData.value?.deviceId || "";
- const userOptions = deviceId ? buildScheduleUserOptionsByDeviceId(deviceId) : [...baseScheduleUsers.value];
- const defaultUserId = userOptions[0]?.userId ? String(userOptions[0].userId) : "";
-
scheduleRows.value.push(
createScheduleRow({
id: "",
- deviceId,
- deviceName: first.deviceName || currentReportRowData.value?.deviceName || "",
- userIds: defaultUserId ? [defaultUserId] : [],
+ deviceId:"",
+ deviceName:"",
+ userIds: [],
startTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
})
);
@@ -645,7 +669,7 @@
if (!workOrderRow?.id) {
schedulePage.current = 1;
schedulePage.total = 0;
- scheduleRows.value = [createScheduleRow({})];
+ scheduleRows.value = [];
return;
}
@@ -672,11 +696,11 @@
}
const rows = records.map(record => mapMachineRecordToScheduleRow(record));
- scheduleRows.value = rows.length > 0 ? rows : [createScheduleRow({})];
+ scheduleRows.value = rows;
} catch (error) {
console.error("鑾峰彇鎺掍骇璁板綍澶辫触", error);
schedulePage.total = 0;
- scheduleRows.value = [createScheduleRow({})];
+ scheduleRows.value = [];
ElMessage.error("鑾峰彇鎺掍骇璁板綍澶辫触");
} finally {
scheduleLoading.value = false;
@@ -684,12 +708,12 @@
};
const removeScheduleRow = async (row) => {
- if (!row) return;
+ if (!row || isScheduleHistoryMode.value) return;
if (!row.id) {
scheduleRows.value = scheduleRows.value.filter((item) => item !== row);
if (!scheduleRows.value.length) {
- scheduleRows.value = [createScheduleRow({})];
+ addScheduleRow();
}
return;
}
@@ -740,6 +764,7 @@
};
const handleSchedulePagination = ({page, limit}) => {
+ if (!isScheduleHistoryMode.value) return;
schedulePage.current = page;
schedulePage.size = limit;
refreshScheduleRows();
@@ -818,6 +843,12 @@
return (schedulePage.current - 1) * schedulePage.size + index + 1;
};
+const scheduleDialogMode = ref("create");
+const isScheduleHistoryMode = computed(() => scheduleDialogMode.value === "history");
+const scheduleDialogTitle = computed(() =>
+ `${isScheduleHistoryMode.value ? "鎺掍骇璁板綍" : "鐢熶骇鎺掍骇"}(宸ュ崟缂栧彿:${currentReportRowData.value?.workOrderNo || "-"})`
+);
+
const mapMachineRecordToScheduleRow = (record) => {
const id = record?.id ?? "";
const deviceId = record?.machineId ?? record?.deviceId ?? "";
@@ -863,11 +894,29 @@
);
};
+const resetCreateScheduleRows = () => {
+ schedulePage.current = 1;
+ schedulePage.total = 0;
+ scheduleRows.value = [];
+ addScheduleRow();
+};
+
const openScheduleDialog = async (row) => {
+ scheduleDialogMode.value = "create";
+ currentReportRowData.value = row;
+ baseScheduleUsers.value = buildBaseScheduleUsersByRow(row);
+ userTemp.value = [...baseScheduleUsers.value];
+ scheduleDialogVisible.value = true;
+ resetCreateScheduleRows();
+};
+
+const openHistoryTimelineDialog = async (row) => {
+ scheduleDialogMode.value = "history";
currentReportRowData.value = row;
baseScheduleUsers.value = buildBaseScheduleUsersByRow(row);
userTemp.value = [...baseScheduleUsers.value];
schedulePage.current = 1;
+ schedulePage.total = 0;
scheduleRows.value = [];
scheduleDialogVisible.value = true;
@@ -875,6 +924,7 @@
};
const handleSaveSchedule = async () => {
+ if (isScheduleHistoryMode.value) return;
if (scheduleSaving.value) return;
if (!validateScheduleRows()) return;
@@ -899,8 +949,9 @@
}
proxy.$modal.msgSuccess("鎺掍骇宸蹭繚瀛�");
- await refreshScheduleRows();
- getList();
+ scheduleDialogVisible.value = false;
+ resetCreateScheduleRows();
+ await getList();
} catch (error) {
console.error("淇濆瓨鎺掍骇澶辫触", error);
ElMessage.error("淇濆瓨鎺掍骇澶辫触锛岃閲嶈瘯");
@@ -924,20 +975,27 @@
label: "鐢熶骇璁㈠崟鍙�",
prop: "productOrderNpsNo",
width: "140",
+ formatData: val => (val && val.length > 4 ? val.slice(0, -4) : val || ""),
},
{
- label: "浜у搧鍚嶇О",
- prop: "productName",
- width: "140",
+ label: "鎴愬搧鍚嶇О",
+ prop: "finalProductModel",
+ minWidth: 200,
+ overHidden: false
},
- {
- label: "瑙勬牸",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
+ // {
+ // label: "鍔犲伐鍝佸悕绉�",
+ // prop: "productName",
+ // width: "140",
+ // },
+ // {
+ // label: "鍔犲伐鍝佽鏍�",
+ // prop: "model",
+ // },
+ // {
+ // label: "鍔犲伐鍝佸崟浣�",
+ // prop: "unit",
+ // },
{
label: "宸ュ簭鍚嶇О",
prop: "processName",
@@ -981,7 +1039,7 @@
},
{
label: "鎿嶄綔",
- width: "200",
+ width: "220",
align: "center",
dataType: "action",
fixed: "right",
@@ -1009,9 +1067,9 @@
clickFun: row => {
showReportDialog(row);
},
- // 鐢ㄦ埛褰撳墠id
- disabled: row => row.completeQuantity !==0 ||
- !isCurrentUserInUserIds(row)
+ // // 鐢ㄦ埛褰撳墠id
+ disabled: row => row.completeQuantity >= row.planQuantity ||
+ !isCurrentUserInUserIds(row) || row.hasUnreportedMachine
},
{
name: "鐢熶骇鎺掍骇",
@@ -1021,6 +1079,17 @@
return;
}
openScheduleDialog(row);
+ },
+ disabled: row => !row.canSchedule || row.completeQuantity >= row.planQuantity
+ },
+ {
+ name: "鎺掍骇璁板綍",
+ clickFun: row => {
+ if (!row.canSchedule) {
+ ElMessage.warning("褰撳墠鐢ㄦ埛涓嶅湪璇ュ伐搴忎汉鍛樹腑锛屼笉鑳芥煡鐪嬫帓浜ц褰�");
+ return;
+ }
+ openHistoryTimelineDialog(row);
},
disabled: row => !row.canSchedule
}
@@ -1065,6 +1134,7 @@
planQuantity: 0,
quantity: null,
scrapQty: null,
+ addQty: 0,
startTime: "",
endTime: "",
userName: "",
@@ -1076,7 +1146,10 @@
teamList: [],
deviceId: null,
});
-
+function removeLastFour(str) {
+ if (!str) return ''; // 绌哄�间繚鎶�
+ return str.toString().slice(0, -4); // 鏍稿績锛氭埅鍙� 0 鍒� 鍊掓暟绗�4浣�
+}
// 鏈鐢熶骇鏁伴噺楠岃瘉瑙勫垯
const validateQuantity = (rule, value, callback) => {
if (value === null || value === undefined || value === "") {
@@ -1148,7 +1221,7 @@
await Promise.all(updates);
ElMessage.success("瀹℃牳鎴愬姛");
auditDialogVisible.value = false;
- getList();
+ await getList();
} finally {
auditLoading.value = false;
}
@@ -1169,7 +1242,7 @@
scrapQty: [{validator: validateScrapQty, trigger: "blur"}],
startTime: [{required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change"}],
endTime: [{required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change"}],
- auditUserId: [{required: true, message: "璇烽�夋嫨瀹℃牳浜�", trigger: "change"}],
+ // auditUserId: [{required: true, message: "璇烽�夋嫨瀹℃牳浜�", trigger: "change"}],
teamList: [{required: true, message: "璇烽�夋嫨鐝粍", trigger: "change"}],
deviceId: [{required: true, message: "璇烽�夋嫨璁惧", trigger: "change"}],
};
@@ -1260,7 +1333,7 @@
/** 鎼滅储鎸夐挳鎿嶄綔 */
const handleQuery = () => {
page.current = 1;
- getList();
+ getList();
};
const pagination = obj => {
page.current = obj.page;
@@ -1378,9 +1451,10 @@
};
const showReportDialog = row => {
+
currentReportRowData.value = row;
reportForm.planQuantity = row.planQuantity - row.completeQuantity;
- reportForm.quantity = row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
+ reportForm.quantity = row.planQuantity - row.completeQuantity;
reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
reportForm.workOrderId = row.id;
reportForm.reportWork = row.reportWork;
@@ -1390,6 +1464,7 @@
reportForm.replenishQty = 0;
reportForm.teamList = [];
reportForm.scrapQty = 0;
+ reportForm.addQty = 0;
reportForm.userIds = row.userIds || [];
const ids = (row.userIds || "")
@@ -1398,7 +1473,7 @@
.filter(Boolean);
reportForm.userIdsList = userTeamOptions.value
- .filter(item => ids.includes(String(item.userId)))
+ // .filter(item => ids.includes(String(item.userId)))
.map(item => ({
userId: item.userId,
nickName: item.nickName
@@ -1469,12 +1544,12 @@
return;
}
- if (quantity > reportForm.planQuantity) {
- ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- return;
- }
+ // if (quantity > reportForm.planQuantity) {
+ // ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
+ // confirmButtonText: "纭畾",
+ // });
+ // return;
+ // }
const submitData = {
...reportForm,
@@ -1641,6 +1716,14 @@
justify-content: flex-start;
}
}
+
+.schedule-user-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ min-height: 32px;
+ align-items: center;
+}
</style>
<style lang="scss">
@@ -1727,4 +1810,12 @@
height: 140px !important;
}
}
+.el-table .cell {
+ white-space: normal !important;
+ word-break: break-all;
+}
+
+.over-limit .el-input__inner {
+ color: #f56c6c !important;
+}
</style>
--
Gitblit v1.9.3