From 2c9fbc6f1a3ccd1418efa9c348ec12faf1ab3258 Mon Sep 17 00:00:00 2001
From: zhang_12370 <z2864490065@outlook.com>
Date: 星期三, 23 七月 2025 16:33:06 +0800
Subject: [PATCH] 1、完善表格逻辑 2、完善配煤计算器 3、完善设备管理 4、完善采购管理

---
 src/views/procureMent/index.vue                                     |    7 
 src/views/calculator/index.vue                                      |  196 ++++++++++++++-
 src/views/procureMent/components/ProductionDialog.vue               |  229 ++++++++++++------
 src/views/equipment/management/mould/equipmentRequisitionDialog.vue |  229 +++++++++++++-----
 src/components/Table/ETable.vue                                     |   44 +++
 5 files changed, 531 insertions(+), 174 deletions(-)

diff --git a/src/components/Table/ETable.vue b/src/components/Table/ETable.vue
index 1f8fdfb..3921d6b 100644
--- a/src/components/Table/ETable.vue
+++ b/src/components/Table/ETable.vue
@@ -35,6 +35,22 @@
     <el-table-column v-if="showOperations" :label="operationsLabel" :width="operationsWidth" :show-overflow-tooltip="false" fixed="right" align="center">
       <template #default="scope">
         <slot name="operations" :row="scope.row">
+          <!-- 鑷畾涔夋寜閽� - 鏀惧湪榛樿鎸夐挳涔嬪墠 -->
+          <el-button 
+            v-for="button in customButtons" 
+            :key="button.name"
+            v-show="!button.show || button.show(scope.row)"
+            :link="button.link !== false"
+            :type="button.type || 'primary'" 
+            :size="button.size || 'small'"
+            :icon="button.icon"
+            :disabled="button.disabled && button.disabled(scope.row)"
+            @click="handleCustomClick(button.name, scope.row)"
+          >
+            {{ button.label }}
+          </el-button>
+          
+          <!-- 榛樿鎿嶄綔鎸夐挳 -->
           <el-button v-if="operations.includes('edit')" link type="primary" size="small"
             @click="handleEdit(scope.row)">缂栬緫</el-button>
           <el-button v-if="operations.includes('viewRow')" link type="primary" size="small"
@@ -126,7 +142,25 @@
   operations: {
     type: Array,
     default: () => ['edit', 'delete', 'export']
-  },  // 鍒犻櫎纭淇℃伅
+  },
+  // 鑷畾涔夋寜閽厤缃�
+  customButtons: {
+    type: Array,
+    default: () => []
+    // 绀轰緥閰嶇疆锛�
+    // [
+    //   {
+    //     name: 'return',      // 鎸夐挳鏍囪瘑
+    //     label: '褰掕繕',       // 鎸夐挳鏄剧ず鏂囨湰
+    //     type: 'success',     // 鎸夐挳绫诲瀷
+    //     size: 'small',       // 鎸夐挳澶у皬
+    //     icon: '',            // 鍥炬爣(鍙��)
+    //     show: (row) => true, // 鏄剧ず鏉′欢鍑芥暟(鍙��)
+    //     disabled: (row) => false, // 绂佺敤鏉′欢鍑芥暟(鍙��)
+    //   }
+    // ]
+  },
+  // 鍒犻櫎纭淇℃伅
   deleteConfirmText: {
     type: String,
     default: '纭鍒犻櫎璇ヨ褰曪紵'
@@ -163,7 +197,7 @@
 };
 
 // 澶勭悊閫夋嫨鍙樺寲銆佺紪杈戙�佸垹闄ゅ拰瀵煎嚭鎿嶄綔
-const emit = defineEmits(['selection-change', 'edit', 'delete', 'export', 'viewRow', 'viewFile'])
+const emit = defineEmits(['selection-change', 'edit', 'delete', 'export', 'viewRow', 'viewFile', 'custom-click'])
 const handleSelectionChange = (selection) => {
   emit('selection-change', selection)
 }
@@ -176,6 +210,12 @@
 const handleViewFile = (row) => {
   emit('viewFile', row)
 }
