From bf01bf6c572a169941fe9d018ff1d619a0584787 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期四, 24 七月 2025 19:02:11 +0800
Subject: [PATCH] 1、三保工单流程增加备件使用明细 2、事故登记表基础功能

---
 src/views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue |  217 +++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 156 insertions(+), 61 deletions(-)

diff --git a/src/views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue b/src/views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue
index 99e165f..0f9dd12 100644
--- a/src/views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue
+++ b/src/views/flowable/workflow/thirdMaintenance/ThirdMaintenanceApprovalModal.vue
@@ -59,17 +59,17 @@
             </a-tabs>
           </a-col>
 
-          <a-col :span="model.maintenanceStatus&&model.maintenanceStatus!='WAIT_MAINTENANCE'?10:16" class="scroll-col">
-            <a-tabs v-model="activeTabKey" @change="$refs.editableDetailTable.clearValidate()">
+          <a-col :span="model.maintenanceStatus&&model.maintenanceStatus!=='WAIT_MAINTENANCE'?10:16" class="scroll-col">
+            <a-tabs :active-key="activeTabKey" @change="handleTabChange">
               <a-tab-pane key="1" tab="淇濆吇椤规槑缁�">
-                <j-vxe-table ref="editableDetailTable" rowSelection bordered alwaysEdit keep-source
-                             :dataSource="detail.dataSource" :columns="detail.columns"
+                <j-vxe-table ref="editableDetailTable1" rowSelection bordered alwaysEdit keep-source
+                             :dataSource="detail.maintenanceDetailList" :columns="detail.maintenanceDetailColumns"
                              @selectRowChange="handleTableSelectRowChange">
                   <!--淇濆吇缁撴灉-->
                   <template v-slot:maintenanceResult="props">
                     <j-dict-select-tag v-model="props.row.maintenanceResult" dictCode="third_maintenance_result"
                                        placeholder="璇烽�夋嫨淇濆吇缁撴灉"
-                                       :disabled="disableSubmit || (model.maintenanceStatus&&model.maintenanceStatus!='UNDER_MAINTENANCE')"
+                                       :disabled="disableSubmit || (model.maintenanceStatus&&model.maintenanceStatus!=='UNDER_MAINTENANCE')"
                                        @change="handleResultSelectChange($event,props.row,'exceptionDescription')"
                                        style="width: 100%"/>
                   </template>
@@ -78,9 +78,9 @@
                   <template v-slot:exceptionDescription="props">
                     <a-textarea :rows="1" :autoSize="false" v-model="props.row.exceptionDescription"
                                 :placeholder="props.row.maintenanceResult&&props.row.maintenanceResult!='NORMAL'?'璇疯緭鍏ュ紓甯告弿杩�':''"
-                                @blur="$refs.editableDetailTable.validateTable"
+                                @blur="$refs.editableDetailTable1.validateTable"
                                 :disabled="disableSubmit ||
-                                (model.maintenanceStatus&&model.maintenanceStatus!='UNDER_MAINTENANCE') ||
+                                (model.maintenanceStatus&&model.maintenanceStatus!=='UNDER_MAINTENANCE') ||
                                 !props.row.maintenanceResult ||
                                 props.row.maintenanceResult === 'NORMAL'"/>
                   </template>
@@ -90,7 +90,7 @@
                     <j-dict-select-tag v-model="props.row.firstInspectResult"
                                        placeholder="璇烽�夋嫨楠屾敹缁撴灉"
                                        @change="handleResultSelectChange($event,props.row,'firstInspectException')"
-                                       :disabled="disableSubmit ||(model.maintenanceStatus&&model.maintenanceStatus!='UNDER_FIRST_ACCEPTANCE')"
+                                       :disabled="disableSubmit ||(model.maintenanceStatus&&model.maintenanceStatus!=='UNDER_FIRST_ACCEPTANCE')"
                                        dictCode="check_status" style="width: 100%"/>
                   </template>
 
