tianyuan-api-server/apps/api/internal/logic/COMB/comb298ylogic.go

240 lines
6.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package COMB
import (
"context"
"encoding/hex"
"encoding/json"
"sync"
"tianyuan-api/apps/api/internal/common"
"tianyuan-api/apps/api/internal/svc"
"tianyuan-api/apps/api/internal/types"
"tianyuan-api/apps/api/internal/validator"
"tianyuan-api/apps/api/internal/westmodel"
"tianyuan-api/pkg/crypto"
"tianyuan-api/pkg/errs"
"github.com/zeromicro/go-zero/core/logx"
)
type COMB298YLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
// WestAPIRequest 定义西部API请求结构
type APIRequest struct {
SourceId string
ServiceId string
Request map[string]interface{}
Mapping map[string]string
Wrap string
Service string
}
// WestAPIResponse 定义西部API响应结构
type APIResponse struct {
SourceId string
Resp []byte
Success bool
}
// 将所有响应组装成JSON
type ResponseData struct {
Responses []struct {
ServiceId string `json:"api_code"`
Data json.RawMessage `json:"data"`
Success bool `json:"success"`
} `json:"responses"`
}
func NewCOMB298YLogic(ctx context.Context, svcCtx *svc.ServiceContext) *COMB298YLogic {
return &COMB298YLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *COMB298YLogic) COMB298Y(req *types.Request) (resp string, err *errs.AppError) {
var status string
var charges bool
var remark = ""
secretKey, ok := l.ctx.Value("secretKey").(string)
if !ok {
return "", errs.ErrSystem
}
transactionID, ok := l.ctx.Value("transactionID").(string)
if !ok {
return "", errs.ErrSystem
}
userId, userIdOk := l.ctx.Value("userId").(int64)
if !userIdOk {
return "", errs.ErrSystem
}
productCode, productCodeOk := l.ctx.Value("productCode").(string)
if !productCodeOk || productCode == "" {
return "", errs.ErrSystem
}
defer func() {
if err != nil {
status = "failed"
charges = false
} else {
status = "success"
charges = true
}
sendApiRequestMessageErr := l.svcCtx.ApiRequestMqsService.SendApiRequestMessage(l.ctx, transactionID, userId, productCode, status, charges, remark)
if sendApiRequestMessageErr != nil {
logx.Errorf("发送 API 请求消息失败: %v", err)
}
}()
// 1、解密
key, decodeErr := hex.DecodeString(secretKey)
if decodeErr != nil {
return "", errs.ErrSystem
}
decryptData, aesDecryptErr := crypto.AesDecrypt(req.Data, key)
if aesDecryptErr != nil || len(decryptData) == 0 {
return "", errs.ErrParamDecryption
}
// 2、校验
var data validator.COMB298YRequest
if validatorErr := validator.ValidateAndParse(decryptData, &data); validatorErr != nil {
return "", errs.ErrParamValidation
}
// 3、西部加密
westConfig := l.svcCtx.Config.WestConfig
encryptedFields, encryptStructFieldsErr := common.EncryptStructFields(data, westConfig.Key)
if encryptStructFieldsErr != nil {
logx.Errorf("西部加密错误:%v", encryptStructFieldsErr)
return "", errs.ErrSystem
}
// 4、发送请求到西部
logx.Infof("交易号:%s", transactionID)
// 准备并发请求
apiRequests := []APIRequest{
{SourceId: "YYSY09CD", ServiceId: "G16BJ02", Mapping: westmodel.YYSY09CDFieldMapping, Wrap: "data", Service: "west"},
{SourceId: "JRZQ0A03", ServiceId: "G27BJ05", Mapping: westmodel.JRZQ0A03FieldMapping, Wrap: "data", Service: "west"},
{SourceId: "JRZQ8203", ServiceId: "G28BJ05", Mapping: westmodel.JRZQ8203FieldMapping, Wrap: "data", Service: "west"},
{SourceId: "FLXG3D56", ServiceId: "G26BJ05", Mapping: westmodel.FLXG3D56FieldMapping, Wrap: "data", Service: "west"},
{SourceId: "FLXGCA3D", ServiceId: "G22SC01", Mapping: westmodel.FLXGCA3DFieldMapping, Wrap: "data", Service: "west"},
{SourceId: "JRZQ4AA8", ServiceId: "G29BJ05", Mapping: westmodel.JRZQ4AA8FieldMapping, Wrap: "data", Service: "west"},
{SourceId: "FLXGC9D1", ServiceId: "G30BJ05", Mapping: westmodel.FLXGC9D1FieldMapping, Wrap: "data", Service: "west"},
{SourceId: "FLXG162A", ServiceId: "G32BJ05", Mapping: westmodel.FLXG162AFieldMapping, Wrap: "data", Service: "west"},
{SourceId: "FLXG54F5", ServiceId: "G03HZ01", Mapping: westmodel.FLXG54F5FieldMapping, Wrap: "data", Service: "west"},
{SourceId: "IVYZ5733", ServiceId: "G09XM02", Mapping: westmodel.IVYZ5733FieldMapping, Wrap: "data", Service: "west"},
{SourceId: "IVYZ9A2B", ServiceId: "G11BJ06", Mapping: westmodel.IVYZ9A2BFieldMapping, Wrap: "data", Service: "west"},
{SourceId: "QYGLB4C0", ServiceId: "G05HZ01", Mapping: westmodel.QYGLB4C0FieldMapping, Wrap: "", Service: "west"},
{SourceId: "FLXG8UI0", ServiceId: "RIS031", Mapping: westmodel.FLXG8UI0FieldMapping, Wrap: "data", Service: "yushan"},
}
// 为每个请求构建对应的请求参数
for i := range apiRequests {
apiRequests[i].Request = common.MapStructToAPIRequest(encryptedFields, apiRequests[i].Mapping, apiRequests[i].Wrap)
}
// 创建响应通道
responseChan := make(chan APIResponse, len(apiRequests))
var wg sync.WaitGroup
// 并发处理请求
for _, apiReq := range apiRequests {
wg.Add(1)
go func(req APIRequest) {
defer wg.Done()
success := true
var westResp string
var callAPIErr *errs.AppError
// 根据服务类型选择不同的调用方式
switch req.Service {
case "west":
respData, err := l.svcCtx.WestDexService.CallAPI(req.SourceId, req.Request, l.svcCtx.Config.WestConfig.SecretId)
if err != nil {
callAPIErr = err
} else {
westResp = string(respData)
}
case "yushan":
respData, err := l.svcCtx.YushanService.Request(req.SourceId, req.Request)
if err != nil {
if appErr, ok := err.(*errs.AppError); ok {
callAPIErr = appErr
} else {
callAPIErr = errs.ErrSystem
}
} else {
westResp = string(respData)
}
default:
success = false
logx.Errorf("未知的服务类型:%s", req.Service)
}
if callAPIErr != nil {
success = false
}
responseChan <- APIResponse{
SourceId: req.ServiceId,
Resp: []byte(westResp),
Success: success,
}
}(apiReq)
}
// 等待所有请求完成
go func() {
wg.Wait()
close(responseChan)
}()
// 处理响应
var responses []APIResponse
for resp := range responseChan {
responses = append(responses, resp)
}
responseData := ResponseData{
Responses: make([]struct {
ServiceId string `json:"api_code"`
Data json.RawMessage `json:"data"`
Success bool `json:"success"`
}, len(responses)),
}
for i, resp := range responses {
responseData.Responses[i] = struct {
ServiceId string `json:"api_code"`
Data json.RawMessage `json:"data"`
Success bool `json:"success"`
}{
ServiceId: resp.SourceId,
Data: resp.Resp,
Success: resp.Success,
}
}
// 将响应数据转换为JSON
jsonData, marshalErr := json.Marshal(responseData)
if marshalErr != nil {
logx.Errorf("JSON编码错误%v", marshalErr)
return "", errs.ErrSystem
}
// 加密JSON数据
encryptData, aesEncrypt := crypto.AesEncrypt(jsonData, key)
if aesEncrypt != nil {
return "", errs.ErrSystem
}
return string(encryptData), nil
}