Преглед изворни кода

修改模板消息逻辑,防止重发推送

longyu пре 2 година
родитељ
комит
9ab087c02b
2 измењених фајлова са 66 додато и 17 уклоњено
  1. 11 1
      models/user_template_record.go
  2. 55 16
      services/wechat_send_msg.go

+ 11 - 1
models/user_template_record.go

@@ -1,6 +1,8 @@
 package models
 
-import "github.com/beego/beego/v2/client/orm"
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
 
 type UserTemplateRecord struct {
 	Id         int `orm:"column(id);pk"`
@@ -13,6 +15,7 @@ type UserTemplateRecord struct {
 	CreateTime string
 	SendStatus int
 	SendType   int
+	UniqueCode string
 }
 
 //添加banner
@@ -21,3 +24,10 @@ func AddUserTemplateRecord(item *UserTemplateRecord) (err error) {
 	_, err = o.Insert(item)
 	return
 }
+
+func GetTemplateRecordByUniqueCode(uniqueCode string) (list []*UserTemplateRecord, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT open_id FROM user_template_record WHERE unique_code=? GROUP BY open_id`
+	_, err = o.Raw(sql, uniqueCode).QueryRows(&list)
+	return
+}

+ 55 - 16
services/wechat_send_msg.go

@@ -52,60 +52,98 @@ func SendWxTemplateMsg(sendInfo *models.SendWxTemplate) (err error) {
 
 	sendMap := make(map[string]interface{})
 	sendData := make(map[string]interface{})
-
+	var uniqueCodeStr string
 	if sendInfo.First != "" {
 		sendData["first"] = map[string]interface{}{"value": sendInfo.First, "color": "#173177"}
+		uniqueCodeStr += sendInfo.First
 	}
 
 	if sendInfo.Keyword1 != "" {
 		sendData["keyword1"] = map[string]interface{}{"value": sendInfo.Keyword1, "color": "#173177"}
+		uniqueCodeStr += sendInfo.Keyword1
 	}
 
 	if sendInfo.Keyword2 != "" {
 		sendData["keyword2"] = map[string]interface{}{"value": sendInfo.Keyword2, "color": "#173177"}
+		uniqueCodeStr += sendInfo.Keyword2
 	}
 
 	if sendInfo.Keyword3 != "" {
 		sendData["keyword3"] = map[string]interface{}{"value": sendInfo.Keyword3, "color": "#173177"}
+		uniqueCodeStr += sendInfo.Keyword3
 	}
 
 	if sendInfo.Keyword4 != "" {
 		sendData["keyword4"] = map[string]interface{}{"value": sendInfo.Keyword4, "color": "#173177"}
+		uniqueCodeStr += sendInfo.Keyword4
 	}
 
 	if sendInfo.TemplateId != "" {
 		sendMap["template_id"] = sendInfo.TemplateId
+		uniqueCodeStr += sendInfo.TemplateId
 	}
 
 	if sendInfo.RedirectUrl != "" {
 		sendMap["url"] = sendInfo.RedirectUrl
+		uniqueCodeStr += sendInfo.RedirectUrl
 	}
 	sendMap["data"] = sendData
-	err=sendTemplateMsg(sendUrl, sendMap, sendInfo.OpenIdArr, sendInfo.Resource, sendInfo.SendType)
+
+	uniqueCode := utils.MD5(uniqueCodeStr)
+
+	err = sendTemplateMsg(sendUrl, sendMap, sendInfo.OpenIdArr, sendInfo.Resource, uniqueCode, sendInfo.SendType)
 	fmt.Println("send end")
 	utils.FileLog.Info("send end")
 	return
 }
 
-func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, openIdArr []string, resource string, sendType int) (err error) {
-	for _, openId := range openIdArr {
-		sendMap["touser"] = openId
-		data, err := json.Marshal(sendMap)
-		if err != nil {
-			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
-			utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
-			return err
+func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, openIdArr []string, resource, uniqueCode string, sendType int) (err error) {
+	existList, err := models.GetTemplateRecordByUniqueCode(uniqueCode)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		utils.FileLog.Info(fmt.Sprintf("GetTemplateRecordByUniqueCode Err:%s", err.Error()))
+		return err
+	}
+	if len(existList) == 0 {
+		for _, openId := range openIdArr {
+			sendMap["touser"] = openId
+			data, err := json.Marshal(sendMap)
+			if err != nil {
+				fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
+				utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
+				return err
+			}
+			err = toSendTemplateMsg(sendUrl, data, resource, sendType, openId, uniqueCode)
+			if err != nil {
+				fmt.Println("send err:", err.Error())
+				utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
+			}
 		}
-		err = toSendTemplateMsg(sendUrl, data, resource, sendType, openId)
-		if err != nil {
-			fmt.Println("send err:", err.Error())
-			utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
+	} else {
+		existOpenIdMap := make(map[string]string)
+		for _, v := range existList {
+			existOpenIdMap[v.OpenId] = v.OpenId
+		}
+		for _, openId := range openIdArr {
+			if _, ok := existOpenIdMap[openId]; !ok {
+				sendMap["touser"] = openId
+				data, err := json.Marshal(sendMap)
+				if err != nil {
+					fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
+					utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
+					return err
+				}
+				err = toSendTemplateMsg(sendUrl, data, resource, sendType, openId, uniqueCode)
+				if err != nil {
+					fmt.Println("send err:", err.Error())
+					utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
+				}
+			}
 		}
 	}
 	return
 }
 
-func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, openId string) (err error) {
+func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType int, openId, uniqueCode string) (err error) {
 	var msg string
 	utils.FileLog.Info("Send:" + string(data))
 	client := http.Client{}
@@ -137,6 +175,7 @@ func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType in
 		} else {
 			tr.SendStatus = 0
 		}
+		tr.UniqueCode = uniqueCode
 		tr.SendType = sendType
 		go func() {
 			err = models.AddUserTemplateRecord(tr)
@@ -198,7 +237,7 @@ func toSendTemplateMsg(sendUrl string, data []byte, resource string, sendType in
 			go alarm_msg.SendAlarmMsg("异常已解决,自动清理限制接口,调用成功", 3)
 			//go utils.SendEmail("异常已解决:", "自动清理限制接口,调用成功", utils.EmailSendToUsers)
 			//重新推送一次
-			toSendTemplateMsg(sendUrl, data, resource, sendType, openId)
+			toSendTemplateMsg(sendUrl, data, resource, sendType, openId,uniqueCode)
 		}
 	}
 	return