src/views/eam/base/modules/EamMaintenanceStandardModal.vue
@@ -8,75 +8,67 @@
    @ok="handleOk"
    @cancel="handleCancel"
    cancelText="关闭">
    <a-spin :spinning="spinning">
      <a-form-model ref="form" :model="model" :rules="validatorRules" :labelCol="labelCol" :wrapperCol="wrapperCol">
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item prop="standardCode" label="规范编码">
              <a-input placeholder="编码系统自动生成" v-model="model.standardCode" disabled/>
            </a-form-model-item>
          </a-col>
          <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-spin :spinning="confirmLoading">
      <a-form-model ref="form" :model="model" :rules="validatorRules">
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardCode" label="标准编码">
              <a-input placeholder="编码系统自动生成" v-model="model.standardCode" disabled />
            <a-form-model-item prop="maintenanceCategory" label="保养分类">
              <j-dict-select-tag dict-code="maintenance_category" placeholder="请选择保养分类"
                                 @change="handleMaintenanceCategoryChange"
                                 v-model="model.maintenanceCategory" :disabled="!editable"/>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardName" label="标准名称">
              <a-input placeholder="请输入标准名称" v-model="model.standardName" />
            <a-form-model-item label="保养周期单位">
              <a-input readOnly v-model="model.periodUnit" placeholder="根据保养分类自动带出"/>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="maintenanceCategory" label="保养分类">
              <j-dict-select-tag dict-code="maintenance_category" placeholder="请选择保养分类" v-model="model.maintenanceCategory" :disabled="editable" />
            <a-form-model-item prop="maintenancePeriod" label="保养周期">
              <a-input-number v-model="model.maintenancePeriod" placeholder="请输入保养周期" :min="1" :precision="0"
                              style="width: 100%"/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fileCode" label="文件编号">
              <a-input placeholder="请输入保养标准文件编号" v-model="model.fileCode"/>
            <a-form-model-item prop="initialDate" label="初始日期">
              <a-date-picker placeholder="请选择初始日期" v-model="model.initialDate" value-format="YYYY-MM-DD"
                             style="width: 100%"/>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="initialDate" label="初始日期">
              <a-date-picker placeholder="请选择初始日期" v-model="model.initialDate" format="YYYY-MM-DD" style="width: 100%" :disabled="editable"/>
            <a-form-model-item label="规范状态">
              <j-dict-select-tag dict-code="maintenance_standard_status" placeholder="根据流程进度自动带出"
                                 v-model="model.standardStatus" disabled/>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="maintenancePeriod" label="保养周期">
              <a-input-number v-model="model.maintenancePeriod" :min="1" :precision="0" style="width: 100%"/>
            <a-form-model-item label="规范版本">
              <a-input-number v-model="model.standardVersion" placeholder="根据流程进度自动带出" style="width: 100%" disabled/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="equipmentId" label="设备编号">
              <lx-search-equipment-select placeholder="请输入设备编号或名称搜索" v-model="model.equipmentId" :disabled="editable"></lx-search-equipment-select>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardStatus" label="标准状态">
              <j-dict-select-tag dict-code="maintenance_standard_status" v-model="model.standardStatus" disabled/>
            </a-form-model-item>
          </a-col>
          <a-col :span="8">
            <a-form-model-item :labelCol="labelCol" :wrapperCol="wrapperCol" prop="standardVersion" label="标准版本">
              <a-input-number v-model="model.standardVersion" style="width: 100%" disabled/>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <a-col :span="8">
            <a-form-model-item
              label="参考文件"
              :labelCol="labelCol"
              :wrapperCol="wrapperCol"
              prop="fileList">
              <lx-upload :returnUrl="false"
                         :multiple="false"
                         v-model="model.fileList"
                         biz="EamMaintenanceStandard">
              </lx-upload>
            </a-form-model-item>
          </a-col>
        </a-row>
        <a-row :gutter="24">
          <j-vxe-table
            ref="editableDetailTable"
