From e9353e9639ac50735713eb85a8fe0ef7e06afa4f Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期一, 10 三月 2025 13:41:25 +0800
Subject: [PATCH] 1、产品和设备结构树选择节点时可以连续点击相同节点且不会取消选中当前节点 2、产品结构树接口调整,产品结构树节点实体信息通过点击后调取接口获取(仍有bug,点击一次会出现多次重复请求)

---
 src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue |  509 ++++++++++++++++++++++++++++----------------------------
 1 files changed, 256 insertions(+), 253 deletions(-)

diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
index 1a8ebdf..97b73a0 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
@@ -63,63 +63,65 @@
 </template>
 
 <script>
-  import dncApi from '@/api/dnc'
-  import { deleteAction } from '@/api/manage'
-  import ProductStructureTreeContextMenu from './ProductStructureTreeContextMenu'
-  import ProductModal from './Product/ProductModal'
-  import ComponentModal from './Component/ComponentModal'
-  import PartModal from './Part/PartModal'
-  import ProcessSpecVersionModal from './ProcessSpecVersion/ProcessSpecVersionModal'
-  import ProcessModal from './Process/ProcessModal'
-  import ProcessStepModal from './ProcessStep/ProcessStepModal'
-  import AssignPermissionModal from './Permission/AssignPermissionModal'
+import dncApi from '@/api/dnc'
+import { deleteAction } from '@/api/manage'
+import ProductStructureTreeContextMenu from './ProductStructureTreeContextMenu'
+import ProductModal from './Product/ProductModal'
+import ComponentModal from './Component/ComponentModal'
+import PartModal from './Part/PartModal'
+import ProcessSpecVersionModal from './ProcessSpecVersion/ProcessSpecVersionModal'
+import ProcessModal from './Process/ProcessModal'
+import ProcessStepModal from './ProcessStep/ProcessStepModal'
+import AssignPermissionModal from './Permission/AssignPermissionModal'
 
