From f9114ffadfab1c01198dd980c3afb66d0c44a5ea Mon Sep 17 00:00:00 2001
From: zzw <228544128@qq.com>
Date: 星期二, 06 十月 2026 18:22:00 +0800
Subject: [PATCH] fix: limit equipment picker to selected X number

---
 emergency-repair-web/src/views/system/TreeManage.vue |   54 +++++++++++++++++++++++++-----------------------------
 1 files changed, 25 insertions(+), 29 deletions(-)

diff --git a/emergency-repair-web/src/views/system/TreeManage.vue b/emergency-repair-web/src/views/system/TreeManage.vue
index efba783..8cbaf53 100644
--- a/emergency-repair-web/src/views/system/TreeManage.vue
+++ b/emergency-repair-web/src/views/system/TreeManage.vue
@@ -3,7 +3,7 @@
     <div class="page-title">
       <div>
         <h2>{{ isProduct ? '浜у搧缁撴瀯鏍戠鐞�' : '璁惧鍩虹搴撶鐞�' }}</h2>
-        <p>{{ isProduct ? '鍨嬪彿 鈫� X鍙� 鈫� 涓�绾х郴缁� 鈫� 浜岀骇绯荤粺 鈫� 璁惧' : '涓�绾х郴缁� 鈫� 浜岀骇绯荤粺 鈫� 璁惧' }}</p>
+        <p>{{ isProduct ? '鍨嬪彿 鈫� rk_X鍙� 鈫� 涓�绾х郴缁� 鈫� 浜岀骇绯荤粺 鈫� 璁惧' : '涓�绾х郴缁� 鈫� 浜岀骇绯荤粺 鈫� 璁惧' }}</p>
       </div>
       <div>
         <el-button icon="el-icon-plus" @click="addRoot">鏂板涓�绾ц妭鐐�</el-button>
@@ -18,7 +18,10 @@
           ref="tree"
           :data="tree"
           node-key="id"
-          default-expand-all
+          v-loading="loading"
+          :lazy="isProduct"
+          :load="loadNode"
+          :default-expand-all="!isProduct"
           highlight-current
           :filter-node-method="filterNode"
           :props="{ label: 'name', children: 'children' }"
@@ -27,7 +30,7 @@
           <span slot-scope="{ data }" class="tree-node">
             <span class="level-badge">{{ levelText(data.nodeLevel) }}</span>
             <span>{{ data.name }}</span>
-            <small>{{ data.code }}</small>
+            <small v-if="!isProduct && data.code">{{ data.code }}</small>
           </span>
         </el-tree>
       </section>
@@ -44,19 +47,14 @@
           <el-form :model="form" label-width="100px">
             <el-form-item label="鑺傜偣灞傜骇"><el-tag type="info">{{ levelText(form.nodeLevel) }}</el-tag></el-form-item>
             <el-form-item label="鍚嶇О"><el-input v-model="form.name"></el-input></el-form-item>
-            <el-form-item label="缂栫爜"><el-input v-model="form.code"></el-input></el-form-item>
+            <el-form-item v-if="!isProduct" label="缂栫爜"><el-input v-model="form.code"></el-input></el-form-item>
             <el-form-item v-if="isProduct" label="鑺傜偣绫诲瀷">
               <el-select v-model="form.nodeType" :disabled="form.nodeLevel < 5" style="width:100%">
                 <el-option label="鍨嬪彿" value="MODEL"></el-option>
-                <el-option label="X鍙�" value="X_NO"></el-option>
+                <el-option label="rk_X鍙�" value="X_NO"></el-option>
                 <el-option label="涓�绾х郴缁�" value="SYSTEM1"></el-option>
                 <el-option label="浜岀骇绯荤粺" value="SYSTEM2"></el-option>
                 <el-option label="璁惧" value="DEVICE"></el-option>
-              </el-select>
-            </el-form-item>
-            <el-form-item v-if="isProduct && form.nodeLevel === 5" label="鍩虹璁惧">
-              <el-select v-model="form.baseEquipmentId" filterable placeholder="鍏宠仈璁惧鍩虹搴撹澶�" style="width:100%">
-                <el-option v-for="item in baseDevices" :key="item.id" :label="item.path + ' / ' + item.name" :value="item.id"></el-option>
               </el-select>
             </el-form-item>
             <el-form-item label="鎺掑簭"><el-input-number v-model="form.sortNo" :min="1" style="width:180px"></el-input-number></el-form-item>
