1372 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			1372 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package service | |||
|  | 
 | |||
|  | import ( | |||
|  | 	"context" | |||
|  | 	"encoding/json" | |||
|  | 	"errors" | |||
|  | 	"fmt" | |||
|  | 	"hm-server/app/main/api/internal/config" | |||
|  | 	tianyuanapi "hm-server/app/main/api/internal/service/tianyuanapi_sdk" | |||
|  | 	"hm-server/app/main/model" | |||
|  | 	"sort" | |||
|  | 	"strings" | |||
|  | 	"sync" | |||
|  | 	"sync/atomic" | |||
|  | 	"time" | |||
|  | 
 | |||
|  | 	"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) | |||
|  | } | |||
|  | 
 | |||
|  | // 生成认证时间范围:当前时间前后两天的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) | |||
|  | } | |||
|  | 
 | |||
|  | type ApiRequestService struct { | |||
|  | 	config              config.Config | |||
|  | 	featureModel        model.FeatureModel | |||
|  | 	productFeatureModel model.ProductFeatureModel | |||
|  | 	tianyuanapi         *tianyuanapi.Client | |||
|  | } | |||
|  | 
 | |||
|  | // NewApiRequestService 是一个构造函数,用于初始化 ApiRequestService | |||
|  | func NewApiRequestService(c config.Config, featureModel model.FeatureModel, productFeatureModel model.ProductFeatureModel, tianyuanapi *tianyuanapi.Client) *ApiRequestService { | |||
|  | 	return &ApiRequestService{ | |||
|  | 		config:              c, | |||
|  | 		featureModel:        featureModel, | |||
|  | 		productFeatureModel: productFeatureModel, | |||
|  | 		tianyuanapi:         tianyuanapi, | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | 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"` | |||
|  | } | |||
|  | 
 | |||
|  | // ProcessRequests 处理请求 | |||
|  | func (a *ApiRequestService) ProcessRequests(params []byte, productID int64) ([]byte, error) { | |||
|  | 	var ctx, cancel = context.WithCancel(context.Background()) | |||
|  | 	defer cancel() | |||
|  | 	build := a.productFeatureModel.SelectBuilder().Where(squirrel.Eq{ | |||
|  | 		"product_id": productID, | |||
|  | 	}) | |||
|  | 	productFeatureList, findProductFeatureErr := a.productFeatureModel.FindAll(ctx, build, "") | |||
|  | 	if findProductFeatureErr != nil { | |||
|  | 		return nil, findProductFeatureErr | |||
|  | 	} | |||
|  | 	var featureIDs []int64 | |||
|  | 	isImportantMap := make(map[int64]int64, len(productFeatureList)) | |||
|  | 	for _, pf := range productFeatureList { | |||
|  | 		featureIDs = append(featureIDs, pf.FeatureId) | |||
|  | 		isImportantMap[pf.FeatureId] = pf.IsImportant | |||
|  | 	} | |||
|  | 	if len(featureIDs) == 0 { | |||
|  | 		return nil, errors.New("featureIDs 是空的") | |||
|  | 	} | |||
|  | 	builder := a.featureModel.SelectBuilder().Where(squirrel.Eq{"id": featureIDs}) | |||
|  | 	featureList, findFeatureErr := a.featureModel.FindAll(ctx, builder, "") | |||
|  | 	if findFeatureErr != nil { | |||
|  | 		return nil, findFeatureErr | |||
|  | 	} | |||
|  | 	if len(featureList) == 0 { | |||
|  | 		return nil, errors.New("处理请求错误,产品无对应接口功能") | |||
|  | 	} | |||
|  | 	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") | |||
|  | 			var ( | |||
|  | 				resp          json.RawMessage | |||
|  | 				preprocessErr error | |||
|  | 			) | |||
|  | 			// 若 isImportantMap[feature.ID] == 1,则表示需要在出错时重试 | |||
|  | 			isImportant := isImportantMap[feature.Id] == 1 | |||
|  | 			tryCount := 0 | |||
|  | 			for { | |||
|  | 				tryCount++ | |||
|  | 				resp, preprocessErr = a.PreprocessRequestApi(params, feature.ApiId) | |||
|  | 				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) | |||
|  | 	}() | |||
|  | 	// 收集所有结果并合并z | |||
|  | 	var responseData []APIResponseData | |||
|  | 	for result := range resultsCh { | |||
|  | 		responseData = append(responseData, result) | |||
|  | 	} | |||
|  | 	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 | |||
|  | } | |||
|  | 
 | |||
