From a22a69946912221dab4d32987dda6c4c8ba3c5d8 Mon Sep 17 00:00:00 2001
From: cuilei <ray_tsu1@163.com>
Date: 星期二, 24 六月 2025 17:43:24 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 src/views/dnc/base/modules/ProductStructure/Document/NcDocumentAssignModal.vue |  617 +++++++++++++++++++++++++++++++++++---------------------
 1 files changed, 386 insertions(+), 231 deletions(-)

diff --git a/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentAssignModal.vue b/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentAssignModal.vue
index f00bfda..0788c06 100644
--- a/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentAssignModal.vue
+++ b/src/views/dnc/base/modules/ProductStructure/Document/NcDocumentAssignModal.vue
@@ -10,13 +10,14 @@
                 <a-row :gutter="24">
                   <a-col :md="7" :sm="7">
                     <a-form-item label="鏂囦欢鍚嶇О">
-                      <a-input placeholder="璇疯緭鍏ユ枃浠跺悕绉�" v-model="queryParam.docName"></a-input>
+                      <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="queryParam.collectTime"></a-range-picker>
+                      <a-range-picker v-model="date" value-format="YYYY-MM-DD"
+                                      @change="handleDateChange" allow-clear></a-range-picker>
                     </a-form-item>
                   </a-col>
 
@@ -29,9 +30,14 @@
 
 
             <a-table :columns="columns" :data-source="dataSource" bordered :pagination="false" :loading="loading"
-                     :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}"
+                     :rowSelection="{selectedRowKeys: selectedRowKeys,selectedRows:selectionRows, onChange: onSelectChange}"
+                     @change="handleTableChange"
                      :scroll="{y:456}" :size="size" rowKey="docId">
 
+              <!-- 瀛楃涓茶秴闀挎埅鍙栫渷鐣ュ彿鏄剧ず-->
+              <span slot="docName" slot-scope="text">
+                <j-ellipsis :value="text"/>
+              </span>
             </a-table>
           </a-tab-pane>
         </a-tabs>
@@ -45,26 +51,22 @@
                 <div style="display: flex">
                   <a-input placeholder="杈撳叆鍏抽敭瀛楄繘琛屾悳绱�" allowClear v-model="searchInput"
                            @change="handleSearchInputChange"/>
-                  <a-dropdown :trigger="['click']" placement="bottomCenter" style="margin: 0 8px">
-                    <a-menu slot="overlay">
-                      <a-menu-item key="1" @click="expandedKeys = allTreeKeys">灞曞紑鎵�鏈�</a-menu-item>
-                      <a-menu-item key="2" @click="expandedKeys = []">鍚堝苟鎵�鏈�</a-menu-item>
-                    </a-menu>
-                    <a-button>
-                      <a-icon type="bars"/>
-                    </a-button>
-                  </a-dropdown>
+                  <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 ref="tree" checkable :checkedKeys="checkedKeys" :expandedKeys.sync="expandedKeys"
-                          :autoExpandParent="autoExpandParent"
-                          :treeData="treeDataSource" @check="handleTreeNodeCheck" @expand="handleTreeExpand">
-                    <template slot="title" slot-scope="{ label, parentId, entity, key:treeKey,type}">
-                     <span v-if="label.indexOf(searchValue) > -1">{{ label.substr(0, label.indexOf(searchValue)) }}<span
-                       class="replaceSearch">{{ searchValue }}</span>{{ label.substr(label.indexOf(searchValue) + searchValue.length) }}</span>
-                      <span v-else>{{ label }}</span>
+                  <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>
@@ -86,229 +88,382 @@
 </template>
 
 <script>
-  import { getAction } from '@/api/manage'
-  import dncApi from '@/api/dnc'
-  import { JeecgListMixin } from '@/mixins/JeecgListMixin'
-  import ATextarea from 'ant-design-vue/es/input/TextArea'
+import { getAction } from '@/api/manage'
+import dncApi from '@/api/dnc'
+import { JeecgListMixin } from '@/mixins/JeecgListMixin'
 
