geopro/docs/superpowers/specs/2026-06-22-dataset-detail-i...

175 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 数据集详情视图 · 交互 100% 复刻台账
> 目标详情视图datasetInfo逐交互 1:1 复刻原版 web`D:\Git\lanbingtech\commercial-admin`)。
> 原则:对照原版源码找全差距;凡已实现的视图,其后端接口均已具备(客户端只需新增对应调用)。
> 范围:仅**已实现的 5 个 ddCode 视图**。雷达/GPR/电磁/3D 模型家族(客户端将重构、需求未定)整体搁置。
> 日期2026-06-22 立账。
## 0. 总览结论
| 视图 (ddCode) | 客户端类 | 复刻完成度 | 差距集中点 |
|---|---|---|---|
| 电极轨迹 dd_trajectory_data | TrajectoryStrategy / TrajectoryMapView 等 | ✅ **无差距** | 地图/列表/高程齐全;原版「导出」按钮原版自身亦未实现 |
| 接地电阻 dd_ert_measurement_gr_data | GrMeasurementStrategy / BarChartView | ✅ **无差距** | 柱状图/列表齐全;原版地面信息/模型/脚本/导出按钮原版自身亦未实现 |
| ERT 原始数据 dd_ert_measurement_data | MeasurementStrategy / RawDataChartView | ✅ **基本接通** | 工具条 1:1写操作全接仅 M14 框选后置(重型,已登记) |
| 反演等值面 dd_inversion_data | ErtInversionStrategy / RawDataChartView(原数据) + GridDataChartView(网格) | ✅ **基本接通** | 网格/白化/滤波/异常CRUD/自动标注/另存为/色阶均接;仅 I9 图上绘制、I14 富文本、I3 tmObjectId 透传后置 |
| 网格白化 dd_grid | GridStrategy / DataTableView | ✅ **已通** | 分页列表 + 「反演」功能按钮(载荷 functionList 驱动,复用 InversionFormDialog) |
**架构事实**:客户端 `ApiDatasetRepository` 当前只有 load操作无写操作。所有反演/保存/过滤/白化/滤波/异常写接口需新增客户端调用,沿用 `ApiClient(get/postJsonAsync) → ApiBatch → ApiDetailLoad` 模式(或为写操作引入独立的 command 调用路径)。
> ⚠️ 实现前务必直接读原版 `src/apis/datasetInfo/index.js` 与对应 `.vue` 复核请求体字段名(本台账 API 字段来自探查 agent 摘录,端点/方法可信,个别字段名以源码为准)。
---
## 1. 共享基础设施(先建,多视图复用)
这些组件被多个交互复用,应优先抽象,避免各视图各写一份。
### 1.1 反演动态表单对话框InversionForm
- **复用于**measurement「反演运算」「生成视电阻率」、grid「反演」。
- **流程**:① 查模型列表 → ② 选模型 → ③ 按 typeId 拉动态表单字段 → ④ 填参 → ⑤ 提交。
- **API**
- 模型列表 `GET /business/outerInversion/query/script?dsObjectId=`measurement/grid 通用)
- 动态表单 `POST /business/project/getDynamicForm` body `{projectId, type:6, typeId}`
- 提交反演 `POST /business/outerInversion/submitInversionTask` body `{dsId, properties, ...}`
- 生成视电阻率 `POST /business/dd/ert/measurement/createVisualResistivityData` body `{dsObjectId, scriptId, scriptParamListJsonStr}`
- **客户端现状**:无。需建 `InversionFormDialog`(动态字段渲染:分组卡片 + Select 为主)。
### 1.2 色阶配置编辑器(已存在,复用)
- **已有**`ColorScaleConfigDialog`(被 GridDataChartView 使用,且与三维体右键色阶共用)。
- **复用目标**measurement 散点「色阶配置」、inversion 原数据散点「色阶配置」。
- **API**:查 `POST /business/lvl/colorGradation/getDetail`,存 `POST /business/lvl/colorGradation`
- **注意**measurement 走 `businessCode=R0, type=3`inversion 原数据 `type=1`、网格 `type=2`。散点上色用 `colorSvc_`,编辑后需重建并重绘散点。
### 1.3 另存为对话框SaveAs
- **复用于**measurement 另存为、inversion 另存为。
- **measurement**`POST /business/dd/ert/measurement/saveRawData` `{dsId, operationType(1新增/0覆盖), name?}`(含新增/覆盖单选)
- **inversion**`POST /business/dd/ert/inversion/saveAsData` `{dsObjectId, name}`(仅名称)
---
## 2. ERT 原始数据measurement / RawDataChartView
客户端 measurement 工具条已 1:1 建出(`buildMeasurementToolbar`)。逐控件差距:
| # | 控件 | 原版行为 | 原版 API | 客户端现状 | 实现要点 |
|---|---|---|---|---|---|
| M1 | 显示/隐藏 | popconfirm→改全部点可见性持久化 | `POST /business/dd/ert/measurement/saveDisplayStatus` `{dsObjectId, ids[], status}` | ✅ **已通**onShowHide确认→调接口→本地切换 | — |
| M2 | 表格行可见性 switch | 行级 popconfirm→改单点 | 同 M1ids=[record.id]status 取反) | 🔸 **后置**DataTableView 行级开关列交互重,源 saveDisplayStatus 已具备) | 见 §6 |
| M3 | 数据过滤 | 弹窗(直方图+min/max)→生成过滤后数据集 | 查 `GET /business/scatterPlotDataFilter/getDataFilterConfig?dsObjectId&vFieldCode`;应用 `POST /business/scatterPlotDataFilter` `{sourceDsObjectId, sourceVFieldCode, min, max}` | ✅ **已通**ScatterFilterDialog范围 min/max + 应用);直方图绘制后置 | 直方图见 §6 |
| M4 | X 轴下拉(平距/斜距) | 本地换列重绘 | 无 | ✅ 已通(replotForAxis) | — |
| M5 | Y 轴下拉(伪深度/+高程/层数) | 本地换列重绘 | 无 | ✅ 已通 | 层数为 no-op原版亦无数据 |
| M6 | V 值下拉 | 重新请求散点+色阶 | `GET .../scatter/graph?vFieldCode=` + `POST .../getDetail{businessCode=新V}` | ✅ **已通**reloadForVValue 带 vFieldCode 重载) | — |
| M7 | 值类型下拉(线性/倒数/对数) | 本地换显示 | 无 | ✅ **已通**applyValueType 本地变换重上色) | — |
| M8 | 色阶配置 | 弹窗编辑+保存 | getDetail/colorGradation见 1.2 | ✅ **已通**(复用 ColorScaleConfigDialogproperties 含 colorBar+lineConfig+labelConfig | — |
| M9 | 生成视电阻率 | 反演弹窗(模型锁定视电阻率脚本) | createVisualResistivityData见 1.1 | ✅ **已通**InversionFormDialog::ApparentResistivity下拉 disabled+锁 `script_visual_resistivity_data`,对齐原版) | — |
| M10 | 反演运算 | 反演弹窗 | submitInversionTask见 1.1 | ✅ **已通**InversionFormDialog::Inversion | — |
| M11 | 另存为 | 新增/覆盖弹窗 | saveRawData见 1.3 | ✅ **已通**SaveAsDialog::RawData | — |
| M12 | 导出 DAT | 下载 base64 | `GET /business/dd/ert/measurement/rs2d/export?dsId&electrodePosition=2&ipDataMark=0&typeMeasurement=0` | ✅ **已通**exportDat参数对齐原版 | — |
| M13 | [i] 信息 | 点选看 A/B/M/N/Pseu/Row | 无(本地) | ✅ **已通**toggleInfoMode信息模式点选散点看属性 | — |
| M14 | 框选/点选模式 | enter/exitSelectMode | 无(本地) | 🔸 **后置**Qwt 橡皮筋框选+选区联动隐藏成本高,保留占位提示) | 见 §6 |
---
## 3. 反演等值面inversion
### 3.1 网格视图GridDataChartView
| # | 控件 | 原版行为 | 原版 API | 客户端现状 | 实现要点 |
|---|---|---|---|---|---|
| I1 | 网格(化) | 2步向导(选算法+参数)→网格化 | `GET .../queryAlgorithmModel/{ds}``GET .../getRawData/{ds}``POST /business/dd/ert/inversion/grid`(actionCode,x/y min/max,**xsize/ysize=点数**,xSpacing/ySpacing=间距,vmin/vmax,saveDataValueType) | ✅ **已通**GridWizardDialog 2步xsize=点数 xPoints/ySize=yPoints间距走 xSpacing/ySpacing对齐原版 toGridTheData | — |
| I2 | 色阶配置 | 弹窗 | getDetail/colorGradation | ✅ **已通**(本地生效;网格视图色阶不持久化到后端,与原版网格路径一致) | — |
| I3 | 白化 | 弹窗(3种方式) | `POST /business/dd/ert/inversion/whitenedData`;文件列表 `POST /business/dsObject/queryWhitenedDataList` | ✅ **已通**(白化弹窗+提交);`tmObjectId` 暂兜底空串 | tmObjectId 透传见 §6 |
| I4 | 滤波处理 | 弹窗(滤波器树+矩阵) | 列表 `GET /business/filter/queryFilter`;增 `POST /business/filter`;删 `DELETE /business/filter/delete/{id}`;应用 `POST /business/dd/ert/inversion/filterData` | ✅ **已通**(滤波弹窗含滤波器 CRUD+应用) | — |
| I5 | 显示异常 | 本地显隐 | 无 | ✅ 已通 | — |
| I6 | 显示等值线标注 | 本地显隐 | 无 | ✅ 已通 | — |
| I7 | 显示等值线提示 tooltip | 本地显隐 | 无 | ✅ **已通**chkContourTip 接 hover tooltip 显隐) | — |
| I8 | 简化容差滑块 | 防抖本地重算等值线(0~2,步0.1) | 无 | ✅ **已通**(防抖 applySimplify→setSimplifyTolerance 真生效) | — |
| I9 | 异常 创建 | 弹窗(类型/名称/备注)+图上绘形 | 类型 `GET .../queryExceptionTypeByProjectIdAndType/{pid}/{type}`;名建议 `POST /business/exception/getExceptionName`;新增 `POST /business/exception` | ✅ **表单已通**ExceptionDialog类型/名建议/备注+提交);🔸 **图上绘形后置** | 图上绘制见 §6 |
| I10 | 异常 删除 | 表格行删 | `DELETE /business/exception/{id}` | ✅ **已通**AnomalyTablePanel deleteRequested | — |
| I11 | 异常 详情/编辑 | 抽屉(名称/备注/样式) | `PUT /business/exception` | ✅ **已通**ExceptionDetailDialog只发 `{id, exceptionName, remark}`,对齐原版局部更新) | — |
| I12 | 异常 定位 | 本地高亮+缩放(防抖) | 无 | ✅ **已通**AnomalyTablePanel locateRequested→图上定位 | — |
| I13 | 自动标注 | 弹窗(规则+预览) | 预演 `POST /business/exception/exception-mark/execute`;批量存 `POST /business/exception/batch/create` | ✅ **已通**openAutoAnnotation 自动标注弹窗) | — |
| I14 | 富文本描述保存 | Quill→保存 | 存 `PUT /business/dsObject/updateDsObject/`;取 `GET /business/dsObject/getDetail/{ds}` | ✅ **保存链路已通**DescriptionPanel saveRequested→saveDescription取/存均通);🔸 **富文本降级为纯文本** | Quill 富文本见 §6 |
| I15 | 另存为 | 弹窗(名称) | `POST /business/dd/ert/inversion/saveAsData` | ✅ **已通**SaveAsDialog | — |
### 3.2 原数据散点视图RawDataChartView 默认工具条)
| # | 控件 | 原版行为 | 客户端现状 | 实现要点 |
|---|---|---|---|---|
| O1 | 网格 | 同 I1 网格化向导 | ✅ **已通**(复用 GridWizardDialog | — |
| O2 | 色阶配置 | 散点色阶(type1businessCode 空) | ✅ **已通**openInversionColorScaleproperties 含 colorBar+lineConfig+labelConfig | — |
| O3 | 另存为 | 同 I15 | ✅ **已通**SaveAsDialog::Inversion | — |
| O4 | 图形格式下拉 | 散点↔2D直方图等值线原版 disabled | ✅ 不做(原版自身禁用) | — |
---
## 4. 网格白化数据grid / DataTableView
| # | 控件 | 原版行为 | 原版 API | 客户端现状 | 实现要点 |
|---|---|---|---|---|---|
| G1 | 反演 | 反演弹窗 | submitInversionTask见 1.1 | ✅ 已接 | DataTableView 顶部功能按钮行(载荷 functionList 驱动,仅 dd_grid 非空),点 inversion → 复用 InversionFormDialog(Mode::Inversion) |
| G2 | 分页 | 服务端分页 | grid/rows pageNo/pageSize | ✅ 已通 | — |
---
## 5. 建议执行顺序(分阶段)
1. **阶段 A · 共享基础设施**
- InversionFormDialog模型列表+动态表单+提交)→ 一次解锁 M9/M10/G1。
- SaveAs 弹窗measurement + inversion 两形态)。
- 色阶配置接入散点(复用 ColorScaleConfigDialog→ M8/O2。
2. **阶段 B · measurement 主交互**
- M1/M2 可见性持久化、M11 另存为、M12 导出、M6 V值重载、M7 值类型、M3 数据过滤。
- M13/M14 信息/框选(交互重,最后)。
3. **阶段 C · inversion 写操作**
- I1/O1 网格化向导、I15/O3 另存为。
- I9~I13 异常 CRUD + 自动标注。
- I3 白化、I4 滤波。
- I7 tooltip、I8 简化容差真生效、I14 描述保存复核。
4. **阶段 D · grid**
- G1 反演按钮(阶段 A 完成后顺带)。
> 每个交互按 TDD先对 repository 写方法/解析写测试mock ApiClient再接 UIUI 视觉对照原版。
---
## 6. 复刻收尾状态2026-06-22
三份审查后的修正项已落地build 通过 + 测试全过285/285
### 6.1 已 100% 接通项
- **measurementM1~M13**显隐持久化、数据过滤范围、X/Y/V/值类型下拉、色阶配置、生成视电阻率(下拉锁 `script_visual_resistivity_data`)、反演运算、另存为、导出 DAT、[i] 信息点选——全部接通并对齐原版。
- **inversion 网格I1~I8、I10~I13、I15**网格化向导xsize/ysize=点数,对齐 toGridTheData、色阶、白化、滤波含滤波器 CRUD、显示异常/标注/tooltip、简化容差真生效、异常删除/详情编辑/定位、自动标注、另存为——全部接通。
- **inversion 原数据散点O1~O3**网格化、色阶type1、另存为——全部接通O4 原版自身禁用,不做。
- **grid 白化G1/G2**反演按钮functionList 驱动)、分页——已通。
### 6.2 审查修正项(本轮)
- **重复 connectM13/M14**:删除 `btnInfo`/`btnMarquee` 残留的 `clicked→showNotImplemented`消除信息按钮多弹「暂未实现」、框选按钮单击弹两次btnInfo 保留 checkable+toggled信息模式btnMarquee 保留单条占位提示。
- **异常详情更新字段I11**:原版 `contourPage.vue onOk``PUT /business/exception` 局部更新,**仅发 `{id, exceptionName, remark}`**(线样式是另一条独立 PUT且抽屉样式控件 disabled。客户端 `ExceptionDetailDialog::onConfirm` 已对齐:不再附带/覆盖 `legend`
- **色阶 properties 补齐M8/O2**:原版散点路径 `newLvlColorLevel``properties``colorBar` + `lineConfig{showLines,color,lineType}` + `labelConfig{showLabels,color}`battery/scatters 仅这三块,不含等值面专属的 lvlSchemeType/logLinesCount/equalAreaLayerCount。客户端两处散点保存已补齐这三块新增 `buildColorScaleProperties` 复用 `dlg.lineConfig()`)。`templateId` 原版非必需,客户端按原版处理。
### 6.3 self-check 结论(无需改)
- **#4 视电阻率模型锁定**`InversionFormDialog::ApparentResistivity` 已 `modelCombo_->setEnabled(false)` 且锁定 `code==script_visual_resistivity_data` 的项——与原版 `InversionDialog.vue`(静态 `disabled` + 锁脚本)一致。
- **#5 网格 xsize/ysize 绑点数**`GridWizardDialog` 的 `xSize_/ySize_` 是「X/Y点数」1~300默认 100`buildGridToBody` 映射 `xsize←xSize`、间距走独立 `xSpacing←xSpacing_`——与原版 `GridDialog.vue toGridTheData``xsize:xPoints`、`xSpacing:xInterval`)一致。
### 6.4 收尾 6 项 —— 已全部接通2026-06-23commit ec4a7e8
§6.4 原列的 6 项后置/降级项已全部实现build app + test 全绿318/318
| 项 | 状态 | 实现 / 残留边界 |
|---|---|---|
| **M2 行级可见性 switch** | ✅ | DataTableView 载荷驱动可交互开关列(`toggleInteractive`+`rowIds`,仅 measurement 置位),行级 popconfirm → `saveDisplayStatus` |
| **M3 过滤直方图** | ✅ | 新增自绘 `ScatterHistogramView`20 箱,选区高亮 + min/max 输入联动);拖拽刷选未做(原版用输入/滑块,非画布 brush |
| **M14 框选/点选模式** | ✅ | `ScatterMarqueePicker` 橡皮筋矩形 → `ScatterPlotItem` 选中红边高亮;显示/隐藏对选中子集操作(无选区回退全部)。复刻 box-select 变体;原版单击逐点选未做 |
| **I9 异常图上绘形** | ✅ | `ContourDrawTool` 在等值面交互绘制 点/线/面/文字(先弹窗填类型/名称→图上绘制→`newException`);坐标表保留为兜底。文字类型无原版独立富文本样式编辑器 |
| **I14 Quill 富文本** | ✅(降级可用) | `DescriptionPanel` 升级富文本(粗体/斜体/下划线/字色/字号/标题/列表)+ `QuillDelta` 与 Quill Delta 常见格式往返。**Qt 无 Quill不可字节级 1:1**:未知 attributes/嵌入对象容错降级(保文本、丢样式、不崩) |
| **I3 白化 tmObjectId** | ✅(待联调验证) | `openWhitening``getDsObjectDetail(dsId)``structParentId` 作 tmObjectId。**存疑**:未实证 getDetail 响应含 structParentId若不含需转方案 B经 openDataset 链路透传) |
### 6.5 命名冲突修复
`ScatterHistogram` 名冲突M3 widget 类 vs ScatterDataOps 分箱 struct导致 desktop 目标曾无法链接(`build.bat test` 只建测试目标未暴露)→ widget 改名 `ScatterHistogramView`。**教训**:详情视图改动须 `build.bat all` 验证 app 链接,不能只 `build.bat test`