<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>