diff --git a/internal/domains/api/dto/api_request_dto.go b/internal/domains/api/dto/api_request_dto.go index 540d635..d77f1f4 100644 --- a/internal/domains/api/dto/api_request_dto.go +++ b/internal/domains/api/dto/api_request_dto.go @@ -145,6 +145,13 @@ type YYSY35TAReq struct { MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"` } +type YYSYTJC4Req struct { + MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"` +} + +type YYSYP72DReq struct { + MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"` +} type QCXG9F5CReq struct { PlateNo string `json:"plate_no" validate:"required"` } diff --git a/internal/domains/api/services/api_request_service.go b/internal/domains/api/services/api_request_service.go index ea09fea..4416119 100644 --- a/internal/domains/api/services/api_request_service.go +++ b/internal/domains/api/services/api_request_service.go @@ -310,6 +310,8 @@ func registerAllProcessors(combService *comb.CombService) { "YYSYH6F3": yysy.ProcessYYSYH6F3Request, //运营商三要素即时版查询 "YYSYK9R4": yysy.ProcessYYSYK9R4Request, //全网手机三要素验证1979周更新版 "YYSYF2T7": yysy.ProcessYYSYF2T7Request, //手机二次放号检测查询 + "YYSYTJC4": yysy.ProcessYYSYTJC4Request, //运营商近三个月欠费次数脉 + "YYSYP72D": yysy.ProcessYYSYP72DRequest, //运营商近三个月平均账单 // IVYZ系列处理器 "IVYZ0B03": ivyz.ProcessIVYZ0B03Request, diff --git a/internal/domains/api/services/form_config_service.go b/internal/domains/api/services/form_config_service.go index a249dc6..04cf843 100644 --- a/internal/domains/api/services/form_config_service.go +++ b/internal/domains/api/services/form_config_service.go @@ -297,6 +297,8 @@ func (s *FormConfigServiceImpl) getDTOStruct(ctx context.Context, apiCode string "JRZQV5F4": &dto.JRZQV5F4Req{}, //风险变量V5F4 "JRZQV7MD": &dto.JRZQV7MDReq{}, //特殊名单 "IVYZVJJ6": &dto.IVYZVJJ6Req{}, //收入等级tax_income_level_v8 + "YYSYTJC4": &dto.YYSYTJC4Req{}, //运营商近三个月欠费次数脉 + "YYSYP72D": &dto.YYSYP72DReq{}, //运营商近三个月欠费次数脉 } diff --git a/internal/domains/api/services/processors/yysy/yysyp72d_processor.go b/internal/domains/api/services/processors/yysy/yysyp72d_processor.go new file mode 100644 index 0000000..e5700f5 --- /dev/null +++ b/internal/domains/api/services/processors/yysy/yysyp72d_processor.go @@ -0,0 +1,48 @@ +package yysy + +import ( + "context" + "encoding/json" + "errors" + + "tyapi-server/internal/domains/api/dto" + "tyapi-server/internal/domains/api/services/processors" + "tyapi-server/internal/infrastructure/external/shumai" +) + +// ProcessYYSYP72DRequest YYSYP72D API 运营商近三个月平均账单 +func ProcessYYSYP72DRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.YYSYP72DReq + 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) + } + + reqFormData := map[string]interface{}{ + "mobile": paramsDto.MobileNo, + } + + // 以表单方式调用数脉 API;参数在 CallAPIForm 内转为 application/x-www-form-urlencoded + apiPath := "/v4/mobile_bill/query" // 接口路径,根据数脉文档填写(如 v4/xxx) + respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData) + if err != nil { + if errors.Is(err, shumai.ErrNotFound) { + // 查无记录情况 + return nil, errors.Join(processors.ErrNotFound, err) + } else if errors.Is(err, shumai.ErrDatasource) { + // 数据源错误 + return nil, errors.Join(processors.ErrDatasource, err) + } else if errors.Is(err, shumai.ErrSystem) { + // 系统错误 + return nil, errors.Join(processors.ErrSystem, err) + } else { + // 其他未知错误 + return nil, errors.Join(processors.ErrSystem, err) + } + } + + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/yysy/yysytjc4_processor.go b/internal/domains/api/services/processors/yysy/yysytjc4_processor.go new file mode 100644 index 0000000..bd6fc7d --- /dev/null +++ b/internal/domains/api/services/processors/yysy/yysytjc4_processor.go @@ -0,0 +1,48 @@ +package yysy + +import ( + "context" + "encoding/json" + "errors" + + "tyapi-server/internal/domains/api/dto" + "tyapi-server/internal/domains/api/services/processors" + "tyapi-server/internal/infrastructure/external/shumai" +) + +// ProcessYYSYTJC4Request YYSYTJC4 API 运营商近三个月欠费次数脉 +func ProcessYYSYTJC4Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.YYSYTJC4Req + 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) + } + + reqFormData := map[string]interface{}{ + "mobile": paramsDto.MobileNo, + } + + // 以表单方式调用数脉 API;参数在 CallAPIForm 内转为 application/x-www-form-urlencoded + apiPath := "/v4/mobile_arrears/query" // 接口路径,根据数脉文档填写(如 v4/xxx) + respBytes, err := deps.ShumaiService.CallAPIForm(ctx, apiPath, reqFormData) + if err != nil { + if errors.Is(err, shumai.ErrNotFound) { + // 查无记录情况 + return nil, errors.Join(processors.ErrNotFound, err) + } else if errors.Is(err, shumai.ErrDatasource) { + // 数据源错误 + return nil, errors.Join(processors.ErrDatasource, err) + } else if errors.Is(err, shumai.ErrSystem) { + // 系统错误 + return nil, errors.Join(processors.ErrSystem, err) + } else { + // 其他未知错误 + return nil, errors.Join(processors.ErrSystem, err) + } + } + + return respBytes, nil +}