@@ -91,7 +83,20 @@
            :loading="detail.loading"
            :dataSource="detail.dataSource"
            :columns="detail.columns"
            style="margin-top: 8px;"/>
            style="margin-top: 8px;">
            <template v-slot:itemPart="props">
              <a-textarea v-model="props.row.itemPart" allowClear @change="$refs.editableDetailTable.validateTable()"
                          :placeholder="model.maintenanceCategory!='THIRD_MAINTENANCE'?'仅三保需要维护':'请输入部位'" :rows="1"
                          autoSize :disabled="model.maintenanceCategory!='THIRD_MAINTENANCE'"/>
            </template>
            <template v-slot:itemCategory="props">
              <j-dict-select-tag v-model="props.row.itemCategory" :dict-code="encodedDictCode"
                                 @change="$refs.editableDetailTable.validateTable()"
                                 :placeholder="getItemCategoryPlaceholder"
                                 :disabled="!Boolean(model.maintenanceCategory)||model.maintenanceCategory=='THIRD_MAINTENANCE'"/>
            </template>
          </j-vxe-table>
        </a-row>
      </a-form-model>
    </a-spin>
@@ -99,55 +104,56 @@
</template>
<script>
import { getAction, httpAction } from '@/api/manage'
  import { getAction, httpAction } from '@/api/manage'
  import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js'
  import { JVXETypes } from '@/components/jeecg/JVxeTable'
  import LxSearchEquipmentSelect from '@views/eam/equipment/modules/LxSearchEquipmentSelect'
  export default {
    name: "EamMaintenanceStandardModal",
    name: 'EamMaintenanceStandardModal',
    mixins: [JVxeTableModelMixin],
    components: {
      LxSearchEquipmentSelect,
      LxSearchEquipmentSelect
    },
    data () {
    data() {
      return {
        title:"操作",
        title: '操作',
        visible: false,
        model: {},
        editable: false,
        editable: true,
        upgradeFlag: false,
        labelCol: {
          xs: { span: 24 },
          sm: { span: 5 },
          sm: { span: 7 }
        },
        wrapperCol: {
          xs: { span: 24 },
          sm: { span: 16 },
          sm: { span: 16 }
        },
        confirmLoading: false,
        spinning: false,
        validatorRules: {
          standardName: [
            { required: true, message: '请输入标准名称!' }
            { required: true, message: '请输入规范名称', trigger: 'change' }
          ],
          maintenanceCategory: [
            { required: true, message: '请选择保养分类!' }
            { required: true, message: '请选择保养分类', trigger: 'change' }
          ],
          initialDate: [
            { required: true, message: '请选择初始日期!' }
            { required: true, message: '请选择初始日期', trigger: 'change' }
          ],
          maintenancePeriod: [
            { required: true, message: '请输入保养周期,单位:天!' }
            { required: true, message: '请输入保养周期', trigger: 'change' }
          ],
          equipmentId: [
            { required: true, message: '请选择设备!' }
            { required: true, message: '请输入统一编码或名称搜索', trigger: 'change' }
          ]
        },
        url: {
          add: "/eam/maintenanceStandard/add",
          edit: "/eam/maintenanceStandard/edit",
          detail: "/eam/eamMaintenanceStandardDetail/queryList",
          upgrade: '/eam/maintenanceStandard/upgrade',
          add: '/eam/maintenanceStandard/add',
          edit: '/eam/maintenanceStandard/edit',
          detail: '/eam/eamMaintenanceStandardDetail/queryList',
          upgrade: '/eam/maintenanceStandard/upgrade'
        },
        detail: {
          loading: false,
@@ -156,169 +162,249 @@
            {
              title: 'ID',
              key: 'id',
              type: JVXETypes.hidden,
              type: JVXETypes.hidden
            },
            {
              title: 'standardId',
              key: 'standardId',
              type: JVXETypes.hidden,
              type: JVXETypes.hidden
            },
            {
              title: '序号',
              title: '项目序号',
              key: 'itemCode',
              type: JVXETypes.inputNumber,
              align:"center",
              width: 100,
              align: 'center',
              placeholder: '请输入项目序号',
              width: 150,
              validateRules: [
                {required : true, unique: true, message: '序号不能重复'}
                { required: true, message: '请输入项目序号' },
                { unique: true, message: '项目序号不能重复' }
              ]
            },
            {
              title: '部位',
              key: 'itemPart',
              type: JVXETypes.textarea,
              align:"center",
              type: JVXETypes.slot,
              slotName: 'itemPart',
              placeholder: '请输入部位',
              align: 'center',
              validateRules: [{ handler: this.itemPartValidate }]
            },
            {
              title: '保养项',
              title: '保养项分类',
              key: 'itemCategory',
              type: JVXETypes.slot,
              slotName: 'itemCategory',
              align: 'center',
              validateRules: [{ handler: this.itemCategoryValidate }]
            },
            {
              title: '保养项目',
              key: 'itemName',
              placeholder: '请输入保养项目',
              type: JVXETypes.textarea,
              align:"center",
              align: 'center',
              validateRules: [
                {required : true, message: '保养项不能为空!'}
                { required: true, message: '请输入保养项目' }
              ]
            },
            {
              title: '保养要求',
              key: 'itemDemandAlias',
              type: JVXETypes.textarea,
              align:"center",
            },
            {
              title: '检查标准或要求',
              title: '保养规范或要求',
              key: 'itemDemand',
              placeholder: '请输入保养规范或要求',
              type: JVXETypes.textarea,
              align:"center",
              align: 'center',
              validateRules: [
                {required : true, message: "保养要求不能为空!"}
                { required: true, message: '请输入保养规范或要求' }
              ]
            },
            {
              title: '检查方法',
              key: 'checkMethod',
              type: JVXETypes.textarea,
              align:"center",
            },
            }
          ],
          toolbarConfig: {
            // prefix 前缀;suffix 后缀
            slot: ['prefix', 'suffix'],
            // add 新增按钮;remove 删除按钮;clearSelection 清空选择按钮
            btn: ['add', 'remove', 'clearSelection']
          },
          }
        }
      }
    },
    created () {
    computed: {
      getItemCategoryPlaceholder() {
        if (!Boolean(this.model.maintenanceCategory)) return '请选择保养分类'
        else {
          if (this.model.maintenanceCategory != 'THIRD_MAINTENANCE') return '请选择保养项分类'
          else return '三保无需维护'
        }
      },
      encodedDictCode() {
        let suffix
        if (!Boolean(this.model.maintenanceCategory) || this.model.maintenanceCategory === 'THIRD_MAINTENANCE') return
        else suffix = this.model.maintenanceCategory.split('_')[1]
        const dictCode = `sys_dict_item,item_text,item_value,item_value like '%${suffix}' and dict_id='1940598438685134850'`
        return encodeURIComponent(dictCode)
      }
    },
    methods: {
      add () {
        this.model = {};
        this.visible = true;
        this.editable = false;
        this.upgradeFlag = false;
        this.detail.dataSource = [];
      add() {
        this.model = {}
        this.visible = true
        this.editable = true
        this.upgradeFlag = false
        this.detail.dataSource = []
      },
      edit (record) {
        this.model = Object.assign({}, record);
        this.visible = true;
        this.editable = true;
        this.upgradeFlag = false;
        this.detail.dataSource = [];
        if(record && record.referenceFile) {
          let obj = JSON.parse(record.referenceFile);
          this.model.fileList = [obj];
        }else {
          this.model.fieldList = [];
        }
        this.loadDetail(record.id);
      },
      upgrade(record) {
        this.model = Object.assign({}, record);
        this.visible = true;
        this.editable = true;
        this.upgradeFlag = true;
        this.detail.dataSource = [];
        if(record && record.referenceFile) {
          let obj = JSON.parse(record.referenceFile);
          this.model.fileList = [obj];
        }else {
          this.model.fieldList = [];
        }
        this.loadDetail(record.id);
      },
      close () {
        this.$emit('close');
        this.visible = false;
        this.$refs.form.clearValidate();
      },
      async handleOk () {
        const that = this;
        let errMap = await that.$refs.editableDetailTable.validateTable();
        if(errMap){
          this.$message.warning("数据校验失败!");
          return;
        }
        // 触发表单验证
         this.$refs.form.validate(valid => {
          if (valid) {
            let tableData = that.$refs.editableDetailTable.getTableData();
            let removeData = that.$refs.editableDetailTable.getDeleteData();
            that.model.tableDetailList = [...tableData];
            that.model.removeDetailList = [...removeData];
            that.confirmLoading = true;
            let httpurl = '';
            let method = '';
            if(!this.model.id){
              httpurl+=this.url.add;
              method = 'post';
            }else{
              if(this.upgradeFlag) {
                httpurl+=this.url.upgrade;
              }else {
                httpurl+=this.url.edit;
      edit(record) {
        this.model = Object.assign({}, record)
        this.visible = true
        this.editable = false
        this.upgradeFlag = false
        this.detail.dataSource = []
        this.loadDetail(record.id)
      },
      upgrade(record) {
        this.model = Object.assign({}, record)
        this.visible = true
        this.editable = false
        this.upgradeFlag = true
        this.detail.dataSource = []
        this.loadDetail(record.id)
      },
      /**
       * 保养分类值改变时同时改变保养周期单位以及保养项分类
       * @param value 保养分类值
       */
      handleMaintenanceCategoryChange(value) {
        switch (value) {
          case 'THIRD_MAINTENANCE':
            this.model.periodUnit = '年'
            break
          case 'SECOND_MAINTENANCE':
            this.model.periodUnit = '月'
            break
          case 'POINT_INSPECTION':
            this.model.periodUnit = '天'
            break
          default:
            delete this.model.periodUnit
        }
        const tableData = this.$refs.editableDetailTable.getTableData()
        tableData.forEach(item => {
          if (value !== 'THIRD_MAINTENANCE') delete item.itemPart
          delete item.itemCategory
        })
        this.detail.dataSource = [...tableData]
        console.log('tableData', tableData)
      },
      /**
       * 保养部位校验
       * @param cellValue 输入值
       * @param callback 回调函数
       */
      itemPartValidate({ cellValue }, callback) {
        if (this.model.maintenanceCategory === 'THIRD_MAINTENANCE') {
          if (cellValue) callback(true)
          else callback(false, '请选择${title}')
        } else {
          callback(true)
        }
      },
      /**
       * 保养项分类校验
       * @param cellValue 输入值
       * @param callback 回调函数
       */
      itemCategoryValidate({ cellValue }, callback) {
        if (this.model.maintenanceCategory === 'THIRD_MAINTENANCE') {
          callback(true)
        } else {
          if (cellValue) callback(true)
          else callback(false, '请选择${title}')
        }
      },
      // 提交事件
      async handleOk() {
        const that = this
        let errMap = await that.$refs.editableDetailTable.validateTable()
        if (errMap) return false
        // 触发表单验证
        this.$refs.form.validate(valid => {
          if (valid) {
            let tableData = that.$refs.editableDetailTable.getTableData()
            let removeData = that.$refs.editableDetailTable.getDeleteData()
            that.model.tableDetailList = [...tableData]
            that.model.removeDetailList = [...removeData]
            that.confirmLoading = that.spinning = true
            let httpUrl = ''
            let method = ''
            if (!this.model.id) {
              httpUrl += this.url.add
              method = 'post'
            } else {
              if (this.upgradeFlag) {
                httpUrl += this.url.upgrade
              } else {
                httpUrl += this.url.edit
              }
              method = 'put';
              method = 'put'
            }
            httpAction(httpurl,this.model,method).then((res)=>{
              if(res.success){
                that.$message.success(res.message);
                that.$emit('ok');
                that.close();
              }else{
                that.$message.warning(res.message);
              }
            }).finally(() => {
              that.confirmLoading = false;
            })
          }else{
             return false;
            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
          }
        })
      },
      handleCancel () {
      handleCancel() {
        this.close()
      },
      close() {
        this.$emit('close')
        this.visible = false
        this.$refs.form.clearValidate()
      },
      //加载详情数据
      loadDetail(standardId) {
        this.detail.dataSource = [];
        this.spinning = true
        this.detail.dataSource = []
        if (standardId) {
          getAction(this.url.detail, { standardId: standardId }).then(res => {
            if (res.success) {
              this.detail.dataSource = [...res.result];
            }
          })
          getAction(this.url.detail, { standardId })
            .then(res => {
              if (res.success) {
                this.detail.dataSource = [...res.result]
              }
            })
            .finally(() => {
              this.spinning = false
            })
        }
      }
@@ -326,6 +412,12 @@
  }
</script>
<style lang="less" scoped>
<style scoped lang="less">
  /deep/ .ant-select-dropdown-menu {
    text-align: left;
  }
  /deep/ textarea.ant-input {
    resize: none;
  }
</style>