From b96d0e41cb4d68074fef53ae0ef10ee0c6be1b07 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期五, 28 二月 2025 15:46:20 +0800
Subject: [PATCH] DNC模块: 1、解决点击tabs栏空白处出现空内容组件问题 2、新增树内容搜索时若清空内容后还原为搜索前展开的树节点的功能 产品结构树: 1、工艺和工步层级开放其他文档列表的展示 2、零件层级下新增工艺规程版本层级,并实现工艺规程版本层级的相应功能(增删改) 3、解决因设备结构树数据未加载完成就跳转至产品结构树页面导致接口获取到的前页面方法影响后页面从而出现混乱问题

---
 src/views/dnc/base/modules/ProductStructure/Part/PartModal.vue                                 |    4 
 src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue                           |   42 +++-
 src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue                |   19 +
 src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainBottom.vue                       |   41 ++--
 src/views/dnc/base/modules/ProductStructure/Process/ProcessModal.vue                           |   34 +-
 src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionModal.vue     |  106 ++++++++++
 src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue                        |   46 +++-
 src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue                          |   26 +-
 src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue                             |   39 ++-
 src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionModalForm.vue |  108 ++++++++++
 src/views/dnc/base/modules/ProductStructure/ProcessStep/ProcessStepModalForm.vue               |    4 
 src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue                     |   75 +++---
 src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue                             |    3 
 13 files changed, 411 insertions(+), 136 deletions(-)

diff --git a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue
index fe7a04a..69be12a 100644
--- a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMain.vue
@@ -37,7 +37,7 @@
       DeviceStructureMainBottom
     },
     created() {
-      this.$bus.$on('sendCurrentTreeNodeInfo', this.receiveCurrentTreeNodeInfo)
+      this.$bus.$on('sendDeviceTreeNodeInfo', this.receiveCurrentTreeNodeInfo)
     },
     data() {
       return {
@@ -58,7 +58,6 @@
             if (this.$refs.mainTopRef) this.$refs.mainTopRef.releaseLoadDocumentListApi()
           })
         }
-        console.log('currentTreeNodeInfo------------------', this.currentTreeNodeInfo)
       }
     }
   }
diff --git a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainBottom.vue b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainBottom.vue
index 5de5c43..9bfa203 100644
--- a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainBottom.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainBottom.vue
@@ -1,30 +1,31 @@
 <template>
-  <a-tabs style="height: 100%" v-model="activeTabKey" @change="handleTabChange">
-    <a-tab-pane :key="1" tab="璁惧灞炴��" v-if="currentTreeNodeInfo.type===2&&!currentDocumentInfo.docId">
-      <DeviceInfo :currentLevelDetails="currentTreeNodeInfo.entity" :size="containerSize"/>
-    </a-tab-pane>
-
-    <template v-if="currentDocumentInfo.docId">
-      <a-tab-pane :key="1" tab="鏂囨。灞炴��">
-        <DocumentInfo :currentLevelDetails="currentDocumentInfo" :size="containerSize"/>
+  <div>
+    <a-tabs v-model="activeTabKey" @change="handleTabChange">
+      <a-tab-pane :key="1" tab="璁惧灞炴��" v-if="currentTreeNodeInfo.type===2&&!currentDocumentInfo.docId">
+        <DeviceInfo :currentLevelDetails="currentTreeNodeInfo.entity" :size="containerSize"/>
       </a-tab-pane>
 
-      <a-tab-pane :key="2" tab="棰勮">
-        <FilePreview ref="filePreviewRef" :currentDocumentInfo="currentDocumentInfo"/>
-      </a-tab-pane>
+      <template v-if="currentDocumentInfo.docId">
+        <a-tab-pane :key="1" tab="鏂囨。灞炴��">
+          <DocumentInfo :currentLevelDetails="currentDocumentInfo" :size="containerSize"/>
+        </a-tab-pane>
 
-      <a-tab-pane :key="3" tab="鏂囨。鐗堟湰">
-        <DocumentVersionTableList ref="documentVersionTableRef" :currentDocumentInfo="currentDocumentInfo"
-                                  @handleTableContextMenuOpen="handleTableContextMenuOpen"
-                                  @releaseFilePreviewApi="releaseFilePreviewApi"
-                                  :size="containerSize"/>
-      </a-tab-pane>
-    </template>
+        <a-tab-pane :key="2" tab="棰勮">
+          <FilePreview ref="filePreviewRef" :currentDocumentInfo="currentDocumentInfo"/>
+        </a-tab-pane>
+
+        <a-tab-pane :key="3" tab="鏂囨。鐗堟湰">
+          <DocumentVersionTableList ref="documentVersionTableRef" :currentDocumentInfo="currentDocumentInfo"
+                                    @handleTableContextMenuOpen="handleTableContextMenuOpen"
+                                    @releaseFilePreviewApi="releaseFilePreviewApi"
+                                    :size="containerSize"/>
+        </a-tab-pane>
+      </template>
+    </a-tabs>
 
     <TableContextMenu :tableRowInfo="currentRightClickedTableRowInfo" ref="tableContextMenuRef"/>
