From db42d47f5692ef64e5436c5a6d29dcb537b44596 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期一, 26 一月 2026 16:36:13 +0800
Subject: [PATCH] 浪潮对接单点登录:mis调整

---
 src/views/equipmentManagement/spareParts/index.vue |  401 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 401 insertions(+), 0 deletions(-)

diff --git a/src/views/equipmentManagement/spareParts/index.vue b/src/views/equipmentManagement/spareParts/index.vue
new file mode 100644
index 0000000..eb0bdd5
--- /dev/null
+++ b/src/views/equipmentManagement/spareParts/index.vue
@@ -0,0 +1,401 @@
+<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">
+      <el-table
+        v-loading="loading"
+        :data="renderTableData"
+        style="width: 100%; margin-top: 10px;"
+        border
+        row-key="id"
+      >
+      <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="price" label="浠锋牸" width="140"></el-table-column>
+        <el-table-column prop="quantity" 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
+              link
+							type="primary"
+              @click="() => editCategory(row)"
+              :disabled="loading"
+            >
+              缂栬緫
+            </el-button>
+            <el-button
+							link
+              @click="() => deleteCategory(row.id)"
+              style="color: #f56c6c;"
+              :disabled="loading"
+            >
+              鍒犻櫎
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </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="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-input v-model="form.sparePartsNo"></el-input>
+        </el-form-item>
+        <el-form-item label="鏁伴噺" prop="quantity">
+          <el-input type="number" v-model="form.quantity"></el-input>
+        </el-form-item>
+        <el-form-item label="鐘舵��" prop="status">
+          <el-select v-model="form.status" placeholder="璇烽�夋嫨鐘舵��">
+            <el-option label="姝e父" value="姝e父"></el-option>
+            <el-option label="绂佺敤" value="绂佺敤"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鎻忚堪" prop="description">
+          <el-input v-model="form.description"></el-input>
+        </el-form-item>
+        <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>
+        <span class="dialog-footer">
+          <el-button @click="dialogVisible = false" :disabled="formLoading">鍙栨秷</el-button>
+          <el-button type="primary" @click="submitForm" :loading="formLoading">纭畾</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import { ref, computed, onMounted, reactive, watch } from 'vue';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { getSparePartsList, addSparePart, editSparePart, delSparePart } from "@/api/equipmentManagement/spareParts";
+import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+
+// 鍔犺浇鐘舵��
+const loading = ref(false);
+const formLoading = ref(false);
+// 瀵硅瘽妗嗘樉绀虹姸鎬�
+const dialogVisible = ref(false);
+// 缂栬緫 ID
+const editId = ref(null);
+// 琛ㄦ牸鏁版嵁
+const categories = ref([]);
+// 娓叉煋鐢ㄧ殑琛ㄦ牸鏁版嵁
+// 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:'',
+  name: '',
+  sparePartsNo: '',
+  status: '',
+  description: '',
+  deviceLedgerIds: [],
+  price: null
+});
+
+// 琛ㄥ崟楠岃瘉瑙勫垯
+const rules = reactive({
+  name: [
+    { required: true, message: '璇疯緭鍏ュ浠跺悕绉�', trigger: 'blur' }
+  ],
+  sparePartsNo: [
+    { required: true, message: '璇疯緭鍏ュ浠剁紪鍙�', trigger: 'blur' }
+  ],
+  quantity:[
+    { 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();
+        }
+      }
+    }
+  ]
+});
+// 鑾峰彇缂╄繘閲�
+const getIndentation = (row) => {
+  // 杩欓噷绠�鍗曡繑鍥� 20锛屽彲鏍规嵁瀹為檯闇�姹傚疄鐜板眰绾х缉杩涢�昏緫
+  return 20; 
+};
+// 瀹氫箟 buildTree 鍑芥暟
+const buildTree = (flatData) => {
+  const map = {};
+  const result = [];
+  if(flatData){
+    return result;
+  }
+  flatData.forEach(item => {
+    map[item.id] = { ...item, children: [] };
+  });
+  flatData.forEach(item => {
+    if (item.parentId === null || !map[item.parentId]) {
+      result.push(map[item.id]);
+    } else {
+      map[item.parentId].children.push(map[item.id]);
+    }
+  });
+  return result;
+};
+// 鑾峰彇鍒楄〃鏁版嵁
+const fetchListData = async () => {
+  loading.value = true;
+  try {
+    const params = {};
+    if (queryParams.name) {
+      params.name = queryParams.name;
+    }
+    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 handleQuery = () => {
+  fetchListData();
+}
+
+// 閲嶇疆鏌ヨ
+const resetQuery = () => {
+  queryParams.name = '';
+  fetchListData();
+}
+
+// 鍔犺浇璁惧鍒楄〃锛堝湪鎵撳紑寮规鏃惰皟鐢級
+const loadDeviceName = async () => {
+  try {
+    const { data } = await getDeviceLedger();
+    deviceOptions.value = data || [];
+  } catch (error) {
+    ElMessage.error('鑾峰彇璁惧鍒楄〃澶辫触');
+  }
+};
+
+// 鏂板鍒嗙被
+const addCategory = async () => {
+  await loadDeviceName();
+  form.id = '';
+  form.name = '';
+  form.sparePartsNo = '';
+  form.status = '';
+  form.description = '';
+  form.deviceLedgerIds = [];
+  form.price = null;
+  operationType.value = 'add'
+  dialogVisible.value = true;
+};
+
+// 缂栬緫鍒嗙被
+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;
+};
+
+// 鍒犻櫎鍒嗙被
+const deleteCategory = async (id) => {
+  try {
+    await ElMessageBox.confirm('姝ゆ搷浣滃皢姘镐箙鍒犻櫎璇ュ垎绫伙紝鏄惁缁х画?', '鎻愮ず', {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning'
+    });
+    loading.value = true;
+    const res = await delSparePart(id);
+    if (res.code === 200) {
+      ElMessage.success('鍒犻櫎鎴愬姛');
+      fetchListData();
+    } else {
+      ElMessage.error(res.message || '鍒犻櫎澶辫触');
+    }
+  } catch (error) {
+    if (error !== 'cancel') {
+      ElMessage.error('鍒犻櫎澶辫触');
+    }
+  } finally {
+    loading.value = false;
+  }
+};
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = async () => {
+  if (!formRef.value) return;
+  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(submitData);
+      if (res.code === 200) {
+        ElMessage.success('缂栬緫鎴愬姛');
+        dialogVisible.value = false;
+        fetchListData();
+      }
+    } else {
+      let res = await addSparePart(submitData);
+      if (res.code === 200) {
+        ElMessage.success('鏂板鎴愬姛');
+        dialogVisible.value = false;
+        fetchListData();
+      }
+    }
+  } catch (error) {
+    ElMessage.error('璇峰~鍐欏畬鏁磋〃鍗曚俊鎭�');
+  } finally {
+    formLoading.value = false;
+  }
+};
+
+// 缁勪欢鎸傝浇鏃惰幏鍙栧垪琛ㄦ暟鎹�
+onMounted(() => {
+  fetchListData();
+});
+</script>
+
+<style scoped>
+.spare-part-category {
+  padding: 20px;
+}
+.search_form {
+	display: flex;
+	align-items: flex-start;
+	justify-content: space-between;
+}
+.table_list {
+  margin-top: unset;
+}
+
+.el-table__header-wrapper th {
+  background-color: #f5f7fa;
+  font-weight: 600;
+}
+
+.el-table__row:hover > td {
+  background-color: #fafafa;
+}
+
+/* 鎸夐挳缁勬牱寮� */
+.actions > div {
+  display: flex;
+  gap: 10px;
+}
+
+/* 纭繚琛ㄦ牸涓殑鎿嶄綔鎸夐挳涓嶄細琚埅鏂� */
+.el-table-column--fixed-right .el-button {
+  margin: 0 2px;
+}
+
+/* 鏍戝舰鑺傜偣鍐呭鏍峰紡 */
+.nested-tree .el-tree-node__expand-icon {
+  font-size: 12px;
+  margin-right: 4px;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3