// 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 }