zwxi 10 months ago
parent
commit
dc48b5c43e

+ 12 - 4
controllers/activity.go

@@ -2,6 +2,7 @@ package controllers
 
 import (
 	"encoding/json"
+	"errors"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"hongze/hongze_web_mfyx/models"
@@ -1378,6 +1379,7 @@ func (this *ActivityController) SignupCancel() {
 	// 如果是买方研选下的专家沙龙,同时推给内容组四人
 	if activityInfo.ActivityTypeId == 5 {
 		go services.SendActivitieCancelSignTemplateMsg(user, activityInfo)
+		go services.SendActivitieCancelSignCategoryTemplateMsg(user, activityInfo)
 	}
 
 	go services.SendResearchActivitiesTemplateMsg(user, activityInfo, "取消报名") //公司线下调研活动客户报名后给建会人,所属销售推送模板信息
@@ -1925,11 +1927,17 @@ func (this *ActivityController) AskAdd() {
 			}
 			// 给所属销售发送消息
 			if sellerItem != nil {
-				openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
-				if openIpItem != nil && openIpItem.OpenId != "" {
-					//services.SendActivityAskApplyTemplateMsgV2(user.RealName+"——"+user.CompanyName, "所属销售:"+sellerItem.RealName, time.Now().Format(utils.FormatDateTime), req.Content, activityInfo.ActivityName, openIpItem, activityInfo)
-					services.SendActivityAskApplyTemplateMsgV2(user.RealName+"——"+user.CompanyName+"("+sellerItem.RealName+")", "提问:"+activityInfo.ActivityName, time.Now().Format(utils.FormatDateTime), req.Content, activityInfo.ActivityName, openIpItem, activityInfo, int(msgId))
+				openIdList, e := models.GetUserRecordListByMobile(4, sellerItem.Mobile+","+utils.WxMsgTemplateIdAskMsgMobilePublic)
+				if e != nil {
+					err = errors.New("GetUserRecordListByMobile, Err: " + e.Error())
+					return
 				}
+				go services.SendWxCategoryMsgWithAsk(user.RealName, user.CompanyName, sellerItem.RealName, content, openIdList, req.ActivityId)
+
+				//openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
+				//if openIpItem != nil && openIpItem.OpenId != "" {
+				//services.SendActivityAskApplyTemplateMsgV2(user.RealName+"——"+user.CompanyName+"("+sellerItem.RealName+")", "提问:"+activityInfo.ActivityName, time.Now().Format(utils.FormatDateTime), req.Content, activityInfo.ActivityName, openIpItem, activityInfo, int(msgId))
+				//}
 			}
 		}
 	} else {

+ 12 - 3
controllers/article.go

@@ -417,6 +417,8 @@ func (this *ArticleController) ArticleCollect() {
 		resp.Status = 1
 		// 文章收藏消息发送
 		go services.ArticleUserRemind(user, detail, 1)
+		// 互动提醒
+		go services.SendWxCategoryMsgInteractive(user, "收藏报告", articleId)
 	} else {
 		err = models.RemoveArticleCollect(uid, articleId)
 		if err != nil {
@@ -636,10 +638,9 @@ func (this *ArticleController) AskAdd() {
 	}
 	var mobile string
 	if utils.RunMode == "release" {
-		//mobile = utils.WxMsgTemplateIdAskMsgMobileAll + "," + companyItem.Mobile
-		mobile = utils.WxMsgTemplateIdAskMsgMobileAll
+		mobile = utils.WxMsgTemplateIdAskMsgMobileAll+ "," + companyItem.Mobile
 	} else {
-		mobile = utils.WxMsgTemplateIdAskMsgMobile
+		mobile = utils.WxMsgTemplateIdAskMsgMobile+ "," + companyItem.Mobile
 	}
 	openIdList, err := models.GetWxOpenIdByMobileList(mobile)
 	if err != nil {
@@ -818,6 +819,14 @@ func (this *ArticleController) AddStopTime() {
 			}
 			if hasPersion {
 				go services.ArticleHistoryStopTime(articleId, stopTime, outType, user)
+				//30分钟之内阅读同一篇文章不错二次推送
+				key := "CYGX_ARTICLE_READ" + strconv.Itoa(articleId) + "_" + strconv.Itoa(uid)
+				if !utils.Rc.IsExist(key) {
+					go services.ArticleUserRemind(user, detail, 1)
+					// 互动提醒
+					go services.SendWxCategoryMsgInteractive(user, "阅读报告", articleId)
+					utils.Rc.Put(key, 1, 30*time.Second)
+				}
 			} else { //无该行业权限
 				hasPermission = 3
 			}

+ 1 - 0
controllers/report.go

@@ -1516,6 +1516,7 @@ func (this *ReportController) CommentAdd() {
 		return
 	}
 	go services.SendCommentWxTemplateMsg(req, user, articleInfo, int(msgId))
+	go services.SendCommentWxCategoryTemplateMsg(req, user, articleInfo, int(msgId))
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "提交成功"

+ 15 - 1
controllers/user.go

@@ -354,6 +354,7 @@ func (this *UserController) ApplyTryOut() {
 	sourceId = detailId
 	source = tryType
 	var isResearch bool // 是否属于研选
+	redirectUrl := ""
 	if tryType == "Article" {
 		detail, err := models.GetArticleDetailById(detailId)
 		if err != nil {
@@ -365,6 +366,7 @@ func (this *UserController) ApplyTryOut() {
 		if detail.ArticleTypeId > 0 {
 			isResearch = true
 		}
+		redirectUrl = utils.WX_MSG_PATH_YX_ARTICLE_DETAIL + strconv.Itoa(detailId)
 	} else if tryType == "Activity" {
 		detail, err := models.GetAddActivityInfoById(detailId)
 		if err != nil {
@@ -376,6 +378,7 @@ func (this *UserController) ApplyTryOut() {
 		if strings.Contains(detail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
 			isResearch = true
 		}
+		redirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(detailId)
 	} else if tryType == "MicroAudio" {
 		// 微路演音频
 		microAudio, e := models.GetCygxActivityVoiceById(detailId)
@@ -570,6 +573,7 @@ func (this *UserController) ApplyTryOut() {
 	//用户状态,1:潜在客户 、2:现有客户 、3:FICC客户 、4:现有客户(正式,无对应权限) 、5:现有客户(试用,无对应权限)  、6:现有客户(试用暂停) 、7:现有客户(冻结) 、8:现有客户(流失)、9:永续客户(流失)?
 	CompanyIdType := 1
 	applyMethod := ""
+	categoryApplyMethod := ""
 
 	if sellerItem != nil {
 
@@ -596,8 +600,10 @@ func (this *UserController) ApplyTryOut() {
 					CompanyIdType = 5
 				case "冻结":
 					CompanyIdType = 7
+					categoryApplyMethod = "冻结客户"
 				case "流失":
 					CompanyIdType = 8
+					categoryApplyMethod = "流失客户"
 				case "永续":
 					CompanyIdType = 9
 				}
@@ -606,9 +612,11 @@ func (this *UserController) ApplyTryOut() {
 			if detailId > 0 {
 				if companyProduct != nil && companyProduct.IsSuspend == 1 {
 					applyMethod = "试用暂停客户"
+					categoryApplyMethod = "试用暂停客户"
 				} else {
 					if companyItem.Status == "正式" || companyItem.Status == "试用" {
 						applyMethod = companyItem.Status + "客户申请,无对应权限"
+						categoryApplyMethod = companyItem.Status + "客户无对应权限"
 					} else if companyItem.Status == "冻结" || companyItem.Status == "流失" {
 						applyMethod = companyItem.Status + "客户"
 					}
@@ -635,14 +643,19 @@ func (this *UserController) ApplyTryOut() {
 		if sellerItem != nil {
 			CompanyIdType = 3
 			applyMethod = "FICC客户"
+			categoryApplyMethod = "FICC客户"
 		} else {
 			CompanyIdType = 1
 			applyMethod = "潜在客户"
+			categoryApplyMethod = "潜在客户"
 		}
 		if detailId > 0 {
 			applyMethod = applyMethod + "," + title
 		}
 	}
+	if categoryApplyMethod == "" {
+		categoryApplyMethod = applyMethod
+	}
 	//openIpItem, _ := models.GetUserRecordByMobile(4, cnf.ConfigValue)
 	//if openIpItem != nil && openIpItem.OpenId != "" {
 	//	if req.ApplyMethod != 2 {
@@ -682,11 +695,12 @@ func (this *UserController) ApplyTryOut() {
 		return
 	}
 	if sellerItem == nil {
-		go services.SendPermissionApplyTemplateMsgAdmin(req, mobile, applyMethod, isResearch)
+		go services.SendPermissionApplyTemplateMsgAdmin(req, mobile, applyMethod, categoryApplyMethod, redirectUrl, isResearch)
 	} else {
 		openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
 		if openIpItem != nil && openIpItem.OpenId != "" {
 			go services.SendPermissionApplyTemplateMsg(req.RealName, req.CompanyName, mobile, applyMethod, openIpItem)
+			go services.SendPermissionApplyCategoryTemplateMsg(req.RealName, req.CompanyName, mobile, categoryApplyMethod, openIpItem, redirectUrl)
 		}
 	}
 

+ 1 - 1
models/company.go

@@ -151,7 +151,7 @@ func GetCompanyDetailAllById(companyId int) (item *CompanyDetail, err error) {
 
 // 获取对应销售以及销售的手机号
 func GetSellerDetailAllByCompanyId(companyId int) (item *CompanyDetail, err error) {
-	sql := ` SELECT c.mobile ,c.real_name as seller_name
+	sql := ` SELECT c.mobile ,c.real_name as seller_name, a.company_name 
 			FROM
 			company AS a
 			INNER JOIN company_product AS b ON a.company_id = b.company_id

+ 8 - 0
services/activity.go

@@ -1749,6 +1749,7 @@ func ActivityUserRemind(user *models.WxUserItem, activityDetail *models.Activity
 	// 如果是买方研选下的专家沙龙,同时推给内容组四人
 	if activityDetail.ActivityTypeId == 5 {
 		go SendNeiRongZuActivitieSignTemplateMsg(user, activityDetail)
+		go SendNeiRongZuActivitieSignCategoryTemplateMsg(user, activityDetail)
 	}
 	//获取销售手机号
 	sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
@@ -1792,6 +1793,13 @@ 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)
+
+	// 类目模版
+	keyword1 = user.RealName + "-" + user.CompanyName
+	keyword2 = fmt.Sprint("互动提醒:", sourceMsg)
+	keyword3 := activityDetail.ActivityName
+	keyword4 := time.Now().Format(utils.FormatDateTimeMinute2)
+	SendWxCategoryMsgWithActivityUserRemind(keyword1, keyword2, keyword3, keyword4, openIdList, activityDetail.ActivityId)
 	return
 }
 

+ 1 - 0
services/keyword.go

@@ -34,6 +34,7 @@ func AddSearchKeyWord(user *models.WxUserItem, keyWord string, source int) (err
 	_, err = models.AddSearchKeyWord(keyWordItem)
 	go AddUserSearchLog(user, keyWord, source)
 	go SearchKeywordUserRmind(user, keyWord)
+	go SearchKeywordUserRmindCategoryMsg(user, keyWord)
 	//一分钟之内的相同搜索词不重复记录
 	//setNX := utils.Rc.SetNX(cacheKey, keyWord, time.Second*3)
 	//if !setNX {

+ 2 - 1
services/user.go

@@ -686,7 +686,7 @@ func GetUserhasPermission(user *models.WxUserItem) (hasPermission int, err error
 }
 
 // SendPermissionApplyTemplateMsgAdmin 处理试用申请给王芳,汪洋发消息
-func SendPermissionApplyTemplateMsgAdmin(req models.ApplyTryReq, usermobile, applyMethod string, isResearch bool) (err error) {
+func SendPermissionApplyTemplateMsgAdmin(req models.ApplyTryReq, usermobile, applyMethod, categoryApplyMethod ,redirectUrl string, isResearch bool) (err error) {
 	defer func() {
 		if err != nil {
 			go utils.SendAlarmMsg("处理试用申请给王芳,汪洋发消息失败, ErrMsg: "+err.Error(), 3)
@@ -711,6 +711,7 @@ func SendPermissionApplyTemplateMsgAdmin(req models.ApplyTryReq, usermobile, app
 	}
 	for _, v := range openIdList {
 		go SendPermissionApplyTemplateMsg(req.RealName, req.CompanyName, usermobile, applyMethod, v)
+		go SendPermissionApplyCategoryTemplateMsg(req.RealName, req.CompanyName, usermobile, categoryApplyMethod, v, redirectUrl)
 	}
 	return
 }

+ 557 - 1
services/wechat_send_category_template_msg.go

@@ -259,4 +259,560 @@ func SendReviewCategoryTemplateMsgAdmin(specialId int) (err error) {
 		return
 	}
 	return
-}
+}
+
+
+// 发送用户操作活动消息提醒
+func SendWxCategoryMsgWithActivityUserRemind(keyWord1, keyWord2, keyWord3, keyWord4 string, openIdList []*models.OpenIdList, activityId int) (err error) {
+	if len(openIdList) == 0 {
+		return
+	}
+	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("发送用户操作活动消息提醒,文章ID:", activityId), 2)
+			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
+		}
+	}()
+	keyWord1 = utils.TruncateActivityNameString(keyWord1)
+	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 keywords []string
+	keywords = append(keywords, keyWord1, keyWord2, keyWord3, keyWord4)
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
+	return
+}
+
+// 试用申请模板消息
+func SendPermissionApplyCategoryTemplateMsg(realName, companyName, mobile, applyMethod string, itemOpenid *models.OpenIdList, redirectUrl string) (err error) {
+
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("权限申请模板消息推送消息失败,手机号", mobile, "公司:", companyName, "手机号:", mobile, ";Err:"+err.Error()), 2)
+		}
+	}()
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var keyword5 string
+
+	detail, e := models.GetCygxApplyRecordByMobile(mobile)
+	if e != nil {
+		err = errors.New("GetActivitySignupNomeetingCountList" + e.Error())
+		return
+	}
+	//如果是潜在客户就推送可查看详情的模版消息
+	if utils.RunMode == "release" {
+		if detail.ApplyMethod == 2 {
+			redirectUrl = utils.WX_MSG_PATH_APPLY_DETAIL + strconv.Itoa(detail.ApplyRecordId)
+		}
+	}
+
+	openIdArr := make([]string, 0)
+	openIdArr = append(openIdArr, itemOpenid.OpenId)
+	sendInfo := new(SendWxCategoryTemplate)
+
+	keyword1 = realName
+	keyword2 = companyName
+	keyword3 = "权限申请"
+	keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
+	keyword5 = applyMethod
+
+	sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4, keyword5}
+	sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 4
+	sendInfo.Resource = mobile
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// 发送用户操作活动消息提醒
+func SendNeiRongZuActivitieSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (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("发送用户操作活动消息提醒,文章ID:", activityDetail.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
+	}
+	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+	openIdList, e := models.GetUserRecordListByMobile(4, cnf.ConfigValue+","+sellerItemQy.Mobile+","+utils.MobileShenTao)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetUserRecordListByMobile, Err: " + e.Error() + cnf.ConfigValue)
+		return
+	}
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	var keywords []string
+	keywords = append(keywords, user.RealName, user.CompanyName,
+		sellerItemQy.RealName, time.Now().Format(utils.FormatDateTimeMinute2),
+		"报名:"+activityDetail.ActivityName)
+
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityDetail.ActivityId)}
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+func SendActivitieCancelSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (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("发送用户操作活动消息提醒,文章ID:", activityDetail.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
+	}
+	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+	openIdList, e := models.GetUserRecordListByMobile(4, cnf.ConfigValue+","+sellerItemQy.Mobile+","+utils.MobileShenTao)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetUserRecordListByMobile, Err: " + e.Error() + cnf.ConfigValue)
+		return
+	}
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+
+	var keywords []string
+	keywords = append(keywords, user.RealName, user.CompanyName,
+		sellerItemQy.RealName, time.Now().Format(utils.FormatDateTimeMinute2),
+		"取消报名"+"【"+activityDetail.ActivityName+"】")
+
+	//sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId}
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.WxAppId = utils.WxAppId
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// 发送用户留言提醒
+func SendCommentWxCategoryTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail, msgId 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("发送用户用户留言提醒失败,文章ID:", req.ArticleId), 2)
+			utils.FileLog.Info("发送类目模版消息失败,Err:%s", err.Error())
+		}
+	}()
+
+	companyItem, e := models.GetSellerDetailAllByCompanyId(user.CompanyId)
+	if e != nil {
+		return
+	}
+	if companyItem == nil {
+		msg = "获取客户所属销售信息失败,UserID:" + strconv.Itoa(user.UserId)
+	}
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var keyword5 string
+	var redirectUrl string
+	var mobile string
+
+	var keywords []string
+	keyword1 = user.RealName
+	keyword2 = companyItem.CompanyName
+	keyword3 = companyItem.SellerName
+	keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
+	keyword5 = "报告留言:" + req.Content
+	keyword5 = utils.TruncateActivityNameString(keyword5)
+	keywords = append(keywords, keyword1, keyword2, keyword3, keyword4, keyword5)
+
+	if articleInfo.ArticleTypeId > 0 {
+		//研选报告添加汪洋
+		mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
+	} else {
+		mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
+	}
+	openIdList, e := models.GetWxOpenIdByMobileList(mobile)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+
+	redirectUrl = utils.WX_MSG_PATH_YX_COMMENT_DETAIL + strconv.Itoa(msgId) + "&type=文章"
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	sendInfo.RedirectUrl = redirectUrl
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// 发送活动提问消息提醒
+func SendWxCategoryMsgWithAsk(realName,companyName, sellerName, askMsg string, openIdList []*models.OpenIdList, askId int) (err error) {
+	if len(openIdList) == 0 {
+		return
+	}
+	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("发送活动提问消息提醒类目模版消息失败,用户名", realName, "提问ID:", askId), 2)
+			utils.FileLog.Info("发送类目模版消息失败,Err:%s", err.Error())
+		}
+		fmt.Println("line 21", err, msg)
+	}()
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var keyword5 string
+
+	keyword1 = realName
+	keyword2 = utils.TruncateActivityNameString(companyName)
+	keyword3 = sellerName
+	keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
+	keyword5 = "活动提问:" + askMsg
+
+	keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(askId)
+	//redirectUrl := utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(askId) + "&SourceType=2"
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	sendInfo.RedirectUrl = redirectUrl
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// 线下调研活动扫码签到给对应销售发类目模班消息
+func SendActivitieSignCategoryTemplateMsg(user *models.WxUserItem, activityDetail *models.ActivityDetail) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("线下调研活动扫码签到给对应销售发模班消息推送失败Err:", err.Error(), "活动ID:", activityDetail.ActivityId, "手机号:", user.Mobile), 2)
+		}
+	}()
+	var mobiles []string
+	//获取销售信息
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	if sellerItem != nil {
+		mobiles = append(mobiles, sellerItem.Mobile, utils.MobileWuAngDi, utils.MobileDongHeng, utils.MobileShenTao)
+	}
+
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var keyword5 string
+
+	var redirectUrl string
+
+	keyword1 = user.RealName
+	keyword2 = user.CompanyName
+	keyword3 = sellerItem.RealName
+	keyword4 = activityDetail.ActivityName
+	keyword5 = time.Now().Format(utils.FormatDateTimeMinute2)
+
+	openIdList, e := models.GetWxOpenIdByMobileSliceList(mobiles)
+	if e != nil {
+		err = errors.New("GetWxOpenIdByMobileList, Err: " + e.Error())
+		return
+	}
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+
+	redirectUrl = utils.WX_MSG_PATH_YX_SIGNUP_DETAIL + strconv.Itoa(activityDetail.ActivityId)
+
+	keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdActivitySign
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	sendInfo.RedirectUrl = redirectUrl
+	err = SendCategoryTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 文章互动相关类目模版消息
+func SendWxCategoryMsgInteractive(user *models.WxUserItem, interactive string, articleId int) (err error) {
+	//30秒内阅读同一篇报告不做重复推送
+	key := "CYGX_" + utils.CYGX_OBJ_RESEARCHSUMMARY + "_READ" + strconv.Itoa(articleId) + "_" + strconv.Itoa(user.UserId)
+	if utils.Rc.IsExist(key) {
+		return
+	}
+	utils.Rc.Put(key, 1, 30*time.Second)
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("文章互动相关,类目模板消息推送 ,SendWxCategoryMsgInteractive"+err.Error(), "userId:", user.UserId, "互动类型:", interactive), 2)
+		}
+	}()
+	countUser, err := models.GetUserRemind(user.UserId)
+	if err != nil {
+		return err
+	}
+	if countUser == 0 {
+		return err
+	}
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	//获取销售手机号
+	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	if sellerItemQy != nil {
+		openIdList, e := models.GetWxOpenIdByMobileList(sellerItemQy.Mobile)
+		if e != nil {
+			err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+			return
+		}
+		if len(openIdList) == 0 {
+			return
+		}
+		detail, e := models.GetCygxResearchSummaryInfoById(articleId)
+		if e != nil {
+			err = errors.New("GetCygxProductInteriorDetail, Err: " + e.Error())
+			return
+		}
+		if detail == nil {
+			return
+		}
+		keyword1 = user.RealName + "-" + user.CompanyName
+		keyword1 = utils.TruncateActivityNameString(keyword1)
+		keyword2 = fmt.Sprint("互动提醒:", interactive)
+		keyword3 = detail.Title
+		keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
+		openIdArr := make([]string, 0)
+		for _, v := range openIdList {
+			openIdArr = append(openIdArr, v.OpenId)
+		}
+
+		redirectUrl := ``
+		redirectUrl = utils.WX_MSG_PATH_YX_ARTICLE_DETAIL + strconv.Itoa(articleId)
+
+		keywords := []string{keyword1, keyword2, keyword3, keyword4}
+
+		sendInfo := new(SendWxCategoryTemplate)
+		sendInfo.Keywords = keywords
+		sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+		sendInfo.RedirectTarget = 4
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+		sendInfo.OpenIdArr = openIdArr
+		sendInfo.RedirectUrl = redirectUrl
+		err = SendCategoryTemplateMsg(sendInfo)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// 用户搜索操作操作行为,类目模板消息推送
+func SearchKeywordUserRmindCategoryMsg(user *models.WxUserItem, keyWord string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg(fmt.Sprint("用户搜索操作操作行为,类目模板消息推送失败"+err.Error(), "UserId:", user.UserId, "keyWord:", keyWord), 2)
+		}
+	}()
+	countUser, e := models.GetUserRemind(user.UserId)
+	if e != nil {
+		err = errors.New("GetUserRemind, Err: " + e.Error())
+		return
+	}
+	if countUser == 0 {
+		return
+	}
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	//获取销售手机号
+	sellerItemQy, e := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+		return
+	}
+	if sellerItemQy != nil {
+		openIdList, e := models.GetWxOpenIdByMobileList(sellerItemQy.Mobile)
+		if e != nil {
+			err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+			return
+		}
+		if len(openIdList) == 0 {
+			return
+		}
+		keyword1 = user.RealName + "-" + user.CompanyName
+		keyword2 = fmt.Sprint("互动提醒:搜索")
+		keyword3 = keyWord
+		keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
+		openIdArr := make([]string, 0)
+		for _, v := range openIdList {
+			openIdArr = append(openIdArr, v.OpenId)
+		}
+		redirectUrl := ""
+		keywords := []string{keyword1, keyword2, keyword3, keyword4}
+
+		sendInfo := new(SendWxCategoryTemplate)
+		sendInfo.Keywords = keywords
+		sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdCompanyApprovalMessageRai
+		sendInfo.RedirectTarget = 4
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+		sendInfo.OpenIdArr = openIdArr
+		sendInfo.RedirectUrl = redirectUrl
+		err = SendCategoryTemplateMsg(sendInfo)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// 发送报告提问消息提醒
+func SendWxCategoryMsgWithActivityAsk(companyName, realName, sellerName, askTime, askMsg string, openIdList []*models.OpenIdList, msgId int) (err error) {
+	if len(openIdList) == 0 {
+		return
+	}
+	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("发送报告提问消息提醒类目模版消息失败,用户名", realName, "留言ID:", msgId), 2)
+			utils.FileLog.Info("发送类目模版消息失败,Err:%s", err.Error())
+		}
+		fmt.Println("line 21", err, msg)
+	}()
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var keyword5 string
+
+	keyword1 = realName
+	keyword2 = companyName
+	keyword3 = sellerName
+	keyword4 = askTime
+	keyword5 = utils.TruncateActivityNameString("活动提问:" + askMsg)
+
+	keywords := []string{keyword1, keyword2, keyword3, keyword4, keyword5}
+
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(msgId)
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxCategoryMsgTemplateIdApplyXzs
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	sendInfo.RedirectUrl = redirectUrl
+	err = SendCategoryTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}
+

+ 5 - 0
utils/constants.go

@@ -190,6 +190,10 @@ const (
 	WX_MSG_PATH_PRODUCTINTERIOR_DETAIL   = "reportPages/internalDetials/internalDetials?id="              //产品内测详情模板消息地址
 	WX_MSG_PATH_THIS_WEEK_DETAIL         = "reportPages/reportSecretDetail/reportSecretDetail?type=2&id=" //本周研究汇总详情模板消息地址
 	WX_MSG_PATH_LAST_WEEK_DETAIL         = "reportPages/reportSecretDetail/reportSecretDetail?type=3&id=" //上周纪要汇总详情模板消息地址
+	WX_MSG_PATH_YX_COMMENT_DETAIL        = "pages-activity/generationAsk/generationAsk?id="               //研选报告留言详情
+	WX_MSG_PATH_YX_ACTIVITY_DETAIL       = "pages-activity/activityDetail/activityDetail?id="             //研选活动详情
+	WX_MSG_PATH_YX_SIGNUP_DETAIL         = "pages-message/activityTemplate/activityTemplate?id="          //研选报名详情
+	WX_MSG_PATH_YX_ARTICLE_DETAIL        = "pages-user/reportDetail/reportDetail?id="                     //研选纪要详情
 )
 
 // 微信模板消息推送公共接口的秘钥
@@ -230,6 +234,7 @@ const (
 	MobileZhangChuanXin = "15557270714" // 张传星手机号
 	MobileWangFang      = "18621268829" // 王芳手机号
 	MobileWuAngDi       = "18701809782" // 吴昂迪手机号
+	MobileDongHeng      = "15216736473" // 董衡手机号
 )
 
 const (