<!-- Description: 管线管理新建编辑 Author: 李亚光 Date: 2024-09-02 --> <script lang="ts" setup name="EditPiePle"> import type { FormRules } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus' import positionDialog from './positionDialog.vue' import { getDictByCode } from '@/api/system/dict' import { addPieple, editPieple } from '@/api/home/ledger/pipeline' const emits = defineEmits(['refresh']) const dataFormRef = ref() const dialogFormVisible2 = ref(false) // 对话框是否显示 const dialogStatus = ref('') // 对话框类型:create,update const dataForm = ref({ pipeCode: '', // 管线编号 position: '', // 管线位置 pressType: '', // 压力级制 material: '', // 材质 pipeDiameter: '', // 管径(mm) constructEra: '', // 建设年代 deptid: '', // 单位 propertyOwner: '', // 单位 manageType: '', // 管理方式 startLat: '', startLng: '', endLat: '', endLng: '', startLatLng: '', endLatLng: '', }) // 表单 const textMap: { [key: string]: string } = { edit: '编辑', add: '新增', } // 表头显示标题 const rules: FormRules = { pipeCode: [{ required: true, message: '管线编号不能为空', trigger: ['blur', 'change'] }], position: [{ required: true, message: '管线位置不能为空', trigger: ['blur', 'change'] }], pressType: [{ required: true, message: '压力级制不能为空', trigger: ['blur', 'change'] }], deptid: [{ required: true, message: '管理单位不能为空', trigger: ['blur', 'change'] }], propertyOwner: [{ required: true, message: '产权不能为空', trigger: ['blur', 'change'] }], manageType: [{ required: true, message: '管理方式不能为空', trigger: ['blur', 'change'] }], startLatLng: [{ required: true, message: '起始位置不能为空', trigger: ['blur', 'change'] }], endLatLng: [{ required: true, message: '终止位置不能为空', trigger: ['blur', 'change'] }], } // 前端校验规则 // 重置表单 const resetForm = () => { dataForm.value = { pipeCode: '', // 管线编号 position: '', // 管线位置 pressType: '', // 压力级制 material: '', // 材质 pipeDiameter: '', // 管径(mm) constructEra: '', // 建设年代 deptid: '', // 单位 propertyOwner: '', // 单位 manageType: '', // 管理方式 startLat: '', startLng: '', endLat: '', endLng: '', startLatLng: '', endLatLng: '', } } const disabledBtn = ref(false) // 初始化对话框 const initDialog = (dialogStatusValue: string, row: any) => { dialogStatus.value = dialogStatusValue dialogFormVisible2.value = true disabledBtn.value = false if (dialogStatus.value === 'add') { // 如果是新增,清除验证 resetForm() // nextTick(() => { // dataFormRef.value.clearValidate() // }) dataFormRef.value?.resetFields() } else if (dialogStatus.value === 'edit') { // 如果是修改,将row中数据填写到输入框中 dataForm.value = { ...JSON.parse(JSON.stringify(row)), } dataForm.value.startLatLng = dataForm.value.startLat ? `${dataForm.value.startLng},${dataForm.value.startLat}` : '' dataForm.value.endLatLng = dataForm.value.endLat ? `${dataForm.value.endLng},${dataForm.value.endLat}` : '' } } defineExpose({ initDialog, }) // 新增数据 const createData = () => { dataFormRef.value.validate((valid: any) => { if (valid) { disabledBtn.value = true addPieple(dataForm.value).then((response) => { if (response.code === 200) { ElMessage({ message: '添加成功', type: 'success', }) // 通知父组件刷新状态 dialogFormVisible2.value = false setTimeout(() => { emits('refresh') }) disabledBtn.value = false } }).catch((_) => { // 异常情况,loading置为false disabledBtn.value = false }) } }) } // 修改数据 const updateData = () => { dataFormRef.value.validate((valid: any) => { if (valid) { disabledBtn.value = true editPieple(dataForm.value).then((response) => { if (response.code === 200) { ElMessage({ message: '修改成功', type: 'success', }) setTimeout(() => { emits('refresh') }) dialogFormVisible2.value = false disabledBtn.value = false } }).catch((_) => { // 异常情况,loading置为false disabledBtn.value = false }) } }) } // 保存数据 const saveData = () => { if (dialogStatus.value === 'edit') { updateData() } else if (dialogStatus.value === 'add') { createData() } } const cancel = () => { dialogFormVisible2.value = false } // 选择经纬度 const positionRef = ref() const inputRef1 = ref() const inputRef2 = ref() const selectPosition = (type: string) => { positionRef.value.initDialog(type, type === 'startLatLng' ? dataForm.value.startLatLng : dataForm.value.endLatLng) // 失焦,避免再次弹窗 inputRef1.value.blur() inputRef2.value.blur() } // 确认位置 const confirmPosition = (data: any) => { // 失焦,避免再次弹窗 inputRef1.value.blur() inputRef2.value.blur() if (data.type === 'startLatLng') { dataForm.value.startLatLng = `${data.longitude},${data.latitude}` dataForm.value.startLat = data.latitude dataForm.value.startLng = data.longitude } else { dataForm.value.endLatLng = `${data.longitude},${data.latitude}` dataForm.value.endLat = data.latitude dataForm.value.endLng = data.longitude } } // 获取字典 const pressTypeList = ref<{ id: string; name: string; value: string }[]>([]) // 压力级制 const manageTypeList = ref<{ id: string; name: string; value: string }[]>([]) // 管理方式 const materialList = ref<{ id: string; name: string; value: string }[]>([ { name: 'PE', id: '1', value: 'PE', }, { name: '钢质', id: '2', value: '钢质', }, ]) // 材质 const fetchDict = () => { // 压力级制 getDictByCode('pressType').then((res) => { pressTypeList.value = res.data }) // 管理方式 getDictByCode('manageType').then((res) => { manageTypeList.value = res.data }) } fetchDict() </script> <template> <!-- <div v-show="dialogFormVisible2" class="dialog" :title="`${textMap[dialogStatus]}管线`" append-to-body> <div class="header"> <span>{{ `${textMap[dialogStatus]}管线` }}</span> <span class="close" @click="() => dialogFormVisible2 = false">x</span> </div> --> <el-dialog ref="dialogRef" v-model="dialogFormVisible2" :title="`${textMap[dialogStatus]}管线`" append-to-body> <position-dialog ref="positionRef" @confirm="confirmPosition" /> <el-form ref="dataFormRef" :rules="rules" :model="dataForm" label-position="right" label-width="80px"> <el-row :gutter="24"> <el-col :span="12"> <el-form-item label="管线编号" prop="pipeCode"> <el-input v-model.trim="dataForm.pipeCode" type="text" placeholder="管线编号" style="width: 100%;" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="管线位置" prop="position"> <el-input v-model.trim="dataForm.position" type="text" placeholder="管线位置" style="width: 100%;" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="12"> <el-form-item label="起始位置" prop="startLatLng"> <el-input ref="inputRef1" v-model.trim="dataForm.startLatLng" type="text" placeholder="起始位置" style="width: 100%;" @focus="selectPosition('startLatLng')"> <template #append> <el-button @click="selectPosition('startLatLng')"> 选择 </el-button> </template> </el-input> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="终止位置" prop="endLatLng"> <el-input ref="inputRef2" v-model.trim="dataForm.endLatLng" type="text" placeholder="终止位置" style="width: 100%;" @focus="selectPosition('endLatLng')"> <template #append> <el-button @click="selectPosition('endLatLng')"> 选择 </el-button> </template> </el-input> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="12"> <el-form-item label="压力级制" prop="pressType"> <el-select v-model="dataForm.pressType" placeholder="压力级制" clearable style="width: 100%;"> <el-option v-for="item in pressTypeList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="材质" prop="material"> <!-- <el-input v-model.trim="dataForm.material" type="text" placeholder="材质" style="width: 100%;" clearable /> --> <el-select v-model="dataForm.material" placeholder="材质" clearable style="width: 100%;"> <el-option v-for="item in materialList" :key="item.id" :label="item.name" :value="item.value" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="12"> <el-form-item label="管径(mm)" prop="pipeDiameter"> <el-input v-model.trim="dataForm.pipeDiameter" type="number" placeholder="管径(mm)" style="width: 100%;" clearable /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="建设年代" prop="constructEra"> <el-input v-model.trim="dataForm.constructEra" type="number" placeholder="建设年代" style="width: 100%;" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="12"> <el-form-item label="管理单位" prop="deptid"> <dept-select v-model="dataForm.deptid" placeholder="管理单位" :clearable="true" style="width: 100%;" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="产权单位" prop="propertyOwner"> <el-input v-model.trim="dataForm.propertyOwner" type="text" placeholder="产权单位" style="width: 100%;" clearable /> <!-- <dept-select v-model="dataForm.propertyOwner" placeholder="产权单位" :clearable="true" style="width: 100%;" /> --> </el-form-item> </el-col> </el-row> <el-row :gutter="24"> <el-col :span="12"> <el-form-item label="管理方式" prop="manageType"> <el-select v-model="dataForm.manageType" placeholder="管理方式" clearable style="width: 100%;"> <el-option v-for="item in manageTypeList" :key="item.id" :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 v-loaing="disabledBtn" :disabled="disabledBtn" type="primary" @click="saveData"> 确认 </el-button> <el-button @click="cancel"> 取消 </el-button> </div> </template> <!-- </div> --> </el-dialog> </template> <style lang="scss" scoped> .el-dialog { width: 700px; } .el-select { width: 100%; } .dialog { width: 60%; position: fixed; top: 40%; left: 50%; transform: translate(-50%, -50%); z-index: 1009; background-color: #fff; padding: 20px; border-radius: 5px !important; border: 1px solid #e4e7ed; box-shadow: 0 0 12px rgb(0 0 0 / 12%); padding-top: 15px; .header { display: flex; justify-content: space-between; padding: 10px; padding-bottom: 20px; .close { color: #817e7e; &:hover { color: #0d76d4; cursor: pointer; } } } .dialog-footer { display: flex; justify-content: end; } } </style>