plan_execute_t1/src/main.cpp

274 lines
11 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* @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;
}