From 5a719ca16d7f8d875d9d9f32f91d34977410dd09 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Wed, 24 Jun 2026 17:40:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(data):=20DsRow=20=E5=8A=A0=20dsTypeCode/pr?= =?UTF-8?q?operties=20+=20parseDsRows=20=E8=A7=A3=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/dto/NavDto.cpp | 12 ++++++++++++ src/data/repo/RepoTypes.hpp | 7 +++++++ tests/data/test_nav_dto.cpp | 21 +++++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/src/data/dto/NavDto.cpp b/src/data/dto/NavDto.cpp index 47626ef..8b35d69 100644 --- a/src/data/dto/NavDto.cpp +++ b/src/data/dto/NavDto.cpp @@ -127,6 +127,18 @@ std::vector parseDsRows(const QJsonArray& arr) { // 数据集树父节点:sourceShowParentId 是“显示树”父(=派生数据挂源数据下),回退 parentId。 d.parentId = str(o, "sourceShowParentId"); if (d.parentId.empty()) d.parentId = str(o, "parentId"); + d.dsTypeCode = str(o, "dsTypeCode"); + d.structParentId = str(o, "structParentId"); + d.structParentConfType = o.value(QStringLiteral("structParentConfType")).toInt(); + // properties[] = [{confFieldId,value}](value 用 toVariant().toString() 兼容字符串/数值/时间, + // 与 parseDynamicForm 同口径);非数组形态(文件型 ds)安全返回空。 + const QJsonArray props = o.value(QStringLiteral("properties")).toArray(); + d.properties.reserve(static_cast(props.size())); + for (const QJsonValue& pv : props) { + const QJsonObject po = pv.toObject(); + d.properties.push_back( + {str(po, "confFieldId"), po.value(QStringLiteral("value")).toVariant().toString().toStdString()}); + } const QJsonObject f = o.value(QStringLiteral("file")).toObject(); d.fileName = str(f, "name"); d.fileUrl = str(f, "url"); diff --git a/src/data/repo/RepoTypes.hpp b/src/data/repo/RepoTypes.hpp index d58a70b..ea4c366 100644 --- a/src/data/repo/RepoTypes.hpp +++ b/src/data/repo/RepoTypes.hpp @@ -7,11 +7,18 @@ struct DsNode { std::string id, name, ddType; }; // data/page 或 file/page 的一条 ds。数据行只用 dsName/typeName/ddCode;文件行另含 file*。 // parentId = 数据集树的父节点 id(取 sourceShowParentId,回退 parentId);空或不在本批=树根。 // 原版数据列表是树:源「原始数据」为根,派生「反演/接地电阻」挂其下。 +// ds 属性键值(data/page 的 properties[] 项:confFieldId→value 原始对)。 +struct DsPropKV { std::string confFieldId, value; }; + struct DsRow { std::string id, dsName, typeName, ddCode, createTime; std::string parentId; std::string fileName, fileUrl; long long fileSize = 0; + std::string dsTypeCode; // 大类分类主键(spec §5;ddCode 粒度不足以区分电阻率/视电阻率) + std::vector properties; // 原始 confFieldId→value;装置类型/采集时间经 DatasetFieldDictionary 解析 + std::string structParentId; // 上级节点 id(段体容器分组 + 生成三维体归属用) + int structParentConfType = 0; // 1=GS/项目根 2=TM }; struct DsPage { std::vector rows; int total = 0; }; struct TmNode { std::string id, name, confCode; std::vector dss; }; diff --git a/tests/data/test_nav_dto.cpp b/tests/data/test_nav_dto.cpp index 4d37552..12a3ccf 100644 --- a/tests/data/test_nav_dto.cpp +++ b/tests/data/test_nav_dto.cpp @@ -195,6 +195,27 @@ TEST(NavDto, ParseDsRowsParentIdForTree) { EXPECT_TRUE(d[3].parentId.empty()); // 二者皆无 → 空(树根) } +// 大类分类主键 dsTypeCode、层级 structParent*、原始属性 properties[] 的解析。 +TEST(NavDto, ParseDsRowsExtractsTypeCodeAndProperties) { + const auto d = dto::parseDsRows(arrOf(R"([ + {"id":"d1","dsName":"ERT1-WS","name":"电阻率数据", + "ddCode":"dd_inversion_data","dsTypeCode":"ERT platform inversion data", + "createTime":"2026-03-25 16:48:57","structParentId":"tm1","structParentConfType":2, + "properties":[ + {"confFieldId":"1450495001706500","value":"1429468249448449"}, + {"confFieldId":"1455083478786048","value":"2026-03-25 16:48:57"} + ]} + ])")); + ASSERT_EQ(d.size(), 1u); + EXPECT_EQ(d[0].dsTypeCode, "ERT platform inversion data"); + EXPECT_EQ(d[0].structParentId, "tm1"); + EXPECT_EQ(d[0].structParentConfType, 2); + EXPECT_EQ(d[0].ddCode, "dd_inversion_data"); + ASSERT_EQ(d[0].properties.size(), 2u); + EXPECT_EQ(d[0].properties[0].confFieldId, "1450495001706500"); + EXPECT_EQ(d[0].properties[0].value, "1429468249448449"); +} + TEST(NavDto, ParseProjectItemFullFields) { const auto v = dto::parseProjectList(arrOf(R"([ {"id":"p1","projectName":"演示","projectCode":"001","status":2,