From 35d6ace96aac27cb6c81bc361503378f6acbd24f Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 09 六月 2025 17:48:21 +0800
Subject: [PATCH] 1.库存管理页面联调

---
 src/views/warehouseManagement/index.vue |  268 +++++++++++++++++++++-----------------------
 src/api/warehouseManagement/index.js    |   43 +++++++
 2 files changed, 170 insertions(+), 141 deletions(-)

diff --git a/src/api/warehouseManagement/index.js b/src/api/warehouseManagement/index.js
new file mode 100644
index 0000000..c3bcaf8
--- /dev/null
+++ b/src/api/warehouseManagement/index.js
@@ -0,0 +1,43 @@
+// 搴撳瓨绠$悊
+import request from '@/utils/request'
+
+// 鏌ヨ寰呭叆搴撶鐞嗗垪琛�
+export function pendingInventoryList(query) {
+    return request({
+        url: '/pendingInventory/list',
+        method: 'get',
+        params: query
+    })
+}
+// 鏌ヨ姝e紡鍏ュ簱绠$悊鍒楄〃
+export function officialInventoryList(query) {
+    return request({
+        url: '/officialInventory/list',
+        method: 'get',
+        params: query
+    })
+}
+// All鐓よ川鏂规鏌ヨ
+export function coalPlanList(query) {
+    return request({
+        url: '/coalPlan/coalPlanList',
+        method: 'get',
+        params: query
+    })
+}
+// All鐓よ川缁存姢瀛楁鏌ヨ
+export function coalFieldList(query) {
+    return request({
+        url: '/coalField/coalFieldList',
+        method: 'get',
+        params: query
+    })
+}
+// 瀹℃牳鍏ュ簱
+export function addOrEditCoalValue(query) {
+    return request({
+        url: '/basic/coalValue/addOrEditCoalValue',
+        method: 'post',
+        data: query
+    })
+}
\ No newline at end of file
diff --git a/src/views/warehouseManagement/index.vue b/src/views/warehouseManagement/index.vue
index dd3d5f2..cac372d 100644
--- a/src/views/warehouseManagement/index.vue
+++ b/src/views/warehouseManagement/index.vue
@@ -1,14 +1,6 @@
 <template>
   <div class="app-container">
     <el-form :inline="true" :model="queryParams" class="search-form">
-      <el-form-item label="鎼滅储">
-        <el-input
-            v-model="queryParams.searchText"
-            placeholder="璇疯緭鍏ュ叧閿瘝"
-            clearable
-            :style="{ width: '100%' }"
-        />
-      </el-form-item>
       <el-form-item label="渚涘簲鍟嗗悕绉�">
         <el-input
             v-model="queryParams.supplierName"
@@ -17,17 +9,9 @@
             :style="{ width: '100%' }"
         />
       </el-form-item>
-      <el-form-item label="缁熶竴浜鸿瘑鍒彿">
+      <el-form-item label="鐓ょ">
         <el-input
-            v-model="queryParams.identifyNumber"
-            placeholder="璇疯緭鍏�"
-            clearable
-            :style="{ width: '100%' }"
-        />
-      </el-form-item>
-      <el-form-item label="缁忚惀鍦板潃">
-        <el-input
-            v-model="queryParams.address"
+            v-model="queryParams.coal"
             placeholder="璇疯緭鍏�"
             clearable
             :style="{ width: '100%' }"
@@ -62,18 +46,18 @@
         <el-table :data="tableData" border @selection-change="selectionChange" style="width: 100%">
           <el-table-column type="selection" width="55" align="center" />
           <el-table-column label="搴忓彿" type="index" width="60" align="center" />
-          <el-table-column prop="name" label="渚涜揣鍟嗗悕绉�" width="180" sortable/>
-          <el-table-column prop="type" label="鐓ょ" sortable/>
+          <el-table-column prop="supplierName" label="渚涜揣鍟嗗悕绉�" width="180" sortable/>
+          <el-table-column prop="coal" label="鐓ょ" sortable/>
           <el-table-column prop="unit" label="鍗曚綅" width="70"/>
