69 lines
5.9 KiB
Markdown
69 lines
5.9 KiB
Markdown
# 对象视图 / 数据集视图 交互操作 — 实现计划
|
||
|
||
依据:`D:\Projects\GEOPRO\Geopro3.0 菜单.xlsx`「客户端」页签(菜单/交互规格,权威)。
|
||
后端提交体:见 `../specs/2026-06-13-batch2-object-dataset-dialogs.md`(§B 提交体 / §E 源码补全,**均已由线上压缩源码确证**)。
|
||
约定:二维/三维相关交互先占位;插件机制**暂缓**(待与用户深入讨论)。
|
||
|
||
---
|
||
|
||
## 一、已完成(已编译 + 单测通过)
|
||
|
||
### Batch 1 — 交互骨架 + 读联动 + 删除 + 筛选
|
||
- ApiClient `putJsonAsync`/`deleteAsync`;删除真实(GS/TM/DS)+ 控制器 `mutationSucceeded/Failed` + 刷新。
|
||
- 对象树右键菜单(9 项):属性/异常详情/删除 真实;显示隐藏/定位=占位。
|
||
- 数据集右键菜单:详情/属性/删除 真实。
|
||
- 快速筛选器(对象树、数据集);数据集单击 tooltip;手势修复 #1(复选框命中判定)。
|
||
|
||
### Batch 2 — 动态表单引擎 + 编辑/新建(⚠️ 提交体字段需修正,见下)
|
||
- `DynamicFormEditor`(按 getDynamicForm 渲染)、`ObjectFormDialog`(拉 schema→渲染→校验→提交)。
|
||
- 编辑保存 PUT、新建 TM POST、插件列出 `model/list`(点击占位)。
|
||
- 数据层 DTO/parse/repo/controller 齐备。
|
||
|
||
> ⚠️ Batch 2 的**提交体字段是早期错误版本**(`typeId/type/structParentId/structParentConfType`),
|
||
> 与源码确证的真实字段不符,须按下方 P0 修正后才能真正保存成功。
|
||
|
||
---
|
||
|
||
## 二、关键认知(2026-06-15,源码已确证)
|
||
|
||
- 提交体以 **bundle 源码为准**(线上前端真实请求构造,OpenAPI 为有误的生成文档)。详见 spec §B / §E。
|
||
- 菜单规格以 **xlsx 为准**(现有菜单结构已对齐,勿按原型删减)。
|
||
- 已确证:GS/TM 提交体字段、`properties.<fieldCode>` 嵌套、displayComponentType 全集映射、
|
||
requiredType(1=必填 / 2=只读 / 其他=可选)、导出 body。
|
||
- **唯一开放点:插件机制**(web 无"ds→插件"交互,xlsx 为客户端原创设计)→ 暂缓,待讨论。
|
||
|
||
---
|
||
|
||
## 三、实现计划(不含插件;每步带验证)
|
||
|
||
| 优先 | 任务 | 验证 |
|
||
|---|---|---|
|
||
| **P0** | **修提交体字段**(`ObjectFormDialog.onConfirm`):GS→`{gsTypeId, parentId(仅新建), name, responsiblePersonName, properties}`;TM→`{tmTypeId, parentId, parentType:"1", name, properties}`(+编辑 id)。删除 `typeId/type/structParentId/structParentConfType`。 | 字段比对 spec §B;真实保存成功(写操作留用户实测) |
|
||
| **P0** | **`DynamicFormEditor` 按 §E.1 全集重写控件映射**:1/5文本·2只读·3复选·4下拉·6日期·7时间·8日期时间·9多行·10数字·11树选·默认步进数字;`requiredType` 2=只读禁用。 | 各 comp 类型渲染正确、只读字段禁用 |
|
||
| **P0** | **顶层固定字段**:GS 加 `gsTypeId` 下拉(来源 `GET /business/project/gsList/{projectId}` → `[{name,gsTypeId}]`) + `responsiblePersonName` + `name`;TM 新建加 `tmTypeId` 下拉(来源 `queryTmType?projectId=&gsId=`) + `name`。 | 新建表单含这些项;编辑态正确预填/禁用 |
|
||
| **P1** | **项目根节点按 GS 处理**:可右键「新增检测对象(GS)/新增方法对象(TM)/属性」;`parentId`=根 id。 | 根节点弹菜单、新建走对应对话框 |
|
||
| **P1** | **新建 GS 打通**:右键新建GS → getDynamicForm(type=1,无id) → 表单 → `POST /gsObject`。 | 弹表单、提交(写操作留用户实测) |
|
||
| **P1** | **新建 TM 修正**:方法类型 `queryTmType`;提交体随 P0;父对象=右键节点。 | 弹表单、提交 |
|
||
| **P2** | **导入 DS 向导**:TM 右键「导入DS(1..n)」→ 选类型 → getDynamicForm(type=6 脚本参数) → 选文件 → `checkImport` → `import`(multipart `{file,dsTypeId,projectId,structParentConfType,structParentId,scriptCode,scriptParamListJsonStr}`)。 | 流程走通、文件上传 |
|
||
| **P2** | **导出对话框**:数据集右键「导出」→ 选模板 → `POST /templateExport/export {dsObjectIdList:[该ds],templateId}`;模板来源 localStorage `template`.fileTemplateList / `queryFileType`。 | 导出触发 |
|
||
|
||
---
|
||
|
||
## 三补、其余"可做但未做"的编辑操作(2026-06-15 盘点)
|
||
|
||
| 优先 | 任务 | 来源/接口 | 状态 |
|
||
|---|---|---|---|
|
||
| **P1** | **#1 数据集描述编辑保存**(原版"数据集属性可编辑"实为**富文本描述/备注**编辑) | 加载 `GET /dsObject/getDetail/{id}`.attachedParameters.deltaContent;保存 `PUT /dsObject/updateDsObject/ {dsObjectId, description, attachedParameters:{deltaContent}}`(源码确证) | **本轮做**:客户端无 Quill,简化为纯文本/富文本 QTextEdit,deltaContent 用最小 delta 承载 |
|
||
| **P1** | **#3 面板级「添加+」按钮**(对象列表→新建GS/TM;数据集列表→导入) | 纯前端,复用现有 newGs/newTm/import 入口 | **本轮做** |
|
||
| P2 | #4 异常→异常体 拖拽合并(对象异常面板) | `exception/*`(合并接口待查) | 未做 |
|
||
| P2 | #5 数据集任务:新增处理任务/保存处理结果 | 与模型/插件流程耦合 | 未做(随插件) |
|
||
| P3 | #2 属性面板内联编辑 + 实时跳转(属性指向另一 ds 时点击跳转新建详情页) | — | 未做 |
|
||
| P3 | #6 数据详情处理类编辑(异常标注/色阶/白化/滤波/另存为) | 与渲染耦合 | 未做(随 2D/3D 或专项) |
|
||
|
||
## 四、暂缓 / 排除
|
||
|
||
- **插件机制**(spec §E.3):web 无对应交互,需产品/后端决策(客户端反查 `model/list`+各模型 `dsObjectList`,或后端加"按 ds 列模型"接口)。**待与用户深入讨论后再实现。**
|
||
- **2D/3D 相关**:显示/隐藏、定位、双击地图获焦 —— 占位,随 2D/3D 批次。
|
||
- GS 勾选三态语义(屏蔽不改状态、可恢复)、项目根勾选 —— 随 2D/3D 批次。
|
||
- 动态表单只读规则细节:以 §E.1 的 `displayComponentType=2` / `requiredType=2` 为准。
|