## 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 明细,可后续补一个双向/反向展示字段。 ## Work Log - 接入 WebSocket STOMP 机制(2026-04-26) - 背景: - 用户要求在当前 `fquiz` 系统落地 Socket STOMP 机制。 - 本次改动(最小闭环): - 后端新增 STOMP 协议支持: - 新增 `api/app/services/stomp_protocol.py`,提供 STOMP 帧编解码、版本协商与 topic/destination 映射。 - `api/app/api/v1/ws.py` 新增 `GET /api/v1/ws/stomp` WebSocket 端点(ticket 鉴权保持不变),支持: - `CONNECT/STOMP` - `SUBSCRIBE/UNSUBSCRIBE` - `DISCONNECT` - `SEND /app/ping`(收据语义) - 保留原有 `/api/v1/ws` JSON 协议端点,确保兼容。 - 推送管理器双协议化: - `api/app/services/ws_manager.py` 扩展为 JSON/STOMP 双协议连接管理与事件分发。 - 新增 STOMP 订阅 id 到 topic 的映射处理,保证 `MESSAGE.subscription` 可回填对应订阅。 - 现有 `publish_topic/publish_to_user` 调用链不变。 - 前端切换到 STOMP: - `web/src/components/ws-provider.tsx` 改为通过 `/api/v1/ws/stomp` 连接并发送 STOMP 帧。 - 保持 `useWS` / `useTopicSubscription` 现有 API 不变,业务页面无须改动。 - 新增 `web/src/lib/stomp.ts` 作为前端 STOMP 帧编解码工具。 - 验证: - `python3 -m py_compile api/app/services/stomp_protocol.py api/app/services/ws_manager.py api/app/api/v1/ws.py` -> 通过。 - `npm --workspace web exec tsc --noEmit --pretty false` -> 通过。 - 风险与影响: - 目前后端 STOMP 路径已支持核心命令(CONNECT/SUBSCRIBE/UNSUBSCRIBE/DISCONNECT);事务相关命令仅做兼容性接收,不做事务语义实现。 - 权限变化后,STOMP 连接上的非法 topic 会被后台移除但不再下发 JSON `unsubscribed` 提示;前端依赖重连后重新协商订阅。