Files
workspace/code/fms/.codebuddy/plans/fms-config-refactor_5c6668d6.md
T
2026-09-05 17:25:35 +08:00

11 KiB
Raw Blame History

name, overview, todos
name overview todos
fms-config-refactor 将 fms-api(Spring Boot)与 fms-vue(Vue3)配置管理链路代码全量重构,对齐已重构为"字符串业务键"方案的 FMS-NEW 库(s_module.b_id=编码、s_field 按 (module_id,field)、无 b_code/b_field_id/b_account、日志 uuidv7、无 s_role* 与 v_b_user),实现登录、通用查询/保存/describe/自动编码、日志写入及 module-management/menu-management/i18n-type 页面的端到端打通。
id content status
backend-db-login 后端 DbUtils/AuthService 登录适配(b_id 即账号)并调整 insert 主键策略,移除配置表雪花自动补键 completed
id content status dependencies
backend-uuid-log 新增 UuidV7Generator,改造 LoginLogService 按新 s_log_* 列写入 completed
backend-db-login
id content status dependencies
backend-autocode DataSaveService/DataController 自动编码 nextCode 重写为查询 s_autocode(module_id+field) completed
backend-db-login
id content status dependencies
backend-file 核对 FileService 列契约并新增 201_add_bf_files.sql 补建文件表(决策保留) completed
backend-db-login
id content status dependencies
backend-cleanup 用 [subagent:code-explorer] 全仓清理 s_role*/v_b_user/g3soft/b_account 等遗留引用 completed
backend-db-login
backend-autocode
backend-uuid-log
id content status dependencies
fe-services 前端 services/api.js、http.js 及通用组件数据契约改为字符串业务键,临时行 ID 仅本地跟踪 completed
backend-db-login
backend-autocode
id content status dependencies
fe-module-page 适配 module-management 页面(模块树编码、字段 describe、布局子表保存 diff) completed
fe-services
id content status dependencies
fe-menu-page 适配 menu-management 页面(菜单编码树、绑定模块、权限点) completed
fe-services
id content status dependencies
fe-i18n-page 适配 i18n-type 页面(语言编码主键与字段配置) completed
fe-services
id content status dependencies
verify-all 验收:后端 mvn 编译启动并 curl 自测登录/describe/saveobjt/nextcode,前端 pnpm build completed
backend-file
backend-cleanup
fe-module-page
fe-menu-page
fe-i18n-page

需求概述

将 fms-api(Spring Boot 后端)与 fms-vue(Vue3 前端)代码全面重构,适配已完成字符串业务键改造的 FMS-NEW 数据库,打通"配置链路"全量功能并能端到端运行。

