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("自动取消未付款订单任务执行完成")
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package tasks
|
||||
|
||||
import (
|
||||
"awesomeProject/internal/common"
|
||||
"awesomeProject/internal/models"
|
||||
"log"
|
||||
"time"
|
||||
)
|
||||
|
||||
// CheckUserExpiry 检查用户过期状态并禁用过期用户
|
||||
func CheckUserExpiry() {
|
||||
log.Println("开始执行用户过期检查任务...")
|
||||
|
||||
db := common.GetDB()
|
||||
now := time.Now()
|
||||
|
||||
// 查找所有已过期但仍然启用的用户
|
||||
var expiredUsers []models.User
|
||||
if err := db.Where("expiry_date IS NOT NULL AND expiry_date < ? AND status = ?", now, 1).Find(&expiredUsers).Error; err != nil {
|
||||
log.Printf("查询过期用户失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if len(expiredUsers) == 0 {
|
||||
log.Println("没有发现过期用户")
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("发现 %d 个过期用户需要禁用", len(expiredUsers))
|
||||
|
||||
// 批量禁用过期用户
|
||||
var userIDs []uint
|
||||
for _, user := range expiredUsers {
|
||||
userIDs = append(userIDs, user.ID)
|
||||
log.Printf("用户 ID: %d, 手机号: %s, 过期时间: %v",
|
||||
user.ID, user.Phone, user.ExpiryDate.Format("2006-01-02 15:04:05"))
|
||||
}
|
||||
|
||||
// 使用事务批量更新状态
|
||||
tx := db.Begin()
|
||||
if err := tx.Model(&models.User{}).Where("id IN ?", userIDs).Update("status", 0).Error; err != nil {
|
||||
tx.Rollback()
|
||||
log.Printf("批量禁用过期用户失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
if err := tx.Commit().Error; err != nil {
|
||||
log.Printf("提交事务失败: %v", err)
|
||||
return
|
||||
}
|
||||
|
||||
log.Printf("成功禁用 %d 个过期用户", len(userIDs))
|
||||
log.Println("用户过期检查任务执行完成")
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
package tasks
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/robfig/cron/v3"
|
||||
)
|
||||
|
||||
var CronTask *cron.Cron
|
||||
|
||||
// InitCronTasks 初始化所有定时任务
|
||||
func InitCronTasks() {
|
||||
log.Println("初始化定时任务...")
|
||||
CronTask = cron.New()
|
||||
|
||||
// 添加定时任务:每15分钟检查一次未付款订单
|
||||
_, err := CronTask.AddFunc("*/15 * * * *", AutoCancelUnpaidOrders)
|
||||
if err != nil {
|
||||
log.Printf("添加自动取消订单任务失败: %v", err)
|
||||
} else {
|
||||
log.Println("已添加自动取消订单任务,每15分钟执行一次")
|
||||
}
|
||||
go AutoCancelUnpaidOrders()
|
||||
|
||||
// 添加定时任务:每小时检查一次用户过期状态
|
||||
_, err = CronTask.AddFunc("0 * * * *", CheckUserExpiry)
|
||||
if err != nil {
|
||||
log.Printf("添加用户过期检查任务失败: %v", err)
|
||||
} else {
|
||||
log.Println("已添加用户过期检查任务,每小时执行一次")
|
||||
}
|
||||
// 立即执行一次用户过期检查
|
||||
go CheckUserExpiry()
|
||||
// 启动所有定时任务
|
||||
CronTask.Start()
|
||||
log.Println("所有定时任务已启动")
|
||||
}
|
||||
|
||||
// 添加单个定时任务(保留原有函数以兼容旧代码)
|
||||
func addTask(cronn string, work func()) {
|
||||
_, err := CronTask.AddFunc(cronn, work)
|
||||
if err != nil {
|
||||
log.Printf("添加定时任务失败: %v", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user