zwxi 11 månader sedan
förälder
incheckning
961ad3bc74
7 ändrade filer med 211 tillägg och 0 borttagningar
  1. 43 0
      controllers/wechat.go
  2. 8 0
      models/db.go
  3. 30 0
      models/template_library.go
  4. 11 0
      models/wechat_send_msg.go
  5. 99 0
      services/wechat_send_msg_cygx.go
  6. 14 0
      utils/common.go
  7. 6 0
      utils/config.go

+ 43 - 0
controllers/wechat.go

@@ -101,3 +101,46 @@ func (this *WechatController) GetAccessToken() {
 	br.Data = data
 	return
 }
+
+// @Title 推送类目模板消息
+// @Description 推送模板消息
+// @Success 200 新增成功
+// @router /send_category_template_msg [post]
+func (this *WechatController) SendCategoryTemplateMsg() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	body := this.Ctx.Input.RequestBody
+	sendItem := new(models.SendWxCategoryTemplate)
+	err := json.Unmarshal(body, &sendItem)
+	if err != nil {
+		br.Msg = "参数解析失败"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if sendItem.TemplateId == "" {
+		br.Msg = "参数错误,模板id为空"
+		return
+	}
+
+	if len(sendItem.OpenIdArr) <= 0 {
+		br.Msg = "openid为空"
+		return
+	}
+	if sendItem.WxAppId == "" {
+		sendItem.WxAppId = utils.WxMfyxAppId   //默认是买方研选公众号
+	}
+	go func() {
+		err = services.SendWxCategoryTemplateMsgCygx(sendItem)
+		if err != nil {
+			msg := "URI:" + this.Ctx.Input.URI() + "<br/> " + "Params" + string(body) + " <br/>" + "ErrMsg:" + err.Error() + ";<br/> Body:" + string(body) + "<br/>"
+			go alarm_msg.SendAlarmMsg(msg, 1)
+		}
+	}()
+	br.Ret = 200
+	br.Msg = "推送成功"
+	return
+}

+ 8 - 0
models/db.go

@@ -24,9 +24,17 @@ func init() {
 	report_db, _ := orm.GetDB("rddp")
 	report_db.SetConnMaxLifetime(10 * time.Minute)
 
+	_ = orm.RegisterDataBase("cygx", "mysql", utils.MYSQL_URL_CYGX)
+	orm.SetMaxIdleConns("cygx", 50)
+	orm.SetMaxOpenConns("cygx", 100)
+
+	cygx_db, _ := orm.GetDB("cygx")
+	cygx_db.SetConnMaxLifetime(10 * time.Minute)
+
 	//注册对象
 	orm.RegisterModel(
 		new(UserTemplateRecord),
 		new(ReportChapter),
+		new(TemplateLibrary),
 	)
 }

+ 30 - 0
models/template_library.go

@@ -0,0 +1,30 @@
+package models
+
+import "github.com/beego/beego/v2/client/orm"
+
+type TemplateLibrary struct {
+	TemplateLibraryId int    `orm:"column(template_library_id);pk"`
+	TemplateId        string `json:"template_id"`
+	Title             string `json:"title"`
+	PrimaryIndustry   string `json:"primary_industry"`
+	DeputyIndustry    string `json:"deputy_industry"`
+	Content           string `json:"content"`
+	Example           string `json:"example"`
+}
+
+type TemplateLibraryResp struct {
+	TemplateList []TemplateLibrary `json:"template_list"`
+}
+
+func AddTemplates(items []TemplateLibrary) (err error) {
+	o := orm.NewOrmUsingDB("cygx")
+	_, err = o.InsertMulti(len(items), &items)
+	return
+}
+
+func GetTemplateLibraryByTemplateId(templateId string) (item *TemplateLibrary, err error) {
+	o := orm.NewOrmUsingDB("cygx")
+	sql := `SELECT * FROM template_library WHERE template_id=? `
+	err = o.Raw(sql, templateId).QueryRow(&item)
+	return
+}

+ 11 - 0
models/wechat_send_msg.go

