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`
|
||||
|
||||
### 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']);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user