修复重构后逻辑问题

This commit is contained in:
2025-11-21 12:59:05 +08:00
parent a245229bc2
commit 61ca0587c6
12 changed files with 60 additions and 157 deletions

View File

@@ -12,13 +12,14 @@ import (
"platform/web/core"
coupon2 "platform/web/domains/coupon"
trade2 "platform/web/domains/trade"
"platform/web/events"
e "platform/web/events"
g "platform/web/globals"
"platform/web/globals/orm"
m "platform/web/models"
q "platform/web/queries"
"time"
"github.com/hibiken/asynq"
"github.com/shopspring/decimal"
wecahtpaycore "github.com/wechatpay-apiv3/wechatpay-go/core"
@@ -32,6 +33,7 @@ var Trade = &tradeService{}
type tradeService struct {
}
// 创建交易
func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeData) (*CreateTradeResult, error) {
platform := data.Platform
method := data.Method
@@ -42,7 +44,7 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa
// 实际支付金额,只在创建真实订单时使用
var amountReal = data.Product.GetAmount()
if env.RunMode == "debug" {
if env.RunMode == env.RunModeDev {
amountReal = decimal.NewFromFloat(0.01)
}
@@ -240,10 +242,11 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa
}
// 提交异步关闭事件
_, err = g.Asynq.Enqueue(events.NewCancelTrade(events.CancelTradeData{
closeAt := now.Add(time.Duration(env.TradeExpire) * time.Second)
_, err = g.Asynq.Enqueue(e.NewCancelTrade(e.CancelTradeData{
TradeNo: tradeNo,
Method: method,
}))
}), asynq.ProcessAt(closeAt))
if err != nil {
return nil, core.NewServErr("提交异步关闭事件失败", err)
}
@@ -254,17 +257,30 @@ func (s *tradeService) CreateTrade(uid int32, now time.Time, data *CreateTradeDa
}, nil
}
// 完成交易
func (s *tradeService) CompleteTrade(data *ModifyTradeData) error {
return g.Redsync.WithLock(tradeLockKey(data.TradeNo), func() error {
// 检查订单状态
result, err := s.ConfirmTradeCompleted(data)
result, err := s.CheckTrade(data)
if err != nil {
return core.NewServErr("确认交易状态失败", err)
return core.NewServErr("检查订单状态失败", err)
}
if result.Status != trade2.StatusSuccess {
switch result.Status {
case trade2.StatusPending:
return core.NewBizErr("订单未支付")
case trade2.StatusCanceled:
return core.NewBizErr("订单已过期")
}
}
// 更新交易状态
trade, err := completeTrade(&OnTradeCompletedData{data.TradeNo, *result})
trade, err := completeTrade(&OnTradeCompletedData{
data.TradeNo,
result.TransId,
result.Success,
})
if err != nil {
return core.NewServErr("处理交易失败", err)
}
@@ -329,9 +345,12 @@ func completeTrade(data *OnTradeCompletedData) (*m.Trade, error) {
trade.Payment = payment
trade.Acquirer = u.P(int32(acquirer))
trade.CompletedAt = u.P(orm.LocalDateTime(paidAt))
_, err = q.Trade.
Where(q.Trade.InnerNo.Eq(tradeNo)).
rs, err := q.Trade.
Where(q.Trade.InnerNo.Eq(tradeNo), q.Trade.Status.Eq(int32(trade2.StatusPending))).
Updates(trade)
if rs.RowsAffected == 0 {
return core.NewBizErr("交易状态已发生变化")
}
if err != nil {
return core.NewServErr("更新交易信息失败", err)
}
@@ -378,7 +397,11 @@ func afterTradeComplete(trade *m.Trade) error {
return nil
}
func (s *tradeService) CancelTrade(tradeNo string, method trade2.Method, now time.Time) error {
// 取消交易
func (s *tradeService) CancelTrade(data *ModifyTradeData, now time.Time) error {
tradeNo := data.TradeNo
method := data.Method
return g.Redsync.WithLock(tradeLockKey(tradeNo), func() error {
switch method {
@@ -477,13 +500,15 @@ func cancelTrade(tradeNo string, now time.Time) error {
})
}
func (s *tradeService) RefundTrade(tradeNo string, method trade2.Method) error {
// 交易退款
func (s *tradeService) RefundTrade(data *ModifyTradeData) error {
panic("todo")
}
func (s *tradeService) OnTradeRefunded(q *q.Query, tradeNo string, now time.Time) error {
panic("todo")
}
// 检查交易状态
func (s *tradeService) CheckTrade(data *ModifyTradeData) (*CheckTradeResult, error) {
var tradeNo = data.TradeNo
var method = data.Method
@@ -624,63 +649,6 @@ func (s *tradeService) CheckTrade(data *ModifyTradeData) (*CheckTradeResult, err
return result, nil
}
func (s *tradeService) ConfirmTradeCompleted(data *ModifyTradeData) (*TradeSuccessResult, error) {
rs, err := Trade.CheckTrade(&ModifyTradeData{
TradeNo: data.TradeNo,
Method: data.Method,
})
if err != nil {
return nil, err
}
switch rs.Status {
case trade2.StatusPending:
return nil, core.NewBizErr("订单未支付")
case trade2.StatusCanceled:
return nil, core.NewBizErr("订单已关闭")
case trade2.StatusSuccess:
}
return rs.Success, nil
}
func (s *tradeService) ConfirmTradeCanceled(data *ModifyTradeData) error {
rs, err := Trade.CheckTrade(&ModifyTradeData{
TradeNo: data.TradeNo,
Method: data.Method,
})
if err != nil {
return err
}
switch rs.Status {
case trade2.StatusPending:
return core.NewBizErr("订单未支付")
case trade2.StatusSuccess:
return core.NewBizErr("订单已关闭")
case trade2.StatusCanceled:
}
return nil
}
func (s *tradeService) ConfirmTradeRefunded(data *ModifyTradeData) error {
rs, err := Trade.CheckTrade(&ModifyTradeData{
TradeNo: data.TradeNo,
Method: data.Method,
})
if err != nil {
return err
}
switch rs.Status {
case trade2.StatusPending:
return core.NewBizErr("订单未支付")
case trade2.StatusCanceled:
return core.NewBizErr("订单已关闭")
case trade2.StatusSuccess:
}
return core.NewBizErr("订单状态异常")
}
func tradeProductKey(no string) string {
return fmt.Sprintf("trade:%s:product", no)
@@ -714,7 +682,6 @@ type CheckTradeResult struct {
}
type TradeSuccessResult struct {
TransId string
Acquirer trade2.Acquirer
Payment decimal.Decimal
Time time.Time
@@ -722,7 +689,8 @@ type TradeSuccessResult struct {
type OnTradeCompletedData struct {
TradeNo string
TradeSuccessResult
TransId string
*TradeSuccessResult
}
type TradeErr string