2025-11-27 13:09:54 +08:00
|
|
|
|
package service
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"encoding/json"
|
|
|
|
|
|
"errors"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"sort"
|
|
|
|
|
|
"strings"
|
|
|
|
|
|
"sync"
|
|
|
|
|
|
"sync/atomic"
|
|
|
|
|
|
"time"
|
2025-12-31 18:33:37 +08:00
|
|
|
|
"ycc-server/app/main/api/internal/config"
|
|
|
|
|
|
tianyuanapi "ycc-server/app/main/api/internal/service/tianyuanapi_sdk"
|
|
|
|
|
|
"ycc-server/app/main/model"
|
2025-11-27 13:09:54 +08:00
|
|
|
|
|
|
|
|
|
|
"github.com/Masterminds/squirrel"
|
|
|
|
|
|
"github.com/tidwall/gjson"
|
|
|
|
|
|
"github.com/zeromicro/go-zero/core/logx"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 辅助函数:将天远API响应转换为JSON字节数组
|
|
|
|
|
|
func convertTianyuanResponse(resp *tianyuanapi.Response) ([]byte, error) {
|
|
|
|
|
|
return json.Marshal(resp.Data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-14 20:05:42 +08:00
|
|
|
|
// convertTianyuanBundleResponse 检测并转换组合包响应
|
|
|
|
|
|
// 如果响应是组合包格式(包含 "responses" 字段),则转换为统一格式
|
|
|
|
|
|
// 否则直接返回原始响应数据
|
|
|
|
|
|
func convertTianyuanBundleResponse(resp *tianyuanapi.Response) ([]byte, error) {
|
|
|
|
|
|
// 先将响应数据转换为 JSON 字节
|
|
|
|
|
|
respData, err := json.Marshal(resp.Data)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("序列化响应数据失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 检测是否是组合包响应格式(包含 "responses" 字段)
|
|
|
|
|
|
if gjson.GetBytes(respData, "responses").Exists() {
|
|
|
|
|
|
// 这是组合包响应,转换为统一格式
|
|
|
|
|
|
bundleResults, convertErr := convertBundleResponseToStandard(respData)
|
|
|
|
|
|
if convertErr != nil {
|
|
|
|
|
|
// 转换失败,返回原始数据并记录错误
|
|
|
|
|
|
logx.Errorf("转换组合包响应失败: %v", convertErr)
|
|
|
|
|
|
return respData, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
// 转换成功,返回转换后的 JSON
|
|
|
|
|
|
return json.Marshal(bundleResults)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 不是组合包响应,直接返回原始数据
|
|
|
|
|
|
return respData, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-27 13:09:54 +08:00
|
|
|
|
// 生成认证时间范围:当前时间前后两天的YYYYMMDD-YYMMDD格式
|
|
|
|
|
|
func generateAuthDateRange() string {
|
|
|
|
|
|
now := time.Now()
|
|
|
|
|
|
start := now.AddDate(0, 0, -2).Format("20060102")
|
|
|
|
|
|
end := now.AddDate(0, 0, 2).Format("20060102")
|
|
|
|
|
|
return fmt.Sprintf("%s-%s", start, end)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
// callTianyuanApiWithLog 调用天元API并记录日志
|
|
|
|
|
|
func (a *ApiRequestService) callTianyuanApiWithLog(ctx context.Context, featureID, apiID string, params map[string]interface{}) (*tianyuanapi.Response, error) {
|
|
|
|
|
|
startTime := time.Now()
|
|
|
|
|
|
resp, err := a.tianyuanapi.CallInterface(apiID, params)
|
|
|
|
|
|
responseTime := time.Since(startTime).Milliseconds()
|
|
|
|
|
|
|
|
|
|
|
|
// 如果没有提供featureID,尝试从缓存中获取
|
|
|
|
|
|
if featureID == "" {
|
|
|
|
|
|
a.apiFeatureMapMutex.RLock()
|
|
|
|
|
|
featureID = a.apiFeatureMapCache[apiID]
|
|
|
|
|
|
a.apiFeatureMapMutex.RUnlock()
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 构建调用记录选项
|
|
|
|
|
|
callStatus := int64(0) // 默认失败
|
|
|
|
|
|
errorCode := ""
|
|
|
|
|
|
errorMessage := ""
|
|
|
|
|
|
responseData := interface{}(nil)
|
|
|
|
|
|
transactionID := ""
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
// 调用失败
|
|
|
|
|
|
errorMessage = err.Error()
|
|
|
|
|
|
// 尝试从错误信息中提取错误码
|
|
|
|
|
|
if code := tianyuanapi.GetCodeByError(err); code != -1 {
|
|
|
|
|
|
errorCode = fmt.Sprintf("%d", code)
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 调用成功
|
|
|
|
|
|
callStatus = 1
|
|
|
|
|
|
responseData = resp.Data
|
|
|
|
|
|
transactionID = resp.TransactionID
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 异步记录调用日志(避免影响主流程)
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
logOpts := CallLogOptions{
|
|
|
|
|
|
FeatureID: featureID,
|
|
|
|
|
|
ApiID: apiID,
|
|
|
|
|
|
CallStatus: callStatus,
|
|
|
|
|
|
ResponseTime: responseTime,
|
|
|
|
|
|
ErrorCode: errorCode,
|
|
|
|
|
|
ErrorMessage: errorMessage,
|
|
|
|
|
|
RequestParams: params,
|
|
|
|
|
|
ResponseData: responseData,
|
|
|
|
|
|
TransactionID: transactionID,
|
|
|
|
|
|
}
|
|
|
|
|
|
if recordErr := a.tianyuanapiCallLogService.RecordCall(context.Background(), logOpts); recordErr != nil {
|
|
|
|
|
|
logx.Errorf("记录天元API调用日志失败,api_id=%s, err=%v", apiID, recordErr)
|
|
|
|
|
|
}
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
return resp, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-27 13:09:54 +08:00
|
|
|
|
type ApiRequestService struct {
|
2026-01-12 16:43:08 +08:00
|
|
|
|
config config.Config
|
|
|
|
|
|
featureModel model.FeatureModel
|
|
|
|
|
|
productFeatureModel model.ProductFeatureModel
|
|
|
|
|
|
userFeatureWhitelistModel model.UserFeatureWhitelistModel
|
|
|
|
|
|
whitelistService *WhitelistService
|
|
|
|
|
|
tianyuanapi *tianyuanapi.Client
|
2026-01-13 18:30:10 +08:00
|
|
|
|
tianyuanapiCallLogService *TianyuanapiCallLogService
|
|
|
|
|
|
apiFeatureMapCache map[string]string // apiID -> featureID 缓存
|
|
|
|
|
|
apiFeatureMapMutex sync.RWMutex
|
2025-11-27 13:09:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// NewApiRequestService 是一个构造函数,用于初始化 ApiRequestService
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func NewApiRequestService(c config.Config, featureModel model.FeatureModel, productFeatureModel model.ProductFeatureModel, userFeatureWhitelistModel model.UserFeatureWhitelistModel, tianyuanapi *tianyuanapi.Client, tianyuanapiCallLogService *TianyuanapiCallLogService, whitelistService *WhitelistService) *ApiRequestService {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
return &ApiRequestService{
|
2026-01-12 16:43:08 +08:00
|
|
|
|
config: c,
|
|
|
|
|
|
featureModel: featureModel,
|
|
|
|
|
|
productFeatureModel: productFeatureModel,
|
|
|
|
|
|
userFeatureWhitelistModel: userFeatureWhitelistModel,
|
|
|
|
|
|
tianyuanapi: tianyuanapi,
|
2026-01-13 18:30:10 +08:00
|
|
|
|
tianyuanapiCallLogService: tianyuanapiCallLogService,
|
|
|
|
|
|
whitelistService: whitelistService,
|
|
|
|
|
|
apiFeatureMapCache: make(map[string]string),
|
2025-11-27 13:09:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type APIResponseData struct {
|
|
|
|
|
|
ApiID string `json:"apiID"`
|
|
|
|
|
|
Data json.RawMessage `json:"data"` // 这里用 RawMessage 来存储原始的 data
|
|
|
|
|
|
Success bool `json:"success"`
|
|
|
|
|
|
Timestamp string `json:"timestamp"`
|
|
|
|
|
|
Error string `json:"error,omitempty"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-14 20:05:42 +08:00
|
|
|
|
// BundleResponseItem 组合包响应中的单个项
|
|
|
|
|
|
type BundleResponseItem struct {
|
|
|
|
|
|
ApiCode string `json:"api_code"`
|
|
|
|
|
|
Success bool `json:"success"`
|
|
|
|
|
|
Data json.RawMessage `json:"data"`
|
|
|
|
|
|
Error string `json:"error,omitempty"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// BundleResponse 组合包响应结构
|
|
|
|
|
|
type BundleResponse struct {
|
|
|
|
|
|
Responses []BundleResponseItem `json:"responses"`
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// convertBundleResponseToStandard 将组合包响应格式转换为统一格式
|
|
|
|
|
|
func convertBundleResponseToStandard(bundleResp []byte) ([]APIResponseData, error) {
|
|
|
|
|
|
var bundle BundleResponse
|
|
|
|
|
|
if err := json.Unmarshal(bundleResp, &bundle); err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("解析组合包响应失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
timestamp := time.Now().Format("2006-01-02 15:04:05")
|
|
|
|
|
|
var result []APIResponseData
|
|
|
|
|
|
|
|
|
|
|
|
for _, item := range bundle.Responses {
|
|
|
|
|
|
apiResp := APIResponseData{
|
|
|
|
|
|
ApiID: item.ApiCode,
|
|
|
|
|
|
Success: item.Success,
|
|
|
|
|
|
Timestamp: timestamp,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理 data 字段
|
|
|
|
|
|
if len(item.Data) > 0 {
|
|
|
|
|
|
// 如果 data 是 null 的 JSON 字符串,转换为 null
|
|
|
|
|
|
if string(item.Data) == "null" {
|
|
|
|
|
|
apiResp.Data = []byte("null")
|
|
|
|
|
|
} else {
|
|
|
|
|
|
apiResp.Data = item.Data
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
apiResp.Data = []byte("null")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理 error 字段
|
|
|
|
|
|
if !item.Success && item.Error != "" {
|
|
|
|
|
|
apiResp.Error = item.Error
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
result = append(result, apiResp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-27 13:09:54 +08:00
|
|
|
|
// ProcessRequests 处理请求
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessRequests(ctx context.Context, params []byte, productID string) ([]byte, error) {
|
|
|
|
|
|
var cancel context.CancelFunc
|
|
|
|
|
|
ctx, cancel = context.WithCancel(ctx)
|
2025-11-27 13:09:54 +08:00
|
|
|
|
defer cancel()
|
2026-01-12 16:43:08 +08:00
|
|
|
|
|
|
|
|
|
|
// 从params中提取id_card,用于白名单检查
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card").String()
|
|
|
|
|
|
|
|
|
|
|
|
// 查询白名单(如果提供了id_card),集中由 WhitelistService 处理
|
2026-01-13 18:30:10 +08:00
|
|
|
|
var whitelistedFeatureApiIds map[string]bool
|
|
|
|
|
|
if a.whitelistService != nil {
|
|
|
|
|
|
whitelistedFeatureApiIds, _ = a.whitelistService.GetWhitelistedFeatureApisByIdCard(ctx, idCard)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
whitelistedFeatureApiIds = make(map[string]bool)
|
|
|
|
|
|
}
|
2026-01-12 16:43:08 +08:00
|
|
|
|
|
2025-12-31 18:33:37 +08:00
|
|
|
|
build := a.productFeatureModel.SelectBuilder().Where(squirrel.Eq{
|
|
|
|
|
|
"product_id": productID,
|
|
|
|
|
|
})
|
2025-11-27 13:09:54 +08:00
|
|
|
|
productFeatureList, findProductFeatureErr := a.productFeatureModel.FindAll(ctx, build, "")
|
|
|
|
|
|
if findProductFeatureErr != nil {
|
|
|
|
|
|
return nil, findProductFeatureErr
|
|
|
|
|
|
}
|
2025-12-31 18:33:37 +08:00
|
|
|
|
var featureIDs []string
|
|
|
|
|
|
isImportantMap := make(map[string]int64, len(productFeatureList))
|
2025-11-27 13:09:54 +08:00
|
|
|
|
for _, pf := range productFeatureList {
|
2025-12-31 18:33:37 +08:00
|
|
|
|
featureIDs = append(featureIDs, pf.FeatureId)
|
|
|
|
|
|
isImportantMap[pf.FeatureId] = pf.IsImportant
|
2025-11-27 13:09:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
if len(featureIDs) == 0 {
|
|
|
|
|
|
return nil, errors.New("featureIDs 是空的")
|
|
|
|
|
|
}
|
2025-12-31 18:33:37 +08:00
|
|
|
|
builder := a.featureModel.SelectBuilder().Where(squirrel.Eq{"id": featureIDs})
|
2025-11-27 13:09:54 +08:00
|
|
|
|
featureList, findFeatureErr := a.featureModel.FindAll(ctx, builder, "")
|
|
|
|
|
|
if findFeatureErr != nil {
|
|
|
|
|
|
return nil, findFeatureErr
|
|
|
|
|
|
}
|
|
|
|
|
|
if len(featureList) == 0 {
|
|
|
|
|
|
return nil, errors.New("处理请求错误,产品无对应接口功能")
|
|
|
|
|
|
}
|
2026-01-13 18:30:10 +08:00
|
|
|
|
|
|
|
|
|
|
// 缓存apiID到featureID的映射关系,供后续调用记录使用
|
|
|
|
|
|
a.apiFeatureMapMutex.Lock()
|
|
|
|
|
|
for _, feature := range featureList {
|
|
|
|
|
|
a.apiFeatureMapCache[feature.ApiId] = feature.Id
|
|
|
|
|
|
}
|
|
|
|
|
|
a.apiFeatureMapMutex.Unlock()
|
2025-11-27 13:09:54 +08:00
|
|
|
|
var (
|
|
|
|
|
|
wg sync.WaitGroup
|
|
|
|
|
|
resultsCh = make(chan APIResponseData, len(featureList))
|
|
|
|
|
|
errorsCh = make(chan error, len(featureList))
|
|
|
|
|
|
errorCount int32
|
|
|
|
|
|
errorLimit = len(featureList)
|
|
|
|
|
|
retryNum = 5
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
for i, feature := range featureList {
|
|
|
|
|
|
wg.Add(1)
|
|
|
|
|
|
go func(i int, feature *model.Feature) {
|
|
|
|
|
|
defer wg.Done()
|
|
|
|
|
|
|
|
|
|
|
|
select {
|
|
|
|
|
|
case <-ctx.Done():
|
|
|
|
|
|
return
|
|
|
|
|
|
default:
|
|
|
|
|
|
}
|
|
|
|
|
|
result := APIResponseData{
|
|
|
|
|
|
ApiID: feature.ApiId,
|
|
|
|
|
|
Success: false,
|
|
|
|
|
|
}
|
|
|
|
|
|
timestamp := time.Now().Format("2006-01-02 15:04:05")
|
2026-01-12 16:43:08 +08:00
|
|
|
|
|
|
|
|
|
|
// 检查是否在白名单中
|
|
|
|
|
|
if whitelistedFeatureApiIds[feature.ApiId] {
|
|
|
|
|
|
// 在白名单中,返回空结构(data 为 null),保持与正常返回结构一致
|
|
|
|
|
|
// 直接设置 data 为 null 的 JSON 字节
|
|
|
|
|
|
result.Data = []byte("null")
|
|
|
|
|
|
result.Success = true
|
|
|
|
|
|
result.Timestamp = timestamp
|
|
|
|
|
|
resultsCh <- result
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-11-27 13:09:54 +08:00
|
|
|
|
var (
|
|
|
|
|
|
resp json.RawMessage
|
|
|
|
|
|
preprocessErr error
|
|
|
|
|
|
)
|
|
|
|
|
|
// 若 isImportantMap[feature.ID] == 1,则表示需要在出错时重试
|
2025-12-31 18:33:37 +08:00
|
|
|
|
isImportant := isImportantMap[feature.Id] == 1
|
2025-11-27 13:09:54 +08:00
|
|
|
|
tryCount := 0
|
|
|
|
|
|
for {
|
|
|
|
|
|
tryCount++
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, preprocessErr = a.PreprocessRequestApi(ctx, params, feature.ApiId)
|
2025-11-27 13:09:54 +08:00
|
|
|
|
if preprocessErr == nil {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
if isImportant && tryCount < retryNum {
|
|
|
|
|
|
continue
|
|
|
|
|
|
} else {
|
|
|
|
|
|
break
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if preprocessErr != nil {
|
|
|
|
|
|
result.Timestamp = timestamp
|
|
|
|
|
|
result.Error = preprocessErr.Error()
|
|
|
|
|
|
result.Data = resp
|
|
|
|
|
|
resultsCh <- result
|
|
|
|
|
|
errorsCh <- fmt.Errorf("请求失败: %v", preprocessErr)
|
|
|
|
|
|
atomic.AddInt32(&errorCount, 1)
|
|
|
|
|
|
if atomic.LoadInt32(&errorCount) >= int32(errorLimit) {
|
|
|
|
|
|
cancel()
|
|
|
|
|
|
}
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
result.Data = resp
|
|
|
|
|
|
result.Success = true
|
|
|
|
|
|
result.Timestamp = timestamp
|
|
|
|
|
|
resultsCh <- result
|
|
|
|
|
|
}(i, feature)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
wg.Wait()
|
|
|
|
|
|
close(resultsCh)
|
|
|
|
|
|
close(errorsCh)
|
|
|
|
|
|
}()
|
2026-01-14 20:05:42 +08:00
|
|
|
|
// 收集所有结果并合并
|
2025-11-27 13:09:54 +08:00
|
|
|
|
var responseData []APIResponseData
|
|
|
|
|
|
for result := range resultsCh {
|
2026-01-14 20:05:42 +08:00
|
|
|
|
if result.Success && len(result.Data) > 0 {
|
|
|
|
|
|
// 先检查是否是已拆开的组合包(统一格式数组)
|
|
|
|
|
|
// 特征:是数组格式,且第一个元素包含 "apiID"、"success"、"timestamp" 字段
|
|
|
|
|
|
firstItem := gjson.GetBytes(result.Data, "0")
|
|
|
|
|
|
if firstItem.Exists() {
|
|
|
|
|
|
firstApiID := firstItem.Get("apiID")
|
|
|
|
|
|
firstSuccess := firstItem.Get("success")
|
|
|
|
|
|
firstTimestamp := firstItem.Get("timestamp")
|
|
|
|
|
|
// 如果第一个元素有 apiID、success、timestamp 字段,说明是已拆开的组合包
|
|
|
|
|
|
if firstApiID.Exists() && firstSuccess.Exists() && firstTimestamp.Exists() {
|
|
|
|
|
|
// 这是已拆开的组合包(统一格式数组),直接展开添加到结果中
|
|
|
|
|
|
var bundleResults []APIResponseData
|
|
|
|
|
|
if err := json.Unmarshal(result.Data, &bundleResults); err == nil {
|
|
|
|
|
|
responseData = append(responseData, bundleResults...)
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
// 解析失败,作为普通响应处理
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 检查是否包含 "responses" 字段(未拆开的组合包)
|
|
|
|
|
|
if gjson.GetBytes(result.Data, "responses").Exists() {
|
|
|
|
|
|
// 这是未拆开的组合包响应,需要转换
|
|
|
|
|
|
bundleResults, convertErr := convertBundleResponseToStandard(result.Data)
|
|
|
|
|
|
if convertErr != nil {
|
|
|
|
|
|
// 转换失败,记录错误但保留原始结果
|
|
|
|
|
|
logx.Errorf("转换组合包响应失败: %v", convertErr)
|
|
|
|
|
|
responseData = append(responseData, result)
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 转换成功,用转换后的结果替换原始结果
|
|
|
|
|
|
responseData = append(responseData, bundleResults...)
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 普通响应,直接添加
|
|
|
|
|
|
responseData = append(responseData, result)
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 失败或空响应,直接添加
|
|
|
|
|
|
responseData = append(responseData, result)
|
|
|
|
|
|
}
|
2025-11-27 13:09:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
if atomic.LoadInt32(&errorCount) >= int32(errorLimit) {
|
|
|
|
|
|
var allErrors []error
|
|
|
|
|
|
for err := range errorsCh {
|
|
|
|
|
|
allErrors = append(allErrors, err)
|
|
|
|
|
|
}
|
|
|
|
|
|
return nil, fmt.Errorf("请求失败次数超过 %d 次: %v", errorLimit, allErrors)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
combinedResponse, err := json.Marshal(responseData)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("响应数据转 JSON 失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return combinedResponse, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ------------------------------------请求处理器--------------------------
|
2026-01-13 18:30:10 +08:00
|
|
|
|
var requestProcessors = map[string]func(*ApiRequestService, context.Context, []byte) ([]byte, error){
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"PersonEnterprisePro": (*ApiRequestService).ProcessPersonEnterpriseProRequest,
|
|
|
|
|
|
"BehaviorRiskScan": (*ApiRequestService).ProcessBehaviorRiskScanRequest,
|
|
|
|
|
|
"YYSYBE08": (*ApiRequestService).ProcessYYSYBE08Request,
|
|
|
|
|
|
"YYSY09CD": (*ApiRequestService).ProcessYYSY09CDRequest,
|
|
|
|
|
|
"FLXG0687": (*ApiRequestService).ProcessFLXG0687Request,
|
|
|
|
|
|
"FLXG3D56": (*ApiRequestService).ProcessFLXG3D56Request,
|
|
|
|
|
|
"FLXG0V4B": (*ApiRequestService).ProcessFLXG0V4BRequest,
|
|
|
|
|
|
"QYGL8271": (*ApiRequestService).ProcessQYGL8271Request,
|
|
|
|
|
|
"IVYZ5733": (*ApiRequestService).ProcessIVYZ5733Request,
|
|
|
|
|
|
"IVYZ9A2B": (*ApiRequestService).ProcessIVYZ9A2BRequest,
|
|
|
|
|
|
"JRZQ0A03": (*ApiRequestService).ProcessJRZQ0A03Request,
|
|
|
|
|
|
"QYGL6F2D": (*ApiRequestService).ProcessQYGL6F2DRequest,
|
|
|
|
|
|
"JRZQ8203": (*ApiRequestService).ProcessJRZQ8203Request,
|
|
|
|
|
|
"JRZQ4AA8": (*ApiRequestService).ProcessJRZQ4AA8Request,
|
|
|
|
|
|
"QCXG7A2B": (*ApiRequestService).ProcessQCXG7A2BRequest,
|
|
|
|
|
|
"DWBG8B4D": (*ApiRequestService).ProcessDWBG8B4DRequest,
|
|
|
|
|
|
"DWBG6A2C": (*ApiRequestService).ProcessDWBG6A2CRequest,
|
|
|
|
|
|
"JRZQ4B6C": (*ApiRequestService).ProcessJRZQ4B6CRequest,
|
|
|
|
|
|
"JRZQ09J8": (*ApiRequestService).ProcessJRZQ09J8Request,
|
|
|
|
|
|
"JRZQ5E9F": (*ApiRequestService).ProcessJRZQ5E9FRequest,
|
|
|
|
|
|
"QYGL3F8E": (*ApiRequestService).ProcessQYGL3F8ERequest,
|
|
|
|
|
|
"IVYZ81NC": (*ApiRequestService).ProcessIVYZ81NCRequest,
|
|
|
|
|
|
"IVYZ7F3A": (*ApiRequestService).ProcessIVYZ7F3ARequest,
|
|
|
|
|
|
"DWBG7F3A": (*ApiRequestService).ProcessDWBG7F3ARequest,
|
|
|
|
|
|
"JRZQ8A2D": (*ApiRequestService).ProcessJRZQ8A2DRequest,
|
|
|
|
|
|
"YYSY8B1C": (*ApiRequestService).ProcessYYSY8B1CRequest,
|
|
|
|
|
|
"YYSY7D3E": (*ApiRequestService).ProcessYYSY7D3ERequest,
|
|
|
|
|
|
"FLXG7E8F": (*ApiRequestService).ProcessFLXG7E8FRequest,
|
|
|
|
|
|
"IVYZ8I9J": (*ApiRequestService).ProcessIVYZ8I9JRequest,
|
|
|
|
|
|
"JRZQ7F1A": (*ApiRequestService).ProcessJRZQ7F1ARequest,
|
|
|
|
|
|
"IVYZ3P9M": (*ApiRequestService).ProcessIVYZ3P9MRequest,
|
2026-01-14 19:45:42 +08:00
|
|
|
|
"JRZQ6F2A": (*ApiRequestService).ProcessJRZQ6F2ARequest,
|
2026-01-14 20:05:42 +08:00
|
|
|
|
"COMBQN12": (*ApiRequestService).ProcessCOMBQN12Request,
|
2025-11-27 13:09:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// PreprocessRequestApi 调用指定的请求处理函数
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) PreprocessRequestApi(ctx context.Context, params []byte, apiID string) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
if processor, exists := requestProcessors[apiID]; exists {
|
2026-01-13 18:30:10 +08:00
|
|
|
|
return processor(a, ctx, params) // 调用 ApiRequestService 方法
|
2025-11-27 13:09:54 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nil, errors.New("api请求, 未找到相应的处理程序")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// PersonEnterprisePro 人企业关系加强版
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessPersonEnterpriseProRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
// 设置最大调用次数上限
|
|
|
|
|
|
maxApiCalls := 20 // 允许最多查询20个企业
|
|
|
|
|
|
|
|
|
|
|
|
if !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, PersonEnterprisePro, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "QYGLB4C0", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理股东人企关系的响应数据
|
|
|
|
|
|
code := gjson.GetBytes(respBytes, "code")
|
|
|
|
|
|
if !code.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("响应中缺少 code 字段")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 判断 code 是否等于 "0000"
|
|
|
|
|
|
if code.String() == "0000" {
|
|
|
|
|
|
// 获取 data 字段的值
|
|
|
|
|
|
data := gjson.GetBytes(respBytes, "data")
|
|
|
|
|
|
if !data.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("响应中缺少 data 字段")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用gjson获取企业列表
|
|
|
|
|
|
datalistResult := gjson.Get(data.Raw, "datalist")
|
|
|
|
|
|
if !datalistResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("datalist字段不存在")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取所有企业并进行排序
|
|
|
|
|
|
companies := datalistResult.Array()
|
|
|
|
|
|
|
|
|
|
|
|
// 创建企业对象切片,用于排序
|
|
|
|
|
|
type CompanyWithPriority struct {
|
|
|
|
|
|
Index int
|
|
|
|
|
|
Data gjson.Result
|
|
|
|
|
|
RelationshipVal int // 关系权重值
|
|
|
|
|
|
RelationCount int // 关系数量
|
|
|
|
|
|
AdminPenalty int // 行政处罚数量
|
|
|
|
|
|
Executed int // 被执行人数量
|
|
|
|
|
|
Dishonest int // 失信被执行人数量
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
companiesWithPriority := make([]CompanyWithPriority, 0, len(companies))
|
|
|
|
|
|
|
|
|
|
|
|
// 遍历企业,计算优先级
|
|
|
|
|
|
for i, companyJson := range companies {
|
|
|
|
|
|
// 统计行政处罚、被执行人、失信被执行人
|
|
|
|
|
|
adminPenalty := 0
|
|
|
|
|
|
executed := 0
|
|
|
|
|
|
dishonest := 0
|
|
|
|
|
|
|
|
|
|
|
|
// 检查行政处罚字段是否存在并获取数组长度
|
|
|
|
|
|
adminPenaltyResult := companyJson.Get("adminPenalty")
|
|
|
|
|
|
if adminPenaltyResult.Exists() && adminPenaltyResult.IsArray() {
|
|
|
|
|
|
adminPenalty = len(adminPenaltyResult.Array())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 检查被执行人字段是否存在并获取数组长度
|
|
|
|
|
|
executedPersonResult := companyJson.Get("executedPerson")
|
|
|
|
|
|
if executedPersonResult.Exists() && executedPersonResult.IsArray() {
|
|
|
|
|
|
executed = len(executedPersonResult.Array())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 检查失信被执行人字段是否存在并获取数组长度
|
|
|
|
|
|
dishonestExecutedPersonResult := companyJson.Get("dishonestExecutedPerson")
|
|
|
|
|
|
if dishonestExecutedPersonResult.Exists() && dishonestExecutedPersonResult.IsArray() {
|
|
|
|
|
|
dishonest = len(dishonestExecutedPersonResult.Array())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 计算relationship权重
|
|
|
|
|
|
relationshipVal := 0
|
|
|
|
|
|
relationCount := 0
|
|
|
|
|
|
|
|
|
|
|
|
// 获取relationship数组
|
|
|
|
|
|
relationshipResult := companyJson.Get("relationship")
|
|
|
|
|
|
if relationshipResult.Exists() && relationshipResult.IsArray() {
|
|
|
|
|
|
relationships := relationshipResult.Array()
|
|
|
|
|
|
// 统计各类关系的数量和权重
|
|
|
|
|
|
for _, rel := range relationships {
|
|
|
|
|
|
relationCount++
|
|
|
|
|
|
relStr := rel.String()
|
|
|
|
|
|
|
|
|
|
|
|
// 根据关系类型设置权重,权重顺序:
|
|
|
|
|
|
// 股东(6) > 历史股东(5) > 法人(4) > 历史法人(3) > 高管(2) > 历史高管(1)
|
|
|
|
|
|
switch relStr {
|
|
|
|
|
|
case "sh": // 股东
|
|
|
|
|
|
if relationshipVal < 6 {
|
|
|
|
|
|
relationshipVal = 6
|
|
|
|
|
|
}
|
|
|
|
|
|
case "his_sh": // 历史股东
|
|
|
|
|
|
if relationshipVal < 5 {
|
|
|
|
|
|
relationshipVal = 5
|
|
|
|
|
|
}
|
|
|
|
|
|
case "lp": // 法人
|
|
|
|
|
|
if relationshipVal < 4 {
|
|
|
|
|
|
relationshipVal = 4
|
|
|
|
|
|
}
|
|
|
|
|
|
case "his_lp": // 历史法人
|
|
|
|
|
|
if relationshipVal < 3 {
|
|
|
|
|
|
relationshipVal = 3
|
|
|
|
|
|
}
|
|
|
|
|
|
case "tm": // 高管
|
|
|
|
|
|
if relationshipVal < 2 {
|
|
|
|
|
|
relationshipVal = 2
|
|
|
|
|
|
}
|
|
|
|
|
|
case "his_tm": // 历史高管
|
|
|
|
|
|
if relationshipVal < 1 {
|
|
|
|
|
|
relationshipVal = 1
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
companiesWithPriority = append(companiesWithPriority, CompanyWithPriority{
|
|
|
|
|
|
Index: i,
|
|
|
|
|
|
Data: companyJson,
|
|
|
|
|
|
RelationshipVal: relationshipVal,
|
|
|
|
|
|
RelationCount: relationCount,
|
|
|
|
|
|
AdminPenalty: adminPenalty,
|
|
|
|
|
|
Executed: executed,
|
|
|
|
|
|
Dishonest: dishonest,
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 按优先级排序
|
|
|
|
|
|
sort.Slice(companiesWithPriority, func(i, j int) bool {
|
|
|
|
|
|
// 首先根据是否有失信被执行人排序
|
|
|
|
|
|
if companiesWithPriority[i].Dishonest != companiesWithPriority[j].Dishonest {
|
|
|
|
|
|
return companiesWithPriority[i].Dishonest > companiesWithPriority[j].Dishonest
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 然后根据是否有被执行人排序
|
|
|
|
|
|
if companiesWithPriority[i].Executed != companiesWithPriority[j].Executed {
|
|
|
|
|
|
return companiesWithPriority[i].Executed > companiesWithPriority[j].Executed
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 然后根据是否有行政处罚排序
|
|
|
|
|
|
if companiesWithPriority[i].AdminPenalty != companiesWithPriority[j].AdminPenalty {
|
|
|
|
|
|
return companiesWithPriority[i].AdminPenalty > companiesWithPriority[j].AdminPenalty
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 然后按relationship类型排序
|
|
|
|
|
|
if companiesWithPriority[i].RelationshipVal != companiesWithPriority[j].RelationshipVal {
|
|
|
|
|
|
return companiesWithPriority[i].RelationshipVal > companiesWithPriority[j].RelationshipVal
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 最后按relationship数量排序
|
|
|
|
|
|
return companiesWithPriority[i].RelationCount > companiesWithPriority[j].RelationCount
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
// 限制处理的企业数量
|
|
|
|
|
|
processCount := len(companiesWithPriority)
|
|
|
|
|
|
if processCount > maxApiCalls {
|
|
|
|
|
|
processCount = maxApiCalls
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 只处理前N个优先级高的企业
|
|
|
|
|
|
prioritizedCompanies := companiesWithPriority[:processCount]
|
|
|
|
|
|
|
|
|
|
|
|
// 使用WaitGroup和chan处理并发
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
|
|
results := make(chan struct {
|
|
|
|
|
|
index int
|
|
|
|
|
|
data []byte
|
|
|
|
|
|
err error
|
|
|
|
|
|
}, processCount)
|
|
|
|
|
|
|
|
|
|
|
|
// 对按优先级排序的前N个企业进行涉诉信息查询
|
|
|
|
|
|
for _, company := range prioritizedCompanies {
|
|
|
|
|
|
wg.Add(1)
|
|
|
|
|
|
go func(origIndex int, companyInfo gjson.Result) {
|
|
|
|
|
|
defer wg.Done()
|
|
|
|
|
|
logx.Infof("开始处理企业[%d],企业名称: %s,统一社会信用代码: %s", origIndex, companyInfo.Get("basicInfo.name").String(), companyInfo.Get("basicInfo.creditCode").String())
|
|
|
|
|
|
// 提取企业名称和统一社会信用代码
|
|
|
|
|
|
orgName := companyInfo.Get("basicInfo.name")
|
|
|
|
|
|
creditCode := companyInfo.Get("basicInfo.creditCode")
|
|
|
|
|
|
|
|
|
|
|
|
if !orgName.Exists() || !creditCode.Exists() {
|
|
|
|
|
|
results <- struct {
|
|
|
|
|
|
index int
|
|
|
|
|
|
data []byte
|
|
|
|
|
|
err error
|
|
|
|
|
|
}{origIndex, nil, fmt.Errorf("企业名称或统一社会信用代码不存在")}
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 解析原始公司信息为map
|
|
|
|
|
|
var companyMap map[string]interface{}
|
|
|
|
|
|
if err := json.Unmarshal([]byte(companyInfo.Raw), &companyMap); err != nil {
|
|
|
|
|
|
results <- struct {
|
|
|
|
|
|
index int
|
|
|
|
|
|
data []byte
|
|
|
|
|
|
err error
|
|
|
|
|
|
}{origIndex, nil, fmt.Errorf("解析企业信息失败: %v", err)}
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 调用QYGL8271接口获取企业涉诉信息
|
2026-01-13 18:30:10 +08:00
|
|
|
|
lawsuitResp, err := a.callTianyuanApiWithLog(ctx, "", "QYGL8271", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"ent_name": orgName.String(),
|
|
|
|
|
|
"ent_code": creditCode.String(),
|
|
|
|
|
|
"auth_date": generateAuthDateRange(),
|
|
|
|
|
|
})
|
|
|
|
|
|
// 无论是否有错误,都继续处理
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
// 可能是正常没有涉诉数据,设置为空对象
|
|
|
|
|
|
logx.Infof("企业[%s]涉诉信息查询结果: %v", orgName.String(), err)
|
|
|
|
|
|
companyMap["lawsuitInfo"] = map[string]interface{}{}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 转换响应数据
|
|
|
|
|
|
lawsuitRespBytes, err := convertTianyuanResponse(lawsuitResp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
logx.Errorf("转换企业[%s]涉诉响应失败: %v", orgName.String(), err)
|
|
|
|
|
|
companyMap["lawsuitInfo"] = map[string]interface{}{}
|
|
|
|
|
|
} else if len(lawsuitRespBytes) == 0 || string(lawsuitRespBytes) == "{}" || string(lawsuitRespBytes) == "null" {
|
|
|
|
|
|
// 无涉诉数据
|
|
|
|
|
|
companyMap["lawsuitInfo"] = map[string]interface{}{}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 解析涉诉信息
|
|
|
|
|
|
var lawsuitInfo interface{}
|
|
|
|
|
|
if err := json.Unmarshal(lawsuitRespBytes, &lawsuitInfo); err != nil {
|
|
|
|
|
|
logx.Errorf("解析企业[%s]涉诉信息失败: %v", orgName.String(), err)
|
|
|
|
|
|
companyMap["lawsuitInfo"] = map[string]interface{}{}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 添加涉诉信息到企业信息中
|
|
|
|
|
|
companyMap["lawsuitInfo"] = lawsuitInfo
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 序列化更新后的企业信息
|
|
|
|
|
|
companyData, err := json.Marshal(companyMap)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
results <- struct {
|
|
|
|
|
|
index int
|
|
|
|
|
|
data []byte
|
|
|
|
|
|
err error
|
|
|
|
|
|
}{origIndex, nil, fmt.Errorf("序列化企业信息失败: %v", err)}
|
|
|
|
|
|
return
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
results <- struct {
|
|
|
|
|
|
index int
|
|
|
|
|
|
data []byte
|
|
|
|
|
|
err error
|
|
|
|
|
|
}{origIndex, companyData, nil}
|
|
|
|
|
|
}(company.Index, company.Data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 关闭结果通道
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
wg.Wait()
|
|
|
|
|
|
close(results)
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
// 解析原始数据为map
|
|
|
|
|
|
var dataMap map[string]interface{}
|
|
|
|
|
|
if err := json.Unmarshal([]byte(data.Raw), &dataMap); err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("解析data字段失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取原始企业列表
|
|
|
|
|
|
originalDatalist, ok := dataMap["datalist"].([]interface{})
|
|
|
|
|
|
if !ok {
|
|
|
|
|
|
return nil, fmt.Errorf("无法获取原始企业列表")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 创建结果映射,用于保存已处理的企业
|
|
|
|
|
|
processedCompanies := make(map[int]interface{})
|
|
|
|
|
|
|
|
|
|
|
|
// 收集处理过的企业数据
|
|
|
|
|
|
for result := range results {
|
|
|
|
|
|
if result.err != nil {
|
|
|
|
|
|
logx.Errorf("处理企业失败: %v", result.err)
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if result.data != nil {
|
|
|
|
|
|
var companyMap interface{}
|
|
|
|
|
|
if err := json.Unmarshal(result.data, &companyMap); err == nil {
|
|
|
|
|
|
processedCompanies[result.index] = companyMap
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 更新企业列表
|
|
|
|
|
|
// 处理过的用新数据,未处理的保留原样
|
|
|
|
|
|
updatedDatalist := make([]interface{}, len(originalDatalist))
|
|
|
|
|
|
for i, company := range originalDatalist {
|
|
|
|
|
|
if processed, exists := processedCompanies[i]; exists {
|
|
|
|
|
|
// 已处理的企业,使用新数据
|
|
|
|
|
|
updatedDatalist[i] = processed
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 未处理的企业,保留原始数据并添加空的涉诉信息
|
|
|
|
|
|
companyMap, ok := company.(map[string]interface{})
|
|
|
|
|
|
if ok {
|
|
|
|
|
|
// 为未处理的企业添加空的涉诉信息
|
|
|
|
|
|
companyMap["lawsuitInfo"] = map[string]interface{}{}
|
|
|
|
|
|
updatedDatalist[i] = companyMap
|
|
|
|
|
|
} else {
|
|
|
|
|
|
updatedDatalist[i] = company
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 更新原始数据中的企业列表
|
|
|
|
|
|
dataMap["datalist"] = updatedDatalist
|
|
|
|
|
|
|
|
|
|
|
|
// 序列化最终结果
|
|
|
|
|
|
result, err := json.Marshal(dataMap)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("序列化最终结果失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return result, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// code不等于"0000",返回错误
|
|
|
|
|
|
return nil, fmt.Errorf("响应code错误: %s", code.String())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcesFLXG0V4BRequest 个人司法涉诉(详版)
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessFLXG0V4BRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, FLXG0V4B, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "FLXG0V4B", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"auth_date": generateAuthDateRange(),
|
|
|
|
|
|
})
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
respBytes, err := json.Marshal(resp.Data)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
return respBytes, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessFLXG0687Request 反诈反赌核验
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessFLXG0687Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
if !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, FLXG0687, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "FLXG0687", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Value := gjson.GetBytes(respBytes, "value")
|
|
|
|
|
|
if !Value.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("自然人反诈反赌核验查询失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return []byte(Value.Raw), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessFLXG3D56Request 违约失信
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessFLXG3D56Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, FLXG3D56, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "FLXG3D56", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
codeResult := gjson.GetBytes(respBytes, "code")
|
|
|
|
|
|
if !codeResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("code 字段不存在")
|
|
|
|
|
|
}
|
|
|
|
|
|
if codeResult.String() != "00" {
|
|
|
|
|
|
return nil, fmt.Errorf("未匹配到相关结果")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 data 字段
|
|
|
|
|
|
dataResult := gjson.GetBytes(respBytes, "data")
|
|
|
|
|
|
if !dataResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("data 字段不存在")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将 data 字段解析为 map
|
|
|
|
|
|
var dataMap map[string]interface{}
|
|
|
|
|
|
if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("解析 data 字段失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 删除指定字段
|
|
|
|
|
|
delete(dataMap, "swift_number")
|
|
|
|
|
|
delete(dataMap, "DataStrategy")
|
|
|
|
|
|
|
|
|
|
|
|
// 重新编码为 JSON
|
|
|
|
|
|
modifiedData, err := json.Marshal(dataMap)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("编码修改后的 data 失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
return modifiedData, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessIVYZ5733Request 婚姻状况
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessIVYZ5733Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
if !idCard.Exists() || !name.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, IVYZ5733, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "IVYZ5733", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
result := gjson.GetBytes(respBytes, "data.data")
|
|
|
|
|
|
if !result.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("婚姻状态查询失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取原始结果
|
|
|
|
|
|
rawResult := result.String()
|
|
|
|
|
|
|
|
|
|
|
|
// 根据结果转换状态码
|
|
|
|
|
|
var statusCode string
|
|
|
|
|
|
switch {
|
|
|
|
|
|
case strings.HasPrefix(rawResult, "INR"):
|
|
|
|
|
|
statusCode = "0" // 匹配不成功
|
|
|
|
|
|
case strings.HasPrefix(rawResult, "IA"):
|
|
|
|
|
|
statusCode = "1" // 结婚
|
|
|
|
|
|
case strings.HasPrefix(rawResult, "IB"):
|
|
|
|
|
|
statusCode = "2" // 离婚
|
|
|
|
|
|
default:
|
|
|
|
|
|
return nil, fmt.Errorf("婚姻状态查询失败,未知状态码: %s", statusCode)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 构建新的返回结果
|
|
|
|
|
|
response := map[string]string{
|
|
|
|
|
|
"status": statusCode,
|
|
|
|
|
|
}
|
|
|
|
|
|
// 序列化为JSON
|
|
|
|
|
|
jsonResponse, err := json.Marshal(response)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("序列化结果失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return jsonResponse, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessIVYZ9A2BRequest 学历查询
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessIVYZ9A2BRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
if !idCard.Exists() || !name.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, IVYZ9A2B, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "IVYZ9A2B", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 解析响应
|
|
|
|
|
|
codeResult := gjson.GetBytes(respBytes, "data.education_background.code")
|
|
|
|
|
|
if !codeResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("教育经历核验查询失败: 返回数据缺少code字段")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
code := codeResult.String()
|
|
|
|
|
|
var result map[string]interface{}
|
|
|
|
|
|
|
|
|
|
|
|
switch code {
|
|
|
|
|
|
case "9100":
|
|
|
|
|
|
// 查询成功有结果
|
|
|
|
|
|
eduResultArray := gjson.GetBytes(respBytes, "data.education_background.data").Array()
|
|
|
|
|
|
var processedEduData []interface{}
|
|
|
|
|
|
|
|
|
|
|
|
// 提取每个元素中Raw字段的实际内容
|
|
|
|
|
|
for _, item := range eduResultArray {
|
|
|
|
|
|
var eduInfo interface{}
|
|
|
|
|
|
if err := json.Unmarshal([]byte(item.Raw), &eduInfo); err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("解析教育信息失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
processedEduData = append(processedEduData, eduInfo)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
result = map[string]interface{}{
|
|
|
|
|
|
"data": processedEduData,
|
|
|
|
|
|
"status": 1,
|
|
|
|
|
|
}
|
|
|
|
|
|
case "9000":
|
|
|
|
|
|
// 查询成功无结果
|
|
|
|
|
|
result = map[string]interface{}{
|
|
|
|
|
|
"data": []interface{}{},
|
|
|
|
|
|
"status": 0,
|
|
|
|
|
|
}
|
|
|
|
|
|
default:
|
|
|
|
|
|
// 其他情况视为错误
|
|
|
|
|
|
errMsg := gjson.GetBytes(respBytes, "data.education_background.msg").String()
|
|
|
|
|
|
return nil, fmt.Errorf("教育经历核验查询失败: %s (code: %s)", errMsg, code)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将结果转为JSON字节
|
|
|
|
|
|
jsonResult, err := json.Marshal(result)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("处理教育经历查询结果失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return jsonResult, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessYYSYBE08Request 二要素
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessYYSYBE08Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, YYSYBE08, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "YYSYBE08", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用gjson获取resultCode
|
|
|
|
|
|
resultCode := gjson.GetBytes(respBytes, "ctidRequest.ctidAuth.resultCode")
|
|
|
|
|
|
if !resultCode.Exists() {
|
|
|
|
|
|
return nil, errors.New("获取resultCode失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取resultCode的第一个字符
|
|
|
|
|
|
resultCodeStr := resultCode.String()
|
|
|
|
|
|
if len(resultCodeStr) == 0 {
|
|
|
|
|
|
return nil, errors.New("resultCode为空")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
firstChar := string(resultCodeStr[0])
|
|
|
|
|
|
if firstChar != "0" && firstChar != "5" {
|
|
|
|
|
|
return nil, errors.New("resultCode的第一个字符既不是0也不是5")
|
|
|
|
|
|
}
|
|
|
|
|
|
return []byte(firstChar), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ0A03Request 借贷申请
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ0A03Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ0A03, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ0A03", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 code 字段
|
|
|
|
|
|
codeResult := gjson.GetBytes(respBytes, "code")
|
|
|
|
|
|
if !codeResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("code 字段不存在")
|
|
|
|
|
|
}
|
|
|
|
|
|
if codeResult.String() != "00" {
|
|
|
|
|
|
return nil, fmt.Errorf("未匹配到相关结果")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 data 字段
|
|
|
|
|
|
dataResult := gjson.GetBytes(respBytes, "data")
|
|
|
|
|
|
if !dataResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("data 字段不存在")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将 data 字段解析为 map
|
|
|
|
|
|
var dataMap map[string]interface{}
|
|
|
|
|
|
if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("解析 data 字段失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 删除指定字段
|
|
|
|
|
|
delete(dataMap, "swift_number")
|
|
|
|
|
|
delete(dataMap, "DataStrategy")
|
|
|
|
|
|
|
|
|
|
|
|
// 重新编码为 JSON
|
|
|
|
|
|
modifiedData, err := json.Marshal(dataMap)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("编码修改后的 data 失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
return modifiedData, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ8203Request 借贷行为
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ8203Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ8203, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ8203", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 code 字段
|
|
|
|
|
|
codeResult := gjson.GetBytes(respBytes, "code")
|
|
|
|
|
|
if !codeResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("code 字段不存在")
|
|
|
|
|
|
}
|
|
|
|
|
|
if codeResult.String() != "00" {
|
|
|
|
|
|
return nil, fmt.Errorf("未匹配到相关结果")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 data 字段
|
|
|
|
|
|
dataResult := gjson.GetBytes(respBytes, "data")
|
|
|
|
|
|
if !dataResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("data 字段不存在")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将 data 字段解析为 map
|
|
|
|
|
|
var dataMap map[string]interface{}
|
|
|
|
|
|
if err := json.Unmarshal([]byte(dataResult.Raw), &dataMap); err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("解析 data 字段失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 删除指定字段
|
|
|
|
|
|
delete(dataMap, "swift_number")
|
|
|
|
|
|
delete(dataMap, "DataStrategy")
|
|
|
|
|
|
|
|
|
|
|
|
// 重新编码为 JSON
|
|
|
|
|
|
modifiedData, err := json.Marshal(dataMap)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("编码修改后的 data 失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
return modifiedData, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ4AA8Request 还款压力
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ4AA8Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !idCard.Exists() || !name.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ4AA8, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ4AA8", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取响应码和偿贷压力标志
|
|
|
|
|
|
code := gjson.GetBytes(respBytes, "code").String()
|
|
|
|
|
|
flagDebtRepayStress := gjson.GetBytes(respBytes, "flag_debtrepaystress").String()
|
|
|
|
|
|
|
|
|
|
|
|
// 判断是否成功
|
|
|
|
|
|
if code != "00" || flagDebtRepayStress != "1" {
|
|
|
|
|
|
return nil, fmt.Errorf("偿贷压力查询失败: %+v", respBytes)
|
|
|
|
|
|
}
|
|
|
|
|
|
// 获取偿贷压力分数
|
|
|
|
|
|
drsNoDebtScore := gjson.GetBytes(respBytes, "drs_nodebtscore").String()
|
|
|
|
|
|
|
|
|
|
|
|
// 构建结果
|
|
|
|
|
|
result := map[string]interface{}{
|
|
|
|
|
|
"score": drsNoDebtScore,
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将结果转为JSON
|
|
|
|
|
|
jsonResult, err := json.Marshal(result)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("处理偿贷压力查询结果失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return jsonResult, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessQYGL8271Request 企业涉诉
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessQYGL8271Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
entName := gjson.GetBytes(params, "ent_name")
|
|
|
|
|
|
entCode := gjson.GetBytes(params, "ent_code")
|
|
|
|
|
|
|
|
|
|
|
|
if !entName.Exists() || !entCode.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, QYGL8271, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "QYGL8271", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"ent_name": entName.String(),
|
|
|
|
|
|
"ent_code": entCode.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 第一步:提取外层的 data 字段
|
|
|
|
|
|
dataResult := gjson.GetBytes(respBytes, "data")
|
|
|
|
|
|
if !dataResult.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("外层 data 字段不存在")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 第二步:解析外层 data 的 JSON 字符串
|
|
|
|
|
|
var outerDataMap map[string]interface{}
|
|
|
|
|
|
if err := json.Unmarshal([]byte(dataResult.String()), &outerDataMap); err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("解析外层 data 字段失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 第三步:提取内层的 data 字段
|
|
|
|
|
|
innerData, ok := outerDataMap["data"].(string)
|
|
|
|
|
|
if !ok {
|
|
|
|
|
|
return nil, fmt.Errorf("内层 data 字段不存在或类型错误")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 第四步:解析内层 data 的 JSON 字符串
|
|
|
|
|
|
var finalDataMap map[string]interface{}
|
|
|
|
|
|
if err := json.Unmarshal([]byte(innerData), &finalDataMap); err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("解析内层 data 字段失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 将最终的 JSON 对象编码为字节数组返回
|
|
|
|
|
|
finalDataBytes, err := json.Marshal(finalDataMap)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("编码最终的 JSON 对象失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
statusResult := gjson.GetBytes(finalDataBytes, "status.status")
|
|
|
|
|
|
if statusResult.Exists() || statusResult.Int() == -1 {
|
|
|
|
|
|
return nil, fmt.Errorf("企业涉诉为空: %+v", finalDataBytes)
|
|
|
|
|
|
}
|
|
|
|
|
|
return finalDataBytes, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessQYGL6F2DRequest 人企关联
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessQYGL6F2DRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
if !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, QYGL6F2D, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "QYGL6F2D", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理股东人企关系的响应数据
|
|
|
|
|
|
code := gjson.GetBytes(respBytes, "code")
|
|
|
|
|
|
if !code.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("响应中缺少 code 字段")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 判断 code 是否等于 "0000"
|
|
|
|
|
|
if code.String() == "0000" {
|
|
|
|
|
|
// 获取 data 字段的值
|
|
|
|
|
|
data := gjson.GetBytes(respBytes, "data")
|
|
|
|
|
|
if !data.Exists() {
|
|
|
|
|
|
return nil, fmt.Errorf("响应中缺少 data 字段")
|
|
|
|
|
|
}
|
|
|
|
|
|
// 返回 data 字段的内容
|
|
|
|
|
|
return []byte(data.Raw), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// code 不等于 "0000",返回错误
|
|
|
|
|
|
return nil, fmt.Errorf("响应code错误%s", code.String())
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessQCXG7A2BRequest 名下车辆
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessQCXG7A2BRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
if !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, QCXG7A2B, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "QCXG7A2B", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessYYSY09CDRequest 三要素
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessYYSY09CDRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, YYSY09CD, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "YYSY09CD", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
respBytes, err := convertTianyuanResponse(resp)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用gjson获取resultCode
|
|
|
|
|
|
resultCode := gjson.GetBytes(respBytes, "ctidRequest.ctidAuth.resultCode")
|
|
|
|
|
|
if !resultCode.Exists() {
|
|
|
|
|
|
return nil, errors.New("获取resultCode失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 获取resultCode的第一个字符
|
|
|
|
|
|
resultCodeStr := resultCode.String()
|
|
|
|
|
|
if len(resultCodeStr) == 0 {
|
|
|
|
|
|
return nil, errors.New("resultCode为空")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
firstChar := string(resultCodeStr[0])
|
|
|
|
|
|
if firstChar != "0" && firstChar != "5" {
|
|
|
|
|
|
return nil, errors.New("resultCode的第一个字符既不是0也不是5")
|
|
|
|
|
|
}
|
|
|
|
|
|
return []byte(firstChar), nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessBehaviorRiskScanRequest 行为风险扫描
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessBehaviorRiskScanRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, BehaviorRiskScan, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var wg sync.WaitGroup
|
|
|
|
|
|
type apiResult struct {
|
|
|
|
|
|
name string
|
|
|
|
|
|
data []byte
|
|
|
|
|
|
err error
|
|
|
|
|
|
}
|
|
|
|
|
|
results := make(chan apiResult, 1) // 4个风险检测项
|
|
|
|
|
|
|
|
|
|
|
|
// 并行调用两个不同的风险检测API
|
|
|
|
|
|
wg.Add(1)
|
|
|
|
|
|
|
|
|
|
|
|
// 反赌反诈
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
defer wg.Done()
|
2026-01-13 18:30:10 +08:00
|
|
|
|
respBytes, err := a.ProcessFLXG0687Request(ctx, params)
|
2025-11-27 13:09:54 +08:00
|
|
|
|
results <- apiResult{name: "anti_fraud_gaming", data: respBytes, err: err}
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
// 关闭结果通道
|
|
|
|
|
|
go func() {
|
|
|
|
|
|
wg.Wait()
|
|
|
|
|
|
close(results)
|
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
|
|
// 收集所有结果
|
|
|
|
|
|
resultMap := make(map[string]interface{})
|
|
|
|
|
|
var errors []string
|
|
|
|
|
|
|
|
|
|
|
|
for result := range results {
|
|
|
|
|
|
if result.err != nil {
|
|
|
|
|
|
// 记录错误但继续处理其他结果
|
|
|
|
|
|
errors = append(errors, fmt.Sprintf("%s: %v", result.name, result.err))
|
|
|
|
|
|
continue
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 解析JSON结果并添加到结果映射
|
|
|
|
|
|
var parsedData interface{}
|
|
|
|
|
|
if err := json.Unmarshal(result.data, &parsedData); err != nil {
|
|
|
|
|
|
errors = append(errors, fmt.Sprintf("解析%s数据失败: %v", result.name, err))
|
|
|
|
|
|
} else {
|
|
|
|
|
|
resultMap[result.name] = parsedData
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 添加错误信息到结果中(如果存在)
|
|
|
|
|
|
if len(errors) > 0 {
|
|
|
|
|
|
resultMap["errors"] = errors
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 序列化最终结果
|
|
|
|
|
|
finalResult, err := json.Marshal(resultMap)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, fmt.Errorf("序列化行为风险扫描结果失败: %v", err)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return finalResult, nil
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessDWBG8B4DRequest 谛听多维报告
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessDWBG8B4DRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
AuthorizationURL := gjson.GetBytes(params, "authorization_url")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() || !AuthorizationURL.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, DWBG8B4D, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "DWBG8B4D", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
"authorization_url": AuthorizationURL.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessDWBG6A2CRequest 司南报告服务
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessDWBG6A2CRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
AuthorizationURL := gjson.GetBytes(params, "authorization_url")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() || !AuthorizationURL.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, DWBG6A2C, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "DWBG6A2C", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
"authorization_url": AuthorizationURL.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ4B6CRequest 探针C风险评估
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ4B6CRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ4B6C, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ4B6C", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
"authorized": "1",
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ09J8Request 收入评估
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ09J8Request(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ09J8, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ09J8", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
"authorized": "1",
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ5E9FRequest 借选指数
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ5E9FRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ5E9F, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ5E9F", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
"authorized": "1",
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessQYGL3F8ERequest 人企关系加强版2
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessQYGL3F8ERequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
if !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, QYGL3F8E, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "QYGL3F8E", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessIVYZ81NCRequest 婚姻,登记时间版
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessIVYZ81NCRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, IVYZ81NC, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "IVYZ81NC", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessIVYZ7F3ARequest 学历查询版B
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessIVYZ7F3ARequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
if !idCard.Exists() || !name.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, IVYZ7F3A, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "IVYZ7F3A", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"authorized": "1",
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessDWBG7F3ARequest 多头借贷行业风险版
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessDWBG7F3ARequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, DWBG7F3A, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "DWBG7F3A", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ8A2DRequest 特殊名单验证B
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ8A2DRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ8A2D, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ8A2D", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
"authorized": "1",
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessYYSY8B1CRequest 手机在网时长B
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessYYSY8B1CRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, YYSY8B1C, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "YYSY8B1C", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessYYSY7D3ERequest 携号转网查询
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessYYSY7D3ERequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, YYSY7D3E, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "YYSY7D3E", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessFLXG7E8FRequest 个人司法涉诉查询
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessFLXG7E8FRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !idCard.Exists() || !name.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, FLXG7E8F, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "FLXG7E8F", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessIVYZ8I9JRequest 互联网行为推测
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessIVYZ8I9JRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !idCard.Exists() || !name.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, IVYZ8I9J, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "IVYZ8I9J", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ7F1ARequest 全景雷达
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ7F1ARequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ7F1A, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ7F1A", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
"authorized": "1",
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 直接返回解密后的数据,而不是再次进行JSON编码
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ProcessIVYZ3P9MRequest 学历实时查询
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessIVYZ3P9MRequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-11-27 13:09:54 +08:00
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
if !idCard.Exists() || !name.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, IVYZ3P9M, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "IVYZ3P9M", map[string]interface{}{
|
2025-11-27 13:09:54 +08:00
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
2025-12-31 18:33:37 +08:00
|
|
|
|
|
|
|
|
|
|
// ProcessJRZQ6F2ARequest 借贷申请
|
2026-01-13 18:30:10 +08:00
|
|
|
|
func (a *ApiRequestService) ProcessJRZQ6F2ARequest(ctx context.Context, params []byte) ([]byte, error) {
|
2025-12-31 18:33:37 +08:00
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, JRZQ6F2A, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-13 18:30:10 +08:00
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "JRZQ6F2A", map[string]interface{}{
|
2025-12-31 18:33:37 +08:00
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return convertTianyuanResponse(resp)
|
|
|
|
|
|
}
|
2026-01-14 20:05:42 +08:00
|
|
|
|
|
|
|
|
|
|
// ProcessCOMBQN12Request 全能入职背调报告(标准版) - 组合包
|
|
|
|
|
|
func (a *ApiRequestService) ProcessCOMBQN12Request(ctx context.Context, params []byte) ([]byte, error) {
|
|
|
|
|
|
name := gjson.GetBytes(params, "name")
|
|
|
|
|
|
idCard := gjson.GetBytes(params, "id_card")
|
|
|
|
|
|
mobile := gjson.GetBytes(params, "mobile")
|
|
|
|
|
|
if !name.Exists() || !idCard.Exists() || !mobile.Exists() {
|
|
|
|
|
|
return nil, errors.New("api请求, COMBQN12, 获取相关参数失败")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
resp, err := a.callTianyuanApiWithLog(ctx, "", "COMBQN12", map[string]interface{}{
|
|
|
|
|
|
"name": name.String(),
|
|
|
|
|
|
"id_card": idCard.String(),
|
|
|
|
|
|
"mobile_no": mobile.String(),
|
|
|
|
|
|
"authorized": "1",
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 使用组合包响应转换函数,自动检测并转换
|
|
|
|
|
|
return convertTianyuanBundleResponse(resp)
|
|
|
|
|
|
}
|