From ab7007a57d36f2a9cb2f419195e5728349c73497 Mon Sep 17 00:00:00 2001
From: zhaowei <zhaowei>
Date: 星期二, 08 七月 2025 17:39:51 +0800
Subject: [PATCH] 技术鉴定规范页面功能开发

---
 src/views/eam/base/modules/EamTechnicalStatusEvaluationStandardModal.vue |  455 +++++++++++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 367 insertions(+), 88 deletions(-)

diff --git a/src/views/eam/base/modules/EamTechnicalStatusEvaluationStandardModal.vue b/src/views/eam/base/modules/EamTechnicalStatusEvaluationStandardModal.vue
index c6ea154..7673464 100644
--- a/src/views/eam/base/modules/EamTechnicalStatusEvaluationStandardModal.vue
+++ b/src/views/eam/base/modules/EamTechnicalStatusEvaluationStandardModal.vue
@@ -1,130 +1,409 @@
 <template>
-  <j-modal
-    :title="title"
-    :width="800"
-    :visible="visible"
-    :confirmLoading="confirmLoading"
-    switchFullscreen
-    @ok="handleOk"
-    @cancel="handleCancel"
-    cancelText="鍏抽棴">
+  <j-modal :title="title" :width="1200" :visible="visible" :confirmLoading="confirmLoading" switchFullscreen centered
+           @ok="handleOk" @cancel="handleCancel" cancelText="鍏抽棴">
+    <a-spin :spinning="spinning">
+      <a-form-model ref="form" :model="model" :rules="validatorRules" :labelCol="labelCol" :wrapperCol="wrapperCol">
+        <a-row>
+          <a-col :span="8">
+            <a-form-model-item label="瑙勮寖缂栫爜">
+              <a-input placeholder="瑙勮寖缂栫爜鑷姩鐢熸垚" v-model="model.standardCode" disabled/>
+            </a-form-model-item>
+          </a-col>
 
-    <a-spin :spinning="confirmLoading">
-      <a-form-model ref="form" :model="model" :rules="validatorRules">
-        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardName" label="瑙勮寖鍚嶇О">
-          <a-input placeholder="璇疯緭鍏ヨ鑼冨悕绉�" v-model="model.standardName" />
-        </a-form-model-item>
-        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardCode" label="瑙勮寖缂栫爜">
-          <a-input placeholder="璇疯緭鍏ヨ鑼冪紪鐮�" v-model="model.standardCode" />
-        </a-form-model-item>
-        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="evaluationPeriod" label="閴村畾鍛ㄦ湡(骞�)">
-          <a-input-number v-model="model.evaluationPeriod"/>
-        </a-form-model-item>
-        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="equipmentId" label="璁惧ID">
-          <a-input placeholder="璇疯緭鍏ヨ澶嘔D" v-model="model.equipmentId" />
-        </a-form-model-item>
-        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hasSafetyEquipmentCheck" label="鏄惁鏈夊畨鍏ㄨ缃鏌�">
-          <j-dict-select-tag dict-code="yn " type="radio" v-model="model.hasSafetyEquipmentCheck"/>
-        </a-form-model-item>
-        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hasPrecisionCheck" label="鏄惁鏈夎澶囩簿搴︽鏌�">
-          <j-dict-select-tag dict-code="yn " type="radio" v-model="model.hasPrecisionCheck"/>
-        </a-form-model-item>
-        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="hasOtherCheck" label="鏄惁鏈夊叾浠栨鏌�">
-          <j-dict-select-tag dict-code="yn " type="radio" v-model="model.hasOtherCheck"/>
-        </a-form-model-item>
-        <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark" label="澶囨敞">
-          <a-input placeholder="璇疯緭鍏ュ娉�" v-model="model.remark" />
-        </a-form-model-item>
+          <a-col :span="8">
+            <a-form-model-item prop="standardName" label="瑙勮寖鍚嶇О">
+              <a-input placeholder="璇疯緭鍏ヨ鑼冨悕绉�" v-model="model.standardName"/>
+            </a-form-model-item>
+          </a-col>
 
