diff --git a/internal/domains/api/services/processors/yysy/yysy09cd_processor.go b/internal/domains/api/services/processors/yysy/yysy09cd_processor.go index c06c5a0..c4b9793 100644 --- a/internal/domains/api/services/processors/yysy/yysy09cd_processor.go +++ b/internal/domains/api/services/processors/yysy/yysy09cd_processor.go @@ -4,12 +4,38 @@ import ( "context" "encoding/json" "errors" + "strings" "tyapi-server/internal/domains/api/dto" "tyapi-server/internal/domains/api/services/processors" - "tyapi-server/internal/infrastructure/external/westdex" + "tyapi-server/internal/infrastructure/external/xingwei" ) +// XingweiResponseData 星维数据源返回的数据结构 +type XingweiResponseData struct { + OrderNo string `json:"orderNo"` + HandleTime string `json:"handleTime"` + Type string `json:"type"` + Result string `json:"result"` + Gender string `json:"gender"` + Age string `json:"age"` + Remark string `json:"remark"` +} + +// YYSY09CDResponse 原来的返回结构 +type YYSY09CDResponse struct { + Code string `json:"code"` + Data YYSY09CDResponseData `json:"data"` +} + +// YYSY09CDResponseData 原来的返回数据结构 +type YYSY09CDResponseData struct { + Msg string `json:"msg"` + PhoneType string `json:"phoneType"` + Code int `json:"code"` + EncryptType string `json:"encryptType"` +} + // ProcessYYSY09CDRequest YYSY09CD API处理方法 func ProcessYYSY09CDRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { var paramsDto dto.YYSY09CDReq @@ -21,38 +47,98 @@ func ProcessYYSY09CDRequest(ctx context.Context, params []byte, deps *processors return nil, errors.Join(processors.ErrInvalidParam, err) } - encryptedName, err := deps.WestDexService.Encrypt(paramsDto.Name) - if err != nil { - return nil, errors.Join(processors.ErrSystem, err) - } - - encryptedIDCard, err := deps.WestDexService.Encrypt(paramsDto.IDCard) - if err != nil { - return nil, errors.Join(processors.ErrSystem, err) - } - - encryptedMobileNo, err := deps.WestDexService.Encrypt(paramsDto.MobileNo) - if err != nil { - return nil, errors.Join(processors.ErrSystem, err) - } - + // 构建请求数据,将项目规范的字段名转换为 XingweiService 需要的字段名 reqData := map[string]interface{}{ - "data": map[string]interface{}{ - "name": encryptedName, - "idNo": encryptedIDCard, - "phone": encryptedMobileNo, - "phoneType": paramsDto.MobileType, - }, + "name": paramsDto.Name, + "idCardNum": paramsDto.IDCard, + "phoneNumber": paramsDto.MobileNo, } - respBytes, err := deps.WestDexService.CallAPI(ctx, "G16BJ02", reqData) + // 调用行为数据API,使用指定的project_id + projectID := "CDJ-1100244697766359040" + respBytes, err := deps.XingweiService.CallAPI(ctx, projectID, reqData) if err != nil { - if errors.Is(err, westdex.ErrDatasource) { + 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.ErrDatasource, err) + } else if errors.Is(err, xingwei.ErrSystem) { + return nil, errors.Join(processors.ErrSystem, err) } else { return nil, errors.Join(processors.ErrSystem, err) } } - return respBytes, nil + // 解析星维返回的数据 + var xingweiData XingweiResponseData + if err := json.Unmarshal(respBytes, &xingweiData); err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + // 转换为原来的格式 + response := convertToOriginalFormat(xingweiData, paramsDto.MobileType) + + // 序列化为JSON + resultBytes, err := json.Marshal(response) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + return resultBytes, nil +} + +// convertToOriginalFormat 将星维数据源返回的数据转换为原来的格式 +func convertToOriginalFormat(xingweiData XingweiResponseData, mobileType string) YYSY09CDResponse { + // 转换 result 到 code + var code string + var codeInt int + switch xingweiData.Result { + case "01": // 一致 + code = "1000" + codeInt = 1000 + case "02": // 不一致 + code = "1001" + codeInt = 1001 + case "03", "04": // 不确定或失败/虚拟号 -> 查无 + code = "1002" + codeInt = 1002 + default: + // 默认查无 + code = "1002" + codeInt = 1002 + } + + // 从 remark 提取 msg,去掉"认证"前缀 + msg := xingweiData.Remark + if strings.HasPrefix(msg, "认证") { + msg = strings.TrimPrefix(msg, "认证") + } + + // 转换 type 到 phoneType + // 如果请求参数中有 mobileType,优先使用;否则从返回的 type 转换 + phoneType := mobileType + if phoneType == "" { + switch xingweiData.Type { + case "1": // 移动 + phoneType = "CMCC" + case "2": // 联通 + phoneType = "CUCC" + case "3": // 电信 + phoneType = "CTCC" + case "4": // 广电 + phoneType = "CBN" + default: + phoneType = "" + } + } + + return YYSY09CDResponse{ + Code: code, + Data: YYSY09CDResponseData{ + Msg: msg, + PhoneType: phoneType, + Code: codeInt, + EncryptType: "MD5", + }, + } } \ No newline at end of file