feat: 添加消息卡片更新功能,支持或签/单人审批场景

新增功能:
1. 创建 feishu_message 表,存储消息与审批订单/节点/用户的映射关系
2. 发送审批通知时保存 message_id
3. 审批完成后自动更新其他审批人的消息卡片

使用场景:
- 或签(or_approve):一人通过后,更新其他审批人的消息卡片
- 单人审批(approver):一人通过后,更新其他审批人的消息卡片
- 拒绝(reject):拒绝后更新所有其他审批人的消息卡片

技术细节:
- FeishuMessage 模型:管理消息映射
- FeishuNotificationService::updateMessageCards():更新消息卡片
- ApprovalService:审批完成后调用消息更新逻辑

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
root
2026-02-28 18:06:40 +08:00
parent aeff21aec6
commit 1f72da9ec4
6 changed files with 273 additions and 15 deletions
+34
View File
@@ -111,6 +111,22 @@ class ApprovalService
// 判断节点是否完成
if ($this->isNodeCompleted($order->id, $currentNode->id)) {
// 对于或签和单人审批,更新其他审批人的消息卡片
if ($currentNode->type === ApprovalNode::TYPE_OR_APPROVE || $currentNode->type === 'approver') {
$approver = User::find($approverId);
$approverName = $approver ? $approver->name : '未知';
if ($this->notificationService) {
$this->notificationService->updateMessageCards(
$order->id,
$currentNode->id,
$approverId,
'approved',
$approverName
);
}
}
// 移动到下一节点
$nextNodes = $this->getNextNodes($order->flow, $currentNode->order);
@@ -178,6 +194,20 @@ class ApprovalService
'comment' => $comment,
]);
// 更新其他审批人的消息卡片(拒绝时所有人都需要更新)
$approver = User::find($approverId);
$approverName = $approver ? $approver->name : '未知';
if ($this->notificationService && $currentNode) {
$this->notificationService->updateMessageCards(
$order->id,
$currentNode->id,
$approverId,
'rejected',
$approverName
);
}
// 更新状态为已拒绝
$order->status = ApprovalOrder::STATUS_REJECTED;
$order->current_nodes = [];
@@ -498,6 +528,9 @@ class ApprovalService
error_log("🔔 通知下一节点审批人: order_id={$order->id}, approverIds=" . json_encode($approverIds));
// 获取第一个下一节点的 ID(用于消息映射)
$nextNodeId = $nextNodes[0]['id'] ?? null;
// 为每个审批人发送通知
foreach ($approverIds as $approverId) {
try {
@@ -511,6 +544,7 @@ class ApprovalService
'content' => "**申请标题**: {$order->title}\n**申请人**: {$order->applicant->name}",
'url' => $detailUrl,
'order_id' => $order->id,
'node_id' => $nextNodeId, // 添加节点ID用于保存消息映射
]);
error_log("✅ 审批人通知成功: approver_id={$approverId}");
} catch (\Exception $e) {