From ca8dfc8a7dd8ba9b84d9a58c3c2a6d52a0c98a74 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 28 五月 2026 09:48:59 +0800
Subject: [PATCH] 中兴实强new 1.生产订单补料时如果库存不足可以提交采购申请单

---
 src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue |   77 +++++++++++++++++++++++++++++++++++++-
 src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue    |    7 ++-
 2 files changed, 79 insertions(+), 5 deletions(-)

diff --git a/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
index 4f052ed..31145ac 100644
--- a/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
@@ -1,7 +1,7 @@
 <template>
   <el-dialog v-model="dialogVisible"
              title="琛ユ枡"
-             width="1200px"
+             width="1400px"
              @close="handleClose">
     <el-table v-loading="loading"
               :data="tableData"
@@ -19,6 +19,14 @@
       <el-table-column label="璁¢噺鍗曚綅"
                        prop="unit"
                        width="100" />
+      <el-table-column label="搴撳瓨鏁伴噺"
+                       min-width="120">
+        <template #default="{ row }">
+          <span :class="{ 'text-danger': isStockInsufficient(row) }">
+            {{ row.stockQuantity ?? '-' }}
+          </span>
+        </template>
+      </el-table-column>
       <el-table-column label="闇�姹傛暟閲�"
                        prop="demandedQuantity"
                        width="100" />
@@ -37,7 +45,8 @@
                            :step="1"
                            controls-position="right"
                            placeholder="杈撳叆琛ユ枡鏁伴噺"
-                           style="width: 100%;" />
+                           style="width: 100%;"
+                           :class="{ 'is-stock-insufficient': isStockInsufficient(row) }" />
         </template>
       </el-table-column>
       <el-table-column label="琛ユ枡鍘熷洜"
@@ -52,6 +61,9 @@
     </el-table>
     <template #footer>
       <span class="dialog-footer">
+        <el-button v-if="hasInsufficientStock"
+                   type="warning"
+                   @click="openPurchaseRequestDialog">閲囪喘鐢宠</el-button>
         <el-button type="primary"
                    :loading="submitting"
                    @click="handleSubmit">纭� 瀹�</el-button>
@@ -59,14 +71,20 @@
       </span>
     </template>
   </el-dialog>
+  <PurchaseRequestDialog v-model="purchaseRequestDialogVisible"
+                         :insufficient-items="insufficientStockItems"
+                         :order-row="props.orderRow"
+                         @saved="handlePurchaseRequestSaved" />
 </template>
 
 <script setup>
   import { computed, ref, watch } from "vue";
   import { ElMessage } from "element-plus";
+  import PurchaseRequestDialog from "./PurchaseRequestDialog.vue";
   import {
     listMaterialPickingDetail,
     updateMaterialPickingLedger,
+    listMaterialPickingBom,
   } from "@/api/productionManagement/productionOrder.js";
 
   const props = defineProps({
@@ -83,16 +101,50 @@
   const loading = ref(false);
   const submitting = ref(false);
   const tableData = ref([]);
+  const purchaseRequestDialogVisible = ref(false);
+
+  // 鍒ゆ柇搴撳瓨鏄惁涓嶈冻
+  const isStockInsufficient = (row) => {
+    const stockQuantity = Number(row.stockQuantity ?? 0);
+    const supplementQty = Number(row.newSupplementQty ?? 0);
+    return supplementQty > 0 && stockQuantity > 0 && supplementQty > stockQuantity;
+  };
+
+  // 搴撳瓨涓嶈冻鐨勮
+  const insufficientStockItems = computed(() => {
+    return tableData.value.filter(row => isStockInsufficient(row));
+  });
+
+  // 鏄惁鏈夊簱瀛樹笉瓒�
+  const hasInsufficientStock = computed(() => {
+    return insufficientStockItems.value.length > 0;
+  });
 
   const loadData = async () => {
     if (!props.orderRow?.id) return;
     loading.value = true;
     try {
+      // 鑾峰彇鐗╂枡鏄庣粏
       const res = await listMaterialPickingDetail(props.orderRow.id);
+      // 鑾峰彇搴撳瓨鏁伴噺
+      const bomRes = await listMaterialPickingBom(props.orderRow.id);
+      const bomList = Array.isArray(bomRes?.data)
+        ? bomRes.data
+        : bomRes?.data?.records || [];
+      // 鍒涘缓搴撳瓨鏁伴噺鏄犲皠
+      const stockMap = new Map();
+      bomList.forEach(item => {
+        const key = item.materialModelId || item.productModelId;
+        if (key) {
+          stockMap.set(key, item.stockQuantity ?? item.stockQty ?? 0);
+        }
+      });
+      // 鍚堝苟搴撳瓨鏁版嵁
       tableData.value = (res.data || []).map(item => ({
         ...item,
         newSupplementQty: 0,
         newSupplementReason: "",
+        stockQuantity: stockMap.get(item.productModelId) ?? null,
       }));
     } catch (e) {
       console.error("鑾峰彇鐗╂枡鏄庣粏澶辫触锛�", e);
@@ -159,7 +211,28 @@
       submitting.value = false;
     }
   };
+
+  // 鎵撳紑閲囪喘鐢宠瀵硅瘽妗�
+  const openPurchaseRequestDialog = () => {
+    purchaseRequestDialogVisible.value = true;
+  };
+
+  // 閲囪喘鐢宠淇濆瓨鍥炶皟
+  const handlePurchaseRequestSaved = () => {
+    // 閲囪喘鐢宠淇濆瓨鎴愬姛鍚庡埛鏂版暟鎹�
+    loadData();
+  };
 </script>
 
 <style scoped lang="scss">
+  .text-danger {
+    color: #f56c6c;
+    font-weight: bold;
+  }
+
+  :deep(.is-stock-insufficient) {
+    .el-input__wrapper {
+      box-shadow: 0 0 0 1px #f56c6c inset;
+    }
+  }
 </style>
diff --git a/src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue b/src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue
index 0000c26..88d2a28 100644
--- a/src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue
+++ b/src/views/productionManagement/productionOrder/components/PurchaseRequestDialog.vue
@@ -144,11 +144,12 @@
   form.value.ccUserName = "";
 
   // 灏嗗簱瀛樹笉瓒崇殑浜у搧濉厖鍒拌〃鏍�
+  // 鍏煎棰嗘枡鍜岃ˉ鏂欑殑鏁版嵁缁撴瀯
   tableData.value = props.insufficientItems.map((item) => ({
     tempId: generateTempId(),
-    productModelId: item.materialModelId,
-    productName: item.materialName,
-    model: item.materialModel,
+    productModelId: item.materialModelId || item.productModelId,
+    productName: item.materialName || item.productName,
+    model: item.materialModel || item.model,
     unit: item.unit,
     quantity: Math.max(1, Math.ceil((item.demandedQuantity || 0) - (item.stockQuantity || 0))),
   }));

--
Gitblit v1.9.3