<!--
Description: 设备新增or编辑
Author: 李亚光
Date: 2023-04-24
-->
<script lang="ts" setup name="EditPerson">
import { defineExpose, nextTick, reactive, ref } from 'vue'
import type { FormRules } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { device } from './device-interface'
import { getDictByCode } from '@/api/system/dict'
import { addDevice, updateDevice } from '@/api/device'
const emits = defineEmits(['watchChild'])
const dataFormRef = ref()
const dialogFormVisible = ref(false) // 对话框是否显示
const dialogStatus = ref('') // 对话框类型:create,update
const isEditMode = ref(true)
const deviceForm = ref<device>({
deviceType: '', // 设备类型
deviceCode: '', // 设备编号
deviceBatch: '', // 设备批次
isPowerSupply: '', // 是否供电
manufacturer: '', // 厂家
id: '',
createTime: '',
}) // 表单
const textMap: { [key: string]: string } = {
update: '编辑',
create: '新增',
} // 表头显示标题
const btnLoading = ref(false) // 保存按钮的加载中状态
const rules: FormRules = {
deviceType: [{ required: true, message: '请选择设备类型', trigger: ['blur', 'change'] }],
deviceCode: [{ required: true, message: '请输入设备编号', trigger: ['blur', 'change'] }],
deviceBatch: [{ required: true, message: '请输入设备批次', trigger: ['blur', 'change'] }],
isPowerSupply: [{ required: true, message: '请输入设备是否供电', trigger: ['blur', 'change'] }],
manufacturer: [{ required: true, message: '请输入设备厂家', trigger: ['blur', 'change'] }],
} // 前端校验规则
// 重置表单
const resetForm = () => {
deviceForm.value = {
deviceType: '', // 设备类型
deviceCode: '', // 设备编号
deviceBatch: '', // 设备批次
isPowerSupply: '', // 是否供电
manufacturer: '', // 厂家
id: '',
createTime: '',
}
dataFormRef.value.clearValidate()
}
// 获取设备类型
const deviceTypeList = ref()
const fetchDeviceType = () => {
getDictByCode('deviceType').then((response) => {
deviceTypeList.value = response.data
})
}
fetchDeviceType()
// 是否供电
const isPowerSupplyList = ref()
const fetchisPowerSupplyType = () => {
getDictByCode('isPowerSupply').then((response) => {
isPowerSupplyList.value = response.data
})
}
fetchisPowerSupplyType()
// 初始化对话框
const initDialog = (dialogStatusValue: string, row: any) => {
console.log(dialogStatusValue, 'dialogStatusValuedialogStatusValue')
dialogStatus.value = dialogStatusValue
dialogFormVisible.value = true
btnLoading.value = false
if (dialogStatus.value === 'create') { // 如果是新增,清除验证
console.log('新增')
resetForm()
isEditMode.value = false
nextTick(() => {
dataFormRef.value.clearValidate()
})
}
else if (dialogStatus.value === 'update') { // 如果是修改,将row中数据填写到输入框中
console.log('编辑')
deviceForm.value = {
deviceType: row.deviceType, // 设备类型
deviceCode: row.deviceCode, // 设备编号
deviceBatch: row.deviceBatch, // 设备批次
isPowerSupply: row.isPowerSupply, // 是否供电
manufacturer: row.manufacturer, // 厂家
id: row.id,
createTime: row.createTime,
}
isEditMode.value = true
}
}
defineExpose({
initDialog,
})
// 新增数据
const createData = () => {
dataFormRef.value.validate((valid: any) => {
if (valid) {
btnLoading.value = true
addDevice(deviceForm.value).then((response) => {
if (response.code === 200) {
ElMessageBox.confirm('新增成功,是否继续新增?', '提示', {
confirmButtonText: '是',
cancelButtonText: '否',
type: 'info',
}).then(() => { // 选是
resetForm()
btnLoading.value = false
nextTick(() => {
dataFormRef.value.clearValidate()
})
}).catch(() => { // 选否,关闭窗口,并刷新页面
emits('watchChild')
dialogFormVisible.value = false
})
}
}).catch((_) => { // 异常情况,loading置为false
btnLoading.value = false
})
}
})
}
// 修改数据
const updateData = () => {
dataFormRef.value.validate((valid: any) => {
if (valid) {
btnLoading.value = true
updateDevice(deviceForm.value).then((response) => {
if (response.code === 200) {
ElMessage({
message: '修改成功',
type: 'success',
})
dataFormRef.value.clearValidate()
emits('watchChild')
dialogFormVisible.value = false
}
}).catch((_) => { // 异常情况,loading置为false
btnLoading.value = false
})
}
})
}
// 保存数据
const saveData = () => {
if (dialogStatus.value === 'update') {
updateData()
}
else if (dialogStatus.value === 'create') {
createData()
}
}
const cancel = () => {
dialogFormVisible.value = false
resetForm()
}
</script>
<template>
<el-dialog v-model="dialogFormVisible" :title="textMap[dialogStatus]" append-to-body>
<el-form ref="dataFormRef" :rules="rules" :model="deviceForm" label-position="right" label-width="80px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="deviceForm.deviceType" placeholder="请选择设备类型">
<el-option v-for="item in deviceTypeList" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备编号" prop="deviceCode">
<el-input v-model.trim="deviceForm.deviceCode" type="text" placeholder="必填" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="设备厂家" prop="manufacturer">
<el-input v-model.trim="deviceForm.manufacturer" type="text" placeholder="必填" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否供电" prop="isPowerSupply">
<!-- <el-input v-model.trim="deviceForm.isPowerSupply" type="text" placeholder="是或否" /> -->
<el-select v-model="deviceForm.isPowerSupply" placeholder="是否供电">
<el-option v-for="item in isPowerSupplyList" :key="item.value" :label="item.name" :value="item.value" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="批次" prop="deviceBatch">
<el-input v-model.trim="deviceForm.deviceBatch" type="text" placeholder="必填" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button :loading="btnLoading" 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>