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:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user