核心范围

  • 后端:登录认证(b_user 账号即主键)、通用查询/保存/describe(/data/*)、自动编码(s_autocode)、登录/技术/审计日志写入(UUIDv7 主键)、文件服务处理。
  • 前端:module-management、menu-management、i18n-type 三个配置页面及其通用组件(fms-module-*、fms-table、I18nNameModal 等)全套适配新库结构。
  • 遗留处理:以新库为准清理——删除/重写与新库不一致的旧逻辑(s_role*、v_b_user/g3soft 会话上下文、b_account/b_code/b_field_id 等旧引用);文件表 bf_files 如保留功能则补建表。

边界

  • 不实现业务实体与 RBAC;不改动 datart 接入(属 ERP 前端)及与配置链路无关的静态页面;不改动第三方组件 API 契约;保持现有代码风格(snake_case 数据字段)。
  • 验收标准:后端 mvn 编译通过且可启动;关键接口 curl 自测通过(登录、describe、loaddata、page、saveobjt、nextcode);前端 pnpm build 通过。

技术栈(沿用现状,不引入新框架)

  • 后端:Spring Boot(Java 21)+ JDBC SqlServer + 自研 DbUtils 动态 SQL 桥(保留现有"前端传表名/字段/diff → 后端反射列结构生成 SQL"架构,不做 ORM 替换)。
  • 前端:Vue3 + 现有组件体系与 http/api 封装,沿用 snake_case 数据字段规范。
  • 数据库:FMS-NEW(118.89.70.199,config/dbconfigs/g3hd.properties),结构蓝本为 config/migrations/200_rebuild_business_keys.sql 与设计文档。

实现思路与关键决策

  1. 主键策略变更(核心):配置表主键全部为业务键(s_module.b_id=模块编码、s_menu.b_id=菜单编码、s_field PK=(b_module_id,b_field)、s_field_query PK 含 b_condition_no、s_i18n PK=b_key:locale、s_power.b_id=权限编码)。DbUtils.insert 不再为配置表在 key 为空/负数时自动补雪花 ID(改为由调用方提供业务键;缺键报错或由前端保证),IdGenerator.nextId() 保留仅供未来 bigint 业务表与文件表 subid 使用。前端不再调用 /data/nextid 获取模块/菜单主键。
  2. 登录适配:DbUtils.loadUserForAuthentication 由 WHERE b_account=? 改为 WHERE b_id=? AND b_canuse=1;会话/JWT 的 user 标识改用账号字符串。需核对密码存储(现有 001/002 密码极短、g3soft 为空串)与校验方式,保持行为不回归。
  3. 自动编码适配:DataSaveService.nextCode 中引用 s_module_auto_code/s_module_field 的 SQL 重写为读 s_autocode(PK b_module_id+b_field,join s_module 取 b_savetable、join s_field 校验字段),按 b_resettype/b_currentperiod 计算序号并回写 currentperiod/currentvalue;/data/nextcode 入参 moduleId 改为模块编码字符串。
  4. 日志适配:新增 UuidV7Generator(RFC 9562 时间有序,业务层生成);LoginLogService/审计写入对齐 s_log_login(b_user_id/b_account varchar、b_login_result tinyint)、s_log_technical、s_log_audit(b_module_id/b_operator_id varchar 字符串)列集合。
  5. 文件服务:保留文件上传/下载能力(前端有 fms-file 组件、后端 FileController/FileService),在 FMS-NEW 补建 bf_files 表(config/migrations/201_add_bf_files.sql,主键 subid bigint 雪花,列契约以 FileService 代码为准核对);father/moduleId 等引用列按语义定类型(业务数据 bigint / 模块编码 varchar)。
  6. 前端契约适配:http.js/api.js 中所有配置链路端点 payload/返回字段改字符串业务键(去掉 b_code、b_field_id、bigint 数字引用,父/模块引用传编码,字段布局子表按 b_field 列名关联);数据保存 diff(maindata/inserts/updates/deletes)与后端契约保持一致。
  7. 本地临时行标识:配置子表不再有独立雪花主键列,前端本地临时 ID(createTempId 负数)仅用于行级 diff 跟踪与表格 key,不作为数据库列值写入;保存后 loadAll 重建草稿(沿用现有模式)。需以 code-explorer 核对 utils/tempId.js 实际位置与用法后落地。
  8. 遗留清理:全仓搜索并删除/重写 s_role*/v_b_user/v_s_log_*/SESSION_CONTEXT/allow_g3soft/b_account/b_field_id/b_module_code 等引用(后端已确认无 s_role 文本命中;前端需核对)。

执行注意(防回归)

  • 先由 [subagent:code-explorer] 精确定位前后端所有"表名/列名/主键/端点/临时 ID"引用点,再逐模块修改,避免遗漏硬编码字符串。
  • 逐任务保持可编译:后端每完成一组改动即 mvn 编译;前端每完成一个页面 pnpm build 或 lint 校验。
  • 不动 g3hd.properties 等运行配置;数据库变更仅新增 201_add_bf_files.sql(如需),不再动 17 张核心表。
  • 日志/错误处理沿用现有 Logback 与统一异常风格;不引入无关重构。

架构设计(模块划分与数据流)

flowchart LR
    subgraph FE["fms-vue 前端"]
        P1[module-management] --> C[公共组件 fms-module-* / fms-table]
        P2[menu-management] --> C
        P3[i18n-type] --> C
        C --> A[services/api.js + http.js]
    end
    subgraph BE["fms-api 后端"]
        A -->|/api/data/*| D1[DataController]
        D1 --> D2[DataService / DataSaveService]
        D2 --> D3[DbUtils 动态SQL桥]
        D3 --> DB[(FMS-NEW 字符串业务键)]
        Auth[AuthController/AuthService] --> D3
        Log[LoginLogService + UuidV7] --> D3
        File[FileController/FileService] --> D3
    end

要点:前端各页面经公共服务层访问 /api/data/*;后端保持"动态 SQL 桥 + 白名单校验"不动,本次只改列/主键/表名契约与自动编码、日志、登录几处硬编码 SQL。

目录结构(涉及文件)

fms-api/src/main/java/cn/g3soft/fmsapi/
├── utils/DbUtils.java                     [MODIFY] loadUserForAuthentication 改 b_id=账号;insert 主键策略(配置表不再自动雪花补键)
├── utils/UuidV7Generator.java             [NEW]   业务层 UUIDv7 生成器(RFC 9562)
├── service/AuthService.java               [MODIFY] 登录会话 user 标识=账号字符串;移除 g3soft 行级安全相关
├── service/LoginLogService.java           [MODIFY] 日志列对齐新表;主键用 UuidV7
├── service/DataSaveService.java           [MODIFY] nextCode 改查 s_autocode(module_id+field);保存主键策略
├── service/DataService.java               [MODIFY] 视引用调整(如有旧字段透传)
├── controller/DataController.java         [MODIFY] /nextcode 入参模块编码;/nextid 保留说明
├── controller/AuthController.java         [MODIFY] 视会话逻辑清理
└── service/FileService.java               [MODIFY] 列契约核对(father/moduleId 类型)
fms-api/config/migrations/
└── 201_add_bf_files.sql                   [NEW]   如需保留文件功能,按代码契约补建 bf_files
fms-vue/src/
├── services/api.js                        [MODIFY] 端点 payload 字段改字符串业务键
├── services/http.js                       [MODIFY] 视通用参数调整
├── utils/common.js / dataChanges.js       [MODIFY] 临时行标识/数据变更逻辑适配
├── components/fms-module-list|edit|common [MODIFY] 元数据渲染主键/关联字段适配
├── components/fms-table/                  [MODIFY] 视主键与选择逻辑
├── components/I18nNameModal.vue           [MODIFY] 多语言键格式适配
└── views/module/module-management/**      [MODIFY] 模块树/字段 describe/布局子表/保存 diff
└── views/module/menu-management/**        [MODIFY] 菜单编码树/绑定模块/权限点适配
└── views/module/i18n-type/**              [MODIFY] 语言编码页适配

(具体改动文件清单在执行第一步由 code-explorer 核对后补充完整,避免遗漏。)

Agent Extensions

SubAgent

  • code-explorer
  • Purpose:精确梳理前后端所有表名/列名/主键/API payload/临时 ID 引用点(s_role、v_b_user、b_account、b_field_id、tempId.js、DataSaveService 自动编码 SQL 等),确认 bf_files 列契约与登录密码校验方式,产出 文件:行 清单供各重构任务使用。
  • Expected outcome:每项重构任务开工前获得权威引用清单,避免遗漏硬编码与语义偏差,并用于验收时的残留检查。