From 50b6007b336a65b7deb6c77c9fdc608865067608 Mon Sep 17 00:00:00 2001
From: 张诺 <2864490065@qq.com>
Date: 星期五, 25 七月 2025 16:31:57 +0800
Subject: [PATCH] 昭德改善销售数量

---
 src/views/equipment/management/mould/equipmentRequisitionDialog.vue |  217 ++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 171 insertions(+), 46 deletions(-)

diff --git a/src/views/equipment/management/mould/equipmentRequisitionDialog.vue b/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
index c3f6907..9abe870 100644
--- a/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
+++ b/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
@@ -1,7 +1,9 @@
 <template>
   <el-dialog
     v-model="visible"
-    :title="isReturnMode ? '璁惧褰掕繕' : (isEdit ? '缂栬緫璁惧棰嗙敤' : '鏂板璁惧棰嗙敤')"
+    :title="
+      isReturnMode ? '璁惧褰掕繕' : isEdit ? '缂栬緫璁惧棰嗙敤' : '鏂板璁惧棰嗙敤'
+    "
     width="600px"
     @close="handleClose"
   >
@@ -35,7 +37,21 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="璁惧搴撳瓨" prop="equipmentStock" v-if="!isReturnMode && formData.status !== 2">
+      <el-form-item label="鏄惁涓烘秷鑰楀搧" prop="isConsumables">
+        <el-select
+          :model-value="currentConsumables"
+          placeholder="璇烽�夋嫨鏄惁涓鸿�楁潗绫诲瀷"
+          :disabled="true"
+        >
+          <el-option label="鏄�" :value="true" />
+          <el-option label="鍚�" :value="false" />
+        </el-select>
+      </el-form-item>
+      <el-form-item
+        label="璁惧搴撳瓨"
+        prop="equipmentStock"
+        v-if="!isReturnMode && formData.status !== 2"
+      >
         <el-input
           :value="
             equipmentList.find((item) => item.id == form.equipmentId)
@@ -52,14 +68,22 @@
           style="width: 100%"
         />
       </el-form-item>
-      <el-form-item label="宸插綊杩樻暟閲�" prop="returnedQuantity" v-if="isReturnMode">
+      <el-form-item
+        label="宸插綊杩樻暟閲�"
+        prop="returnedQuantity"
+        v-if="isReturnMode"
+      >
         <el-input
           :value="formData.totalReturnNo || 0"
           disabled
           style="width: 100%"
         />
       </el-form-item>
-      <el-form-item label="棰嗙敤鏁伴噺" prop="usageQuantity" v-if="!isReturnMode && formData.status !== 2">
+      <el-form-item
+        label="棰嗙敤鏁伴噺"
+        prop="usageQuantity"
+        v-if="!isReturnMode && formData.status !== 2"
+      >
         <el-input-number
           v-model="form.usageQuantity"
           :min="1"
@@ -73,7 +97,11 @@
           >(鏈�澶歿{ maxQuantity }}鍙�)</span
         >
       </el-form-item>
-      <el-form-item label="鏈褰掕繕鏁伴噺" prop="returnQuantity" v-if="isReturnMode">
+      <el-form-item
+        label="鏈褰掕繕鏁伴噺"
+        prop="returnQuantity"
+        v-if="isReturnMode"
+      >
         <el-input-number
           v-model="form.returnQuantity"
           :min="1"
@@ -86,14 +114,26 @@
           v-if="remainingReturnQuantity > 0"
           >(鏈�澶歿{ remainingReturnQuantity }}鍙�)</span
         >
-        <span
-          style="color: #ff4d4f; font-size: 12px; margin-left: 8px"
-          v-else
+        <span style="color: #67c23a; font-size: 12px; margin-left: 8px" v-else
           >(宸插叏閮ㄥ綊杩�)</span
         >
+        <!-- 褰掕繕瀹屾垚鎻愮ず -->
+        <div
+          v-if="
+            remainingReturnQuantity > 0 &&
+            form.returnQuantity === remainingReturnQuantity
+          "
+          style="color: #67c23a; font-size: 12px; margin-top: 4px"
+        >
+          馃挕 鎻愮ず锛氭湰娆″綊杩樺悗灏嗗畬鎴愬叏閮ㄥ綊杩�
+        </div>
       </el-form-item>
       <!-- 浣跨敤寮�濮嬫椂闂� - 鍙湪闈炲綊杩樻ā寮忔樉绀� -->
-      <el-form-item label="浣跨敤寮�濮嬫椂闂�" prop="usageStartTime" v-if="!isReturnMode">
+      <el-form-item
+        label="浣跨敤寮�濮嬫椂闂�"
+        prop="usageStartTime"
+        v-if="!isReturnMode"
+      >
         <el-date-picker
           v-model="form.usageStartTime"
           type="datetime"
@@ -104,7 +144,7 @@
           :disabled="isViewMode"
         />
       </el-form-item>
