From 7859c063db5effe91f2418056e70b848177a3628 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期四, 14 八月 2025 10:51:29 +0800
Subject: [PATCH] 1、保养规范审批流程根据规范分类区分展示保养项明细 2、调整二保批量新增功能

---
 src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue |  229 ++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 162 insertions(+), 67 deletions(-)

diff --git a/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue b/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue
index 225e683..a340fc9 100644
--- a/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue
+++ b/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue
@@ -1,27 +1,43 @@
 <template>
-  <j-modal :title="title" :width="1200" :visible="visible" :confirmLoading="confirmLoading" switchFullscreen centered
+  <j-modal :title="title" :visible="visible" :confirmLoading="confirmLoading" fullscreen
            :mask-closable="false" @ok="handleOk" @cancel="handleCancel" cancelText="鍏抽棴">
     <a-spin :spinning="spinning">
-      <j-vxe-table ref="editableDetailTable" rowNumber rowSelection bordered alwaysEdit toolbar
-                   :toolbarConfig="detail.toolbarConfig" keep-source :height="500"
-                   :dataSource="detail.dataSource" :columns="detail.columns">
-        <!--缁熶竴缂栫爜-->
-        <template v-slot:equipmentId="props">
-          <maintenance-equipment-select placeholder="璇疯緭鍏ョ粺涓�缂栫爜鎴栧悕绉版悳绱�" v-model="props.row.equipmentId"
-                                        maintenanceCategory="SECOND_MAINTENANCE" :allowClear="false"
-                                        @autocompleteForm="autocompleteForm($event,props.row)"/>
-        </template>
+      <a-row :gutter="48">
+        <a-col :span="6">
+          <a-tabs default-active-key="1">
+            <a-tab-pane tab="璁惧缁撴瀯鏍�" key="1">
+              <a-tree showLine ref="tree" :expandedKeys.sync="expandedKeys"
+                      :treeData="treeDataSource" checkable @check="onCheck" v-model="checkedKeys"
+                      @expand="onExpand" @select="handleTreeNodeSelect">
+              </a-tree>
+            </a-tab-pane>
+          </a-tabs>
+        </a-col>
 
-        <!-- 淇濆吇鏃ユ湡-->
-        <template v-slot:maintenanceDate="props">
-          <a-date-picker v-model="props.row.maintenanceDate" value-format="YYYY-MM-DD" :allow-clear="false"/>
-        </template>
+        <a-col :span="18">
+          <a-tabs default-active-key="1">
+            <a-tab-pane tab="璁惧鏄庣粏" key="1">
+              <j-vxe-table ref="editableDetailTable" rowNumber rowSelection bordered alwaysEdit keep-source
+                           :height="500" :dataSource="detail.dataSource" :columns="detail.columns"
+                           @selectRowChange="handleTableSelectRowChange">
+                <!-- 淇濆吇鏃ユ湡-->
+                <template v-slot:maintenanceDate="props">
+                  <a-date-picker v-model="props.row.maintenanceDate" value-format="YYYY-MM-DD" :allow-clear="false"/>
+                </template>
 
-        <!-- 鎿嶄綔-->
-        <template v-slot:action="props">
-          <a :disabled="!props.row.equipmentId" @click="handlePreviewDetail(props.row.standardId)">棰勮鏄庣粏</a>
-        </template>
-      </j-vxe-table>
+                <!-- 鎿嶄綔-->
+                <template v-slot:action="props">
+                  <a :disabled="!props.row.equipmentId" @click="handlePreviewDetail(props.row.standardId)">棰勮鏄庣粏</a>
+                </template>
+              </j-vxe-table>
+            </a-tab-pane>
+
+            <a-date-picker slot="tabBarExtraContent" type="primary" value-format="YYYY-MM-DD" :allowClear="false"
+                           @change="handleBatchSetDate"/>
+          </a-tabs>
+        </a-col>
+      </a-row>
+
     </a-spin>
 
     <eam-second-maintenance-batch-order-detail-modal ref="detailModal"/>
@@ -29,58 +45,43 @@
 </template>
 
 <script>
