From 352a465a32764eabfc550fad7d35da44b588a03d Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 05 一月 2026 19:39:46 +0800
Subject: [PATCH] 海川开心: 1.销售管理、仓储物流一些字段赋默认值 2.生产报工改成可以多个报工 酒泉改造 1.设备管理从新疆迁移过来 2.开发、联调备件管理页面

---
 src/views/equipmentManagement/spareParts/index.vue |  353 +++++++++++++++++++++++++++-------------------------------
 1 files changed, 165 insertions(+), 188 deletions(-)

diff --git a/src/views/equipmentManagement/spareParts/index.vue b/src/views/equipmentManagement/spareParts/index.vue
index f91d76f..f18c84c 100644
--- a/src/views/equipmentManagement/spareParts/index.vue
+++ b/src/views/equipmentManagement/spareParts/index.vue
@@ -1,48 +1,55 @@
 <template>
   <div class="spare-part-category">
+		<div class="search_form">
+			<el-form :inline="true" :model="queryParams" class="search-form">
+				<el-form-item label="澶囦欢鍚嶇О">
+					<el-input
+						v-model="queryParams.name"
+						placeholder="璇疯緭鍏ュ浠跺悕绉�"
+						clearable
+						style="width: 240px"
+					/>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery">鏌ヨ</el-button>
+					<el-button @click="resetQuery">閲嶇疆</el-button>
+				</el-form-item>
+			</el-form>
+			<div>
+				<el-button type="primary" @click="addCategory" >鏂板</el-button>
+			</div>
+		</div>
+    
     <div class="table_list">
-      <div class="actions">
-        <el-text class="mx-1" size="large">璁惧鍒嗙被</el-text>
-        <div>
-          <el-button @click="fetchTreeData" :loading="loading">鍒锋柊</el-button>
-          <el-button type="primary" @click="addCategory" >鏂板</el-button>
-        </div>
-      </div>
       <el-table
         v-loading="loading"
         :data="renderTableData"
         style="width: 100%; margin-top: 10px;"
         border
         row-key="id"
-        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
       >
