Files
docs/头程到尾程分阶段流程/阶段三-国内货柜履约与出仓.md
T
2026-09-24 13:43:53 +08:00

24 KiB
Raw Blame History

阶段三:国内货柜履约与出仓

对应全景流程:F14~F23。
阶段起点:入库单主状态为 WAIT_SPLIT,不存在有效 HOLD。
阶段终点:装柜后完成送港线的仓库离开/进港事实,报关线保留客户确认、正式申报和海关结果;实际开船 VESSEL_DEPARTED 由阶段四承接。
本阶段复用订单、入库单、柜次和装柜计划,不新建独立“出仓单”。LOADED 后报关线和送港线并行;费用确认是并行事实,装柜完成后对已装范围的当前有效费用版本执行系统默认确认。

1. 阶段目标和边界

本阶段把可分柜货物转化为可追溯的真实整柜离仓事实,覆盖:

  1. 模拟柜、智能推荐、人工分配和同柜不可拆组;
  2. 海运订舱草稿、资料补齐和放舱;
  3. 订舱级国内拖车预约;
  4. 模拟柜与订舱柜型需求、真实集装箱号关联;
  5. 预装确认、动态增减和普通散货托盘标签;
  6. 国内 PDA 拣货、整托装柜和异常闭环;
  7. 空仓、半仓、满仓、锁仓、带锁码照五类装柜证据与锁码文本;
  8. 装柜完成、部分装载分片和跨区交接快照;
  9. LOADED 后通知报关行、客户资料收集、回执确认、整柜正式申报和海关结果;
  10. 送港、进港、甩柜/改配、实际离仓和拖车费用归集。

LOADED 表示货物已经完成实际装柜。此时同时触发报关线和送港线:报关线收集客户资料、发送报关行、处理回执和客户确认;送港线安排拖车、离仓和进港。两条线谁先到都保留各自事实,客户未确认不阻断送港,已进港不代表报关完成。容量不足时记录甩柜和改配船次;只有实际开船后才进入海运节点。国内 Admin/PDA 不得把订单推进到海外派送完成 DELIVERED。

2. 角色、终端和对象

角色 终端 主要操作
排柜操作员 Admin 创建模拟柜、搜索候选、推荐/人工加入、调整预装
订舱操作员 Admin 建订舱草稿、维护运输资料、上传文件、放舱
国内调度 Admin 建订舱级拖车预约、选择供应商、维护时间和附件
仓库主管 Admin 预装确认、真实柜号补录、任务和证据监督
PDA 拣货员 国内 PDA 领取唯一柜次任务、扫码、异常、拍照、完成装柜
报关操作员 Admin 汇总整柜资料、开始报关、上传完成文件、完成报关
企业操作员 Client 上传本客户退税/报关资料、查看本企业进度和回执
出仓操作员 Admin 查看组合门禁,必要时人工确认离仓

核心对象:

对象 业务作用 稳定标识
入库单 每票/分片货物履约主体 inboundId、入仓码
模拟柜/柜次 多票货物共享的装载容器 containerBookingId、cabinetNo
装柜计划 柜次唯一预装/PDA 作业聚合 loadingPlanId
海运订舱 船司运输和柜型需求聚合 oceanBookingId、OB-yyMMdd-####
拖车预约 一个已放舱订舱的国内提柜/送柜任务 truckAppointmentId
PDA 任务 单柜次单作业员的现场任务 taskId、任务版本
整柜报关 柜次级资料冻结和回执 柜次及报关记录标识

3. 前置检查

  • 候选入库单已完成阶段二,实际箱数、重量和体积可用;
  • 一件代发已按实际托盘封托;
  • 当前入库单无有效 HOLD;
  • 柜型规格、国内中转仓、有效渠道和供应商主档可用;
  • 操作员理解模拟柜、真实柜号、订舱和拖车是不同对象;
  • 同柜不可拆组、已占用数量和版本冲突均以服务端返回为准;
  • 费用仍可并行维护,客户未确认不阻断排柜、预装、PDA 或装柜;装柜完成后对已装范围的当前有效已发布版本记录系统默认确认。客户确认和系统默认确认来源分开审计;缺少有效费用版本不伪造确认,部分装载不得把余量一起确认。

4. F14 模拟柜与智能排柜

