소스 검색

no message

xingzai 9 달 전
부모
커밋
aca2cb7c4e

+ 5 - 0
controllers/activity.go

@@ -1186,6 +1186,11 @@ func (this *ActivityController) SignupAdd() {
 			if activityInfo.IsResearchPoints {
 				resp.PopupMsg = "<b>报名成功,已加入您的活动日程</b><br/><br/>想要及时获取活动信息变更通知,请关注【查研观向小助手】公众号"
 			}
+			// 如果是买方研选下的专家沙龙,同时推给内容组四人
+			if activityInfo.ActivityTypeId == 5 && activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+				go services.SendNeiRongZuActivitieSignTemplateMsg(user, activityInfo)
+				go services.SendNeiRongZuActivitieSignCategoryTemplateMsg(user, activityInfo)
+			}
 			go services.YanXuanActivityPointsBillSignupAdd(activityId, uid) // 用户报名添加到处理研选扣点
 		}
 

+ 1 - 1
models/company.go

@@ -216,7 +216,7 @@ func GetCompanyPermissionList(companyId int) (items []*PermissionItem, err error
 }
 
 func GetCompanyProductCount(companyId, productId int) (count int, err error) {
-	sql := ` SELECT COUNT(1) AS count FROM  company_product WHERE company_id = ? AND product_id = ? `
+	sql := ` SELECT COUNT(1) AS count FROM  company_product WHERE company_id = ? AND product_id = ?  AND  company_id  > 1  `
 	o := orm.NewOrmUsingDB("weekly_report")
 	err = o.Raw(sql, companyId, productId).QueryRow(&count)
 	return

+ 1 - 1
models/cygx_yanxuan_special_user.go

@@ -277,7 +277,7 @@ func UpdateYanxuanSpecialAuthorFansNum(fansNum, userId int) (err error) {
 func UdpateYanxuanSpecialauthorArticleNum(articleNum, userId int) (err error) {
 	o := orm.NewOrm()
 	sql := ``
-	sql = `UPDATE cygx_yanxuan_special_author SET article_num = ? WHERE user_id = ? `
+	sql = `UPDATE cygx_yanxuan_special_author SET article_num = ? ,article_publish_time = NOEW(), modify_time = NOEW()   WHERE user_id = ? `
 	_, err = o.Raw(sql, articleNum, userId).Exec()
 	return
 }

+ 13 - 12
models/resource_data.go

@@ -7,18 +7,19 @@ import (
 )
 
 type CygxResourceData struct {
-	Id              int       `orm:"column(id);pk"`
-	SourceId        int       `description:"资源ID"`
-	Source          string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
-	Title           string    `description:"标题"`
-	Annotation      string    `description:"核心观点"`
-	CreateTime      time.Time `description:"创建时间"`
-	PublishDate     string    `description:"发布时间"`
-	Abstract        string    `description:"摘要"`
-	SearchTag       string    `description:"搜索标签"`
-	SearchTitle     string    `description:"搜索匹配用的标题"`
-	SearchContent   string    `description:"搜索匹配用的内容"`
-	SearchOrderTime string    `description:"搜索排序时间"`
+	Id                int       `orm:"column(id);pk"`
+	SourceId          int       `description:"资源ID"`
+	Source            string    `description:"资源类型 报告 :article 、图表 :newchart、微路演 :roadshow、活动 :activity、活动视频:activityvideo、活动音频:activityvoice、专项调研活动:activityspecial"`
+	Title             string    `description:"标题"`
+	Annotation        string    `description:"核心观点"`
+	CreateTime        time.Time `description:"创建时间"`
+	PublishDate       string    `description:"发布时间"`
+	Abstract          string    `description:"摘要"`
+	SearchTag         string    `description:"搜索标签"`
+	ChartPermissionId int       `description:"行业id"`
+	SearchTitle       string    `description:"搜索匹配用的标题"`
+	SearchContent     string    `description:"搜索匹配用的内容"`
+	SearchOrderTime   string    `description:"搜索排序时间"`
 }
 
 type CygxResourceDataResp struct {

+ 18 - 6
services/activity.go

@@ -1725,17 +1725,12 @@ func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.Activity
 	}()
 
 	//获取销售手机号
-
 	countUser, e := models.GetUserRemind(user.UserId)
 	if e != nil {
 		err = errors.New("GetUserRemind, Err: " + e.Error())
 		return
 	}
-	// 如果是买方研选下的专家沙龙,同时推给内容组四人
-	if activityDetail.ActivityTypeId == 5 && activityDetail.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
-		go SendNeiRongZuActivitieSignTemplateMsg(user, activityDetail)
-		go SendNeiRongZuActivitieSignCategoryTemplateMsg(user, activityDetail)
-	}
+
 	//获取销售手机号
 	sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
 	if e != nil && e.Error() != utils.ErrNoRow() {
@@ -1758,6 +1753,7 @@ func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.Activity
 		return
 	}
 	var sourceMsg string
+
 	if source == 1 {
 		sourceMsg = "预约外呼"
 	} else if source == 2 {
@@ -1778,6 +1774,22 @@ func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.Activity
 	keyword1 = activityDetail.ActivityName
 	keyword2 = fmt.Sprint("互动:", sourceMsg, ",", user.RealName, "--", user.CompanyName)
 	SendWxMsgWithActivityUserRemind(keyword1, keyword2, openIdList, activityDetail.ActivityId)
+
+	// 类目模版买方研选
+	if activityDetail.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		openIdListMfyx, e := models.GetMfyxWxOpenIdByMobileList(sellerItemQy.Mobile)
+		if e != nil {
+			err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
+			return err
+		}
+		var redirectUrl string
+		keyword1 = utils.TruncateActivityNameString(user.RealName + "-" + user.CompanyName)
+		keyword2 = fmt.Sprint("互动提醒:", sourceMsg)
+		keyword3 := utils.TruncateActivityNameString(activityDetail.ActivityName)
+		keyword4 := time.Now().Format(utils.FormatDateTimeMinute2)
+		redirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityDetail.ActivityId)
+		SendWxCategoryMsgWithActivityUserRemind(keyword1, keyword2, keyword3, keyword4, redirectUrl, openIdListMfyx, activityDetail.ActivityId)
+	}
 	return
 }
 

