# 启航电商 ERP 新人入门指南 > 适用对象:第一次接触 `qihang-ecom-erp-open` 的后端 / 前端 / 测试同学。 > 目标:用最短时间建立“系统全景 + 关键链路 + 学习路径”,并能在本地完成第一次有效开发。 --- ## 1. 项目是什么?你要先建立的全局认知 启航电商 ERP 是一个面向电商企业的“订单中台 + 业务中台”系统底座,强调多平台、多店铺的统一管理能力。核心业务覆盖商品、订单、发货、售后、库存、采购和系统管理。 ### 1.1 业务定位 - 对接多平台店铺(淘宝、京东、拼多多、抖店、微信小店等) - 聚合平台订单和售后数据到统一业务域 - 提供仓储、库存、采购、发货和权限管理能力 - 支持二次开发,可作为企业内部中台基础工程 ### 1.2 架构风格 - 后端:Spring Boot + Spring Cloud Alibaba 微服务 - 前端:Vue2 + Element UI - 中间件:MySQL、Redis、Nacos(可选 Sentinel) --- ## 2. 仓库结构一览(建议背下来) ```text qihang-ecom-erp-open ├─ api/ # 微服务入口层(gateway、erp-api、sys-api、oms-api) ├─ core/ # 公共能力(common、security、interfaces) ├─ model/ # 实体、请求对象、VO 等模型 ├─ mapper/ # MyBatis Mapper 与 XML ├─ service/ # 服务接口定义 ├─ serviceImpl/ # 服务实现聚合模块 ├─ vue/ # 前端工程(Vue2) └─ docs/ # 文档与数据库脚本 ``` ### 2.1 根模块分工 - `api`:承接 HTTP 请求,按业务边界拆分微服务。 - `core/common`:通用工具、公共配置、任务调度等。 - `core/security`:登录、认证、鉴权、Token、安全过滤。 - `model`:全局数据模型。 - `service` + `mapper`:服务接口与数据访问层。 --- ## 3. 微服务拓扑与职责 先记住四个核心服务: 1. `gateway`(端口 8088) - 统一 API 入口 - 按路由规则转发到下游服务 2. `oms-api`(端口 8081) - 平台对接服务(订单、商品、售后、授权、任务拉取) - 目录按平台拆分:`tao/jd/pdd/dou/wei/kwai` 3. `sys-api`(端口 8082) - 用户、角色、菜单、字典、配置等系统能力 4. `erp-api`(端口 38083) - 商品、采购、库存、发货等 ERP 主业务能力 ### 3.1 网关路由规则(核心) - `/api/erp-api/**` -> `erp-api` - `/api/oms-api/**` -> `oms-api` - `/api/sys-api/**` -> `sys-api` - `/api/open-api/**` -> `open-api`(当前仓库中未见独立模块) > 新人常见误区:直接调后端服务端口。 > 建议:前端与外部调用优先走 `gateway:8088`,减少跨服务路径混乱。 --- ## 4. 数据库分层设计(快速定位数据归属) 数据库脚本:`docs/qihang-erp.sql` 表前缀是最重要的索引: - `sys_*`:系统管理(用户、角色、菜单、字典、任务) - `o_*`:统一中台业务对象(订单、商品、库存等) - `oms_*`:平台侧原始数据(按平台拆表) - `erp_*`:采购、仓储、物流等 ERP 业务数据 - `wms_*`:仓储库存作业数据 - `offline_*`:线下订单与售后 > 学习建议:先查 `o_*` 看统一业务对象,再回溯 `oms_*` 看平台原始字段映射。 --- ## 5. 登录认证与权限链路(必须掌握) ### 5.1 登录链路 1. 前端调用登录接口(默认账号密码:admin/admin123) 2. `SysLoginService` 校验验证码和用户名密码 3. `AuthenticationManager` 执行认证 4. `TokenService` 生成 JWT 并写入 Redis 登录态 5. 后续请求经 `JwtAuthenticationTokenFilter` 解析 token 恢复用户上下文 ### 5.2 安全策略 - 后端采用无状态会话(stateless) - 部分接口白名单放行(登录、验证码等) - 其余接口默认需要认证 - Token 具备续期机制(接近过期时自动刷新) > 新人排障第一步:检查请求头 `Authorization` 是否携带 `Bearer ` token。 --- ## 6. 动态任务机制(平台自动拉单关键) 系统内置可动态刷新的 Cron 任务机制: - `IPollableService`:任务标准接口 - `SchedulingConfiguration`:加载/刷新任务调度 - `CronTaskLoader`:应用启动后 + 定时刷新任务配置 - 示例:`PddOrderPullTask`(拼多多订单自动拉取) 理解这一点后,你会看懂“为什么订单拉取不一定写在 Controller 中,而是在任务中自动执行”。 --- ## 7. 本地启动流程(按顺序执行) ### 7.1 准备环境 - JDK 17 - Node.js(建议 16.x) - MySQL 8 - Redis 7 - Nacos 2.x - (可选)Sentinel ### 7.2 初始化数据库 1. 创建数据库:`qihang-erp` 2. 导入脚本:`docs/qihang-erp.sql` ### 7.3 启动后端服务 建议顺序: 1. `oms-api` 2. `sys-api` 3. `erp-api` 4. `gateway` > 注意:网关依赖服务注册,务必确保 Nacos 先启动。 ### 7.4 启动前端 在 `vue/` 目录执行: ```bash npm install npm run dev ``` 访问地址:`http://localhost:88`(以项目配置为准) --- ## 8. 新人第一次读代码:建议从这 3 条链路下手 ### 8.1 链路 A:登录与权限 目标:搞懂谁给 token、谁校验 token、菜单权限哪里控制。 建议阅读顺序: 1. `core/security/SecurityConfig` 2. `core/security/service/SysLoginService` 3. `core/security/TokenService` 4. `sys-api` 登录 / 用户信息相关 controller ### 8.2 链路 B:平台订单拉取 -> 统一订单 目标:看懂“平台适配层”如何向中台统一模型落地。 建议阅读顺序(以 PDD 为例): 1. `oms-api/task/PddOrderPullTask` 2. `oms-api/pdd/...controller/service` 3. `service` 与 `mapper` 中对应订单服务和持久化逻辑 4. `o_*` 与 `oms_pdd_*` 相关表结构 ### 8.3 链路 C:发货与售后回推 目标:理解业务闭环(平台 -> 中台处理 -> 平台状态回传)。 建议从 README 的流程图对应页面功能开始,再对照后端接口查调用链。 --- ## 9. 新人第一个可交付任务(推荐) 从下面选一个“低风险、可验证”的小任务: 1. 新增一个订单列表查询条件(前后端联调) 2. 给某平台拉单任务补充结构化日志字段 3. 对某个列表接口增加分页/排序参数校验 4. 将一个硬编码状态字典改为从字典表读取 交付标准建议: - 能复现需求 - 有接口自测记录 - SQL/接口影响范围说明清晰 - 不影响现有登录和主链路 --- ## 10. 常见坑与排障建议 ### 10.1 服务都启动了但前端报 401 优先排查: - 是否通过网关访问 - token 是否过期/丢失 - 登录接口返回结构是否被前端正确解析 ### 10.2 拉单任务不执行 优先排查: - 定时任务配置表是否启用 - cron 表达式是否合法 - 店铺 API 状态是否已开启 - 平台 appKey/appSecret/accessToken 是否完整 ### 10.3 数据查不到 优先排查: - 查错了前缀域(`oms_*` vs `o_*`) - mapper XML 条件与参数命名不一致 - 时间范围查询字段是否统一(创建时间、支付时间、更新时间) --- ## 11. 30 天学习路线图(建议) ### 第 1 周:跑通系统 + 熟悉目录 - 本地环境跑通 - 画出本地服务拓扑图 - 完成登录与菜单权限链路阅读 ### 第 2 周:深入一个平台(建议 PDD) - 跑通一次手工/自动拉单 - 追踪订单落库模型 - 明确平台模型到统一模型的映射点 ### 第 3 周:承担一个小需求 - 选一个列表页字段扩展或查询条件扩展 - 完成接口、前端、SQL 的端到端修改 - 输出变更说明 ### 第 4 周:提升工程化能力 - 学会从日志定位跨服务问题 - 了解网关路由与服务注册关系 - 总结“平台接入模板”与常见改造点 --- ## 12. 给新人的最终建议 1. **先看流程再看代码**:先读 README 业务流程图,再跟代码。 2. **先主链路再边缘功能**:登录、订单拉取、订单查询、发货、售后优先。 3. **先理解分层职责**:controller 不要写业务细节,服务层要清晰。 4. **改动要小步提交**:每次改一个问题,便于回滚与评审。 5. **养成“数据 + 日志”双证据习惯**:排障时同时看 DB 和服务日志。 欢迎加入项目,建议你从“登录链路 + 一个平台订单拉取链路”开始,两天内就能建立有效认知并进入开发节奏。 --- ## 13. 发货回传链路阅读地图(培训模板) > 适用场景:给新同学做一次 30 分钟“订单履约闭环”培训,目标是明确“发货数据如何从中台回推到店铺平台”。 ### 13.1 先讲清版本边界(非常重要) 开源版里“电子面单发货”接口默认返回“开源版本不支持电子面单功能”,培训时请先说明这个边界,避免新人误判为 Bug: - `oms-api` 的 `pdd/jd/tao/wei/dou` `*WaybillController` 下 `push_ship_send` 等接口为占位能力。 - 例如:`PddWaybillController#pushShipSend`、`JdWaybillController#pushShipSend` 直接返回错误提示。 > 因此,新人应先掌握“手工发货 + 供应商发货确认 + 发货记录落库”主链路,再理解平台回传扩展点。 ### 13.2 开源版可跑通的发货主链路(建议演示) 建议按这 3 个接口讲: 1. `erp-api /shipping/handShip`:手工添加发货记录(`ShipmentController#orderHandShip`) 2. `erp-api /ship/supplier_ship_confirm`:供应商发货确认并录入物流(`OrderShipController#SupplierShipConfirm`) 3. `erp-api /ship/generate_stock_out_entry`:从备货单生成出库单(`OrderShipController#generateStockOutEntry`) 配套查询接口: - `/ship/stock_up_list_by_warehouse` - `/ship/stock_up_list_by_supplier` - `/shipping/list` ### 13.3 推荐阅读顺序(带真实代码位置) 1. 读 README 的“处理订单(发货)”流程图,先建立业务语义。 2. 看 `api/erp-api/.../ShipmentController.java`,理解手工发货参数校验与入库入口。 3. 看 `api/erp-api/.../OrderShipController.java`,理解供应商发货确认与备货/出库流程。 4. 看 `service/src/main/java/cn/qihangerp/module/service/OOrderService.java`、`OOrderShipListService.java`,理解服务层职责。 5. 看 `mapper/src/main/resources/mapper/OOrderMapper.xml`、`OOrderShipListMapper.xml`、`OShipmentItemMapper.xml`,定位状态字段与发货数据落点。 6. 最后看 `api/oms-api/.../TaoShipController.java` 与各 `*WaybillController`,理解“开源版占位、商业版扩展”的边界。 ### 13.4 断点与日志建议(按顺序打) - 断点 1:`ShipmentController#orderHandShip` 参数校验后,确认 `shipType/shopId/orderNum` 等核心字段。 - 断点 2:`OrderShipController#SupplierShipConfirm` 调用 `supplierShipOrderManualLogistics` 前,确认 `logisticsCompany/logisticsCode`。 - 断点 3:`OrderShipController#generateStockOutEntry`,确认备货单到出库单生成条件。 - 断点 4:`*WaybillController#pushShipSend`,让新人看到开源版限制返回,避免错误排障方向。 日志字段建议统一包含:`orderId`、`shopId`、`platform`、`logisticsCompany`、`logisticsCode`、`resultCode`、`resultMsg`。 ### 13.5 常见故障排查清单(开源版视角) 1. **接口返回“开源版本不支持电子面单功能”** - 先确认是否误调用了 `*WaybillController` 的电子面单接口。 - 改走手工发货或供应商发货确认链路。 2. **供应商发货确认失败** - 检查 `id/logisticsCompany/logisticsCode` 是否为空。 - 检查备货单状态是否允许当前操作。 3. **生成出库单失败** - 检查备货单 ID 是否存在且状态正确。 - 回查备货明细是否完整(SKU、数量、仓位信息)。 ### 13.6 30 分钟培训演示脚本(可直接照着讲) 1. 选取一笔“待发货”订单,打开备货列表页面并记录订单号。 2. 调用 `/ship/supplier_ship_confirm` 完成供应商发货确认。 3. 调用 `/ship/generate_stock_out_entry` 生成出库单。 4. 调用 `/shipping/list` 查询发货记录,确认物流单号已落库。 5. 额外演示一次 `/pdd/ewaybill/push_ship_send` 返回“开源版不支持”,强调版本边界。 6. 总结:开源版发货链路重点是“状态变更 + 物流落库 + 出库单生成”,平台回传能力在商业版扩展。