diff --git a/config.yaml b/config.yaml index f16a79a..37c3a4d 100644 --- a/config.yaml +++ b/config.yaml @@ -653,3 +653,36 @@ shujubao: max_backups: 5 max_age: 30 compress: true + + +# =========================================== +# 🌐 诺尔智汇配置 +# =========================================== +nuoer: + url: "https://api.enolfax.com/enol/api" + app_id: "t4qO2mR3" + app_secret: "d1515bf9ed2f2fe063b5f4f7e2c50f0ec65bfd58" + timeout: 4s + logging: + enabled: true + log_dir: "logs/external_services" + service_name: "nuoer" + use_daily: true + enable_level_separation: true + # 各级别配置 + level_configs: + info: + max_size: 100 + max_backups: 5 + max_age: 30 + compress: true + error: + max_size: 200 + max_backups: 10 + max_age: 90 + compress: true + warn: + max_size: 100 + max_backups: 5 + max_age: 30 + compress: true \ No newline at end of file diff --git a/configs/env.development.yaml b/configs/env.development.yaml index c943197..defc679 100644 --- a/configs/env.development.yaml +++ b/configs/env.development.yaml @@ -191,3 +191,14 @@ sms: captcha_enabled: false # 是否启用滑块验证码 captcha_secret: "" # 阿里云验证码密钥(可选) scene_id: "wynt39to" # 阿里云验证码场景ID + +# 诺尔智汇配置 +nuoer: + url: "https://api.enolfax.com/enol/api" + app_id: "t4qO2mR3" + app_secret: "d1515bf9ed2f2fe063b5f4f7e2c50f0ec65bfd58" +development: + enable_cors: true + cors_allowed_origins: "http://localhost:5173,http://localhost:8080" + cors_allowed_methods: "GET,POST,PUT,PATCH,DELETE,OPTIONS" + cors_allowed_headers: "Origin,Content-Type,Accept,Authorization,X-Requested-With,Access-Id" diff --git a/internal/config/config.go b/internal/config/config.go index 84dcd93..5f1e196 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -41,6 +41,7 @@ type Config struct { Jiguang JiguangConfig `mapstructure:"jiguang"` Shumai ShumaiConfig `mapstructure:"shumai"` Shujubao ShujubaoConfig `mapstructure:"shujubao"` + Nuoer NuoerConfig `mapstructure:"nuoer"` PDFGen PDFGenConfig `mapstructure:"pdfgen"` } @@ -681,6 +682,33 @@ type ShujubaoLevelFileConfig struct { Compress bool `mapstructure:"compress"` } +// NuoerConfig 诺尔智汇配置 +type NuoerConfig struct { + URL string `mapstructure:"url"` + AppID string `mapstructure:"app_id"` + AppSecret string `mapstructure:"app_secret"` + Timeout time.Duration `mapstructure:"timeout"` + + Logging NuoerLoggingConfig `mapstructure:"logging"` +} + +// NuoerLoggingConfig 诺尔智汇日志配置 +type NuoerLoggingConfig struct { + Enabled bool `mapstructure:"enabled"` + LogDir string `mapstructure:"log_dir"` + UseDaily bool `mapstructure:"use_daily"` + EnableLevelSeparation bool `mapstructure:"enable_level_separation"` + LevelConfigs map[string]NuoerLevelFileConfig `mapstructure:"level_configs"` +} + +// NuoerLevelFileConfig 诺尔智汇日志级别配置 +type NuoerLevelFileConfig struct { + MaxSize int `mapstructure:"max_size"` + MaxBackups int `mapstructure:"max_backups"` + MaxAge int `mapstructure:"max_age"` + Compress bool `mapstructure:"compress"` +} + // PDFGenConfig PDF生成服务配置 type PDFGenConfig struct { DevelopmentURL string `mapstructure:"development_url"` // 开发环境服务地址 diff --git a/internal/container/container.go b/internal/container/container.go index 838a951..da8ab35 100644 --- a/internal/container/container.go +++ b/internal/container/container.go @@ -41,6 +41,7 @@ import ( "hyapi-server/internal/infrastructure/external/email" "hyapi-server/internal/infrastructure/external/jiguang" "hyapi-server/internal/infrastructure/external/muzi" + "hyapi-server/internal/infrastructure/external/nuoer" "hyapi-server/internal/infrastructure/external/ocr" "hyapi-server/internal/infrastructure/external/shujubao" "hyapi-server/internal/infrastructure/external/shumai" @@ -403,6 +404,10 @@ func NewContainer() *Container { func(cfg *config.Config) (*shujubao.ShujubaoService, error) { return shujubao.NewShujubaoServiceWithConfig(cfg) }, + // NuoerService - 诺尔智汇服务 + func(cfg *config.Config) (*nuoer.NuoerService, error) { + return nuoer.NewNuoerServiceWithConfig(cfg) + }, func(cfg *config.Config) *yushan.YushanService { return yushan.NewYushanService( cfg.Yushan.URL, diff --git a/internal/domains/api/dto/api_request_dto.go b/internal/domains/api/dto/api_request_dto.go index bb3c8cc..d0e9eb9 100644 --- a/internal/domains/api/dto/api_request_dto.go +++ b/internal/domains/api/dto/api_request_dto.go @@ -1079,3 +1079,156 @@ type JRZQ1P5GReq struct { MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"` AuthAuthorizeFileCode string `json:"auth_authorize_file_code" validate:"required"` } + +type JRZQBHZ4Req 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"` +} + +type QCXGM4CLReq struct { + IDCard string `json:"id_card" validate:"required,validIDCard"` +} + +type JRZQV8V8Req 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"` +} + +type JRZQV9V9Req 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"` +} + +type JRZQV1O0Req 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"` +} + +type JRZQV2O1Req 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"` +} + +type IVYZV1O6Req struct { + IDCard string `json:"id_card" validate:"required,validIDCard"` + Name string `json:"name" validate:"required,min=1,validName"` +} + +type QYGLV4S6Req struct { + EntCode string `json:"ent_code" validate:"required,validUSCI"` + EntName string `json:"ent_name" validate:"required,min=1,validEnterpriseName"` +} + +type JRZQV7D1Req 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"` +} + +type JRZQV07TReq 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"` +} + +type JRZQVZ3YReq 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"` +} + +type JRZQVZ2YReq 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"` +} + +type JRZQVT72Req 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"` +} + +type JRZQV5F4Req 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"` +} + +type QYGLVR76Req struct { + IDCard string `json:"id_card" validate:"required,validIDCard"` +} + +type IVYZVXF6Req 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"` +} + +type IVYZVJJ6Req 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"` +} + +type JRZQV7MDReq 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"` +} + +type JRZQV3HMReq struct { + IDCard string `json:"id_card" validate:"required,validIDCard"` + MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"` +} + +type JRZQVT43Req struct { + MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"` +} + +type JRZQV87MReq 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"` +} + +type JRZQV0MDReq 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"` +} + +type JRZQVZXFReq 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"` +} + +type FLXGG0S4Req 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"` +} + +type JRZQVZTFReq 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"` +} + +type JRZQV4TFReq 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"` +} + +type JRZQVKK6Req 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"` +} diff --git a/internal/domains/api/services/api_request_service.go b/internal/domains/api/services/api_request_service.go index af3b5b8..1587039 100644 --- a/internal/domains/api/services/api_request_service.go +++ b/internal/domains/api/services/api_request_service.go @@ -23,6 +23,7 @@ import ( "hyapi-server/internal/infrastructure/external/alicloud" "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/shumai" "hyapi-server/internal/infrastructure/external/tianyancha" @@ -66,6 +67,7 @@ func NewApiRequestService( xingweiService *xingwei.XingweiService, jiguangService *jiguang.JiguangService, shumaiService *shumai.ShumaiService, + nuoerService *nuoerext.NuoerService, validator interfaces.RequestValidator, productManagementService *services.ProductManagementService, cfg *appconfig.Config, @@ -81,6 +83,7 @@ func NewApiRequestService( xingweiService, jiguangService, shumaiService, + nuoerService, validator, productManagementService, cfg, @@ -101,6 +104,7 @@ func NewApiRequestServiceWithRepos( xingweiService *xingwei.XingweiService, jiguangService *jiguang.JiguangService, shumaiService *shumai.ShumaiService, + nuoerService *nuoerext.NuoerService, validator interfaces.RequestValidator, productManagementService *services.ProductManagementService, cfg *appconfig.Config, @@ -127,6 +131,7 @@ func NewApiRequestServiceWithRepos( xingweiService, jiguangService, shumaiService, + nuoerService, validator, combService, reportRepo, @@ -181,6 +186,7 @@ func registerAllProcessors(combService *comb.CombService) { "FLXG3A9B": flxg.ProcessFLXG3A9BRequest, "FLXGK5D2": flxg.ProcessFLXGK5D2Request, "FLXGDJG3": flxg.ProcessFLXGDJG3Request, //董监高司法综合信息核验 + "FLXGG0S4": flxg.ProcessFLXGG0S4Request, //个人诉讼定制版 // JRZQ系列处理器 "JRZQ8203": jrzq.ProcessJRZQ8203Request, "JRZQ0A03": jrzq.ProcessJRZQ0A03Request, @@ -214,7 +220,25 @@ func registerAllProcessors(combService *comb.CombService) { "JRZQ1P5G": jrzq.ProcessJRZQ1P5GRequest, // 全国自然人借贷压力指数查询(2) "JRZQOCRE": jrzq.ProcessJRZQOCREERequest, // 银行卡OCR数卖 "JRZQOCRY": jrzq.ProcessJRZQOCRYERequest, // 银行卡OCR数据宝 - + "JRZQBHZ4": jrzq.ProcessJRZQBHZ4Request, // 支付行为指数诺尔 + "JRZQV8V8": jrzq.ProcessJRZQV8V8Request, //风险量级V8 + "JRZQV9V9": jrzq.ProcessJRZQV9V9Request, //风险量级V9 + "JRZQV1O0": jrzq.ProcessJRZQV1O0Request, //风险量级V10 + "JRZQV2O1": jrzq.ProcessJRZQV2O1Request, //信用全景V21 + "JRZQV7D1": jrzq.ProcessJRZQV7D1Request, //借贷意向验证 + "JRZQV07T": jrzq.ProcessJRZQV07TRequest, //洞侦多头履约行为 + "JRZQVZ3Y": jrzq.ProcessJRZQVZ3YRequest, //租赁申请意向 + "JRZQVZ2Y": jrzq.ProcessJRZQVZ2YRequest, //租赁申请意向V22 + "JRZQV5F4": jrzq.ProcessJRZQV5F4Request, //风险变量V5F4 + "JRZQV7MD": jrzq.ProcessJRZQV7MDRequest, //特殊名单 + "JRZQV3HM": jrzq.ProcessJRZQV3HMRequest, //债务逾期黑名单V3_1 + "JRZQVT43": jrzq.ProcessJRZQVT43Request, //投诉风险筛查V709 + "JRZQV87M": jrzq.ProcessJRZQV87MReqest, //黑名单V110_c10 + "JRZQV0MD": jrzq.ProcessJRZQV0MDRequest, //特殊名单1010 + "JRZQVZXF": jrzq.ProcessJRZQVZXFRequest, //智享分 + "JRZQVZTF": jrzq.ProcessJRZQVZTFRequest, //智瞳-通用版 + "JRZQV4TF": jrzq.ProcessJRZQV4TFRequest, //智瞳分尊享版 + "JRZQVKK6": jrzq.ProcessJRZQVKK6Request, //坤羽模型V3-标签版 // QYGL系列处理器 "QYGL8261": qygl.ProcessQYGL8261Request, "QYGL2ACD": qygl.ProcessQYGL2ACDRequest, @@ -248,6 +272,8 @@ func registerAllProcessors(combService *comb.CombService) { "QYGLUY3S": qygl.ProcessQYGLUY3SRequest, //企业经营状态全景查询 "QYGLDJ12": qygl.ProcessQYGLDJ12Request, //企业年报信息核验 "QYGL8848": qygl.ProcessQYGL8848Request, //企业税收违法核查 + "QYGLVR76": qygl.ProcessQYGLVR76Request, //人企关联 + "QYGLV4S6": qygl.ProcessQYGLV4S6Request, //企业诉讼定制版 // YYSY系列处理器 "YYSY35TA": yysy.ProcessYYSY35TARequest, //运营商归属地数卖 @@ -329,6 +355,9 @@ func registerAllProcessors(combService *comb.CombService) { "IVYZ38SR": ivyz.ProcessIVYZ38SRRequest, //婚姻状态核验(双人) "IVYZ48SR": ivyz.ProcessIVYZ48SRRequest, //婚姻状态核验V2(双人) "IVYZ5E22": ivyz.ProcessIVYZ5E22Request, //双人婚姻评估查询zhicha版本 + "IVYZV1O6": ivyz.ProcessIVYZV1O6Request, //身份风险V106 + "IVYZVXF6": ivyz.ProcessIVYZVXF6Request, //消费能力 + "IVYZVJJ6": ivyz.ProcessIVYZVJJ6Request, //收入等级 // COMB系列处理器 - 只注册有自定义逻辑的组合包 "COMB86PM": comb.ProcessCOMB86PMRequest, // 有自定义逻辑:重命名ApiCode @@ -362,6 +391,7 @@ func registerAllProcessors(combService *comb.CombService) { "QCXG5U0Z": qcxg.ProcessQCXG5U0ZRequest, // 车辆静态信息查询 10479 "QCXGY7F2": qcxg.ProcessQCXGY7F2Request, // 二手车VIN估值 10443 "QCXG3M7Z": qcxg.ProcessQCXG3M7ZRequest, //人车关系核验(ETC)10093 月更 + "QCXGM4CL": qcxg.ProcessQCXGM4CLRequest, // 名下车辆诺尔 // DWBG系列处理器 - 多维报告 "DWBG6A2C": dwbg.ProcessDWBG6A2CRequest, diff --git a/internal/domains/api/services/form_config_service.go b/internal/domains/api/services/form_config_service.go index 017c998..53b9a8b 100644 --- a/internal/domains/api/services/form_config_service.go +++ b/internal/domains/api/services/form_config_service.go @@ -2,10 +2,10 @@ package services import ( "context" - "reflect" - "strings" "hyapi-server/internal/domains/api/dto" product_services "hyapi-server/internal/domains/product/services" + "reflect" + "strings" ) // FormField 表单字段配置 @@ -275,6 +275,32 @@ func (s *FormConfigServiceImpl) getDTOStruct(ctx context.Context, apiCode string "IVYZ48SR": &dto.IVYZ48SRReq{}, //婚姻状态核验V2(双人) "IVYZ5E22": &dto.IVYZ5E22Req{}, //双人婚姻评估查询zhicha版本 "DWBG5SAM": &dto.DWBG5SAMReq{}, //海宇指迷报告 + "QCXGM4CL": &dto.QCXGM4CLReq{}, //名下车辆诺尔 + "JRZQBHZ4": &dto.JRZQBHZ4Req{}, //支付行为指数诺尔 + "JRZQV8V8": &dto.JRZQV8V8Req{}, //风险量级V8 + "JRZQV9V9": &dto.JRZQV9V9Req{}, //风险量级V9 + "JRZQV1O0": &dto.JRZQV1O0Req{}, //风险量级V10 + "JRZQV2O1": &dto.JRZQV2O1Req{}, //信用全景V21 + "IVYZV1O6": &dto.IVYZV1O6Req{}, //身份风险V106 + "JRZQV7D1": &dto.JRZQV7D1Req{}, //借贷意向验证 + "JRZQV07T": &dto.JRZQV07TReq{}, //洞侦多头履约行为 + "JRZQVZ3Y": &dto.JRZQVZ3YReq{}, //租赁申请意向 + "JRZQVZ2Y": &dto.JRZQVZ2YReq{}, //租赁申请意向V22 + "JRZQV5F4": &dto.JRZQV5F4Req{}, //风险变量V5F4 + "QYGLVR76": &dto.QYGLVR76Req{}, //人企关联 + "IVYZVXF6": &dto.IVYZVXF6Req{}, //消费能力 + "IVYZVJJ6": &dto.IVYZVJJ6Req{}, //收入等级VJJ6 + "JRZQV7MD": &dto.JRZQV7MDReq{}, //特殊名单 + "JRZQV3HM": &dto.JRZQV3HMReq{}, //债务逾期黑名单V3_1 + "JRZQVT43": &dto.JRZQVT43Req{}, //投诉风险筛查V709 + "JRZQV87M": &dto.JRZQV87MReq{}, //黑名单V110_c10 + "JRZQV0MD": &dto.JRZQV0MDReq{}, //特殊名单 + "JRZQVZXF": &dto.JRZQVZXFReq{}, //智享分 + "QYGLV4S6": &dto.QYGLV4S6Req{}, //企业诉讼定制版 + "FLXGG0s4": &dto.FLXGG0S4Req{}, //个人涉诉定制版 + "JRZQVZTF": &dto.JRZQVZTFReq{}, //智瞳-通用版 + "JRZQV4TF": &dto.JRZQV4TFReq{}, //智瞳分尊享版 + "JRZQVKK6": &dto.JRZQVKK6Req{}, //坤羽模型V3-标签版 } // 优先返回已配置的DTO diff --git a/internal/domains/api/services/processors/dependencies.go b/internal/domains/api/services/processors/dependencies.go index aa4ce93..8f973f5 100644 --- a/internal/domains/api/services/processors/dependencies.go +++ b/internal/domains/api/services/processors/dependencies.go @@ -8,6 +8,7 @@ import ( "hyapi-server/internal/infrastructure/external/alicloud" "hyapi-server/internal/infrastructure/external/jiguang" "hyapi-server/internal/infrastructure/external/muzi" + "hyapi-server/internal/infrastructure/external/nuoer" "hyapi-server/internal/infrastructure/external/shujubao" "hyapi-server/internal/infrastructure/external/shumai" "hyapi-server/internal/infrastructure/external/tianyancha" @@ -40,6 +41,7 @@ type ProcessorDependencies struct { XingweiService *xingwei.XingweiService JiguangService *jiguang.JiguangService ShumaiService *shumai.ShumaiService + NuoerService *nuoer.NuoerService Validator interfaces.RequestValidator CombService CombServiceInterface // Changed to interface to break import cycle Options *commands.ApiCallOptions // 添加Options支持 @@ -67,6 +69,7 @@ func NewProcessorDependencies( xingweiService *xingwei.XingweiService, jiguangService *jiguang.JiguangService, shumaiService *shumai.ShumaiService, + nuoerService *nuoer.NuoerService, validator interfaces.RequestValidator, combService CombServiceInterface, // Changed to interface reportRepo repositories.ReportRepository, @@ -84,6 +87,7 @@ func NewProcessorDependencies( XingweiService: xingweiService, JiguangService: jiguangService, ShumaiService: shumaiService, + NuoerService: nuoerService, Validator: validator, CombService: combService, Options: nil, // 初始化为nil,在调用时设置 diff --git a/internal/domains/api/services/processors/flxg/flxgg0s4_processor.go b/internal/domains/api/services/processors/flxg/flxgg0s4_processor.go new file mode 100644 index 0000000..4ca54fe --- /dev/null +++ b/internal/domains/api/services/processors/flxg/flxgg0s4_processor.go @@ -0,0 +1,50 @@ +package flxg + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessFLXGG0S4Request FLXGG0S4 API处理方法 - 个人诉讼定制版 +func ProcessFLXGG0S4Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.FLXGG0S4Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "personalLawsuit_cv1" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/ivyz/ivyzv1o6_processor.go b/internal/domains/api/services/processors/ivyz/ivyzv1o6_processor.go new file mode 100644 index 0000000..dd86fe5 --- /dev/null +++ b/internal/domains/api/services/processors/ivyz/ivyzv1o6_processor.go @@ -0,0 +1,49 @@ +package ivyz + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessIVYZV1O6Request IVYZV1O6 API处理方法 -身份风险V106 +func ProcessIVYZV1O6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.IVYZV1O6Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + } + + nuoerDoCheckAPIKey := "idRiskTagV106" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/ivyz/ivyzvjj6_processor.go b/internal/domains/api/services/processors/ivyz/ivyzvjj6_processor.go new file mode 100644 index 0000000..3edc90a --- /dev/null +++ b/internal/domains/api/services/processors/ivyz/ivyzvjj6_processor.go @@ -0,0 +1,50 @@ +package ivyz + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessIVYZVJJ6Request IVYZVJJ6 API处理方法 -收入等级 +func ProcessIVYZVJJ6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.IVYZVJJ6Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "tax_income_level_v2" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/ivyz/ivyzvxf6_processor.go b/internal/domains/api/services/processors/ivyz/ivyzvxf6_processor.go new file mode 100644 index 0000000..cfbcd2b --- /dev/null +++ b/internal/domains/api/services/processors/ivyz/ivyzvxf6_processor.go @@ -0,0 +1,50 @@ +package ivyz + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessIVYZVXF6Request IVYZVXF6 API处理方法 -消费能力 +func ProcessIVYZVXF6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.IVYZVXF6Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "consumerTagV1" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqbhz4_processor.go b/internal/domains/api/services/processors/jrzq/jrzqbhz4_processor.go new file mode 100644 index 0000000..df3817b --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqbhz4_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQBHZ4Request JRZQBHZ4 API处理方法 - 支付行为指数博汇 +func ProcessJRZQBHZ4Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQBHZ4Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "paymentTagS26" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv07t_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv07t_processor.go new file mode 100644 index 0000000..87a9265 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv07t_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV07TRequest JRZQV07T API处理方法 - 洞侦多头履约行为 +func ProcessJRZQV07TRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV07TReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV23" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv0md_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv0md_processor.go new file mode 100644 index 0000000..4ba7f12 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv0md_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV0MDRequest JRZQV0MDRequest API处理方法 - 特殊名单 +func ProcessJRZQV0MDRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV0MDReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "blackListV110" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv1o0_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv1o0_processor.go new file mode 100644 index 0000000..1bbaee5 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv1o0_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV1O0Request JRZQV1O0 API处理方法 - 风险量级V10 +func ProcessJRZQV1O0Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV1O0Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV9" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv2o1_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv2o1_processor.go new file mode 100644 index 0000000..40a0a67 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv2o1_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV2O1Request JRZQV2O1 API处理方法 - 信用全景V21 +func ProcessJRZQV2O1Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV2O1Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV21" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv3hm_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv3hm_processor.go new file mode 100644 index 0000000..7add1fe --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv3hm_processor.go @@ -0,0 +1,49 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV3HMRequest JRZQV3HM API处理方法 - 债务逾期黑名单V3_1 +func ProcessJRZQV3HMRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV3HMReq + 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) + } + + body := map[string]string{ + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV12" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv4tf_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv4tf_processor.go new file mode 100644 index 0000000..ade43e2 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv4tf_processor.go @@ -0,0 +1,51 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV4TFRequest JRZQV4TFRequest API处理方法 - 智瞳分尊享版 + +func ProcessJRZQV4TFRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV4TFReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "zhitong_ultra_v4_score" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv5f4_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv5f4_processor.go new file mode 100644 index 0000000..c30271a --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv5f4_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV5F4Request JRZQV5F4 API处理方法 - 风险变量V5F4 +func ProcessJRZQV5F4Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV5F4Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV5" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv7d1_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv7d1_processor.go new file mode 100644 index 0000000..27d7220 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv7d1_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV7D1Request JRZQV7D1 API处理方法 - 借贷意向验证 +func ProcessJRZQV7D1Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV7D1Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV11" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv7md_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv7md_processor.go new file mode 100644 index 0000000..7ca89a4 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv7md_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZ3YRequest JRZQVZ3Y API处理方法 - 特殊名单 +func ProcessJRZQV7MDRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV7MDReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV12" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv87m_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv87m_processor.go new file mode 100644 index 0000000..3a9f48c --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv87m_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV87MReqest JRZQV87MReq API处理方法 - 黑名单V110_c10 +func ProcessJRZQV87MReqest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV87MReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "blackListV110_c10" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv8v8_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv8v8_processor.go new file mode 100644 index 0000000..370206a --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv8v8_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV8V8Request JRZQV8V8 API处理方法 - 风险量级V8 +func ProcessJRZQV8V8Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV8V8Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV8" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqv9v9_processor.go b/internal/domains/api/services/processors/jrzq/jrzqv9v9_processor.go new file mode 100644 index 0000000..850608e --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqv9v9_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV9V9Request JRZQV9V9 API处理方法 - 风险量级V9 +func ProcessJRZQV9V9Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV9V9Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV9" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqvkk6_processor.go b/internal/domains/api/services/processors/jrzq/jrzqvkk6_processor.go new file mode 100644 index 0000000..f53b238 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqvkk6_processor.go @@ -0,0 +1,51 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVKK6Request JRZQVKK6Request API处理方法 - 坤羽模型V3-标签版 + +func ProcessJRZQVKK6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVKK6Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "kunyu_fix_v3_tg_model" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqvt43_processor.go b/internal/domains/api/services/processors/jrzq/jrzqvt43_processor.go new file mode 100644 index 0000000..c932500 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqvt43_processor.go @@ -0,0 +1,48 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVT43Request JRZQVT43 API处理方法 - 投诉风险筛查V709 +func ProcessJRZQVT43Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVT43Req + 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) + } + + body := map[string]string{ + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "mobileRiskV709" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqvt72_processor.go b/internal/domains/api/services/processors/jrzq/jrzqvt72_processor.go new file mode 100644 index 0000000..3b1e2ca --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqvt72_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVT72Request JRZQVT72 API处理方法 - 团伙欺诈风险识别 +func ProcessJRZQVT72Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVT72Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "idRelationRisk" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqvz2y_processor.go b/internal/domains/api/services/processors/jrzq/jrzqvz2y_processor.go new file mode 100644 index 0000000..546145a --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqvz2y_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZ2YRequest JRZQVZ2Y API处理方法 - 借贷申请意向V22 +func ProcessJRZQVZ2YRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVZ2YReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV22" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqvz3y_processor.go b/internal/domains/api/services/processors/jrzq/jrzqvz3y_processor.go new file mode 100644 index 0000000..476e730 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqvz3y_processor.go @@ -0,0 +1,50 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZ3YRequest JRZQVZ3Y API处理方法 - 租赁申请意向 +func ProcessJRZQVZ3YRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVZ3YReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV18" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqvztf_processor.go b/internal/domains/api/services/processors/jrzq/jrzqvztf_processor.go new file mode 100644 index 0000000..00a6220 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqvztf_processor.go @@ -0,0 +1,51 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZTFRequest JRZQVZTFRequest API处理方法 - 智瞳-通用版 + +func ProcessJRZQVZTFRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVZTFReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "zhiTongModelG" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/jrzq/jrzqvzxf_processor.go b/internal/domains/api/services/processors/jrzq/jrzqvzxf_processor.go new file mode 100644 index 0000000..eacf8b2 --- /dev/null +++ b/internal/domains/api/services/processors/jrzq/jrzqvzxf_processor.go @@ -0,0 +1,51 @@ +package jrzq + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZXFRequest JRZQVZXFRequest API处理方法 - 智享分 + +func ProcessJRZQVZXFRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVZXFReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "zhixiangScore" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/flxgg0s4_processor.go b/internal/domains/api/services/processors/nuoer/flxgg0s4_processor.go new file mode 100644 index 0000000..e7afb18 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/flxgg0s4_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessFLXGG0S4Request FLXGG0S4 API处理方法 - 个人诉讼定制版 +func ProcessFLXGG0S4Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.FLXGG0S4Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "personalLawsuit_cv1" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/ivyzv1o6_processor.go b/internal/domains/api/services/processors/nuoer/ivyzv1o6_processor.go new file mode 100644 index 0000000..3ce1ced --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/ivyzv1o6_processor.go @@ -0,0 +1,49 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessIVYZV1O6Request IVYZV1O6 API处理方法 -身份风险V106 +func ProcessIVYZV1O6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.IVYZV1O6Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + } + + nuoerDoCheckAPIKey := "idRiskTagV106" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/ivyzvjj6_processor.go b/internal/domains/api/services/processors/nuoer/ivyzvjj6_processor.go new file mode 100644 index 0000000..747dda3 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/ivyzvjj6_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessIVYZVJJ6Request IVYZVJJ6 API处理方法 -收入等级 +func ProcessIVYZVJJ6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.IVYZVJJ6Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "tax_income_level_v2" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/ivyzvxf6_processor.go b/internal/domains/api/services/processors/nuoer/ivyzvxf6_processor.go new file mode 100644 index 0000000..6e7d979 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/ivyzvxf6_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessIVYZVXF6Request IVYZVXF6 API处理方法 -消费能力 +func ProcessIVYZVXF6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.IVYZVXF6Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "consumerTagV1" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqbhz4_processor.go b/internal/domains/api/services/processors/nuoer/jrzqbhz4_processor.go new file mode 100644 index 0000000..003e335 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqbhz4_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQBHZ4Request JRZQBHZ4 API处理方法 - 支付行为指数博汇 +func ProcessJRZQBHZ4Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQBHZ4Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "paymentTagS26" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv07t_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv07t_processor.go new file mode 100644 index 0000000..366a0fb --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv07t_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV07TRequest JRZQV07T API处理方法 - 洞侦多头履约行为 +func ProcessJRZQV07TRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV07TReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV23" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv0md_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv0md_processor.go new file mode 100644 index 0000000..55fe834 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv0md_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV0MDRequest JRZQV0MDRequest API处理方法 - 特殊名单 +func ProcessJRZQV0MDRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV0MDReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "blackListV110" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv1o0_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv1o0_processor.go new file mode 100644 index 0000000..e659457 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv1o0_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV1O0Request JRZQV1O0 API处理方法 - 风险量级V10 +func ProcessJRZQV1O0Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV1O0Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV9" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv2o1_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv2o1_processor.go new file mode 100644 index 0000000..87f9ac0 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv2o1_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV2O1Request JRZQV2O1 API处理方法 - 信用全景V21 +func ProcessJRZQV2O1Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV2O1Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV21" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv3hm_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv3hm_processor.go new file mode 100644 index 0000000..2a99bac --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv3hm_processor.go @@ -0,0 +1,49 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV3HMRequest JRZQV3HM API处理方法 - 债务逾期黑名单V3_1 +func ProcessJRZQV3HMRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV3HMReq + 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) + } + + body := map[string]string{ + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV12" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv4tf_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv4tf_processor.go new file mode 100644 index 0000000..04a7df6 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv4tf_processor.go @@ -0,0 +1,51 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV4TFRequest JRZQV4TFRequest API处理方法 - 智瞳分尊享版 + +func ProcessJRZQV4TFRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV4TFReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "zhitong_ultra_v4_score" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv5f4_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv5f4_processor.go new file mode 100644 index 0000000..8338aa0 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv5f4_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV5F4Request JRZQV5F4 API处理方法 - 风险变量V5F4 +func ProcessJRZQV5F4Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV5F4Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV5" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv7d1_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv7d1_processor.go new file mode 100644 index 0000000..ae1a2e8 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv7d1_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV7D1Request JRZQV7D1 API处理方法 - 借贷意向验证 +func ProcessJRZQV7D1Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV7D1Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV11" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv7md_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv7md_processor.go new file mode 100644 index 0000000..25ccaa8 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv7md_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZ3YRequest JRZQVZ3Y API处理方法 - 特殊名单 +func ProcessJRZQV7MDRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV7MDReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV12" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv87m_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv87m_processor.go new file mode 100644 index 0000000..a8f9262 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv87m_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV87MReqest JRZQV87MReq API处理方法 - 黑名单V110_c10 +func ProcessJRZQV87MReqest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV87MReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "blackListV110_c10" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv8v8_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv8v8_processor.go new file mode 100644 index 0000000..1c7ef4b --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv8v8_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV8V8Request JRZQV8V8 API处理方法 - 风险量级V8 +func ProcessJRZQV8V8Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV8V8Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV8" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqv9v9_processor.go b/internal/domains/api/services/processors/nuoer/jrzqv9v9_processor.go new file mode 100644 index 0000000..13a5912 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqv9v9_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQV9V9Request JRZQV9V9 API处理方法 - 风险量级V9 +func ProcessJRZQV9V9Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQV9V9Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV9" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqvkk6_processor.go b/internal/domains/api/services/processors/nuoer/jrzqvkk6_processor.go new file mode 100644 index 0000000..023c3f7 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqvkk6_processor.go @@ -0,0 +1,51 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVKK6Request JRZQVKK6Request API处理方法 - 坤羽模型V3-标签版 + +func ProcessJRZQVKK6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVKK6Req + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "kunyu_fix_v3_tg_model" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqvt43_processor.go b/internal/domains/api/services/processors/nuoer/jrzqvt43_processor.go new file mode 100644 index 0000000..8c88ad7 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqvt43_processor.go @@ -0,0 +1,48 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVT43Request JRZQVT43 API处理方法 - 投诉风险筛查V709 +func ProcessJRZQVT43Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVT43Req + 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) + } + + body := map[string]string{ + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "mobileRiskV709" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqvz2y_processor.go b/internal/domains/api/services/processors/nuoer/jrzqvz2y_processor.go new file mode 100644 index 0000000..30a5749 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqvz2y_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZ2YRequest JRZQVZ2Y API处理方法 - 借贷申请意向V22 +func ProcessJRZQVZ2YRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVZ2YReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV22" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqvz3y_processor.go b/internal/domains/api/services/processors/nuoer/jrzqvz3y_processor.go new file mode 100644 index 0000000..a9bd6f4 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqvz3y_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZ3YRequest JRZQVZ3Y API处理方法 - 租赁申请意向 +func ProcessJRZQVZ3YRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVZ3YReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "loanRiskTagV18" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqvztf_processor.go b/internal/domains/api/services/processors/nuoer/jrzqvztf_processor.go new file mode 100644 index 0000000..23f2bfd --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqvztf_processor.go @@ -0,0 +1,51 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZTFRequest JRZQVZTFRequest API处理方法 - 智瞳-通用版 + +func ProcessJRZQVZTFRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVZTFReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "zhiTongModelG" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/jrzqvzxf_processor.go b/internal/domains/api/services/processors/nuoer/jrzqvzxf_processor.go new file mode 100644 index 0000000..b345469 --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/jrzqvzxf_processor.go @@ -0,0 +1,51 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessJRZQVZXFRequest JRZQVZXFRequest API处理方法 - 智享分 + +func ProcessJRZQVZXFRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.JRZQVZXFReq + 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) + } + + body := map[string]string{ + "name": paramsDto.Name, + "idCard": paramsDto.IDCard, + "mobile": paramsDto.MobileNo, + } + + nuoerDoCheckAPIKey := "zhixiangScore" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/qcxgm4cl_processor.go b/internal/domains/api/services/processors/nuoer/qcxgm4cl_processor.go new file mode 100644 index 0000000..b339f4a --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/qcxgm4cl_processor.go @@ -0,0 +1,48 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessQCXGM4CLRequest QCXGM4CL API处理方法 - 名下车辆诺尔 +func ProcessQCXGM4CLRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.QCXGM4CLReq + 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) + } + + body := map[string]string{ + "idCard": paramsDto.IDCard, + } + + nuoerDoCheckAPIKey := "id_vehicle_query_102" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/qyglv4s6_processor.go b/internal/domains/api/services/processors/nuoer/qyglv4s6_processor.go new file mode 100644 index 0000000..071677b --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/qyglv4s6_processor.go @@ -0,0 +1,50 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessQYGLV4S6Request QYGLV4S6 API处理方法 -企业诉讼定制版 + +func ProcessQYGLV4S6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.QYGLV4S6Req + 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) + } + + body := map[string]string{ + "entCode": paramsDto.EntCode, + "entName": paramsDto.EntName, + } + + nuoerDoCheckAPIKey := "personalLawsuit_cv2" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/nuoer/qyglvr76_processor.go b/internal/domains/api/services/processors/nuoer/qyglvr76_processor.go new file mode 100644 index 0000000..59f143f --- /dev/null +++ b/internal/domains/api/services/processors/nuoer/qyglvr76_processor.go @@ -0,0 +1,48 @@ +package nuoer + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + nuoerext "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessQYGLVR76Request QYGLVR76 API处理方法 -人企关联 +func ProcessQYGLVR76Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.QYGLVR76Req + 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) + } + + body := map[string]string{ + "idCard": paramsDto.IDCard, + } + + nuoerDoCheckAPIKey := "idRelationV101" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoerext.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoerext.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/qcxg/qcxgm4cl_processor.go b/internal/domains/api/services/processors/qcxg/qcxgm4cl_processor.go new file mode 100644 index 0000000..e4f876d --- /dev/null +++ b/internal/domains/api/services/processors/qcxg/qcxgm4cl_processor.go @@ -0,0 +1,48 @@ +package qcxg + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessQCXGM4CLRequest QCXGM4CL API处理方法 - 名下车辆诺尔 +func ProcessQCXGM4CLRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.QCXGM4CLReq + 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) + } + + body := map[string]string{ + "idCard": paramsDto.IDCard, + } + + nuoerDoCheckAPIKey := "id_vehicle_query_102" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/qygl/qyglv4s6_processor.go b/internal/domains/api/services/processors/qygl/qyglv4s6_processor.go new file mode 100644 index 0000000..4e6d29f --- /dev/null +++ b/internal/domains/api/services/processors/qygl/qyglv4s6_processor.go @@ -0,0 +1,50 @@ +package qygl + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessQYGLV4S6Request QYGLV4S6 API处理方法 -企业诉讼定制版 + +func ProcessQYGLV4S6Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.QYGLV4S6Req + 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) + } + + body := map[string]string{ + "entCode": paramsDto.EntCode, + "entName": paramsDto.EntName, + } + + nuoerDoCheckAPIKey := "personalLawsuit_cv2" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/qygl/qyglvr76_processor.go b/internal/domains/api/services/processors/qygl/qyglvr76_processor.go new file mode 100644 index 0000000..fa243b1 --- /dev/null +++ b/internal/domains/api/services/processors/qygl/qyglvr76_processor.go @@ -0,0 +1,48 @@ +package qygl + +import ( + "context" + "encoding/json" + "errors" + + "hyapi-server/internal/domains/api/dto" + "hyapi-server/internal/domains/api/services/processors" + "hyapi-server/internal/infrastructure/external/nuoer" +) + +// ProcessQYGLVR76Request QYGLVR76 API处理方法 -人企关联 +func ProcessQYGLVR76Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.QYGLVR76Req + 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) + } + + body := map[string]string{ + "idCard": paramsDto.IDCard, + } + + nuoerDoCheckAPIKey := "idRelationV101" + ApiPath := "/v1/doCheck" + + resp, err := deps.NuoerService.CallAPI(ctx, nuoerDoCheckAPIKey, ApiPath, body) + if err != nil { + if errors.Is(err, nuoer.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, nuoer.ErrNotFound) { + return nil, errors.Join(processors.ErrNotFound, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(resp.Data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return respBytes, nil +} diff --git a/internal/infrastructure/external/nuoer/crypto.go b/internal/infrastructure/external/nuoer/crypto.go new file mode 100644 index 0000000..7fb1398 --- /dev/null +++ b/internal/infrastructure/external/nuoer/crypto.go @@ -0,0 +1,38 @@ +package nuoer + +import ( + "crypto/md5" + "encoding/hex" + "sort" + "strings" +) + +// Sign 根据 body 业务参数与 secret 生成 MD5 签名。 +// 规则:排除空值参数,按 key 的 ASCII 升序排序,拼接「参数名+参数值」后追加 secret,再 MD5(小写十六进制)。 +func Sign(body map[string]string, secret string) string { + if len(body) == 0 { + return genMD5(secret) + } + + keys := make([]string, 0, len(body)) + for k, v := range body { + if strings.TrimSpace(v) == "" { + continue + } + keys = append(keys, k) + } + sort.Strings(keys) + + var sb strings.Builder + for _, k := range keys { + sb.WriteString(k) + sb.WriteString(body[k]) + } + sb.WriteString(secret) + return genMD5(sb.String()) +} + +func genMD5(s string) string { + sum := md5.Sum([]byte(s)) + return hex.EncodeToString(sum[:]) +} diff --git a/internal/infrastructure/external/nuoer/crypto_test.go b/internal/infrastructure/external/nuoer/crypto_test.go new file mode 100644 index 0000000..bd101c8 --- /dev/null +++ b/internal/infrastructure/external/nuoer/crypto_test.go @@ -0,0 +1,21 @@ +package nuoer + +import "testing" + +func TestSign(t *testing.T) { + body := map[string]string{ + "name": "张三", + "mobile": "13290879000", + "idCard": "330129199511153412", + } + secret := "secret" + got := Sign(body, secret) + if got == "" { + t.Fatal("sign should not be empty") + } + // 文档示例:name张三mobile13290879000idCard330129199511153412secret + want := genMD5("idCard330129199511153412mobile13290879000name张三secret") + if got != want { + t.Fatalf("sign mismatch: got %s want %s", got, want) + } +} diff --git a/internal/infrastructure/external/nuoer/nuoer_errors.go b/internal/infrastructure/external/nuoer/nuoer_errors.go new file mode 100644 index 0000000..f77ed6b --- /dev/null +++ b/internal/infrastructure/external/nuoer/nuoer_errors.go @@ -0,0 +1,141 @@ +package nuoer + +import ( + "errors" + "fmt" +) + +// 平台层 code 返回码(见文档2) +const ( + CodeSuccess = 0 // 成功 + CodeResponseError = -1 // 响应异常 +) + +// 业务层 busiCode 返回码(见文档2) +const ( + BusiCodeSuccess = 10 // 查询成功【计费】 + BusiCodeNotFound = 1000 // 数据未查得 + BusiCodeInsufficientFund = 1001 // 账户余额不足 + BusiCodeAccountNotFound = 1002 // 账户信息不存在 + BusiCodeAppIDError = 1003 // appId异常 + BusiCodeProductError = 1004 // 产品编号异常 + BusiCodeAccountError = 1005 // 账号信息异常 + BusiCodeOverdraftLimit = 1006 // 透支余额已达上限 + BusiCodeDataRequestError = 1007 // 数据请求异常 + BusiCodeServiceNotOpen = 1009 // 服务尚未开通 +) + +var ( + ErrDatasource = errors.New("数据源异常") + ErrSystem = errors.New("系统异常") + ErrNotFound = errors.New("查询为空") +) + +// platformCodeDesc 平台层 code -> 描述 +var platformCodeDesc = map[int]string{ + CodeSuccess: "成功", + CodeResponseError: "响应异常", +} + +// busiCodeDesc 业务层 busiCode -> 描述 +var busiCodeDesc = map[int]string{ + BusiCodeSuccess: "查询成功【计费】", + BusiCodeNotFound: "数据未查得", + BusiCodeInsufficientFund: "账户余额不足", + BusiCodeAccountNotFound: "账户信息不存在", + BusiCodeAppIDError: "appId异常", + BusiCodeProductError: "产品编号异常", + BusiCodeAccountError: "账号信息异常", + BusiCodeOverdraftLimit: "透支余额已达上限", + BusiCodeDataRequestError: "数据请求异常", + BusiCodeServiceNotOpen: "服务尚未开通", +} + +// GetPlatformCodeDesc 根据平台 code 获取描述 +func GetPlatformCodeDesc(code int) string { + if desc, ok := platformCodeDesc[code]; ok { + return desc + } + return "" +} + +// GetBusiCodeDesc 根据 busiCode 获取描述 +func GetBusiCodeDesc(busiCode int) string { + if desc, ok := busiCodeDesc[busiCode]; ok { + return desc + } + return "" +} + +// nuoerError 诺尔智汇平台层错误(响应 code 字段) +type nuoerError struct { + Code int + Message string +} + +func (e *nuoerError) Error() string { + return fmt.Sprintf("诺尔智汇返回错误,code: %d,msg: %s", e.Code, e.Message) +} + +// NewNuoerError 创建平台层错误 +func NewNuoerError(code int, message string) *nuoerError { + if message == "" { + if desc := GetPlatformCodeDesc(code); desc != "" { + message = desc + } else { + message = "诺尔智汇返回未知错误" + } + } + return &nuoerError{Code: code, Message: message} +} + +// nuoerBusiError 诺尔智汇业务层错误(data.busiCode 字段) +type nuoerBusiError struct { + BusiCode int + BusiMsg string +} + +func (e *nuoerBusiError) Error() string { + return fmt.Sprintf("诺尔智汇业务错误,busiCode: %d,busiMsg: %s", e.BusiCode, e.BusiMsg) +} + +// NewNuoerBusiError 创建业务层错误 +func NewNuoerBusiError(busiCode int, busiMsg string) *nuoerBusiError { + if busiMsg == "" { + if desc := GetBusiCodeDesc(busiCode); desc != "" { + busiMsg = desc + } else { + busiMsg = "诺尔智汇业务返回未知错误" + } + } + return &nuoerBusiError{BusiCode: busiCode, BusiMsg: busiMsg} +} + +// GetNotFoundErrByBusiCode 将 busiCode 映射为「查询为空」类错误(不扣费场景) +func GetNotFoundErrByBusiCode(busiCode int) error { + switch busiCode { + case BusiCodeNotFound: + return ErrNotFound + default: + return nil + } +} + +// GetErrByBusiCode 将 busiCode 映射为内部哨兵错误,供处理器 errors.Is 判断 +func GetErrByBusiCode(busiCode int) error { + if busiCode == BusiCodeSuccess { + return nil + } + if notFound := GetNotFoundErrByBusiCode(busiCode); notFound != nil { + return notFound + } + return ErrDatasource +} + +// GetErrByPlatformCode 将平台 code 映射为内部哨兵错误 +func GetErrByPlatformCode(code int) error { + if code == CodeSuccess { + return nil + } + return ErrDatasource +} diff --git a/internal/infrastructure/external/nuoer/nuoer_factory.go b/internal/infrastructure/external/nuoer/nuoer_factory.go new file mode 100644 index 0000000..d08e2f4 --- /dev/null +++ b/internal/infrastructure/external/nuoer/nuoer_factory.go @@ -0,0 +1,64 @@ +package nuoer + +import ( + "time" + + "hyapi-server/internal/config" + "hyapi-server/internal/shared/external_logger" +) + +// NewNuoerServiceWithConfig 使用配置创建诺尔智汇服务 +func NewNuoerServiceWithConfig(cfg *config.Config) (*NuoerService, error) { + loggingConfig := external_logger.ExternalServiceLoggingConfig{ + Enabled: cfg.Nuoer.Logging.Enabled, + LogDir: cfg.Nuoer.Logging.LogDir, + ServiceName: "nuoer", + UseDaily: cfg.Nuoer.Logging.UseDaily, + EnableLevelSeparation: cfg.Nuoer.Logging.EnableLevelSeparation, + LevelConfigs: make(map[string]external_logger.ExternalServiceLevelFileConfig), + } + + for level, levelCfg := range cfg.Nuoer.Logging.LevelConfigs { + loggingConfig.LevelConfigs[level] = external_logger.ExternalServiceLevelFileConfig{ + MaxSize: levelCfg.MaxSize, + MaxBackups: levelCfg.MaxBackups, + MaxAge: levelCfg.MaxAge, + Compress: levelCfg.Compress, + } + } + + logger, err := external_logger.NewExternalServiceLogger(loggingConfig) + if err != nil { + return nil, err + } + + timeout := cfg.Nuoer.Timeout + if timeout <= 0 { + timeout = defaultRequestTimeout + } + + return NewNuoerService( + cfg.Nuoer.URL, + cfg.Nuoer.AppID, + cfg.Nuoer.AppSecret, + timeout, + logger, + ), nil +} + +// NewNuoerServiceWithLogging 使用自定义日志配置创建诺尔智汇服务 +func NewNuoerServiceWithLogging(url, appID, appSecret string, timeout time.Duration, loggingConfig external_logger.ExternalServiceLoggingConfig) (*NuoerService, error) { + loggingConfig.ServiceName = "nuoer" + + logger, err := external_logger.NewExternalServiceLogger(loggingConfig) + if err != nil { + return nil, err + } + + return NewNuoerService(url, appID, appSecret, timeout, logger), nil +} + +// NewNuoerServiceSimple 创建无日志的诺尔智汇服务 +func NewNuoerServiceSimple(url, appID, appSecret string, timeout time.Duration) *NuoerService { + return NewNuoerService(url, appID, appSecret, timeout, nil) +} diff --git a/internal/infrastructure/external/nuoer/nuoer_service.go b/internal/infrastructure/external/nuoer/nuoer_service.go new file mode 100644 index 0000000..a85a24f --- /dev/null +++ b/internal/infrastructure/external/nuoer/nuoer_service.go @@ -0,0 +1,253 @@ +package nuoer + +import ( + "bytes" + "context" + "crypto/md5" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "strings" + "time" + + "hyapi-server/internal/shared/external_logger" +) + +const defaultRequestTimeout = 4 * time.Second + +// nuoerResponse 诺尔智汇通用响应 +type nuoerResponse struct { + Code int `json:"code"` + Msg string `json:"msg"` + SeqNo string `json:"seqNo"` + Data interface{} `json:"data"` +} + +// serviceConfig 诺尔智汇服务运行时配置 +type serviceConfig struct { + URL string + AppID string + AppSecret string + Timeout time.Duration +} + +// NuoerService 诺尔智汇服务 +type NuoerService struct { + config serviceConfig + logger *external_logger.ExternalServiceLogger +} + +// NewNuoerService 创建诺尔智汇服务实例 +func NewNuoerService(url, appID, appSecret string, timeout time.Duration, logger *external_logger.ExternalServiceLogger) *NuoerService { + if timeout <= 0 { + timeout = defaultRequestTimeout + } + return &NuoerService{ + config: serviceConfig{ + URL: url, + AppID: appID, + AppSecret: appSecret, + Timeout: timeout, + }, + logger: logger, + } +} + +func (s *NuoerService) generateRequestID() string { + timestamp := time.Now().UnixNano() + hash := md5.Sum([]byte(fmt.Sprintf("%d_%s", timestamp, s.config.AppID))) + return fmt.Sprintf("nuoer_%x", hash[:8]) +} + +func (s *NuoerService) CallAPI(ctx context.Context, apiKey, apiPath string, body map[string]string) (*nuoerResponse, error) { + requestURL := strings.TrimSuffix(s.config.URL, "/") + if apiPath != "" { + if !strings.HasPrefix(apiPath, "/") { + apiPath = "/" + apiPath + } + requestURL += apiPath + } + + requestID := s.generateRequestID() + startTime := time.Now() + + var transactionID string + if id, ok := ctx.Value("transaction_id").(string); ok { + transactionID = id + } + + // 对调用方传入的 body 全量参与加签(排除空值,按 key 升序,见 Sign) + sign := Sign(body, s.config.AppSecret) + + requestPayload := map[string]interface{}{ + "appId": s.config.AppID, + "sign": sign, + "apiKey": apiKey, + "body": body, + } + + if s.logger != nil { + s.logger.LogRequest(requestID, transactionID, apiKey, requestURL) + } + + bodyBytes, err := json.Marshal(requestPayload) + if err != nil { + err = errors.Join(ErrSystem, err) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + + req, err := http.NewRequestWithContext(ctx, http.MethodPost, requestURL, bytes.NewBuffer(bodyBytes)) + if err != nil { + err = errors.Join(ErrSystem, err) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + req.Header.Set("Content-Type", "application/json") + + client := &http.Client{Timeout: s.config.Timeout} + resp, err := client.Do(req) + if err != nil { + err = wrapHTTPError(err) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + defer resp.Body.Close() + + respBody, err := io.ReadAll(resp.Body) + if err != nil { + err = errors.Join(ErrSystem, err) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + + if s.logger != nil { + s.logger.LogResponse(requestID, transactionID, apiKey, resp.StatusCode, time.Since(startTime)) + } + + if resp.StatusCode != http.StatusOK { + err = errors.Join(ErrDatasource, fmt.Errorf("HTTP状态码 %d", resp.StatusCode)) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + + var nuoerResp nuoerResponse + if err := json.Unmarshal(respBody, &nuoerResp); err != nil { + err = errors.Join(ErrSystem, fmt.Errorf("响应解析失败: %w", err)) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + + if nuoerResp.Code != CodeSuccess { + nuoerErr := NewNuoerError(nuoerResp.Code, nuoerResp.Msg) + err = errors.Join(GetErrByPlatformCode(nuoerResp.Code), nuoerErr) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, nuoerErr, requestPayload) + } + return nil, err + } + + if nuoerResp.Data == nil { + err = errors.Join(ErrSystem, errors.New("响应 data 为空")) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + + busiCode, busiMsg, ok := parseDataBusiInfo(nuoerResp.Data) + if !ok { + err = errors.Join(ErrSystem, errors.New("响应 data 无法解析 busiCode")) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + + if busiCode != BusiCodeSuccess { + busiErr := NewNuoerBusiError(busiCode, busiMsg) + err = errors.Join(GetErrByBusiCode(busiCode), busiErr) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, busiErr, requestPayload) + } + return nil, err + } + + cleanedData, err := stripBusiMetaFromData(nuoerResp.Data) + if err != nil { + err = errors.Join(ErrSystem, fmt.Errorf("响应 data 清理失败: %w", err)) + if s.logger != nil { + s.logger.LogError(requestID, transactionID, apiKey, err, requestPayload) + } + return nil, err + } + nuoerResp.Data = cleanedData + + return &nuoerResp, nil +} + +// nuoerDataBusiMeta 业务层状态字段,仅用于解析校验,不对外返回 +type nuoerDataBusiMeta struct { + BusiCode int `json:"busiCode"` + BusiMsg string `json:"busiMsg"` +} + +// parseDataBusiInfo 从各接口不同的 data 结构中解析 busiCode、busiMsg +func parseDataBusiInfo(data interface{}) (busiCode int, busiMsg string, ok bool) { + if data == nil { + return 0, "", false + } + raw, err := json.Marshal(data) + if err != nil { + return 0, "", false + } + var meta nuoerDataBusiMeta + if err := json.Unmarshal(raw, &meta); err != nil { + return 0, "", false + } + return meta.BusiCode, meta.BusiMsg, true +} + +// stripBusiMetaFromData 去掉 data 中的 busiCode、busiMsg,仅保留业务载荷 +func stripBusiMetaFromData(data interface{}) (interface{}, error) { + raw, err := json.Marshal(data) + if err != nil { + return nil, err + } + var payload map[string]interface{} + if err := json.Unmarshal(raw, &payload); err != nil { + return nil, err + } + delete(payload, "busiCode") + delete(payload, "busiMsg") + return payload, nil +} + +func wrapHTTPError(err error) error { + if err == context.DeadlineExceeded { + return errors.Join(ErrDatasource, err) + } + if netErr, ok := err.(interface{ Timeout() bool }); ok && netErr.Timeout() { + return errors.Join(ErrDatasource, err) + } + switch err.Error() { + case "context deadline exceeded", "timeout", "Client.Timeout exceeded", "net/http: request canceled": + return errors.Join(ErrDatasource, err) + default: + return errors.Join(ErrSystem, err) + } +} diff --git a/worker b/worker new file mode 100644 index 0000000..36e684c Binary files /dev/null and b/worker differ