-  </a-tabs>
+  </div>
 </template>
-
 <script>
   import DeviceInfo from './Device/DeviceInfo'
   import DocumentInfo from '../../../common/DocumentInfo'
diff --git a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue
index debcfd5..cfaa481 100644
--- a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureMainTop.vue
@@ -1,22 +1,24 @@
 <template>
-  <a-tabs v-model="activeTabKey" @change="handleTabChange" @contextmenu.native="e=>e.preventDefault()"
-          v-if="Object.keys(currentTreeNodeInfo).length!==0">
-    <a-tab-pane :key="1" tab="鍙戦��">
-      <HasSentDocumentTableList ref="hasSentDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
-                                @handleTableContextMenuOpen="handleTableContextMenuOpen" :size="tableContainerSize"/>
-    </a-tab-pane>
+  <div>
+    <a-tabs v-model="activeTabKey" @change="handleTabChange" @contextmenu.native="e=>e.preventDefault()"
+            v-if="Object.keys(currentTreeNodeInfo).length!==0">
+      <a-tab-pane :key="1" tab="鍙戦��">
+        <HasSentDocumentTableList ref="hasSentDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
+                                  @handleTableContextMenuOpen="handleTableContextMenuOpen" :size="tableContainerSize"/>
+      </a-tab-pane>
 
-    <a-tab-pane :key="2" tab="鎺ユ敹">
-      <HasReceivedDocumentTableList ref="hasReceivedDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
-                                    @handleTableContextMenuOpen="handleTableContextMenuOpen"
-                                    :size="tableContainerSize"/>
-    </a-tab-pane>
+      <a-tab-pane :key="2" tab="鎺ユ敹">
+        <HasReceivedDocumentTableList ref="hasReceivedDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
+                                      @handleTableContextMenuOpen="handleTableContextMenuOpen"
+                                      :size="tableContainerSize"/>
+      </a-tab-pane>
+    </a-tabs>
 
     <TableContextMenu :tableRowInfo="currentRightClickedTableRowInfo" ref="tableContextMenuRef"/>
 
     <DocumentBatchDeleteModal :currentDocumentInfo="currentRightClickedTableRowInfo" :size="tableContainerSize"
                               @reloadDocumentListData="reloadDocumentListData" ref="documentBatchDeleteModalRef"/>
-  </a-tabs>
+  </div>
 </template>
 
 <script>
diff --git a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue
index 1caf639..5e53cf4 100644
--- a/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue
+++ b/src/views/dnc/base/modules/DeviceStructure/DeviceStructureTree.vue
@@ -59,6 +59,7 @@
         treeDataSource: [],
         selectedKeys: [],
         expandedKeys: [],
+        beforeSearchExpandedKeys: [],
         searchValue: '',
         dataList: [],
         autoExpandParent: true,
@@ -88,8 +89,8 @@
               this.allTreeKeys = []
               this.treeDataSource = res.result
               this.generateList(this.treeDataSource)
-              this.expandedKeys = this.allTreeKeys
-              this.$bus.$emit('sendCurrentTreeNodeInfo', this.treeDataSource[0])
+              this.expandedKeys = this.beforeSearchExpandedKeys = this.allTreeKeys
+              this.$bus.$emit('sendDeviceTreeNodeInfo', this.treeDataSource[0])
             } else {
               this.$message.warn(res.message)
             }
@@ -115,7 +116,7 @@
         this.currentSelected = Object.assign({}, record)
         this.selectedKeys = selectedKeys
         // 鍚戝彸渚х埗绾х粍浠跺彂閫佸綋鍓嶉�変腑鏍戣妭鐐逛俊鎭�
