From 0b828f262887aeb1f3c0278baf351a54ea60e288 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期四, 15 一月 2026 17:31:37 +0800
Subject: [PATCH] 同步华玺 代码
---
src/views/equipmentManagement/spareParts/index.vue | 351 +++++++++++++++++++++++++++++++---------------------------
1 files changed, 187 insertions(+), 164 deletions(-)
diff --git a/src/views/equipmentManagement/spareParts/index.vue b/src/views/equipmentManagement/spareParts/index.vue
index f18c84c..f91d76f 100644
--- a/src/views/equipmentManagement/spareParts/index.vue
+++ b/src/views/equipmentManagement/spareParts/index.vue
@@ -1,55 +1,48 @@
<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="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="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="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="description" label="鎻忚堪" width="150"></el-table-column>
- <el-table-column label="鎿嶄綔" width="150" fixed="right" align="center">
+ <el-table-column prop="description" label="鎻忚堪" win-width="330"></el-table-column>
+ <el-table-column label="鎿嶄綔" width="180" fixed="right">
<template #default="{ row }">
<el-button
- link
- type="primary"
+ type="text"
+ size="small"
@click="() => editCategory(row)"
:disabled="loading"
>
缂栬緫
</el-button>
<el-button
- link
+ type="text"
+ size="small"
@click="() => deleteCategory(row.id)"
style="color: #f56c6c;"
:disabled="loading"
@@ -62,28 +55,10 @@
</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-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">
@@ -95,15 +70,17 @@
<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 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>
</el-form>
<template #footer>
@@ -119,8 +96,7 @@
<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";
+import { getSparePartsList, addSparePart, editSparePart, delSparePart,getSparePartsTree } from "@/api/equipmentManagement/spareParts";
// 鍔犺浇鐘舵��
const loading = ref(false);
@@ -135,14 +111,8 @@
// 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:'',
@@ -150,34 +120,19 @@
sparePartsNo: '',
status: '',
description: '',
- deviceLedgerIds: [],
- price: null
+ parentId: 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();
- }
- }
- }
]
});
// 鑾峰彇缂╄繘閲�
@@ -204,80 +159,54 @@
});
return result;
};
-// 鑾峰彇鍒楄〃鏁版嵁
-const fetchListData = async () => {
- loading.value = true;
+//鑾峰彇鏍戝舰缁撴瀯
+const fetchTreeData = async () => {
+ fetchCategories();
try {
- const params = {};
- if (queryParams.name) {
- params.name = queryParams.name;
- }
- const res = await getSparePartsList(params);
+ const res = await getSparePartsTree();
if (res.code === 200) {
- renderTableData.value = res.data.records || [];
- categories.value = res.data.records || [];
+ renderTableData.value = res.data;
+ } else {
+ ElMessage.error(res.message || '鑾峰彇鍒嗙被鍒楄〃澶辫触');
}
- } catch (error) {
- loading.value = false;
- } finally {
- loading.value = false;
+ }catch (error) {
+ ElMessage.error('鑾峰彇鍒嗙被鍒楄〃澶辫触');
}
}
-// 鏌ヨ
-const handleQuery = () => {
- fetchListData();
-}
-
-// 閲嶇疆鏌ヨ
-const resetQuery = () => {
- queryParams.name = '';
- fetchListData();
-}
-
-// 鍔犺浇璁惧鍒楄〃锛堝湪鎵撳紑寮规鏃惰皟鐢級
-const loadDeviceName = async () => {
+// 鑾峰彇鍒嗙被鍒楄〃
+const fetchCategories = async () => {
+ loading.value = true;
try {
- const { data } = await getDeviceLedger();
- deviceOptions.value = data || [];
+ const res = await getSparePartsList();
+ if (res.code === 200) {
+ categories.value = res.data.records;
+ } else {
+ ElMessage.error(res.message || '鑾峰彇鍒嗙被鍒楄〃澶辫触');
+ }
} catch (error) {
- ElMessage.error('鑾峰彇璁惧鍒楄〃澶辫触');
+ ElMessage.error('鑾峰彇鍒嗙被鍒楄〃澶辫触');
+ } finally {
+ loading.value = false;
}
};
// 鏂板鍒嗙被
-const addCategory = async () => {
- await loadDeviceName();
+const addCategory = () => {
form.id = '';
form.name = '';
form.sparePartsNo = '';
form.status = '';
form.description = '';
- form.deviceLedgerIds = [];
- form.price = null;
+ form.parentId = null;
operationType.value = 'add'
dialogVisible.value = true;
+ console.log('dialogVisible 鏇存柊涓�', dialogVisible.value);
};
// 缂栬緫鍒嗙被
-const editCategory = async (row) => {
- await loadDeviceName();
+const editCategory = (row) => {
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;
};
@@ -294,7 +223,7 @@
const res = await delSparePart(id);
if (res.code === 200) {
ElMessage.success('鍒犻櫎鎴愬姛');
- fetchListData();
+ fetchTreeData();
} else {
ElMessage.error(res.message || '鍒犻櫎澶辫触');
}
@@ -313,31 +242,19 @@
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);
+ let res = await editSparePart(form);
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;
- fetchListData();
- }
- } else {
- let res = await addSparePart(submitData);
- if (res.code === 200) {
- ElMessage.success('鏂板鎴愬姛');
- dialogVisible.value = false;
- fetchListData();
+ fetchTreeData();
}
}
} catch (error) {
@@ -347,9 +264,10 @@
}
};
-// 缁勪欢鎸傝浇鏃惰幏鍙栧垪琛ㄦ暟鎹�
+// 缁勪欢鎸傝浇鏃惰幏鍙栧垎绫诲垪琛�
onMounted(() => {
- fetchListData();
+ fetchCategories();
+ fetchTreeData();
});
</script>
@@ -357,13 +275,43 @@
.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 {
@@ -373,6 +321,22 @@
.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;
}
/* 鎸夐挳缁勬牱寮� */
@@ -391,4 +355,63 @@
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