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 文件进行匹配
|
||||
for (const auto& fpath : qfile.file_download) {
|
||||
std::string fname = extract_filename1(fpath);
|
||||
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; // 文件与事件匹配成功
|
||||
if (fname.size() >= 4) {
|
||||
std::string ext = fname.substr(fname.size() - 4);
|
||||
std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower);
|
||||
if (ext == ".cfg") {
|
||||
//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(),
|
||||
qfile.file_download.end());
|
||||
// ★新增:上传前拷贝“将要上传的文件列表”,避免锁外用容器引用
|
||||
std::vector<std::string> files_to_send(qfile.file_download.begin(),
|
||||
qfile.file_download.end());
|
||||
|
||||
// ★新增:构造一个临时 qvvr_file,仅用于上传(不改动原结构)
|
||||
qvvr_file tmp_send;
|
||||
tmp_send.file_download.assign(files_to_send.begin(), files_to_send.end());
|
||||
// ★新增:构造一个临时 qvvr_file,仅用于上传(不改动原结构)
|
||||
qvvr_file tmp_send;
|
||||
tmp_send.file_download.assign(files_to_send.begin(), files_to_send.end());
|
||||
|
||||
|
||||
// 发送所有文件(已下载完成)
|
||||
std::string wavepath;
|
||||
// 发送所有文件(已下载完成)
|
||||
std::string wavepath;
|
||||
|
||||
// ★在解锁前,备份“签名”,用于回锁后定位同一个 qfile
|
||||
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());
|
||||
// ★在解锁前,备份“签名”,用于回锁后定位同一个 qfile
|
||||
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());
|
||||
|
||||
// ★修改:把上传与上送 JSON 放到“解锁区间”
|
||||
lock.unlock(); // ★新增:提前解锁
|
||||
// ★修改:把上传与上送 JSON 放到“解锁区间”
|
||||
lock.unlock(); // ★新增:提前解锁
|
||||
|
||||
if (SendAllQvvrFiles(qfile, wavepath)) {
|
||||
//文件发送成功后更新事件
|
||||
if (SendAllQvvrFiles(qfile, wavepath)) {
|
||||
//文件发送成功后更新事件
|
||||
|
||||
transfer_json_qvvr_data(terminal_id,
|
||||
logical_seq,
|
||||
matched.QVVR_Amg,
|
||||
matched.QVVR_PerTime,
|
||||
matched.QVVR_time,
|
||||
matched.QVVR_type,
|
||||
matched.phase,
|
||||
wavepath);
|
||||
transfer_json_qvvr_data(terminal_id,
|
||||
logical_seq,
|
||||
matched.QVVR_Amg,
|
||||
matched.QVVR_PerTime,
|
||||
matched.QVVR_time,
|
||||
matched.QVVR_type,
|
||||
matched.phase,
|
||||
wavepath);
|
||||
|
||||
// ★新增:上传成功后再加锁,准备修改台账
|
||||
lock.lock();
|
||||
// ★新增:上传成功后再加锁,准备修改台账
|
||||
lock.lock();
|
||||
|
||||
// 删除上传成功的文件
|
||||
for (const auto& uploaded_file : qfile.file_download) {
|
||||
if (std::remove(uploaded_file.c_str()) != 0) {
|
||||
std::cerr << "[Cleanup] Failed to delete file: " << uploaded_file << "\n";
|
||||
// 删除上传成功的文件
|
||||
for (const auto& uploaded_file : qfile.file_download) {
|
||||
if (std::remove(uploaded_file.c_str()) != 0) {
|
||||
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 {
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
// ★替换原来的 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 {
|
||||
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 {
|
||||
lock.lock(); // ★新增:失败时补回锁
|
||||
std::cerr << "[update_qvvr_file_download] Failed to send qvvr files for logical_seq=" << logical_seq << std::endl;
|
||||
}
|
||||
}
|
||||
else {
|
||||
lock.lock(); // ★新增:失败时补回锁
|
||||
std::cerr << "[update_qvvr_file_download] Failed to send qvvr files for logical_seq=" << logical_seq << std::endl;
|
||||
std::cout << "[update_qvvr_file_download] No matching qvvr_data found for cfg file: " << fpath << std::endl;
|
||||
}
|
||||
}
|
||||
else {
|
||||
std::cout << "[update_qvvr_file_download] No matching qvvr_data found for cfg file: " << fpath << std::endl;
|
||||
}
|
||||
break; // 只处理第一个 cfg 文件
|
||||
|
||||
break; // 只处理第一个 cfg 文件
|
||||
}//end if ext==.cfg
|
||||
}
|
||||
}
|
||||
else {
|
||||
std::cout << "[update_qvvr_file_download] Filename too short to check extension: " << fname << std::endl;
|
||||
}
|
||||
}//end for file_download
|
||||
}
|
||||
else{
|
||||
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();
|
||||
return true; // 当前文件处理成功
|
||||
}
|
||||
}
|
||||
}//end for qvvrfile
|
||||
|
||||
std::cout << "file name doesnt match any file in this monitor!!!" << std::endl;
|
||||
|
||||
}
|
||||
}
|
||||
}//end for monitor
|
||||
}//end for dev
|
||||
lock.unlock();
|
||||
return false; // 未匹配到终端ID或逻辑序号对应的监测点
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user