+          <a-col :span="8">
+            <a-form-model-item prop="equipmentId" label="缁熶竴缂栫爜">
+              <lx-search-equipment-select placeholder="璇疯緭鍏ョ粺涓�缂栫爜鎴栧悕绉版悳绱�" v-model="model.equipmentId" :disabled="!editable"/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+
+        <a-row>
+          <a-col :span="8">
+            <a-form-model-item label="閴村畾鍛ㄦ湡(骞�)">
+              <a-input-number v-model="model.evaluationPeriod" :min="1" placeholder="璇疯緭鍏ラ壌瀹氬懆鏈�(骞�)" style="width: 100%"/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+
+        <a-row>
+          <!--<a-col :span="8">-->
+          <!--<a-form-model-item label="瀹夊叏瑁呯疆妫�鏌�">-->
+          <!--<j-dict-select-tag @change="handleCheckListChange($event,1)" dict-code="yn " type="radio"-->
+          <!--:disabled="model.hasPrecisionCheck=='0'&&model.hasOtherCheck=='0'"-->
+          <!--v-model="model.hasSafetyEquipmentCheck"/>-->
+          <!--</a-form-model-item>-->
+          <!--</a-col>-->
+
+          <!--<a-col :span="8">-->
+          <!--<a-form-model-item label="璁惧绮惧害妫�鏌�">-->
+          <!--<j-dict-select-tag @change="handleCheckListChange($event,2)" dict-code="yn " type="radio"-->
+          <!--:disabled="model.hasSafetyEquipmentCheck=='0'&&model.hasOtherCheck=='0'"-->
+          <!--v-model="model.hasPrecisionCheck"/>-->
+          <!--</a-form-model-item>-->
+          <!--</a-col>-->
+
+          <!--<a-col :span="8">-->
+          <!--<a-form-model-item label="鍏朵粬妫�鏌�">-->
+          <!--<j-dict-select-tag @change="handleCheckListChange($event,3)" dict-code="yn " type="radio"-->
+          <!--:disabled="model.hasPrecisionCheck=='0'&&model.hasSafetyEquipmentCheck=='0'"-->
+          <!--v-model="model.hasOtherCheck"/>-->
+          <!--</a-form-model-item>-->
+          <!--</a-col>-->
+
+          <a-col :span="8" v-for="item in checkList">
+            <a-form-model-item :label="item.label">
+              <j-dict-select-tag @change="handleCheckListChange($event,item.key)" dict-code="yn" type="radio"
+                                 :disabled="checkList.filter(i=>i.key!=item.key).every(i=>i.value=='0')"
+                                 v-model="model[item.key]"/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
+
+        <a-row>
+          <a-col :span="24">
+            <a-form-model-item :labelCol="{span:2}" :wrapperCol="{span:21}" label="澶囨敞">
+              <a-textarea placeholder="璇疯緭鍏ュ娉�" v-model="model.remark"/>
+            </a-form-model-item>
+          </a-col>
+        </a-row>
       </a-form-model>
+
+      <a-tabs :activeKey="activeTabKey" @change="handleTabChange">
+        <a-tab-pane tab="瀹夊叏瑁呯疆妫�鏌�" :key="1" v-if="+model.hasSafetyEquipmentCheck">
+          <j-vxe-table ref="editableDetailTable1" rowNumber rowSelection bordered alwaysEdit toolbar
+                       :toolbarConfig="detail.toolbarConfig" keep-source
+                       :height="300" :dataSource="detail.safetyEquipmentCheckList" :columns="detail.columns">
+          </j-vxe-table>
+        </a-tab-pane>
+
+        <a-tab-pane tab="璁惧绮惧害妫�鏌�" :key="2" v-if="+model.hasPrecisionCheck" forceRender>
+          <j-vxe-table ref="editableDetailTable2" rowNumber rowSelection bordered alwaysEdit toolbar
+                       :toolbarConfig="detail.toolbarConfig" keep-source
+                       :height="300" :dataSource="detail.precisionCheckList" :columns="detail.precisionCheckColumns">
+          </j-vxe-table>
+        </a-tab-pane>
+
+        <a-tab-pane tab="鍏朵粬妫�鏌�" :key="3" v-if="+model.hasOtherCheck" forceRender>
+          <j-vxe-table ref="editableDetailTable3" rowNumber rowSelection bordered alwaysEdit toolbar
+                       :toolbarConfig="detail.toolbarConfig" keep-source
+                       :height="300" :dataSource="detail.otherCheckList" :columns="detail.columns">
+          </j-vxe-table>
+        </a-tab-pane>
+      </a-tabs>
     </a-spin>
   </j-modal>
 </template>
 
 <script>
