From 3192cf24cf484193c4657a22390a002e3789f616 Mon Sep 17 00:00:00 2001 From: gaozheng Date: Thu, 11 Jun 2026 11:52:05 +0800 Subject: [PATCH] =?UTF-8?q?feat(data):=20ApiDatasetRepository=20=E6=8E=A5?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=20API=20+=20loadScatterColorScale=20?= =?UTF-8?q?=E6=8F=90=E5=88=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/CMakeLists.txt | 3 +- src/data/api/ApiDatasetRepository.cpp | 51 +++++++++++++++++++++++++ src/data/api/ApiDatasetRepository.hpp | 19 +++++++++ src/data/repo/IDatasetRepository.hpp | 1 + src/data/repo/LocalSampleRepository.hpp | 3 +- 5 files changed, 74 insertions(+), 3 deletions(-) create mode 100644 src/data/api/ApiDatasetRepository.cpp create mode 100644 src/data/api/ApiDatasetRepository.hpp diff --git a/src/data/CMakeLists.txt b/src/data/CMakeLists.txt index 4e0aa60..16da104 100644 --- a/src/data/CMakeLists.txt +++ b/src/data/CMakeLists.txt @@ -5,7 +5,8 @@ add_library(geopro_data STATIC repo/LocalSampleRepository.cpp dto/NavDto.cpp dto/DatasetChartDto.cpp - api/ApiProjectRepository.cpp) + api/ApiProjectRepository.cpp + api/ApiDatasetRepository.cpp) target_include_directories(geopro_data PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(geopro_data PUBLIC geopro_core geopro_net Qt6::Core PRIVATE nlohmann_json::nlohmann_json) target_compile_features(geopro_data PUBLIC cxx_std_17) diff --git a/src/data/api/ApiDatasetRepository.cpp b/src/data/api/ApiDatasetRepository.cpp new file mode 100644 index 0000000..94ebe8a --- /dev/null +++ b/src/data/api/ApiDatasetRepository.cpp @@ -0,0 +1,51 @@ +#include "api/ApiDatasetRepository.hpp" +#include +#include +#include +#include +#include "ApiClient.hpp" +#include "dto/DatasetChartDto.hpp" +namespace geopro::data { +namespace { +QString enc(const std::string& s) { + return QString::fromUtf8(QUrl::toPercentEncoding(QString::fromStdString(s))); +} +void must(const net::ApiResponse& r, const char* what) { + if (r.code != 200) throw std::runtime_error(std::string(what) + " failed: " + + (r.msg.isEmpty() ? r.rawError.toStdString() : r.msg.toStdString())); +} +geopro::core::ColorScale colorScale(net::ApiClient& api, const std::string& dsId, int type) { + QJsonObject body{{"dsObjectId", QString::fromStdString(dsId)}, {"businessCode", ""}, {"type", type}}; + const net::ApiResponse r = api.postJson(QStringLiteral("/business/lvl/colorGradation/getDetail"), body); + must(r, "colorGradation"); + return dto::parseColorBar(r.data); +} +} // namespace + +ApiDatasetRepository::ApiDatasetRepository(net::ApiClient& api) : api_(api) {} + +geopro::core::Grid ApiDatasetRepository::loadGrid(const std::string& dsId) { + const net::ApiResponse r = api_.get( + QStringLiteral("/business/dd/ert/inversion/rows/%1").arg(enc(dsId))); + must(r, "inversion/rows"); + return dto::parseInversionGrid(r.data); +} +geopro::core::ScatterField ApiDatasetRepository::loadScatter(const std::string& dsId) { + const net::ApiResponse r = api_.get( + QStringLiteral("/business/dd/ert/inversion/getErtRawDataScatterGraph/%1").arg(enc(dsId))); + must(r, "scatterGraph"); + return dto::parseScatterGraph(r.data); +} +geopro::core::ColorScale ApiDatasetRepository::loadColorScale(const std::string& dsId) { + return colorScale(api_, dsId, 2); +} +geopro::core::ColorScale ApiDatasetRepository::loadScatterColorScale(const std::string& dsId) { + return colorScale(api_, dsId, 1); +} +std::vector ApiDatasetRepository::loadAnomalies(const std::string& dsId) { + const net::ApiResponse r = api_.get( + QStringLiteral("/business/exception/queryException/%1").arg(enc(dsId))); + must(r, "queryException"); + return dto::parseDatasetAnomalies(r.data.value(QStringLiteral("value")).toArray()); +} +} // namespace geopro::data diff --git a/src/data/api/ApiDatasetRepository.hpp b/src/data/api/ApiDatasetRepository.hpp new file mode 100644 index 0000000..617aaad --- /dev/null +++ b/src/data/api/ApiDatasetRepository.hpp @@ -0,0 +1,19 @@ +#pragma once +#include "repo/IDatasetRepository.hpp" +namespace geopro::net { class ApiClient; } +namespace geopro::data { + +// 真实 API 实现 IDatasetRepository(ERT 反演相关)。失败抛 std::runtime_error。 +class ApiDatasetRepository : public IDatasetRepository { +public: + explicit ApiDatasetRepository(net::ApiClient& api); + std::vector loadStructure() override { return {}; } // 不经此仓储取结构 + geopro::core::Grid loadGrid(const std::string& dsId) override; + geopro::core::ScatterField loadScatter(const std::string& dsId) override; + geopro::core::ColorScale loadColorScale(const std::string& dsId) override; // type2 网格 + geopro::core::ColorScale loadScatterColorScale(const std::string& dsId) override; // type1 原数据 + std::vector loadAnomalies(const std::string& dsId) override; +private: + net::ApiClient& api_; +}; +} // namespace geopro::data diff --git a/src/data/repo/IDatasetRepository.hpp b/src/data/repo/IDatasetRepository.hpp index 96e3455..e1955c1 100644 --- a/src/data/repo/IDatasetRepository.hpp +++ b/src/data/repo/IDatasetRepository.hpp @@ -15,6 +15,7 @@ public: virtual geopro::core::Grid loadGrid(const std::string& dsId) = 0; virtual geopro::core::ScatterField loadScatter(const std::string& dsId) = 0; virtual geopro::core::ColorScale loadColorScale(const std::string& dsId) = 0; + virtual geopro::core::ColorScale loadScatterColorScale(const std::string& dsId) = 0; virtual std::vector loadAnomalies(const std::string& dsId) = 0; }; diff --git a/src/data/repo/LocalSampleRepository.hpp b/src/data/repo/LocalSampleRepository.hpp index 0d54179..183f612 100644 --- a/src/data/repo/LocalSampleRepository.hpp +++ b/src/data/repo/LocalSampleRepository.hpp @@ -18,8 +18,7 @@ public: std::vector loadAnomalies(const std::string& dsId) override; // 散点原数据(#17)专属色阶:剖面原数据自带的色阶文件(与网格色阶不同:分段值范围更大)。 - // 具体类专有方法(不进 IDatasetRepository 接口);散点点为不透明,alpha 量纲差异无影响。 - geopro::core::ColorScale loadScatterColorScale(const std::string& dsId); + geopro::core::ColorScale loadScatterColorScale(const std::string& dsId) override; // DEM/影像 GeoTIFF 的绝对路径(供 render::buildTerrain 经 GDAL 读)。 std::string demPath() const;