-      
+
       <!-- 褰掕繕缁撴潫鏃堕棿 - 鍙湪褰掕繕妯″紡鏄剧ず -->
       <el-form-item label="褰掕繕鏃堕棿" prop="returnTime" v-if="isReturnMode">
         <el-date-picker
@@ -127,7 +167,7 @@
     </el-form>
     <template #footer>
       <el-button @click="handleClose">鍙栨秷</el-button>
-      <el-button type="primary" @click="handleSubmit" v-if="!isViewMode"
+      <el-button type="primary" @click="debouncedSubmit" v-if="!isViewMode"
         >纭畾</el-button
       >
     </template>
@@ -136,7 +176,7 @@
 
 <script setup>
 import { ref, watch, computed, onMounted } from "vue";
-import { ElMessage } from "element-plus";
+import { ElMessage, ElMessageBox } from "element-plus";
 import { getEquipmentList } from "@/api/publicApi/index.js";
 import { addOrEditUsageRecord } from "@/api/equipment/requisition/index.js";
 
@@ -159,7 +199,6 @@
     ElMessage.error("鑾峰彇璁惧鍒楄〃澶辫触");
   }
 };
-
 const props = defineProps({
   modelValue: Boolean,
   formData: {
@@ -170,6 +209,23 @@
     type: String,
     default: "add",
   },
+});
+
+// 榛樿琛ㄥ崟鍒濆鍊�
+const defaultForm = {
+  userId: "",
+  equipmentId: "",
+  usageQuantity: 1,
+  usageStartTime: "",
+  returnQuantity: 1,
+  returnTime: "",
+  remarks: "",
+};
+const form = ref({ ...defaultForm });
+
+const currentConsumables = computed(() => {
+  const eq = equipmentList.value.find(item => item.id == form.value.equipmentId);
+  return eq ? !!eq.isConsumables : false;
 });
 const maxQuantity = computed(() => {
   if (!form.value.equipmentId) return 0;
@@ -185,10 +241,18 @@
   get: () => props.modelValue,
   set: (v) => emit("update:modelValue", v),
 });
+
+// 鐩戝惉璁惧閫夋嫨鍙樺寲
+watch(
+  () => form.value.equipmentId,
+  (newId) => {
+    if (newId) {
+      const eq = equipmentList.value.find(item => item.id == newId);
+    }
+  }
+);
 const isViewMode = computed(
-  () =>
-    props.addOrEdit === "view" ||
-    props.addOrEdit === "viewRow"
+  () => props.addOrEdit === "view" || props.addOrEdit === "viewRow"
 );
 
 // 鍒ゆ柇鏄惁涓哄綊杩樻ā寮�
@@ -197,35 +261,23 @@
 // 璁$畻鍓╀綑鍙綊杩樻暟閲�
 const remainingReturnQuantity = computed(() => {
   if (!isReturnMode.value || !props.formData.usageQuantity) return 0;
-  
+
   const totalUsageQuantity = props.formData.usageQuantity || 0; // 鎬讳娇鐢ㄦ暟閲�
   const alreadyReturnedQuantity = props.formData.totalReturnNo || 0; // 宸插綊杩樻暟閲�
   const remaining = totalUsageQuantity - alreadyReturnedQuantity; // 鍓╀綑鍙綊杩樻暟閲�
-  
+
   return Math.max(0, remaining); // 纭繚涓嶄负璐熸暟
 });
 
 const isEdit = computed(() => !!props.formData?.id);
 const formRef = ref();
 
-// 榛樿琛ㄥ崟鍒濆鍊�
-const defaultForm = {
-  userId: "",
-  equipmentId: "",
-  usageQuantity: 1,
-  usageStartTime: "",
-  returnQuantity: 1,
-  returnTime: "",
-  remarks: "",
-};
-const form = ref({ ...defaultForm });
-
 // 鑾峰彇褰撳墠鏃ユ湡锛圷YYY-MM-DD鏍煎紡锛�
 const getCurrentDate = () => {
   const now = new Date();
   const year = now.getFullYear();
-  const month = String(now.getMonth() + 1).padStart(2, '0');
-  const day = String(now.getDate()).padStart(2, '0');
+  const month = String(now.getMonth() + 1).padStart(2, "0");
+  const day = String(now.getDate()).padStart(2, "0");
   return `${year}-${month}-${day}`;
 };
 
