4.9 KiB
4.9 KiB
分类树多语言实施计划
状态:待执行 目标:合作伙伴、其他数据两个基础资料页的分类树支持多语言;翻译作为分类录入的一部分,显示时缺失回退默认语言。
背景
- 项目多语言能力已落地:
b_i18n_type维护语言(zh-CN为默认,en-US已启用);b_i18n(b_key, b_locale, b_value)按语言存翻译;前端appStore.t(key, fallback)查不到翻译时回退fallback(即中文b_name)。 - 分类树是「引用数据」,按主流 ERP 惯例(SAP 语言相关文本表 MAKT / Odoo 可翻译字段)应支持多语言。
- 现状差异:
- 其他数据
b_other_bmfl已有b_i18n列与键(category.base_otherdata.{id}),树标题已走t();但分类维护弹窗没有录入其他语言文本的入口,b_i18n 表里没有对应翻译行。 - 合作伙伴
b_othercompany_bmfl完全没有b_i18n列。
- 其他数据
- 参照写法:
fms-vue/src/views/base/otherdata/index.vue的buildCategoryTreeNode(appStore.t(item.b_i18n, item.b_name))、buildCategoryI18nKey。
已定设计(执行时不做设计变更)
b_name恒为默认语言(zh-CN)名称,必填。- 其他语言文本存
b_i18n,键格式:- 合作伙伴分类:
category.base_othercompany.{b_id} - 其他数据分类:
category.base_otherdata.{b_id}(已存在,沿用)
- 合作伙伴分类:
- 显示一律
appStore.t(b_i18n, b_name),未填翻译回退中文。 - 键基于
b_id(snowflake 不变),分类改名不影响翻译。 - 不翻译:公司名、联系人名等自由文本/专有名词。
任务一:迁移脚本 fms-api/config/migrations/027_add_othercompany_category_i18n.sql
仿照 025/026 的写法(SET NOCOUNT ON + SET XACT_ABORT ON + BEGIN TRANSACTION + 存在性判断,幂等可重复执行):
b_othercompany_bmfl若无b_i18n varchar(150) NULL列则ALTER TABLE ... ADD。- 回填:
UPDATE dbo.b_othercompany_bmfl SET b_i18n = 'category.base_othercompany.' + CAST(b_id AS varchar(30)) WHERE b_i18n IS NULL OR b_i18n = ''。 - 不动其他任何表。
任务二:合作伙伴页 fms-vue/src/views/base/othercompany/index.vue
CATEGORY_COLUMNS增加b_i18n。- 引入
useAppStore;categoryTree的mapNode中title改为appStore.t(item.b_i18n, item.b_name)(停用后缀「(停用)」保持追加)。 columnExtensions里b_cate_id列 formatter 改为appStore.t(cat.b_i18n, cat.b_name) || value || ""(categoryById需带上b_i18n)。- 分类新增/编辑弹窗增加「其他语言名称」录入:
- 语言列表取
appStore.languages,过滤b_canuse = 1且非默认(b_default !== 1);默认语言(zh-CN)即现有「名称」输入框(b_name)。 - 编辑时:
loadDataApi("b_i18n", "b_key = N'{escapedKey}'", "b_locale ASC")加载该分类已有翻译行,按b_locale存到草稿(含b_id)。 - 保存时一个
saveObjectApi同时提交分类表与b_i18n表(参照fms-vue/src/views/module-management/components/I18nQuickSetModal.vue的{ table: "b_i18n", key_field: "b_id", inserts: [], updates: [] }):- 分类表:新增插入(含
b_i18n键)、编辑更新b_name(键存在则不重写)。 b_i18n表:某语言有值且已有行 →updates;有值无行 →inserts(新nextIdApi);值被清空且已有行 →deletes(按b_id)。
- 分类表:新增插入(含
- 新增分类时键 =
category.base_othercompany.{新分类 nextId}。 - 分类保存成功后重载分类列表。
- 语言列表取
任务三:其他数据页 fms-vue/src/views/base/otherdata/index.vue
- 树标题已支持
t(),不改。 - 分类节点(
modalType === "category")的新增/编辑弹窗,补上与任务二相同的「其他语言名称」录入与b_i18n表保存逻辑;键 =category.base_otherdata.{id}(buildCategoryI18nKey已生成,直接复用)。 - 模块节点(
b_node_type = "module")不需要语言录入(名称来自s_module.b_i18n),保持现状。
边界与约束(MUST)
- 只修改:
027_add_othercompany_category_i18n.sql(新增)、othercompany/index.vue、otherdata/index.vue。 - 不修改任何
/data/*通用接口、不新增后端接口、不新增 Service 类。 - 不执行构建、不启动服务、不执行迁移脚本到数据库(只创建 SQL 文件)。
- 不提交 git;改动保留在工作区供审查。
- 遵循
CODEBUDDY.md与开发规范.md:表格用fms-table、输入控件不添加placeholder、样式scoped、桌面端无响应式、bigint以字符串处理、写法与现有同类代码一致不自创。
验收
- 两个页面的分类新增/编辑可录入其他语言名称;切换语言后树标题与(合作伙伴)列表分类列显示对应语言,未填语言回退中文。
git diff仅涉及上述文件;前端pnpm fmt:check通过。