From 307bac15e17ced65ee5a2dfce7b8a68d467c08c5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 4 Apr 2026 01:17:06 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20feat(mes):=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=BB=B4=E4=BF=AE=E5=B7=A5=E5=8D=95=E8=A1=A8=E5=8D=95=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=8F=8A=E7=8A=B6=E6=80=81=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 调整维修工单表单的字段展示逻辑,优化完成维修和验收的操作流程。新增维修完成日期和维修结果的必填校验,确保用户在提交时提供必要信息。同时,修正了表单的可编辑状态,提升用户体验。 --- src/views/mes/dv/repair/RepairForm.vue | 93 +++++++++++++--------- src/views/mes/dv/repair/RepairLineList.vue | 93 +++++++++++----------- src/views/mes/dv/repair/index.vue | 4 +- 3 files changed, 104 insertions(+), 86 deletions(-) diff --git a/src/views/mes/dv/repair/RepairForm.vue b/src/views/mes/dv/repair/RepairForm.vue index 166dfaa33..1af0e77ac 100644 --- a/src/views/mes/dv/repair/RepairForm.vue +++ b/src/views/mes/dv/repair/RepairForm.vue @@ -50,28 +50,18 @@ - - - - + - + + - + + - + - + - + @@ -130,23 +126,18 @@ 保 存 提 交 - + 完成维修 ('create') // 表单类型:create / update / confirm / finish / detail const isEditable = computed(() => ['create', 'update'].includes(formType.value)) // 是否为编辑模式 -const isDetail = computed(() => !isEditable.value) // 是否为详情模式(confirm/finish/detail 均只读) -const isHeaderReadonly = computed(() => !isEditable.value) // 是否只读 +const isConfirm = computed(() => formType.value === 'confirm') // 是否为完成维修模式 +const isFinish = computed(() => formType.value === 'finish') // 是否为验收模式 +// DONE @AI:finish 从 isDetail 移除,因验收时维修结果字段需可编辑 +const isDetail = computed(() => formType.value === 'detail') // 是否为详情模式(仅 detail 全局只读) +const isHeaderReadonly = computed(() => ['confirm', 'finish', 'detail'].includes(formType.value)) // 是否只读 const showFinishFields = computed(() => { const status = formData.value.status if (status == null) { @@ -203,6 +197,13 @@ const showConfirmFields = computed(() => { } return status >= MesDvRepairStatusEnum.APPROVING }) // 待验收(2)及之后显示 +const showDetailFields = computed(() => { + const status = formData.value.status + if (status == null) { + return false + } + return status >= MesDvRepairStatusEnum.FINISHED +}) // 已确认(4)及之后显示 const dialogTitle = computed(() => { const titles: Record = { create: '新增维修工单', @@ -231,9 +232,12 @@ const formRules = reactive({ code: [{ required: true, message: '维修单编码不能为空', trigger: 'blur' }], name: [{ required: true, message: '维修单名称不能为空', trigger: 'blur' }], machineryId: [{ required: true, message: '设备不能为空', trigger: 'blur' }], - requireDate: [{ required: true, message: '报修日期不能为空', trigger: 'blur' }] + requireDate: [{ required: true, message: '报修日期不能为空', trigger: 'blur' }], + finishDate: [{ required: true, message: '维修完成日期不能为空', trigger: 'change' }], + result: [{ required: true, message: '维修结果不能为空', trigger: 'change' }] }) const formRef = ref() // 表单 Ref +const originalFormData = ref('') // 原始表单数据快照,用于脏检查 /** 生成维修单编码 */ const generateCode = async () => { @@ -254,34 +258,51 @@ const open = async (type: string, id?: number) => { formLoading.value = false } } + // 保存原始数据快照 + originalFormData.value = JSON.stringify(formData.value) } /** 提交表单(create/update 模式) */ const submitForm = async () => { + // 校验表单 await formRef.value.validate() + // 提交请求 formLoading.value = true try { const data = formData.value as any if (formType.value === 'create') { - await DvRepairApi.createRepair(data) + const res = await DvRepairApi.createRepair(data) message.success('新增成功') + // 创建成功后,更新表单数据和状态为编辑模式 + formData.value.id = res + formData.value.status = MesDvRepairStatusEnum.PREPARE + formType.value = 'update' } else { await DvRepairApi.updateRepair(data) message.success('修改成功') } - dialogVisible.value = false + // 更新快照 + originalFormData.value = JSON.stringify(formData.value) + // 发送操作成功的事件 emit('success') } finally { formLoading.value = false } } -/** 提交维修工单(草稿→维修中) */ +/** 提交操作:表单修改过则先保存,再提交(草稿→维修中) */ const handleSubmit = async () => { + // 校验表单 + await formRef.value.validate() try { - // TODO @AI: /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/dv/maintenrecord/MaintenRecordForm.vue 参考类似的; - await message.confirm('确认提交该维修工单?提交后将进入维修中状态') + await message.confirm('确认提交该维修工单?【提交后将不能修改】') formLoading.value = true + // 1. 表单有修改时,先保存 + if (JSON.stringify(formData.value) !== originalFormData.value) { + const data = formData.value as any + await DvRepairApi.updateRepair(data) + } + // 2. 提交维修工单 await DvRepairApi.submitRepair(formData.value.id!) message.success('提交成功') dialogVisible.value = false diff --git a/src/views/mes/dv/repair/RepairLineList.vue b/src/views/mes/dv/repair/RepairLineList.vue index 1749aa043..f3aae7134 100644 --- a/src/views/mes/dv/repair/RepairLineList.vue +++ b/src/views/mes/dv/repair/RepairLineList.vue @@ -2,11 +2,9 @@ - - + @@ -82,9 +79,10 @@ const props = defineProps<{ disabled?: boolean }>() -const message = useMessage() // 消息弹窗 const { t } = useI18n() // 国际化 +const message = useMessage() // 消息弹窗 +// ==================== 列表 ==================== const loading = ref(false) // 列表的加载中 const list = ref([]) // 列表的数据 const total = ref(0) // 列表的总页数 @@ -94,18 +92,6 @@ const queryParams = reactive({ repairId: props.repairId }) -// 表单相关 -const formVisible = ref(false) // 表单弹窗的是否展示 -const formTitle = ref('') // 表单弹窗的标题 -const formLoading = ref(false) // 表单的加载中 -const formType = ref('') // 表单的类型:create - 新增;update - 修改 -const formRef = ref() // 表单 Ref -const formData = ref({}) // 表单数据 -const formRules = reactive({ - malfunction: [{ required: true, message: '故障描述不能为空', trigger: 'blur' }] -}) -const subjectOptions = ref([]) // 项目选项列表 - /** 查询列表 */ const getList = async () => { loading.value = true @@ -118,11 +104,41 @@ const getList = async () => { } } -/** 添加/修改操作 */ +/** 删除按钮操作 */ +const handleDelete = async (id: number) => { + try { + await message.delConfirm() + await DvRepairLineApi.deleteRepairLine(id) + message.success(t('common.delSuccess')) + await getList() + } catch {} +} + +// ==================== 添加/编辑表单 ==================== +const dialogVisible = ref(false) // 弹窗的是否展示 +const dialogTitle = ref('') // 弹窗的标题 +const formLoading = ref(false) // 表单的加载中 +const lineFormType = ref('') // 行表单的类型:create / update +const subjectOptions = ref([]) // 项目选项列表 +const formData = ref({}) // 表单数据 +const formRules = reactive({ + malfunction: [{ required: true, message: '故障描述不能为空', trigger: 'blur' }] +}) +const formRef = ref() // 表单 Ref + +/** 获取项目选项 */ +const getSubjectOptions = async (query: string) => { + try { + const data = await DvSubjectApi.getSubjectPage({ name: query, pageNo: 1, pageSize: 20 }) + subjectOptions.value = data.list + } catch {} +} + +/** 打开表单弹窗 */ const openForm = async (type: string, row?: any) => { - formVisible.value = true - formTitle.value = type === 'create' ? '添加明细' : '编辑明细' - formType.value = type + dialogVisible.value = true + dialogTitle.value = type === 'create' ? '添加明细' : '编辑明细' + lineFormType.value = type if (type === 'create') { formData.value = { repairId: props.repairId, @@ -144,42 +160,23 @@ const openForm = async (type: string, row?: any) => { /** 提交表单 */ const submitForm = async () => { - const valid = await formRef.value.validate() - if (!valid) return + await formRef.value.validate() formLoading.value = true try { - if (formType.value === 'create') { + if (lineFormType.value === 'create') { await DvRepairLineApi.createRepairLine(formData.value) message.success(t('common.createSuccess')) } else { await DvRepairLineApi.updateRepairLine(formData.value) message.success(t('common.updateSuccess')) } - formVisible.value = false + dialogVisible.value = false await getList() } finally { formLoading.value = false } } -/** 删除按钮操作 */ -const handleDelete = async (id: number) => { - try { - await message.delConfirm() - await DvRepairLineApi.deleteRepairLine(id) - message.success(t('common.delSuccess')) - await getList() - } catch {} -} - -/** 获取项目选项 */ -const getSubjectOptions = async (query: string) => { - try { - const data = await DvSubjectApi.getSubjectPage({ name: query, pageNo: 1, pageSize: 20 }) - subjectOptions.value = data.list - } catch {} -} - /** 监听工单编号变化 */ watch( () => props.repairId, diff --git a/src/views/mes/dv/repair/index.vue b/src/views/mes/dv/repair/index.vue index 283b535e0..982189ce8 100644 --- a/src/views/mes/dv/repair/index.vue +++ b/src/views/mes/dv/repair/index.vue @@ -129,7 +129,7 @@ - +