优化交易创建流程,客户管理新增折扣与来源字段及功能

This commit is contained in:
2026-03-27 16:16:55 +08:00
parent 75ad12efb3
commit 7e8d824ba6
26 changed files with 523 additions and 140 deletions

View File

@@ -32,8 +32,12 @@ type tradeService struct {
}
// 创建交易
func (s *tradeService) Create(uid int32, tradeData *CreateTradeData, productData *CreateResourceData) (*CreateTradeResult, error) {
detail, err := productData.TradeDetail()
func (s *tradeService) Create(user *m.User, tradeData *CreateTradeData, productData *CreateResourceData) (*CreateTradeResult, error) {
if user == nil {
return nil, core.NewBizErr("用户未登录")
}
detail, err := productData.TradeDetail(user)
if err != nil {
return nil, core.NewServErr("获取产品支付信息失败", err)
}
@@ -178,7 +182,7 @@ func (s *tradeService) Create(uid int32, tradeData *CreateTradeData, productData
// 保存订单
err = q.Trade.Create(&m.Trade{
UserID: uid,
UserID: user.ID,
InnerNo: tradeNo,
Type: detail.Type,
Subject: detail.Subject,
@@ -208,7 +212,7 @@ func (s *tradeService) Create(uid int32, tradeData *CreateTradeData, productData
}
// 提交异步关闭事件
_, err = g.Asynq.Enqueue(e.NewCloseTradeTask(uid, tradeNo, method), asynq.ProcessAt(expireAt))
_, err = g.Asynq.Enqueue(e.NewCloseTradeTask(user.ID, tradeNo, method), asynq.ProcessAt(expireAt))
if err != nil {
return nil, core.NewServErr("提交异步关闭事件失败", err)
}
@@ -318,7 +322,7 @@ func (s *tradeService) OnCompleteTrade(user *m.User, interNo string, outerNo str
}
// 生成账单
err = Bill.CreateForResourceByTrade(q, user.ID, resource.ID, trade.ID, &detail)
err = Bill.CreateForResource(q, user.ID, resource.ID, &trade.ID, &detail)
if err != nil {
return core.NewServErr("生成账单失败", err)
}
@@ -602,16 +606,19 @@ type OnTradeCompletedData struct {
}
type ProductInfo interface {
TradeDetail() (*TradeDetail, error)
TradeDetail(user *m.User) (*TradeDetail, error)
}
type TradeDetail struct {
Type m.TradeType `json:"type"`
Subject string `json:"subject"`
Amount decimal.Decimal `json:"amount"`
Actual decimal.Decimal `json:"actual"`
CouponId *int32 `json:"coupon_id,omitempty"`
Product ProductInfo `json:"product"`
Product ProductInfo `json:"product"`
Type m.TradeType `json:"type"`
Subject string `json:"subject"`
Amount decimal.Decimal `json:"amount"`
Actual decimal.Decimal `json:"actual"`
DiscountId *int32 `json:"discount_id,omitempty"`
Discount *m.ProductDiscount `json:"-"` // 不应缓存
CouponId *int32 `json:"coupon_id,omitempty"`
Coupon *m.Coupon `json:"-"` // 不应缓存
}
type CompleteEvent interface {