4.7 KiB
4.7 KiB
组合包动态处理机制说明
🎉 重大更新
组合包系统现在支持动态处理机制!这意味着:
- ✅ 零编码:大部分组合包无需编写任何Go代码
- ✅ 配置驱动:只需在数据库配置即可立即使用
- ✅ 灵活扩展:特殊需求仍可通过自定义处理器实现
🔧 工作原理
处理优先级
- 自定义处理器优先:如果注册了专门的处理器,优先使用
- 通用处理器兜底:COMB开头的API自动使用通用组合包处理器
- 数据库驱动:根据数据库配置自动调用子产品处理器
系统架构
API请求 (COMBXXXX)
↓
优先查找自定义处理器
↓ (未找到)
检查是否COMB开头
↓ (是)
通用组合包处理器
↓
查询数据库获取子产品配置
↓
并发调用子产品处理器
↓
聚合结果并返回
📋 使用方法
方案1:纯配置组合包(推荐)
步骤1:创建组合包产品
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:配置子产品
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:直接使用
# 立即可用,无需任何代码编写!
POST /api/v1/COMB1234
{
"id_card": "123456789012345678",
"name": "张三",
"mobile_no": "13800138000"
}
方案2:自定义逻辑组合包
如果需要对结果进行后处理,才需要编写代码:
步骤1:创建处理器文件
// 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:注册处理器
// api_request_service.go 中添加
"COMB1234": comb.ProcessCOMB1234Request, // 有自定义逻辑
步骤3:添加DTO(如需要)
// 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),保留自定义处理器
🎯 响应格式
所有组合包都返回统一的响应格式:
{
"responses": [
{
"api_code": "FLXG162A",
"success": true,
"data": {
// 子产品的响应数据
}
},
{
"api_code": "FLXG54F5",
"success": true,
"data": {
// 子产品的响应数据
}
},
{
"api_code": "YYSY4B37",
"success": false,
"error": "数据源异常"
}
]
}
🚀 优势总结
- 开发效率:90%的组合包无需编写代码
- 维护成本:减少重复代码,统一处理逻辑
- 业务灵活:数据库配置即时生效
- 向后兼容:现有自定义处理器继续工作
- 扩展性强:特殊需求仍可通过自定义处理器实现
⚡ 性能特性
- 并发处理:所有子产品并发调用
- 独立失败:单个子产品失败不影响其他
- 智能排序:通过sort_order控制响应顺序
- 错误隔离:每个子产品的错误独立处理
现在,创建一个新的组合包就像配置数据库一样简单!🎉