From 79c0397ae8aedb6cc4f5db486e2d9b87a7410d04 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期五, 18 七月 2025 09:49:25 +0800
Subject: [PATCH] 二保工单批量新增

---
 src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderDetailModal.vue |   97 +++++++++++++++++++
 src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue       |  167 +++++++++++++++++++++------------
 src/views/eam/maintenance/EamSecondMaintenanceOrderList.vue                     |   21 ++-
 3 files changed, 216 insertions(+), 69 deletions(-)

diff --git a/src/views/eam/maintenance/EamSecondMaintenanceOrderList.vue b/src/views/eam/maintenance/EamSecondMaintenanceOrderList.vue
index b325d22..53bbd7c 100644
--- a/src/views/eam/maintenance/EamSecondMaintenanceOrderList.vue
+++ b/src/views/eam/maintenance/EamSecondMaintenanceOrderList.vue
@@ -81,14 +81,19 @@
 
             <a-divider type="vertical"/>
 
-            <a @click="handleDetail(record)">璇︽儏</a>
-
-            <a-divider type="vertical"/>
-
-            <a-popconfirm title="纭畾浣滃簾鍚�?" @confirm="() => handlerAbolish(record.id)">
-              <a>浣滃簾</a>
-            </a-popconfirm>
-
+            <a-dropdown>
+            <a class="ant-dropdown-link">鏇村 <a-icon type="down"/></a>
+            <a-menu slot="overlay">
+              <a-menu-item>
+                <a-popconfirm title="纭畾浣滃簾鍚�?" @confirm="() => handleAbolish(record.id)">
+                  <a>浣滃簾</a>
+                </a-popconfirm>
+              </a-menu-item>
+               <a-menu-item>
+                <a @click="handleDetail(record)">璇︽儏</a>
+              </a-menu-item>
+            </a-menu>
+          </a-dropdown>
           </template>
 
           <template v-else>
diff --git a/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderDetailModal.vue b/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderDetailModal.vue
new file mode 100644
index 0000000..5beab92
--- /dev/null
+++ b/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderDetailModal.vue
@@ -0,0 +1,97 @@
+<template>
+  <j-modal :title="title" :width="1200" :visible="visible" switchFullscreen centered
+           :okButtonProps="{ class:{'jee-hidden': true} }" @cancel="handleCancel"
+           cancelText="鍏抽棴">
+    <a-spin :spinning="spinning">
+      <a-tabs default-active-key="1">
+        <a-tab-pane tab="鎿嶄綔宸�" key="1">
+          <j-vxe-table rowNumber bordered keep-source :height="500" :dataSource="detail.operatorMaintenanceList"
+                       :columns="detail.columns"/>
+        </a-tab-pane>
+        <a-tab-pane tab="缁翠慨宸�" key="2" forceRender>
+          <j-vxe-table rowNumber bordered keep-source :height="500" :dataSource="detail.repairerMaintenanceList"
+                       :columns="detail.columns"/>
+        </a-tab-pane>
+      </a-tabs>
+    </a-spin>
+  </j-modal>
+</template>
+
+<script>
+  import { getAction, httpAction } from '@/api/manage'
+  import MaintenanceEquipmentSelect from '@views/eam/equipment/modules/MaintenanceEquipmentSelect.vue'
+  import { JVXETypes } from '@comp/jeecg/JVxeTable'
+
+  export default {
+    name: 'EamSecondMaintenanceBatchOrderDetailModal',
+    components: { MaintenanceEquipmentSelect },
+    data() {
+      return {
+        title: '棰勮鏄庣粏',
+        visible: false,
+        spinning: false,
+        url: {
+          standardDetail: '/eam/eamMaintenanceStandardDetail/queryList'
+        },
+        detail: {
+          operatorMaintenanceList: [],
+          repairerMaintenanceList: [],
+          columns: [
+            {
+              title: 'ID',
+              key: 'id',
+              type: JVXETypes.hidden
+            },
+            {
+              title: 'orderId',
+              key: 'orderId',
+              type: JVXETypes.hidden
+            },
+            {
+              title: '搴忓彿',
+              key: 'itemCode',
+              type: JVXETypes.normal,
+              width: 60,
+              align: 'center'
+            },
+            {
+              title: '淇濆吇椤�',
+              key: 'itemName',
+              type: JVXETypes.normal,
+              align: 'center'
+            }
+          ]
+        }
+      }
+    },
+    methods: {
+      /**
+       * 鑾峰彇淇濆吇瑙勮寖鏁版嵁
+       * @param standardId 瑙勮寖Id
+       */
+      loadStandardDetail(standardId) {
+        this.spinning = true
+        getAction(this.url.standardDetail, { standardId })
+          .then(res => {
+            if (res.success) {
+              this.detail.operatorMaintenanceList = res.result.filter(item => item.itemCategory == 'OPERATOR_MAINTENANCE')
+              this.detail.repairerMaintenanceList = res.result.filter(item => item.itemCategory == 'REPAIRER_MAINTENANCE')
+            }
+          })
+          .finally(() => {
+            this.spinning = false
+          })
+      },
+
+      handleCancel() {
+        this.close()
+      },
+
+      close() {
+        this.$emit('close')
+        this.visible = false
+      }
+
+    }
+  }
+</script>
diff --git a/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue b/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue
index 7f78e9f..71ba4f5 100644
--- a/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue
+++ b/src/views/eam/maintenance/modules/EamSecondMaintenanceBatchOrderModal.vue
@@ -2,21 +2,41 @@
   <j-modal :title="title" :width="1200" :visible="visible" :confirmLoading="confirmLoading" switchFullscreen centered
            :mask-closable="false" @ok="handleOk" @cancel="handleCancel" cancelText="鍏抽棴">
     <a-spin :spinning="spinning">