-        this.$bus.$emit('sendCurrentTreeNodeInfo', this.currentSelected)
+        this.$bus.$emit('sendDeviceTreeNodeInfo', this.currentSelected)
       },
 
       /**
@@ -135,27 +136,37 @@
        * @param expandedKeys 灞曞紑椤筴ey
        */
       handleTreeExpand(expandedKeys) {
-        this.expandedKeys = expandedKeys
+        this.expandedKeys = this.beforeSearchExpandedKeys = expandedKeys
+        console.log('beforeSearchExpandedKeys', this.beforeSearchExpandedKeys)
         this.autoExpandParent = false
       },
 
       /* 杈撳叆鏌ヨ鍐呭鍙樺寲鏃惰Е鍙� */
       handleSearchInputChange() {
         let search = this.searchInput
-        let expandedKeys = this.dataList
-          .map(item => {
-            if (item.title != null) {
-              if (item.title.indexOf(search) > -1) {
-                return this.getParentKey(item.key, this.treeDataSource)
+        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
               }
-              return null
-            }
-          })
-          .filter((item, i, self) => item && self.indexOf(item) === i)
+            })
+            .filter((item, i, self) => item && self.indexOf(item) === i)
+          autoExpandParent = true
+        } else {
+          expandedKeys = this.beforeSearchExpandedKeys
+          autoExpandParent = false
+        }
+
         Object.assign(this, {
           expandedKeys,
           searchValue: search,
-          autoExpandParent: true
+          autoExpandParent
         })
       },
 
diff --git a/src/views/dnc/base/modules/ProductStructure/Part/PartModal.vue b/src/views/dnc/base/modules/ProductStructure/Part/PartModal.vue
index 54016ff..f9a1acd 100644
--- a/src/views/dnc/base/modules/ProductStructure/Part/PartModal.vue
+++ b/src/views/dnc/base/modules/ProductStructure/Part/PartModal.vue
@@ -62,8 +62,8 @@
         this.$nextTick(() => {
           if (this.$refs.realForm) {
             this.$refs.realForm.add({
-              productId: this.currentTreeNodeInfo.productId,
-              componentId: this.currentTreeNodeInfo.componentId
+              productId: this.currentTreeNodeInfo.entity.productId,
+              componentId: this.currentTreeNodeInfo.entity.componentId
             })
           }
         })
diff --git a/src/views/dnc/base/modules/ProductStructure/Process/ProcessModal.vue b/src/views/dnc/base/modules/ProductStructure/Process/ProcessModal.vue
index 3d5c716..e1f60d7 100644
--- a/src/views/dnc/base/modules/ProductStructure/Process/ProcessModal.vue
+++ b/src/views/dnc/base/modules/ProductStructure/Process/ProcessModal.vue
@@ -69,24 +69,6 @@
         })
       },
 
-
-      /**
-       * 鐐瑰嚮闆朵欢鍒涘缓闆朵欢涓嬬骇宸ュ簭
-       */
-      handlePartsAddRelative() {
-        this.isAddNextLevel = true
-        this.visible = true
-        this.$nextTick(() => {
-          if (this.$refs.realForm) {
-            this.$refs.realForm.add({
-              productId: this.currentTreeNodeInfo.entity.productId,
-              componentId: this.currentTreeNodeInfo.entity.componentId,
-              partsId: this.currentTreeNodeInfo.entity.partsId
-            })
-          }
-        })
-      },
-
       /**
        * 鐐瑰嚮宸ュ簭娣诲姞鍚岀骇宸ュ簭
        */
@@ -104,6 +86,22 @@
         })
       },
 
+      // 鍒涘缓宸ヨ壓瑙勭▼鐗堟湰涓嬬骇宸ュ簭
+      handleVersionAddChild() {
+        this.isAddNextLevel = true
+        this.visible = true
+        this.$nextTick(() => {
+          if (this.$refs.realForm) {
+            this.$refs.realForm.add({
+              productId: this.currentTreeNodeInfo.entity.productId,
+              componentId: this.currentTreeNodeInfo.entity.componentId,
+              partsId: this.currentTreeNodeInfo.entity.partsId,
+              psvId: this.currentTreeNodeInfo.id
+            })
+          }
+        })
+      },
+
       /**
        * 缂栬緫宸ュ簭淇℃伅
        */
diff --git a/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionModal.vue b/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionModal.vue
new file mode 100644
index 0000000..420927b
--- /dev/null
+++ b/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionModal.vue
@@ -0,0 +1,106 @@
+<template>
+  <j-modal
+    :title="title"
+    :width="width"
+    :visible="visible"
+    switchFullscreen
+    :maskClosable="false"
+    @ok="handleOk"
+    @cancel="handleCancel"
+    cancelText="鍏抽棴">
+    <ProcessSpecVersionModalForm ref="realForm" @ok="submitCallback" :allDeviceList="allDeviceList"/>
+  </j-modal>
+</template>
+
+<script>
+  import dncApi from '@/api/dnc'
+  import ProcessSpecVersionModalForm from './ProcessSpecVersionModalForm.vue'
+
+  export default {
+    name: 'ProcessSpecVersionModal',
+    components: {
+      ProcessSpecVersionModalForm
+    },
+    props: {
+      currentTreeNodeInfo: {
+        type: Object
+      }
+    },
+    data() {
+      return {
+        title: '',
+        width: 500,
+        visible: false,
+        allDeviceList: [],
+        isAddNextLevel: false // 鏄惁涓烘坊鍔犱笅绾э紝浣滀负鏍戣妭鐐规槸鍚﹀睍寮�鐨勫垽鏂�
+      }
+    },
+    created() {
+      this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
+    },
+    methods: {
+      handleOk() {
+        this.$refs.realForm.submitForm()
+      },
+
+
+      // 鍒涘缓闆朵欢涓嬬骇宸ヨ壓瑙勭▼鐗堟湰
+      handlePartsAddRelative() {
+        this.isAddNextLevel = true
+        this.visible = true
+        this.$nextTick(() => {
+          if (this.$refs.realForm) {
+            this.$refs.realForm.add({
+              productId: this.currentTreeNodeInfo.entity.productId,
+              componentId: this.currentTreeNodeInfo.entity.componentId,
+              partsId: this.currentTreeNodeInfo.entity.partsId
+            })
+          }
+        })
+      },
+
+      // 鍒涘缓鍚岀骇宸ヨ壓瑙勭▼鐗堟湰
+      handleVersionAdd() {
+        this.isAddNextLevel = false
+        this.visible = true
+        this.$nextTick(() => {
+          if (this.$refs.realForm) {
+            this.$refs.realForm.add({
+              productId: this.currentTreeNodeInfo.entity.productId,
+              componentId: this.currentTreeNodeInfo.entity.componentId,
+              partsId: this.currentTreeNodeInfo.entity.partsId
+            })
+          }
+        })
+      },
+
+      // 缂栬緫宸ヨ壓瑙勭▼鐗堟湰
+      handleVersionEdit() {
+        this.isAddNextLevel = false
+        this.visible = true
+        this.$nextTick(() => {
+          if (this.$refs.realForm) {
+            this.$refs.realForm.edit({ id: this.currentTreeNodeInfo.id, ...this.currentTreeNodeInfo.entity })
+          }
+        })
+      },
+
+      submitCallback() {
+        this.$emit('submitSuccess', this.isAddNextLevel)
+        this.visible = false
+      },
+
+      handleCancel() {
+        this.$emit('close')
+        this.visible = false
+      },
+
+      triggerCorrespondingMethod({ methodName, modalTitle }) {
+        if (this[methodName]) {
+          this[methodName]()
+          this.title = modalTitle
+        }
+      }
+    }
+  }
+</script>
diff --git a/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionModalForm.vue b/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionModalForm.vue
new file mode 100644
index 0000000..1bbbd0f
--- /dev/null
+++ b/src/views/dnc/base/modules/ProductStructure/ProcessSpecVersion/ProcessSpecVersionModalForm.vue
@@ -0,0 +1,108 @@
+<template>
+  <a-spin :spinning="confirmLoading">
+    <a-form-model ref="form" :model="model" :rules="validatorRules" :labelCol="labelColLong" :wrapperCol="wrapperColLong">
+      <a-row>
+        <a-col :span="24">
+          <a-form-model-item label="宸ヨ壓瑙勭▼鐗堟湰鍙�">
+            <a-input v-model="model.processSpecVersionCode" placeholder="璇疯緭鍏ュ伐鑹鸿绋嬬増鏈彿"/>
+          </a-form-model-item>
+        </a-col>
+
+        <a-col :span="24">
+          <a-form-model-item label="宸ヨ壓瑙勭▼鍚嶇О">
+            <a-input v-model="model.processSpecVersionName" placeholder="璇疯緭鍏ュ伐鑹鸿绋嬪悕绉�"/>
+          </a-form-model-item>
+        </a-col>
+
+        <a-col :span="24">
+          <a-form-model-item label="鎻忚堪">
+            <a-textarea v-model="model.description" placeholder="璇疯緭鍏ユ弿杩�"/>
+          </a-form-model-item>
+        </a-col>
+      </a-row>
+    </a-form-model>
+  </a-spin>
+</template>
+
+<script>
+  import { httpAction, getAction } from '@/api/manage'
+
+  export default {
+    name: 'ProcessSpecVersionModalForm',
+    components: {},
+    data() {
+      return {
+        model: {},
+        labelColLong: {
+          xs: { span: 24 },
+          sm: { span: 6 }
+        },
+        wrapperColLong: {
+          xs: { span: 24 },
+          sm: { span: 18 }
+        },
+        confirmLoading: false,
+        validatorRules: {
+          processCode: [
+            { required: true, message: '璇疯緭鍏ュ伐搴忓彿!' }
+          ],
+          processName: [
+            { required: true, message: '璇疯緭鍏ュ伐搴忓悕绉�!' }
+          ]
+        },
+        url: {
+          add: '/nc/processSpecVersion/add',
+          edit: '/nc/processSpecVersion/edit'
+        }
+      }
+    },
+    created() {
+      //澶囦唤model鍘熷鍊�
+      this.modelDefault = JSON.parse(JSON.stringify(this.model))
+    },
+    methods: {
+      add(params) {
+        this.edit({ ...this.modelDefault, ...params })
+      },
+      edit(record) {
+        this.model = Object.assign({}, record)
+        console.log('model', this.model)
+      },
+      submitForm() {
+        const that = this
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true
+            let httpUrl = ''
+            let method = ''
+            if (!this.model.id) {
+              httpUrl += this.url.add
+              method = 'post'
+            } else {
+              httpUrl += this.url.edit + `/${this.model.id}`
+              method = 'put'
+            }
+            httpAction(httpUrl, this.model, method).then((res) => {
+              if (res.success) {
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+                that.$emit('ok')
+              } else {
+                that.$notification.warning({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+              }
+            }).finally(() => {
+              that.confirmLoading = false
+            })
+          }
+
+        })
+      }
+    }
+  }
+</script>
\ No newline at end of file
diff --git a/src/views/dnc/base/modules/ProductStructure/ProcessStep/ProcessStepModalForm.vue b/src/views/dnc/base/modules/ProductStructure/ProcessStep/ProcessStepModalForm.vue
index 8fcebaf..7274b23 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProcessStep/ProcessStepModalForm.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProcessStep/ProcessStepModalForm.vue
@@ -4,12 +4,12 @@
       <a-row>
         <a-col :span="12">
           <a-form-model-item label="宸ユ鍙�" prop="stepCode">
