Files
ppgo_job/controllers/task.go
郝大全 980f49b486 修改列表和登录
登录设置默认一天
列表页各行换色并点击换色
修改返回的一些bug
2017-07-18 16:56:22 +08:00

383 lines
9.3 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 (
"github.com/astaxie/beego"
crons "github.com/george518/PPGo_Job/crons"
"github.com/george518/PPGo_Job/jobs"
"github.com/george518/PPGo_Job/libs"
"github.com/george518/PPGo_Job/models"
"strconv"
"strings"
"time"
)
type TaskController struct {
BaseController
}
// 任务列表
func (this *TaskController) List() {
page, _ := this.GetInt("page")
if page < 1 {
page = 1
}
groupId, _ := this.GetInt("groupid")
if groupId>0 {
this.Ctx.SetCookie("groupid", strconv.Itoa(groupId)+"|job")
}else {
arr := strings.Split(this.Ctx.GetCookie("groupid"), "|")
groupId,_= strconv.Atoi(arr[0])
}
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))
// 分组列表
groups, _ := models.TaskGroupGetList(1, 100)
groups_map := make(map[int]string)
for _,gname := range groups {
groups_map[gname.Id] = gname.GroupName
}
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
row["group_id"] = v.GroupId
row["group_name"] = groups_map[v.GroupId]
row["is_odd"] = k%2
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
}
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()))
}