package services import ( "context" "encoding/json" "fmt" "tyapi-server/internal/application/api/commands" "tyapi-server/internal/config" api_repositories "tyapi-server/internal/domains/api/repositories" "tyapi-server/internal/domains/api/services/processors" "tyapi-server/internal/domains/api/services/processors/comb" "tyapi-server/internal/domains/api/services/processors/dwbg" "tyapi-server/internal/domains/api/services/processors/flxg" "tyapi-server/internal/domains/api/services/processors/ivyz" "tyapi-server/internal/domains/api/services/processors/jrzq" "tyapi-server/internal/domains/api/services/processors/pdfg" "tyapi-server/internal/domains/api/services/processors/qcxg" "tyapi-server/internal/domains/api/services/processors/qygl" "tyapi-server/internal/domains/api/services/processors/test" "tyapi-server/internal/domains/api/services/processors/yysy" "tyapi-server/internal/domains/product/services" "tyapi-server/internal/infrastructure/external/alicloud" "tyapi-server/internal/infrastructure/external/jiguang" "tyapi-server/internal/infrastructure/external/muzi" "tyapi-server/internal/infrastructure/external/shujubao" "tyapi-server/internal/infrastructure/external/shumai" "tyapi-server/internal/infrastructure/external/tianyancha" "tyapi-server/internal/infrastructure/external/westdex" "tyapi-server/internal/infrastructure/external/xingwei" "tyapi-server/internal/infrastructure/external/yushan" "tyapi-server/internal/infrastructure/external/zhicha" "tyapi-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 *config.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, shumaiService *shumai.ShumaiService, validator interfaces.RequestValidator, productManagementService *services.ProductManagementService, cfg *config.Config, ) *ApiRequestService { return NewApiRequestServiceWithRepos( westDexService, shujubaoService, muziService, yushanService, tianYanChaService, alicloudService, zhichaService, xingweiService, jiguangService, shumaiService, validator, productManagementService, cfg, 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, shumaiService *shumai.ShumaiService, validator interfaces.RequestValidator, productManagementService *services.ProductManagementService, cfg *config.Config, reportRepo api_repositories.ReportRepository, ) *ApiRequestService { // 创建组合包服务 combService := comb.NewCombService(productManagementService) // 创建处理器依赖容器 processorDeps := processors.NewProcessorDependencies( westDexService, shujubaoService, muziService, yushanService, tianYanChaService, alicloudService, zhichaService, xingweiService, jiguangService, shumaiService, validator, combService, reportRepo, ) // 统一注册所有处理器 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系列处理器 "FLXG0V3B": flxg.ProcessFLXG0V3Bequest, "FLXG0V4B": flxg.ProcessFLXG0V4BRequest, "FLXG162A": flxg.ProcessFLXG162ARequest, "FLXG3D56": flxg.ProcessFLXG3D56Request, "FLXG54F5": flxg.ProcessFLXG54F5Request, "FLXG5876": flxg.ProcessFLXG5876Request, "FLXG75FE": flxg.ProcessFLXG75FERequest, "FLXG9687": flxg.ProcessFLXG9687Request, "FLXG970F": flxg.ProcessFLXG970FRequest, "FLXGC9D1": flxg.ProcessFLXGC9D1Request, "FLXGCA3D": flxg.ProcessFLXGCA3DRequest, "FLXGDEC7": flxg.ProcessFLXGDEC7Request, "FLXG8A3F": flxg.ProcessFLXG8A3FRequest, "FLXG5B2E": flxg.ProcessFLXG5B2ERequest, "FLXG0687": flxg.ProcessFLXG0687Request, "FLXGBC21": flxg.ProcessFLXGBC21Request, "FLXGDEA8": flxg.ProcessFLXGDEA8Request, "FLXGDEA9": flxg.ProcessFLXGDEA9Request, "FLXG5A3B": flxg.ProcessFLXG5A3BRequest, "FLXG9C1D": flxg.ProcessFLXG9C1DRequest, "FLXG2E8F": flxg.ProcessFLXG2E8FRequest, "FLXG7E8F": flxg.ProcessFLXG7E8FRequest, "FLXG3A9B": flxg.ProcessFLXG3A9BRequest, "FLXGK5D2": flxg.ProcessFLXGK5D2Request, // JRZQ系列处理器 "JRZQ8203": jrzq.ProcessJRZQ8203Request, "JRZQ0A03": jrzq.ProcessJRZQ0A03Request, "JRZQ4AA8": jrzq.ProcessJRZQ4AA8Request, "JRZQDCBE": jrzq.ProcessJRZQDCBERequest, "JRZQACAB": jrzq.ProcessJRZQACABERequest, // 银行卡四要素 "JRZQ09J8": jrzq.ProcessJRZQ09J8Request, "JRZQ1D09": jrzq.ProcessJRZQ1D09Request, "JRZQ3C7B": jrzq.ProcessJRZQ3C7BRequest, "JRZQ8A2D": jrzq.ProcessJRZQ8A2DRequest, "JRZQ5E9F": jrzq.ProcessJRZQ5E9FRequest, "JRZQ4B6C": jrzq.ProcessJRZQ4B6CRequest, "JRZQ7F1A": jrzq.ProcessJRZQ7F1ARequest, "JRZQ9E2A": jrzq.ProcessJRZQ9E2ARequest, "JRZQ6F2A": jrzq.ProcessJRZQ6F2ARequest, "JRZQ8B3C": jrzq.ProcessJRZQ8B3CRequest, "JRZQ9D4E": jrzq.ProcessJRZQ9D4ERequest, "JRZQ0L85": jrzq.ProcessJRZQ0L85Request, "JRZQ2F8A": jrzq.ProcessJRZQ2F8ARequest, "JRZQ1E7B": jrzq.ProcessJRZQ1E7BRequest, "JRZQ3C9R": jrzq.ProcessJRZQ3C9RRequest, "JRZQ0B6Y": jrzq.ProcessJRZQ0B6YRequest, "JRZQ9A1W": jrzq.ProcessJRZQ9A1WRequest, "JRZQ8F7C": jrzq.ProcessJRZQ8F7CRequest, "JRZQ1W4X": jrzq.ProcessJRZQ1W4XRequest, "JRZQ3P01": jrzq.ProcessJRZQ3P01Request, "JRZQ3AG6": jrzq.ProcessJRZQ3AG6Request, "JRZQO6L7": jrzq.ProcessJRZQO6L7Request, // 全国自然人经济特征评分模型v3 简版 "JRZQO7L1": jrzq.ProcessJRZQO7L1Request, // 全国自然人经济特征评分模型v4 详版 "JRZQS7G0": jrzq.ProcessJRZQS7G0Request, // 社保综合评分V1 "JRZQ1P5G": jrzq.ProcessJRZQ1P5GRequest, // 全国自然人借贷压力指数查询(2) "JRZQOCRE": jrzq.ProcessJRZQOCREERequest, // 银行卡OCR数卖 "JRZQOCRY": jrzq.ProcessJRZQOCRYERequest, // 银行卡OCR数据宝 // QYGL系列处理器 "QYGL8261": qygl.ProcessQYGL8261Request, "QYGL2ACD": qygl.ProcessQYGL2ACDRequest, "QYGL45BD": qygl.ProcessQYGL45BDRequest, "QYGL6F2D": qygl.ProcessQYGL6F2DRequest, "QYGL8271": qygl.ProcessQYGL8271Request, "QYGLB4C0": qygl.ProcessQYGLB4C0Request, "QYGL23T7": qygl.ProcessQYGL23T7Request, // 企业三要素验证 "QYGL5A3C": qygl.ProcessQYGL5A3CRequest, // 对外投资历史 "QYGL8B4D": qygl.ProcessQYGL8B4DRequest, // 融资历史 "QYGL9E2F": qygl.ProcessQYGL9E2FRequest, // 行政处罚 "QYGL7C1A": qygl.ProcessQYGL7C1ARequest, // 经营异常 "QYGL3F8E": qygl.ProcessQYGL3F8ERequest, // 人企关系加强版 "QYGL7D9A": qygl.ProcessQYGL7D9ARequest, // 欠税公告 "QYGL4B2E": qygl.ProcessQYGL4B2ERequest, // 税收违法 "COMENT01": qygl.ProcessCOMENT01Request, // 企业风险报告 "QYGL5F6A": qygl.ProcessQYGL5F6ARequest, // 企业相关查询 "QYGL2B5C": qygl.ProcessQYGL2B5CRequest, // 企业联系人实际经营地址 "QYGL6S1B": qygl.ProcessQYGL6S1BRequest, //董监高司法综合信息核验 "QYGL9T1Q": qygl.ProcessQYGL9T1QRequest, //全国企业借贷意向验证查询_V1 "QYGL5A9T": qygl.ProcessQYGL5A9TRequest, //全国企业各类工商风险统计数量查询 "QYGL2S0W": qygl.ProcessQYGL2S0WRequest, //失信被执行企业个人查询 "QYGL5CMP": qygl.ProcessQYGL5CMPRequest, //企业五要素验证 "QYGL66SL": qygl.ProcessQYGL66SLRequest, //全国企业司法模型服务查询_V1 "QYGL2NAO": qygl.ProcessQYGL2naoRequest, //股权变更 "QYGLNIO8": qygl.ProcessQYGLNIO8Request, //企业基本信息 "QYGLP0HT": qygl.ProcessQYGLP0HTRequest, //股权穿透 "QYGL5S1I": qygl.ProcessQYGL5S1IRequest, //企业司法涉诉I "QYGLJ1U9": qygl.ProcessQYGLJ1U9Request, //企业全景报告(聚合 QYGLUY3S/QYGLJ0Q1/QYGL5S1I) "QYGLJ0Q1": qygl.ProcessQYGLJ0Q1Request, //企业股权结构全景查询 "QYGLUY3S": qygl.ProcessQYGLUY3SRequest, //企业经营状态全景查询 "YYSY35TA": yysy.ProcessYYSY35TARequest, //运营商归属地数卖 // YYSY系列处理器 "YYSYD50F": yysy.ProcessYYSYD50FRequest, "YYSY09CD": yysy.ProcessYYSY09CDRequest, "YYSY4B21": yysy.ProcessYYSY4B21Request, "YYSY4B37": yysy.ProcessYYSY4B37Request, "YYSY6F2E": yysy.ProcessYYSY6F2ERequest, "YYSYBE08": yysy.ProcessYYSYBE08Request, "YYSYF7DB": yysy.ProcessYYSYF7DBRequest, "YYSY4F2E": yysy.ProcessYYSY4F2ERequest, "YYSY8B1C": yysy.ProcessYYSY8B1CRequest, "YYSY6D9A": yysy.ProcessYYSY6D9ARequest, "YYSY3E7F": yysy.ProcessYYSY3E7FRequest, "YYSY8F3A": yysy.ProcessYYSY8F3ARequest, "YYSY9A1B": yysy.ProcessYYSY9A1BRequest, "YYSY8C2D": yysy.ProcessYYSY8C2DRequest, "YYSY7D3E": yysy.ProcessYYSY7D3ERequest, "YYSY9E4A": yysy.ProcessYYSY9E4ARequest, "YYSY9F1B": yysy.ProcessYYSY9F1BYequest, "YYSY6F2B": yysy.ProcessYYSY6F2BRequest, "YYSY3M8S": yysy.ProcessYYSY3M8SRequest, //运营商二要素查询 "YYSYC4R9": yysy.ProcessYYSYC4R9Request, //运营商三要素详版查询 "YYSYH6D2": yysy.ProcessYYSYH6D2Request, //运营商三要素简版查询 "YYSYP0T4": yysy.ProcessYYSYP0T4Request, //在网时长查询 "YYSYE7V5": yysy.ProcessYYSYE7V5Request, //手机在网状态查询 "YYSYS9W1": yysy.ProcessYYSYS9W1Request, //手机携号转网查询 "YYSYK8R3": yysy.ProcessYYSYK8R3Request, //手机空号检测查询 "YYSYH6F3": yysy.ProcessYYSYH6F3Request, //运营商三要素即时版查询 "YYSYK9R4": yysy.ProcessYYSYK9R4Request, //全网手机三要素验证1979周更新版 "YYSYF2T7": yysy.ProcessYYSYF2T7Request, //手机二次放号检测查询 // IVYZ系列处理器 "IVYZ0B03": ivyz.ProcessIVYZ0B03Request, "IVYZ2125": ivyz.ProcessIVYZ2125Request, "IVYZ385E": ivyz.ProcessIVYZ385ERequest, "IVYZ5733": ivyz.ProcessIVYZ5733Request, "IVYZ9363": ivyz.ProcessIVYZ9363Request, "IVYZ9A2B": ivyz.ProcessIVYZ9A2BRequest, "IVYZADEE": ivyz.ProcessIVYZADEERequest, "IVYZ7F2A": ivyz.ProcessIVYZ7F2ARequest, "IVYZ4E8B": ivyz.ProcessIVYZ4E8BRequest, "IVYZ1C9D": ivyz.ProcessIVYZ1C9DRequest, "IVYZGZ08": ivyz.ProcessIVYZGZ08Request, "IVYZ2A8B": ivyz.ProcessIVYZ2A8BRequest, "IVYZ7C9D": ivyz.ProcessIVYZ7C9DRequest, "IVYZ5E3F": ivyz.ProcessIVYZ5E3FRequest, "IVYZ7F3A": ivyz.ProcessIVYZ7F3ARequest, "IVYZ3P9M": ivyz.ProcessIVYZ3P9MRequest, "IVYZ3A7F": ivyz.ProcessIVYZ3A7FRequest, "IVYZ9D2E": ivyz.ProcessIVYZ9D2ERequest, "IVYZ81NC": ivyz.ProcessIVYZ81NCRequest, "IVYZ6G7H": ivyz.ProcessIVYZ6G7HRequest, "IVYZ8I9J": ivyz.ProcessIVYZ8I9JRequest, "IVYZ9K2L": ivyz.ProcessIVYZ9K2LRequest, "IVYZ2C1P": ivyz.ProcessIVYZ2C1PRequest, "IVYZP2Q6": ivyz.ProcessIVYZP2Q6Request, "IVYZ2B2T": ivyz.ProcessIVYZ2B2TRequest, //能力资质核验(学历) "IVYZ5A9O": ivyz.ProcessIVYZ5A9ORequest, //全国⾃然⼈⻛险评估评分模型 "IVYZ6M8P": ivyz.ProcessIVYZ6M8PRequest, //职业资格证书 "IVYZ9H2M": ivyz.ProcessIVYZ9H2MRequest, //极光个人婚姻查询(V2版) "IVYZZQT3": ivyz.ProcessIVYZZQT3Request, //人脸比对V3 "IVYZBPQ2": ivyz.ProcessIVYZBPQ2Request, //人脸比对V2 "IVYZSFEL": ivyz.ProcessIVYZSFELRequest, //全国自然人人像三要素核验_V1 "IVYZ0S0D": ivyz.ProcessIVYZ0S0DRequest, //劳动仲裁信息查询(个人版) "IVYZ1J7H": ivyz.ProcessIVYZ1J7HRequest, //行驶证核查v2 "IVYZ9K7F": ivyz.ProcessIVYZ9K7FRequest, //身份证实名认证即时版 "IVYZA1B3": ivyz.ProcessIVYZA1B3Request, //公安三要素人脸识别 "IVYZN2P8": ivyz.ProcessIVYZN2P8Request, //身份证实名认证政务版 "IVYZX5QZ": ivyz.ProcessIVYZX5QZRequest, //活体检测 "IVYZX5Q2": ivyz.ProcessIVYZX5Q2Request, //活体识别步骤二 "IVYZOCR1": ivyz.ProcessIVYZOCR1Request, //身份证OCR "IVYZOCR2": ivyz.ProcessIVYZOCR2Request, //身份证OCR2数卖 // COMB系列处理器 - 只注册有自定义逻辑的组合包 "COMB86PM": comb.ProcessCOMB86PMRequest, // 有自定义逻辑:重命名ApiCode "COMBHZY2": comb.ProcessCOMBHZY2Request, // 自定义处理:生成合规报告 "COMBWD01": comb.ProcessCOMBWD01Request, // 自定义处理:将返回结构从数组改为对象 // QCXG系列处理器 "QCXG7A2B": qcxg.ProcessQCXG7A2BRequest, "QCXG9P1C": qcxg.ProcessQCXG9P1CRequest, "QCXG8A3D": qcxg.ProcessQCXG8A3DRequest, "QCXG6B4E": qcxg.ProcessQCXG6B4ERequest, "QCXG4896": qcxg.ProcessQCXG4896Request, "QCXG5F3A": qcxg.ProcessQCXG5F3ARequest, // 极光个人车辆查询 "QCXG4D2E": qcxg.ProcessQCXG4D2ERequest, // 极光名下车辆数量查询 "QCXGJJ2A": qcxg.ProcessQCXGJJ2ARequest, // vin码查车辆信息(一对多) "QCXGGJ3A": qcxg.ProcessQCXGGJ3ARequest, // 车辆vin码查询号牌 "QCXGYTS2": qcxg.ProcessQCXGYTS2Request, // 车辆二要素核验v2 "QCXGP00W": qcxg.ProcessQCXGP00WRequest, // 车辆出险详版查询 "QCXGGB2Q": qcxg.ProcessQCXGGB2QRequest, // 车辆二要素核验V1 "QCXG4I1Z": qcxg.ProcessQCXG4I1ZRequest, // 车辆过户详版查询 "QCXG1H7Y": qcxg.ProcessQCXG1H7YRequest, // 车辆过户简版查询 "QCXG3Z3L": qcxg.ProcessQCXG3Z3LRequest, // 车辆维保详细版查询 "QCXG3Y6B": qcxg.ProcessQCXG3Y6BRequest, // 车辆维保简版查询 "QCXG2T6S": qcxg.ProcessQCXG2T6SRequest, // 车辆里程记录(品牌查询) "QCXG1U4U": qcxg.ProcessQCXG1U4URequest, // "QCXG9F5C": qcxg.ProcessQCXG9F5CERequest, //疑似营运车辆注册平台数 10386 "QCXG3B8Z": qcxg.ProcessQCXG3B8ZRequest, //疑似运营车辆查询(月度里程)10268 "QCXGP1W3": qcxg.ProcessQCXGP1W3Request, //疑似运营车辆查询(季度里程)10269 "QCXGM7R9": qcxg.ProcessQCXGM7R9Request, //疑似运营车辆查询(半年度里程)10270 "QCXGU2K4": qcxg.ProcessQCXGU2K4Request, //疑似运营车辆查询(年度里程)10271 "QCXG5U0Z": qcxg.ProcessQCXG5U0ZRequest, // 车辆静态信息查询 10479 "QCXGY7F2": qcxg.ProcessQCXGY7F2Request, // 二手车VIN估值 10443 "QCXG3M7Z": qcxg.ProcessQCXG3M7ZRequest, //人车关系核验(ETC)10093 月更 // DWBG系列处理器 - 多维报告 "DWBG6A2C": dwbg.ProcessDWBG6A2CRequest, "DWBG8B4D": dwbg.ProcessDWBG8B4DRequest, "DWBG7F3A": dwbg.ProcessDWBG7F3ARequest, // FLXG系列处理器 - 风险管控 (包含原FXHY功能) "FLXG8B4D": flxg.ProcessFLXG8B4DRequest, // TEST系列处理器 - 测试用处理器 "TEST001": test.ProcessTestRequest, "TEST002": test.ProcessTestErrorRequest, "TEST003": test.ProcessTestTimeoutRequest, // PDFG系列处理器 - PDF生成 "PDFG01GZ": pdfg.ProcessPDFG01GZRequest, } // 批量注册到组合包服务 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) }