-          <el-table-column prop="number" label="搴撳瓨鏁伴噺" sortable min-width="110"/>
-          <el-table-column prop="money" label="鍗曚环锛堝惈绋庯級" sortable width="130"/>
-          <el-table-column prop="money1" label="鎬讳环锛堝惈绋庯級" width="130" />
-          <el-table-column prop="money2" label="鎴愭湰鍗曚环" />
+          <el-table-column prop="inventoryQuantity" label="搴撳瓨鏁伴噺" sortable min-width="110"/>
+          <el-table-column prop="priceIncludingTax" label="鍗曚环锛堝惈绋庯級" sortable width="130"/>
+          <el-table-column prop="totalPriceIncludingTax" label="鎬讳环锛堝惈绋庯級" width="130" />
+          <el-table-column prop="costPerUnit" label="鎴愭湰鍗曚环" />
           <el-table-column label="鐓よ川" align="center" v-if="activeTab=== 'officialInventory'" width="600">
             <el-table-column v-for="col in columnTitle" :key="col.prop" :prop="col.prop" :label="col.label" align="center" sortable min-width="200"/>
           </el-table-column>
-          <el-table-column prop="createUser" label="鐧昏浜�" width="180"/>
-          <el-table-column prop="createTime" label="鐧昏鏃ユ湡" width="180"/>
+          <el-table-column prop="registrant" label="鐧昏浜�" width="180"/>
+          <el-table-column prop="registrationTime" label="鐧昏鏃ユ湡" width="180"/>
           <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center" v-if="activeTab !== 'officialInventory'">
             <template #default="scope">
               <el-button link type="primary" size="small" @click="reviewDia(scope.row)">瀹℃牳</el-button>
@@ -92,77 +76,67 @@
     </el-card>
     <!-- 瀹℃牳寰呭叆搴撳脊妗� -->
     <el-dialog title="瀹℃牳鍏ュ簱" v-model="reviewVisible" width="1000px">
-      <el-form :model="form" :rules="rules" ref="userRef" label-width="180px">
+      <el-form :model="form" :rules="rules" ref="formRef" label-width="180px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="渚涜揣鍟嗗悕绉�" prop="userName">
-              <el-input v-model="form.name" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
+            <el-form-item label="渚涜揣鍟嗗悕绉�" prop="supplierName">
+              <el-input v-model="form.supplierName" placeholder="璇疯緭鍏ヤ緵璐у晢鍚嶇О" maxlength="30" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鐓ょ" prop="nickName">
-              <el-input v-model="form.type" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
+            <el-form-item label="鐓ょ" prop="coal">
+              <el-input v-model="form.coal" placeholder="璇疯緭鍏ョ叅绉�" maxlength="30" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="鍗曚綅" prop="userName">
-              <el-input v-model="form.unit" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
+            <el-form-item label="鍗曚綅" prop="unit">
+              <el-input v-model="form.unit" placeholder="璇疯緭鍏ュ崟浣�" maxlength="30" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="搴撳瓨鏁伴噺" prop="nickName">
-              <el-input v-model="form.num" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
+            <el-form-item label="搴撳瓨鏁伴噺" prop="inventoryQuantity">
+              <el-input v-model="form.inventoryQuantity" placeholder="璇疯緭鍏ュ簱瀛樻暟閲�" maxlength="30" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="鍗曚环(鍚◣)" prop="userName">
-              <el-input v-model="form.priceOne" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
+            <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
+              <el-input v-model="form.priceIncludingTax" placeholder="璇疯緭鍏ュ崟浠�(鍚◣)" maxlength="30" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鎬讳环(鍚◣)" prop="nickName">
-              <el-input v-model="form.priceAll" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
+            <el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
+              <el-input v-model="form.totalPriceIncludingTax" placeholder="璇疯緭鍏ユ�讳环(鍚◣)" maxlength="30" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="鎴愭湰鍗曚环" prop="userName">
-              <el-input v-model="form.price" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
+            <el-form-item label="鎴愭湰鍗曚环" prop="costPerUnit">
+              <el-input v-model="form.costPerUnit" placeholder="璇疯緭鍏ユ垚鏈崟浠�" maxlength="30" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鐓よ川" prop="userName">
-              <el-input v-model="form.type2" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
+            <el-form-item label="鐓よ川鏂规" prop="qualityPlan">
+              <el-select v-model="form.qualityPlan" placeholder="璇烽�夋嫨" @change="coalFieldListOption" clearable>
+                <el-option
+                    v-for="dict in qualityPlanOption"
+                    :key="dict.id"
+                    :label="dict.plan"
+                    :value="dict.id"
+                ></el-option>
+              </el-select>
             </el-form-item>
           </el-col>
         </el-row>
         <el-divider></el-divider>
         <el-row>
