feat: 发起人自动审批通过功能
- 当发起人在审批人列表中时,提交时自动创建审批通过记录 - 根据节点类型判断是否完成: - 单人审批(approver):发起人审批后节点完成 - 或签(or_approve):发起人审批后节点完成 - 会签(and_approve):需要所有审批人审批才完成 - 节点完成后自动移动到下一节点或完成审批 - 更新 PROJECT_ISSUES.md 记录问题和解决方案 业务逻辑说明: - 如果发起人选择自己作为唯一审批人,提交后申请直接完成 - 如果有其他审批人,需要其他审批人继续审批 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -441,6 +441,76 @@ navigate('/approval') // 改为跳转到审批列表
|
|||||||
|
|
||||||
**相关文件**:`frontend/src/pages/business-trip/apply.tsx`
|
**相关文件**:`frontend/src/pages/business-trip/apply.tsx`
|
||||||
|
|
||||||
|
### 23. 发起人自动审批通过逻辑
|
||||||
|
|
||||||
|
**需求**:当发起人选择的审批人中包含自己时,提交时自动标记为已审批
|
||||||
|
|
||||||
|
**实现逻辑**:
|
||||||
|
1. 检查发起人是否在审批人列表中
|
||||||
|
2. 如果是,自动创建审批通过记录
|
||||||
|
3. 根据节点类型判断是否完成:
|
||||||
|
- 单人审批(approver):发起人审批后节点完成
|
||||||
|
- 或签(or_approve):发起人审批后节点完成
|
||||||
|
- 会签(and_approve):需要所有审批人审批才完成
|
||||||
|
4. 节点完成后移动到下一节点或完成审批
|
||||||
|
|
||||||
|
**解决方案**:
|
||||||
|
```php
|
||||||
|
// 如果发起人在审批人列表中,自动标记为已审批
|
||||||
|
if (in_array($userId, $approverIds)) {
|
||||||
|
ApprovalRecord::create([
|
||||||
|
'order_id' => $approvalOrder->id,
|
||||||
|
'node_id' => $node->id,
|
||||||
|
'node_type' => $node->type,
|
||||||
|
'approver_id' => $userId,
|
||||||
|
'action' => 'approve',
|
||||||
|
'comment' => '发起人自动审批通过',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 判断节点是否完成
|
||||||
|
$nodeCompleted = false;
|
||||||
|
|
||||||
|
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', $node->id)
|
||||||
|
->where('action', 'approve')
|
||||||
|
->count();
|
||||||
|
|
||||||
|
if ($approvedCount >= count($approverIds)) {
|
||||||
|
$nodeCompleted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果节点完成,移动到下一节点
|
||||||
|
if ($nodeCompleted) {
|
||||||
|
$nextNodes = ApprovalNode::where('flow_id', $flow->id)
|
||||||
|
->where('order', '>', 0)
|
||||||
|
->orderBy('order')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
if ($nextNodes->isEmpty()) {
|
||||||
|
// 审批完成
|
||||||
|
$approvalOrder->status = ApprovalOrder::STATUS_APPROVED;
|
||||||
|
$approvalOrder->current_nodes = [];
|
||||||
|
} else {
|
||||||
|
// 移动到下一节点
|
||||||
|
$approvalOrder->current_nodes = $nextNodes->pluck('id')->toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
$approvalOrder->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**相关文件**:`backend/app/service/BusinessTripService.php`
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 文件修改记录
|
## 文件修改记录
|
||||||
|
|||||||
@@ -215,6 +215,60 @@ class BusinessTripService
|
|||||||
'comment' => null,
|
'comment' => null,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
// 如果发起人在审批人列表中,自动标记为已审批
|
||||||
|
if (in_array($userId, $approverIds)) {
|
||||||
|
ApprovalRecord::create([
|
||||||
|
'order_id' => $approvalOrder->id,
|
||||||
|
'node_id' => $node->id,
|
||||||
|
'node_type' => $node->type,
|
||||||
|
'approver_id' => $userId,
|
||||||
|
'action' => 'approve',
|
||||||
|
'comment' => '发起人自动审批通过',
|
||||||
|
]);
|
||||||
|
|
||||||
|
// 判断节点是否完成
|
||||||
|
$nodeCompleted = false;
|
||||||
|
|
||||||
|
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', $node->id)
|
||||||
|
->where('action', 'approve')
|
||||||
|
->count();
|
||||||
|
|
||||||
|
if ($approvedCount >= count($approverIds)) {
|
||||||
|
$nodeCompleted = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果节点完成,移动到下一节点
|
||||||
|
if ($nodeCompleted) {
|
||||||
|
$nextNodes = ApprovalNode::where('flow_id', $flow->id)
|
||||||
|
->where('order', '>', 0)
|
||||||
|
->orderBy('order')
|
||||||
|
->get();
|
||||||
|
|
||||||
|
if ($nextNodes->isEmpty()) {
|
||||||
|
// 没有后续节点,审批完成
|
||||||
|
$approvalOrder->status = ApprovalOrder::STATUS_APPROVED;
|
||||||
|
$approvalOrder->current_nodes = [];
|
||||||
|
$businessTrip->status = BusinessTrip::STATUS_APPROVED;
|
||||||
|
} else {
|
||||||
|
// 移动到下一节点
|
||||||
|
$approvalOrder->current_nodes = $nextNodes->pluck('id')->toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
$approvalOrder->save();
|
||||||
|
$businessTrip->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return $businessTrip->fresh(['itineraries', 'approvalOrder']);
|
return $businessTrip->fresh(['itineraries', 'approvalOrder']);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user