-      <j-vxe-table ref="editableDetailTable" rowNumber rowSelection bordered alwaysEdit toolbar @added="addNewRow"
+      <j-vxe-table ref="editableDetailTable" rowNumber rowSelection bordered alwaysEdit toolbar
                    :toolbarConfig="detail.toolbarConfig" keep-source :height="500"
-                   :dataSource="detail.dataSource" :columns="detail.columns"/>
+                   :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>
+
+        <!-- 淇濆吇鏃ユ湡-->
+        <template v-slot:maintenanceDate="props">
+          <a-date-picker v-model="props.row.maintenanceDate" value-format="YYYY-MM-DD"/>
+        </template>
+
+        <!-- 鎿嶄綔-->
+        <template v-slot:action="props">
+          <a :disabled="!props.row.equipmentId" @click="handlePreviewDetail(props.row.standardId)">棰勮鏄庣粏</a>
+        </template>
+      </j-vxe-table>
     </a-spin>
+
+    <eam-second-maintenance-batch-order-detail-modal ref="detailModal"/>
   </j-modal>
 </template>
 
 <script>
-  import { getAction, httpAction } from '@/api/manage'
+  import { postAction } from '@/api/manage'
   import MaintenanceEquipmentSelect from '@views/eam/equipment/modules/MaintenanceEquipmentSelect.vue'
   import { JVXETypes } from '@comp/jeecg/JVxeTable'
