#include "dto/NavDto.hpp" #include #include #include namespace geopro::data::dto { namespace { std::string str(const QJsonObject& o, const char* key) { return o.value(QString::fromLatin1(key)).toString().toStdString(); } ProjectSummary parseProjectItem(const QJsonObject& o) { ProjectSummary p; p.id = str(o, "id"); p.name = str(o, "projectName"); p.typeName = str(o, "projectTypeName"); p.crsCode = str(o, "referenceCRSCode"); p.crsName = str(o, "referenceCRSName"); p.status = o.value(QStringLiteral("status")).toInt(); return p; } } // namespace std::vector parseWorkspaces(const QJsonArray& arr) { std::vector out; out.reserve(static_cast(arr.size())); for (const QJsonValue& v : arr) { const QJsonObject o = v.toObject(); Workspace w; w.id = str(o, "id"); w.name = str(o, "name"); w.ownerType = o.value(QStringLiteral("ownerType")).toInt(); w.isCurrent = o.value(QStringLiteral("isCurTenant")).toInt() == 1; out.push_back(std::move(w)); } return out; } ProjectPage parseProjects(const QJsonObject& data) { ProjectPage page; page.hasNextPage = data.value(QStringLiteral("hasNextPage")).toBool(); const QJsonArray list = data.value(QStringLiteral("projectList")).toArray(); page.projects.reserve(static_cast(list.size())); for (const QJsonValue& v : list) page.projects.push_back(parseProjectItem(v.toObject())); return page; } std::vector parseProjectList(const QJsonArray& arr) { std::vector out; out.reserve(static_cast(arr.size())); for (const QJsonValue& v : arr) out.push_back(parseProjectItem(v.toObject())); return out; } std::vector parseStructNodes(const QJsonArray& arr) { std::vector out; out.reserve(static_cast(arr.size())); for (const QJsonValue& v : arr) { const QJsonObject o = v.toObject(); StructNode n; n.id = str(o, "id"); n.name = str(o, "name"); n.parentId = str(o, "parentId"); n.typeName = str(o, "typeName"); n.confCode = str(o, "confCode"); n.type = o.value(QStringLiteral("type")).toInt(); out.push_back(std::move(n)); } return out; } std::vector parseDatasets(const QJsonArray& arr) { std::vector out; out.reserve(static_cast(arr.size())); for (const QJsonValue& v : arr) { const QJsonObject o = v.toObject(); DsNode d; d.id = str(o, "id"); d.name = str(o, "name"); d.ddType = str(o, "ddCode"); out.push_back(std::move(d)); } return out; } std::vector buildStructTree(const std::vector& flat) { // 过滤 DS(type==3):DS 不进对象树(按 TM 单独拉取到数据列表)。 std::vector nodes; nodes.reserve(flat.size()); for (const auto& n : flat) if (n.type != 3) nodes.push_back(n); std::set ids; for (const auto& n : nodes) ids.insert(n.id); // 根层:parentId 为空 / "0" / 不在集合内(孤儿)。 auto isRootLevel = [&](const StructNode& n) { return n.parentId.empty() || n.parentId == "0" || ids.find(n.parentId) == ids.end(); }; std::set visited; // 防环:每个 id 最多进树一次。 std::function(const std::string&, bool)> build = [&](const std::string& parentId, bool root) { std::vector out; for (const auto& n : nodes) { const bool belongs = root ? isRootLevel(n) : (n.parentId == parentId); if (!belongs) continue; if (visited.count(n.id)) continue; visited.insert(n.id); StructTreeNode t; t.node = n; t.isTm = (n.type == 2); // type: 1=项目根 2=TM(测线) 3=DS(已过滤) t.children = build(n.id, false); out.push_back(std::move(t)); } return out; }; return build(std::string(), true); } } // namespace geopro::data::dto