4.1 创建模拟柜

入口:Admin → 国内货柜/智能装柜。

  1. 选择正式装柜仓;
  2. 选择九类计划渠道组之一;
  3. 选择平台有效柜型,核对额定容量和限重;
  4. 填写计划日期和必要备注;
  5. 提交后系统原子创建稳定柜次、cabinetNo 和唯一装柜计划;
  6. 此时可以没有真实集装箱号,也不会因创建模拟柜自动产生订舱。

容量和重量当前允许达到柜型额定值的 150%,超过时服务端拒绝。页面显示仅用于预判,最终以服务端重新计算为准。

4.2 查询候选

工作台可查询 PENDING_REVIEW、WAIT_MEASURE、WAIT_SPLIT、LOADING 等未完成候选。状态是展示维度,能否加入必须看响应中的 canAssign 和原因。

  • 待审核或待测量订单可提前占位;
  • 预装确认和启动 PDA 前,实际作业成员必须进入 WAIT_SPLIT;
  • 普通订单按剩余箱数分配;
  • 一件代发按每个未占用的已封托托盘独立返回和分配,禁止拆托;
  • 同柜不可拆组必须成员完整、满箱并原子加入;
  • 推荐顺序以入库时间先进先出为基础。

4.3 智能推荐和人工加入

智能推荐:设置筛选范围和装载目标,系统逐项校验渠道、仓库、剩余箱数、体积、重量、托盘完整性、组锁和占用,再返回推荐结果。

人工加入:选择候选,填写普通货分配箱数或选择一件代发整托,携带计划版本提交。系统重新校验资格;页面旧结果不能作为写入依据。

一件代发一票多托时逐托展示,其中一托已分配不得隐藏其他未分配托盘。容量不足时跳过整托,不能回退成按箱拆托。

4.4 调整与费用影响

  • 未产生物理拣货的普通明细可增减或移除;
  • 已拣数量是可调整下限;
  • 同柜组只有全组都未拣时才能整组移除;
  • 单行一件代发只能按该行 palletId 整托移除;
  • 成员变化需要重算未冻结的柜级/客户级费用;
  • 已确认、已发送或客户已确认的费用版本不得直接改写,应按费用规则生成新版本或拒绝。

5. F15 海运订舱与放舱

5.1 创建草稿

入口:Admin → 海运订舱。

  1. 选择启用的国内中转仓;
  2. 选择该仓当前有效渠道;
  3. 选择 ACTIVE/BOOKING 订舱供应商;
  4. 填写三类参与方和已知运输资料;
  5. 至少维护一项、最多二十项柜型需求,数量为正整数;
  6. 保存为 DRAFT,系统生成 OB-yyMMdd-#### 订舱号。

草稿允许资料不完整、替换文件和继续编辑。柜型需求只表达需要多少个什么柜型,不创建真实货柜行。

5.2 补齐并放舱

放舱前核对:

  • 提单号全局唯一;
  • 船名、航次、起运港、目的港、ETD、ETA 和运输条款完整;
  • 渠道仍有效;
  • 柜型需求与平台规格一致;
  • 存在有效 BOOKING_CONFIRMATION 或 BILL_OF_LADING 文件;
  • 订舱供应商仍为有效主档。

点击放舱后状态从 DRAFT 进入 RELEASED,运输快照永久只读。放舱不要求真实柜号,不得为了通过校验伪造柜号。

6. F16 订舱级国内拖车

入口:Admin → 国内拖车预约。

  1. 从服务端候选中选择已 RELEASED、有提单号和有效订舱文件的订舱;
  2. 选择 ACTIVE/TRUCKING/DOMESTIC 供应商;
  3. 填写计划装柜时间、联系人和附件;
  4. 保存/提交预约;
  5. 重复创建时返回现有非终态预约,不生成第二张。

拖车单只绑定订舱,不绑定客户、柜次、装柜计划或真实柜号。一个订舱最多一张非终态预约,已有有效完成单不能再次创建收费。

PDA 装柜完成不推进拖车状态。只有订舱要求的全部柜型数量均已关联,并且所有柜均确认国内离仓后,拖车才自动完成。正金额应付拖车费按各柜最终实装体积守恒分摊并发送 Finance;缺供应商归属、有效体积或费用配置时失败关闭,不做伪造均分。

