diff --git a/internal/domains/api/services/processors/jrzq/jrzq0l85_processor.go b/internal/domains/api/services/processors/jrzq/jrzq0l85_processor.go index 42e2ba7..29ae332 100644 --- a/internal/domains/api/services/processors/jrzq/jrzq0l85_processor.go +++ b/internal/domains/api/services/processors/jrzq/jrzq0l85_processor.go @@ -4,13 +4,15 @@ import ( "context" "encoding/json" "errors" + "math" + "strconv" "tyapi-server/internal/domains/api/dto" "tyapi-server/internal/domains/api/services/processors" - "tyapi-server/internal/infrastructure/external/xingwei" + "tyapi-server/internal/infrastructure/external/zhicha" ) -// ProcessJRZQ0L85Request JRZQ0L85 API处理方法 - xingwei service +// ProcessJRZQ0L85Request JRZQ0L85 API处理方法 - 个人信用分 func ProcessJRZQ0L85Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { var paramsDto dto.JRZQ0L85Req if err := json.Unmarshal(params, ¶msDto); err != nil { @@ -21,27 +23,100 @@ func ProcessJRZQ0L85Request(ctx context.Context, params []byte, deps *processors return nil, errors.Join(processors.ErrInvalidParam, err) } - // 构建请求数据,将项目规范的字段名转换为 XingweiService 需要的字段名 - reqData := map[string]interface{}{ - "name": paramsDto.Name, - "idCardNum": paramsDto.IDCard, - "phoneNumber": paramsDto.MobileNo, + encryptedName, err := deps.ZhichaService.Encrypt(paramsDto.Name) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) } - // 调用行为数据API,使用指定的project_id - projectID := "CDJ-1101695364016041984" - respBytes, err := deps.XingweiService.CallAPI(ctx, projectID, reqData) + encryptedIDCard, err := deps.ZhichaService.Encrypt(paramsDto.IDCard) if err != nil { - if errors.Is(err, xingwei.ErrNotFound) { - return nil, errors.Join(processors.ErrNotFound, err) - } else if errors.Is(err, xingwei.ErrDatasource) { + return nil, errors.Join(processors.ErrSystem, err) + } + + encryptedMobileNo, err := deps.ZhichaService.Encrypt(paramsDto.MobileNo) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + reqData := map[string]interface{}{ + "name": encryptedName, + "idCard": encryptedIDCard, + "phone": encryptedMobileNo, + "authorized": "1", + } + + respData, err := deps.ZhichaService.CallAPI(ctx, "ZCI021", reqData) + if err != nil { + if errors.Is(err, zhicha.ErrDatasource) { return nil, errors.Join(processors.ErrDatasource, err) - } else if errors.Is(err, xingwei.ErrSystem) { - return nil, errors.Join(processors.ErrSystem, err) } else { return nil, errors.Join(processors.ErrSystem, err) } } + score := "-1" + if m, ok := respData.(map[string]interface{}); ok { + if raw, exists := m["xyp_cpl0081"]; exists { + if v, ok := parseToFloat64(raw); ok { + score = mapXypToGeneralScore(v) + } + } + } + + result := map[string]interface{}{ + "score_120_General": score, + } + + respBytes, err := json.Marshal(result) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + return respBytes, nil } + +func parseToFloat64(v interface{}) (float64, bool) { + switch value := v.(type) { + case float64: + return value, true + case string: + if value == "" { + return 0, false + } + f, err := strconv.ParseFloat(value, 64) + if err != nil { + return 0, false + } + return f, true + case json.Number: + f, err := value.Float64() + if err != nil { + return 0, false + } + return f, true + default: + return 0, false + } +} + +func mapXypToGeneralScore(xyp float64) string { + // xyp_cpl0081: 0~1,值越大风险越高; + // score_120_General: 300~900,值越大信用越好。 + if xyp < 0 { + xyp = 0 + } + if xyp > 1 { + xyp = 1 + } + + score := 900 - xyp*600 + scoreInt := int(math.Round(score)) + if scoreInt < 300 { + scoreInt = 300 + } + if scoreInt > 900 { + scoreInt = 900 + } + + return strconv.Itoa(scoreInt) +}