Newer
Older
laserPTZFrontV2.0 / src / views / task / edit.vue
bairujie on 7 Jun 2023 10 KB bug修改
<script lang="ts" setup name="SystemEditResource">
import { nextTick, reactive } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { DateModelType, FormInstance, FormRules } from 'element-plus'
import type { IDevice, ILine, IQuery, IStatus, ITaskInfo } from './interface'
import { addTask, deviceSelect, editTask, lineSelect } from '@/api/ptz/task'

import { getDictByCode } from '@/api/system/dict'
// ----------------------- 以下是字段定义 emits props ---------------------
const emits = defineEmits(['closeRefresh'])
// 设备列表
const deviceList = ref<IStatus[]>([])
// 路径列表
const lineList = ref<IDevice[]>([])
// 状态列表
const statusList = ref<ILine[]>([])
// 对话框类型:create,update
const dialogStatus = ref('create')
const dialogVisible = ref(false)
// 显示标题
const textMap: { [key: string]: string } = {
  update: '编辑',
  create: '新增',
}
// 表单数据对象
const formData = ref<IQuery>({
  id: '',
  taskName: '', // 计划名称
  monitorId: '', // 设备id
  lineNum: '', // 巡航路径
  status: '0', // 是否启用
  beginDate: '',
  endDate: '',
  beginTime: '',
  endTime: '',
  dateRange: [],
  timeRange: [],
})

// 保存按钮加载状态
const btnLoading = ref(false)

// ---------------表单提交--------------------------------
// 表单对象
const dataFormRef = ref<FormInstance>()
// 校验规则
const rules = reactive<FormRules>({
  taskName: [{ required: true, message: '计划名称不可为空', trigger: ['blur', 'change'] }],
  monitorId: [{ required: true, message: '设备为必选', trigger: ['blur', 'change'] }],
  lineNum: [{ required: true, message: '导航路径为必选', trigger: ['blur', 'change'] }],
  status: [{ required: true, message: '状态为必选', trigger: ['blur', 'change'] }],
  dateRange: [{ required: true, message: '计划日期不可为空', trigger: ['blur', 'change'] }],
  endDate: [{ required: true, message: '结束日期不可为空', trigger: ['blur', 'change'] }],
  timeRange: [{ required: true, message: '计划时间不可为空', trigger: ['blur', 'change'] }],
  endTime: [{ required: true, message: '结束时间不可为空', trigger: ['blur', 'change'] }],
})

function submitForm() {
  console.log(formData.value)
  if (dataFormRef) {
    dataFormRef.value?.validate((valid: boolean) => {
      if (valid) {
        if (dialogStatus.value === 'create') {
          createData()
        }
        else if (dialogStatus.value === 'update') {
          updateData()
        }
      }
    })
  }
}
// 新增数据
function createData() {
  btnLoading.value = true
  // 日期以及时间赋值
  formData.value.beginDate = formData.value.dateRange![0]
  formData.value.endDate = formData.value.dateRange![1]
  formData.value.beginTime = formData.value.timeRange![0]
  formData.value.endTime = formData.value.timeRange![1]
  addTask(formData.value).then((res) => {
    res.code === 200 ? ElMessage.success('添加成功') : ElMessage.warning(res.message)
    resetForm()
    nextTick(() => {
      console.log('clearValidate')
      dataFormRef.value?.clearValidate(['taskName', 'monitorId', 'lineNum', 'status', 'dateRange', 'endDate', 'timeRange', 'endTime'])
      closeRefresh()
    })
    btnLoading.value = false
  }).catch((_) => {
    btnLoading.value = false
  })
}

// 更新数据
function updateData() {
  // 日期以及时间赋值
  formData.value.beginDate = formData.value.dateRange![0]
  formData.value.endDate = formData.value.dateRange![1]
  formData.value.beginTime = formData.value.timeRange![0]
  formData.value.endTime = formData.value.timeRange![1]
  editTask(formData.value).then((res) => {
    res.code === 200 ? ElMessage.success('修改成功') : ElMessage.warning(res.message)
    btnLoading.value = false
    closeRefresh()
  }).catch((_) => { // 异常情况,loading置为false
    btnLoading.value = false
  })
}

// 重置表单
function resetForm() {
  formData.value = {
    id: '',
    taskName: '', // 计划名称
    status: '', // 是否启用
    monitorId: '', // 设备id
    lineNum: '', // 巡航路径
    beginDate: '',
    endDate: '',
    beginTime: '',
    endTime: '',
    dateRange: [],
    timeRange: [],
  }

  console.log('resetForm')
  nextTick(() => {
    dataFormRef.value?.clearValidate()
  })
}

// 获取启用状态字典
const handleStatus = () => {
  getDictByCode('status').then((res) => {
    statusList.value = res.data.map((item: { value: any; name: any }) => {
      return {
        value: item.value,
        name: item.name,
      }
    })
  })
}