7. F17 柜次关联和真实柜号

入口:Admin → 柜次详情 → 关联订舱/补录柜号。

  1. 选择已放舱订舱的未满配柜型需求;
  2. 选择对应模拟柜;
  3. 校验仓库、渠道映射、柜型、容量、限重和需求剩余数量;
  4. 录入真实集装箱号;
  5. 提交后在原柜次上冻结订舱、需求和柜号快照。

关联不会更换 containerBookingId、cabinetNo、装柜计划或明细。真实集装箱号在同一订舱内唯一,不同提单可按业务规则复用。

订舱关联、预装确认和任务创建技术上可先于柜号,但正式操作应在 PDA 最终完成前补齐。已有柜号纠正仅限计划 EDITING、任务未领取且没有物理作业事实。

8. F18 预装确认、动态增减与标签

8.1 预装核对与确认

入口:Admin → 预装清单。

  1. 打开柜次唯一预装计划;
  2. 核对每个入仓码、客户、目的仓、普通箱数或一件代发托盘;
  3. 查看容量、重量、已占用和异常提示;
  4. 确认所有现场成员已到 WAIT_SPLIT 且未 HOLD;
  5. 点击计划级确认,生成或开放唯一 PDA 任务;
  6. 记录确认快照、操作人和版本。

预装进入 CONFIRMING/CONFIRMED 只冻结确认快照,不锁死尚未完成柜次。计划仍为 EDITING/LOADING 时可继续增加合法明细;未拣明细可调整,已拣明细保持锁定。

新增或调整后计划和任务版本递增,PDA 旧版本必须刷新再作业。

8.2 普通散货托盘标签

普通、非一件代发 FBA 明细在计划 LOADING/COMPLETED 且真实柜号有效时生成正式托盘标签:

  1. 系统按平台柜次号、FBA 地址内部编号和三位序号生成冻结托盘码;新柜次号为全局连续且不按日期重置的 D0001、D0002,托盘码不依赖可跨提单复用的真实柜号;
  2. 地址内部编号从 Warehouse 启用主数据读取;
  3. 缺编号或同柜重复时拒绝生成;
  4. 重复生成必须与已有明细一致;
  5. Admin 全部打印或按仓指定张数打印;
  6. A4 横版每托一页,标签与海外补打复用同一编号。

该标签与阶段二一件代发 DP 托盘不同:一件代发托盘在测量后已实际清点封托,装柜时按冻结整托分配。

9. F19 国内 PDA 拣货装柜

9.1 领取和开始

入口:国内 PDA → 拣货装柜。

  1. 操作员选择当前作业仓;
  2. 打开或扫描柜次任务;
  3. 核对真实柜号、装柜计划和任务版本;
  4. 领取任务后绑定当前作业员、任务和柜次;
  5. 单柜次只允许一名作业员,不支持多人并行或无审计接管;
  6. 进入任务后计划/入库履约按规则进入 LOADING。

正式作业当前只支持在线。设备本地草稿按作业员、任务和柜次隔离;批量提交是否具备完整原子事务仍需在优化/验收中持续核实。

9.2 普通散货扫码

  • 扫描稳定箱码,一箱一码;
  • 不能用 SKU、件数、入仓码或自由文本代替箱码;
  • 系统核对箱码属于当前入库单、当前任务且尚未处理;
  • 连续扫描先进入当前任务草稿,操作员核对后批量提交;
  • 重复扫描不重复增加实装数量。

9.3 一件代发整托装柜

  • 扫描 DP 托盘码,或扫描成员箱码定位所属已封托托盘;
  • 页面展示托盘、入仓码、箱数和 SKU 汇总;
  • 使用 PICK_PALLET 一次提交整托;
  • 禁止部分拣货、拆托或将同托不同订单成员分开提交;
  • 装柜完成按 palletId 精确冻结每托箱唛和 SKU,不能按整票模糊复制。

9.4 部分拣货、跳拣和异常

允许分批扫描和暂时跳过,但每个未完成项必须选择/填写异常原因。存在未解决异常、缺少处理单元、数量不平或版本冲突时不能完成任务。

提交超时后先查询任务明细和操作结果,禁止更换幂等键盲目重复提交。版本冲突时刷新任务,保留未提交草稿并重新核对。

