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/components/ProductionDialog.vue |  386 ++++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 324 insertions(+), 62 deletions(-)

diff --git a/src/views/procureMent/components/ProductionDialog.vue b/src/views/procureMent/components/ProductionDialog.vue
index 1de700b..859cbea 100644
--- a/src/views/procureMent/components/ProductionDialog.vue
+++ b/src/views/procureMent/components/ProductionDialog.vue
@@ -1,7 +1,7 @@
 <template>
   <div>
     <el-dialog
-      v-model="dialogVisible"
+      v-model="dialogFormVisible"
       :title="title"
       width="600"
       :close-on-click-modal="false"
@@ -16,32 +16,128 @@
         label-position="right"
         style="max-width: 400px; margin: 0 auto"
       >
-        <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName">
-          <el-input v-model="form.supplierName" placeholder="璇疯緭鍏�" />
+        <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>
         </el-form-item>
-        <el-form-item label="鐓ょ" prop="category">
-          <el-input v-model="form.category" placeholder="璇疯緭鍏�" />
+        <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>
         </el-form-item>
-        <el-form-item label="鍗曚綅" prop="unit">
-          <el-input v-model="form.unit" placeholder="璇疯緭鍏�" />
+        <el-form-item label="閲囪喘鏁伴噺" prop="purchaseQuantity">
+          <el-input
+            v-model.number="form.purchaseQuantity"
+            placeholder="璇疯緭鍏�"
+            @blur="handleQuantityBlur"
+            :disabled="isViewMode"
+          >
+            <template v-slot:suffix>
+              <i style="font-style: normal">鍚�</i>
+            </template>
+          </el-input>
         </el-form-item>
-        <el-form-item label="閲囪喘鏁伴噺" prop="purchaseAmount">
-          <el-input v-model="form.purchaseAmount" placeholder="璇疯緭鍏�" />
+        <el-form-item label="绋庣巼" prop="taxRate">
+          <el-input
+            v-model.number="form.taxRate"
+            placeholder="璇疯緭鍏ョ◣鐜�"
+            @blur="handleTaxRateBlur"
+            :disabled="isViewMode"
+          >
+            <template v-slot:suffix>
+              <i style="font-style: normal">%</i>
+            </template>
+          </el-input>
         </el-form-item>
-        <el-form-item label="鍗曚环(绋庡墠)" prop="priceBeforeTax">
-          <el-input v-model="form.priceBeforeTax" placeholder="璇疯緭鍏�" />
+        <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
+          <el-input
+            v-model.number="form.priceIncludingTax"
+            placeholder="璇疯緭鍏ュ惈绋庡崟浠�"
+            @blur="handlePriceBlur"
+            :disabled="isViewMode"
+          >
+            <template v-slot:suffix>
+              <i style="font-style: normal">鍏�</i>
+            </template>
+          </el-input>
         </el-form-item>
-        <el-form-item label="鎬讳环(绋庡墠)" prop="totalBeforeTax">
-          <el-input v-model="form.totalBeforeTax" placeholder="璇疯緭鍏�" />
+        <el-form-item label="鍗曚环(涓嶅惈绋�)" prop="priceExcludingTax">
+          <el-input
+            v-model.number="form.priceExcludingTax"
+            placeholder="鑷姩璁$畻"
+            disabled
+          >
+            <template v-slot:suffix>
+              <i style="font-style: normal">鍏�</i>
+            </template>
+          </el-input>
         </el-form-item>
-        <el-form-item label="鐑��" prop="calorificValue">
-          <el-input v-model="form.calorificValue" placeholder="璇疯緭鍏�" />
+        <el-form-item label="鎬讳环(涓嶅惈绋�)" prop="totalPriceExcludingTax">
+          <el-input
+            v-model.number="form.totalPriceExcludingTax"
+            placeholder="鑷姩璁$畻"
+            disabled
+          >
+            <template v-slot:suffix>
+              <i style="font-style: normal">鍏�</i>
+            </template>
+          </el-input>
         </el-form-item>
-        <el-form-item label="鐧昏浜�" prop="registrant">
-          <el-input v-model="form.registrant" placeholder="璇疯緭鍏�" />
+        <el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
+          <el-input
+            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>
+            </template>
+          </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-form-item>
         <el-form-item label="鐧昏鏃ユ湡" prop="registrationDate">
           <el-date-picker
+            disabled
             v-model="form.registrationDate"
             type="date"
             placeholder="YYYY-MM-DD"
@@ -52,19 +148,17 @@
       </el-form>
       <template #footer>
         <div class="dialog-footer">
-          <el-button type="primary" @click="handleSubmit">淇濆瓨</el-button>
           <!-- 閲嶇疆鍜屽彇娑� -->
           <el-button
-            type="primary"
             @click="handleClose"
