add ledger update
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user