feat(ai): 建议状态生命周期 — 转换验证 + 执行端点 + 事件发布
Some checks failed
CI / rust-check (push) Has been cancelled
CI / rust-test (push) Has been cancelled
CI / frontend-build (push) Has been cancelled
CI / security-audit (push) Has been cancelled

建议(ai_suggestion)原有状态枚举完整但缺乏生命周期管理:
- 无转换验证(可从 Rejected 跳到 Approved)
- 无执行端点(护士无法标记"已执行")
- 无状态变更事件

变更:
1. SuggestionStatus.can_transition_to() — 仅允许合法单向转换
   Pending → Approved/Rejected/Expired → Approved → Executed/Rejected/Expired
2. SuggestionService.execute_suggestion() — 记录执行结果
3. SuggestionService.expire_stale_suggestions() — 批量过期超时建议
4. POST /ai/suggestions/{id}/execute — 新执行端点
5. publish_status_event() — 状态变更时发布 ai.suggestion.status_changed 事件
6. 9 个新单元测试覆盖所有转换规则
This commit is contained in:
iven
2026-05-04 13:39:48 +08:00
parent e78eb1af07
commit d68c7be098
4 changed files with 226 additions and 7 deletions

View File

@@ -67,6 +67,19 @@ impl SuggestionStatus {
Self::ParseFailed => "parse_failed",
}
}
/// 合法状态转换:仅允许相邻状态单向流转
pub fn can_transition_to(&self, target: SuggestionStatus) -> bool {
matches!(
(self, target),
(Self::Pending, Self::Approved)
| (Self::Pending, Self::Rejected)
| (Self::Pending, Self::Expired)
| (Self::Approved, Self::Executed)
| (Self::Approved, Self::Rejected)
| (Self::Approved, Self::Expired)
)
}
}
/// AI 输出的单条结构化建议