Files
hzhub/hzhub-erp/docs/ERP_API_MIGRATION.md
大壮 c2513849b4 feat: 添加ERP服务和系统服务,完善员工门户功能
## 新增服务模块

### 1. ERP服务 (hzhub-erp)
- 新增独立的ERP数据适配服务
- 支持SQL Server 2008 R2数据源
- 提供动态API配置管理系统
- 包含客户管理、销售数据等业务接口

### 2. 系统服务 (hzhub-system)
- 新增独立的系统管理服务
- 用户、角色、权限、部门、菜单管理
- 租户管理、操作日志、在线用户监控
- 工作流引擎(warm-flow)集成
- 企业微信审批同步功能

### 3. API网关 (hzhub-gateway)
- 新增Spring Cloud Gateway网关服务
- JWT认证、路由分发、限流熔断
- XSS防护、请求日志记录
- 统一入口端口8080

## 后台管理功能增强

### ERP动态API管理
- 新增动态API配置管理界面
- API测试、文档预览、统计监控
- 错误日志查看、缓存管理
- 从数据库表自动导入API配置

### 系统管理增强
- 企业微信配置管理
- 企业微信审批同步配置
- 部门和用户管理优化

## 员工门户功能完善

### 业务页面
- 审批中心:工作流审批、待办任务
- CRM管理:客户关系管理
- 经销商管理:经销商数据展示
- 供应链管理:采购、库存、销售
- BI报表:数据可视化分析
- ERP数据探索:SQL Server数据查询

### 个人中心
- 基本设置:个人信息管理
- 安全设置:密码修改、登录日志
- 锁屏功能:自动锁屏、手动锁屏

### 其他功能
- 标签页管理:多标签页导航
- 页面缓存:keepAlive缓存机制
- 会话超时:自动检测并提示

## 经销商门户

### 页面路由
- 新增经销商管理页面路由
- AI聊天界面完善

## 文档更新

- ERP API数据库初始化指南
- ERP API前端完整实现文档
- ERP API测试和验证指南
- Gateway路由迁移计划
- 项目配置文档更新

## 部署脚本

- 统一启动/停止/重启脚本
- Docker Compose配置优化
- Nginx配置文件更新

## 技术栈

- 后端: Spring Boot 3.5.8, Java 17
- 前端: Vue 3, TypeScript, Element Plus, Vben Admin
- 工作流: warm-flow 1.8.2
- 网关: Spring Cloud Gateway
- 数据库: MySQL 8.0, SQL Server 2008 R2
- 缓存: Redis 7
- 向量库: Weaviate 1.25.0

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-08 08:00:19 +00:00

