117 lines
3.9 KiB
C++
117 lines
3.9 KiB
C++
#ifndef BATTLEFIELD_CORE_TEMPLATE_HPP
|
||
#define BATTLEFIELD_CORE_TEMPLATE_HPP
|
||
|
||
#include <string>
|
||
#include <vector>
|
||
#include <map>
|
||
#include <cstdint>
|
||
#include <nlohmann/json.hpp>
|
||
|
||
namespace battlefield {
|
||
|
||
/// @brief 任务模板数据结构,对应 T_TEMPLATE
|
||
struct TaskTemplate {
|
||
std::string versionId; ///< VERSION_ID
|
||
std::string name; ///< 模板名称
|
||
std::string description; ///< 模板描述
|
||
std::string content; ///< 模板内容(JSON格式)
|
||
std::string dateIndex; ///< 日期索引
|
||
bool isActive{false}; ///< 是否当前激活版本
|
||
bool isRecommended{false}; ///< 是否被推荐
|
||
double score{0.0}; ///< 推荐评分
|
||
};
|
||
|
||
/// @brief 版本差异信息
|
||
struct VersionDiff {
|
||
std::string versionA;
|
||
std::string versionB;
|
||
std::vector<std::string> addedFields;
|
||
std::vector<std::string> removedFields;
|
||
std::vector<std::string> changedFields;
|
||
};
|
||
|
||
/// @brief 模板管理模块(SU-03,覆盖 SRS-F-03-001 ~ SRS-F-04-006)
|
||
class TemplateManager {
|
||
public:
|
||
/// @brief 从目录加载JSON模板文件(SRS-F-04-001)
|
||
/// @param directory 模板文件目录
|
||
/// @return 成功加载的模板数量
|
||
size_t LoadTemplates(const std::string& directory);
|
||
|
||
/// @brief 从单个JSON文件加载模板
|
||
/// @param filePath 文件路径
|
||
/// @return 是否成功
|
||
bool LoadTemplateFromFile(const std::string& filePath);
|
||
|
||
/// @brief 接收推送的任务模板JSON数据(SRS-F-04-001)
|
||
/// @param jsonData 模板JSON字符串
|
||
/// @return 是否接收成功
|
||
bool ReceiveTemplatePush(const std::string& jsonData);
|
||
|
||
/// @brief 保存模板到文件
|
||
/// @param tmpl 模板对象
|
||
/// @param directory 目标目录
|
||
/// @return 是否保存成功
|
||
bool SaveTemplateToFile(const TaskTemplate& tmpl, const std::string& directory) const;
|
||
|
||
/// @brief 获取所有模板列表(SRS-F-04-002)
|
||
/// @return 模板列表
|
||
std::vector<TaskTemplate> GetTemplateList() const;
|
||
|
||
/// @brief 按名称排序(SRS-F-04-003)
|
||
/// @param ascending 是否升序
|
||
void SortTemplatesByName(bool ascending = true);
|
||
|
||
/// @brief 按评分排序
|
||
void SortTemplatesByScore(bool ascending = false);
|
||
|
||
/// @brief 按版本ID排序
|
||
void SortTemplatesByVersion(bool ascending = true);
|
||
|
||
/// @brief 按类别筛选模板
|
||
std::vector<TaskTemplate> FilterByCategory(const std::string& keyword) const;
|
||
|
||
/// @brief 人环模式:选择指定版本模板(SRS-F-03-001, SRS-F-04-005)
|
||
/// @param versionId 版本ID
|
||
/// @return 选中的模板
|
||
TaskTemplate SelectTemplate(const std::string& versionId);
|
||
|
||
/// @brief 设置模板为激活版本(SRS-F-03-001)
|
||
/// @param versionId 版本ID
|
||
/// @return 是否成功
|
||
bool SetActiveVersion(const std::string& versionId);
|
||
|
||
/// @brief 自主模式:自动推荐最优模板(SRS-F-04-006)
|
||
/// @return 推荐的模板
|
||
TaskTemplate RecommendTemplate();
|
||
|
||
/// @brief 加权推荐Top-N模板
|
||
/// @param topN 返回数量
|
||
/// @return 推荐模板列表
|
||
std::vector<TaskTemplate> RecommendTopTemplates(size_t topN = 3);
|
||
|
||
/// @brief 计算模板评分(基于完整性、描述长度、激活状态等加权)
|
||
/// @param tmpl 模板
|
||
/// @return 评分
|
||
double CalculateTemplateScore(const TaskTemplate& tmpl) const;
|
||
|
||
/// @brief 对比两个版本的差异(SRS-F-04-004 详情展示)
|
||
/// @param versionIdA 版本A
|
||
/// @param versionIdB 版本B
|
||
/// @return 差异信息
|
||
VersionDiff CompareVersions(const std::string& versionIdA, const std::string& versionIdB) const;
|
||
|
||
/// @brief 获取模板总数
|
||
size_t GetTemplateCount() const { return templates_.size(); }
|
||
|
||
private:
|
||
std::vector<TaskTemplate> templates_; ///< 模板集合
|
||
|
||
/// @brief 解析JSON为模板对象
|
||
TaskTemplate ParseTemplateJson(const nlohmann::json& j) const;
|
||
};
|
||
|
||
} // namespace battlefield
|
||
|
||
#endif // BATTLEFIELD_CORE_TEMPLATE_HPP
|