-  export default {
-    name: 'ProductStructureTree',
-    components: {
-      AssignPermissionModal,
-      ProcessStepModal,
-      ProcessModal,
-      ProcessSpecVersionModal,
-      PartModal,
-      ComponentModal,
-      ProductModal,
-      ProductStructureTreeContextMenu
-    },
-    data() {
-      return {
-        searchInput: '',
-        cardLoading: false,
-        loading: false,
-        treeDataSource: [],
-        selectedKeys: [],
-        expandedKeys: [],
-        beforeSearchExpandedKeys: [],
-        searchValue: '',
-        dataList: [],
-        autoExpandParent: true,
-        checkStrictly: true,
-        allTreeKeys: [],
-        currentSelected: {},
-        rightClickSelected: {},
-        url: {
-          delete: '/nc/product/delete'
-        }
+export default {
+  name: 'ProductStructureTree',
+  components: {
+    AssignPermissionModal,
+    ProcessStepModal,
+    ProcessModal,
+    ProcessSpecVersionModal,
+    PartModal,
+    ComponentModal,
+    ProductModal,
+    ProductStructureTreeContextMenu
+  },
+  data() {
+    return {
+      searchInput: '',
+      cardLoading: false,
+      loading: false,
+      treeDataSource: [],
+      selectedKeys: [],
+      expandedKeys: [],
+      beforeSearchExpandedKeys: [],
+      searchValue: '',
+      dataList: [],
+      autoExpandParent: true,
+      checkStrictly: true,
+      allTreeKeys: [],
+      currentSelected: {},
+      rightClickSelected: {},
+      url: {
+        delete: '/nc/product/delete'
       }
-    },
-    created() {
-      this.getTreeDataByApi()
-      this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
-    },
-    methods: {
-      getTreeDataByApi() {
-        this.loading = true
-        this.cardLoading = true
-        dncApi.getProductStructureTreeApi().then(res => {
+    }
+  },
+  created() {
+    this.getTreeDataByApi()
+    this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
+  },
+  methods: {
+    getTreeDataByApi() {
+      this.loading = true
+      this.cardLoading = true
+      dncApi.getProductStructureTreeApi()
+        .then(res => {
           if (res.success) {
+            console.log('res=================', res)
             this.dataList = []
             this.allTreeKeys = []
-            this.treeDataSource = res.list
+            this.treeDataSource = res.result
             this.generateList(this.treeDataSource)
             // this.expandedKeys = this.allTreeKeys
             if (this.expandedKeys.length === 0) this.expandedKeys = this.beforeSearchExpandedKeys = [this.treeDataSource[0].id]
@@ -127,239 +129,240 @@
             this.$message.warn(res.message)
           }
         }).finally(() => {
-          this.loading = false
-          this.cardLoading = false
-        })
-      },
+        this.loading = false
+        this.cardLoading = false
+      })
+    },
 
-      /**
-       * 鏍戣妭鐐归�変腑鏃惰Е鍙�
-       * @param selectedKeys 閫変腑鑺傜偣key
-       * @param {node} node 鑺傜偣瀵硅薄
-       */
-      handleTreeSelect(selectedKeys, { node }) {
-        let record = node.dataRef
-        this.currentSelected = Object.assign({}, record)
-        this.selectedKeys = selectedKeys
-        // 鍚戝彸渚х埗绾х粍浠跺彂閫佸綋鍓嶉�変腑鏍戣妭鐐逛俊鎭�
-        this.$bus.$emit('sendCurrentTreeNodeInfo', this.currentSelected)
-      },
+    /**
+     * 鏍戣妭鐐归�変腑鏃惰Е鍙�
+     * @param selectedKeys 閫変腑鑺傜偣key
+     * @param {node} node 鑺傜偣瀵硅薄
+     */
+    handleTreeSelect(selectedKeys, { node }) {
+      let record = node.dataRef
+      this.currentSelected = Object.assign({}, record)
+      // 鍚戝彸渚х埗绾х粍浠跺彂閫佸綋鍓嶉�変腑鏍戣妭鐐逛俊鎭�
+      this.$bus.$emit('sendCurrentTreeNodeInfo', this.currentSelected)
+      if (selectedKeys.length === 0) return
+      this.selectedKeys = selectedKeys
+    },
 
-      /**
-       * 鏍戣妭鐐瑰彸閿崟鍑昏妭鐐规椂瑙﹀彂
-       * @param event 浜嬩欢瀵硅薄
-       * @param node 鑺傜偣瀵硅薄
-       */
-      handleTreeRightClick({ event, node }) {
-        const record = node.dataRef
-        this.rightClickSelected = Object.assign({}, record)
-      },
+    /**
+     * 鏍戣妭鐐瑰彸閿崟鍑昏妭鐐规椂瑙﹀彂
+     * @param event 浜嬩欢瀵硅薄
+     * @param node 鑺傜偣瀵硅薄
+     */
+    handleTreeRightClick({ event, node }) {
+      const record = node.dataRef
+      this.rightClickSelected = Object.assign({}, record)
+    },
 
-      // 鏍戣妭鐐瑰彸閿崟鍑昏彍鍗曚腑鍒犻櫎鎸夐挳鏃惰Е鍙�
-      handleDelete() {
-        const that = this
-        const { rightClickSelected: { id, type }, $confirm, url, $notification } = that
-        $confirm({
-          title: '鎻愮ず',
-          content: '纭鍒犻櫎姝ゆ潯璁板綍鍚楋紵',
-          okText: '纭',
-          okType: 'danger',
-          cancelText: '鍙栨秷',
-          onOk: () => {
-            if (!url.delete) {
-              this.$message.error('璇疯缃畊rl.delete灞炴��!')
-              return
-            }
-            deleteAction(url.delete + `/${id}/${type}`)
-              .then((res) => {
-                if (res.success) {
-                  that.getTreeDataByApi()
-                  $notification.success({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                } else {
-                  $notification.warning({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                }
-              })
-              .finally(() => {
-                that.$destroyAll()
-              })
-          },
-          onCancel: () => {
-            that.$destroyAll()
+    // 鏍戣妭鐐瑰彸閿崟鍑昏彍鍗曚腑鍒犻櫎鎸夐挳鏃惰Е鍙�
+    handleDelete() {
+      const that = this
+      const { rightClickSelected: { id, type }, $confirm, url, $notification } = that
+      $confirm({
+        title: '鎻愮ず',
+        content: '纭鍒犻櫎姝ゆ潯璁板綍鍚楋紵',
+        okText: '纭',
+        okType: 'danger',
+        cancelText: '鍙栨秷',
+        onOk: () => {
+          if (!url.delete) {
+            this.$message.error('璇疯缃畊rl.delete灞炴��!')
+            return
           }
-        })
-      },
-
-      /**
-       * 鑷姩灞曞紑娣诲姞涓嬬骇鑺傜偣鐨勭埗鑺傜偣
-       */
-      modalFormSubmitSuccess(isAddNextLevel) {
-        // 鍒ゆ柇鏄惁涓烘坊鍔犱笅绾у苟涓斿垽鏂埗鑺傜偣鏄惁灞曞紑
-        if (isAddNextLevel && !this.expandedKeys.includes(this.rightClickSelected.id)) this.expandedKeys.push(this.rightClickSelected.id)
-        this.getTreeDataByApi()
-      },
-
-      /**
-       * 鏍戣妭鐐瑰睍寮�鍚堝苟鏃惰Е鍙�
-       * @param expandedKeys 灞曞紑椤筴ey
-       */
-      handleTreeExpand(expandedKeys) {
-        this.expandedKeys = this.beforeSearchExpandedKeys = expandedKeys
-        this.autoExpandParent = false
-      },
-
-      /* 杈撳叆鏌ヨ鍐呭鍙樺寲鏃惰Е鍙� */
-      handleSearchInputChange() {
-        let search = this.searchInput
-        let expandedKeys
-        let autoExpandParent
-        if (search !== '') {
-          expandedKeys = this.dataList
-            .map(item => {
-              if (item.title != null) {
-                if (item.title.indexOf(search) > -1) {
-                  return this.getParentKey(item.key, this.treeDataSource)
-                }
-                return null
+          deleteAction(url.delete + `/${id}/${type}`)
+            .then((res) => {
+              if (res.success) {
+                that.getTreeDataByApi()
+                $notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              } else {
+                $notification.warning({
+                  message: '娑堟伅',
+                  description: res.message
+                })
               }
             })
-            .filter((item, i, self) => item && self.indexOf(item) === i)
-          autoExpandParent = true
-        } else {
-          expandedKeys = this.beforeSearchExpandedKeys
-          autoExpandParent = false
+            .finally(() => {
+              that.$destroyAll()
+            })
+        },
+        onCancel: () => {
+          that.$destroyAll()
         }
+      })
+    },
 
-        Object.assign(this, {
-          expandedKeys,
-          searchValue: search,
-          autoExpandParent
-        })
-      },
+    /**
+     * 鑷姩灞曞紑娣诲姞涓嬬骇鑺傜偣鐨勭埗鑺傜偣
+     */
+    modalFormSubmitSuccess(isAddNextLevel) {
+      // 鍒ゆ柇鏄惁涓烘坊鍔犱笅绾у苟涓斿垽鏂埗鑺傜偣鏄惁灞曞紑
+      if (isAddNextLevel && !this.expandedKeys.includes(this.rightClickSelected.id)) this.expandedKeys.push(this.rightClickSelected.id)
+      this.getTreeDataByApi()
+    },
 
-      /**
-       * 閫掑綊鑾峰緱杈撳叆椤圭殑鐖剁骇key
-       * @param key 瀛愰」key
-       * @param tree 瀛愰」
-       */
-      getParentKey(key, tree) {
-        let parentKey
-        for (let i = 0; i < tree.length; i++) {
-          const node = tree[i]
-          if (node.children) {
-            if (node.children.some(item => item.key === key)) {
-              parentKey = node.key
-            } else if (
-              this.getParentKey(key, node.children)) {
-              parentKey = this.getParentKey(key, node.children)
+    /**
+     * 鏍戣妭鐐瑰睍寮�鍚堝苟鏃惰Е鍙�
+     * @param expandedKeys 灞曞紑椤筴ey
+     */
+    handleTreeExpand(expandedKeys) {
+      this.expandedKeys = this.beforeSearchExpandedKeys = expandedKeys
+      this.autoExpandParent = false
+    },
+
+    /* 杈撳叆鏌ヨ鍐呭鍙樺寲鏃惰Е鍙� */
+    handleSearchInputChange() {
+      let search = this.searchInput
+      let expandedKeys
+      let autoExpandParent
+      if (search !== '') {
+        expandedKeys = this.dataList
+          .map(item => {
+            if (item.title != null) {
+              if (item.title.indexOf(search) > -1) {
+                return this.getParentKey(item.key, this.treeDataSource)
+              }
+              return null
             }
+          })
+          .filter((item, i, self) => item && self.indexOf(item) === i)
+        autoExpandParent = true
+      } else {
+        expandedKeys = this.beforeSearchExpandedKeys
+        autoExpandParent = false
+      }
+
+      Object.assign(this, {
+        expandedKeys,
+        searchValue: search,
+        autoExpandParent
+      })
+    },
+
+    /**
+     * 閫掑綊鑾峰緱杈撳叆椤圭殑鐖剁骇key
+     * @param key 瀛愰」key
+     * @param tree 瀛愰」
+     */
+    getParentKey(key, tree) {
+      let parentKey
+      for (let i = 0; i < tree.length; i++) {
+        const node = tree[i]
+        if (node.children) {
+          if (node.children.some(item => item.key === key)) {
+            parentKey = node.key
+          } else if (
+            this.getParentKey(key, node.children)) {
+            parentKey = this.getParentKey(key, node.children)
           }
         }
-        return parentKey
-      },
+      }
+      return parentKey
+    },
 
-      /**
-       * 閫掑綊鑾峰緱鎵�鏈夋爲鑺傜偣key
-       * @param data
-       */
-      generateList(data) {
-        for (let i = 0; i < data.length; i++) {
-          data[i].key = data[i].id
-          const node = data[i]
-          const key = node.id
-          const title = node.label
-          this.dataList.push({ key, title })
-          this.allTreeKeys.push(key)
-          this.setTreeNodeIcon(node)
-          if (node.children) this.generateList(node.children)
-        }
-      },
+    /**
+     * 閫掑綊鑾峰緱鎵�鏈夋爲鑺傜偣key
+     * @param data
+     */
+    generateList(data) {
+      for (let i = 0; i < data.length; i++) {
+        data[i].key = data[i].id
+        const node = data[i]
+        const key = node.id
+        const title = node.label
+        this.dataList.push({ key, title })
+        this.allTreeKeys.push(key)
+        this.setTreeNodeIcon(node)
+        if (node.children) this.generateList(node.children)
+      }
+    },
 
-      triggerCorrespondingMethod({ methodName }) {
-        if (this[methodName]) this[methodName]()
-      },
+    triggerCorrespondingMethod({ methodName }) {
+      if (this[methodName]) this[methodName]()
+    },
 
-      /**
-       * 璁剧疆鏍戣妭鐐瑰浘鏍�
-       * @param treeNode
-       */
-      setTreeNodeIcon(treeNode) {
-        switch (treeNode.type) {
-          case 1:
-            treeNode.slots = { icon: 'product' }
-            break
-          case 2:
-            treeNode.slots = { icon: 'component' }
-            break
-          case 3:
-            treeNode.slots = { icon: 'part' }
-            break
-          case 4:
-            treeNode.slots = { icon: 'processSpecVersion' }
-            break
-          case 5:
-            treeNode.slots = { icon: 'process' }
-            break
-          case 6:
-            treeNode.slots = { icon: 'processStep' }
-            break
-          default:
-        }
+    /**
+     * 璁剧疆鏍戣妭鐐瑰浘鏍�
+     * @param treeNode
+     */
+    setTreeNodeIcon(treeNode) {
+      switch (treeNode.type) {
+        case 1:
+          treeNode.slots = { icon: 'product' }
+          break
+        case 2:
+          treeNode.slots = { icon: 'component' }
+          break
+        case 3:
+          treeNode.slots = { icon: 'part' }
+          break
+        case 4:
+          treeNode.slots = { icon: 'processSpecVersion' }
+          break
+        case 5:
+          treeNode.slots = { icon: 'process' }
+          break
+        case 6:
+          treeNode.slots = { icon: 'processStep' }
+          break
+        default:
       }
     }
   }
+}
 </script>
 
 <style lang="less" scoped>
-  /deep/ .ant-card-body {
-    padding: 0 12px 0 0;
-  }
+/deep/ .ant-card-body {
+  padding: 0 12px 0 0;
+}
 
-  /deep/ .ant-card-body, /deep/ .ant-spin-nested-loading, /deep/ .ant-spin-container {
-    height: 100%;
-  }
+/deep/ .ant-card-body, /deep/ .ant-spin-nested-loading, /deep/ .ant-spin-container {
+  height: 100%;
+}
 
-  /deep/ .ant-tree-title, .ant-tree-title .ant-dropdown-trigger {
-    display: inline-block;
-    width: calc(100% - 24px) !important;
-  }
+/deep/ .ant-tree-title, .ant-tree-title .ant-dropdown-trigger {
+  display: inline-block;
+  width: calc(100% - 24px) !important;
+}
 
-  ::-webkit-scrollbar {
-    width: 8px;
-  }
+::-webkit-scrollbar {
+  width: 8px;
+}
 
-  @media screen and (min-width: 1920px) {
-    .tree_con {
-      height: 748px !important;
-    }
+@media screen and (min-width: 1920px) {
+  .tree_con {
+    height: 748px !important;
   }
+}
 
-  @media screen and (min-width: 1680px) and (max-width: 1920px) {
-    .tree_con {
-      height: 748px !important;
-    }
+@media screen and (min-width: 1680px) and (max-width: 1920px) {
+  .tree_con {
+    height: 748px !important;
   }
+}
 
-  @media screen and (min-width: 1400px) and (max-width: 1680px) {
-    .tree_con {
-      height: 600px !important;
-    }
+@media screen and (min-width: 1400px) and (max-width: 1680px) {
+  .tree_con {
+    height: 600px !important;
   }
+}
 
-  @media screen and (min-width: 1280px) and (max-width: 1400px) {
-    .tree_con {
-      height: 501px !important;
-    }
+@media screen and (min-width: 1280px) and (max-width: 1400px) {
+  .tree_con {
+    height: 501px !important;
   }
+}
 
-  @media screen and (max-width: 1280px) {
-    .tree_con {
-      height: 501px !important;
-    }
+@media screen and (max-width: 1280px) {
+  .tree_con {
+    height: 501px !important;
   }
+}
 </style>

--
Gitblit v1.9.3