数据模型使用指针类型字段以避免空值自动更新的问题

This commit is contained in:
2025-05-26 10:57:39 +08:00
parent 1e7b5777a2
commit c08d625975
43 changed files with 457 additions and 397 deletions

View File

@@ -56,7 +56,7 @@ func (s *transactionService) PrepareTransaction(q *q.Query, uid int32, now time.
return nil, err
}
var expireAt = time.Time(coupon.ExpireAt)
var expireAt = time.Time(u.Z(coupon.ExpireAt))
if !expireAt.IsZero() && expireAt.Before(now) {
_, err = q.Coupon.
Where(q.Coupon.ID.Eq(coupon.ID)).
@@ -71,26 +71,26 @@ func (s *transactionService) PrepareTransaction(q *q.Query, uid int32, now time.
return nil, errors.New("订单金额未达到使用优惠券的条件")
}
switch {
// 该优惠券不属于当前用户
default:
return nil, errors.New("优惠券不属于当前用户")
// 公开优惠券
case coupon.UserID == 0:
amount = amount.Sub(coupon.Amount)
// 指定用户的优惠券
case coupon.UserID == uid:
amount = amount.Sub(coupon.Amount)
if time.Time(coupon.ExpireAt).IsZero() {
_, err = q.Coupon.
Where(q.Coupon.ID.Eq(coupon.ID)).
Update(q.Coupon.Status, int32(coupon2.StatusUsed))
if err != nil {
return nil, err
if coupon.UserID != nil {
switch *coupon.UserID {
// 指定用户的优惠券
case uid:
amount = amount.Sub(coupon.Amount)
if expireAt.IsZero() {
_, err = q.Coupon.
Where(q.Coupon.ID.Eq(coupon.ID)).
Update(q.Coupon.Status, int32(coupon2.StatusUsed))
if err != nil {
return nil, err
}
}
// 该优惠券不属于当前用户
default:
return nil, errors.New("优惠券不属于当前用户")
}
} else {
// 公开优惠券
amount = amount.Sub(coupon.Amount)
}
}
@@ -161,7 +161,7 @@ func (s *transactionService) PrepareTransaction(q *q.Query, uid int32, now time.
Method: int32(method),
Type: int32(tType),
Amount: amount,
PayURL: payUrl,
PayURL: &payUrl,
}
err = q.Trade.Create(&trade)
if err != nil {
@@ -172,8 +172,8 @@ func (s *transactionService) PrepareTransaction(q *q.Query, uid int32, now time.
var bill = m.Bill{
BillNo: ID.GenReadable("bil"),
UserID: uid,
TradeID: trade.ID,
Info: subject,
TradeID: &trade.ID,
Info: &subject,
Type: int32(billType),
Amount: amount,
}
@@ -284,10 +284,10 @@ func (s *transactionService) CompleteTransaction(q *q.Query, data *TransactionCo
// 如果是未支付,则更新支付状态
case trade2.StatusPending:
trade.Status = int32(trade2.StatusSuccess)
trade.OuterNo = transId
trade.OuterNo = &transId
trade.Payment = payment
trade.PaidAt = orm.LocalDateTime(paidAt)
trade.PayURL = ""
trade.PaidAt = u.P(orm.LocalDateTime(paidAt))
trade.PayURL = u.P("")
_, err = q.Trade.Updates(trade)
if err != nil {
return nil, err
@@ -340,8 +340,8 @@ func (s *transactionService) FinishTransaction(q *q.Query, tradeNo string, now t
Select(q.Trade.Status, q.Trade.CancelAt, q.Trade.PayURL).
Updates(m.Trade{
Status: int32(trade2.StatusCanceled),
CancelAt: orm.LocalDateTime(now),
PayURL: "",
CancelAt: u.P(orm.LocalDateTime(now)),
PayURL: u.P(""),
})
if err != nil {
return err