From 2c8a663d12ef967a6378d9f38a4224d14201f9d9 Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期四, 28 五月 2026 21:53:18 +0800
Subject: [PATCH] chore: 使用 dev_NEW_pro 覆盖当前分支代码

---
 src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue |  165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 165 insertions(+), 0 deletions(-)

diff --git a/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue b/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
new file mode 100644
index 0000000..4f052ed
--- /dev/null
+++ b/src/views/productionManagement/productionOrder/components/MaterialSupplementDialog.vue
@@ -0,0 +1,165 @@
+<template>
+  <el-dialog v-model="dialogVisible"
+             title="琛ユ枡"
+             width="1200px"
+             @close="handleClose">
+    <el-table v-loading="loading"
+              :data="tableData"
+              border
+              row-key="id">
+      <el-table-column label="宸ュ簭鍚嶇О"
+                       prop="operationName"
+                       min-width="140" />
+      <el-table-column label="鍘熸枡鍚嶇О"
+                       prop="productName"
+                       min-width="140" />
+      <el-table-column label="鍘熸枡鍨嬪彿"
+                       prop="model"
+                       min-width="140" />
+      <el-table-column label="璁¢噺鍗曚綅"
+                       prop="unit"
+                       width="100" />
+      <el-table-column label="闇�姹傛暟閲�"
+                       prop="demandedQuantity"
+                       width="100" />
+      <el-table-column label="棰嗙敤鏁伴噺"
+                       prop="pickQuantity"
+                       width="100" />
+      <el-table-column label="宸茶ˉ鏁伴噺"
+                       prop="feedingQty"
+                       width="100" />
+      <el-table-column label="琛ユ枡鏁伴噺"
+                       min-width="150">
+        <template #default="{ row }">
+          <el-input-number v-model="row.newSupplementQty"
+                           :min="0"
+                           :precision="3"
+                           :step="1"
+                           controls-position="right"
+                           placeholder="杈撳叆琛ユ枡鏁伴噺"
+                           style="width: 100%;" />
+        </template>
+      </el-table-column>
+      <el-table-column label="琛ユ枡鍘熷洜"
+                       min-width="200">
+        <template #default="{ row }">
+          <el-input v-model="row.newSupplementReason"
+                    placeholder="杈撳叆琛ユ枡鍘熷洜"
+                    maxlength="200"
+                    show-word-limit />
+        </template>
+      </el-table-column>
+    </el-table>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button type="primary"
+                   :loading="submitting"
+                   @click="handleSubmit">纭� 瀹�</el-button>
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+  import { computed, ref, watch } from "vue";
+  import { ElMessage } from "element-plus";
+  import {
+    listMaterialPickingDetail,
+    updateMaterialPickingLedger,
+  } from "@/api/productionManagement/productionOrder.js";
+
+  const props = defineProps({
+    modelValue: { type: Boolean, default: false },
+    orderRow: { type: Object, default: null },
+  });
+  const emit = defineEmits(["update:modelValue", "saved"]);
+
+  const dialogVisible = computed({
+    get: () => props.modelValue,
+    set: val => emit("update:modelValue", val),
+  });
+
+  const loading = ref(false);
+  const submitting = ref(false);
+  const tableData = ref([]);
+
+  const loadData = async () => {
+    if (!props.orderRow?.id) return;
+    loading.value = true;
+    try {
+      const res = await listMaterialPickingDetail(props.orderRow.id);
+      tableData.value = (res.data || []).map(item => ({
+        ...item,
+        newSupplementQty: 0,
+        newSupplementReason: "",
+      }));
+    } catch (e) {
+      console.error("鑾峰彇鐗╂枡鏄庣粏澶辫触锛�", e);
+      ElMessage.error("鑾峰彇鐗╂枡鏄庣粏澶辫触");
+    } finally {
+      loading.value = false;
+    }
+  };
+
+  watch(
+    () => dialogVisible.value,
+    visible => {
+      if (visible) {
+        loadData();
+      }
+    }
+  );
+
+  const handleClose = () => {
+    tableData.value = [];
+  };
+
+  const handleSubmit = async () => {
+    const supplementList = tableData.value.filter(
+      item => item.newSupplementQty > 0
+    );
+    if (supplementList.length === 0) {
+      ElMessage.warning("璇疯嚦灏戣緭鍏ヤ竴鏉¤ˉ鏂欐暟閲�");
+      return;
+    }
+
+    const invalidRow = supplementList.find(item => !item.newSupplementReason);
+    if (invalidRow) {
+      ElMessage.warning("璇疯緭鍏ヨˉ鏂欏師鍥�");
+      return;
+    }
+
+    submitting.value = true;
+    try {
+      await updateMaterialPickingLedger({
+        productionOrderId: props.orderRow.id,
+        productionOrderPickDto: tableData.value.map(item => ({
+          id: item.id,
+          technologyOperationId: item.technologyOperationId,
+          operationName: item.operationName,
+          bom: item.bom === true,
+          productModelId: item.productModelId,
+          demandedQuantity: item.demandedQuantity,
+          unit: item.unit,
+          pickQuantity: item.pickQuantity,
+          batchNo: item.batchNo,
+          feedingQuantity: item.newSupplementQty || 0,
+          feedingReason: item.newSupplementReason || "",
+          pickType: 2,
+        })),
+      });
+      ElMessage.success("琛ユ枡鎴愬姛");
+      dialogVisible.value = false;
+      emit("saved");
+    } catch (e) {
+      console.error("琛ユ枡澶辫触锛�", e);
+      ElMessage.error("琛ユ枡澶辫触");
+    } finally {
+      submitting.value = false;
+    }
+  };
+</script>
+
+<style scoped lang="scss">
+</style>

--
Gitblit v1.9.3