add ledger update

This commit is contained in:
lnk
2025-09-25 16:36:04 +08:00
parent 5616d9096a
commit caf3c308c1
5 changed files with 298 additions and 72 deletions

View File

@@ -1455,7 +1455,7 @@ std::list<std::string> find_xml_belong_to_this_process()
// 根据 str_tag 将 terminal 添加到对应的数组 // 根据 str_tag 将 terminal 添加到对应的数组
void add_terminal_to_trigger_update(trigger_update_xml_t& trigger_update_xml, void add_terminal_to_trigger_update(trigger_update_xml_t& trigger_update_xml,
const std::string& str_tag, const std::string& str_tag,
const terminal_dev& work_terminal) { const update_dev& work_terminal) {
if (str_tag == "add") { if (str_tag == "add") {
std::cout << "new ledger!!!!" << std::endl; std::cout << "new ledger!!!!" << std::endl;
trigger_update_xml.new_updates.push_back(work_terminal); trigger_update_xml.new_updates.push_back(work_terminal);
@@ -1472,7 +1472,7 @@ void parse_terminal_from_data(trigger_update_xml_t& trigger_update_xml,
const std::string& str_tag, const std::string& str_tag,
const std::string& data, const std::string& data,
const std::string& guid_value) { const std::string& guid_value) {
terminal_dev work_terminal; update_dev work_terminal;
work_terminal.guid = guid_value; work_terminal.guid = guid_value;
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
@@ -1490,31 +1490,32 @@ void parse_terminal_from_data(trigger_update_xml_t& trigger_update_xml,
work_terminal.terminal_id = get_value("id"); work_terminal.terminal_id = get_value("id");
work_terminal.terminal_name = get_value("terminalCode"); work_terminal.terminal_name = get_value("terminalCode");
work_terminal.org_name = get_value("orgName"); //work_terminal.org_name = get_value("orgName");
work_terminal.maint_name = get_value("maintName"); //work_terminal.maint_name = get_value("maintName");
work_terminal.station_name = get_value("stationName"); //work_terminal.station_name = get_value("stationName");
work_terminal.tmnl_factory = get_value("manufacturer"); //work_terminal.tmnl_factory = get_value("manufacturer");
work_terminal.tmnl_status = get_value("status"); work_terminal.tmnl_status = get_value("status");
work_terminal.dev_type = get_value("devType"); work_terminal.dev_type = get_value("devType");
work_terminal.dev_key = get_value("devKey"); //work_terminal.dev_key = get_value("devKey");
work_terminal.dev_series = get_value("series"); //work_terminal.dev_series = get_value("series");
work_terminal.processNo = get_value("processNo"); work_terminal.processNo = get_value("processNo");
work_terminal.addr_str = get_value("ip"); //work_terminal.addr_str = get_value("ip");
work_terminal.port = get_value("port"); //work_terminal.port = get_value("port");
work_terminal.timestamp = get_value("updateTime"); //work_terminal.timestamp = get_value("updateTime");
work_terminal.Righttime = get_value("Righttime");
work_terminal.mac = get_value("mac"); work_terminal.mac = get_value("mac");
for (tinyxml2::XMLElement* monitor = root->FirstChildElement("monitorData"); for (tinyxml2::XMLElement* monitor = root->FirstChildElement("monitorData");
monitor; monitor;
monitor = monitor->NextSiblingElement("monitorData")) { monitor = monitor->NextSiblingElement("monitorData")) {
ledger_monitor mon; update_monitor mon;
mon.monitor_id = monitor->FirstChildElement("id") ? monitor->FirstChildElement("id")->GetText() : "N/A"; mon.monitor_id = monitor->FirstChildElement("id") ? monitor->FirstChildElement("id")->GetText() : "N/A";
mon.monitor_name = monitor->FirstChildElement("name") ? monitor->FirstChildElement("name")->GetText() : "N/A"; mon.monitor_name = monitor->FirstChildElement("name") ? monitor->FirstChildElement("name")->GetText() : "N/A";
mon.voltage_level = monitor->FirstChildElement("voltageLevel") ? monitor->FirstChildElement("voltageLevel")->GetText() : "N/A"; mon.voltage_level = monitor->FirstChildElement("voltageLevel") ? monitor->FirstChildElement("voltageLevel")->GetText() : "N/A";
mon.terminal_connect = monitor->FirstChildElement("ptType") ? monitor->FirstChildElement("ptType")->GetText() : "N/A"; mon.terminal_connect = monitor->FirstChildElement("ptType") ? monitor->FirstChildElement("ptType")->GetText() : "N/A";
mon.logical_device_seq = monitor->FirstChildElement("lineNo") ? monitor->FirstChildElement("lineNo")->GetText() : "N/A"; mon.logical_device_seq = monitor->FirstChildElement("lineNo") ? monitor->FirstChildElement("lineNo")->GetText() : "N/A";
mon.timestamp = monitor->FirstChildElement("timestamp") ? monitor->FirstChildElement("timestamp")->GetText() : "N/A"; //mon.timestamp = monitor->FirstChildElement("timestamp") ? monitor->FirstChildElement("timestamp")->GetText() : "N/A";
mon.terminal_id = monitor->FirstChildElement("terminal_id") ? monitor->FirstChildElement("terminal_name")->GetText() : "N/A"; mon.terminal_id = monitor->FirstChildElement("terminal_id") ? monitor->FirstChildElement("terminal_name")->GetText() : "N/A";
mon.status = monitor->FirstChildElement("status") ? monitor->FirstChildElement("status")->GetText() : "N/A"; mon.status = monitor->FirstChildElement("status") ? monitor->FirstChildElement("status")->GetText() : "N/A";
@@ -1543,7 +1544,7 @@ void parse_ledger_update(trigger_update_xml_t& trigger_update_xml,
if (strTag == "add" || strTag == "modify") { if (strTag == "add" || strTag == "modify") {
parse_terminal_from_data(trigger_update_xml, strTag, data, guid_value); parse_terminal_from_data(trigger_update_xml, strTag, data, guid_value);
} else if (strTag == "delete") { } else if (strTag == "delete") {
terminal_dev delete_terminal; update_dev delete_terminal;
tinyxml2::XMLDocument doc; tinyxml2::XMLDocument doc;
if (doc.Parse(data.c_str()) != tinyxml2::XML_SUCCESS) { if (doc.Parse(data.c_str()) != tinyxml2::XML_SUCCESS) {
@@ -1673,7 +1674,7 @@ int parse_ledger_update_xml(trigger_update_xml_t& trigger_update_xml)
} }
//更新单个台账 //更新单个台账
int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_dev) { int update_one_terminal_ledger(const update_dev& update,terminal_dev& target_dev) {
// 更新基本信息 // 更新基本信息
if (!update.terminal_id.empty()) { if (!update.terminal_id.empty()) {
target_dev.terminal_id = update.terminal_id; target_dev.terminal_id = update.terminal_id;
@@ -1683,14 +1684,14 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
target_dev.terminal_name = update.terminal_name; target_dev.terminal_name = update.terminal_name;
std::cout << "terminal_name: " << target_dev.terminal_name << std::endl; std::cout << "terminal_name: " << target_dev.terminal_name << std::endl;
} }
if (!update.tmnl_factory.empty()) { /*if (!update.tmnl_factory.empty()) {
target_dev.tmnl_factory = update.tmnl_factory; target_dev.tmnl_factory = update.tmnl_factory;
std::cout << "tmnl_factory: " << target_dev.tmnl_factory << std::endl; std::cout << "tmnl_factory: " << target_dev.tmnl_factory << std::endl;
} }
if (!update.tmnl_status.empty()) { if (!update.tmnl_status.empty()) {
target_dev.tmnl_status = update.tmnl_status; target_dev.tmnl_status = update.tmnl_status;
std::cout << "tmnl_status: " << target_dev.tmnl_status << std::endl; std::cout << "tmnl_status: " << target_dev.tmnl_status << std::endl;
} }*/
if (!update.dev_type.empty()) { if (!update.dev_type.empty()) {
target_dev.dev_type = update.dev_type; target_dev.dev_type = update.dev_type;
std::cout << "dev_type: " << target_dev.dev_type << std::endl; std::cout << "dev_type: " << target_dev.dev_type << std::endl;
@@ -1699,20 +1700,20 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
target_dev.processNo = update.processNo; target_dev.processNo = update.processNo;
std::cout << "processNo: " << target_dev.processNo << std::endl; std::cout << "processNo: " << target_dev.processNo << std::endl;
} }
if (!update.dev_series.empty()) { /*if (!update.dev_series.empty()) {
target_dev.dev_series = update.dev_series; target_dev.dev_series = update.dev_series;
std::cout << "dev_series: " << target_dev.dev_series << std::endl; std::cout << "dev_series: " << target_dev.dev_series << std::endl;
} }
if (!update.dev_key.empty()) { if (!update.dev_key.empty()) {
target_dev.dev_key = update.dev_key; target_dev.dev_key = update.dev_key;
std::cout << "dev_key: " << target_dev.dev_key << std::endl; std::cout << "dev_key: " << target_dev.dev_key << std::endl;
} }*/
if (!update.addr_str.empty()) { if (!update.addr_str.empty()) {
target_dev.addr_str = update.addr_str; target_dev.addr_str = update.addr_str;
std::cout << "addr_str: " << target_dev.addr_str << std::endl; std::cout << "addr_str: " << target_dev.addr_str << std::endl;
} }
if (!update.port.empty()) { /*if (!update.port.empty()) {
target_dev.port = update.port; target_dev.port = update.port;
std::cout << "port: " << target_dev.port << std::endl; std::cout << "port: " << target_dev.port << std::endl;
} }
@@ -1742,7 +1743,7 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
std::cerr << "Error: invalid timestamp format." << std::endl; std::cerr << "Error: invalid timestamp format." << std::endl;
return -1; return -1;
} }
} }*/
// 清空旧监测点并重新填充 // 清空旧监测点并重新填充
target_dev.line.clear(); target_dev.line.clear();
@@ -1758,7 +1759,7 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
m.terminal_connect = mon.terminal_connect; m.terminal_connect = mon.terminal_connect;
m.status = mon.status; m.status = mon.status;
m.terminal_id = mon.terminal_id; m.terminal_id = mon.terminal_id;
m.timestamp = mon.timestamp; //m.timestamp = mon.timestamp;
m.CT1 = mon.CT1; m.CT1 = mon.CT1;
m.CT2 = mon.CT2; m.CT2 = mon.CT2;
@@ -1770,7 +1771,7 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
std::cout << "monitor_id " << m.monitor_id << " uses delta wiring." << std::endl; std::cout << "monitor_id " << m.monitor_id << " uses delta wiring." << std::endl;
} }
if (!m.timestamp.empty()) { /*if (!m.timestamp.empty()) {
struct tm timeinfo = {}; struct tm timeinfo = {};
if (sscanf(m.timestamp.c_str(), "%4d-%2d-%2d %2d:%2d:%2d", if (sscanf(m.timestamp.c_str(), "%4d-%2d-%2d %2d:%2d:%2d",
&timeinfo.tm_year, &timeinfo.tm_mon, &timeinfo.tm_mday, &timeinfo.tm_year, &timeinfo.tm_mon, &timeinfo.tm_mday,
@@ -1784,7 +1785,7 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
std::cout << "monitor time (unix): " << m.timestamp << std::endl; std::cout << "monitor time (unix): " << m.timestamp << std::endl;
} }
} }
} }*/
target_dev.line.push_back(m); target_dev.line.push_back(m);
} }
@@ -1799,7 +1800,7 @@ void process_ledger_update(trigger_update_xml_t& ledger_update_xml)
std::cout << "add ledger num: " << ledger_update_xml.new_updates.size() << std::endl; std::cout << "add ledger num: " << ledger_update_xml.new_updates.size() << std::endl;
for (auto it = ledger_update_xml.new_updates.begin(); it != ledger_update_xml.new_updates.end(); ) { for (auto it = ledger_update_xml.new_updates.begin(); it != ledger_update_xml.new_updates.end(); ) {
terminal_dev& new_dev = *it; update_dev& new_dev = *it;
auto found = std::find_if(terminal_devlist.begin(), terminal_devlist.end(), auto found = std::find_if(terminal_devlist.begin(), terminal_devlist.end(),
[&](const terminal_dev& d) { return d.terminal_id == new_dev.terminal_id; }); [&](const terminal_dev& d) { return d.terminal_id == new_dev.terminal_id; });
@@ -1829,17 +1830,20 @@ void process_ledger_update(trigger_update_xml_t& ledger_update_xml)
continue; continue;
} }
if (parse_model_cfg_web_one(target_dev.dev_type).empty()) { /*if (parse_model_cfg_web_one(target_dev.dev_type).empty()) {
send_reply_to_queue(new_dev.guid, "2", send_reply_to_queue(new_dev.guid, "2",
"终端 id: " + new_dev.terminal_id + " 台账更新失败,未找到装置型号"); "终端 id: " + new_dev.terminal_id + " 台账更新失败,未找到装置型号");
++it; ++it;
continue; continue;
} }*/
Set_xml_nodeinfo_one(target_dev.dev_type); //Set_xml_nodeinfo_one(target_dev.dev_type);
init_loggers_bydevid(target_dev.terminal_id); init_loggers_bydevid(target_dev.terminal_id);
terminal_devlist.push_back(target_dev); terminal_devlist.push_back(target_dev);
DeviceInfo device = make_device_from_terminal(target_dev);
ClientManager::instance().add_device(device);
send_reply_to_queue(new_dev.guid, "2", send_reply_to_queue(new_dev.guid, "2",
"终端 id: " + new_dev.terminal_id + " 台账添加成功"); "终端 id: " + new_dev.terminal_id + " 台账添加成功");
@@ -1854,21 +1858,25 @@ void process_ledger_update(trigger_update_xml_t& ledger_update_xml)
[&](const terminal_dev& d) { return d.terminal_id == mod_dev.terminal_id; }); [&](const terminal_dev& d) { return d.terminal_id == mod_dev.terminal_id; });
if (it != terminal_devlist.end()) { if (it != terminal_devlist.end()) {
remove_loggers_by_terminal_id(mod_dev.terminal_id); erase_one_terminals_by_id(mod_dev.terminal_id);
if (update_one_terminal_ledger(mod_dev, *it) != 0) { if (update_one_terminal_ledger(mod_dev, *it) != 0) {
send_reply_to_queue(mod_dev.guid, "2", send_reply_to_queue(mod_dev.guid, "2",
"终端 id: " + mod_dev.terminal_id + " 台账更新失败,写入失败"); "终端 id: " + mod_dev.terminal_id + " 台账更新失败,写入失败");
continue; continue;
} }
if (parse_model_cfg_web_one(it->dev_type).empty()) { /*if (parse_model_cfg_web_one(it->dev_type).empty()) {
send_reply_to_queue(mod_dev.guid, "2", send_reply_to_queue(mod_dev.guid, "2",
"终端 id: " + mod_dev.terminal_id + " 台账更新失败,未找到装置型号"); "终端 id: " + mod_dev.terminal_id + " 台账更新失败,未找到装置型号");
continue; continue;
} }*/
Set_xml_nodeinfo_one(it->dev_type); //Set_xml_nodeinfo_one(it->dev_type);
init_loggers_bydevid(mod_dev.terminal_id); init_loggers_bydevid(mod_dev.terminal_id);
DeviceInfo device = make_device_from_terminal(target_dev);
ClientManager::instance().add_device(device);
send_reply_to_queue(mod_dev.guid, "2", send_reply_to_queue(mod_dev.guid, "2",
"终端 id: " + mod_dev.terminal_id + " 台账修改成功"); "终端 id: " + mod_dev.terminal_id + " 台账修改成功");
} else { } else {
@@ -1885,8 +1893,8 @@ void process_ledger_update(trigger_update_xml_t& ledger_update_xml)
[&](const terminal_dev& d) { return d.terminal_id == del_dev.terminal_id; }); [&](const terminal_dev& d) { return d.terminal_id == del_dev.terminal_id; });
if (it != terminal_devlist.end()) { if (it != terminal_devlist.end()) {
remove_loggers_by_terminal_id(del_dev.terminal_id); erase_one_terminals_by_id(del_dev.terminal_id);
terminal_devlist.erase(it); ClientManager::instance().remove_device(del_dev.terminal_id);
send_reply_to_queue(del_dev.guid, "2", send_reply_to_queue(del_dev.guid, "2",
"终端 id: " + del_dev.terminal_id + " 台账删除成功"); "终端 id: " + del_dev.terminal_id + " 台账删除成功");
} else { } else {
@@ -5234,3 +5242,103 @@ void enqueue_stat_pq(const std::string& max_base64Str,
std::cout << "Successfully assembled tagPqData for line: " std::cout << "Successfully assembled tagPqData for line: "
<< cid << std::endl; << cid << std::endl;
} }
/////////////////////////////////////////////////////////////////////////////////////清空一个装置运行数据
size_t erase_one_terminals_by_id(const std::string& terminal_id) {
// 先对所有匹配项做日志清理
for (const auto& d : terminal_devlist) {
if (d.terminal_id == terminal_id) {
remove_loggers_by_terminal_id(terminal_id);
}
}
// 再统一擦除
const auto old_size = terminal_devlist.size();
terminal_devlist.erase(
std::remove_if(terminal_devlist.begin(), terminal_devlist.end(),
[&](const terminal_dev& d){ return d.terminal_id == terminal_id; }),
terminal_devlist.end());
return old_size - terminal_devlist.size();
}
///////////////////////////////////////////////////////////////////////////////////////////////
static DeviceInfo make_device_from_terminal(const terminal_dev& t) {
DeviceInfo d;
// 基本信息
d.device_id = t.terminal_id;
d.name = t.terminal_name;
d.model = t.dev_type;
d.mac = t.mac;
// status优先按数字解析其次按 online/true/yes/on 识别;默认 0
int status = 0;
if (!t.tmnl_status.empty()) {
bool parsed_num = false;
// 尝试解析为整数
char* endp = nullptr;
long v = std::strtol(t.tmnl_status.c_str(), &endp, 10);
if (endp && *endp == '\0') { parsed_num = true; status = (v != 0) ? 1 : 0; }
if (!parsed_num) {
std::string s = t.tmnl_status;
for (char& c : s) c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
status = (s == "online" || s == "true" || s == "yes" || s == "on" || s == "1") ? 1 : 0;
}
}
d.status = status;
// righttime支持 "1/true/yes/on";默认 false
bool rt = false;
if (!t.Righttime.empty()) {
std::string s = t.Righttime;
for (char& c : s) c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
rt = (s == "1" || s == "true" || s == "yes" || s == "on");
}
d.righttime = rt;
// points
d.points.clear();
d.points.reserve(t.line.size());
for (const auto& m : t.line) {
PointInfo p;
p.point_id = m.monitor_id;
p.name = m.monitor_name;
p.device_id = t.terminal_id;
// nCpuNo从 logical_device_seq 转 ushort非法则置 0
unsigned short cpu_no = 0;
if (!m.logical_device_seq.empty()) {
char* endp = nullptr;
long v = std::strtol(m.logical_device_seq.c_str(), &endp, 10);
if (endp && *endp == '\0' && v >= 0) {
if (v > 0xFFFF) v = 0xFFFF;
cpu_no = static_cast<unsigned short>(v);
}
}
p.nCpuNo = cpu_no;
// 变比与电压等级
p.PT1 = m.PT1;
p.PT2 = m.PT2;
p.CT1 = m.CT1;
p.CT2 = m.CT2;
p.strScale = m.voltage_level;
// 接线方式0-星型 1-角型;支持 "0/1"、包含“角/三角/delta/Δ”
int pttype = 0; // 默认星型
if (!m.terminal_connect.empty()) {
std::string s = m.terminal_connect;
for (char& c : s) c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
if (s == "1" || s.find("") != std::string::npos || s.find("三角") != std::string::npos
|| s.find("delta") != std::string::npos || s.find("") != std::string::npos || s.find("Δ") != std::string::npos) {
pttype = 1;
}
}
p.nPTType = pttype;
d.points.push_back(std::move(p));
}
return d;
}

View File

@@ -752,7 +752,7 @@ int parse_device_cfg_web()
DIY_DEBUGLOG("process", "【DEBUG】前置的%d号进程调用获取到的台账的数量为:%d", g_front_seg_index, count_cfg); DIY_DEBUGLOG("process", "【DEBUG】前置的%d号进程调用获取到的台账的数量为:%d", g_front_seg_index, count_cfg);
if (IED_COUNT < count_cfg) { if (IED_COUNT < count_cfg) {
std::cout << "!!!!!!!!!!single process can not add any ledger unless reboot!!!!!!!" << std::endl; std::cout << "!!!!!!!!!!single process has ledger count more than config!!!!!!!" << std::endl;
//DIY_WARNLOG("process","【WARN】前置的%d号进程获取到的台账的数量大于配置文件中给单个进程配置的台账数量:%d,这个进程将按照获取到的台账的数量来创建台账空间,这个进程不能直接通过台账添加来新增台账,只能通过重启进程或者先删除已有台账再添加台账的方式来添加新台账", g_front_seg_index, IED_COUNT); //DIY_WARNLOG("process","【WARN】前置的%d号进程获取到的台账的数量大于配置文件中给单个进程配置的台账数量:%d,这个进程将按照获取到的台账的数量来创建台账空间,这个进程不能直接通过台账添加来新增台账,只能通过重启进程或者先删除已有台账再添加台账的方式来添加新台账", g_front_seg_index, IED_COUNT);
} else { } else {
//DIY_INFOLOG("process","【NORMAL】前置的%d号进程根据配置文件中给单个进程配置的台账数量:%d来创建台账空间", g_front_seg_index, IED_COUNT); //DIY_INFOLOG("process","【NORMAL】前置的%d号进程根据配置文件中给单个进程配置的台账数量:%d来创建台账空间", g_front_seg_index, IED_COUNT);
@@ -764,17 +764,22 @@ int parse_device_cfg_web()
terminal_devlist.clear(); terminal_devlist.clear();
int idx = 0;
for (const auto& kv : terminal_dev_map) { for (const auto& kv : terminal_dev_map) {
terminal_dev dev = kv.second; // kv.second 是对象,不用判断指针 terminal_dev dev = kv.second; // kv.second 是对象,不用判断指针
//dev.dev_index = static_cast<int>(idx++);
// ======= [新增] 对 terminal_dev 中 web 未返回/未设置字段做统一初始化,避免脏值 ======= // ======= [新增] 对 terminal_dev 中 web 未返回/未设置字段做统一初始化,避免脏值 =======
dev.guid.clear(); // [新增] 业务 guid 初始为空 dev.guid.clear(); // [新增] 业务 guid 初始为空
dev.busytype = 0; // [新增] 业务类型(状态机)默认 0 dev.busytype = 0; // [新增] 业务类型(状态机)默认 0
dev.isbusy = 0; // [新增] 未进行业务 dev.isbusy = 0; // [新增] 未进行业务
dev.busytimecount = 0; // [新增] 业务计时清零 dev.busytimecount = 0; // [新增] 业务计时清零
dev.internal_values.clear(); // [新增] 内部定值清空,等后续业务真实填充 dev.internal_values.clear(); // [新增] 内部定值清空,等后续业务真实填充
dev.dz_internal_info_list.clear(); // [新增] 内部定值信息清空,等后续业务真实填充 dev.dz_internal_info_list.clear(); // [新增] 内部定值信息清空,等后续业务真实填充
dev.control_words.clear();
// ------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------
// ======= [新增] 对每个监测点做必要的内部结构初始化 ======= // ======= [新增] 对每个监测点做必要的内部结构初始化 =======
@@ -786,6 +791,10 @@ int parse_device_cfg_web()
// 定值列表清理,等待后续配置/采集填充 // 定值列表清理,等待后续配置/采集填充
mon.set_values.clear(); // [新增] mon.set_values.clear(); // [新增]
mon.dz_info_list.clear(); // [新增] mon.dz_info_list.clear(); // [新增]
//补招列表清理
mon.recall_list.clear();
mon.recall_list_static.clear();
} }
// ------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------

View File

@@ -179,6 +179,54 @@ class qvvr_event
std::vector<qvvr_file> qvvrfile; //暂态文件组列表 std::vector<qvvr_file> qvvrfile; //暂态文件组列表
}; };
////////////////////////////////////////////////////////////////台账更新用
class update_monitor
{
public:
std::string monitor_id; //监测点id
std::string terminal_id; //监测点的终端id
std::string monitor_name; //监测点名
std::string logical_device_seq; //监测点序号
std::string voltage_level; //监测点电压等级
std::string terminal_connect; //监测点接线方式
std::string timestamp; //更新时间
std::string status; //监测点状态
double PT1; // 电压变比1
double PT2; // 电压变比2
double CT1; // 电流变比1
double CT2; // 电流变比2
};
//终端台账
class update_dev
{
public:
std::string terminal_id;
std::string terminal_name;
std::string org_name;
std::string maint_name;
std::string station_name;
std::string tmnl_factory;
std::string tmnl_status;
std::string dev_type;
std::string dev_key;
std::string dev_series;
std::string addr_str; //装置ip
std::string port; //装置端口
std::string timestamp; //更新时间
std::string Righttime; //对时
std::string processNo;
std::string maxProcessNum;
std::string mac; // 装置MAC地址接口中从addr_str获取因为ip和mac放同一位置
std::vector<ledger_monitor> line;
};
////////////////////////////////////////////////////////////////////台账更新用
//监测点台账 //监测点台账
class ledger_monitor class ledger_monitor
{ {
@@ -213,6 +261,8 @@ public:
class terminal_dev class terminal_dev
{ {
public: public:
//int dev_index;
std::string guid; //正在进行的guid std::string guid; //正在进行的guid
int busytype; //业务类型,使用状态机 int busytype; //业务类型,使用状态机
int isbusy; //业务进行标志 int isbusy; //业务进行标志
@@ -239,7 +289,6 @@ public:
std::string Righttime; //对时 std::string Righttime; //对时
std::string processNo; std::string processNo;
std::string maxProcessNum; std::string maxProcessNum;
std::string mac; // 装置MAC地址接口中从addr_str获取因为ip和mac放同一位置 std::string mac; // 装置MAC地址接口中从addr_str获取因为ip和mac放同一位置
std::vector<ledger_monitor> line; std::vector<ledger_monitor> line;
@@ -400,10 +449,10 @@ public:
#define MAX_UPDATEA_NUM 10 #define MAX_UPDATEA_NUM 10
typedef struct trigger_update_xml_t trigger_update_xml_t; typedef struct trigger_update_xml_t trigger_update_xml_t;
struct trigger_update_xml_t { struct trigger_update_xml_t {
std::vector<terminal_dev> new_updates; std::vector<update_dev> new_updates;
std::vector<terminal_dev> modify_updates; std::vector<update_dev> modify_updates;
std::vector<terminal_dev> delete_updates; std::vector<update_dev> delete_updates;
std::vector<terminal_dev> work_updates; std::vector<update_dev> work_updates;
trigger_update_xml_t() = default; trigger_update_xml_t() = default;
}; };
@@ -673,6 +722,11 @@ void filemenu_cache_put(const std::string& dev_id,
//提取目录信息 //提取目录信息
bool filemenu_cache_take(const std::string& dev_id, std::vector<tag_dir_info>& out); bool filemenu_cache_take(const std::string& dev_id, std::vector<tag_dir_info>& out);
//清空装置台账
size_t erase_one_terminals_by_id(const std::string& terminal_id);
//转换结构
DeviceInfo make_device_from_terminal(const terminal_dev& t);
//小工具 //小工具
inline std::string trim_cstr(const char* s, size_t n) { inline std::string trim_cstr(const char* s, size_t n) {
@@ -750,10 +804,9 @@ void enqueue_stat_pq(const std::string& max_base64Str,
extern int g_front_seg_index; extern int g_front_seg_index;
extern std::string FRONT_INST; extern std::string FRONT_INST;
extern std::string FRONT_PATH; extern std::string FRONT_PATH;
extern std::string WEB_FILEUPLOAD; extern std::string WEB_FILEUPLOAD;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 响应码枚举 // 云平台响应码枚举
enum class ResponseCode : int { enum class ResponseCode : int {
OK = 200, // 请求成功 OK = 200, // 请求成功
ACCEPTED = 201, // 请求被接受,开始处理 ACCEPTED = 201, // 请求被接受,开始处理

View File

@@ -676,7 +676,7 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
send_reply_to_queue(guid, "1", "收到台账更新指令"); send_reply_to_queue(guid, "1", "收到台账更新指令");
if (code_str == "add_terminal" || code_str == "ledger_modify") { if (code_str == "add_terminal" || code_str == "ledger_modify") {
std::cout << "add or update ledger" << std::endl; std::cout << "add or modify ledger" << std::endl;
if (messageBody.contains("data") && messageBody["data"].is_array()) { if (messageBody.contains("data") && messageBody["data"].is_array()) {
for (const auto& item : messageBody["data"]) { for (const auto& item : messageBody["data"]) {
@@ -696,6 +696,9 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
int procNo = item.value("processNo", -1); int procNo = item.value("processNo", -1);
json_data.processNo = std::to_string(procNo); json_data.processNo = std::to_string(procNo);
//int procNum = item.value("maxProcessNum", -1);
//json_data.maxProcessNum = std::to_string(procNum);
//json_data.addr_str = item.value("ip", ""); //json_data.addr_str = item.value("ip", "");
//json_data.port = item.value("port", ""); //json_data.port = item.value("port", "");
//json_data.timestamp = item.value("updateTime", ""); //json_data.timestamp = item.value("updateTime", "");
@@ -713,19 +716,53 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
m.logical_device_seq = monitor_item.value("lineNo", ""); m.logical_device_seq = monitor_item.value("lineNo", "");
m.terminal_connect = monitor_item.value("ptType", ""); m.terminal_connect = monitor_item.value("ptType", "");
//m.timestamp = json_data.timestamp; //m.timestamp = json_data.timestamp;
m.terminal_id = json_data.terminal_id; m.terminal_id = monitor_item.value("deviceId", json_data.terminal_id);
m.CT1 = monitor_item.value("CT1", "");
m.CT2 = monitor_item.value("CT2", "");
m.PT1 = monitor_item.value("PT1", "");
m.PT2 = monitor_item.value("PT2", "");
} }
} }
print_terminal(json_data); print_terminal(json_data);
std::string xmlContent = prepare_update(code_str, json_data, guid); /*std::string xmlContent = prepare_update(code_str, json_data, guid);
if (!xmlContent.empty()) { if (!xmlContent.empty()) {
char nodeid[20]; char nodeid[20];
std::sprintf(nodeid, "%u", g_node_id); std::sprintf(nodeid, "%u", g_node_id);
std::string file_name = output_dir + "/" + nodeid + "_" + std::to_string(g_front_seg_index) + "_" + json_data.terminal_id + "_" + code_str + ".xml"; std::string file_name = output_dir + "/" + nodeid + "_" + std::to_string(g_front_seg_index) + "_" + json_data.terminal_id + "_" + code_str + ".xml";
writeToFile(file_name, xmlContent); writeToFile(file_name, xmlContent);
}*/
if(code_str == "add_terminal"){
init_loggers_bydevid(target_dev.terminal_id);
terminal_devlist.push_back(json_data);
//调用接口添加到通讯列表
DeviceInfo device = make_device_from_terminal(json_data);
ClientManager::instance().add_device(device);
send_reply_to_queue(new_dev.guid, "2",
"终端 id: " + new_dev.terminal_id + " 台账添加成功");
} }
else if(code_str == "ledger_modify"){
if(erase_one_terminals_by_id(json_data.terminal_id) == 1){
init_loggers_bydevid(target_dev.terminal_id);
terminal_devlist.push_back(json_data);
//调用接口添加到通讯列表
DeviceInfo device = make_device_from_terminal(json_data);
ClientManager::instance().add_device(device);
send_reply_to_queue(del_dev.guid, "2",
"终端 id: " + del_dev.terminal_id + " 台账修改成功");
}
else{
send_reply_to_queue(del_dev.guid, "2",
"终端 id: " + del_dev.terminal_id + " 台账修改失败");
}
}
} }
} }
} else if (code_str == "delete_terminal") { } else if (code_str == "delete_terminal") {
@@ -736,12 +773,24 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
auto id = item.value("id", ""); auto id = item.value("id", "");
json_data.terminal_id = id; json_data.terminal_id = id;
std::string xmlContent = prepare_update(code_str, json_data, guid); /*std::string xmlContent = prepare_update(code_str, json_data, guid);
if (!xmlContent.empty()) { if (!xmlContent.empty()) {
char nodeid[20]; char nodeid[20];
std::sprintf(nodeid, "%u", g_node_id); std::sprintf(nodeid, "%u", g_node_id);
std::string file_name = output_dir + "/" + nodeid + "_" + std::to_string(g_front_seg_index) + "_" + json_data.terminal_id + "_delete_terminal.xml"; std::string file_name = output_dir + "/" + nodeid + "_" + std::to_string(g_front_seg_index) + "_" + json_data.terminal_id + "_delete_terminal.xml";
writeToFile(file_name, xmlContent); writeToFile(file_name, xmlContent);
}*/
//直接加锁删除
std::lock_guard<std::mutex> lock(ledgermtx);
if(erase_one_terminals_by_id(json_data.terminal_id) == 1){
lientManager::instance().remove_device(json_data.terminal_id);
send_reply_to_queue(del_dev.guid, "2",
"终端 id: " + del_dev.terminal_id + " 台账删除成功");
}
else{
send_reply_to_queue(del_dev.guid, "2",
"终端 id: " + del_dev.terminal_id + " 台账删除失败");
} }
} }
} }
@@ -1081,48 +1130,51 @@ std::string prepare_update(const std::string& code_str, const terminal_dev& json
add_indent(xmlStream, indentLevel); add_indent(xmlStream, indentLevel);
xmlStream << "<id>" << json_data.terminal_id << "</id>" << std::endl; xmlStream << "<id>" << json_data.terminal_id << "</id>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<ip>" << json_data.addr_str << "</ip>" << std::endl; // Assuming `addr_str` for IP //xmlStream << "<ip>" << json_data.addr_str << "</ip>" << std::endl;
add_indent(xmlStream, indentLevel); add_indent(xmlStream, indentLevel);
xmlStream << "<devType>" << json_data.dev_type << "</devType>" << std::endl; xmlStream << "<devType>" << json_data.dev_type << "</devType>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<maintName>" << json_data.maint_name << "</maintName>" << std::endl; //xmlStream << "<maintName>" << json_data.maint_name << "</maintName>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<orgName>" << json_data.org_name << "</orgName>" << std::endl; //xmlStream << "<orgName>" << json_data.org_name << "</orgName>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<port>" << json_data.port << "</port>" << std::endl; //xmlStream << "<port>" << json_data.port << "</port>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<stationName>" << json_data.station_name << "</stationName>" << std::endl; //xmlStream << "<stationName>" << json_data.station_name << "</stationName>" << std::endl;
add_indent(xmlStream, indentLevel); add_indent(xmlStream, indentLevel);
xmlStream << "<terminalCode>" << json_data.terminal_name << "</terminalCode>" << std::endl; xmlStream << "<terminalCode>" << json_data.terminal_name << "</terminalCode>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<updateTime>" << json_data.timestamp << "</updateTime>" << std::endl; // Assuming `timestamp` //xmlStream << "<updateTime>" << json_data.timestamp << "</updateTime>" << std::endl; // Assuming `timestamp`
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<manufacturer>" << json_data.tmnl_factory << "</manufacturer>" << std::endl; //xmlStream << "<manufacturer>" << json_data.tmnl_factory << "</manufacturer>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<status>" << json_data.tmnl_status << "</status>" << std::endl; //xmlStream << "<status>" << json_data.tmnl_status << "</status>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<series>" << json_data.dev_series << "</series>" << std::endl; //xmlStream << "<series>" << json_data.dev_series << "</series>" << std::endl;
//lnk20250210 //lnk20250210
add_indent(xmlStream, indentLevel); add_indent(xmlStream, indentLevel);
xmlStream << "<processNo>" << json_data.processNo << "</processNo>" << std::endl; xmlStream << "<processNo>" << json_data.processNo << "</processNo>" << std::endl;
add_indent(xmlStream, indentLevel); add_indent(xmlStream, indentLevel);
xmlStream << "<devKey>" << json_data.dev_key << "</devKey>" << std::endl; xmlStream << "<Righttime>" << json_data.Righttime << "</Righttime>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<mac>" << json_data.mac << "</mac>" << std::endl; //xmlStream << "<devKey>" << json_data.dev_key << "</devKey>" << std::endl;
//add_indent(xmlStream, indentLevel);
//xmlStream << "<mac>" << json_data.mac << "</mac>" << std::endl;
// monitorData 部分 // monitorData 部分
for (int i = 0; json_data.line[i].monitor_id[0] != '\0'; i++) { for (int i = 0; json_data.line[i].monitor_id[0] != '\0'; i++) {
@@ -1147,8 +1199,8 @@ std::string prepare_update(const std::string& code_str, const terminal_dev& json
add_indent(xmlStream, indentLevel); add_indent(xmlStream, indentLevel);
xmlStream << "<ptType>" << monitor.terminal_connect << "</ptType>" << std::endl; xmlStream << "<ptType>" << monitor.terminal_connect << "</ptType>" << std::endl;
add_indent(xmlStream, indentLevel); //add_indent(xmlStream, indentLevel);
xmlStream << "<timestamp>" << monitor.timestamp << "</timestamp>" << std::endl; //xmlStream << "<timestamp>" << monitor.timestamp << "</timestamp>" << std::endl;
add_indent(xmlStream, indentLevel); add_indent(xmlStream, indentLevel);
xmlStream << "<terminal_id>" << monitor.terminal_id << "</terminal_id>" << std::endl; xmlStream << "<terminal_id>" << monitor.terminal_id << "</terminal_id>" << std::endl;
@@ -2017,3 +2069,6 @@ void connect_status_update(const std::string& id, int status)
// 调试打印 // 调试打印
std::cout << "[connect_status_update] queued JSON:\n" << j.dump(4) << std::endl; std::cout << "[connect_status_update] queued JSON:\n" << j.dump(4) << std::endl;
} }

View File

@@ -414,6 +414,7 @@ void Worker::printLedgerinshell(const terminal_dev& dev, int fd) {
std::ostringstream os; std::ostringstream os;
os << "\r\x1B[K------------------------------------\n"; os << "\r\x1B[K------------------------------------\n";
//os << "\r\x1B[K|-- dev_index : " << dev.dev_index << "\n";
os << "\r\x1B[K|-- terminal_id : " << dev.terminal_id << "\n"; os << "\r\x1B[K|-- terminal_id : " << dev.terminal_id << "\n";
os << "\r\x1B[K|-- terminal_name : " << dev.terminal_name << "\n"; os << "\r\x1B[K|-- terminal_name : " << dev.terminal_name << "\n";
os << "\r\x1B[K|-- dev_ip : " << dev.addr_str << "\n"; os << "\r\x1B[K|-- dev_ip : " << dev.addr_str << "\n";