first commit
This commit is contained in:
227
repositories/cron_repository.go
Normal file
227
repositories/cron_repository.go
Normal file
@@ -0,0 +1,227 @@
|
||||
// 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
|
||||
}
|
||||
Reference in New Issue
Block a user