Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions docs/design/02-domain-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ erDiagram
| `registration_no` | text | 境外供应商在注册地的登记号或税号(如增值税号、雇主识别号);`country != 'cn'` 时必填并显示。对象声明组合唯一索引 `country` + `registration_no`(BR-01) |
| `supplier_type` | select | `manufacturer` 生产商 / `distributor` 代理分销 / `service` 服务商 / `logistics` 物流商 |
| `status` | select(stageField) | 见 §5.1 生命周期状态机 |
| `grade` | select | `a` / `b` / `c` / `d`,最近一期绩效发布时写入 |
| `grade` | select | `grade_a` / `grade_b` / `grade_c` / `grade_d`(同考评单),最近一期绩效发布时写入 |
| `latest_score` | number | 最近一期绩效总分(存储字段,供看板使用) |
| `qualification_alert` | boolean | 默认 false;任一必备资质类型没有「有效且已核验」的证书时由 flow 置为 true(BR-04),补齐并经 SQE 核验后才恢复为 false |
| `risk_level` | select | `low` / `medium` / `high` |
Expand Down Expand Up @@ -667,19 +667,21 @@ false,BR-13)、`received_quantity`(summary:`sum` 收货记录 `accepted_
集成前不启用。按物资类别分方案的接口预留为可选多选字段 `material_classes`(选项列表 `srm_material_class`,空 = 全部
类别),有客户需要时再加,v0.5 不做(2026-10-24 裁定)。

**`srm_performance_review` 绩效考评单**:`review_no`、`supplier`、`cycle`(`monthly` /
`quarterly` / `yearly`,按供应商所供最高物资类别取参数 `perf_cycle`)、`period`(text,
如 `2026Q3`、`2026-10`)、`period_start` / `period_end`(date)、`quality_score` /
`cost_score` / `delivery_score` / `service_score` / `hse_score` / `total_score`(number,存储字段,
由算分 flow 写入,供看板使用)、`grade`(`a` / `b` / `c` / `d`)、`status`(见 §5.7)、
`otd_rate` / `lot_pass_rate`(percent)、`ppm`(number)、`ack_on_time_rate`(percent,
ERP 集成前为空)、`reviewer`(user)、`appeal_reason`、`appeal_result`。自动指标由
交付记录按 `period` 汇总。

**`srm_performance_score` 评分明细**(master_detail → 考评单):`kpi`(lookup)、
`raw_value`(number,自动指标的原始值)、`score`(number,0–100)、`weight`
(percent,快照)、`scorer`(user,人工指标的评分人)、`comment`、`scored`
(boolean,默认 false)。
**`srm_performance_review` 绩效考评单**(OWD `public_read`,内部只读:由 flow 生成和推进,评分只经「提交评分」
screen flow;删除只给 `srm_admin`,删掉后可补跑生成;开启字段历史;`supplier` + `period` 唯一):`review_no`
(`PR{YYYY}{00000}`)、`supplier`、`cycle`(`monthly` / `quarterly` / `yearly`,按供应商所供最高物资类别取参数
`perf_cycle`)、`period`(text,月度 `2026-10`、季度 `2026Q3`、年度 `2026`)、`period_start` / `period_end`(date)、
`quality_score` / `cost_score` / `delivery_score` / `service_score` / `hse_score` / `total_score`(number,存储字段,
由汇总分级写入,供看板使用)、`grade`(`grade_a` / `grade_b` / `grade_c` / `grade_d`;平台的选项值至少两个字符)、
`status`(见 §5.7)、`otd_rate` / `lot_pass_rate`(percent)、`ppm`(number)、`ack_on_time_rate`(percent,
ERP 集成前为空)、`delivery_count`(number,本期交付行数)、`data_incomplete`(boolean,默认 false:本期没有交付记录或
某项启用的自动指标没有数据时为 true,该项不给零分,07 R7)、`reviewer`(user)、`appeal_reason`、`appeal_result`。
自动指标由交付记录按 `period` 汇总,比率字段存小数(0.985 即 98.5%);flow 写的字段一律只读。

**`srm_performance_score` 评分明细**(master_detail → 考评单,`controlled_by_parent`):`kpi`(lookup)、
`raw_value`(number,自动指标的原始值,与指标的满分值、零分值同一单位:比率按百分点,PPM 按 PPM)、`score`(number,0–100)、
`weight`(percent,生成时从指标快照)、`scorer`(user,人工指标的评分人)、`comment`、`scored`(boolean,默认 false;
自动指标算出得分时为 true,没有数据时为 false 并在 `comment` 写明)。

### 4.8 结算(不做,留在 ERP)

Expand Down Expand Up @@ -809,9 +811,17 @@ ERP 集成前为空)、`reviewer`(user)、`appeal_reason`、`appeal_result

### 5.7 绩效考评单 `srm_performance_review.status`

`calculating` ★ 自动算分(open)→ `scoring` 人工评分(open)→ `reviewing` 审定中
(open)→ `published` 已发布(won)→ `appealed` 申诉中(open)→ `published`;
作废为 `void`(lost)。
| 值 | 标签 | kind | 允许跳转到 |
|---|---|---|---|
| `calculating` ★ | 自动算分 | open | `scoring`、`void` |
| `scoring` | 人工评分 | open | `reviewing`、`void` |
| `reviewing` | 审定中 | open | `published`、`void` |
| `appealed` | 申诉中 | open | `published` |
| `published` | 已发布 | won | `appealed` |
| `void` | 已作废 | lost | — |

`calculating` 只存在于一次生成运行之内:生成 flow 建单、建评分明细、算完自动指标后在同一次运行里转 `scoring`;
中途失败留下的 `calculating` 考评单在下次运行时删掉重建(03 §10 第 1 步)。

### 5.8 对账单

Expand Down
6 changes: 3 additions & 3 deletions docs/design/03-processes-and-automation.md
Original file line number Diff line number Diff line change
Expand Up @@ -381,8 +381,8 @@ stateDiagram-v2

| 步骤 | 触发 | 动作 |
|---|---|---|
| 1 生成 | `schedule`:每月 1 日 03:00(追赶式) | 按供应商所供最高物资类别取周期参数 `perf_cycle`(示例 A 类每月、B 类每季、C 类每年);本次运行到期的供应商各建一张上期考评单(`calculating`,`cycle` / `period` 写明),按指标库中启用的指标建评分明细(FR-702);启用指标的权重合计不是 100% 时本次不生成并通知采购总监;已有同期考评单的跳过 |
| 2 自动算分 | 同一次运行 | 按 [05 §4](./05-experience-and-analytics.md#4-仪表盘与指标口径) 的口径从交付记录计算 OTD、批次合格率、PPM,写入原始值与得分;订单响应及时率在 ERP 集成前在指标库中不启用(不建评分明细),启用时由采购总监调整其余权重。得分按指标的满分值、零分值线性计算(02 §4.7)。由 flow 的查询节点按供应商和 `period` 汇总交付记录上的 `on_time`、`inspection_result`、`defect_quantity` |
| 1 生成 | `schedule`:每月 1–7 日每天 03:00(追赶式) | 活跃供应商(合格或冻结:冻结期间仍在交付在途订单,连续 D 级要能累计)按所供品类(不论品类资格状态)中最高的物资类别取周期参数 `perf_cycle`(示例 A 类每月、B 类每季、C 类每年),没有品类资格的不生成;每期的第一个月「到期」,建上一期的考评单(`calculating`,`cycle` / `period` / 起止日期写明),按指标库中启用的指标建评分明细并快照权重(FR-702)。启用指标的权重合计不是 100% 时本次不生成并通知采购总监。同一供应商同一期间已有考评单的跳过(`supplier` + `period` 唯一),1 日漏跑的后几天补上,跑两遍不重复建;上次中途失败留下的 `calculating` 考评单删掉重建。补跑更早的月份时传入运行日 `asOf` |
| 2 自动算分 | 同一次运行 | 按 [05 §4](./05-experience-and-analytics.md#4-仪表盘与指标口径) 的口径(同数据集 `srm_delivery_metrics`)从交付记录计算 OTD、批次合格率、PPM:flow 的查询节点按供应商和本期包含的月份(交付记录的 `period`)取交付记录,汇总 `on_time`、`inspection_result`、`defect_quantity`、`received_quantity`,写入考评单的比率字段与交付行数;每条自动指标的评分明细写入原始值与得分,得分按指标的满分值、零分值线性计算(02 §4.7),数字全在指标库里,flow 不写死。本期没有交付记录、某项指标没有数据(如没有已检批次)时该项不给分(`scored = false`,`comment` 写明),考评单标记「数据不全」,不给零分(07 R7),由人工评分环节处理。订单响应及时率在 ERP 集成前在指标库中不启用(不建评分明细),启用时由采购总监调整其余权重。算完转 `scoring`。不良数与实收数逐行累加:CEL 没有对列表求和、flow 没有汇总节点(07 §6.3 PF15)。性能(07 R9,2026-10-24 进程内 sqlite 实测):200 家供应商、每家 6 行交付记录一次生成约 7.4 秒,每家 30 行约 8.6 秒,重跑(全部跳过)约 0.6 秒 |
| 3 人工评分 | 状态→`scoring` | 按评分明细的 `scorer`(品类经理、SQE、需求部门评分人)通知,评分人经「提交评分」screen flow 只看到并填写分配给自己的评分项;截止 10 天,扫描任务提醒未评项;截止后未评项按「取 60 分并标记未评」处理(可配置) |
| 4 汇总分级 | 全部评分完成或截止 | `total_score = Σ(score × weight)`;等级线取参数 `perf_grade_min`(示例 A ≥ 90、B ≥ 80、C ≥ 70,其余 D);状态→`reviewing` |
| 5 审定发布 | 审批:采购总监(`position = srm_procurement_director`) | 通过后→`published`;回写供应商 `grade`、`latest_score`;供应商可在门户查看结果与扣分项(FR-704) |
Expand Down Expand Up @@ -474,7 +474,7 @@ flow 属于 ERP 集成后的门户镜像,现阶段不建。
| `srm_scar_overdue_sweep` | schedule:每小时(api 心跳等 objectstack#25675) | 整改单 | v0.4 |
| `srm_audit_admission_apply` | record_change:准入审核完成或改结论 | 供应商审核 → 准入申请 | v0.4 |
| `srm_audit_plan_generate` | schedule:每月 1 日 02:30(追赶式;年初那次生成全年计划) | 供应商审核 | v0.4 |
| `srm_performance_generate` | schedule:每月 1 日(按类别周期) | 考评单 | v0.5 |
| `srm_performance_generate` | schedule:每月 1–7 日 03:00(追赶式,按类别周期) | 考评单、评分明细 | v0.5 |
| `srm_performance_publish` | record_change:状态→`reviewing` | 考评单 → 供应商 | v0.5 |
| `srm_performance_apply` | record_change:状态→`published` | 考评单 → 整改单、处置单 | v0.5 |
| `srm_risk_event_apply` | record_change:风险事件新建或改为高风险 | 风险事件 → 处置单(草稿) | v0.5 |
Expand Down
6 changes: 4 additions & 2 deletions docs/design/05-experience-and-analytics.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
│ └── 供应商审核 计划 / 问题项
├── 绩效与风险 (v0.5)
│ ├── 绩效指标 全部 / 启用指标(权重合计)/ 已停用
│ ├── 考评单 本期 / 待评分
│ ├── 考评单 全部 / 待评分 / 数据不全(本期考评随 v0.5 P3)
│ └── 风险事件 风险看板(按严重度)/ 未关闭 / 按类型;黑名单名录在供应商列表视图
├── 寻源 (v0.7)
│ ├── 寻源单 我的 / 报价中 / 待开标 / 评标中 / 定标审批中
Expand Down Expand Up @@ -80,7 +80,9 @@
| 整改单 | 索赔 | 列表 | `claim_status != 'none'` | SQE、应付会计 |
| 供应商审核 | 审核计划 | 日历 | 日期字段 `planned_date` | SQE |
| 绩效指标 | 启用指标 | 列表 | `active == true`,按 `dimension` 分组,权重列合计(应为 100%)与各维度小计 | 采购总监 |
| 考评单 | 本期考评 | 列表 | 当前期间,按 `grade` 分组 | 采购总监 |
| 考评单 | 待评分 | 列表 | `status == 'scoring'`,按期间倒序 | 采购总监 |
| 考评单 | 数据不全 | 列表 | `data_incomplete == true`:本期交付记录没导入或不全(07 R7) | 采购总监、SQE |
| 考评单 | 本期考评 | 列表 | 当前期间,按 `grade` 分组(随 v0.5 P3 汇总分级) | 采购总监 |
| 采购订单、订单行 | 待供应商确认、交期风险、交货排程 | 列表 / 甘特 | 预留(ERP 集成后的门户镜像) | 采购员、计划员 |

门户侧的视图是上述视图的子集,由 RLS 自动限定到本公司,**不需要**为门户单独写过滤
Expand Down
3 changes: 2 additions & 1 deletion docs/design/07-delivery-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ test/ # 仓库根目录
| R6 | 存量供应商数据质量差(重复、缺信用代码) | 高 | 中 | v0.2 导入前专项清洗;导入时按信用代码(境外按国家 / 地区 + 注册号)匹配,可重复执行;标记「存量导入」进「存量待复核」视图([导入说明](../implementation/legacy-supplier-import.md)) |
| R7 | ERP 集成推迟后,交付数据靠每月导入,客户不按时导出则绩效断档 | 中 | 中 | 导入模板与操作清单写进实施手册;考评 flow 发现本期无交付记录时标记「数据不全」而不是给零分 |
| R8 | 每版对象与 flow 较多,回归成本上升 | 中 | 中 | 审批矩阵、导入幂等、关键 flow 的自动化测试进 CI(docs/engineering §3) |
| R9 | 考评在 flow 里批量处理,供应商多时运行时间长 | 低 | 中 | 按法人或品类错峰拆分;规模继续增长时评估服务端函数 |
| R9 | 考评在 flow 里批量处理,供应商多时运行时间长 | 低 | 中 | 按法人或品类错峰拆分;规模继续增长时评估服务端函数。2026-10-24 实测:200 家供应商 × 30 行交付记录一次生成约 8.6 秒、重跑约 0.6 秒(03 §10),暂不拆分;测试 `test/performance-generate-load.test.ts`(`SRM_LOAD_TEST=1`) |
| R10 | 审批人与发起人为同一人(职责分离失效) | 中 | 中 | 岗位分离 + `expression` 审批人改派(04 §6);平台开关见 objectstack#25446 |
| R11 | 客户落地时要求改核心字段,覆盖层与核心升级冲突(平台目前不检测,objectstack ADR-0005) | 中 | 中 | 客户层规则(ADR-0009 第 4 条);核心升级前跑「核心 + 客户层」组合构建 |

Expand Down Expand Up @@ -242,6 +242,7 @@ test/ # 仓库根目录
| PF12 | objectstack#25493 导入接受 `YYYY.MM.DD` / `YYYYMMDD`、选项别名与大小写、每行报全部错误 | 存量台账导入 | 导入前清洗 |
| PF13 | objectstack#24817 多级审批的后续节点以原发起人为提交人(主干已修,18.0.0 未带上) | 信息变更单第 2 级退回修改 | 第 2 级只能通过或驳回(03 §5) |
| PF14 | objectstack#25683 i18n 检查不把字段的 `inlineHelpText` 当作默认语言词条 | 带帮助文字的字段(绩效指标的满分值、零分值) | zh-CN 翻译包只放这两条帮助文字,引用源码同一份常量;修复后删除 |
| PF15 | objectstack#14500 flow 没有汇总能力:CEL 不能对列表求和,`get_record` 只返回行(已关的「汇总 / 分组节点」卡,hotsrm 的用法作为数据点记在评论里) | 考评生成的 Σ不良数、Σ实收数、启用指标权重合计 | `loop` + `assignment` 逐行累加;200 家 × 30 行约 8.6 秒,性能可接受 |

---

Expand Down
2 changes: 1 addition & 1 deletion params/core.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ perf_cycle:
example: { A: 每月, B: 每季度, C: 每年 }
display: A 类{A},B 类{B},C 类{C}
used_in: [QP-01 6.7.1, QP-01 附录 A]
system: 考评生成 flow 按供应商所供最高物资类别(srm_category.material_class)取周期(核心 03 §10,v0.5)
system: 考评生成 flow srm_performance_generate 按供应商所供最高物资类别(srm_category.material_class)取周期,flow 的 CYCLE 与本参数由测试核对一致(核心 03 §10,v0.5)

perf_kpi_weights:
label: 绩效指标权重(按指标编码)
Expand Down
1 change: 1 addition & 0 deletions src/core/apps/workbench.app.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ export const Workbench = App.create({
icon: 'gauge',
children: [
{ id: 'nav_kpi', type: 'object', objectName: 'srm_kpi', label: '绩效指标', icon: 'gauge' },
{ id: 'nav_performance_review', type: 'object', objectName: 'srm_performance_review', label: '考评单', icon: 'award' },
{ id: 'nav_risk_event', type: 'object', objectName: 'srm_risk_event', label: '风险事件', icon: 'siren' },
],
},
Expand Down
1 change: 1 addition & 0 deletions src/core/flows/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,4 @@ export { DispositionSubmitFlow } from './disposition/disposition-submit.flow.js'
export { DispositionCancelFlow } from './disposition/disposition-cancel.flow.js';
export { RiskEventApplyFlow } from './risk/risk-event-apply.flow.js';
export { BlacklistExpiryNoticeFlow } from './risk/blacklist-expiry-notice.flow.js';
export { PerformanceGenerateFlow } from './performance/generate.flow.js';
Loading
Loading