From a95bec239fd7599b4c8766eff35c3d96e813cb25 Mon Sep 17 00:00:00 2001
From: lyh <925863403@qq.com>
Date: 星期四, 17 四月 2025 15:27:24 +0800
Subject: [PATCH] 新增检索电子样板

---
 src/views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue  |  507 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue            |    9 
 src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue |    4 
 3 files changed, 517 insertions(+), 3 deletions(-)

diff --git a/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue b/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue
new file mode 100644
index 0000000..e1acbe1
--- /dev/null
+++ b/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue
@@ -0,0 +1,507 @@
+<template>
+  <a-modal width="75%" :title="title" :visible="visible" @cancel="visible=false" :maskClosable="false" centered
+           @ok="handleAssignDocumentToDevice">
+    <div class="tabs-container">
+      <div style="width: 72%">
+        <a-tabs>
+          <a-tab-pane tab="鏂囨。鍒楄〃">
+            <div class="table-page-search-wrapper">
+              <a-form layout="inline" @keyup.enter.native="searchQuery">
+                <a-row :gutter="24">
+                  <a-col :md="7" :sm="7">
+                    <a-form-item label="鏂囦欢鍚嶇О">
+                      <a-input placeholder="璇疯緭鍏ユ枃浠跺悕绉�" v-model="queryParam.docName" allow-clear></a-input>
+                    </a-form-item>
+                  </a-col>
+
+                  <a-col :md="11" :sm="11">
+                    <a-form-item label="涓婁紶鏃堕棿">
+                      <a-range-picker v-model="date" value-format="YYYY-MM-DD"
+                                      @change="handleDateChange" allow-clear></a-range-picker>
+                    </a-form-item>
+                  </a-col>
+
+                  <a-col :md="7" :sm="7">
+                    <a-form-item label="鑺傜偣鍚嶇О">
+                      <a-input placeholder="璇疯緭鍏ヨ妭鐐瑰悕绉�" v-model="queryParam.treeName" allow-clear></a-input>
+                    </a-form-item>
+                  </a-col>
+
+                  <a-col :md="7" :sm="7">
+                    <a-form-item label="鑺傜偣浠e彿">
+                      <a-input placeholder="璇疯緭鍏ヨ妭鐐逛唬鍙�" v-model="queryParam.treeCode" allow-clear></a-input>
+                    </a-form-item>
+                  </a-col>
+
+                  <a-col :md="7" :sm="7">
+                    <a-form-item label="鏉愯川">
+                      <a-input placeholder="璇疯緭鍏ユ潗璐�" v-model="queryParam.structureType" allow-clear></a-input>
+                    </a-form-item>
+                  </a-col>
+
+                  <a-col :md="4" :sm="4">
+                    <a-button type="primary" @click="searchQuery" icon="search">鏌ヨ</a-button>
+                  </a-col>
+                </a-row>
+              </a-form>
+            </div>
+
+
+            <a-table :columns="columns" :data-source="dataSource" bordered :pagination="false" :loading="loading"
+                     :rowSelection="{selectedRowKeys: selectedRowKeys,selectedRows:selectionRows, onChange: onSelectChange}"
+                     @change="handleTableChange"
+                     :scroll="{y:456}" :size="size" rowKey="docId">
+
+            </a-table>
+          </a-tab-pane>
+        </a-tabs>
+      </div>
+
+      <div style="width: 25%">
+        <a-tabs>
+          <a-tab-pane tab="璁惧鍒楄〃">
+            <a-spin :spinning="spinning">
+              <div style="display: flex;flex-direction: column;">
+                <div style="display: flex">
+                  <a-input placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�" allowClear v-model="searchInput"
+                           @change="handleSearchInputChange"/>
+                  <a-button type="primary" @click="isExpandAllTreeNode=!isExpandAllTreeNode" style="margin: 0 8px">
+                    灞曞紑/鎶樺彔
+                  </a-button>
+                </div>
+
+                <!--浜у搧缁撴瀯鏍�-->
+                <div style="overflow:auto;margin-top: 10px;height: 400px">
+                  <a-tree blockNode checkable :checkedKeys="checkedKeys" :expandedKeys.sync="expandedKeys"
+                          :autoExpandParent="autoExpandParent" @select="handleTreeNodeSelect"
+                          :treeData="treeDataSource" @check="handleTreeNodeCheck" @expand="handleTreeNodeExpand">
+                    <template slot="title" slot-scope="{ title, parentId, entity, key:treeKey,type}">
+                     <span v-if="title.indexOf(searchValue) > -1">{{ title.substr(0, title.indexOf(searchValue)) }}<span
+                       class="replaceSearch">{{
+                         searchValue
+                       }}</span>{{ title.substr(title.indexOf(searchValue) + searchValue.length) }}</span>
+                      <span v-else>{{ title }}</span>
+                    </template>
+                  </a-tree>
+                </div>
+
+                <div>
+                  <a-form>
+                    <a-form-item label="鎸囨淳鍘熷洜">
+                      <a-textarea v-model="queryParam.applyReason" rows="3" style="resize: none"></a-textarea>
+                    </a-form-item>
+                  </a-form>
+                </div>
+              </div>
+            </a-spin>
+          </a-tab-pane>
+        </a-tabs>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+import { getAction } from '@/api/manage'
+import dncApi from '@/api/dnc'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
+
+export default {
+  name: 'NcDocumentAssignModal',
+  components: {},
+  mixins: [JeecgListMixin],
+  props: {
+    currentDocumentInfo: {
+      type: Object
+    },
+    size: {
+      type: String
+    }
+  },
+  data() {
+    return {
+      disableMixinCreated: true,
+      visible: false,
+      title: '',
+      columns: [
+        {
+          title: '搴忓彿',
+          dataIndex: 'rowIndex',
+          key: 'rowIndex',
+          width: 50,
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
+          }
+        },
+        {
+          title: '鑺傜偣鍚嶇О',
+          dataIndex: 'nodeName',
+          align: 'center',
+          width: 80,
+          sorter: false
+        },
+        {
+          title: '鑺傜偣浠e彿',
+          dataIndex: 'nodeCode',
+          align: 'center',
+          width: 80,
+          sorter: false
+        },
+        {
+          title: '鏂囦欢鍚嶇О',
+          dataIndex: 'docName',
+          key: 'docName',
+          align: 'center',
+          width: 200,
+          sorter: true
+        },
+        {
+          title: '鍑哄簱鐘舵��',
+          dataIndex: 'pullStatus_dictText',
+          key: 'pullStatus',
+          align: 'center',
+          width: 100,
+          filters: [
+            { text: '鏈嚭搴�', value: 1 },
+            { text: '宸插嚭搴�', value: 2 }
+          ]
+        },
+        {
+          title: '鐘�  鎬�',
+          dataIndex: 'docDispatchStatus_dictText',
+          key: 'docDispatchStatus',
+          align: 'center',
+          width: 60,
+          filters: [
+            { text: '缂栧埗', value: 1 },
+            { text: '鏍″', value: 2 },
+            { text: '鎵瑰噯', value: 3 },
+            { text: '璇曞垏', value: 4 },
+            { text: '瀹氬瀷', value: 5 }
+          ]
+        },
+        {
+          title: '鍒涘缓鏃堕棿',
+          dataIndex: 'createTime',
+          align: 'center',
+          width: 150,
+          sorter: true
+        }
+      ],
+      searchValue: '',
+      searchInput: '',
+      spinning: false,
+      treeDataSource: [],
+      allTreeKeys: [],
+      checkedKeys: [],
+      expandedKeys: [],
+      autoExpandParent: true,
+      isExpandAllTreeNode: true,
+      date: [],
+      url: {
+        list: '/nc/product/query'
+      }
+    }
+  },
+  watch: {
+    visible: {
+      handler(value) {
+        if (value) {
+          this.resetData()
+          this.loadData()
+          this.getDocumentAssignDeviceTreeByApi()
+        }
+      }
+    },
+    isExpandAllTreeNode: {
+      handler(value) {
+        if (value) this.expandedKeys = this.allTreeKeys
+        else this.expandedKeys = []
+      }
+    }
+  },
+  created() {
+    this.$bus.$on('treeMenuItemMethodTrigger', this.triggerCorrespondingMethod)
+  },
+  methods: {
+    handleSearch() {
+      this.visible = true
+    },
+    // 鑾峰彇褰撳墠瀵瑰簲鏂囨。鍒楄〃
+    loadData() {
+      this.dataSource = []
+      if (!this.url.list) {
+        this.$message.error('璇疯缃畊rl.list灞炴��!')
+        return
+      }
+      var params = this.getQueryParams()//鏌ヨ鏉′欢
+      if (!params) return false
+      params.attributionType = this.currentDocumentInfo.type
+      params.attributionId = this.currentDocumentInfo.key
+      this.loading = true
+      getAction(this.url.list, params).then((res) => {
+        if (res.success) this.dataSource = res.result
+        else this.$message.warning(res.message)
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+
+    // 鑾峰彇DNC璁惧鏍�
+    getDocumentAssignDeviceTreeByApi() {
+      this.spinning = true
+      this.treeDataSource = []
+      dncApi.getDeviceTreeDataApi()
+        .then(res => {
+          if (res.success) {
+            this.dataList = []
+            this.allTreeKeys = []
+            this.treeDataSource = res.result
+            this.generateList(this.treeDataSource)
+            this.expandedKeys = this.allTreeKeys
+          } else {
+            this.$message.warn(res.message)
+          }
+        })
+        .finally(() => {
+          this.spinning = false
+        })
+    },
+
+    // 鏃堕棿閫夋嫨鍣ㄩ�夋嫨瀹屾垚鍚庤Е鍙�
+    handleDateChange(value) {
+      this.queryParam.startTime = value[0]
+      this.queryParam.endTime = value[1]
+    },
+
+    /**
+     * 琛ㄦ牸鍒嗛〉銆佹帓搴忔敼鍙樸�佺瓫閫夋椂瑙﹀彂
+     * @param pagination 鍒嗛〉鍣ㄩ�夐」
+     * @param filters 绛涢�夐�夐」
+     * @param sorter 鎺掑簭閫夐」
+     */
+    handleTableChange(pagination, filters, sorter) {
+      if (sorter.order) {
+        this.isorter.column = sorter.field
+        this.isorter.order = sorter.order === 'ascend' ? 'asc' : 'desc'
+      } else {
+        this.isorter.column = 'createTime'
+        this.isorter.order = 'desc'
+      }
+      for (let key in filters) {
+        this.filters[key] = filters[key].join(',')
+      }
+      this.loadData()
+    },
+
+    // 鎸囨淳鍒拌澶囩獥鍙g偣鍑荤‘瀹氭寚娲捐澶囧悗瑙﹀彂
+    handleAssignDocumentToDevice() {
+      const {
+        checkedKeys,
+        selectedRowKeys,
+        selectionRows,
+        dataList,
+        $confirm,
+        $notification,
+        currentDocumentInfo,
+        queryParam: { applyReason },
+        $destroyAll,
+        $bus
+      } = this
+      const { attributionId, attributionType } = currentDocumentInfo
+      const paramsArray = []
+      // 杩囨护杞﹂棿key浠呮斁鍏ヨ澶噆ey
+      const treeCheckedDeviceKeys = []
+      checkedKeys.forEach(checkedKey => {
+        const device = dataList.find(item => item.key === checkedKey && item.type === 2)
+        if (device) treeCheckedDeviceKeys.push(device.key)
+      })
+
+      if (treeCheckedDeviceKeys.length === 0 || selectedRowKeys.length === 0) {
+        $notification.warning({
+          message: '娑堟伅',
+          description: '璇烽�夋嫨璁惧鎴栨枃妗�'
+        })
+        return
+      }
+
+      $confirm({
+        title: '鎻愮ず',
+        content: `纭鎻愪氦鍚楋紵`,
+        okText: '纭',
+        cancelText: '鍙栨秷',
+        onOk: () => {
+          // 鍙岄噸寰幆纭畾姣忎竴缁勮澶囦笌鏂囨。鐨勫弬鏁�
+          treeCheckedDeviceKeys.forEach(deviceId => {
+            selectionRows.forEach(({ docId, publishFileId ,attributionId,attributionType}) => {
+              paramsArray.push({
+                docId,
+                deviceId,
+                fileId: publishFileId,
+                attributionId,
+                attributionType,
+                applyReason
+              })
+            })
+          })
+
+          paramsArray.forEach(item => {
+            dncApi.assignDocumentToDeviceApi(item)
+              .then(res => {
+                if (res.success) {
+                  $bus.$emit('reloadMainBottomTableData', 'useDocumentEquipment')
+                  $notification.success({
+                    message: '娑堟伅',
+                    description: res.message
+                  })
+                } else {
+                  $notification.error({
+                    message: '娑堟伅',
+                    description: res.message
+                  })
+                }
+              })
+              .catch(err => {
+                $notification.error({
+                  message: '娑堟伅',
+                  description: err.message
+                })
+              })
+              .finally(() => {
+                $destroyAll()
+              })
+          })
+        },
+        onCancel: () => {
+          $destroyAll()
+        }
+      })
+    },
+
+    /* 杈撳叆鏌ヨ鍐呭鍙樺寲鏃惰Е鍙� */
+    handleSearchInputChange() {
+      let search = this.searchInput
+      console.log('data', this.dataList)
+      console.log('search', search)
+      let 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)
+      Object.assign(this, {
+        expandedKeys,
+        searchValue: search,
+        autoExpandParent: true
+      })
+    },
+
+    /**
+     * 鏍戣妭鐐瑰睍寮�鍚堝苟鏃惰Е鍙�
+     * @param expandedKeys 灞曞紑椤筴ey
+     */
+    handleTreeNodeExpand(expandedKeys) {
+      this.expandedKeys = expandedKeys
+      this.autoExpandParent = false
+    },
+
+    /**
+     * 鏍戣妭鐐瑰閫夋閫変腑鏃惰Е鍙�
+     * @param selectedKeys 閫変腑鑺傜偣key
+     * @param {node} node 鑺傜偣瀵硅薄
+     */
+    handleTreeNodeCheck(checkedKeys, { node }) {
+      let record = node.dataRef
+      this.checkedKeys = checkedKeys
+    },
+
+    /**
+     * 鏍戣妭鐐归�変腑鏃惰Е鍙戯紙妯℃嫙鏍戣妭鐐瑰閫夋閫変腑鏃剁殑鏁堟灉锛�
+     * @param selectedKeys 閫変腑鑺傜偣key
+     * @param {node} node 鑺傜偣瀵硅薄
+     */
+    handleTreeNodeSelect(selectedKeys, { node }) {
+      node.$el.childNodes[1].click()
+    },
+
+    /**
+     * 閫掑綊鑾峰緱杈撳叆椤圭殑鐖剁骇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
+            console.log('parentKey', parentKey)
+          } else if (
+            this.getParentKey(key, node.children)) {
+            parentKey = this.getParentKey(key, node.children)
+          }
+        }
+      }
+      return parentKey
+    },
+
+    /**
+     * 閫掑綊鑾峰緱鎵�鏈夋爲鑺傜偣key
+     * @param data 璁惧鏍戞暟鎹�
+     */
+    generateList(data) {
+      for (let i = 0; i < data.length; i++) {
+        const node = data[i]
+        const key = node.key
+        const title = node.title
+        const type = node.type
+        this.dataList.push({ key, title, type })
+        this.allTreeKeys.push(key)
+        if (node.children) this.generateList(node.children)
+      }
+    },
+
+    resetData() {
+      this.searchInput = ''
+      this.expandedKeys = []
+      this.selectedRowKeys = []
+      this.selectionRows = {}
+      this.checkedKeys = []
+      this.filters = {}
+      this.isorter = Object.assign({}, this.defaultSorter)
+    },
+    triggerCorrespondingMethod({ methodName, modalTitle }) {
+      if (this[methodName]) {
+        this[methodName]()
+        this.title = modalTitle
+      }
+    }
+  }
+}
+</script>
+
+<style scoped lang="less">
+/deep/ .ant-modal {
+  .tabs-container {
+    display: flex;
+    justify-content: space-between;
+
+    .replaceSearch {
+      color: #40a9ff;
+      font-weight: bold;
+      background-color: rgb(204, 204, 204);
+    }
+  }
+
+}
+
+::-webkit-scrollbar {
+  width: 8px;
+}
+</style>
\ No newline at end of file
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
index 7e5bd4b..a734005 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTree.vue
@@ -61,6 +61,8 @@
     <ProcessStepModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/>
     <!--鏉冮檺閰嶇疆寮圭獥-->
     <AssignPermissionModal :currentTreeNodeInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/>
+    <!--妫�绱㈢數瀛愭ā鏉垮脊绐�-->
+    <NcDocumentSearchModal :currentDocumentInfo="rightClickSelected" @submitSuccess="modalFormSubmitSuccess"/>
     <!--浜у搧缁撴瀯鏍戝熀鏈彸閿彍鍗�(绌虹櫧澶勮Е鍙�)-->
     <ProductStructureBaseContextMenu ref="baseContextmenuRef"/>
   </a-card>
@@ -78,8 +80,8 @@
 import ProcessStepModal from './ProcessStep/ProcessStepModal'
 import AssignPermissionModal from './Permission/AssignPermissionModal'
 import DeviceCustomTypeModal from '@views/dnc/base/modules/ProductStructure/DeviceCustomType/DeviceCustomTypeModal.vue'
-import ProductStructureBaseContextMenu
-  from '@views/dnc/base/modules/ProductStructure/ProductStructureBaseContextMenu.vue'
+import ProductStructureBaseContextMenu from '@views/dnc/base/modules/ProductStructure/ProductStructureBaseContextMenu.vue'
+import NcDocumentSearchModal from '@views/dnc/base/modules/ProductStructure/Document/NcDocumentSearchModal.vue'
 
 export default {
   name: 'ProductStructureTree',
@@ -93,7 +95,8 @@
     PartModal,
     ComponentModal,
     ProductModal,
-    ProductStructureTreeContextMenu
+    ProductStructureTreeContextMenu,
+    NcDocumentSearchModal
   },
   data() {
     return {
diff --git a/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue b/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
index 6e4eacb..36b9b8a 100644
--- a/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
+++ b/src/views/dnc/base/modules/ProductStructure/ProductStructureTreeContextMenu.vue
@@ -40,6 +40,7 @@
           { label: '缂栬緫浜у搧淇℃伅', code: 'product_edit', icon: 'edit', isCommonMethod: false },
           // {  label: '瀵煎嚭鏂囨。', code: 'product_export', icon: 'export', isCommonMethod: true },
           { label: '瀵煎叆鍏朵粬鏂囨。', code: 'product_import', icon: 'import', isCommonMethod: true },
+          { label: '妫�绱㈢數瀛愭牱鏉�', code: 'product_search', icon: 'search', isCommonMethod: true },
           { label: '鍒犻櫎', code: 'product_delete', icon: 'delete', isCommonMethod: true },
           { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
         ],
@@ -51,6 +52,7 @@
           { label: '缂栬緫閮ㄤ欢淇℃伅', code: 'component_edit', icon: 'edit', isCommonMethod: false },
           // {  label: '瀵煎嚭鏂囨。', code: 'component_export', icon: 'export', isCommonMethod: true },
           { label: '瀵煎叆鍏朵粬鏂囨。', code: 'component_import', icon: 'import', isCommonMethod: true },
+          { label: '妫�绱㈢數瀛愭牱鏉�', code: 'component_search', icon: 'search', isCommonMethod: true },
           { label: '鍒犻櫎', code: 'component_delete', icon: 'delete', isCommonMethod: true },
           { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
         ],
@@ -62,6 +64,7 @@
           { 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_search', icon: 'search', isCommonMethod: true },
           { label: '鍒犻櫎', code: 'parts_delete', icon: 'delete', isCommonMethod: true },
           { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
         ],
@@ -71,6 +74,7 @@
           { 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_search', icon: 'search', isCommonMethod: true },
           { label: '鍒犻櫎', code: 'version_delete', icon: 'delete', isCommonMethod: true },
           { label: '鏉冮檺閰嶇疆', code: 'public_assign_permission', icon: 'idcard', isCommonMethod: true }
         ],

--
Gitblit v1.9.3