Newer
Older
smartwell_front / src / views / home / alarm / current / components / remindDialog.vue
liyaguang on 26 Feb 6 KB 新装设备完成
<!--
  Description: 报警管理-提醒责任人
  Author: 李亚光
  Date: 2024-09-10
 -->
<script lang="ts" setup name="PendingDialog">
import type { FormRules } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import { remindAlarm } from '@/api/home/alarm/current'
import { getUserList } from '@/api/system/user'
import useUserStore from '@/store/modules/user'
import { encrypt, decrypt, isEncrypt } from '@/utils/security1'
const emits = defineEmits(['refresh'])
const user = useUserStore()
const dataFormRef = ref()
const dialogFormVisible = ref(false) // 对话框是否显示
const isOtherUser = ref(false)
const dataForm = ref({
  alarmId: '',
  remindContent: '',
  remindPersonId: '',
  remindPerson: '',
  remindPersonOtherId: '',
  remindPersonOther: '',
  telephone: '',
}) // 表单
const rules: FormRules = {
  remindContent: [{ required: true, message: '提醒内容不能为空', trigger: ['blur', 'change'] }],
  remindPersonOtherId: [{ required: true, message: '提醒人员不能为空', trigger: ['blur', 'change'] }],
  remindPersonId: [{ required: true, message: '提醒人员不能为空', trigger: ['blur', 'change'] }],
} // 前端校验规则

// 重置表单
const resetForm = () => {
  dataForm.value = {
    alarmId: '',
    remindContent: '',
    remindPersonId: '',
    remindPerson: '',
    remindPersonOtherId: '',
    remindPersonOther: '',
    telephone: '',
  }
}

// 初始化对话框
const disabledBtn = ref(false)
const data = ref()
const initDialog = (row: any) => {
  data.value = row
  dialogFormVisible.value = true
  disabledBtn.value = false
  resetForm()
  dataForm.value.alarmId = row.id
  isOtherUser.value = false
  console.log(row, 'row')
  dataForm.value.remindContent = `${row.ledgerNumber}${row.position}疑似发现${row.alarmMsg},请尽快去现场确认`
}
defineExpose({
  initDialog,
})

// 保存数据
const saveData = () => {
  dataFormRef.value.validate((valid: any) => {
    if (valid) {
      const data = {
        ...JSON.parse(JSON.stringify(dataForm.value)),
      }
      if (isOtherUser.value) {
        data.remindPerson = ''
        data.remindPersonId = ''
      }
      else {
        data.remindPersonOther = ''
        data.remindPersonOtherId = ''
      }
      disabledBtn.value = true
      remindAlarm(data).then((res) => {
        ElMessage.success('操作成功')
        dialogFormVisible.value = false
        emits('refresh')
        data.value.processStatus = 4
        data.value.processStatusName = '待现场确认'
        disabledBtn.value = false
      }).catch(() => {
        // ElMessage.success('操作成功')
        disabledBtn.value = false
      })
    }
  })
}
const cancel = () => {
  dialogFormVisible.value = false
}
// 字典
const wellUserList = ref([
  {
    name: '其他',
    id: 'other',
  },
]) // 闸井负责人
const userList = ref<any[]>([]) // 用户列表
const fetchDict = () => {
  getUserList({ offset: 1, limit: 9999, deptId: user.deptId }).then((res) => {
    userList.value = res.data.rows.map((item:any) => ({
      ...item,
      name: isEncrypt(item.name) ? decrypt(item.name) : item.name,
      phone: isEncrypt(item.phone) ? decrypt(item.phone) : item.phone,
      email: isEncrypt(item.email) ? decrypt(item.email) : item.email,
    }))
    .map((item: any) => ({
      label: `${item.name}(${item.deptName})`,
      value: item.id,
      id: item.id,
      phone: item.phone,
      name: item.name,
    }))
  })
}
fetchDict()

// 监视提醒人员 是否选择的其他
const selectWellUser = (data: any) => {
  if (data === 'other') {
    isOtherUser.value = true
    // dataForm.value.remindPersonId = ''
    dataForm.value.remindPerson = ''
  }
  else {
    isOtherUser.value = false
  }
}
// 填充手机号等信息
watch([
  () => dataForm.value.remindPersonId,
  () => dataForm.value.remindPersonOtherId,
], (newVal) => {
  if (!newVal[0] && !newVal[1]) {
    return
  }
  // 负责人
  if (newVal[0] && newVal[0] !== 'other') {
    console.log(newVal)
    // TODO
    // 暂未开发,未提供负责人列表数据
  }
  // 其他人员
  if (newVal[0] === 'other' && newVal[1]) {
    // 填充
    const person = userList.value.filter((item: any) => item.id === newVal[1])
    if (person.length) {
      dataForm.value.remindPersonOther = person[0].name
      dataForm.value.telephone = person[0].phone
    }
  }
}, {
  deep: true,
})
</script>

<template>
  <el-dialog v-model="dialogFormVisible" title="提醒责任人" append-to-body width="30%">
    <el-form ref="dataFormRef" :rules="rules" :model="dataForm" label-position="right" label-width="120px">
      <el-row :gutter="24">
        <el-col :span="24">
          <el-form-item label="提醒人员" prop="remindPersonId">
            <el-select
              v-model.trim="dataForm.remindPersonId" placeholder="提醒人员"
              :style="`width:${isOtherUser ? '50' : '100'}%`" filterable @change="selectWellUser"
            >
              <el-option v-for="item in wellUserList" :key="item.id" :value="item.id" :label="item.name" />
            </el-select>
            <el-select
              v-if="isOtherUser" v-model.trim="dataForm.remindPersonOtherId" placeholder="提醒人员"
              style="width: 50%;" filterable
            >
              <el-option v-for="item in userList" :key="item.id" :value="item.id" :label="item.label" />
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="联系方式" prop="telephone">
            <el-input v-model.trim="dataForm.telephone" type="text" style="width: 100%;" disabled />
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="提醒内容" prop="remindContent">
            <el-input v-model.trim="dataForm.remindContent" type="textarea" :rows="3" style="width: 100%;" />
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button v-loaing="disabledBtn" :disabled="disabledBtn" type="primary" @click="saveData">
          确认
        </el-button>
        <el-button @click="cancel">
          取消
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
.el-dialog {
  width: 700px;
}

.el-select {
  width: 100%;
}
</style>