// 获取设备列表
const getDeviceList = () => {
  deviceSelect({ stationId: '' }).then((res) => {
    deviceList.value = res.data.map((item: { id: any; monitorName: any }) => {
      return {
        value: item.id,
        name: item.monitorName,
      }
    })
  })
}

// 获取路径
const getLineList = () => {
  lineSelect({ stationId: '', monitorId: formData.value.monitorId }).then((res) => {
    lineList.value = res.data.map((item: { id: any; lineName: any }) => {
      return {
        value: parseInt(item.id),
        name: item.lineName,
      }
    })
  })
}


// 修改设备的时候将路径清除
const handleChangeDevice =  ()=> {
    formData.value.lineNum = ''
    getLineList() // 获取路径
}

// 挂载前获取
onMounted(() => {
  handleStatus() // 获取状态
  getDeviceList() // 获取设备
})

// ----------初始化、关闭对话框相关-----------------
function initDialog(dialogstatus: string, row: ITaskInfo) {
  dialogStatus.value = dialogstatus
  dialogVisible.value = true
  btnLoading.value = false
  if (dialogstatus === 'create') {
    resetForm()
  }
  else if (dialogstatus === 'update') {
    nextTick(() => {
      dataFormRef.value?.clearValidate()
    })
    // 组合数据
    formData.value = {
      id: row.id,
      taskName: row.taskName, // 计划名称
      monitorId: row.monitorId, // 设备id
      lineNum: row.lineNum, // 巡航路径
      status: row.status === false ? '0' : '1', // 开启状态
      beginDate: row.beginDate,
      endDate: row.endDate,
      beginTime: row.beginTime,
      endTime: row.endTime,
      dateRange: [row.beginDate, row.endDate],
      timeRange: [row.beginTime, row.endTime],
    }
    getLineList()
  }
}

// 关闭并刷新
function closeRefresh() {
  dialogVisible.value = false
  resetForm()
  emits('closeRefresh')
}
// 关闭弹窗
function dialogClose() {
  dialogVisible.value = false
  resetForm()
}
// ----------------------- 以下是暴露的方法内容 ----------------------------
defineExpose({ initDialog })
</script>

<template>
  <el-dialog
    v-model="dialogVisible" :title="textMap[dialogStatus]" width="500" :before-close="dialogClose" append-to-body
    :open-delay="0" :close-on-click-modal="false"
  >
    <el-form
      ref="dataFormRef" :model="formData" :rules="rules" label-position="left" label-width="80px"
      class="form-container" size="default" @submit.prevent
    >
      <el-row :gutter="10">
        <el-col class="grid-cell" :span="20">
          <el-form-item label="计划日期" prop="dateRange" class="required">
            <el-date-picker
              v-model="formData.dateRange" type="daterange" range-separator="至" format="YYYY-MM-DD"
              value-format="YYYY-MM-DD" start-placeholder="计划开始日期" end-placeholder="结束日期"
            />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="10">
        <el-col class="grid-cell" :span="20">
          <el-form-item label="计划时间" prop="timeRange" class="required">
            <el-time-picker
              v-model="formData.timeRange" style="margin-left: 5px;" is-range format="HH:mm:ss"
              value-format="HH:mm:ss" range-separator="至" start-placeholder="计划开始时间" end-placeholder="结束时间"
            />
          </el-form-item>
        </el-col>
      </el-row>

      <el-row :gutter="10">
        <el-col class="grid-cell" :span="16">
          <el-form-item label="选择设备" prop="monitorId" class="required">
            <el-select v-model="formData.monitorId" class="full-width-input" clearable placeholder="选择设备" @change="handleChangeDevice">
              <el-option v-for="(item, index) in deviceList" :key="index" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="10">
        <el-col class="grid-cell" :span="16">
          <el-form-item label="巡航路径" prop="lineNum" class="required">
            <el-select
              v-model="formData.lineNum" class="full-width-input" clearable
              :placeholder="formData.monitorId === '' ? '请先选择设备' : '选择巡航路径'" :disabled="formData.monitorId === ''"
            >
              <el-option v-for="(item, index) in lineList" :key="index" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="10">
        <el-col class="grid-cell" :span="16">
          <el-form-item label="计划名称" prop="taskName" class="required">
            <el-input v-model="formData.taskName" type="text" placeholder="计划名称必填" clearable />
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="10">
        <el-col class="grid-cell" :span="16">
          <el-form-item label="是否启用" prop="status" class="required">
            <el-select v-model="formData.status" class="full-width-input" clearable placeholder="请选择是否启用">
              <el-option v-for="(item, index) in statusList" :key="index" :label="item.name" :value="item.value" />
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button :loading="btnLoading" type="primary" @click="submitForm">
          保存
        </el-button>
        <el-button @click="dialogClose">
          取消
        </el-button>
      </div>
    </template>
  </el-dialog>
</template>

<style lang="scss" scoped>
.form-container {
  width: 100%;

  .full-width-input {
    width: 100%;
  }
}
</style>