@@ -98,9 +98,9 @@
                   <template v-slot:firstInspectException="props">
                     <a-textarea :rows="1" v-model="props.row.firstInspectException"
                                 :placeholder="props.row.firstInspectResult&&props.row.firstInspectResult!='1'?'璇疯緭鍏ュ紓甯告弿杩�':''"
-                                @blur="$refs.editableDetailTable.validateTable"
+                                @blur="$refs.editableDetailTable1.validateTable"
                                 :disabled="disableSubmit ||
-                                (model.maintenanceStatus&&model.maintenanceStatus!='UNDER_FIRST_ACCEPTANCE')||
+                                (model.maintenanceStatus&&model.maintenanceStatus!=='UNDER_FIRST_ACCEPTANCE')||
                                 !props.row.firstInspectResult ||
                                 props.row.firstInspectResult === '1'"
                                 dictCode="check_status" style="width: 100%;resize:none"/>
@@ -117,18 +117,30 @@
                   <!--绗簩娆¢獙鏀跺紓甯告弿杩�-->
                   <template v-slot:secondInspectException="props">
                     <a-textarea :rows="1" v-model="props.row.secondInspectException"
-                                :placeholder="props.row.secondInspectResult&&props.row.secondInspectResult!='1'?'璇疯緭鍏ュ紓甯告弿杩�':''"
-                                @blur="$refs.editableDetailTable.validateTable"
+                                :placeholder="props.row.secondInspectResult&&props.row.secondInspectResult!=='1'?'璇疯緭鍏ュ紓甯告弿杩�':''"
+                                @blur="$refs.editableDetailTable1.validateTable"
                                 :disabled="disableSubmit ||
-                                (model.maintenanceStatus&&model.maintenanceStatus!='UNDER_SECOND_ACCEPTANCE')||
+                                (model.maintenanceStatus&&model.maintenanceStatus!=='UNDER_SECOND_ACCEPTANCE')||
                                 !props.row.secondInspectResult ||
                                 props.row.secondInspectResult === '1'"
                                 dictCode="check_status" style="width: 100%;resize:none"/>
                   </template>
                 </j-vxe-table>
               </a-tab-pane>
+
+              <a-tab-pane key="2" tab="澶囦欢浣跨敤鏄庣粏"
+                          v-if="model.maintenanceStatus&&model.maintenanceStatus!=='WAIT_CHECK'&&detail.sparePartsDetailList.length>0||
+                          (model.maintenanceStatus&&model.maintenanceStatus==='UNDER_MAINTENANCE')"
+                          forceRender>
+                <j-vxe-table ref="editableDetailTable2" bordered alwaysEdit keep-source toolbar
+                             :toolbar-config="detail.toolbarConfig" row-selection
+                             :disabled="model.maintenanceStatus&&model.maintenanceStatus!=='UNDER_MAINTENANCE'"
+                             :dataSource="detail.sparePartsDetailList" :columns="detail.sparePartsDetailColumns">
+                </j-vxe-table>
+              </a-tab-pane>
+
               <template v-if="selectShenpiData.procInstId">
-                <a-tab-pane key='2' tab='娴佺▼鍥�'>
+                <a-tab-pane key='3' tab='娴佺▼鍥�'>
                   <img :src="imageSrc" alt="Fetched Image"/>
                 </a-tab-pane>
               </template>
@@ -136,13 +148,13 @@
               <template slot="tabBarExtraContent">
                 <a-space>
                   <a-button
-                    v-if="activeTabKey=='1'"
-                    :disabled="disableSubmit || (model.maintenanceStatus&&model.maintenanceStatus!='UNDER_MAINTENANCE')||selectedRowKeys.length == 0"
+                    v-if="activeTabKey==='1'"
+                    :disabled="disableSubmit || (model.maintenanceStatus&&model.maintenanceStatus!=='UNDER_MAINTENANCE')||selectedRowKeys.length === 0"
                     type="primary" @click="handleSelectAllMaintenanceResult">鎵归噺淇濆吇姝e父
                   </a-button>
                   <a-button
