177 lines
4.7 KiB
Markdown
177 lines
4.7 KiB
Markdown
|
|
# 组合包动态处理机制说明
|
|||
|
|
|
|||
|
|
## 🎉 重大更新
|
|||
|
|
|
|||
|
|
组合包系统现在支持**动态处理机制**!这意味着:
|
|||
|
|
- ✅ **零编码**:大部分组合包无需编写任何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控制响应顺序
|
|||
|
|
- **错误隔离**:每个子产品的错误独立处理
|
|||
|
|
|
|||
|
|
现在,创建一个新的组合包就像配置数据库一样简单!🎉
|