-        <el-table-column prop="name" label="鍒嗙被鍚嶇О" width="450">
-          <template #default="{ row }">
-            <span :style="{ paddingLeft: getIndentation(row) + 'px' }">
-              {{ row.name }}
-            </span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="sparePartsNo" label="鍒嗙被缂栧彿" width="200"></el-table-column>
+      <el-table-column prop="deviceNameStr" label="璁惧鍚嶇О"  width="300"></el-table-column>
+        <el-table-column prop="name" label="澶囦欢鍚嶇О" width="200"></el-table-column>
+        <el-table-column prop="sparePartsNo" label="澶囦欢缂栧彿" width="200"></el-table-column>
         <el-table-column prop="status" label="鐘舵��" width="100">
           <template #default="{ row }">
             <el-tag type="success" size="small">{{ row.status }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="description" label="鎻忚堪" win-width="330"></el-table-column>
-        <el-table-column label="鎿嶄綔" width="180" fixed="right">
+        <el-table-column prop="price" label="浠锋牸" width="140"></el-table-column>
+        <el-table-column prop="description" label="鎻忚堪" width="150"></el-table-column>
+        <el-table-column label="鎿嶄綔" width="150" fixed="right" align="center">
           <template #default="{ row }">
             <el-button
-              type="text"
-              size="small"
+              link
+							type="primary"
               @click="() => editCategory(row)"
               :disabled="loading"
             >
               缂栬緫
             </el-button>
             <el-button
-              type="text"
-              size="small"
+							link
               @click="() => deleteCategory(row.id)"
               style="color: #f56c6c;"
               :disabled="loading"
@@ -55,10 +62,28 @@
     </div>
     <el-dialog title="鍒嗙被绠$悊" v-model="dialogVisible" width="60%">
       <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
-        <el-form-item label="鍒嗙被鍚嶇О" prop="name">
+        <el-form-item label="璁惧" prop="deviceLedgerIds">
+          <el-select
+            v-model="form.deviceLedgerIds"
+            placeholder="璇烽�夋嫨璁惧"
+            filterable
+            default-first-option
+            :reserve-keyword="false"
+            multiple
+            style="width: 100%"
+          >
+            <el-option
+              v-for="(item, index) in deviceOptions"
+              :key="index"
+              :label="item.deviceName"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="澶囦欢鍚嶇О" prop="name">
           <el-input v-model="form.name"></el-input>
         </el-form-item>
-        <el-form-item label="鍒嗙被缂栧彿" prop="sparePartsNo">
+        <el-form-item label="澶囦欢缂栧彿" prop="sparePartsNo">
           <el-input v-model="form.sparePartsNo"></el-input>
         </el-form-item>
         <el-form-item label="鐘舵��" prop="status">
@@ -70,17 +95,15 @@
         <el-form-item label="鎻忚堪" prop="description">
           <el-input v-model="form.description"></el-input>
         </el-form-item>
-        <el-form-item label="涓婄骇鍒嗙被" prop="parentId">
-          <el-select v-model="form.parentId" placeholder="璇烽�夋嫨涓婄骇鍒嗙被">
-            <el-option label="鏃犱笂绾у垎绫�" :value="null"></el-option>
-            <el-option
-              v-for="(item, index) in categories"
-              :key="index"
-              :label="item.name"
-              :value="item.id"
-              
-            ></el-option>
-          </el-select>
+        <el-form-item label="浠锋牸" prop="price">
+          <el-input-number
+            v-model="form.price"
+            placeholder="璇疯緭鍏ヤ环鏍�"
+            :min="0"
+            :step="0.01"
+            :precision="2"
+            style="width: 100%"
+          ></el-input-number>
         </el-form-item>
       </el-form>
       <template #footer>
@@ -96,7 +119,8 @@
 <script setup>
 import { ref, computed, onMounted, reactive, watch } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
-import { getSparePartsList, addSparePart, editSparePart, delSparePart,getSparePartsTree } from "@/api/equipmentManagement/spareParts";
+import { getSparePartsList, addSparePart, editSparePart, delSparePart } from "@/api/equipmentManagement/spareParts";
+import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
 
 // 鍔犺浇鐘舵��
 const loading = ref(false);
@@ -111,8 +135,14 @@
 // const renderTableData = computed(() => buildTree(categories.value));
 const renderTableData = ref([]);
 const operationType = ref('add')
+// 璁惧閫夐」
+const deviceOptions = ref([]);
 // 琛ㄥ崟寮曠敤
 const formRef = ref(null);
+// 鏌ヨ鍙傛暟
+const queryParams = reactive({
+  name: ''
+});
 // 琛ㄥ崟鏁版嵁
 const form = reactive({
   id:'',
@@ -120,19 +150,34 @@
   sparePartsNo: '',
   status: '',
   description: '',
-  parentId: null
+  deviceLedgerIds: [],
+  price: null
 });
 
 // 琛ㄥ崟楠岃瘉瑙勫垯
 const rules = reactive({
   name: [
-    { required: true, message: '璇疯緭鍏ュ垎绫诲悕绉�', trigger: 'blur' }
+    { required: true, message: '璇疯緭鍏ュ浠跺悕绉�', trigger: 'blur' }
   ],
   sparePartsNo: [
-    { required: true, message: '璇疯緭鍏ュ垎绫荤紪鍙�', trigger: 'blur' }
+    { required: true, message: '璇疯緭鍏ュ浠剁紪鍙�', trigger: 'blur' }
   ],
   status: [
     { required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }
+  ],
+  deviceLedgerIds: [
+    { 
+      required: true, 
+      message: '璇烽�夋嫨璁惧', 
+      trigger: 'change',
+      validator: (rule, value, callback) => {
+        if (operationType.value === 'add' && (!value || value.length === 0)) {
+          callback(new Error('璇烽�夋嫨璁惧'));
+        } else {
+          callback();
+        }
+      }
+    }
   ]
 });
 // 鑾峰彇缂╄繘閲�
@@ -159,54 +204,80 @@
   });
   return result;
 };
