From 3e87db437e2d1fb3e2643700179ba184de647f5c Mon Sep 17 00:00:00 2001 From: lh <2334563547@qq.com> Date: Wed, 9 Sep 2026 14:12:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(nmNum):=20=E4=BF=AE=E6=AD=A3=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=20Gauge=20Code=20=E8=BA=AB=E4=BB=BD=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 分别统计压力和流量记录中的 Gauge Code - 将空 Code 和同井全部重复 Code 记录标记为身份无效 - 避免重复记录被默认选中后导致数值成果保存失败 --- Src/nmNum/nmData/nmDataAnalyzeManager.cpp | 39 +++++++++++++++-------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp index 81897a9..276281a 100644 --- a/Src/nmNum/nmData/nmDataAnalyzeManager.cpp +++ b/Src/nmNum/nmData/nmDataAnalyzeManager.cpp @@ -16,6 +16,7 @@ #include "ZxDataWell.h" #include "ZxBaseUtil.h" +#include #include #include #include @@ -375,10 +376,10 @@ bool nmDataAnalyzeManager::readFrameworkWellCurves( return false; } - // 第一步:枚举全部压力记录,不再只取第一条。 + // 第一步:读取全部压力记录并统计非空 Code,不在读取顺序中决定身份有效性。 const ZxDataObjectList listGaugeP = pWellData->getChildren(iDataModelType::sTypeDataGaugeP); - QSet setSeenPressureCodes; + QHash mapPressureCodeCounts; for(int nIndex = 0; nIndex < listGaugeP.size(); ++nIndex) { ZxDataGaugeP* pGaugeP = dynamic_cast(listGaugeP[nIndex]); if(pGaugeP == nullptr) { @@ -391,21 +392,26 @@ bool nmDataAnalyzeManager::readFrameworkWellCurves( oRecord.sGaugeTime = pGaugeP->getGaugeTime(); oRecord.eStatus = readBlockAndClassify( pGaugeP->getGaugeData(), oRecord.vecPressurePoints); + if(!oRecord.sGaugeCode.isEmpty()) { + mapPressureCodeCounts.insert(oRecord.sGaugeCode, + mapPressureCodeCounts.value(oRecord.sGaugeCode) + 1); + } + vecPressureRecords.append(oRecord); + } - // 空 Code 或同井重复 Code 属于身份问题,覆盖内容判定结果。 + // 第二步:空 Code 或重复 Code 的全部压力记录都属于身份无效。 + for(int nIndex = 0; nIndex < vecPressureRecords.size(); ++nIndex) { + nmPressureGaugeRecord& oRecord = vecPressureRecords[nIndex]; if(oRecord.sGaugeCode.isEmpty() || - setSeenPressureCodes.contains(oRecord.sGaugeCode)) { + mapPressureCodeCounts.value(oRecord.sGaugeCode) > 1) { oRecord.eStatus = NM_GaugeRecord_InvalidIdentity; - } else { - setSeenPressureCodes.insert(oRecord.sGaugeCode); } - vecPressureRecords.append(oRecord); } - // 第二步:枚举全部流量记录,不再只取第一条。 + // 第三步:读取全部流量记录并统计非空 Code。 const ZxDataObjectList listGaugeF = pWellData->getChildren(iDataModelType::sTypeDataGaugeF); - QSet setSeenFlowCodes; + QHash mapFlowCodeCounts; for(int nIndex = 0; nIndex < listGaugeF.size(); ++nIndex) { ZxDataGaugeF* pGaugeF = dynamic_cast(listGaugeF[nIndex]); if(pGaugeF == nullptr) { @@ -427,15 +433,20 @@ bool nmDataAnalyzeManager::readFrameworkWellCurves( pGaugeF, eWellCategory, oRecord.vecOilPoints, oRecord.vecGasPoints, oRecord.vecWaterPoints); + if(!oRecord.sGaugeCode.isEmpty()) { + mapFlowCodeCounts.insert(oRecord.sGaugeCode, + mapFlowCodeCounts.value(oRecord.sGaugeCode) + 1); + } + vecFlowRecords.append(oRecord); + } - // 空 Code 或同井重复 Code 属于身份问题,覆盖内容判定结果。 + // 第四步:空 Code 或重复 Code 的全部流量记录都属于身份无效。 + for(int nIndex = 0; nIndex < vecFlowRecords.size(); ++nIndex) { + nmFlowGaugeRecord& oRecord = vecFlowRecords[nIndex]; if(oRecord.sGaugeCode.isEmpty() || - setSeenFlowCodes.contains(oRecord.sGaugeCode)) { + mapFlowCodeCounts.value(oRecord.sGaugeCode) > 1) { oRecord.eStatus = NM_GaugeRecord_InvalidIdentity; - } else { - setSeenFlowCodes.insert(oRecord.sGaugeCode); } - vecFlowRecords.append(oRecord); } return true;