Skip to content

feat(core): v0.2 M3 legacy supplier import - #15

Merged
marchtian merged 2 commits into
mainfrom
claude/project-thread-2wxink
Oct 23, 2026
Merged

marchtian merged 2 commits into
mainfrom
claude/project-thread-2wxink

Conversation

@marchtian

@marchtian marchtian commented Oct 23, 2026 •

Copy link
Copy Markdown
Collaborator

Requested by 田騏 · project thread

Part of #10 (overview #7, plan §4 M3, design 07 R6). #10 stays open for the real-ledger trial run (see exit criteria).

改了什么

用平台对象列表自带的表格导入,把存量供应商、联系人、证书导进来,可重复执行。不写代码,全部元数据。

对象 / 元数据 改动
srm_supplier 新增 legacy_imported(只能在新建时置为 true:readonlyWhen: previous.legacy_imported != true)、legacy_reviewed、primary_contact_count(带条件汇总)。status 默认值改为 legacy_imported ? 'qualified' : 'potential',initialStates 加 qualified,插入规则 initial_status_by_source 要求「合格」与「存量导入」同真同假
srm_supplier_contact 主联系人守卫:插入 / 由否改是时,供应商已有主联系人则拒绝
srm_supplier_certificate 新增 legacy_imported;存量证书 cert_no 必填、扫描件不必填(表格带不了文件)
视图 供应商「存量待复核」「主联系人重复」;证书「存量导入缺扫描件」
动作 srm_confirm_legacy_review「确认复核」(声明式 operation: 'update')
权限 srm_admin 可导入(供应商 / 联系人 / 证书增改),是唯一能写「存量导入」标记的权限集;srm_supplier_admin 与 srm_admin 对供应商 modifyAllRecords(04 §2.3 的 RCE,供应商主数据集团共享;否则品类经理无法复核别人导入的供应商)
种子 已合格的演示供应商改为「存量导入、已复核」,满足新的插入规则
样例表格 data/samples/srm_supplier*.csv 三张(全部「示例」虚构值,与 M1 的物料样例放在一起)
文档 新增 docs/implementation/legacy-supplier-import.md(匹配规则、字段说明、重复导入、复核、常见错误);设计 02 §4.1 / §5.1、04 §2.2–2.3、05 §1.1、07 §4 R6 / §6.1 / §6.3、engineering §1、data/samples/README.md 同步

设计取舍

  • 状态不放进表格:重复导入时表格里的「合格」会把冻结、淘汰的供应商改回合格(状态机允许 frozen → qualified),而 treatAsHistorical 只有系统身份能用。所以用表达式默认值在新建时算初始状态,表格根本不带状态列;证书状态同理由资质扫描计算。
  • 境内 / 境外两遍:平台一次导入只能一组匹配字段,同一张供应商表导两遍(信用代码 / 国家 + 注册号),各自 skipBlankMatchKey 跳过另一类行。
  • 「待复核」用独立的 legacy_reviewed,不清掉 legacy_imported,否则重复导入会把已复核的供应商重新标回待复核。

平台限制(已提需求,变通为临时措施)

issue 限制 本 PR 的临时做法
objectstack#25475 导入没有「只在新建时写入的列」 / 「已存在则跳过」 表达式默认值 + readonlyWhen
objectstack#25476 一次导入只能一组匹配字段 同表导两遍
objectstack#25477 没有条件唯一;带条件汇总的守卫在同一批写入里看不到前面的行 守卫单条写入 + 「主联系人重复」视图兜底

已登记到 07 §6.3(PF8–PF10)。

验证

  • pnpm validate、lint、typecheck、i18n:check、test(合并 main 后 7 个文件全部通过)、build;governance/scripts/build.py --check 通过;文档相对链接与锚点检查 0 问题。
  • 新增 test/import-idempotency.test.ts(以 srm_admin 岗位用户走 POST /data/:object/import):
    • 三张样例表导入无错误;境内 / 境外供应商建档即「合格」并标记存量导入;
    • 资质扫描后过期的必备证书标为 expired,供应商出现资质异常;非必备证书过期不报警;
    • 导入幂等门禁:再导一遍全部为 updated、0 created,业务字段快照一致;
    • 冻结并复核后再导入,状态仍为 frozen、复核标记不回退、资质异常不被清掉;
    • 已经通过准入建档的供应商出现在存量表里时只更新资料,不变成存量 / 合格;
    • 不合格行(信用代码格式、缺全称、第二位主联系人、找不到供应商、有效期颠倒、缺证书编号)逐行报错,其余行照常导入;
    • 同一张表里同一家的两位主联系人进入「主联系人重复」视图(objectstack#25477);
    • 品类经理不能写存量标记,系统身份也不能不带标记直接建「合格」。

出口条件

  • 样例三张表在 CI 中导入两遍,结果一致
  • 导入后过期证书在下一次扫描后标记 expired,供应商出现资质异常
  • 用客户真实台账(脱敏)导入一次,问题记录在 PR 中——仓库里没有客户台账,需要 @marchtian 提供一份脱敏样本后补做(v0.2 M3:存量供应商导入(供应商、联系人、证书) #10 保持打开)
  • os validate、os i18n check --strict 通过;设计 02 / 07 与实现一致

🤖 Generated with Claude Code

https://claude.ai/code/session_01WD2qxFMbYUkbEnsSXW7PQj

Import existing suppliers, contacts and certificates with the platform
spreadsheet import, idempotently:

- srm_supplier: legacy_imported (settable only on create, srm_admin only),
  legacy_reviewed, primary_contact_count; status defaults to qualified for
  legacy imports so sheets never carry a status column and re-runs cannot
  revert frozen/eliminated suppliers; insert rule ties qualified to legacy.
- srm_supplier_contact: at most one primary contact guard (single writes).
- srm_supplier_certificate: legacy_imported; cert_no required and scan
  optional for legacy certificates.
- Views: legacy review, duplicate primary contacts, legacy certificates
  missing a scan; "confirm review" action.
- Permissions: srm_admin imports; supplier maintainers edit all suppliers.
- Sample sheets under src/core/data/import, imported twice in CI.
- Design 02/04/05/07, engineering rules and an import guide updated.

Platform gaps filed: objectstack#25475, #25476, #25477.

Closes #10

Claude-Session: https://claude.ai/code/session_01WD2qxFMbYUkbEnsSXW7PQj
Co-authored-by: Claude <noreply@anthropic.com>
@marchtian marchtian self-assigned this Oct 23, 2026
Keep both srm_admin duties (material import and legacy supplier import)
and move the legacy sample sheets to data/samples/ next to the material
sample, as M1 established.

Claude-Session: https://claude.ai/code/session_01WD2qxFMbYUkbEnsSXW7PQj
Co-authored-by: Claude <noreply@anthropic.com>
@marchtian
marchtian merged commit c22c58b into main Oct 23, 2026
2 checks passed
marchtian pushed a commit that referenced this pull request Oct 23, 2026
#15 gave srm_supplier_admin and srm_admin modifyAllRecords on
srm_supplier so category managers could review suppliers imported by an
admin. The platform's modifyAllRecords also grants delete
(objectstack#25470), so category managers and buyer leads could delete
any supplier and cascade its contacts and certificates.

Follow the srm_material workaround instead: srm_supplier OWD is
public_read_write for now, modifyAllRecords is dropped, and srm_quality
keeps its edit grant only for certificate writes with every supplier
field read-only through FLS. Tests cover edit-not-delete for category
managers and buyer leads, and read-only for SQE, buyers and AP.

Claude-Session: https://claude.ai/code/session_01WD2qxFMbYUkbEnsSXW7PQj
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants