feat: 井参数前缀改用wellCode,替换硬编码为动态数据

- nmDataWellBase新增m_wellCode字段,存储ZxDataWell::getCode()作为项目级唯一标识
- nmDataAnalyzeManager初始化井数据时同步写入wellCode(6处)
- nmGridRowUtils前缀匹配从W{数字}改为wellCode最长匹配
- nmWxParaPropertyPebi接口签名QMap<int,QString>改为QMap<QString,QString>
- nmSubWndUtils两处调用点从硬编码测试数据改为从getWellDataList()动态组装
feature/nm-para-property-20260615
lh 3 weeks ago
parent 3609bb5df1
commit 3f4c4a2566

@ -56,6 +56,9 @@ public:
void setWellName(const QString& name); void setWellName(const QString& name);
QString getWellName() const; QString getWellName() const;
void setWellCode(const QString& code);
QString getWellCode() const;
void setX(const nmDataAttribute& attr); void setX(const nmDataAttribute& attr);
nmDataAttribute& getX(); // 修改为返回引用 nmDataAttribute& getX(); // 修改为返回引用
@ -200,6 +203,7 @@ public:
protected: protected:
QString m_wellName; // 井名 QString m_wellName; // 井名
QString m_wellCode; // 井编码项目级唯一标识来自ZxDataWell::getCode()
// Location---位置 // Location---位置
nmDataAttribute m_inputWellHead; //井口坐标输入 nmDataAttribute m_inputWellHead; //井口坐标输入

@ -90,9 +90,9 @@ public:
// 多井分组支持 // 多井分组支持
// ================================================================ // ================================================================
/// @brief 设置井名映射永久ID → 显示名) /// @brief 设置井信息映射wellCode → 显示名)
/// @param map 井ID到显示名称的映射如 {0: "Well-1", 3: "测试井A"} /// @param map wellCode到显示名称的映射如 {"W001": "Well-1", "W002": "测试井A"}
void setWellNames(QMap<int, QString> map); void setWellNames(QMap<QString, QString> map);
// ================================================================ // ================================================================
// 序列化 // 序列化
@ -154,15 +154,15 @@ protected:
/// @brief 将参数列表拆分为储层参数和井参数 /// @brief 将参数列表拆分为储层参数和井参数
/// @param listParas (in) 完整的参数列表 /// @param listParas (in) 完整的参数列表
/// @param listRes (out) 储层参数(无前缀) /// @param listRes (out) 储层参数(无前缀)
/// @param mapWellParas (out) 井ID → 该井的参数列表(已剥掉前缀) /// @param mapWellParas (out) wellCode → 该井的参数列表(已剥掉前缀)
void splitWellParas(QStringList listParas, void splitWellParas(QStringList listParas,
QStringList& listRes, QStringList& listRes,
QMap<int, QStringList>& mapWellParas); QMap<QString, QStringList>& mapWellParas);
/// @brief 为每口井创建 Group 分组并填充参数项 /// @brief 为每口井创建 Group 分组并填充参数项
/// @param mapWellParas 井ID → 参数列表(已剥掉前缀) /// @param mapWellParas wellCode → 参数列表(已剥掉前缀)
/// @param bDnMode 是否为设计模式 /// @param bDnMode 是否为设计模式
void buildWellGroups(QMap<int, QStringList>& mapWellParas, bool bDnMode); void buildWellGroups(QMap<QString, QStringList>& mapWellParas, bool bDnMode);
public slots: public slots:
@ -174,8 +174,8 @@ public slots:
private: private:
/// @brief 井名映射(永久ID → 显示名) /// @brief 井名映射(wellCode → 显示名)
QMap<int, QString> m_mapWellNames; QMap<QString, QString> m_mapWellNames;
private slots: private slots:

