--- title: 出库/上链不变量与审核流约束 type: rule permalink: main/projects/d44c219a-0b31-4de1-b160-323eb34a4c6a/出库-上链不变量与审核流约束 stable_id: a9739d28-4318-492e-bad3-53e9ea2769a8 scope: project project_id: d44c219a-0b31-4de1-b160-323eb34a4c6a memory_type: rule status: active revision: 1 restored_from_commit: 6a6a895eafcca6052e81a14fca103a42635dd1c2 created_at: '2026-09-23T15:07:29.222015+00:00' updated_at: '2026-09-23T15:07:29.222081+00:00' tags: - outbound - blockchain - audit - business-rule --- 出库/上链(前后端一致硬校验): 1. 上链与出库完全解耦:上链只发行追溯码数字身份,链上不含出库时间/备注/图片;可先上链后出库。 2. 出库不可撤销但可修改:每码至多一个 `OutboundRecord`,出库时间必填;`OutboundImage` 独立存储、不限张数、分页读取。 3. 批量上链不逐件调用:按作品元数据分组,每个 publish 请求最多 5000 个 productId;分片全局串行保护 `baseTokenId`。 4. 不允许重复铸造:`PENDING/SUBMITTING/CONFIRMING/ONCHAIN/UNKNOWN` 均禁止新铸,只有明确 `FAILED` 可重试;重试复用已持久化的精确请求与 `operateId`。 5. 未知结果优先保链上安全:网络中断/超时/HTTP 408、409、425、429、5xx/响应不完整 → UNKNOWN,禁止换新 operateId 重铸;只能原参数同步、补录交易哈希,或超管填原因确认失败后重试。 - 批量选择语义 IDS(跨页手选)/ FILTER(筛选全集+排除 ID);`JobItem.traceCodeId` 刻意允许为空(保留失败占位),不要改回非空外键。 - 上链作品必须启用、审核通过且有真实主图;本地 `/uploads/` 主图在发行前以 BASE_URL 转绝对地址。 审核变更流: - 修改已通过档案写 `artwork_revision` 快照,审核通过才覆盖正式数据,C 端期间展示上一版。 - 超级管理员创建/修改自动审批通过(提交人/审核人为本人,不进待审);普通运营进待审;模板无审核模型直接生效。 - 节点、证书、showcaseImages、traceLayout、showOutboundTimeline 均无独立写接口,必须随作品快照提交;快照应用后统一触发证书水印 Worker。 - 历史修订快照缺字段时:showcaseImages 按空数组、showOutboundTimeline 按 false、traceLayout **不覆盖**当前正式布局。 - 空修改前后端双重拦截(“内容未变化,无需提交审核”)。