fix comtrade file pair
This commit is contained in:
@@ -3320,93 +3320,102 @@ bool update_qvvr_file_download(const std::string& filename_with_mac_in, const st
|
|||||||
// 找到其中的 .cfg 文件进行匹配
|
// 找到其中的 .cfg 文件进行匹配
|
||||||
for (const auto& fpath : qfile.file_download) {
|
for (const auto& fpath : qfile.file_download) {
|
||||||
std::string fname = extract_filename1(fpath);
|
std::string fname = extract_filename1(fpath);
|
||||||
if (fname.size() >= 4 && fname.substr(fname.size() - 4) == ".cfg") {
|
if (fname.size() >= 4) {
|
||||||
// 提取文件时标和监测点事件的时标匹配
|
std::string ext = fname.substr(fname.size() - 4);
|
||||||
qvvr_data matched;
|
std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
|
||||||
if (compare_qvvr_and_file(fpath, monitor.qvvrevent.qvvrdata,matched)) {
|
if (ext == ".cfg") {
|
||||||
qfile.is_pair = true; // 文件与事件匹配成功
|
//if (fname.size() >= 4 && fname.substr(fname.size() - 4) == ".cfg") {
|
||||||
|
// 提取文件时标和监测点事件的时标匹配
|
||||||
|
qvvr_data matched;
|
||||||
|
if (compare_qvvr_and_file(fpath, monitor.qvvrevent.qvvrdata,matched)) {
|
||||||
|
qfile.is_pair = true; // 文件与事件匹配成功
|
||||||
|
|
||||||
// ★新增:上传前拷贝“将要上传的文件列表”,避免锁外用容器引用
|
// ★新增:上传前拷贝“将要上传的文件列表”,避免锁外用容器引用
|
||||||
std::vector<std::string> files_to_send(qfile.file_download.begin(),
|
std::vector<std::string> files_to_send(qfile.file_download.begin(),
|
||||||
qfile.file_download.end());
|
qfile.file_download.end());
|
||||||
|
|
||||||
// ★新增:构造一个临时 qvvr_file,仅用于上传(不改动原结构)
|
// ★新增:构造一个临时 qvvr_file,仅用于上传(不改动原结构)
|
||||||
qvvr_file tmp_send;
|
qvvr_file tmp_send;
|
||||||
tmp_send.file_download.assign(files_to_send.begin(), files_to_send.end());
|
tmp_send.file_download.assign(files_to_send.begin(), files_to_send.end());
|
||||||
|
|
||||||
|
|
||||||
// 发送所有文件(已下载完成)
|
// 发送所有文件(已下载完成)
|
||||||
std::string wavepath;
|
std::string wavepath;
|
||||||
|
|
||||||
// ★在解锁前,备份“签名”,用于回锁后定位同一个 qfile
|
// ★在解锁前,备份“签名”,用于回锁后定位同一个 qfile
|
||||||
std::set<std::string> sig_names(qfile.file_name.begin(), qfile.file_name.end());
|
std::set<std::string> sig_names(qfile.file_name.begin(), qfile.file_name.end());
|
||||||
std::set<std::string> sig_downs(qfile.file_download.begin(), qfile.file_download.end());
|
std::set<std::string> sig_downs(qfile.file_download.begin(), qfile.file_download.end());
|
||||||
|
|
||||||
// ★修改:把上传与上送 JSON 放到“解锁区间”
|
// ★修改:把上传与上送 JSON 放到“解锁区间”
|
||||||
lock.unlock(); // ★新增:提前解锁
|
lock.unlock(); // ★新增:提前解锁
|
||||||
|
|
||||||
if (SendAllQvvrFiles(qfile, wavepath)) {
|
if (SendAllQvvrFiles(qfile, wavepath)) {
|
||||||
//文件发送成功后更新事件
|
//文件发送成功后更新事件
|
||||||
|
|
||||||
transfer_json_qvvr_data(terminal_id,
|
transfer_json_qvvr_data(terminal_id,
|
||||||
logical_seq,
|
logical_seq,
|
||||||
matched.QVVR_Amg,
|
matched.QVVR_Amg,
|
||||||
matched.QVVR_PerTime,
|
matched.QVVR_PerTime,
|
||||||
matched.QVVR_time,
|
matched.QVVR_time,
|
||||||
matched.QVVR_type,
|
matched.QVVR_type,
|
||||||
matched.phase,
|
matched.phase,
|
||||||
wavepath);
|
wavepath);
|
||||||
|
|
||||||
// ★新增:上传成功后再加锁,准备修改台账
|
// ★新增:上传成功后再加锁,准备修改台账
|
||||||
lock.lock();
|
lock.lock();
|
||||||
|
|
||||||
// 删除上传成功的文件
|
// 删除上传成功的文件
|
||||||
for (const auto& uploaded_file : qfile.file_download) {
|
for (const auto& uploaded_file : qfile.file_download) {
|
||||||
if (std::remove(uploaded_file.c_str()) != 0) {
|
if (std::remove(uploaded_file.c_str()) != 0) {
|
||||||
std::cerr << "[Cleanup] Failed to delete file: " << uploaded_file << "\n";
|
std::cerr << "[Cleanup] Failed to delete file: " << uploaded_file << "\n";
|
||||||
|
} else {
|
||||||
|
std::cout << "[Cleanup] Deleted uploaded file: " << uploaded_file << "\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ★替换原来的 i<size 判断为:按签名查找当前容器里的那一条
|
||||||
|
auto it_qf = std::find_if(monitor.qvvrevent.qvvrfile.begin(),
|
||||||
|
monitor.qvvrevent.qvvrfile.end(),
|
||||||
|
[&](const qvvr_file& x){
|
||||||
|
std::set<std::string> n(x.file_name.begin(), x.file_name.end());
|
||||||
|
std::set<std::string> d(x.file_download.begin(), x.file_download.end());
|
||||||
|
return n==sig_names && d==sig_downs;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it_qf != monitor.qvvrevent.qvvrfile.end()) {
|
||||||
|
monitor.qvvrevent.qvvrfile.erase(it_qf); // ✔ 删到同一条
|
||||||
} else {
|
} else {
|
||||||
std::cout << "[Cleanup] Deleted uploaded file: " << uploaded_file << "\n";
|
std::cerr << "[Cleanup] qvvrfile changed; target group not found, skip erase\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
//清除暂态事件
|
||||||
|
auto it = std::find_if(
|
||||||
|
monitor.qvvrevent.qvvrdata.begin(),
|
||||||
|
monitor.qvvrevent.qvvrdata.end(),
|
||||||
|
[&](const qvvr_data& d) {
|
||||||
|
return d.QVVR_time == matched.QVVR_time;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (it != monitor.qvvrevent.qvvrdata.end()) {
|
||||||
|
monitor.qvvrevent.qvvrdata.erase(it);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
// ★替换原来的 i<size 判断为:按签名查找当前容器里的那一条
|
lock.lock(); // ★新增:失败时补回锁
|
||||||
auto it_qf = std::find_if(monitor.qvvrevent.qvvrfile.begin(),
|
std::cerr << "[update_qvvr_file_download] Failed to send qvvr files for logical_seq=" << logical_seq << std::endl;
|
||||||
monitor.qvvrevent.qvvrfile.end(),
|
|
||||||
[&](const qvvr_file& x){
|
|
||||||
std::set<std::string> n(x.file_name.begin(), x.file_name.end());
|
|
||||||
std::set<std::string> d(x.file_download.begin(), x.file_download.end());
|
|
||||||
return n==sig_names && d==sig_downs;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (it_qf != monitor.qvvrevent.qvvrfile.end()) {
|
|
||||||
monitor.qvvrevent.qvvrfile.erase(it_qf); // ✔ 删到同一条
|
|
||||||
} else {
|
|
||||||
std::cerr << "[Cleanup] qvvrfile changed; target group not found, skip erase\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
//清除暂态事件
|
|
||||||
auto it = std::find_if(
|
|
||||||
monitor.qvvrevent.qvvrdata.begin(),
|
|
||||||
monitor.qvvrevent.qvvrdata.end(),
|
|
||||||
[&](const qvvr_data& d) {
|
|
||||||
return d.QVVR_time == matched.QVVR_time;
|
|
||||||
});
|
|
||||||
|
|
||||||
if (it != monitor.qvvrevent.qvvrdata.end()) {
|
|
||||||
monitor.qvvrevent.qvvrdata.erase(it);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lock.lock(); // ★新增:失败时补回锁
|
std::cout << "[update_qvvr_file_download] No matching qvvr_data found for cfg file: " << fpath << std::endl;
|
||||||
std::cerr << "[update_qvvr_file_download] Failed to send qvvr files for logical_seq=" << logical_seq << std::endl;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else {
|
break; // 只处理第一个 cfg 文件
|
||||||
std::cout << "[update_qvvr_file_download] No matching qvvr_data found for cfg file: " << fpath << std::endl;
|
}//end if ext==.cfg
|
||||||
}
|
|
||||||
break; // 只处理第一个 cfg 文件
|
|
||||||
}
|
}
|
||||||
}
|
else {
|
||||||
|
std::cout << "[update_qvvr_file_download] Filename too short to check extension: " << fname << std::endl;
|
||||||
|
}
|
||||||
|
}//end for file_download
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
std::cout << "qvvr file still imcomplete!!!" << std::endl;
|
std::cout << "qvvr file still imcomplete!!!" << std::endl;
|
||||||
@@ -3414,12 +3423,12 @@ bool update_qvvr_file_download(const std::string& filename_with_mac_in, const st
|
|||||||
lock.unlock();
|
lock.unlock();
|
||||||
return true; // 当前文件处理成功
|
return true; // 当前文件处理成功
|
||||||
}
|
}
|
||||||
}
|
}//end for qvvrfile
|
||||||
|
|
||||||
std::cout << "file name doesnt match any file in this monitor!!!" << std::endl;
|
std::cout << "file name doesnt match any file in this monitor!!!" << std::endl;
|
||||||
|
|
||||||
}
|
}//end for monitor
|
||||||
}
|
}//end for dev
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
return false; // 未匹配到终端ID或逻辑序号对应的监测点
|
return false; // 未匹配到终端ID或逻辑序号对应的监测点
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user