#ifndef ETMS_APP_HPP #define ETMS_APP_HPP #include #include #include #include #include namespace etms { // ──────────────────────────────────────────────────────────────────────────── // Enums // ──────────────────────────────────────────────────────────────────────────── /// @brief 事件等级枚举 enum class EventLevel : uint8_t { Info = 0, ///< 普通信息 Warning = 1, ///< 警告 Serious = 2, ///< 严重 Critical = 3 ///< 危急 }; /// @brief 事件状态枚举 enum class EventStatus : uint8_t { Received = 0, ///< 已接收 Processed = 1, ///< 已处理 PendingTask = 2, ///< 待生成任务 Rejected = 3, ///< 已拒绝 TaskGenerated = 4 ///< 任务已生成 }; /// @brief 知识库版本状态 enum class KBVersionStatus : uint8_t { Disabled = 0, ///< 禁用 Enabled = 1 ///< 启用 }; /// @brief 工作模式 enum class WorkMode : uint8_t { Manual = 0, ///< 人机协同模式(手动选择) Automatic = 1 ///< 自主推荐模式(自动推荐) }; // ──────────────────────────────────────────────────────────────────────────── // Data Models // ──────────────────────────────────────────────────────────────────────────── /** * @brief 战场事件数据模型 * * 对应数据库 t_event 表,记录从消息队列接收的原始事件及其处理状态。 */ struct Event { std::string id; ///< 主键ID std::string eventId; ///< 事件唯一标识 std::string eventType; ///< 事件类型 int64_t timestamp; ///< 事件发生时间戳(Unix毫秒) EventLevel level; ///< 事件等级 double longitude; ///< 经度 double latitude; ///< 纬度 std::string description; ///< 事件描述 EventStatus status; ///< 事件状态 std::chrono::system_clock::time_point createTime; ///< 记录创建时间 /** @brief 默认构造函数 */ Event() : timestamp(0), level(EventLevel::Info), longitude(0.0), latitude(0.0), status(EventStatus::Received) {} }; /** * @brief 任务模板数据模型 * * 对应数据库 t_task_template 表,描述上级推送的任务模板定义。 */ struct TaskTemplate { std::string id; ///< 模板ID std::string name; ///< 模板名称 std::string type; ///< 模板类型 std::string paramConfig; ///< 参数配置(JSON字符串) std::vector subTaskIds; ///< 子任务ID列表(树状结构) std::string version; ///< 版本号 std::string createTime; ///< 创建时间(ISO8601字符串) /** @brief 默认构造函数 */ TaskTemplate() = default; }; /** * @brief 知识库版本数据模型 * * 对应数据库 t_kb_version 表,记录可用于模板生成的先验知识库版本。 */ struct KBVersion { std::string id; ///< 版本ID std::string description; ///< 版本描述 int64_t effectiveTime; ///< 生效时间(Unix毫秒) KBVersionStatus status; ///< 版本状态 std::string creator; ///< 创建人 /** @brief 默认构造函数 */ KBVersion() : effectiveTime(0), status(KBVersionStatus::Disabled) {} }; /** * @brief 任务生成请求报文 * * 组装后通过 HTTP POST 发送至外部任务规划引擎。 */ struct TaskRequest { std::string requestId; ///< 请求唯一ID std::string eventRef; ///< 事件引用(eventId) std::string templateId; ///< 选定的模板ID std::string kbVersionId; ///< 锁定的知识库版本ID std::string workMode; ///< 工作模式标识 std::string initialParams; ///< 初始任务参数(JSON字符串) int64_t createTime; ///< 请求创建时间戳 /** @brief 默认构造函数 */ TaskRequest() : createTime(0) {} }; // ──────────────────────────────────────────────────────────────────────────── // Core Business Classes // ──────────────────────────────────────────────────────────────────────────── /** * @brief 事件管理器 * * 负责战场事件的接收、校验、处理、存储与查询。 * 模拟从消息队列接收原始事件 JSON,校验完整性,执行状态流转。 */ class EventManager { public: /** @brief 默认构造函数 */ EventManager(); /** @brief 虚析构 */ virtual ~EventManager(); /** * @brief 接收原始事件数据 * * 模拟从 MQTT/Kafka 接收 JSON 格式的原始事件,执行完整性校验。 * @param rawJson 原始事件 JSON 字符串 * @return true 校验通过,已接收(ACK) * @return false 校验失败,拒绝接收(NACK) */ bool receiveEvent(const std::string& rawJson); /** * @brief 处理已接收的事件 * * 对合法事件进行清洗、格式化,并将状态从 Received 流转为 Processed。 * @param eventId 事件唯一标识 * @return true 处理成功 * @return false 事件不存在或状态不合法 */ bool processEvent(const std::string& eventId); /** * @brief 拒绝事件 * * 将事件状态置为 Rejected。 * @param eventId 事件唯一标识 * @return true 操作成功 * @return false 事件不存在 */ bool rejectEvent(const std::string& eventId); /** * @brief 按事件ID查询事件 * @param eventId 事件唯一标识 * @return Event 事件的深拷贝副本;若不存在返回默认 Event */ Event getEvent(const std::string& eventId) const; /** * @brief 获取所有待处理事件列表 * @return std::vector 状态为 PendingTask 的事件列表 */ std::vector getPendingEvents() const; /** * @brief 获取当前管理的事件总数 * @return size_t 事件数量 */ size_t eventCount() const; /** * @brief 标记事件为"待生成任务" * * 将已处理事件的状态转为 PendingTask,进入任务生成准备阶段。 * @param eventId 事件唯一标识 * @return true 操作成功 * @return false 事件不存在或未处于 Processed 状态 */ bool markPendingTask(const std::string& eventId); private: /** @brief 内部事件存储(模拟数据库) */ std::unordered_map events_; /** * @brief 校验原始 JSON 的完整性 * * 模拟校验:检查是否包含 eventId、eventType、timestamp 等关键字段。 * @param rawJson 原始 JSON 字符串 * @return true 数据完整 * @return false 数据不完整 */ bool validateRawJson(const std::string& rawJson) const; /** * @brief 从 JSON 字符串解析为 Event 对象(模拟实现) * @param rawJson 原始 JSON 字符串 * @return Event 解析后的事件对象 */ Event parseFromJson(const std::string& rawJson) const; }; /** * @brief 任务生成器 * * 负责任务模板管理、知识库版本选择、事件与模板映射、任务请求组装。 * 支持人机协同(手动)与自主推荐两种工作模式。 */ class TaskGenerator { public: /** @brief 默认构造函数 */ TaskGenerator(); /** @brief 虚析构 */ virtual ~TaskGenerator(); // ── 模板管理 ── /** * @brief 接收并解析上级推送的任务模板 * * 增量更新本地模板库。 * @param jsonTemplate 模板 JSON 字符串 * @return true 解析成功并已添加/更新 * @return false 解析失败 */ bool loadTemplate(const std::string& jsonTemplate); /** * @brief 按模板ID查询模板 * @param templateId 模板ID * @return TaskTemplate 模板副本;不存在时返回默认 TaskTemplate */ TaskTemplate getTemplate(const std::string& templateId) const; /** * @brief 获取所有模板列表 * @return std::vector 模板列表 */ std::vector getAllTemplates() const; /** * @brief 搜索模板(按名称模糊匹配) * @param keyword 搜索关键字 * @return std::vector 匹配的模板列表 */ std::vector searchTemplates(const std::string& keyword) const; // ── 知识库版本管理 ── /** * @brief 添加知识库版本 * @param version 知识库版本对象 */ void addKBVersion(const KBVersion& version); /** * @brief 获取所有可用的知识库版本 * @return std::vector 状态为 Enabled 的版本列表 */ std::vector getAvailableKBVersions() const; /** * @brief 选择并锁定知识库版本 * @param versionId 版本ID * @return true 锁定成功 * @return false 版本不存在或已禁用 */ bool selectKBVersion(const std::string& versionId); // ── 任务生成 ── /** * @brief 设置工作模式 * @param mode 工作模式 */ void setWorkMode(WorkMode mode); /** * @brief 获取当前工作模式 * @return WorkMode 当前模式 */ WorkMode getWorkMode() const; /** * @brief 建立事件与模板的映射关系 * * 在自主模式下自动推荐最匹配模板;手动模式下由用户指定。 * @param eventId 事件ID * @param templateId 模板ID(手动模式指定);自动模式下可传空字符串 * @return true 映射成功 */ bool mapEventToTemplate(const std::string& eventId, const std::string& templateId); /** * @brief 组装并生成任务请求 * * 将事件引用、选定模板、知识库版本等信息组装为 TaskRequest 报文。 * @param eventId 事件ID * @return TaskRequest 组装完成的任务请求;若失败返回默认 TaskRequest */ TaskRequest buildTaskRequest(const std::string& eventId); /** * @brief 获取当前已锁定的知识库版本ID * @return std::string 版本ID;未锁定时返回空字符串 */ std::string getLockedKBVersion() const; private: /** @brief 本地模板库(模拟数据库 t_task_template) */ std::unordered_map templates_; /** @brief 知识库版本库(模拟数据库 t_kb_version) */ std::unordered_map kbVersions_; /** @brief 事件→模板映射表 */ std::unordered_map eventTemplateMap_; /** @brief 当前工作模式 */ WorkMode workMode_; /** @brief 当前锁定的知识库版本ID */ std::string lockedKBVersionId_; /** * @brief 自动推荐模板(模拟逻辑) * * 根据事件类型与等级,从模板库中匹配最合适的模板。 * @param ev 事件对象 * @return std::string 推荐的模板ID;无匹配时返回空字符串 */ std::string autoRecommendTemplate(const Event& ev) const; }; } // namespace etms #endif // ETMS_APP_HPP