Files
Quincy_admin/repositories/cron_repository.go
2026-03-26 22:13:03 +08:00

228 lines
5.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Package repositories/pms_repository.go
package repositories
import (
"Quincy_admin/schemas"
"fmt"
"time"
"github.com/jmoiron/sqlx"
)
type CronRepository struct {
db *sqlx.DB
}
func NewCronRepository(db *sqlx.DB) *CronRepository {
return &CronRepository{db: db}
}
// GetCronList 获取定时任务列表
func (r *CronRepository) GetCronList(req *schemas.CronListRequest) ([]*schemas.CronJob, int64, error) {
offset := (req.PageIndex - 1) * req.PageSize
// 查询总数
countQuery := `
SELECT COUNT(*) FROM admin_cron_jobs WHERE isdel = 0 AND (name LIKE ? OR ? = '') AND (? IS NULL OR create_time >= ?) AND (? IS NULL OR create_time < ?)
`
var total int64
err := r.db.QueryRow(countQuery, "%"+req.Name+"%", req.Name, req.StartDate.Time, req.StartDate.Time, req.EndDate.Time, req.EndDate.Time).Scan(&total)
if err != nil {
return nil, 0, err
}
query := `
SELECT
tb1.id, tb1.name, tb1.schedule, tb1.handler, tb1.enabled, tb1.description, tb1.create_time, tb1.update_time
FROM
admin_cron_jobs tb1
WHERE
tb1.isdel = 0
AND (tb1.name LIKE ? OR ? = '')
AND (? IS NULL OR tb1.create_time >= ?)
AND (? IS NULL OR tb1.create_time < ?)
ORDER BY
id
LIMIT ? OFFSET ?
`
var items []*schemas.CronJob
err = r.db.Select(&items, query, "%"+req.Name+"%", req.Name, req.StartDate.Time, req.StartDate.Time, req.EndDate.Time, req.EndDate.Time, req.PageSize, offset)
if err != nil {
return nil, 0, err
}
return items, total, nil
}
// AddCron 添加定时任务
func (r *CronRepository) AddCron(req *schemas.CronJobUpdateRequest) (int64, error) {
query := `
INSERT INTO admin_cron_jobs (
name, schedule, handler, description, create_time, update_time
) VALUES (?, ?, ?, ?, ?, ?)
`
now := time.Now()
result, err := r.db.Exec(query, req.Name, req.Schedule, req.Handler, req.Description, now, now)
if err != nil {
return 0, err
}
// 获取插入的 ID
id, err := result.LastInsertId()
if err != nil {
return 0, fmt.Errorf("failed to get last insert id: %w", err)
}
return id, nil
}
// UpdateCron 更新定时任务
func (r *CronRepository) UpdateCron(req *schemas.CronJobUpdateRequest) error {
// 构建动态更新语句
setClause := ""
args := map[string]interface{}{
"id": req.ID,
}
// 只有当字段非空时才添加到更新语句中
if req.Name != "" {
setClause += "name=:name, "
args["name"] = req.Name
}
if req.Schedule != "" {
setClause += "schedule=:schedule, "
args["schedule"] = req.Schedule
}
if req.Handler != "" {
setClause += "handler=:handler, "
args["handler"] = req.Handler
}
if req.Description != "" {
setClause += "description=:description, "
args["description"] = req.Description
}
// 如果没有要更新的字段,直接返回
if setClause == "" {
return fmt.Errorf("没有要更新的字段")
}
// 构建完整查询语句确保SET子句格式正确
query := fmt.Sprintf("UPDATE admin_cron_jobs SET %s WHERE id=:id", setClause[:len(setClause)-2])
_, err := r.db.NamedExec(query, args)
if err != nil {
return fmt.Errorf("SQL执行错误: %w", err)
}
return nil
}
// UpdateCronStatus 启用/停用定时任务
func (r *CronRepository) UpdateCronStatus(id int, enable int) error {
query := `
UPDATE admin_cron_jobs SET enabled = ?, update_time = ? WHERE id = ?
`
result, err := r.db.Exec(query, enable, time.Now(), id)
if err != nil {
return err
}
// 检查是否有行被影响,如果没有说明任务不存在
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return fmt.Errorf("任务不存在")
}
return nil
}
// DeleteCron 删除定时任务
func (r *CronRepository) DeleteCron(id int) error {
query := `
UPDATE admin_cron_jobs SET isdel = 1, update_time = ? WHERE id = ?
`
result, err := r.db.Exec(query, time.Now(), id)
if err != nil {
return err
}
// 检查是否有行被影响,如果没有说明任务不存在
rowsAffected, err := result.RowsAffected()
if err != nil {
return err
}
if rowsAffected == 0 {
return fmt.Errorf("任务不存在")
}
return nil
}
// UpdateAllCronStatus 批量停用定时任务
func (r *CronRepository) UpdateAllCronStatus(enabled int) error {
query := `
UPDATE admin_cron_jobs SET enabled = ?, update_time = ? WHERE enabled != ? AND isdel = 0
`
_, err := r.db.Exec(query, enabled, time.Now(), enabled)
if err != nil {
return err
}
return nil
}
// GetCronLogList 获取定时任务日志列表
func (r *CronRepository) GetCronLogList(req *schemas.CronJobLogListRequest) ([]*schemas.CronJobLog, int64, error) {
offset := (req.PageIndex - 1) * req.PageSize
// 查询总数
countQuery := `
SELECT COUNT(*) FROM admin_cron_job_logs tb1
LEFT JOIN admin_cron_jobs tb2 ON tb1.job_id = tb2.id
WHERE tb1.job_id = ?
AND (? IS NULL OR DATE(tb1.start_time) = DATE(?))
`
var total int64
err := r.db.QueryRow(countQuery, req.Id, req.StartDate, req.StartDate).Scan(&total)
if err != nil {
return nil, 0, err
}
// 主查询
query := `
SELECT
tb1.id, tb2.name AS name, tb1.job_id, tb2.handler, tb2.schedule, tb1.status AS status, tb1.start_time
FROM
admin_cron_job_logs tb1
LEFT JOIN admin_cron_jobs tb2 ON tb1.job_id = tb2.id
WHERE tb1.job_id = ?
AND (? IS NULL OR DATE(tb1.start_time) = DATE(?))
ORDER BY id DESC
LIMIT ? OFFSET ?
`
var items []*schemas.CronJobLog
err = r.db.Select(&items, query, req.Id, req.StartDate, req.StartDate, req.PageSize, offset)
if err != nil {
return nil, 0, err
}
return items, total, nil
}