Files
2026-04-26 16:13:09 +08:00

533 lines
31 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.
## Work Log - 去除后台左侧菜单标题与底部角色状态文案(2026-04-26)
- 背景:
- 用户要求去掉左侧导航中的“系统菜单”文案,以及底部“当前角色:admin”“账号状态:active”两行。
- 本次改动(最小闭环):
- `web/src/app/admin/layout.tsx`
- 删除桌面端侧栏顶部文案“系统菜单”。
- 删除桌面端侧栏底部角色/状态信息块。
- 移动端左侧抽屉标题改为 `null`,不再显示“系统菜单”。
- 菜单开关按钮 `aria-label` 同步调整为“打开菜单/展开菜单/收起菜单”。
- 验证:
- `rg -n "系统菜单|当前角色:|账号状态:" web/src/app/admin/layout.tsx -S` -> 无匹配。
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- 风险与影响:
- 仅影响后台左侧导航展示文案,不涉及菜单权限、路由与接口逻辑。
## Work Log - 打包镜像并发布更新(2026-04-26)
- 背景:
- 用户要求执行“打包镜像并发布更新”。
- 本次执行:
- `docker compose build`
- `docker compose up -d`
- 验证:
- `docker compose ps``api/web/celery/db/redis/minio` 均为 Up`api/db/redis` healthy。
- `docker compose logs --tail=80 api`Uvicorn 启动完成,`GET /health` 返回 200。
- `docker compose logs --tail=80 web`Next.js Ready。
- `curl -fsS http://127.0.0.1:8000/health`:返回 `{"status":"ok","service":"fquiz-api","version":"0.1.0"}`
- `curl -I -fsS http://127.0.0.1:3000/`:返回 `HTTP/1.1 200 OK`
- 风险与影响:
- 本次为镜像重建与容器滚动重启,存在短时服务切换窗口;未执行数据库结构变更。
## Work Log - 下线收件箱、提示词管理、代码评审与 Git管理(2026-04-26
- 背景:
- 用户要求删除“收件箱、提示词管理、代码评审、Git管理”功能。
- 本次改动:
- 前端:
- 删除后台页面入口:
- `web/src/app/admin/inbox/page.tsx`
- `web/src/app/admin/prompt/page.tsx`
- `web/src/app/admin/system-message/page.tsx`
- `web/src/app/admin/code-review/page.tsx`
- `web/src/app/admin/git-desktop/page.tsx`
- `web/src/app/admin/page.tsx` 删除对应后台首页卡片。
- `web/src/app/admin/menus/page.tsx` 删除对应受保护菜单编码。
- `web/src/types/auth.ts` 删除系统消息/提示词管理相关类型。
- 后端:
- 删除提示词管理 API、schema、service、model
- `api/app/api/v1/system_messages.py`
- `api/app/schemas/system_message.py`
- `api/app/services/system_message_service.py`
- `api/app/models/system_message.py`
- `api/app/api/router.py` 取消 `/api/v1/admin/system-messages*` 路由挂载。
- `api/app/core/database.py``api/app/models/__init__.py` 取消 `system_message` 模型导入。
- `api/app/services/seed_service.py` 删除默认权限、默认菜单和 admin 菜单绑定。
- `api/app/services/admin_service.py``api/app/services/legacy_admin_rbac_service.py``api/app/services/legacy_authz_service.py` 将四个历史菜单编码纳入已下线过滤,避免存量菜单继续展示。
- `api/app/services/topic_registry.py` 删除 `admin.system-messages` 订阅规则。
- 验证:
- `python3 -m py_compile api/app/api/router.py api/app/core/database.py api/app/models/__init__.py api/app/services/seed_service.py api/app/services/admin_service.py api/app/services/legacy_admin_rbac_service.py api/app/services/legacy_authz_service.py api/app/services/topic_registry.py` -> 通过。
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过(清理 `.next` 后复跑)。
- `npx eslint src/app/admin/page.tsx src/app/admin/menus/page.tsx src/types/auth.ts` -> 通过。
- `npm run build:web` -> 通过,构建路由列表已不再包含 `/admin/inbox``/admin/prompt``/admin/system-message``/admin/code-review``/admin/git-desktop`
- `git diff --check`(命中文件)-> 通过。
- `npx @ant-design/cli lint src/app/admin/page.tsx --format json`:默认 npx cache 报 `ENOTEMPTY`;改用 `/tmp` 独立 cache 后命令长时间无返回,已终止卡住进程,未得到有效 AntD CLI lint 结果。
- 风险与影响:
- 本次仅下线入口、路由、默认权限/菜单和提示词管理执行链路,不执行数据库 drop;存量 `system_messages` 表如果已存在,会作为历史数据保留。
- `admin.system_message``admin.inbox``admin.code_review``admin.git_desktop` 被保留在 removed/disabled 集合中,仅用于过滤历史菜单。
## Work Log - 文件管理页去掉左侧挂载点(2026-04-26)
- 背景:
- 用户要求:文件管理仅会有本地/SFTP/S3 三种后端,不会出现多挂载点场景,去掉左侧挂载点。
- 本次改动(最小闭环):
- `web/src/app/admin/files/page.tsx`
- 删除左侧“挂载点”卡片与挂载点列表按钮组。
- 删除前端挂载点切换状态与逻辑(`mountCode``handleSelectMount`)。
- 文件列表查询改为仅按 `path` 拉取,由后端返回 `current_mount` 作为当前挂载上下文。
- 保留文件操作接口参数 `mount_code`,统一使用当前响应中的 `current_mount.code`
- 验证:
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- 风险与影响:
- 前端不再支持多挂载点手动切换;若后续恢复多挂载点产品形态,需要补回挂载点切换入口。
- 后端接口与数据模型未改动,仍兼容多挂载点能力。
## Work Log - 任务监控功能彻底收口(2026-04-26)
- 背景:
- 用户要求“补充任务监控功能”并“彻底收口”。
- 本次改动:
- 后端接口对齐 Celery 监控语义:
- `api/app/api/v1/task_monitor.py`
- 查询参数统一为 `task_limit` / `history_limit`
- 权限校验统一为 `celery.read` / `celery.manage`
- 移除旧的需求/待办聚合参数与依赖(`risk_limit` / `stale_hours`)。
- 前端页面按 Celery schema 重写:
- `web/src/app/admin/task-monitor/page.tsx`
- 请求参数改为 `task_limit` / `history_limit`
- 页面展示改为 Worker / Queue / Task 三块监控表格。
- 统计卡片改为在线 Worker、总并发、队列待处理、采样任务数。
- 状态分布改为任务状态桶(`STARTED/RECEIVED/SCHEDULED/...`)。
- 页面权限改为 `celery.read` / `celery.manage`
- 后台首页入口口径同步:
- `web/src/app/admin/page.tsx`
- “任务监控”卡片文案改为 Celery 监控描述。
- 可见权限改为 `celery.read` / `celery.manage`
- 验证:
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- `python3 -m compileall api/app/api/v1/task_monitor.py api/app/services/task_monitor_service.py api/app/schemas/task_monitor.py` -> 通过。
- 风险与影响:
- 任务监控口径从“需求/待办风险聚合”切换为“Celery 运行态监控”;若历史调用仍传 `risk_limit/stale_hours`,将不再生效。
- 页面和接口权限都已切至 `celery.*`,需要对应角色具备 Celery 权限才可访问。
## Work Log - 任务监控补齐 Celery 队列积压与历史状态(2026-04-26)
- 背景:
- 用户确认“任务监控要监控 Celery 队列和任务状态”,需要从方案落到可运行实现。
- 本次补齐:
- 后端 `api/app/services/task_monitor_service.py`
- `inspect.active/reserved/scheduled/active_queues/stats/ping` 聚合 Worker 与实时任务。
- Broker 为 Redis 时按队列执行 `LLEN`,输出真实 `pending_count`(不再用 reserved/scheduled 近似值)。
- Result backend 为 Redis 时扫描 `celery-task-meta-*`,补齐 `SUCCESS/FAILURE/RETRY/REVOKED` 历史状态。
- 任务明细按状态优先级 + 时间排序,支持 `task_limit/history_limit`
- 接口与权限:
- `api/app/api/v1/task_monitor.py` 改为 `task_limit/history_limit` 参数。
- 权限校验统一为 `celery.read` / `celery.manage`
- 权限映射与菜单:
- `api/app/services/seed_service.py` 增加 `celery.read/celery.manage`,并将 `admin.task_monitor` 权限改为 `celery.read`
- `api/app/services/legacy_authz_service.py` 同步 `admin.task_monitor -> celery.*` 映射。
- 前端 `web/src/app/admin/task-monitor/page.tsx`
- 展示 Worker/Queue/Task 三块监控视图;
- 自动刷新、任务上限、历史扫描上限可配置;
- 状态 Tag 与失败摘要展示。
- 验证:
- `python3 -m py_compile api/app/schemas/task_monitor.py api/app/services/task_monitor_service.py api/app/api/v1/task_monitor.py api/app/services/seed_service.py api/app/services/legacy_authz_service.py` -> 通过。
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- 风险与影响:
- Redis 扫描历史任务采用 `SCAN` + 限流(`history_limit * 20`)策略;历史量极大时仅展示采样窗口内数据。
- 当前未新增 DB 持久化索引,历史任务名称在 result backend 未携带时会显示为 `-`
## Work Log - 移除后台页面顶部标题与描述信息(2026-04-26)
- 背景:
- 用户要求去掉所有后台页面顶部的标题和描述信息(例如“线路管理”“按角色权限访问当前模块,完成查询、维护、协作与操作留痕”)。
- 本次改动(最小闭环):
- `web/src/app/admin/layout.tsx`
- 删除后台壳层内容区顶部公共信息块(Breadcrumb + 页面标题 + 页面描述)。
- 同步清理对应的 breadcrumb/title 计算逻辑与无用导入。
- 验证:
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- 风险与影响:
- 仅影响后台页面顶部展示,不涉及页面业务逻辑、接口、权限与路由行为。
## Work Log - 下线 AI/编排/MCP/模型/API测试/知识集/图谱/需求/日程功能(2026-04-26
- 背景:
- 用户要求删除“AI 聊天、编排管理、MCP管理、模型管理、API测试、知识集管理、流程图、思维导图、需求管理、日程管理”功能。
- 本次改动:
- 前端入口与页面删除:
- 删除 `/admin/chat``/admin/agent``/admin/orchestration``/admin/mcp-server``/admin/models``/admin/api-tester``/admin/files``/admin/knowledge-set``/admin/mermaid-mgr``/admin/mindmap``/admin/requirements``/admin/schedule` 对应页面文件。
- `web/src/app/admin/page.tsx` 删除对应后台首页卡片,仅保留用户/角色/菜单/系统参数/任务监控/线路/雷电/系统日志/Wine 执行器。
- `web/src/app/admin/menus/page.tsx` 删除已下线菜单的前端受保护编码。
- `web/src/types/auth.ts` 删除 File/Model/TokenUsage/Chat/MindMap/Mermaid/Requirement/Todo 等已下线前端 DTO 类型。
- 后端公开 API 下线:
- `api/app/api/router.py` 取消挂载 chat/admin-files/calendar/mermaid/mindmap/requirements/todos/project_requirement 等路由。
- 删除对应 route/schema/service/model 文件:chat、file_storage、mermaid、mind_map;删除 public requirements/todos/calendar/project_requirement API。
- `api/app/api/v1/admin.py` 删除模型管理与模型路由管理端点。
- 默认权限/菜单收口:
- `api/app/services/seed_service.py` 删除 `chat.use``file.*``model.*``requirement.*``todo.*` 默认权限,删除对应默认菜单与 admin 绑定。
- `api/app/services/admin_service.py``legacy_admin_rbac_service.py``legacy_authz_service.py` 将已下线菜单编码放入 removed/disabled 过滤集合,屏蔽存量菜单。
- `api/app/services/topic_registry.py` 删除已下线模块订阅规则。
- 任务监控适配:
- `/admin/task-monitor` 保留,但口径固定为 Celery Worker/Queue/Task 监控,不再读取需求/待办数据。
- `api/app/services/model_service.py` 保留内部模型注册/路由基础设施,但移除已下线 `/api/v1/admin/models*` 刷新提示,并将 topic 改为内部 `model.registry`
- 验证:
- `python3 -m compileall api/app` -> 通过。
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过(删除 `.next` 后复跑,避免旧路由类型缓存)。
- `npx eslint src/app/admin/page.tsx src/app/admin/menus/page.tsx src/app/admin/task-monitor/page.tsx src/types/auth.ts` -> 通过。
- `npm run build:web` -> 通过;构建路由列表仅保留 `/admin``/admin/users``/admin/roles``/admin/menus``/admin/system-params``/admin/task-monitor``/admin/power-lines``/admin/lightning-currents``/admin/lightning-distribution``/admin/syslog``/admin/wine-runner`
- `git diff --check` -> 通过。
- 风险与影响:
- 本次不执行数据库 drop;历史表和历史数据保留。
- 本机 Python 与 `.venv` 均缺少 FastAPI`PYTHONPATH=api python -c "from app.api.router import api_router"` 无法作为导入验证;已用 `compileall` 覆盖语法级后端检查。
- 模型注册表/路由表仍保留给内部 LLM 网关与寿命倒计时等内部能力使用,但后台模型管理/API 测试页面和 admin API 已移除。
## Work Log - 打包镜像并发布功能下线更新(2026-04-26)
- 背景:
- 用户要求“打包镜像并发布更新”。
- 本次执行:
- `docker compose build`
- `fquiz-api``fquiz-web``fquiz-celery-worker``fquiz-celery-beat` 构建完成。
- Web 镜像构建阶段 `next build` 通过,路由列表仅保留当前有效后台模块。
- `docker compose up -d`
- 重建并启动 `api/web/celery-worker/celery-beat`
- `db/redis/minio` 继续复用运行中容器。
- 验证:
- `docker compose ps`
- `fquiz-api` Up 且 healthy。
- `fquiz-web` Up。
- `fquiz-celery-worker` Up。
- `fquiz-celery-beat` Up。
- `fquiz-db``fquiz-redis` healthy。
- `curl -fsS http://127.0.0.1:8000/health` -> `{"status":"ok","service":"fquiz-api","version":"0.1.0"}`
- `curl -I -fsS http://127.0.0.1:3000/` -> `HTTP/1.1 200 OK`
- `docker compose logs --tail=120 api`Uvicorn 启动完成,`/health` 返回 200。
- `docker compose logs --tail=100 web`Next.js Ready。
- `docker compose logs --tail=80 celery-worker`worker 连接 Redis 并 ready。
- `docker compose logs --tail=80 celery-beat`beat 启动完成。
- OpenAPI 运行态检查:`/api/v1/chat``/api/v1/admin/files``/api/v1/calendar``/api/v1/mermaids``/api/v1/mindmap``/api/v1/requirements``/api/v1/todos``/api/project/requirement``/api/v1/admin/models``/api/v1/admin/model-routes` 均无匹配。
- 风险与影响:
- 发布过程重启了 API、Web、Celery Worker、Celery Beat,存在短时服务切换窗口。
- Celery Worker 日志仍有 root 用户运行的既有安全警告,服务状态正常但后续生产化可考虑设置非 root 用户。
## Work Log - 还原文件管理模块(2026-04-26
- 背景:
- 用户要求恢复系统文件管理模块,并延续此前“单挂载点交互”约束。
- 本次改动:
- 恢复文件管理核心代码:
- `api/app/api/v1/admin_files.py`
- `api/app/models/file_storage.py`
- `api/app/schemas/file_storage.py`
- `api/app/services/file_service.py`
- `api/app/services/storage_driver.py`
- `web/src/app/admin/files/page.tsx`
- 恢复后端接线:
- `api/app/api/router.py` 重新挂载 `admin_files_router`
- `api/app/models/__init__.py``api/app/core/database.py` 重新注册 `file_storage` 模型。
- 恢复权限/菜单/订阅口径:
- `api/app/services/seed_service.py` 恢复 `file.read`/`file.manage``admin.files` 菜单、默认存储后端与挂载 seed。
- `api/app/services/legacy_authz_service.py` 恢复 `admin.files` 权限映射与 synthetic legacy menu。
- `api/app/services/topic_registry.py` 恢复 `admin.files` topic 订阅规则。
- `api/app/services/admin_service.py` / `legacy_admin_rbac_service.py` 恢复 `admin.files` 为受保护菜单,并从 removed/disabled 过滤中放开。
- `web/src/app/admin/menus/page.tsx` 恢复 `admin.files` 为前端受保护菜单。
- `web/src/app/admin/page.tsx` 恢复“文件管理”入口卡片。
- `web/src/types/auth.ts` 恢复文件管理相关类型定义。
- 文件管理页面按单挂载点收口:
- 去掉左侧挂载点列表与挂载切换状态,仅保留当前挂载上下文下的目录浏览与文件操作。
- 验证:
- `python3 -m compileall api/app/api/router.py api/app/api/v1/admin_files.py api/app/core/database.py api/app/models/__init__.py api/app/models/file_storage.py api/app/schemas/file_storage.py api/app/services/file_service.py api/app/services/storage_driver.py api/app/services/seed_service.py api/app/services/topic_registry.py api/app/services/legacy_authz_service.py api/app/services/legacy_admin_rbac_service.py api/app/services/admin_service.py` -> 通过。
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- `npm --workspace web exec eslint src/app/admin/files/page.tsx src/app/admin/page.tsx src/app/admin/menus/page.tsx src/types/auth.ts --max-warnings=0` -> 通过。
- 风险与影响:
- 现有仓库仍包含大量其他未提交改动;本次仅在文件管理恢复相关文件完成闭环,未触及其他下线模块恢复。
- 若现网数据库已经移除历史 `menu`/`role_menu_rela` 数据,需要重启后触发 seed 才能自动补齐 `admin.files` 菜单和默认挂载。
## Work Log - ATP 仿真模型管理一期落地(2026-04-26)
- 背景:
- 用户确认按“ATPDraw 产物版本管理 + ATP 引擎调用”方案实现。
- 本次改动:
- 后端新增 ATP 模块(模型/版本/运行):
- 新增数据模型:
- `api/app/models/atp_model.py`
- `atp_model`(模型台账)
- `atp_model_version`(版本与产物元数据)
- `atp_simulation_run`(仿真运行记录)
- 新增 schema
- `api/app/schemas/atp_model.py`
- 新增服务:
- `api/app/services/atp_model_service.py`
- 模型 CRUD、版本管理、激活版本、运行记录查询
- ATP 引擎状态检查与同步执行落库(支持 `wine/native`
- 新增 API
- `api/app/api/v1/atp_models.py`
- 路由前缀:`/api/v1/atp/models`
- 关键端点:
- `GET /engine/status`
- `GET/POST/PATCH/DELETE /`
- `GET/POST/PATCH /{model_id}/versions*`
- `POST /{model_id}/versions/{version_id}/activate`
- `GET/POST /{model_id}/runs*`
- 后端接线与权限菜单:
- `api/app/api/router.py` 挂载 ATP 路由。
- `api/app/core/config.py` 新增 ATP 引擎配置:
- `atp_engine_mode`
- `atp_engine_executable`
- `atp_storage_root`
- `atp_engine_workdir`
- `atp_engine_default_timeout_seconds`
- `atp_engine_max_timeout_seconds`
- `api/app/models/__init__.py``api/app/core/database.py` 注册 ATP 模型。
- `api/app/services/seed_service.py` 新增权限:
- `atp.read` / `atp.manage` / `atp.run`
- 新增默认菜单 `admin.atp_models``/admin/power-lines/atp-viewer`
- `api/app/services/legacy_authz_service.py``legacy_admin_rbac_service.py``admin_service.py``topic_registry.py` 同步 ATP 菜单权限映射、受保护菜单与订阅主题(`admin.atp-models`)。
- 前端 ATP 页面升级:
- `web/src/app/admin/power-lines/atp-viewer/page.tsx`
- 从“纯查看器”升级为“模型台账 + 版本管理 + 仿真运行 + 文本转换预览”四块。
- 支持模型创建/编辑/删除、版本创建/激活、版本加载回编辑区、运行任务执行与日志查看。
- 保留 ATP 文本解析与 maxGraph 渲染能力。
- `web/src/types/auth.ts` 增加 ATP 模块类型定义。
- `web/src/app/admin/page.tsx` ATP 卡片升级为“ATP模型管理”,权限切到 `atp.*`
- `web/src/app/admin/power-lines/page.tsx` 线路页入口文案改为“ATP模型管理”,并按 `atp.*` 权限显示。
- `web/src/app/admin/menus/page.tsx` 新增 `admin.atp_models` 受保护菜单码。
- 验证:
- 后端:
- `python3 -m compileall api/app` -> 通过。
- 前端:
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- `npm --workspace web exec eslint src/app/admin/power-lines/atp-viewer/page.tsx src/app/admin/page.tsx src/app/admin/menus/page.tsx src/types/auth.ts --max-warnings=0` -> 通过。
- `npm run build:web` -> 通过;路由包含 `/admin/power-lines/atp-viewer`
- 风险与影响:
- ATP 运行为同步执行(请求内完成),长耗时任务会占用 API worker;后续可升级为 Celery 异步执行。
- `atp_engine_executable` 默认值仅为占位,实际运行需按部署环境配置可执行 ATP 引擎路径。
## Work Log - 线路管理地图专题化为线路走向图(2026-04-26)
- 背景:
- 用户要求“线路管理页面的图用于展示线路在地图上的分布走向,不要通用地图功能”。
- 本次改动(A 方案,最小闭环):
- `web/src/components/power-line-cesium-map.tsx`
- Cesium Viewer 改为专题化初始化:显式 `baseLayer: false`,关闭 `skyBox/skyAtmosphere`,弱化通用地图能力。
- 保留线路业务核心可视化:按杆塔 `seq_no` 连线、杆塔点位、起点/终点标识。
- 新增线路走向专题控件:`按风险着色``显示塔号``居中重置`
- 新增走向统计信息:有效坐标数、缺失坐标数、断点段数、线路估算长度(Haversine)。
- 对缺失坐标导致的序号断档按分段折线绘制,避免误连成单条连续线路。
- `web/src/app/admin/power-lines/page.tsx`
- 视图切换文案由“地图”改为“走向图”。
- 当前视图状态文案同步改为“走向图”。
- 验证:
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- 风险与影响:
- 本次仅修改前端展示逻辑,不涉及后端接口、权限、路由与数据库结构。
- 因专题化禁用了默认底图,视觉上会更偏“线路走向专题视图”;若后续需要叠加真实底图,应单独评估并显式配置地图源。
## Work Log - 打包镜像并发布线路走向图更新(2026-04-26)
- 背景:
- 用户要求执行“打包镜像并发布更新”。
- 本次执行:
- `docker compose build`
- `docker compose up -d`
- 验证:
- `docker compose ps``api/web/celery-worker/celery-beat/db/redis/minio` 均为 `Up``api/db/redis` healthy。
- `curl -fsS http://127.0.0.1:8000/health`:返回 `{"status":"ok","service":"fquiz-api","version":"0.1.0"}`
- `curl -I -fsS http://127.0.0.1:3000/`:返回 `HTTP/1.1 200 OK`
- `docker compose logs --tail=120 api`Uvicorn 启动完成,`/health` 返回 200。
- `docker compose logs --tail=100 web`Next.js Ready。
- `docker compose logs --tail=80 celery-worker`worker 连接 Redis 并 ready(保留 root 运行警告)。
- `docker compose logs --tail=80 celery-beat`beat 启动完成。
- 风险与影响:
- 本次为镜像重建与容器重启,存在短时服务切换窗口。
- `celery-worker` 仍以 root 运行,功能可用但生产化建议后续切换为非 root 用户。
## Work Log - ATP 文本转 JSON 并用 maxGraph 查看(2026-04-26
- 背景:
- 用户要求开发“ATP 转 JSON,然后给 maxGraph 渲染”的查看能力,重点是展示,不涉及仿真。
- 本次改动(前端最小闭环):
- 新增依赖:
- `web/package.json` 增加 `@maxgraph/core`
- 新增 ATP 解析能力:
- `web/src/lib/atp/types.ts`:定义 ATP 图 JSON 结构(nodes/edges/stats/warnings)。
- `web/src/lib/atp/parse-atp-text.ts`:实现 ATP 文本解析器(支持常见 `R1 BUS_A BUS_B 10``BUS_A BUS_B R 10` 两类行格式)。
- `web/src/lib/atp/sample.ts`:提供可直接试跑的 ATP 示例文本。
- 新增 maxGraph 只读渲染组件:
- `web/src/components/atp-maxgraph-viewer.tsx`:渲染节点/正交连线,支持适配视图与缩放,不提供编辑能力。
- 新增业务页面:
- `web/src/app/admin/power-lines/atp-viewer/page.tsx`:提供上传 ATP 文本、转换 JSON、JSON 预览、maxGraph 图形查看、导出 JSON。
- 增加入口:
- `web/src/app/admin/power-lines/page.tsx`:在“线路管理”卡片增加 `ATP查看器` 入口按钮。
- `web/src/app/admin/page.tsx`:后台首页新增 `ATP查看器` 卡片入口(沿用线路模块权限)。
- 验证:
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- `cd web && npx eslint src/components/atp-maxgraph-viewer.tsx src/lib/atp/parse-atp-text.ts src/lib/atp/types.ts src/lib/atp/sample.ts src/app/admin/power-lines/atp-viewer/page.tsx` -> 通过。
- 构建产物确认:`web/.next/server/app/admin/power-lines/atp-viewer/page.js` 与相关 `rsc/html` 已生成。
- 风险与影响:
- 解析器当前是“查看优先”的通用文本解析,不覆盖 ATP/ATPDraw 全量语法;复杂模型卡、控制卡可能被忽略并进入 warnings。
- 本次不涉及后端 API/数据库改动,不影响现有线路与雷电业务接口。
## Work Log - 雷电模块补齐地面倾角计算链路(2026-04-26)
- 背景:
- 用户要求按“高程+坐标+3x3 邻域(Horn)”方案改造雷电分布统计中的地形倾角能力。
- 本次改动:
- 后端 schema 与响应扩展:
- `api/app/schemas/lightning.py`
- 新增 `LightningTowerTerrainMetrics`
- 新增 `LightningTowerTerrainComputeRequest/Response`
- `LightningTowerBufferStatsResponse` 增加 `terrain_metrics`
- 新增 `dem_grid_m` 的 3x3 校验
- 后端服务能力补齐:
- `api/app/services/lightning_service.py`
- 补齐 Horn 梯度、坡向、邻域坡度统计、分位数、线路方向纵横坡、质量评分、角差/方向导数等辅助函数。
- 新增 `compute_tower_terrain_metrics(...)`,支持:
- 基于 3x3 DEM 计算倾角/坡向/纵横坡/起伏量/暴露指数
- 可选按权限持久化到 `power_line_tower.raw_extra_json.terrain_metrics`
- `get_tower_buffer_stats(...)` 增加地形指标读取与风险修正(地形暴露指数参与 Ng 风险权重)
- 后端 API 新增:
- `api/app/api/v1/lightning.py`
- 新增 `POST /api/v1/lightning-currents/stats/tower-terrain`
- 权限:读权限可计算,`persist=true``tower.manage``lightning.manage`(或 admin
- 前端类型与展示:
- `web/src/types/auth.ts`
- 新增 `LightningTowerTerrainMetrics`
- 新增 `LightningTowerTerrainComputeRequest/Response`
- 扩展 `LightningTowerBufferStatsResponse.terrain_metrics`
- `web/src/app/admin/lightning-currents/page.tsx`
- 杆塔缓冲区结果区新增地形字段展示:倾角、坡向、暴露指数、纵/横坡、质量等级/评分、DEM 分辨率与来源
- 验证:
- `python3 -m py_compile api/app/services/lightning_service.py api/app/api/v1/lightning.py api/app/schemas/lightning.py` -> 通过。
- `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。
- 风险与影响:
- 当前计算输入 DEM 由调用方提供(3x3 高程矩阵),尚未接入自动 DEM 切片检索;生产精度仍依赖上游 DEM 分辨率与采样质量。
- 杆塔缓冲区风险等级已引入地形暴露权重,可能导致部分杆塔风险分级相对旧口径发生变化。
## Work Log - 飞书需求管理多维表格(下拉版)创建(2026-04-26)
- 背景:
- 用户要求“重新创建一个需求管理多维表格,能够用下拉的用下拉”。
- 本次执行:
- 通过 `lark-cli base` 新建 Base`需求管理多维表格`
- 将默认表重命名为 `需求管理`
- 字段下拉化(`type=select`)并配置选项:
- `优先级``P0/P1/P2/P3`
- `状态``待开始/进行中/评审中/已完成/阻塞`
- `需求类型``功能需求/缺陷修复/优化改进/技术债务`
- `需求来源``产品/运营/客户反馈/内部改进`
- `负责人``程凯/待分配`
- `风险等级``低/中/高/紧急`
- `进度``0%/25%/50%/75%/100%`
- `标签`(多选):`前端/后端/测试/接口/高优先`
- 文本/日期字段:`需求ID``需求名称``开始日期``截止日期``备注`(保留 `附件` 字段)。
- 写入 3 条示例需求记录,验证下拉与日期写入均正常。
- 验证:
- `HOME=/tmp lark-cli base +field-list --as user --base-token Xpsgb3jEUaZHlksbnY1cEXMrnpd --table-id tbleJyrScpTGtRdR` -> 下拉字段及选项已生效。
- `HOME=/tmp lark-cli base +record-batch-create ...` -> 返回 `ok: true`,成功写入 3 条记录。
- Base 地址:`https://my.feishu.cn/base/Xpsgb3jEUaZHlksbnY1cEXMrnpd`
- 风险与影响:
- 飞书 `field-update` 接口存在频控(`800004135`),本次采用“删除默认字段 + 重建字段”兜底策略完成配置。
- 保留了系统默认 `附件` 字段;若需极简字段集,可后续删除该列。
## Work Log - 需求多维表优先级改为英文四档(2026-04-26)
- 背景:
- 用户要求将“优先级”下拉改为 `Urgent/High/Medium/Low`
- 本次改动:
- 多维表:`https://my.feishu.cn/base/Xpsgb3jEUaZHlksbnY1cEXMrnpd`
- 表:`需求管理``tbleJyrScpTGtRdR`
- 字段 `优先级``fld02jCtl7`)下拉选项更新为:`Urgent``High``Medium``Low`
- 将现有 3 条示例记录优先级同步为:
- `REQ-001` -> `High`
- `REQ-002` -> `Medium`
- `REQ-003` -> `Urgent`
- 验证:
- `HOME=/tmp lark-cli base +record-list --as user --base-token Xpsgb3jEUaZHlksbnY1cEXMrnpd --table-id tbleJyrScpTGtRdR --limit 20`
- 返回数据中三条记录优先级分别为 `High/Medium/Urgent`
- 风险与影响:
- 飞书 `record-batch-update` 存在短时限频(`800004135`),本次通过串行+间隔重试完成。
## Work Log - 需求多维表新增 issue 关联表(2026-04-26
- 背景:
- 用户要求将主表名改为“需求列表”,并在同一 Base 中新增“issue列表”,且 issue 可关联到需求。
- 本次改动:
- Base`https://my.feishu.cn/base/Xpsgb3jEUaZHlksbnY1cEXMrnpd`
- 表改名:
- `需求管理` -> `需求列表``tbleJyrScpTGtRdR`
- 新增表:
- `issue列表``tblkI3rjksLcef67`
- `issue列表` 字段:
- `Issue标题`text
- `状态`select: Open/In Progress/Resolved/Closed
- `严重级别`select: P0/P1/P2/P3
- `指派给`select: 程凯/待分配)
- `截止日期`datetime
- `备注`text
- `关联需求`link -> `tbleJyrScpTGtRdR`
- 新增 2 条 issue 示例,并已关联到需求记录:
- `登录页按钮样式偏差` -> `REQ-001`
- `导出接口返回字段缺失` -> `REQ-002`
- 验证:
- `HOME=/tmp lark-cli base +table-list --as user --base-token Xpsgb3jEUaZHlksbnY1cEXMrnpd` -> 表列表包含 `需求列表``issue列表`
- `HOME=/tmp lark-cli base +record-list --as user --base-token Xpsgb3jEUaZHlksbnY1cEXMrnpd --table-id tblkI3rjksLcef67 --limit 20` -> `关联需求` 字段返回目标需求 `record id`
- 风险与影响:
- 当前 `link` 字段为单向关联(`bidirectional=false`);需求表未自动新增反向聚合列。如需在需求表中直接看 issue 明细,可后续补一个双向/反向展示字段。