-                    v-if="activeTabKey=='1'"
-                    :disabled="disableSubmit || (model.maintenanceStatus&&model.maintenanceStatus!='UNDER_FIRST_ACCEPTANCE')||selectedRowKeys.length == 0"
+                    v-if="activeTabKey==='1'"
+                    :disabled="disableSubmit || (model.maintenanceStatus&&model.maintenanceStatus!=='UNDER_FIRST_ACCEPTANCE')||selectedRowKeys.length === 0"
                     type="primary" @click="handleSelectAllFirstAcceptanceResult">鎵归噺楠屾敹閫氳繃
                   </a-button>
                 </a-space>
@@ -150,7 +162,7 @@
             </a-tabs>
           </a-col>
 
-          <a-col v-if="model.maintenanceStatus&&model.maintenanceStatus!='WAIT_MAINTENANCE'" :span="6"
+          <a-col v-if="model.maintenanceStatus&&model.maintenanceStatus!=='WAIT_MAINTENANCE'" :span="6"
                  class="scroll-col">
             <a-tabs v-if="displayEvaluationFlag">
               <a-tab-pane tab="淇濆吇鍓嶆妧鏈姸鎬侀壌瀹�">
@@ -158,18 +170,18 @@
                                    prop="fullyFunctional" label="璁惧鍔熻兘鏄惁榻愬叏">
                   <j-dict-select-tag type='radio' v-model='model.fullyFunctional' dictCode='yn'
                                      @change="handleCheckRadioChange"
-                                     :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!='WAIT_CHECK')"/>
+                                     :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!=='WAIT_CHECK')"/>
                 </a-form-model-item>
                 <a-form-model-item :labelCol="rightColLabelCol" :wrapperCol="rightColWrapperCol"
                                    prop="runningNormally" label="璁惧鑳藉惁姝e父杩愯浆">
                   <j-dict-select-tag type='radio' v-model='model.runningNormally' dictCode='yn'
                                      @change="handleCheckRadioChange"
-                                     :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!='WAIT_CHECK')"/>
+                                     :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!=='WAIT_CHECK')"/>
                 </a-form-model-item>
-                <a-form-model-item v-if="model.fullyFunctional=='0'||model.runningNormally=='0'"
+                <a-form-model-item v-if="model.fullyFunctional==='0'||model.runningNormally==='0'"
                                    :labelCol="rightColLabelCol" :wrapperCol="rightColWrapperCol" label="闂鎻忚堪">
                   <a-textarea v-model='model.problemDescription' placeholder="璇锋弿杩伴棶棰�"
-                              :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!='WAIT_CHECK')"/>
+                              :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!=='WAIT_CHECK')"/>
                 </a-form-model-item>
               </a-tab-pane>
             </a-tabs>
@@ -181,7 +193,7 @@
                 </a-form-model-item>
                 <a-form-model-item :labelCol="rightColLabelCol" :wrapperCol="rightColWrapperCol" label="鍗忓姪鎿嶄綔浜�">
                   <a-input v-model="model.assistantOperator"
-                           :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!='OPERATOR_SIGNATURE')"
+                           :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!=='OPERATOR_SIGNATURE')"
                            placeholder="璇疯緭鍏ュ崗鍔╂搷浣滀汉"/>
                 </a-form-model-item>
               </a-tab-pane>
@@ -194,7 +206,7 @@
                 </a-form-model-item>
                 <a-form-model-item :labelCol="rightColLabelCol" :wrapperCol="rightColWrapperCol" label="鍗忓姪缁翠慨浜�">
                   <a-input v-model="model.assistantRepairman"
-                           :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!='REPAIRMAN_SIGNATURE')"
+                           :disabled="disableSubmit||(model.maintenanceStatus&&model.maintenanceStatus!=='REPAIRMAN_SIGNATURE')"
                            placeholder="璇疯緭鍏ュ崗鍔╃淮淇汉"/>
                 </a-form-model-item>
               </a-tab-pane>
