Newer
Older
smartwell_front / src / views / systemConfig / alarmLevel / components / editAlarmLevel.vue
<template>
  <el-dialog append-to-body :title="textMap[dialogStatus]" width="860px" :visible.sync="dialogFormVisible">
    <el-form ref="dataForm" :rules="rules" :model="form" label-width="120px" label-well-code="right">
      <el-row :gutter="20">
        <el-col :span="12">
          <el-form-item label="设备类型" prop="deviceType">
            <el-select v-model="form.deviceType" placeholder="请选择设备类型" clearable>
              <el-option v-for="item in deviceTypeList" :key="item.id" :label="item.typeName" :value="item.id" />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="监测指标" prop="name">
            <el-input v-model="form.name" clearable placeholder="请输入监测指标名称" />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="20">
        <el-col :span="12">
          <el-form-item label="是否开启告警" prop="openAlarm">
            <el-switch v-model="form.openAlarm" active-value="1" inactive-value="0" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="是否开启工单" prop="openJob">
            <el-switch v-model="form.openJob" active-value="1" inactive-value="0" />
          </el-form-item>
        </el-col>
      </el-row>
      <div class="divider" />
      <div v-show="form.deviceType">
        <el-row v-for="(detail,index) in details" :key="index" :gutter="0" type="flex" justify="center">
          <el-col :span="3">
            <el-form-item :label="levelDict[detail.level]" />
          </el-col>
          <el-col v-if="showHighValue" :span="8">
            <el-form-item label="告警上限" prop="highValue">
              <el-input
                v-model="detail.highValue"
                placeholder="请输入告警上限"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col v-if="showLowValue" :span="8">
            <el-form-item label="告警下限" prop="lowValue">
              <el-input
                v-model="detail.lowValue"
                placeholder="请输入告警下限"
                clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="3" :offset="1">
            <el-button v-if="index<2&&(index==details.length-1)" icon="el-icon-plus" circle @click="addDetail(index)" />
            <el-button v-if="index>0&&(index==details.length-1)" icon="el-icon-minus" circle @click="deleteDetail(index)" />
          </el-col>
        </el-row>
      </div>
    </el-form>
    <div v-show="dialogStatus === 'detail' ? false : true" slot="footer" class="dialog-footer">
      <el-button type="primary" @click="saveData">
        保存
      </el-button>
      <el-button @click="dialogFormVisible = false">
        取消
      </el-button>
    </div>
  </el-dialog>
</template>

<script>
import { getDevice, addAlarmLevel } from '@/api/systemConfig/alarmLevel'
import { getDeviceTypeList } from '@/api/device/deviceType'
export default {
  name: 'EditAlarmLevel',
  data() {
    return {
      dialogFormVisible: false, // 对话框显示隐藏
      tenant: null, // 租户信息
      deviceTypeList: [], // 设备类型列表
      dialogStatus: 'create', // 对话框类型:create,update,detail
      // 对话框标题
      textMap: {
        update: '编辑',
        create: '新增',
        detail: '详情'
      },
      levelDict: {
        '1': '一级告警',
        '2': '二级告警',
        '3': '三级告警'
      },
      // 表单内容
      form: {
        tenantId: '', // 租户/项目id
        deviceType: '', // 设备类型
        name: '', // 监测指标
        openAlarm: '1', // 是否开启报警
        openJob: '1', // 是否开启工单
        levelList: [] // 报警等级列表
      },
      showLowValue: true,
      showHighValue: true,
      details: [
        { level: '1', lowValue: '', highValue: '' }
      ], // 等级列表
      // 表单校验规则
      rules: {
        deviceType: [{ required: true, message: '支持设备类型必选', trigger: ['blur', 'change'] }],
        name: [{ required: true, message: '监测指标名称不能为空', trigger: ['blur', 'change'] }],
        openAlarm: [{ required: true, message: '是否开启告警必选', trigger: ['blur', 'change'] }],
        openJob: [{ required: true, message: '是否开启工单必选', trigger: ['blur', 'change'] }]
      }
    }
  },
  watch: {
    'form.deviceType'(val) {
      const device = this.deviceTypeList.find(item => item.id === val)
      this.showHighValue = device.alarmRuleHighvalue === '1'
      this.showLowValue = device.alarmRuleLowvalue === '1'
    }
  },
  created() {
    this.fetchDeviceType()
  },
  methods: {
    // 获取设备类型
    fetchDeviceType() {
      const params = {
        deviceType: '',
        isValid: '',
        offset: 1,
        limit: 100,
        sort: 'id',
        order: 'asc'
      }
      getDeviceTypeList(params).then(response => {
        this.deviceTypeList = response.data.rows
      })
    },
    // 重置表单
    resetForm() {
      this.form = {
        tenantId: '', // 租户/项目id
        deviceType: '', // 设备类型
        name: '', // 监测指标
        openAlarm: '1', // 是否开启报警
        openJob: '1', // 是否开启工单
        levelList: [] // 报警等级列表
      }
      this.details = [
        { level: '1', lowValue: '', highValue: '' }
      ]
    },
    // 父子组件通信
    initDialog(dialogStatus, tenant) {
      this.tenant = tenant
      this.dialogFormVisible = true
      this.dialogStatus = dialogStatus
      if (this.dialogStatus === 'create') {
        this.resetForm()
        this.$nextTick(() => {
          this.$refs['dataForm'].clearValidate()
        })
      } else if (this.dialogStatus === 'update') {}
    },
    // 保存数据
    saveData() {
      if (this.dialogStatus === 'create') {
        this.createData()
      }
    },
    // 添加等级
    addDetail(index) {
      const detail = { level: (index + 2) + '', lowValue: '', highValue: '' }
      this.details.push(detail)
    },
    // 删除等级
    deleteDetail(index) {
      this.details.splice(index, 1)
    },
    // 验证等级
    validateLevel() {
      let flag = true
      for (const detail of this.details) {
        if (detail.highValue === '' && detail.lowValue === '') {
          this.$message.warning('请将告警等级信息填写完整')
          flag = false
          break
        }
      }
      return flag
    },
    // 新增数据
    createData: function() {
      this.$refs['dataForm'].validate((valid) => {
        if (valid) {
          if (this.validateLevel()) {
            this.form.levelList = this.details
            this.form.tenantId = this.tenant.id
            addAlarmLevel(this.form).then(response => {
              if (response.code === 200) {
                this.$emit('watchChild') // 刷新父组件数据列表
                this.dialogFormVisible = false
              }
            })
          }
        }
      })
    }
  }
}
</script>

<style rel="stylesheet/scss" lang="scss" scoped>
  .el-select{
    width: 100%;
  }
</style>