From a7ae94db56689bb9616a7fd8e018ae6b5dfa6b03 Mon Sep 17 00:00:00 2001 From: zangchenhao Date: Thu, 3 Jul 2025 21:38:35 +0800 Subject: [PATCH] =?UTF-8?q?feat(dms):=20=E4=BC=98=E5=8C=96=E6=95=85?= =?UTF-8?q?=E9=9A=9C=E5=AE=9E=E4=BE=8B=E6=B4=BB=E5=8A=A8=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增审批记录组件,支持查看流程图和审批信息 - 重构表单验证逻辑,提高用户体验 -优化工作流变量处理,简化审批流程 - 调整表单字段初始化,确保数据准确性 --- .../approvalRecord.vue | 280 ++++++++++++++++++ .../dms/dmsFaultInstanceActivity/index.vue | 215 +++++++------- .../dmsFaultInstanceActivity/submitVerify.vue | 2 +- 3 files changed, 387 insertions(+), 110 deletions(-) diff --git a/src/views/dms/dmsFaultInstanceActivity/approvalRecord.vue b/src/views/dms/dmsFaultInstanceActivity/approvalRecord.vue index e69de29..84fbfb1 100644 --- a/src/views/dms/dmsFaultInstanceActivity/approvalRecord.vue +++ b/src/views/dms/dmsFaultInstanceActivity/approvalRecord.vue @@ -0,0 +1,280 @@ + + + diff --git a/src/views/dms/dmsFaultInstanceActivity/index.vue b/src/views/dms/dmsFaultInstanceActivity/index.vue index 2f3b903..959a886 100644 --- a/src/views/dms/dmsFaultInstanceActivity/index.vue +++ b/src/views/dms/dmsFaultInstanceActivity/index.vue @@ -52,7 +52,7 @@ - + @@ -62,24 +62,24 @@ - + - + - + - + @@ -333,9 +333,9 @@ const form = reactive({ ...initFormData }); // 表单验证规则 const rules = reactive({ - faultType: [{ required: true, message: '故障类型不能为空', trigger: 'change' }], - faultDescription: [{ required: true, message: '故障描述不能为空', trigger: 'blur' }], - repairType: [{ required: true, message: '维修类型不能为空', trigger: 'change' }], + faultType: [{ required: false, message: '故障类型不能为空', trigger: 'change' }], + faultDescription: [{ required: false, message: '故障描述不能为空', trigger: 'blur' }], + repairType: [{ required: false, message: '维修类型不能为空', trigger: 'change' }], outsourcingId: [{ required: false, message: '外协单位不能为空', trigger: 'change' }], repairer: [{ required: false, message: '维修人不能为空', trigger: 'blur' }], checkedFault: [{ required: false, message: '检查后的故障判断不能为空', trigger: 'blur' }], @@ -377,14 +377,14 @@ const confirmButtonShow = computed(() => { // 2. 或者工单状态为维修完成(2)且确认状态为待确认(0) // 3. 且审批状态为审批成功(2) - 只有审批通过的工单才能进行确认 return routeParams.value.type === 'confirm' || - (workOrder.value.billsStatus === '2' && - workOrder.value.repairConfirm === '0' && - workOrder.value.approveStatus === '2'); + (workOrder.value?.billsStatus === '2' && + workOrder.value?.repairConfirm === '0' && + workOrder.value?.approveStatus === '2'); }); // 是否为审批阶段 const isApprovalStage = computed(() => { - return routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1'; + return routeParams.value.type === 'approval' && workOrder.value?.approveStatus === '1'; }); // 提交按钮显示控制逻辑 @@ -392,7 +392,7 @@ const submitButtonShow = computed(() => { return ( routeParams.value.type === 'add' || (routeParams.value.type === 'update' && - workOrder.value.billsStatus && + workOrder.value?.billsStatus && (workOrder.value.billsStatus === 'draft' || workOrder.value.billsStatus === 'cancel' || workOrder.value.billsStatus === 'back')) ); }); @@ -417,13 +417,8 @@ onMounted(async () => { // 初始化表单数据 initializeFormData(); - // 设置审批阶段的表单验证规则 - if (routeParams.value.type === 'approval' && workOrder.value.approveStatus === '1') { - rules.approveStatus = [{ required: true, message: '审批状态不能为空', trigger: 'change' }]; - } - - // 设置外协单位验证规则 - updateOutsourcingValidation(); + // 动态设置表单验证规则 + setDynamicValidationRules(); } catch (error) { console.error('初始化失败:', error); @@ -453,10 +448,10 @@ const loadWorkOrderInfo = async () => { } const res = await getDmsBillsFaultInstance(businessId); - workOrder.value = res.data; + workOrder.value = res.data || {}; // 确保不为null - // 设置状态显示文本 - workOrderStatusText.value = getStatusText(workOrder.value.billsStatus); + // 设置状态显示文本 - 添加安全检查 + workOrderStatusText.value = getStatusText(workOrder.value.billsStatus || ''); }; // 加载当前任务信息 @@ -501,29 +496,25 @@ const loadCurrentTask = async () => { // 初始化表单数据 const initializeFormData = () => { // 基础信息从工单获取 - form.repairInstanceId = workOrder.value.repairInstanceId; + form.repairInstanceId = workOrder.value?.repairInstanceId; form.processStepOrder = currentStepOrder.value; - if (currentStepOrder.value === 1) { - // 第一步:故障报修,表单为空等待用户填写 - form.faultType = workOrder.value.faultType; - form.faultDescription = workOrder.value.faultDescription; - form.designOperations = workOrder.value.designOperations; - form.repairType = workOrder.value.repairType; - form.outsourcingId = workOrder.value.outsourcingId; - } else { - // 第二步、第三步:从工单基础信息预填充 - form.faultType = workOrder.value.faultType; - form.faultDescription = workOrder.value.faultDescription; - form.designOperations = workOrder.value.designOperations; - form.repairType = workOrder.value.repairType; - form.outsourcingId = workOrder.value.outsourcingId; - form.checkedFault = workOrder.value.checkedFault; - form.repairContent = workOrder.value.repairContent; - form.protectedMethod = workOrder.value.protectedMethod; - form.repairer = workOrder.value.repairer; - form.repairConfirm = workOrder.value.repairConfirm; - form.componentsPartsId = workOrder.value.componentsPartsId; + // 处理所有字段,确保没有undefined值 + form.faultType = workOrder.value?.faultType || ''; + form.faultDescription = workOrder.value?.faultDescription || ''; + form.designOperations = workOrder.value?.designOperations || ''; + form.repairType = workOrder.value?.repairType || ''; + form.outsourcingId = workOrder.value?.outsourcingId || ''; + form.checkedFault = workOrder.value?.checkedFault || ''; + form.repairContent = workOrder.value?.repairContent || ''; + form.protectedMethod = workOrder.value?.protectedMethod || ''; + form.repairer = workOrder.value?.repairer || ''; + form.repairConfirm = workOrder.value?.repairConfirm || ''; + form.componentsPartsId = workOrder.value?.componentsPartsId || ''; + + // 如果是审批阶段,设置默认审批状态 + if (routeParams.value.type === 'approval' && !form.approveStatus) { + form.approveStatus = undefined; // 保持未选择状态,让用户必须选择 } }; @@ -605,76 +596,36 @@ const approvalVerifyOpen = async () => { try { const valid = await processFormRef.value.validate(); if (valid) { - // 检查审批状态 - if (routeParams.value.type === 'approval' && !form.approveStatus) { - proxy?.$modal.msgError('请选择审批状态'); - return; - } + await proxy?.$modal.confirm('是否确认提交审批?'); + + buttonLoading.value = true; + + // 直接调用后端审批接口,后端会在同一事务中处理业务状态更新和工作流推进 + const approveStatus = form.approveStatus; + const message = form.processHandleResolution || ''; - // 准备工作流变量 - 符合Warm-Flow和submitVerify组件的期望格式 - taskVariables.value = { - // 工作流变量 - 用于互斥网关条件判断 - variables: {}, - // 业务实体数据 - entity: { - repairInstanceId: form.repairInstanceId, - faultType: form.faultType, - faultDescription: form.faultDescription, - designOperations: form.designOperations, - repairType: form.repairType, - outsourcingId: form.outsourcingId, - checkedFault: form.checkedFault || '', - repairContent: form.repairContent || '', - protectedMethod: form.protectedMethod || '', - repairer: form.repairer || '', - repairConfirm: form.repairConfirm, - componentsPartsId: form.componentsPartsId, - processHandleResolution: form.processHandleResolution || '', - processStepOrder: form.processStepOrder - } - }; - - // 如果是审批阶段,设置跳转条件变量 - if (routeParams.value.type === 'approval' && form.approveStatus) { - // 将approveStatus转换为数字放在variables中,供Warm-Flow互斥网关使用 - taskVariables.value.variables.approveStatus = parseInt(form.approveStatus); - // 同时在根级别设置字符串格式,兼容submitVerify组件 - taskVariables.value.approveStatus = form.approveStatus; - console.log('设置审批状态变量:', parseInt(form.approveStatus)); - } - - // 如果是确认阶段,设置确认结果变量 - if (routeParams.value.type === 'confirm' && form.repairConfirm) { - // 确认通过传0,确认不通过传1 - const repairConfirmValue = form.repairConfirm === '1' ? 0 : 1; - taskVariables.value.variables.repairConfirm = repairConfirmValue; - taskVariables.value.repairConfirm = repairConfirmValue.toString(); - console.log('设置确认结果变量:', repairConfirmValue); - } - - console.log('完整的工作流变量:', taskVariables.value); - - // 直接使用传入的taskId进行审批 - submitVerifyRef.value?.openDialog(routeParams.value.taskId); + await approveWorkOrder(form.repairInstanceId, approveStatus, message); + + const statusText = approveStatus === '2' ? '通过' : '拒绝'; + proxy?.$modal.msgSuccess(`审批${statusText}成功`); + + // 关闭页面返回 + goBack(); } - } catch (error) { - proxy?.$modal.msgError('表单验证失败,请检查输入项'); + } catch (error: any) { + if (error !== 'cancel' && error !== 'close') { + console.error('审批失败:', error); + proxy?.$modal.msgError('审批失败:' + (error.message || '未知错误')); + } + } finally { + buttonLoading.value = false; } }; // 提交回调 const submitCallback = async (approvalResult?: any) => { try { - // 如果是审批类型,调用审批接口 - if (routeParams.value.type === 'approval') { - // 使用用户选择的审批状态 - const approveStatus = form.approveStatus; // 直接使用表单中选择的审批状态 - const message = approvalResult?.message || form.processHandleResolution || ''; - - await approveWorkOrder(form.repairInstanceId, approveStatus, message); - const statusText = approveStatus === '2' ? '通过' : '拒绝'; - proxy?.$modal.msgSuccess(`审批${statusText}成功`); - } else if (routeParams.value.type === 'confirm') { + if (routeParams.value.type === 'confirm') { // 主管确认逻辑 const confirmResult = form.repairConfirm || '1'; // 默认确认通过 await confirmRepairResult(form.repairInstanceId, confirmResult); @@ -749,15 +700,61 @@ const getOutsourceList = async () => { // 更新外协单位验证规则 const updateOutsourcingValidation = () => { - if (form.repairType === '2') { - // 维修类型为外协时,外协单位为必填 + // 只有在非审批阶段且维修类型为外协时才设置为必填 + if (routeParams.value.type !== 'approval' && form.repairType === '2') { rules.outsourcingId = [{ required: true, message: '外协单位不能为空', trigger: 'change' }]; } else { - // 其他情况下,外协单位不是必填 rules.outsourcingId = [{ required: false, message: '外协单位不能为空', trigger: 'change' }]; } }; +// 动态设置表单验证规则 +const setDynamicValidationRules = () => { + // 重置所有规则为非必填 + Object.keys(rules).forEach(key => { + rules[key] = [{ required: false, message: rules[key][0].message, trigger: rules[key][0].trigger }]; + }); + + // 根据页面类型和步骤设置验证规则 + if (routeParams.value.type === 'approval') { + // 审批阶段只需要审批状态和处理意见 + rules.approveStatus = [{ required: true, message: '审批状态不能为空', trigger: 'change' }]; + if (needProcessResolution.value) { + rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }]; + } + } else if (routeParams.value.type === 'confirm') { + // 确认阶段只需要确认结果和处理意见 + rules.repairConfirm = [{ required: true, message: '维修结果不能为空', trigger: 'change' }]; + rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }]; + } else { + // 新增或编辑模式,根据当前步骤设置验证规则 + if (currentStepOrder.value === 1) { + // 第一步:故障报修 + rules.faultType = [{ required: true, message: '故障类型不能为空', trigger: 'change' }]; + rules.faultDescription = [{ required: true, message: '故障描述不能为空', trigger: 'blur' }]; + rules.repairType = [{ required: true, message: '维修类型不能为空', trigger: 'change' }]; + } else if (currentStepOrder.value === 2) { + // 第二步:维修处理 + rules.repairer = [{ required: true, message: '维修人不能为空', trigger: 'blur' }]; + rules.checkedFault = [{ required: true, message: '检查后的故障判断不能为空', trigger: 'blur' }]; + rules.protectedMethod = [{ required: true, message: '维修措施不能为空', trigger: 'blur' }]; + rules.repairContent = [{ required: true, message: '维修内容不能为空', trigger: 'blur' }]; + if (needProcessResolution.value) { + rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }]; + } + } else if (currentStepOrder.value === 3) { + // 第三步:维修确认 + rules.repairConfirm = [{ required: true, message: '维修结果不能为空', trigger: 'change' }]; + if (needProcessResolution.value) { + rules.processHandleResolution = [{ required: true, message: '处理意见不能为空', trigger: 'blur' }]; + } + } + } + + // 更新外协单位验证规则 + updateOutsourcingValidation(); +}; + // 工具函数 const getStatusText = (status: string) => { const statusMap = { diff --git a/src/views/dms/dmsFaultInstanceActivity/submitVerify.vue b/src/views/dms/dmsFaultInstanceActivity/submitVerify.vue index ef85cf2..f6d41ad 100644 --- a/src/views/dms/dmsFaultInstanceActivity/submitVerify.vue +++ b/src/views/dms/dmsFaultInstanceActivity/submitVerify.vue @@ -305,7 +305,7 @@ form.value.flowCopyList = flowCopyList; } - // 【关键修复】处理故障报修工单的工作流变量传递 + // 处理工作流变量传递 if (props.taskVariables && typeof props.taskVariables === 'object') { const taskVars = props.taskVariables as any;