From f70ee8845ef75c346fee1ff5e8f576640f6a2d00 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期四, 26 三月 2026 15:48:08 +0800
Subject: [PATCH] 生产详情中增加报废数量

---
 src/views/productionManagement/productionOrder/Detail/index.vue |  130 ++++++++++++++++++++++++++++---------------
 1 files changed, 84 insertions(+), 46 deletions(-)

diff --git a/src/views/productionManagement/productionOrder/Detail/index.vue b/src/views/productionManagement/productionOrder/Detail/index.vue
index 0b5858c..df96f47 100644
--- a/src/views/productionManagement/productionOrder/Detail/index.vue
+++ b/src/views/productionManagement/productionOrder/Detail/index.vue
@@ -89,6 +89,10 @@
                         <div class="grid-value">{{ p.outputQty ?? 0 }}</div>
                       </div>
                       <div class="grid-item">
+                        <div class="grid-label">鎶ュ簾鏁伴噺</div>
+                        <div class="grid-value success">{{ p.scrapQty ?? 0 }}</div>
+                      </div>
+                      <div class="grid-item">
                         <div class="grid-label">鍚堟牸鏁伴噺</div>
                         <div class="grid-value success">{{ p.qualifiedQty ?? 0 }}</div>
                       </div>
@@ -120,12 +124,13 @@
             <div v-else class="right-content">
               <el-table :data="reports" border height="420" v-loading="reportLoading">
                 <el-table-column label="搴忓彿" type="index" width="60" align="center" />
-                <el-table-column label="鎶ュ伐鍗曞彿" prop="reportNo" min-width="140" show-overflow-tooltip />
-                <el-table-column label="鎶ュ伐浜哄憳" prop="reportUser" min-width="120" show-overflow-tooltip />
-                <el-table-column label="鎶ュ伐鏃堕棿" prop="reportTime" min-width="160" show-overflow-tooltip />
-                <el-table-column label="浜у嚭鏁伴噺" prop="outputQty" min-width="110" />
+                <el-table-column label="鎶ュ伐鍗曞彿" prop="productNo" min-width="140" show-overflow-tooltip />
+                <el-table-column label="鎶ュ伐浜哄憳" prop="nickName" min-width="120" show-overflow-tooltip />
+                <el-table-column label="鎶ュ伐鏃堕棿" prop="createTime" min-width="160" show-overflow-tooltip />
+                <el-table-column label="浜у嚭鏁伴噺" prop="quantity" min-width="110" />
+                <el-table-column label="鎶ュ簾鏁伴噺" prop="scrapQty" min-width="110" />
                 <el-table-column label="鍚堟牸鏁伴噺" prop="qualifiedQty" min-width="110" />
-                <el-table-column label="涓嶈壇鏁伴噺" prop="badQty" min-width="110" />
+                <el-table-column label="涓嶈壇鏁伴噺" prop="defectiveQuantity" min-width="110" />
                 <el-table-column label="涓嶅悎鏍煎鐞�" prop="dealResult" min-width="160" show-overflow-tooltip />
                 <el-table-column label="鎿嶄綔" width="150" fixed="right">
                   <template #default="{ row }">
@@ -140,21 +145,45 @@
         </div>
       </div>
     </el-card>
-    <el-dialog
-      v-model="reportRecordDialogVisible"
-      title="鎶ュ伐鐢熶骇璁板綍"
-      width="680px"
-      destroy-on-close
-    >
-      <div class="report-record-placeholder">
-        <div>鎶ュ伐鍗曞彿锛歿{ currentReportRow?.reportNo || "-" }}</div>
-        <div>宸ュ簭锛歿{ selectedProcess?.processName || "-" }}</div>
-        <div class="placeholder-tip">寮规鍐呭寰呭畾锛堝悗缁ˉ鍏呰缁嗙敓浜ц褰曪級銆�</div>
-      </div>
-      <template #footer>
-        <el-button @click="reportRecordDialogVisible = false">鍏抽棴</el-button>
-      </template>
-    </el-dialog>
+<!--    <el-dialog-->
+<!--      v-model="reportRecordDialogVisible"-->
+<!--      title="鎶ュ伐鐢熶骇璁板綍"-->
+<!--      width="680px"-->
+<!--      destroy-on-close-->
+<!--    >-->
+<!--      <div class="report-record-placeholder">-->
+<!--        <div>鎶ュ伐鍗曞彿锛歿{ currentReportRow?.reportNo || "-" }}</div>-->
+<!--        <div>宸ュ簭锛歿{ selectedProcess?.processName || "-" }}</div>-->
+<!--        <div class="placeholder-tip">寮规鍐呭寰呭畾锛堝悗缁ˉ鍏呰缁嗙敓浜ц褰曪級銆�</div>-->
+<!--      </div>-->
+<!--      <template #footer>-->
+<!--        <el-button @click="reportRecordDialogVisible = false">鍏抽棴</el-button>-->
+<!--      </template>-->
+<!--    </el-dialog>-->
+
+    <CopperPrintingForm
+        v-if="copperPrintingFormVisible"
+        v-model:isShow="copperPrintingFormVisible"
+        :isEdit="false"
+        :row="currentReportRow"
+        @refreshData="fetchReportsForProcess(selectedProcess.value)"/>
+    <VoltageSortingForm
+        v-if="voltageSortingFormVisible"
+        v-model:isShow="voltageSortingFormVisible"
+        :isEdit="false"
+        :row="currentReportRow"
+        @refreshData="fetchReportsForProcess(selectedProcess.value)"/>
+    <GranulationForm
+        v-if="granulationFormVisible"
+        v-model:isShow="granulationFormVisible"
+        :isEdit="false"
+        :row="currentReportRow"
+        @refreshData="fetchReportsForProcess(selectedProcess.value)"/>
+    <Detail
+        v-if="reportRecordDialogVisible"
+        v-model:isShow="reportRecordDialogVisible"
+        @refreshData="fetchReportsForProcess(selectedProcess.value)"
+        :row="currentReportRow"/>
   </div>
 </template>
 
