fix: 修复单人审批完成后的流程流转逻辑

问题:
1. 审批完成后直接移动到下一节点,没有检查节点类型
2. 抄送节点应该跳过并完成流程,而不是进入抄送节点
3. 审批完成后的申请应该进入"审批完成"状态

修复:
- 检查节点完成条件:单人审批/或签一人通过即完成
- 检查下一节点类型:抄送节点则跳过并完成
- 没有后续节点则完成流程

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-26 17:39:59 +08:00
parent dc763d874a
commit 5095f556c8
+53 -4
View File
@@ -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();