@@ -227,13 +239,11 @@
   import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
   import { JVXETypes } from '@comp/jeecg/JVxeTable'
   import MaintenanceEquipmentSelect from '@views/eam/equipment/modules/MaintenanceEquipmentSelect'
-  import ATextarea from 'ant-design-vue/es/input/TextArea'
 
   export default {
     name: 'ThirdMaintenanceApprovalModal',
     mixins: [JVxeTableModelMixin],
     components: {
-      ATextarea,
       MaintenanceEquipmentSelect
     },
     props: {
@@ -280,16 +290,18 @@
         },
         url: {
           queryById: '/eam/thirdMaintenanceOrder/queryById',
-          detail: '/eam/thirdMaintenanceOrderDetail/queryList',
+          maintenanceDetail: '/eam/thirdMaintenanceOrderDetail/queryList',
+          sparePartsDetail: '/eam/eamThirdMaintenanceSpare/queryList',
           approval: '/eam/thirdMaintenanceOrder/approval',
           diagramView: '/assign/flow/diagramView'
         },
         disableSubmit: false,
         selectedRowKeys: [],
         detail: {
-          dataSource: [],
-          columns: [],
-          defaultColumns: [
+          maintenanceDetailList: [],
+          sparePartsDetailList: [],
+          maintenanceDetailColumns: [],
+          defaultMaintenanceDetailColumns: [
             {
               title: 'ID',
               key: 'id',
@@ -350,7 +362,51 @@
                 { handler: this.maintenanceExceptionDescriptionValidator }
               ]
             }
-          ]
+          ],
+          sparePartsDetailColumns: [
+            {
+              title: '澶囦欢搴忓彿',
+              key: 'spareCode',
+              type: JVXETypes.inputNumber,
+              placeholder: '璇疯緭鍏�${title}',
+              width: 150,
+              align: 'center',
+              validateRules: [
+                { required: true, message: '璇疯緭鍏�${title}' },
+                { unique: true, message: '${title}涓嶈兘閲嶅' }
+              ]
+            },
+            {
+              title: '澶囦欢鍚嶇О',
+              key: 'spareName',
+              type: JVXETypes.input,
+              placeholder: '璇疯緭鍏�${title}',
+              align: 'center',
+              validateRules: [{ required: true, message: '璇疯緭鍏�${title}' }]
+            },
+            {
+              title: '澶囦欢鍨嬪彿',
+              key: ' spareModel',
+              type: JVXETypes.input,
+              placeholder: '璇疯緭鍏�${title}',
+              align: 'center',
+              validateRules: [{ required: true, message: '璇疯緭鍏�${title}' }]
+            },
+            {
+              title: '浣跨敤鏁伴噺',
+              key: 'spareQuantity',
+              type: JVXETypes.inputNumber,
+              placeholder: '璇疯緭鍏�${title}',
+              align: 'center',
+              validateRules: [{ required: true, message: '璇疯緭鍏�${title}' }]
+            }
+          ],
+          toolbarConfig: {
+            // prefix 鍓嶇紑锛泂uffix 鍚庣紑
+            slot: ['prefix', 'suffix'],
+            // add 鏂板鎸夐挳锛況emove 鍒犻櫎鎸夐挳锛沜learSelection 娓呯┖閫夋嫨鎸夐挳
+            btn: ['add', 'remove', 'clearSelection']
+          }
         }
       }
     },
@@ -384,7 +440,7 @@
        */
       async handleApprove(record) {
         this.model = {}
-        this.detail.dataSource = []
+        this.detail.maintenanceDetailList = this.detail.sparePartsDetailList = []
         this.getBasicInformationByApi(record)
         this.getFlowChartImageByApi(record)
       },
