diff --git a/backend/app/service/ApprovalService.php b/backend/app/service/ApprovalService.php index 756750b..e076b95 100644 --- a/backend/app/service/ApprovalService.php +++ b/backend/app/service/ApprovalService.php @@ -93,11 +93,20 @@ class ApprovalService $nextNodes = $this->getNextNodes($order->flow, $currentNode->order); if (empty($nextNodes)) { - // 审批完成 + // 没有下一节点,审批完成 $order->status = ApprovalOrder::STATUS_APPROVED; $order->current_nodes = []; } else { - $order->current_nodes = collect($nextNodes)->pluck('id')->toArray(); + // 检查第一个下一节点 + $firstNextNode = $nextNodes[0] ?? null; + if ($firstNextNode && $firstNextNode['type'] === 'notify') { + // 下一个是抄送节点,跳过并完成流程 + $order->status = ApprovalOrder::STATUS_APPROVED; + $order->current_nodes = []; + } else { + // 下一个是审批节点,移动到该节点 + $order->current_nodes = collect($nextNodes)->pluck('id')->toArray(); + } } $order->save(); @@ -294,11 +303,21 @@ class ApprovalService ->where('action', 'approve') ->get(); - $approvers = $node->approvers ?? []; + // 从 form_data 获取审批人列表 + $order = ApprovalOrder::find($orderId); + $formData = $order->form_data ?? []; + $approvers = $formData['approvers'] ?? []; + + // 兼容两种格式:[{id:1, name:'...'}] 或 [1] + if (!empty($approvers) && is_array($approvers[0] ?? null) && isset($approvers[0]['id'])) { + $approverIds = array_column($approvers, 'id'); + } else { + $approverIds = $approvers; + } if ($node->type === ApprovalNode::TYPE_AND_APPROVE) { // 会签:需要所有人通过 - return count($records) >= count($approvers); + return count($records) >= count($approverIds); } elseif ($node->type === ApprovalNode::TYPE_OR_APPROVE) { // 或签:任一人通过即可 return count($records) >= 1; @@ -332,21 +351,29 @@ class ApprovalService $result = []; foreach ($pendingOrders as $order) { - $currentNodeIds = $order->current_nodes ?? []; - $nodes = ApprovalNode::whereIn('id', $currentNodeIds)->get(); + // 从 form_data 获取审批人列表 + $formData = $order->form_data ?? []; + $approvers = $formData['approvers'] ?? []; - foreach ($nodes as $node) { - $approvers = $node->approvers ?? []; - if (in_array($userId, $approvers)) { + // 兼容两种格式:[{id:1, name:'...'}] 或 [1] + if (!empty($approvers)) { + if (is_array($approvers[0] ?? null) && isset($approvers[0]['id'])) { + // 对象数组格式: [{id:1, name:'...'}] + $approverIds = array_column($approvers, 'id'); + } else { + // ID数组格式: [1, 2, 3] + $approverIds = $approvers; + } + + if (in_array($userId, $approverIds)) { // 检查是否已审批 $hasApproved = ApprovalRecord::where('order_id', $order->id) - ->where('node_id', $node->id) ->where('approver_id', $userId) + ->whereIn('action', [ApprovalRecord::ACTION_APPROVE, ApprovalRecord::ACTION_REJECT]) ->exists(); if (!$hasApproved) { $result[] = $order->id; - break; } } }