task_plan/include/app.hpp

140 lines
5.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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