-            <a-input v-model="model.stepCode" placeholder="璇疯緭鍏ュ伐搴忓彿"></a-input>
+            <a-input v-model="model.stepCode" placeholder="璇疯緭鍏ュ伐姝ュ彿"></a-input>
           </a-form-model-item>
         </a-col>
         <a-col :span="12">
           <a-form-model-item label="宸ユ鍚嶇О" prop="stepName">
-            <a-input v-model="model.stepName" placeholder="璇疯緭鍏ュ伐搴忓悕绉�"></a-input>
+            <a-input v-model="model.stepName" placeholder="璇疯緭鍏ュ伐姝ュ悕绉�"></a-input>
           </a-form-model-item>
         </a-col>
       </a-row>
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue
index 661bbb0..5f1a973 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureMainBottom.vue
@@ -1,50 +1,51 @@
 <template>
-  <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">
-      <ProductInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
-    </a-tab-pane>
-
-    <a-tab-pane :key="1" tab="灞炴�т俊鎭�" v-if="currentLevelInfo.type===2">
-      <ComponentInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
-    </a-tab-pane>
-
-    <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===5">
-      <ProcessInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
-    </a-tab-pane>
-
-    <a-tab-pane :key="1" tab="宸ユ灞炴��" v-if="currentLevelInfo.type===6">
-      <ProcessStepInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
-    </a-tab-pane>
-
-    <template v-if="currentLevelInfo.hasOwnProperty('attributionType')">
-      <a-tab-pane :key="1" tab="鏂囨。灞炴��">
-        <DocumentInfo :currentLevelDetails="currentLevelInfo" :size="containerSize"/>
+  <div v-if="currentLevelInfo.type!==4">
+    <a-tabs v-model="activeTabKey" v-if="Object.keys(currentLevelInfo).length>0" @change="handleTabChange">
+      <a-tab-pane :key="1" tab="灞炴�т俊鎭�" v-if="currentLevelInfo.type===1">
+        <ProductInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
       </a-tab-pane>
 
-      <a-tab-pane :key="2" tab="棰勮">
-        <FilePreview ref="filePreviewRef" :currentDocumentInfo="currentLevelInfo"/>
+      <a-tab-pane :key="1" tab="灞炴�т俊鎭�" v-if="currentLevelInfo.type===2">
+        <ComponentInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
       </a-tab-pane>
 
-      <a-tab-pane :key="3" tab="鏂囨。鐗堟湰">
-        <DocumentVersionTableList ref="documentVersionTableRef" :currentDocumentInfo="currentLevelInfo"
-                                  @handleTableContextMenuOpen="handleTableContextMenuOpen"
-                                  @releaseFilePreviewApi="releaseFilePreviewApi"
-                                  :size="containerSize"/>
+      <a-tab-pane :key="1" tab="闆朵欢灞炴��" v-if="currentLevelInfo.type===3">
+        <PartInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
       </a-tab-pane>
 
-      <a-tab-pane :key="4" tab="浣跨敤璁惧" v-if="currentLevelInfo.attributionType===5">
-        <UseDocumentEquipmentTableList ref="useDocumentEquipmentTableRef" :currentDocumentInfo="currentLevelInfo"
-                                       :size="containerSize"/>
+      <a-tab-pane :key="1" tab="宸ュ簭灞炴��" v-if="currentLevelInfo.type===5">
+        <ProcessInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
       </a-tab-pane>
-    </template>
+
+      <a-tab-pane :key="1" tab="宸ユ灞炴��" v-if="currentLevelInfo.type===6">
+        <ProcessStepInfo :currentLevelDetails="currentLevelInfo.entity" :size="containerSize"/>
+      </a-tab-pane>
+
+      <template v-if="currentLevelInfo.hasOwnProperty('attributionType')">
+        <a-tab-pane :key="1" tab="鏂囨。灞炴��">
+          <DocumentInfo :currentLevelDetails="currentLevelInfo" :size="containerSize"/>
+        </a-tab-pane>
+
+        <a-tab-pane :key="2" tab="棰勮">
+          <FilePreview ref="filePreviewRef" :currentDocumentInfo="currentLevelInfo"/>
+        </a-tab-pane>
+
+        <a-tab-pane :key="3" tab="鏂囨。鐗堟湰">
+          <DocumentVersionTableList ref="documentVersionTableRef" :currentDocumentInfo="currentLevelInfo"
+                                    @handleTableContextMenuOpen="handleTableContextMenuOpen"
+                                    @releaseFilePreviewApi="releaseFilePreviewApi"
+                                    :size="containerSize"/>
+        </a-tab-pane>
+
+        <a-tab-pane :key="4" tab="浣跨敤璁惧" v-if="currentLevelInfo.attributionType===5">
+          <UseDocumentEquipmentTableList ref="useDocumentEquipmentTableRef" :currentDocumentInfo="currentLevelInfo"
+                                         :size="containerSize"/>
+        </a-tab-pane>
+      </template>
+    </a-tabs>
 
     <TableContextMenu :tableRowInfo="currentRightClickedTableRowInfo" ref="tableContextMenuRef"/>
-  </a-tabs>
+  </div>
 </template>
 
 <script>
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue
index 7551d6b..4dcd066 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureMainTop.vue
@@ -1,21 +1,23 @@
 <template>
-  <a-tabs v-model="activeTabKey" @contextmenu.native="e=>e.preventDefault()"
-          v-if="Object.keys(currentTreeNodeInfo).length!==0">
-    <a-tab-pane :key="1" tab="NC鏂囨。" v-if="currentTreeNodeInfo.type===5||currentTreeNodeInfo.type===6">
-      <NcDocumentTableList ref="ncDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
-                           @handleTableContextMenuOpen="handleTableContextMenuOpen" :size="tableContainerSize"/>
-    </a-tab-pane>
+  <div v-if="currentTreeNodeInfo.type!==4">
+    <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">
+        <NcDocumentTableList ref="ncDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
+                             @handleTableContextMenuOpen="handleTableContextMenuOpen" :size="tableContainerSize"/>
+      </a-tab-pane>
 
-    <a-tab-pane :key="1" tab="鍏朵粬鏂囨。" v-else>
-      <OtherDocumentTableList ref="otherDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
-                              @handleTableContextMenuOpen="handleTableContextMenuOpen" :size="tableContainerSize"/>
-    </a-tab-pane>
+      <a-tab-pane :key="2" tab="鍏朵粬鏂囨。">
+        <OtherDocumentTableList ref="otherDocumentTableListRef" :currentTreeNodeInfo="currentTreeNodeInfo"
+                                @handleTableContextMenuOpen="handleTableContextMenuOpen" :size="tableContainerSize"/>
+      </a-tab-pane>
+    </a-tabs>
 
     <TableContextMenu :tableRowInfo="currentRightClickedTableRowInfo" ref="tableContextMenuRef"/>
 
     <DocumentBatchDeleteModal :currentDocumentInfo="currentRightClickedTableRowInfo" :size="tableContainerSize"
                               @reloadDocumentListData="reloadDocumentListData" ref="documentBatchDeleteModalRef"/>