264 lines
7.7 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 API动态化迁移完整文档
## 一、迁移背景
原有的ERP硬编码API存在以下问题
- API固定无法动态扩展
- 修改需要重新编译部署
- 缺乏统一管理和监控
- 缺乏缓存和性能优化机制
## 二、解决方案
采用动态API配置系统
- 配置驱动API定义存储在MySQL数据库中
- 灵活管理:通过前端界面可视化管理
- 安全执行使用PreparedStatement防止SQL注入
- SQL Server 2008 R2兼容使用ROW_NUMBER实现分页
## 三、迁移成果
### 3.1 已迁移API清单
| API名称 | 旧路径 | 新路径 | 状态 |
|---------|--------|--------|------|
| 品牌列表 | `/erp/customer/brands` | `/erp/dynamic/v1/customer/brands` | ✅ 可用 |
| 销区列表 | `/erp/customer/sales-areas` | `/erp/dynamic/v1/customer/sales-areas` | ✅ 可用 |
| 客户列表 | `/erp/customer/list` | `/erp/dynamic/v1/customer/list` | ✅ 可用 |
| 客户详情 | `/erp/customer/{code}` | `/erp/dynamic/v1/customer/detail?customerCode={code}` | ✅ 可用 |
### 3.2 数据库表结构
**MySQL配置表hzhub数据库**
```sql
-- API配置表
erp_api_config (4)
- api_id: API唯一标识
- api_name: API名称
- api_path: API路径
- sql_template: SQL模板
- result_type: (LIST/SINGLE/COUNT)
- support_pagination:
-- API参数表
erp_api_param (3)
- param_id:
- api_id: API
- param_name:
- param_type: (String/Integer)
-- API统计表
erp_api_stats (使)
- stats_id: ID
- api_id: API
- call_time:
- response_time:
```
### 3.3 技术架构
**双数据源配置**
- **MySQL (master)**: 存储API配置、参数、统计信息
- **SQL Server (erp)**: 执行ERP动态SQL查询
**核心组件**
- **DynamicApiController**: 动态路由控制器(支持多层级路径)
- **DynamicApiExecutor**: SQL执行引擎PreparedStatement + ROW_NUMBER分页
- **SqlValidator**: SQL安全验证禁止危险关键字
- **ErpApiController**: API配置管理CRUD
## 四、测试验证
### 4.1 功能测试结果
```bash
# 品牌列表返回57条
curl 'http://192.168.120.60:8082/erp/dynamic/v1/customer/brands'
200 OK, data: [{"brand":"5月玫瑰"}, {"brand":"B&G"}, ...]
# 销区列表返回23条
curl 'http://192.168.120.60:8082/erp/dynamic/v1/customer/sales-areas'
200 OK, data: [{"salesAreaCode":"GC001","salesAreaName":"华润置地"}, ...]
# 客户列表总计3177条分页10条
curl 'http://192.168.120.60:8082/erp/dynamic/v1/customer/list?pageNum=1&pageSize=10'
200 OK, total: 3177, rows: 10
# 客户详情
curl 'http://192.168.120.60:8082/erp/dynamic/v1/customer/detail?customerCode=JAH3026'
200 OK, data: {customerCode, customerName, companyName, ...}
```
### 4.2 性能对比
| 指标 | 动态API | 旧API | 说明 |
|------|---------|-------|------|
| 查询速度 | 相同 | 相同 | 都是直接SQL查询 |
| 扩展性 | ✅ 高 | ❌ 低 | 配置化vs硬编码 |
| 管理便利性 | ✅ 高 | ❌ 低 | 前端可视化vs修改代码 |
| 监控统计 | ✅ 支持 | ❌ 无 | 自动记录调用统计 |
| 缓存支持 | ✅ 可配置 | ❌ 无 | Redis缓存可选 |
## 五、前端集成
### 5.1 动态API管理界面
**访问地址**http://192.168.120.60:5666/erp/api
**功能清单**
- ✅ API配置列表查看、搜索、启用/禁用)
- ✅ API编辑SQL模板、参数配置
- ✅ API测试在线执行查看结果
- ✅ API文档预览
- ✅ 缓存管理(清除缓存)
### 5.2 前端调用迁移
**旧版本**
```javascript
// 旧API调用
axios.get('/erp/customer/brands')
axios.get('/erp/customer/list', {params: {pageNum: 1, pageSize: 10}})
```
**新版本**
```javascript
// 动态API调用
axios.get('/erp/dynamic/v1/customer/brands')
axios.get('/erp/dynamic/v1/customer/list', {params: {pageNum: 1, pageSize: 10}})
```
## 六、旧API处理
### 6.1 废弃策略
**标记为@Deprecated**
- 添加`@Deprecated(since = "2026-04-30", forRemoval = true)`注解
- 添加废弃警告日志:每次调用记录迁移提示
- 保留期限3个月至2026-07-30
**废弃路径**
- `/erp/customer/*` → 标记为废弃
- `/erp/test/*` → 保留(开发调试工具)
### 6.2 迁移时间表
| 时间 | 动作 | 说明 |
|------|------|------|
| 2026-04-30 | 标记废弃 | 添加@Deprecated注解和警告日志 |
| 2026-05-30 | 前端迁移 | 前端全面切换到动态API |
| 2026-06-30 | 停止维护 | 旧API不再修复bug |
| 2026-07-30 | 删除代码 | 删除CustomerController及相关代码 |
## 七、后续优化
### 7.1 功能扩展计划
**Phase 2预计2026-05**
- ✅ 从表导入功能从数据库表自动生成API配置
- ✅ 参数化筛选支持WHERE条件动态生成
- ✅ SQL编辑器优化CodeMirror + SQL Server语法高亮
**Phase 3预计2026-06**
- ✅ Redis缓存集成
- ✅ API调用统计可视化
- ✅ 性能监控和慢查询告警
**Phase 4预计2026-07**
- ✅ 权限集成Sa-Token permission_code
- ✅ RateLimiter限流
- ✅ 版本管理v1/v2多版本并存
### 7.2 性能优化建议
1. **启用Redis缓存**对于频繁调用的API品牌列表、销区列表
2. **SQL优化**:为常用查询字段添加索引
3. **批量操作**:支持批量查询减少数据库连接
4. **连接池优化**调整HikariCP参数
## 八、运维指南
### 8.1 新增API流程
1. 前端界面添加配置或SQL插入
```sql
INSERT INTO erp_api_config (api_name, api_path, sql_template, ...)
VALUES ('新API名称', '/erp/dynamic/v1/new/api', 'SELECT ...', ...)
```
2. 配置参数(如需要)
```sql
INSERT INTO erp_api_param (api_id, param_name, param_type, ...)
VALUES (新API_ID, 'param1', 'String', ...)
```
3. 测试验证
```bash
curl 'http://192.168.120.60:8082/erp/dynamic/v1/new/api?param1=value1'
```
4. 前端集成调用
### 8.2 故障排查
**常见问题**
- 404错误检查api_path配置是否正确
- 500错误检查SQL模板语法查看logs/erp.log
- 参数错误检查参数配置表erp_api_param
- 权限错误检查网关白名单AuthGlobalFilter.java
**日志位置**
- ERP服务`/data/hzhub/hzhub-erp/logs/erp.log`
- 网关:`/data/hzhub/hzhub-gateway/logs/gateway.log`
- 前端浏览器Console + Network面板
## 九、安全注意事项
### 9.1 SQL安全
**防护措施**
- ✅ PreparedStatement参数绑定防止SQL注入
- ✅ SqlValidator关键字验证禁止DROP/DELETE等
- ✅ 白名单关键字检查只允许SELECT/FROM/WHERE等
- ✅ 配置表权限控制生产环境启用require_auth
### 9.2 访问控制
**网关白名单**(开发阶段):
```java
// AuthGlobalFilter.java
WHITE_LIST = List.of(
"/erp/test/", "/erp/customer/",
"/erp/api/", "/erp/dynamic/", // 已添加
...
);
```
**生产环境建议**
- 启用Sa-Token权限验证
- 配置require_auth = 1
- 设置permission_code如 erp:api:list
## 十、总结
### 成功要点
1.**完整迁移**4个API全部成功迁移
2.**兼容性解决**SQL Server 2008 R2分页兼容
3.**双数据源配置**MySQL + SQL Server完美分离
4.**前端管理界面**:可视化配置管理
5.**安全防护**PreparedStatement + SQL验证
### 经验教训
1. PID文件机制失效导致服务未重启已改进stop.sh
2. SQL Server版本兼容性问题2008 R2不支持OFFSET FETCH
3. 网关白名单需要同步更新(/erp/api/, /erp/dynamic/
4. 多层级路径需要通配符路由DynamicApiController /**
---
**迁移完成日期**2026-04-30
**文档版本**v1.0
**维护团队**HZHub Team