-            v-if="title.includes('鏂板')"
-            >鍙栨秷</el-button
-          >
-          <el-button
-            type="primary"
-            @click="handleReset"
-            v-if="title.includes('缂栬緫')"
-            >閲嶇疆</el-button
+            v-if="title.includes('鏂板') || title.includes('鏌ョ湅')"
+            >鍙栨秷
+          </el-button>
+          <el-button @click="handleReset" v-if="title.includes('缂栬緫')"
+            >閲嶇疆
+          </el-button>
+          <el-button type="primary" v-if="!isViewMode" @click="handleSubmit"
+            >纭</el-button
           >
         </div>
       </template>
@@ -73,16 +167,19 @@
 </template>
 
 <script setup name="ProductionDialog">
-import { ref, defineProps, watch } from "vue";
+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";
+
 const props = defineProps({
   title: {
     type: String,
     default: "",
   },
 });
-const emit = defineEmits(["update:visible", "success"]);
-const dialogVisible = defineModel("dialogFormVisible", {
+const emit = defineEmits(["update:dialogFormVisible", "success"]);
+const dialogFormVisible = defineModel("dialogFormVisible", {
   required: true,
   type: Boolean,
 });
@@ -90,58 +187,223 @@
   required: true,
   type: Object,
 });
+const copyForm = defineModel("copyForm", {
+  required: true,
+  type: Object,
+});
+const supplyList = ref([]);
+const coalList = ref([]);
+const isViewMode = computed(() => props.title.includes("鏌ョ湅"));
+// 鑾峰彇渚涘簲鍟嗕笅鎷夊拰鐓ょ涓嬫媺
+const getDropdownData = async () => {
+  try {
+    const [supplyRes, coalRes] = await Promise.all([
+      getSupplyList(),
+      getCoalInfoList(),
+    ]);
+    let supplyData = supplyRes.data;
+    let coalData = coalRes.data;
+    supplyList.value = supplyData.map((item) => ({
+      value: item.id,
+      label: item.supplierName,
+    }));
+    coalList.value = coalData.map((item) => ({
+      value: item.id,
+      label: item.coal,
+    }));
+  } catch (error) {
+    ElMessage.error("鑾峰彇涓嬫媺鏁版嵁澶辫触锛岃绋嶅悗閲嶈瘯");
+  }
+};
+
+defineExpose({
+  getDropdownData,
+});
+// 鏁板�兼牸寮忓寲宸ュ叿鍑芥暟
+const toFixed = (num, precision = 2) => {
+  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)
+  );
+};
+
+// 瀹夊叏鑾峰彇鏁板��
+const safeNumber = (value) => {
+  const num = parseFloat(value);
+  return isNaN(num) ? 0 : num;
+};
+
+// 璁$畻閫昏緫 - 鍩轰簬鍚◣鍗曚环璁$畻涓嶅惈绋庝环鏍�
+const calculatePrices = () => {
+  const priceIncludingTax = safeNumber(form.value.priceIncludingTax); // 鍚◣鍗曚环
+  const taxRate = safeNumber(form.value.taxRate); // 绋庣巼
+  const quantity = safeNumber(form.value.purchaseQuantity); // 閲囪喘鏁伴噺
+
+  // 1. 鏍规嵁鍚◣鍗曚环鍜岀◣鐜囪绠椾笉鍚◣鍗曚环
+  // 涓嶅惈绋庡崟浠� = 鍚◣鍗曚环 / (1 + 绋庣巼/100)
+  const priceExcludingTax =
+    priceIncludingTax && taxRate
+      ? parseFloat((priceIncludingTax / (1 + taxRate / 100)).toFixed(2))
+      : 0;
+
+  // 2. 璁$畻涓嶅惈绋庢�讳环 = 涓嶅惈绋庡崟浠� 脳 鏁伴噺
+  const totalPriceExcludingTax =
+    priceExcludingTax && quantity
+      ? toFixed(priceExcludingTax * quantity, 2)
+      : 0;
+
+  // 3. 璁$畻鍚◣鎬讳环 = 鍚◣鍗曚环 脳 鏁伴噺
+  const totalPriceIncludingTax =
+    priceIncludingTax && quantity
+      ? toFixed(priceIncludingTax * quantity, 2)
+      : 0;
+
+  // 淇濊瘉鏄剧ず涓轰袱浣嶅皬鏁帮紙濡�88.5鏄剧ず涓�88.50锛�
+  form.value.priceExcludingTax = priceExcludingTax.toFixed(2);
+  form.value.totalPriceExcludingTax = totalPriceExcludingTax;
+  form.value.totalPriceIncludingTax = totalPriceIncludingTax;
+};
+
+// 鐩戝惉琛ㄥ崟瀵硅薄鍙樺寲锛岀敤浜庡鐞嗙紪杈戞ā寮忎笅鐨勬暟鎹姞杞藉拰瀹炴椂璁$畻
+watch(
+  () => [
+    form.value.priceIncludingTax,
+    form.value.taxRate,
+    form.value.purchaseQuantity,
+  ],
+  () => {
+    // 闃叉姈澶勭悊锛岄伩鍏嶉绻佽绠�
+    nextTick(() => {
+      calculatePrices();
+    });
+  },
+  { deep: true }
+);
+
+const userStore = useUserStore();
+const userInfo = ref({});
+const match = () => {
+  return userInfo.value.nickName || "鏈煡鐢ㄦ埛";
+};
+// 澶勭悊绋庣巼杈撳叆妗嗗け鐒︿簨浠�
+const handleTaxRateBlur = () => {
+  if (
+    form.value.taxRate !== null &&
+    form.value.taxRate !== undefined &&
+    form.value.taxRate !== ""
+  ) {
+    form.value.taxRate = toFixed(parseFloat(form.value.taxRate), 2);
+    // watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
+  }
+};
+
+// 澶勭悊鍚◣鍗曚环杈撳叆妗嗗け鐒︿簨浠�
+const handlePriceBlur = () => {
+  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浣嶅皬鏁�
+    // watch 浼氳嚜鍔ㄨЕ鍙� calculatePrices锛屼笉闇�瑕佹墜鍔ㄨ皟鐢�
+  }
+};
+
+onMounted(async () => {
+  let res = await userStore.getInfo();
+  userInfo.value = res.user;
+  await getDropdownData();
+  // 缁勪欢鍔犺浇瀹屾垚鍚庤Е鍙戜竴娆¤绠�
+  calculatePrices();
+});
 const rules = {
   supplierName: [
     { required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" },
   ],
-  category: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }],
-  unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }],
-  purchaseAmount: [
+  coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }],
+  purchaseQuantity: [
     { required: true, message: "璇疯緭鍏ラ噰璐暟閲�", trigger: "blur" },
+    { type: "number", message: "閲囪喘鏁伴噺蹇呴』涓烘暟瀛�", trigger: "blur" },
   ],
