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("自动取消未付款订单任务执行完成")
}
+54
View File
@@ -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("用户过期检查任务执行完成")
}
+46
View File
@@ -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
}
}