From 28fcbc85bcb8be593f57cbf232968c30d31e8e86 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期二, 18 三月 2025 10:36:48 +0800
Subject: [PATCH] 1、DNC结构树页面解决因keep-alive标签缓存组件后切换路由无法正常销毁组件从而使组件内事件通过$bus重复调用的问题 2、DNC产品结构树页面工艺规程版本层级下可以导入和挂载其它文档并且展示相关属性信息 3、DNC设备结构树设备的层级由2调整到7并且调整层级影响的相关功能

---
 src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue                      |    4 
 src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue           |    3 
 src/views/dnc/base/modules/DeviceStructure/DeviceStructureTreeContextMenu.vue             |    4 
 src/views/dnc/base/modules/DeviceStructure/Document/HasReceivedDocumentTableList.vue      |    7 
 src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionInfo.vue |   36 ++
 src/views/dnc/base/modules/DeviceStructure/Document/HasSentDocumentTableList.vue          |    7 
 src/api/dnc.js                                                                            |    2 
 src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue    |    2 
 src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue                   |   26 +
 src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue                     |  715 +++++++++++++++++++++++++-------------------------
 src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue                        |    5 
 src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue                |   11 
 src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue                        |    4 
 src/views/dnc/common/DocumentInfo.vue                                                     |   12 
 14 files changed, 459 insertions(+), 379 deletions(-)

diff --git a/src/api/dnc.js b/src/api/dnc.js
index 4875d2a..7945af3 100644
--- a/src/api/dnc.js
+++ b/src/api/dnc.js
@@ -28,7 +28,7 @@
   // 鎸囨淳鏂囨。鍒拌澶�
   assignDocumentToDeviceApi: params => postAction('/nc/activit/assign/file/apply', params),
   // 涓嬭浇鏂囨。
-  downloadDocumentApi: ({ docId, docName }) => downloadFile(`/nc/doc/download/${docId}`, docName),
+  downloadDocumentApi: ({ docId, docName }) => requestGetDownLoad(`/nc/doc/download/${docId}`, docName),
   // 鍒犻櫎鏂囨。
   deleteDocumentApi: docId => deleteAction(`/nc/doc/delete?id=${docId}`),
   // 鏂囨。鍑哄簱
diff --git a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue
index 3014644..259d088 100644
--- a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue
@@ -3,12 +3,12 @@
     <template v-if="+currentTreeNodeInfo.type===2">
       <div style="height: 100%;max-height: 748px">
         <!--浜у搧缁撴瀯鏍戝彸渚ч《閮ㄥ尯鍩�-->
-        <div style="height: 45%;overflow: hidden">
+        <div style="height: 55%;overflow: hidden">
           <DeviceStructureMainTop :size="containerSize" ref="mainTopRef" :currentTreeNodeInfo="currentTreeNodeInfo"/>
         </div>
 
         <!--浜у搧缁撴瀯鏍戝彸渚у簳閮ㄥ尯鍩�-->
-        <div style="height: 55%;overflow: hidden">
+        <div style="height: 45%;overflow: hidden">
           <DeviceStructureMainBottom :size="containerSize" :currentTreeNodeInfo="currentTreeNodeInfo"/>
         </div>
       </div>
diff --git a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue
index cfaa481..bdca851 100644
--- a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue
@@ -4,11 +4,13 @@
             v-if="Object.keys(currentTreeNodeInfo).length!==0">
       <a-tab-pane :key="1" tab="鍙戦��">
         <HasSentDocumentTableList ref="hasSentDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
+                                  :currentTypeOfDevice="currentTypeOfDevice"
                                   @handleTableContextMenuOpen="handleTableContextMenuOpen" :size="tableContainerSize"/>
       </a-tab-pane>
 
       <a-tab-pane :key="2" tab="鎺ユ敹">
         <HasReceivedDocumentTableList ref="hasReceivedDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
+                                      :currentTypeOfDevice="currentTypeOfDevice"
                                       @handleTableContextMenuOpen="handleTableContextMenuOpen"
                                       :size="tableContainerSize"/>
       </a-tab-pane>
@@ -22,403 +24,408 @@
 </template>
 
 <script>
-  import dncApi from '@/api/dnc'
-  import TableContextMenu from '../../../common/TableContextMenu'
-  import HasSentDocumentTableList from './Document/HasSentDocumentTableList'
-  import HasReceivedDocumentTableList from './Document/HasReceivedDocumentTableList'
-  import DocumentBatchDeleteModal from '../../../common/DocumentBatchDeleteModal'
+import dncApi from '@/api/dnc'
+import TableContextMenu from '../../../common/TableContextMenu'
+import HasSentDocumentTableList from './Document/HasSentDocumentTableList'
+import HasReceivedDocumentTableList from './Document/HasReceivedDocumentTableList'
+import DocumentBatchDeleteModal from '../../../common/DocumentBatchDeleteModal'
 