-  priceBeforeTax: [{ required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur" }],
-  totalBeforeTax: [{ required: true, message: "璇疯緭鍏ユ�讳环", trigger: "blur" }],
-  calorificValue: [{ required: true, message: "璇疯緭鍏ョ儹鍊�", trigger: "blur" }],
-  registrant: [{ required: true, message: "璇疯緭鍏ョ櫥璁颁汉", trigger: "blur" }],
-  registrationDate: [
-    { required: true, message: "璇烽�夋嫨鐧昏鏃ユ湡", trigger: "change" },
+  priceExcludingTax: [
+    { required: true, message: "璇疯緭鍏ュ崟浠�", trigger: "blur" },
+  ],
+  priceIncludingTax: [
+    { required: true, message: "璇疯緭鍏ュ惈绋庡崟浠�", trigger: "blur" },
+  ],
+  taxRate: [
+    { required: true, message: "璇疯緭鍏ョ◣鐜�", trigger: "blur" },
+    { type: "number", message: "绋庣巼蹇呴』涓烘暟瀛�", trigger: "blur" },
   ],
 };
 // 鍏抽棴寮圭獥
 const handleClose = () => {
-  dialogVisible.value = false;
-  console.log(form.value);
+  dialogFormVisible.value = false;
 };
-const handleReset = () => {
-  if (!formRef.value) return;
-  formRef.value.resetFields();
-  ElMessage.success("琛ㄥ崟宸查噸缃�");
-};
-// 鎸佺画鐩戝惉form.value鐨勫彉鍖�
-watch(
-  () => form.value,
-  (val) => {
-    console.log(val);
+const handleReset = async () => {
+  // 閲嶇疆琛ㄥ崟鏁版嵁
+  form.value = JSON.parse(JSON.stringify(copyForm.value));
+  // 绛夊緟DOM鏇存柊瀹屾垚鍚庢竻闄よ〃鍗曢獙璇佺姸鎬�
+  await nextTick();
+  if (formRef.value) {
+    formRef.value.clearValidate();
   }
-);
+};
 const formRef = ref(null);
 // 鎻愪氦琛ㄥ崟
 const handleSubmit = async () => {
   if (!formRef.value) return;
-  await formRef.value.validate((valid) => {
+  await formRef.value.validate(async (valid) => {
     if (valid) {
-      try {
-        emit("success", { ...form.value });
-        handleClose();
-        ElMessage.success("淇濆瓨鎴愬姛");
-      } catch (error) {
-        console.error("淇濆瓨澶辫触:", error);
-        ElMessage.error("淇濆瓨澶辫触");
+      const obj = ref({});
+      if (props.title.includes("鏂板")) {
+        let result = await addOrEditPR({
+          ...form.value,
+        });
+        obj.value = {
+          title: "鏂板",
+          ...form.value,
+          result,
+        };
+      } else {
+        delete form.value.updateTime;
+        delete form.value.createTime;
+        let result = await addOrEditPR({
+          ...form.value,
+        });
+        obj.value = {
+          title: "缂栬緫",
+          ...form.value,
+          result,
+        };
       }
+      emit("submit", obj.value);
     }
   });
 };
 </script>
 
-<style lang="sass" scoped>
-</style>
\ No newline at end of file
+<style lang="scss" scoped></style>

--
Gitblit v1.9.3