package autotask
import (
c "ciyon/zciyon"
"fmt"
"net/http"
"time"
)
func _runtaskfunc(systemrow map[string]any, runfunc string) string {
symbol := funcindex()
defer func() {
if err := recover(); err != nil {
c.Log.Error("AUTO", fmt.Sprintf("函数执行出错:%v", err))
}
}()
if _, ok := symbol[runfunc]; !ok {
return "缺少函数:" + runfunc
}
return symbol[runfunc](systemrow)
}
func Main() bool {
for {
csql := c.NewCiySQL("zc_autotask")
csql.Where("autotaskstatus<", 90)
csql.Where("nexttimes<=", c.Tostamp())
systemrow, err := c.CiyDB.Getone(csql)
if err != nil {
return _returnerr(err)
}
if systemrow == nil {
break
}
_run(systemrow, "zc_auto")
}
return true
}
func Task_main(w http.ResponseWriter, r *http.Request) bool {
post := c.NewCiyPost(w, r)
// rsuser, err := admin.Verifyuser(r, c.CiyDB, post)
// if err != nil {
// w.Write([]byte("您未登录"))
// return false
// }
// if admin.Nopower(c.CiyDB, c.Toint(rsuser["id"]), "p602r") {
// w.Write([]byte("您未被授权操作"))
// return false
// }
runid := post.Getint("runid")
csql := c.NewCiySQL("zc_autotask")
csql.Where("id", runid)
taskrow, err := c.CiyDB.Getone(csql)
if taskrow == nil {
w.Write([]byte("任务ID不存在:" + c.Tostr(runid)))
return false
}
autotaskstatus := c.Toint(taskrow["autotaskstatus"])
if autotaskstatus == 30 {
return c.ErrJSON(w, "任务正在执行中", err)
}
runtaskid, err2 := _run(taskrow, "zc_auto")
if err2 != nil {
return c.ErrJSON(w, "任务执行失败:"+c.Tostr(runid), err2)
}
csql = c.NewCiySQL("zc_autotsk_run")
csql.Where("id", runtaskid)
tskrunrow, _ := c.CiyDB.Getone(csql)
csql = c.NewCiySQL("zc_autotsk_log")
csql.Where("runtaskid", runtaskid)
tsklogrows, _, _ := c.CiyDB.Get(csql)
html := ""
html += "
"
html += ""
html += "AutoTask Running"
html += ""
html += ""
html += "| 任务名称 | " + c.Tostr(taskrow["name"]) + " |
"
html += "| 入口函数 | " + c.Tostr(taskrow["runfunc"]) + " |
"
html += "| 执行参数 | " + c.Tostr(taskrow["runparam"]) + " |
"
html += "| 执行时长 | " + c.Tostr(tskrunrow["runsec"]) + "s |
"
html += "| 任务简报 | " + c.Tostr(tskrunrow["msg"]) + " |
"
html += "
"
if len(tsklogrows) > 0 {
html += "
"
html += "| 时间 | 数据 |
"
for _, row := range tsklogrows {
html += "| " + c.Todate(c.Toint(row["addtimes"])) + " | " + c.Tostr(row["msg"]) + " |
"
}
html += "
"
} else {
html += "无日志记录"
}
html += ""
w.Write([]byte(html))
return true
}
func _run(systemrow map[string]any, table string) (int, error) {
runfunc := c.Tostr(systemrow["runfunc"])
if runfunc == "" || runfunc[0] == '_' {
return 0, fmt.Errorf("入口函数设置错误:%s", runfunc)
}
sysid := c.Toint(systemrow["id"])
nexttimes := c.Toint(systemrow["nexttimes"])
runtimes := c.Toint(systemrow["runtimes"])
runcycle := c.Toint(systemrow["runcycle"])
autotaskstatus := c.Toint(systemrow["autotaskstatus"])
for {
if nexttimes > c.Tostamp() {
break
}
if runcycle < 0 {
t := time.Unix(int64(nexttimes), 0)
t = t.AddDate(0, -runcycle, 0)
nexttimes = int(t.Unix())
} else {
nexttimes += runcycle
}
}
updata := make(map[string]any)
runningmsg := "任务执行中,本次跳过"
if autotaskstatus == 30 {
if runtimes < c.Tostamp()-3600 {
updata["autotaskstatus"] = 20
runningmsg = "任务执行中,超过1小时,强制复位"
}
} else {
updata["autotaskstatus"] = 30
updata["runtimes"] = c.Tostamp()
}
updata["nexttimes"] = nexttimes
csql := c.NewCiySQL(table + "task")
csql.Where("id", sysid)
_, err := c.CiyDB.Update(csql, updata)
if err != nil {
return 0, err
}
if autotaskstatus == 30 {
updata = make(map[string]any)
updata["autotaskid"] = sysid
updata["addtimes"] = c.Tostamp()
updata["runsec"] = -1
updata["logcnt"] = 0
updata["msg"] = runningmsg
csql = c.NewCiySQL(table + "tsk_run")
_, err = c.CiyDB.Insert(csql, updata)
if err != nil {
return 0, err
}
return 0, nil
}
runlogstart := c.Tostamp()
updata = make(map[string]any)
updata["autotaskid"] = sysid
updata["addtimes"] = runlogstart
csql = c.NewCiySQL(table + "tsk_run")
runtaskid, err2 := c.CiyDB.Insert(csql, updata)
if err2 != nil {
return 0, err2
}
systemrow["runtaskid"] = runtaskid
systemrow["table"] = table
errmsg := _runtaskfunc(systemrow, runfunc)
updata = make(map[string]any)
updata["autotaskstatus"] = 20
updata["runtimes"] = 0
csql = c.NewCiySQL(table + "task")
csql.Where("id", sysid)
_, err2 = c.CiyDB.Update(csql, updata)
if err2 != nil {
return 0, err2
}
csql = c.NewCiySQL(table + "tsk_log")
csql.Where("runtaskid", runtaskid)
logcnt := c.Toint(c.CiyDB.Get1(csql))
updata = make(map[string]any)
updata["runsec"] = c.Tostamp() - runlogstart
updata["msg"] = errmsg
updata["logcnt"] = logcnt
csql = c.NewCiySQL(table + "tsk_run")
csql.Where("id", runtaskid)
_, err2 = c.CiyDB.Update(csql, updata)
if err2 != nil {
return 0, err2
}
return runtaskid, nil
}
func _returnerr(err error) bool {
c.Log.Error("AUTO", fmt.Sprintf("运行出错:%v", err))
return false
}
func _tasklog(systemrow map[string]any, msg string) {
updata := make(map[string]any)
updata["autotaskid"] = systemrow["id"]
updata["runtaskid"] = systemrow["runtaskid"]
updata["addtimes"] = c.Tostamp()
updata["msg"] = msg
csql := c.NewCiySQL(c.Tostr(systemrow["table"]) + "tsk_log")
_, err := c.CiyDB.Insert(csql, updata)
if err != nil {
_returnerr(err)
}
}