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" "hyapi-server/internal/infrastructure/external/huibo" "hyapi-server/internal/infrastructure/external/jiguang" "hyapi-server/internal/infrastructure/external/muzi" nuoerext "hyapi-server/internal/infrastructure/external/nuoer" "hyapi-server/internal/infrastructure/external/shujubao" "hyapi-server/internal/infrastructure/external/tianyuanapi" "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, tianyuanapiService *tianyuanapi.TianyuanapiService, nuoerService *nuoerext.NuoerService, huiboService *huibo.HuiboService, validator interfaces.RequestValidator, productManagementService *services.ProductManagementService, cfg *appconfig.Config, ) *ApiRequestService { return NewApiRequestServiceWithRepos( westDexService, shujubaoService, muziService, yushanService, tianYanChaService, alicloudService, zhichaService, xingweiService, jiguangService, tianyuanapiService, nuoerService, huiboService, 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, tianyuanapiService *tianyuanapi.TianyuanapiService, nuoerService *nuoerext.NuoerService, huiboService *huibo.HuiboService, 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, tianyuanapiService, nuoerService, huiboService, 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系列处理器 "FLXGJI17": flxg.ProcessFLXGJI17Request, //董监高司法综合信息核验 "FLXGMMG7": flxg.ProcessFLXGMMG7Request, //个人诉讼定制版 "FLXGC4CT": flxg.ProcessFLXGC4CTRequest, //个人涉诉案件查询汇博 // JRZQ系列处理器 "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-标签版 // QYGL系列处理器 "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, //企业案件查询汇博 // YYSY系列处理器 "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, //手机二次放号检测查询 // IVYZ系列处理器 "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, //收入等级 // COMB系列处理器 - 只注册有自定义逻辑的组合包 // QCXG系列处理器 "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, // 名下车辆诺尔 // 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) }