+ 24 - 5
services/article.go

@@ -684,8 +684,7 @@ func GetArticleStockMap() (mapResp map[string]int, err error) {
 func ArticleUserRemind(user *models.WxUserItem, articleDetail *models.ArticleDetail, source int) (err error) {
 	defer func() {
 		if err != nil {
-			go utils.SendAlarmMsg("同步策略平台阅读数据失败", 2)
-			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "GetCeLueArticlePv ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+			go utils.SendAlarmMsg("用户报告操作行为,模板消息推送 ,err"+err.Error(), 2)
 		}
 	}()
 	countUser, err := models.GetUserRemind(user.UserId)
@@ -708,16 +707,36 @@ func ArticleUserRemind(user *models.WxUserItem, articleDetail *models.ArticleDet
 		return err
 	}
 	if sellerItemQy != nil {
-		openIdList, err := models.GetWxOpenIdByMobileList(sellerItemQy.Mobile)
-		if err != nil {
+
+		articleId := articleDetail.ArticleId
+		openIdList, e := models.GetWxOpenIdByMobileList(sellerItemQy.Mobile)
+		if e != nil {
+			err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
 			return err
 		}
 		var keyword1 string
 		var keyword2 string
 		keyword1 = articleDetail.Title
 		keyword2 = fmt.Sprint("互动:", sourceMsg, ",", user.RealName, "--", user.CompanyName)
-		SendWxMsgWithArticleUserRemind(keyword1, keyword2, openIdList, articleDetail.ArticleId)
+		SendWxMsgWithArticleUserRemind(keyword1, keyword2, openIdList, articleId)
+
+		if articleDetail.ArticleTypeId > 0 {
+			// 类目模版买方研选
+			openIdListMfyx, e := models.GetMfyxWxOpenIdByMobileList(sellerItemQy.Mobile)
+			if e != nil {
+				err = errors.New("GetMfyxWxOpenIdByMobileList, Err: " + e.Error())
+				return err
+			}
+			var redirectUrl string
+			keyword1 = utils.TruncateActivityNameString(user.RealName + "-" + user.CompanyName)
+			keyword2 = fmt.Sprint("互动提醒:", sourceMsg)
+			keyword3 := utils.TruncateActivityNameString(articleDetail.Title)
+			keyword4 := time.Now().Format(utils.FormatDateTimeMinute2)
+			redirectUrl = utils.WX_MSG_PATH_YX_ARTICLE_DETAIL + strconv.Itoa(articleId)
+			SendWxCategoryMsgWithActivityUserRemind(keyword1, keyword2, keyword3, keyword4, redirectUrl, openIdListMfyx, articleId)
+		}
 	}
+
 	return
 }
 

+ 2 - 0
services/cygx_yanxuan_special.go

@@ -277,6 +277,8 @@ func UpdateYanxuanSpecialResourceData(sourceId int) {
 		item.SearchTitle = detail.Title
 		item.SearchContent = ""
 		item.SearchOrderTime = publishDate
+		item.ChartPermissionId = utils.CHART_PERMISSION_ID_YANXUAN //专栏属于研选行业
+
 		if totalData == 0 {
 			_, e := models.AddCygxResourceData(item)
 			if e != nil {

+ 30 - 0
services/wechat_send_category_template_msg.go

@@ -587,3 +587,33 @@ func SendCommentWxTemplateMsgByYxCategory(req models.AddCygxArticleCommentReq, u
 	err = SendCategoryTemplateMsg(sendInfo)
 	return
 }
+
+// 发送用户操作活动消息提醒
+func SendWxCategoryMsgWithActivityUserRemind(keyWord1, keyWord2, keyWord3, keyWord4, redirectUrl string, openIdList []*models.OpenIdList, activityId int) (err error) {
+	if len(openIdList) == 0 {
+		return
+	}
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,SendWxCategoryMsgWithActivityUserRemind 文章ID:", activityId), 2)
+		}
+	}()
+	keyWord1 = utils.TruncateActivityNameString(keyWord1)
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	var keywords []string
+	keywords = append(keywords, keyWord1, keyWord2, keyWord3, keyWord4)
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+	sendInfo.RedirectTarget = 4
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}

+ 31 - 57
services/wechat_send_msg.go

@@ -16,89 +16,63 @@ import (
 
 // 访谈申请
 func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
-	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("访谈申请模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
 		}
-		if msg != "" {
-			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
-		}
 	}()
 
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-
 	keyword1 := realName + "【" + companyName + "】"
 	first := "您有一条新的访谈申请,请及时处理。"
 	keyword2 := mobile
 	keyword3 := time.Now().Format(utils.FormatDateTime)
 	keyword4 := articleTitle
-	fontColor := "#D9001B"
-	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
-	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": fontColor}
-	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": fontColor}
+	openIdArr := make([]string, 0)
+	openIdArr = append(openIdArr, itemOpenid.OpenId)
 
-	sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
-	fmt.Println("send end")
+	redirectUrl := ""
+	sendInfo := new(SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	//sendInfo.Resource =
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 
 // 访谈申请取消
 func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
-	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("访谈申请取消模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile), 2)
 		}
-		if msg != "" {
-			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
-		}
 	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
 
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-
-	first := realName + "-" + mobile + "【" + companyName + "】的访谈申请已取消,请留意。"
 	keyword1 := articleTitle
 	keyword2 := time.Now().Format(utils.FormatDateTime)
-	fontColor := "#D9001B"
-	sendData["first"] = map[string]interface{}{"value": first, "color": fontColor}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": fontColor}
-	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": fontColor}
 
-	sendMap["template_id"] = utils.WxMsgTemplateIdApplyCancelXzs
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
+	openIdArr := make([]string, 0)
+	openIdArr = append(openIdArr, itemOpenid.OpenId)
+	redirectUrl := ""
+	sendInfo := new(SendWxTemplate)
+
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyCancelXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	//sendInfo.Resource =
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	fmt.Println("send end")
 	return
 }

+ 59 - 85
services/wx_template_msg.go

@@ -15,28 +15,15 @@ import (
 
 // 发送报告提问消息提醒
 func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.OpenIdList, articleId int) (err error) {
-	var msg string
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,用户名", name, "文章ID:", articleId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
-		fmt.Println("line 21", err, msg)
 	}()
-	utils.FileLog.Info("%s", "services SendMsg")
-	//accessToken, err := models.GetWxAccessToken()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
+
 	var first string
 	var keyword1 string
+	var keyword2 string
 	var keyword3 string
 	var keyword4 string
 	var remark string
@@ -45,22 +32,27 @@ func SendWxMsgWithAsk(name, askTime, askMsg, title string, openIdList []*models.
 	keyword3 = askTime
 	keyword4 = askMsg
 	remark = title
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	//templateId := utils.WxMsgTemplateIdAskMsg
-	templateId := utils.WxMsgTemplateIdAskMsgXzs
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "pages/reportDetail/reportDetail?id=" + strconv.Itoa(articleId)}
-	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "path": "article/detail?ArticleId=1000001"}
-	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": "", "color": "#173177"}
-	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
-	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
-	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.Remark = remark
+	sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
+
 	return
 }
 
@@ -327,76 +319,58 @@ func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.
 }
 
 // 发送用户操作活动消息提醒