@ -27,7 +27,7 @@ public:
/// @note 参数列表必须是在系统中配置的参数listParas已经包括了显示顺序 /// @note 参数列表必须是在系统中配置的参数listParas已经包括了显示顺序
/// 但对于层级,由系统配置来决定 /// 但对于层级,由系统配置来决定
virtual void refreshUIs(QStringList& listParas, bool bReserveOlds = true, virtual void refreshUIs(QStringList& listParas, bool bReserveOlds = true,
QMap<int, QString> mapWellNames = QMap<int, QString>()); QMap<QString, QString> mapWellNames = QMap<QString, QString>());
// 允许备份/恢复原有的参数内容 // 允许备份/恢复原有的参数内容
virtual void backupOldParas(QMap<QString, QVariant>& map, virtual void backupOldParas(QMap<QString, QVariant>& map,

@ -902,6 +902,7 @@ void nmDataAnalyzeManager::initCurWellData()
} }
pVerticalWell->setWellName(pWellData->getName()); pVerticalWell->setWellName(pWellData->getName());
pVerticalWell->setWellCode(pWellData->getCode());
nmDataAttribute tempAttr = pVerticalWell->getX(); nmDataAttribute tempAttr = pVerticalWell->getX();
tempAttr.setValue(pWellData->getLocationX()); tempAttr.setValue(pWellData->getLocationX());
pVerticalWell->setX(tempAttr); pVerticalWell->setX(tempAttr);
@ -939,6 +940,7 @@ void nmDataAnalyzeManager::initCurWellData()
} }
pVFracturedWell->setWellName(pWellData->getName()); pVFracturedWell->setWellName(pWellData->getName());
pVFracturedWell->setWellCode(pWellData->getCode());
nmDataAttribute tempAttr = pVFracturedWell->getX(); nmDataAttribute tempAttr = pVFracturedWell->getX();
tempAttr.setValue(pWellData->getLocationX()); tempAttr.setValue(pWellData->getLocationX());
pVFracturedWell->setX(tempAttr); pVFracturedWell->setX(tempAttr);
@ -979,6 +981,7 @@ void nmDataAnalyzeManager::initCurWellData()
} }
pHFracturedWell->setWellName(pWellData->getName()); pHFracturedWell->setWellName(pWellData->getName());
pHFracturedWell->setWellCode(pWellData->getCode());
nmDataAttribute tempAttr = pHFracturedWell->getX(); nmDataAttribute tempAttr = pHFracturedWell->getX();
tempAttr.setValue(pWellData->getLocationX()); tempAttr.setValue(pWellData->getLocationX());
pHFracturedWell->setX(tempAttr); pHFracturedWell->setX(tempAttr);
@ -1178,6 +1181,7 @@ void nmDataAnalyzeManager::appendWellData(ZxDataWell* pWellData)
} }
pVerticalWell->setWellName(pWellData->getName()); pVerticalWell->setWellName(pWellData->getName());
pVerticalWell->setWellCode(pWellData->getCode());
nmDataAttribute tempAttr = pVerticalWell->getX(); nmDataAttribute tempAttr = pVerticalWell->getX();
tempAttr.setValue(pWellData->getLocationX()); tempAttr.setValue(pWellData->getLocationX());
pVerticalWell->setX(tempAttr); pVerticalWell->setX(tempAttr);
@ -1204,6 +1208,7 @@ void nmDataAnalyzeManager::appendWellData(ZxDataWell* pWellData)
} }
pVFracturedWell->setWellName(pWellData->getName()); pVFracturedWell->setWellName(pWellData->getName());
pVFracturedWell->setWellCode(pWellData->getCode());
nmDataAttribute tempAttr = pVFracturedWell->getX(); nmDataAttribute tempAttr = pVFracturedWell->getX();
tempAttr.setValue(pWellData->getLocationX()); tempAttr.setValue(pWellData->getLocationX());
pVFracturedWell->setX(tempAttr); pVFracturedWell->setX(tempAttr);
@ -1232,6 +1237,7 @@ void nmDataAnalyzeManager::appendWellData(ZxDataWell* pWellData)
} }
pHFracturedWell->setWellName(pWellData->getName()); pHFracturedWell->setWellName(pWellData->getName());
pHFracturedWell->setWellCode(pWellData->getCode());
nmDataAttribute tempAttr = pHFracturedWell->getX(); nmDataAttribute tempAttr = pHFracturedWell->getX();
tempAttr.setValue(pWellData->getLocationX()); tempAttr.setValue(pWellData->getLocationX());
pHFracturedWell->setX(tempAttr); pHFracturedWell->setX(tempAttr);

