2026-08-19 17:08:41 +08:00
# 头程与海外仓后端项目指引
2026-07-31 11:06:36 +08:00
2026-09-30 17:13:11 +08:00
> 当前为单 TEST、统一 Gateway/Auth 会话/Nacos 与业务 Outbox 直接投递。架构规则及部署/验收状态唯一见 `../docs/测试环境单机部署与配置契约.md`、`../docs/统一认证与服务通信契约.md`。模块旧双区域说明不能覆盖这两份契约;构建、部署与整体验收分别核对。
2026-09-29 17:55:54 +08:00
2026-09-29 18:47:37 +08:00
根 POM 当前聚合 20 个模块(7 个公共/依赖模块、13 个服务),部署映射见 `deploy/service-map.yml` 。`gateway-overseas/` 与 `event-bridge-service/` 为退役待清理源码,不是当前构建或部署单元。
2026-08-08 12:01:45 +08:00
## 适用范围与定位
2026-07-31 11:06:36 +08:00
2026-08-19 17:08:41 +08:00
- 本文件适用于 `baiyue-firstleg/` Maven 多模块仓库,包含国内头程与海外区域服务;进入具体服务后继续读取该服务的 `AGENTS.md` 。
2026-08-08 12:01:45 +08:00
- 本层只负责:服务边界、跨服务契约、数据库部署总入口、阶段路由和通用验证。Controller、Service、DTO、SQL 细节以模块级指引为准。
- 普通任务先读本文件和目标模块指引;聚合构建/架构问题再读 `README.md` 、`pom.xml` 、`docs/头程项目目录结构与服务说明.md` 。
2026-09-29 18:47:37 +08:00
- 平台/客户层级与权限公共语义见 `../docs/平台客户层级与权限契约.md` ;统一 Token、API 和可靠直接投递公共契约见 `../docs/统一认证与服务通信契约.md` 。本文件只保留后端执行所需摘要。
2026-07-31 11:06:36 +08:00
2026-08-08 12:01:45 +08:00
## 不可突破的产品与数据边界
2026-08-05 13:50:37 +08:00
2026-08-08 12:01:45 +08:00
- 当前产品只有“平台—客户”两级。`tenant_id=0` 是平台技术作用域;`tenant_id>0` 是客户隔离键,不得新增租户切换、租户选择或租户级 RBAC。
- 公共仓库、往来单位、快递、托盘、库位统一归属 `tenant_id=0` ;订单、文件、费用等客户数据按客户 `tenant_id>0` 隔离。不得跨库 Join 或信任客户端客户 ID。
2026-09-29 18:47:37 +08:00
- 国内订单交易状态归 `order` ,头程履约/入库状态归 `firstleg` ,财务账期、账单、收款、成本与核销归 `finance` ;全部仓库 ID、类型、状态、地址和能力主档归国内 `warehouse` ,海外 `warehouse-overseas-service` 只维护引用同一国内 warehouseId 的库位、托盘和资源锁。海外尾程订单、入仓计划、库存业务与海外本土业务归 `lastleg-service` ,所有端公网入口归 `gateway` 。文件对象归 `file` ,第三方适配归 `integration-service` ;跨服务通过内部客户端、DTO、事件和服务令牌协作。
2026-08-08 12:01:45 +08:00
- 普通业务成功/失败使用 HTTP 200 + body `code` (成功为字符串 `"200"` );认证、基础设施和网关拒绝可使用真实 401/403/503。
2026-08-05 16:26:10 +08:00
2026-08-08 12:01:45 +08:00
## 服务路由(按关键词定位)
2026-08-05 16:26:10 +08:00
2026-09-23 18:26:04 +08:00
本表只保留定位入口;命中业务后用 `rg -n -F '关键词' docs/backend-business-index.md` 读取对应行/段的详细约束,再沿代码引用追踪;不默认全文加载详细索引。已知目标文件时直接定位,并定向核对该业务约束。
### 后端任务最小读取集
- 单服务 Controller/Service/Mapper 任务:本文件、目标服务 `AGENTS.md` 、目标类及其直接调用点。
- 跨服务 API/事件任务:在上述基础上增加直接调用方、被调用方和对应 Gateway/OpenAPI;不因业务关键词自动加载整个业务专题。
- 只有状态、权限、数据库或验收边界无法从上述入口确定时,才读取 `docs/业务快速索引.md` 、专题 README 或完整契约。
2026-09-30 17:13:11 +08:00
- 读取预算遵循工作区根指引:超过约 250 行或 8000 字符时先读职责、硬边界和验证章节,再检索任务命中段;不得仅因行数少而全文加载长业务表。聚合构建或架构任务才读取相关 `README.md` 、`pom.xml` 和目录结构文档,已知单模块任务不增加概览文档。
2026-08-20 19:55:21 +08:00
2026-09-18 18:02:27 +08:00
| 任务关键词 | 首选服务 |
|---|---|
| 登录、Token、密码、注册与顶层授权快照 | `auth/` |
| 客户档案、成员、审核、RBAC、授权快照 | `iam/` |
| 客户建档默认箱规与权重系数初始化及补偿 | `iam/` 、`firstleg/` |
| 消息中心、站内通知、消息模板、收件箱 | `iam/` |
| 订单、货物、快照、状态、幂等、Outbox | `order/` |
| 客户头程订单中文批量导入 | `order/` |
| 平台修改客户原始申报、履约渠道变更与跨服务同步 | `order/` 、`firstleg/` |
| 平台订单批量审核预览 | `order/` |
| 履约分配、入库、测量、箱规算法、审核、FBA 计费 | `firstleg/` |
| 入库单扣货、解除、凭证与履约门禁 | `firstleg/` 、`file/` |
| 称重确认、整票库位块与 PDA 资源结算 | `firstleg/` 、`warehouse/` |
| 客户专属价格簿、柜级阶梯运费与受控调价 | `firstleg/` |
| Firstleg 内部模块化与依赖基线 | `firstleg/` |
| Mapper 新增、移动、Bean 缺失与扫描遗漏 | 目标持久化服务 |
| 脚本管理、全量验证、测试造数与诊断 | 仓库根 `scripts/` ;服务专属脚本留在 `<service>/scripts/` |
| 分柜、柜次、智能排柜、预装/装柜清单、真实柜号后补、PDA | `firstleg/` |
| 合柜报关 / 同柜不可拆组、跨客户合柜、整组分配/移除 | `firstleg/` |
| 全局智能装柜候选、柜次、占位与移除 | `firstleg/` 、`order/` |
| 客户入库结果与头程费用确认 | `firstleg/` |
| 订舱资料/打印、船期、订舱级拖车、报关 | `firstleg/` |
| 目的港码头拖车与还空预警 | `firstleg/` |
| 客户账期、费用池、账单、入仓码联查、收款、成本、核销 | `finance/` |
2026-09-29 18:47:37 +08:00
| 客户资金账户、充值、授信、冻结、结算与跨区资金指令 | `finance/` 、`lastleg-service/` 、`common-event-contract/` |
2026-09-18 18:02:27 +08:00
| 柜级公共费用跨客户分摊 | `firstleg/` 、`finance/` |
2026-09-29 18:47:37 +08:00
| 海外业务费用来源跨区入池 | `lastleg-service/` 、`common-event-contract/` 、`finance/` |
2026-09-18 18:02:27 +08:00
| 入库/柜次应付、直接已付、付款流水与凭证 | `firstleg/` 、`finance/` 、`file/` |
| 仓库、往来单位、快递、托盘、库位 | `warehouse/` |
| 供应商、国内整柜库存与出入库 | `warehouse/` |
| 客户运营统计、在途柜量 | `firstleg/` |
| 平台操作日志与审计查询 | `audit-service/` |
| 资质、导出、导出退避重试、测量图片、文件下载 | `file/` |
| 路由、CORS、JWT 入口、访问域 | `gateway/` |
| 百度/Amazon/OCR/第三方适配 | `integration-service/` |
2026-09-29 18:47:37 +08:00
| 统一 API 路由、Token、Audience/JWKS | `gateway/` 、`auth/` 、`common-security/` |
| 统一会话与账号/客户权限撤销 | `auth/` 、`iam/` 、`common-security/` |
2026-09-18 18:02:27 +08:00
| 尾程订单、海外入仓计划、换标、库存、采购、本土卡车 | `lastleg-service/` |
| 尾程订单控制、柜级预览与入仓计划转换 | `lastleg-service/` 、`warehouse-overseas-service/` |
| 海外入仓分页、FBA 预约、PDA 柜号签收与入仓 | `lastleg-service/` |
| 海外仓排车查询、候选与智能预排 | `lastleg-service/` |
| 海外排车执行、PDA 出库、派送与一件代发 | `lastleg-service/` |
| 海外异常退回、库存恢复与客户回访 | `lastleg-service/` 、`file/` |
| 一件代发 SKU/箱唛与暂扣跨区协同 | `order/` 、`firstleg/` 、`common-event-contract/` 、`lastleg-service/` |
| 客户海外仓贴标、转运、废弃与退货换标 | `lastleg-service/` |
| 海外仓 PDA 盘点、移库、托盘、换标与查询 | `lastleg-service/` 、`warehouse-overseas-service/` |
| 国内船节点向海外接柜门禁事件 | `firstleg/` 、`common-event-contract/` 、`lastleg-service/` |
| 海外仓库目录、海外库位、海外托盘、资源锁 | 国内仓库目录归 `warehouse/` ,海外资源归 `warehouse-overseas-service/` |
| Lastleg 内部模块化与依赖基线 | `lastleg-service/` |
2026-09-29 18:47:37 +08:00
| PDF 标签、审计、业务事件直投 | `print/` 、`audit-service/` 、`common-event-contract/` |
2026-09-09 17:58:07 +08:00
2026-08-20 19:55:21 +08:00
## 公共模块快速索引
| 关键词 | 模块与入口 |
|---|---|
| 公共依赖版本 | `platform-bom/pom.xml` ;统一管理公共组件版本,不放业务实现 |
| 通用响应、分页、异常、基础实体与导出契约 | `common-core/` ;从 `ApiResponse.java` 、`PageResult.java` 、`BizException.java` 、`ExportContracts.java` 定位 |
2026-08-26 11:10:42 +08:00
| Web 异常、请求关联/Trace、同步出站传播、Long ID 序列化 | `common-web/` ;从 `GlobalExceptionHandler.java` 、`CorrelationIdFilter.java` 、`TraceParent.java` 、`FeignTraceRequestInterceptor.java` 、`RestClientTraceInterceptor.java` 、`LongIdJacksonConfiguration.java` 定位 |
2026-08-20 19:55:21 +08:00
| JWT、JWKS、会话校验与认证用户 | `common-security/` ;从 `JwtAuthenticationFilter.java` 、`JwtClaimsMapper.java` 、`AccessTokenSessionValidator.java` 定位 |
| Springdoc/OpenAPI 自动配置 | `common-openapi/` ;从 `BaiyueOpenApiAutoConfiguration.java` 、`OpenApiProperties.java` 定位 |
| 业务审计注解、脱敏、Outbox 与投递 | `common-audit/` ;从 `BusinessAudit.java` 、`BusinessAuditAspect.java` 、`SensitiveDataSanitizer.java` 、`AuditOutboxPublisher.java` 定位 |
| 跨区域事件信封、Payload 与哈希 | `common-event-contract/` ;继续读该目录 `AGENTS.md` |
2026-08-05 16:26:10 +08:00
2026-08-12 19:42:08 +08:00
## 全量验收路由
2026-08-05 13:50:37 +08:00
2026-09-04 12:59:37 +08:00
- 当前订单与客户、入库测量与计费、国内货柜履约、海外仓业务及财务统一进入全量验收;按本次链路读取对应业务域/专题文档,不以历史规划终点阻断跨服务联调或回归。
2026-08-12 19:42:08 +08:00
- `auth` 、`iam` 、`warehouse` 、`order` 、`firstleg` 、`file` 、`finance` 、`integration-service` 及出仓相关能力按各自模块契约协作;状态、权限、数据库和 OpenAPI 以当前实现及已确认契约为准。
2026-07-31 11:06:36 +08:00
2026-08-14 14:50:39 +08:00
## 国内头程与海外仓协同
2026-09-29 18:47:37 +08:00
- Auth 是唯一用户账号与 Token 签发方;目标为各端共用 Gateway 和 Redis 会话,保留 RS256/JWKS、客户隔离、权限撤销、PDA 仓绑定及服务身份校验。当前源码已移除旧海外会话验证与 Lastleg 安全投影,改为 Auth 权威会话校验;本地验证不等于测试环境部署验收。
- 装柜、船节点、卸柜、暂扣、派送、费用与资金按统一通信契约的逐事件表直接投递。保留本地 Outbox、消费幂等、重试与失败处置,不携带用户 JWT;旧 Bridge 源码已退出聚合和发布清单,退役待清理;实际停机仍须替代链验证与授权,不得据源码状态认定已部署。
2026-09-29 17:55:54 +08:00
- `lastleg-service` 不读取头程数据库,`warehouse-overseas-service` 不读取尾程订单库。共用测试 MySQL 实例不改变服务数据归属。准确路由、ACK、撤销矩阵和切换门槛只维护在新的两份主契约中。
2026-08-14 14:50:39 +08:00
2026-08-08 12:01:45 +08:00
## 契约、数据库与验证入口
2026-07-31 11:06:36 +08:00
2026-09-10 14:15:41 +08:00
- 对外 Controller/API 新增、改名或删除时,同时核对调用端、区域 Gateway、OpenAPI 和权限;提交前运行 `node --test scripts/gateway-route-contract.test.mjs` ,自动发现生产 Controller 并校验网关目标服务与内部路径隔离。失败不得提交或标记完成;网关配置变化必须列入部署清单,不以业务服务单测代替入口检查。
2026-08-08 12:01:45 +08:00
- 跨服务修改先检查调用方 `client/` 、被调用方 Controller/DTO、`src/main/resources/openapi/` 和双方契约测试;禁止共享领域 Entity。
2026-08-14 13:03:09 +08:00
- 修改 Java 方法、构造器、Controller、Client、DTO 或 Mapper 参数签名时,先用 `rg` 定向查找符号及旧参数形态,并同步更新 `src/main/` 、`src/test/` 、Mock、Fixture、契约测试和脚本中的全部调用点。新增可选参数也必须补齐旧测试调用,不能因生产调用已更新就视为完成。
2026-09-23 17:47:50 +08:00
- 所有生产 MyBatis Mapper 接口必须显式标记 `@Mapper` ;每个持久化服务只允许在启动类使用一次服务根包 `@MapperScan(..., annotationClass = Mapper.class)` ,不得新增子域包白名单或分散的 `*MapperConfiguration` 。新增、移动 Mapper 或修改扫描配置后运行 `node scripts/mapper-scan-contract.mjs` ;全量后端回归已在 Maven 前执行该门禁时复用结果,输入未变不重复执行。
2026-09-28 14:46:26 +08:00
- 平台后台存在正式列表页时,`*:list` 同时授权列表、详情及只读辅助接口;`create` 、`edit` 、`delete` 、`status` 、`approve` 、`review` 、`export` 、`upload` 、`complete` 等操作保持独立。当前正式权限契约不保留旧独立 `*:view` ; Controller 不得使用 `hasAnyAuthority(list, view)` , OpenAPI 和角色初始化只保留 `*:list` 。若外部已有不可变权限契约,先按当前对话建立单独兼容规则。
2026-08-13 11:57:33 +08:00
- 供应商查询接口固定只使用 `platform:supplier:list` ; IAM 中 `platform:supplier:list` 是正式菜单资源,`platform:supplier:view` 必须停用/移除,不得重新提升或兼容。
- 权限语义变更必须同步 Controller `@PreAuthorize` 、OpenAPI、模块权限 SQL、IAM 菜单资源、统一增量脚本和契约测试。并行模块任务不得覆盖菜单与权限总控已写入共享 SQL 或权限契约的改动。
2026-09-28 14:46:26 +08:00
- 数据库只访问所属服务库。模块表结构位于 `<module>/src/main/resources/db/` ;开发环境按最新模块基线和 `deploy/sql/头程数据库统一增量-MySQL8.sql` 收敛,不为历史开发数据新增兼容迁移。已有名称含 `migration` 的脚本仅作结构来源和追溯,部署说明见 `deploy/sql/README.md` ;生产升级另按明确发布规则处理。
2026-08-26 14:08:41 +08:00
- 后端同样遵守根指引中的“开发数据和上传文件可丢弃”边界:不得为现有开发库孤儿文件、旧文件归属或历史部分失败新增删除补偿接口、兼容复用、回填或清理链路;只修复当前正式上传与持久化路径,既有开发文件由人工重新上传。
2026-09-29 18:47:37 +08:00
- 通用配置在 `config/nacos/test/` ;服务日志、上传文件、`target/` 、`reports/` 不属于源码。
2026-08-14 13:03:09 +08:00
- Java 签名变更的最低编译门禁是 `mvn -pl <module> -am test-compile` ,它必须在部署前完成并覆盖测试源码;有行为变化时继续运行 `mvn -pl <module> -am test` 。`-DskipTests` 可跳过测试执行但仍须保留测试编译,`-Dmaven.test.skip=true` 会跳过测试编译,不得作为签名变更的交付验证。全量验证仍使用 `mvn -DskipTests validate` 、`mvn test` ;不要在本地启动 Java/Nacos/数据库,除非用户明确要求。
2026-09-23 17:47:50 +08:00
- 同一批 `AGENTS.md` 索引修改完成后从后端根统一运行一次 `./scripts/agents-index-contract.ps1` ;脚本只读源码目录和指定指引,不访问 HTTP、数据库或部署环境。
2026-08-28 23:01:52 +08:00
- Mapper 注册静态合同为 `scripts/mapper-scan-contract.mjs` 、`mapper-scan-contract.test.mjs` :自动发现聚合模块、生产 `*Mapper` 接口、服务启动类和分散扫描配置,不启动 Spring、不连接数据库;遗漏注解、扫描根漂移或重新引入子域扫描时直接失败并输出类与文件路径。
2026-08-24 10:35:40 +08:00
- 单服务镜像构建/部署从 `Jenkinsfile.service` 、`deploy/docker/Dockerfile` 、`deploy/scripts/deploy-built-service.sh` 进入;新镜像启动失败或健康检查失败时只允许回滚到同服务先前镜像,并保持任务失败,离线合同见 `scripts/deploy-built-service-rollback.test.mjs` 。实际部署仍须当前对话明确授权。
2026-08-03 15:46:50 +08:00
2026-08-13 14:37:51 +08:00
## 全量 HTTP 验收脚本路由
2026-08-12 20:36:11 +08:00
2026-09-01 11:02:10 +08:00
- 脚本管理的唯一总索引是 `scripts/README.md` ,最近执行规则是 `scripts/AGENTS.md` 。仓库级脚本、Admin 内部模块、服务局部合同和部署脚本的目录归属以这两个文件为准,不再通过无范围搜索猜测入口。
2026-09-04 12:59:37 +08:00
- 全量验收唯一指向测试环境 HTTP:平台端执行 `scripts/admin-test-env-acceptance.mjs` ,客户端执行 `scripts/client-test-env-acceptance.mjs` ;入库测量与计费专项场景才单独执行 `scripts/client-phase2-test-env-acceptance.mjs` ,不替代客户端全量入口。
2026-09-04 15:55:43 +08:00
- Client 快速下单定向验收使用 `scripts/client-quick-order-test-env-acceptance.mjs` ,只验证批量草稿接口、逐行隔离和幂等行为,不提交、不审核,也不替代 Client 全量入口。
2026-09-01 11:02:10 +08:00
- 固定客户待审核订单使用 `scripts/create-pending-review-orders.mjs` ;固定“IT测试”与“义乌仓”、随机真实线路并推进至 `WAIT_SPLIT` 使用 `scripts/it-test-wait-split-bulk.mjs` 。二者都是造数入口,不属于全量验证;会写目标环境且不自动清理成功数据。
2026-08-13 14:37:51 +08:00
- Admin 总入口默认按模块列表覆盖平台全链路;需要定位单个业务时使用 `--modules <name>` ,模块名称和静态合同先查 `scripts/admin-test-env-modules/README.md` 。
2026-09-04 15:55:43 +08:00
- 订舱与拖车跨服务完整状态链由 Admin 注册模块 `service-center-flow` 验证,必须复用本轮已放舱订舱并由总入口展开依赖,不得直接执行模块文件或借历史数据。
2026-09-08 14:07:31 +08:00
- 尾程公网控制由 `phase4-tail-order-controls` 在海外 PDA 前验证整柜接柜仓变更与恢复、单/批目的仓变更、单/批合托标记、CSV 导出、订单费用、暂扣/解除、八个人工节点和逐票人工计划;目的港码头拖车由 `phase5-terminal-drayage` 在卸柜后验证选车队、预约提柜、实际提柜和实际还柜,`phase4-carrier-nodes` 只读核验最终船节点终态。
2026-09-23 17:47:50 +08:00
- 这些脚本会创建、更新或最终停用测试数据;指定测试环境和服务后,本轮非破坏性写入复用一次授权,删除、重置、SQL、部署或发布仍逐项授权,并保存 JSON 报告;未授权不得请求 Gateway。
2026-08-13 14:37:51 +08:00
- 后端 Maven、前端 `pnpm test/typecheck` 、PDA `node --test` 和数据库 Dry-run 都是本地质量检查,不属于全量 HTTP 验收。
2026-08-25 15:08:34 +08:00
- Java 模块、OpenAPI 覆盖、JaCoCo 与 SpotBugs 聚合摘要使用 `node scripts/java-quality-summary.mjs` ;默认仅报告存量缺口,是否阻断由显式 `--require-*` 参数决定,输出位于 `target/` 时不得作为业务事实或提交物。
2026-08-13 14:37:51 +08:00
- HTTP 全量通过后,才进入 Admin/Client 真实页面调用、浏览器样式和 PDA 页面/设备验收;自动化 HTTP 通过不代表视觉验收完成。
2026-09-01 11:02:10 +08:00
- 修改脚本目录、入口或说明后,至少运行 `node --test scripts/script-documentation-contract.test.mjs` ;修改 `AGENTS.md` 后继续运行 `./scripts/agents-index-contract.ps1` 。两者均为离线只读合同,不能代替真实 HTTP 验收。
2026-08-12 20:36:11 +08:00
2026-09-04 12:59:37 +08:00
## 业务域文档入口
2026-08-03 15:46:50 +08:00
2026-09-04 12:59:37 +08:00
- 订单与客户:`../docs/订单与客户/README.md` 、`../docs/订单与客户/订单与客户头程订单闭环设计.md`
2026-09-28 14:46:26 +08:00
- 入库测量与计费:`../docs/入库测量与计费/README.md` ;流程细节按 `../docs/头程到尾程/README.md` 指向的当前阶段文档读取,需求确认和联调报告仅在历史追溯或验收证据任务中读取
- 国内货柜履约:`../docs/国内货柜履约/README.md` 、`../docs/国内货柜履约/报关资料与船期价格接入梳理.md` ;开发规划、开工门禁、需求确认和验收材料已归档,只有历史追溯或验收证据任务才读取
2026-09-29 18:47:37 +08:00
- 海外仓业务:`../docs/海外仓业务/README.md` ;统一入口 `gateway/` ,尾程与入仓库存 `lastleg-service/` ,海外仓储资源 `warehouse-overseas-service/`
2026-09-04 12:59:37 +08:00
- 海外仓全流程:以正式 Controller、前端路由、权限、SQL 与跨区事件契约为范围依据;海外接柜、入仓、库存、库内服务、排车、出库、派送、一件代发、异常退回和客户回访进入 `lastleg-service/` ,国内 SKU/箱唛及暂扣协同进入 `order/` 、`firstleg/` 、`common-event-contract/`
2026-08-11 18:06:26 +08:00
- 财务:`../docs/财务管理/README.md` 中已确认的范围、对象、状态和接口约束
2026-08-10 18:12:18 +08:00
2026-09-28 14:46:26 +08:00
全量验收需要证据时再读取对应阶段报告和证据矩阵;普通代码定位只读取当前链路涉及的范围、契约、模块指引和代码。