-          <el-col :span="12">
-            <el-form-item label="鍏ㄦ按鍚噺鐧惧垎姣� (%)" prop="userName">
-              <el-input v-model="form.value1" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鍥哄畾纰崇櫨鍒嗘瘮 (%)" prop="nickName">
-              <el-input v-model="form.value2" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="浣庝綅鍙戠儹閲忥紙鍗曚綅锛氬崈鍗�/鍗冨厠锛�" prop="userName">
-              <el-input v-model="form.value3" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="鐏板垎鐧惧垎姣� (%)" prop="nickName">
-              <el-input v-model="form.value4" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
+          <el-col :span="12" v-for="item in filteredList" :key="item.id">
+            <el-form-item :label="item.fieldName">
+              <el-input v-model="form[item.fields]" />
             </el-form-item>
           </el-col>
         </el-row>
@@ -179,29 +153,34 @@
       <el-form :model="form" :rules="rules" ref="userRef" label-width="100px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="渚涜揣鍟嗗悕绉�" prop="userName">
-              <el-input v-model="form.userName" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
+            <el-form-item label="渚涜揣鍟嗗悕绉�" prop="supplierName">
+              <el-input v-model="form.supplierName" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鐓ょ" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
+            <el-form-item label="鐓ょ" prop="coal">
+              <el-input v-model="form.coal" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="鍗曚环(鍚◣)" prop="userName">
-              <el-input v-model="form.userName" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
+            <el-form-item label="鍗曚环(鍚◣)" prop="priceIncludingTax">
+              <el-input v-model="form.priceIncludingTax" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="鎴愭湰鍗曚环" prop="nickName">
-              <el-input v-model="form.nickName" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
+            <el-form-item label="鎬讳环(鍚◣)" prop="totalPriceIncludingTax">
+              <el-input v-model="form.totalPriceIncludingTax" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
+          <el-col :span="12">
+            <el-form-item label="鎴愭湰鍗曚环" prop="costPerUnit">
+              <el-input v-model="form.costPerUnit" placeholder="璇疯緭鍏ュ鍚�" maxlength="30" />
+            </el-form-item>
+          </el-col>
           <el-col :span="12">
             <el-form-item label="鐓よ川" prop="userName">
               <el-input v-model="form.userName" placeholder="璇疯緭鍏ユ墜鏈哄彿鐮�" maxlength="30" />
@@ -221,13 +200,22 @@
 
 <script setup>
 import {onMounted, ref} from "vue";
-import {Delete, Download, Plus, Refresh} from "@element-plus/icons-vue";
+import {Delete, Download, Refresh} from "@element-plus/icons-vue";
 import Pagination from "@/components/Pagination/index.vue";
+import {
+  addOrEditCoalValue,
+  coalFieldList,
+  coalPlanList, officialInventoryList,
+  pendingInventoryList
+} from "@/api/warehouseManagement/index.js";
+
 const { proxy } = getCurrentInstance()
 
 const tableData = ref([])
 const selectedRows = ref([])
 const columns = ref([])
+const qualityPlanOption = ref([])
+const filteredList = ref([])
 const tableLoading = ref(false);
 const total = ref(0);
 const pageNum = ref(1);
