modify ledger

This commit is contained in:
lnk
2025-06-26 14:39:34 +08:00
parent 3dc54a9b75
commit 4e6ba12b25
7 changed files with 295 additions and 28 deletions

View File

@@ -1244,7 +1244,7 @@ void printTerminalDevMap(const std::map<std::string, terminal_dev>& terminal_dev
std::cout << "Key: " << key
<< ", Terminal ID: " << dev.terminal_id
<< ", Terminal Code: " << dev.terminal_code
<< ", Terminal Code: " << dev.terminal_name
<< ", Organization Name: "<< dev.org_name
<< ", Maintenance Name: " << dev.maint_name
<< ", Station Name: " << dev.station_name
@@ -1258,6 +1258,9 @@ void printTerminalDevMap(const std::map<std::string, terminal_dev>& terminal_dev
<< ", Address: " << dev.addr_str
<< ", Port: " << dev.port
<< ", Timestamp: " << dev.timestamp
<< ", mac: " << dev.mac
<< std::endl;
// 打印监测点信息
@@ -1265,13 +1268,19 @@ void printTerminalDevMap(const std::map<std::string, terminal_dev>& terminal_dev
const auto& m = dev.line[i];
std::cout << " Monitor [" << i << "] "
<< "ID: " << m.monitor_id
<< ", Code: " << m.terminal_code
<< ", Code: " << m.terminal_id
<< ", Name: " << m.monitor_name
<< ", Seq: " << m.logical_device_seq
<< ", Voltage: "<< m.voltage_level
<< ", Connect: "<< m.terminal_connect
<< ", Timestamp:"<< m.timestamp
<< ", Status: " << m.status
<< ", CT1: " << m.CT1
<< ", CT2: " << m.CT2
<< ", PT1: " << m.PT1
<< ", PT2: " << m.PT2
<< std::endl;
}
}
@@ -1357,7 +1366,7 @@ void parse_terminal_from_data(trigger_update_xml_t& trigger_update_xml,
};
work_terminal.terminal_id = get_value("id");
work_terminal.terminal_code = get_value("terminalCode");
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");
@@ -1371,6 +1380,8 @@ void parse_terminal_from_data(trigger_update_xml_t& trigger_update_xml,
work_terminal.port = get_value("port");
work_terminal.timestamp = get_value("updateTime");
work_terminal.mac = get_value("mac");
for (tinyxml2::XMLElement* monitor = root->FirstChildElement("monitorData");
monitor;
monitor = monitor->NextSiblingElement("monitorData")) {
@@ -1381,9 +1392,18 @@ void parse_terminal_from_data(trigger_update_xml_t& trigger_update_xml,
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.terminal_code = monitor->FirstChildElement("terminal_code") ? monitor->FirstChildElement("terminal_code")->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.CT1 = monitor->FirstChildElement("CT1") && monitor->FirstChildElement("CT1")->GetText()
? atof(monitor->FirstChildElement("CT1")->GetText()) : 0.0;
mon.CT2 = monitor->FirstChildElement("CT2") && monitor->FirstChildElement("CT2")->GetText()
? atof(monitor->FirstChildElement("CT2")->GetText()) : 0.0;
mon.PT1 = monitor->FirstChildElement("PT1") && monitor->FirstChildElement("PT1")->GetText()
? atof(monitor->FirstChildElement("PT1")->GetText()) : 0.0;
mon.PT2 = monitor->FirstChildElement("PT2") && monitor->FirstChildElement("PT2")->GetText()
? atof(monitor->FirstChildElement("PT2")->GetText()) : 0.0;
work_terminal.line.push_back(mon);
}
@@ -1536,9 +1556,9 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
target_dev.terminal_id = update.terminal_id;
std::cout << "terminal_id: " << target_dev.terminal_id << std::endl;
}
if (!update.terminal_code.empty()) {
target_dev.terminal_code = update.terminal_code;
std::cout << "terminal_code: " << target_dev.terminal_code << std::endl;
if (!update.terminal_name.empty()) {
target_dev.terminal_name = update.terminal_name;
std::cout << "terminal_name: " << target_dev.terminal_name << std::endl;
}
if (!update.tmnl_factory.empty()) {
target_dev.tmnl_factory = update.tmnl_factory;
@@ -1574,6 +1594,11 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
std::cout << "port: " << target_dev.port << std::endl;
}
if (!update.mac.empty()) {
target_dev.mac = update.mac;
std::cout << "mac: " << target_dev.mac << std::endl;
}
if (!update.timestamp.empty()) {
struct tm timeinfo = {};
if (sscanf(update.timestamp.c_str(), "%4d-%2d-%2d %2d:%2d:%2d",
@@ -1609,9 +1634,14 @@ int update_one_terminal_ledger(const terminal_dev& update,terminal_dev& target_d
m.voltage_level = mon.voltage_level;
m.terminal_connect = mon.terminal_connect;
m.status = mon.status;
m.terminal_code = mon.terminal_code;
m.terminal_id = mon.terminal_id;
m.timestamp = mon.timestamp;
m.CT1 = mon.CT1;
m.CT2 = mon.CT2;
m.PT1 = mon.PT1;
m.PT2 = mon.PT2;
if (m.terminal_connect != "0") {
isdelta_flag = 1;
std::cout << "monitor_id " << m.monitor_id << " uses delta wiring." << std::endl;
@@ -2104,13 +2134,18 @@ void print_monitor(const ledger_monitor& mon) {
auto safe = [](const std::string& s) { return s.empty() ? "N/A" : s; };
std::cout << "Monitor ID: " << safe(mon.monitor_id) << "\n";
std::cout << "Terminal Code: " << safe(mon.terminal_code) << "\n";
std::cout << "Terminal ID: " << safe(mon.terminal_id) << "\n";
std::cout << "Monitor Name: " << safe(mon.monitor_name) << "\n";
std::cout << "Logical Device Sequence: " << safe(mon.logical_device_seq) << "\n";
std::cout << "Voltage Level: " << safe(mon.voltage_level) << "\n";
std::cout << "Terminal Connect: " << safe(mon.terminal_connect) << "\n";
std::cout << "Timestamp: " << safe(mon.timestamp) << "\n";
std::cout << "Status: " << safe(mon.status) << "\n";
std::cout << "CT1: " << mon.CT1 << "\n";
std::cout << "CT2: " << mon.CT2 << "\n";
std::cout << "PT1: " << mon.PT1 << "\n";
std::cout << "PT2: " << mon.PT2 << "\n";
}
void print_terminal(const terminal_dev& tmnl) {
@@ -2118,7 +2153,7 @@ void print_terminal(const terminal_dev& tmnl) {
std::cout << "GUID: " << safe(tmnl.guid) << "\n";
std::cout << "Terminal ID: " << safe(tmnl.terminal_id) << "\n";
std::cout << "Terminal Code: " << safe(tmnl.terminal_code)<< "\n";
std::cout << "Terminal Code: " << safe(tmnl.terminal_name)<< "\n";
std::cout << "Organization Name: "<< safe(tmnl.org_name) << "\n";
std::cout << "Maintenance Name: " << safe(tmnl.maint_name) << "\n";
std::cout << "Station Name: " << safe(tmnl.station_name) << "\n";
@@ -2131,6 +2166,8 @@ void print_terminal(const terminal_dev& tmnl) {
std::cout << "Port: " << safe(tmnl.port) << "\n";
std::cout << "Timestamp: " << safe(tmnl.timestamp) << "\n";
std::cout << "mac: " << safe(tmnl.mac) << "\n";
for (size_t i = 0; i < 10 && !tmnl.line[i].monitor_id.empty(); ++i) {
std::cout << " Monitor " << (i + 1) << ":\n";
print_monitor(tmnl.line[i]);
@@ -2168,7 +2205,7 @@ void print_trigger_update_xml(const trigger_update_xml_t& trigger_update) {
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////解析映射文件
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////解析模板文件
//解析映射文件
bool ParseXMLConfig2(int xml_flag, XmlConfig *cfg, std::list<CTopic*> *ctopiclist, const std::string& path)
@@ -2615,3 +2652,79 @@ void Set_xml_nodeinfo()
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////数据转换函数
// DataArrayItem to_json
void to_json(nlohmann::json& j, const DataArrayItem& d) {
j = nlohmann::json{
{"DataAttr", d.DataAttr},
{"DataTimeSec", d.DataTimeSec},
{"DataTimeUSec", d.DataTimeUSec},
{"DataTag", d.DataTag},
{"Data", d.Data}
};
}
// MsgObj to_json
void to_json(nlohmann::json& j, const MsgObj& m) {
j = nlohmann::json{
{"Cldid", m.Cldid},
{"DataType", m.DataType},
{"DataAttr", m.DataAttr},
{"DsNameIdx", m.DsNameIdx},
{"DataArray", m.DataArray}
};
}
// FullObj to_json
void to_json(nlohmann::json& j, const FullObj& f) {
j = nlohmann::json{
{"Mid", f.Mid},
{"Did", f.Did},
{"Pri", f.Pri},
{"Type", f.Type},
{"Msg", f.Msg}
};
}
std::string generate_json(
int Mid,
int Did,
int Pri,
int Type,
int Cldid,
int DataType,
int DataAttr,
int DsNameIdx,
const std::vector<DataArrayItem>& dataArray //构造出array后调用这个函数
) {
FullObj fobj;
fobj.Mid = Mid;
fobj.Did = Did;
fobj.Pri = Pri;
fobj.Type = Type;
fobj.Msg.Cldid = Cldid;
fobj.Msg.DataType = DataType;
fobj.Msg.DataAttr = DataAttr;
fobj.Msg.DsNameIdx = DsNameIdx;
fobj.Msg.DataArray = dataArray;
nlohmann::json j = fobj;
return j.dump(); // 输出标准 json 字符串
}
void upload_data_test(){
std::vector<DataArrayItem> arr;
arr.push_back({1, 1725477660, 0, 1, "xxxx"});
arr.push_back({2, 1691741340, 0, 1, "yyyy"});
std::string js = generate_json(
-1, 2, 1, 4866, 1, 0, 2, 1, arr
);
std::cout << js << std::endl;
queue_data_t data;
data.monitor_no = 1;
data.strTopic = TOPIC_ALARM;
data.strText = js;
data.mp_id = "test";
std::lock_guard<std::mutex> lock(queue_data_list_mutex);
queue_data_list.push_back(data);
}

View File

@@ -133,7 +133,6 @@ void SendJsonAPI_web(const std::string& strUrl, //接口路径
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////上传文件接口
//处理文件上传响应
@@ -609,7 +608,7 @@ int terminal_ledger_web(std::map<std::string, terminal_dev>& terminal_dev_map,
};
dev.terminal_id = safe_str(item, "id");
dev.addr_str = safe_str(item, "ip");
dev.terminal_code = safe_str(item, "name");
dev.terminal_name = safe_str(item, "name");
dev.org_name = safe_str(item, "org_name");
dev.maint_name = safe_str(item, "maint_name");
dev.station_name = safe_str(item, "stationName");
@@ -623,18 +622,26 @@ int terminal_ledger_web(std::map<std::string, terminal_dev>& terminal_dev_map,
dev.processNo = safe_str(item, "processNo");
dev.maxProcessNum = safe_str(item, "maxProcessNum");
dev.mac = safe_str(item, "mac");//添加mac
if (item.contains("monitorData") && item["monitorData"].is_array()) {
for (auto& mon : item["monitorData"]) {
if (dev.line.size() >= 10) break;
ledger_monitor m;
m.monitor_id = safe_str(mon, "id");
m.terminal_code = safe_str(mon, "terminal_code");
m.terminal_id = safe_str(mon, "terminal_id");
m.monitor_name = safe_str(mon, "name");
m.logical_device_seq = safe_str(mon, "lineNo");
m.voltage_level = safe_str(mon, "voltageLevel");
m.terminal_connect = safe_str(mon, "ptType");
m.timestamp = safe_str(mon, "updateTime");
m.status = safe_str(mon, "status");
m.CT1 = mon.value("CT1", 0.0);
m.CT2 = mon.value("CT2", 0.0);
m.PT1 = mon.value("PT1", 0.0);
m.PT2 = mon.value("PT2", 0.0);
dev.line.push_back(m);
}
}

View File

@@ -6,6 +6,11 @@
#include <list>
#include <array>
#include <map>
#include <mutex>
///////////////////////////////////////////////////////////////////////////////////////////
#include "nlohmann/json.hpp"
///////////////////////////////////////////////////////////////////////////////////////////
@@ -47,23 +52,28 @@ class ledger_monitor
{
public:
std::string monitor_id; //监测点id
std::string terminal_code; //监测点
std::string terminal_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 terminal_dev
{
public:
std::string guid;
std::string guid; //台账更新回复用
std::string terminal_id;
std::string terminal_code;
std::string terminal_name;
std::string org_name;
std::string maint_name;
std::string station_name;
@@ -78,6 +88,8 @@ public:
std::string processNo;
std::string maxProcessNum;
std::string mac; // 装置MAC地址
std::vector<ledger_monitor> line;
};
@@ -314,9 +326,12 @@ bool is_blank(const std::string& str);
void print_terminal(const terminal_dev& tmnl);
void printTerminalDevMap(const std::map<std::string, terminal_dev>& terminal_dev_map);
void upload_data_test();
////////////////////////////////////////////////////////////////////////////////mq
extern std::mutex queue_data_list_mutex;
extern std::list<queue_data_t> queue_data_list;
/////////////////////////////////////////////////////////////////////////////////主函数类声明
@@ -353,6 +368,41 @@ typedef struct {
pthread_mutex_t lock; // 线程专用互斥锁
} thread_info_t;
///////////////////////////////////////////////////////////////////////////////////////上送数据的json格式
// 单条 DataArray 数据
struct DataArrayItem {
int DataAttr;
int DataTimeSec;
int DataTimeUSec;
int DataTag;
std::string Data;
};
// Msg 对象
struct MsgObj {
int Cldid;
int DataType;
int DataAttr;
int DsNameIdx;
std::vector<DataArrayItem> DataArray;
};
// 整体
struct FullObj {
int Mid;
int Did;
int Pri;
int Type;
MsgObj Msg;
};
// nlohmann序列化接口
void to_json(nlohmann::json& j, const DataArrayItem& d);
void to_json(nlohmann::json& j, const MsgObj& m);
void to_json(nlohmann::json& j, const FullObj& f);
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#endif

View File

@@ -218,11 +218,11 @@ std::string get_parent_directory() {
//初始化日志
init_loggers();
//读取模型,下载文件
//读取模型,下载模板文件
parse_model_cfg_web();
//解析文件
Set_xml_nodeinfo();
//解析模板文件
//Set_xml_nodeinfo();
StartFrontThread(); //开启主线程

View File

@@ -754,7 +754,7 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
terminal_dev json_data;
json_data.terminal_id = item.value("id", "");
json_data.terminal_code = item.value("name", "");
json_data.terminal_name = item.value("name", "");
json_data.org_name = item.value("org_name", "");
json_data.maint_name = item.value("maint_name", "");
json_data.station_name = item.value("stationName", "");
@@ -783,7 +783,7 @@ bool parseJsonMessageUD(const std::string& json_str, const std::string& output_d
m.logical_device_seq = monitor_item.value("lineNo", "");
m.terminal_connect = monitor_item.value("ptType", "");
m.timestamp = json_data.timestamp;
m.terminal_code = json_data.terminal_code;
m.terminal_id = json_data.terminal_id;
}
}
@@ -1180,7 +1180,7 @@ std::string prepare_update(const std::string& code_str, const terminal_dev& json
xmlStream << "<stationName>" << json_data.station_name << "</stationName>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<terminalCode>" << json_data.terminal_code << "</terminalCode>" << std::endl;
xmlStream << "<terminalCode>" << json_data.terminal_name << "</terminalCode>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<updateTime>" << json_data.timestamp << "</updateTime>" << std::endl; // Assuming `timestamp`
@@ -1201,6 +1201,9 @@ std::string prepare_update(const std::string& code_str, const terminal_dev& json
add_indent(xmlStream, indentLevel);
xmlStream << "<devKey>" << json_data.dev_key << "</devKey>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<mac>" << json_data.mac << "</mac>" << std::endl;
// monitorData 部分
for (int i = 0; json_data.line[i].monitor_id[0] != '\0'; i++) {
const ledger_monitor& monitor = json_data.line[i];
@@ -1228,9 +1231,21 @@ std::string prepare_update(const std::string& code_str, const terminal_dev& json
xmlStream << "<timestamp>" << monitor.timestamp << "</timestamp>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<terminal_code>" << monitor.terminal_code << "</terminal_code>" << std::endl;
xmlStream << "<terminal_id>" << monitor.terminal_id << "</terminal_id>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<CT1>" << monitor.CT1 << "</CT1>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<CT2>" << monitor.CT2 << "</CT2>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<PT1>" << monitor.PT1 << "</PT1>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<PT2>" << monitor.PT2 << "</PT2>" << std::endl;
add_indent(xmlStream, indentLevel);
xmlStream << "<status>" << monitor.status << "</status>" << std::endl;
indentLevel--;

View File

@@ -281,6 +281,7 @@ extern bool normalOutputEnabled;
if (G_TEST_NUM != 0) {
std::cout << "[PeriodicTask] Executing rocketmq_test_300()\n";
rocketmq_test_300(G_TEST_NUM, g_front_seg_index, G_TEST_TYPE,m_front);
upload_data_test();
}
}
@@ -412,7 +413,7 @@ void Worker::printLedgerinshell(const terminal_dev& dev, int fd) {
std::ostringstream os;
os << "\r\x1B[K------------------------------------\n";
os << "\r\x1B[K|-- terminal_id: " << dev.terminal_id << "\n";
os << "\r\x1B[K|-- terminal_code: " << dev.terminal_code << "\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_port: " << dev.port << "\n";
os << "\r\x1B[K|-- dev_type: " << dev.dev_type << "\n";
@@ -427,6 +428,8 @@ void Worker::printLedgerinshell(const terminal_dev& dev, int fd) {
os << "\r\x1B[K|-- tmnl_status: " << dev.tmnl_status << "\n";
os << "\r\x1B[K|-- timestamp: " << dev.timestamp << "\n";
os << "\r\x1B[K|-- mac: " << dev.mac << "\n";
for (size_t i = 0; i < dev.line.size(); ++i) {
const auto& ld = dev.line[i];
if (ld.monitor_id.empty()) continue;
@@ -434,11 +437,17 @@ void Worker::printLedgerinshell(const terminal_dev& dev, int fd) {
os << "\r\x1B[K |-- monitor_id: " << ld.monitor_id << "\n";
os << "\r\x1B[K |-- monitor_name: " << ld.monitor_name << "\n";
os << "\r\x1B[K |-- logical_device_seq: " << ld.logical_device_seq << "\n";
os << "\r\x1B[K |-- terminal_code: " << ld.terminal_code << "\n";
os << "\r\x1B[K |-- terminal_id: " << ld.terminal_id << "\n";
os << "\r\x1B[K |-- voltage_level: " << ld.voltage_level << "\n";
os << "\r\x1B[K |-- terminal_connect: " << ld.terminal_connect << "\n";
os << "\r\x1B[K |-- status: " << ld.status << "\n";
os << "\r\x1B[K |-- timestamp: " << ld.timestamp << "\n";
os << "\r\x1B[K |-- CT1: " << ld.CT1 << "\n";
os << "\r\x1B[K |-- CT2: " << ld.CT2 << "\n";
os << "\r\x1B[K |-- PT1: " << ld.PT1 << "\n";
os << "\r\x1B[K |-- PT2: " << ld.PT2 << "\n";
}
os << "\r\x1B[K------------------------------------\n";