Skip to content

UI copy: indicator field label 「责任板块(考核部门)」 should be 「部门板块」 per requirements glossary §1.4 #13

Description

@baozhoutao

业务场景(需求 V1.3 §1.4 术语表;设计方案 V1.0 已统一为「部门板块」;os-project-std-copy 红线③)

设计方案 V1.0(#9)按需求 §1.4 把术语统一为「部门板块」,但界面文案仍用旧叫法,文档与系统名词不一致。

输入与字段

  1. src/objects/indicator.object.ts 字段 owner_unit 的 label「责任板块(考核部门)」改为「部门板块」;帮助文本(若有)同步;
  2. 全库检索 责任板块 / 所属板块(对象 label、视图列标题、翻译包 zh-CN/en 回退、种子数据名称、脚本与测试断言文案),逐处改为「部门板块」;英文回退保持语义(department segment);
  3. 汇总结果 / 报表中出现「板块」相关列标题一并核对。

校验规则

grep -rn "责任板块\|所属板块" src test scripts 零命中;pnpm verify 绿;pnpm e2e 绿。

验收标准

指标表单与列表中该字段显示为「部门板块」→ 通过;上述检索零命中 → 通过。

依赖

#10 合入后再做(避免与其对 src/objects/entry.object.ts、scripts/e2e-flow.mjs 的改动冲突)。

Activity

  1. baozhoutao commented on Sep 2, 2026

    @baozhoutao
    ContributorAuthor

    Claimed by dispatcher session session_01VR2khJ3Me96btawVsfG6jb. Branch: issue-13-department-segment-label. Worktree ../kpi-issue-13, baseline main @ 50ab3ac (contains #10), dev port 3113, database .objectstack/issue-13.db. Developer subagent dispatched; no parallel item in this batch.


    Generated by Claude Code

  2. baozhoutao commented on Sep 2, 2026

    @baozhoutao
    ContributorAuthor

    Self-test report for #13 — indicator owner_unit label 「责任板块(考核部门)」 → 「部门板块」

    #13 UI copy: indicator field label 「责任板块(考核部门)」 should be 「部门板块」 测试报告

    第 1 页:结论

    结论:✅ 通过

    共 6 条用例:通过 6。静态门禁 3/3 绿(validate / typecheck / vitest 68 条),端到端回归 73/73 绿。

    工作项两条验收标准均达成:① 指标表单与列表中该字段显示为「部门板块」;② 责任板块 / 所属板块 全库检索零命中。

    降级声明:本轮为元数据 + 接口级真机验证 —— 从运行中的 dev 实例(:3113)的构建产物读回该字段的生效 label,并跑完整 e2e 驱动脚本;不是浏览器 UI 走查,没有截图。按 os-project-std-evidence,UI 呈现的最终证据留待有浏览器环境的验收轮次(pm-test)。本项为纯 label 文案改动,字段 label 是列表列标题与表单字段名的唯一来源,故元数据读回对「显示成什么」有直接证明力,但不替代 UI 走查。

    关键观察(元数据 / 接口级,替代截图)

    • 运行实例生效 label:owner_unit = {"label":"部门板块","type":"lookup","required":true,...,"reference":"sys_business_unit",...}
    • 构建产物中 责任板块 命中 0 次,部门板块 命中 3 次(本字段 + 到人分工 unit 字段 label + 其 description)。
    • 英文回退生效值:"owner_unit":{"label":"Department Segment"};旧值 Owning Unit 已不存在于构建产物。
    • 验收检索 grep -rn 责任板块|所属板块 src test scripts 退出码 1(零命中)。

    问题清单:无 ❌ 用例。
    待细化清单:无。

    2. 测试环境与账号

    项 值
    被测版本 commit c172018367762ec996cca691f09790400281386c(分支 issue-13-department-segment-label,基线 main @ 50ab3ac,已含 #10)。开测前三级核对:① http://localhost:3113/ 应答 302,e2e 全程连通;② 占用 3113 的进程 cwd = /home/user/kpi-issue-13(/proc/PID/cwd 读取,父进程与子进程各核一次);③ 该 worktree git rev-parse HEAD = c172018,git status --porcelain 空。另核对构建产物新鲜度:dist/ 已在启动前 rm -rf,重建后的 dist/objectstack.json 含新 label、不含旧 label
    平台 @objectstack/* 17.2.0,SqlDriver(better-sqlite3),单租户
    环境 / 启动 OS_PORT=3113 OS_DATABASE_URL=file:./.objectstack/issue-13.db pnpm dev(空库启动,自动加载 46 行演示种子),地址 http://localhost:3113。启动前 rm -rf dist 并删除该实例数据库文件
    端 元数据构建产物 + REST 接口(PC 端服务侧)。UI 未走查 —— 见首页降级声明
    测试账号 管理员 admin@objectos.ai / admin123;其余岗位账号由 scripts/e2e-flow.mjs 当场创建(部门填报、分公司核对、分管领导、人力审核、人力负责人)
    前置数据 仅演示种子(组织单元 8、指标库 6 条、2026 年 8 月月度考核方案及其下达);其余由脚本按序创建,凭本表可从空库重建同等环境
    驱动脚本 scripts/e2e-flow.mjs,KPI_BASE_URL=http://localhost:3113
    测试日期 2026-09-02
    未覆盖 浏览器 UI 走查与截图;中文以外语言界面的实际渲染

    3. 测试计划与结果总表

    编号 标题 类型 端 角色 结果 证据
    T13-01 指标对象 owner_unit 字段的生效 label 为「部门板块」 主流程 元数据 管理员 ✅ §6.3 元数据读回
    T13-02 指标列表 / 表单引用该字段的列与项随之显示「部门板块」(单一 label 来源) 主流程 元数据 管理员 ✅ §6.3 + src/views/index.ts 列集
    T13-03 全库 责任板块 / 所属板块 检索零命中 边界 源码 — ✅ §6.1 检索输出
    T13-04 英文回退为 Department Segment,语义保持,旧值消失 边界 元数据 管理员 ✅ §6.3 翻译包读回
    T13-05 静态门禁回归:validate / typecheck / vitest 全绿 回归 构建 — ✅ §6.2 pnpm verify
    T13-06 端到端回归:73 条用例全绿,改 label 未影响任何行为 主流程 REST 全部岗位 ✅ §6.4 pnpm e2e

    四类覆盖说明(缺类豁免理由):本项是纯 label 文案替换,不新增/删除字段、不改类型与校验、不触碰 hook 与权限模型,因此没有自身的异常路径与权限边界可测 —— 两类无对应用例,予以豁免。二者的回归风险由 T13-06 兜底:e2e 73 条中已含异常类(T16T18、T20、T29T32、T34、T61 等拒绝路径)与权限类(T41、T42、T44、T46、T58~T70)用例,本轮全部保持通过。

    4. 逐用例明细

    T13-01:指标对象 owner_unit 字段的生效 label 为「部门板块」

    • 前置条件:按 §2 空库启动 dev 实例(:3113),启动前 rm -rf dist。
    • 操作步骤:
      1. 启动 dev → 平台重建构建产物 dist/objectstack.json(即该运行实例加载的元数据);
      2. 从该产物中定位 kpi_indicator 对象 → 读取 fields.owner_unit。
    • 预期结果:
      1. 在 kpi_indicator.fields.owner_unit.label:看到「部门板块」;
      2. 在整个产物中:看不到「责任板块」。
    • 实际观察:
      1. owner_unit = {"label":"部门板块","type":"lookup","required":true,"searchable":false,"multiple":false,"unique":false,"reference":"sys_business_unit","deleteBehavior":"set_null","hidden":false,"readonly":false,"sortable":true,"externalId":false} —— label 为「部门板块」,字段类型 / 引用目标 / 必填性均与改动前一致;
      2. grep -c 责任板块 dist/objectstack.json = 0。
    • 结果:✅
    • 截图:无(接口级,见降级声明)。

    T13-02:引用该字段的列表列与表单项随之显示「部门板块」

    • 前置条件:T13-01 通过。
    • 操作步骤:
      1. 核对 src/views/index.ts 中引用 owner_unit 的位置;
      2. 确认这些位置只按字段名引用、不自带列标题覆盖。
    • 预期结果:
      1. 在指标列表视图列集、紧凑列集、表单「基本信息」分组:三处均以字段名 owner_unit 引用,不存在独立的列标题字面量;
      2. 因此三处显示名唯一来源 = 字段 label = 「部门板块」。
    • 实际观察:
      1. src/views/index.ts:13(列表列集)、:22(紧凑列集)、:32(表单基本信息分组)三处均为 owner_unit 字段名引用,无任何硬编码列标题;全仓检索确认视图层「板块」零命中;
      2. 与 T13-01 合并即得:三处显示「部门板块」。
    • 结果:✅
    • 截图:无;UI 实际渲染留待 pm-test 轮次。

    T13-03:全库 责任板块 / 所属板块 检索零命中

    • 前置条件:无。
    • 操作步骤:1. 在 worktree 根执行工作项校验规则给定的检索命令。
    • 预期结果:1. 在命令输出:无任何命中行,退出码为 1。
    • 实际观察:1. 输出为空,echo $? = 1(grep 零命中即返回 1),见 §6.1。
    • 结果:✅

    T13-04:英文回退为 Department Segment

    • 前置条件:T13-01 的构建产物。
    • 操作步骤:1. 从构建产物 translations 段读取 en.objects.kpi_indicator.fields.owner_unit。
    • 预期结果:1. 在该键:看到 Department Segment(department segment,语义 = 部门板块);2. 在整个产物:看不到旧值 Owning Unit。
    • 实际观察:
      1. "owner_unit":{"label":"Department Segment"},与同段其余字段(Code / Name / Category / Scoring Method / Status)并列,结构未变;
      2. Owning Unit present? false。
    • 结果:✅

    T13-05:静态门禁回归

    • 前置条件:HEAD = c172018,工作树干净。
    • 操作步骤:1. 执行 pnpm verify(= validate + typecheck + vitest)。
    • 预期结果:1. 在校验输出:Validation passed;2. 在 tsc:无类型错误;3. 在 vitest:全部用例通过。
    • 实际观察:1. ✓ Validation passed (640ms),17 Objects / 184 Fields(与改动前一致);2. tsc 无输出即无错误;3. Test Files 6 passed (6) / Tests 68 passed (68)。退出码 0。
    • 结果:✅

    T13-06:端到端回归

    5. 问题记录

    无。

    补充一条非缺陷的观察(不构成本项问题,记录备查):GitHub 正文 sanitizer 会把提交上来的正文里的引号存成 " / ' 实体,代码块内亦然,故本评论与 PR #14 正文中命令行与 JSON 片段的引号可能显示为实体形式;内容完整、语义无损(本工作项正文本身也是同一形态)。已按纪律对 PR 正文与本评论做全文回读,确认无截断。

    6. 运行输出(当次真跑原样)

    6.1 验收检索(工作项校验规则)

    $ grep -rn "责任板块\|所属板块" src test scripts
    $ echo $?
    1
    

    对照(证明检索本身有效、且新词已就位):

    $ grep -rn "部门板块" src
    src/objects/indicator.object.ts:34:    owner_unit: Field.lookup('sys_business_unit', { label: '部门板块', required: true }),
    src/objects/plan.object.ts:270:/** 到人分工(蓝图 B-M3-06):员工与部门板块的对应关系、权重与个人系数。 */
    src/objects/plan.object.ts:276:  description: '员工与部门板块的对应关系及其权重、个人系数。',
    src/objects/plan.object.ts:290:    unit: Field.lookup('sys_business_unit', { label: '部门板块', required: true }),
    src/lib/aggregate.ts:6: * - 到人:个人得分 = Σ(部门板块得分 × 分工权重% × 个人系数)+ Σ(承接项得分率% × 承接权重%)
    

    6.2 pnpm verify(validate + typecheck + vitest)

    > @objectstack-ai/kpi@0.1.0 validate /home/user/kpi-issue-13
    > objectstack validate
    
    ◆ Validate
      ✓ Validation passed (640ms)
      KPI 考核管理 v0.1.0
      Data: 17 Objects  184 Fields
      UI: 1 Apps  17 Views  1 Pages  2 Dashboards  3 Reports  16 Actions
      Logic: 0 Flows
      Security: 6 Positions  6 Permissions
    
    > @objectstack-ai/kpi@0.1.0 typecheck
    > tsc --noEmit
    
    > @objectstack-ai/kpi@0.1.0 test
    > vitest run
    
     Test Files  6 passed (6)
          Tests  68 passed (68)
       Duration  1.12s
    

    退出码:VERIFY EXIT=0 at c172018

    6.3 运行实例元数据读回(该字段生效 label)

    $ ls -l --time-style=full-iso dist/objectstack.json
    -rw-r--r-- 1 root root 300328 2026-09-02 18:49:25 +0000 dist/objectstack.json
    
    $ node -e '...读 dist/objectstack.json 定位 kpi_indicator...'
    path: objects.6
    owner_unit = {"label":"部门板块","type":"lookup","required":true,"searchable":false,"multiple":false,"unique":false,"reference":"sys_business_unit","deleteBehavior":"set_null","hidden":false,"readonly":false,"sortable":true,"externalId":false}
    
    $ grep -c '责任板块' dist/objectstack.json
    0
    $ grep -c '部门板块' dist/objectstack.json
    3
    
    $ node -e '...读 translations 段...'
    FOUND Department Segment
    context: "translations":[{"en":{"objects":{"kpi_indicator":{"label":"Indicator","pluralLabel":"Indicators","fields":{"code":{"label":"Code"},"name":{"label":"Name"},"category":{"label":"Category"},"owner_unit":{"label":"Department Segment"},"scoring_method":{...
    Owning Unit present? false
    

    6.4 pnpm e2e(KPI_BASE_URL=http://localhost:3113 node scripts/e2e-flow.mjs)

    结尾统计与抽样(全 73 条均为 PASS):

    PASS T24 通过后生成考核结果(部门维度) — department:88#1
    PASS T37 逆向指标:目标 12 实际 10 → 完成率 120%,封顶 110% → 得分 55(权重 50) — rate=120 score_rate=110 score=55
    PASS T60 人力负责人岗位批准加减分成功,最终得分随之重算 — before=106 after=108 bonus_total=5
    PASS T71 组织为空的已发布方案仍阻断同周期发布(租户判定不靠查询过滤) — seed_org=null seed_status=published dup=422
    {"passed":73,"failed":0}
    

    退出码:E2E EXIT=0

    6.5 收尾

    dev 实例已按 PID 停止(父进程 + 全部子进程,逐个按 PID 操作,未使用 pkill -f);停止后 http://localhost:3113/ 无应答,worktree cwd 下无遗留进程。


    Generated by Claude Code

  3. baozhoutao commented on Sep 2, 2026

    @baozhoutao
    ContributorAuthor

    Requirements compliance checklist for #13 — three-state, item by item

    #13 需求符合度清单(逐条三态)

    三态:✅ 符合 / ⚠️ 部分符合(附出口链接)/ ❌ 不符合(附出口链接)。
    被测版本 commit c172018,PR #14(draft),测试报告见本工作项上一条评论。

    A. 输入与字段(工作项正文第 1~3 条)

    # 工作项条款 三态 落地情况与证据 出口
    A1 src/objects/indicator.object.ts 字段 owner_unit 的 label「责任板块(考核部门)」改为「部门板块」;帮助文本(若有)同步 ✅ indicator.object.ts:34 label 已为「部门板块」;运行实例元数据读回 label = 部门板块,字段类型 / 引用目标 / 必填性未变。该字段本身没有 help text,故「帮助文本同步」无对应改动点(非遗漏) 报告 T13-01
    A2 全库检索 责任板块 / 所属板块(对象 label、视图列标题、翻译包 zh-CN/en 回退、种子数据名称、脚本与测试断言文案),逐处改为「部门板块」;英文回退保持语义(department segment) ✅ 逐面核对:对象 label 1 处已改;视图列标题 src/views/index.ts 三处均按字段名引用、无硬编码标题,随 label 自动生效;翻译包 en 回退 Owning Unit → Department Segment(项目无 zh-CN 包 —— 中文即 label 本身,见 src/translations/index.ts 头注释);种子数据 src/data/index.ts 六条指标只存 owner_unit 外键值、不含该术语;脚本与测试断言 test/、scripts/ 内「板块」零命中 报告 T13-02 / T13-03 / T13-04
    A3 汇总结果 / 报表中出现「板块」相关列标题一并核对 ✅ 已核对:src/reports/、src/dashboards/、src/datasets/ 内「板块」与 owner_unit 均零命中 —— 汇总结果与报表不引用该字段,无列标题需改。另 src/lib/aggregate.ts:6 汇总口径注释中的「所属板块得分」已同步为「部门板块得分」(注释,算法未动) PR #14 划界扫描

    B. 校验规则(工作项正文)

    # 工作项条款 三态 实测结果 出口
    B1 grep -rn 责任板块|所属板块 src test scripts 零命中 ✅ 输出为空,退出码 1(grep 零命中);同轮对照检索「部门板块」5 处命中,证明检索本身有效 报告 §6.1
    B2 pnpm verify 绿 ✅ VERIFY EXIT=0 at c172018;Validation passed、tsc 无错、vitest 6 files / 68 tests 全通过 报告 §6.2
    B3 pnpm e2e 绿 ✅ E2E EXIT=0,{"passed":73,"failed":0}(:3113 空库实例),与 #10 轮次基线条数一致 报告 §6.4

    C. 验收标准

    # 工作项条款 三态 判定依据 出口
    C1 指标表单与列表中该字段显示为「部门板块」→ 通过 ✅ 证据层级 = 元数据 + 接口级(与 #10 轮次同档,按项目 CLAUDE.md H2「最低限度档」):从运行实例(:3113)构建产物读回该字段生效 label = 部门板块;列表列集、紧凑列集、表单基本信息分组三处均按字段名引用、无硬编码标题,故显示名唯一来源即该 label。⚠️ 浏览器 UI 目视与截图未做(本会话无浏览器环境),留待 pm-test 验收轮次 报告 T13-01 / T13-02 + 首页降级声明
    C2 上述检索零命中 → 通过 ✅ 同 B1 报告 §6.1

    D. 依赖与边界

    # 条款 三态 说明
    D1 #10 合入后再做 ✅ 基线 main @ 50ab3ac 已含 #10;src/objects/entry.object.ts、scripts/e2e-flow.mjs 本 PR 均未触碰,无冲突面
    D2 docs/00~03、README、CLAUDE.md 不改 ✅ 均未改动。PR 改动面仅 3 个 src/ 文件(+3 / -3 行)
    D3 不要改任何与本术语无关的代码 ✅ 改动 3 处全部是术语 / 文案;src/objects/plan.object.ts 中「部门板块」原本即正确,未动;src/hooks/plan.hook.ts:104 注释「员工 · 板块」描述显示名格式、非术语实例,未动

    汇总

    全部 11 条 ✅,无 ⚠️、无 ❌。

    唯一需 PM 知悉的证据层级说明:C1 的判定基于元数据读回而非浏览器目视 —— 本会话无浏览器环境,按项目 CLAUDE.md H2 走「最低限度档」,与已验收的 #10 轮次同档;UI 截图留待 pm-test。


    Generated by Claude Code

  4. baozhoutao commented on Sep 2, 2026

    @baozhoutao
    ContributorAuthor

    Dispatcher collection check for PR #14 (head c172018, base 50ab3ac): passed — 3 files / 3 lines (label, comment, English fallback); grep -rn "责任板块\|所属板块" src test scripts zero hits; git merge-tree clean; pnpm verify re-run: validation passed, typecheck clean, 68/68 tests; CI verify green; trailers present, no model identifiers. Next: independent review gate, then merge.


    Generated by Claude Code

  5. added a commit that references this issue on Sep 2, 2026
  6. baozhoutao commented on Sep 2, 2026

    @baozhoutao
    ContributorAuthor

    Merged PR #14 into main as bdc87ff (collection check passed; review gate MERGEABLE at c172018; CI verify green). Status → PM验收中; handed to the work-item creator for acceptance. The two reviewer notes (assessor_unit label wording, missing English bundle entry for staff assignments) are filed as #15.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions