24 KiB
阶段三:国内货柜履约与出仓
对应全景流程:F14~F23。
阶段起点:入库单主状态为WAIT_SPLIT,不存在有效 HOLD。
阶段终点:装柜后完成送港线的仓库离开/进港事实,报关线保留客户确认、正式申报和海关结果;实际开船VESSEL_DEPARTED由阶段四承接。
本阶段复用订单、入库单、柜次和装柜计划,不新建独立“出仓单”。LOADED后报关线和送港线并行;费用确认是并行事实,装柜完成后对已装范围的当前有效费用版本执行系统默认确认。
1. 阶段目标和边界
本阶段把可分柜货物转化为可追溯的真实整柜离仓事实,覆盖:
- 模拟柜、智能推荐、人工分配和同柜不可拆组;
- 海运订舱草稿、资料补齐和放舱;
- 订舱级国内拖车预约;
- 模拟柜与订舱柜型需求、真实集装箱号关联;
- 预装确认、动态增减和普通散货托盘标签;
- 国内 PDA 拣货、整托装柜和异常闭环;
- 空仓、半仓、满仓、锁仓、带锁码照五类装柜证据与锁码文本;
- 装柜完成、部分装载分片和跨区交接快照;
LOADED后通知报关行、客户资料收集、回执确认、整柜正式申报和海关结果;- 送港、进港、甩柜/改配、实际离仓和拖车费用归集。
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 → 国内货柜/智能装柜。
- 选择正式装柜仓;
- 选择九类计划渠道组之一;
- 选择平台有效柜型,核对额定容量和限重;
- 填写计划日期和必要备注;
- 提交后系统原子创建稳定柜次、
cabinetNo和唯一装柜计划; - 此时可以没有真实集装箱号,也不会因创建模拟柜自动产生订舱。
容量和重量当前允许达到柜型额定值的 150%,超过时服务端拒绝。页面显示仅用于预判,最终以服务端重新计算为准。
4.2 查询候选
工作台可查询 PENDING_REVIEW、WAIT_MEASURE、WAIT_SPLIT、LOADING 等未完成候选。状态是展示维度,能否加入必须看响应中的 canAssign 和原因。
- 待审核或待测量订单可提前占位;
- 预装确认和启动 PDA 前,实际作业成员必须进入
WAIT_SPLIT; - 普通订单按剩余箱数分配;
- 一件代发按每个未占用的已封托托盘独立返回和分配,禁止拆托;
- 同柜不可拆组必须成员完整、满箱并原子加入;
- 推荐顺序以入库时间先进先出为基础。
4.3 智能推荐和人工加入
智能推荐:设置筛选范围和装载目标,系统逐项校验渠道、仓库、剩余箱数、体积、重量、托盘完整性、组锁和占用,再返回推荐结果。
人工加入:选择候选,填写普通货分配箱数或选择一件代发整托,携带计划版本提交。系统重新校验资格;页面旧结果不能作为写入依据。
一件代发一票多托时逐托展示,其中一托已分配不得隐藏其他未分配托盘。容量不足时跳过整托,不能回退成按箱拆托。
4.4 调整与费用影响
- 未产生物理拣货的普通明细可增减或移除;
- 已拣数量是可调整下限;
- 同柜组只有全组都未拣时才能整组移除;
- 单行一件代发只能按该行
palletId整托移除; - 成员变化需要重算未冻结的柜级/客户级费用;
- 已确认、已发送或客户已确认的费用版本不得直接改写,应按费用规则生成新版本或拒绝。
5. F15 海运订舱与放舱
5.1 创建草稿
入口:Admin → 海运订舱。
- 选择启用的国内中转仓;
- 选择该仓当前有效渠道;
- 选择
ACTIVE/BOOKING订舱供应商; - 填写三类参与方和已知运输资料;
- 至少维护一项、最多二十项柜型需求,数量为正整数;
- 保存为
DRAFT,系统生成OB-yyMMdd-####订舱号。
草稿允许资料不完整、替换文件和继续编辑。柜型需求只表达需要多少个什么柜型,不创建真实货柜行。
5.2 补齐并放舱
放舱前核对:
- 提单号全局唯一;
- 船名、航次、起运港、目的港、ETD、ETA 和运输条款完整;
- 渠道仍有效;
- 柜型需求与平台规格一致;
- 存在有效
BOOKING_CONFIRMATION或BILL_OF_LADING文件; - 订舱供应商仍为有效主档。
点击放舱后状态从 DRAFT 进入 RELEASED,运输快照永久只读。放舱不要求真实柜号,不得为了通过校验伪造柜号。
6. F16 订舱级国内拖车
入口:Admin → 国内拖车预约。
- 从服务端候选中选择已
RELEASED、有提单号和有效订舱文件的订舱; - 选择
ACTIVE/TRUCKING/DOMESTIC供应商; - 填写计划装柜时间、联系人和附件;
- 保存/提交预约;
- 重复创建时返回现有非终态预约,不生成第二张。
拖车单只绑定订舱,不绑定客户、柜次、装柜计划或真实柜号。一个订舱最多一张非终态预约,已有有效完成单不能再次创建收费。
PDA 装柜完成不推进拖车状态。只有订舱要求的全部柜型数量均已关联,并且所有柜均确认国内离仓后,拖车才自动完成。正金额应付拖车费按各柜最终实装体积守恒分摊并发送 Finance;缺供应商归属、有效体积或费用配置时失败关闭,不做伪造均分。
7. F17 柜次关联和真实柜号
入口:Admin → 柜次详情 → 关联订舱/补录柜号。
- 选择已放舱订舱的未满配柜型需求;
- 选择对应模拟柜;
- 校验仓库、渠道映射、柜型、容量、限重和需求剩余数量;
- 录入真实集装箱号;
- 提交后在原柜次上冻结订舱、需求和柜号快照。
关联不会更换 containerBookingId、cabinetNo、装柜计划或明细。真实集装箱号在同一订舱内唯一,不同提单可按业务规则复用。
订舱关联、预装确认和任务创建技术上可先于柜号,但正式操作应在 PDA 最终完成前补齐。已有柜号纠正仅限计划 EDITING、任务未领取且没有物理作业事实。
8. F18 预装确认、动态增减与标签
8.1 预装核对与确认
入口:Admin → 预装清单。
- 打开柜次唯一预装计划;
- 核对每个入仓码、客户、目的仓、普通箱数或一件代发托盘;
- 查看容量、重量、已占用和异常提示;
- 确认所有现场成员已到
WAIT_SPLIT且未 HOLD; - 点击计划级确认,生成或开放唯一 PDA 任务;
- 记录确认快照、操作人和版本。
预装进入 CONFIRMING/CONFIRMED 只冻结确认快照,不锁死尚未完成柜次。计划仍为 EDITING/LOADING 时可继续增加合法明细;未拣明细可调整,已拣明细保持锁定。
新增或调整后计划和任务版本递增,PDA 旧版本必须刷新再作业。
8.2 普通散货托盘标签
普通、非一件代发 FBA 明细在计划 LOADING/COMPLETED 且真实柜号有效时生成正式托盘标签:
- 系统按平台柜次号、FBA 地址内部编号和三位序号生成冻结托盘码;新柜次号为全局连续且不按日期重置的
D0001、D0002,托盘码不依赖可跨提单复用的真实柜号; - 地址内部编号从 Warehouse 启用主数据读取;
- 缺编号或同柜重复时拒绝生成;
- 重复生成必须与已有明细一致;
- Admin 全部打印或按仓指定张数打印;
- A4 横版每托一页,标签与海外补打复用同一编号。
该标签与阶段二一件代发 DP 托盘不同:一件代发托盘在测量后已实际清点封托,装柜时按冻结整托分配。
9. F19 国内 PDA 拣货装柜
9.1 领取和开始
入口:国内 PDA → 拣货装柜。
- 操作员选择当前作业仓;
- 打开或扫描柜次任务;
- 核对真实柜号、装柜计划和任务版本;
- 领取任务后绑定当前作业员、任务和柜次;
- 单柜次只允许一名作业员,不支持多人并行或无审计接管;
- 进入任务后计划/入库履约按规则进入
LOADING。
正式作业当前只支持在线。设备本地草稿按作业员、任务和柜次隔离;批量提交是否具备完整原子事务仍需在优化/验收中持续核实。
9.2 普通散货扫码
- 扫描稳定箱码,一箱一码;
- 不能用 SKU、件数、入仓码或自由文本代替箱码;
- 系统核对箱码属于当前入库单、当前任务且尚未处理;
- 连续扫描先进入当前任务草稿,操作员核对后批量提交;
- 重复扫描不重复增加实装数量。
9.3 一件代发整托装柜
- 扫描
DP托盘码,或扫描成员箱码定位所属已封托托盘; - 页面展示托盘、入仓码、箱数和 SKU 汇总;
- 使用
PICK_PALLET一次提交整托; - 禁止部分拣货、拆托或将同托不同订单成员分开提交;
- 装柜完成按
palletId精确冻结每托箱唛和 SKU,不能按整票模糊复制。
9.4 部分拣货、跳拣和异常
允许分批扫描和暂时跳过,但每个未完成项必须选择/填写异常原因。存在未解决异常、缺少处理单元、数量不平或版本冲突时不能完成任务。
提交超时后先查询任务明细和操作结果,禁止更换幂等键盲目重复提交。版本冲突时刷新任务,保留未提交草稿并重新核对。
10. F20 装柜证据与铅封
PDA 按现场要求采集五类证据:
EMPTY:空仓照片;HALF:半仓照片;FULL:满仓照片;LOCKED:锁仓照片;SEAL:带有效铅封号的带锁码照片。
每类至少一张有效照片,同类允许追加。PDA 仅允许现场相机拍摄;有权限的 Admin 操作员/理货员可人工补充,普通拣货员不开放后台上传。
证据先上传 File 获得合法文件引用,再绑定柜次/任务。错误图片只能作废,不能硬删除;需保留上传、作废、操作者、时间、文件哈希和幂等记录。照片及铅封号当前不对客户展示。
11. F21 装柜完成与分片
PDA 点击“完成装柜”时,服务端重新校验:
- 任务属于当前柜次和仓库且版本一致;
- 真实集装箱号存在;
- 所有普通箱码或一件代发整托均核平;
- 没有未解决异常;
- 空仓、半仓、满仓、锁仓、带锁码照五类证据和锁码文本完整;
- 计划明细、已拣数量和最终实装数量守恒。
校验通过后:
- PDA 任务和装柜计划进入
COMPLETED; - 实装来源入库单进入
LOADED; - 生成最终实装箱码、托盘、SKU 和证据快照;
- 对部分装载执行一次分片;
- 生成跨区 Outbox,但后续消费必须保持幂等。
部分装载时,已装数量形成当前柜次的 LOADED 子入库单,余量形成可继续 WAIT_SPLIT 的后续子单;只允许一层分片,所有子项总和必须等于来源数量。客户订单身份和入仓码关联不能丢失。
12. F22 客户资料与整柜出口报关
12.1 F22-A LOADED 后通知报关并建立客户案例
入口:LOADED 事件 → Admin/Client → 报关资料。
- 装柜完成后按最终实装清单通知报关行,建立本柜报关批次和每个客户/入仓码的
customerCustomsCase; - 客户上传本企业资料,平台校验客户、订单、入仓码、实际装载数量和文件归属;
- 平台将资料发送给报关行,记录发送时间、资料版本和
roundNo; - 报关行返回本轮回执,平台保存文件和回执字段,并向对应客户展示确认任务。
柜前可以存在资料准备或历史附件,但不创建本柜正式客户确认轮次,也不能显示“已通知报关”。客户资料缺失只形成报关线补件待办,不阻断送港线。
12.2 F22-B 报关行回执与客户确认循环
客户查看报关行回执后有两个结果:
- 确认:当前客户案例进入
CUSTOMER_CONFIRMED,保存确认人、确认时间、回执版本和幂等键; - 打回:当前案例进入
NEEDS_RESUBMIT,保存打回原因;客户重新上传/替换资料,平台重新发送报关行,报关行生成新回执,roundNo加一后再次发客户确认。
客户打回只重开对应客户案例,不重置其他客户已经确认的轮次。直到柜内所有客户案例都为 CUSTOMER_CONFIRMED,才允许进入整柜正式提交。
12.3 F22-C 所有客户通过后的整柜正式申报
- 平台检查所有客户案例均已确认,冻结本柜最终实装和资料版本,生成整柜正式申报批次;
- 将整柜资料提交报关行确认,报关行完成正式申报;首版不做外部系统直连,保留人工提交和审计记录;
- 海关结果独立记录为查验、免查验放行、补件/退回、扣货等,不把客户确认回执直接当成海关放行;
- 报关线的任一结果都不覆盖送港线的离仓、进港、甩柜事实。送港线可以先到港,报关线也可以先完成客户确认或正式申报。
13. F23 送港、进港与甩柜
13.1 出仓硬门禁
送港线的离仓/进港门禁逐项检查:
- 无有效 HOLD;
- 入库单为
LOADED; - 装柜计划为
COMPLETED; - PDA 柜次任务为
COMPLETED; - 订舱已
RELEASED且分配当前柜次; - 五类证据与有效锁码文本完整;
- 送港任务和当前船次分配完整;
- 报关客户确认或海关结果不作为仓库离开、送港和进港的前置。
订舱、拖车、仓库离开和港口进场属于送港线事实。报关线可以先完成客户确认或正式申报,也可以晚于进港;两条线各自展示阻断项。容量不足时记录 ROLLED_OVER,保存原船次、滚动次数、新船次、预计开船时间和客户通知。
13.2 自动与人工确认离仓
送港状态变化或其他送港门禁满足时系统自动尝试收敛。未自动完成时,平台在柜次/送港页面:
- 打开门禁清单;
- 逐项处理未通过原因;
- 全部通过后点击确认离仓;
- 携带当前版本和幂等键提交;
- 查看唯一离仓历史和第一条实际节点。
成功后系统:
- 写入整柜唯一国内离仓事实;
- 写入实际
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. 易用性与数据流评审问题
- 排柜工作台是否充分解释“可提前占位”和“可实际作业”的差别?
- 推荐结果是否应逐项展示未入选原因、容量影响和费用影响?
- 模拟柜、柜次编号、真实柜号、订舱号和提单号是否在页面上容易混淆?
- 订舱、拖车、预装、PDA、报关是否需要一个柜次级总控清单,而不是跨页面查找?
- 预装确认后仍可动态增减时,如何提示 PDA 版本已过期并保护未提交草稿?
- PDA 批量提交需要补齐怎样的原子性、离线/弱网和失败整批回滚验收?
- 五类证据是否要提供拍摄引导轮廓、清晰度检查和缺图计数?
- 部分装载分片在 Client 应如何展示,避免客户误以为整票已经全部装柜?
- 报关资料清单、补件责任人、截止时间和回执匹配是否需要结构化待办?
- 出仓门禁失败是否需要直接跳转到对应处理页面?
- 拖车不作为出仓硬门禁的现行口径,是否与现场调度责任一致?
- 实际离仓不可撤销后,错误柜号或错误时间的合规更正流程由谁负责?
18. 阶段四交接包
交给阶段四的权威数据包括:
- 柜次、真实集装箱号、订舱号、提单号、船名和航次;
- 起运港、目的港、ETD/ETA 和运输条款快照;
- 最终实装订单、入仓单、箱码、托盘、SKU、重量和体积;
- 装柜五类证据引用和报关完成事实;
- 国内离仓时间和
DEPARTED_WAREHOUSE实际节点; - 跨区事件版本、事件 ID 和有效载荷哈希;
CarrierScheduleQuery及后续船节点查询上下文;- 未冻结费用和拖车应付等并行财务结果。
19. 事实来源
docs/国内货柜履约/README.mddocs/国内货柜履约/国内货柜履约页面与原型清单.mddocs/归档/头程到尾程/头程下单到尾程出库现状流程全景清单.mddocs/统一订单主状态与操作契约.mdapps/admin-web/src/modules/container-loading/apps/admin-web/src/modules/loading-lists/apps/pda-uniapp/AGENTS.mdapps/pda-uniapp/pages/picking/picking.vuebaiyue-firstleg/firstleg/AGENTS.mdbaiyue-firstleg/firstleg/src/main/resources/openapi/loading-lists-v1.yamlbaiyue-firstleg/firstleg/src/main/resources/openapi/ocean-bookings-v1.yamlbaiyue-firstleg/firstleg/src/main/resources/openapi/truck-appointments-v1.yamlbaiyue-firstleg/firstleg/src/main/resources/openapi/customs-v1.yamlbaiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/service/SmartLoadingService.javabaiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingPickService.javabaiyue-firstleg/firstleg/src/main/java/com/baiyue/firstleg/outbound/dispatch/service/OutboundDispatchService.java