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);
|
$nextNodes = $this->getNextNodes($order->flow, $currentNode->order);
|
||||||
|
|
||||||
if (empty($nextNodes)) {
|
if (empty($nextNodes)) {
|
||||||
// 审批完成
|
// 没有下一节点,审批完成
|
||||||
$order->status = ApprovalOrder::STATUS_APPROVED;
|
$order->status = ApprovalOrder::STATUS_APPROVED;
|
||||||
$order->current_nodes = [];
|
$order->current_nodes = [];
|
||||||
} else {
|
} 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();
|
$order->save();
|
||||||
@@ -294,11 +303,21 @@ class ApprovalService
|
|||||||
->where('action', 'approve')
|
->where('action', 'approve')
|
||||||
->get();
|
->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) {
|
if ($node->type === ApprovalNode::TYPE_AND_APPROVE) {
|
||||||
// 会签:需要所有人通过
|
// 会签:需要所有人通过
|
||||||
return count($records) >= count($approvers);
|
return count($records) >= count($approverIds);
|
||||||
} elseif ($node->type === ApprovalNode::TYPE_OR_APPROVE) {
|
} elseif ($node->type === ApprovalNode::TYPE_OR_APPROVE) {
|
||||||
// 或签:任一人通过即可
|
// 或签:任一人通过即可
|
||||||
return count($records) >= 1;
|
return count($records) >= 1;
|
||||||
@@ -332,21 +351,29 @@ class ApprovalService
|
|||||||
|
|
||||||
$result = [];
|
$result = [];
|
||||||
foreach ($pendingOrders as $order) {
|
foreach ($pendingOrders as $order) {
|
||||||
$currentNodeIds = $order->current_nodes ?? [];
|
// 从 form_data 获取审批人列表
|
||||||
$nodes = ApprovalNode::whereIn('id', $currentNodeIds)->get();
|
$formData = $order->form_data ?? [];
|
||||||
|
$approvers = $formData['approvers'] ?? [];
|
||||||
|
|
||||||
foreach ($nodes as $node) {
|
// 兼容两种格式:[{id:1, name:'...'}] 或 [1]
|
||||||
$approvers = $node->approvers ?? [];
|
if (!empty($approvers)) {
|
||||||
if (in_array($userId, $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)
|
$hasApproved = ApprovalRecord::where('order_id', $order->id)
|
||||||
->where('node_id', $node->id)
|
|
||||||
->where('approver_id', $userId)
|
->where('approver_id', $userId)
|
||||||
|
->whereIn('action', [ApprovalRecord::ACTION_APPROVE, ApprovalRecord::ACTION_REJECT])
|
||||||
->exists();
|
->exists();
|
||||||
|
|
||||||
if (!$hasApproved) {
|
if (!$hasApproved) {
|
||||||
$result[] = $order->id;
|
$result[] = $order->id;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user