@@ -237,13 +225,22 @@
 // 鍚堝苟寮规
 const mergeVisible = ref(false)
 const data = reactive({
-  form: {},
+  form: {
+    supplierName: '',
+    coal: '',
+    unit: '',
+    inventoryQuantity: '',
+    priceIncludingTax: '',
+    totalPriceIncludingTax: '',
+    costPerUnit: '',
+    qualityPlan: '',
+    planId: '',
+  },
   rules: {
-    // userName: [{ required: true, message: "鐧诲綍璐﹀彿涓嶈兘涓虹┖", trigger: "blur" }],
-    // nickName: [{ required: true, message: "鐢ㄦ埛濮撳悕涓嶈兘涓虹┖", trigger: "blur" }],
-    // roleIds: [{ required: true, message: "瑙掕壊涓嶈兘涓虹┖", trigger: "change" }],
-    // deptId: [{ required: true, message: "閮ㄩ棬涓嶈兘涓虹┖", trigger: "change" }],
-    // password: [{ required: true, message: "鐢ㄦ埛瀵嗙爜涓嶈兘涓虹┖", trigger: "blur" }],
+    supplierName: [{ required: true, message: "璇疯緭鍏ヤ緵搴斿晢鍚嶇О", trigger: "blur" }],
+    coal: [{ required: true, message: "璇疯緭鍏ョ叅绉�", trigger: "blur" }],
+    unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }],
+    qualityPlan: [{ required: true, message: "璇烽�夋嫨", trigger: "change" }],
   }
 })
 
@@ -258,10 +255,8 @@
 ]);
 // 鏌ヨ鍙傛暟
 const queryParams = reactive({
-  searchText: "",
   supplierName: "",
-  identifyNumber: "",
-  address: "",
+  coal: "",
 })
 const columnTitle = ref([])
 onMounted(() => {
@@ -269,29 +264,15 @@
 });
 // 鏍囩椤电偣鍑�
 const handleTabClick = (tab) => {
-  getList();
-  tableLoading.value = true;
   tabName.value = tab.props.name;
   tableData.value = [];
   getList();
-  // switch (tabName.value) {
-  //   case "pendingInbound":
-  //     columns.value = pendingColumns;
-  //     break;
-  //   case "officialInventory":
-  //     columns.value = officialColumns;
-  //     break;
-  // }
-  setTimeout(() => {
-    tableLoading.value = false;
-  }, 500);
 };
 // 鐐瑰嚮鏌ヨ
 const handleQuery = () => {
-  tableLoading.value = true;
-  setTimeout(() => {
-    tableLoading.value = false;
-  }, 500);
+  pageNum.value = 1
+  pageSize.value = 10
+  getList()
 }
 const getList = () => {
   tableLoading.value = true;
@@ -301,18 +282,19 @@
     {prop: 'value2', label: '鐧惧垎姣�2'},
     {prop: 'value3', label: '鐧惧垎姣�3'},
   ]
-  setTimeout(() => {
-    // 鏆傛椂寮曞叆娴嬭瘯鏁版嵁
-    tableData.value = [
-      { name: "渚涘簲鍟咥", type: "鍔ㄥ姏鐓�", unit: "鍚�", number: 120, money: 500, money1: 200, money2: 200, money3: 300, money4: '楂樹綅', createUser: 'admin', createTime: '2025-06-01', value1: 12, value2: 23, value3: 14 },
-      { name: "渚涘簲鍟咥", type: "鍔ㄥ姏鐓�", unit: "鍚�", number: 100, money: 600, money1: 300, money2: 300, money3: 300, money4: '浣庝綅', createUser: 'admin', createTime: '2025-06-01', value1: 14, value2: 23, value3: 14 },
-      { name: "渚涘簲鍟咮", type: "鐒︾叅", unit: "鍚�", number: 300, money: 789,money1: 400, money2: 400, money3: 400, money4: '楂樹綅', createUser: 'admin', createTime: '2025-06-01', value1: 12, value2: 13, value3: 23  },
-      { name: "渚涘簲鍟咮", type: "鐒︾叅", unit: "鍚�", number: 256, money: 800, money1: 420, money2: 420, money3: 420, money4: '浣庝綅', createUser: 'admin', createTime: '2025-06-01', value1: 14, value2: 23, value3: 14  },
-      { name: "渚涘簲鍟咰", type: "鏃犵儫鐓�", unit: "鍚�", number: 256, money: 700, money1: 300, money2: 300, money3: 300, money4: '楂樹綅', createUser: 'admin', createTime: '2025-06-01', value1: 12, value2: 13, value3: 32  }
-    ];
-    total.value = tableData.value.length;
-    tableLoading.value = false;
-  }, 500);
+  if (tabName.value === "pendingInbound") {
+    pendingInventoryList({ ...queryParams }).then(res => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      total.value = res.data.total;
+    })
+  } else {
+    officialInventoryList({ ...queryParams }).then(res => {
+      tableLoading.value = false;
+      tableData.value = res.data.records;
+      total.value = res.data.total;
+    })
+  }
 };
 // 閲嶇疆鏌ヨ
 const resetQuery = () => {
@@ -323,36 +305,6 @@
   });
   handleQuery();
 };
