Files
kami_backend/internal/controller/merchant/merchant_v1_order_query.go
danial 2d317037b0 feat(merchant): 集成OpenAI接口实现订单记录自动总结功能
- 在订单查询接口增加调用OpenAI聊天模型生成中文总结的功能
- 修改OrderQueryRes结构体,新增Summary字段用于返回总结信息
- 添加queryAppleResult方法,通过OpenAI接口生成订单记录总结文本
- 在查询订单接口聚合苹果充值和兑换记录后,调用该方法获取总结
- 修改推送兑换逻辑优化充值成功余额显示,简化错误失败注释
- 调整订单状态修改时的备注信息,增强日志一致性和清晰度
- 更新go.mod引入OpenAI官方Go SDK及相关依赖
- 新增单元测试验证OpenAI接口调用正确性
- 添加AppleOrderOperation的String方法及对应测试实现,提高代码整洁度
2025-11-28 21:30:01 +08:00

184 lines
5.5 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 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
}