first commit

This commit is contained in:
何昌清
2026-03-26 22:13:03 +08:00
parent bbe1faa363
commit a2685f7f1e
51 changed files with 11244 additions and 0 deletions

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