1.0
This commit is contained in:
@@ -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("自动取消未付款订单任务执行完成")
|
||||
}
|
||||
Reference in New Issue
Block a user