-func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
-	var msg string
+func SendWxMsgWithActivityUserRemind(keyword1, keyword2 string, openIdList []*models.OpenIdList, activityId int) (err error) {
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("发送用户操作活动消息提醒,文章ID:", activityId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
 	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
 	}
-	//var first string
-	//first = keyWord1
-	//keyword1 := keyWord2
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	templateId := utils.WxMsgTemplateIdArticleUserRemind
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
-	//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	redirectUrl := utils.WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL + strconv.Itoa(activityId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 
 // 发送用户阅读报告消息提醒
-func SendWxMsgWithArticleUserRemind(keyWord1, keyWord2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
-	var msg string
+func SendWxMsgWithArticleUserRemind(keyword1, keyword2 string, openIdList []*models.OpenIdList, articleId int) (err error) {
+	if len(openIdList) == 0 {
+		return
+	}
 	defer func() {
 		if err != nil {
-			go utils.SendEmail("发送模版消息失败"+"【"+utils.APPNAME+"】"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
 			go utils.SendAlarmMsg(fmt.Sprint("发送报告提问消息提醒模版消息失败,文章ID:", articleId), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
 	}()
-	accessToken, err := models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
 	}
-	//var first string
-	//first = keyWord1
-	//keyword1 := keyWord2
-	remark := "点击查看报告详情"
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	templateId := utils.WxMsgTemplateIdArticleUserRemind
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
-	sendMap["template_id"] = templateId
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)}
-	//sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
-	sendData["keyword1"] = map[string]interface{}{"value": keyWord1, "color": "#173177"}
-	sendData["keyword2"] = map[string]interface{}{"value": keyWord2, "color": "#173177"}
-	sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
-	sendMap["data"] = sendData
-	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(articleId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
+	redirectUrl := utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+
+	sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }