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