Files
docs/海外仓业务/采购订单样品履约流程变更需求.md
T
2026-10-14 00:06:59 +08:00

459 lines
63 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 采购订单样品履约流程变更需求
日期:2026-10-09
采购订单需要从现有的下单、审核和数量记录,扩展为客户下单、海外购买、到仓装箱、国际快递交寄、国内收货核费及寄客户的完整流程。核心变更是将样品货款与快递费用分开控制:购买完成时扣样品货款,预估快递费先冻结,国内收货后再录入实际国际快递费、关税等费用。
本文是本次采购流程变更的需求维护入口。2026-10-09,用户授权按“首版简单、后续可扩展”的原则确定原第 8 节的 19 项业务规则;本版已将决定同步到操作、资金、权限和验收要求,开发按本版执行。第 2 节仅记录修改前的源码基线,第 3 至第 8 节定义目标行为;本文不表示目标功能已经实现、部署或通过环境验收。
## 1 已确认的目标流程
客户采购下单 → 国外客服购买完成,填写预计到货时间并扣样品货款 → 货物到仓核对,录入每箱箱规、重量及装货清单 → 国内客服根据清单打快递面单,冻结预估快递费 → 上传面单,国外贴单并送快递站点 → 国内收货,录入准确国际快递费、关税等费用 → 寄给客户。
| 节点 | 操作方 | 明确要求 | 需要区分的业务事实 |
|---|---|---|---|
| 客户下单 | 客户 | 创建采购订单 | 下单不代表已购买 |
| 购买完成 | 国外客服 | 填写预计到货时间,执行样品货款扣费 | 购买完成与后台审核通过不是同一节点 |
| 海外到仓及装箱 | 海外收货作业人员 | 收货核对,录入箱规、重量、每箱装货清单 | 入库总量不能替代逐箱清单 |
| 制作面单及预估运费 | 国内客服 | 根据清单制作快递面单,锁定预估快递费 | 锁定是冻结,不直接扣款 |
| 海外交寄 | 国外作业人员 | 获取面单,贴单,送快递站点 | 上传面单、贴单、交寄为不同事实 |
| 国内收货及核费 | 国内收货人员、国内客服 | 国内收货后录入准确国际快递费、关税等费用 | 预估费用与实际费用必须区分 |
| 寄客户 | 国内作业人员 | 将货物寄给客户 | 海外交寄与国内寄客户必须区分 |
## 2 当前实现与差距
以下为 2026-10-09 的源码核对基线,不作为测试环境部署或验收状态记录。部署与已验证场景仍以两份环境主契约为准。
| 范围 | 当前已有 | 本次需要变更 |
|---|---|---|
| 客户下单 | 正式创建、列表、详情入口;商品、规格、链接、数量、预算、地址和联系人;提交后待审核 | 在已有入口增加后续履约进度与业务明细 |
| 购买 | 后台审核、预计到达时间维护 | 增加独立购买完成操作及实际样品货款扣费 |
| 海外收货 | 采购仓库、手工入库数量、签收文件 | 增加收货核对、逐箱尺寸、重量和装货清单 |
| 快递费用 | 后台登记费用及凭证,发送冻结请求 | 区分样品货款、预估快递费、实际国际快递费及关税;改变结算触发时点 |
| 面单 | 只有签收文件、费用凭证分类 | 增加面单上传、受控读取、箱关联及贴单交寄事实 |
| 国内收货 | 未见采购专用国内收货节点 | 增加国内收货事实及实际费用确认 |
| 寄客户 | 国内外承运商、运单号;通用出库明细及时间 | 明确国内寄客户记录,与海外交寄分开 |
| 客户详情 | 基础商品信息、数量、预计到达时间、国内外运单、审核备注 | 增加节点进度、逐箱明细及获准展示的费用和文件 |
现有采购展示状态为待审核、已通过、已拒绝、待出库、部分出库、全部出库,不能表达购买完成、装箱、面单、海外交寄、国内收货和寄客户。
当前下单为单商品模型,仅有一份选填收货地址,联系方式允许填写电话、微信或邮箱。已有字段不能直接视为国际段和寄客户段均已具备可用于快递制单的收件资料。
### 现有资金逻辑与目标冲突
采购费用登记后发起冻结。当采购入库量达到采购数量时,系统对已冻结的采购费用发起结算;如果在全部入库后才登记费用,冻结成功回执也会继续触发结算。触发条件是全部入库,不是采购出库。
因此,在货物到仓装箱后登记预估快递费,现有逻辑会继续结算,无法保证只冻结。必须移除采购费用依赖入库数量统一结算的行为,按不同费用用途和业务节点控制。不得仅修改页面文案而保留旧触发逻辑。
## 3 首版履约范围与操作规则
### 3.1 范围与扩展边界
- 一单一个商品及规格、一次购买、一个履约批次、一个海外实际收货仓和一个国内接收地点;数量使用正整数件。一单允许多箱,国际段和寄客户段各一次整批实际交寄,可有对应不同箱的主/子运单。
- 海外、国内均允许对同一批次分次追加实收记录,例如两箱隔日到达。实收登记不自动完成收货;全部到齐或差异已处理后,由操作人员确认该段收货完成,再推进整批后续节点。
- 首版不支持多商品、追加或分批购买、分批国际交寄、分批寄客户、跨订单合箱及跨订单共用面单。购买前需要更换商品或数量时,取消原单并重新下单、审核;购买后不修改原购买对象。
- 海外收货、装箱、贴单和交寄均使用 Admin。采购数量只记履约台账,不接入 PDA,不形成或修改 WMS 可用库存,不绕过既有 PDA 入账边界。
- 商品、实收明细、箱内明细、两段运送及费用分别保留稳定业务关联;首版在服务端限制商品和履约批次数量,不把可扩展性做成未启用的流程、通用审批引擎或新的资金账本。
### 3.2 节点操作与保存信息
| 操作 | 保存的信息 | 执行与完成条件 |
|---|---|---|
| 客户下单 | 单商品、规格、链接、数量、预算单价及币种、最终收件人、联系电话及完整国内地址 | 登录客户隔离;预算非负且必须明确填写,零预算表示仅授权免费样品;提交进入待审核 |
| 平台审核 | 通过或拒绝、审核人、时间、备注、采购仓 | 保留现有单级审核;采购仓取国内仓库主档中的有效海外收货仓。拒绝结束原单,不新增退回修改流程;审核不是扣款 |
| 确认购买完成 | 已审核商品与数量快照、实际购买时间、供应商实付金额及币种、凭证、预计到海外仓时间、操作人 | 按第 4.1 节预算上限校验;真实购买事实与资金状态分开保存,触发实际货款扣费。未购买不得点击完成,也不得以预算替代实付 |
| 登记并确认海外收货 | 实收时间、实际仓库引用及编码/名称快照、逐次实收数量、合格数量、差异和处置 | 对照购买明细累计核对;已到货可先登记,未齐或异常未处理不能确认收货完成 |
| 保存并确认装箱 | 箱号、外箱长宽高、封箱毛重;箱内商品、规格、数量、实收来源 | 仅使用本单已确认可发的实收明细;各箱数量合计必须等于本批全部可发数量,不能重复分配。草稿可随收货准备;正式确认须海外收货完成、样品货款成功或确认零元 |
| 外部制单、上传与预估冻结 | 已确认清单版本、箱关联、承运商、运单号、面单文件、两端地址快照、预估国际运费 | 国内客服在外部制单后上传,填写 CNY 预估金额;系统只冻结该金额。制单与上传可先完成,冻结未成功不能交寄 |
| 确认贴单与海外交寄 | 逐箱贴单确认、实际交寄时间、本批全部箱及货物来源、承运商与运单、操作人 | 贴单与交寄分开留事实;全部有效面单与当前清单一致,预估资金已冻结或明确为零,且无阻断异常,才允许整批交寄 |
| 登记并确认国内收货 | 原国际交寄箱、逐次实收数量、合格/异常数量、实收时间、差异处理 | 不用总箱数代替逐箱来源;分次到达可以记录,全部收齐或差异已处置后确认该段完成 |
| 核定实际费用 | 国际运费、关税、国内运费、其他费用的核定情况、实际金额、凭证、业务日期、确认版本 | 国内收货完成后由有核费权限的国内客服确认并发起第 4 节资金处理;不增加客户在线确认或第二级财务审批 |
| 确认寄客户 | 国内实际交寄时间、全部可寄实收明细及数量、承运商与运单、最终收件快照、操作人 | 第 5 节资金及异常条件通过后整批交寄;生成面单、取得运单号或提交寄件信息不代表已寄出;实际交寄后进入“已寄客户” |
制单固定采用封箱毛重 kg(保留 3 位小数)和外箱长宽高 cm(各保留 2 位小数),数值必须为正。超出精度时提示按精度重新填写,不静默改变实测值;不新增净重、体积重或计费重试算。承运商计费与实测存在差异时,通过实际费用及凭证说明,不覆盖原测量值。
面单首版仅接受 PDF/JPG/PNG,沿用 File 的大小和安全限制;一个文件可覆盖本订单多个箱,但应明确每箱对应的面单页或文件。国际段同一批可有多个箱运单,国内段同样逐箱可追溯;不要求一箱一笔冻结,不新增快递商、轨迹或打印机集成。
### 3.3 修改、重制与历史保护
| 对象 | 首版规则 |
|---|---|
| 商品、规格、数量 | 审核后锁定,购买前需要变更则取消重下;购买后仅允许登记事实更正说明及异常处置,不直接改原商品或数量。预算上限调整单独按第 4.1 节处理 |
| 计划采购仓与实际实收仓 | 首次实收前由采购审核/管理人员选择或修改计划仓;首次实收冻结实际仓。实际仓录错由采购管理人员凭说明、证据更正并保留原记录;已有后续实物操作时不得通过改字段重归属,仅补充更正记录并处理异常。首版不做转仓 |
| 实收数量 | 按该实收记录本段的下游判断:海外实收已有装箱确认时,先撤回尚未交寄的海外清单再建立受控更正;国内实收在尚未寄客户时可建立受控更正,重核可寄数量、国内面单及费用依据,不回滚原国际交寄。已完成本段实际交寄时仅追加更正说明和异常处置,不改写原实物事实 |
| 未交寄装箱清单 | 修改形成新版本;箱、数量、尺寸、重量变化立即使旧面单不能用于新版本,需国内客服重新核对清单、面单与预估。旧贴单确认失效,重新贴单后才可交寄 |
| 未交寄预估金额 | 金额不变且币种为 CNY 时,核对后可由新清单版本引用原有效冻结,不新建占款;金额变化则先释放旧冻结,成功后再申请新金额冻结。释放或新冻结未完成时禁止交寄,失败显示待处理,不保留两笔重复有效占款 |
| 面单重传 | 同清单同金额只替换文件版本并保留历史,不重复冻结;换承运商、运单或收件信息须重新核对报价和箱关联,并重新确认贴单 |
| 已交寄记录 | 保留当次清单、货物、面单、运单、地址和时间快照;之后只能追加有权限的更正说明,不覆盖原事实,不以改版本重新增加可发数量 |
| 已确认费用 | 金额、币种、汇率及资金请求不能原地覆盖;处理中禁止确认更正,已结算后的增减分别走第 4.5 节调整 |
海外交寄时,服务端须按本订单、当前清单、实际箱和货物来源原子校验并保存有效交寄事实。累计有效交寄不得超过本批可交寄装箱数量,本次必须覆盖全部可交寄箱;不同操作人、不同请求、刷新或更换清单版本不能重复发出同一货物。原请求重放返回原结果,其他请求遇到已交寄货物明确提示,不新增交寄数量或国内收货来源。合法更正只修订说明或建立关联更正,不产生第二份有效交寄。
### 3.4 国内货物承接与异常
- 国内实收逐箱关联国际交寄来源,同一收货事实不重复计数,分次实收按原箱累计核对;多到的货物单独记异常,不增加本单可寄数量。
- 两端短少、破损、多货均先如实记录。未处理差异阻断收货完成及计划性发运,但不阻断继续登记真实到货。采购管理人员在本单记录“等待补齐、确认短少、破损拒收/处置、多货退回”的数量、原因、证据、操作人和时间。
- 等待补齐不生成第二个购买或发运批次。供应商补发只用于海外整批交寄前补齐本单原采购缺口;国际交寄后,国内等待补齐仅限原交寄范围内的迟到货物。需要重新采购或再次国际发运的另行下单,不在原单追加交寄。客户接受短少、破损后剩余货物继续履约,或停止履约,均由客服留存客户书面/聊天凭证,采购管理人员确认。钱款由财务关联原费用调整,不按短少数量自动退款。
- 只有已确认可寄的实收明细可继续装箱/寄出;已寄量加本次寄出量不得超过可寄实收量,且本次须覆盖本批全部剩余可寄货物。全损或无可寄货物进入异常关闭,不伪造零数量交寄。
- 国内允许一原箱对应一新包装的破损换箱,记录原因与新箱规重量,保留原箱业务标识及其来源关系;换箱不改变已经核准可寄的商品、数量。不支持拆成多箱、合并不同箱或重新组合商品;损坏商品的剔除先走差异处置。
- 购买前可由有取消权限的平台人员取消,客户通过客服提出取消;购买后不提供抹除履约的一键取消。全部实物去向明确、无需继续履约、已收费调整和冻结释放均完成且无未决资金时,采购管理人员可异常关闭。关闭保留原履约和资金事实,不自动退款,也不自动生成退货物流任务。
- 本节只是采购履约记录及最小异常处置,不产生 WMS 库存流水,不新增通用异常工单、供应商应付或索赔系统。
### 3.5 两段地址、文件与客户展示
| 内容 | 首版处理 |
|---|---|
| 国际段收寄资料 | 寄件方取实际海外仓资料,国内接收地址由国内客服每单录入或从已有资料复制;国内收件人、联系电话及完整地址在制单前必填,不新增国内接收地点主档 |
| 国内寄客户资料 | 客户下单提供最终收件人、电话和完整国内地址;国内客服寄出前核对。客户申请变更由客服凭确认记录修改;已制单须重制面单,实际交寄后不能覆盖原地址或在系统中假作改派 |
| 资料快照 | 两段分别保存当次使用的收寄姓名、电话、地址及承运商要求的信息,后续主档变更不改历史快照;仅有微信或邮箱不能代替快递电话 |
| 客户可见 | 本客户订单进度、预计到海外仓时间、装箱结构化明细、两段承运商/运单、预算上限、货款及各费用、冻结/扣款/退款结果、对客异常处理摘要 |
| 客户不可见 | 面单、供应商采购凭证、费用凭证、预算沟通凭证、内部异常附件、内部备注及原始诊断报错;首版不开放这些文件下载,也不新增客户核费审批页面 |
文件读取、下载和关联均由服务端校验客户、订单、文件分类及操作者权限。平台人员可在其采购业务权限范围内处理不同客户的订单,不强加个人仓绑定;关联的文件必须属于当前订单,不能仅凭同客户或文件标识放行。一个订单多箱共用一份面单允许,跨订单共享首版不开放。文件本体继续由 File 持有。
## 4 费用与资金规则
### 4.1 币种、预算和实际货款
- 原币仅支持 CNY/USD,钱包、资金命令及本次采购实际费用入池统一 CNY。预算单价和原币费用保留 2 位小数;USD 折算复用 Lastleg 现有月度汇率及 OverseasFeeCurrencyConverter:取费用实际发生日所在月的有效正数汇率,汇率 6 位,CNY 金额 2 位,均使用 HALF_UP。CNY 汇率固定 1.000000。
- 保存原币、原金额、实际业务日、汇率月份、汇率值和折后金额;确认后冻结快照。缺失有效汇率时不得确认资金金额,不能默认 1 或取回执/重试当天汇率;已经发生的购买仍可登记为待核定事实。
- 预算总上限等于预算单价乘已审核数量,是样品货款上限,不包含运费、关税等服务费用。核对实付时,预算与实付均以本次购买相同汇率快照折算为 CNY 比较;实际货款按供应商实付 1:1 收取,首版不加价。
- 无预算须先取得客户授权补齐;零预算只授权免费货款。超预算须在购买前取得客户书面/聊天确认,客服登记新的上限、币种与凭证,由现有采购审核人员核验后生效;保留前后上限,不新增客户在线审批或多级流程。
- 已发生的未授权超预算须记录真实事实并暂停后续确认,取得客户授权后再核定扣费,或按异常终止/退款处理;不得静默超扣、伪造金额或丢失采购事实。买错商品或数量不通过补预算授权改写原购买对象,记录异常后处理退还/关闭,正确需求另单办理。
### 4.2 费用用途与核费范围
| 用途 | 时点与资金行为 |
|---|---|
| 样品货款 | 购买完成后按确认的实际 CNY 金额扣费;明确免费时只记核定事实,不发零元资金指令 |
| 预估国际运费 | 制单阶段只冻结国际段预估 CNY 金额;零预估须记录依据,不发零元冻结。关税、国内运费及其他费用不混入该冻结,冻结不生成实际应收 |
| 实际国际运费 | 国内收货完成后按实际金额结算唯一有效的国际运费冻结,规则见第 4.3 节 |
| 关税 | 国内客服依据实际凭证核定,正额单独扣费,不适用或零元需明确确认 |
| 国内运费 | 国内收货完成后可先外部制单确定价格,核定扣费成功后再交承运方;制单不代表发货,不引入“先发货才能知道金额”的依赖 |
| 其他费用 | 默认不适用;发生时逐项填写名称、原因、凭证、业务日及金额,正额单独扣费。不得重复计入货款、国际运费、关税或国内运费 |
国内核费由有核费权限的国内客服一次确认本单费用清单,不再增加客户确认或第二级财务审核。国际运费、关税、国内运费和其他费用范围都应有明确核定结果;其他费用可标为“不适用”,不要求创建虚构收费行。
| 核定情况 | 处理 |
|---|---|
| 待核定 | 尚无明确结果,空值不视为零元;不能完成本单核费或寄客户 |
| 确认零元 | 项目适用但无需收费,保存确认人、时间及依据,不发零元扣款、冻结或结算指令 |
| 不适用 | 明确不适用于本单,保存确认说明,不伪造已付款 |
| 确认正额 | 保存金额和确认版本,发起资金处理;核费已确认与扣费成功分别展示 |
已有冻结对应的实际费用确认零元时仍须真实释放冻结。费用清单中的多笔正额分别处理,部分扣款成功不回滚已成功扣款,也不能重扣;只跟进其余未完成项,全部完成后才允许国内实际交寄。
### 4.3 扣费、差额与冻结
样品货款、关税、国内运费及其他正额费用复用 Finance 的业务冻结后立即全额结算链路,同一费用号最多一次成功实扣。中间显示扣费处理中,不要求客服手动执行两步;冻结成功不等于扣费成功。该自动结算只用于明确的实际费用用途,预估国际运费不得沿此链路自动结算,更不得由采购入库数量触发。
设预估国际运费冻结额为 E,最终实际国际运费为 A,两者均为 CNY:
| 情况 | 首版资金行为 |
|---|---|
| A = E 且 A > 0 | 结清原冻结,实扣 A |
| 0 < A < E | Finance 在同一事务内实扣 A、释放 E − A,原预估 E 与实际 A 分别保留 |
| A > E | Finance 在同一事务内校验并补占差额后实扣 A;资金/有效授信不足时整笔失败,保留原冻结和原余额,不先释放原冻结 |
| A = 0 或国际运费不适用 | 仅释放对应有效冻结;无冻结则只保留核定结果,不生成零元结算 |
| E = 0、A > 0 | 无原冻结可结算,按一笔实际国际运费执行冻结后立即结算;费用来源仍只记录 A |
按实际金额结算冻结由 Finance 原子执行,Lastleg 不能用“释放旧冻结、再冻实际金额、再结算”的串行操作代替。此规则用于最终实际结算;交寄前重新报价使用第 3.3 节“先释放旧预估、再冻结新预估并阻断交寄”的流程,二者时点不同。
资金可用额、授信期限、扣用顺序和充值归还顺序全部沿用 Finance 当前规则;采购不额外开放透支、不建立授信副本,也不套用信用卡授权有效期。冻结不因到货、时间流逝或订单页面关闭而自动结算/释放,必须关联明确的重估、结算、取消或异常处理动作。
### 4.4 请求幂等、费用版本与入池
- 每个资金请求绑定客户、费用用途、费用确认版本、原币/汇率/CNY 快照和唯一请求标识。每个费用业务事实最多一次成功扣款,不能通过新请求标识绕过该约束。
- 处理中或结果未知时,可保存更正草稿,但不能确认新版本、发起替代扣款、退款或释放同一待决资金;先查询/重放原请求直至结果明确。网络超时不能当成业务失败。
- 只有 Finance 已明确失败且确认未发生目标资金动作时,才允许对同一费用版本登记新的重试尝试;保留原尝试结果。冻结已成功但结算失败时只重试结算,不能新冻一遍。
- 旧版本晚回执只能更新原请求及其费用版本,不覆盖新金额结果,不丢弃真实扣款、冻结或释放事实。未决时尝试确认 V2 应被拒绝,V1 结果明确后才能按第 4.5 节更正。
- 本次采购的正额费用收到成功扣款回执后,才通过同一费用版本的 Outbox 发布实际应收来源。预估冻结、零元和不适用不发布实际应收;发布失败只重试来源投递,不再次扣款。
- Finance 以明确的原资金处理引用和实际 CNY 扣款金额核对来源;匹配后直接作为已结算应收入池,不能进入普通待对账候选。来源缺少资金引用、引用跨客户或金额不符时拒绝或待核对,不降级成可再次收费的 AVAILABLE 来源。
- 延迟、乱序及重放仍须安全:已扣款等待来源入池时显示该关联进度;关联不影响已经发生的资金事实,但正常寄客户前须完成实际费用入池关联,异常关闭前同样须完成关联。
上述规则按[财务费用入池 P0 闭环](../财务管理/财务费用入池P0闭环.md)的防重复结算原则执行;本次采购采用“先实扣、后发布已结算来源”的确定路径,不增加采购赊账出账选项。
### 4.5 更正、追加与退款
- 未发出资金请求的费用草稿可修改;仅处于预估冻结阶段的金额变化按第 3.3 节重估。已发出请求且结果未决时锁定确认动作,不用新费用号避开未决状态。
- 实际费用的资金请求已明确失败且尚未成功实扣时,先终止旧版本的后续重试;仍有有效冻结的须释放成功,才可更正确认新费用版本并发起关联的新请求。该情形不产生已实扣差额单或退款,旧版本不能因晚回执或人工重试重新生效。
- 已结算费用增加金额,由具有财务调整权限的人员创建仅含正差额的新调整单、独立费用号,引用原费用和原因凭证;例如原已扣 100,正确总额 120,则新增 20,不重新扣 120,也不复用原冻结号。原实际费用和差额各自关联成功资金结果。
- 已结算费用减少或应退,由财务人员创建关联原成功扣款的 CNY 退款调整,填写原因、凭证和金额。Finance 锁定原扣款,原子校验本次退款金额不超过“该原扣款金额 − 累计已成功退款”的可退余额;等价地,计入本次后的累计退款不得超过该原扣款。幂等回补客户钱包并保留不可变流水,回补遵循 Finance 现行资金归还顺序,不延长或恢复过期授信;仅冻结未扣款的款项执行释放,不做退款。
- 退款只回客户资金账户,不走外部支付原路退款,不以普通充值伪装,不发布负数普通费用。原费用保持已结算,财务净额通过原款、正额调整及退款记录计算,不能重新进入待对账池。
- 对同一原费用链的金额更正沿用原汇率快照,以“原扣款 + 已成功正额调整 − 已成功退款”计算当前净实扣,再与本次修正目标 CNY 总额求差。同一费用链有未决调整或退款时不得确认下一次更正;明确失败的旧调整须先完成,或终止其后续重试并释放仍占用的冻结后,才能按新目标更正,不能留下以后还可重试扣款的旧目标。独立新发生费用才使用新业务日汇率;退货、短少不自动推导退款金额,由财务依据已确认的客户处理方案执行。
- 已成功退款、调整和原扣款均不得覆盖;同一调整单重放返回原结果,拒绝重复、超额及零元退款。需退多笔实扣时逐笔关联,不能跨客户冲抵。
- 履约已完成后可以处理有凭证的追加或退款,资金进度单独展示,不把“已寄客户”回退成未发货;异常关闭时要求当时所有已知资金处理结束,后续新增有据调整保留关联记录。
## 5 权限、状态与节点准入
### 5.1 操作权限
沿用平台/客户两级及现有 IAM 角色;不新建国内/海外用户类型或岗位主档。采购列表权限包含详情只读,写操作独立,按下表动作赋予现有岗位,可由同一账号兼任多个动作,首版不强制双人分离。
| 动作范围 | 负责岗位及权限边界 |
|---|---|
| 客户下单和查询 | 仅本客户;不能执行后台审核、收货、发运或资金调整 |
| 采购审核、取消、预算上限核验 | 现有采购审核/管理人员,保存审核或取消事实 |
| 购买、海外收货装箱、贴单交寄 | 海外业务人员按各动作权限执行;服务端校验有效海外仓及订单冻结的实际仓,不把 Admin 用户绑定到某个 PDA 仓 |
| 面单、预估、国内实收、核费、寄客户 | 国内业务人员按对应独立动作权限执行;面单上传不同时赋予核费或资金调整权限 |
| 事实更正、差异确认、异常关闭 | 采购管理权限;资金结果不能通过此权限修改 |
| 追加收费、退款 | Finance 财务调整权限;采购服务只发起受控业务请求,不直写账户或财务单据 |
权限码、Controller、接口合同、IAM 配置与前端按钮由开发按此动作边界同步落地,不能继续用一个通用编辑权限代替所有新节点权限。平台授权人员可以处理不同客户的采购单;客户隔离及文件范围始终由服务端保证。
### 5.2 状态与准入
履约进度按事实派生:待审核 → 待购买 → 待海外到仓 → 海外收货中 → 待装箱 → 待面单及预估处理 → 待海外交寄 → 国际运输中 → 国内收货中 → 待国内核费 → 待寄客户 → 已寄客户。已拒绝、已取消、异常关闭单独记录;异常处理中作为阻断标记,不抹去最后真实履约阶段。具体枚举命名由技术设计确定,含义不得改变。
| 动作 | 首版前置条件与资金失败处理 |
|---|---|
| 正常购买确认 | 已审核,商品及数量一致,预算授权和汇率可用;购买前可查询资金资格但不提前冻结货款。已真实发生的异常购买可登记,扣费失败不回滚购买事实 |
| 登记收货事实 | 有对应购买/交寄来源即可记录实际到货,即使资金未成功;来源异常仍保留异常记录,不能伪造上游成功来放行正常链路 |
| 正式装箱确认、预估冻结 | 海外收货完成、差异处理完毕、样品货款扣款成功并完成费用来源关联,或已明确免费;资金未决/不足时可准备草稿,不能完成上述确认 |
| 海外实际交寄 | 清单、面单及逐箱贴单已确认;样品货款完成;预估国际运费冻结成功或确认零预估;所有可发货物整批一致,无阻断异常 |
| 国内核费确认 | 国内收货完成,差异处置明确;四类费用均有核定结果,国内运费可以先制单取得确定金额。可以保存草稿,未核定不能确认整单费用 |
| 国内实际交寄 | 全部可寄货物核平;全部正额货款/费用扣款及费用来源关联完成;零元/不适用已核定;多余冻结已释放;无未决退款/调整及阻断异常 |
| 异常关闭 | 全部货物有明确去向且无需继续履约;所有已知费用、退款、来源关联和冻结释放完成;采购管理人员填写原因确认 |
首版不允许客服用“继续发货”跳过资金失败或未知结果,也不新增人工透支开关。余额不足通过充值或 Finance 已有授信机制解决后重试。国内实际交寄确认即正常履约终态,不新增客户签收、物流轨迹或自动签收功能。
## 6 代码入口、能力差距与实施边界
| 范围 | 当前入口 | 本次实现重点 |
|---|---|---|
| Client | apps/client-web/src/modules/cross-border/routes.ts、views/ProcurementView.vue、components/BusinessOrdersView.vue、api/businessOrders.ts | 单商品下单校验、预算及地址、进度与费用展示;不影响共用组件中的本土卡车、散板 |
| Admin | apps/admin-web/src/modules/overseas-business/pages/PurchaseOrdersView.vue、PurchaseOrderEditView.vue、PurchaseOrderDetailView.vue;api/platformOverseasBusiness.ts | 节点动作、实收/箱明细、面单、预算凭证、核费及异常权限;通用编辑移除越过节点的写入 |
| Lastleg | baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/procurement/ | 状态和业务明细、用途驱动资金指令、版本回执、原子数量校验及审计 |
| 费用来源与汇率 | Lastleg financefee/,按采购实际引用进入;OverseasFeeCurrencyConverter | 复用月度 USD/CNY 汇率快照;成功扣款后发布实际来源,预估不入池 |
| Finance 与 File | 沿采购资金、费用和文件调用进入 | Finance 资金及关联扩展;File 文件归属、分类与授权 |
现有钱包只有全额结算/释放,不能将“按实际金额结算冻结”或“关联原扣款退款”写成已经具备。首版必须补齐以下定向能力:
1. Finance 在单事务内按实际金额结清预估冻结,并处理少收释放、超额补差、资金不足整笔不动。
2. Finance 关联原扣款的幂等钱包退款、可退余额校验及财务调整留痕。
3. Finance/Lastleg 按真实资金处理引用和实际结算金额绑定费用来源,防止预估金额与实际金额不同导致匹配失败或重复出账。
业务费用仍归 Lastleg,账户/冻结/流水/财务事实归 Finance,文件本体归 File。统一 Gateway/Auth 和业务 Outbox 直接投递不变,不新建账本或事件桥。上述定向扩展是满足本版需求的开发内容,不以新增技术平台或跨库写入实现。
开发前需完成本版对应的 DTO、状态/动作、资金命令与回执、表结构及权限合同设计。对外 API、OpenAPI、初始化 SQL、直接消费者、Mock/Fixture 和测试按仓库门禁同步;不为测试存量保留旧流程兼容分支。开发应移除“全部入库统一结算采购费用”的两处旧触发路径。
需求整理阶段仅维护文档;后续用户已授权按本文开发,并部署测试环境、操作测试数据库、执行真实 HTTP 及内置浏览器验收。该授权仅用于本次采购变更的测试环境操作,不扩展到生产环境或无关数据清理。
## 7 首版验收要求
| 场景 | 必须满足的结果 |
|---|---|
| 单商品与批次边界 | 多商品、追加购买、分批发运、跨订单合箱请求由服务端拒绝;一单多箱正常完成 |
| 审核及预算 | 未审核不得购买;无预算不得正常确认;零预算不能扣正额;超预算凭证核验前不能正常扣费;实付不能被预算替代 |
| 汇率与跨月重试 | CNY/USD 原币与 CNY 折算可还原;缺失月度汇率不伪造金额;跨月回执及重试保持原快照;金额与精度按现行转换器 |
| 购买事实与货款 | 购买完成发起货款扣费,不等到全部入库;失败保留购买事实,免费不发零元命令;重复请求不重复扣费 |
| 分次到货 | 同一批次多次实收累计正确;到货可记录,未齐或异常未处理不确认完成;海外交寄前可补原采购缺口,国内迟到只接原国际交寄货物,需要再次国际发运的另单处理 |
| 分段实收更正 | 海外实收更正撤回本段未交寄清单;国内实收更正不回滚已完成国际交寄,重新核对国内可寄数量、面单及费用;已完成本段交寄只追加说明和异常 |
| 实际收货仓 | 实收后通用编辑不得改历史仓;受控录错更正保留原记录,修改采购仓不代表实物转仓 |
| 装箱与测量 | 实收来源与箱内件数核平,不能重复分配;全部可发数量被覆盖;cm/kg 精度和正值校验正确 |
| 多人海外交寄 | 非本单/无效清单箱拒绝;两人不同请求并发或刷新重提同一箱仅一份有效交寄;换版或更正不重复增加国内来源 |
| 面单及预估 | 外部面单可按箱读取打印;上传、贴单、交寄分开;冻结成功仅减少可用额;零预估有依据;全部入库及其后新增预估均不触发扣款 |
| 交寄前重制 | 清单/面单变化后旧贴单失效;同金额重传不重复冻结;变价先释放成功再新冻结,过程及失败阻断交寄 |
| 国内实收与换包装 | 逐箱来源可追溯,重复实收拒绝;允许一对一换包装但不增加货量;拆箱、合箱及重新组合拒绝 |
| 收货差异 | 短少/破损/多货如实记录,未经处理不继续;客户接受减量有凭证;无可寄货物不能零数量交寄 |
| 核费及国内制单 | 四类费用有明确结果;国内运费可先制单再核定扣费,实际交寄在后;未知金额不当零元 |
| 零元/不适用 | 不发零元资金指令、不发布虚构应收;原冻结仍释放并跟踪实际结果 |
| 国际运费差额 | 覆盖 E=100、A=100/80/120/0 及 E=0、A>0;少收余款释放,超额不足时原冻结和余额不变,不出现重复占款或扣费 |
| 未决更正与晚回执 | V1 请求未决时 V2 只能存草稿,确认及替代请求被拒绝;晚回执归属 V1且真实资金事实保留;超时查询/重放不重复执行 |
| 明确失败后重试 | 原结果已确定且无目标资金动作后才能新尝试;已冻结只重试结算,同费用最多一次实扣 |
| 扣款与入池 | 扣款成功才发布实际来源;投递失败不再扣款;原资金引用、客户或实际金额不匹配时不进入普通待对账池;乱序重放仍不重复收费 |
| 追加与退款 | 已扣100连续改120、130、110,依次补20、补10、退款20,净实扣110;单笔原扣100已退30再退50应成功,再退超过20应拒绝;并发退款不能超原实扣;不以充值或负数普通费用替代,原费用不重新可出账 |
| 节点门禁 | 扣费失败仍可登记真实到货;不能确认装箱或计划发运;国内交寄前全部资金、来源关联、余款释放及异常处理满足要求 |
| 地址与真实发运 | 两段快照独立,改地址不覆盖旧面单;仅填写运单不显示已寄;实际国内交寄后进入正常终态 |
| 客户与文件权限 | 客户仅见自己的结构化资料及费用结果,不能下载内部文件;跨客户文件读取/错误订单挂载拒绝;平台已授权跨客户操作不误拦 |
| 取消与异常关闭 | 购买前可取消;购买后不抹除原事实;实物和资金未收口不能异常关闭;关闭不自动退款 |
| 权限与前端回归 | 节点动作由服务端独立授权,通用编辑不能越权;采购修改不破坏本土卡车、散板;客户响应无内部附件和诊断信息 |
代码和本地检查通过不代表整体验收完成。真实 HTTP 与环境写入、部署仍按仓库授权执行;Admin/Client 视觉验收按 1920×1080、100% 缩放,由人工操作并提供截图。部署与已验证场景仅维护在现有两份环境主契约。
## 8 原 19 项业务规则的首版决定
本表依据 2026-10-09 用户“按最简单可扩展方式先确认”的明确授权确定,替代原待确认清单。它是本次业务范围与行为选择,不表示实际人员已在业务单上完成审核或核费。开发按本版实施,后续改变范围需先回写本文。
| 编号 | 原决策主题 | 首版决定 |
|---|---|---|
| 01 | 多商品、购买与履约批次 | 单商品/规格、一次购买、一个批次;多箱、分次实收;两段各一次整批交寄,见第 3.1 节 |
| 02 | 购买前审核 | 保留现有单级审核;通过后购买,拒绝结束原单;不新增通用审批 |
| 03 | 预算与超预算 | 预算为货款上限;超预算先取得客户书面/聊天授权,由现有审核人员核验;不做客户在线审批,见第 4.1 节 |
| 04 | 币种与汇率 | 原币 CNY/USD,钱包及入池 CNY;复用业务日所属月汇率,快照不重算 |
| 05 | 面单方式 | 国内客服外部制单、上传 PDF/JPG/PNG;无快递商/轨迹/自动试算集成 |
| 06 | 箱规重量 | 封箱毛重 kg 3 位、外箱 cm 2 位,正值;不新增计费重试算 |
| 07 | 重制与冻结 | 同金额核对后沿用冻结;变价先释放旧冻结再新冻,期间禁止交寄;旧面单/贴单按第 3.3 节失效 |
| 08 | 事实更正 | 购买对象锁定;按本段未发运的下游撤回并受控更正,国内更正不回滚国际交寄;已交寄事实只追加说明/异常,不覆盖或重发 |
| 09 | 两段收寄资料 | 国际段国内接收资料由国内客服每单录入,最终客户资料由客户下单提供;确认及交寄保留两段快照 |
| 10 | 作业终端与仓范围 | 海外用 Admin,不接 PDA/WMS;角色复用、动作独立授权;校验有效仓与订单实际仓,不新增 Admin 个人仓绑定 |
| 11 | 国内部分实收及重装 | 同批允许分次实收,收口后才继续;仅支持一对一换包装,不拆箱/合箱/重组 |
| 12 | 实际费用确认 | 国内客服按独立核费权限一次确认四类费用;无客户或二级财务审批;未知不当零 |
| 13 | 预估冻结范围 | 仅国际快递费;关税、国内运费及其他费用实际核定后单独扣费 |
| 14 | 实际差额结算 | Finance 原子按实际金额结清预估,少退多补,不足原状保留;零实际只释放,见第 4.3 节 |
| 15 | 未决费用更正 | 只允许准备草稿,原结果明确前不确认新版本或发替代资金请求;已扣增额做正差额单、减额做关联退款 |
| 16 | 失败与节点准入 | 真实到货可记;正式装箱及计划交寄须满足资金条件;未知/不足不放行,见第 5.2 节 |
| 17 | 差异、取消与退款 | 单内最小异常处置;客户减量/停止有凭证;购买前取消,购买后收清实物和资金才能异常关闭;退款回钱包,见第 3.4、4.5 节 |
| 18 | 正常完成条件 | 国内实际交寄确认即“已寄客户”;不新增签收或轨迹。之后财务调整不回退履约事实 |
| 19 | 客户资料开放 | 展示结构化箱明细、运单和费用结果;内部面单、采购/费用/沟通凭证及异常附件不开放下载 |
### 开发交接结论
原 19 项已转为明确首版规则,正文与验收按同一范围执行,不再以待产品选择的条件场景交付。开发仍需完成 DTO、数据库、权限、资金事件和接口的技术设计,并实现第 6 节的 Finance 定向扩展;这些属于已确定业务规则下的实现工作,不是新的产品待确认项。
本版可交开发开展技术设计、任务拆分及实现。需求评审结论不替代编译、测试、环境或人工视觉验收,不表示当前代码已经满足目标。
## 9 依据与成熟软件参考
### 9.1 当前项目依据
- [海外仓业务入口](README.md)
- [财务管理入口](../财务管理/README.md)
- [财务费用入池 P0 闭环](../财务管理/财务费用入池P0闭环.md)
- [统一认证与服务通信契约](../统一认证与服务通信契约.md)
- [测试环境单机部署与配置契约](../测试环境单机部署与配置契约.md)
- [平台客户层级与权限契约](../平台客户层级与权限契约.md)
- [客户端采购详情实现](../../apps/client-web/src/modules/cross-border/components/BusinessOrdersView.vue)
- [后台采购详情实现](../../apps/admin-web/src/modules/overseas-business/pages/PurchaseOrderDetailView.vue)
- [采购服务与现有资金触发逻辑](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/procurement/service/OverseasProcurementService.java)
- [现有海外费用汇率转换](../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/financefee/service/OverseasFeeCurrencyConverter.java)
### 9.2 官方产品文档对照
参考查询日期:2026-10-09。以下用于验证设计模式可行性,具体 19 项是结合本项目现状作出的首版选择,不是声称这些产品采用完全相同的业务规则。
| 官方资料 | 本次采用的模式及边界 |
|---|---|
| [Odoo 19:收发货流程](https://www.odoo.com/documentation/19.0/applications/inventory_and_mrp/inventory/shipping_receiving/daily_operations.html) | 可从较少操作步骤开始,再按质量与仓储需要扩展;本次采用简化采购台账,不引入 Odoo 的库存体系 |
| [ERPNext:Purchase Receipt](https://docs.frappe.io/erpnext/purchase-receipt) | 订单与实收分开,记录接收/拒收及短收关闭;本次允许同批多次实收和明确差异处置,不照搬其库存过账 |
| [Shopify:Understanding shipping labels](https://help.shopify.com/en/manual/fulfillment/fulfilling-orders/shipping-labels/understanding-shipping-labels) | 支持在系统外购买面单后补充运单,贴单和交给承运方是不同动作;本次保留外部制单与人工交寄确认 |
| [Stripe:授权与捕获分离](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method) | 预留与实际扣款分开,部分扣款释放余款;本项目使用自有 Finance 钱包,原子补差是本项目扩展,不接入 Stripe,也不使用信用卡期限或超额捕获规则 |
| [Stripe:幂等请求](https://docs.stripe.com/api/idempotent_requests) | 重试关联原请求,参数变化不能冒充原请求;本项目另加费用业务级防重复,不照搬外部平台的幂等记录保留期限 |
可行性结论:上述模式能够支持本版采购样品流程;实施重点是本项目的明细关系、权限、资金用途及 Finance 定向扩展,不需要先引入完整 ERP、WMS、第三方支付或通用流程平台。
## 10 技术实施合同
本节将前述业务规则映射到实现边界,不改变业务范围,也不表示对应功能已完成。开发直接在当前工作区及分支实施。
### 10.1 数据与事务边界
| 数据对象 | 归属与核心关系 | 约束 |
|---|---|---|
| 采购主单 | Lastleg,保留当前采购单号与客户归属 | 主单版本控制;商品、规格和购买数量审核后冻结;履约阶段与资金状态分开 |
| 购买事实与预算授权 | 关联采购单、原商品快照、凭证及预算授权版本 | 每单一次实际购买;异常购买事实可以先保存,但未核定金额不能扣费 |
| 两段实收记录 | 段别为海外/国内;海外关联购买,国内关联国际交寄箱 | 分次追加与更正留痕;不能重复消费实收来源;实收不直接增加 WMS 库存 |
| 装箱清单与箱内来源 | 清单版本、业务箱号、尺寸重量、实收来源及数量 | 每单唯一当前确认版;数量守恒;失效版本不得交寄;历史版本不能恢复可发数量 |
| 面单与贴单事实 | 文件归 File,关联关系归 Lastleg;绑定运输段、清单版本及箱号 | 每箱明确文件或页码;面单版本改变后旧贴单资格失效;只允许同订单文件关联 |
| 国际与国内交寄 | 每单每段唯一有效整批交寄;保存箱/来源数量、地址、运单快照 | 订单行锁内复验全部货物、资金与异常条件;两段交寄各自幂等,跨请求也不能重复发运 |
| 费用版本 | 费用用途、核定情况、原币/汇率/CNY、版本、原费用链 | 草稿可修改;确认后不可覆盖;预估、实扣及退款分别记录 |
| 资金请求尝试 | 费用版本、操作、冻结身份、事件 ID、请求幂等键、请求金额、结果 | 结果按 commandEventId 精确落到原尝试;未决时禁止替代请求,明确失败才可受控重试 |
| 费用来源关联 | 成功实扣对应的来源版本、资金引用、关联结果 | 预估不入池;资金成功与来源关联分别记录;来源投递重试不得重发扣款 |
| 差异和更正记录 | 来源对象、原事实引用、数量、处置、证据、操作者 | 追加留痕;已交寄事实不覆盖;资金更正受 Finance 独立权限约束 |
数量、费用版本、资金请求和明细关联使用结构化列及唯一约束;JSON 只承载不可变快照、地址或审计补充,不承担全部数量关系。每个节点命令使用订单版本、幂等键和请求摘要;锁定订单后复验来源、可执行动作及最新资金状态,再原子提交事实、审计和业务 Outbox。
通用 `finance-fee-sources` 接口不允许人工创建、提交、审核、调整或作废采购费用来源;采购收费与更正必须从采购节点进入,实扣成功后才由内部已结算发布入口关联来源,防止绕过节点形成第二笔收费。
采购费用记录沿用 `ll_overseas_procurement_fee`,以 `purpose + fee_item_code + fee_version` 在订单内区分确认版本;原币、汇率、实际 CNY、核定情况和资金身份保存在同一不可变费用版本上。`ll_procurement_wallet_attempt` 按 `fee_id + attempt_no` 和唯一 `command_event_id` 保存每次请求。预估与实际国际运费是独立费用事实,实际费用可引用原预估的资金身份;退款用独立费用业务号引用原成功实扣,不能改写原费用。
独立新发生费用通过 `fees/additional` 由 `finance-adjust` 权限登记,必须关联已购买订单、本单费用凭证及真实业务日期,以新业务日汇率和独立费用号处理;不覆盖原费用。费用版本记录 `confirmation_origin`(BUSINESS / FINANCIAL),资金重试沿用该入口权限。普通核费首次成功确认后只能引用已有有效版本,新增费用与失败替代由财务入口处理;未交寄时重新确认完整费用清单,已交寄时不改写原履约终态。
金额在扣款前核对采购台账、钱包和两端费用来源的共同存储边界;费用来源为 DECIMAL(20,6),单笔原币及 CNY 金额最多 14 位整数、业务输入保留 2 位小数。金额目标快照使用台账范围,正差额仍须满足单笔费用来源范围。购买金额不满足资金链容量时保留真实购买事实并显示待处理,不发起扣款。
单批节点事实由 `ll_procurement_flow` 按采购订单唯一保存;`ll_procurement_command` 保存节点请求摘要、幂等键和内部依据;预算上限变化由 `ll_procurement_budget_authorization` 留存前后金额、币种和客户凭证。购买事实与货款核定标记分开,资金结果仍从费用版本读取。节点 API 见 Lastleg `src/main/resources/openapi/procurement-fulfillment-v1.yaml`,下单与审核基础 API 继续维护在 `overseas-business-v1.yaml`。
实物明细由 `ll_procurement_receipt`、`ll_procurement_disposition`、`ll_procurement_manifest`、`ll_procurement_carton` 和 `ll_procurement_carton_source` 保存;更正只停用原实收/处置并追加新记录,历史清单及来源不删除。`ll_procurement_shipment` 以订单及运输段建立唯一约束,`ll_procurement_shipment_item` 保存当次逐箱件数、货物来源、测量、面单和运单快照。
面单版本由 `ll_procurement_label_set` 和 `ll_procurement_label_item` 保存,预估核对通过 `ll_procurement_estimate_review` 显式关联面单版本与有效预估费用。制单不修改资金,贴单不产生发运。每次交寄在订单行锁内复验当前确认清单、全部可寄原箱、实收来源和包装摘要;新面单不继承旧贴单。国内 `ll_procurement_repack` 仅允许原箱的一对一包装新版本,件数仍取原箱有效国内实收;即使新箱尺寸相同,换包装记录也使旧国内面单失效,并清除整单核费确认标记,保留已发生扣款供重新核对。
国际寄件姓名、电话及地址通过 Warehouse 的既有公共海外收货仓和有效仓详情接口读取,须有唯一作业地址及完整联系人,不由浏览器覆盖。两段交寄各自冻结收寄快照;国内寄件资料承接原国际段国内收件资料,最终客户地址变更须关联本单客户确认凭证。面单文件按本单 LABEL 分类校验,图片仅对应第 1 页,PDF 明确逐箱页码。
运输动作权限独立采用 `estimate`、`apply-label`、`ship-overseas` 和 `ship-customer`;`label` 只维护面单,不能同时获得冻结或交寄权限。上述权限均在既有采购权限前缀下,沿用现有平台角色,不引入新岗位类型。
Finance 账户操作统一按“客户账户行 → 原冻结/原扣款行”顺序加锁。结算实际金额保留原冻结金额,实际扣款取关联的 CONSUMPTION 流水;退款用独立 REFUND 流水引用原扣款,不能篡改原结算状态或使用充值类型。退款回补复用现行现金/授信归还计算,不恢复过期授信。
### 10.2 资金指令和来源合同
- `FREEZE` 预留金额;`SETTLE` 结清明确实际费用的全额冻结;`RELEASE` 释放有效冻结。
- `SETTLE_ACTUAL` 在原冻结业务身份上携带最终正额 CNY 金额,在 Finance 单事务中补差或释放余款。结果 amount 表示实际扣款,不能回传原预估。零实际费用使用 RELEASE。
- 正额货款、关税、国内运费和其他费用,由采购按费用用途在 FREEZE 成功后自动发送 SETTLE;预估国际运费绝不走该自动分支。
- 资金成功回执必须能定位原请求、客户、费用版本及实际流水;费用入池引用这笔已成功的资金事实,Finance 同客户校验实际金额后标为已结算。不得仅凭展示单号或预估金额认领资金。
- 退款业务命令需包含原成功扣款引用、独立退款编号、金额、原因和授权证据。相同退款编号换请求键不得再次回补,累计退款按原扣款串行核验。
- 已确认费用的资金请求状态与费用来源状态分开。节点准入同时检查资金终态和来源关联,不以 Outbox 已发送或 HTTP 已确认作为全部完成。
国内核费以整单节点命令确认:实际国际运费、关税、国内运费分别选择新核定值或本单已有有效费用版本;其他费用明确为不适用或逐项核定。不适用不创建虚构收费行,重新核对引用原版本不重新扣款,也不能通过省略有效费用隐藏原收费。确认时间与实际资金完成状态分别保存,寄客户仍逐笔校验资金及来源关联。
费用链更正使用 `ll_procurement_fee_correction` 保存正确原币总额、原汇率及月份、目标 CNY、确认前净实扣和差额,`ll_procurement_fee_correction_item` 关联本次产生的每笔追加或退款。输入必须是原实际费用链根;同链存在未决或尚可重试的旧调整时拒绝新目标。正差额建立独立 CNY 费用,差额费用自身汇率为 1,目标原币及原汇率完整保留在更正快照,避免由人民币分差反推原币造成误差;负差额按本链成功消费的可退余额逐笔关联,不把多次扣款合成一笔虚构原扣。退款仍由 Finance 原子校验累计上限。
未实扣费用的替代核定使用独立 `fees/{feeId}/replace-failed` 命令,要求财务调整权限。仅最新实际费用版本已明确失败、终止重试且有效冻结已释放时可替代;未决、已实扣或已有后续版本均拒绝。新费用沿用原币、业务日及汇率快照,以新的资金业务标识扣款,并由更正记录关联前后版本;原购买事实不覆盖,替代货款仍核验客户预算。普通核费不能绕过该入口重建历史费用,财务替代版本的失败重试也使用财务调整权限。
普通核费权限不能追加或退款。明确失败后的重试按原费用用途分别检查购买、预估、核费或财务调整权限;终止失败版本、目标更正及退款统一要求财务调整权限。所有命令明确携带订单版本及幂等键;缺失版本拒绝,原请求重放不能改变金额。履约已寄客户或异常关闭后,有据财务更正保留原终态,不改写历史发运。
### 10.3 服务和接口组织
Lastleg 在现有 `procurement/` 内按购买、实收装箱、运输、费用、文件及异常划分职责;统一订单查询组装详情和动作资格,不新建服务或通用流程引擎。Finance 只处理本服务账务与来源关联;采购不能直接写 Finance 数据表。
采购列表只返回订单基础信息、采购数量和履约状态,不返回旧 `inboundQuantity/outboundQuantity/inventoryQuantity` 库存式统计。删除旧 `outboundDetails` 及订单级两段承运商/运单字段;实际承运商、运单、交寄数量与时间从逐箱面单和不可变交寄记录查询,不由旧 JSON 或静态订单字段推导。初始化结构与模型同步移除这些废弃字段,实际环境结构清理由发布范围单独核对。
沿用现有平台和客户采购 API 根路径。新增操作使用明确节点命令,包含确认购买、登记/完成实收、保存/确认清单、面单维护、预估确认、贴单、两段交寄、核费、预算授权、更正及关闭。通用 PATCH 移除能绕过这些命令修改数量、运单、状态和资金的字段;不保留旧编辑行为回退。
平台详情返回服务端计算的 `actions` 与动作阻断原因,以及采购事实、箱明细、费用版本和历史。客户端使用单独的详情 DTO,仅返回第 3.5 节允许的字段,不透传平台附件、内部备注或原始资金错误。内部 ID 只用于程序关联,用户界面以采购单号、箱号、运单及费用业务编号展示。
Admin 采购保留当前独立列表/详情/编辑路由,具体操作承载按适用原型核对;Client 将采购专有详情和下单逻辑从三类业务共用组件中分离,本土卡车和散板不接受采购新增状态或字段。权限按第 5.1 节逐动作同步 Controller、IAM 种子、API 合同与前端。
异常控制保存在 `ll_procurement_control_note`:更正说明关联本单购买、实际仓、实收或交寄对象及 EXCEPTION 凭证,阻断与解除分别记录,不覆盖原说明。实际仓在已有箱明细前可受控更正当前有效仓,并保留原仓快照及原实收;已有后续实物或已结束时只追加说明和阻断,不能将货物重新归属。真实到货仍可记录,正式装箱、预估、核费和交寄校验未处理阻断。
异常关闭由 `ll_procurement_closure` 与 `ll_procurement_closure_item` 留存客户停止履约凭证、财务结论、对客摘要和每份剩余货物的去向。服务端按购买未达、原国际箱在途未达、有效实收合格/破损/多货计算待处理来源,扣除既有有效差异处置;已国际交寄的海外合格实收不再重复计为剩余货物。提交须逐来源足额覆盖且有证据,全部资金及来源关联处理结束后才能关闭。关闭不改变原购买、收货、交寄或资金事实,不新建退款、退货物流或零数量发运。
平台既有采购详情 GET 返回 `ProcurementQueryService.PlatformView`,聚合客户视图、内部购买事实、实收装箱、运输、费用/更正、异常、文件、操作记录及动作资格,页面无需逐块发起详情请求。交寄按钮的阻断原因复用实际交寄的状态校验;所有写入仍在订单锁内重新校验,详情上的可执行状态不能替代提交门禁。客户既有详情及创建响应使用独立 `CustomerView`,不再从平台详情动态删字段:只输出已确认箱明细、两段实际运单、预算/费用结果和专门填写的对客摘要,不返回内部附件、原始异常说明、审计内容和资金引用/诊断。
平台运输快照分别返回 `overseasCargo` 和 `domesticCargo`:前者为海外清单及原实收分配,后者按国内有效合格实收计算件数并使用最新一对一换包装的箱规、重量和包装记录引用。面单与交寄页面使用该权威结果;不能从海外旧箱规或采购总数推定国内可寄货物。客户 DTO 仍使用独立允许字段,不透传内部来源引用。
### 10.4 开发与验收顺序
1. Finance 原子实际结算、原扣款退款、费用来源资金关联及其事务测试。
2. 采购数据结构和命令合同,下单、审核、预算授权、购买与货款闭环。
3. 海外分次实收、差异、装箱版本、面单和预估冻结、贴单与整批交寄。
4. 国内分次实收、换包装、费用核定、实际结算和寄客户。
5. 受控更正、追加、退款、取消和异常关闭;客户端全节点和费用展示。
6. 全链路定向回归、API/权限/Mapper/SQL 合同检查,匹配版本部署后执行真实 HTTP 和两端页面验收。
各节点同时交付服务端行为、Admin 操作、Client 展示及直接受影响测试,不以“接口存在”代替完整操作。资金基础测试应覆盖账户、冻结、流水、审计及幂等记录同事务回滚,以及不同请求并发处理同一冻结/原扣款。
页面验收使用 1920×1080、100% 缩放。列表和详情按实际 Network 记录请求数:检查重复加载、逐行附加请求、重复提交、无限重试和资金处理中无界轮询;以具体页面操作和请求证据判断,不臆定所有页面统一的请求上限。本轮用户已明确授权内置浏览器登录并自动检查样式与交互,适用于本次采购流程验收。
### 10.5 客户端页面实施核对矩阵
本次页面依据为本需求第 3、5、10.3 节和现有正式路由。客户端栏目原型 `docs/悦/柏悦物流客户端/柏悦物流客户端-栏目架构图.html:977` 只定义“海外采购”业务入口,未定义新履约字段布局;不能据此宣称已有完整页面原型。按本轮“首版简单、后续可扩展”的开发授权,保留已确认独立页面承载及现有工作台视觉,扩展本次业务分区,不新增客户审批或内部文件入口。
| 页面 | 操作 | 原型/当前确认依据 | 当前实现与承载 | 本次结论 |
|---|---|---|---|---|
| 采购列表 | 查询、分页、进入详情 | 栏目原型行 977;`cross-border/routes.ts` 的采购列表及详情路由 | 共用 `BusinessOrdersView.vue` 的 QueryToolbar、DataTable,操作列在左 | 保留表格和查询布局;使用采购履约状态,去除采购库存含义的旧展示;详情通过正式路由打开 |
| 采购新建 | 新增、提交、取消 | 需求第 3.2、3.5、10.3 节;`cross-border/routes.ts` 的 `cross-border/procurement/create` | 已有独立新建路由,旧共用列表又能切换内部新建模式 | 统一由既有独立新建路由承载;明确单商品、预算和最终收件资料,白底分组表单,桌面短字段三列;取消返回列表 |
| 采购详情 | 查看、刷新、返回 | 需求第 3.5、5.2、10.3 节;既有 `cross-border/procurement/:orderNo/detail` | 独立页面、返回列表、状态及四列描述网格 | 沿用独立页面及四列资料区;增加节点时间、已确认箱清单、两段实际运单、费用及对客异常摘要;每次加载一个聚合详情请求,不自动轮询 |
| 采购详情 | 编辑、审核、核费确认、取消订单、文件预览/下载 | 需求第 3.4、3.5、5.1 节 | 客户本次无对应平台操作权限 | 不新增;客户通过客服提出变更或取消,不开放内部面单、采购/费用/沟通凭证 |
新页面按 1920×1080、100% 缩放核对。该矩阵是实施依据,不代表已经完成运行环境视觉或交互验收。
### 10.6 平台页面实施核对矩阵
按本轮用户“先修正偏移项”的要求,采购详情首屏只展示当前有权限且可执行的常规履约操作;预算/仓库更正、财务调整、取消及异常处理收纳在“更正、财务及异常处理”分组,费用更正草稿也在该组。其他不可执行的常规节点以可展开的节点及原因列表保留,不铺满首屏禁用按钮。原请求未决提示与原请求恢复入口仍直接显示,不因折叠分组隐藏;服务端资格、权限及业务门禁不变。
平台原型定向入口为 `docs/悦/货代SAAS平台后台/prototype-src/modules/07-overseas-business.html`,其中采购列表及独立编辑页承载保留;旧原型中的数量、运单和费用通用编辑方式按本需求第 3、4、5、10.3 节收敛。新增节点采用现有详情页内分区及独立操作弹框,沿用 Admin 高密度公共样式,不将原型旧字段当作新节点操作的授权。
| 页面 | 操作 | 承载与变更边界 |
|---|---|---|
| 采购列表 | 查询、分页、查看、编辑 | 保留列表及独立路由;操作列在左,使用实际履约状态;不将采购台账展示为 WMS 可用库存 |
| 采购独立编辑 | 维护内部备注、保存、取消 | 保留独立编辑页、三列只读订单摘要及备注区;只提交订单版本和内部备注,保留未保存保护及版本冲突提示;不在此修改购买对象、仓库、数量、箱单或运单 |
| 采购详情 | 查看、刷新、返回 | 单次聚合详情请求,分区显示订单、履约、费用、文件及内部历史;不自动无界轮询 |
| 采购详情 | 审核、购买、预算授权、取消 | 各自独立操作弹框;审核通过必须选择有效海外收货仓,真实购买和资金确认分开呈现 |
| 采购详情 | 分次收货、差异处置、完成收货、装箱、换包装 | 节点弹框配结构化明细表,显示原实收或原箱来源;不使用自由 JSON 输入,不将保存等同节点完成 |
| 采购详情 | 面单、预估核对、贴单、两段交寄 | 面单逐箱关联;预估冻结、贴单、实际交寄独立提交,展示服务端阻断原因;文件使用受控上传和下载 |
| 采购详情 | 国内核费、重试、费用更正、退款 | 普通核费和财务调整分别控制权限,逐项展示核定值、冻结、实扣及来源关联;待处理资金不能显示已结清 |
| 采购详情 | 更正说明、解除阻断、异常关闭 | 保留原事实,以来源、凭证和去向形成结构化记录;关闭前明确实物与资金处理结果 |
以上为页面实施边界,不表示各操作已经开发、部署或通过浏览器验收;运行验收仍按第 10.4 节逐项核对。