-  </a-tabs>
+  </div>
 </template>
 
 <script>
@@ -30,10 +32,11 @@
     components: { DocumentBatchDeleteModal, TableContextMenu, OtherDocumentTableList, NcDocumentTableList },
     data() {
       return {
-        activeTabKey: 1,
+        activeTabKey: 2,
         tableContainerSize: 'small',
         currentRightClickedTableRowInfo: {},
-        currentTreeNodeInfo: {}
+        currentTreeNodeInfo: {},
+        hasLoadedDataTabKeyArray: []
       }
     },
     created() {
@@ -64,18 +67,35 @@
         // 浠庢爲缁勪欢鎺ュ彈鏍戣妭鐐逛俊鎭悗浠庣埗缁勪欢娴佸叆瀛愮粍浠�
         this.currentTreeNodeInfo = treeNodeInfo
         // 娓呯┖涓婁竴鑺傜偣宸茬粡鍔犺浇杩囧緱鏂囨。鍒楄〃tabKey
+        this.hasLoadedDataTabKeyArray = []
         if (treeNodeInfo.type === 5 || treeNodeInfo.type === 6) {
+          this.activeTabKey = 1
           this.$nextTick(() => {
             if (this.$refs.ncDocumentTableListRef) this.$refs.ncDocumentTableListRef.loadData(1)
           })
         } else {
+          this.activeTabKey = 2
           this.$nextTick(() => {
             if (this.$refs.otherDocumentTableListRef) this.$refs.otherDocumentTableListRef.loadData(1)
           })
         }
+        this.hasLoadedDataTabKeyArray.push(this.activeTabKey)
       },
 
       /**
+       * tab鏍忓垏鎹㈡椂瑙﹀彂
+       * @param activeTabKey 鍒囨崲鍚庣殑tabKey
+       */
+      handleTabChange(activeTabKey) {
+        if (!this.hasLoadedDataTabKeyArray.includes(activeTabKey)) {
+          this.$nextTick(() => {
+            if (this.$refs.otherDocumentTableListRef) this.$refs.otherDocumentTableListRef.loadData(1)
+          })
+          // 闃绘鎺ュ彛鍦ㄥ悓涓�鏂囨。涓�娆$偣鍑诲唴澶氭瑙﹀彂
+          this.hasLoadedDataTabKeyArray.push(activeTabKey)
+        }
+      },
+      /**
        * 鏂囨。浠ュ強NC绋嬪簭瀵煎叆/鍑哄簱/鍏ュ簱鎴愬姛鍚庤Е鍙戦噸鏂板姞杞芥枃妗e垪琛�
        * @param docClassCode 鏂囨。绫诲埆
        * @param attributionId 鑺傜偣Id
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
index ae81024..1a8ebdf 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
@@ -36,6 +36,7 @@
             <a-icon slot="product" type="shopping"/>
             <a-icon slot="component" type="camera"/>
             <a-icon slot="part" type="hdd"/>
+            <a-icon slot="processSpecVersion" type="tag"/>
             <a-icon slot="process" type="apartment"/>
             <a-icon slot="processStep" type="tool"/>
           </a-tree>
@@ -50,6 +51,8 @@
     <ComponentModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/>
     <!--闆朵欢寮圭獥-->
     <PartModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/>
+    <!--宸ヨ壓瑙勭▼鐗堟湰寮圭獥-->
+    <ProcessSpecVersionModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/>
     <!--宸ュ簭寮圭獥-->
     <ProcessModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/>
     <!--宸ユ寮圭獥-->
@@ -66,6 +69,7 @@
   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'
@@ -76,6 +80,7 @@
       AssignPermissionModal,
       ProcessStepModal,
       ProcessModal,
+      ProcessSpecVersionModal,
       PartModal,
       ComponentModal,
       ProductModal,
@@ -89,6 +94,7 @@
         treeDataSource: [],
         selectedKeys: [],
         expandedKeys: [],
+        beforeSearchExpandedKeys: [],
         searchValue: '',
         dataList: [],
         autoExpandParent: true,
@@ -116,7 +122,7 @@
             this.treeDataSource = res.list
             this.generateList(this.treeDataSource)
             // this.expandedKeys = this.allTreeKeys
-            if (this.expandedKeys.length === 0) this.expandedKeys = [this.treeDataSource[0].id]
+            if (this.expandedKeys.length === 0) this.expandedKeys = this.beforeSearchExpandedKeys = [this.treeDataSource[0].id]
           } else {
             this.$message.warn(res.message)
           }
@@ -203,27 +209,36 @@
        * @param expandedKeys 灞曞紑椤筴ey
        */
       handleTreeExpand(expandedKeys) {
-        this.expandedKeys = expandedKeys
+        this.expandedKeys = this.beforeSearchExpandedKeys = expandedKeys
         this.autoExpandParent = false
       },
 
       /* 杈撳叆鏌ヨ鍐呭鍙樺寲鏃惰Е鍙� */
       handleSearchInputChange() {
         let search = this.searchInput
-        let expandedKeys = this.dataList
-          .map(item => {
-            if (item.title != null) {
-              if (item.title.indexOf(search) > -1) {
-                return this.getParentKey(item.key, this.treeDataSource)
+        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
               }
-              return null
-            }
-          })
-          .filter((item, i, self) => item && self.indexOf(item) === i)
+            })
+            .filter((item, i, self) => item && self.indexOf(item) === i)
+          autoExpandParent = true
+        } else {
+          expandedKeys = this.beforeSearchExpandedKeys
+          autoExpandParent = false
+        }
+
         Object.assign(this, {
           expandedKeys,
           searchValue: search,
-          autoExpandParent: true
+          autoExpandParent
         })
       },
 