+
+// 澶勭悊鑷畾涔夋寜閽偣鍑�
+const handleCustomClick = (buttonName, row) => {
+  emit('custom-click', { buttonName, row })
+}
+
 const handleDelete = (row) => {
   ElMessageBox.confirm(
     props.deleteConfirmText,
diff --git a/src/views/calculator/index.vue b/src/views/calculator/index.vue
index e09e4c9..e9da943 100644
--- a/src/views/calculator/index.vue
+++ b/src/views/calculator/index.vue
@@ -403,7 +403,9 @@
             <!-- 娣峰悎鐓ゅ睘鎬� -->
             <div class="props-section">
               <div class="props-title">馃搳 娣峰悎鐓ゅ睘鎬�</div>
-              <div class="props-grid">
+              
+              <!-- 鍩虹灞炴�у睍绀哄尯 -->
+              <div class="props-display-grid">
                 <div class="prop-item">
                   <span class="prop-label">鍙戠儹閲�:</span>
                   <span class="prop-value"
@@ -434,19 +436,45 @@
                     >{{ result.optimal.props.cost.toFixed(2) }} 鍏�/鍚�</span
                   >
                 </div>
-                <div class="prop-item">
-                  <span class="prop-label">鐢熸垚:</span>
-                  <el-autocomplete
-                    v-model="result.optimal.props.createCoal"
-                    :fetch-suggestions="querySearch"
-                    clearable
-                    size="small"
-                    class="inline-input red-border"
-                    style="width: 180px; min-height: 24px !important"
-                    placeholder="璇疯緭鍏ョ敓鎴愮叅绉�"
-                    @blur="handleSelect($event)"
-                    @select="handleSelect($event)"
-                  />
+              </div>
+
+              <!-- 杈撳叆鎿嶄綔鍖� -->
+              <div class="props-input-section">
+                <div class="input-row">
+                  <div class="input-item">
+                    <label class="input-label">鐢熸垚鐓ょ:</label>
+                    <el-autocomplete
+                      v-model="result.optimal.props.createCoal"
+                      :fetch-suggestions="querySearch"
+                      clearable
+                      size="small"
+                      class="coal-input"
+                      placeholder="璇疯緭鍏�/閫夋嫨鐢熸垚鐓ょ"
+                      @blur="handleSelect($event)"
+                      @select="handleSelect($event)"
+                    />
+                  </div>
+                  <div class="input-item">
+                    <label class="input-label">鐢熶骇鏁伴噺:</label>
+                    <el-input 
+                      type="number"
+                      clearable
+                      size="small"
+                      class="quantity-input"
+                      v-model="result.optimal.props.createCoalQuantity"
+                      placeholder="璇疯緭鍏ョ敓浜ф暟閲�"
+                      :min="0"
+                      :max="999999"
+                      :step="0.1"
+                      :precision="2"
+                      @input="handleQuantityInput"
+                      @blur="handleQuantityBlur"
+                    >
+                      <template #suffix>
+                        <span style="color: #909399; font-size: 12px;">鍚�</span>
+                      </template>
+                    </el-input>
+                  </div>
                 </div>
               </div>
             </div>
@@ -652,6 +680,29 @@
     result.value.optimal.props.createCoal = matchedName;
   }
 };