|  | // ------------------------------------请求处理器-------------------------- | |||
|  | var requestProcessors = map[string]func(*ApiRequestService, []byte) ([]byte, error){ | |||
|  | 	"PersonEnterprisePro": (*ApiRequestService).ProcessPersonEnterpriseProRequest, | |||
|  | 	"BehaviorRiskScan":    (*ApiRequestService).ProcessBehaviorRiskScanRequest, | |||
|  | 	"YYSYBE08":            (*ApiRequestService).ProcessYYSYBE08Request, | |||
|  | 	"YYSY09CD":            (*ApiRequestService).ProcessYYSY09CDRequest, | |||
|  | 	"FLXG0687":            (*ApiRequestService).ProcessFLXG0687Request, | |||
|  | 	"FLXG3D56":            (*ApiRequestService).ProcessFLXG3D56Request, | |||
|  | 	"FLXG0V4B":            (*ApiRequestService).ProcesFLXG0V4BRequest, | |||
|  | 	"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, | |||
|  | } | |||
|  | 
 | |||
|  | // PreprocessRequestApi 调用指定的请求处理函数 | |||
|  | func (a *ApiRequestService) PreprocessRequestApi(params []byte, apiID string) ([]byte, error) { | |||
|  | 	if processor, exists := requestProcessors[apiID]; exists { | |||
|  | 		return processor(a, params) // 调用 ApiRequestService 方法 | |||
|  | 	} | |||
|  | 
 | |||
|  | 	return nil, errors.New("api请求, 未找到相应的处理程序") | |||
|  | } | |||
|  | 
 | |||
