228 lines
5.5 KiB
Go
228 lines
5.5 KiB
Go
// 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
|
||
}
|