-// 鍚堝苟鐩稿悓琛岀殑鏂规硶
-const mergeSameRows = ({ row, column, rowIndex, columnIndex }) => {
-  const fieldsToMerge = ['number', 'money', 'money1', 'money2', 'money3', 'money4', 'type', 'unit', 'name'];
-  
-  if (fieldsToMerge.includes(column.property)) {
-    const prevRow = tableData.value[rowIndex - 1]
-    const nextRow = tableData.value[rowIndex + 1]
-    // 鍒ゆ柇褰撳墠琛屽拰涓嬩竴琛屾槸鍚︾浉绛�
-    if (
-        (!prevRow || prevRow[column.property] !== row[column.property]) &&
-        (!nextRow || nextRow[column.property] === row[column.property])
-    ) {
-      let count = 1
-      while (
-          tableData.value[rowIndex + count] &&
-          tableData.value[rowIndex + count][column.property] === row[column.property]
-          ) {
-        count++
-      }
-      return { rowspan: count, colspan: 1 }
-    } else if (prevRow && prevRow[column.property] === row[column.property]) {
-      // 闅愯棌琚悎骞剁殑鍗曞厓鏍�
-      return { rowspan: 0, colspan: 0 }
-    }
-    return { rowspan: 1, colspan: 1 }
-  }
-  
-  // 鍏朵粬鍒椾笉鍚堝苟
-  return { rowspan: 1, colspan: 1 }
-}
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const selectionChange = (rows) => {
   selectedRows.value = rows
@@ -360,6 +312,24 @@
 // 鎵撳紑瀹℃牳寮规
 const reviewDia = (row) => {
   reviewVisible.value = true
+  form.value = {...row}
+  form.value.planId = form.value.id
+  coalPlanListOptions()
+}
+// 鏌ヨ鐓よ川鏂规涓嬫媺妗�
+const coalPlanListOptions = () => {
+  coalPlanList().then(res => {
+    qualityPlanOption.value = res.data
+  })
+}
+// 鏌ヨ鐓よ川鏂规瀛楁
+const coalFieldListOption = (id) => {
+  coalFieldList({id: id}).then(res => {
+    filteredList.value = res.data
+    if (!id) {
+      filteredList.value = []
+    }
+  })
 }
 // 鍚堝苟搴撳瓨鏁版嵁鏂规硶
 const mergeRows = () => {
@@ -379,10 +349,26 @@
 }
 // 鎻愪氦瀹℃牳琛ㄥ崟
 const submitReviewForm = () => {
-
+  proxy.$refs.formRef.validate((valid) => {
+    if (valid) {
+      delete form.value.registrationTime
+      delete form.value.createTime
+      delete form.value.updateTime
+      delete form.value.id
+      form.value.fieldValue = filteredList.value.map(item => ({
+        [item.fields]: form.value[item.fields]
+      }))
+      addOrEditCoalValue(form.value).then(() => {
+        cancelReview()
+        proxy.$modal.msgSuccess('鎻愪氦鎴愬姛')
+        handleQuery()
+      })
+    }
+  })
 }
 // 鍏抽棴瀹℃牳寮规
 const cancelReview = () => {
+  proxy.$refs.formRef.resetFields()
   reviewVisible.value = false
 }
 </script>

--
Gitblit v1.9.3