@@ -163,7 +192,10 @@
 import { useRoute } from "vue-router";
 import { getByProductOrderId } from "@/api/productionManagement/workOrder.js";
 import { getByProductWorkOrderId } from "@/api/productionManagement/productionProductMain.js";
-
+const VoltageSortingForm = defineAsyncComponent(() => import("@/views/productionManagement/workOrder/components/VoltageSortingForm.vue"));
+const CopperPrintingForm = defineAsyncComponent(() => import("@/views/productionManagement/workOrder/components/CopperPrintingForm.vue"));
+const GranulationForm = defineAsyncComponent(() => import("@/views/productionManagement/workOrder/components/GranulationForm.vue"));
+const Detail = defineAsyncComponent(() => import("@/views/productionManagement/productionReporting/components/Detail.vue"));
 const route = useRoute();
 
 const header = computed(() => ({
@@ -176,6 +208,10 @@
 
 // 宸ュ簭鏁版嵁锛堟帴鍙f浛鎹級
 const processes = ref([]);
+
+const copperPrintingFormVisible = ref(false);
+const voltageSortingFormVisible = ref(false);
+const granulationFormVisible = ref(false);
 
 const normalizeStatus = (statusText, completionStatus, inputQty, outputQty) => {
   const s = statusText === null || statusText === undefined ? "" : String(statusText).trim();
@@ -201,13 +237,14 @@
 
 const normalizeProcess = (item) => {
   // 瀛楁浠ユ帴鍙g害瀹氫负鍑嗭紙浣犵粰鐨勬埅鍥惧瓧娈垫槧灏勶級
-  // 宸ュ簭锛歝ompletionStatus/statusText/processNo/scrapRate/planQuantity/completeQuantity/completeQty/scrapQty
+  // 宸ュ簭锛歝ompletionStatus/statusText/processNo/defectiveRate/planQuantity/completeQuantity/completeQty/scrapQty
   const inputQty = Number(item?.planQuantity ?? item?.inputQty ?? 0);
-  const outputQty = Number(item?.completeQuantity ?? item?.outputQty ?? 0);
+  const outputQty = Number(item?.totalQty ?? item?.outputQty ?? 0);
   const qualifiedQty = Number(item?.completeQty ?? item?.qualifiedQty ?? item?.goodQty ?? 0);
-  const badQty = Number(item?.scrapQty ?? item?.badQty ?? item?.defectQty ?? 0);
+  const badQty = Number(item?.defectiveQuantity ?? item?.badQty ?? item?.defectQty ?? 0);
+  const scrapQty = Number(item?.scrapQty ?? 0);
   const completionStatus = Number(item?.completionStatus ?? 0);
-  const scrapRate = Number(item?.scrapRate ?? NaN);
+  const defectiveRate = Number(item?.defectiveRate ?? NaN);
 
   const status = normalizeStatus(item?.statusText ?? item?.status ?? item?.workStatus ?? item?.processStatus ?? item?.state, completionStatus, inputQty, outputQty);
 
@@ -219,8 +256,9 @@
     outputQty: Number.isFinite(outputQty) ? outputQty : 0,
     qualifiedQty: Math.max(0, Number.isFinite(qualifiedQty) ? qualifiedQty : 0),
     badQty: Math.max(0, Number.isFinite(badQty) ? badQty : 0),
+    scrapQty: Math.max(0, Number.isFinite(scrapQty) ? scrapQty : 0),
     completionStatus: Number.isFinite(completionStatus) ? completionStatus : 0,
-    scrapRate: Number.isFinite(scrapRate) ? scrapRate : null,
+    defectiveRate: Number.isFinite(defectiveRate) ? defectiveRate : null,
     status,
   };
 };
@@ -271,19 +309,11 @@
 const reportLoading = ref(false);
 
 const normalizeReport = (item) => {
-  // 鎶ュ伐璁板綍锛歱roductNo/userName/createTime/quantity/qualifiedQty/scrapQty
-  const outputQty = Number(item?.quantity ?? item?.outputQty ?? 0);
-  const qualifiedQty = Number(item?.qualifiedQty ?? item?.completeQty ?? item?.goodQty ?? 0);
-  const badQty = Number(item?.scrapQty ?? item?.badQty ?? 0);
-
   return {
-    reportNo: item?.productNo ?? item?.reportNo ?? item?.productionReportNo ?? item?.id ?? "",
-    reportUser: item?.userName ?? item?.reportUser ?? item?.createdByName ?? item?.reportUserName ?? "",
-    reportTime: item?.createTime ?? item?.reportTime ?? item?.createdAt ?? item?.reportDate ?? "",
-    outputQty: Number.isFinite(outputQty) ? outputQty : 0,
-    qualifiedQty: Math.max(0, Number.isFinite(qualifiedQty) ? qualifiedQty : 0),
-    badQty: Number.isFinite(badQty) ? Math.max(0, badQty) : 0,
-    dealResult: item?.dealResult ?? item?.dealResultText ?? item?.description ?? "",
+    ...item,
+    quantity:  Math.max(0, Number.isFinite(item.quantity) ? item.quantity : 0),
+    scrapQty:  Math.max(0, Number.isFinite(item.scrapQty) ? item.scrapQty : 0),
+    qualifiedQty:  Math.max(0, Number.isFinite(item.qualifiedQty) ? item.qualifiedQty : 0),
   };
 };
 
@@ -323,9 +353,17 @@
 );
 
 const viewReportRecord = (row) => {
-  if (!row?.reportNo) return;
+  if (!row?.productNo) return;
   currentReportRow.value = row;
-  reportRecordDialogVisible.value = true;
+  if (row.process ==='鍗伴摐' || row.process ==='鍗伴摱') {
+    copperPrintingFormVisible.value = true;
+  } else if (row.process === '鐢靛帇鍒嗛��') {
+    voltageSortingFormVisible.value = true;
+  } else if (row.process === '閫犵矑') {
+    granulationFormVisible.value = true;
+  } else {
+    reportRecordDialogVisible.value = true;
+  }
 };
 
 const reportRecordDialogVisible = ref(false);
@@ -386,11 +424,11 @@
 
 // 涓嶈壇鐜囷細涓嶈壇鏁伴噺 / 浜у嚭鏁伴噺锛堝厛鎸夋鍙e緞锛屽悗缁鎺ユ帴鍙e彲璋冩暣锛�
 const defectRateText = (p) => {
-  // 浼樺厛浣跨敤鎺ュ彛瀛楁 scrapRate锛堜綘缁欑殑鎴浘鈥滀笉鑹巼鈥濓級
-  const scrapRate = Number(p?.scrapRate ?? NaN);
-  if (Number.isFinite(scrapRate)) {
-    // 鏈変簺鎺ュ彛 scrapRate 鍙兘鏄� 0~1 鎴� 0~100锛岃繖閲屽仛涓�涓畝鍗曞垽鏂�
-    const percent = scrapRate <= 1 ? scrapRate * 100 : scrapRate;
+  // 浼樺厛浣跨敤鎺ュ彛瀛楁 defectiveRate锛堜綘缁欑殑鎴浘鈥滀笉鑹巼鈥濓級
+  const defectiveRate = Number(p?.defectiveRate ?? NaN);
+  if (Number.isFinite(defectiveRate)) {
+    // 鏈変簺鎺ュ彛 defectiveRate 鍙兘鏄� 0~1 鎴� 0~100锛岃繖閲屽仛涓�涓畝鍗曞垽鏂�
+    const percent = defectiveRate <= 1 ? defectiveRate * 100 : defectiveRate;
     return `${percent.toFixed(2)}%`;
   }
 
@@ -709,7 +747,7 @@
 
   .step-grid {
     display: grid;
-    grid-template-columns: repeat(4, minmax(0, 1fr));
+    grid-template-columns: repeat(5, minmax(0, 1fr));
     gap: 10px;
     .grid-item {
       background: #ffffff;

--
Gitblit v1.9.3