@@ -77,12 +75,12 @@
     treeType: { type: String, required: true }
   },
   data() {
-    return { tree: [], keyword: '', form: {}, saving: false, baseDevices: [] }
+    return { tree: [], keyword: '', form: {}, saving: false, loading: false }
   },
   computed: {
     isProduct() { return this.treeType === 'product' },
     maxLevel() { return this.isProduct ? 5 : 3 },
-    levelNames() { return this.isProduct ? ['鍨嬪彿', 'X鍙�', '涓�绾х郴缁�', '浜岀骇绯荤粺', '璁惧'] : ['涓�绾х郴缁�', '浜岀骇绯荤粺', '璁惧'] }
+    levelNames() { return this.isProduct ? ['鍨嬪彿', 'rk_X鍙�', '涓�绾х郴缁�', '浜岀骇绯荤粺', '璁惧'] : ['涓�绾х郴缁�', '浜岀骇绯荤粺', '璁惧'] }
   },
   watch: {
     keyword(value) { this.$refs.tree && this.$refs.tree.filter(value) },
@@ -91,7 +89,20 @@
   created() { this.load() },
   methods: {
     load() {
-      api.get('/system/tree', { params: { type: this.treeType } }).then(res => { this.tree = res.data || [] })
+      this.loading = true
+      const request = this.isProduct
+        ? api.get('/system/tree/product/roots')
+        : api.get('/system/tree', { params: { type: this.treeType } })
+      request.then(res => { this.tree = res.data || [] }).finally(() => { this.loading = false })
+    },
+    loadNode(node, resolve) {
+      if (!this.isProduct || !node || !node.data || !node.data.id) {
+        resolve([])
+        return
+      }
+      api.get('/system/tree/product/children', { params: { parentId: node.data.id } })
+        .then(res => resolve(res.data || []))
+        .catch(() => resolve([]))
     },
     levelText(level) { return this.levelNames[(level || 1) - 1] || ('绗�' + level + '绾�') },
     filterNode(value, data) {
@@ -100,31 +111,16 @@
     },
     selectNode(node) {
       this.form = { ...node }
-      if (this.isProduct && node.nodeLevel === 5) this.loadBaseDevices()
     },
     nodeTypeForLevel(level) {
       return this.isProduct ? ['MODEL', 'X_NO', 'SYSTEM1', 'SYSTEM2', 'DEVICE'][level - 1] : 'BASE_' + level
     },
     addRoot() {
       this.form = { parentId: 0, nodeLevel: 1, nodeType: this.nodeTypeForLevel(1), name: '', code: '', sortNo: 1, remark: '' }
-      if (this.isProduct) this.form.baseEquipmentId = null
     },
     addChild() {
       const level = (this.form.nodeLevel || 1) + 1
-      this.form = { parentId: this.form.id, nodeLevel: level, nodeType: this.nodeTypeForLevel(level), name: '', code: '', sortNo: 1, remark: '', baseEquipmentId: null }
-      if (this.isProduct && level === 5) this.loadBaseDevices()
-    },
-    loadBaseDevices() {
-      api.get('/system/tree', { params: { type: 'base' } }).then(res => { this.baseDevices = this.flattenBase(res.data || [], []) })
-    },
-    flattenBase(nodes, parents) {
-      const result = []
-      nodes.forEach(node => {
-        const path = parents.concat(node.name)
-        if (node.nodeLevel === 3) result.push({ ...node, path: path.slice(0, -1).join(' / ') })
-        if (node.children) result.push(...this.flattenBase(node.children, path))
-      })
-      return result
+      this.form = { parentId: this.form.id, nodeLevel: level, nodeType: this.nodeTypeForLevel(level), name: '', code: '', sortNo: 1, remark: '' }
     },
     save() {
       if (!this.form.name) return this.$message.warning('璇疯緭鍏ヨ妭鐐瑰悕绉�')

--
Gitblit v1.9.1