@ -88,6 +88,7 @@ nmDataWellBase& nmDataWellBase::operator=(const nmDataWellBase& other)
{ {
if(this != &other) { if(this != &other) {
m_wellName = other.m_wellName; m_wellName = other.m_wellName;
m_wellCode = other.m_wellCode;
m_x = other.m_x; m_x = other.m_x;
m_y = other.m_y; m_y = other.m_y;
m_radius = other.m_radius; m_radius = other.m_radius;
@ -150,6 +151,9 @@ rapidjson::Value nmDataWellBase::ToJsonValue(rapidjson::Document::AllocatorType&
// 序列化名称 // 序列化名称
wellObject.AddMember("WellName", rapidjson::Value(m_wellName.toStdString().c_str(), allocator).Move(), allocator); wellObject.AddMember("WellName", rapidjson::Value(m_wellName.toStdString().c_str(), allocator).Move(), allocator);
// 序列化井编码
wellObject.AddMember("WellCode", rapidjson::Value(m_wellCode.toStdString().c_str(), allocator).Move(), allocator);
// 序列化井类型 // 序列化井类型
wellObject.AddMember("WellType", rapidjson::Value(static_cast<int>(m_eWellType)), allocator); wellObject.AddMember("WellType", rapidjson::Value(static_cast<int>(m_eWellType)), allocator);
@ -204,6 +208,11 @@ void nmDataWellBase::FromJsonValue(const rapidjson::Value& jsonValue)
m_wellName = QString::fromUtf8(jsonValue["WellName"].GetString()); m_wellName = QString::fromUtf8(jsonValue["WellName"].GetString());
} }
// 反序列化井编码
if(jsonValue.HasMember("WellCode") && jsonValue["WellCode"].IsString()) {
m_wellCode = QString::fromUtf8(jsonValue["WellCode"].GetString());
}
// 反序列化井类型 (m_eWellType) // 反序列化井类型 (m_eWellType)
if(jsonValue.HasMember("WellType") && jsonValue["WellType"].IsInt()) { if(jsonValue.HasMember("WellType") && jsonValue["WellType"].IsInt()) {
m_eWellType = static_cast<NM_WELL_MODEL>(jsonValue["WellType"].GetInt()); m_eWellType = static_cast<NM_WELL_MODEL>(jsonValue["WellType"].GetInt());
@ -400,6 +409,16 @@ QString nmDataWellBase::getWellName() const
return m_wellName; return m_wellName;
} }
void nmDataWellBase::setWellCode(const QString& code)
{
m_wellCode = code;
}
QString nmDataWellBase::getWellCode() const
{
return m_wellCode;
}
void nmDataWellBase::setX(const nmDataAttribute& attr) void nmDataWellBase::setX(const nmDataAttribute& attr)
{ {
m_x = attr; m_x = attr;

@ -3,6 +3,12 @@
#include "iParameter.h" #include "iParameter.h"
#include "iSysParaHelper.h" #include "iSysParaHelper.h"
// 按字符串长度降序比较(用于最长前缀优先匹配)
static bool longerStringFirst(const QString& a, const QString& b)
{
return a.length() > b.length();
}
// ================================================================ // ================================================================
// 构造与析构 // 构造与析构
// ================================================================ // ================================================================
@ -26,7 +32,7 @@ void nmGridRowUtils::initUI()
iGridRowUtils::initUI(); iGridRowUtils::initUI();
} }
void nmGridRowUtils::setWellNames(QMap<int, QString> map) void nmGridRowUtils::setWellNames(QMap<QString, QString> map)
{ {
m_mapWellNames = map; m_mapWellNames = map;
} }
@ -37,7 +43,7 @@ bool nmGridRowUtils::buildRowUtils(QStringList listParas,
{ {
// 分离储层参数和井参数 // 分离储层参数和井参数
QStringList listRes; QStringList listRes;
QMap<int, QStringList> mapWellParas; QMap<QString, QStringList> mapWellParas;
splitWellParas(listParas, listRes, mapWellParas); splitWellParas(listParas, listRes, mapWellParas);
// 构建储层参数(基类处理) // 构建储层参数(基类处理)
@ -210,62 +216,61 @@ void nmGridRowUtils::bindItems()
void nmGridRowUtils::splitWellParas(QStringList listParas, void nmGridRowUtils::splitWellParas(QStringList listParas,
QStringList& listRes, QStringList& listRes,
QMap<int, QStringList>& mapWellParas) QMap<QString, QStringList>& mapWellParas)
{ {
listRes.clear(); listRes.clear();
mapWellParas.clear(); mapWellParas.clear();
// 按长度降序排列wellCode确保最长匹配优先
QList<QString> listCodes = m_mapWellNames.keys();
qSort(listCodes.begin(), listCodes.end(), longerStringFirst);
foreach (QString sPara, listParas) foreach (QString sPara, listParas)
{ {
// 检查是否匹配 "WN_" 格式N为井永久ID bool bMatched = false;
if (sPara.length() >= 2 foreach (QString sCode, listCodes)
&& sPara.at(0).toUpper() == 'W'
&& sPara.at(1).isDigit())
{ {
// 提取井ID QString sPrefix = sCode + "_";
int i = 1; if (sPara.startsWith(sPrefix))
while (i < sPara.length() && sPara.at(i).isDigit())
{ {
i++; QString sBaseName = sPara.mid(sPrefix.length());
} mapWellParas[sCode] << sBaseName;
if (i < sPara.length() && sPara.at(i) == '_') bMatched = true;
{ break;
int nWellId = sPara.mid(1, i - 1).toInt();
QString sBaseName = sPara.mid(i + 1); // 剥掉 "WN_" 前缀
mapWellParas[nWellId] << sBaseName;
continue;
} }
} }
// 非井参数,归入储层 if (!bMatched)
listRes << sPara; {
listRes << sPara;
}
} }
} }
void nmGridRowUtils::buildWellGroups(QMap<int, QStringList>& mapWellParas, void nmGridRowUtils::buildWellGroups(QMap<QString, QStringList>& mapWellParas,
bool bDnMode) bool bDnMode)
{ {
bool bProperOrder = true; bool bProperOrder = true;
// 按井ID排序遍历 // 按wellCode排序遍历
QList<int> listIds = mapWellParas.keys(); QList<QString> listCodes = mapWellParas.keys();
qSort(listIds); qSort(listCodes);
foreach (int nWellId, listIds) foreach (QString sCode, listCodes)
{ {
QStringList listParas = mapWellParas[nWellId]; QStringList listParas = mapWellParas[sCode];
if (listParas.isEmpty()) if (listParas.isEmpty())
{ {
continue; continue;
} }
// 井前缀,如 "W0_" // 井前缀,如 "W001_"
QString sPrefix = QString("W%1_").arg(nWellId); QString sPrefix = sCode + "_";
// 显示名称 // 显示名称
QString sWellName = tr("Well #%1").arg(nWellId); QString sWellName = sCode;
if (m_mapWellNames.contains(nWellId)) if (m_mapWellNames.contains(sCode))
{ {
sWellName = m_mapWellNames[nWellId]; sWellName = m_mapWellNames[sCode];
} }
// 创建井分组(纯标题,不需要编辑器) // 创建井分组(纯标题,不需要编辑器)

@ -591,13 +591,28 @@ bool nmSubWndUtils::fillNmDockWxs(iSubWnd* pSubWnd)
QStringList listParas; QStringList listParas;
listParas << "h" << "Pi" << "K" << "phi" << "Cti" << "Cf" << "Soi" << "Swi"; listParas << "h" << "Pi" << "K" << "phi" << "Cti" << "Cf" << "Soi" << "Swi";
// 测试井参数(第一版显示验证,后续改为从数据层动态组装) // 从数据层动态组装井参数
listParas << "W0_W_X" << "W0_W_Y" << "W0_W_Rw" << "W0_W_Skin" << "W0_W_C"; QVector<nmDataWellBase*> listWells = pDataManager->getWellDataList();
listParas << "W1_W_X" << "W1_W_Y" << "W1_W_Rw" << "W1_W_Skin" << "W1_W_C"; QMap<QString, QString> mapWellNames;
foreach (nmDataWellBase* pWell, listWells)
{
QString sCode = pWell->getWellCode();
if (sCode.isEmpty())
continue;
mapWellNames[sCode] = pWell->getWellName();
listParas << sCode + "_W_X";
listParas << sCode + "_W_Y";
listParas << sCode + "_W_Rw";
listParas << sCode + "_W_C";
QMap<int, QString> mapWellNames; // Skin 来自第一个射孔段
mapWellNames[0] = tr("Well-1"); if (pWell->getPerforationCount() > 0)
mapWellNames[1] = tr("Well-2"); {
listParas << sCode + "_W_Skin";
}
}
pParaWx->refreshUIs(listParas, true, mapWellNames); pParaWx->refreshUIs(listParas, true, mapWellNames);
@ -883,13 +898,28 @@ bool nmSubWndUtils::loadRsts(iSubWnd* pSubWnd, \
QStringList listParas; QStringList listParas;
listParas << "h" << "Pi" << "K" << "phi" << "Cti" << "Cf" << "Soi" << "Swi"; listParas << "h" << "Pi" << "K" << "phi" << "Cti" << "Cf" << "Soi" << "Swi";
// 测试井参数(第一版显示验证,后续改为从数据层动态组装) // 从数据层动态组装井参数
listParas << "W0_W_X" << "W0_W_Y" << "W0_W_Rw" << "W0_W_Skin" << "W0_W_C"; QVector<nmDataWellBase*> listWells = pDataManager->getWellDataList();
listParas << "W1_W_X" << "W1_W_Y" << "W1_W_Rw" << "W1_W_Skin" << "W1_W_C"; QMap<QString, QString> mapWellNames;
foreach (nmDataWellBase* pWell, listWells)
{
QString sCode = pWell->getWellCode();
if (sCode.isEmpty())
continue;
mapWellNames[sCode] = pWell->getWellName();
listParas << sCode + "_W_X";
listParas << sCode + "_W_Y";
listParas << sCode + "_W_Rw";
listParas << sCode + "_W_C";
QMap<int, QString> mapWellNames; // Skin 来自第一个射孔段
mapWellNames[0] = tr("Well-1"); if (pWell->getPerforationCount() > 0)
mapWellNames[1] = tr("Well-2"); {
listParas << sCode + "_W_Skin";
}
}
pParaWx->refreshUIs(listParas, true, mapWellNames); pParaWx->refreshUIs(listParas, true, mapWellNames);

@ -86,7 +86,7 @@ void nmWxParaPropertyPebi::initUI_HelpBox()
} }
void nmWxParaPropertyPebi::refreshUIs(QStringList& listParas, bool bReserveOlds /*= true*/, void nmWxParaPropertyPebi::refreshUIs(QStringList& listParas, bool bReserveOlds /*= true*/,
QMap<int, QString> mapWellNames /*= QMap<int, QString>()*/) QMap<QString, QString> mapWellNames /*= QMap<QString, QString>()*/)
{ {
if (nullptr == m_pMainLayout) if (nullptr == m_pMainLayout)
{ {

Loading…
Cancel
Save