128 lines
4.4 KiB
C++
128 lines
4.4 KiB
C++
#ifndef BATTLEFIELD_CORE_TASK_HPP
|
||
#define BATTLEFIELD_CORE_TASK_HPP
|
||
|
||
#include <string>
|
||
#include <vector>
|
||
#include <memory>
|
||
#include <cstdint>
|
||
#include <nlohmann/json.hpp>
|
||
#include "core/event.hpp"
|
||
|
||
namespace battlefield {
|
||
|
||
/// @brief 任务草案状态枚举
|
||
enum class DraftStatus : int32_t {
|
||
DRAFT = 0, ///< 草稿
|
||
SUBMITTED = 1, ///< 已提交
|
||
APPROVED = 2, ///< 已批准
|
||
REJECTED = 3 ///< 已驳回
|
||
};
|
||
|
||
/// @brief 任务草案数据结构,对应 T_TASK_DRAFT
|
||
struct TaskDraft {
|
||
std::string id; ///< 任务草案ID
|
||
std::string title; ///< 任务标题
|
||
std::string description; ///< 任务描述
|
||
int32_t priority{0}; ///< 优先级 (1-10)
|
||
DraftStatus status{DraftStatus::DRAFT}; ///< 状态
|
||
std::string relatedEventId; ///< 关联事件ID
|
||
std::string taskType; ///< 任务类型标签
|
||
std::vector<std::string> requiredResources; ///< 所需资源列表
|
||
};
|
||
|
||
/// @brief 任务生成策略接口(策略模式,设计文档5.2.1)
|
||
class ITaskStrategy {
|
||
public:
|
||
virtual ~ITaskStrategy() = default;
|
||
/// @brief 基于事件生成任务草案
|
||
virtual TaskDraft Generate(const Event& event, const std::string& draftId) = 0;
|
||
/// @brief 策略名称
|
||
virtual std::string Name() const = 0;
|
||
};
|
||
|
||
/// @brief 情报处理任务策略
|
||
class IntelTaskStrategy : public ITaskStrategy {
|
||
public:
|
||
TaskDraft Generate(const Event& event, const std::string& draftId) override;
|
||
std::string Name() const override { return "IntelTaskStrategy"; }
|
||
};
|
||
|
||
/// @brief 威胁响应任务策略
|
||
class ThreatTaskStrategy : public ITaskStrategy {
|
||
public:
|
||
TaskDraft Generate(const Event& event, const std::string& draftId) override;
|
||
std::string Name() const override { return "ThreatTaskStrategy"; }
|
||
};
|
||
|
||
/// @brief 任务执行策略
|
||
class MissionTaskStrategy : public ITaskStrategy {
|
||
public:
|
||
TaskDraft Generate(const Event& event, const std::string& draftId) override;
|
||
std::string Name() const override { return "MissionTaskStrategy"; }
|
||
};
|
||
|
||
/// @brief 后勤保障任务策略
|
||
class LogisticTaskStrategy : public ITaskStrategy {
|
||
public:
|
||
TaskDraft Generate(const Event& event, const std::string& draftId) override;
|
||
std::string Name() const override { return "LogisticTaskStrategy"; }
|
||
};
|
||
|
||
/// @brief 事件观察者接口(观察者模式,设计文档5.2.1)
|
||
class IEventObserver {
|
||
public:
|
||
virtual ~IEventObserver() = default;
|
||
/// @brief 当新事件到达时回调
|
||
virtual void OnEventReceived(const Event& event) = 0;
|
||
};
|
||
|
||
/// @brief 任务生成模块(SU-02,覆盖 SRS-F-02-001 ~ SRS-F-02-004)
|
||
class TaskGenerator : public IEventObserver {
|
||
public:
|
||
TaskGenerator();
|
||
|
||
/// @brief 基于选定事件生成作战任务草案(SRS-F-02-004)
|
||
/// @param event 源事件
|
||
/// @return 生成的 TaskDraft 对象
|
||
TaskDraft CreateTaskFromEvent(const Event& event);
|
||
|
||
/// @brief 观察者接口:当事件到达时被调用
|
||
void OnEventReceived(const Event& event) override;
|
||
|
||
/// @brief 获取当前所有任务草案列表(SRS-F-02-001)
|
||
/// @return 草案列表
|
||
std::vector<TaskDraft> GetDraftList() const;
|
||
|
||
/// @brief 提交任务草案送交处理(对应接口 IF-02)
|
||
/// @param draftId 草案ID
|
||
/// @param targetUrl 目标任务引擎地址
|
||
/// @return 是否提交成功
|
||
bool SubmitDraft(const std::string& draftId, const std::string& targetUrl);
|
||
|
||
/// @brief 提交任务草案并将载荷序列化为JSON
|
||
nlohmann::json SubmitDraftAsJson(const std::string& draftId);
|
||
|
||
/// @brief 按优先级排序草案列表(SRS-F-02-003)
|
||
/// @param ascending 是否升序
|
||
void SortDraftsByPriority(bool ascending = true);
|
||
|
||
/// @brief 设置自动生成开关(观察者模式:是否在事件到达时自动生成)
|
||
void SetAutoGenerate(bool enabled) { autoGenerate_ = enabled; }
|
||
|
||
/// @brief 获取草案总数
|
||
size_t GetDraftCount() const { return drafts_.size(); }
|
||
|
||
private:
|
||
std::vector<TaskDraft> drafts_; ///< 内存暂存的任务草案
|
||
std::vector<std::unique_ptr<ITaskStrategy>> strategies_; ///< 生成策略集合
|
||
bool autoGenerate_{false}; ///< 是否自动生成
|
||
size_t draftCounter_{0}; ///< 草案计数
|
||
|
||
/// @brief 根据事件类型选择策略
|
||
ITaskStrategy* SelectStrategy(EventType type) const;
|
||
};
|
||
|
||
} // namespace battlefield
|
||
|
||
#endif // BATTLEFIELD_CORE_TASK_HPP
|