8 Commits
Author SHA1 Message Date
ouyangxq e6c72b2ae5 优化 2026-09-23 17:46:00 +08:00
ouyangxq 3187f8d3b6 优化 2026-09-23 08:58:59 +08:00
ouyangxq 2168ace373 优化 2026-09-22 14:01:47 +08:00
ouyangxq b22d1ed0c0 1 2026-09-21 20:39:30 +08:00
ouyangxq 1fffb3489e Merge branch 'test' of http://git.buggoglobal.com/html/docs into dev 2026-09-21 18:02:00 +08:00
ouyangxq fda83e9dbc Merge branch 'test' of http://git.buggoglobal.com/html/docs into dev 2026-09-21 14:31:35 +08:00
ouyangxq 6c62270776 优化 2026-09-08 18:18:46 +08:00
ouyangxq ede632a535 优化 2026-09-08 09:40:47 +08:00
15 changed files with 3268 additions and 21 deletions
+4
View File
@@ -16,6 +16,10 @@
## 全流程公共契约 ## 全流程公共契约
- [头程到尾程顺序回路流程图](头程到尾程流程/头程到尾程顺序回路流程图.md):按“主线节点→完成判定→下一节点;异常→处理→回到原节点复核”建模,提供节点卡模板,适合继续画泳道流程图;附[可编辑示例](头程到尾程流程/头程到尾程顺序回路流程图.drawio)。
- [头程到尾程流程节点梳理](头程到尾程流程/头程到尾程流程节点梳理.docx):可直接分发和打印的 Word 文档,按四段流程整理 27 个节点、负责人、正常下一步、异常处理和回流节点。
- [头程到尾程逐节点思维导图](头程到尾程流程/头程到尾程逐节点思维导图.md):按实际节点编号,保留建议负责人、正常去向及异常分支,供人工填写和增删;附[可编辑思维导图源文件](头程到尾程流程/头程到尾程逐节点思维导图.mm)。
- [头程柜级履约尾程流程节点责任与异常梳理](头程到尾程流程/头程柜级履约尾程流程节点责任与异常梳理.md):按 H/G/W/Z 分解现有流程节点,列出执行岗位、前置、交接、异常和负责人填写栏,附人工待确认问题及[可编辑浏览打印版](头程到尾程流程/头程柜级履约尾程流程节点责任与异常梳理.html)。
- [头程下单到尾程出库全流程操作手册](头程下单到尾程出库全流程操作手册.md):从客户头程下单、国内收货测量、分柜装柜和国内出仓,贯通跨区尾程建单、海外接柜入仓、排车、PDA 拣货与尾程出库的角色、操作、状态、编号、门禁和异常处理。 - [头程下单到尾程出库全流程操作手册](头程下单到尾程出库全流程操作手册.md):从客户头程下单、国内收货测量、分柜装柜和国内出仓,贯通跨区尾程建单、海外接柜入仓、排车、PDA 拣货与尾程出库的角色、操作、状态、编号、门禁和异常处理。
- [头程下单到尾程出库现状流程全景清单](头程下单到尾程出库现状流程全景清单.md):以 F01~F40 盘点现有主链、并行流程、条件分支和异常流,明确操作人、入口/出口状态、单据、编号、数据交接和评审项;应先评审本清单,再进入优化。 - [头程下单到尾程出库现状流程全景清单](头程下单到尾程出库现状流程全景清单.md):以 F01~F40 盘点现有主链、并行流程、条件分支和异常流,明确操作人、入口/出口状态、单据、编号、数据交接和评审项;应先评审本清单,再进入优化。
- [头程到尾程分阶段流程](头程到尾程分阶段流程/README.md):F01~F40 六个阶段现状文档已全部完成,逐阶段记录操作、字段、状态、数据流、异常、完成判定和上下游交接条件,可按阶段评审并进入优化。 - [头程到尾程分阶段流程](头程到尾程分阶段流程/README.md):F01~F40 六个阶段现状文档已全部完成,逐阶段记录操作、字段、状态、数据流、异常、完成判定和上下游交接条件,可按阶段评审并进入优化。
+1
View File
@@ -27,6 +27,7 @@
| 托盘码、托盘标签、补打 | 先区分散货装柜、一件代发和海外实体托盘 | 散货 `apps/admin-web/src/modules/loading-lists/components/PalletLabelPrintDialog.vue`;一件代发 `apps/admin-web/src/modules/inbounds/core/DropshipPalletPrintPanel.vue`,从订单“托盘打印”页签进入;海外单张打印 `apps/admin-web/src/modules/overseas-warehouse/pages/PalletsView.vue`,详见各应用/模块指引 | | 托盘码、托盘标签、补打 | 先区分散货装柜、一件代发和海外实体托盘 | 散货 `apps/admin-web/src/modules/loading-lists/components/PalletLabelPrintDialog.vue`;一件代发 `apps/admin-web/src/modules/inbounds/core/DropshipPalletPrintPanel.vue`,从订单“托盘打印”页签进入;海外单张打印 `apps/admin-web/src/modules/overseas-warehouse/pages/PalletsView.vue`,详见各应用/模块指引 |
| 箱码、箱唛、箱标、单箱扫码 | 单箱身份与测量,不是托盘或库位 | 业务路由查“箱唛、箱码与单箱测量”;后端查 `InboundCartonLabelService` | | 箱码、箱唛、箱标、单箱扫码 | 单箱身份与测量,不是托盘或库位 | 业务路由查“箱唛、箱码与单箱测量”;后端查 `InboundCartonLabelService` |
| 库位、托盘、占位、释放 | 国内称重整票块归 Warehouse;海外实物托盘资源归 Warehouse Overseas;业务任务归 Lastleg | 业务路由查“称重确认”或“海外仓库与通用资料”;用国内/海外和业务阶段继续限定 | | 库位、托盘、占位、释放 | 国内称重整票块归 Warehouse;海外实物托盘资源归 Warehouse Overseas;业务任务归 Lastleg | 业务路由查“称重确认”或“海外仓库与通用资料”;用国内/海外和业务阶段继续限定 |
| 海外库位维护、库区、A0溢出位、虚拟收货位 | Admin 海外仓资源维护,区别于 PDA 收货时展示的服务端预留库位 | Admin `apps/admin-web/src/modules/overseas-warehouse/pages/LocationsView.vue` → `api/locations.ts`;海外资源归 `warehouse-overseas-service/`,PDA 收货展示入口见 `apps/pda-overseas-uniapp/src/pages/operation/operation.vue` |
| 拖车、派车、提柜、还柜 | 国内订舱拖车与目的港码头车队是不同业务;海外配送排车另属 Lastleg | 国内 `apps/admin-web/src/modules/trucking/`;目的港 `apps/admin-web/src/modules/container-loading/api/terminalDrayages.ts`;配送查“海外出库、排车” | | 拖车、派车、提柜、还柜 | 国内订舱拖车与目的港码头车队是不同业务;海外配送排车另属 Lastleg | 国内 `apps/admin-web/src/modules/trucking/`;目的港 `apps/admin-web/src/modules/container-loading/api/terminalDrayages.ts`;配送查“海外出库、排车” |
| 报关资料、退税资料、完成文件 | 平台整柜操作与客户订单上传先按终端区分 | Admin `apps/admin-web/src/modules/container-loading/components/ContainerCustomsPanel.vue`;Client `apps/client-web/src/modules/first-leg/components/CustomsDocumentsDialog.vue` | | 报关资料、退税资料、完成文件 | 平台整柜操作与客户订单上传先按终端区分 | Admin `apps/admin-web/src/modules/container-loading/components/ContainerCustomsPanel.vue`;Client `apps/client-web/src/modules/first-leg/components/CustomsDocumentsDialog.vue` |
| 退货、退货预报、退货换标、退货签收、退货合箱 | 客户退货预报及签收库存,区别于派送异常退回 | Client `apps/client-web/src/modules/overseas-warehouse/views/ReturnOrdersView.vue`;Admin `apps/admin-web/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue`;PDA `apps/pda-overseas-uniapp/AGENTS.md`;Lastleg `returnreceipt/`,见下文“退货预报、签收、库存与合箱” | | 退货、退货预报、退货换标、退货签收、退货合箱 | 客户退货预报及签收库存,区别于派送异常退回 | Client `apps/client-web/src/modules/overseas-warehouse/views/ReturnOrdersView.vue`;Admin `apps/admin-web/src/modules/overseas-warehouse/pages/ReturnInventoryManagementView.vue`;PDA `apps/pda-overseas-uniapp/AGENTS.md`;Lastleg `returnreceipt/`,见下文“退货预报、签收、库存与合箱” |
@@ -0,0 +1,172 @@
# 头程到尾程逐节点思维导图
2026年9月22日 · 人工梳理与分工版
按实际业务节点编号,不限定阶段或步数。展开每个节点查看负责人、正常去向、异常处理和特殊分支。
岗位为建议分工,姓名留空待填;异常转交路径供人工确认。编号用于讨论定位,可并行或提前的动作以节点说明为准。
标记“待确认”的处理入口或完结规则,需要人工补充,不能当作已具备的系统能力。
思维导图源文件:[头程到尾程逐节点思维导图.mm](头程到尾程逐节点思维导图.mm)。可在支持 FreeMind 格式的软件中导入,填写姓名、增删节点。
新增步骤可沿用相邻编号加字母,例如 04A。详细依据保留在[原梳理文档](头程柜级履约尾程流程节点责任与异常梳理.md)。
- **01 客户下单**
- 负责人:客户下单员 · 姓名____
- 正常:提交订单 → 02 审核;同时安排 03 送仓。
- 异常:资料缺失/下单失败 → 客服协助客户补正 → 重新提交。
- **02 订单审核**
- 负责人:订单审核员 · 姓名____
- 正常:审核通过;与 03—05 可并行,06 测量审核通过前须完成本步。
- 异常:申报/渠道有误 → 审核员联系客户补正 → 重新审核。
- **03 拉货/客户送仓**
- 负责人:国内提货跟单 · 姓名____
- 正常:上门拉货或客户自送 → 04 到仓收货。
- 异常:未备货/迟到/运输破损 → 提货跟单联系客户、司机 → 改约或补交接记录。
- 说明:拉货执行、司机交接的现场规则待补充;当前系统主要记录预约信息。
- **04 国内到仓收货**
- 负责人:国内收货员 · 姓名____
- 正常:核对订单、箱数、外包装 → 05 称重测量。
- 异常:无单/少件/多件/破损 → 收货员留证,仓库主管与客服核对 → 明确收货处理后交测量。
- **05 称重测量**
- 负责人:国内测量员 · 姓名____
- 正常:采集重量、尺寸、箱数和图片 → 06 测量审核;称重确认时开始分配库位。
- 异常:漏测/错码/读数异常 → 测量员复测补证 → 重新提交审核。
- **06 测量审核**
- 负责人:测量审核员 · 姓名____
- 正常:普通货审核通过 → 07 在库交接 → 08 排柜;一件代发另走下方分支。
- 异常:数据/证据存疑 → 审核员联系测量员复核 → 再审;退回修改入口待确认。
- **06A 一件代发拆箱清点**
- 负责人:国内清点员 · 姓名____
- 正常:按箱核对 SKU 与数量 → 06B 归托封托。
- 异常:差异 → 仓库主管、客服核对;接受差异须留原因,接受权限待定。
- **06B 打托/归托/封托**
- 负责人:国内打托员 · 姓名____
- 正常:清点完成、封托完成 → 08 排柜;封托托盘作为不可拆分单元。
- 异常:漏清点/托盘未封 → 国内仓主管安排补作业 → 封托后继续。
- **07 国内入库/库位确认**
- 负责人:国内仓管 · 姓名____
- 正常:确认货物所在库位和交接信息 → 08 排柜;库位安排随 05 开始,本步核对在库结果。
- 异常:库位不足/货位不符 → 国内仓主管落实存放位置并核对记录 → 交接后继续。
- **08 排柜/分柜**
- 负责人:柜务 · 姓名____
- 正常:确定本柜装哪些货 → 11 国内拣货;可与 09 订舱准备并行。
- 异常:超容/扣货/审核未完成 → 柜务协调仓库、审核员 → 调整计划或解除阻断后再拣货。
- 说明:待审核、待测量可先占位;实物作业须满足审核、清点封托等条件。
- **09 订舱/放舱**
- 负责人:船务 · 姓名____
- 正常:确认舱位、船期和放舱资料 → 10 国内拖柜。
- 异常:无舱/甩柜/船期调整 → 船务协调船司、柜务 → 确认新船期及装柜安排。
- **10 国内拖柜:预约、提柜到仓**
- 负责人:国内运输跟单 · 姓名____
- 正常:订舱已放舱、资料齐全后预约;司机提空柜到国内仓 → 12 装柜。
- 异常:车不到/柜不可用/资料缺失 → 运输跟单联络车队、船务 → 补资料或重新安排。
- **11 国内拣货**
- 负责人:国内拣货员 · 姓名____
- 正常:按装柜计划找到货物、扫码核对 → 12 装柜。
- 异常:找不到/错货/少件/扣货 → 国内仓主管与柜务核对 → 补拣、调整计划或解除阻断。
- **12 装柜完成**
- 负责人:国内装柜主管 · 姓名____
- 正常:核对实装、柜号和装柜证据 → 13 出口报关;同时开始海外接柜准备。
- 异常:实装不符/装不下/证据缺失 → 装柜主管与柜务核实 → 调整、补证后确认完成。
- **12A 海外接柜准备**
- 负责人:海外计划员 · 姓名____
- 正常:装柜完成后系统生成尾程订单 → 人工准备入仓计划、托盘与库位 → 18 拆柜收货。
- 异常:订单未同步/计划或资源缺失 → 计划员联系履约运营、仓库主管补齐;系统失败转技术处理。
- **13 出口报关**
- 负责人:出口报关专员 · 姓名____
- 正常:装柜完成后处理整柜报关、收齐完成资料 → 14 国内出仓。
- 异常:资料缺失/退单/查验 → 报关专员联系客户、代理 → 补正或配合查验,完成后继续。
- **14 国内出仓**
- 负责人:国内出仓员 · 姓名____
- 正常:报关完成且出仓条件齐备 → 确认离仓,交 15 海运跟踪。
- 异常:报关未完成/扣货/交接不符 → 出仓员暂停放行,联系对应主责 → 条件满足后出仓。
- **15 海运/到港跟踪**
- 负责人:船务 · 姓名____
- 正常:跟踪开船、到港、卸船 → 与 16 清关、17 提柜衔接。
- 异常:延误/改港/节点未更新 → 船务核实船司消息 → 更新计划并交客服通知客户。
- **16 目的港清关**
- 负责人:海外清关专员 · 姓名____
- 正常:可提前备资料;确认清关放行和提柜条件 → 17 海外提柜。
- 异常:补件/查验/未放行 → 清关专员联系代理、客户 → 处理并确认可提柜后继续。
- **17 海外提柜/送仓**
- 负责人:海外运输跟单 · 姓名____
- 正常:预约港口提柜、协调海外仓接收 → 18 拆柜收货。
- 异常:无车/提柜失败/仓库约不上 → 海外运输跟单协调港口、车队、仓库 → 改约并跟进额外费用。
- **18 海外拆柜收货**
- 负责人:海外收货员 · 姓名____
- 正常:按入仓计划扫描、清点、记录实收 → 无差异时交 19 入库。
- 异常:短收/超收 → 海外仓主管登记差异、留证 → 待核平;可结束卸柜,但不能直接成为可用库存,核平入口待确认。
- **18A 卸柜后还空柜**
- 负责人:海外运输跟单 · 姓名____
- 正常:卸柜结束 → 安排还空并记录凭证;与后续库存、出库流程并行。
- 异常:还空受阻/临近截止 → 海外运输跟单联系车队、堆场 → 调整还空安排并跟进费用。
- **19 海外入库/库位确认**
- 负责人:海外仓管 · 姓名____
- 正常:正常收货形成库存,核对真实托盘、库位和可用数量 → 20 排车。
- 异常:库位不符/暂扣/数量仍有差异 → 海外仓主管核实 → 满足可用条件后再交拣货。
- **19A 一件代发独立出库**
- 负责人:一件代发运营 · 姓名____
- 正常:按独立出库单逐箱或整托拣货,核对 SKU 与数量后出库;签收、回访和整单完结衔接待确认。
- 异常:缺货/错 SKU/数量不符 → 代发运营与海外仓核对 → 补货或调整后再出库。
- **20 海外排车**
- 负责人:海外调度 · 姓名____
- 正常:确定车辆、路线、目的地与货物 → 21 转派送、22 拣货;可提前预排,实际拣货须有可用库存。
- 异常:无车/预约冲突/库存不足 → 海外调度协调仓库、车队 → 调整排车与交付安排。
- **21 转派送/生成待出库单**
- 负责人:海外调度 · 姓名____
- 正常:生成派送关联和待出库单 → 23 发车前核对;可在 22 拣货前或过程中进行,必须早于 24 发车。
- 异常:资料缺失/生成失败 → 海外调度补齐资料、核实关联 → 成功后才能发车。
- **22 按排车拣货**
- 负责人:海外拣货员 · 姓名____
- 正常:按排车任务、托盘与库位扫描拣货 → 23 核平复核。
- 异常:少货/错托/暂扣/货位不符 → 海外仓主管核查 → 补拣或协调调度调整。
- **23 拣货核平/发车前复核**
- 负责人:海外仓主管 · 姓名____
- 正常:核对实拣、出库单、车辆及必需资料 → 条件齐备交 24 发车。
- 异常:数量未核平/单据缺失 → 海外仓主管联系拣货员、调度补齐 → 复核无误后继续。
- 说明:此处是作业检查节点,不表示另设一项系统审批。
- **24 发车/确认出库**
- 负责人:海外出库员 · 姓名____
- 正常:按系统可发车条件确认发车、完成出库 → 25 派送签收;调度负责车辆交接。
- 异常:系统阻断/司机未到/交接不符 → 出库员暂停,海外调度协调处理 → 满足条件后发车。
- **25 派送/签收**
- 负责人:派送运营 · 姓名____
- 正常:送达、保存有效签收资料 → 26 整单完结核对;同时进入 27 客户回访。
- 异常:拒签/送达失败 → 派送运营登记异常 → 退回时按实收恢复到真实托盘、库位 → 另行安排后续;不按正常签收完结。
- **26 整单完结**
- 负责人:履约运营 · 姓名____
- 正常:全部有效履约片段完成后,系统汇总整单完结;履约运营核对结果。
- 异常:还有余货/其他柜未完成/回传失败 → 履约运营追踪对应环节,系统故障转技术 → 齐备后完结。
- 说明:27 回访独立进行;财务结清另行核对。
- **27 客户回访**
- 负责人:客服 · 姓名____
- 正常:普通派送签收后回访,记录反馈、处理结果和附件;与 26 整单完结核对并行。
- 异常:联系不上/投诉/索赔 → 客服持续跟进,交对应业务主管处理 → 反馈客户并补回访记录。
@@ -0,0 +1,178 @@
<?xml version='1.0' encoding='utf-8'?>
<map version="1.0.1">
<node TEXT="头程 → 柜子 → 尾程|逐节点流程" ID="logistics-process" FOLDED="false">
<richcontent TYPE="NOTE">
<html>
<body>
<p>按实际业务节点编号,不限定阶段或步数。展开每个节点查看负责人、正常去向、异常处理和特殊分支。</p>
<p>岗位为建议分工,姓名留空待填;异常转交路径供人工确认。编号用于讨论定位,可并行或提前的动作以节点说明为准。</p>
<p>标记“待确认”的处理入口或完结规则,需要人工补充,不能当作已具备的系统能力。</p>
</body>
</html>
</richcontent>
<node TEXT="01 客户下单|客户下单员" ID="step-01" FOLDED="true" POSITION="right">
<node TEXT="负责人:客户下单员 · 姓名____" />
<node TEXT="正常:提交订单 → 02 审核;同时安排 03 送仓。" />
<node TEXT="异常:资料缺失/下单失败 → 客服协助客户补正 → 重新提交。" />
</node>
<node TEXT="02 订单审核|订单审核员" ID="step-02" FOLDED="true" POSITION="right">
<node TEXT="负责人:订单审核员 · 姓名____" />
<node TEXT="正常:审核通过;与 03—05 可并行,06 测量审核通过前须完成本步。" />
<node TEXT="异常:申报/渠道有误 → 审核员联系客户补正 → 重新审核。" />
</node>
<node TEXT="03 拉货/客户送仓|国内提货跟单" ID="step-03" FOLDED="true" POSITION="right">
<node TEXT="负责人:国内提货跟单 · 姓名____" />
<node TEXT="正常:上门拉货或客户自送 → 04 到仓收货。" />
<node TEXT="异常:未备货/迟到/运输破损 → 提货跟单联系客户、司机 → 改约或补交接记录。" />
<node TEXT="说明:拉货执行、司机交接的现场规则待补充;当前系统主要记录预约信息。" />
</node>
<node TEXT="04 国内到仓收货|国内收货员" ID="step-04" FOLDED="true" POSITION="right">
<node TEXT="负责人:国内收货员 · 姓名____" />
<node TEXT="正常:核对订单、箱数、外包装 → 05 称重测量。" />
<node TEXT="异常:无单/少件/多件/破损 → 收货员留证,仓库主管与客服核对 → 明确收货处理后交测量。" />
</node>
<node TEXT="05 称重测量|国内测量员" ID="step-05" FOLDED="true" POSITION="right">
<node TEXT="负责人:国内测量员 · 姓名____" />
<node TEXT="正常:采集重量、尺寸、箱数和图片 → 06 测量审核;称重确认时开始分配库位。" />
<node TEXT="异常:漏测/错码/读数异常 → 测量员复测补证 → 重新提交审核。" />
</node>
<node TEXT="06 测量审核|测量审核员" ID="step-06" FOLDED="true" POSITION="right">
<node TEXT="负责人:测量审核员 · 姓名____" />
<node TEXT="正常:普通货审核通过 → 07 在库交接 → 08 排柜;一件代发另走下方分支。" />
<node TEXT="异常:数据/证据存疑 → 审核员联系测量员复核 → 再审;退回修改入口待确认。" />
<node TEXT="06A 一件代发拆箱清点|国内清点员" ID="step-06A" FOLDED="true">
<node TEXT="负责人:国内清点员 · 姓名____" />
<node TEXT="正常:按箱核对 SKU 与数量 → 06B 归托封托。" />
<node TEXT="异常:差异 → 仓库主管、客服核对;接受差异须留原因,接受权限待定。" />
</node>
<node TEXT="06B 打托/归托/封托|国内打托员" ID="step-06B" FOLDED="true">
<node TEXT="负责人:国内打托员 · 姓名____" />
<node TEXT="正常:清点完成、封托完成 → 08 排柜;封托托盘作为不可拆分单元。" />
<node TEXT="异常:漏清点/托盘未封 → 国内仓主管安排补作业 → 封托后继续。" />
</node>
</node>
<node TEXT="07 国内入库/库位确认|国内仓管" ID="step-07" FOLDED="true" POSITION="right">
<node TEXT="负责人:国内仓管 · 姓名____" />
<node TEXT="正常:确认货物所在库位和交接信息 → 08 排柜;库位安排随 05 开始,本步核对在库结果。" />
<node TEXT="异常:库位不足/货位不符 → 国内仓主管落实存放位置并核对记录 → 交接后继续。" />
</node>
<node TEXT="08 排柜/分柜|柜务" ID="step-08" FOLDED="true" POSITION="right">
<node TEXT="负责人:柜务 · 姓名____" />
<node TEXT="正常:确定本柜装哪些货 → 11 国内拣货;可与 09 订舱准备并行。" />
<node TEXT="异常:超容/扣货/审核未完成 → 柜务协调仓库、审核员 → 调整计划或解除阻断后再拣货。" />
<node TEXT="说明:待审核、待测量可先占位;实物作业须满足审核、清点封托等条件。" />
</node>
<node TEXT="09 订舱/放舱|船务" ID="step-09" FOLDED="true" POSITION="right">
<node TEXT="负责人:船务 · 姓名____" />
<node TEXT="正常:确认舱位、船期和放舱资料 → 10 国内拖柜。" />
<node TEXT="异常:无舱/甩柜/船期调整 → 船务协调船司、柜务 → 确认新船期及装柜安排。" />
</node>
<node TEXT="10 国内拖柜:预约、提柜到仓|国内运输跟单" ID="step-10" FOLDED="true" POSITION="right">
<node TEXT="负责人:国内运输跟单 · 姓名____" />
<node TEXT="正常:订舱已放舱、资料齐全后预约;司机提空柜到国内仓 → 12 装柜。" />
<node TEXT="异常:车不到/柜不可用/资料缺失 → 运输跟单联络车队、船务 → 补资料或重新安排。" />
</node>
<node TEXT="11 国内拣货|国内拣货员" ID="step-11" FOLDED="true" POSITION="right">
<node TEXT="负责人:国内拣货员 · 姓名____" />
<node TEXT="正常:按装柜计划找到货物、扫码核对 → 12 装柜。" />
<node TEXT="异常:找不到/错货/少件/扣货 → 国内仓主管与柜务核对 → 补拣、调整计划或解除阻断。" />
</node>
<node TEXT="12 装柜完成|国内装柜主管" ID="step-12" FOLDED="true" POSITION="right">
<node TEXT="负责人:国内装柜主管 · 姓名____" />
<node TEXT="正常:核对实装、柜号和装柜证据 → 13 出口报关;同时开始海外接柜准备。" />
<node TEXT="异常:实装不符/装不下/证据缺失 → 装柜主管与柜务核实 → 调整、补证后确认完成。" />
<node TEXT="12A 海外接柜准备|海外计划员" ID="step-12A" FOLDED="true">
<node TEXT="负责人:海外计划员 · 姓名____" />
<node TEXT="正常:装柜完成后系统生成尾程订单 → 人工准备入仓计划、托盘与库位 → 18 拆柜收货。" />
<node TEXT="异常:订单未同步/计划或资源缺失 → 计划员联系履约运营、仓库主管补齐;系统失败转技术处理。" />
</node>
</node>
<node TEXT="13 出口报关|出口报关专员" ID="step-13" FOLDED="true" POSITION="right">
<node TEXT="负责人:出口报关专员 · 姓名____" />
<node TEXT="正常:装柜完成后处理整柜报关、收齐完成资料 → 14 国内出仓。" />
<node TEXT="异常:资料缺失/退单/查验 → 报关专员联系客户、代理 → 补正或配合查验,完成后继续。" />
</node>
<node TEXT="14 国内出仓|国内出仓员" ID="step-14" FOLDED="true" POSITION="right">
<node TEXT="负责人:国内出仓员 · 姓名____" />
<node TEXT="正常:报关完成且出仓条件齐备 → 确认离仓,交 15 海运跟踪。" />
<node TEXT="异常:报关未完成/扣货/交接不符 → 出仓员暂停放行,联系对应主责 → 条件满足后出仓。" />
</node>
<node TEXT="15 海运/到港跟踪|船务" ID="step-15" FOLDED="true" POSITION="right">
<node TEXT="负责人:船务 · 姓名____" />
<node TEXT="正常:跟踪开船、到港、卸船 → 与 16 清关、17 提柜衔接。" />
<node TEXT="异常:延误/改港/节点未更新 → 船务核实船司消息 → 更新计划并交客服通知客户。" />
</node>
<node TEXT="16 目的港清关|海外清关专员" ID="step-16" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外清关专员 · 姓名____" />
<node TEXT="正常:可提前备资料;确认清关放行和提柜条件 → 17 海外提柜。" />
<node TEXT="异常:补件/查验/未放行 → 清关专员联系代理、客户 → 处理并确认可提柜后继续。" />
</node>
<node TEXT="17 海外提柜/送仓|海外运输跟单" ID="step-17" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外运输跟单 · 姓名____" />
<node TEXT="正常:预约港口提柜、协调海外仓接收 → 18 拆柜收货。" />
<node TEXT="异常:无车/提柜失败/仓库约不上 → 海外运输跟单协调港口、车队、仓库 → 改约并跟进额外费用。" />
</node>
<node TEXT="18 海外拆柜收货|海外收货员" ID="step-18" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外收货员 · 姓名____" />
<node TEXT="正常:按入仓计划扫描、清点、记录实收 → 无差异时交 19 入库。" />
<node TEXT="异常:短收/超收 → 海外仓主管登记差异、留证 → 待核平;可结束卸柜,但不能直接成为可用库存,核平入口待确认。" />
<node TEXT="18A 卸柜后还空柜|海外运输跟单" ID="step-18A" FOLDED="true">
<node TEXT="负责人:海外运输跟单 · 姓名____" />
<node TEXT="正常:卸柜结束 → 安排还空并记录凭证;与后续库存、出库流程并行。" />
<node TEXT="异常:还空受阻/临近截止 → 海外运输跟单联系车队、堆场 → 调整还空安排并跟进费用。" />
</node>
</node>
<node TEXT="19 海外入库/库位确认|海外仓管" ID="step-19" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外仓管 · 姓名____" />
<node TEXT="正常:正常收货形成库存,核对真实托盘、库位和可用数量 → 20 排车。" />
<node TEXT="异常:库位不符/暂扣/数量仍有差异 → 海外仓主管核实 → 满足可用条件后再交拣货。" />
<node TEXT="19A 一件代发独立出库|一件代发运营" ID="step-19A" FOLDED="true">
<node TEXT="负责人:一件代发运营 · 姓名____" />
<node TEXT="正常:按独立出库单逐箱或整托拣货,核对 SKU 与数量后出库;签收、回访和整单完结衔接待确认。" />
<node TEXT="异常:缺货/错 SKU/数量不符 → 代发运营与海外仓核对 → 补货或调整后再出库。" />
</node>
</node>
<node TEXT="20 海外排车|海外调度" ID="step-20" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外调度 · 姓名____" />
<node TEXT="正常:确定车辆、路线、目的地与货物 → 21 转派送、22 拣货;可提前预排,实际拣货须有可用库存。" />
<node TEXT="异常:无车/预约冲突/库存不足 → 海外调度协调仓库、车队 → 调整排车与交付安排。" />
</node>
<node TEXT="21 转派送/生成待出库单|海外调度" ID="step-21" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外调度 · 姓名____" />
<node TEXT="正常:生成派送关联和待出库单 → 23 发车前核对;可在 22 拣货前或过程中进行,必须早于 24 发车。" />
<node TEXT="异常:资料缺失/生成失败 → 海外调度补齐资料、核实关联 → 成功后才能发车。" />
</node>
<node TEXT="22 按排车拣货|海外拣货员" ID="step-22" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外拣货员 · 姓名____" />
<node TEXT="正常:按排车任务、托盘与库位扫描拣货 → 23 核平复核。" />
<node TEXT="异常:少货/错托/暂扣/货位不符 → 海外仓主管核查 → 补拣或协调调度调整。" />
</node>
<node TEXT="23 拣货核平/发车前复核|海外仓主管" ID="step-23" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外仓主管 · 姓名____" />
<node TEXT="正常:核对实拣、出库单、车辆及必需资料 → 条件齐备交 24 发车。" />
<node TEXT="异常:数量未核平/单据缺失 → 海外仓主管联系拣货员、调度补齐 → 复核无误后继续。" />
<node TEXT="说明:此处是作业检查节点,不表示另设一项系统审批。" />
</node>
<node TEXT="24 发车/确认出库|海外出库员" ID="step-24" FOLDED="true" POSITION="right">
<node TEXT="负责人:海外出库员 · 姓名____" />
<node TEXT="正常:按系统可发车条件确认发车、完成出库 → 25 派送签收;调度负责车辆交接。" />
<node TEXT="异常:系统阻断/司机未到/交接不符 → 出库员暂停,海外调度协调处理 → 满足条件后发车。" />
</node>
<node TEXT="25 派送/签收|派送运营" ID="step-25" FOLDED="true" POSITION="right">
<node TEXT="负责人:派送运营 · 姓名____" />
<node TEXT="正常:送达、保存有效签收资料 → 26 整单完结核对;同时进入 27 客户回访。" />
<node TEXT="异常:拒签/送达失败 → 派送运营登记异常 → 退回时按实收恢复到真实托盘、库位 → 另行安排后续;不按正常签收完结。" />
</node>
<node TEXT="26 整单完结|履约运营" ID="step-26" FOLDED="true" POSITION="right">
<node TEXT="负责人:履约运营 · 姓名____" />
<node TEXT="正常:全部有效履约片段完成后,系统汇总整单完结;履约运营核对结果。" />
<node TEXT="异常:还有余货/其他柜未完成/回传失败 → 履约运营追踪对应环节,系统故障转技术 → 齐备后完结。" />
<node TEXT="说明:27 回访独立进行;财务结清另行核对。" />
</node>
<node TEXT="27 客户回访|客服" ID="step-27" FOLDED="true" POSITION="right">
<node TEXT="负责人:客服 · 姓名____" />
<node TEXT="正常:普通派送签收后回访,记录反馈、处理结果和附件;与 26 整单完结核对并行。" />
<node TEXT="异常:联系不上/投诉/索赔 → 客服持续跟进,交对应业务主管处理 → 反馈客户并补回访记录。" />
</node>
</node>
</map>
@@ -0,0 +1,63 @@
<mxfile host="app.diagrams.net" modified="2026-09-22T00:00:00.000Z" agent="Codex" version="24.7.17">
<diagram id="sequential-loop-flow" name="顺序回路示例">
<mxGraphModel dx="1200" dy="900" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="n01" value="01 客户下单&#10;负责人:客户下单员&#10;通过→下一节点&#10;异常:资料补正" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="60" y="40" width="270" height="90" as="geometry" />
</mxCell>
<mxCell id="e01" value="异常处理&#10;客服协助补正后回 01" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="420" y="45" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="bad-01" value="异常" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="n01" target="e01" />
<mxCell id="back-01" value="处理完成,回本节点复核" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="e01" target="n01" />
<mxCell id="next-01" value="通过" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;strokeColor=#6c8ebf;endArrow=block;html=1;" edge="1" parent="1" source="n01" target="n02" />
<mxCell id="n02" value="02 订单审核&#10;负责人:订单审核员&#10;通过→下一节点&#10;异常:申报/渠道有误" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="60" y="180" width="270" height="90" as="geometry" />
</mxCell>
<mxCell id="e02" value="异常处理&#10;补正后回 02" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="420" y="185" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="bad-02" value="异常" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="n02" target="e02" />
<mxCell id="back-02" value="处理完成,回本节点复核" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="e02" target="n02" />
<mxCell id="next-02" value="通过" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;strokeColor=#6c8ebf;endArrow=block;html=1;" edge="1" parent="1" source="n02" target="n03" />
<mxCell id="n03" value="03 拉货/客户送仓&#10;负责人:国内提货跟单&#10;通过→下一节点&#10;异常:未备货/迟到/破损" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="60" y="320" width="270" height="90" as="geometry" />
</mxCell>
<mxCell id="e03" value="异常处理&#10;改约或补交接后回 03" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="420" y="325" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="bad-03" value="异常" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="n03" target="e03" />
<mxCell id="back-03" value="处理完成,回本节点复核" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="e03" target="n03" />
<mxCell id="next-03" value="通过" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;strokeColor=#6c8ebf;endArrow=block;html=1;" edge="1" parent="1" source="n03" target="n04" />
<mxCell id="n04" value="04 到仓验收与测量&#10;负责人:收货员/测量员&#10;通过→下一节点&#10;异常:差异/漏测/错码" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="60" y="460" width="270" height="90" as="geometry" />
</mxCell>
<mxCell id="e04" value="异常处理&#10;补收或复测后回 04" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="420" y="465" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="bad-04" value="异常" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="n04" target="e04" />
<mxCell id="back-04" value="处理完成,回本节点复核" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="e04" target="n04" />
<mxCell id="next-04" value="通过" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;strokeColor=#6c8ebf;endArrow=block;html=1;" edge="1" parent="1" source="n04" target="n05" />
<mxCell id="n05" value="05 测量审核&#10;负责人:测量审核员&#10;通过→下一节点&#10;异常:数据或证据存疑" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="60" y="600" width="270" height="90" as="geometry" />
</mxCell>
<mxCell id="e05" value="异常处理&#10;复测补证后回 05;订单门禁回 02" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="420" y="605" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="bad-05" value="异常" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="n05" target="e05" />
<mxCell id="back-05" value="处理完成,回本节点复核" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="e05" target="n05" />
<mxCell id="next-05" value="通过" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;strokeColor=#6c8ebf;endArrow=block;html=1;" edge="1" parent="1" source="n05" target="n06" />
<mxCell id="n06" value="06 入库/库位确认&#10;负责人:国内仓管&#10;通过→下一节点&#10;异常:库位不足/货位不符" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=14;" vertex="1" parent="1">
<mxGeometry x="60" y="740" width="270" height="90" as="geometry" />
</mxCell>
<mxCell id="e06" value="异常处理&#10;落实位置并修正后回 06" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f8cecc;strokeColor=#b85450;fontSize=12;" vertex="1" parent="1">
<mxGeometry x="420" y="745" width="260" height="80" as="geometry" />
</mxCell>
<mxCell id="bad-06" value="异常" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="n06" target="e06" />
<mxCell id="back-06" value="处理完成,回本节点复核" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;dashed=1;strokeColor=#b85450;endArrow=block;html=1;" edge="1" parent="1" source="e06" target="n06" />
</root>
</mxGraphModel>
</diagram>
</mxfile>
@@ -0,0 +1,52 @@
# 头程到尾程流程节点清单
填写规则:`节点|负责人|完成后进入|异常处理后回到`。姓名、时限和凭证由现场补充。
## 主流程
| 编号 | 节点 | 负责人 | 完成后进入 | 异常处理后回到 |
|---|---|---|---|---|
| 01 | 客户下单 | 客户下单员:____ | 02 订单审核 | 资料补正后回 01 |
| 02 | 订单审核 | 订单审核员:____ | 03 拉货/送仓 | 补正后回 02 |
| 03 | 拉货/客户送仓 | 国内提货跟单:____ | 04 到仓收货 | 改约或补交接后回 03 |
| 04 | 到仓收货 | 国内收货员:____ | 05 称重测量 | 差异确认后回 04 |
| 05 | 称重测量 | 国内测量员:____ | 06 测量审核 | 补测补证后回 05 |
| 06 | 测量审核 | 测量审核员:____ | 07 入库/库位 | 数据问题回 05;订单门禁回 02 后再回 06 |
| 07 | 国内入库/库位 | 国内仓管:____ | 08 排柜 | 修正库位后回 07 |
| 08 | 排柜/分柜 | 柜务:____ | 09 订舱/放舱 | 调整计划后回 08 |
| 09 | 订舱/放舱 | 船务:____ | 10 国内拖柜 | 新船期或资料确认后回 09 |
| 10 | 国内拖柜:预约、提柜到仓 | 国内运输跟单:____ | 11 国内拣货 | 改约或补资料后回 10 |
| 11 | 国内拣货 | 国内拣货员:____ | 12 装柜完成 | 补拣或调整后回 11 |
| 12 | 装柜完成 | 国内装柜主管:____ | 13 出口报关 | 调整或补证后回 12 |
| 13 | 出口报关 | 报关专员:____ | 14 国内出仓 | 补正或查验后回 13 |
| 14 | 国内出仓 | 国内出仓员:____ | 15 海运跟踪 | 解除阻断后回 14 |
| 15 | 海运/到港跟踪 | 船务:____ | 16 目的港清关 | 核实船期后回 15 |
| 16 | 目的港清关 | 海外清关专员:____ | 17 海外提柜 | 补件、查验或放行后回 16 |
| 17 | 海外提柜/送仓 | 海外运输跟单:____ | 18 海外拆柜收货 | 改约后回 17 |
| 18 | 海外拆柜收货 | 海外收货员:____ | 19 海外入库 | 短收/超收先待核平,完成后回 19 |
| 19 | 海外入库/库位 | 海外仓管:____ | 20 海外排车 | 满足可用库存条件后回 19 |
| 20 | 海外排车 | 海外调度:____ | 21 转派送、22 拣货 | 调整车辆或预约后回 20 |
| 21 | 转派送/生成待出库单 | 海外调度:____ | 23 发车前复核 | 补齐资料后回 21 |
| 22 | 按排车拣货 | 海外拣货员:____ | 23 发车前复核 | 补拣或库存调整后回 22 |
| 23 | 拣货核平/发车前复核 | 海外仓主管:____ | 24 发车/出库 | 补齐数量、单据、车辆后回 23 |
| 24 | 发车/确认出库 | 海外出库员:____ | 25 派送签收 | 满足发车条件后回 24 |
| 25 | 派送/签收 | 派送运营:____ | 26 整单完结;27 回访 | 拒签/失败:退回恢复库存,后续重新安排 |
| 26 | 整单完结 | 履约运营:____ | 流程结束 | 还有未完成片段时回对应节点 |
| 27 | 客户回访 | 客服:____ | 流程结束 | 投诉或联系不上时由客服继续跟进 |
## 特殊分支
| 分支 | 负责人 | 流程 | 异常回流 |
|---|---|---|---|
| 一件代发国内处理 | 国内清点员/打托员:____ | 06 测量审核 → 拆箱清点 → 归托封托 → 07 入库/库位 → 08 排柜 | 差异回清点;漏清点或未封托回打托 |
| 海外接柜准备 | 海外计划员:____ | 12 装柜完成后提前准备入仓计划、托盘、库位 | 资料或资源缺失回计划准备 |
| 卸柜后还空 | 海外运输跟单:____ | 18 拆柜完成 → 安排还空 | 还空受阻回运输跟单处理 |
| 一件代发海外独立出库 | 一件代发运营:____ | 按独立出库单逐箱或整托拣货 → 复核 → 出库 | 缺货或错 SKU 回海外仓核对;签收和完结规则待确认 |
## 并行关系
- 02 审核与 03 拉货、04 收货、05 测量可以并行;06 测量审核前必须完成 02。
- 08 排柜、09 订舱准备可以并行;10 拖柜预约须等订舱放舱和资料齐备。
- 12 装柜完成后即可准备海外入仓计划,不必等待海运到港。
- 21 转派送可以早于或晚于 22 拣货,但必须早于 24 发车。
- 26 整单完结与 27 客户回访并行,回访不阻断整单完结。
File diff suppressed because one or more lines are too long
+46 -20
View File
@@ -31,13 +31,20 @@
| task_id | parent_task_id | project_id | 展示名称 | 唯一长期职责 | | task_id | parent_task_id | project_id | 展示名称 | 唯一长期职责 |
|---|---|---|---|---| |---|---|---|---|---|
| `01a05b23-bfc6-7121-a6f2-7fc14ee456a3` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程前端】Admin | `apps/admin-web/` 全部平台管理页面、路由、API、权限消费、测试与构建;不修改 Client、PDA、后端或 SQL。 | | `01a05b23-bfc6-7121-a6f2-7fc14ee456a3` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【前端1】admin | `apps/admin-web/` 全部平台管理页面、路由、API、权限消费、测试与构建;不修改 Client、PDA、后端或 SQL。 |
| `01a05b23-c20f-7f52-8a26-543f1563f0f8` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程前端】Client | `apps/client-web/` 全部客户工作台页面、路由、API、权限消费、测试与构建;不修改 Admin、PDA、后端或 SQL。 | | `01a05b23-c20f-7f52-8a26-543f1563f0f8` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【前端2】client | `apps/client-web/` 全部客户工作台页面、路由、API、权限消费、测试与构建;不修改 Admin、PDA、后端或 SQL。 |
| `01a05b78-6e28-7460-babf-3a87331f6dd4` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程前端】海外PDA | `apps/pda-overseas-uniapp/` 全部海外仓现场作业、真实 API、恢复、扫码、幂等、测试与构建;派送仍由 Admin/Client 承载。 | | `01a07fce-5b47-7063-ba0f-52fca32b835c` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【前端3】国内PDA | `apps/pda-uniapp/` 全部国内仓现场作业、真实 API、扫码顺序、草稿恢复、幂等、断网阻断、测试与发布准备;不修改 Admin、Client、海外 PDA、后端或 SQL。 |
| `01a05b23-c5ff-77c3-8f77-ceb4f4c40de2` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程后端】Lastleg | `baiyue-firstleg/lastleg-service/` 海外尾程、入仓、库存、换标、转运、废弃、排车、出库、派送、一件代发、异常、回访及海外业务的接口、OpenAPI、SQL、权限强制和测试。 | | `01a05b78-6e28-7460-babf-3a87331f6dd4` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【前端4】海外PDA | `apps/pda-overseas-uniapp/` 全部海外仓现场作业、真实 API、恢复、扫码、幂等、测试与构建;派送仍由 Admin/Client 承载。 |
| `01a05b23-c7f8-72e0-bb3c-afbbf1c7f9e7` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程后端】IAM权限 | `baiyue-firstleg/iam/` 及必要 common-security 的平台/客户全流程权限资源、角色初始化、授权快照、OpenAPI、SQL 和测试;不修改 Lastleg 业务或前端。 | | `01a07fde-a67c-71c3-add5-968c47b2fe91` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端1】国内仓储 | `baiyue-firstleg/warehouse/` 的仓库主档、供应商、国内整柜、库位、托盘、资源预占、OpenAPI、模块 SQL 与测试;不修改其他服务、前端或统一增量 SQL。 |
| `01a079b6-b279-7aa3-ba2f-6556dbb44790` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程后端】Firstleg头程履约 | `baiyue-firstleg/firstleg/` 国内头程入库、测量、计费、分柜、装柜、PDA 服务端门禁、出仓等 Firstleg 履约接口、DTO、Service、Mapper、模块 OpenAPI、模块 SQL 与测试;不修改 Order、IAM、前端或统一增量 SQL。 | | `01a079b6-b5fa-7fe3-82b5-59c4712a6d4c` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端2】Order订单域 | `baiyue-firstleg/order/` 头程订单主数据、统一订单查询聚合、订单状态与动作、内部 Firstleg 客户端 DTO、Order OpenAPI、模块 SQL 与测试;不修改 Firstleg、身份权限、前端或统一增量 SQL。 |
| `01a079b6-b5fa-7fe3-82b5-59c4712a6d4c` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【开发全流程后端】Order订单域 | `baiyue-firstleg/order/` 头程订单主数据、统一订单查询聚合、订单状态与动作、内部 Firstleg 客户端 DTO、Order OpenAPI、模块 SQL 与测试;不修改 Firstleg、IAM、前端或统一增量 SQL。 | | `01a079b6-b279-7aa3-ba2f-6556dbb44790` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端3】Firstleg头程履约 | `baiyue-firstleg/firstleg/` 国内头程入库、测量、计费、分柜、装柜、PDA 服务端门禁、出仓等 Firstleg 履约接口、DTO、Service、Mapper、模块 OpenAPI、模块 SQL 与测试;不修改 Order、身份权限、前端或统一增量 SQL。 |
| `01a05b23-c7f8-72e0-bb3c-afbbf1c7f9e7` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端4】身份权限 | `baiyue-firstleg/auth/`、`iam/` 及必要 `common-security/` 的账号、Token、客户与成员、RBAC、授权快照、OpenAPI、模块 SQL 和测试;不修改业务服务、前端或统一增量 SQL。 |
| `01a07fde-aa31-7443-b15b-461096aa1edd` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端5】Finance财务 | `baiyue-firstleg/finance/` 的客户资金账户、授信、冻结结算、费用池、应收应付、账单、收付款、核销、OpenAPI、模块 SQL 与测试;不修改业务来源服务、前端或统一增量 SQL。 |
| `01a07fde-ad86-7253-8172-91a5686be994` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端6】File打印审计 | `baiyue-firstleg/file/`、`print/`、`audit-service/` 及必要 `common-audit/` 的文件对象、上传下载、导出、打印、审计、OpenAPI、模块 SQL 与测试;不修改业务服务、前端或统一增量 SQL。 |
| `01a05b23-c5ff-77c3-8f77-ceb4f4c40de2` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端7】Lastleg海外业务 | `baiyue-firstleg/lastleg-service/` 海外尾程、入仓、库存、换标、转运、废弃、排车、出库、派送、一件代发、异常、回访及海外业务的接口、OpenAPI、SQL、权限强制和测试。 |
| `01a07fde-b02c-7d92-b83c-668aa7b37bba` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端8】海外仓储资源 | `baiyue-firstleg/warehouse-overseas-service/` 的海外库位、托盘、资源锁、PDA 物理资源流转、OpenAPI、模块 SQL 与测试;国内仓库主档仍归国内仓储专项。 |
| `01a07fde-b307-7091-be2a-c462ef466182` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端9】国内外网关 | `baiyue-firstleg/gateway/`、`gateway-overseas/`、`overseas-security-service/` 的路由、CORS、JWT/JWKS、可信身份头、失败关闭和测试;账号与权限业务仍归身份权限专项。 |
| `01a07fde-b697-7930-b70e-1ee7887be732` | `01a06c0b-0515-7c60-b329-77342b54e666` | `6f874ec3-d3b2-49bd-8625-327f4d685f98` | 【后端10】集成与跨区事件 | `baiyue-firstleg/integration-service/`、`event-bridge-service/`、`common-event-contract/` 的第三方适配、事件信封、跨区路由、Outbox/Inbox 投递合同与测试;业务服务内生产和消费代码仍归对应业务专项。 |
验收与部署任务不常驻登记。只有用户明确要求开始验收、准备部署或执行验收时,才另行决定是否创建;开发任务不得代行。 验收与部署任务不常驻登记。只有用户明确要求开始验收、准备部署或执行验收时,才另行决定是否创建;开发任务不得代行。
@@ -49,10 +56,10 @@
| 工作包 | 执行任务 | 写入范围 | 交付目标 | 依赖与集成边界 | | 工作包 | 执行任务 | 写入范围 | 交付目标 | 依赖与集成边界 |
|---|---|---|---|---| |---|---|---|---|---|
| `WALLET-BE-FINANCE` | 【开发总控】全流程开发 | `baiyue-firstleg/finance/`、Finance OpenAPI、模块 SQL 与统一增量 SQL、必要 Finance/File 内部客户端 | 新增客户资金账户、充值申请、授信额度、资金冻结和流水主账;提供客户账户/流水/充值申请接口及平台账户列表/详情、待审充值、审核、手工充值/扣款/授信接口,并提供业务模块使用的冻结、结算和释放内部接口;实现客户隔离、金额校验、权限、服务令牌、幂等、乐观并发与测试 | Finance 拥有余额、授信、冻结和流水;扣款先使用实际资金再使用授信,充值先归还已用授信;付款截图经 Finance 调用 File 内部 `FINANCE_VOUCHER` 保存;不接第三方支付回调,具体一件代发业务调用后续接线 | | `WALLET-BE-FINANCE` | 【后端5】Finance财务 | `baiyue-firstleg/finance/`、Finance OpenAPI、模块 SQL 与必要 Finance/File 内部客户端 | 新增客户资金账户、充值申请、授信额度、资金冻结和流水主账;提供客户账户/流水/充值申请接口及平台账户列表/详情、待审充值、审核、手工充值/扣款/授信接口,并提供业务模块使用的冻结、结算和释放内部接口;实现客户隔离、金额校验、权限、服务令牌、幂等、乐观并发与测试 | Finance 拥有余额、授信、冻结和流水;扣款先使用实际资金再使用授信,充值先归还已用授信;付款截图经 Finance 调用 File 内部 `FINANCE_VOUCHER` 保存;不接第三方支付回调,统一增量 SQL 仍由总控集成 |
| `WALLET-FE-CLIENT` | 【开发全流程前端】Client | `apps/client-web/src/modules/finance/` 及该模块路由、导航和测试 | 新增客户资金账户页,显示实际/冻结/可用余额和流水;按原型完成金额选择、微信/支付宝静态二维码、付款截图上传、提交待审核及状态反馈 | 客户范围只取登录态;只调用 `/api/client/finance/v1/**`,无二维码配置时明确不可提交,不模拟支付成功 | | `WALLET-FE-CLIENT` | 【前端2】client | `apps/client-web/src/modules/finance/` 及该模块路由、导航和测试 | 新增客户资金账户页,显示实际/冻结/可用余额和流水;按原型完成金额选择、微信/支付宝静态二维码、付款截图上传、提交待审核及状态反馈 | 客户范围只取登录态;只调用 `/api/client/finance/v1/**`,无二维码配置时明确不可提交,不模拟支付成功 |
| `WALLET-FE-ADMIN` | 【开发全流程前端】Admin | `apps/admin-web/src/modules/finance/` 及对应测试 | 将客户账户页收敛为三余额账户;详情中待审核客户充值置顶并提供审核,保留流水;列表/详情提供手工充值和手工扣款,操作列固定首列 | 只消费 Finance 正式 API;审核、充值、扣款分别受写权限控制;不在前端计算或兜底余额 | | `WALLET-FE-ADMIN` | 【前端1】admin | `apps/admin-web/src/modules/finance/` 及对应测试 | 将客户账户页收敛为三余额账户;详情中待审核客户充值置顶并提供审核,保留流水;列表/详情提供手工充值和手工扣款,操作列固定首列 | 只消费 Finance 正式 API;审核、充值、扣款分别受写权限控制;不在前端计算或兜底余额 |
| `WALLET-BE-IAM` | 【开发全流程后端】IAM权限 | `baiyue-firstleg/iam/` 及必要权限初始化 SQL、OpenAPI 和测试 | 新增并初始化客户账户查看/充值申请和平台充值审核/账户调账权限,保持列表只读与写操作分离 | 企业负责人默认获得客户账户查看和充值申请权限;平台财务角色按现有初始化规则获得审核与调账权限,不修改 Finance 业务 | | `WALLET-BE-IAM` | 【后端4】身份权限 | `baiyue-firstleg/iam/` 及必要权限初始化 SQL、OpenAPI 和测试 | 新增并初始化客户账户查看/充值申请和平台充值审核/账户调账权限,保持列表只读与写操作分离 | 企业负责人默认获得客户账户查看和充值申请权限;平台财务角色按现有初始化规则获得审核与调账权限,不修改 Finance 业务 |
完成门禁:Finance、IAM 定向测试通过,Admin/Client 定向测试、类型检查和生产构建通过,跨端 DTO 与权限码一致;专项不提交、不推送、不部署、不操作数据库或真实 HTTP,由开发总控统一集成后再进入开发环境部署与验收。 完成门禁:Finance、IAM 定向测试通过,Admin/Client 定向测试、类型检查和生产构建通过,跨端 DTO 与权限码一致;专项不提交、不推送、不部署、不操作数据库或真实 HTTP,由开发总控统一集成后再进入开发环境部署与验收。
@@ -73,10 +80,10 @@
| 工作包 | 执行任务 | 写入范围 | 交付目标 | 依赖与集成边界 | | 工作包 | 执行任务 | 写入范围 | 交付目标 | 依赖与集成边界 |
|---|---|---|---|---| |---|---|---|---|---|
| `P0-BE-LASTLEG` | 【开发全流程后端】Lastleg | `baiyue-firstleg/lastleg-service/` | 补齐客户海外采购、本土卡、本土散板、海外入库订单所需客户 API;核对并补齐 PDA 盘点、移库、换标、库存/库位/托盘查询专用 API、OpenAPI 与测试 | 先冻结 DTO、权限码和状态机并通知 Client、海外 PDA、IAM;不修改 `iam/`、统一 SQL或前端 | | `P0-BE-LASTLEG` | 【后端7】Lastleg海外业务 | `baiyue-firstleg/lastleg-service/` | 补齐客户海外采购、本土卡、本土散板、海外入库订单所需客户 API;核对并补齐 PDA 盘点、移库、换标、库存/库位/托盘查询专用 API、OpenAPI 与测试 | 先冻结 DTO、权限码和状态机并通知 Client、海外 PDA、IAM;不修改 `iam/`、统一 SQL或前端 |
| `P0-BE-IAM` | 【开发全流程后端】IAM权限 | `baiyue-firstleg/iam/` 及必要 `common-security/` | 补齐并核对客户海外业务、海外入库查询和海外 PDA 现场作业的权限资源、角色初始化、OpenAPI 与模块 SQL | 消费 Lastleg 冻结的权限码;不修改 Lastleg、统一 SQL或前端 | | `P0-BE-IAM` | 【后端4】身份权限 | `baiyue-firstleg/iam/` 及必要 `common-security/` | 补齐并核对客户海外业务、海外入库查询和海外 PDA 现场作业的权限资源、角色初始化、OpenAPI 与模块 SQL | 消费 Lastleg 冻结的权限码;不修改 Lastleg、统一 SQL或前端 |
| `P0-FE-CLIENT` | 【开发全流程前端】Client | `apps/client-web/` | 将海外采购、美国本土卡、美本土散板和海外入库订单从占位收敛为真实页面;修正首页快捷入口;覆盖权限、加载、空态、错误态、幂等与测试 | 只消费客户正式 API,不调用平台/内部接口,不模拟成功;“我的订单”统一查询不在本批 | | `P0-FE-CLIENT` | 【前端2】client | `apps/client-web/` | 将海外采购、美国本土卡、美本土散板和海外入库订单从占位收敛为真实页面;修正首页快捷入口;覆盖权限、加载、空态、错误态、幂等与测试 | 只消费客户正式 API,不调用平台/内部接口,不模拟成功;“我的订单”统一查询不在本批 |
| `P0-FE-OVERSEAS-PDA` | 【开发全流程前端】海外PDA | `apps/pda-overseas-uniapp/` | 接通库存盘点、商品移库、换标收货/执行/复核、库存/库位/托盘查询共 8 项现场能力,完成扫码、恢复、并发冲突、幂等、错误态和构建测试 | 只调用 `/api/pda/**` 正式接口;不得通过 `available: true` 掩盖未接通能力,不改后端或其他前端 | | `P0-FE-OVERSEAS-PDA` | 【前端4】海外PDA | `apps/pda-overseas-uniapp/` | 接通库存盘点、商品移库、换标收货/执行/复核、库存/库位/托盘查询共 8 项现场能力,完成扫码、恢复、并发冲突、幂等、错误态和构建测试 | 只调用 `/api/pda/**` 正式接口;不得通过 `available: true` 掩盖未接通能力,不改后端或其他前端 |
完成门禁:四包定向测试与构建通过,跨端契约一致,所有 P0 页面或 PDA 入口均不再是 `prototype`、`available: false` 或模拟成功。专项本批不提交、不推送、不部署、不执行数据库和真实 HTTP;总控汇总差异并处理现有文档改动后,再按各仓库最新测试分支同步门禁统一集成。 完成门禁:四包定向测试与构建通过,跨端契约一致,所有 P0 页面或 PDA 入口均不再是 `prototype`、`available: false` 或模拟成功。专项本批不提交、不推送、不部署、不执行数据库和真实 HTTP;总控汇总差异并处理现有文档改动后,再按各仓库最新测试分支同步门禁统一集成。
@@ -145,10 +152,29 @@
| 工作包 | 执行任务 | 写入范围 | 交付目标 | 依赖与集成边界 | | 工作包 | 执行任务 | 写入范围 | 交付目标 | 依赖与集成边界 |
|---|---|---|---|---| |---|---|---|---|---|
| `HOLD-BE-FIRSTLEG` | 【开发全流程后端】Firstleg头程履约 | `baiyue-firstleg/firstleg/` 的扣货命令、历史查询、履约门禁、模块 OpenAPI、模块 SQL 与测试 | 提供扣货/解除扣货接口,落实客户归属、独立权限、幂等、乐观并发、不可变历史和实物作业前置门禁;所有下游履约写入口按服务端权威扣货状态失败关闭 | 先冻结平台接口及内部统一订单 DTO 字段并通知 Order、Admin;不修改 Order、IAM、前端或统一增量 SQL | | `HOLD-BE-FIRSTLEG` | 【后端3】Firstleg头程履约 | `baiyue-firstleg/firstleg/` 的扣货命令、历史查询、履约门禁、模块 OpenAPI、模块 SQL 与测试 | 提供扣货/解除扣货接口,落实客户归属、独立权限、幂等、乐观并发、不可变历史和实物作业前置门禁;所有下游履约写入口按服务端权威扣货状态失败关闭 | 先冻结平台接口及内部统一订单 DTO 字段并通知 Order、Admin;不修改 Order、IAM、前端或统一增量 SQL |
| `HOLD-BE-ORDER` | 【开发全流程后端】Order订单域 | `baiyue-firstleg/order/` 的 Firstleg 内部客户端 DTO、统一订单响应、Order OpenAPI 与测试 | 将 Firstleg `holdFlag/currentHoldReason` 透传到统一订单列表/详情,删除未落地的旧字段语义,不复制扣货状态机 | 只消费 Firstleg 冻结 DTO;不提供扣货写接口,不修改 Firstleg、IAM、前端或统一增量 SQL | | `HOLD-BE-ORDER` | 【后端2】Order订单域 | `baiyue-firstleg/order/` 的 Firstleg 内部客户端 DTO、统一订单响应、Order OpenAPI 与测试 | 将 Firstleg `holdFlag/currentHoldReason` 透传到统一订单列表/详情,删除未落地的旧字段语义,不复制扣货状态机 | 只消费 Firstleg 冻结 DTO;不提供扣货写接口,不修改 Firstleg、IAM、前端或统一增量 SQL |
| `HOLD-FE-ADMIN` | 【开发全流程前端】Admin | `apps/admin-web/src/modules/unified-orders/`、必要 `modules/inbounds/` API 暴露与对应测试 | 在订单详情“其他”页签增加独立扣货控制、状态标识、原因/凭证弹窗和历史展示;尚未生成入库单或无权限时只读;成功后刷新详情与列表 | 快递信息、内部备注、箱子计费不并入扣货统一提交;只消费正式 Firstleg/Order API,不在前端推导可扣货状态 | | `HOLD-FE-ADMIN` | 【前端1】admin | `apps/admin-web/src/modules/unified-orders/`、必要 `modules/inbounds/` API 暴露与对应测试 | 在订单详情“其他”页签增加独立扣货控制、状态标识、原因/凭证弹窗和历史展示;尚未生成入库单或无权限时只读;成功后刷新详情与列表 | 快递信息、内部备注、箱子计费不并入扣货统一提交;只消费正式 Firstleg/Order API,不在前端推导可扣货状态 |
| `HOLD-BE-IAM` | 【开发全流程后端】IAM权限 | `baiyue-firstleg/iam/` 的权限资源、默认角色授权、模块 OpenAPI、模块 SQL 与测试 | 新增 `platform:firstleg:inbound:hold` 独立写权限并按现有平台管理员规则初始化;保持查看权限与扣货写权限分离 | 不修改 Firstleg、Order、统一增量 SQL或前端;权限码冻结后通知 Firstleg、Admin | | `HOLD-BE-IAM` | 【后端4】身份权限 | `baiyue-firstleg/iam/` 的权限资源、默认角色授权、模块 OpenAPI、模块 SQL 与测试 | 新增 `platform:firstleg:inbound:hold` 独立写权限并按现有平台管理员规则初始化;保持查看权限与扣货写权限分离 | 不修改 Firstleg、Order、统一增量 SQL或前端;权限码冻结后通知 Firstleg、Admin |
| `HOLD-BE-FILE` | 【开发总控】全流程开发 | `baiyue-firstleg/file/` 的通用业务文件类别与测试、Firstleg 专用文件客户端和归属校验 | 提供客户作用域的扣货凭证上传、精确引用校验和已关联凭证下载,拒绝跨客户、跨入库单及未进入历史的文件 | File 只保存文件与精确归属,不读取 Firstleg 业务表;凭证可见性和不可变历史仍由 Firstleg 决定 | | `HOLD-BE-FILE` | 【后端6】File打印审计 | `baiyue-firstleg/file/` 的通用业务文件类别与测试;Firstleg 专用文件客户端由【后端3】Firstleg头程履约负责 | 提供客户作用域的扣货凭证上传、精确引用校验和已关联凭证下载,拒绝跨客户、跨入库单及未进入历史的文件 | File 只保存文件与精确归属,不读取 Firstleg 业务表;凭证可见性和不可变历史仍由 Firstleg 决定 |
完成门禁:Firstleg、Order、IAM 定向测试通过,Mapper 与模块 SQL/OpenAPI 合同通过,Admin 定向测试、类型检查和生产构建通过;开发总控统一维护业务契约与统一增量 SQL、执行跨端 DTO/权限核对和 Git 集成。当前各仓库在本批下发前由开发总控恢复到 `dev`,按登记门禁获取并合并最新测试分支;专项不自行切换分支,不提交、不推送、不部署、不操作数据库或真实 HTTP。本批代码门禁完成后再单独决定开发数据库、Jenkins 开发部署与真实 HTTP/1920×1080 人工验收。 完成门禁:Firstleg、Order、IAM 定向测试通过,Mapper 与模块 SQL/OpenAPI 合同通过,Admin 定向测试、类型检查和生产构建通过;开发总控统一维护业务契约与统一增量 SQL、执行跨端 DTO/权限核对和 Git 集成。当前各仓库在本批下发前由开发总控恢复到 `dev`,按登记门禁获取并合并最新测试分支;专项不自行切换分支,不提交、不推送、不部署、不操作数据库或真实 HTTP。本批代码门禁完成后再单独决定开发数据库、Jenkins 开发部署与真实 HTTP/1920×1080 人工验收。
## 当前节点:一件代发国内清点组托与整托分柜(2026-09-08)
### 临时梳理会话说明(2026-09-08)
开发环境登记核对和一件代发全流程梳理属于一次性治理、分析会话,不登记为长期前端或后端专项,也不占用正式编号;工作结论进入本表后归档。长期工作只向上方正式登记的总控、4 个前端专项和 10 个后端专项下发。
本节点由【开发总控】全流程开发负责节点总控。客户一件代发订单继续经过审核、测量和计费;测量审核后进入国内 PDA 拆箱清点与组托。箱码与系统托盘码允许任意先后顺序扫描:先扫托盘时后续箱子进入当前托盘,先扫箱时箱子进入已清点待绑托区,后扫托盘再批量绑定。合理作业顺序不得被拦截,但封托和进入 `WAIT_SPLIT` 前必须保证箱码唯一归托、托盘码有效唯一、清点差异有结果且不存在未绑定箱。智能分柜和装柜以已封托托盘为最小不可拆单元,不再按一件代发入仓单箱数任意拆分,也不在装柜阶段重新打托。
| 工作包 | 执行任务 | 写入范围 | 交付目标 | 依赖与集成边界 |
|---|---|---|---|---|
| `DROPSHIP-BE-FIRSTLEG` | 【后端3】Firstleg头程履约 | `baiyue-firstleg/firstleg/` | 收敛清点、待绑托、托盘绑定、封托、`WAIT_PALLETIZE → WAIT_SPLIT`、托盘维度智能分柜、整托装柜与事件快照;同步 DTO、Controller、Mapper、模块 OpenAPI/SQL 和测试 | 先冻结箱、SKU实收、托盘和装柜计划契约;不修改前端、Order、IAM或统一增量 SQL |
| `DROPSHIP-FE-DOMESTIC-PDA` | 【前端3】国内PDA | `apps/pda-uniapp/` | 新增一件代发任务、逐箱清点、两种扫码顺序、待绑托箱、换托/撤销、封托及整托装柜交互;覆盖硬件广播、草稿、幂等、断网和测试 | 只消费 Firstleg 冻结 API;不模拟成功,不修改后端或其他前端 |
| `DROPSHIP-FE-ADMIN` | 【前端1】admin | `apps/admin-web/src/modules/inbounds/`、`apps/admin-web/src/modules/container-loading/`、`apps/admin-web/src/modules/loading-lists/` 及对应测试 | 入库详情展示权威清点/托盘结果;智能分柜按整托展示、加入和移除;预装与正式装柜详情继续展示封托托盘快照;一件代发不提供箱数拆分输入 | 只消费 Firstleg 正式 DTO;普通头程现有箱数分配行为保持不变 |
| `DROPSHIP-FE-CLIENT` | 【前端2】client | `apps/client-web/src/modules/first-leg/` 及对应测试 | 按逐步确认的 Client 原型补齐一件代发下单字段、回显和客户可见状态 | 只消费正式 Order/Firstleg 客户契约,不暴露平台或 PDA 内部操作 |
| `DROPSHIP-BE-ORDER` | 【后端2】Order订单域 | `baiyue-firstleg/order/` | 按需冻结并透传一件代发货物、SKU、箱明细和订单状态,不复制 Firstleg 清点/托盘状态机 | 仅在 Firstleg 冻结跨服务 DTO 后启动 |
| `DROPSHIP-BE-IAM` | 【后端4】身份权限 | `baiyue-firstleg/iam/` 及必要 `common-security/` | 按需补齐国内 PDA 清点、组托和整托装柜权限及默认仓库角色授权 | 权限码由 Firstleg 先冻结;不修改业务服务或前端 |
完成门禁:各专项先完成定向测试、类型检查或构建,开发总控统一处理共享文档、统一增量 SQL、Git 集成和提交。代码门禁通过后,本节点已获授权操作开发数据库、使用 Jenkins 部署开发环境、执行开发环境真实 HTTP,并使用内置浏览器按 Admin/Client `1920×1080`、国内/海外 PDA `390×848` 验收样式、交互、控制台与请求量;环境配置只从 `C:\Users\BY-OY\.codex\env\chongchong-global` 读取,不把密钥、Token或环境地址写入源码和指引。发现问题后回到对应唯一写入专项修复并重复验证,直至节点全部门禁通过;授权不扩展到测试或生产环境,不包含数据库清空、重建或无主键批量删除。
+1 -1
View File
@@ -22,7 +22,7 @@
| 海外仓 PDA 库内、托盘、换标与查询 | Lastleg 提供盘点、同仓整托移库、托盘组拆换绑、换标和库存/库位/托盘查询能力;当前终端入口按工作台能力开关启用,未进入 PDA 的操作由 Admin/Client 正式页面承载 | Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/pda/stocktake/`、`pda/move/`、`pda/warehouse/`、`palletops/`、`relabel/pda/`;契约 `src/main/resources/openapi/overseas-pda-operations-v1.yaml` | | 海外仓 PDA 库内、托盘、换标与查询 | Lastleg 提供盘点、同仓整托移库、托盘组拆换绑、换标和库存/库位/托盘查询能力;当前终端入口按工作台能力开关启用,未进入 PDA 的操作由 Admin/Client 正式页面承载 | Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/pda/stocktake/`、`pda/move/`、`pda/warehouse/`、`palletops/`、`relabel/pda/`;契约 `src/main/resources/openapi/overseas-pda-operations-v1.yaml` |
| 海外仓出库与派送 | 排车编辑/取消、PDA 排车拣货、出库任务、发车门禁、转派送、客户派送单和派送完成 | Admin `../../apps/admin-web/src/modules/overseas-warehouse/`;Overseas PDA `../../apps/pda-overseas-uniapp/src/pages/dispatch/`、`src/pages/outbound/`;Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/`、`delivery/` | | 海外仓出库与派送 | 排车编辑/取消、PDA 排车拣货、出库任务、发车门禁、转派送、客户派送单和派送完成 | Admin `../../apps/admin-web/src/modules/overseas-warehouse/`;Overseas PDA `../../apps/pda-overseas-uniapp/src/pages/dispatch/`、`src/pages/outbound/`;Backend `../../baiyue-firstleg/lastleg-service/src/main/java/com/baiyue/lastleg/dispatch/`、`delivery/` |
| 异常退回与客户回访 | 异常建档、派送退回入仓、派送状态、签收/回访附件和客户回访 | Admin `ExceptionOrdersView.vue`、`CustomerVisitsView.vue`;Backend `exceptionorder/`、`customervisit/` | | 异常退回与客户回访 | 异常建档、派送退回入仓、派送状态、签收/回访附件和客户回访 | Admin `ExceptionOrdersView.vue`、`CustomerVisitsView.vue`;Backend `exceptionorder/`、`customervisit/` |
| 一件代发 | 国内订单强制 SKU 快照、装柜工作托盘、海外 SKU/箱唛库存和一件代发出库 | Backend `order/`、`firstleg/`、`lastleg-service/dropship/`;跨区事件见 `common-event-contract/` | | 一件代发 | 国内订单强制 SKU 与每箱数量快照、逐箱清点组托、`SEALED` 整托分柜、海外 SKU/箱唛库存和一件代发出库 | Backend `order/`、`firstleg/`、`lastleg-service/dropship/`;跨区事件见 `common-event-contract/` |
| 海外业务 | 本土散板、采购订单、本土卡车;Admin 入口 `../../apps/admin-web/src/modules/overseas-business/` | 原型 `../悦/货代SAAS平台后台/prototype-src/modules/07-overseas-business.html`;Backend `../../baiyue-firstleg/lastleg-service/` 的 `procurement/`、`trucking/` 及后续本土散板子域 | | 海外业务 | 本土散板、采购订单、本土卡车;Admin 入口 `../../apps/admin-web/src/modules/overseas-business/` | 原型 `../悦/货代SAAS平台后台/prototype-src/modules/07-overseas-business.html`;Backend `../../baiyue-firstleg/lastleg-service/` 的 `procurement/`、`trucking/` 及后续本土散板子域 |
| 仓库主数据与海外资源 | 仓库 ID、类型、状态、地址、能力统一由国内仓库主数据维护;海外服务只维护库位、托盘和资源锁 | Admin `../../apps/admin-web/src/modules/warehouses/`;国内权威 `../../baiyue-firstleg/warehouse/`;海外资源 `../../baiyue-firstleg/warehouse-overseas-service/` | | 仓库主数据与海外资源 | 仓库 ID、类型、状态、地址、能力统一由国内仓库主数据维护;海外服务只维护库位、托盘和资源锁 | Admin `../../apps/admin-web/src/modules/warehouses/`;国内权威 `../../baiyue-firstleg/warehouse/`;海外资源 `../../baiyue-firstleg/warehouse-overseas-service/` |
| 通用资料 | 海外仓报价、汇率管理、车辆列表;Admin 入口 `../../apps/admin-web/src/modules/overseas-master-data/` | `../悦/货代SAAS平台后台/prototype-src/modules/10-general.html` | | 通用资料 | 海外仓报价、汇率管理、车辆列表;Admin 入口 `../../apps/admin-web/src/modules/overseas-master-data/` | `../悦/货代SAAS平台后台/prototype-src/modules/10-general.html` |
@@ -0,0 +1,253 @@
# 海外仓库位与 A0 溢出位补齐方案(评审稿)
## 1. 目的与范围
当前海外仓可以完成接柜、收货、组托和库存入账,但尚未形成与国内仓一致的“库位—托盘—库存”闭环。本方案只讨论海外仓库位、托盘位置、A0 共享溢出位及入库后的上架/移库,不扩展海外仓主档、客户自助仓储服务或新的库存业务模型。
## 2. 当前实现与缺口
### 已有能力
- `warehouse-overseas-service` 已拥有海外库位、托盘、资源锁和托盘物理流转能力。
- 海外入库计划托盘已保存 `warehousePalletId`、`warehouseLocationId` 和资源锁。
- PDA 入库库存落账会读取托盘库位,并写入库存 position 的库位 ID/编码。
- Lastleg 已有 PDA 商品移库能力,且海外 PDA 已有移库页面和路由。
- 海外资源服务已经有平台库位 CRUD:`/api/platform/v1/warehouse-admin/{warehouseId}/locations`;缺的是 Admin 正式海外库位页面和完整业务接入。
### 主要缺口
- 真实库位分配通常没有进入入库业务,托盘会落到虚拟收货位。
- 海外库位没有国内仓已有的 A0 共享溢出语义。
- `wh_location` 没有 `shared_overflow` 标识,普通位和 A0 的并发占用规则未建立。
- Admin 现有 `/platform/v1/locations` 是国内仓页面接口,不能作为海外库位接口复用。
- 海外入库详情不展示当前库位,也没有平台移库入口。
### 2.1 评审发现的实现偏差
- 当前资源服务、资源锁和托盘流转代码只把 `VIRTUAL` 当作非独占库位;仅增加 `shared_overflow` 字段不会让 A0 生效,`reserve/release/scrap/transition/resolve/reservationBlockReason` 以及 PDA 库位查询都必须改用统一的“非独占库位”判定。
- 当前柜级转换会调用 `ensurePalletBatch` 并把返回的 `locationId` 写入入库计划托盘。新建托盘通常得到虚拟位,但复用已有托盘时可能已经带有普通位。因此“转换阶段不锁普通位”只对新建资源成立,复用托盘的行为必须在接口契约中明确,不能把所有转换都描述成虚拟位。
- 当前 PDA 移库把 `PROCESSING` 记录、远程物理变更和本地库存更新放在同一个 Lastleg 事务中。远程成功而本地失败时,`PROCESSING` 记录也会回滚,现有实现不具备方案中所称的可重放 Saga;必须先补持久化命令/Outbox 或独立事务状态机。
- 当前 `locationType` 仍允许任意字符串,现有测试和数据使用过 `STORAGE`。本方案采用 `NORMAL` 后,需在最新基线中直接收敛并同步 OpenAPI、Fixture 和测试,不保留 `STORAGE` 的双重语义。
## 3. 目标规则
### 3.1 库位类型
- `VIRTUAL`:虚拟收货位,仅用于收货阶段临时承载。
- `NORMAL`:普通库位,例如货架位、地面位,默认一托一位。
- `SHARED_OVERFLOW`:系统共享溢出位 A0,每个海外仓默认一个。
- `UNKNOWN`:仅用于发现历史缺失或不一致时的诊断返回,不是可创建或可移动到的库位类型。
### 3.2 A0 规则
1. 普通库位有可用位置时优先使用普通库位。
2. 普通位候选竞争失败且现场确认后,托盘进入同仓 A0。
3. A0 可同时承载多个托盘,但每个托盘必须有独立 `resourceLockId` 和 `reservation_key`。
4. A0 是系统保留编码,不可由后台编辑、停用或删除。
5. A0 中的单个托盘可以换绑到普通库位,不影响 A0 中其他托盘。
6. A0 是合法的实际落位,不等于未上架;只有虚拟收货位是 `putawayStatus=PENDING`。
### 3.3 库位状态矩阵(必须固定)
| 库位 | `locationType` | `shared_overflow` | `status` | 占用事实 |
|---|---|---:|---|---|
| 虚拟收货位 | `VIRTUAL` | 0 | 永远 `ACTIVE` | 不以库位状态计数,按托盘和资源锁区分 |
| 普通库位 | `NORMAL` | 0 | 空闲 `IDLE`、占用 `OCCUPIED` | 一个活动托盘;由服务端 CAS/占用事实保证唯一 |
| A0 | `SHARED_OVERFLOW` | 1 | 永远 `ACTIVE` | 多个活动托盘;按托盘、资源锁和 reservation key 区分 |
`locationType` 与 `shared_overflow` 不得出现不一致组合;不一致时查询、预留和流转均失败关闭。A0 不得通过把库位状态改成 `OCCUPIED` 表示“已占用”,否则第二个托盘会被错误拒绝或释放掉其他托盘。普通位才允许使用 `IDLE/OCCUPIED` 的库位状态机。
### 3.4 分配与物理落位必须分离
服务端可以返回普通位优先、A0 兜底的候选目标,但候选不是实物已落位。只有“扫描托盘 + 扫描目标库位”的物理变更成功,并且托盘、资源锁、库存位置和操作记录同步成功后,才把该托盘视为已上架。普通位没有候选时可以返回 A0 候选;第一期不得在没有现场确认的情况下把库存自动改写为 A0,避免把虚拟收货位误报成实际库位。
普通位候选必须由服务端选择,至少按 `warehouse_id`、启用状态、库位类型和确定排序(建议 `zone_code、location_code、id`)返回建议;候选读取本身不占用库位,最终上架/移库命令锁定目标并执行 CAS。竞争失败后重选,重选仍无普通位才返回 A0。前端提交的 `locationId` 只能作为扫描结果,不能绕过候选和同仓校验。若未来需要提前占位,必须另建带命令 ID 和 TTL 的预留表,不能提前把普通位改成 `OCCUPIED`。
最终命令仍需在服务端复验“普通位优先”:普通位仍有可用位时,直接提交 A0 必须返回稳定阻断原因;若业务确需越过普通位,只能使用独立的 overflow override 权限并要求填写原因,不能由前端隐藏候选来代替门禁。
### 3.5 分配时机
入库计划转换阶段对新建托盘继续使用虚拟收货位,不提前锁死未来数日可能需要的普通位;复用已有真实托盘时必须保留其真实当前库位并在返回中标明“已有落位”。收货完成后由正式上架命令返回候选,现场确认后再按“普通位优先、A0 兜底”提交真实位置。
平台海外实物资源的虚拟位也统一使用 `customer_id=0`。历史上按客户作用域创建的虚拟位不得继续生成新资源;迁移后若仍被引用,先完成资源锁和托盘归属收口,再允许进入新流程,不能让公共 resolve 因作用域不同找不到位置。
## 4. 目标流程
```text
柜到仓 / PDA 签收
↓
拆柜收货、扫描箱码、组托
↓
托盘暂在虚拟收货位
↓
库存入账
↓
服务端返回普通位候选;无可用普通位时返回 A0 候选
↓
扫描托盘 + 扫描目标库位完成上架/移库
↓
更新托盘、资源锁、库存 position 和移库流水
↓
必要时将 A0 托盘换绑到普通库位
```
复用已有 `NORMAL` 或 A0 实际托盘时,不再经过“虚拟位→候选”分支:库存入账直接沿用当前位置并标记该托盘 `putawayStatus=COMPLETED`;只有当前位为 `VIRTUAL` 且状态为 `PENDING` 的托盘才进入上架候选。
## 5. 改造范围
### 5.1 `warehouse-overseas-service`
#### 数据库
在 `wh_location` 增加:
```sql
shared_overflow TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否为系统共享溢出位A0'
```
字段本身不构成完整约束。A0 必须使用公共资源作用域 `customer_id=0`、固定库位码 `A0`、固定分区 `OVERFLOW`、`location_type=SHARED_OVERFLOW`、`shared_overflow=1`、`status=ACTIVE`;客户端不能提交或覆盖这些值。每个海外仓只能存在一个 A0,A0 的 ID 和编码永久稳定。`max_load_kg` 固定使用 `999999999.000` 哨兵值并在页面显示“不参与容量判定”,候选逻辑不得读取该值。懒创建必须在国内仓目录确认 `OVERSEAS + ACTIVE + RECEIVING` 后执行,并用固定编码唯一键加并发锁保证幂等;编码冲突、重复 A0、仓库失效或目录不可用均失败关闭。
A0 的懒创建只由候选命令(使用写语义)或正式落位命令触发;普通列表 GET 不产生写副作用。初始化失败必须返回明确的 `A0_NOT_READY`/`A0_CONFLICT` 阻断原因,不得静默把托盘留在一个不存在的 A0。
同时补齐:
- 按 `warehouseId` 懒创建且幂等的 A0;
- A0 编码冲突、仓库失效、并发创建的失败规则;
- 普通库位活动占用唯一约束;
- A0 允许多托盘共享但按托盘锁区分;
- 按 `resourceLockId/reservationKey` 单独释放;
- 基线 SQL、增量 SQL、中文字段注释和 schema 合同测试。
不能只增加 `shared_overflow` 字段:现有资源服务大量以 `locationType=VIRTUAL` 判断非独占位置,需要统一改为“虚拟位或 A0 均为非独占位置”,覆盖 reserve、release、scrap、transition、resolve、reservationBlockReason 和状态校验。A0 的 `status` 永远保持 `ACTIVE`,任何托盘进入或离开 A0 都不能修改 A0 的状态;普通位才执行 `IDLE/OCCUPIED` CAS。
当前 `wh_resource_lock` 的真实字段名是 `reservation_key`,不是 `reservationId`。它可以作为托盘级锁基础,但必须明确 `location_id` 的语义:本方案将其定义为当前物理库位,并要求移库时与 `wh_pallet.location_id` 在资源服务内原子更新;`wh_pallet_batch_item.location_id` 改为 `reserved_location_id` 快照,不再被当作当前库位。普通位唯一占用必须通过占用事实表,或带 `shared_overflow` 快照的生成列/唯一索引明确保证,不能只依赖查询后再写入。A0 的多托盘释放、报废必须按托盘和 reservation key 精确匹配,不能释放整个位。
建议复用国内仓二期的模式:保存共享标识快照,普通位用条件唯一约束保证一个活动托盘,A0 不写独占占用状态;海外实现仍以本服务的 `wh_` 表和内部接口为准,不跨库复制仓库主档。
库位解析、批量托盘响应、Lastleg Gateway、PDA/Admin DTO 和 OpenAPI 必须贯穿返回 `zoneCode`、`locationType`、`sharedOverflow`、`status`、`version`;批量转换不能只返回 `locationId`,还要让 Lastleg 区分新建虚拟位与复用的真实落位。
#### 接口边界
已有资源 CRUD 继续使用:
```text
/api/platform/v1/warehouse-admin/{warehouseId}/locations
```
该服务负责库位、托盘资源和内部物理位置变更;不负责更新 Lastleg 库存或入库业务。资源服务的物理变更必须同时更新 `wh_pallet`、活动资源锁、普通位占用事实和 `wh_pallet_operation`;Lastleg 只在远程成功后更新自己的库存和业务快照,不能直接写 `wh_` 表。
### 5.2 `lastleg-service`
- 增加或扩展平台移库命令,Admin 不直接调用 PDA 权限接口。
- 入库计划/托盘 DTO 增加库位编码、库位类型、`sharedOverflow`、库位状态和上架状态。
- 增加服务端库位候选查询和同仓校验,前端不能任意提交 `locationId`。
- 资源 Gateway 的 `locationId` 使用可空类型兼容历史无库位托盘;库位返回必须显式携带 `sharedOverflow`、`locationType` 和 `status`,调用方不得猜测 A0 语义。
- 复用 `ll_pda_inventory_move` 作为平台/PDA 共用移库命令记录,扩展 `PREPARED/REMOTE_APPLIED/LOCAL_COMMITTED/COMPENSATION_REQUIRED`、租约和远端 operation 快照;平台与 PDA 使用不同的操作人/幂等键命名空间。
- 移库时同步更新 `ll_inventory_position`;计划托盘的 `warehouse_location_id` 只作为当前值冗余字段并在成功移库后同步,`wh_pallet_batch_item.location_id` 改名为 `reserved_location_id` 历史快照,收货凭证和库存流水中的位置只读不可变。
- `wh_resource_lock.location_id` 定义为当前物理库位;普通位、A0、虚拟位换绑都必须与 `wh_pallet.location_id` 在资源服务同一事务内更新。任何锁、托盘、库存 position 或计划当前字段不一致时,新的移库、排车和出库均失败关闭并进入对账队列。
- 合托按实物托盘级移动,同一托盘内多个入仓单的库存明细一起移动;不得只移动某个客户或某条库存 position。若要部分移动,先使用既有拆托/换绑能力形成新实物托盘,再执行整托移库。
- 移库前锁定同仓该托盘全部库存 position,要求所有 position 的库位一致,保持 `available/hold/allocated/picked/receiving` 数量桶、客户集合和托盘号不变,并写零差额库存流水。正在收货、拣货、出库、换标冻结或存在未完成命令时返回 `canMove=false` 和稳定 `blockReason`;零库存托盘和孤儿 position 先对账处理。
- 混托场景要同时锁定该物理托盘的全部活动业务锁和业务引用;移动时所有客户的库存 position 一起更新。一方客户库存清零不能释放公共托盘,只有全部库存、活动锁和未完成业务引用均结束后才能释放或报废。
跨服务不使用分布式事务,但不得在持有 Lastleg 数据库事务时调用资源服务。移库命令先独立提交 `PREPARED`(请求哈希、租约、托盘版本、源位置快照和目标快照),再调用资源服务 transition;远程按 operation key 重放后进入 `REMOTE_APPLIED`,随后本地锁定全部 position/计划当前字段并提交 `LOCAL_COMMITTED`。本地失败进入 `COMPENSATION_REQUIRED`,补偿必须核对远端 afterVersion/afterLocation 未被后续作业修改;无法补偿进入人工对账和告警。批量移库按托盘逐项返回结果,不声称跨托盘全局原子。验收必须覆盖“远程成功、本地失败、重放、后续作业后拒绝补偿”。
同一 move command 重试必须保持原 `targetSnapshot` 和 `requestHash`;目标普通位被其他托盘占用时原命令返回冲突,由新候选命令重选,不能用同一幂等键静默改投 A0。只有确认远端 operation 已成功时,才允许按 operation key 恢复本地提交。
优先复用 `pda/move` 的核心逻辑,不新增绕过资源服务的直接写库接口。
### 5.3 Admin Web
新增海外仓库位正式页面、route、navigation/menu、权限和接口类型,接入已有海外 locations API,不能复用国内 `/platform/v1/locations`。
页面支持:海外仓、分区、库位编码、类型、状态、A0 标识、占用摘要;A0 禁止编辑/停用/删除。普通库位改码、改类型、改分区、停用或删除前检查托盘、库存、活动锁和未完成移库,有任何当前引用时阻断。
海外入库详情的托盘明细增加:
- 当前库位编码和库位类型;
- A0 标识;
- 上架状态;
- 单托/批量移库;
- 移库历史。
Admin 只调用 Lastleg 平台移库命令,携带当前托盘版本、源位置版本、幂等键、操作原因和源位置快照,并消费服务端返回的 `canMove/blockReason` 及每托结果。该命令经 `gateway-overseas` 的平台路由暴露,使用 `lastleg:inventory:manage` 等后台权限,与 PDA 的 `lastleg:pda:operate` 分离;请求不接收 `customerId`,客户集合由服务端从整托库存 position 解析。
### 5.4 海外 PDA
现有 PDA 已有扫描移库入口。第一期不新增完整“上架任务”体系,但需补充:
- A0 目标库位展示;
- `sharedOverflow` 文案和状态;
- 虚拟位、普通位、A0 的目标校验;
- A0 到普通位的换绑。
一件代发当前存在客户作用域的专用虚拟托盘。该特例不能直接套用公共 A0 规则;如后续需要把一件代发托盘转入 A0,必须先完成公共资源归属和锁模型迁移,并单独验收。
## 6. 状态与门禁
位置类型和流程状态分开:
```text
locationKind: VIRTUAL / NORMAL / SHARED_OVERFLOW / UNKNOWN
putawayStatus: PENDING / COMPLETED / RECONCILIATION_REQUIRED
```
`putawayStatus` 当前没有现成字段,第一期建议由当前物理位置派生,并在 DTO 中统一返回:`VIRTUAL → PENDING`,`NORMAL/A0 → COMPLETED`,位置为空或多份位置不一致 → `RECONCILIATION_REQUIRED`。后者必须阻断排车、拣货、出库和再次移库,进入修复队列,不能当作普通的未上架。若为了查询性能落库,只能在 `ll_inbound_plan_pallet` 增加一个唯一权威字段,由上架命令写入;`wh_pallet.location_id` 和 `ll_inventory_position.warehouse_location_id/code` 仍是当前位置事实,计划字段只是同步冗余,`ll_inbound_stock_receipt` 与库存流水只保留不可变快照。不能让三处各自推进状态。
允许 PDA 收货完成后仍有托盘暂留虚拟位,但虚拟位的 `PENDING` 必须阻断智能排车、PDA 拣货、出库和发车候选;只有物理落到普通位或 A0 后才进入这些履约候选。`INBOUND_COMPLETED` 仍表示库存入账完成,不等于已经完成上架。
允许的物理流转为 `VIRTUAL→NORMAL/A0`、`NORMAL↔NORMAL`、`A0↔NORMAL`;`NORMAL/A0→VIRTUAL` 一律拒绝(仅人工对账恢复命令例外),同一 A0 的 `A0→A0` 是幂等 no-op,不增加托盘版本、位置占用或库存流水。平台和 PDA 必须共用这套门禁。
## 7. 容量边界
第一期按“一托一普通库位”判断普通位是否可用,A0 只解决普通位数量不足,不实现重量/体积累计容量。A0 不是无限容量,也不改变托盘自身 `capacity_cbm`;至少维护当前托盘数、最早进入时间和可配置的软阈值告警,超过硬阈值时停止返回 A0 候选并返回稳定阻断原因。
若后续需要按承重或体积判断,还需增加当前库位占用重量/体积、托盘实际重量/体积快照、并发容量扣减和超限转 A0 的事务门禁。
## 8. 权限、审计与跨客户
库位查询、库位维护、平台移库、A0 换绑和 PDA 现场移库分别定义权限。平台资源实体仍使用公共资源作用域 `customer_id=0`,资源锁使用真实业务客户 ID;A0 共享不等于跨客户越权。普通库位和 A0 的查询、候选、库存过滤均必须以 `warehouseId` 为边界,不能让客户端传入客户或跨仓位置。
移库写入当前版本、幂等键、请求哈希、操作原因、操作人、源/目标库位快照和跨服务关联 key。优先复用现有 `wh_pallet_operation`、Lastleg 移库记录和库存流水,不新建无关联的第二套历史。增加定时或人工对账,核对托盘当前位置、活动资源锁、库存 position、计划当前冗余字段和普通位占用事实;发现不一致时记录 `COMPENSATION_REQUIRED`/人工处理,不静默覆盖后续作业。
## 9. 验收重点
1. 新建托盘转换阶段使用公共作用域虚拟位;复用已有真实托盘时保留其当前位,且不提前占用新的普通位。
2. 普通位候选仅读,最终命令原子竞争;普通位全部竞争失败后由操作员确认进入同仓 A0。
3. 多托盘并发进入 A0,A0 始终 `ACTIVE`,互不覆盖、互不误释放。
4. 覆盖 `VIRTUAL→A0`、`A0→NORMAL`、`NORMAL↔NORMAL`;同一 A0 的 `A0→A0` 返回幂等 no-op,`NORMAL/A0→VIRTUAL` 失败关闭。
5. A0 单托换绑普通位不影响其他 A0 托盘;普通位并发竞争只能一个托盘成功。
6. 合托实物托盘移动后,所有入仓单库存位置一致,数量桶守恒并写零差额流水。
7. `wh_resource_lock.location_id`、`wh_pallet.location_id`、计划当前冗余和库存 position 一致;批次 `reserved_location_id` 仍明确为快照。
8. `PENDING` 虚拟位库存不进入排车、拣货或出库候选;部分收货按已形成的实物托盘逐托落位,失败可幂等重试。
9. 位置为空或多份位置不一致时返回 `RECONCILIATION_REQUIRED`,阻断履约和再次移库并进入修复队列;远程物理成功、本地更新失败时可重放/补偿,后续作业已修改远端时补偿必须拒绝并进入对账。
10. 平台与 PDA 并发同托、停用/改码/改类型/删除被引用库位、跨仓库位、错误版本和幂等键复用均失败关闭。
11. A0 缺失、重复、编码碰撞、仓库失效、非公共作用域和阈值超限均失败关闭;A0 永远不可编辑、停用或删除。
12. Admin、库存查询、托盘管理和 PDA 展示同一业务库位码及 `sharedOverflow`;`NORMAL/SHARED_OVERFLOW` 枚举、OpenAPI、Gateway、Fixture 和测试已同步。
13. 验收夹具至少准备 1 个可用 `NORMAL`、系统 A0 和 2 个托盘;另覆盖无普通位/普通位全停用时进入 A0,以及普通位竞争时只有一个托盘成功。
## 10. 待评审决策
1. 是否采用“一托一普通库位,普通位不足时由现场确认进入 A0”?建议采用。
2. 是否允许收货完成但未上架的托盘暂留虚拟位?建议允许,但 `PENDING` 必须阻断排车、拣货、出库和发车。
3. A0 是否视为合法正式落位并允许履约?建议允许;A0 与普通位一样进入履约候选,受 A0 阈值和现场安全门禁约束。
4. 第一期是否同时开放 Admin 平台移库,并复用现有 PDA 移库补 A0 语义?建议同时开放,但共用同一 Lastleg 平台移库命令和物理状态机。
5. 是否每个海外仓固定一个 A0,还是按库区配置多个 A0?建议第一期每仓一个,ID/编码永久稳定。
6. 第一期是否暂不做重量/体积容量校验?建议暂不做累计容量计算,但保留托盘数/时间阈值告警和超限阻断。
## 11. 建议结论
建议第一期采用:每个海外仓一个使用公共作用域、按仓库 ID 幂等懒创建的 A0;新建托盘计划阶段使用虚拟位,正式上架时普通位候选优先、现场确认后 A0 兜底;A0 作为合法正式落位并允许履约;Admin 和 PDA 共用 Lastleg 平台移库命令;位置、资源锁、库存和计划当前字段按同一事实同步;跨服务使用可持久化的 Saga 状态机、补偿和对账;暂不实现重量/体积累计容量,但保留 A0 数量阈值和告警。
## 12. 开发前置清单
开发开始前应先把以下合同一次性冻结,避免各端按自己的理解实现:
1. 冻结库位枚举和迁移规则:`VIRTUAL/NORMAL/SHARED_OVERFLOW`,将现有 `STORAGE` 统一收敛为 `NORMAL`,同步基线 SQL、增量 SQL、OpenAPI、Fixture、Gateway 和测试。
2. 冻结 A0 常量和作用域:`customer_id=0`、`location_code=A0`、`zone_code=OVERFLOW`、`status=ACTIVE`、`max_load_kg=999999999.000`;冻结懒创建入口、冲突码和阈值阻断码。
3. 冻结资源服务状态机和占用事实:A0/虚拟位不改库位状态,普通位 CAS 独占;`wh_resource_lock.location_id` 是当前值,按托盘和 `reservation_key` 精确释放;移库同步锁、托盘、占用事实和操作记录。
4. 冻结 Lastleg 事实字段:`wh_pallet` 与 `ll_inventory_position` 为当前物理位置事实,计划托盘为同步冗余,`wh_pallet_batch_item.reserved_location_id` 为预留快照,收货凭证/库存流水为不可变历史;`putawayStatus` 由位置派生或只落在一个唯一权威字段。
5. 冻结平台/PDA 共用移库 API、权限、请求哈希、版本快照、幂等键命名空间和 Saga 状态;先持久化 `PREPARED`,禁止在 Lastleg 事务中直接调用资源服务。
6. 冻结履约门禁:虚拟位 `PENDING` 不得进入排车、拣货、出库和发车候选;A0 与普通位均可履约;整托移动保持所有库存桶、客户集合和活动业务锁一致。
7. 冻结验收数据夹具:至少一个普通位、一个系统 A0、两个托盘,覆盖混托双客户、部分收货、普通位竞争、A0 并发、A0→A0 no-op、远端成功本地失败、补偿被后续作业拒绝、A0 缺失/冲突和普通位改码阻断。
满足以上清单后,开发可以按 `warehouse-overseas-service → lastleg-service → gateway/OpenAPI → Admin/PDA → 端到端验收` 的顺序拆分实现;任何偏离都应先回写本方案,而不是在代码中引入第二套语义。
+1
View File
@@ -63,6 +63,7 @@
详细设计材料: 详细设计材料:
- [海外仓费用统一接入财务评审方案](海外仓费用统一接入财务评审方案.md) - [海外仓费用统一接入财务评审方案](海外仓费用统一接入财务评审方案.md)
- [海外仓费用统一接入阶段 0 技术契约](海外仓费用统一接入阶段0技术契约.md)
- [财务业务操作流程图](财务全链路流程图.md) - [财务业务操作流程图](财务全链路流程图.md)
- [财务业务全流程总览图(PNG)](财务业务全流程总览图.png) - [财务业务全流程总览图(PNG)](财务业务全流程总览图.png)
- [财务来源接入现状](财务来源接入现状.md) - [财务来源接入现状](财务来源接入现状.md)
@@ -0,0 +1,99 @@
# 海外仓费用统一接入阶段 0 技术契约
> 版本:V0.5-0A | 状态:开发前技术基线 | 来源:海外仓费用统一接入财务评审方案 V0.5
## 1. 目标与边界
阶段 0 只完成“费用事实可追踪、可幂等、可被 Finance 接受或拒绝”的底座,不新增业务收费规则,不部署测试环境,不启动 Java/Nacos/数据库。所有费用仍由业务服务产生事实,Finance 独立落库并负责应收/应付、钱包和结算。
实施顺序固定为:
1. 0A:既有链路和收费身份;
2. 0B:统一来源命令、结果和 Outbox/Inbox;
3. 0C:冻结/结算按收费身份和计划版本;
4. 0D:退货、仓租、按票及库存日事实;
5. 0E:商业调整、拒绝和财务待办。
## 2. 当前代码事实与必须修正点
| 范围 | 当前实现 | V0.5 要求 |
|---|---|---|
| 来源事件 | `BusinessFeeSourceChangedV1` 单向完整快照 | 增加命令/结果闭环,Finance 明确 ACCEPTED/REJECTED |
| 费用版本 | Lastleg 调整、作废先改变当前状态再发事件 | Finance 接受新版本后,旧版本才可 SUPERSEDED/VOIDED |
| Wallet | 以 `businessType + businessNo + amount` 匹配冻结 | 绑定 `chargeIdentity + feeSourceVersion + walletPlanId` |
| Relabel | 部分完成路径发布费用,SKU/客户确认路径漏发 | 所有完成路径统一产出一条收费身份 |
| Destuff | 直接 insert 已审批客户应收,绕过服务和命令 | 进入统一来源命令;供应商应付按阶段配置 |
| Delivery | 转运时直接发布已审批费用 | 票级 AR/AP 分离,人工金额先待审 |
| 来源模型 | 无 `scenarioCode`、收费身份、Finance 同步状态 | 三者均为显式字段,不从业务单号推导 |
## 3. 收费身份与状态
### 3.1 收费身份
`chargeIdentity` 是稳定的业务收费对象键,不等同于数据库 ID。格式由场景定义,至少包含 `scenarioCode`、业务主单号、客户和收费对象序号;同一身份可产生多个不可变 `sourceVersion`。Finance 唯一键为:
`sourceSystem + sourceType + sourceFeeId + sourceVersion`
费用明细必须同时保存 `chargeIdentity`,用于 AR/AP、钱包、账单和追溯关联。
### 3.2 状态轴
- 来源状态:`DRAFT`、`PENDING_REVIEW`、`APPROVED`、`REJECTED`、`SUPERSEDED`、`VOIDED`。
- 发布状态:`NOT_PUBLISHED`、`PUBLISHED`、`ACCEPTED`、`REJECTED`。
- Finance 同步状态:`PENDING`、`ACCEPTED`、`REJECTED`、`RETRYING`。
- 结算状态:`UNSETTLED`、`FROZEN`、`SETTLED`、`RELEASED`。
状态轴不可互相覆盖。费用调整必须生成新版本;同一版本不同 hash 必须拒绝。已进入有效账单、结算或钱包结算的来源不得替换或作废。
## 4. 跨服务命令与结果
### 4.1 `BusinessFeeSourceCommandV2`
事件头:`eventId`、`eventType`、`eventVersion=2`、`eventKey`、`occurredAt`、`sourceSystem`、`traceId`。
业务体:`action`(UPSERT/VOID)、`sourceType`、`sourceFeeId`、`sourceVersion`、`chargeIdentity`、`scenarioCode`、客户/业务/仓库/供应商引用、方向、币种金额、数量单价、期间、付款证据、来源状态、`sourceHash`。
发送方必须发送完整快照,不允许 Finance 回查海外库。`eventKey` 固定为 `sourceSystem:sourceFeeId:sourceVersion:action`。
### 4.2 `BusinessFeeSourceResultV2`
Finance 处理后回传:`commandEventId`、`sourceFeeId`、`sourceVersion`、`result`(ACCEPTED/REJECTED)、`reasonCode`、`reasonMessage`、`financeFeeSourceId`、`processedAt`、`resultHash`。
业务方以 `commandEventId` 幂等接收结果;REJECTED 必须形成可重试或人工待办,不得静默丢弃。结果事件不能改变原始费用快照。
## 5. 钱包与账单关联
钱包命令新增 `chargeIdentity`、`sourceFeeId`、`sourceVersion`、`walletPlanId`、`walletPlanVersion`、`allocationId`。冻结、结算、释放均以 `allocationId` 幂等;禁止仅按业务类型、业务单号和金额猜测关联。
柜级费用先按真实客户/订单形成分摊明细,再分别产生收费身份和钱包分配;退货按票、仓租按期间/仓库、配送按票分别生成身份,不复用订单主单号充当费用键。
## 6. 场景接入约束
- **Relabel**:所有完成入口调用同一应用服务;一次业务收费身份只允许一个当前版本。
- **Destuff**:按实际客户 CBM 分摊;客户应收与供应商应付分开建身份,禁止直接写 APPROVED/PUBLISHED 绕过命令。
- **Delivery**:每票每收费项独立身份;收款方与付款方分离,手工金额进入待审。
- **Return**:按票计费,退货收货完成才结束计费;迟到实收只能生成新版本/调整记录。
- **Warehouse rent**:按仓库、库位/货主、计费期间和计费规则生成期间身份,不能伪造入仓码。
## 7. 阶段 0 开发门禁
开始改代码前必须完成并评审:
1. V2 事件 DTO、事件类型、Gateway 路由、OpenAPI、权限码和跨区 Outbox/Inbox 位置;
2. Lastleg 来源表与 Finance 来源表的字段/索引/状态迁移设计;
3. 钱包计划及分摊表的唯一键与幂等键;
4. Relabel、Destuff、Delivery 的生产入口清单和漏发测试用例;
5. 拒绝、重试、迟到实收、旧版本已结算等异常验收用例。
实现后必须定向运行 DTO/事件/服务测试、`node scripts/gateway-route-contract.test.mjs`,若有 Mapper 变更再运行 `node scripts/mapper-scan-contract.mjs`。本阶段不执行部署和真实 HTTP 验收。
## 8. 代码入口
- 事件模型:`baiyue-firstleg/common-event-contract/`
- 海外来源服务:`baiyue-firstleg/lastleg-service/.../financefee/`
- Finance 消费:`baiyue-firstleg/finance/.../BusinessFeeSourceEventService.java`
- Relabel:`baiyue-firstleg/lastleg-service/.../relabel/`
- Delivery:`baiyue-firstleg/lastleg-service/.../delivery/`
- Destuff:`baiyue-firstleg/lastleg-service/.../inboundplan/`
本文是 V0.5 的技术落地门禁;与 V0.5 方案冲突时,以当前对话确认和 V0.5 方案为准。
+123
View File
@@ -0,0 +1,123 @@
# 领星新品测量接口联调说明
## 范围
墨家上传的 `boxCode` 不包含 `#` 时,Firstleg 将它作为 SKU 测量收件记录保存;带 `#` 的箱唛继续使用原箱唛测量流程。SKU 记录默认只保存,不自动修改领星,是否自动推送由 Nacos 配置控制。
领星账号使用独立浏览器容器和独立 profile,不复用其他 Node.js 账号或浏览器会话。
## 领星查询
请求:
```http
POST https://wms.xlwms.com/gateway/wms/newProduct/page
Content-Type: application/json
```
请求体:
```json
{
"barcode": "A120133-A-TK",
"current": 1,
"customerCode": "",
"keyword": "A120133-A-TK",
"multiKeyword": "",
"searchType": "barcode",
"size": 20,
"whCode": "US01"
}
```
系统按 `US01`、`US02` 分别查询,并只接受 `productSku` 或 `barcode` 精确等于请求 SKU 的记录。查询结果中的 `maintained=1` 表示该仓库已经维护过,不能再次提交。
## 领星测量
请求:
```http
POST https://wms.xlwms.com/gateway/wms/newProduct/measure
Content-Type: application/json
```
Java 会以查询返回的整条商品记录为基础,仅替换墨家测量值。请求中的单位字段必须区分:
| 字段 | 值 | 含义 |
| --- | --- | --- |
| `sizeUnit` | `in` | 领星原商品尺寸展示单位 |
| `length`/`width`/`height` | 查询原值 | 原商品申报尺寸 |
| `lengthBs`/`widthBs`/`heightBs` | 查询原值 | 原商品英寸换算值 |
| `wmsSizeUnit` | `cm` | 本次维护尺寸单位 |
| `wmsLength`/`wmsWidth`/`wmsHeight` | 墨家厘米值 | 本次维护尺寸 |
| `wmsLengthBs`/`wmsWidthBs`/`wmsHeightBs` | 厘米 ÷ 2.54 | 本次维护英寸换算值 |
| `weightUnit` | `lb` | 领星原商品重量展示单位 |
| `wmsWeightUnit` | `kg` | 本次维护重量单位 |
| `wmsWeight` | 墨家千克值 | 本次维护重量 |
| `wmsWeightBs` | 千克 × 2.2046226218 | 本次维护磅换算值 |
示例中的维护字段如下:
```json
{
"wmsLength": "24.5",
"wmsLengthBs": "9.646",
"wmsWidth": "18.5",
"wmsWidthBs": "7.283",
"wmsHeight": "5",
"wmsHeightBs": "1.969",
"wmsSizeUnit": "cm",
"wmsWeight": "0.15",
"wmsWeightBs": "0.331",
"wmsWeightUnit": "kg"
}
```
接口返回 `code=200` 才视为提交成功。HTTP 401 或领星业务码表示登录失效时,Java 清理缓存并自动重新登录后重试一次;其他失败记录为同步失败,不自动无限重试。
## 登录和二次验证
浏览器页地址为 `https://wms.xlwms.com/login`。Java 通过 CDP 操作独立浏览器页面:
- 账号:`input[name="username"]`
- 密码:`input[name="password"]`
- 登录:`.login-btn`
- 腾讯安全验证容器:`#captchaId`(仅在可见挑战出现时转人工处理)
- 短信/邮箱验证码:`input[placeholder="输入验证码"]`
- TOTP 验证码:`input.verification-code-native`
- 短信/邮箱获取验证码:`.verify-code-login .code-btn`
- 验证登录:`.verify-code-login .login-btn`
检测到二次验证页面后,Java 立即为短信/邮箱渠道点击获取验证码;用户在后台输入收到的验证码后,Java 只提交验证码,不会再次发送。TOTP 由领星页面自动初始化。腾讯安全滑块属于人工安全验证,必须通过 noVNC 完成,Java 不绕过该验证。
账号、密码和主登录按钮选择器已根据 `https://wms.xlwms.com/login` 页面源码及登录脚本核对;短信/邮箱和 TOTP 二次验证输入选择器也已确认。验证码错误或过期等业务结果仍需以真实运行时返回为准。
## Nacos 配置
开发环境默认关闭自动推送:
```yaml
firstleg:
lingxing:
auto-sync-enabled: false
base-url: https://wms.xlwms.com
login-origin: https://wms.xlwms.com
browser-cdp-endpoint: http://lingxing-browser:9222
username: ${LINGXING_USERNAME}
password: ${LINGXING_PASSWORD}
track-key-v2-secret-base64: ${LINGXING_TRACK_KEY_V2_SECRET_BASE64}
warehouses: [US01, US02]
```
`lingxing-browser` 和 Java Firstleg 必须加入同一个 Docker 网络(开发部署脚本默认是 `firstleg-development-network`)。noVNC 只绑定服务器回环地址,远程人工处理安全滑块时使用 SSH 本地端口转发。账号、密码、Cookie、Token 和 Track-Key 密钥不得写入仓库或提交到 Git。
Track-Key 密钥按参考实现只做一次 Base64 解码,Java 不限制解码后的固定字节长度;只要密钥非空且与 Node 实际使用的 keyBytes 相同即可。
## 验收步骤
1. 启动独立浏览器容器并确认 `http://lingxing-browser:9222/json/version` 可从 Java 容器访问。
2. 保持 `auto-sync-enabled=false`,进入后台“SKU同步”页面,输入 SKU,点击“测试连接”。
3. 首次触发二次验证时,在后台输入验证码,确认原查询自动继续,并返回 `US01`、`US02` 结果。
4. 对 `maintained=0` 的记录点击“人工推送”,确认领星返回 `code=200`。
5. 再次查询同一 SKU,确认已维护记录不会重复提交。
6. 将 `auto-sync-enabled` 改为 `true` 后重新上传不带 `#` 的 SKU,确认入库后自动推送;失败记录可在页面人工重新推送。