-  import { postAction } from '@/api/manage'
-  import MaintenanceEquipmentSelect from '@views/eam/equipment/modules/MaintenanceEquipmentSelect.vue'
+  import { getAction, postAction } from '@/api/manage'
   import { JVXETypes } from '@comp/jeecg/JVxeTable'
   import EamSecondMaintenanceBatchOrderDetailModal from './EamSecondMaintenanceBatchOrderDetailModal'
 
   export default {
     name: 'EamSecondMaintenanceBatchOrderModal',
-    components: { EamSecondMaintenanceBatchOrderDetailModal, MaintenanceEquipmentSelect },
+    components: { EamSecondMaintenanceBatchOrderDetailModal },
     data() {
       return {
         title: '鎿嶄綔',
         visible: false,
         confirmLoading: false,
         spinning: false,
+        treeDataSource: [],
+        checkedKeys: [],
+        expandedKeys: [],
+        selectedKeys: [],
         url: {
-          batchAdd: '/eam/secondMaintenanceOrder/batchAdd'
+          batchAdd: '/eam/secondMaintenanceOrder/batchAdd',
+          getDeviceTree: '/eam/secondMaintenanceOrder/BatchTreeStructure'
         },
         detail: {
           dataSource: [],
           columns: [
             {
-              title: 'ID',
-              key: 'id',
-              type: JVXETypes.hidden
-            },
-            {
-              title: '宸ュ崟鍙�',
-              key: 'orderNum',
-              align: 'center',
-              type: JVXETypes.inputNumber,
-              disabled: true,
-              placeholder: '${title}绯荤粺鑷姩鐢熸垚',
-              width: 200
-            },
-            {
               title: '缁熶竴缂栫爜',
-              key: 'equipmentId',
+              key: 'equipmentCode',
               align: 'center',
-              type: JVXETypes.slot,
-              slotName: 'equipmentId',
-              width: 300,
-              validateRules: [
-                { required: true, message: '璇疯緭鍏�${title}鎴栧悕绉版悳绱�' },
-                { unique: true, message: '${title}涓嶈兘閲嶅' }
-              ]
+              type: JVXETypes.normal,
+              width: 150
             },
             {
               title: '瑙勮寖鍚嶇О',
               key: 'standardName',
               align: 'center',
               type: JVXETypes.normal,
-              width: 200
+              width: 300
             },
             {
               title: '淇濆吇鏃ユ湡',
@@ -103,47 +104,141 @@
               key: 'remark',
               align: 'center',
               type: JVXETypes.textarea,
-              placeholder: '璇疯緭鍏ュ娉�',
-              width: 300
+              placeholder: '璇疯緭鍏ュ娉�'
             },
             {
               title: '鎿嶄綔',
               align: 'center',
               type: JVXETypes.slot,
               width: 150,
-              slotName: 'action',
-              fixed: 'right'
+              slotName: 'action'
             }
-          ],
-          toolbarConfig: {
-            // prefix 鍓嶇紑锛泂uffix 鍚庣紑
-            slot: ['prefix', 'suffix'],
-            // add 鏂板鎸夐挳锛況emove 鍒犻櫎鎸夐挳锛沜learSelection 娓呯┖閫夋嫨鎸夐挳
-            btn: ['add', 'remove', 'clearSelection']
-          }
+          ]
         }
       }
     },
     methods: {
       add() {
-        //鍒濆鍖栭粯璁ゅ��
-        this.model = { maintenancePeriod: 6 }
         this.visible = true
-        this.editable = true
-        this.detail.operatorMaintenanceList = this.detail.repairerMaintenanceList = []
+        this.checkedKeys = this.detail.dataSource = []
+        this.queryTreeData()
       },
 
+      // 鑾峰彇璁惧缁撴瀯鏍�
+      queryTreeData() {
+        this.spinning = true
+        this.treeDataSource = []
+        getAction(this.url.getDeviceTree)
+          .then(res => {
+            if (res.success) {
+              this.allTreeKeys = []
+              this.treeDataSource = res.result
+              this.generateList(this.treeDataSource)
+              this.expandedKeys = this.allTreeKeys
+            } else {
+              this.$notification.warning({
+                message: '娑堟伅',
+                description: res.message
+              })
+            }
+          })
+          .finally(() => {
+            this.spinning = false
+          })
+      },
+
+      /**
+       * 棰勮璁惧瑙勮寖鏄庣粏
+       * @param standardId
+       */
       handlePreviewDetail(standardId) {
         this.$refs.detailModal.visible = true
         this.$refs.detailModal.loadStandardDetail(standardId)
       },
 
-      autocompleteForm(selectObj, record) {
-        this.$set(record, 'standardName', selectObj.standardName)
-        this.$set(record, 'standardId', selectObj.id)
-        this.$set(record, 'equipmentId', selectObj.equipmentId)
-        this.$set(record, 'maintenancePeriod', selectObj.maintenancePeriod)
-        this.$refs.editableDetailTable.validateTable()
+      onExpand(expandedKeys) {
+        this.expandedKeys = expandedKeys
+        this.autoExpandParent = false
+      },
+
+      async onCheck(value, obj) {
+        this.$refs.editableDetailTable.clearValidate()
+        this.checkedKeys = value
+        const childNodesList = obj.checkedNodes.filter(item => item.data.props.equipmentId).map(item => {
+          return {
+            ...item.data.props.dataRef,
+            id: item.data.props.dataRef.key,
+            equipmentId: item.data.props.dataRef.key,
+            equipmentCode: item.data.props.dataRef.equipmentId,
+            standardId: item.data.props.dataRef.maintenanceStandardId,
+            standardName: item.data.props.dataRef.maintenanceStandardName,
+            maintenancePeriod: 6
+          }
+        })
+
+        if (childNodesList.length === 0) {
+          this.detail.dataSource = []
+          return
+        }
+        console.log('childNodesList', childNodesList)
+
+        if (childNodesList.length > this.detail.dataSource.length) {
+          childNodesList.forEach(childNode => {
+            if (!(this.detail.dataSource.map(item => item.id).includes(childNode.id))) this.detail.dataSource.push(childNode)
+          })
+          console.log('detail+++++++++++', this.detail.dataSource)
+        } else {
+          const deleteList = []
+          this.detail.dataSource.map(item => item.id).forEach(item => {
+            if (!(childNodesList.map(childNode => childNode.id).includes(item))) deleteList.push(item)
+          })
+
+          deleteList.forEach(deleteItem => {
+            this.detail.dataSource.splice(this.detail.dataSource.findIndex(item => item.id === deleteItem), 1)
+          })
+
+          console.log('deleteList', deleteList)
+          console.log('detail----------', this.detail.dataSource)
+        }
+      },
+
+      /**
+       * 鐐瑰嚮鏍戣妭鐐规椂瑙﹀彂
+       * @param selectedKeys
+       * @param event
+       */
+      handleTreeNodeSelect(selectedKeys, event) {
+        event.node.$el.childNodes[1].click()
+      },
+
+      /**
+       * 閫掑綊鏍戞暟鎹睍寮�鎵�鏈夎妭鐐�
+       * @param data
+       */
+      generateList(data) {
+        for (let i = 0; i < data.length; i++) {
+          const node = data[i]
+          const key = node.key
+          this.allTreeKeys.push(key)
+          if (node.children) {
+            this.generateList(node.children)
+          }
+        }
+      },
+
+      handleBatchSetDate(value) {
+        this.detail.dataSource.forEach((item, index, self) => {
+          if (this.selectedKeys.includes(item.id)) this.$set(item, 'maintenanceDate', value)
+        })
+      },
+
+      /**
+       * 琛ㄦ牸澶氶�夋鍙戠敓鏀瑰彉鏃惰Е鍙�
+       * @param {selectedRowIds} 琛ㄦ牸涓凡閫夋嫨鐨処D鍒楄〃
+       */
+      handleTableSelectRowChange({ selectedRowIds }) {
+        this.selectedKeys = selectedRowIds
+        console.log('selectedKeys', this.selectedKeys)
       },
 
       async handleOk() {

--
Gitblit v1.9.3