-//鑾峰彇鏍戝舰缁撴瀯
-const fetchTreeData = async () => {
-  fetchCategories();
+// 鑾峰彇鍒楄〃鏁版嵁
+const fetchListData = async () => {
+  loading.value = true;
   try {
-    const res = await getSparePartsTree();
-    if (res.code === 200) {
-      renderTableData.value = res.data;
-    } else {
-      ElMessage.error(res.message || '鑾峰彇鍒嗙被鍒楄〃澶辫触');
+    const params = {};
+    if (queryParams.name) {
+      params.name = queryParams.name;
     }
-  }catch (error) {
-    ElMessage.error('鑾峰彇鍒嗙被鍒楄〃澶辫触');
+    const res = await getSparePartsList(params);
+    if (res.code === 200) {
+      renderTableData.value = res.data.records || [];
+      categories.value = res.data.records || [];
+    }
+  } catch (error) {
+		loading.value = false;
+  } finally {
+    loading.value = false;
   }
 }
 
-// 鑾峰彇鍒嗙被鍒楄〃
-const fetchCategories = async () => {
-  loading.value = true;
+// 鏌ヨ
+const handleQuery = () => {
+  fetchListData();
+}
+
+// 閲嶇疆鏌ヨ
+const resetQuery = () => {
+  queryParams.name = '';
+  fetchListData();
+}
+
+// 鍔犺浇璁惧鍒楄〃锛堝湪鎵撳紑寮规鏃惰皟鐢級
+const loadDeviceName = async () => {
   try {
-    const res = await getSparePartsList();
-    if (res.code === 200) {
-      categories.value = res.data.records;
-    } else {
-      ElMessage.error(res.message || '鑾峰彇鍒嗙被鍒楄〃澶辫触');
-    }
+    const { data } = await getDeviceLedger();
+    deviceOptions.value = data || [];
   } catch (error) {
-    ElMessage.error('鑾峰彇鍒嗙被鍒楄〃澶辫触');
-  } finally {
-    loading.value = false;
+    ElMessage.error('鑾峰彇璁惧鍒楄〃澶辫触');
   }
 };
 
 // 鏂板鍒嗙被
-const addCategory = () => {
+const addCategory = async () => {
+  await loadDeviceName();
   form.id = '';
   form.name = '';
   form.sparePartsNo = '';
   form.status = '';
   form.description = '';
-  form.parentId = null;
+  form.deviceLedgerIds = [];
+  form.price = null;
   operationType.value = 'add'
   dialogVisible.value = true;
-  console.log('dialogVisible 鏇存柊涓�', dialogVisible.value);
 };
 
 // 缂栬緫鍒嗙被
-const editCategory = (row) => {
+const editCategory = async (row) => {
+  await loadDeviceName();
   Object.assign(form, row);
+  // 濡傛灉鍚庣杩斿洖鐨勬槸 deviceIds 瀛楃涓诧紝闇�瑕佽浆鎹负鏁扮粍
+  if (row.deviceIds && typeof row.deviceIds === 'string') {
+    // 纭繚ID绫诲瀷涓庤澶囬�夐」涓殑ID绫诲瀷涓�鑷�
+    const deviceIdsArray = row.deviceIds.split(',').map(id => id.trim()).filter(id => id);
+    // 濡傛灉璁惧閫夐」涓殑ID鏄暟瀛楃被鍨嬶紝鍒欒浆鎹负鏁板瓧
+    if (deviceOptions.value.length > 0 && typeof deviceOptions.value[0].id === 'number') {
+      form.deviceLedgerIds = deviceIdsArray.map(id => Number(id)).filter(id => !isNaN(id));
+    } else {
+      form.deviceLedgerIds = deviceIdsArray;
+    }
+  } else if (row.deviceIds && Array.isArray(row.deviceIds)) {
+    form.deviceLedgerIds = row.deviceIds;
+  } else {
+    form.deviceLedgerIds = [];
+  }
   operationType.value = 'edit'
   dialogVisible.value = true;
 };
@@ -223,7 +294,7 @@
     const res = await delSparePart(id);
     if (res.code === 200) {
       ElMessage.success('鍒犻櫎鎴愬姛');
-      fetchTreeData();
+      fetchListData();
     } else {
       ElMessage.error(res.message || '鍒犻櫎澶辫触');
     }
@@ -242,19 +313,31 @@
   try {
     await formRef.value.validate();
     formLoading.value = true;
+    
+    // 鏋勫缓鎻愪氦鏁版嵁
+    const submitData = {
+      ...form,
+      deviceIds: form.deviceLedgerIds && form.deviceLedgerIds.length > 0 
+        ? form.deviceLedgerIds.join(',') 
+        : ''
+    };
+    
+    // 鍒犻櫎涓嶉渶瑕佺殑瀛楁
+    delete submitData.deviceLedgerIds;
+    
     if (operationType.value === 'edit') {
-      let res = await editSparePart(form);
+      let res = await editSparePart(submitData);
       if (res.code === 200) {
-      ElMessage.success('缂栬緫鎴愬姛');
-      dialogVisible.value = false;
-      fetchTreeData();
-    }
-    } else {
-      let res = await addSparePart(form);
-        if (res.code === 200) {
         ElMessage.success('缂栬緫鎴愬姛');
         dialogVisible.value = false;
-        fetchTreeData();
+        fetchListData();
+      }
+    } else {
+      let res = await addSparePart(submitData);
+      if (res.code === 200) {
+        ElMessage.success('鏂板鎴愬姛');
+        dialogVisible.value = false;
+        fetchListData();
       }
     }
   } catch (error) {
@@ -264,10 +347,9 @@
   }
 };
 
-// 缁勪欢鎸傝浇鏃惰幏鍙栧垎绫诲垪琛�
+// 缁勪欢鎸傝浇鏃惰幏鍙栧垪琛ㄦ暟鎹�
 onMounted(() => {
-  fetchCategories();
-  fetchTreeData();
+  fetchListData();
 });
 </script>
 
@@ -275,43 +357,13 @@
 .spare-part-category {
   padding: 20px;
 }
+.search_form {
+	display: flex;
+	align-items: flex-start;
+	justify-content: space-between;
+}
 .table_list {
   margin-top: unset;
-}
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-  align-items: center;
-}
-
-/* 宓屽鏍戝舰缁撴瀯鏍峰紡 */
-.nested-tree-node {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  width: 100%;
-  padding: 0 4px;
-  height: 30px;
-  line-height: 30px;
-}
-
-.category-code {
-  color: #606266;
-  font-size: 12px;
-  margin-left: 8px;
-}
-
-.tree-actions {
-  display: flex;
-  align-items: center;
-  gap: 8px;
-  margin-left: auto;
-}
-
-/* 琛ㄦ牸鏍峰紡璋冩暣 */
-.el-table {
-  font-size: 14px;
 }
 
 .el-table__header-wrapper th {
@@ -321,22 +373,6 @@
 
 .el-table__row:hover > td {
   background-color: #fafafa;
-}
-
-/* 宓屽鏍戝舰缁撴瀯鐗瑰畾鏍峰紡 */
-.nested-tree {
-  background-color: transparent;
-}
-
-.nested-tree .el-tree-node__content {
-  height: auto;
-  background-color: transparent;
-}
-
-/* 鎼滅储妗嗘牱寮忚皟鏁� */
-.actions .el-input {
-  margin-right: 10px;
-  width: 200px;
 }
 
 /* 鎸夐挳缁勬牱寮� */
@@ -354,64 +390,5 @@
 .nested-tree .el-tree-node__expand-icon {
   font-size: 12px;
   margin-right: 4px;
-}
-
-/* 绌虹姸鎬佹牱寮� */
-.el-table .cell:empty::before {
-  content: '-';
-  color: #c0c4cc;
-}
-
-/* 灞曞紑/鎶樺彔鍔熻兘鏍峰紡 */
-.expand-icon {
-  display: inline-block;
-  width: 20px;
-  height: 20px;
-  text-align: center;
-  line-height: 20px;
-  cursor: pointer;
-  font-size: 12px;
-  color: #909399;
-}
-
-.expand-icon.expanded {
-  color: #409eff;
-}
-
-/* 灞曞紑鍐呭鏍峰紡 */
-.expand-content {
-  padding: 10px 20px;
-}
-
-/* 瀛愮骇鍐呭鏍峰紡 */
-.child-content {
-  padding-left: 40px;
-}
-
-/* 鏃犲瓙鍒嗙被鎻愮ず鏍峰紡 */
-.no-children {
-  padding: 10px 20px;
-  color: #909399;
-  font-size: 14px;
-}
-
-/* 纭繚灞曞紑鐨勮〃鏍兼牱寮忔纭� */
-.el-table .el-table__expanded-cell {
-  background-color: #fafafa;
-}
-
-/* 灞曞紑鐨勫瓙琛ㄦ牸鏍峰紡 */
-.el-table .el-table {
-  border-top: none;
-  border-bottom: none;
-}
-
-/* 灞曞紑鐨勫瓙琛ㄦ牸鍗曞厓鏍兼牱寮� */
-.expand-content .el-table__body-wrapper .el-table__row {
-  background-color: #ffffff;
-}
-
-.expand-content .el-table__body-wrapper .el-table__row:hover > td {
-  background-color: #fafafa;
 }
 </style>
\ No newline at end of file

--
Gitblit v1.9.3