-  export default {
-    name: 'NcDocumentAssignModal',
-    components: { ATextarea },
-    mixins: [JeecgListMixin],
-    props: {
-      currentDocumentInfo: {
-        type: Object
-      },
-      size: {
-        type: String
-      }
+export default {
+  name: 'NcDocumentAssignModal',
+  components: {},
+  mixins: [JeecgListMixin],
+  props: {
+    currentDocumentInfo: {
+      type: Object
     },
-    data() {
-      return {
-        disableMixinCreated: true,
-        visible: false,
-        title: '',
-        columns: [
-          {
-            title: '搴忓彿',
-            dataIndex: 'rowIndex',
-            key: 'rowIndex',
-            width: 65,
-            align: 'center',
-            customRender: function(t, r, index) {
-              return parseInt(index) + 1
-            }
-          },
-          { title: '鏂囦欢鍚嶇О', dataIndex: 'docName', align: 'center', width: 300 },
-          { title: '璁惧缂栧彿', dataIndex: 'docCode', align: 'center' },
-          { title: '鍑哄簱鐘舵��', dataIndex: 'pullStatus_dictText', align: 'center' },
-          { title: '鐘�  鎬�', dataIndex: 'docStatus_dictText', align: 'center' },
-          { title: '涓婁紶鏃堕棿', dataIndex: 'createTime', align: 'center', width: 200 }
-        ],
-        searchValue: '',
-        searchInput: '',
-        spinning: false,
-        treeDataSource: [],
-        allTreeKeys: [],
-        checkedKeys: [],
-        expandedKeys: [],
-        autoExpandParent: true,
-        url: {
-          list: '/nc/doc/find/list'
-        }
-      }
-    },
-    watch: {
-      visible: {
-        handler(value) {
-          if (value) {
-            this.resetData()
-            this.loadData()
-            this.getDocumentAssignDeviceTreeByApi()
+    size: {
+      type: String
+    }
+  },
+  data() {
+    return {
+      disableMixinCreated: true,
+      visible: false,
+      title: '',
+      columns: [
+        {
+          title: '搴忓彿',
+          dataIndex: 'rowIndex',
+          key: 'rowIndex',
+          width: 65,
+          align: 'center',
+          customRender: function(t, r, index) {
+            return parseInt(index) + 1
           }
+        },
+        {
+          title: '鏂囦欢鍚嶇О',
+          dataIndex: 'docName',
+          key: 'docName',
+          align: 'center',
+          scopedSlots: { customRender: 'docName' },
+          width: 300,
+          sorter: true
+        },
+        { title: '璁惧缂栧彿', dataIndex: 'docCode', align: 'center' },
+        {
+          title: '鍑哄簱鐘舵��',
+          dataIndex: 'pullStatus_dictText',
+          key: 'pullStatus',
+          align: 'center',
+          filters: [
+            { text: '鏈嚭搴�', value: 1 },
+            { text: '宸插嚭搴�', value: 2 }
+          ]
+        },
+        {
+          title: '鐘�  鎬�',
+          dataIndex: 'docDispatchStatus_dictText',
+          key: 'docDispatchStatus',
+          align: 'center',
+          filters: [
+            { text: '缂栧埗', value: 1 },
+            { text: '鏍″', value: 2 },
+            { text: '鎵瑰噯', value: 3 },
+            { text: '璇曞垏', value: 4 },
+            { text: '瀹氬瀷', value: 5 }
+          ]
+        },
+        {
+          title: '鍒涘缓鏃堕棿',
+          dataIndex: 'createTime',
+          align: 'center',
+          width: 200,
+          sorter: true
         }
-      }
-    },
-    methods: {
-      loadData() {
-        this.dataSource = []
-        if (!this.url.list) {
-          this.$message.error('璇疯缃畊rl.list灞炴��!')
-          return
-        }
-        var params = this.getQueryParams()//鏌ヨ鏉′欢
-        if (!params) {
-          return false
-        }
-        const { attributionType, attributionId, param } = this.currentDocumentInfo
-        console.log('currentDocumentInfo', this.currentDocumentInfo)
-        params.attributionType = attributionType
-        params.attributionId = attributionId
-        params.docClassCode = param
-        console.log('params', params)
-        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
-        })
-      },
-
-      getDocumentAssignDeviceTreeByApi() {
-        this.spinning = true
-        this.treeDataSource = []
-        dncApi.getDocumentAssignDeviceTreeApi(this.currentDocumentInfo)
-          .then(res => {
-            if (res.success) {
-              this.dataList = []
-              this.allTreeKeys = []
-              this.treeDataSource = res.list
-              this.generateList(this.treeDataSource)
-            } else {
-              this.$message.warn(res.message)
-            }
-          })
-          .finally(() => {
-            this.spinning = false
-          })
-      },
-
-      handleAssignDocumentToDevice() {
-        const param = {}
-        console.log('table', this.selectedRowKeys)
-        const treeCheckedDeviceKeys = []
-        this.checkedKeys.forEach(checkedKey => {
-          const deviceId = this.dataList.find(item => item.key === checkedKey && item.type === 2)
-          if (deviceId) treeCheckedDeviceKeys.push(deviceId.key)
-        })
-
-        console.log('treeCheckedDeviceKeys', treeCheckedDeviceKeys)
-      },
-
-      /* 杈撳叆鏌ヨ鍐呭鍙樺寲鏃惰Е鍙� */
-      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
-       */
-      handleTreeExpand(expandedKeys) {
-        this.expandedKeys = expandedKeys
-        this.autoExpandParent = false
-      },
-
-      /**
-       * 鏍戣妭鐐瑰閫夋閫変腑鏃惰Е鍙�
-       * @param selectedKeys 閫変腑鑺傜偣key
-       * @param {node} node 鑺傜偣瀵硅薄
-       */
-      handleTreeNodeCheck(checkedKeys, { node }) {
-        let record = node.dataRef
-        this.checkedKeys = checkedKeys
-      },
-
-      /**
-       * 閫掑綊鑾峰緱杈撳叆椤圭殑鐖剁骇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++) {
-          data[i].key = data[i].id
-          const node = data[i]
-          const key = node.id
-          const title = node.label
-          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.checkedKeys = []
+      ],
+      searchValue: '',
+      searchInput: '',
+      spinning: false,
+      treeDataSource: [],
+      allTreeKeys: [],
+      checkedKeys: [],
+      expandedKeys: [],
+      autoExpandParent: true,
+      isExpandAllTreeNode: true,
+      date: [],
+      url: {
+        list: '/nc/doc/find/list'
       }
     }
+  },
+  watch: {
+    visible: {
+      handler(value) {
+        if (value) {
+          this.resetData()
+          this.loadData()
+          this.getDocumentAssignDeviceTreeByApi()
+        }
+      }
+    },
+    isExpandAllTreeNode: {
+      handler(value) {
+        if (value) this.expandedKeys = this.allTreeKeys
+        else this.expandedKeys = []
+      }
+    }
+  },
+  methods: {
+    // 鑾峰彇褰撳墠宸ュ簭鎴栧伐姝ュ搴旀枃妗e垪琛�
+    loadData() {
+      this.dataSource = []
+      if (!this.url.list) {
+        this.$message.error('璇疯缃畊rl.list灞炴��!')
+        return
+      }
+      var params = this.getQueryParams()//鏌ヨ鏉′欢
+      if (!params) return false
+      const { attributionType, attributionId, param } = this.currentDocumentInfo
+      params.attributionType = attributionType
+      params.attributionId = attributionId
+      params.docClassCode = param
+      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 }) => {
+              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.searchValue = ''
+      this.expandedKeys = []
+      this.selectedRowKeys = []
+      this.selectionRows = {}
+      this.checkedKeys = []
+      this.filters = {}
+      this.isorter = Object.assign({}, this.defaultSorter)
+    }
   }
+}
 </script>
 
 <style scoped lang="less">
-  /deep/ .ant-modal {
-    .tabs-container {
-      display: flex;
-      justify-content: space-between;
+/deep/ .ant-modal {
+  .tabs-container {
+    display: flex;
+    justify-content: space-between;
 
-      .replaceSearch {
-        color: #40a9ff;
-        font-weight: bold;
-        background-color: rgb(204, 204, 204);
-      }
+    .replaceSearch {
+      color: #40a9ff;
+      font-weight: bold;
+      background-color: rgb(204, 204, 204);
     }
-
   }
 
+}
+
+::-webkit-scrollbar {
+  width: 8px;
+}
 </style>
\ No newline at end of file

--
Gitblit v1.9.3