Files
insar-management-system-v2/docs/OPS_TASK_MAINTENANCE_PANEL_DESIGN_20260702.md

7.4 KiB

运维任务维护面板设计

日期:2026-07-02

背景

当前系统的生产任务、扫描任务和数据准备任务已经统一沉淀到 system_taskssystem_jobstask_logs 以及各业务 run 表中。实际运维中经常出现以下场景:

  • 用户提交 D-InSAR 生产或数据准备任务后,外部进程失败、服务器断电或 worker 心跳超时。
  • 数据库任务已经 FAILED,但业务 item/execution 仍残留 RUNNING
  • 磁盘上存在半成品目录,但数据库记录已经失败或需要清理。
  • 需要先判断任务是否仍在真实执行,再决定是否清理数据库记录和磁盘目录。

过去这些动作依赖人工查表和命令行处理。第一版运维面板要把这个过程产品化:用户能查看任务状态、诊断失败原因、预览清理影响,并由管理员执行清理。面板不负责重跑,清理完成后用户回到业务页面重新提交。

目标

  1. 在“运行维护”中增加“任务维护”能力。
  2. 自动列出异常任务,尤其是 D-InSAR 生产、D-InSAR 数据准备、扫描、配对缓存重建等长耗时任务。
  3. 对单个任务提供诊断详情:任务、job、run、item、execution、日志、结果登记和磁盘路径。
  4. 对可清理任务提供清理预览,明确会删除哪些数据库记录和哪些目录。
  5. 管理员确认后执行清理,并写入审计日志。
  6. 不提供重跑按钮,不在运维页重新提交业务任务。

非目标

  • 不做自动重跑。
  • 不做跨业务的复杂恢复编排。
  • 不在第一版支持任意 SQL 或任意路径删除。
  • 不清理源资产库、DEM 库、精密轨道库、代码目录。
  • 不处理仍有真实生产进程运行的任务;这种任务应先取消或等待结束。

异常任务定义

第一版将以下任务纳入维护列表:

  • system_tasks.status 属于 FAILEDPARTIAL_SUCCESSCANCELLED
  • system_jobs.statusRUNNINGheartbeat_at 超过阈值。
  • system_tasks.statusRUNNING,但无活跃 job 且无真实进程证据。
  • D-InSAR production run 终态失败,但 item/execution 中存在 RUNNINGPENDING 残留。
  • 数据库记录引用的生产结果目录不存在。
  • 生产结果目录存在,但没有匹配的 run 或 result product 登记。

第一版优先实现:

  • LANDSAR_RUN / LANDSAR_CLUSTER_RUN / PYINT_RUN / IDL_RUN_DINSAR
  • COPY_DATA
  • PAIRING_CACHE_REBUILD
  • 扫描类任务只读展示,清理动作后续扩展

后端设计

新增运维任务维护路由:

backend/app/routers/ops_maintenance.py

建议接口:

  • GET /api/ops-maintenance/tasks
    • 返回异常任务列表。
    • 支持 task_typestatuslimitoffset
  • GET /api/ops-maintenance/tasks/{task_id}/diagnosis
    • 返回单任务诊断详情。
  • POST /api/ops-maintenance/tasks/{task_id}/cleanup-preview
    • 生成清理预览,不执行删除。
  • POST /api/ops-maintenance/tasks/{task_id}/cleanup
    • 管理员确认后执行清理。

列表返回模型

每条任务至少包含:

  • task_id
  • task_type
  • task_name
  • status
  • created_at
  • started_at
  • ended_at
  • updated_at
  • progress
  • message
  • run_id
  • job_id
  • job_status
  • issue_level: info / warning / danger
  • issue_summary
  • cleanup_supported
  • cleanup_blocked_reason
  • counts
    • jobs
    • logs
    • run_items
    • executions
    • result_products
    • disk_paths

诊断详情模型

诊断详情包含:

  • task
  • jobs
  • production_run
  • production_item_counts
  • production_execution_counts
  • result_products
  • compat_results
  • recent_logs
  • disk_paths
  • process_check
  • diagnosis
    • summary
    • findings
    • cleanup_supported
    • cleanup_blockers

清理预览模型