+  import EamSecondMaintenanceBatchOrderDetailModal from './EamSecondMaintenanceBatchOrderDetailModal'
 
   export default {
     name: 'EamSecondMaintenanceBatchOrderModal',
-    components: { MaintenanceEquipmentSelect },
+    components: { EamSecondMaintenanceBatchOrderDetailModal, MaintenanceEquipmentSelect },
     data() {
       return {
         title: '鎿嶄綔',
@@ -36,39 +56,63 @@
             },
             {
               title: '宸ュ崟鍙�',
-              dataIndex: 'orderNum',
+              key: 'orderNum',
               align: 'center',
               type: JVXETypes.inputNumber,
               disabled: true,
-              placeholder: '宸ュ崟鍙风郴缁熻嚜鍔ㄧ敓鎴�'
+              placeholder: '${title}绯荤粺鑷姩鐢熸垚',
+              width: 200
             },
             {
               title: '缁熶竴缂栫爜',
-              dataIndex: 'equipmentId',
+              key: 'equipmentId',
               align: 'center',
               type: JVXETypes.slot,
-              slotName: 'equipmentId'
+              slotName: 'equipmentId',
+              width: 300,
+              validateRules: [
+                { required: true, message: '璇疯緭鍏�${title}鎴栧悕绉版悳绱�' },
+                { unique: true, message: '${title}涓嶈兘閲嶅' }
+              ]
             },
             {
               title: '瑙勮寖鍚嶇О',
-              dataIndex: 'standardName',
+              key: 'standardName',
               align: 'center',
-              type: JVXETypes.input,
-              disabled: true,
-              placeholder: '閫夋嫨璁惧鍚庤嚜鍔ㄥ甫鍑�'
+              type: JVXETypes.normal,
+              width: 200
             },
             {
               title: '淇濆吇鏃ユ湡',
-              dataIndex: 'maintenanceDate',
+              key: 'maintenanceDate',
               align: 'center',
-              type: JVXETypes.date
+              type: JVXETypes.slot,
+              width: 200,
+              slotName: 'maintenanceDate',
+              validateRules: [{ required: true, message: '璇烽�夋嫨${title}' }]
             },
             {
               title: '淇濆吇鍛ㄦ湡',
-              dataIndex: 'maintenancePeriod',
+              key: 'maintenancePeriod',
               align: 'center',
-              type: JVXETypes.inputNumber,
-              defaultValue: '6'
+              type: JVXETypes.normal,
+              width: 150
+            },
+            {
+              title: '澶囨敞',
+              key: 'remark',
+              align: 'center',
+              type: JVXETypes.textarea,
+              placeholder: '璇疯緭鍏ュ娉�',
+              width: 300
+            },
+            {
+              title: '鎿嶄綔',
+              align: 'center',
+              type: JVXETypes.slot,
+              width: 150,
+              slotName: 'action',
+              fixed: 'right'
             }
           ],
           toolbarConfig: {
@@ -89,57 +133,52 @@
         this.detail.operatorMaintenanceList = this.detail.repairerMaintenanceList = []
       },
 
-      addNewRow({ row }) {
-        console.log('row', row)
-        row.maintenancePeriod = 6
-        this.$refs.editableDetailTable.updateData()
+      handlePreviewDetail(standardId) {
+        this.$refs.detailModal.visible = true
+        this.$refs.detailModal.loadStandardDetail(standardId)
       },
 
-      autocompleteForm(selectObj) {
-        this.$set(this.model, 'standardName', selectObj.standardName)
-        this.$set(this.model, 'standardId', selectObj.id)
-        this.$set(this.model, 'equipmentId', selectObj.equipmentId)
-        if (!this.model.id) this.loadStandardDetail(selectObj.id)
+      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()
       },
 
       async handleOk() {
-        const that = this
-        // 瑙﹀彂琛ㄥ崟楠岃瘉
-        this.$refs.form.validate(valid => {
-          if (valid) {
-            that.confirmLoading = that.spinning = true
-            let httpUrl = ''
-            let method = ''
-            if (!this.model.id) {
-              httpUrl += this.url.add
-              method = 'post'
+        const requests = this.$refs.editableDetailTable.getTableData()
+        if (requests.length == 0) {
+          this.$notification.warning({
+            message: '娑堟伅',
+            description: '璇疯嚦灏戞柊澧炰竴鏉¤褰�'
+          })
+          return
+        }
+
+        const errMap = await this.$refs.editableDetailTable.validateTable()
+        if (errMap) return
+
+        this.confirmLoading = this.spinning = true
+        postAction(this.url.batchAdd, requests)
+          .then((res) => {
+            if (res.success) {
+              this.$notification.success({
+                message: '娑堟伅',
+                description: res.message
+              })
+              this.$emit('ok')
+              this.close()
             } else {
-              httpUrl += this.url.edit
-              method = 'put'
+              this.$notification.warning({
+                message: '娑堟伅',
+                description: res.message
+              })
             }
-            httpAction(httpUrl, this.model, method)
-              .then((res) => {
-                if (res.success) {
-                  that.$notification.success({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                  that.$emit('ok')
-                  that.close()
-                } else {
-                  that.$notification.warning({
-                    message: '娑堟伅',
-                    description: res.message
-                  })
-                }
-              })
-              .finally(() => {
-                that.confirmLoading = that.spinning = false
-              })
-          } else {
-            return false
-          }
-        })
+          })
+          .finally(() => {
+            this.confirmLoading = this.spinning = false
+          })
       },
 
       handleCancel() {
@@ -154,3 +193,9 @@
     }
   }
 </script>
+
+<style scoped lang="less">
+  /deep/ .ant-select-dropdown-menu {
+    text-align: left;
+  }
+</style>

--
Gitblit v1.9.3