Files
hyapi-server/internal/domains/api/services/api_request_service.go

297 lines
12 KiB
Go
Raw Normal View History

2026-04-21 22:36:48 +08:00
package services
import (
"context"
"encoding/json"
"fmt"
"hyapi-server/internal/application/api/commands"
appconfig "hyapi-server/internal/config"
api_repositories "hyapi-server/internal/domains/api/repositories"
"hyapi-server/internal/domains/api/services/processors"
"hyapi-server/internal/domains/api/services/processors/comb"
"hyapi-server/internal/domains/api/services/processors/flxg"
"hyapi-server/internal/domains/api/services/processors/ivyz"
"hyapi-server/internal/domains/api/services/processors/jrzq"
"hyapi-server/internal/domains/api/services/processors/qcxg"
"hyapi-server/internal/domains/api/services/processors/qygl"
"hyapi-server/internal/domains/api/services/processors/yysy"
"hyapi-server/internal/domains/product/services"
"hyapi-server/internal/infrastructure/external/alicloud"
2026-06-01 13:15:37 +08:00
"hyapi-server/internal/infrastructure/external/huibo"
2026-04-21 22:36:48 +08:00
"hyapi-server/internal/infrastructure/external/jiguang"
"hyapi-server/internal/infrastructure/external/muzi"
2026-05-28 13:10:27 +08:00
nuoerext "hyapi-server/internal/infrastructure/external/nuoer"
2026-04-21 22:36:48 +08:00
"hyapi-server/internal/infrastructure/external/shujubao"
2026-06-10 20:32:24 +08:00
"hyapi-server/internal/infrastructure/external/tianyuanapi"
2026-04-21 22:36:48 +08:00
"hyapi-server/internal/infrastructure/external/tianyancha"
"hyapi-server/internal/infrastructure/external/westdex"
"hyapi-server/internal/infrastructure/external/xingwei"
"hyapi-server/internal/infrastructure/external/yushan"
"hyapi-server/internal/infrastructure/external/zhicha"
"hyapi-server/internal/shared/interfaces"
)
var (
ErrDatasource = processors.ErrDatasource
ErrSystem = processors.ErrSystem
ErrInvalidParam = processors.ErrInvalidParam
ErrNotFound = processors.ErrNotFound
)
type ApiRequestService struct {
// 可注入依赖,如第三方服务、模型等
westDexService *westdex.WestDexService
muziService *muzi.MuziService
yushanService *yushan.YushanService
tianYanChaService *tianyancha.TianYanChaService
alicloudService *alicloud.AlicloudService
validator interfaces.RequestValidator
processorDeps *processors.ProcessorDependencies
combService *comb.CombService
config *appconfig.Config
reportRepo api_repositories.ReportRepository
}
func NewApiRequestService(
westDexService *westdex.WestDexService,
shujubaoService *shujubao.ShujubaoService,
muziService *muzi.MuziService,
yushanService *yushan.YushanService,
tianYanChaService *tianyancha.TianYanChaService,
alicloudService *alicloud.AlicloudService,
zhichaService *zhicha.ZhichaService,
xingweiService *xingwei.XingweiService,
jiguangService *jiguang.JiguangService,
2026-06-10 20:32:24 +08:00
tianyuanapiService *tianyuanapi.TianyuanapiService,
2026-05-28 13:10:27 +08:00
nuoerService *nuoerext.NuoerService,
2026-06-01 13:15:37 +08:00
huiboService *huibo.HuiboService,
2026-04-21 22:36:48 +08:00
validator interfaces.RequestValidator,
productManagementService *services.ProductManagementService,
cfg *appconfig.Config,
) *ApiRequestService {
return NewApiRequestServiceWithRepos(
westDexService,
shujubaoService,
muziService,
yushanService,
tianYanChaService,
alicloudService,
zhichaService,
xingweiService,
jiguangService,
2026-06-10 20:32:24 +08:00
tianyuanapiService,
2026-05-28 13:10:27 +08:00
nuoerService,
2026-06-01 13:15:37 +08:00
huiboService,
2026-04-21 22:36:48 +08:00
validator,
productManagementService,
cfg,
nil,
nil,
)
}
// NewApiRequestServiceWithRepos 带自定义仓储的构造函数,便于扩展(例如企业报告记录)
func NewApiRequestServiceWithRepos(
westDexService *westdex.WestDexService,
shujubaoService *shujubao.ShujubaoService,
muziService *muzi.MuziService,
yushanService *yushan.YushanService,
tianYanChaService *tianyancha.TianYanChaService,
alicloudService *alicloud.AlicloudService,
zhichaService *zhicha.ZhichaService,
xingweiService *xingwei.XingweiService,
jiguangService *jiguang.JiguangService,
2026-06-10 20:32:24 +08:00
tianyuanapiService *tianyuanapi.TianyuanapiService,
2026-05-28 13:10:27 +08:00
nuoerService *nuoerext.NuoerService,
2026-06-01 13:15:37 +08:00
huiboService *huibo.HuiboService,
2026-04-21 22:36:48 +08:00
validator interfaces.RequestValidator,
productManagementService *services.ProductManagementService,
cfg *appconfig.Config,
reportRepo api_repositories.ReportRepository,
qyglReportPDFScheduler processors.QYGLReportPDFScheduler,
) *ApiRequestService {
// 创建组合包服务
combService := comb.NewCombService(productManagementService)
apiPublicBase := ""
if cfg != nil {
apiPublicBase = appconfig.ResolveAPIPublicBaseURL(&cfg.API)
}
// 创建处理器依赖容器
processorDeps := processors.NewProcessorDependencies(
westDexService,
shujubaoService,
muziService,
yushanService,
tianYanChaService,
alicloudService,
zhichaService,
xingweiService,
jiguangService,
2026-06-10 20:32:24 +08:00
tianyuanapiService,
2026-05-28 13:10:27 +08:00
nuoerService,
2026-06-01 13:15:37 +08:00
huiboService,
2026-04-21 22:36:48 +08:00
validator,
combService,
reportRepo,
qyglReportPDFScheduler,
apiPublicBase,
)
// 统一注册所有处理器
registerAllProcessors(combService)
return &ApiRequestService{
westDexService: westDexService,
muziService: muziService,
yushanService: yushanService,
tianYanChaService: tianYanChaService,
alicloudService: alicloudService,
validator: validator,
processorDeps: processorDeps,
combService: combService,
config: cfg,
reportRepo: reportRepo,
}
}
// registerAllProcessors 统一注册所有处理器
func registerAllProcessors(combService *comb.CombService) {
// 定义所有处理器映射
processorMap := map[string]processors.ProcessorFunc{
// FLXG系列处理器
2026-06-10 20:32:24 +08:00
"FLXGJI17": flxg.ProcessFLXGJI17Request, //董监高司法综合信息核验
"FLXGMMG7": flxg.ProcessFLXGMMG7Request, //个人诉讼定制版
"FLXGC4CT": flxg.ProcessFLXGC4CTRequest, //个人涉诉案件查询汇博
2026-04-21 22:36:48 +08:00
// JRZQ系列处理器
2026-06-10 20:32:24 +08:00
"JRZQOICN": jrzq.ProcessJRZQOICNRequest, // 银行卡四要素
"JRZQMDQ1": jrzq.ProcessJRZQMDQ1Request, // 银行卡OCR数卖
"JRZQDMLO": jrzq.ProcessJRZQDMLORequest, // 银行卡OCR数据宝
"JRZQ65ZO": jrzq.ProcessJRZQ65ZORequest, // 支付行为指数诺尔
"JRZQNKEI": jrzq.ProcessJRZQNKEIRequest, //风险量级V8
"JRZQQKEC": jrzq.ProcessJRZQQKECRequest, //风险量级V9
"JRZQI079": jrzq.ProcessJRZQI079Request, //风险量级V10
"JRZQV7YZ": jrzq.ProcessJRZQV7YZRequest, //信用全景V21
"JRZQX5DM": jrzq.ProcessJRZQX5DMRequest, //借贷意向验证
"JRZQ1AIJ": jrzq.ProcessJRZQ1AIJRequest, //洞侦多头履约行为
"JRZQZ05I": jrzq.ProcessJRZQZ05IRequest, //租赁申请意向
"JRZQNK43": jrzq.ProcessJRZQNK43Request, //租赁申请意向V22
"JRZQNVM8": jrzq.ProcessJRZQNVM8Request, //风险变量V5F4
"JRZQMLZX": jrzq.ProcessJRZQMLZXRequest, //特殊名单
"JRZQQD4F": jrzq.ProcessJRZQQD4FRequest, //债务逾期黑名单V3_1
"JRZQVBHJ": jrzq.ProcessJRZQVBHJRequest, //投诉风险筛查V709
"JRZQBQIR": jrzq.ProcessJRZQBQIRRequest, //黑名单V110_c10
"JRZQTM1V": jrzq.ProcessJRZQTM1VRequest, //特殊名单1010
"JRZQNEP0": jrzq.ProcessJRZQNEP0Request, //智享分
"JRZQLY6D": jrzq.ProcessJRZQLY6DRequest, //智瞳-通用版
"JRZQAH34": jrzq.ProcessJRZQAH34Request, //智瞳分尊享版
"JRZQML9G": jrzq.ProcessJRZQML9GRequest, //坤羽模型V3-标签版
2026-04-21 22:36:48 +08:00
// QYGL系列处理器
2026-06-10 20:32:24 +08:00
"QYGL7HBN": qygl.ProcessQYGL7HBNRequest, //企业全景报告(聚合 QYGLUY3S/QYGLJ0Q1/QYGL5S1I
"QYGL9MYB": qygl.ProcessQYGL9MYBRequest, //企业股权结构全景查询
"QYGLALPK": qygl.ProcessQYGLALPKRequest, //企业经营状态全景查询
"QYGLUDJG": qygl.ProcessQYGLUDJGRequest, //企业年报信息核验
"QYGLWYEK": qygl.ProcessQYGLWYEKRequest, //企业税收违法核查
"QYGLWV7U": qygl.ProcessQYGLWV7URequest, //人企关联
"QYGL7Z0O": qygl.ProcessQYGL7Z0ORequest, //企业诉讼定制版
"QYGLLUCM": qygl.ProcessQYGLLUCMRequest, //企业案件查询汇博
2026-04-21 22:36:48 +08:00
// YYSY系列处理器
2026-06-10 20:32:24 +08:00
"YYSY0YYV": yysy.ProcessYYSY0YYVRequest, //运营商二要素查询
"YYSYS66T": yysy.ProcessYYSYS66TRequest, //运营商三要素详版查询
"YYSYN8DI": yysy.ProcessYYSYN8DIRequest, //运营商三要素简版查询
"YYSYUO7E": yysy.ProcessYYSYUO7ERequest, //在网时长查询
"YYSYKTQO": yysy.ProcessYYSYKTQORequest, //手机在网状态查询
"YYSYXAES": yysy.ProcessYYSYXAESRequest, //手机携号转网查询
"YYSYJXZF": yysy.ProcessYYSYJXZFRequest, //手机空号检测查询
"YYSYXHHO": yysy.ProcessYYSYXHHORequest, //运营商三要素即时版查询
"YYSYGLSF": yysy.ProcessYYSYGLSFRequest, //全网手机三要素验证1979周更新版
"YYSYP7PL": yysy.ProcessYYSYP7PLRequest, //手机二次放号检测查询
2026-04-21 22:36:48 +08:00
// IVYZ系列处理器
2026-06-10 20:32:24 +08:00
"IVYZSQ0E": ivyz.ProcessIVYZSQ0ERequest, //身份证实名认证即时版
"IVYZE42I": ivyz.ProcessIVYZE42IRequest, //公安三要素人脸识别
"IVYZDXMD": ivyz.ProcessIVYZDXMDRequest, //人脸身份证比对(数脉)
"IVYZFO5K": ivyz.ProcessIVYZFO5KRequest, //身份证实名认证政务版
"IVYZWVYA": ivyz.ProcessIVYZWVYARequest, //活体检测
"IVYZKJ31": ivyz.ProcessIVYZKJ31Request, //活体识别步骤二
"IVYZ9OHN": ivyz.ProcessIVYZ9OHNRequest, //身份证OCR
"IVYZZSCG": ivyz.ProcessIVYZZSCGRequest, //身份证OCR2数卖
"IVYZYQKX": ivyz.ProcessIVYZYQKXRequest, //婚姻状况核验V2单人
"IVYZO4RX": ivyz.ProcessIVYZO4RXRequest, //婚姻状况核验(单人)
"IVYZRHT5": ivyz.ProcessIVYZRHT5Request, //婚姻状态核验(双人)
"IVYZYDQM": ivyz.ProcessIVYZYDQMRequest, //婚姻状态核验V2双人
"IVYZPYSO": ivyz.ProcessIVYZPYSORequest, //双人婚姻评估查询zhicha版本
"IVYZOQFB": ivyz.ProcessIVYZOQFBRequest, //身份风险V106
"IVYZBI6F": ivyz.ProcessIVYZBI6FRequest, //消费能力
"IVYZ6W0U": ivyz.ProcessIVYZ6W0URequest, //收入等级
2026-04-21 22:36:48 +08:00
// COMB系列处理器 - 只注册有自定义逻辑的组合包
// QCXG系列处理器
2026-06-10 20:32:24 +08:00
"QCXGFV9W": qcxg.ProcessQCXGFV9WRequest, //疑似营运车辆注册平台数 10386
"QCXG76VA": qcxg.ProcessQCXG76VARequest, //疑似运营车辆查询月度里程10268
"QCXGYQDC": qcxg.ProcessQCXGYQDCRequest, //疑似运营车辆查询季度里程10269
"QCXGGFWW": qcxg.ProcessQCXGGFWWRequest, //疑似运营车辆查询半年度里程10270
"QCXGYWSV": qcxg.ProcessQCXGYWSVRequest, //疑似运营车辆查询年度里程10271
"QCXG521L": qcxg.ProcessQCXG521LRequest, // 车辆静态信息查询 10479
"QCXGIJY3": qcxg.ProcessQCXGIJY3Request, // 名下车辆诺尔
2026-04-21 22:36:48 +08:00
// DWBG系列处理器 - 多维报告
// FLXG系列处理器 - 风险管控 (包含原FXHY功能)
// PDFG系列处理器 - PDF生成
}
// 批量注册到组合包服务
for apiCode, processor := range processorMap {
combService.RegisterProcessor(apiCode, processor)
}
// 同时设置全局处理器映射
RequestProcessors = processorMap
}
// 注册API处理器 - 现在通过registerAllProcessors统一管理
var RequestProcessors map[string]processors.ProcessorFunc
// PreprocessRequestApi 调用指定的请求处理函数
func (a *ApiRequestService) PreprocessRequestApi(ctx context.Context, apiCode string, params []byte, options *commands.ApiCallOptions, callContext *processors.CallContext) ([]byte, error) {
// 设置Options和CallContext到依赖容器
deps := a.processorDeps.WithOptions(options).WithCallContext(callContext)
// 将apiCode放入context供外部服务使用
ctx = context.WithValue(ctx, "api_code", apiCode)
// 将config放入context供处理器使用
ctx = context.WithValue(ctx, "config", a.config)
// 1. 优先查找已注册的自定义处理器
if processor, exists := RequestProcessors[apiCode]; exists {
return processor(ctx, params, deps)
}
// 2. 检查是否为组合包COMB开头使用通用组合包处理器
if len(apiCode) >= 4 && apiCode[:4] == "COMB" {
return a.processGenericCombRequest(ctx, apiCode, params, deps)
}
return nil, fmt.Errorf("%s: 未找到处理器: %s", ErrSystem, apiCode)
}
// processGenericCombRequest 通用组合包处理器
func (a *ApiRequestService) processGenericCombRequest(ctx context.Context, apiCode string, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) {
// 调用组合包服务处理请求
// 这里不需要验证参数,因为组合包的参数验证由各个子处理器负责
combinedResult, err := deps.CombService.ProcessCombRequest(ctx, params, deps, apiCode)
if err != nil {
return nil, err
}
// 直接返回组合结果,无任何自定义处理
return json.Marshal(combinedResult)
}