-import { httpAction } from '@/api/manage'
+  import { httpAction, getAction } from '@/api/manage'
+  import LxSearchEquipmentSelect from '@views/eam/equipment/modules/LxSearchEquipmentSelect.vue'
+  import { JVXETypes } from '@/components/jeecg/JVxeTable'
+  import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
 
-export default {
-    name: "EamTechnicalStatusEvaluationStandardModal",
-    data () {
+  export default {
+    name: 'EamTechnicalStatusEvaluationStandardModal',
+    components: {
+      LxSearchEquipmentSelect
+    },
+    mixins: [JVxeTableModelMixin],
+    data() {
       return {
-        title:"鎿嶄綔",
+        title: '鎿嶄綔',
         visible: false,
         model: {},
         labelCol: {
           xs: { span: 24 },
-          sm: { span: 5 },
+          sm: { span: 6 }
         },
         wrapperCol: {
           xs: { span: 24 },
-          sm: { span: 16 },
+          sm: { span: 15 }
         },
-
+        spinning: false,
         confirmLoading: false,
-        validatorRules:{
+        editable: true,
+        validatorRules: {
+          standardName: [{ required: true, message: '璇疯緭鍏ヨ鑼冨悕绉�', trigger: 'change' }],
+          equipmentId: [{ required: true, message: '璇疯緭鍏ョ粺涓�缂栫爜鎴栧悕绉版悳绱�', trigger: 'change' }]
+        },
+        checkList: [
+          {
+            label: '瀹夊叏瑁呯疆妫�鏌�',
+            dictValue: 'SAFETY_EQUIPMENT_CHECK',
+            key: 'hasSafetyEquipmentCheck',
+            value: '1',
+            order: 1
+          },
+          {
+            label: '璁惧绮惧害妫�鏌�',
+            dictValue: 'PRECISION_CHECK',
+            key: 'hasPrecisionCheck',
+            value: '1',
+            order: 2
+          },
+          {
+            label: '鍏朵粬妫�鏌�',
+            dictValue: 'OTHER_CHECK',
+            key: 'hasOtherCheck',
+            value: '1',
+            order: 3
+          }
+        ],
+        activeTabKey: 1,
+        upgradeFlag: false,
+        detail: {
+          safetyEquipmentCheckList: [],
+          precisionCheckList: [],
+          otherCheckList: [],
+          columns: [
+            {
+              title: 'ID',
+              key: 'id',
+              type: JVXETypes.hidden
+            },
+            {
+              title: 'standardId',
+              key: 'standardId',
+              type: JVXETypes.hidden
+            },
+            {
+              title: '椤圭洰搴忓彿',
+              key: 'itemCode',
+              type: JVXETypes.inputNumber,
+              align: 'center',
+              placeholder: '璇疯緭鍏ラ」鐩簭鍙�',
+              width: 150,
+              validateRules: [
+                { required: true, message: '璇疯緭鍏�${title}' },
+                { unique: true, message: '${title}涓嶈兘閲嶅' }
+              ]
+            },
+            {
+              title: '妫�鏌ラ」鐩�',
+              key: 'itemName',
+              placeholder: '璇疯緭鍏�${title}',
+              type: JVXETypes.textarea,
+              align: 'center',
+              validateRules: [{ required: true, message: '璇疯緭鍏�${title}' }]
+            }
+          ],
+          precisionCheckColumns: [
+            {
+              title: 'ID',
+              key: 'id',
+              type: JVXETypes.hidden
+            },
+            {
+              title: 'standardId',
+              key: 'standardId',
+              type: JVXETypes.hidden
+            },
+            {
+              title: '椤圭洰搴忓彿',
+              key: 'itemCode',
+              type: JVXETypes.inputNumber,
+              align: 'center',
+              placeholder: '璇疯緭鍏ラ」鐩簭鍙�',
+              width: 150,
+              validateRules: [
+                { required: true, message: '璇疯緭鍏�${title}' },
+                { unique: true, message: '${title}涓嶈兘閲嶅' }
+              ]
+            },
+            {
+              title: '妫�鏌ラ」鐩�',
+              key: 'itemName',
+              placeholder: '璇疯緭鍏�${title}',
+              type: JVXETypes.textarea,
+              align: 'center',
+              validateRules: [{ required: true, message: '璇疯緭鍏�${title}' }]
+            },
+            {
+              title: '妫�鏌ュ瓙椤圭洰',
+              key: 'subItemName',
+              placeholder: '璇疯緭鍏�${title}',
+              type: JVXETypes.textarea,
+              align: 'center',
+              validateRules: [{ required: true, message: '璇疯緭鍏�${title}' }]
+            },
+            {
+              title: '鍏佸樊鍊�',
+              key: 'toleranceValue',
+              placeholder: '璇疯緭鍏�${title}',
+              type: JVXETypes.input,
+              align: 'center',
+              validateRules: [{ required: true, message: '璇疯緭鍏�${title}' }]
+            }
+          ],
+          toolbarConfig: {
+            // prefix 鍓嶇紑锛泂uffix 鍚庣紑
+            slot: ['prefix', 'suffix'],
+            // add 鏂板鎸夐挳锛況emove 鍒犻櫎鎸夐挳锛沜learSelection 娓呯┖閫夋嫨鎸夐挳
+            btn: ['add', 'remove', 'clearSelection']
+          }
         },
         url: {
-          add: "/eam/eamTechnicalStatusEvaluationStandard/add",
-          edit: "/eam/eamTechnicalStatusEvaluationStandard/edit",
-        },
+          add: '/eam/eamTechnicalStatusEvaluationStandard/add',
+          edit: '/eam/eamTechnicalStatusEvaluationStandard/edit',
+          upgrade: '/eam/eamTechnicalStatusEvaluationStandard/upgrade',
+          detail: '/eam/eamTechnicalStatusEvaluationStandardDetail/queryList'
+        }
       }
     },
-    created () {
-    },
     methods: {
-      add () {
+      add() {
+        this.editable = true
         //鍒濆鍖栭粯璁ゅ��
-        this.edit({});
+        this.edit({
+          hasSafetyEquipmentCheck: '1',
+          hasPrecisionCheck: '1',
+          hasOtherCheck: '1'
+        })
       },
-      edit (record) {
-        this.model = Object.assign({}, record);
-        this.visible = true;
+
+      /**
+       * 琛岃褰曠紪杈戞椂瑙﹀彂
+       * @param record 椤甸潰琛ㄦ牸琛岃褰�
+       */
+      edit(record, upgradeFlag = false) {
+        this.upgradeFlag = upgradeFlag
+        console.log('upgradeFlag', this.upgradeFlag)
+        this.detail.safetyEquipmentCheckList = this.detail.precisionCheckList = this.detail.otherCheckList = []
+        this.model = Object.assign({}, record)
+        this.hasCheckedCheckList = []
+        this.checkList.forEach(item => {
+          if (+this.model[item.key]) this.hasCheckedCheckList.push(item)
+        })
+        this.activeTabKey = this.hasCheckedCheckList[0].order
+        this.visible = true
+        if (record.id) {
+          this.editable = false
+          this.loadDetail(record.id)
+        }
       },
-      close () {
-        this.$emit('close');
-        this.visible = false;
-        this.$refs.form.clearValidate();
+
+      /**
+       * 妫�鏌ラ�夋嫨鍙戠敓鏀瑰彉鍚庤Е鍙�
+       * @param value 妫�鏌ラ�夋嫨鍊� 0涓哄惁 1涓烘槸
+       * @param key 妫�鏌ラ�夋嫨瀵瑰簲鏍囩key
+       */
+      handleCheckListChange(value, key) {
+        this.checkList.find(item => item.key == key).value = value
+        if (+value) this.hasCheckedCheckList.push(this.checkList.find(item => item.key == key))
+        else {
+          this.hasCheckedCheckList = this.hasCheckedCheckList.filter(item => item.key != key)
+          if (!this.hasCheckedCheckList.some(item => item.key == key)) this.activeTabKey = this.hasCheckedCheckList.sort((x, y) => x.order - y.order)[0].order
+        }
       },
-      handleOk () {
-        const that = this;
-        // 瑙﹀彂琛ㄥ崟楠岃瘉
-         this.$refs.form.validate(valid => {
-          if (valid) {
-            that.confirmLoading = true;
-            let httpurl = '';
-            let method = '';
-            if(!this.model.id){
-              httpurl+=this.url.add;
-              method = 'post';
-            }else{
-              httpurl+=this.url.edit;
-               method = 'put';
+
+      loadDetail(standardId) {
+        this.spinning = true
+        getAction(this.url.detail, { standardId })
+          .then(res => {
+            console.log('res', res)
+            if (res.success) {
+              this.detail.safetyEquipmentCheckList = res.result.filter(item => item.checkCategory == 'SAFETY_EQUIPMENT_CHECK')
+              this.detail.precisionCheckList = res.result.filter(item => item.checkCategory == 'PRECISION_CHECK')
+              this.detail.otherCheckList = res.result.filter(item => item.checkCategory == 'OTHER_CHECK')
             }
-            httpAction(httpurl,this.model,method).then((res)=>{
-              if(res.success){
-                that.$message.success(res.message);
-                that.$emit('ok');
-              }else{
-                that.$message.warning(res.message);
+          })
+          .finally(() => {
+            this.spinning = false
+          })
+      },
+
+      /**
+       * 鏍囩鍒囨崲鏃惰Е鍙�
+       * @param key 鍒囨崲鍚庣殑鏍囩key
+       * @returns {Promise<boolean>}
+       */
+      async handleTabChange(key) {
+        let errMap = await this.$refs['editableDetailTable' + this.activeTabKey].validateTable()
+        if (errMap) return false
+        this.activeTabKey = key
+      },
+
+      async handleOk() {
+        // 鍏堟牎楠屽綋鍓峵ab涓嬬殑琛ㄦ牸
+        let errMap = await this.$refs['editableDetailTable' + this.activeTabKey].validateTable()
+        if (errMap) return false
+
+        // 鏍¢獙宸查�夋嫨鐨勬鏌ラ」琛ㄦ牸涓虹┖
+        let allTableData = []
+        const hasCheckedCheckList = this.hasCheckedCheckList.sort((x, y) => x.order - y.order)
+        for (let index = 0; index < hasCheckedCheckList.length; index++) {
+          let tableData = this.$refs['editableDetailTable' + hasCheckedCheckList[index].order].getTableData()
+          if (tableData.length == 0) {
+            this.$notification.warning({
+              message: '娑堟伅',
+              description: hasCheckedCheckList[index].label + '蹇呭~椤逛笉鑳戒负绌�'
+            })
+            return
+          }
+          tableData = tableData.map(item => {
+            return {
+              ...item,
+              checkCategory: hasCheckedCheckList[index].dictValue
+            }
+          })
+          allTableData = [...allTableData, ...tableData]
+        }
+        const that = this
+        // 瑙﹀彂琛ㄥ崟楠岃瘉
+        this.$refs.form.validate(valid => {
+          if (valid) {
+            that.confirmLoading = true
+            let httpUrl = ''
+            let method = ''
+            if (!this.model.id) {
+              httpUrl += this.url.add
+              method = 'post'
+            } else {
+              if (!this.upgradeFlag) httpUrl += this.url.edit
+              else httpUrl += this.url.upgrade
+              method = 'put'
+            }
+            this.model.tableDetailList = allTableData
+            httpAction(httpUrl, this.model, method).then((res) => {
+              if (res.success) {
+                that.$notification.success({
+                  message: '娑堟伅',
+                  description: res.message
+                })
+                that.$emit('ok')
+              } else {
+                that.$notification.warning({
+                  message: '娑堟伅',
+                  description: res.message
+                })
               }
             }).finally(() => {
-              that.confirmLoading = false;
-              that.close();
+              that.confirmLoading = false
+              that.close()
             })
-          }else{
-             return false;
+          } else {
+            return false
           }
         })
       },
-      handleCancel () {
+
+      handleCancel() {
         this.close()
       },
+
+      close() {
+        this.$emit('close')
+        this.visible = false
+        this.$refs.form.clearValidate()
+      }
 
 
     }
   }
-</script>
-
-<style lang="less" scoped>
-
-</style>
\ No newline at end of file
+</script>
\ No newline at end of file

--
Gitblit v1.9.3