274 lines
11 KiB
C++
274 lines
11 KiB
C++
/**
|
||
* @file main.cpp
|
||
* @brief CMS 系统命令行入口
|
||
*
|
||
* 演示 CMS 核心引擎的基本功能,包括事件接入、任务生成、
|
||
* 模板注册、执行状态监控、用户会话管理、通知推送及模式切换。
|
||
*/
|
||
|
||
#include "app.hpp"
|
||
#include <iostream>
|
||
#include <thread>
|
||
#include <chrono>
|
||
|
||
/**
|
||
* @brief 辅助函数:输出系统状态摘要
|
||
*
|
||
* @param engine CMS 引擎引用
|
||
*/
|
||
static void printSummary(const CmsEngine& engine)
|
||
{
|
||
std::cout << engine.getSummary() << "\n\n";
|
||
}
|
||
|
||
/**
|
||
* @brief 辅助函数:打印分隔线
|
||
*/
|
||
static void printSeparator()
|
||
{
|
||
std::cout << "────────────────────────────────────────────\n";
|
||
}
|
||
|
||
/**
|
||
* @brief 程序入口
|
||
*
|
||
* 创建 CmsEngine 实例,依次演示各核心功能模块的调用,
|
||
* 并输出过程日志与最终摘要。
|
||
*
|
||
* @return int 退出码(0 表示正常)
|
||
*/
|
||
int main()
|
||
{
|
||
std::cout << "╔══════════════════════════════════════════════╗\n";
|
||
std::cout << "║ CMS — Command Management System v1.0.0 ║\n";
|
||
std::cout << "╚══════════════════════════════════════════════╝\n\n";
|
||
|
||
CmsEngine engine;
|
||
|
||
// ── 1. 初始状态 ──────────────────────────────────────────────────────
|
||
std::cout << "[1] 初始状态\n";
|
||
printSummary(engine);
|
||
printSeparator();
|
||
|
||
// ── 2. 接入战场事件 ──────────────────────────────────────────────────
|
||
std::cout << "[2] 接入战场事件\n";
|
||
|
||
EventRecord evt1;
|
||
evt1.id = "EVT-001";
|
||
evt1.typeTag = "air_raid";
|
||
evt1.latitude = 34.5;
|
||
evt1.longitude = 120.3;
|
||
evt1.altitude = 5000.0;
|
||
evt1.payload = R"({"target":"bomber","speed":800})";
|
||
evt1.priority = 200;
|
||
evt1.threatLevel = 4;
|
||
evt1.receiveTime = std::chrono::system_clock::now();
|
||
evt1.status = EventStatus::Pending;
|
||
|
||
if (engine.ingestEvent(evt1)) {
|
||
std::cout << " [+] 事件 EVT-001 接入成功\n";
|
||
}
|
||
|
||
EventRecord evt2;
|
||
evt2.id = "EVT-002";
|
||
evt2.typeTag = "naval_intrusion";
|
||
evt2.latitude = 28.1;
|
||
evt2.longitude = 122.7;
|
||
evt2.altitude = 0.0;
|
||
evt2.payload = R"({"vessel":"destroyer","bearing":270})";
|
||
evt2.priority = 150;
|
||
evt2.threatLevel = 3;
|
||
evt2.receiveTime = std::chrono::system_clock::now();
|
||
evt2.status = EventStatus::Pending;
|
||
|
||
if (engine.ingestEvent(evt2)) {
|
||
std::cout << " [+] 事件 EVT-002 接入成功\n";
|
||
}
|
||
std::cout << "\n";
|
||
printSeparator();
|
||
|
||
// ── 3. 处理待处理事件 → 自动生成任务方案 ──────────────────────────────
|
||
std::cout << "[3] 处理待处理事件(自动生成任务方案)\n";
|
||
size_t processed = engine.processPendingEvents();
|
||
std::cout << " [+] 已处理 " << processed << " 个事件,生成相应任务方案\n\n";
|
||
printSeparator();
|
||
|
||
// ── 4. 注册模板 ───────────────────────────────────────────────────────
|
||
std::cout << "[4] 注册任务模板\n";
|
||
|
||
TemplateInstance tmpl1;
|
||
tmpl1.id = "TMPL-001";
|
||
tmpl1.scenario = "air_defense";
|
||
tmpl1.complexity = 0.7;
|
||
tmpl1.version = "2.1.0";
|
||
tmpl1.subTaskTree = {"侦察", "拦截", "评估"};
|
||
tmpl1.dependencies = {"雷达数据就绪"};
|
||
tmpl1.confidence = 0.92;
|
||
engine.registerTemplate(tmpl1);
|
||
std::cout << " [+] 模板 TMPL-001(空天防御)已注册\n";
|
||
|
||
TemplateInstance tmpl2;
|
||
tmpl2.id = "TMPL-002";
|
||
tmpl2.scenario = "naval_defense";
|
||
tmpl2.complexity = 0.6;
|
||
tmpl2.version = "1.8.0";
|
||
tmpl2.subTaskTree = {"海域监视", "目标识别", "反制"};
|
||
tmpl2.dependencies = {"卫星数据就绪"};
|
||
tmpl2.confidence = 0.88;
|
||
engine.registerTemplate(tmpl2);
|
||
std::cout << " [+] 模板 TMPL-002(海域防御)已注册\n\n";
|
||
printSeparator();
|
||
|
||
// ── 5. 模板匹配 ──────────────────────────────────────────────────────
|
||
std::cout << "[5] 模板匹配测试\n";
|
||
const auto* matched = engine.matchTemplate("air_defense");
|
||
if (matched) {
|
||
std::cout << " [+] 匹配模板: " << matched->id
|
||
<< " (场景: " << matched->scenario
|
||
<< ", 置信度: " << matched->confidence << ")\n";
|
||
}
|
||
std::cout << "\n";
|
||
printSeparator();
|
||
|
||
// ── 6. 用户会话与权限 ────────────────────────────────────────────────
|
||
std::cout << "[6] 用户会话与权限\n";
|
||
|
||
UserSession admin;
|
||
admin.userId = "U-001";
|
||
admin.roleCode = "ADMIN";
|
||
admin.permissionBitmap = 0xFFFFFFFFFFFFFFFFULL;
|
||
admin.accessToken = "tok_admin_abc123";
|
||
admin.expireTime = std::chrono::system_clock::now()
|
||
+ std::chrono::hours(8);
|
||
admin.clientIp = "192.168.1.100";
|
||
|
||
if (engine.createSession(admin)) {
|
||
std::cout << " [+] 管理员会话 U-001 创建成功\n";
|
||
}
|
||
|
||
UserSession viewer;
|
||
viewer.userId = "U-002";
|
||
viewer.roleCode = "VIEWER";
|
||
viewer.permissionBitmap = 0x0000000000000001ULL; // 只读权限
|
||
viewer.accessToken = "tok_viewer_xyz456";
|
||
viewer.expireTime = std::chrono::system_clock::now()
|
||
+ std::chrono::hours(2);
|
||
viewer.clientIp = "192.168.1.101";
|
||
|
||
if (engine.createSession(viewer)) {
|
||
std::cout << " [+] 观察员会话 U-002 创建成功\n";
|
||
}
|
||
|
||
// 权限校验
|
||
uint64_t needWrite = 0x0000000000000002ULL;
|
||
std::cout << " [*] U-001 写入权限: "
|
||
<< (engine.checkPermission("U-001", needWrite) ? "通过" : "拒绝") << "\n";
|
||
std::cout << " [*] U-002 写入权限: "
|
||
<< (engine.checkPermission("U-002", needWrite) ? "通过" : "拒绝") << "\n";
|
||
std::cout << "\n";
|
||
printSeparator();
|
||
|
||
// ── 7. 执行状态上报与健康检查 ────────────────────────────────────────
|
||
std::cout << "[7] 执行状态上报与健康检查\n";
|
||
|
||
ExecutionStatus st1;
|
||
st1.nodeId = "NODE-A1";
|
||
st1.progress = 0.75;
|
||
st1.healthIndex = 0.95;
|
||
st1.resourceUsage = 0.45;
|
||
st1.heartbeatSignal = 1024;
|
||
st1.errorCode = 0;
|
||
st1.lastReport = std::chrono::system_clock::now();
|
||
engine.reportExecutionStatus(st1);
|
||
std::cout << " [+] 节点 NODE-A1 状态已上报\n";
|
||
|
||
ExecutionStatus st2;
|
||
st2.nodeId = "NODE-B2";
|
||
st2.progress = 0.30;
|
||
st2.healthIndex = 0.25; // 低于 0.5 → 异常
|
||
st2.resourceUsage = 0.90;
|
||
st2.heartbeatSignal = 512;
|
||
st2.errorCode = 0xE003; // 非零异常码
|
||
st2.lastReport = std::chrono::system_clock::now()
|
||
- std::chrono::seconds(45); // 超时
|
||
engine.reportExecutionStatus(st2);
|
||
std::cout << " [+] 节点 NODE-B2 状态已上报(模拟异常)\n";
|
||
|
||
auto unhealthy = engine.checkHealth();
|
||
std::cout << " [*] 异常节点数: " << unhealthy.size() << "\n";
|
||
for (const auto& u : unhealthy) {
|
||
std::cout << " - " << u.nodeId
|
||
<< " (健康指数: " << u.healthIndex
|
||
<< ", 异常码: " << u.errorCode << ")\n";
|
||
}
|
||
std::cout << "\n";
|
||
printSeparator();
|
||
|
||
// ── 8. 通知推送 ───────────────────────────────────────────────────────
|
||
std::cout << "[8] 通知推送\n";
|
||
|
||
NotificationMessage alert;
|
||
alert.id = "NOTIFY-001";
|
||
alert.priority = 255;
|
||
alert.type = NotificationType::Alert;
|
||
alert.summary = "节点 NODE-B2 健康指数异常,请尽快处理!";
|
||
alert.triggerTime = std::chrono::system_clock::now();
|
||
alert.isRead = false;
|
||
engine.pushNotification(alert);
|
||
std::cout << " [+] 告警通知已推送\n";
|
||
|
||
NotificationMessage hint;
|
||
hint.id = "NOTIFY-002";
|
||
hint.priority = 50;
|
||
hint.type = NotificationType::Hint;
|
||
hint.summary = "模板 TMPL-002 更新至 v2.0.0 可用";
|
||
hint.triggerTime = std::chrono::system_clock::now();
|
||
hint.isRead = false;
|
||
engine.pushNotification(hint);
|
||
std::cout << " [+] 提示通知已推送\n";
|
||
|
||
auto unread = engine.getUnreadNotifications();
|
||
std::cout << " [*] 未读通知数: " << unread.size() << "\n";
|
||
for (const auto& n : unread) {
|
||
std::cout << " - [" << (n.type == NotificationType::Alert ? "告警" :
|
||
n.type == NotificationType::Hint ? "提示" : "确认")
|
||
<< "] " << n.summary << "\n";
|
||
}
|
||
std::cout << "\n";
|
||
printSeparator();
|
||
|
||
// ── 9. 模式切换 ───────────────────────────────────────────────────────
|
||
std::cout << "[9] 运行模式切换\n";
|
||
std::cout << " [*] 当前模式: Idle\n";
|
||
|
||
if (engine.switchMode(RunMode::HumanLoop)) {
|
||
std::cout << " [+] 切换至 HumanLoop 成功\n";
|
||
}
|
||
|
||
if (engine.switchMode(RunMode::AutoExec)) {
|
||
std::cout << " [+] 切换至 AutoExec 成功\n";
|
||
}
|
||
|
||
// 模拟降级
|
||
if (engine.switchMode(RunMode::Degraded)) {
|
||
std::cout << " [+] 切换至 Degraded 成功\n";
|
||
}
|
||
|
||
// 尝试从降级退出(应被拒绝)
|
||
if (!engine.switchMode(RunMode::Idle)) {
|
||
std::cout << " [-] 从 Degraded 切回 Idle 被拒绝(符合故障隔离策略)\n";
|
||
}
|
||
std::cout << "\n";
|
||
printSeparator();
|
||
|
||
// ── 10. 最终摘要 ─────────────────────────────────────────────────────
|
||
std::cout << "[10] 最终系统摘要\n";
|
||
printSummary(engine);
|
||
|
||
std::cout << "╔══════════════════════════════════════════════╗\n";
|
||
std::cout << "║ 演示结束 — 系统运行正常 ║\n";
|
||
std::cout << "╚══════════════════════════════════════════════╝\n";
|
||
|
||
return 0;
|
||
}
|