feat: 发起人自动审批通过功能

- 当发起人在审批人列表中时,提交时自动创建审批通过记录
- 根据节点类型判断是否完成:
  - 单人审批(approver):发起人审批后节点完成
  - 或签(or_approve):发起人审批后节点完成
  - 会签(and_approve):需要所有审批人审批才完成
- 节点完成后自动移动到下一节点或完成审批
- 更新 PROJECT_ISSUES.md 记录问题和解决方案

业务逻辑说明:
- 如果发起人选择自己作为唯一审批人,提交后申请直接完成
- 如果有其他审批人,需要其他审批人继续审批

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-26 09:44:44 +08:00
parent ba41b340fc
commit 8110b1e5e6
2 changed files with 124 additions and 0 deletions
+70
View File
@@ -441,6 +441,76 @@ navigate('/approval') // 改为跳转到审批列表
**相关文件**:`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,
]);
// 如果发起人在审批人列表中,自动标记为已审批
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']);
});
}