2026-05-20 08:00:11 +00:00
|
|
|
|
#ifndef ETMS_APP_HPP
|
|
|
|
|
|
#define ETMS_APP_HPP
|
|
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
#include <cstdint>
|
2026-05-20 08:00:11 +00:00
|
|
|
|
#include <string>
|
|
|
|
|
|
#include <vector>
|
2026-05-20 09:17:29 +00:00
|
|
|
|
#include <unordered_map>
|
|
|
|
|
|
#include <chrono>
|
2026-05-20 08:00:11 +00:00
|
|
|
|
|
|
|
|
|
|
namespace etms {
|
|
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
// ────────────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// 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 ///< 自主推荐模式(自动推荐)
|
2026-05-20 08:00:11 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
// ────────────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// Data Models
|
|
|
|
|
|
// ────────────────────────────────────────────────────────────────────────────
|
2026-05-20 08:00:11 +00:00
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 战场事件数据模型
|
|
|
|
|
|
*
|
|
|
|
|
|
* 对应数据库 t_event 表,记录从消息队列接收的原始事件及其处理状态。
|
|
|
|
|
|
*/
|
2026-05-20 08:00:11 +00:00
|
|
|
|
struct Event {
|
2026-05-20 09:17:29 +00:00
|
|
|
|
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) {}
|
2026-05-20 08:00:11 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @brief 任务模板数据模型
|
|
|
|
|
|
*
|
|
|
|
|
|
* 对应数据库 t_task_template 表,描述上级推送的任务模板定义。
|
|
|
|
|
|
*/
|
2026-05-20 08:00:11 +00:00
|
|
|
|
struct TaskTemplate {
|
2026-05-20 09:17:29 +00:00
|
|
|
|
std::string id; ///< 模板ID
|
|
|
|
|
|
std::string name; ///< 模板名称
|
|
|
|
|
|
std::string type; ///< 模板类型
|
|
|
|
|
|
std::string paramConfig; ///< 参数配置(JSON字符串)
|
|
|
|
|
|
std::vector<std::string> subTaskIds; ///< 子任务ID列表(树状结构)
|
|
|
|
|
|
std::string version; ///< 版本号
|
|
|
|
|
|
std::string createTime; ///< 创建时间(ISO8601字符串)
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief 默认构造函数 */
|
|
|
|
|
|
TaskTemplate() = default;
|
2026-05-20 08:00:11 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @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) {}
|
2026-05-20 08:00:11 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @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) {}
|
2026-05-20 08:00:11 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
// ────────────────────────────────────────────────────────────────────────────
|
|
|
|
|
|
// 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<Event> 状态为 PendingTask 的事件列表
|
|
|
|
|
|
*/
|
|
|
|
|
|
std::vector<Event> 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<std::string, Event> 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;
|
2026-05-20 08:00:11 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
2026-05-20 09:17:29 +00:00
|
|
|
|
/**
|
|
|
|
|
|
* @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<TaskTemplate> 模板列表
|
|
|
|
|
|
*/
|
|
|
|
|
|
std::vector<TaskTemplate> getAllTemplates() const;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 搜索模板(按名称模糊匹配)
|
|
|
|
|
|
* @param keyword 搜索关键字
|
|
|
|
|
|
* @return std::vector<TaskTemplate> 匹配的模板列表
|
|
|
|
|
|
*/
|
|
|
|
|
|
std::vector<TaskTemplate> searchTemplates(const std::string& keyword) const;
|
|
|
|
|
|
|
|
|
|
|
|
// ── 知识库版本管理 ──
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 添加知识库版本
|
|
|
|
|
|
* @param version 知识库版本对象
|
|
|
|
|
|
*/
|
|
|
|
|
|
void addKBVersion(const KBVersion& version);
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 获取所有可用的知识库版本
|
|
|
|
|
|
* @return std::vector<KBVersion> 状态为 Enabled 的版本列表
|
|
|
|
|
|
*/
|
|
|
|
|
|
std::vector<KBVersion> 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<std::string, TaskTemplate> templates_;
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief 知识库版本库(模拟数据库 t_kb_version) */
|
|
|
|
|
|
std::unordered_map<std::string, KBVersion> kbVersions_;
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief 事件→模板映射表 */
|
|
|
|
|
|
std::unordered_map<std::string, std::string> eventTemplateMap_;
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief 当前工作模式 */
|
|
|
|
|
|
WorkMode workMode_;
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief 当前锁定的知识库版本ID */
|
|
|
|
|
|
std::string lockedKBVersionId_;
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* @brief 自动推荐模板(模拟逻辑)
|
|
|
|
|
|
*
|
|
|
|
|
|
* 根据事件类型与等级,从模板库中匹配最合适的模板。
|
|
|
|
|
|
* @param ev 事件对象
|
|
|
|
|
|
* @return std::string 推荐的模板ID;无匹配时返回空字符串
|
|
|
|
|
|
*/
|
|
|
|
|
|
std::string autoRecommendTemplate(const Event& ev) const;
|
|
|
|
|
|
};
|
2026-05-20 08:00:11 +00:00
|
|
|
|
|
|
|
|
|
|
} // namespace etms
|
|
|
|
|
|
|
|
|
|
|
|
#endif // ETMS_APP_HPP
|