7b79e12254
Co-authored-by: multica-agent <github@multica.ai>
13 KiB
13 KiB
Work Log - 修复文件管理页面删除无响应(2026-05-03)
-
背景:
- Issue
FL-174反馈“文件管理页面文件删除点了没反应”。 - 前端删除入口位于
web/src/app/admin/files/page.tsx的下拉菜单“更多 -> 删除”。
- Issue
-
根因:
- 页面使用了
Modal.confirm静态方法触发确认框;在当前 React 19 + Antd 5 组合下,该静态调用在部分页面上下文中可能不稳定,表现为点击删除无确认弹窗、无后续请求。 - 同页面存在一次遗留调用:
setSuccessMessage(""),对应状态已移除,存在潜在运行时错误风险。
- 页面使用了
-
本次改动(最小闭环):
- 文件:
web/src/app/admin/files/page.tsx - 将删除确认弹窗从
Modal.confirm({...})改为const { modal } = App.useApp(); modal.confirm({...})。 - 同步补充
handleDelete的依赖项:[deleteMutation, modal]。 - 删除遗留的
setSuccessMessage("")调用,避免运行时异常影响交互链路。
- 文件:
-
验证:
- 代码路径核对:删除操作仍走原有
deleteMutation -> /api/v1/admin/files/delete,仅调整确认框触发方式,不改接口契约。 - Git 提交:
c56f307(已推送到origin/dev)。
- 代码路径核对:删除操作仍走原有
-
风险与影响:
- 影响面仅文件管理页前端交互层。
- 后端接口、权限校验、删除请求参数与刷新逻辑保持不变。
Work Log - 新增高程数据Cesium预览(2026-05-03)
-
背景:
- Issue
FL-178需要“新增一个高程数据预览功能,用 Cesium 图渲染”。 - 现有
/admin/elevation仅支持数据集管理与回填任务,不具备高程点位可视化入口。
- Issue
-
本次改动:
- 后端新增高程预览接口:
GET /api/v1/elevation/datasets/{dataset_id}/preview?max_points=1500- 文件:
api/app/api/v1/elevation.py - 响应:数据集信息 + 预览点位(经纬度/高程)+ 告警信息。
- 后端新增预览 schema 与服务逻辑:
- 文件:
api/app/schemas/elevation.py- 新增
ElevationDatasetPreviewPoint、ElevationDatasetPreviewResponse
- 新增
- 文件:
api/app/services/elevation_service.py- 新增
preview_dataset(...) - CSV 预览:按步长抽样,避免一次返回全量点。
- IMG/TIF 预览:网格步进抽样,自动过滤 nodata、无效值,并在非 WGS84 时转换到 WGS84 坐标输出。
- 新增
- 文件:
- 前端新增 Cesium 预览组件与入口:
- 新文件:
web/src/components/elevation-preview-cesium-map.tsx- 渲染高程采样点,颜色按高程梯度(低蓝高红),点击点位可查看经纬度与高程。
- 页面接入:
web/src/app/admin/elevation/page.tsx- 数据集列表“操作”新增“预览”。
- 点击后拉取预览接口并在弹窗内展示 Cesium 地图。
- 类型补充:
web/src/types/auth.ts- 新增预览响应类型定义。
- 新文件:
- 后端新增高程预览接口:
-
结果:
- 已完成提交并推送到
dev:- Commit:
8672f4b - Message:
新增高程数据Cesium预览功能
- Commit:
- 已完成提交并推送到
-
风险与影响:
- 预览为采样结果,不等同于全量像元/点集展示;用于可视化核验分布与高程层级,不用于精确统计。
- 栅格数据在大范围/高分辨率场景下,预览点位受
max_points控制(默认 1500),避免接口与前端负载过高。
Work Log - 高程预览改造为地形网格渲染(2026-05-03)
-
背景:
- 用户反馈“预览应直接基于高程数据展示区域地形高低,与杆塔无关”。
- 旧实现以采样点云为主,语义偏“数据采样校验”,不符合地形预览预期。
-
本次改造:
- 后端预览响应扩展为双模式:
preview_mode = point_cloud | terrain_grid- 新增
cells(网格单元边界 + 高程)字段 - 文件:
api/app/schemas/elevation.py
- 栅格预览改造为地形网格输出(默认):
- 栅格按步长下采样后输出网格单元边界(WGS84)和单元高程
- 保留
points作为兼容信息,但前端优先用cells渲染色带 - 告警文案去除“回填/杆塔”语境,改为“预览渲染自动转 WGS84”
- 文件:
api/app/services/elevation_service.py
- 前端 Cesium 组件改造:
- 栅格数据优先渲染
rectangle地形网格色带(蓝低红高) - 点云模式作为 CSV/兜底展示
- 文件:
web/src/components/elevation-preview-cesium-map.tsx
- 栅格数据优先渲染
- 预览弹窗文案与模式展示更新:
- 明确显示当前模式“地形网格/点云”
- 页面提示改为“IMG/TIF/TIFF 预览为地形网格高低色带(与杆塔无关)”
- 文件:
web/src/app/admin/elevation/page.tsx
- 前端类型同步:
web/src/types/auth.ts
- 后端预览响应扩展为双模式:
-
交付:
- 提交:
556da5c - 信息:
改造高程预览为地形网格渲染 - 已推送到
origin/dev。
- 提交:
Work Log - 新增高程预览诊断信息面板(2026-05-03)
-
背景:
- 用户要求在预览弹窗补充“诊断信息”面板,便于快速定位“未提取到有效地形网格”的根因。
-
本次改动:
- 后端预览响应扩展
diagnostics字段:- 文件:
api/app/schemas/elevation.py - 新增模型:
ElevationDatasetPreviewDiagnostics - 字段覆盖:
- 源数据信息:
source_crs、源边界(min/max x/y) - WGS84 边界:
wgs84_bounds_* - 采样参数:
target_samples、sampling_step - 统计:
scanned_candidates、valid_preview_count - 跳过计数:读失败、masked、nodata、非有限值、样本/网格坐标转换失败、越界
- 源数据信息:
- 文件:
- 后端预览逻辑补充诊断采集:
- 文件:
api/app/services/elevation_service.py - CSV 模式:返回基础范围与采样统计。
- 栅格模式:返回 CRS/边界(含可转换时的 WGS84 边界)与逐类跳过计数。
- 文件:
- 前端新增诊断面板展示:
- 文件:
web/src/app/admin/elevation/page.tsx - 在预览弹窗中新增“诊断信息”卡片(
Descriptions),展示上述关键字段。
- 文件:
- 前端类型同步:
- 文件:
web/src/types/auth.ts - 新增
ElevationDatasetPreviewDiagnostics并挂载到ElevationDatasetPreviewResponse.diagnostics。
- 文件:
- 后端预览响应扩展
-
交付:
- 提交:
ba1b83f(rebase 后推送到dev的提交为4b0c7ed) - 信息:
新增高程预览诊断信息面板
- 提交:
Work Log - 高程数据集支持删除(2026-05-03)
-
背景:
- Issue
FL-180需要“高程数据集支持删除”。 - 现有高程管理仅支持创建/更新/分析/预览,缺少删除闭环。
- Issue
-
本次改动:
- 后端新增数据集删除能力:
- 文件:
api/app/services/elevation_service.py - 新增
delete_dataset(db, dataset_id):- 数据集不存在返回
False; - 存在运行中回填任务时返回
409,避免删除过程中任务写入异常; - 删除前先清理关联
elevation_apply_job记录,再删除数据集; - 发布
elevation.dataset.deleted主题事件,触发前端数据刷新。
- 数据集不存在返回
- 文件:
- 后端新增删除接口:
- 文件:
api/app/api/v1/elevation.py - 新增
DELETE /api/v1/elevation/datasets/{dataset_id}(权限:elevation.manage)。
- 文件:
- 前端高程管理页新增删除入口:
- 文件:
web/src/app/admin/elevation/page.tsx - 数据集操作列新增“删除”;
- 使用
App.useApp().modal.confirm二次确认; - 删除成功后提示并刷新数据集/任务列表,同时清理预览弹窗状态。
- 文件:
- 后端新增数据集删除能力:
-
风险与影响:
- 删除数据集会同时删除其关联的回填任务记录(仅记录,不会回滚已写入杆塔的高程值)。
- 若数据集存在运行中任务,接口会拒绝删除并提示先等待任务结束。
Work Log - 高程数据管理支持批量导入(2026-05-03)
-
背景:
- Issue
FL-182要求“高程数据管理要支持批量导入”。 - 现有能力仅支持单条新建数据集,不适合一次导入多条高程数据集元信息。
- Issue
-
本次改动(最小闭环):
- 后端新增批量导入 API:
- 文件:
api/app/api/v1/elevation.py - 新增
POST /api/v1/elevation/datasets/import(权限:elevation.manage,multipart/form-data上传 CSV)。
- 文件:
- 后端新增批量导入服务逻辑:
- 文件:
api/app/services/elevation_service.py - 新增
import_datasets_from_csv(...):- 解析 CSV 行级导入,支持中英文列名:
code/编码、name/名称、mount_code/挂载编码、file_path/文件路径、source/来源、resolution_m/分辨率、notes/备注。 - 复用现有
create_dataset校验(格式识别、文件存在性检查、编码唯一性)。 - 对导入成功的数据集自动触发
analyze_dataset,补齐样本数和边界框。 - 返回导入统计(新增/分析/跳过/告警)与成功导入的数据集清单。
- 解析 CSV 行级导入,支持中英文列名:
- 新增辅助函数:CSV 编码解码、列名取值、分辨率解析校验。
- 文件:
- 后端 schema 扩展:
- 文件:
api/app/schemas/elevation.py - 新增
ElevationDatasetBatchImportResponse。
- 文件:
- 前端高程管理页接入批量导入入口:
- 文件:
web/src/app/admin/elevation/page.tsx - 在“高程数据集”卡片右上新增“批量导入”按钮(上传 CSV)。
- 调用
/api/v1/elevation/datasets/import,导入后提示统计结果并刷新数据。 - 页面提示文案补充“支持通过批量导入上传数据集元数据 CSV”。
- 文件:
- 前端类型补充:
- 文件:
web/src/types/auth.ts - 新增
ElevationDatasetBatchImportResponse。
- 文件:
- 后端新增批量导入 API:
-
验证:
- 后端语法编译:
python3 -m compileall api/app通过。 - 遵循任务约束,未执行前端构建检查、未安装依赖。
- 后端语法编译:
-
风险与影响:
- 批量导入 CSV 仅导入“数据集元信息”,不会上传实际高程文件;文件需先在文件管理中准备到目标挂载路径。
- 单行存在字段/路径/编码问题时按行跳过并返回告警,不会中断整个批次。
Work Log - 修复 Flower 监控接口 502(2026-05-03)
-
背景:
- 前端报错:
GET /api/v1/admin/flower/workers?forceRefresh=false 502 (Bad Gateway)。 api日志显示该接口持续返回 502。
- 前端报错:
-
根因:
- Flower 代理链路为:
web -> api(/admin/flower/*) -> flower(/api/*)。 api容器读取FLOWER_BASIC_AUTH=admin:change_me,而flower容器实际以--basic-auth=admin:admin运行。api -> flower返回 401,后端代理服务按设计映射为 502,最终前端表现为 502。
- Flower 代理链路为:
-
本次改动(最小闭环):
- 文件:
deploy/pro-deploy/compose.yml- 在
api.environment增加:FLOWER_BASIC_AUTH: ${FLOWER_BASIC_AUTH}
- 在
- 文件:
deploy/dev-deploy/compose.yml- 同步在
api.environment增加:FLOWER_BASIC_AUTH: ${FLOWER_BASIC_AUTH}
- 同步在
- 文件:
MEMORY.md- 增加 Flower 代理鉴权一致性长期口径,要求
api与flower显式使用同一来源凭据。
- 增加 Flower 代理鉴权一致性长期口径,要求
- 文件:
-
验证:
- 容器内直连验证(现网):
http://flower:5555/api/workers?refresh=false使用admin:change_me返回 401。- 同接口使用
admin:admin返回 200({})。
- 配置校验:
deploy/pro-deploy/compose.yml已确认包含api.environment.FLOWER_BASIC_AUTH。
- 容器内直连验证(现网):
-
风险与影响:
- 影响范围:仅 Flower 代理鉴权配置注入,不改业务代码与数据。
- 若部署环境仍存在多层 env 覆盖(例如
.images.env),需确保最终生效值在api与flower一致。
Work Log - 修复 Redis MISCONF 导致 Celery 写入失败(2026-05-03)
-
背景:
- Issue
FL-181报错:redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but it's currently unable to persist to disk。 - 该错误会触发 Redis 写保护,导致 Celery 控制命令与任务相关写入失败。
- Issue
-
根因:
- 部署配置使用
redis-server --appendonly yes,默认仍启用 RDB 快照。 - 当宿主磁盘/权限导致 RDB 持久化失败时,Redis 默认
stop-writes-on-bgsave-error=yes会拒绝写请求,连带 Celery 报kombu.exceptions.OperationalError。
- 部署配置使用
-
本次改动(最小闭环):
- 文件:
deploy/dev-deploy/compose.yml - 文件:
deploy/pro-deploy/compose.yml - 将 Redis 启动参数调整为:
appendonly yes(保留 AOF 持久化)save ""(关闭 RDB 快照)stop-writes-on-bgsave-error no(避免快照异常触发全局写阻断)
- 文件:
.env.example- 补充 Redis 持久化策略说明,明确上述运行口径。
- 文件:
-
风险与影响:
- 影响面:仅 Redis 容器启动参数与部署说明。
- 风险:关闭 RDB 后,Redis 数据恢复主要依赖 AOF;当前场景下可避免 Celery 因 RDB 异常整体不可写。