@@ -284,6 +299,9 @@
           case 3:
             treeNode.slots = { icon: 'part' }
             break
+          case 4:
+            treeNode.slots = { icon: 'processSpecVersion' }
+            break
           case 5:
             treeNode.slots = { icon: 'process' }
             break
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
index 68fa9e7..fc878a6 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
@@ -51,11 +51,20 @@
           //闆朵欢
           part: [
             { label: '娣诲姞闆朵欢', code: 'parts_add', icon: 'plus', isCommonMethod: false },
-            { label: '鍒涘缓宸ュ簭', code: 'parts_add_relative', icon: 'plus', isCommonMethod: false },
+            { label: '鍒涘缓宸ヨ壓瑙勭▼鐗堟湰', code: 'parts_add_relative', icon: 'plus', isCommonMethod: false },
+            // { label: '鍒涘缓宸ュ簭', code: 'parts_add_relative', icon: 'plus', isCommonMethod: false },
             { label: '缂栬緫闆朵欢淇℃伅', code: 'parts_edit', icon: 'edit', isCommonMethod: false },
             // {  label: '瀵煎嚭鏂囨。', code: 'parts_export', icon: 'export', isCommonMethod: true },
             { label: '瀵煎叆鍏朵粬鏂囨。', code: 'parts_import', icon: 'import', isCommonMethod: true },
             { label: '鍒犻櫎', code: 'parts_delete', icon: 'delete', isCommonMethod: true },
+            { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
+          ],
+          //宸ヨ壓瑙勭▼鐗堟湰
+          processSpecVersion: [
+            { 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_delete', icon: 'delete', isCommonMethod: true },
             { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
           ],
           //宸ュ簭
@@ -64,8 +73,8 @@
             { label: '鍒涘缓宸ユ', code: 'process_add_child', icon: 'plus', isCommonMethod: false },
             { label: '缂栬緫宸ュ簭淇℃伅', code: 'process_edit', icon: 'edit', isCommonMethod: false },
             { label: '鍒犻櫎', code: 'process_delete', icon: 'delete', isCommonMethod: true },
-            // {  label: '瀵煎嚭NC绋嬪簭', code: 'process_export', icon: 'import', isCommonMethod: true },
-            { label: '瀵煎叆NC绋嬪簭', code: 'process_import', icon: 'export', isCommonMethod: true },
+            // {  label: '瀵煎嚭NC绋嬪簭', code: 'process_export', icon: 'export', isCommonMethod: true },
+            { label: '瀵煎叆NC绋嬪簭', code: 'process_import', icon: 'import', isCommonMethod: true },
             { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
           ],
           //宸ユ
@@ -74,7 +83,7 @@
             { label: '缂栬緫宸ユ淇℃伅', code: 'processStep_edit', icon: 'edit', isCommonMethod: false },
             { label: '鍒犻櫎', code: 'processStep_delete', icon: 'delete', isCommonMethod: true },
             // {  label: '瀵煎嚭NC绋嬪簭', code: 'processStep_export', icon: 'import', isCommonMethod: true },
-            { label: '瀵煎叆NC绋嬪簭', code: 'processStep_import', icon: 'export', isCommonMethod: true },
+            { label: '瀵煎叆NC绋嬪簭', code: 'processStep_import', icon: 'import', isCommonMethod: true },
             { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
           ]
         }
@@ -89,6 +98,8 @@
             return 'component'
           case 3:
             return 'part'
+          case 4:
+            return 'processSpecVersion'
           case 5:
             return 'process'
           case 6:

--
Gitblit v1.9.3