@@ -232,3 +232,14 @@ type WxTokenReq struct {
 type WxTokenResp struct {
 	AccessToken string `description:"微信token"`
 }
+
+type SendWxCategoryTemplate struct {
+	WxAppId        string   `description:"公众号appId"`
+	Keywords       []string `description:"模板消息keyword字段"`
+	TemplateId     string   `description:"模板id"`
+	RedirectUrl    string   `description:"跳转地址"`
+	RedirectTarget int      `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序,3:查研观向"`
+	Resource       string   `description:"资源唯一标识"`
+	SendType       int      `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
+	OpenIdArr      []string `description:"消息接收者openid"`
+}

+ 99 - 0
services/wechat_send_msg_cygx.go

@@ -97,10 +97,12 @@ func sendTemplateMsgCygx(sendMap map[string]interface{}, openIdArr []string, res
 		if err != nil {
 			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
 			utils.FileLog.Info(fmt.Sprintf("SendTemplateMsgOne Marshal Err:%s", err.Error()))
+			err = errors.New("SendTemplateMsgOne Marshal Err:" + err.Error())
 			return err
 		}
 		err = toSendTemplateMsgCygx(data, resource, sendType, openId, uniqueCode)
 		if err != nil {
+			err = errors.New("toSendTemplateMsgCygx Err:" + err.Error())
 			fmt.Println("send err:", err.Error())
 			utils.FileLog.Info(fmt.Sprintf("ToSendTemplateMsg Err:%s", err.Error()))
 		}
@@ -114,6 +116,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 	//获取accessToken
 	accessToken, err, errMsg := getWxAccessTokenCygx()
 	if err != nil {
+		err = errors.New("getWxAccessTokenCygx Err:" + err.Error())
 		utils.FileLog.Info(fmt.Sprintf("获取Token失败,err:%s,errMsg:%s", err.Error(), errMsg))
 		return
 	}
@@ -122,6 +125,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 	client := http.Client{}
 	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
 	if err != nil {
+		err = errors.New("Post Err:" + err.Error())
 		return
 	}
 	defer resp.Body.Close()
@@ -131,6 +135,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 	var templateResponse SendTemplateResponse
 	err = json.Unmarshal(body, &templateResponse)
 	if err != nil {
+		err = errors.New("SendResult Unmarshal Err:" + err.Error())
 		utils.FileLog.Info(fmt.Sprintf("SendResult Unmarshal Err:%s", err.Error()))
 		return err
 	}
@@ -153,6 +158,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 		go func() {
 			err = models.AddUserTemplateRecord(tr)
 			if err != nil {
+				err = errors.New("AddUserTemplateRecord Err:" + err.Error())
 				utils.FileLog.Info(fmt.Sprintf("AddUserTemplateRecord Err:%s", err.Error()))
 			}
 		}()
@@ -163,6 +169,7 @@ func toSendTemplateMsgCygx(data []byte, resource string, sendType int, openId, u
 		//强刷token并重新推送
 		accessToken, err, errMsg = refreshWxAccessTokenCygx()
 		if err != nil {
+			err = errors.New("refreshWxAccessToken Err:" + err.Error())
 			utils.FileLog.Info(fmt.Sprintf("refreshWxAccessToken Err:%s", err.Error()))
 			return err
 		}
@@ -276,3 +283,95 @@ func refreshWxAccessTokenCygx() (accessToken string, err error, errMsg string) {
 	}
 	return
 }
+
+func TemplateList() (err error) {
+	//utils.FileLog.Info("Send:" + string(data))
+	//获取accessToken
+	accessToken, err, errMsg := getWxAccessTokenCygx()
+	if err != nil {
+		utils.FileLog.Info(fmt.Sprintf("获取Token失败,err:%s,errMsg:%s", err.Error(), errMsg))
+		return
+	}
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=" + accessToken
+
+	client := http.Client{}
+	//resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
+	resp, err := client.Get(sendUrl)
+	if err != nil {
+		return
+	}
+	defer resp.Body.Close()
+
+	body, _ := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Info("Cygx_SendResult:" + string(body))
+	var templateResponse models.TemplateLibraryResp
+	err = json.Unmarshal(body, &templateResponse)
+	if err != nil {
+		utils.FileLog.Info(fmt.Sprintf("SendResult Unmarshal Err:%s", err.Error()))
+		fmt.Println("SendResult Unmarshal Err:%s", err.Error())
+		return err
+	}
+
+	//添加到数据库
+	err = models.AddTemplates(templateResponse.TemplateList)
+	if err != nil {
+		utils.FileLog.Info(fmt.Sprintf("添加到数据库失败,err:%s", err.Error()))
+		fmt.Println("添加到数据库失败,err:%s", err.Error())
+		return err
+	}
+
+	return
+}
+
+// 发送类目模板消息
+func SendWxCategoryTemplateMsgCygx(sendInfo *models.SendWxCategoryTemplate) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("查研观向小助手发送类目模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLog.Info(fmt.Sprintf("发送类目模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+		if msg != "" {
+			utils.FileLog.Info(fmt.Sprintf("发送类目模版消息失败,msg:%s", msg))
+		}
+	}()
+	utils.FileLog.Info("services SendMsg")
+	fmt.Println("send start")
+	utils.FileLog.Info("send start")
+
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+	var uniqueCodeStr string
+
+	templateItem, err := models.GetTemplateLibraryByTemplateId(sendInfo.TemplateId)
+	if err != nil {
+		utils.FileLog.Info(fmt.Sprintf("获取模板库失败,err:%s", err.Error()))
+		err = errors.New("获取模板库失败 Err:" + err.Error())
+		return err
+	}
+	keywords := utils.ExtractDataFields(templateItem.Content)
+	if len(keywords) == len(sendInfo.Keywords) {
+		for i, v := range keywords {
+			sendData[v] = map[string]interface{}{"value": sendInfo.Keywords[i], "color": "#173177"}
+			//sendData[v] = map[string]interface{}{"value": "", "color": "#173177"}
+			uniqueCodeStr += sendInfo.Keywords[i]
+			//uniqueCodeStr += ""
+		}
+	}
+
+	sendMap["data"] = sendData
+	if sendInfo.TemplateId != "" {
+		sendMap["template_id"] = sendInfo.TemplateId
+		uniqueCodeStr += sendInfo.TemplateId
+	}
+	uniqueCode := utils.MD5(uniqueCodeStr)
+
+	err = sendTemplateMsgCygx(sendMap, sendInfo.OpenIdArr, sendInfo.Resource, uniqueCode, sendInfo.SendType)
+	if err != nil {
+		err = errors.New("sendTemplateMsgCygx Err:" + err.Error())
+		utils.FileLog.Info("send err:" + err.Error())
+	}
+	fmt.Println("send end")
+	utils.FileLog.Info("send end")
+	return
+}

+ 14 - 0
utils/common.go

@@ -794,3 +794,17 @@ func GetLocalIP() (ip string, err error) {
 	}
 	return
 }
+
+func ExtractDataFields(input string) []string {
+	re := regexp.MustCompile(`{{(.*?)\.DATA}}`)
+	matches := re.FindAllStringSubmatch(input, -1)
+
+	var result []string
+	for _, match := range matches {
+		if len(match) > 1 {
+			result = append(result, match[1])
+		}
+	}
+
+	return result
+}

+ 6 - 0
utils/config.go

@@ -12,6 +12,7 @@ var (
 	RunMode        string //运行模式
 	MYSQL_URL      string //数据库连接
 	MYSQL_URL_RDDP string //报告库数据库连接
+	MYSQL_URL_CYGX string //查研库数据库连接
 
 	REDIS_CACHE string       //缓存地址
 	Rc          *cache.Cache //redis缓存
@@ -44,6 +45,8 @@ var (
 	WxCygxAppId string
 	// 不知道这是啥,先配置上去吧
 	WxCopyYbAppId string
+	// WxMfyxAppId 买方研选小程序
+	WxMfyxAppId string
 )
 
 // LibreOfficePath LibreOfficePath的地址
@@ -113,6 +116,7 @@ func init() {
 	}
 	MYSQL_URL = config["mysql_url"]
 	MYSQL_URL_RDDP = config["mysql_url_rddp"]
+	MYSQL_URL_CYGX = config["mysql_url_cygx"]
 
 	REDIS_CACHE = config["beego_cache"]
 	if len(REDIS_CACHE) <= 0 {
@@ -184,6 +188,8 @@ func init() {
 		WxYbAppId = config["wx_yb_miniprogram_appid"]
 		// WxCygxAppId 查研观向小程序
 		WxCygxAppId = config["wx_cygx_miniprogram_appid"]
+		// WxMfyxAppId 买方研选小程序
+		WxMfyxAppId = config["wx_mfyx_miniprogram_appid"]
 
 		// WxCopyYbAppId 不知道这是啥,先配置上去吧
 		WxCopyYbAppId = config["wx_copy_yb_miniprogram_appid"]