- 在订单查询接口增加调用OpenAI聊天模型生成中文总结的功能 - 修改OrderQueryRes结构体,新增Summary字段用于返回总结信息 - 添加queryAppleResult方法,通过OpenAI接口生成订单记录总结文本 - 在查询订单接口聚合苹果充值和兑换记录后,调用该方法获取总结 - 修改推送兑换逻辑优化充值成功余额显示,简化错误失败注释 - 调整订单状态修改时的备注信息,增强日志一致性和清晰度 - 更新go.mod引入OpenAI官方Go SDK及相关依赖 - 新增单元测试验证OpenAI接口调用正确性 - 添加AppleOrderOperation的String方法及对应测试实现,提高代码整洁度
184 lines
5.5 KiB
Go
184 lines
5.5 KiB
Go
package merchant
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"fmt"
|
||
"github.com/openai/openai-go/v3"
|
||
"github.com/openai/openai-go/v3/option"
|
||
"kami/internal/consts"
|
||
"kami/internal/model/entity"
|
||
"kami/internal/service"
|
||
"kami/utility/utils"
|
||
|
||
"github.com/duke-git/lancet/v2/mathutil"
|
||
"github.com/duke-git/lancet/v2/pointer"
|
||
"github.com/duke-git/lancet/v2/slice"
|
||
|
||
"kami/api/merchant/v1"
|
||
)
|
||
|
||
func (c *ControllerV1) OrderQuery(ctx context.Context, req *v1.OrderQueryReq) (res *v1.OrderQueryRes, err error) {
|
||
res = &v1.OrderQueryRes{}
|
||
record := make([]*v1.OrderQueryRecord, 0)
|
||
|
||
orderInfo, err := service.OrderSummary().GetOneById(ctx, req.MerchantOrderNo)
|
||
err = utils.HandleNoRowsError(err)
|
||
if err != nil || pointer.IsNil(orderInfo) || orderInfo.Id == 0 {
|
||
res.List = record
|
||
res.Total = len(record)
|
||
return
|
||
}
|
||
|
||
res.BankOrderId = orderInfo.BankOrderId
|
||
res.CreateTime = orderInfo.CreateTime
|
||
res.Amount = mathutil.TruncRound(orderInfo.OrderAmount.InexactFloat64(), 2)
|
||
|
||
// 添加订单信息
|
||
if orderInfo.PayTime != nil {
|
||
record = append(record, &v1.OrderQueryRecord{
|
||
CreatedAt: orderInfo.CreateTime,
|
||
Operation: "拉取订单",
|
||
})
|
||
record = append(record, &v1.OrderQueryRecord{
|
||
CreatedAt: orderInfo.PayTime,
|
||
Operation: "用户提交卡密",
|
||
})
|
||
} else {
|
||
record = append(record, &v1.OrderQueryRecord{
|
||
CreatedAt: orderInfo.CreateTime,
|
||
Operation: "拉取订单,未上传卡密",
|
||
})
|
||
}
|
||
if orderInfo.IsBlock == 1 {
|
||
record = append(record, &v1.OrderQueryRecord{
|
||
CreatedAt: orderInfo.UpdateTime,
|
||
Operation: "订单被禁用",
|
||
})
|
||
}
|
||
appleRecord := queryAppleCard(ctx, req.MerchantOrderNo)
|
||
record = append(record, appleRecord...)
|
||
redeemRecord := queryRedeemCard(ctx, req.MerchantOrderNo)
|
||
record = append(record, redeemRecord...)
|
||
msg, err := queryAppleResult(ctx, record)
|
||
if err != nil {
|
||
msg = "总结失败,请稍候重试"
|
||
}
|
||
res.Summary.Msg = msg
|
||
res.Total = len(record)
|
||
res.List = record
|
||
return
|
||
}
|
||
|
||
func queryAppleResult(ctx context.Context, record []*v1.OrderQueryRecord) (string, error) {
|
||
recordStr, _ := json.Marshal(record)
|
||
client := openai.NewClient(
|
||
option.WithAPIKey("sk-jYRlGtXAJ3Q82TS_FxWLFX6wn_VubNnyCtfxYZYP32ccqfQaGwQJHMq5I7k"),
|
||
option.WithBaseURL("https://hk.uniapi.io/v1"),
|
||
)
|
||
chatCompletion, err := client.Chat.Completions.New(context.TODO(), openai.ChatCompletionNewParams{
|
||
Messages: []openai.ChatCompletionMessageParamUnion{
|
||
openai.UserMessage(fmt.Sprintf("%s\n生成总结,用中文回复", string(recordStr))),
|
||
},
|
||
Model: "qwen3-8b",
|
||
})
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
return chatCompletion.Choices[0].Message.Content, nil
|
||
}
|
||
|
||
func queryAppleCard(ctx context.Context, merchantOrderNo string) (record []*v1.OrderQueryRecord) {
|
||
record = make([]*v1.OrderQueryRecord, 0)
|
||
|
||
redeemOrderInfo, err := service.AppleOrder().GetOneByMerchantId(ctx, merchantOrderNo)
|
||
err = utils.HandleNoRowsError(err)
|
||
if pointer.IsNil(redeemOrderInfo) || redeemOrderInfo.Id == 0 {
|
||
return
|
||
}
|
||
|
||
_, list, err2 := service.AppleOrder().GetRechargeDetails(ctx, redeemOrderInfo.OrderNo)
|
||
err2 = utils.HandleNoRowsError(err2)
|
||
if err2 != nil {
|
||
return
|
||
}
|
||
|
||
slice.SortBy(list, func(a, b entity.V1CardAppleHistoryInfo) bool {
|
||
return b.Id > a.Id
|
||
})
|
||
|
||
//查询对应充值账户
|
||
record = append(record, slice.Map(list, func(index int, item entity.V1CardAppleHistoryInfo) *v1.OrderQueryRecord {
|
||
return &v1.OrderQueryRecord{
|
||
AccountName: item.AccountName,
|
||
CreatedAt: item.CreatedAt,
|
||
Operation: item.Operation,
|
||
OrderNo: item.OrderNo,
|
||
Remark: item.Remark,
|
||
}
|
||
})...)
|
||
|
||
if len(record) == 1 {
|
||
//查询所有可用账号
|
||
accountList, _ := service.AppleAccount().GetAllNormal(ctx)
|
||
paymentList, _ := service.SysUserPayment().GetAllByMinAmount(ctx, redeemOrderInfo.CardAmount, nil)
|
||
if len(accountList) == 0 && len(paymentList) == 0 {
|
||
record = append(record, &v1.OrderQueryRecord{
|
||
OrderNo: redeemOrderInfo.OrderNo,
|
||
Operation: "没有可用账户",
|
||
Remark: "",
|
||
CreatedAt: redeemOrderInfo.CreatedAt,
|
||
})
|
||
}
|
||
}
|
||
return record
|
||
}
|
||
|
||
func queryRedeemCard(ctx context.Context, merchantOrderNo string) (record []*v1.OrderQueryRecord) {
|
||
|
||
record = make([]*v1.OrderQueryRecord, 0)
|
||
|
||
redeemOrderInfo, err := service.CardRedeemOrder().GetOneByMerchantId(ctx, merchantOrderNo, nil)
|
||
|
||
err = utils.HandleNoRowsError(err)
|
||
if pointer.IsNil(redeemOrderInfo) || redeemOrderInfo.OrderNo == "" {
|
||
return
|
||
}
|
||
|
||
_, list, err2 := service.CardRedeemOrder().GetOrderDetail(ctx, redeemOrderInfo.OrderNo)
|
||
err2 = utils.HandleNoRowsError(err2)
|
||
if err2 != nil {
|
||
return
|
||
}
|
||
|
||
slice.SortBy(list, func(a, b *entity.V1CardRedeemOrderHistory) bool {
|
||
return b.Id > a.Id
|
||
})
|
||
|
||
record = append(record, slice.Map(list, func(index int, item *entity.V1CardRedeemOrderHistory) *v1.OrderQueryRecord {
|
||
status := consts.RedeemOrderOperationStatus(item.OperationStatus)
|
||
return &v1.OrderQueryRecord{
|
||
CreatedAt: item.CreatedAt,
|
||
Operation: status.String(),
|
||
OrderNo: item.OrderNo,
|
||
Remark: item.Remark,
|
||
}
|
||
})...)
|
||
|
||
if len(record) == 1 {
|
||
//查询所有可用账号
|
||
accountList, _ := service.CardRedeemAccount().GetAllAvailableAccount(ctx, consts.CardRedeemAccountCategory(redeemOrderInfo.Category), redeemOrderInfo.OrderAmount, nil)
|
||
paymentList, _ := service.SysUserPayment().GetAllByMinAmount(ctx, redeemOrderInfo.OrderAmount, nil)
|
||
if len(accountList) == 0 && len(paymentList) == 0 {
|
||
record = append(record, &v1.OrderQueryRecord{
|
||
OrderNo: redeemOrderInfo.OrderNo,
|
||
Operation: "没有可用账户",
|
||
Remark: "",
|
||
CreatedAt: redeemOrderInfo.CreatedAt,
|
||
})
|
||
}
|
||
}
|
||
|
||
return
|
||
}
|