10. F20 装柜证据与铅封

PDA 按现场要求采集五类证据:

  1. EMPTY:空仓照片;
  2. HALF:半仓照片;
  3. FULL:满仓照片;
  4. LOCKED:锁仓照片;
  5. SEAL:带有效铅封号的带锁码照片。

每类至少一张有效照片,同类允许追加。PDA 仅允许现场相机拍摄;有权限的 Admin 操作员/理货员可人工补充,普通拣货员不开放后台上传。

证据先上传 File 获得合法文件引用,再绑定柜次/任务。错误图片只能作废,不能硬删除;需保留上传、作废、操作者、时间、文件哈希和幂等记录。照片及铅封号当前不对客户展示。

11. F21 装柜完成与分片

PDA 点击“完成装柜”时,服务端重新校验:

  • 任务属于当前柜次和仓库且版本一致;
  • 真实集装箱号存在;
  • 所有普通箱码或一件代发整托均核平;
  • 没有未解决异常;
  • 空仓、半仓、满仓、锁仓、带锁码照五类证据和锁码文本完整;
  • 计划明细、已拣数量和最终实装数量守恒。

校验通过后:

  1. PDA 任务和装柜计划进入 COMPLETED;
  2. 实装来源入库单进入 LOADED;
  3. 生成最终实装箱码、托盘、SKU 和证据快照;
  4. 对部分装载执行一次分片;
  5. 生成跨区 Outbox,但后续消费必须保持幂等。

部分装载时,已装数量形成当前柜次的 LOADED 子入库单,余量形成可继续 WAIT_SPLIT 的后续子单;只允许一层分片,所有子项总和必须等于来源数量。客户订单身份和入仓码关联不能丢失。

12. F22 客户资料与整柜出口报关

12.1 F22-A LOADED 后通知报关并建立客户案例

入口:LOADED 事件 → Admin/Client → 报关资料。

  1. 装柜完成后按最终实装清单通知报关行,建立本柜报关批次和每个客户/入仓码的 customerCustomsCase;
  2. 客户上传本企业资料,平台校验客户、订单、入仓码、实际装载数量和文件归属;
  3. 平台将资料发送给报关行,记录发送时间、资料版本和 roundNo;
  4. 报关行返回本轮回执,平台保存文件和回执字段,并向对应客户展示确认任务。

柜前可以存在资料准备或历史附件,但不创建本柜正式客户确认轮次,也不能显示“已通知报关”。客户资料缺失只形成报关线补件待办,不阻断送港线。

12.2 F22-B 报关行回执与客户确认循环

客户查看报关行回执后有两个结果:

  1. 确认:当前客户案例进入 CUSTOMER_CONFIRMED,保存确认人、确认时间、回执版本和幂等键;
  2. 打回:当前案例进入 NEEDS_RESUBMIT,保存打回原因;客户重新上传/替换资料,平台重新发送报关行,报关行生成新回执,roundNo 加一后再次发客户确认。

客户打回只重开对应客户案例,不重置其他客户已经确认的轮次。直到柜内所有客户案例都为 CUSTOMER_CONFIRMED,才允许进入整柜正式提交。

12.3 F22-C 所有客户通过后的整柜正式申报

  1. 平台检查所有客户案例均已确认,冻结本柜最终实装和资料版本,生成整柜正式申报批次;
  2. 将整柜资料提交报关行确认,报关行完成正式申报;首版不做外部系统直连,保留人工提交和审计记录;
  3. 海关结果独立记录为查验、免查验放行、补件/退回、扣货等,不把客户确认回执直接当成海关放行;
  4. 报关线的任一结果都不覆盖送港线的离仓、进港、甩柜事实。送港线可以先到港,报关线也可以先完成客户确认或正式申报。

13. F23 送港、进港与甩柜

13.1 出仓硬门禁

送港线的离仓/进港门禁逐项检查:

  • 无有效 HOLD;
  • 入库单为 LOADED;
  • 装柜计划为 COMPLETED;
  • PDA 柜次任务为 COMPLETED;
  • 订舱已 RELEASED 且分配当前柜次;
  • 五类证据与有效锁码文本完整;
  • 送港任务和当前船次分配完整;
  • 报关客户确认或海关结果不作为仓库离开、送港和进港的前置。

