# 对象视图 / 数据集视图 交互操作 — 进度 · 问题 · 下步计划 依据:`D:\Projects\GEOPRO\Geopro3.0 菜单.xlsx`「客户端」页签(对象列表 / 数据集列表 交互规则)。 约定:二维/三维视图相关交互**先占位**;其余尽量接真实后端。 配套:API 实地研究见 `../specs/2026-06-13-batch2-object-dataset-dialogs.md`。 --- ## 一、已完成(已编译 + 单测通过;写操作待真实提交验证) ### Batch 1 — 交互骨架 + 读联动 + 删除 + 筛选(已并入本分支) - **ApiClient**:补 `putJsonAsync` / `deleteAsync`。 - **删除**(真实 DELETE):`deleteObjectAsync`(GS/TM) / `deleteDatasetAsync`;控制器 `deleteObject`/`deleteDataset` + `mutationSucceeded/Failed`,成功后刷新结构 / 数据集列表。 - **对象树右键菜单**(9 项):属性、异常详情(`showObjectExceptions`,GS→收集其下 TM 复用 setCheckedTms)真实接现有面板;删除真实;显示隐藏/定位=2D/3D 占位。 - **数据集右键菜单**:数据集详情、属性 真实;删除真实。 - **快速筛选器**:对象树(全选测线/取消/反选);数据集(类型多选 + 创建日期,客户端隐藏不匹配行)。 - **数据集单击 tooltip**:名称/类型/创建时间。 - **手势修复 #1**:点对象树复选框只切勾选、不再触发"选中"重载(viewport 事件过滤 + 复选框命中判定)。 ### Batch 2(本轮)— 动态表单引擎 + 编辑保存 + 新建 TM + 插件列表 - **动态表单引擎** `DynamicFormEditor`:按 `project/getDynamicForm` 字段元信息渲染 comp1=文本(dtype2/3 数字+范围校验) / comp4=下拉(optionsObject) / comp6=日期 / comp7=日期时间 / comp8=多行;必填(requiredType==1)标红 *;编辑态用 properties 预填。 - **ObjectFormDialog**:拉真实 schema → 渲染 → 校验 → 提交。 - **编辑保存**:右键编辑 → PUT `/business/{gs|tm}Object` → 成功刷新结构,失败回显后端 msg。 - **新建 TM**:右键 GS → `queryTmType` 选型 → 空表单 → POST(带 structParentId/structParentConfType)。 - **插件子菜单**:数据集右键「插件」列出真实 `model/list`(启动缓存);点击=占位 toast。 - 数据层:`EditableForm`/`TmTypeOption`/`ModelInfo` DTO + parse;`StructNode.typeId`; repo `loadEditableFormAsync`/`queryTmTypesAsync`/`submitObjectAsync`/`listModelsAsync`; controller `currentProjectId()`。 --- ## 二、已知问题 / 风险 1. **保存/新建请求体为推断**(最高优先级风险) - OpenAPI 未文档化 POST/PUT body;原版前端在 Vue 组件动态拼装,压缩代码难 100% 还原。 - 当前发送 `{typeId,id,type,projectId,properties:{fieldCode:值}}`(新建另带父上下文)。 - **需用户真实提交验证**:失败时对话框回显后端 msg;用户提供浏览器 Network 真实 body 后定版。 2. **动态表单只读规则未定**:原版禁用了"测量值"字段(名称/电极数/间距/线长,落在 properties)。 无显式 disabled 标志可依,当前一律可编辑(不发请求时无害);接保存后需确认规则。 3. **菜单文档与实现的不一致**(用户已知,暂不改): - 项目根("也是一个 GS")当前为不可选中/勾选的纯容器。 - GS 勾选用 Qt 自动三态,会改写子 TM 勾选态;文档 rule4 要求"屏蔽不改状态、可恢复"(随 2D/3D 做)。 - GS 选中是否返回其下全部 ds,未实测后端。 4. **2D/3D 相关交互**:显示/隐藏、定位、双击地图获焦 — 按约定占位。 --- ## 三、下一步计划 | 优先 | 任务 | 前置 | |---|---|---| | P0 | 用户实测 编辑保存 / 新建TM / 删除;据真实 body 定版字段 | 用户测试 | | P1 | 新建 GS(GS 类型来源:研究原版「项目结构\添加」,疑似需 gsTypeId) | Playwright | | P1 | 导入 DS 向导(TM.dsList 选类型 → query/script → 文件 → checkImport → import;含 multipart 上传) | 抓 import 细节 | | P2 | 导出对话框(queryExportObject 选对象 + 模板 → templateExport/export) | 抓 export body | | P2 | 插件「关联过滤 + 调用」(某 ds 适用哪些模型 + 模型任务流) | 研究原版 | | P3 | 动态表单只读规则、GS 三态语义(与 2D/3D 批次合并)、项目根可选中 | — | ### 提交体捕获方法(不动生产数据的前提下尽量做) - 优先:用户在原系统真实操作一次,复制 Network 请求体。 - 备选:继续分析 `index-*.js` 路由分包中数据管理组件的保存处理逻辑。