qihang-ecom-erp-open/docs/新人入门指南.md

353 lines
12 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 启航电商 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. 总结:开源版发货链路重点是“状态变更 + 物流落库 + 出库单生成”,平台回传能力在商业版扩展。