Files
ppgo_job/controllers/task.go
2017-06-23 13:14:42 +08:00

371 lines
8.9 KiB
Go
Raw 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.
/*
* @Author: haodaquan
* @Date: 2017-06-21 10:22:29
* @Last Modified by: haodaquan
* @Last Modified time: 2017-06-23 11:04:54
*/
package controllers
import (
crons "github.com/PPGo_Job/crons"
"github.com/PPGo_Job/jobs"
"github.com/PPGo_Job/libs"
"github.com/PPGo_Job/models"
"github.com/astaxie/beego"
"strconv"
"strings"
"time"
)
type TaskController struct {
BaseController
}
// 任务列表
func (this *TaskController) List() {
page, _ := this.GetInt("page")
if page < 1 {
page = 1
}
groupId, _ := this.GetInt("groupid")
filters := make([]interface{}, 0)
if groupId > 0 {
filters = append(filters, "group_id", groupId)
}
result, count := models.TaskGetList(page, this.pageSize, filters...)
list := make([]map[string]interface{}, len(result))
for k, v := range result {
row := make(map[string]interface{})
row["id"] = v.Id
row["name"] = v.TaskName
row["cron_spec"] = v.CronSpec
row["status"] = v.Status
row["description"] = v.Description
e := jobs.GetEntryById(v.Id)
if e != nil {
row["next_time"] = beego.Date(e.Next, "Y-m-d H:i:s")
row["prev_time"] = "-"
if e.Prev.Unix() > 0 {
row["prev_time"] = beego.Date(e.Prev, "Y-m-d H:i:s")
} else if v.PrevTime > 0 {
row["prev_time"] = beego.Date(time.Unix(v.PrevTime, 0), "Y-m-d H:i:s")
}
row["running"] = 1
} else {
row["next_time"] = "-"
if v.PrevTime > 0 {
row["prev_time"] = beego.Date(time.Unix(v.PrevTime, 0), "Y-m-d H:i:s")
} else {
row["prev_time"] = "-"
}
row["running"] = 0
}
list[k] = row
}
// 分组列表
groups, _ := models.TaskGroupGetList(1, 100)
this.Data["pageTitle"] = "任务列表"
this.Data["list"] = list
this.Data["groups"] = groups
this.Data["groupid"] = groupId
this.Data["pageBar"] = libs.NewPager(page, int(count), this.pageSize, beego.URLFor("TaskController.List", "groupid", groupId), true).ToString()
this.display()
}
// 添加任务
func (this *TaskController) Add() {
if this.isPost() {
task := new(models.Task)
task.UserId = this.userId
task.GroupId, _ = this.GetInt("group_id")
task.TaskName = strings.TrimSpace(this.GetString("task_name"))
task.Description = strings.TrimSpace(this.GetString("description"))
task.Concurrent, _ = this.GetInt("concurrent")
task.CronSpec = strings.TrimSpace(this.GetString("cron_spec"))
task.Command = strings.TrimSpace(this.GetString("command"))
task.Notify, _ = this.GetInt("notify")
task.Timeout, _ = this.GetInt("timeout")
notifyEmail := strings.TrimSpace(this.GetString("notify_email"))
if notifyEmail != "" {
emailList := make([]string, 0)
tmp := strings.Split(notifyEmail, "\n")
for _, v := range tmp {
v = strings.TrimSpace(v)
if !libs.IsEmail([]byte(v)) {
this.ajaxMsg("无效的Email地址"+v, MSG_ERR)
} else {
emailList = append(emailList, v)
}
}
task.NotifyEmail = strings.Join(emailList, "\n")
}
if task.TaskName == "" || task.CronSpec == "" || task.Command == "" {
this.ajaxMsg("请填写完整信息", MSG_ERR)
}
if _, err := crons.Parse(task.CronSpec); err != nil {
this.ajaxMsg("cron表达式无效", MSG_ERR)
}
if _, err := models.TaskAdd(task); err != nil {
this.ajaxMsg(err.Error(), MSG_ERR)
}
this.ajaxMsg("", MSG_OK)
}
// 分组列表
groups, _ := models.TaskGroupGetList(1, 100)
this.Data["groups"] = groups
this.Data["pageTitle"] = "添加任务"
this.display()
}
// 编辑任务
func (this *TaskController) Edit() {
id, _ := this.GetInt("id")
task, err := models.TaskGetById(id)
if err != nil {
this.showMsg(err.Error())
}
if this.isPost() {
task.TaskName = strings.TrimSpace(this.GetString("task_name"))
task.Description = strings.TrimSpace(this.GetString("description"))
task.GroupId, _ = this.GetInt("group_id")
task.Concurrent, _ = this.GetInt("concurrent")
task.CronSpec = strings.TrimSpace(this.GetString("cron_spec"))
task.Command = strings.TrimSpace(this.GetString("command"))
task.Notify, _ = this.GetInt("notify")
task.Timeout, _ = this.GetInt("timeout")
notifyEmail := strings.TrimSpace(this.GetString("notify_email"))
if notifyEmail != "" {
tmp := strings.Split(notifyEmail, "\n")
emailList := make([]string, 0, len(tmp))
for _, v := range tmp {
v = strings.TrimSpace(v)
if !libs.IsEmail([]byte(v)) {
this.ajaxMsg("无效的Email地址"+v, MSG_ERR)
} else {
emailList = append(emailList, v)
}
}
task.NotifyEmail = strings.Join(emailList, "\n")
}
if task.TaskName == "" || task.CronSpec == "" || task.Command == "" {
this.ajaxMsg("请填写完整信息", MSG_ERR)
}
if _, err := crons.Parse(task.CronSpec); err != nil {
this.ajaxMsg("cron表达式无效", MSG_ERR)
}
if err := task.Update(); err != nil {
this.ajaxMsg(err.Error(), MSG_ERR)
}
this.ajaxMsg("", MSG_OK)
}
// 分组列表
groups, _ := models.TaskGroupGetList(1, 100)
this.Data["groups"] = groups
this.Data["task"] = task
this.Data["pageTitle"] = "编辑任务"
this.display()
}
// 任务执行日志列表
func (this *TaskController) Logs() {
taskId, _ := this.GetInt("id")
page, _ := this.GetInt("page")
if page < 1 {
page = 1
}
task, err := models.TaskGetById(taskId)
if err != nil {
this.showMsg(err.Error())
}
result, count := models.TaskLogGetList(page, this.pageSize, "task_id", task.Id)
list := make([]map[string]interface{}, len(result))
for k, v := range result {
row := make(map[string]interface{})
row["id"] = v.Id
row["start_time"] = beego.Date(time.Unix(v.CreateTime, 0), "Y-m-d H:i:s")
row["process_time"] = float64(v.ProcessTime) / 1000
row["ouput_size"] = libs.SizeFormat(float64(len(v.Output)))
row["status"] = v.Status
list[k] = row
}
this.Data["pageTitle"] = "任务执行日志"
this.Data["list"] = list
this.Data["task"] = task
this.Data["pageBar"] = libs.NewPager(page, int(count), this.pageSize, beego.URLFor("TaskController.Logs", "id", taskId), true).ToString()
this.display()
}
// 查看日志详情
func (this *TaskController) ViewLog() {
id, _ := this.GetInt("id")
taskLog, err := models.TaskLogGetById(id)
if err != nil {
this.showMsg(err.Error())
}
task, err := models.TaskGetById(taskLog.TaskId)
if err != nil {
this.showMsg(err.Error())
}
data := make(map[string]interface{})
data["id"] = taskLog.Id
data["output"] = taskLog.Output
data["error"] = taskLog.Error
data["start_time"] = beego.Date(time.Unix(taskLog.CreateTime, 0), "Y-m-d H:i:s")
data["process_time"] = float64(taskLog.ProcessTime) / 1000
data["ouput_size"] = libs.SizeFormat(float64(len(taskLog.Output)))
data["status"] = taskLog.Status
this.Data["task"] = task
this.Data["data"] = data
this.Data["pageTitle"] = "查看日志"
this.display()
}
// 批量操作日志
func (this *TaskController) LogBatch() {
action := this.GetString("action")
ids := this.GetStrings("ids")
if len(ids) < 1 {
this.ajaxMsg("请选择要操作的项目", MSG_ERR)
}
for _, v := range ids {
id, _ := strconv.Atoi(v)
if id < 1 {
continue
}
switch action {
case "delete":
models.TaskLogDelById(id)
}
}
this.ajaxMsg("", MSG_OK)
}
// 批量操作
func (this *TaskController) Batch() {
action := this.GetString("action")
ids := this.GetStrings("ids")
if len(ids) < 1 {
this.ajaxMsg("请选择要操作的项目", MSG_ERR)
}
for _, v := range ids {
id, _ := strconv.Atoi(v)
if id < 1 {
continue
}
switch action {
case "active":
if task, err := models.TaskGetById(id); err == nil {
job, err := jobs.NewJobFromTask(task)
if err == nil {
jobs.AddJob(task.CronSpec, job)
task.Status = 1
task.Update()
}
}
case "pause":
jobs.RemoveJob(id)
if task, err := models.TaskGetById(id); err == nil {
task.Status = 0
task.Update()
}
case "delete":
models.TaskDel(id)
models.TaskLogDelByTaskId(id)
jobs.RemoveJob(id)
}
}
this.ajaxMsg("", MSG_OK)
}
// 启动任务
func (this *TaskController) Start() {
id, _ := this.GetInt("id")
task, err := models.TaskGetById(id)
if err != nil {
this.showMsg(err.Error())
}
job, err := jobs.NewJobFromTask(task)
if err != nil {
this.showMsg(err.Error())
}
if jobs.AddJob(task.CronSpec, job) {
task.Status = 1
task.Update()
}
refer := this.Ctx.Request.Referer()
if refer == "" {
refer = beego.URLFor("TaskController.List")
}
this.redirect(refer)
}
// 暂停任务
func (this *TaskController) Pause() {
id, _ := this.GetInt("id")
task, err := models.TaskGetById(id)
if err != nil {
this.showMsg(err.Error())
}
jobs.RemoveJob(id)
task.Status = 0
task.Update()
refer := this.Ctx.Request.Referer()
if refer == "" {
refer = beego.URLFor("TaskController.List")
}
this.redirect(refer)
}
// 立即执行
func (this *TaskController) Run() {
id, _ := this.GetInt("id")
task, err := models.TaskGetById(id)
if err != nil {
this.showMsg(err.Error())
}
job, err := jobs.NewJobFromTask(task)
if err != nil {
this.showMsg(err.Error())
}
job.Run()
this.redirect(beego.URLFor("TaskController.ViewLog", "id", job.GetLogId()))
}