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 添加到对应的数组
void add_terminal_to_trigger_update(trigger_update_xml_t& trigger_update_xml,
const std::string& str_tag,
const terminal_dev& work_terminal) {
const update_dev& work_terminal) {
if (str_tag == "add") {
std::cout << "new ledger!!!!" << std::endl;
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& data,
const std::string& guid_value) {
terminal_dev work_terminal;
update_dev work_terminal;
work_terminal.guid = guid_value;
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_name = get_value("terminalCode");
work_terminal.org_name = get_value("orgName");
work_terminal.maint_name = get_value("maintName");
work_terminal.station_name = get_value("stationName");
work_terminal.tmnl_factory = get_value("manufacturer");
//work_terminal.org_name = get_value("orgName");
//work_terminal.maint_name = get_value("maintName");
//work_terminal.station_name = get_value("stationName");
//work_terminal.tmnl_factory = get_value("manufacturer");
work_terminal.tmnl_status = get_value("status");
work_terminal.dev_type = get_value("devType");
work_terminal.dev_key = get_value("devKey");
work_terminal.dev_series = get_value("series");
//work_terminal.dev_key = get_value("devKey");
//work_terminal.dev_series = get_value("series");
work_terminal.processNo = get_value("processNo");
work_terminal.addr_str = get_value("ip");
work_terminal.port = get_value("port");
work_terminal.timestamp = get_value("updateTime");
//work_terminal.addr_str = get_value("ip");
//work_terminal.port = get_value("port");
//work_terminal.timestamp = get_value("updateTime");
work_terminal.Righttime = get_value("Righttime");
work_terminal.mac = get_value("mac");
for (tinyxml2::XMLElement* monitor = root->FirstChildElement("monitorData");
monitor;
monitor = monitor->NextSiblingElement("monitorData")) {
ledger_monitor mon;
update_monitor mon;
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.voltage_level = monitor->FirstChildElement("voltageLevel") ? monitor->FirstChildElement("voltageLevel")->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.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.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") {
parse_terminal_from_data(trigger_update_xml, strTag, data, guid_value);
} else if (strTag == "delete") {
terminal_dev delete_terminal;
update_dev delete_terminal;
tinyxml2::XMLDocument doc;
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()) {
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;
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;
std::cout << "tmnl_factory: " << target_dev.tmnl_factory << std::endl;
}
if (!update.tmnl_status.empty()) {
target_dev.tmnl_status = update.tmnl_status;
std::cout << "tmnl_status: " << target_dev.tmnl_status << std::endl;
}
}*/
if (!update.dev_type.empty()) {
target_dev.dev_type = update.dev_type;
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;
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;
std::cout << "dev_series: " << target_dev.dev_series << std::endl;
}
if (!update.dev_key.empty()) {
target_dev.dev_key = update.dev_key;
std::cout << "dev_key: " << target_dev.dev_key << std::endl;
}
}*/
if (!update.addr_str.empty()) {
target_dev.addr_str = update.addr_str;
std::cout << "addr_str: " << target_dev.addr_str << std::endl;
}
if (!update.port.empty()) {
/*if (!update.port.empty()) {
target_dev.port = update.port;
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;
return -1;
}
}
}*/
// 清空旧监测点并重新填充
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.status = mon.status;
m.terminal_id = mon.terminal_id;
m.timestamp = mon.timestamp;
//m.timestamp = mon.timestamp;
m.CT1 = mon.CT1;
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;
}
if (!m.timestamp.empty()) {
/*if (!m.timestamp.empty()) {
struct tm timeinfo = {};
if (sscanf(m.timestamp.c_str(), "%4d-%2d-%2d %2d:%2d:%2d",
&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;
}
}
}
}*/
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;
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(),
[&](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;
}
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",
"终端 id: " + new_dev.terminal_id + " 台账更新失败,未找到装置型号");
++it;
continue;
}
}*/
Set_xml_nodeinfo_one(target_dev.dev_type);
//Set_xml_nodeinfo_one(target_dev.dev_type);
init_loggers_bydevid(target_dev.terminal_id);
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",
"终端 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; });
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) {
send_reply_to_queue(mod_dev.guid, "2",
"终端 id: " + mod_dev.terminal_id + " 台账更新失败,写入失败");
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",
"终端 id: " + mod_dev.terminal_id + " 台账更新失败,未找到装置型号");
continue;
}
}*/
Set_xml_nodeinfo_one(it->dev_type);
//Set_xml_nodeinfo_one(it->dev_type);
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",
"终端 id: " + mod_dev.terminal_id + " 台账修改成功");
} 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; });
if (it != terminal_devlist.end()) {
remove_loggers_by_terminal_id(del_dev.terminal_id);
terminal_devlist.erase(it);
erase_one_terminals_by_id(del_dev.terminal_id);
ClientManager::instance().remove_device(del_dev.terminal_id);
send_reply_to_queue(del_dev.guid, "2",
"终端 id: " + del_dev.terminal_id + " 台账删除成功");
} else {
@@ -5233,4 +5241,104 @@ void enqueue_stat_pq(const std::string& max_base64Str,
std::cout << "Successfully assembled tagPqData for line: "
<< 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;
}