-  export default {
-    name: 'DeviceStructureMainTop',
-    components: { DocumentBatchDeleteModal, HasReceivedDocumentTableList, HasSentDocumentTableList, TableContextMenu },
-    props: {
-      currentTreeNodeInfo: {
-        type: Object
-      }
+export default {
+  name: 'DeviceStructureMainTop',
+  components: { DocumentBatchDeleteModal, HasReceivedDocumentTableList, HasSentDocumentTableList, TableContextMenu },
+  props: {
+    currentTreeNodeInfo: {
+      type: Object
+    }
+  },
+  data() {
+    return {
+      activeTabKey: 1,
+      tableContainerSize: 'small',
+      currentTypeOfDevice: 7,// 浜у搧缁撴瀯鏍戜腑瀹氫箟鐨勮澶囧眰绾ype涓�7
+      currentRightClickedTableRowInfo: {},
+      hasLoadedDataTabKeyArray: []
+    }
+  },
+  created() {
+    this.$bus.$on('reloadDocumentListData', this.reloadDocumentListData)
+    this.$bus.$on('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod)
+  },
+  beforeDestroy() {
+    this.$bus.$off('reloadDocumentListData', this.reloadDocumentListData)
+    this.$bus.$off('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod)
+  },
+  methods: {
+    /**
+     * 鎺у埗鍙抽敭鑿滃崟寮�鍚�
+     * @param record 褰撳墠琛ㄦ牸琛屼俊鎭�
+     */
+    handleTableContextMenuOpen(record) {
+      this.currentRightClickedTableRowInfo = Object.assign({}, record)
+      this.$refs.tableContextMenuRef.currentMenuLevel = record.param
+      this.$refs.tableContextMenuRef.menuStyle.top = event.clientY + 'px'
+      this.$refs.tableContextMenuRef.menuStyle.left = event.clientX + 'px'
+      this.$refs.tableContextMenuRef.menuVisible = true
+      document.body.addEventListener('click', this.handleMenuClose)
     },
-    data() {
-      return {
-        activeTabKey: 1,
-        tableContainerSize: 'small',
-        currentRightClickedTableRowInfo: {},
-        hasLoadedDataTabKeyArray: []
-      }
-    },
-    created() {
-      this.$bus.$on('reloadDocumentListData', this.reloadDocumentListData)
-      this.$bus.$on('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod)
-    },
-    methods: {
-      /**
-       * 鎺у埗鍙抽敭鑿滃崟寮�鍚�
-       * @param record 褰撳墠琛ㄦ牸琛屼俊鎭�
-       */
-      handleTableContextMenuOpen(record) {
-        this.currentRightClickedTableRowInfo = Object.assign({}, record)
-        this.$refs.tableContextMenuRef.currentMenuLevel = record.param
-        this.$refs.tableContextMenuRef.menuStyle.top = event.clientY + 'px'
-        this.$refs.tableContextMenuRef.menuStyle.left = event.clientX + 'px'
-        this.$refs.tableContextMenuRef.menuVisible = true
-        document.body.addEventListener('click', this.handleMenuClose)
-      },
 
-      /**
-       * 褰撴爲缁勪欢閫変腑璁惧灞傜骇鑺傜偣鏃惰Е鍙戣幏鍙栧凡鍙戦�佹枃妗e垪琛�
-       * @param treeNodeInfo 鏍戣妭鐐逛俊鎭�
-       */
-      loadHasSentDocumentListData(treeNodeInfo) {
-        this.$nextTick(() => {
-          if (this.$refs.hasSentDocumentTableListRef) {
-            this.$refs.hasSentDocumentTableListRef.loadData(1)
-            this.hasLoadedDataTabKeyArray.push(this.activeTabKey)
-          }
-        })
-      },
-
-      /**
-       * tab鏍囩鍒囨崲鏃惰Е鍙�
-       * @param activeTabKey 褰撳墠宸叉縺娲籺ab鐨刱ey
-       */
-      handleTabChange(activeTabKey) {
-        this.$bus.$emit('handleSwitchDeviceDocClassCode', activeTabKey)
-        if (activeTabKey && !this.hasLoadedDataTabKeyArray.includes(activeTabKey)) {
-          if (activeTabKey === 1) {
-            this.$nextTick(() => {
-              if (this.$refs.hasSentDocumentTableListRef) this.$refs.hasSentDocumentTableListRef.loadData(1)
-            })
-          } else {
-            this.$nextTick(() => {
-              if (this.$refs.hasReceivedDocumentTableListRef) this.$refs.hasReceivedDocumentTableListRef.loadData(1)
-            })
-          }
-          this.hasLoadedDataTabKeyArray.push(activeTabKey)
+    /**
+     * 褰撴爲缁勪欢閫変腑璁惧灞傜骇鑺傜偣鏃惰Е鍙戣幏鍙栧凡鍙戦�佹枃妗e垪琛�
+     * @param treeNodeInfo 鏍戣妭鐐逛俊鎭�
+     */
+    loadHasSentDocumentListData(treeNodeInfo) {
+      this.$nextTick(() => {
+        if (this.$refs.hasSentDocumentTableListRef) {
+          this.$refs.hasSentDocumentTableListRef.loadData(1)
+          this.hasLoadedDataTabKeyArray.push(this.activeTabKey)
         }
-      },
+      })
+    },
 
-      /**
-       * 鏂囨。浠ュ強NC绋嬪簭瀵煎叆/鍑哄簱/鍏ュ簱/鍒犻櫎鎴愬姛鍚庤Е鍙戦噸鏂板姞杞芥枃妗e垪琛�
-       * @param docClassCode 鏂囨。绫诲埆
-       * @param attributionId 鑺傜偣Id
-       */
-      reloadDocumentListData({ docClassCode, attributionId }) {
-        // 濡傛灉涓婁紶鐨勬枃妗d笉鏄墍灞炰簬褰撳墠鎵�灞曠ず鑺傜偣鐨勬枃妗e垯涓嶉噸鏂拌幏鍙栨枃妗e垪琛�
-        if (this.currentTreeNodeInfo.key !== attributionId) return
-        if (docClassCode === 'SEND') {
-          if (this.$refs.hasSentDocumentTableListRef) this.$refs.hasSentDocumentTableListRef.loadData(1)
-        } else {
-          if (this.$refs.hasReceivedDocumentTableListRef) this.$refs.hasReceivedDocumentTableListRef.loadData(1)
-        }
-      },
-
-      // 涓嬭浇褰撳墠鍙抽敭閫変腑鏂囨。
-      handleDownload() {
-        const that = this
-        const { docId, docName } = this.currentRightClickedTableRowInfo
-        dncApi.downloadDocumentApi({ docId, docName })
-          .then(res => {
-            if (res && !res.success) {
-              that.$notification.error({
-                message: '娑堟伅',
-                description: res.message
-              })
-            }
+    /**
+     * tab鏍囩鍒囨崲鏃惰Е鍙�
+     * @param activeTabKey 褰撳墠宸叉縺娲籺ab鐨刱ey
+     */
+    handleTabChange(activeTabKey) {
+      this.$bus.$emit('handleSwitchDeviceDocClassCode', activeTabKey)
+      if (activeTabKey && !this.hasLoadedDataTabKeyArray.includes(activeTabKey)) {
+        if (activeTabKey === 1) {
+          this.$nextTick(() => {
+            if (this.$refs.hasSentDocumentTableListRef) this.$refs.hasSentDocumentTableListRef.loadData(1)
           })
-          .catch(err => {
+        } else {
+          this.$nextTick(() => {
+            if (this.$refs.hasReceivedDocumentTableListRef) this.$refs.hasReceivedDocumentTableListRef.loadData(1)
+          })
+        }
+        this.hasLoadedDataTabKeyArray.push(activeTabKey)
+      }
+    },
+
+    /**
+     * 鏂囨。浠ュ強NC绋嬪簭瀵煎叆/鍑哄簱/鍏ュ簱/鍒犻櫎鎴愬姛鍚庤Е鍙戦噸鏂板姞杞芥枃妗e垪琛�
+     * @param docClassCode 鏂囨。绫诲埆
+     * @param attributionId 鑺傜偣Id
+     */
+    reloadDocumentListData({ docClassCode, attributionId }) {
+      // 濡傛灉涓婁紶鐨勬枃妗d笉鏄墍灞炰簬褰撳墠鎵�灞曠ず鑺傜偣鐨勬枃妗e垯涓嶉噸鏂拌幏鍙栨枃妗e垪琛�
+      if (this.currentTreeNodeInfo.key !== attributionId) return
+      if (docClassCode === 'SEND') {
+        if (this.$refs.hasSentDocumentTableListRef) this.$refs.hasSentDocumentTableListRef.loadData(1)
+      } else {
+        if (this.$refs.hasReceivedDocumentTableListRef) this.$refs.hasReceivedDocumentTableListRef.loadData(1)
+      }
+    },
+
+    // 涓嬭浇褰撳墠鍙抽敭閫変腑鏂囨。
+    handleDownload() {
+      const that = this
+      const { docId, docName } = this.currentRightClickedTableRowInfo
+      dncApi.downloadDocumentApi({ docId, docName })
+        .then(res => {
+          if (res && !res.success) {
             that.$notification.error({
               message: '娑堟伅',
-              description: err.message
+              description: res.message
             })
+          }
+        })
+        .catch(err => {
+          that.$notification.error({
+            message: '娑堟伅',
+            description: err.message
           })
-      },
-
-      // 鍒犻櫎褰撳墠鍙抽敭閫変腑鏂囨。
-      handleDelete() {
-        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
-        const that = this
-        that.$confirm({
-          title: '鎻愮ず',
-          content: `鍒犻櫎鍚庝笉鍙彇娑堬紝纭鍒犻櫎鍚楋紵`,
-          okText: '纭',
-          cancelText: '鍙栨秷',
-          onOk: () => {
-            dncApi.deleteDeviceRelativeDocumentApi({ docId, attributionId })
-              .then((res) => {
-                if (res.success) {
-                  that.$notification.success({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                  that.reloadDocumentListData({ docClassCode: param, attributionId })
-                } else {
-                  that.$notification.warning({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                }
-              })
-              .finally(() => {
-                that.$destroyAll()
-              })
-          },
-          onCancel: () => {
-            that.$destroyAll()
-          }
         })
-      },
+    },
 
-      /**
-       * 鐐瑰嚮鎵归噺鍒犻櫎鍚庡嚭鐜板脊绐�
-       * @param modalTitle 寮圭獥鏍囬
-       */
-      handleBatchRemove(modalTitle) {
-        if (!this.$refs.documentBatchDeleteModalRef) return
-        this.$refs.documentBatchDeleteModalRef.title = modalTitle
-        this.$refs.documentBatchDeleteModalRef.visible = true
-      },
+    // 鍒犻櫎褰撳墠鍙抽敭閫変腑鏂囨。
+    handleDelete() {
+      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
+      const that = this
+      that.$confirm({
+        title: '鎻愮ず',
+        content: `鍒犻櫎鍚庝笉鍙彇娑堬紝纭鍒犻櫎鍚楋紵`,
+        okText: '纭',
+        cancelText: '鍙栨秷',
+        onOk: () => {
+          dncApi.deleteDeviceRelativeDocumentApi({ docId, attributionId })
+            .then((res) => {
+              if (res.success) {
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+                that.reloadDocumentListData({ docClassCode: param, attributionId })
+              } else {
+                that.$notification.warning({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              }
+            })
+            .finally(() => {
+              that.$destroyAll()
+            })
+        },
+        onCancel: () => {
+          that.$destroyAll()
+        }
+      })
+    },
 
-      /**
-       * 鍑哄簱褰撳墠鍙抽敭閫変腑鏂囨。
-       * @param menuLabel
-       */
-      handlePull(menuLabel) {
-        const that = this
-        const { docId, docName, param, attributionId } = this.currentRightClickedTableRowInfo
-        that.$confirm({
-          title: '鎻愮ず',
-          content: `纭${menuLabel}鍚楋紵`,
-          okText: '纭',
-          cancelText: '鍙栨秷',
-          onOk: () => {
-            dncApi.documentOutboundApi({ docId, docName })
-              .then(res => {
-                console.log('res------------------', res)
-                if (res.success) {
-                  this.reloadDocumentListData({ docClassCode: param, attributionId })
-                  that.$notification.success({
-                    message: '娑堟伅',
-                    description: `${menuLabel}鎴愬姛`
-                  })
-                } else {
-                  that.$notification.error({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                }
-              })
-              .catch(err => {
+    /**
+     * 鐐瑰嚮鎵归噺鍒犻櫎鍚庡嚭鐜板脊绐�
+     * @param modalTitle 寮圭獥鏍囬
+     */
+    handleBatchRemove(modalTitle) {
+      if (!this.$refs.documentBatchDeleteModalRef) return
+      this.$refs.documentBatchDeleteModalRef.title = modalTitle
+      this.$refs.documentBatchDeleteModalRef.visible = true
+    },
+
+    /**
+     * 鍑哄簱褰撳墠鍙抽敭閫変腑鏂囨。
+     * @param menuLabel
+     */
+    handlePull(menuLabel) {
+      const that = this
+      const { docId, docName, param, attributionId } = this.currentRightClickedTableRowInfo
+      that.$confirm({
+        title: '鎻愮ず',
+        content: `纭${menuLabel}鍚楋紵`,
+        okText: '纭',
+        cancelText: '鍙栨秷',
+        onOk: () => {
+          dncApi.documentOutboundApi({ docId, docName })
+            .then(res => {
+              console.log('res------------------', res)
+              if (res.success) {
+                this.reloadDocumentListData({ docClassCode: param, attributionId })
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: `${menuLabel}鎴愬姛`
+                })
+              } else {
                 that.$notification.error({
                   message: '娑堟伅',
-                  description: err.message
+                  description: res.message
                 })
+              }
+            })
+            .catch(err => {
+              that.$notification.error({
+                message: '娑堟伅',
+                description: err.message
               })
-              .finally(() => {
-                that.$destroyAll()
-              })
-          },
-          onCancel: () => {
-            that.$destroyAll()
-          }
-        })
-      },
+            })
+            .finally(() => {
+              that.$destroyAll()
+            })
+        },
+        onCancel: () => {
+          that.$destroyAll()
+        }
+      })
+    },
 
-      /**
-       * 鍙戝竷褰撳墠鍙抽敭閫変腑鏂囨。
-       * @param menuLabel
-       */
-      handleCancelPull(menuLabel) {
-        const that = this
-        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
-        that.$confirm({
-          title: '鎻愮ず',
-          content: `纭${menuLabel}鍚楋紵`,
-          okText: '纭',
-          cancelText: '鍙栨秷',
-          onOk: () => {
-            dncApi.documentCancelOutboundApi(docId)
-              .then(res => {
-                if (res.success) {
-                  this.reloadDocumentListData({ docClassCode: param, attributionId })
-                  that.$notification.success({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                } else {
-                  that.$notification.error({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                }
-              })
-              .catch(err => {
+    /**
+     * 鍙戝竷褰撳墠鍙抽敭閫変腑鏂囨。
+     * @param menuLabel
+     */
+    handleCancelPull(menuLabel) {
+      const that = this
+      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
+      that.$confirm({
+        title: '鎻愮ず',
+        content: `纭${menuLabel}鍚楋紵`,
+        okText: '纭',
+        cancelText: '鍙栨秷',
+        onOk: () => {
+          dncApi.documentCancelOutboundApi(docId)
+            .then(res => {
+              if (res.success) {
+                this.reloadDocumentListData({ docClassCode: param, attributionId })
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              } else {
                 that.$notification.error({
                   message: '娑堟伅',
-                  description: err.message
+                  description: res.message
                 })
+              }
+            })
+            .catch(err => {
+              that.$notification.error({
+                message: '娑堟伅',
+                description: err.message
               })
-              .finally(() => {
-                that.$destroyAll()
-              })
-          },
-          onCancel: () => {
-            that.$destroyAll()
-          }
-        })
-      },
+            })
+            .finally(() => {
+              that.$destroyAll()
+            })
+        },
+        onCancel: () => {
+          that.$destroyAll()
+        }
+      })
+    },
 
-      /**
-       * 鐐瑰嚮鍙戝竷鏃惰Е鍙戝綋鍓嶆枃妗e彂甯�
-       * @param menuLabel
-       */
-      handlePublish(menuLabel) {
-        const that = this
-        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
-        that.$confirm({
-          title: '鎻愮ず',
-          content: `纭${menuLabel}鍚楋紵`,
-          okText: '纭',
-          cancelText: '鍙栨秷',
-          onOk: () => {
-            dncApi.documentPublishApi(docId)
-              .then(res => {
-                if (res.success) {
-                  this.reloadDocumentListData({ docClassCode: param, attributionId })
-                  this.$bus.$emit('reloadMainBottomTableData', 'documentVersion')
-                  that.$notification.success({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                } else {
-                  that.$notification.error({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                }
-              })
-              .catch(err => {
+    /**
+     * 鐐瑰嚮鍙戝竷鏃惰Е鍙戝綋鍓嶆枃妗e彂甯�
+     * @param menuLabel
+     */
+    handlePublish(menuLabel) {
+      const that = this
+      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
+      that.$confirm({
+        title: '鎻愮ず',
+        content: `纭${menuLabel}鍚楋紵`,
+        okText: '纭',
+        cancelText: '鍙栨秷',
+        onOk: () => {
+          dncApi.documentPublishApi(docId)
+            .then(res => {
+              if (res.success) {
+                this.reloadDocumentListData({ docClassCode: param, attributionId })
+                this.$bus.$emit('reloadMainBottomTableData', 'documentVersion')
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              } else {
                 that.$notification.error({
                   message: '娑堟伅',
-                  description: err.message
+                  description: res.message
                 })
+              }
+            })
+            .catch(err => {
+              that.$notification.error({
+                message: '娑堟伅',
+                description: err.message
               })
-              .finally(() => {
-                that.$destroyAll()
-              })
-          },
-          onCancel: () => {
-            that.$destroyAll()
-          }
-        })
-      },
+            })
+            .finally(() => {
+              that.$destroyAll()
+            })
+        },
+        onCancel: () => {
+          that.$destroyAll()
+        }
+      })
+    },
 
-      /**
-       * 閲嶆柊鍙戝竷褰撳墠鍙抽敭閫変腑鏂囨。骞堕噸鏂板彂甯冮��鍥炰笂涓�鏂囨。鐗堟湰
-       * @param menuLabel
-       */
-      handleRepublish(menuLabel) {
-        const that = this
-        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
-        that.$confirm({
-          title: '鎻愮ず',
-          content: `纭${menuLabel}鍚楋紵`,
-          okText: '纭',
-          cancelText: '鍙栨秷',
-          onOk: () => {
-            dncApi.documentRepublishApi(docId)
-              .then(res => {
-                if (res.success) {
-                  this.reloadDocumentListData({ docClassCode: param, attributionId })
-                  that.$notification.success({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                } else {
-                  that.$notification.error({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                }
-              })
-              .catch(err => {
+    /**
+     * 閲嶆柊鍙戝竷褰撳墠鍙抽敭閫変腑鏂囨。骞堕噸鏂板彂甯冮��鍥炰笂涓�鏂囨。鐗堟湰
+     * @param menuLabel
+     */
+    handleRepublish(menuLabel) {
+      const that = this
+      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
+      that.$confirm({
+        title: '鎻愮ず',
+        content: `纭${menuLabel}鍚楋紵`,
+        okText: '纭',
+        cancelText: '鍙栨秷',
+        onOk: () => {
+          dncApi.documentRepublishApi(docId)
+            .then(res => {
+              if (res.success) {
+                this.reloadDocumentListData({ docClassCode: param, attributionId })
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              } else {
                 that.$notification.error({
                   message: '娑堟伅',
-                  description: err.message
+                  description: res.message
                 })
+              }
+            })
+            .catch(err => {
+              that.$notification.error({
+                message: '娑堟伅',
+                description: err.message
               })
-              .finally(() => {
-                that.$destroyAll()
-              })
-          },
-          onCancel: () => {
-            that.$destroyAll()
-          }
-        })
-      },
+            })
+            .finally(() => {
+              that.$destroyAll()
+            })
+        },
+        onCancel: () => {
+          that.$destroyAll()
+        }
+      })
+    },
 
-      /**
-       * 閲嶅綊妗e綋鍓嶅彸閿�変腑鏂囨。涓斿悗缁棤娉曠户缁彂甯冩垨褰掓。
-       * @param menuLabel
-       */
-      handlePigeonhole(menuLabel) {
-        const that = this
-        const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
-        that.$confirm({
-          title: '鎻愮ず',
-          content: `${menuLabel}鍚庝笉鍙彇娑堬紝纭${menuLabel}鍚楋紵`,
-          okText: '纭',
-          cancelText: '鍙栨秷',
-          onOk: () => {
-            dncApi.documentPigeonholeApi(docId)
-              .then(res => {
-                if (res.success) {
-                  this.reloadDocumentListData({ docClassCode: param, attributionId })
-                  that.$notification.success({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                } else {
-                  that.$notification.error({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                }
-              })
-              .catch(err => {
+    /**
+     * 閲嶅綊妗e綋鍓嶅彸閿�変腑鏂囨。涓斿悗缁棤娉曠户缁彂甯冩垨褰掓。
+     * @param menuLabel
+     */
+    handlePigeonhole(menuLabel) {
+      const that = this
+      const { docId, param, attributionId } = this.currentRightClickedTableRowInfo
+      that.$confirm({
+        title: '鎻愮ず',
+        content: `${menuLabel}鍚庝笉鍙彇娑堬紝纭${menuLabel}鍚楋紵`,
+        okText: '纭',
+        cancelText: '鍙栨秷',
+        onOk: () => {
+          dncApi.documentPigeonholeApi(docId)
+            .then(res => {
+              if (res.success) {
+                this.reloadDocumentListData({ docClassCode: param, attributionId })
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              } else {
                 that.$notification.error({
                   message: '娑堟伅',
-                  description: err.message
+                  description: res.message
                 })
+              }
+            })
+            .catch(err => {
+              that.$notification.error({
+                message: '娑堟伅',
+                description: err.message
               })
-              .finally(() => {
-                that.$destroyAll()
-              })
-          },
-          onCancel: () => {
-            that.$destroyAll()
-          }
-        })
-      },
+            })
+            .finally(() => {
+              that.$destroyAll()
+            })
+        },
+        onCancel: () => {
+          that.$destroyAll()
+        }
+      })
+    },
 
-      // 閲嶇疆tabKey骞朵笖閲婃斁鍔犺浇鏂囨。鍒楄〃鐨勬帴鍙�
-      releaseLoadDocumentListApi() {
-        this.hasLoadedDataTabKeyArray = []
-        this.handleTabChange(this.activeTabKey)
-      },
+    // 閲嶇疆tabKey骞朵笖閲婃斁鍔犺浇鏂囨。鍒楄〃鐨勬帴鍙�
+    releaseLoadDocumentListApi() {
+      this.hasLoadedDataTabKeyArray = []
+      this.handleTabChange(this.activeTabKey)
+    },
 
-      // 鎺у埗鍙抽敭鑿滃崟鍏抽棴
-      handleMenuClose() {
-        this.$refs.tableContextMenuRef.menuVisible = false
-        document.body.removeEventListener('click', this.handleMenuClose)
-      },
+    // 鎺у埗鍙抽敭鑿滃崟鍏抽棴
+    handleMenuClose() {
+      this.$refs.tableContextMenuRef.menuVisible = false
+      document.body.removeEventListener('click', this.handleMenuClose)
+    },
 
-      triggerCorrespondingMethod({ methodName, modalTitle }) {
-        if (this[methodName]) this[methodName](modalTitle)
-      }
+    triggerCorrespondingMethod({ methodName, modalTitle }) {
+      if (this[methodName]) this[methodName](modalTitle)
     }
   }
+}
 </script>
 
 <style scoped>
-  /deep/ .ant-table-tbody .ant-table-row {
-    cursor: pointer;
-  }
+/deep/ .ant-table-tbody .ant-table-row {
+  cursor: pointer;
+}
 </style>
\ No newline at end of file
diff --git a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue
index fef8b3d..11ff894 100644
--- a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue
@@ -78,6 +78,10 @@
       this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
       this.$bus.$on('handleSwitchDeviceDocClassCode', this.setCurrentDeviceDocClassCode)
     },
+    beforeDestroy() {
+      this.$bus.$off('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
+      this.$bus.$off('handleSwitchDeviceDocClassCode', this.setCurrentDeviceDocClassCode)
+    },
     methods: {
       getTreeDataByApi() {
         this.loading = true
@@ -119,7 +123,6 @@
         this.$bus.$emit('sendDeviceTreeNodeInfo', this.currentSelected)
         if (selectedKeys.length === 0) return
         this.selectedKeys = selectedKeys
-
       },
 
       /**
diff --git a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTreeContextMenu.vue b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTreeContextMenu.vue
index 61f72e4..912ebd5 100644
--- a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTreeContextMenu.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTreeContextMenu.vue
@@ -51,8 +51,8 @@
         const { param } = this.treeParams
         const treeNodeInfo = Object.assign({}, this.treeParams, { param })
         console.log('treeNodeInfo++++++++++++++++++++++++++++', treeNodeInfo)
-        if (treeNodeInfo.type === 2) treeNodeInfo.type = 4
-        // 璁惧缁撴瀯鏍戣妭鐐逛腑鐨勮澶囧眰绾т负2锛屼絾鍦ㄤ骇鍝佺粨鏋勬爲涓皢璁惧灞傜骇鐨則ype璁剧疆涓�4锛屼负淇濊瘉涓や釜缁撴瀯鏍戝叡鐢ㄧ殑鏂规硶鑳芥甯歌繍琛岋紝鍥犳鍦ㄦ澶勫悓鏍疯缃负4
+        if (treeNodeInfo.type === 2) treeNodeInfo.type = 7
+        // 璁惧缁撴瀯鏍戣妭鐐逛腑鐨勮澶囧眰绾т负2锛屼絾鍦ㄤ骇鍝佺粨鏋勬爲涓皢璁惧灞傜骇鐨則ype璁剧疆涓�7锛屽洜姝ゅ湪姝ゅ璁剧疆涓�7
         const menuKeyArray = menuKey.split('_')
         const isCommonMethod = this.defaultContextMenuList[level].find(item => item.code === menuKey).isCommonMethod
         // product_add => handleAdd 瑙﹀彂瀵瑰簲缁勪欢浜嬩欢
diff --git a/src/views/dnc/base/modules/DeviceStructure/Document/HasReceivedDocumentTableList.vue b/src/views/dnc/base/modules/DeviceStructure/Document/HasReceivedDocumentTableList.vue
index 46d1425..64dbc46 100644
--- a/src/views/dnc/base/modules/DeviceStructure/Document/HasReceivedDocumentTableList.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/Document/HasReceivedDocumentTableList.vue
@@ -1,7 +1,7 @@
 <template>
   <div>
     <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination"
-             :scroll="{y:189}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange">
+             :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange">
 
     </a-table>
 
@@ -21,6 +21,9 @@
     props: {
       currentTreeNodeInfo: {
         type: Object
+      },
+      currentTypeOfDevice:{
+        type:Number
       },
       size: {
         type: String
@@ -109,7 +112,7 @@
         var params = this.getQueryParams()//鏌ヨ鏉′欢
         console.log('currentTreeNodeInfo', this.currentTreeNodeInfo)
         params.attributionId = this.currentTreeNodeInfo.key
-        params.attributionType = 4
+        params.attributionType = this.currentTypeOfDevice
         params.docClassCode = 'REC'
         if (!params) return false
         this.dataSource = []
diff --git a/src/views/dnc/base/modules/DeviceStructure/Document/HasSentDocumentTableList.vue b/src/views/dnc/base/modules/DeviceStructure/Document/HasSentDocumentTableList.vue
index 46ab561..ff4f57e 100644
--- a/src/views/dnc/base/modules/DeviceStructure/Document/HasSentDocumentTableList.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/Document/HasSentDocumentTableList.vue
@@ -1,7 +1,7 @@
 <template>
   <div>
     <a-table :columns="columns" :data-source="dataSource" bordered :pagination="ipagination"
-             :scroll="{y:189}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange">
+             :scroll="{y:265}" :customRow="customRow" :size="size" rowKey="docId" @change="handleTableChange">
 
     </a-table>
 
@@ -21,6 +21,9 @@
     props: {
       currentTreeNodeInfo: {
         type: Object
+      },
+      currentTypeOfDevice:{
+        type:Number
       },
       size: {
         type: String
@@ -119,7 +122,7 @@
         var params = this.getQueryParams()//鏌ヨ鏉′欢
         console.log('currentTreeNodeInfo', this.currentTreeNodeInfo)
         params.attributionId = this.currentTreeNodeInfo.key
-        params.attributionType = 4
+        params.attributionType = this.currentTypeOfDevice
         params.docClassCode = 'SEND'
         if (!params) return false
         this.dataSource = []
diff --git a/src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue b/src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue
index 388f440..3e61670 100644
--- a/src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue
+++ b/src/views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue
@@ -69,8 +69,8 @@
     },
 
     triggerCorrespondingMethod({ methodName, modalTitle, treeNodeInfo, tableRowInfo }) {
-      console.log('瑙﹀彂鍙抽敭鑿滃崟')
       if (this[methodName]) {
+        console.log('瑙﹀彂鍙抽敭鑿滃崟')
         this.title = modalTitle
         this[methodName](treeNodeInfo, tableRowInfo)
       }
diff --git a/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionInfo.vue b/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionInfo.vue
new file mode 100644
index 0000000..fc15cd8
--- /dev/null
+++ b/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionInfo.vue
@@ -0,0 +1,36 @@
+<template>
+  <a-descriptions bordered :size="size" :column="4">
+    <a-descriptions-item label="宸ヨ壓瑙勭▼鐗堟湰鍙�" :span="2">{{ currentLevelDetails.processSpecVersionCode }}
+    </a-descriptions-item>
+    <a-descriptions-item label="宸ヨ壓瑙勭▼鐗堟湰鍚嶇О" :span="2">{{ currentLevelDetails.processSpecVersionName }}
+    </a-descriptions-item>
+    <a-descriptions-item label="鍒涘缓浜�">{{ currentLevelDetails.createBy_dictText }}</a-descriptions-item>
+    <a-descriptions-item label="鍒涘缓鏃堕棿">{{ currentLevelDetails.createTime }}</a-descriptions-item>
+    <a-descriptions-item label="淇敼浜�">{{ currentLevelDetails.updateBy_dictText }}</a-descriptions-item>
+    <a-descriptions-item label="淇敼鏃堕棿">{{ currentLevelDetails.updateTime }}</a-descriptions-item>
+    <a-descriptions-item label="鎻忚堪" :span="4">{{ currentLevelDetails.description }}</a-descriptions-item>
+  </a-descriptions>
+</template>
+
+<script>
+export default {
+  name: 'ProcessSpecVersionInfo',
+  components: {},
+  props: {
+    currentLevelDetails: {
+      type: Object
+    },
+    size: {
+      type: String
+    }
+  },
+  data() {
+    return {}
+  },
+  methods: {}
+}
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue
index 518c220..1c1145a 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue
@@ -1,5 +1,5 @@
 <template>
-  <div v-if="+currentLevelInfo.type!==4" style="height: 100%">
+  <div style="height: 100%">
     <a-tabs style="height: 100%" v-model="activeTabKey" v-if="Object.keys(currentLevelInfo).length>0"
             @change="handleTabChange">
       <a-tab-pane :key="1" tab="灞炴�т俊鎭�" v-if="+currentLevelInfo.type===1">
@@ -12,6 +12,10 @@
 
       <a-tab-pane :key="1" tab="闆朵欢灞炴��" v-if="+currentLevelInfo.type===3">
         <PartInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
+      </a-tab-pane>
+
+      <a-tab-pane :key="1" tab="灞炴�т俊鎭�" v-if="+currentLevelInfo.type===4">
+        <ProcessSpecVersionInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
       </a-tab-pane>
 
       <a-tab-pane :key="1" tab="宸ュ簭灞炴��" v-if="+currentLevelInfo.type===5">
@@ -72,13 +76,16 @@
 import UseDocumentEquipmentTableList from './Document/UseNcDocumentEquipmentTableList'
 import FilePreview from '../../../common/FilePreview'
 import TableContextMenu from '../../../common/TableContextMenu'
-import { getAction } from '@/api/manage'
 import UseDeviceCustomTypeEquipmentTableList
   from '@views/dnc/base/modules/ProductStructure/DeviceCustomType/UseDeviceCustomTypeEquipmentTableList.vue'
+import ProcessSpecVersionInfo
+  from '@views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionInfo.vue'
+import { getAction } from '@/api/manage'
 
 export default {
   name: 'ProductStructureMainBottom',
   components: {
+    ProcessSpecVersionInfo,
     UseDeviceCustomTypeEquipmentTableList,
     CutterTableList,
     TableContextMenu,
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue
index e961d5f..7655c68 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue
@@ -1,5 +1,5 @@
 <template>
-  <div v-if="+currentTreeNodeInfo.type!==4">
+  <div>
     <a-tabs v-model="activeTabKey" @contextmenu.native="e=>e.preventDefault()" @change="handleTabChange"
             v-if="Object.keys(currentTreeNodeInfo).length!==0">
       <a-tab-pane :key="1" tab="NC绠$悊" v-if="+currentTreeNodeInfo.type===5||+currentTreeNodeInfo.type===6">
@@ -69,6 +69,12 @@
     this.getDeviceTypeListDisplayPermission('dnc_device_type_process', 'isProcessHasDeviceTypeList')
     this.getDeviceTypeListDisplayPermission('dnc_device_type_step', 'isProcessStepHasDeviceTypeList')
   },
+  beforeDestroy() {
+    this.$bus.$off('sendCurrentTreeNodeInfo', this.receiveCurrentTreeNodeInfo)
+    this.$bus.$off('sendCurrentClickedTypeInfo', this.receiveCurrentClickedTypeInfo)
+    this.$bus.$off('reloadDocumentListData', this.reloadDocumentListData)
+    this.$bus.$off('tableMenuItemMethodTrigger', this.triggerCorrespondingMethod)
+  },
   methods: {
     /**
      * 鑾峰彇璁惧绫诲瀷鍒楄〃鍦ㄥ伐搴忓拰宸ユ灞傜骇鐨勫睍绀烘潈闄�
@@ -89,15 +95,24 @@
      */
     receiveCurrentTreeNodeInfo(treeNodeInfo) {
       console.log('treeNodeInfo', treeNodeInfo)
+      const { id, type } = treeNodeInfo
       // 浠庢爲缁勪欢鎺ュ彈鏍戣妭鐐逛俊鎭悗浠庣埗缁勪欢娴佸叆瀛愮粍浠�
       this.currentTreeNodeInfo = treeNodeInfo
+      this.currentNCDocumentAttributionInfo = Object.assign({}, {
+        attributionId: id,
+        attributionType: type,
+        docClassCode: 'NC'
+      })
       // 娓呯┖涓婁竴鑺傜偣宸茬粡鍔犺浇杩囧緱鏂囨。鍒楄〃tabKey
       this.hasLoadedDataTabKeyArray = []
-      if (+treeNodeInfo.type === 5 || +treeNodeInfo.type === 6) {
+      if (+type === 5 || +type === 6) {
         this.activeTabKey = 1
         this.$nextTick(() => {
-          if (this.$refs.deviceCustomTypeTableList) this.$refs.deviceCustomTypeTableList.setQueryParamAndLoadData()
-          else if (this.$refs.ncDocumentTableListRef) this.$refs.ncDocumentTableListRef.loadData(1)
+          if (this.$refs.deviceCustomTypeTableList) {
+            this.$refs.deviceCustomTypeTableList.setQueryParamAndLoadData()
+            // 鍒囨崲鏍戜箣鍚庢竻绌篘C绋嬪簭鍒楄〃
+            if (this.$refs.ncDocumentTableListRef && this.$refs.ncDocumentTableListRef.dataSource.length > 0) this.$refs.ncDocumentTableListRef.dataSource = []
+          } else if (this.$refs.ncDocumentTableListRef) this.$refs.ncDocumentTableListRef.loadData(1)
         })
       } else {
         this.activeTabKey = 2
@@ -179,7 +194,7 @@
       const { docId, docName } = this.currentRightClickedTableRowInfo
       dncApi.downloadDocumentApi({ docId, docName })
         .then(res => {
-          if (res && !res.success) {
+          if (!res.success) {
             that.$notification.error({
               message: '娑堟伅',
               description: res.message
@@ -254,7 +269,6 @@
         onOk: () => {
           dncApi.documentOutboundApi({ docId, docName })
             .then(res => {
-              console.log('res------------------', res)
               if (res.success) {
                 that.reloadDocumentListData({ docClassCode: param, attributionId, attributionType })
                 that.$notification.success({
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
index 6e45ede..3fea23d 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
@@ -114,6 +114,9 @@
     this.getTreeDataByApi()
     this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
   },
+  beforeDestroy() {
+    this.$bus.$off('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
+  },
   methods: {
     getTreeDataByApi() {
       this.loading = true
@@ -243,6 +246,7 @@
 
     /**
      * 鑷姩灞曞紑娣诲姞涓嬬骇鑺傜偣鐨勭埗鑺傜偣
+     * @param isAddNextLevel 鏄惁闇�瑕佸睍寮�涓嬬骇
      */
     modalFormSubmitSuccess(isAddNextLevel) {
       // 鍒ゆ柇鏄惁涓烘坊鍔犱笅绾у苟涓斿垽鏂埗鑺傜偣鏄惁灞曞紑
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
index 338a3a0..6e4eacb 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
@@ -70,6 +70,7 @@
           { label: '鍒涘缓宸ヨ壓瑙勭▼鐗堟湰', code: 'version_add', icon: 'plus', isCommonMethod: false },
           { label: '鍒涘缓宸ュ簭', code: 'version_add_child', icon: 'plus', isCommonMethod: false },
           { label: '缂栬緫宸ヨ壓瑙勭▼鐗堟湰淇℃伅', code: 'version_edit', icon: 'edit', isCommonMethod: false },
+          { label: '瀵煎叆鍏朵粬鏂囨。', code: 'version_import', icon: 'import', isCommonMethod: true },
           { label: '鍒犻櫎', code: 'version_delete', icon: 'delete', isCommonMethod: true },
           { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
         ],
@@ -122,6 +123,8 @@
           return 'OTHER'
         case 3:
           return 'OTHER'
+        case 4:
+          return 'OTHER'
         case 5:
           return 'NC'
         case 6:
diff --git a/src/views/dnc/common/DocumentInfo.vue b/src/views/dnc/common/DocumentInfo.vue
index 218d3e0..f5708c5 100644
--- a/src/views/dnc/common/DocumentInfo.vue
+++ b/src/views/dnc/common/DocumentInfo.vue
@@ -1,18 +1,18 @@
 <template>
-  <a-descriptions bordered :size="size">
+  <a-descriptions bordered :size="size" :column="4">
     <a-descriptions-item label="鏂囨。鍚嶇О">{{currentLevelDetails.docName}}</a-descriptions-item>
     <a-descriptions-item label="浠g爜鐗堟湰">{{currentLevelDetails.docAlias}}</a-descriptions-item>
-    <a-descriptions-item label="璁惧缂栧彿	">{{currentLevelDetails.docCode}}</a-descriptions-item>
+    <a-descriptions-item label="璁惧缂栧彿">{{currentLevelDetails.docCode}}</a-descriptions-item>
     <a-descriptions-item label="鏂囨。鍚庣紑">{{currentLevelDetails.docSuffix}}</a-descriptions-item>
     <a-descriptions-item label="鏂囨。鐘舵��">{{currentLevelDetails.docStatus_dictText}}</a-descriptions-item>
     <a-descriptions-item label="绯荤粺鎸囧畾鐗堟湰">{{currentLevelDetails.publishVersion}}</a-descriptions-item>
     <a-descriptions-item label="鍑哄簱鐘舵��">{{currentLevelDetails.pullStatus_dictText}}</a-descriptions-item>
-    <a-descriptions-item label="鍑哄簱浜�" :span="2">{{currentLevelDetails.pullUser_dictText}}</a-descriptions-item>
+    <a-descriptions-item label="鍑哄簱浜�">{{currentLevelDetails.pullUser_dictText}}</a-descriptions-item>
     <a-descriptions-item label="鍒涘缓浜�">{{currentLevelDetails.createBy_dictText}}</a-descriptions-item>
-    <a-descriptions-item label="鍒涘缓鏃堕棿" :span="2">{{currentLevelDetails.createTime}}</a-descriptions-item>
+    <a-descriptions-item label="鍒涘缓鏃堕棿">{{currentLevelDetails.createTime}}</a-descriptions-item>
     <a-descriptions-item label="淇敼浜�">{{currentLevelDetails.updateBy_dictText}}</a-descriptions-item>
-    <a-descriptions-item label="淇敼鏃堕棿" :span="2">{{currentLevelDetails.updateTime}}</a-descriptions-item>
-    <a-descriptions-item label="鎻忚堪" :span="3">{{currentLevelDetails.description}}</a-descriptions-item>
+    <a-descriptions-item label="淇敼鏃堕棿">{{currentLevelDetails.updateTime}}</a-descriptions-item>
+    <a-descriptions-item label="鎻忚堪" :span="4">{{currentLevelDetails.description}}</a-descriptions-item>
   </a-descriptions>
 </template>
 

--
Gitblit v1.9.3