@@ -239,12 +291,13 @@
   (val) => {
     if (val && Object.keys(val).length > 0) {
       form.value = { ...val };
-      
+
       // 褰掕繕妯″紡鍒濆鍖�
       if (isReturnMode.value) {
         form.value.returnTime = getCurrentDate();
         const maxReturnQuantity = remainingReturnQuantity.value;
-        form.value.returnQuantity = maxReturnQuantity > 0 ? Math.min(1, maxReturnQuantity) : 0;
+        form.value.returnQuantity =
+          maxReturnQuantity > 0 ? Math.min(1, maxReturnQuantity) : 0;
       }
     } else {
       form.value = { ...defaultForm };
@@ -272,7 +325,9 @@
             if (remaining <= 0) {
               callback(new Error("宸插叏閮ㄥ綊杩橈紝鏃犳硶缁х画褰掕繕"));
             } else if (value > remaining) {
-              callback(new Error(`褰掕繕鏁伴噺涓嶈兘澶т簬鍓╀綑鍙綊杩樻暟閲�(${remaining}鍙�)`));
+              callback(
+                new Error(`褰掕繕鏁伴噺涓嶈兘澶т簬鍓╀綑鍙綊杩樻暟閲�(${remaining}鍙�)`)
+              );
             } else {
               callback();
             }
@@ -313,33 +368,103 @@
   emit("update:modelValue", false);
 }
 
+// 閫氱敤闃叉姈鍑芥暟
+function debounce(fn, delay = 800) {
+  let timer = null;
+  return function (...args) {
+    if (timer) clearTimeout(timer);
+    timer = setTimeout(() => {
+      fn.apply(this, args);
+      timer = null;
+    }, delay);
+  };
+}
+
+// 闃叉姈鍚庣殑鎻愪氦鏂规硶
+const debouncedSubmit = debounce(handleSubmit, 800);
+
 function handleSubmit() {
-  formRef.value.validate((valid) => {
+  formRef.value.validate(async (valid) => {
     if (!valid) return;
-    
+
     let submitData = { ...form.value };
-    
+
     // 褰掕繕妯″紡澶勭悊
     if (isReturnMode.value) {
       const currentReturnQuantity = form.value.returnQuantity;
       const totalUsageQuantity = props.formData.usageQuantity;
       const alreadyReturnedQuantity = props.formData.totalReturnNo || 0;
-      const newTotalReturnedQuantity = alreadyReturnedQuantity + currentReturnQuantity;
-      
+      const newTotalReturnedQuantity =
+        alreadyReturnedQuantity + currentReturnQuantity;
+
+      // 鍒ゆ柇鏄惁鍏ㄩ儴褰掕繕瀹屾垚
+      let equipmentStatus = 2; // 榛樿涓洪儴鍒嗗綊杩�
+      let isFullyReturned = newTotalReturnedQuantity >= totalUsageQuantity;
+
+      if (isFullyReturned) {
+        equipmentStatus = 3; // 鍏ㄩ儴褰掕繕瀹屾垚
+
+        // 鍏ㄩ儴褰掕繕鏃剁殑纭鎻愮ず
+        try {
+          await ElMessageBox.confirm(
+            `纭灏嗚澶�"${
+              props.formData.equipmentName || "鏈煡璁惧"
+            }"鍏ㄩ儴褰掕繕鍚楋紵褰掕繕鍚庤澶囩姸鎬佸皢鍙樹负"宸插綊杩�"銆俙,
+            "纭鍏ㄩ儴褰掕繕",
+            {
+              confirmButtonText: "纭褰掕繕",
+              cancelButtonText: "鍙栨秷",
+              type: "success",
+            }
+          );
+        } catch (error) {
+          if (error === "cancel") {
+            ElMessage.info("宸插彇娑堝綊杩樻搷浣�");
+            return;
+          }
+        }
+
+        console.log("璁惧褰掕繕瀹屾垚:", {
+          璁惧鍚嶇О: props.formData.equipmentName,
+          鎬讳娇鐢ㄦ暟閲�: totalUsageQuantity,
+          鏂扮殑褰掕繕鎬绘暟: newTotalReturnedQuantity,
+          鐘舵��: "宸插叏閮ㄥ綊杩�",
+        });
+      } else {
+        console.log("璁惧閮ㄥ垎褰掕繕:", {
+          璁惧鍚嶇О: props.formData.equipmentName,
+          鎬讳娇鐢ㄦ暟閲�: totalUsageQuantity,
+          宸插綊杩樻暟閲�: newTotalReturnedQuantity,
+          鍓╀綑鏈綊杩�: totalUsageQuantity - newTotalReturnedQuantity,
+          鐘舵��: "閮ㄥ垎褰掕繕",
+        });
+      }
+
       submitData = {
         ...props.formData,
         totalReturnNo: newTotalReturnedQuantity,
         returnQuantity: currentReturnQuantity,
         returnTime: form.value.returnTime,
-        equipmentStatus: 2,
+        equipmentStatus: equipmentStatus,
         remarks: form.value.remarks,
-        usageQuantity: totalUsageQuantity
+        usageQuantity: totalUsageQuantity,
       };
     }
-    
-    addOrEditUsageRecord(submitData);
-    emit("submit", submitData);
-    handleClose();
+
+    try {
+      let { code, data } = await addOrEditUsageRecord(submitData);
+      if (code !== 200) {
+        ElMessage.error(data.msg || "鎿嶄綔澶辫触");
+        return;
+      }
+      if (code == 200 && data == 1) {
+        emit("submit", submitData);
+      }
+      handleClose();
+    } catch (error) {
+      console.error("鎻愪氦澶辫触:", error);
+      ElMessage.error("鎿嶄綔澶辫触锛岃绋嶅悗鍐嶈瘯");
+    }
   });
 }
 </script>

--
Gitblit v1.9.3