From fa7202c95f80c76c334e98c034910443395e5f0e Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期三, 06 五月 2026 13:47:38 +0800
Subject: [PATCH] 生产追溯修改
---
src/views/productionManagement/productionTraceability/index.vue | 385 +++++++++++++++++-------------------------------------
src/api/productionManagement/productionOrder.js | 9 +
2 files changed, 132 insertions(+), 262 deletions(-)
diff --git a/src/api/productionManagement/productionOrder.js b/src/api/productionManagement/productionOrder.js
index 9b5751d..b84a188 100644
--- a/src/api/productionManagement/productionOrder.js
+++ b/src/api/productionManagement/productionOrder.js
@@ -102,6 +102,15 @@
data,
});
}
+
+// 鐢熶骇璁㈠崟婧簮璇︽儏
+export function getOrderDetail(npsNo) {
+ return request({
+ url: "/productionOrder/ordeDetail",
+ method: "get",
+ params: { npsNo },
+ });
+}
// 鐢熶骇璁㈠崟-棰嗘枡璇︽儏鍒楄〃
// export function listMaterialPickingDetail(query) {
// return request({
diff --git a/src/views/productionManagement/productionTraceability/index.vue b/src/views/productionManagement/productionTraceability/index.vue
index e2ac6df..8de8ab3 100644
--- a/src/views/productionManagement/productionTraceability/index.vue
+++ b/src/views/productionManagement/productionTraceability/index.vue
@@ -22,9 +22,6 @@
:value="option.id" />
</el-select>
</el-form-item>
- <el-form-item>
- <el-button @click="handleBack">杩斿洖</el-button>
- </el-form-item>
</el-form>
</div>
</template>
@@ -37,7 +34,7 @@
<el-descriptions-item label="鐢熶骇璁㈠崟鍙�">{{ rowData.productionOrderDto?.npsNo || '-' }}</el-descriptions-item>
<el-descriptions-item label="浜у搧鍚嶇О">{{ rowData.productionOrderDto?.productName || '-' }}</el-descriptions-item>
<el-descriptions-item label="浜у搧瑙勬牸">{{ rowData.productionOrderDto?.model || '-' }}</el-descriptions-item>
- <el-descriptions-item label="鐗╂枡缂栫爜">{{ rowData.productionOrderDto?.materialCode || '-' }}</el-descriptions-item>
+ <!-- <el-descriptions-item label="鐗╂枡缂栫爜">{{ rowData.productionOrderDto?.materialCode || '-' }}</el-descriptions-item> -->
<el-descriptions-item label="璁″垝鏁伴噺">{{ rowData.productionOrderDto?.quantity || 0 }} <span class="unit">{{ rowData.productionOrderDto?.unit || '-' }}</span></el-descriptions-item>
<el-descriptions-item label="褰撳墠鐘舵��">
<el-tag :type="getStatusType(rowData.productionOrderDto?.status)">
@@ -45,12 +42,12 @@
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="瀹㈡埛鍚嶇О">{{ rowData.productionOrderDto?.customerName || '-' }}</el-descriptions-item>
- <el-descriptions-item label="寮�濮嬫棩鏈�">{{ rowData.productionOrderDto?.startTime || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="寮�濮嬫棩鏈�">{{ parseTime(rowData.productionOrderDto?.startTime) || '-' }}</el-descriptions-item>
<el-descriptions-item label="瀹屾垚杩涘害">
- <el-progress :percentage="rowData.productionOrderDto?.completionStatus"
+ <el-progress :percentage="rowData.productionOrderDto?.completionStatus>=100?100:rowData.productionOrderDto?.completionStatus"
:color="customColors(rowData.productionOrderDto?.completionStatus)"
- :status="rowData.productionOrderDto?.completionStatus === 100 ? 'success' : ''"
- style="width: 120px;" />
+ :status="rowData.productionOrderDto?.completionStatus >= 100 ? 'success' : ''"
+ style="width: 80%;" />
</el-descriptions-item>
</el-descriptions>
</div>
@@ -65,23 +62,26 @@
<el-table :data="rowData.productionRecords"
border
style="width: 100%">
- <el-table-column prop="productNo"
+ <el-table-column prop="workOrder.workOrderNo"
label="宸ュ崟缂栧彿"
align="center">
</el-table-column>
- <el-table-column prop="productName"
- label="浜у搧鍚嶇О"
- align="center" />
- <el-table-column prop="model"
- label="瑙勬牸"
- align="center" />
- <el-table-column prop="processName"
- label="宸ュ簭鍚嶇О"
- align="center" />
- <el-table-column prop="requiredQuantity"
+ <el-table-column label="浜у搧鍚嶇О"
+ align="center">
+ <template #default>
+ {{ rowData.productionOrderDto?.productName || '-' }}
+ </template>
+ </el-table-column>
+ <el-table-column label="瑙勬牸"
+ align="center">
+ <template #default>
+ {{ rowData.productionOrderDto?.model || '-' }}
+ </template>
+ </el-table-column>
+ <el-table-column prop="workOrder.planQuantity"
label="闇�姹傛暟閲�"
align="center" />
- <el-table-column prop="completedQuantity"
+ <el-table-column prop="workOrder.completeQuantity"
label="瀹屾垚鏁伴噺"
align="center" />
<el-table-column label="璇︽儏"
@@ -111,39 +111,36 @@
<div class="detail-container">
<!-- 鍩虹淇℃伅 -->
<div class="detail-section">
- <h3 class="section-title">鍩虹淇℃伅</h3>
+ <h3 class="section-title">宸ュ崟鍩虹淇℃伅</h3>
<el-descriptions :column="3"
border>
- <el-descriptions-item label="鐢熶骇宸ュ崟鍙�">{{ detailData.npsNo || '-' }}</el-descriptions-item>
- <el-descriptions-item label="鐝粍">
- <el-tag :type="detailData.schedule === '鐧界彮' ? 'primary' : 'warning'">{{ detailData.schedule || '-' }}</el-tag>
+ <el-descriptions-item label="鐢熶骇宸ュ崟鍙�">{{ detailData.workOrder.workOrderNo || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="璁″垝鏁伴噺">{{ detailData.workOrder.planQuantity || 0 }}</el-descriptions-item>
+ <el-descriptions-item label="瀹屾垚鏁伴噺">{{ detailData.workOrder.completeQuantity || 0 }}</el-descriptions-item>
+ <el-descriptions-item label="瀹為檯寮�濮嬫椂闂�">{{ parseTime(detailData.workOrder.actualStartTime) || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="瀹為檯缁撴潫鏃堕棿">{{ parseTime(detailData.workOrder.actualEndTime) || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鐘舵��">
+ <el-tag :type="getStatusType(detailData.workOrder.status)">{{ getStatusText(detailData.workOrder.status) }}</el-tag>
</el-descriptions-item>
- <el-descriptions-item label="浜у搧缂栫爜">{{ detailData.materialCode || '-' }}</el-descriptions-item>
- <el-descriptions-item label="浜у搧鍚嶇О">{{ detailData.productName || '-' }}</el-descriptions-item>
- <el-descriptions-item label="瑙勬牸">{{ detailData.model || '-' }}</el-descriptions-item>
- <el-descriptions-item label="鍚堟牸鏁伴噺"><span class="num2">{{ detailData.qualifiedQuantity || 0 }}</span> <span class="unit">{{ detailData.unit || '-' }}</span></el-descriptions-item>
- <el-descriptions-item label="涓嶅悎鏍兼暟閲�"><span class="num3">{{ detailData.unqualifiedQuantity || 0 }}</span> <span class="unit">{{ detailData.unit || '-' }}</span></el-descriptions-item>
- <el-descriptions-item label="鎬绘暟閲�"><span class="num1">{{ detailData.quantity || 0 }}</span> <span class="unit">{{ detailData.unit || '-' }}</span></el-descriptions-item>
- <el-descriptions-item label="寮�濮嬫椂闂�">{{ detailData.reportingTime || '-' }}</el-descriptions-item>
</el-descriptions>
</div>
<div class="detail-section">
<h3 class="section-title">鎶ュ伐鏄庣粏</h3>
- <el-table :data="[detailData]"
+ <el-table :data="detailData.reports"
border
style="width: 100%">
<el-table-column label="鎶ュ伐鍗曞彿"
prop="productNo"
align="center" />
- <el-table-column label="浜у嚭鏁伴噺"
- prop="qualifiedQuantity"
- align="center" />
- <el-table-column label="鎶ュ簾鏁伴噺"
- prop="unqualifiedQuantity"
+ <el-table-column label="鍒涘缓浜�"
+ prop="userName"
align="center" />
<el-table-column label="鍒涘缓鏃堕棿"
- prop="reportingTime"
- align="center" />
+ align="center">
+ <template #default="{ row }">
+ {{ parseTime(row.createTime) }}
+ </template>
+ </el-table-column>
<el-table-column label="鎿嶄綔"
align="center"
width="200">
@@ -205,25 +202,24 @@
:key="record.id"
class="quality-record-block">
<div class="detail-section">
- <h3 class="section-title">妫�娴嬭褰� {{ index + 1 }} - {{ record.checkTime }}</h3>
+ <h3 class="section-title">妫�娴嬭褰� {{ index + 1 }} - {{ parseTime(record.createTime) }}</h3>
<el-descriptions :column="3"
border>
- <el-descriptions-item label="妫�娴嬫棩鏈�">{{ record.checkTime || '-' }}</el-descriptions-item>
- <el-descriptions-item label="鐢熶骇宸ュ崟鍙�">{{ record.workOrderNo || '-' }}</el-descriptions-item>
- <el-descriptions-item label="宸ュ簭">{{ record.process || '-' }}</el-descriptions-item>
- <el-descriptions-item label="妫�楠屽憳">{{ record.checkName || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="妫�娴嬫棩鏈�">{{ parseTime(record.createTime) || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="鎶ュ伐鍗曞彿">{{ record.reportNo || '-' }}</el-descriptions-item>
+ <el-descriptions-item label="妫�楠屽憳">{{ record.userName || '-' }}</el-descriptions-item>
<el-descriptions-item label="浜у搧鍚嶇О">{{ record.productName || '-' }}</el-descriptions-item>
<el-descriptions-item label="瑙勬牸鍨嬪彿">{{ record.model || '-' }}</el-descriptions-item>
<el-descriptions-item label="鏁伴噺">{{ record.quantity || 0 }} {{ record.unit || '-' }}</el-descriptions-item>
<el-descriptions-item label="妫�娴嬪崟浣�">{{ record.checkCompany || '-' }}</el-descriptions-item>
<el-descriptions-item label="妫�娴嬬粨鏋�">
<el-tag :type="record.checkResult === '鍚堟牸' ? 'success' : 'danger'">
- {{ record.checkResult || '-' }}
+ {{ record.checkResult || '寰呮娴�' }}
</el-tag>
</el-descriptions-item>
</el-descriptions>
<h4 class="sub-section-title">妫�楠屾寚鏍囧垪琛�</h4>
- <el-table :data="record.inspectItems"
+ <el-table :data="record.inspectParamList"
border
style="width: 100%">
<el-table-column label="搴忓彿"
@@ -231,7 +227,7 @@
width="60"
align="center" />
<el-table-column label="鎸囨爣"
- prop="itemName"
+ prop="paramName"
align="center" />
<el-table-column label="鍗曚綅"
prop="unit"
@@ -239,17 +235,11 @@
<el-table-column label="鏍囧噯鍊�"
prop="standardValue"
align="center" />
- <el-table-column label="鍐呮帶鍊�"
- prop="controlValue"
- align="center" />
<el-table-column label="瀹為檯鍊�"
- prop="actualValue"
+ prop="inputValue"
align="center" />
</el-table>
</div>
- <!-- <div class="detail-section">
-
- </div> -->
<el-divider v-if="index < qualityRecords.length - 1" />
</div>
</div>
@@ -266,7 +256,12 @@
import { ref, reactive, onMounted } from "vue";
import { useRoute, useRouter } from "vue-router";
import { ElMessage } from "element-plus";
+ import { parseTime } from "@/utils/ruoyi";
import InputModal from "@/views/productionManagement/productionReporting/Input.vue";
+ import {
+ getOrderDetail,
+ productOrderListPage,
+ } from "@/api/productionManagement/productionOrder";
const route = useRoute();
const router = useRouter();
@@ -277,47 +272,7 @@
});
const selectedNpsNo = ref(null);
const npsNoLoading = ref(false);
- const npsNoOptions = ref([
- {
- id: 1,
- npsNo: "PO20240301001",
- productName: "绮惧瘑娑插帇缂�",
- model: "HG-100/50-500",
- materialCode: "MAT-2024-001",
- quantity: 500,
- unit: "浠�",
- status: 1,
- customerName: "閲嶅伐鏈烘鏈夐檺鍏徃",
- startTime: "2024-03-01",
- completionStatus: 65,
- },
- {
- id: 2,
- npsNo: "PO20240301002",
- productName: "宸ヤ笟浼烘湇鐢垫満",
- model: "SV-400W-3000",
- materialCode: "MAT-2024-002",
- quantity: 200,
- unit: "鍙�",
- status: 2,
- customerName: "鑷姩鍖栬澶囩鎶�鍏徃",
- startTime: "2024-03-02",
- completionStatus: 100,
- },
- {
- id: 3,
- npsNo: "PO20240301003",
- productName: "楂樺帇瀵嗗皝鍦�",
- model: "SR-80-5",
- materialCode: "MAT-2024-003",
- quantity: 5000,
- unit: "涓�",
- status: 0,
- customerName: "瀵嗗皝绯荤粺閰嶄欢鍘�",
- startTime: "2024-03-05",
- completionStatus: 0,
- },
- ]);
+ const npsNoOptions = ref([]);
// 璇︽儏鏁版嵁
const rowData = reactive({
@@ -327,7 +282,10 @@
// 鎶ュ伐璇︽儏寮圭獥
const detailDialogVisible = ref(false);
- const detailData = ref({});
+ const detailData = ref({
+ workOrder: {},
+ reports: [],
+ });
// 鎶曞叆妯℃�佹
const isShowInput = ref(false);
@@ -351,12 +309,12 @@
// 鐘舵�佸鐞�
const getStatusType = status => {
- const typeMap = { 0: "info", 1: "primary", 2: "success" };
+ const typeMap = { 1: "primary", 2: "warning", 3: "success", 5: "danger" };
return typeMap[status] || "info";
};
const getStatusText = status => {
- const statusMap = { 0: "鏈紑濮�", 1: "鐢熶骇涓�", 2: "宸插畬鎴�" };
- return statusMap[status] || "鏈煡";
+ const statusMap = { 1: "寰呭紑濮�", 2: "杩涜涓�", 3: "宸插畬鎴�", 5: "宸茬粨鏉�" };
+ return statusMap[status] || "宸插彇娑�";
};
const customColors = percentage => {
if (percentage < 30) return "#f56c6c";
@@ -365,51 +323,41 @@
};
// 妯℃嫙鎼滅储鏂规硶
- const handleNpsNoSearch = query => {
- if (query) {
- npsNoLoading.value = true;
- setTimeout(() => {
- npsNoLoading.value = false;
- }, 300);
+ const handleNpsNoSearch = async query => {
+ npsNoLoading.value = true;
+ try {
+ const res = await productOrderListPage({
+ npsNo: query || "",
+ pageNum: 1,
+ pageSize: 50,
+ });
+ // 鍙傜収 productionOrder/index.vue 鐨勬暟鎹粨鏋� res.data.records
+ npsNoOptions.value = res.data?.records || res.rows || [];
+ } catch (error) {
+ console.error(error);
+ } finally {
+ npsNoLoading.value = false;
}
};
- const handleSearch = id => {
+ const handleSearch = async id => {
const selected = npsNoOptions.value.find(item => item.id === id);
if (selected) {
- rowData.productionOrderDto = selected;
- rowData.productionRecords = [
- {
- id: 1001,
- productNo: "MO-2024-001-01",
- productName: selected.productName,
- model: selected.model,
- processName: "姣涘澂鍔犲伐",
- requiredQuantity: selected.quantity,
- completedQuantity: Math.floor(selected.quantity * 0.4),
- qualifiedQuantity: Math.floor(selected.quantity * 0.4) - 2,
- unqualifiedQuantity: 2,
- reportingTime: "2024-03-01 10:00:00",
- schedule: "鐧界彮",
- postName: "寮犱笁",
- unit: selected.unit,
- },
- {
- id: 1002,
- productNo: "MO-2024-001-02",
- productName: selected.productName,
- model: selected.model,
- processName: "绮惧姞宸�",
- requiredQuantity: Math.floor(selected.quantity * 0.4),
- completedQuantity: Math.floor(selected.quantity * 0.25),
- qualifiedQuantity: Math.floor(selected.quantity * 0.25),
- unqualifiedQuantity: 0,
- reportingTime: "2024-03-01 16:00:00",
- schedule: "鐧界彮",
- postName: "鏉庡洓",
- unit: selected.unit,
- },
- ];
+ try {
+ const res = await getOrderDetail(selected.npsNo);
+ if (res.code === 200) {
+ const { productionOrder, workOrderList } = res.data;
+ rowData.productionOrderDto = productionOrder || selected;
+ rowData.productionRecords = workOrderList || [];
+ } else {
+ rowData.productionOrderDto = selected;
+ rowData.productionRecords = [];
+ }
+ } catch (error) {
+ console.error(error);
+ ElMessage.error("鑾峰彇璁㈠崟璇︽儏澶辫触");
+ rowData.productionOrderDto = selected;
+ }
}
};
@@ -418,121 +366,34 @@
};
const handleClickStep = row => {
+ // row 鏄� workOrderList 涓殑涓�椤癸紝鍖呭惈 workOrder, reportList, inspectList
detailData.value = {
- id: row.id || Math.floor(Math.random() * 1000),
- productNo: row.productNo,
- npsNo: rowData.productionOrderDto.npsNo,
- schedule: row.schedule,
- postName: row.postName,
- materialCode: rowData.productionOrderDto.materialCode,
- productName: row.productName,
- model: row.model,
- qualifiedQuantity: row.qualifiedQuantity,
- unqualifiedQuantity: row.unqualifiedQuantity || 0,
- quantity: row.completedQuantity,
- unit: row.unit,
- reportingTime: row.reportingTime,
- productionOperationParamList: [
- { id: 1, paramName: "涓昏酱杞��", inputValue: "2400", unit: "rpm" },
- { id: 2, paramName: "杩涚粰閫熷害", inputValue: "120", unit: "mm/min" },
- { id: 3, paramName: "鍒囧墛娣卞害", inputValue: "0.5", unit: "mm" },
- { id: 4, paramName: "鍐峰嵈娑插帇鍔�", inputValue: "0.6", unit: "Mpa" },
- ],
+ workOrder: row.workOrder || {},
+ reports: (row.reportList || []).map(r => ({
+ ...r.reportMain,
+ productionOperationParamList: r.reportParamList || [],
+ })),
};
detailDialogVisible.value = true;
};
const handleClickQuality = row => {
- qualityRecords.value = [
- {
- id: 2001,
- checkTime: "2024-03-01 11:30:00",
- workOrderNo: row.productNo,
- process: row.processName,
- checkName: "璐ㄩ噺閮�-鐜嬪缓鍥�",
- productName: row.productName,
- model: row.model,
- unit: row.unit,
- quantity: row.completedQuantity,
- checkCompany: "鍐呴儴瀹為獙瀹�",
- checkResult: "鍚堟牸",
- inspectItems: [
- {
- id: 1,
- itemName: "澶栧緞灏哄",
- unit: "mm",
- standardValue: "100.00卤0.05",
- controlValue: "100.00卤0.03",
- actualValue: "100.01",
- result: "鍚堟牸",
- },
- {
- id: 2,
- itemName: "鍐呭緞灏哄",
- unit: "mm",
- standardValue: "50.00+0.02/-0",
- controlValue: "50.00+0.01/-0",
- actualValue: "50.01",
- result: "鍚堟牸",
- },
- {
- id: 3,
- itemName: "琛ㄩ潰绮楃硻搴�",
- unit: "Ra",
- standardValue: "鈮�1.6",
- controlValue: "鈮�1.2",
- actualValue: "0.8",
- result: "鍚堟牸",
- },
- ],
- },
- {
- id: 2001,
- checkTime: "2024-03-01 11:30:00",
- workOrderNo: row.productNo,
- process: row.processName,
- checkName: "璐ㄩ噺閮�-鐜嬪缓鍥�",
- productName: row.productName,
- model: row.model,
- unit: row.unit,
- quantity: row.completedQuantity,
- checkCompany: "鍐呴儴瀹為獙瀹�",
- checkResult: "鍚堟牸",
- inspectItems: [
- {
- id: 1,
- itemName: "澶栧緞灏哄",
- unit: "mm",
- standardValue: "100.00卤0.05",
- controlValue: "100.00卤0.03",
- actualValue: "100.01",
- result: "鍚堟牸",
- },
- {
- id: 2,
- itemName: "鍐呭緞灏哄",
- unit: "mm",
- standardValue: "50.00+0.02/-0",
- controlValue: "50.00+0.01/-0",
- actualValue: "50.01",
- result: "鍚堟牸",
- },
- {
- id: 3,
- itemName: "琛ㄩ潰绮楃硻搴�",
- unit: "Ra",
- standardValue: "鈮�1.6",
- controlValue: "鈮�1.2",
- actualValue: "0.8",
- result: "鍚堟牸",
- },
- ],
- },
- ];
+ // row 鏄� workOrderList 涓殑涓�椤�
+ const inspects = row.inspectList || [];
+ qualityRecords.value = inspects.map(i => ({
+ ...i.inspect,
+ reportNo: i.reportNo,
+ userName: i.reportMain?.userName || "-",
+ inspectParamList: i.inspectParamList || [],
+ inspectFileList: i.inspectFileList || [],
+ }));
qualityDialogVisible.value = true;
};
- onMounted(() => {
+ onMounted(async () => {
+ // 鍒濆鍔犺浇鍒楄〃
+ await handleNpsNoSearch();
+
if (route.query.npsNo) {
const npsNo = route.query.npsNo;
const found = npsNoOptions.value.find(item => item.npsNo === npsNo);
@@ -540,23 +401,23 @@
selectedNpsNo.value = found.id;
handleSearch(found.id);
} else {
- // 濡傛灉娌℃壘鍒帮紝鍒涘缓涓�涓复鏃剁殑
- const mockItem = {
- id: Date.now(),
- npsNo: npsNo,
- productName: route.query.productName || "绮惧瘑娑插帇缂�",
- model: route.query.model || "HG-100/50-500",
- materialCode: "MAT-2024-MOCK",
- quantity: 100,
- unit: "浠�",
- status: 1,
- customerName: "妯℃嫙瀹㈡埛",
- startTime: "2024-03-01",
- completionStatus: 50,
- };
- npsNoOptions.value.push(mockItem);
- selectedNpsNo.value = mockItem.id;
- handleSearch(mockItem.id);
+ // 濡傛灉鍒楄〃涓病鏈夛紙鍙兘鏄垎椤靛師鍥狅級锛屽垯鏍规嵁 npsNo 鍐嶆绮惧噯鎼滅储
+ try {
+ const res = await productOrderListPage({
+ npsNo,
+ pageNum: -1,
+ pageSize: -1,
+ });
+ const records = res.data?.records || res.rows || [];
+ if (records.length > 0) {
+ const item = records[0];
+ npsNoOptions.value.unshift(item);
+ selectedNpsNo.value = item.id;
+ handleSearch(item.id);
+ }
+ } catch (error) {
+ console.error("鑾峰彇璺敱鍙傛暟瀵瑰簲鐨勮鍗曞け璐�", error);
+ }
}
}
});
--
Gitblit v1.9.3