feat: 订单自动过期-查看时检查并取消超时订单,收银台倒计时结束自动取消
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"math"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"sale/internal/models"
|
||||
"sale/internal/schemas"
|
||||
@@ -91,6 +92,41 @@ func NewOrderHandler() *OrderHandler {
|
||||
return &OrderHandler{}
|
||||
}
|
||||
|
||||
func checkOrderExpired(order *models.Order) {
|
||||
if order.Status != models.OrderStatusPendingPayment || order.PaymentExpiresAt == nil {
|
||||
return
|
||||
}
|
||||
if time.Now().After(*order.PaymentExpiresAt) {
|
||||
tx := utils.DB.Begin()
|
||||
tx.Model(order).Update("status", models.OrderStatusCancelled)
|
||||
for _, item := range order.OrderItems {
|
||||
var inventory models.Inventory
|
||||
if err := tx.Where("product_id = ?", item.ProductID).First(&inventory).Error; err == nil {
|
||||
tx.Model(&inventory).UpdateColumn("quantity", inventory.Quantity+item.Quantity)
|
||||
}
|
||||
var product models.Product
|
||||
if err := tx.First(&product, item.ProductID).Error; err == nil {
|
||||
if product.RequireCredit {
|
||||
tx.Model(&models.User{}).Where("id = ?", order.UserID).
|
||||
UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits + ?", product.CreditCost*item.Quantity))
|
||||
}
|
||||
if product.CreditReward > 0 {
|
||||
tx.Model(&models.User{}).Where("id = ?", order.UserID).
|
||||
UpdateColumn("purchase_credits", utils.DB.Raw("purchase_credits - ?", product.CreditReward*item.Quantity))
|
||||
}
|
||||
}
|
||||
}
|
||||
tx.Commit()
|
||||
order.Status = models.OrderStatusCancelled
|
||||
}
|
||||
}
|
||||
|
||||
func checkOrdersExpired(orders []models.Order) {
|
||||
for i := range orders {
|
||||
checkOrderExpired(&orders[i])
|
||||
}
|
||||
}
|
||||
|
||||
func (h *OrderHandler) List(c *gin.Context) {
|
||||
userID := c.GetUint("user_id")
|
||||
role, _ := c.Get("role")
|
||||
@@ -107,6 +143,8 @@ func (h *OrderHandler) List(c *gin.Context) {
|
||||
query.Preload("OrderItems.Product").Preload("ShippingAddress").
|
||||
Order("created_at DESC").Find(&orders)
|
||||
|
||||
checkOrdersExpired(orders)
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"data": orders})
|
||||
}
|
||||
|
||||
@@ -129,6 +167,8 @@ func (h *OrderHandler) GetByID(c *gin.Context) {
|
||||
return
|
||||
}
|
||||
|
||||
checkOrderExpired(&order)
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{"data": order})
|
||||
}
|
||||
|
||||
@@ -400,6 +440,8 @@ func (h *OrderHandler) AdminList(c *gin.Context) {
|
||||
utils.DB.Preload("OrderItems.Product").Preload("ShippingAddress").Preload("User").
|
||||
Order("created_at DESC").Offset(offset).Limit(pageSize).Find(&orders)
|
||||
|
||||
checkOrdersExpired(orders)
|
||||
|
||||
totalPages := int(math.Ceil(float64(total) / float64(pageSize)))
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"data": orders,
|
||||
|
||||
Reference in New Issue
Block a user