+
+// 澶勭悊鏁伴噺杈撳叆
+const handleQuantityInput = (value) => {
+  // 闄愬埗杈撳叆鑼冨洿鍜岀簿搴�
+  if (value !== null && value !== undefined && value !== '') {
+    const numValue = parseFloat(value);
+    if (numValue < 0) {
+      result.value.optimal.props.createCoalQuantity = 0;
+    } else if (numValue > 999999) {
+      result.value.optimal.props.createCoalQuantity = 999999;
+    }
+  }
+};
+
+// 澶勭悊鏁伴噺澶辩劍
+const handleQuantityBlur = (event) => {
+  const value = event.target.value;
+  if (value && !isNaN(value)) {
+    // 鏍煎紡鍖栦负涓や綅灏忔暟
+    const formatted = parseFloat(value).toFixed(2);
+    result.value.optimal.props.createCoalQuantity = formatted;
+  }
+};
 onMounted(async () => {
   getCoalInfo();
   geInfoCoals();
@@ -801,7 +852,8 @@
   const validationChecks = [
     { condition: !result.value, message: "璇峰厛璁$畻鏈�浼橀厤姣斿悗鍐嶆坊鍔犺嚦寰呭叆搴�" },
     { condition: !result.value.optimal, message: "璇峰厛璁$畻鏈�浼橀厤姣�" },
-    { condition: !result.value.optimal.props.createCoal, message: "璇峰厛閫夋嫨鐢熸垚鐓ょ" }
+    { condition: !result.value.optimal.props.createCoal, message: "璇峰厛閫夋嫨鐢熸垚鐓ょ" },
+    { condition: !result.value.optimal.props.createCoalQuantity || result.value.optimal.props.createCoalQuantity <= 0, message: "璇疯緭鍏ユ湁鏁堢殑鐢熶骇鏁伴噺" }
   ];
 
   for (const check of validationChecks) {
@@ -828,7 +880,6 @@
   );
   // 鍑嗗鏁版嵁
   const optimalData = result.value.optimal;
-  optimalData.props.totalTonnage = formInline.value.totalTonnage;
   optimalData.props.cost = parseFloat(optimalData.props.cost.toFixed(2));
   
   // 娣诲姞瀹樻柟ID
@@ -872,9 +923,13 @@
     const instructions = genInstructions(
       validCoals,
       ratios,
-      formInline.value.totalTonnage,
       formInline.value.scoopWeight
     );
+
+    // 鍒濆鍖栨墿灞曞睘鎬�
+    props.createCoal = "";
+    props.createCoalQuantity = 0;
+    props.coalId = null;
 
     data.result = {
       show: true,
@@ -917,7 +972,7 @@
       if (altRatios) {
         const altProps = calcBlendProps(coals, altRatios);
         const altInstructions = genInstructions(
-          coals, altRatios, formInline.value.totalTonnage, formInline.value.scoopWeight
+          coals, altRatios, formInline.value.scoopWeight
         );
 
         alternatives.push({
@@ -1186,6 +1241,66 @@
   margin-bottom: 10px;
 }
 
+/* 鍩虹灞炴�у睍绀虹綉鏍� */
+.props-display-grid {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
+  gap: 8px;
+  margin-bottom: 15px;
+}
+
+/* 杈撳叆鎿嶄綔鍖哄煙 */
+.props-input-section {
+  border-top: 1px solid #ebeef5;
+  padding-top: 15px;
+}
+
+.input-row {
+  display: flex;
+  gap: 15px;
+  align-items: flex-end;
+  flex-wrap: wrap;
+}
+
+.input-item {
+  flex: 1;
+  min-width: 200px;
+  display: flex;
+  flex-direction: column;
+}
+
+.input-label {
+  font-size: 13px;
+  color: #606266;
+  margin-bottom: 6px;
+  font-weight: 500;
+}
+
+.coal-input,
+.quantity-input {
+  width: 100%;
+  border-radius: 4px;
+}
+
+.coal-input :deep(.el-input__wrapper),
+.quantity-input :deep(.el-input__wrapper) {
+  border: 1px solid #dcdfe6;
+  border-radius: 4px;
+  transition: all 0.2s;
+  min-height: 32px;
+}
+
+.coal-input :deep(.el-input__wrapper):hover,
+.quantity-input :deep(.el-input__wrapper):hover {
+  border-color: #c0c4cc;
+}
+
+.coal-input :deep(.el-input__wrapper.is-focus),
+.quantity-input :deep(.el-input__wrapper.is-focus) {
+  border-color: #409eff;
+  box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
+}
+
 .props-grid {
   display: grid;
   grid-template-columns: 1fr 1fr;
@@ -1346,8 +1461,18 @@
 }
 
 @media (max-width: 768px) {
-  .props-grid {
+  .props-display-grid {
     grid-template-columns: 1fr;
+    gap: 6px;
+  }
+
+  .input-row {
+    flex-direction: column;
+    gap: 12px;
+  }
+
+  .input-item {
+    min-width: 100%;
   }
 
   .table-container {
@@ -1357,6 +1482,21 @@
   :deep(.el-table .cell) {
     padding: 4px 8px;
   }
+
+  .right-card {
+    width: 100%;
+    min-width: auto;
+  }
+}
+
+@media (max-width: 1024px) {
+  .props-display-grid {
+    grid-template-columns: repeat(2, 1fr);
+  }
+  
+  .input-row {
+    gap: 12px;
+  }
 }
 :deep(.el-input__wrapper) {
   min-height: 24px !important;
@@ -1364,4 +1504,22 @@
 :deep(.el-input__inner) {
   min-height: 24px !important;
 }
+
+/* 鏁伴噺杈撳叆妗嗘牱寮忎紭鍖� */
+.coal-input :deep(.el-input__suffix),
+.quantity-input :deep(.el-input__suffix) {
+  display: flex;
+  align-items: center;
+  padding-right: 8px;
+}
+
+/* 杈撳叆妗嗙殑鍚庣紑鍗曚綅鏍峰紡 */
+.coal-input :deep(.el-input__suffix-inner),
+.quantity-input :deep(.el-input__suffix-inner) {
+  display: flex;
+  align-items: center;
+  font-style: normal;
+  color: #909399;
+  font-size: 12px;
+}
 </style>
diff --git a/src/views/equipment/management/mould/equipmentRequisitionDialog.vue b/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
index 8438624..c3f6907 100644
--- a/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
+++ b/src/views/equipment/management/mould/equipmentRequisitionDialog.vue
@@ -1,7 +1,7 @@
 <template>
   <el-dialog
     v-model="visible"
-    :title="isEdit ? '缂栬緫璁惧棰嗙敤' : '鏂板璁惧棰嗙敤'"
+    :title="isReturnMode ? '璁惧褰掕繕' : (isEdit ? '缂栬緫璁惧棰嗙敤' : '鏂板璁惧棰嗙敤')"
     width="600px"
     @close="handleClose"
   >
@@ -10,7 +10,7 @@
         <el-select
           v-model="form.userId"
           placeholder="璇烽�夋嫨"
-          :disabled="isViewMode"
+          :disabled="isViewMode || isReturnMode"
           @change="getEquipment"
         >
           <el-option
@@ -25,7 +25,7 @@
         <el-select
           v-model="form.equipmentId"
           placeholder="璇烽�夋嫨"
-          :disabled="isViewMode"
+          :disabled="isViewMode || isReturnMode"
         >
           <el-option
             v-for="item in equipmentList"
@@ -35,7 +35,7 @@
           />
         </el-select>
       </el-form-item>
-      <el-form-item label="璁惧搴撳瓨" prop="equipmentStock">
+      <el-form-item label="璁惧搴撳瓨" prop="equipmentStock" v-if="!isReturnMode && formData.status !== 2">
         <el-input
           :value="
             equipmentList.find((item) => item.id == form.equipmentId)
@@ -45,7 +45,21 @@
           style="width: 100%"
         />
       </el-form-item>
-      <el-form-item label="棰嗙敤鏁伴噺" prop="usageQuantity">
+      <el-form-item label="宸蹭娇鐢ㄦ暟閲�" prop="usedQuantity" v-if="isReturnMode">
+        <el-input
+          :value="formData.usageQuantity"
+          disabled
+          style="width: 100%"
+        />
+      </el-form-item>
+      <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-input-number
           v-model="form.usageQuantity"
           :min="1"
@@ -59,19 +73,27 @@
           >(鏈�澶歿{ maxQuantity }}鍙�)</span
         >
       </el-form-item>
-      <el-form-item label="浣跨敤鐘舵��" prop="equipmentStatus">
-        <!-- 缂栬緫鐨勬椂鍊欒嚜鍔ㄥ尮閰� -->
-        <el-select
-          v-model="form.equipmentStatus"
-          placeholder="璇烽�夋嫨"
-          :disabled="isViewMode"
-          default-first-option
+      <el-form-item label="鏈褰掕繕鏁伴噺" prop="returnQuantity" v-if="isReturnMode">
+        <el-input-number
+          v-model="form.returnQuantity"
+          :min="1"
+          :max="Math.max(1, remainingReturnQuantity)"
+          style="width: 100%"
+          :disabled="remainingReturnQuantity <= 0"
+        />
+        <span
+          style="color: #999; font-size: 12px; margin-left: 8px"
+          v-if="remainingReturnQuantity > 0"
+          >(鏈�澶歿{ remainingReturnQuantity }}鍙�)</span
         >
-          <el-option label="浣跨敤涓�" :value="1" />
-          <el-option label="宸插綊杩�" :value="2" :disabled="props.id" />
-        </el-select>
+        <span
+          style="color: #ff4d4f; font-size: 12px; margin-left: 8px"
+          v-else
+          >(宸插叏閮ㄥ綊杩�)</span
+        >
       </el-form-item>
-      <el-form-item label="浣跨敤寮�濮嬫椂闂�" prop="usageStartTime">
+      <!-- 浣跨敤寮�濮嬫椂闂� - 鍙湪闈炲綊杩樻ā寮忔樉绀� -->
+      <el-form-item label="浣跨敤寮�濮嬫椂闂�" prop="usageStartTime" v-if="!isReturnMode">
         <el-date-picker
           v-model="form.usageStartTime"
           type="datetime"
@@ -82,14 +104,18 @@
           :disabled="isViewMode"
         />
       </el-form-item>
-      <!-- <el-form-item label="浣跨敤缁撴潫鏃堕棿" prop="usageEndTime">
+      
+      <!-- 褰掕繕缁撴潫鏃堕棿 - 鍙湪褰掕繕妯″紡鏄剧ず -->
+      <el-form-item label="褰掕繕鏃堕棿" prop="returnTime" v-if="isReturnMode">
         <el-date-picker
-          v-model="form.usageEndTime"
+          v-model="form.returnTime"
           type="datetime"
-          placeholder="閫夋嫨缁撴潫鏃堕棿"
+          placeholder="閫夋嫨褰掕繕鏃堕棿"
           style="width: 100%"
+          value-format="YYYY-MM-DD"
+          format="YYYY-MM-DD"
         />
-      </el-form-item> -->
+      </el-form-item>
       <el-form-item label="澶囨敞" prop="remarks">
         <el-input
           v-model="form.remarks"
@@ -140,21 +166,9 @@
     type: Object,
     default: () => ({}),
   },
-  beforeClose: {
-    type: Function,
-    default: () => {},
-  },
   addOrEdit: {
     type: String,
     default: "add",
-  },
-  title: {
-    type: String,
-    default: "",
-  },
-  equipmentStatus: {
-    type: [Number, String], // 鍏佽鏁板瓧鎴栧瓧绗︿覆
-    default: 1,
   },
 });
 const maxQuantity = computed(() => {
@@ -174,9 +188,22 @@
 const isViewMode = computed(
   () =>
     props.addOrEdit === "view" ||
-    props.addOrEdit === "viewRow" ||
-    Number(props.equipmentStatus) === 2
+    props.addOrEdit === "viewRow"
 );
+
+// 鍒ゆ柇鏄惁涓哄綊杩樻ā寮�
+const isReturnMode = computed(() => props.addOrEdit === "return");
+
+// 璁$畻鍓╀綑鍙綊杩樻暟閲�
+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();
@@ -186,21 +213,24 @@
   userId: "",
   equipmentId: "",
   usageQuantity: 1,
-  equipmentStatus: 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');
+  return `${year}-${month}-${day}`;
+};
+
+// 纭繚鍒濆鍖栨椂鑾峰彇璁惧鍒楄〃
 onMounted(() => {
-  if (
-    form.value.equipmentStatus === undefined ||
-    form.value.equipmentStatus === null
-  ) {
-    console.log(form.value.equipmentStatus);
-    form.value.equipmentStatus = 1;
-  }
   getEquipment();
 });
 
@@ -208,40 +238,76 @@
   () => props.formData,
   (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;
+      }
     } else {
-      // 鏂板妯″紡锛屼娇鐢ㄩ粯璁ゅ��
       form.value = { ...defaultForm };
     }
   },
   { immediate: true }
 );
 
-const rules = {
-  userId: [{ required: true, message: "璇疯緭鍏ラ鐢ㄤ汉", trigger: "blur" }],
-  equipmentId: [{ required: true, message: "璇疯緭鍏ヨ澶嘔D", trigger: "blur" }],
-  usageQuantity: [
-    { required: true, message: "璇疯緭鍏ラ鐢ㄦ暟閲�", trigger: "blur" },
-    { type: "number", min: 1, message: "鑷冲皯棰嗙敤1鍙�", trigger: "blur" },
-    {
-      validator: (rule, value, callback) => {
-        if (maxQuantity.value !== null && value > maxQuantity.value) {
-          callback(new Error("棰嗙敤鏁伴噺涓嶈兘澶т簬璁惧鏁伴噺"));
-        } else {
-          callback();
-        }
-      },
-      trigger: "blur",
-    },
-  ],
-  equipmentStatus: [
-    { required: true, message: "璇烽�夋嫨浣跨敤鐘舵��", trigger: "change" },
-  ],
-  usageStartTime: [
-    { required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" },
-  ],
-};
+const rules = computed(() => {
+  const baseRules = {
+    userId: [{ required: true, message: "璇疯緭鍏ラ鐢ㄤ汉", trigger: "blur" }],
+    equipmentId: [{ required: true, message: "璇疯緭鍏ヨ澶嘔D", trigger: "blur" }],
+  };
+
+  if (isReturnMode.value) {
+    // 褰掕繕妯″紡鐨勯獙璇佽鍒�
+    return {
+      ...baseRules,
+      returnQuantity: [
+        { required: true, message: "璇疯緭鍏ュ綊杩樻暟閲�", trigger: "blur" },
+        { type: "number", min: 1, message: "鑷冲皯褰掕繕1鍙�", trigger: "blur" },
+        {
+          validator: (rule, value, callback) => {
+            const remaining = remainingReturnQuantity.value;
+            if (remaining <= 0) {
+              callback(new Error("宸插叏閮ㄥ綊杩橈紝鏃犳硶缁х画褰掕繕"));
+            } else if (value > remaining) {
+              callback(new Error(`褰掕繕鏁伴噺涓嶈兘澶т簬鍓╀綑鍙綊杩樻暟閲�(${remaining}鍙�)`));
+            } else {
+              callback();
+            }
+          },
+          trigger: "blur",
+        },
+      ],
+      returnTime: [
+        { required: true, message: "璇烽�夋嫨褰掕繕鏃堕棿", trigger: "change" },
+      ],
+    };
+  } else {
+    // 鏂板/缂栬緫妯″紡鐨勯獙璇佽鍒�
+    return {
+      ...baseRules,
+      usageQuantity: [
+        { required: true, message: "璇疯緭鍏ラ鐢ㄦ暟閲�", trigger: "blur" },
+        { type: "number", min: 1, message: "鑷冲皯棰嗙敤1鍙�", trigger: "blur" },
+        {
+          validator: (rule, value, callback) => {
+            if (maxQuantity.value !== null && value > maxQuantity.value) {
+              callback(new Error("棰嗙敤鏁伴噺涓嶈兘澶т簬璁惧鏁伴噺"));
+            } else {
+              callback();
+            }
+          },
+          trigger: "blur",
+        },
+      ],
+      usageStartTime: [
+        { required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" },
+      ],
+    };
+  }
+});
 
 function handleClose() {
   emit("update:modelValue", false);
@@ -250,8 +316,29 @@
 function handleSubmit() {
   formRef.value.validate((valid) => {
     if (!valid) return;
-    let res = addOrEditUsageRecord(form.value);
-    emit("submit", { ...form.value });
+    
+    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;
+      
+      submitData = {
+        ...props.formData,
+        totalReturnNo: newTotalReturnedQuantity,
+        returnQuantity: currentReturnQuantity,
+        returnTime: form.value.returnTime,
+        equipmentStatus: 2,
+        remarks: form.value.remarks,
+        usageQuantity: totalUsageQuantity
+      };
+    }
+    
+    addOrEditUsageRecord(submitData);
+    emit("submit", submitData);
     handleClose();
   });
 }
diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue
index 4378006..859cbea 100644
--- a/src/views/procureMent/components/ProductionDialog.vue
+++ b/src/views/procureMent/components/ProductionDialog.vue
@@ -1,37 +1,55 @@
 <template>
   <div>
     <el-dialog
-        v-model="dialogFormVisible"
-        :title="title"
-        width="600"
-        :close-on-click-modal="false"
-        @close="handleClose"
+      v-model="dialogFormVisible"
+      :title="title"
+      width="600"
+      :close-on-click-modal="false"
+      @close="handleClose"
     >
       <el-form
-          ref="formRef"
-          :model="form"
-          :rules="rules"
-          label-width="auto"
-          class="production-form"
-          label-position="right"
-          style="max-width: 400px; margin: 0 auto"
+        ref="formRef"
+        :model="form"
+        :rules="rules"
+        label-width="auto"
+        class="production-form"
+        label-position="right"
+        style="max-width: 400px; margin: 0 auto"
       >
         <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierId">
-          <el-select v-model="form.supplierId" placeholder="璇烽�夋嫨渚涘簲鍟�" :disabled="isViewMode">
-            <el-option :label="item.label" v-for="item in supplyList" :key="item.value" :value="item.value"/>
+          <el-select
+            v-model="form.supplierId"
+            placeholder="璇烽�夋嫨渚涘簲鍟�"
+            :disabled="isViewMode"
+          >
+            <el-option
+              :label="item.label"
+              v-for="item in supplyList"
+              :key="item.value"
+              :value="item.value"
+            />
           </el-select>
         </el-form-item>
         <el-form-item label="鐓ょ" prop="coalId">
-          <el-select v-model="form.coalId" placeholder="璇烽�夋嫨鐓ょ" :disabled="isViewMode">
-            <el-option :label="item.label" v-for="item in coalList" :key="item.value" :value="item.value"/>
+          <el-select
+            v-model="form.coalId"
+            placeholder="璇烽�夋嫨鐓ょ"
+            :disabled="isViewMode"
+          >
+            <el-option
+              :label="item.label"
+              v-for="item in coalList"
+              :key="item.value"
+              :value="item.value"
+            />
           </el-select>
         </el-form-item>
         <el-form-item label="閲囪喘鏁伴噺" prop="purchaseQuantity">
           <el-input
-              v-model.number="form.purchaseQuantity"
-              placeholder="璇疯緭鍏�"
-              @blur="handleQuantityBlur"
-              :disabled="isViewMode"
+            v-model.number="form.purchaseQuantity"
+            placeholder="璇疯緭鍏�"
+            @blur="handleQuantityBlur"
+            :disabled="isViewMode"
           >
             <template v-slot:suffix>
               <i style="font-style: normal">鍚�</i>
@@ -40,10 +58,10 @@
         </el-form-item>
         <el-form-item label="绋庣巼" prop="taxRate">
           <el-input
-              v-model.number="form.taxRate"
-              placeholder="璇疯緭鍏ョ◣鐜�"
-              @blur="handleTaxRateBlur"
-              :disabled="isViewMode"
+            v-model.number="form.taxRate"
+            placeholder="璇疯緭鍏ョ◣鐜�"
+            @blur="handleTaxRateBlur"
+            :disabled="isViewMode"
           >
             <template v-slot:suffix>
               <i style="font-style: normal">%</i>
@@ -52,10 +70,10 @@
         </el-form-item>
         <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
           <el-input
-              v-model.number="form.priceIncludingTax"
-              placeholder="璇疯緭鍏ュ惈绋庡崟浠�"
-              @blur="handlePriceBlur"
-              :disabled="isViewMode"
+            v-model.number="form.priceIncludingTax"
+            placeholder="璇疯緭鍏ュ惈绋庡崟浠�"
+            @blur="handlePriceBlur"
+            :disabled="isViewMode"
           >
             <template v-slot:suffix>
               <i style="font-style: normal">鍏�</i>
@@ -64,9 +82,9 @@
         </el-form-item>
         <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
           <el-input
-              v-model.number="form.priceExcludingTax"
-              placeholder="鑷姩璁$畻"
-              disabled
+            v-model.number="form.priceExcludingTax"
+            placeholder="鑷姩璁$畻"
+            disabled
           >
             <template v-slot:suffix>
               <i style="font-style: normal">鍏�</i>
@@ -75,9 +93,9 @@
         </el-form-item>
         <el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax">
           <el-input
-              v-model.number="form.totalPriceExcludingTax"
-              placeholder="鑷姩璁$畻"
-              disabled
+            v-model.number="form.totalPriceExcludingTax"
+            placeholder="鑷姩璁$畻"
+            disabled
           >
             <template v-slot:suffix>
               <i style="font-style: normal">鍏�</i>
@@ -86,9 +104,23 @@
         </el-form-item>
         <el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
           <el-input
-              v-model.number="form.totalPriceIncludingTax"
-              placeholder="鑷姩璁$畻"
-              disabled
+            v-model.number="form.totalPriceIncludingTax"
+            placeholder="鑷姩璁$畻"
+            disabled
+          >
+            <template v-slot:suffix>
+              <i style="font-style: normal">鍏�</i>
+            </template>
+          </el-input>
+        </el-form-item>
+        <el-form-item label="杩愯垂" prop="freight">
+          <!-- 榛樿涓�0 -->
+          <el-input
+            type="number"
+            :precision="2"
+            v-model.number="form.freight"
+            placeholder="璇疯緭鍏ヨ繍璐�"
+            :disabled="isViewMode"
           >
             <template v-slot:suffix>
               <i style="font-style: normal">鍏�</i>
@@ -96,31 +128,38 @@
           </el-input>
         </el-form-item>
         <el-form-item label="鐧昏浜�" prop="registrantId">
-          <el-input :value="match(form.registrantId)" v-model.number="form.registrantId" disabled placeholder="璇疯緭鍏�"/>
+          <el-input
+            :value="match(form.registrantId)"
+            v-model.number="form.registrantId"
+            disabled
+            placeholder="璇疯緭鍏�"
+          />
         </el-form-item>
         <el-form-item label="鐧昏鏃ユ湡" prop="registrationDate">
           <el-date-picker
-              disabled
-              v-model="form.registrationDate"
-              type="date"
-              placeholder="YYYY-MM-DD"
-              style="width: 100%"
-              value-format="YYYY-MM-DD"
+            disabled
+            v-model="form.registrationDate"
+            type="date"
+            placeholder="YYYY-MM-DD"
+            style="width: 100%"
+            value-format="YYYY-MM-DD"
           />
         </el-form-item>
       </el-form>
       <template #footer>
         <div class="dialog-footer">
           <!-- 閲嶇疆鍜屽彇娑� -->
-          <el-button @click="handleClose" v-if="title.includes('鏂板') || title.includes('鏌ョ湅')"
-          >鍙栨秷
-          </el-button
-          >
+          <el-button
+            @click="handleClose"
+            v-if="title.includes('鏂板') || title.includes('鏌ョ湅')"
+            >鍙栨秷
+          </el-button>
           <el-button @click="handleReset" v-if="title.includes('缂栬緫')"
-          >閲嶇疆
-          </el-button
+            >閲嶇疆
+          </el-button>
+          <el-button type="primary" v-if="!isViewMode" @click="handleSubmit"
+            >纭</el-button
           >
-          <el-button type="primary" v-if="!isViewMode" @click="handleSubmit">纭</el-button>
         </div>
       </template>
     </el-dialog>
@@ -128,10 +167,10 @@
 </template>
 
 <script setup name="ProductionDialog">
-import {ref, defineProps, watch, onMounted, nextTick, computed} from "vue";
-import {ElMessage} from "element-plus";
+import { ref, defineProps, watch, onMounted, nextTick, computed } from "vue";
+import { ElMessage } from "element-plus";
 import useUserStore from "@/store/modules/user";
-import {addOrEditPR, getSupplyList, getCoalInfoList} from "@/api/procureMent";
+import { addOrEditPR, getSupplyList, getCoalInfoList } from "@/api/procureMent";
 
 const props = defineProps({
   title: {
@@ -185,7 +224,12 @@
   if (isNaN(num) || num === null || num === undefined || num === "") {
     return 0;
   }
-  return Number((Math.floor(parseFloat(num) * Math.pow(10, precision)) / Math.pow(10, precision)).toFixed(precision));
+  return Number(
+    (
+      Math.floor(parseFloat(num) * Math.pow(10, precision)) /
+      Math.pow(10, precision)
+    ).toFixed(precision)
+  );
 };
 
 // 瀹夊叏鑾峰彇鏁板��
@@ -202,19 +246,22 @@
 
   // 1. 鏍规嵁鍚◣鍗曚环鍜岀◣鐜囪绠椾笉鍚◣鍗曚环
   // 涓嶅惈绋庡崟浠� = 鍚◣鍗曚环 / (1 + 绋庣巼/100)
-  const priceExcludingTax = priceIncludingTax && taxRate 
-    ? parseFloat((priceIncludingTax / (1 + taxRate / 100)).toFixed(2))
-    : 0;
+  const priceExcludingTax =
+    priceIncludingTax && taxRate
+      ? parseFloat((priceIncludingTax / (1 + taxRate / 100)).toFixed(2))
+      : 0;
 
   // 2. 璁$畻涓嶅惈绋庢�讳环 = 涓嶅惈绋庡崟浠� 脳 鏁伴噺
-  const totalPriceExcludingTax = priceExcludingTax && quantity
-    ? toFixed(priceExcludingTax * quantity, 2)
-    : 0;
+  const totalPriceExcludingTax =
+    priceExcludingTax && quantity
+      ? toFixed(priceExcludingTax * quantity, 2)
+      : 0;
 
   // 3. 璁$畻鍚◣鎬讳环 = 鍚◣鍗曚环 脳 鏁伴噺
-  const totalPriceIncludingTax = priceIncludingTax && quantity
-    ? toFixed(priceIncludingTax * quantity, 2)
-    : 0;
+  const totalPriceIncludingTax =
+    priceIncludingTax && quantity
+      ? toFixed(priceIncludingTax * quantity, 2)
+      : 0;
 
   // 淇濊瘉鏄剧ず涓轰袱浣嶅皬鏁帮紙濡�88.5鏄剧ず涓�88.50锛�
   form.value.priceExcludingTax = priceExcludingTax.toFixed(2);
@@ -224,7 +271,11 @@
 
 // 鐩戝惉琛ㄥ崟瀵硅薄鍙樺寲锛岀敤浜庡鐞嗙紪杈戞ā寮忎笅鐨勬暟鎹姞杞藉拰瀹炴椂璁$畻
 watch(
-  () => [form.value.priceIncludingTax, form.value.taxRate, form.value.purchaseQuantity],
+  () => [
+    form.value.priceIncludingTax,
+    form.value.taxRate,
+    form.value.purchaseQuantity,
+  ],
   () => {
     // 闃叉姈澶勭悊锛岄伩鍏嶉绻佽绠�
     nextTick(() => {
@@ -241,7 +292,11 @@
 };
 // 澶勭悊绋庣巼杈撳叆妗嗗け鐒︿簨浠�
 const handleTaxRateBlur = () => {
-  if (form.value.taxRate !== null && form.value.taxRate !== undefined && form.value.taxRate !== "") {
+  if (
+    form.value.taxRate !== null &&
+    form.value.taxRate !== undefined &&
+    form.value.taxRate !== ""
+  ) {
     form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2);
     // watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
   }
@@ -249,16 +304,30 @@
 
 // 澶勭悊鍚◣鍗曚环杈撳叆妗嗗け鐒︿簨浠�
 const handlePriceBlur = () => {
-  if (form.value.priceIncludingTax !== null && form.value.priceIncludingTax !== undefined && form.value.priceIncludingTax !== "") {
-    form.value.priceIncludingTax = toFixed(parseFloat(form.value.priceIncludingTax), 2);
+  if (
+    form.value.priceIncludingTax !== null &&
+    form.value.priceIncludingTax !== undefined &&
+    form.value.priceIncludingTax !== ""
+  ) {
+    form.value.priceIncludingTax = toFixed(
+      parseFloat(form.value.priceIncludingTax),
+      2
+    );
     // watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
   }
 };
 
 // 澶勭悊閲囪喘鏁伴噺杈撳叆妗嗗け鐒︿簨浠�
 const handleQuantityBlur = () => {
-  if (form.value.purchaseQuantity !== null && form.value.purchaseQuantity !== undefined && form.value.purchaseQuantity !== "") {
-    form.value.purchaseQuantity = toFixed(parseFloat(form.value.purchaseQuantity), 3); // 鏁伴噺淇濈暀3浣嶅皬鏁�
+  if (
+    form.value.purchaseQuantity !== null &&
+    form.value.purchaseQuantity !== undefined &&
+    form.value.purchaseQuantity !== ""
+  ) {
+    form.value.purchaseQuantity = toFixed(
+      parseFloat(form.value.purchaseQuantity),
+      3
+    ); // 鏁伴噺淇濈暀3浣嶅皬鏁�
     // watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
   }
 };
@@ -272,23 +341,23 @@
 });
 const rules = {
   supplierName: [
-    {required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur"},
+    { required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" },
   ],
-  coal: [{required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur"}],
+  coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }],
   purchaseQuantity: [
-    {required: true, message: "璇疯緭鍏ラ噰璐暟閲�", trigger: "blur"},
-    {type: "number", message: "閲囪喘鏁伴噺蹇呴』涓烘暟瀛�", trigger: "blur"},
+    { required: true, message: "璇疯緭鍏ラ噰璐暟閲�", trigger: "blur" },
+    { type: "number", message: "閲囪喘鏁伴噺蹇呴』涓烘暟瀛�", trigger: "blur" },
   ],
   priceExcludingTax: [
-    {required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur"},
+    { required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur" },
   ],
   priceIncludingTax: [
-    {required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur"},
+    { required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur" },
   ],
-  taxRate:[
-    {required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur"},
-    {type: "number", message: "绋庣巼蹇呴』涓烘暟瀛�", trigger: "blur"},
-  ]
+  taxRate: [
+    { required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur" },
+    { type: "number", message: "绋庣巼蹇呴』涓烘暟瀛�", trigger: "blur" },
+  ],
 };
 // 鍏抽棴寮圭獥
 const handleClose = () => {
diff --git a/src/views/procureMent/index.vue b/src/views/procureMent/index.vue
index 2dfe17d..159c0fc 100644
--- a/src/views/procureMent/index.vue
+++ b/src/views/procureMent/index.vue
@@ -86,7 +86,8 @@
 const { proxy } = getCurrentInstance();
 const dialogFormVisible = ref(false);
 const form = ref({
-  taxRate: "13"
+  taxRate: 13,
+  freight: 20,
 });
 const title = ref("");
 // 鐘舵�佸彉閲�
@@ -154,6 +155,7 @@
   { prop: "purchaseQuantity", label: "閲囪喘鏁伴噺", minWidth: 100 },
   { prop: "priceIncludingTax", label: "鍗曚环锛堝惈绋庯級", minWidth: 150 },
   { prop: "totalPriceIncludingTax", label: "鎬讳环锛堝惈绋庯級", minWidth: 100 },
+  { prop: "freight", label: "杩愯垂", minWidth: 100 },
   { prop: "taxRate", label: "绋庣巼", minWidth: 100 },
   { prop: "priceExcludingTax", label: "涓嶅惈绋庡崟浠�", minWidth: 100 },
   { prop: "registrantId", label: "鐧昏浜�", minWidth: 100,
@@ -221,7 +223,8 @@
     totalPriceExcludingTax: "",
     priceIncludingTax: "",
     totalPriceIncludingTax: "",
-    taxRate: "13",
+    taxRate: 13,
+    freight:20,
     registrantId: userInfo.value.userId,
     registrationDate: new Date().toISOString().split("T")[0],
   };

--
Gitblit v1.9.3