From 5095f556c8bdc7cb2c0aa7e53f1bd818f43e808b Mon Sep 17 00:00:00 2001 From: root Date: Thu, 26 Feb 2026 17:39:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=8D=95=E4=BA=BA?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E5=AE=8C=E6=88=90=E5=90=8E=E7=9A=84=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E6=B5=81=E8=BD=AC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: 1. 审批完成后直接移动到下一节点,没有检查节点类型 2. 抄送节点应该跳过并完成流程,而不是进入抄送节点 3. 审批完成后的申请应该进入"审批完成"状态 修复: - 检查节点完成条件:单人审批/或签一人通过即完成 - 检查下一节点类型:抄送节点则跳过并完成 - 没有后续节点则完成流程 Co-Authored-By: Claude Opus 4.6 --- backend/app/service/BusinessTripService.php | 57 +++++++++++++++++++-- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/backend/app/service/BusinessTripService.php b/backend/app/service/BusinessTripService.php index 1525ea0..90add53 100644 --- a/backend/app/service/BusinessTripService.php +++ b/backend/app/service/BusinessTripService.php @@ -725,10 +725,59 @@ class BusinessTripService $approvalOrder->current_nodes = []; $businessTrip->status = BusinessTrip::STATUS_REJECTED; } else { - // 同意:检查是否还有后续节点(简化版:直接通过) - $approvalOrder->status = ApprovalOrder::STATUS_APPROVED; - $approvalOrder->current_nodes = []; - $businessTrip->status = BusinessTrip::STATUS_APPROVED; + // 同意:检查当前节点是否完成,并处理流程流转 + $currentNodeId = $currentNodes[0] ?? null; + $nodeCompleted = false; + + if ($currentNodeId) { + $node = ApprovalNode::find($currentNodeId); + if ($node) { + // 根据节点类型判断是否完成 + if ($node->type === 'approver') { + // 单人审批:一人通过即完成 + $nodeCompleted = true; + } elseif ($node->type === 'or_approve') { + // 或签:一人通过即完成 + $nodeCompleted = true; + } elseif ($node->type === 'and_approve') { + // 会签:需要所有人都通过 + $approvedCount = ApprovalRecord::where('order_id', $approvalOrder->id) + ->where('node_id', $currentNodeId) + ->where('action', 'approve') + ->count(); + $allApprovers = $node->approvers ?? []; + if ($approvedCount >= count($allApprovers)) { + $nodeCompleted = true; + } + } + } + } + + if ($nodeCompleted) { + // 当前节点完成,查找下一个节点 + $nextNode = ApprovalNode::where('flow_id', $approvalOrder->flow_id) + ->where('order', '>', 0) + ->orderBy('order') + ->first(); + + if ($nextNode) { + // 有下一个节点 + if ($nextNode->type === 'notify') { + // 下一个是抄送节点,跳过并完成流程 + $approvalOrder->status = ApprovalOrder::STATUS_APPROVED; + $approvalOrder->current_nodes = []; + $businessTrip->status = BusinessTrip::STATUS_APPROVED; + } else { + // 下一个是审批节点,移动到该节点 + $approvalOrder->current_nodes = [$nextNode->id]; + } + } else { + // 没有下一个节点,流程完成 + $approvalOrder->status = ApprovalOrder::STATUS_APPROVED; + $approvalOrder->current_nodes = []; + $businessTrip->status = BusinessTrip::STATUS_APPROVED; + } + } } $approvalOrder->save();