From 5a7904a831a69ac760a8e453ea2a54891a901c7c Mon Sep 17 00:00:00 2001 From: linxiaozhi Date: Fri, 15 Feb 2019 11:50:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=92=89=E9=92=89=E9=80=9A?= =?UTF-8?q?=E7=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 + conf/app.conf | 14 ++++--- controllers/admin.go | 4 ++ jobs/job.go | 27 ++++++++++++ libs/http.go | 20 +++++++++ models/admin.go | 1 + notify/dingtalk.go | 95 ++++++++++++++++++++++++++++++++++++++++++ ppgo_job2.sql | 8 ++++ views/admin/add.html | 8 ++++ views/admin/edit.html | 7 ++++ views/admin/list.html | 1 + views/task/add.html | 1 + views/task/copy.html | 1 + views/task/detail.html | 2 +- views/task/edit.html | 1 + 15 files changed, 186 insertions(+), 6 deletions(-) create mode 100644 notify/dingtalk.go diff --git a/.gitignore b/.gitignore index 20c57cb..922b664 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,5 @@ PPGo_Job .idea + +info.log \ No newline at end of file diff --git a/conf/app.conf b/conf/app.conf index df523f1..c049d03 100644 --- a/conf/app.conf +++ b/conf/app.conf @@ -10,16 +10,16 @@ jobs.pool = 1000 # 站点名称 site.name = 定时任务管理器 -#通知方式 0=邮件,1=信息 +#通知方式 0=邮件,1=信息,2=钉钉 notify.type = 0 # 数据库配置 -db.host = db -db.user = gotest -db.password = "gotest" +db.host = 127.0.0.1 +db.user = root +db.password = "12345678" db.port = 3306 -db.name = local_gotest +db.name = ppgo_job2 db.prefix = pp_ db.timezone = Asia/Shanghai @@ -36,3 +36,7 @@ email.pool = 10 msg.url = http://xx.com/api/tools/send_sms msg.pool = 10 + +# 钉钉通知配置 +dingtalk.url = "https://oapi.dingtalk.com/robot/send?access_token=%s" +dingtalk.pool = 10 diff --git a/controllers/admin.go b/controllers/admin.go index 79a3981..968ccf7 100644 --- a/controllers/admin.go +++ b/controllers/admin.go @@ -58,6 +58,7 @@ func (self *AdminController) Edit() { row["real_name"] = Admin.RealName row["phone"] = Admin.Phone row["email"] = Admin.Email + row["dingtalk"] = Admin.Dingtalk row["role_ids"] = Admin.RoleIds self.Data["admin"] = row @@ -93,6 +94,7 @@ func (self *AdminController) AjaxSave() { Admin.RealName = strings.TrimSpace(self.GetString("real_name")) Admin.Phone = strings.TrimSpace(self.GetString("phone")) Admin.Email = strings.TrimSpace(self.GetString("email")) + Admin.Dingtalk = strings.TrimSpace(self.GetString("dingtalk")) Admin.RoleIds = strings.TrimSpace(self.GetString("roleids")) Admin.UpdateTime = time.Now().Unix() Admin.UpdateId = self.userId @@ -125,6 +127,7 @@ func (self *AdminController) AjaxSave() { Admin.RealName = strings.TrimSpace(self.GetString("real_name")) Admin.Phone = strings.TrimSpace(self.GetString("phone")) Admin.Email = strings.TrimSpace(self.GetString("email")) + Admin.Dingtalk = strings.TrimSpace(self.GetString("dingtalk")) Admin.RoleIds = strings.TrimSpace(self.GetString("roleids")) Admin.UpdateTime = time.Now().Unix() Admin.UpdateId = self.userId @@ -203,6 +206,7 @@ func (self *AdminController) Table() { row["real_name"] = v.RealName row["phone"] = v.Phone row["email"] = v.Email + row["dingtalk"] = v.Dingtalk row["role_ids"] = v.RoleIds row["create_time"] = beego.Date(time.Unix(v.CreateTime, 0), "Y-m-d H:i:s") row["update_time"] = beego.Date(time.Unix(v.UpdateTime, 0), "Y-m-d H:i:s") diff --git a/jobs/job.go b/jobs/job.go index 4ab6665..0fc2ec1 100644 --- a/jobs/job.go +++ b/jobs/job.go @@ -279,6 +279,7 @@ func (j *Job) Run() { adminInfo := AllAdminInfo(j.task.NotifyUserIds) phone := make([]string, 0) toEmail := "" + dingtalk := make([]string, 0) for _, v := range adminInfo { if v.Phone != "0" && v.Phone != "" { phone = append(phone, v.Phone) @@ -286,6 +287,9 @@ func (j *Job) Run() { if v.Email != "0" && v.Email != "" { toEmail += v.Email + ";" } + if v.Dingtalk != "0" && v.Dingtalk != "" { + dingtalk = append(dingtalk, v.Dingtalk) + } } toEmail = strings.TrimRight(toEmail, ";") @@ -346,6 +350,27 @@ func (j *Job) Run() { param["task_name"] = " " + j.task.TaskName param["status"] = " " + TextStatus[status] notify.SendSmsToChan(phone, param) + } else if j.task.NotifyType == 2 && len(dingtalk) > 0 { + + content := fmt.Sprintf( + `定时任务异常:%s:\n + 任务执行详情:\n + 任务 ID:%d\n + 任务名称:%s\n + 执行时间:%s\n + 执行耗时:%f秒\n + 执行状态:%s\n + 任务执行输出\n + %s`, + j.task.TaskName, + j.task.Id, + j.task.TaskName, + beego.Date(time.Unix(log.CreateTime, 0), "Y-m-d H:i:s"), + float64(log.ProcessTime)/1000, + TextStatus[status], + log.Error) + + notify.SendDingtalkToChan(dingtalk, content) } } @@ -364,6 +389,7 @@ type adminInfo struct { Id int Email string Phone string + Dingtalk string RealName string } @@ -388,6 +414,7 @@ func AllAdminInfo(adminIds string) []*adminInfo { Id: v.Id, Email: v.Email, Phone: v.Phone, + Dingtalk: v.Dingtalk, RealName: v.RealName, } adminInfos = append(adminInfos, &ai) diff --git a/libs/http.go b/libs/http.go index b284db8..479c3ff 100644 --- a/libs/http.go +++ b/libs/http.go @@ -13,6 +13,7 @@ import ( "io/ioutil" "net/http" "strings" + "io" ) type AjaxReturn struct { @@ -56,3 +57,22 @@ func HttpGet(url string, param map[string]string) error { } return nil } + +func HttpPost(url string, contentType string, body io.Reader) error { + + resp, err := http.Post(url, contentType, body) + + if err != nil { + return err + } + + defer resp.Body.Close() + + _, resErr := ioutil.ReadAll(resp.Body) + + if resErr != nil { + return resErr + } + + return nil +} diff --git a/models/admin.go b/models/admin.go index 1e514cb..0f0138a 100644 --- a/models/admin.go +++ b/models/admin.go @@ -19,6 +19,7 @@ type Admin struct { RoleIds string Phone string Email string + Dingtalk string Salt string LastLogin int64 LastIp string diff --git a/notify/dingtalk.go b/notify/dingtalk.go new file mode 100644 index 0000000..030b11c --- /dev/null +++ b/notify/dingtalk.go @@ -0,0 +1,95 @@ +/************************************************************ +** @Description: notify +** @Author: Bee +** @Date: 2018-02-15 11:02 +** @Last Modified by: Bee +** @Last Modified time: 2018-02-15 11:02 +*************************************************************/ +package notify + +import ( + "github.com/astaxie/beego" + "github.com/george518/PPGo_Job/libs" + "log" + "time" + "fmt" + "encoding/json" + "bytes" +) + +type Dingtalk struct { + Dingtalks []string + Content string +} + +var DingtalkChan chan *Dingtalk +var DingtalkUrl string + +func init() { + DingtalkUrl = beego.AppConfig.String("dingtalk.url") + poolSize, _ := beego.AppConfig.Int("dingtalk.pool") + + //创建通道 + DingtalkChan = make(chan *Dingtalk, poolSize) + + go func() { + for { + select { + case m, ok := <-DingtalkChan: + if !ok { + return + } + if err := m.SendDingtalk(); err != nil { + beego.Error("SendDingtalk:", err.Error()) + } + } + } + }() + +} + +func SendDingtalkToChan(dingtalks []string, content string) bool { + dingTalk := &Dingtalk{ + Dingtalks: dingtalks, + Content: content, + } + + select { + case DingtalkChan <- dingTalk: + return true + case <-time.After(time.Second * 3): + return false + } +} + +type Msg struct { + MsgType string `json:"msgtype"` + Text *Text `json:"text"` +} + +type Text struct { + Content string `json:"content"` +} + +func (s *Dingtalk) SendDingtalk() error { + + for _, v := range s.Dingtalks { + + msg := Msg{MsgType: "text"} + text := new(Text) + text.Content = s.Content + msg.Text = text + + msgJson, err := json.Marshal(msg) + if err != nil { + log.Println(err) + } + + url := fmt.Sprintf(DingtalkUrl, v) + resErr := libs.HttpPost(url, "application/json;charset=utf-8", bytes.NewBuffer(msgJson)) + if resErr != nil { + log.Println(err) + } + } + return nil +} diff --git a/ppgo_job2.sql b/ppgo_job2.sql index 78767ad..485a12b 100644 --- a/ppgo_job2.sql +++ b/ppgo_job2.sql @@ -321,4 +321,12 @@ BEGIN; INSERT INTO `pp_user` VALUES ('1', 'admin', 'haodaquan@shoplinq.cn', 'abfcf6dcedfb4b5b1505d41a8b4c77e8', 'aYk4Q1P83v', '1528124357', '[', '0'); COMMIT; +BEGIN; +ALTER TABLE `pp_task` CHANGE `notify_type` `notify_type` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' COMMENT '0-邮件通知,1-信息通知,2-钉钉通知,'; +COMMIT; + +BEGIN; +ALTER TABLE `pp_uc_admin` ADD `dingtalk` VARCHAR(64) NULL COMMENT '钉钉' AFTER `email`; +COMMIT; + SET FOREIGN_KEY_CHECKS = 1; diff --git a/views/admin/add.html b/views/admin/add.html index ec6c1ad..633e4ee 100644 --- a/views/admin/add.html +++ b/views/admin/add.html @@ -37,6 +37,14 @@
*
+
+ +
+ +
+
*
+
+
diff --git a/views/admin/edit.html b/views/admin/edit.html index 7d09d11..d2ecbff 100644 --- a/views/admin/edit.html +++ b/views/admin/edit.html @@ -32,6 +32,13 @@
*
+
+ +
+ +
+
+
diff --git a/views/admin/list.html b/views/admin/list.html index 5085dab..8e2b82d 100644 --- a/views/admin/list.html +++ b/views/admin/list.html @@ -52,6 +52,7 @@ ,{field:'real_name', title: '真实姓名'} ,{field:'phone', title: '联系电话'} ,{field:'email', title: '电子邮箱'} + ,{field:'dingtalk', title: '钉钉通知'} ,{field:'status_text', title: '状态'} ,{fixed: 'right', width:160, align:'center', toolbar: '#bar'} ]] diff --git a/views/task/add.html b/views/task/add.html index 154b74e..0c1d061 100644 --- a/views/task/add.html +++ b/views/task/add.html @@ -99,6 +99,7 @@
+
diff --git a/views/task/copy.html b/views/task/copy.html index 8902fb2..630889a 100644 --- a/views/task/copy.html +++ b/views/task/copy.html @@ -100,6 +100,7 @@
+
diff --git a/views/task/detail.html b/views/task/detail.html index 7c61483..ad08e3d 100644 --- a/views/task/detail.html +++ b/views/task/detail.html @@ -99,7 +99,7 @@ {{if eq .task.IsNotify 1}} 通知类型 - {{if eq .task.NotifyType 1}}短信{{end}} {{if eq .task.NotifyType 0}}邮件{{end}} + {{if eq .task.NotifyType 1}}短信{{end}} {{if eq .task.NotifyType 0}}邮件{{end}} {{if eq .task.NotifyType 2}}钉钉{{end}} diff --git a/views/task/edit.html b/views/task/edit.html index 579c374..264674a 100644 --- a/views/task/edit.html +++ b/views/task/edit.html @@ -99,6 +99,7 @@
+