订舱、拖车、仓库离开和港口进场属于送港线事实。报关线可以先完成客户确认或正式申报,也可以晚于进港;两条线各自展示阻断项。容量不足时记录 ROLLED_OVER,保存原船次、滚动次数、新船次、预计开船时间和客户通知。

13.2 自动与人工确认离仓

送港状态变化或其他送港门禁满足时系统自动尝试收敛。未自动完成时,平台在柜次/送港页面:

  1. 打开门禁清单;
  2. 逐项处理未通过原因;
  3. 全部通过后点击确认离仓;
  4. 携带当前版本和幂等键提交;
  5. 查看唯一离仓历史和第一条实际节点。

成功后系统:

  • 写入整柜唯一国内离仓事实;
  • 写入实际 DEPARTED_WAREHOUSE 节点;
  • 写入 PORT_RECEIVED 或 ROLLED_OVER;
  • 维护船次和开船前等待,不把预计 ETD 记成海运在途;
  • 检查并尝试完成订舱级拖车;
  • 保持跨区交接事件可重试且不重复建单。

实际离仓和进港节点产生后禁止撤销。发现错误转入线下和后续阶段异常处理,不提供修改历史伪装未离仓或未进港的能力。报关线的客户打回、重新发送和海关查验单独记录,不回滚送港事实。

14. 状态和动作总表

对象 关键状态 推进动作
入库单 WAIT_SPLIT → LOADING → LOADED 分配/开始 PDA/完成装柜
装柜计划 EDITING → LOADING → COMPLETED 预装调整/PDA 作业/最终完成
订舱 DRAFT → RELEASED 补齐资料并放舱
拖车 非终态 → COMPLETED 所有要求柜次实际离仓后自动完成
报关 WAITING_DOCUMENTS → SENT_TO_BROKER → RECEIPT_PENDING_CUSTOMER_CONFIRM → CUSTOMER_CONFIRMED / NEEDS_RESUBMIT → ALL_CUSTOMERS_CONFIRMED → FORMAL_SUBMITTED → INSPECTION/RELEASED 装柜后通知报关行;回执必须经对应客户确认,打回则新资料/新回执轮次
送港 PORT_DELIVERY_PENDING → DEPARTED_WAREHOUSE → IN_TRANSIT_TO_PORT → PORT_RECEIVED / ROLLED_OVER 独立安排拖车和进港;容量不足记录甩柜和改配,不等待报关客户确认
海运 WAITING_SAILING → VESSEL_DEPARTED → IN_TRANSIT 只有承运船舶真实开航才进入海运节点

主状态只表达阶段结果。订舱、拖车、PDA、证据和报关保持关联子状态,页面应汇聚展示,但不能互相覆盖。

15. 异常与恢复

场景 处理方式
候选显示可用但提交失败 以服务端最新占用/版本为准,刷新后重排
待测量订单已占位 可保留计划占位,确认预装前必须到 WAIT_SPLIT
一件代发整托容量不足 跳过整托或换柜,禁止拆托
订舱资料不全 保持 DRAFT,补齐后再放舱
放舱后资料错误 不原地篡改冻结快照,按业务异常处置
真实柜号暂缺 可先关联/确认,但最终装柜前必须补齐
PDA 旧版本 刷新计划,不以旧版本覆盖新增明细
扫描错箱/重复箱 拒绝或提示已处理,核对稳定箱码
未完成项有异常 记录原因并解决,禁止完成任务
照片错误 作废并重拍,不硬删除证据
部分装载 一次分片,已装与余量数量守恒
报关资料缺失 定位对应客户/入仓码补件,办理批次不伪造完成
出仓门禁未齐 展示具体阻断项,条件变化后受控重试
离仓请求超时 查询唯一离仓历史/节点后再处理,不重复写事实

16. 数据流和阶段完成判定

