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)
|
|
|
|
|
|
}
|