task_plan/include/app.hpp

140 lines
5.3 KiB
C++
Raw Permalink Normal View History

2026-05-20 08:00:11 +00:00
#ifndef ETMS_APP_HPP
#define ETMS_APP_HPP
#include <string>
#include <vector>
#include <cstdint>
#include <ctime>
#include <map>
namespace etms {
/// @brief 事件状态枚举,对应需求文档中 t_event.status 的状态流转。
enum class EventStatus {
Received, ///< 刚接收,待处理
Processed, ///< 已处理
PendingTask, ///< 待映射任务
Rejected, ///< 已拒绝
TaskGenerated ///< 任务已生成
};
/// @brief 将 EventStatus 转换为可读字符串。
/// @param status 事件状态枚举值
/// @return 状态字符串,例如 "Received"
const char* EventStatusToString(EventStatus status) noexcept;
/// @brief 事件结构体,对应数据库 t_event 表。
struct Event {
int64_t id{}; ///< 自增主键
std::string event_id; ///< 全局唯一标识
std::string event_type; ///< 事件类型:侦察、打击、预警等
std::time_t timestamp{}; ///< 事件发生时间Unix 秒)
int level{}; ///< 事件等级(紧急程度)
double longitude{}; ///< 经度
double latitude{}; ///< 纬度
std::string description; ///< 事件描述文本
EventStatus status{EventStatus::Received}; ///< 当前状态
std::time_t create_time{}; ///< 记录入库时间
};
/// @brief 任务模板结构体,对应数据库 t_task_template 表。
struct TaskTemplate {
std::string template_id; ///< 模板唯一标识
std::string name; ///< 显示名称
std::string version; ///< 关联知识库版本号
std::string content_path; ///< MinIO 中模板文件存储路径
std::string applicable_type;///< 可匹配的事件类型
std::time_t create_time{}; ///< 模板导入时间
};
/// @brief 知识库版本结构体,对应数据库 t_kb_version 表。
struct KbVersion {
std::string version_id; ///< 版本 ID如 KB-V1.0
std::string version_name; ///< 友好显示名
std::time_t release_time{}; ///< 版本发布时间
std::string status; ///< "Active" 或 "Deprecated"
};
/// @brief 事件接收的结果,包含 ACK 信息。
struct EventAck {
bool accepted{false}; ///< 是否接受
std::string event_id; ///< 对应事件 ID
std::string message; ///< 提示消息
};
/// @brief 任务生成请求报文结构。
struct TaskGenerationRequest {
std::string request_id; ///< 请求唯一标识
std::string event_id; ///< 引用的事件 ID
std::string template_id; ///< 选定的模板 ID
std::string kb_version_id; ///< 知识库版本 ID
std::map<std::string, std::string> params; ///< 初始参数键值对
std::time_t request_time{}; ///< 请求生成时间
};
// ========================
// 公开 API 函数声明
// ========================
/// @brief 校验并解析原始 JSON 事件数据(模拟器),返回 ACK。
/// @param raw_json 原始 JSON 字符串(最大 4KB
/// @return EventAck 结构体,包含接受状态与 event_id
EventAck ReceiveRawEvent(const std::string& raw_json);
/// @brief 清洗并分类打标一个事件,将其状态置为 Processed。
/// @param evt 事件引用(会被修改)
/// @return true 如果处理成功
bool ProcessEvent(Event& evt);
/// @brief 查询所有已接收事件(模拟数据库查询)。
/// @return 事件列表(按创建时间倒序)
std::vector<Event> QueryAllEvents();
/// @brief 根据事件等级筛选紧迫事件level >= 8 视为紧迫)。
/// @param events 事件列表
/// @return 紧迫事件列表
std::vector<Event> FilterUrgentEvents(const std::vector<Event>& events);
/// @brief 根据事件特征推荐匹配的模板(自主执行模式模拟)。
/// @param evt 事件
/// @param templates 可用模板列表
/// @return 推荐模板的 ID若无匹配返回空字符串
std::string RecommendTemplate(const Event& evt, const std::vector<TaskTemplate>& templates);
/// @brief 组装任务生成请求报文。
/// @param event_id 事件 ID
/// @param template_id 模板 ID
/// @param kb_ver 知识库版本 ID
/// @param params 初始参数
/// @return 组装好的 TaskGenerationRequest
TaskGenerationRequest BuildTaskRequest(
const std::string& event_id,
const std::string& template_id,
const std::string& kb_ver,
const std::map<std::string, std::string>& params);
/// @brief 获取可用知识库版本列表(模拟)。
/// @return 知识库版本列表
std::vector<KbVersion> GetAvailableKbVersions();
/// @brief 获取可用任务模板列表(模拟)。
/// @return 任务模板列表
std::vector<TaskTemplate> GetAvailableTemplates();
/// @brief 将事件状态推进到下一个状态(状态机模拟)。
/// @param evt 事件引用(会被修改)
/// @return true 如果状态转换合法
bool AdvanceEventStatus(Event& evt);
/// @brief 模拟事件排序(按等级降序)。
/// @param events 事件列表(会被排序)
void SortEventsByLevelDesc(std::vector<Event>& events);
/// @brief 模拟事件排序(按时间升序)。
/// @param events 事件列表(会被排序)
void SortEventsByTimeAsc(std::vector<Event>& events);
} // namespace etms
#endif // ETMS_APP_HPP