This commit is contained in:
solosw
2026-01-05 14:11:34 +08:00
parent 35ef825371
commit 99b11b04e4
658 changed files with 99266 additions and 0 deletions
+102
View File
@@ -0,0 +1,102 @@
package tasks
import (
"awesomeProject/internal/common"
"awesomeProject/internal/models"
"fmt"
"log"
"strconv"
"time"
"gorm.io/gorm"
)
// AutoCancelUnpaidOrders 自动取消超过30分钟未付款的订单
func AutoCancelUnpaidOrders() {
log.Println("开始执行自动取消未付款订单任务...")
db := common.GetDB()
var cancelOrders []models.PurchaseOrder
if err := db.Model(&models.PurchaseOrder{}).Where("order_status = ? and product_type=?", 3, 2).Find(&cancelOrders).Error; err != nil {
log.Printf("查询未付款订单失败: %v", err)
return
}
var Ids []uint
for _, order := range cancelOrders {
Ids = append(Ids, order.ID)
}
fmt.Println(cancelOrders)
db.Model(&models.SalesOrder{}).Where("purchase_order_id in ?", Ids).Update("order_status", 3)
var config models.SystemConfig
db.Where("config_key=?", "order_over_time").First(&config)
value, _ := strconv.Atoi(config.ConfigValue)
thirtyMinutesAgo := time.Now().Add(-time.Duration(value) * time.Minute)
// 查找所有超过30分钟未付款的订单
var unpaidOrders []models.PurchaseOrder
if err := db.Where("order_status = ? AND created_at < ?", 0, thirtyMinutesAgo).Find(&unpaidOrders).Error; err != nil {
log.Printf("查询未付款订单失败: %v", err)
return
}
log.Printf("找到 %d 个需要自动取消的未付款订单", len(unpaidOrders))
// 处理每个未付款订单
for _, order := range unpaidOrders {
// 开启事务
tx := db.Begin()
// 更新订单状态为已取消
if err := tx.Model(&order).Update("order_status", 3).Error; err != nil {
tx.Rollback()
log.Printf("取消订单 %d 失败: %v", order.ID, err)
continue
}
// 恢复商品库存
if order.ProductType == 1 { // 一级商品
if err := tx.Model(&models.PrimaryProduct{}).Where("id = ?", order.ProductID).
Update("stock_quantity", gorm.Expr("stock_quantity + ?", order.Quantity)).Error; err != nil {
tx.Rollback()
log.Printf("恢复一级商品 %d 库存失败: %v", order.ProductID, err)
continue
}
} else { // 二级商品
if err := tx.Model(&models.SecondaryProduct{}).Where("id = ?", order.ProductID).
Update("quantity", gorm.Expr("quantity + ?", order.Quantity)).Error; err != nil {
tx.Rollback()
log.Printf("恢复二级商品 %d 库存失败: %v", order.ProductID, err)
continue
}
// 如果是二级商品,还需要取消对应的卖家订单
var salesOrder models.SalesOrder
if err := tx.Where("purchase_order_id = ?", order.ID).First(&salesOrder).Error; err != nil {
if err != gorm.ErrRecordNotFound {
tx.Rollback()
log.Printf("查询订单 %d 对应的卖家订单失败: %v", order.ID, err)
continue
}
} else {
// 更新卖家订单状态为已取消
if err := tx.Model(&salesOrder).Update("order_status", 3).Error; err != nil {
tx.Rollback()
log.Printf("取消卖家订单 %d 失败: %v", salesOrder.ID, err)
continue
}
}
}
// 提交事务
if err := tx.Commit().Error; err != nil {
log.Printf("提交事务失败: %v", err)
continue
}
log.Printf("成功自动取消订单 ID: %d, 订单号: %s", order.ID, order.OrderNo)
}
log.Println("自动取消未付款订单任务执行完成")
}