@@ -395,7 +451,7 @@
        */
       handleDetail(record) {
         this.spinning = true
-        this.detail.dataSource = []
+        this.detail.maintenanceDetailList = this.detail.sparePartsDetailList = []
         this.model = Object.assign({
           operatorSignatureResult: '1',
           repairmanSignatureResult: '1',
@@ -403,7 +459,8 @@
           inspectorSignatureResult: '1'
         }, record)
         this.handleDynamicColumns()
-        this.loadDetail(record.id)
+        this.loadMaintenanceDetail(record.id)
+        this.loadSparePartsDetail(record.id)
       },
 
       /**
@@ -436,7 +493,8 @@
             }
           })
           .finally(() => {
-            this.loadDetail(record.dataId)
+            this.loadMaintenanceDetail(record.dataId)
+            this.loadSparePartsDetail(record.dataId)
           })
 
       },
@@ -445,12 +503,12 @@
        * 鑾峰彇淇濆吇鏄庣粏
        * @param orderId 宸ュ崟鍙�
        */
-      loadDetail(orderId) {
-        getAction(this.url.detail, { orderId })
+      loadMaintenanceDetail(orderId) {
+        getAction(this.url.maintenanceDetail, { orderId })
           .then(res => {
             if (res.success) {
-              if (this.model.maintenanceStatus && this.model.maintenanceStatus == 'UNDER_SECOND_ACCEPTANCE') {
-                this.detail.dataSource = res.result.map(item => {
+              if (this.model.maintenanceStatus && this.model.maintenanceStatus === 'UNDER_SECOND_ACCEPTANCE') {
+                this.detail.maintenanceDetailList = res.result.map(item => {
                   return {
                     ...item,
                     secondInspectResult: '1'
@@ -458,11 +516,24 @@
                 })
                 return
               }
-              this.detail.dataSource = res.result
+              this.detail.maintenanceDetailList = res.result
             }
           })
           .finally(() => {
             this.spinning = false
+          })
+      },
+
+      /**
+       * 鑾峰彇澶囦欢浣跨敤鏄庣粏
+       * @param orderId 宸ュ崟鍙�
+       */
+      loadSparePartsDetail(orderId) {
+        getAction(this.url.sparePartsDetail, { orderId })
+          .then(res => {
+            if (res.success) {
+              this.detail.sparePartsDetailList = res.result
+            }
           })
       },
 
@@ -492,27 +563,42 @@
       async handleOk() {
         const that = this
 
-        if (this.model.maintenanceStatus == 'UNDER_MAINTENANCE' || this.model.maintenanceStatus == 'UNDER_FIRST_ACCEPTANCE' || this.model.maintenanceStatus == 'UNDER_SECOND_ACCEPTANCE') {
-          let errMap = await that.$refs.editableDetailTable.validateTable()
-          if (this.activeTabKey != '1') {
+        if (this.model.maintenanceStatus === 'UNDER_MAINTENANCE' || this.model.maintenanceStatus === 'UNDER_FIRST_ACCEPTANCE' || this.model.maintenanceStatus === 'UNDER_SECOND_ACCEPTANCE') {
+          let errMap = await that.$refs.editableDetailTable1.validateTable()
+          if (this.activeTabKey !== '1' && errMap) {
+            that.$refs.editableDetailTable1.clearValidate()
             this.activeTabKey = '1'
-            if (errMap) {
-              that.$refs.editableDetailTable.clearValidate()
-              that.$notification.warning({
-                message: '娑堟伅',
-                description: '淇濆吇鎴栭獙鏀朵笉鑳戒负绌�'
-              })
-              return
-            }
+            that.$notification.warning({
+              message: '娑堟伅',
+              description: '淇濆吇鎴栭獙鏀朵笉鑳戒负绌�'
+            })
+            return
           }
           if (errMap) return
         }
+
+        if (this.$refs.editableDetailTable2 && this.model.maintenanceStatus === 'UNDER_MAINTENANCE') {
+          const errMap = await that.$refs.editableDetailTable2.validateTable()
+          if (this.activeTabKey !== '2' && errMap) {
+            this.activeTabKey = '2'
+            that.$refs.editableDetailTable2.clearValidate()
+            this.activeTabKey = '2'
+            that.$notification.warning({
+              message: '娑堟伅',
+              description: '澶囦欢浣跨敤鏄庣粏璁板綍瀛楁闇�濉啓'
+            })
+            return
+          }
+          if (errMap) return
+        }
+
 
         // 瑙﹀彂琛ㄥ崟楠岃瘉
         this.$refs.form.validate(valid => {
           if (valid) {
             that.confirmLoading = that.spinning = true
-            that.model.tableDetailList = that.$refs.editableDetailTable.getTableData()
+            that.model.tableDetailList = that.$refs.editableDetailTable1.getTableData()
+            if (that.$refs.editableDetailTable2) that.model.tableSpareList = that.$refs.editableDetailTable2.getTableData()
 
             httpAction(that.url.approval, that.model, 'put')
               .then((res) => {
@@ -591,7 +677,7 @@
             }
           ]
         }
-        this.detail.columns = [...this.detail.defaultColumns, ...columns]
+        this.detail.maintenanceDetailColumns = [...this.detail.defaultMaintenanceDetailColumns, ...columns]
       },
 
       autocompleteForm(selectObj) {
@@ -609,33 +695,33 @@
        */
       handleResultSelectChange(value, record, key) {
         if (record[key]) delete record[key]
-        this.$refs.editableDetailTable.validateTable()
+        this.$refs.editableDetailTable1.validateTable()
       },
 
       // 鎵归噺閫夋嫨淇濆吇缁撴灉姝e父
       handleSelectAllMaintenanceResult() {
         this.selectedRowKeys.forEach(key => {
-          const dataItem = this.detail.dataSource.find(item => item.id === key)
+          const dataItem = this.detail.maintenanceDetailList.find(item => item.id === key)
           if (dataItem && dataItem.maintenanceResult !== 'NORMAL') {
             delete dataItem.exceptionDescription
             dataItem.maintenanceResult = 'NORMAL'
           }
         })
-        this.$refs.editableDetailTable.clearCheckboxRow()
+        this.$refs.editableDetailTable1.clearCheckboxRow()
         this.selectedRowKeys = []
       },
 
       // 鎵归噺閫夋嫨绗竴娆¢獙鏀剁粨鏋滈�氳繃
       handleSelectAllFirstAcceptanceResult() {
         this.selectedRowKeys.forEach(key => {
-          const dataItem = this.detail.dataSource.find(item => item.id === key)
+          const dataItem = this.detail.maintenanceDetailList.find(item => item.id === key)
           if (dataItem && dataItem.firstInspectResult !== '1') {
             delete dataItem.firstInspectException
             dataItem.firstInspectResult = '1'
           }
         })
-        this.$refs.editableDetailTable.clearCheckboxRow()
-        this.$refs.editableDetailTable.clearValidate()
+        this.$refs.editableDetailTable1.clearCheckboxRow()
+        this.$refs.editableDetailTable1.clearValidate()
         this.selectedRowKeys = []
       },
 
@@ -649,7 +735,7 @@
 
       // 淇濆吇鍓嶆妧鏈姸鎬佸崟閫夊彂鐢熸敼鍙樻椂瑙﹀彂
       handleCheckRadioChange() {
-        if (this.model.fullyFunctional == '1' && this.model.runningNormally == '1') this.model.problemDescription = ''
+        if (this.model.fullyFunctional === '1' && this.model.runningNormally === '1') this.model.problemDescription = ''
       },
 
       /**
@@ -706,6 +792,15 @@
         }
       },
 
+      /**
+       *  鏍囩鏍忓垏鎹㈡椂瑙﹀彂
+       * @param tabKey 鍒囨崲鍚庣殑tabKey
+       */
+      handleTabChange(tabKey) {
+        if (this.activeTabKey !== '3') this.$refs['editableDetailTable' + this.activeTabKey].clearValidate()
+        this.activeTabKey = tabKey
+      },
+
       handleCancel() {
         this.close()
       },

--
Gitblit v1.9.3