|  | // PersonEnterprisePro 人企业关系加强版 | |||
|  | func (a *ApiRequestService) ProcessPersonEnterpriseProRequest(params []byte) ([]byte, error) { | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	// 设置最大调用次数上限 | |||
|  | 	maxApiCalls := 20 // 允许最多查询20个企业 | |||
|  | 
 | |||
|  | 	if !idCard.Exists() { | |||
|  | 		return nil, errors.New("api请求, PersonEnterprisePro, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("QYGLB4C0", map[string]interface{}{ | |||
|  | 		"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接口获取企业涉诉信息 | |||
|  | 				lawsuitResp, err := a.tianyuanapi.CallInterface("QYGL8271", map[string]interface{}{ | |||
|  | 					"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 个人司法涉诉(详版) | |||
|  | func (a *ApiRequestService) ProcesFLXG0V4BRequest(params []byte) ([]byte, error) { | |||
|  | 	name := gjson.GetBytes(params, "name") | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	if !name.Exists() || !idCard.Exists(){ | |||
|  | 		return nil, errors.New("api请求, FLXG0V4B, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("FLXG0V4B", map[string]interface{}{ | |||
|  | 		"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 反诈反赌核验 | |||
|  | func (a *ApiRequestService) ProcessFLXG0687Request(params []byte) ([]byte, error) { | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	if !idCard.Exists() { | |||
|  | 		return nil, errors.New("api请求, FLXG0687, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("FLXG0687", map[string]interface{}{ | |||
|  | 		"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 违约失信 | |||
|  | func (a *ApiRequestService) ProcessFLXG3D56Request(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请求, FLXG3D56, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("FLXG3D56", map[string]interface{}{ | |||
|  | 		"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 婚姻状况 | |||
|  | func (a *ApiRequestService) ProcessIVYZ5733Request(params []byte) ([]byte, error) { | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	name := gjson.GetBytes(params, "name") | |||
|  | 	if !idCard.Exists() || !name.Exists() { | |||
|  | 		return nil, errors.New("api请求, IVYZ5733, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("IVYZ5733", map[string]interface{}{ | |||
|  | 		"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 学历查询 | |||
|  | func (a *ApiRequestService) ProcessIVYZ9A2BRequest(params []byte) ([]byte, error) { | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	name := gjson.GetBytes(params, "name") | |||
|  | 	if !idCard.Exists() || !name.Exists() { | |||
|  | 		return nil, errors.New("api请求, IVYZ9A2B, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("IVYZ9A2B", map[string]interface{}{ | |||
|  | 		"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 二要素 | |||
|  | func (a *ApiRequestService) ProcessYYSYBE08Request(params []byte) ([]byte, error) { | |||
|  | 	name := gjson.GetBytes(params, "name") | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	if !name.Exists() || !idCard.Exists() { | |||
|  | 		return nil, errors.New("api请求, YYSYBE08, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("YYSYBE08", map[string]interface{}{ | |||
|  | 		"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 借贷申请 | |||
|  | func (a *ApiRequestService) ProcessJRZQ0A03Request(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请求, JRZQ0A03, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("JRZQ0A03", map[string]interface{}{ | |||
|  | 		"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 借贷行为 | |||
|  | func (a *ApiRequestService) ProcessJRZQ8203Request(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请求, JRZQ8203, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("JRZQ8203", map[string]interface{}{ | |||
|  | 		"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 还款压力 | |||
|  | func (a *ApiRequestService) ProcessJRZQ4AA8Request(params []byte) ([]byte, error) { | |||
|  | 	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, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("JRZQ4AA8", map[string]interface{}{ | |||
|  | 		"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 企业涉诉 | |||
|  | func (a *ApiRequestService) ProcessQYGL8271Request(params []byte) ([]byte, error) { | |||
|  | 	entName := gjson.GetBytes(params, "ent_name") | |||
|  | 	entCode := gjson.GetBytes(params, "ent_code") | |||
|  | 
 | |||
|  | 	if !entName.Exists() || !entCode.Exists() { | |||
|  | 		return nil, errors.New("api请求, QYGL8271, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("QYGL8271", map[string]interface{}{ | |||
|  | 		"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 | |||
|  | } | |||
|  | 
 | |||
|  | // ProcessFLXG0V4BRequest 个人涉诉 | |||
|  | func (a *ApiRequestService) ProcessFLXG0V4BRequest(params []byte) ([]byte, error) { | |||
|  | 	name := gjson.GetBytes(params, "name") | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 
 | |||
|  | 	if !name.Exists() || !idCard.Exists() { | |||
|  | 		return nil, errors.New("api请求, FLXG0V4B, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("FLXG0V4B", map[string]interface{}{ | |||
|  | 		"name":      name.String(), | |||
|  | 		"id_card":   idCard.String(), | |||
|  | 		"auth_date": generateAuthDateRange(), | |||
|  | 	}, &tianyuanapi.ApiCallOptions{ | |||
|  | 		Json: true, | |||
|  | 	}) | |||
|  | 	if err != nil { | |||
|  | 		return nil, err | |||
|  | 	} | |||
|  | 
 | |||
|  | 	return convertTianyuanResponse(resp) | |||
|  | } | |||
|  | 
 | |||
|  | // ProcessQYGL6F2DRequest 人企关联 | |||
|  | func (a *ApiRequestService) ProcessQYGL6F2DRequest(params []byte) ([]byte, error) { | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	if !idCard.Exists() { | |||
|  | 		return nil, errors.New("api请求, QYGL6F2D, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("QYGL6F2D", map[string]interface{}{ | |||
|  | 		"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 名下车辆 | |||
|  | func (a *ApiRequestService) ProcessQCXG7A2BRequest(params []byte) ([]byte, error) { | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	if !idCard.Exists() { | |||
|  | 		return nil, errors.New("api请求, QCXG7A2B, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("QCXG7A2B", map[string]interface{}{ | |||
|  | 		"id_card": idCard.String(), | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	if err != nil { | |||
|  | 		return nil, err | |||
|  | 	} | |||
|  | 
 | |||
|  | 	return convertTianyuanResponse(resp) | |||
|  | } | |||
|  | 
 | |||
|  | // ProcessYYSY09CDRequest 三要素 | |||
|  | func (a *ApiRequestService) ProcessYYSY09CDRequest(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请求, YYSY09CD, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("YYSY09CD", map[string]interface{}{ | |||
|  | 		"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 行为风险扫描 | |||
|  | func (a *ApiRequestService) ProcessBehaviorRiskScanRequest(params []byte) ([]byte, error) { | |||
|  | 	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() | |||
|  | 		respBytes, err := a.ProcessFLXG0687Request(params) | |||
|  | 		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 谛听多维报告 | |||
|  | func (a *ApiRequestService) ProcessDWBG8B4DRequest(params []byte) ([]byte, error) { | |||
|  | 	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, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("DWBG8B4D", map[string]interface{}{ | |||
|  | 		"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 司南报告服务 | |||
|  | func (a *ApiRequestService) ProcessDWBG6A2CRequest(params []byte) ([]byte, error) { | |||
|  | 	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, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("DWBG6A2C", map[string]interface{}{ | |||
|  | 		"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风险评估 | |||
|  | func (a *ApiRequestService) ProcessJRZQ4B6CRequest(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请求, JRZQ4B6C, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("JRZQ4B6C", map[string]interface{}{ | |||
|  | 		"name":      name.String(), | |||
|  | 		"id_card":   idCard.String(), | |||
|  | 		"mobile_no": mobile.String(), | |||
|  | 		"authorized": "1", | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	if err != nil { | |||
|  | 		return nil, err | |||
|  | 	} | |||
|  | 
 | |||
|  | 	// 直接返回解密后的数据,而不是再次进行JSON编码 | |||
|  | 	return convertTianyuanResponse(resp) | |||
|  | } | |||
|  | 
 | |||
|  | // ProcessJRZQ09J8Request 收入评估 | |||
|  | func (a *ApiRequestService) ProcessJRZQ09J8Request(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请求, JRZQ09J8, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("JRZQ09J8", map[string]interface{}{ | |||
|  | 		"name":      name.String(), | |||
|  | 		"id_card":   idCard.String(), | |||
|  | 		"mobile_no": mobile.String(), | |||
|  | 		"authorized": "1", | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	if err != nil { | |||
|  | 		return nil, err | |||
|  | 	} | |||
|  | 
 | |||
|  | 	// 直接返回解密后的数据,而不是再次进行JSON编码 | |||
|  | 	return convertTianyuanResponse(resp) | |||
|  | } | |||
|  | 
 | |||
|  | // ProcessJRZQ5E9FRequest 借选指数 | |||
|  | func (a *ApiRequestService) ProcessJRZQ5E9FRequest(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请求, JRZQ5E9F, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("JRZQ5E9F", map[string]interface{}{ | |||
|  | 		"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 | |||
|  | func (a *ApiRequestService) ProcessQYGL3F8ERequest(params []byte) ([]byte, error) { | |||
|  | 	idCard := gjson.GetBytes(params, "id_card") | |||
|  | 	if !idCard.Exists() { | |||
|  | 		return nil, errors.New("api请求, QYGL3F8E, 获取相关参数失败") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	resp, err := a.tianyuanapi.CallInterface("QYGL3F8E", map[string]interface{}{ | |||
|  | 		"id_card":   idCard.String(), | |||
|  | 	}) | |||
|  | 
 | |||
|  | 	if err != nil { | |||
|  | 		return nil, err | |||
|  | 	} | |||
|  | 
 | |||
|  | 	// 直接返回解密后的数据,而不是再次进行JSON编码 | |||
|  | 	return convertTianyuanResponse(resp) | |||
|  | } |