wangshan 1 год назад
Родитель
Сommit
ca723e9d9b
6 измененных файлов с 218 добавлено и 1 удалено
  1. 2 1
      .gitignore
  2. 44 0
      internal/dao/internal/warn.go
  3. 42 0
      internal/model/do/task.go
  4. 26 0
      manifest/config/task.yaml
  5. 27 0
      utility/mail.go
  6. 77 0
      utility/send.go

+ 2 - 1
.gitignore

@@ -11,4 +11,5 @@ bin/
 main
 output/
 manifest/output/
-temp/
+temp/
+/logs/

+ 44 - 0
internal/dao/internal/warn.go

@@ -0,0 +1,44 @@
+package internal
+
+import (
+	"analyze/internal/model/do"
+	"analyze/utility"
+	"app.yhyue.com/moapp/jybase/encrypt"
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// SendAlarmMail 生成失败发送告警邮件
+func SendAlarmMail(ctx context.Context, content string) {
+	ma := do.TaskConfig.MailAlarm
+	if len(ma.To) == 0 {
+		g.Log().Error(ctx, "离线报告告警未配置收件人邮箱")
+		return
+	}
+	to := strings.Join(ma.To, ",")
+	utility.SendRetryMailMany(ctx, ma.ReTry, to, ma.Title, content, "", "", do.GmailAuth)
+
+}
+
+var Sewx encrypt.SimpleEncrypt //微信的加密方法
+
+// SendReportMsg 报告生成后发送消息
+func SendReportMsg(ctx context.Context, mgoId string, positionId int, rId string) {
+	reportId := utility.EncodeId(mongodb.BsonIdToSId(rId))
+	msgInfo := do.TaskConfig.MessageInfo
+	pcUrl := fmt.Sprintf(msgInfo.Link.PcUrl, reportId)
+	androidUrl := fmt.Sprintf(msgInfo.Link.AndroidUrl, reportId)
+	iosUrl := fmt.Sprintf(msgInfo.Link.IosUrl, reportId)
+	now := strconv.Itoa(int(time.Now().Unix()))
+	sessData := fmt.Sprintf("%s,positionId,%s,weChatUrl", strconv.FormatInt(int64(positionId), 10), now)
+	weChatUrl := fmt.Sprintf(msgInfo.Link.WeChatUrl, Sewx.EncodeString(sessData))
+	parm := utility.MessageParam{
+		UserIds: mgoId, Title: msgInfo.Title, Content: msgInfo.Content, Link: pcUrl, AndroidUrl: androidUrl, IosUrl: iosUrl, WeChatUrl: weChatUrl, MsgType: msgInfo.MsgType,
+	}
+	do.SendMsg.SendStationMessages(ctx, parm)
+}

+ 42 - 0
internal/model/do/task.go

@@ -2,6 +2,8 @@ package do
 
 import (
 	"analyze/internal/model"
+	"analyze/utility"
+	"app.yhyue.com/moapp/jybase/mail"
 	"github.com/gogf/gf/v2/encoding/gjson"
 	"github.com/gogf/gf/v2/frame/g"
 )
@@ -15,10 +17,39 @@ type taskConfig struct {
 	Name           string
 	MainSwitch     bool
 	MarketAnalysis taskInfo
+	Message        struct {
+		Addr         string `json:"addr"`
+		Action       string `json:"action"`
+		CallPlatform string `json:"callPlatform"`
+	} `json:"message"` // 消息api
+	MessageInfo struct {
+		Title   string `json:"title"`
+		MsgType int    `json:"msgType"`
+		Content string `json:"content"`
+		Link    struct {
+			PcUrl      string `json:"pcUrl"`
+			AndroidUrl string `json:"androidUrl"`
+			IosUrl     string `json:"iosUrl"`
+			WeChatUrl  string `json:"weChatUrl"`
+		} `json:"link"`
+	} `json:"messageInfo"` // 市场分析报告消息配置
+	Mail []struct {
+		Addr string
+		Port int
+		Pwd  string
+		User string
+	} `json:"mail"`
+	MailAlarm struct {
+		To    []string `json:"to"`    // 告警邮件接收人
+		Title string   `json:"title"` // 邮件标题
+		ReTry int      `json:"reTry"` // 重试次数
+	} `json:"mailAlarm"`
 }
 
 var (
 	TaskConfig taskConfig
+	GmailAuth  []*mail.GmailAuth
+	SendMsg    *utility.StationMessage
 )
 
 func init() {
@@ -41,5 +72,16 @@ func init() {
 	if msg != "" {
 		g.Log().Error(model.Ctx, msg)
 	}
+	// 处理邮件信息
+	for _, v := range TaskConfig.Mail {
+		m := &mail.GmailAuth{
+			SmtpHost: v.Addr,
+			SmtpPort: v.Port,
+			User:     v.User,
+			Pwd:      v.Pwd,
+		}
+		GmailAuth = append(GmailAuth, m)
+	}
+	SendMsg = utility.NewStationMessage(TaskConfig.Message.Addr, TaskConfig.Message.Action, TaskConfig.Message.CallPlatform)
 	g.Log().Info(model.Ctx, "--定时任务配置初始化--结束--")
 }

+ 26 - 0
manifest/config/task.yaml

@@ -4,3 +4,29 @@ marketAnalysis:
   firstRun: true
   taskRun: true
   ticker: 7200
+message:
+  addr: "https://web-qmx_admin.jydev.jianyu360.com/api/admin/"
+  action: "/message/sendMessageApi"
+  callPlatform: "analyze"
+messageInfo:
+  title: "报告生成成功提醒"
+  msgType: 2
+  content: "您的市场分析报告已生成成功,请点击查看>"
+  link:
+    pcUrl: "/page_workDesktop/work-bench/app/big/desktop/report_analysis?id=%s"
+    androidUrl: "/jyapp/big/page/report_analysis?id=%s"
+    iosUrl: "/jyapp/big/page/report_analysis?id%s"
+    weChatUrl: "/front/sess/%s"
+mail:
+  - addr: "smtp.exmail.qq.com"
+    port: 465
+    pwd: "ue9Rg9Sf4CVtdm5a"
+    user: "public03@topnet.net.cn"
+  - addr: "smtp.exmail.qq.com"
+    port: 465
+    pwd: "ue9Rg9Sf4CVtdm5a"
+    user: "public03@topnet.net.cn"
+mailAlarm:
+  to: [ "328974233@qq.com" ]
+  title: "市场分析报告生成失败"
+  reTry: 3

+ 27 - 0
utility/mail.go

@@ -0,0 +1,27 @@
+package utility
+
+import (
+	"app.yhyue.com/moapp/jybase/mail"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"time"
+)
+
+// SendRetryMailMany 发送邮件  收件人多个使用英文逗号分割
+func SendRetryMailMany(ctx context.Context, retry int, user_mail, subject, content, fname string, rename string, auth []*mail.GmailAuth) bool {
+	for i := 1; i <= retry; i++ {
+		for _, v := range auth { //使用多个邮箱尝试发送
+			if mail.GSendMail_q("剑鱼标讯", user_mail, "", "", subject, content, fname, rename, v) {
+				return true
+			}
+			t := time.Duration(i) * 30 * time.Second
+			g.Log().Errorf(ctx, user_mail, fmt.Sprintf("第%d轮,使用%s发送邮件失败!%v后重试", i, v.User, t))
+			time.Sleep(t)
+		}
+		if i == retry {
+			g.Log().Error(ctx, user_mail, fmt.Sprintf("发送邮件失败"))
+		}
+	}
+	return false
+}

+ 77 - 0
utility/send.go

@@ -0,0 +1,77 @@
+package utility
+
+import (
+	"app.yhyue.com/moapp/jybase/date"
+	"context"
+	"encoding/json"
+	"fmt"
+	"github.com/gogf/gf/v2/frame/g"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+)
+
+type StationMessage struct {
+	Action       string
+	Addr         string
+	CallPlatform string
+}
+type MessageParam struct {
+	UserIds     string // 用户mongo库id   用户userId用英文逗号拼接
+	SendTime    string // 发送时间 暂时无用 (2022-03-31 09:08:08  仅发送模式为定时时有效)
+	Title       string // 通知消息	消息标题
+	Content     string // 消息内容
+	Link        string // pc消息链接
+	AndroidUrl  string // 安卓消息链接
+	IosUrl      string // IOS消息链接
+	WeChatUrl   string // 微信消息链接
+	SendMode    int    // 发送模式  1- 定时 2-实时 (所调接口未支持定时)
+	PositionIds string // 职位id 与userIds 对应
+	MsgType     int    // message_class 里的消息分类
+}
+type MessageRet struct {
+	Status string `json:"status"`
+	Info   string `json:"info"`
+	Data   struct {
+		Status int `json:"status"`
+	} `json:"data"`
+}
+
+func NewStationMessage(addr string, action string, callPlatform string) *StationMessage {
+	return &StationMessage{
+		Addr:         addr,
+		Action:       action,
+		CallPlatform: callPlatform,
+	}
+}
+
+func (s *StationMessage) SendStationMessages(ctx context.Context, p MessageParam) {
+	var (
+		ret  MessageRet
+		cont []byte
+	)
+	parms := fmt.Sprintf("_action=%s&userIds=%s&msgType=%v&title=%s&content=%s&link=%s&sendMode=2&sendTime=%s&androidUrl=%s&iosUrl=%s&weChatUrl=%s&_token=12311&reqSource=1&callPlatform=%s&positionIds=%s&menuname=message",
+		s.Action, p.UserIds, p.MsgType, p.Title, p.Content, p.Link, date.NowFormat(date.Date_Short_Layout), p.AndroidUrl, p.IosUrl, p.WeChatUrl, s.CallPlatform, p.PositionIds)
+	paramsEncode := url.PathEscape(parms)
+	url := fmt.Sprintf("%s?%s", s.Addr, paramsEncode)
+	resp, err := http.Get(url)
+	if err != nil {
+		g.Log().Error(ctx, "发送消息失败:", err)
+		return
+	}
+	defer resp.Body.Close()
+	cont, err = ioutil.ReadAll(resp.Body)
+	if err != nil {
+		g.Log().Error(ctx, "发送消息错误信息:", string(cont), err)
+		return
+	}
+	err = json.Unmarshal(cont, &ret)
+	if err != nil {
+		g.Log().Error(ctx, "发送消息反序列化错误信息:", err)
+		return
+	}
+	if ret.Data.Status != 1 {
+		g.Log().Error(ctx, "发送消息失败:Status != 1", ret)
+	}
+
+}