533a325c86
Co-authored-by: multica-agent <github@multica.ai>
150 lines
9.0 KiB
Markdown
150 lines
9.0 KiB
Markdown
## Work Log - 当前环境将线路管理菜单置顶(2026-06-08)
|
||
|
||
- 背景:
|
||
- 仓库代码已支持 `admin.power_lines` 菜单,但默认排序仍落在其他后台一级菜单之后。
|
||
- 用户要求在当前环境中让“线路管理”展示在后台菜单最前面。
|
||
|
||
- 本次处理:
|
||
- 当前环境数据库:
|
||
- 将 `menus.code='admin.power_lines'` 的 `sort_order` 调整为 `0`。
|
||
- 仓库代码:
|
||
- `api/app/services/seed_service.py`
|
||
- 将默认种子菜单中 `admin.power_lines` 的 `sort_order` 同步改为 `0`,避免后续补种回退。
|
||
- `MEMORY.md`
|
||
- 补充“线路管理默认置顶”的长期口径。
|
||
|
||
- 验证:
|
||
- 复核后台菜单排序后,`线路管理` 已位于一级菜单首位。
|
||
|
||
- 风险与关注点:
|
||
- 已登录后台的浏览器会话需要刷新页面后才会看到最新菜单顺序。
|
||
|
||
## Work Log - 放出后台剩余目录菜单并补齐保护(2026-06-08)
|
||
|
||
- 背景:
|
||
- 当前仓库默认菜单集合缺少 `admin.basic_data`、`admin.system_monitor`、`admin.system` 3 个目录菜单。
|
||
- `admin.fl_analysis` 已有完整页面,但旧权限映射与菜单保护集合仍未完全覆盖。
|
||
|
||
- 本次处理:
|
||
- `api/app/services/seed_service.py`
|
||
- 补齐上述 3 个目录菜单,并将其加入 `admin` 默认菜单绑定。
|
||
- `api/app/services/admin_service.py`
|
||
- 将 `admin.system`、`admin.system_monitor`、`admin.basic_data`、`admin.fl_analysis`、`admin.fault_recurrence` 加入现代菜单删除保护集合。
|
||
- `api/app/services/legacy_admin_rbac_service.py`
|
||
- 将 `admin.system`、`admin.system_monitor`、`admin.basic_data`、`admin.fl_analysis` 加入 legacy 受保护菜单集合。
|
||
- `api/app/services/legacy_authz_service.py`
|
||
- 补齐 `admin.fl_analysis` 的 legacy 权限映射。
|
||
|
||
- 验证:
|
||
- `git diff --check` 通过。
|
||
- `npm --workspace web exec tsc --noEmit` 通过。
|
||
- `npm --workspace web exec eslint src/app/admin/fl-analysis/page.tsx src/app/admin/fault-recurrence/page.tsx` 通过。
|
||
- Python 变更文件 AST 语法解析通过。
|
||
|
||
- 风险与关注点:
|
||
- `admin.basic_data`、`admin.system_monitor`、`admin.system` 仍为无 `path` 的目录菜单,只承担菜单树占位与分组作用。
|
||
|
||
## Work Log - 在共享后端镜像内置 Wine(2026-06-08)
|
||
|
||
- 背景:
|
||
- 新需求要求把 Wine 安装到 `fquiz-celery-worker`。
|
||
- 当前仓库中 `celery-worker`、`api`、`celery-beat`、`flower` 复用同一个 `api/Dockerfile` / `${API_IMAGE}`,且后端已有 `/api/v1/wine/*` 直接探测与执行 Wine 的能力。
|
||
|
||
- 本次处理:
|
||
- `api/Dockerfile`
|
||
- 在系统依赖安装阶段加入 `wine`,并用 `command -v wine` 做镜像构建期存在性校验。
|
||
- `MEMORY.md`
|
||
- 将 Wine 口径从“运行环境自行安装”更新为“共享后端镜像已内置 Wine”。
|
||
|
||
- 验证:
|
||
- `python3 -c "import yaml; ..."` 解析 `deploy/dev-deploy/compose.yml`、`deploy/pro-deploy/compose.yml`、`.github/workflows/main.yml` 通过。
|
||
- `git diff --check` 通过。
|
||
- `python3 -m py_compile api/app/services/wine_service.py api/app/services/fl_analysis_external.py api/app/tasks/fl_analysis_tasks.py api/app/core/config.py` 通过。
|
||
- 当前执行环境无 `docker` 命令,未能本地实际跑 `docker compose build` / `docker compose config`。
|
||
|
||
- 风险与关注点:
|
||
- 由于部署链路复用同一个后端镜像,本次会同时影响 `api/celery-worker/celery-beat/flower` 的基础镜像体积,而不只是 `celery-worker`。
|
||
|
||
## Work Log - 修正 Wine 缺少 wine32 时的误报(2026-06-08)
|
||
|
||
- 背景:
|
||
- 当前环境里 `wine --version` 会输出 `it looks like wine32 is missing`,但后端 `/api/v1/wine/status` 之前只按返回码判定,可能把半可用环境误报成“可用”。
|
||
- `ATP` 的 Wine 引擎状态也复用同一 Wine 二进制,存在同类误报风险。
|
||
|
||
- 本次处理:
|
||
- `api/app/services/wine_probe.py`
|
||
- 新增共享 Wine 探测 helper,统一将 `wine32 is missing` 识别为不可用状态。
|
||
- `api/app/services/wine_service.py`
|
||
- Wine 状态接口与测试执行前校验改为复用共享探测 helper。
|
||
- `api/app/services/atp_model_service.py`
|
||
- ATP Wine 引擎状态与执行前校验同步复用共享探测 helper。
|
||
- `api/Dockerfile`
|
||
- 构建阶段显式开启 `i386` 并安装 `wine32:i386`,避免镜像只装到半套 Wine 运行时。
|
||
- `api/tests/test_wine_probe.py`
|
||
- 新增针对 `wine32 is missing` 误报场景的最小单测。
|
||
|
||
- 验证:
|
||
- 变更前基线:`python3 -m pytest api/tests/test_fl_analysis_external.py`、`python3 -m pytest api/tests/test_fl_analysis_service.py` 因本地运行环境缺少 `pytest/sqlalchemy` 无法执行。
|
||
- 变更后执行:
|
||
- `python3 -m py_compile api/app/services/wine_probe.py api/app/services/wine_service.py api/app/services/atp_model_service.py api/tests/test_wine_probe.py` 通过。
|
||
- `./.venv/bin/python -m pytest api/tests/test_wine_probe.py` 通过(3 passed)。
|
||
- `git diff --check` 通过。
|
||
|
||
- 风险与关注点:
|
||
- 当前本地环境仍不具备完整后端依赖,无法直接回归所有 FastAPI/SQLAlchemy 相关测试;本次验证聚焦在 Wine 探测逻辑和语法层面。
|
||
|
||
## Work Log - 修复 ATP 文本上传中文乱码(2026-06-08)
|
||
|
||
- 背景:
|
||
- `ATP文本转换与预览` 页面上传 `.atp/.txt` 文件时直接使用 `file.text()`,浏览器会按 UTF-8 解码。
|
||
- 现场 ATP 文件常见为 Windows 导出的 GBK/GB18030 文本,导致导入后编辑区和转换预览中的中文注释/名称乱码。
|
||
|
||
- 本次处理:
|
||
- `web/src/lib/text-file.ts`
|
||
- 新增前端文本解码工具,优先识别 BOM、兼容无 BOM 的 UTF-16,并在 UTF-8 严格解码失败时回退到 `GB18030`。
|
||
- `web/src/app/admin/power-lines/atp-viewer/page.tsx`
|
||
- 上传 ATP 文本时改为基于 `arrayBuffer + TextDecoder` 自动判定编码,不再固定走 UTF-8。
|
||
- `web/src/lib/text-file.test.js`
|
||
- 补充最小测试,覆盖 `UTF-8`、`GB18030(兼容 GBK)`、无 BOM `UTF-16LE` 三类输入。
|
||
|
||
- 验证:
|
||
- 基线:`npm_config_cache=/tmp/npm-cache npm --workspace web exec tsc --noEmit` 通过;`npm_config_cache=/tmp/npm-cache npm --workspace web exec eslint src/app/admin/power-lines/atp-viewer/page.tsx` 通过。
|
||
- 修改后:
|
||
- `npm_config_cache=/tmp/npm-cache npm --workspace web exec tsc --noEmit`
|
||
- `npm_config_cache=/tmp/npm-cache npm --workspace web exec eslint src/app/admin/power-lines/atp-viewer/page.tsx src/lib/text-file.ts src/lib/text-file.test.js`
|
||
- `node --test web/src/lib/text-file.test.js`
|
||
|
||
- 风险与关注点:
|
||
- 已经以错误编码写入数据库的历史 ATP 文本不会被自动修复;本次修复只覆盖后续上传与预览入口。
|
||
|
||
## Work Log - 全局成功失败提示切换为右上角弹消息(2026-06-08)
|
||
|
||
- 背景:
|
||
- 后台多个页面仍把普通 CRUD 成功/失败提示渲染在页面顶部,占用列表与表单空间。
|
||
- 现有页面已经混用 Ant Design `message` 与顶部 `Alert`,交互不统一。
|
||
|
||
- 本次处理:
|
||
- `web/src/components/ui-antd.tsx`
|
||
- 为全局 Ant Design `message` 统一配置顶部偏移与默认停留时长。
|
||
- `web/src/app/globals.css`
|
||
- 将 `message` 容器样式调整为右上角浮层展示。
|
||
- `web/src/hooks/use-toast-feedback.ts`
|
||
- 新增轻量 hook,用于把页面本地 `error/success` 状态统一转成右上角自动消失的提示。
|
||
- 后台页面:
|
||
- `users`、`system-params`、`wine-runner`、`lightning-currents`、`power-lines/atp-viewer`
|
||
- `roles`、`menus`、`files`、`tower-models`、`elevation`、`power-lines`、`fault-recurrence`
|
||
- 去掉顶部“操作成功/失败”提示条,改为右上角弹消息;保留权限不足、加载失败、解析提醒等需要常驻占位的 `Alert`。
|
||
|
||
- 验证:
|
||
- 基线:
|
||
- 初次 `npm --workspace web exec tsc --noEmit --pretty false` 因当前环境缺少 `web/node_modules` 且默认 npm cache 不可写未能执行。
|
||
- 补装依赖后,基线 `NPM_CONFIG_CACHE=/tmp/fquiz-npm-cache npm --workspace web exec tsc --noEmit --pretty false` 通过。
|
||
- 修改后:
|
||
- `NPM_CONFIG_CACHE=/tmp/fquiz-npm-cache npm --workspace web exec tsc --noEmit --pretty false` 通过。
|
||
- `NPM_CONFIG_CACHE=/tmp/fquiz-npm-cache npm --workspace web exec eslint src/components/ui-antd.tsx src/hooks/use-toast-feedback.ts src/app/admin/users/page.tsx src/app/admin/system-params/page.tsx src/app/admin/wine-runner/page.tsx src/app/admin/lightning-currents/page.tsx src/app/admin/power-lines/atp-viewer/page.tsx src/app/admin/roles/page.tsx src/app/admin/menus/page.tsx src/app/admin/files/page.tsx src/app/admin/tower-models/page.tsx src/app/admin/elevation/page.tsx src/app/admin/power-lines/page.tsx src/app/admin/fault-recurrence/page.tsx`
|
||
- 仅剩仓库原有 warning(`users`/`tower-models` 的 hooks 依赖与 `img` 提示),无新增 error。
|
||
- `git diff --check` 通过。
|
||
|
||
- 风险与关注点:
|
||
- 本次只统一“瞬时成功/失败反馈”;权限态、加载态、解析告警等长驻提示仍保留 `Alert`,属于有意设计,不是遗漏。
|