From c02f0cbbddabb467c5b0eeed2d56286bf39217e0 Mon Sep 17 00:00:00 2001 From: lnk Date: Fri, 31 Oct 2025 10:59:30 +0800 Subject: [PATCH] fix recall --- LFtid1056/cloudfront/code/cfg_parser.cpp | 21 +++++++++++-- LFtid1056/cloudfront/code/rocketmq.cpp | 40 +++++++++++++++--------- 2 files changed, 45 insertions(+), 16 deletions(-) diff --git a/LFtid1056/cloudfront/code/cfg_parser.cpp b/LFtid1056/cloudfront/code/cfg_parser.cpp index f1b003c..e29d493 100644 --- a/LFtid1056/cloudfront/code/cfg_parser.cpp +++ b/LFtid1056/cloudfront/code/cfg_parser.cpp @@ -4281,8 +4281,25 @@ void check_recall_event() { // 遍历所有 terminal —— 每个 terminal 只挑一条,先不判断运行状态,因为正在处理其他事务的装置也可以记录待补招信息 for (auto& dev : terminal_devlist) { //如果该终端不是正在补招或者idle则直接跳过,节省运行时间 - if(dev.busytype != static_cast(DeviceState::READING_EVENTLOG) && dev.busytype != static_cast(DeviceState::IDLE)){ - std::cout << "[check_recall_event] skip dev=" << dev.terminal_id << std::endl; + bool allow_check = + dev.busytype == static_cast(DeviceState::IDLE) || + dev.busytype == static_cast(DeviceState::READING_EVENTLOG); + + // 如果你允许“事件抢占文件”,并且当前没有文件 RUNNING,则也允许评估事件: + if (!allow_check && dev.busytype == static_cast(DeviceState::READING_STATSFILE)) { + bool has_file_running = false; + for (const auto& lm2 : dev.line) { + if (!lm2.recall_list_static.empty() && + lm2.recall_list_static.front().recall_status == static_cast(RecallStatus::RUNNING)) { + has_file_running = true; break; + } + } + if (!has_file_running) allow_check = true; // 没有文件正在跑,允许事件优先 + } + + if (!allow_check) { + std::cout << "[check_recall_event] skip dev=" << dev.terminal_id + << " busytype=" << dev.busytype << std::endl; continue; } // 对正在补招或idle终端的所有监测点的待补招列表进行处理 diff --git a/LFtid1056/cloudfront/code/rocketmq.cpp b/LFtid1056/cloudfront/code/rocketmq.cpp index 551bf83..60841b0 100644 --- a/LFtid1056/cloudfront/code/rocketmq.cpp +++ b/LFtid1056/cloudfront/code/rocketmq.cpp @@ -762,23 +762,35 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d json_data.Righttime = item.value("Righttime", ""); if (item.contains("monitorData") && item["monitorData"].is_array()) { - size_t j = 0; - constexpr size_t kMaxLines = std::extent::value; // 如果是 C 数组 for (const auto& monitor_item : item["monitorData"]) { - if (j >= kMaxLines) break; - auto& m = json_data.line[j++]; - m.monitor_id = monitor_item.value("id", ""); - m.monitor_name = monitor_item.value("name", ""); - m.voltage_level = monitor_item.value("voltageLevel", ""); - m.status = monitor_item.value("status", ""); + json_data.line.emplace_back(); // 追加元素 + auto& m = json_data.line.back(); // 引用最后一个 + + m.monitor_id = monitor_item.value("id", ""); + m.monitor_name = monitor_item.value("name", ""); m.logical_device_seq = monitor_item.value("lineNo", ""); + m.voltage_level = monitor_item.value("voltageLevel", ""); + // status 可能是数字,统一转成字符串存 + if (monitor_item.contains("status") && monitor_item["status"].is_number_integer()) + m.status = std::to_string(monitor_item["status"].get()); + else + m.status = monitor_item.value("status", ""); + m.terminal_connect = monitor_item.value("ptType", ""); - //m.timestamp = json_data.timestamp; - m.terminal_id = monitor_item.value("deviceId", json_data.terminal_id); - m.CT1 = monitor_item.value("CT1", 0.0); - m.CT2 = monitor_item.value("CT2", 0.0); - m.PT1 = monitor_item.value("PT1", 0.0); - m.PT2 = monitor_item.value("PT2", 0.0); + m.terminal_id = monitor_item.value("deviceId", json_data.terminal_id); + + // 兼容大小写写法:PT1/pt1 等 + auto get_num = [&](const nlohmann::json& j, const char* up, const char* lo, double defv) { + if (j.contains(up) && (j[up].is_number_float() || j[up].is_number_integer())) + return j[up].get(); + if (j.contains(lo) && (j[lo].is_number_float() || j[lo].is_number_integer())) + return j[lo].get(); + return defv; + }; + m.PT1 = get_num(monitor_item, "PT1", "pt1", 0.0); + m.PT2 = get_num(monitor_item, "PT2", "pt2", 0.0); + m.CT1 = get_num(monitor_item, "CT1", "ct1", 0.0); + m.CT2 = get_num(monitor_item, "CT2", "ct2", 0.0); } }