清理预览必须返回完整影响范围:

  • database_deletes
    • system_tasks
    • system_jobs
    • task_logs
    • dinsar_production_runs
    • dinsar_production_run_items
    • dinsar_production_executions
    • result_products
    • dinsar_results
    • workflow_runs
    • workflow_steps
    • workflow_artifacts
  • disk_deletes
    • path
    • kind: task_pool / production_result / run_log
    • exists
    • size_bytes 可选
    • allowed
  • blocked
  • blockers
  • requires_admin

清理执行

执行接口只接受预览中允许的清理项,不接受前端传来的任意路径。

请求体:

{
  "confirm": true,
  "delete_task_records": true,
  "delete_logs": true,
  "delete_production_records": true,
  "delete_result_products": true,
  "delete_production_dirs": true,
  "delete_task_pool_dir": true
}

执行顺序:

  1. 重新生成清理预览。
  2. 校验任务不是 PENDING / RUNNING,或已被诊断为 stale 且无真实进程。
  3. 校验所有待删目录在白名单根目录内。
  4. 删除数据库记录。
  5. 删除磁盘目录。
  6. 写审计日志。
  7. 返回复查结果。

路径白名单

允许删除的目录根:

  • settings.DINSAR_TASK_ROOTS 或系统配置的数据准备根,例如 D:\Task_Pool\DInSAR
  • settings.PRODUCTION_RESULTS_ROOT 下的 D-InSAR 发布目录,例如 D:\production_results\dinsar
  • 系统 runtime run log 目录中与 run_id 精确匹配的日志文件

禁止删除:

  • 磁盘根目录
  • 项目代码目录
  • 源产品资产目录
  • 精密轨道目录
  • DEM 目录
  • 未由系统登记的任意路径

前端设计

入口放在 HealthCheckPanel.jsx 的“低频维护”区域,新增“任务维护”区块。整体延续现有运维页视觉:高密度、少装饰、状态明确。

页面结构

  1. 顶部摘要条

    • 异常任务数
    • 可清理任务数
    • 阻塞清理任务数
    • 最近一次清理时间
  2. 筛选栏

    • 任务类型
    • 状态
    • 关键词
    • 刷新按钮
  3. 异常任务表

    • 状态
    • 类型
    • 名称
    • 进度/统计
    • 失败摘要
    • 更新时间
    • 操作:诊断
  4. 诊断详情抽屉或内联详情

    • 基础任务信息
    • job 状态
    • D-InSAR run 状态
    • item/execution 统计
    • 磁盘路径检查
    • 最近日志
    • 诊断结论
  5. 清理预览

    • 数据库删除数量
    • 磁盘目录列表
    • 阻塞原因
    • 管理员确认按钮

交互原则

  • 非管理员可以查看诊断,但不能执行清理。
  • 清理按钮只在预览完成且无阻塞时启用。
  • 真实进程仍在运行时禁止清理。
  • 清理完成后刷新列表,不提供“重新执行”入口。
  • 删除影响必须在按钮前可见,不用弹窗隐藏关键信息。

审计日志

每次清理写入审计日志:

  • 操作人
  • 操作时间
  • task_id
  • run_id
  • 删除选项
  • 删除前状态快照
  • 数据库删除数量
  • 磁盘删除路径
  • 删除结果
  • 失败原因

第一版实现边界

第一版聚焦 D-InSAR 生产和数据准备任务:

  • LANDSAR_RUN
  • LANDSAR_CLUSTER_RUN
  • PYINT_RUN
  • IDL_RUN_DINSAR
  • COPY_DATA

扫描任务、SBAS 任务和结果交付任务先进入只读诊断列表,后续按同一接口扩展清理策略。

验收标准

  1. 运维页能列出失败或部分成功的 D-InSAR/COPY_DATA 任务。
  2. 点击任务能看到 task/job/run/item/execution/log/path 诊断详情。
  3. 对失败且无真实进程的 D-InSAR 任务能生成清理预览。
  4. 管理员能执行清理,普通用户不能。
  5. 清理后关联数据库记录为 0,登记过的生产目录被删除。
  6. 清理动作写入审计日志。
  7. 前端构建通过。