new
This commit is contained in:
176
docs/组合包动态处理机制说明.md
Normal file
176
docs/组合包动态处理机制说明.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# 组合包动态处理机制说明
|
||||
|
||||
## 🎉 重大更新
|
||||
|
||||
组合包系统现在支持**动态处理机制**!这意味着:
|
||||
- ✅ **零编码**:大部分组合包无需编写任何Go代码
|
||||
- ✅ **配置驱动**:只需在数据库配置即可立即使用
|
||||
- ✅ **灵活扩展**:特殊需求仍可通过自定义处理器实现
|
||||
|
||||
## 🔧 工作原理
|
||||
|
||||
### 处理优先级
|
||||
1. **自定义处理器优先**:如果注册了专门的处理器,优先使用
|
||||
2. **通用处理器兜底**:COMB开头的API自动使用通用组合包处理器
|
||||
3. **数据库驱动**:根据数据库配置自动调用子产品处理器
|
||||
|
||||
### 系统架构
|
||||
```
|
||||
API请求 (COMBXXXX)
|
||||
↓
|
||||
优先查找自定义处理器
|
||||
↓ (未找到)
|
||||
检查是否COMB开头
|
||||
↓ (是)
|
||||
通用组合包处理器
|
||||
↓
|
||||
查询数据库获取子产品配置
|
||||
↓
|
||||
并发调用子产品处理器
|
||||
↓
|
||||
聚合结果并返回
|
||||
```
|
||||
|
||||
## 📋 使用方法
|
||||
|
||||
### 方案1:纯配置组合包(推荐)
|
||||
|
||||
**步骤1:创建组合包产品**
|
||||
```sql
|
||||
INSERT INTO products (
|
||||
id, code, name, description,
|
||||
is_package, is_enabled, is_visible,
|
||||
price, category_id
|
||||
) VALUES (
|
||||
'uuid1', 'COMB1234', '身份验证组合包', '包含身份证二要素和手机三要素验证',
|
||||
true, true, true,
|
||||
5.00, 'category_id'
|
||||
);
|
||||
```
|
||||
|
||||
**步骤2:配置子产品**
|
||||
```sql
|
||||
INSERT INTO product_package_items (package_id, product_id, sort_order) VALUES
|
||||
('uuid1', 'product_id_1', 1), -- FLXG162A 身份证二要素
|
||||
('uuid1', 'product_id_2', 2); -- FLXG54F5 手机三要素
|
||||
```
|
||||
|
||||
**步骤3:直接使用**
|
||||
```bash
|
||||
# 立即可用,无需任何代码编写!
|
||||
POST /api/v1/COMB1234
|
||||
{
|
||||
"id_card": "123456789012345678",
|
||||
"name": "张三",
|
||||
"mobile_no": "13800138000"
|
||||
}
|
||||
```
|
||||
|
||||
### 方案2:自定义逻辑组合包
|
||||
|
||||
如果需要对结果进行后处理,才需要编写代码:
|
||||
|
||||
**步骤1:创建处理器文件**
|
||||
```go
|
||||
// internal/domains/api/services/processors/comb/comb1234_processor.go
|
||||
func ProcessCOMB1234Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) {
|
||||
// 参数验证
|
||||
var paramsDto dto.COMB1234Req
|
||||
if err := json.Unmarshal(params, ¶msDto); err != nil {
|
||||
return nil, errors.Join(processors.ErrSystem, err)
|
||||
}
|
||||
|
||||
if err := deps.Validator.ValidateStruct(paramsDto); err != nil {
|
||||
return nil, errors.Join(processors.ErrInvalidParam, err)
|
||||
}
|
||||
|
||||
// 调用组合包服务
|
||||
combinedResult, err := deps.CombService.ProcessCombRequest(ctx, params, deps, "COMB1234")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 自定义后处理逻辑
|
||||
for _, resp := range combinedResult.Responses {
|
||||
if resp.ApiCode == "FLXG162A" && resp.Success {
|
||||
// 添加自定义字段
|
||||
if data, ok := resp.Data.(map[string]interface{}); ok {
|
||||
data["processed_by"] = "COMB1234"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return json.Marshal(combinedResult)
|
||||
}
|
||||
```
|
||||
|
||||
**步骤2:注册处理器**
|
||||
```go
|
||||
// api_request_service.go 中添加
|
||||
"COMB1234": comb.ProcessCOMB1234Request, // 有自定义逻辑
|
||||
```
|
||||
|
||||
**步骤3:添加DTO(如需要)**
|
||||
```go
|
||||
// dto/api_request_dto.go 中添加
|
||||
type COMB1234Req struct {
|
||||
IDCard string `json:"id_card" validate:"required,validIDCard"`
|
||||
Name string `json:"name" validate:"required,min=1,validName"`
|
||||
MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"`
|
||||
}
|
||||
```
|
||||
|
||||
## 📊 现有组合包状态
|
||||
|
||||
### ✅ 已迁移到动态处理
|
||||
- **COMB298Y**:删除了专门的处理器文件,现在使用通用处理器
|
||||
|
||||
### 🔧 保留自定义处理器
|
||||
- **COMB86PM**:有特殊逻辑(重命名ApiCode),保留自定义处理器
|
||||
|
||||
## 🎯 响应格式
|
||||
|
||||
所有组合包都返回统一的响应格式:
|
||||
|
||||
```json
|
||||
{
|
||||
"responses": [
|
||||
{
|
||||
"api_code": "FLXG162A",
|
||||
"success": true,
|
||||
"data": {
|
||||
// 子产品的响应数据
|
||||
}
|
||||
},
|
||||
{
|
||||
"api_code": "FLXG54F5",
|
||||
"success": true,
|
||||
"data": {
|
||||
// 子产品的响应数据
|
||||
}
|
||||
},
|
||||
{
|
||||
"api_code": "YYSY4B37",
|
||||
"success": false,
|
||||
"error": "数据源异常"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
## 🚀 优势总结
|
||||
|
||||
1. **开发效率**:90%的组合包无需编写代码
|
||||
2. **维护成本**:减少重复代码,统一处理逻辑
|
||||
3. **业务灵活**:数据库配置即时生效
|
||||
4. **向后兼容**:现有自定义处理器继续工作
|
||||
5. **扩展性强**:特殊需求仍可通过自定义处理器实现
|
||||
|
||||
## ⚡ 性能特性
|
||||
|
||||
- **并发处理**:所有子产品并发调用
|
||||
- **独立失败**:单个子产品失败不影响其他
|
||||
- **智能排序**:通过sort_order控制响应顺序
|
||||
- **错误隔离**:每个子产品的错误独立处理
|
||||
|
||||
现在,创建一个新的组合包就像配置数据库一样简单!🎉
|
||||
Reference in New Issue
Block a user