WAIT_SPLIT 入库单/已封托托盘
  → 模拟柜与唯一装柜计划
  → 已放舱订舱 + 真实柜号 + 订舱级拖车
  → 预装确认/动态调整
  → PDA 实装 + 五类证据
  → COMPLETED / LOADED + 数量分片 + 跨区快照
      ├─ 报关线:通知报关 → 客户资料 → 报关行回执 → 客户确认/打回重做
      │             → 所有客户通过 → 整柜正式申报 → 查验/放行
      └─ 送港线:拖车 → DEPARTED_WAREHOUSE → PORT_RECEIVED
                    → 甩柜/改配(如发生)→ 等待实际开船
  → VESSEL_DEPARTED → 海运节点查询

阶段完成必须同时满足:

  • 最终柜次、装柜计划、订舱、真实柜号关联可追溯
  • 全部实装箱/托盘/SKU 与入库单数量守恒
  • PDA 任务完成且无未解决异常
  • 五类证据和锁码文本完整有效
  • 装柜计划 COMPLETED,实装入库单 LOADED
  • 部分装载时已装子单和余量子单正确
  • 报关线已为每个客户建立案例,回执、确认/打回和每轮资料版本可追溯
  • 送港线已记录唯一国内离仓历史;如已进港,存在 PORT_RECEIVED,如甩柜,存在原船次/改配船次历史
  • 客户全部确认后才允许整柜正式提交;正式申报后的查验/放行结果单独记录
  • 船舶实际开航后才写入 VESSEL_DEPARTED 并启动海运节点查询
  • 跨区事件可幂等重试;送港线和报关线任一先完成都不覆盖另一条线

17. 易用性与数据流评审问题

  1. 排柜工作台是否充分解释“可提前占位”和“可实际作业”的差别?
  2. 推荐结果是否应逐项展示未入选原因、容量影响和费用影响?
  3. 模拟柜、柜次编号、真实柜号、订舱号和提单号是否在页面上容易混淆?
  4. 订舱、拖车、预装、PDA、报关是否需要一个柜次级总控清单,而不是跨页面查找?
  5. 预装确认后仍可动态增减时,如何提示 PDA 版本已过期并保护未提交草稿?
  6. PDA 批量提交需要补齐怎样的原子性、离线/弱网和失败整批回滚验收?
  7. 五类证据是否要提供拍摄引导轮廓、清晰度检查和缺图计数?
  8. 部分装载分片在 Client 应如何展示,避免客户误以为整票已经全部装柜?
  9. 报关资料清单、补件责任人、截止时间和回执匹配是否需要结构化待办?
  10. 出仓门禁失败是否需要直接跳转到对应处理页面?
  11. 拖车不作为出仓硬门禁的现行口径,是否与现场调度责任一致?
  12. 实际离仓不可撤销后,错误柜号或错误时间的合规更正流程由谁负责?

18. 阶段四交接包

交给阶段四的权威数据包括:

  • 柜次、真实集装箱号、订舱号、提单号、船名和航次;
  • 起运港、目的港、ETD/ETA 和运输条款快照;
  • 最终实装订单、入仓单、箱码、托盘、SKU、重量和体积;
  • 装柜五类证据引用和报关完成事实;
  • 国内离仓时间和 DEPARTED_WAREHOUSE 实际节点;
  • 跨区事件版本、事件 ID 和有效载荷哈希;
  • CarrierScheduleQuery 及后续船节点查询上下文;
  • 未冻结费用和拖车应付等并行财务结果。

19. 事实来源

  • docs/国内货柜履约/README.md
  • docs/国内货柜履约/国内货柜履约页面与原型清单.md
  • docs/头程下单到尾程出库现状流程全景清单.md
  • docs/统一订单主状态与操作契约.md
  • apps/admin-web/src/modules/container-loading/
  • apps/admin-web/src/modules/loading-lists/
  • apps/pda-uniapp/AGENTS.md
  • apps/pda-uniapp/pages/picking/picking.vue
  • baiyue-firstleg/firstleg/AGENTS.md
  • baiyue-firstleg/firstleg/src/main/resources/openapi/loading-lists-v1.yaml
  • baiyue-firstleg/firstleg/src/main/resources/openapi/ocean-bookings-v1.yaml
  • baiyue-firstleg/firstleg/src/main/resources/openapi/truck-appointments-v1.yaml
  • baiyue-firstleg/firstleg/src/main/resources/openapi/customs-v1.yaml
  • baiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/service/SmartLoadingService.java
  • baiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingPickService.java
  • baiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/outbound/dispatch/service/OutboundDispatchService.java