fix: 修复 ApprovalService 使用 form_data.approvers

问题:ApprovalService 还在使用 approval_node.approvers 字段
解决:改用 form_data.approvers 作为运行时审批人数据

修改内容:
1. approve() - 添加跳过 notify 节点逻辑
2. isNodeCompleted() - 从 form_data 获取审批人
3. getPendingOrderIds() - 从 form_data 获取审批人

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-26 18:42:30 +08:00
parent 8ce070bd77
commit e904d5cd97
+38 -11
View File
@@ -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;
}
}
}