103 lines
3.2 KiB
Go
103 lines
3.2 KiB
Go
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("自动取消未付款订单任务执行完成")
|
|
}
|