瀏覽代碼

微信模版消息更换

xingzai 1 年之前
父節點
當前提交
e0a87fded3

+ 5 - 3
controllers/activity.go

@@ -1479,7 +1479,7 @@ func (this *ActivityController) AskAdd() {
 		item.Mobile = user.Mobile
 		item.Email = user.Email
 		item.Content = content
-		_, err = models.AddActivityHelpAsk(item)
+		msgId, err := models.AddActivityHelpAsk(item)
 		if err != nil {
 			br.Msg = "提交失败"
 			br.ErrMsg = "提交带问失败,Err:" + err.Error()
@@ -1527,7 +1527,8 @@ func (this *ActivityController) AskAdd() {
 				if openIpItem != nil && openIpItem.OpenId != "" {
 					if sellerItem != nil {
 
-						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, 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))
 					}
 				}
 			}
@@ -1535,7 +1536,8 @@ 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, 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))
 				}
 			}
 		}

+ 8 - 8
controllers/activity_special.go

@@ -490,14 +490,14 @@ func (this *ActivitySpecialController) SpecialSignupAdd() {
 			resp.PopupMsg = "感谢反馈"
 			resp.PopupMsg2 = "此调研具体行程尚未确认,待预报名人数满10人后弘则会确定行程并推送给您活动日期,只有在确认行程中再次报名才完成占位。"
 			//给所属销售发送消息
-			if sellerItem.Mobile != "" {
-				openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
-				if openIpItem != nil && openIpItem.OpenId != "" {
-					if sellerItem != nil {
-						//go services.SendSpecialTemplateMsg(user.RealName+"【"+user.CompanyName+"】", time.Now().Format(utils.FormatDateTime), user.Mobile, activityInfo.ResearchTheme, "sale", openIpItem)
-					}
-				}
-			}
+			//if sellerItem.Mobile != "" {
+			//	openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
+			//	if openIpItem != nil && openIpItem.OpenId != "" {
+			//		if sellerItem != nil {
+			//			//go services.SendSpecialTemplateMsg(user.RealName+"【"+user.CompanyName+"】", time.Now().Format(utils.FormatDateTime), user.Mobile, activityInfo.ResearchTheme, "sale", openIpItem)
+			//		}
+			//	}
+			//}
 			// 给芳姐发消息
 			actList, _ := models.GetActivityListSpecialByActivityId(activityId)
 			if len(actList) == 10 {

+ 39 - 31
controllers/article.go

@@ -121,8 +121,6 @@ func (this *ArticleController) Detail() {
 		}
 	}
 
-	fmt.Println("2342")
-
 	//HasPermission int `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下(ficc),3:无该品类权限,已提交过申请,4:无该品类权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
 	if user.CompanyId > 1 {
 		companyPermission, err := models.GetCompanyPermission(user.CompanyId)
@@ -306,6 +304,11 @@ Loop:
 	fmt.Println(haveResearch)
 	if hasPermission == 1 {
 		go services.ArticleHistory(articleId, user)
+		key := "CYGX_ARTICLE_READ" + strconv.Itoa(articleId) + "_" + strconv.Itoa(uid)
+		if !utils.Rc.IsExist(key) {
+			go services.ArticleUserRemind(user, detail, 1)
+			utils.Rc.Put(key, 1, 30*time.Second)
+		}
 	}
 	if detail.SubCategoryName == "专项调研" {
 		detail.IsSpecialArticle = true
@@ -345,12 +348,12 @@ func (this *ArticleController) ArticleCollect() {
 		return
 	}
 	articleId := req.ArticleId
-	//detail, err := models.GetArticleDetailById(articleId)
-	//if err != nil {
-	//	br.Msg = "获取信息失败"
-	//	br.ErrMsg = "获取信息失败,Err:" + err.Error()
-	//	return
-	//}
+	detail, err := models.GetArticleDetailById(articleId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
 	count, err := models.GetArticleCollectCount(uid, articleId)
 	if err != nil {
 		br.Msg = "获取数据失败!"
@@ -377,7 +380,7 @@ func (this *ArticleController) ArticleCollect() {
 		br.Msg = "收藏成功"
 		resp.Status = 1
 		// 文章收藏消息发送
-		//go services.ArticleUserRemind(user, detail, 2)
+		go services.ArticleUserRemind(user, detail, 1)
 	} else {
 		err = models.RemoveArticleCollect(uid, articleId)
 		if err != nil {
@@ -589,28 +592,33 @@ func (this *ArticleController) AskAdd() {
 		br.ErrMsg = "提交失败,Err:" + err.Error()
 		return
 	}
-	//companyItem, err := models.GetSellerDetailAllByCompanyId(user.CompanyId)
-	//if err != nil {
-	//	br.Msg = "获取信息失败"
-	//	br.ErrMsg = "获取所属销售信息失败,Err:" + err.Error()
-	//	return
-	//}
-	//var mobile string
-	//mobile = utils.WxMsgTemplateIdAskMsgMobile
-	//openIdList, err := models.GetWxOpenIdByMobileList(mobile)
-	//if err != nil {
-	//	br.Msg = "提交失败"
-	//	br.ErrMsg = "提交失败,Err:" + err.Error()
-	//	return
-	//}
-	//detail, err := models.GetArticleDetailById(articleId)
-	//if err != nil {
-	//	br.Msg = "获取信息失败"
-	//	br.ErrMsg = "获取信息失败,Err:" + err.Error()
-	//	return
-	//}
-	//companyName := user.CompanyName + "-" + user.RealName + "(" + companyItem.SellerName + ")"
-	//go services.SendWxMsgWithAsk(companyName, time.Now().Format(utils.FormatDateTime), content, detail.Title, openIdList, req.ArticleId)
+	companyItem, err := models.GetSellerDetailAllByCompanyId(user.CompanyId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取所属销售信息失败,Err:" + err.Error()
+		return
+	}
+	var mobile string
+	if utils.RunMode == "release" {
+		//mobile = utils.WxMsgTemplateIdAskMsgMobileAll + "," + companyItem.Mobile
+		mobile = utils.WxMsgTemplateIdAskMsgMobileAll
+	} else {
+		mobile = utils.WxMsgTemplateIdAskMsgMobile
+	}
+	openIdList, err := models.GetWxOpenIdByMobileList(mobile)
+	if err != nil {
+		br.Msg = "提交失败"
+		br.ErrMsg = "提交失败,Err:" + err.Error()
+		return
+	}
+	detail, err := models.GetArticleDetailById(articleId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取信息失败,Err:" + err.Error()
+		return
+	}
+	companyName := user.CompanyName + "-" + user.RealName + "(" + companyItem.SellerName + ")"
+	go services.SendWxMsgWithAsk(companyName, time.Now().Format(utils.FormatDateTime), content, detail.Title, openIdList, req.ArticleId)
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "提交成功"

+ 23 - 28
controllers/micro_roadshow.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hongze_clpt/services"
 	"hongze/hongze_clpt/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -378,29 +379,8 @@ func (this *MicroRoadShowController) CommentAdd() {
 		br.Msg = "留言内容不能为空!"
 		return
 	}
-	//itemToken, err := services.WxGetToken()
-	//if err != nil {
-	//	br.Msg = "GetWxAccessToken Err:" + err.Error()
-	//	return
-	//}
-	//if itemToken.AccessToken == "" {
-	//	br.Msg = "accessToken is empty"
-	//	return
-	//}
-	//commerr, err := weapp.MSGSecCheck(itemToken.AccessToken, content)
-	//if err != nil {
-	//	br.Msg = "内容校验失败!"
-	//	br.ErrMsg = "内容校验失败,Err:" + err.Error()
-	//	return
-	//}
-	//if commerr.ErrCode != 0 {
-	//	br.Msg = "内容违规,请重新提交!"
-	//	br.ErrMsg = "内容违规,Err:" + commerr.ErrMSG
-	//	return
-	//}
-
 	sourceType := req.SourceType
-
+	title := req.Title
 	if sourceType == 0 {
 		sourceType = 1
 	}
@@ -415,7 +395,7 @@ func (this *MicroRoadShowController) CommentAdd() {
 		Content:     req.Content,
 		Title:       req.Title,
 	}
-	var resourceId int
+	//var resourceId int
 	if sourceType == 1 {
 		activityVoiceInfo, _ := models.GetCygxActivityVoiceById(req.Id)
 		if activityVoiceInfo == nil {
@@ -426,7 +406,8 @@ func (this *MicroRoadShowController) CommentAdd() {
 		item.ActivityId = activityVoiceInfo.ActivityId
 		item.Title = activityVoiceInfo.VoiceName
 		item.ActivityVoiceId = activityVoiceInfo.ActivityVoiceId
-		resourceId = activityVoiceInfo.ActivityId
+		title = activityVoiceInfo.VoiceName
+		//resourceId = activityVoiceInfo.ActivityId
 	} else if sourceType == 2 {
 		activityInfo, _ := models.GetCygxActivityVideoById(req.Id)
 		if activityInfo == nil {
@@ -437,7 +418,8 @@ func (this *MicroRoadShowController) CommentAdd() {
 		item.Title = activityInfo.Title
 		item.VideoId = activityInfo.Id
 		item.ActivityId = activityInfo.ActivityId
-		resourceId = activityInfo.ActivityId
+		title = activityInfo.Title
+		//resourceId = activityInfo.ActivityId
 	} else if sourceType == 3 {
 		item.VideoId = req.Id
 		microVideo, e := models.GetMicroRoadshowVideoById(req.Id)
@@ -448,15 +430,28 @@ func (this *MicroRoadShowController) CommentAdd() {
 		}
 		item.Title = microVideo.VideoName
 		item.IndustryId = microVideo.IndustryId
-		resourceId = microVideo.IndustryId
+		title = microVideo.VideoName
+		//resourceId = microVideo.IndustryId
+	}
+	var isResearch bool // 是否属于研选
+	if sourceType == 2 || sourceType == 3 {
+		detail, err := models.GetAddActivityInfoById(req.Id)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(req.Id)
+			return
+		}
+		if strings.Contains(detail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+			isResearch = true
+		}
 	}
-	_, err = models.AddArticleComment(&item)
+	msgId, err := models.AddArticleComment(&item)
 	if err != nil {
 		br.Msg = "提交失败"
 		br.ErrMsg = "提交留言失败,Err:" + err.Error()
 		return
 	}
-	services.SendWxMsgWithMicroRoadshowAsk(req, user, resourceId)
+	services.SendWxMsgWithMicroRoadshowAsk(req, user, sourceType, int(msgId), title, isResearch)
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 2 - 2
controllers/report.go

@@ -1553,13 +1553,13 @@ func (this *ReportController) CommentAdd() {
 		Content:     content,
 		Title:       articleInfo.Title,
 	}
-	_, err = models.AddArticleComment(&item)
+	msgId, err := models.AddArticleComment(&item)
 	if err != nil {
 		br.Msg = "提交失败"
 		br.ErrMsg = "提交留言失败,Err:" + err.Error()
 		return
 	}
-	services.SendCommentWxTemplateMsg(req, user, articleInfo)
+	go services.SendCommentWxTemplateMsg(req, user, articleInfo, int(msgId))
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "提交成功"

+ 74 - 58
controllers/user.go

@@ -287,6 +287,7 @@ func (this *UserController) ApplyTryOut() {
 	var title string
 	tryType := req.TryType
 	detailId := req.DetailId
+	var isResearch bool // 是否属于研选
 	if tryType == "Article" {
 		detail, err := models.GetArticleDetailById(detailId)
 		if err != nil {
@@ -295,6 +296,10 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = detail.Title
+		title = detail.Title
+		if detail.ArticleTypeId > 0 {
+			isResearch = true
+		}
 	} else if tryType == "Activity" {
 		detail, err := models.GetAddActivityInfoById(detailId)
 		if err != nil {
@@ -303,6 +308,9 @@ func (this *UserController) ApplyTryOut() {
 			return
 		}
 		title = detail.ActivityName
+		if strings.Contains(detail.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+			isResearch = true
+		}
 	} else if tryType == "MicroAudio" {
 		// 微路演音频
 		microAudio, e := models.GetCygxActivityVoiceById(detailId)
@@ -468,80 +476,88 @@ func (this *UserController) ApplyTryOut() {
 	//用户状态,1:潜在客户 、2:现有客户 、3:FICC客户 、4:现有客户(正式,无对应权限) 、5:现有客户(试用,无对应权限)  、6:现有客户(试用暂停) 、7:现有客户(冻结) 、8:现有客户(流失)?
 	CompanyIdType := 1
 	applyMethod := ""
-	cnf, _ := models.GetConfigByCode("tpl_msg")
-	if cnf != nil {
-		if sellerItem != nil {
-			cnf.ConfigValue = sellerItem.Mobile
-			companyItem, err := models.GetCompanyDetailById(user.CompanyId)
+
+	if sellerItem != nil {
+
+		companyItem, err := models.GetCompanyDetailById(user.CompanyId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
+			return
+		}
+		if companyItem != nil && companyItem.CompanyId > 0 {
+			companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取信息失败"
 				br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
 				return
 			}
-			if companyItem != nil && companyItem.CompanyId > 0 {
-				companyProduct, err := models.GetCompanyProductDetail(user.CompanyId, 2)
-				if err != nil && err.Error() != utils.ErrNoRow() {
-					br.Msg = "获取信息失败"
-					br.ErrMsg = "获取客户信息失败,Err:" + err.Error()
-					return
+			if companyProduct != nil && companyProduct.IsSuspend == 1 {
+				CompanyIdType = 6
+			} else {
+				switch companyItem.Status {
+				case "正式":
+					CompanyIdType = 4
+				case "试用":
+					CompanyIdType = 5
+				case "冻结":
+					CompanyIdType = 7
+				case "流失":
+					CompanyIdType = 8
 				}
+			}
+			applyMethod = companyItem.Status + "客户申请"
+			if detailId > 0 {
 				if companyProduct != nil && companyProduct.IsSuspend == 1 {
-					CompanyIdType = 6
+					applyMethod = "试用暂停客户"
 				} else {
-					switch companyItem.Status {
-					case "正式":
-						CompanyIdType = 4
-					case "试用":
-						CompanyIdType = 5
-					case "冻结":
-						CompanyIdType = 7
-					case "流失":
-						CompanyIdType = 8
+					if companyItem.Status == "正式" || companyItem.Status == "试用" {
+						applyMethod = companyItem.Status + "客户申请,无对应权限"
+					} else if companyItem.Status == "冻结" || companyItem.Status == "流失" {
+						applyMethod = companyItem.Status + "客户"
 					}
 				}
-				applyMethod = companyItem.Status + "客户申请"
-				if detailId > 0 {
-					if companyProduct != nil && companyProduct.IsSuspend == 1 {
-						applyMethod = "试用暂停客户"
-					} else {
-						if companyItem.Status == "正式" || companyItem.Status == "试用" {
-							applyMethod = companyItem.Status + "客户申请,无对应权限"
-						} else if companyItem.Status == "冻结" || companyItem.Status == "流失" {
-							applyMethod = companyItem.Status + "客户"
-						}
-					}
-					applyMethod = applyMethod + "," + title
+				applyMethod = applyMethod + "," + title
+			}
+			openIpItem, _ := models.GetUserRecordByMobile(4, sellerItem.Mobile)
+			if openIpItem != nil && openIpItem.OpenId != "" {
+				if req.ApplyMethod != 2 {
+					req.RealName = user.RealName
+					req.CompanyName = user.CompanyName
 				}
+				go services.SendPermissionApplyTemplateMsg(req.RealName, req.CompanyName, mobile, applyMethod, openIpItem)
 			}
+		}
+	} else {
+		//获取销售信息
+		sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 1)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "申请失败"
+			br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
+			return
+		}
+		if sellerItem != nil {
+			CompanyIdType = 3
+			applyMethod = "FICC客户"
 		} else {
-			//获取销售信息
-			sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 1)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "申请失败"
-				br.ErrMsg = "获取销售信息失败,Err:" + err.Error()
-				return
-			}
-			if sellerItem != nil {
-				CompanyIdType = 3
-				applyMethod = "FICC客户"
-			} else {
-				CompanyIdType = 1
-				applyMethod = "潜在客户"
-			}
-			if detailId > 0 {
-				applyMethod = applyMethod + "," + title
-			}
+			CompanyIdType = 1
+			applyMethod = "潜在客户"
 		}
-		openIpItem, _ := models.GetUserRecordByMobile(4, cnf.ConfigValue)
-		if openIpItem != nil && openIpItem.OpenId != "" {
-			if req.ApplyMethod != 2 {
-				req.RealName = user.RealName
-				req.CompanyName = user.CompanyName
-			}
-			utils.FileLog.Info("推送消息 %s %s,%s,%s,%s", req.RealName, req.CompanyName, mobile, openIpItem.OpenId, applyMethod)
-			go services.SendPermissionApplyTemplateMsg(req.RealName, req.CompanyName, mobile, applyMethod, openIpItem)
+		if detailId > 0 {
+			applyMethod = applyMethod + "," + title
 		}
 	}
+	//openIpItem, _ := models.GetUserRecordByMobile(4, cnf.ConfigValue)
+	//if openIpItem != nil && openIpItem.OpenId != "" {
+	//	if req.ApplyMethod != 2 {
+	//		req.RealName = user.RealName
+	//		req.CompanyName = user.CompanyName
+	//	}
+	//	utils.FileLog.Info("推送消息 %s %s,%s,%s,%s", req.RealName, req.CompanyName, mobile, openIpItem.OpenId, applyMethod)
+	//	go services.SendPermissionApplyTemplateMsg(req.RealName, req.CompanyName, mobile, applyMethod, openIpItem)
+	//}
+	go services.SendPermissionApplyTemplateMsgAdmin(req, mobile, applyMethod, isResearch)
+
 	err = models.AddApplyRecord(&req, user.Mobile, user.CompanyName, uid, user.CompanyId, CompanyIdType)
 	if err != nil {
 		br.Msg = "申请失败"

+ 43 - 0
services/article.go

@@ -644,3 +644,46 @@ func GetArticleStockMap() (mapResp map[string]int, err error) {
 	}
 	return
 }
+
+// 用户报告操作行为,模板消息推送 (先放在活动模块下,避免代码冲突)
+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)
+		}
+	}()
+	countUser, err := models.GetUserRemind(user.UserId)
+	if err != nil {
+		return err
+	}
+	if countUser == 0 {
+		return err
+	}
+	var sourceMsg string
+	if source == 1 {
+		sourceMsg = "阅读报告"
+	} else {
+		sourceMsg = "收藏报告"
+	}
+
+	//获取销售手机号
+	sellerItemQy, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	if sellerItemQy != nil {
+		openIdList, err := models.GetUserRecordListByMobile(4, sellerItemQy.Mobile)
+		if err != nil {
+			fmt.Println(err)
+			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)
+	}
+	return
+}

+ 30 - 0
services/user.go

@@ -553,3 +553,33 @@ func GetUserhasPermission(user *models.WxUserItem) (hasPermission int, err error
 	}
 	return
 }
+
+// SendPermissionApplyTemplateMsgAdmin 处理试用申请给王芳,汪洋发消息
+func SendPermissionApplyTemplateMsgAdmin(req models.ApplyTryReq, usermobile, applyMethod string, isResearch bool) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("处理试用申请给王芳,汪洋发消息失败, ErrMsg: "+err.Error(), 3)
+		}
+	}()
+	var configCode string
+	//如果是研选的就推送给汪洋跟王芳,否则就推送给王芳
+	if isResearch {
+		configCode = utils.TPL_MSG_WANG_FANG_WANG_YANG
+	} else {
+		configCode = utils.TPL_MSG
+	}
+	cnf, e := models.GetConfigByCode(configCode)
+	if e != nil {
+		err = errors.New("GetConfigByCode, Err: " + e.Error() + configCode)
+		return
+	}
+	openIdList, e := models.GetUserRecordListByMobile(4, cnf.ConfigValue)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetUserRecordListByMobile, Err: " + e.Error() + cnf.ConfigValue)
+		return err
+	}
+	for _, v := range openIdList {
+		go SendPermissionApplyTemplateMsg(req.RealName, req.CompanyName, usermobile, applyMethod, v)
+	}
+	return
+}

+ 78 - 50
services/wechat_send_msg.go

@@ -13,7 +13,7 @@ import (
 	"time"
 )
 
-//访谈申请
+// 访谈申请
 func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
 	var msg string
 	defer func() {
@@ -60,7 +60,7 @@ func SendInterviewApplyTemplateMsg(realName, companyName, mobile, articleTitle s
 	return
 }
 
-//访谈申请取消
+// 访谈申请取消
 func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleTitle string, itemOpenid *models.OpenIdList) (err error) {
 	var msg string
 	defer func() {
@@ -102,7 +102,7 @@ func SendInterviewApplyCancelTemplateMsg(realName, companyName, mobile, articleT
 	return
 }
 
-//权限申请
+// 权限申请
 func SendPermissionApplyTemplateMsg(realName, companyName, mobile, applyMethod string, itemOpenid *models.OpenIdList) (err error) {
 	var msg string
 	defer func() {
@@ -115,53 +115,81 @@ func SendPermissionApplyTemplateMsg(realName, companyName, mobile, applyMethod s
 		}
 	}()
 
-	var accessToken string
-	if utils.RunMode == "release" {
-		accessToken, err = models.GetWxAccessTokenByXzs()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	} else {
-		accessToken, err = models.GetWxAccessToken()
-		if err != nil {
-			msg = "GetWxAccessToken Err:" + err.Error()
-			return
-		}
-		if accessToken == "" {
-			msg = "accessToken is empty"
-			return
-		}
-	}
+	//var accessToken string
+	//if utils.RunMode == "release" {
+	//	accessToken, err = models.GetWxAccessTokenByXzs()
+	//	if err != nil {
+	//		msg = "GetWxAccessToken Err:" + err.Error()
+	//		return
+	//	}
+	//	if accessToken == "" {
+	//		msg = "accessToken is empty"
+	//		return
+	//	}
+	//} else {
+	//	accessToken, err = models.GetWxAccessToken()
+	//	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 := applyMethod
+	//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}
+	//if utils.RunMode == "release" {
+	//	sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
+	//} else {
+	//	sendMap["template_id"] = utils.WxMsgTemplateIdApply
+	//}
+	//sendMap["data"] = sendData
+	//sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
+	//fmt.Println("send end")
 
-	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 := applyMethod
-	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}
-	if utils.RunMode == "release" {
-		sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
-	} else {
-		sendMap["template_id"] = utils.WxMsgTemplateIdApply
-	}
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, itemOpenid, mobile, utils.TEMPLATE_MSG_CYGX_APPLY)
-	fmt.Println("send end")
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark string
+	var redirectUrl string
+	keyword1 = "权限申请:" + realName + "【" + companyName + "】"
+	keyword2 = mobile
+	keyword3 = time.Now().Format(utils.FormatDateTime)
+	keyword4 = applyMethod
+	openIdArr := make([]string, 0)
+	openIdArr = append(openIdArr, itemOpenid.OpenId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.First = first
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.Remark = remark
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = mobile
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 
@@ -244,7 +272,7 @@ type SendWxTemplate struct {
 	OpenIdArr      []string `description:"消息接收者openid"`
 }
 
-//推送模板消息
+// 推送模板消息
 func PublicSendTemplateMsg(sendInfo *SendWxTemplate) (err error) {
 	postData, err := json.Marshal(sendInfo)
 	if err != nil {

+ 102 - 55
services/wx_template_msg.go

@@ -127,7 +127,7 @@ func SendTemplateMsg(sendUrl string, data []byte, resource string, sendType int,
 }
 
 // 活动带问提醒
-func SendActivityAskApplyTemplateMsgV2(keyword1, keyword2, keyword3, keyword4, remark string, itemOpenid *models.OpenIdList, itemAct *models.ActivityDetail) (err error) {
+func SendActivityAskApplyTemplateMsgV2(keyword1, keyword2, keyword3, keyword4, remark string, itemOpenid *models.OpenIdList, itemAct *models.ActivityDetail, msgId int) (err error) {
 	var msg string
 	defer func() {
 		if err != nil {
@@ -139,58 +139,40 @@ func SendActivityAskApplyTemplateMsgV2(keyword1, keyword2, keyword3, keyword4, r
 		}
 	}()
 
-	var accessToken string
-	accessToken, err = models.GetWxAccessTokenByXzs()
-	if err != nil {
-		msg = "GetWxAccessToken Err:" + err.Error()
-		return
-	}
-	if accessToken == "" {
-		msg = "accessToken is empty"
-		return
-	}
-	activityId := itemAct.ArticleId
-	//fmt.Println("itemAct.Host", itemAct.Host)
-	if itemAct.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN && itemAct.Host != "" {
-		keyword2 += ",会议主持人:" + itemAct.Host
-	}
-	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
-	sendMap := make(map[string]interface{})
-	sendData := make(map[string]interface{})
+	activityId := itemAct.ActivityId
+	var redirectUrl string
+	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+	openIdArr := make([]string, 0)
+	openIdArr = append(openIdArr, itemOpenid.OpenId)
+	sendInfo := new(SendWxTemplate)
+	sendInfo.Keyword1 = keyword1
+	sendInfo.Keyword2 = keyword2
+	sendInfo.Keyword3 = keyword3
+	sendInfo.Keyword4 = keyword4
+	sendInfo.Remark = remark
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	sendInfo.Resource = strconv.Itoa(activityId)
 
-	first := "有新的客户提问"
-	//keyword1 := applyName
-	//keyword2 := "-"
-	//keyword3 := applyTime
-	//keyword4 := askContent
-	//remark := activityName
-	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}
-	sendData["remark"] = map[string]interface{}{"value": remark, "color": fontColor}
-	if utils.RunMode == "release" {
-		sendMap["template_id"] = utils.WxMsgTemplateIdApplyXzs
+	//mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
+	if utils.RunMode != "release" {
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD
 	} else {
-		sendMap["template_id"] = utils.WxMsgTemplateIdApply
+		redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=2"
 	}
-	sendMap["miniprogram"] = map[string]interface{}{"appid": utils.WxAppId, "pagepath": "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId)}
-	sendMap["data"] = sendData
-	sendTemplateMsg(sendUrl, sendMap, itemOpenid, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ACTIVITY_ADD)
-	fmt.Println("send end")
+
+	sendInfo.OpenIdArr = openIdArr
+	err = PublicSendTemplateMsg(sendInfo)
 	return
 }
 
 // 微路演新增留言提问消息提醒
-func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.WxUserItem, resourceId int) (err error) {
+func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.WxUserItem, resourceId, msgId int, title string, isResearch bool) (err error) {
 	var msg string
 	defer func() {
 		if err != nil || msg != "" {
-			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("发送微路演新增留言提问消息提醒失败,用户名", req.Title, "ID:", req.Id), 2)
-			utils.FileLog.Info("发送模版消息失败,Err:%s", err.Error())
 		}
 	}()
 
@@ -207,13 +189,18 @@ func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.W
 	var keyword3 string
 	var keyword4 string
 	var remark string
+	var mobile string
 	first = req.Title + "有新的留言,请及时处理"
 	keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
 	keyword3 = time.Now().Format(utils.FormatDateTime)
-	keyword2 = ""
+	keyword2 = title
 	keyword4 = req.Content
-
-	mobile := companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic
+	if isResearch {
+		//研选报告添加汪洋
+		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())
@@ -223,15 +210,29 @@ func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.W
 	for _, v := range openIdList {
 		openIdArr = append(openIdArr, v.OpenId)
 	}
+	mapSource := make(map[int]string)
+	mapSource[1] = "5"
+	mapSource[2] = "4"
+	mapSource[3] = "3"
+
+	if mapSource[resourceId] == "" {
+		err = errors.New("留言消息类型错误, resourceId: " + strconv.Itoa(resourceId))
+		return
+	}
 
 	//SourceType int    `description:"视频来源: 1-音频; 2-活动视频; 3-微路演视频 (不传默认为1)"`
+	//mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
 	redirectUrl := ""
-	if req.SourceType == 3 {
-		redirectUrl = utils.WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT + strconv.Itoa(resourceId)
-		remark = "点击进入产业资源包详情页"
+	if utils.RunMode != "release" {
+		if req.SourceType == 3 {
+			redirectUrl = utils.WX_MSG_PATH_ACTIVITY_INDUSTRYR_EPORT + strconv.Itoa(resourceId)
+			remark = "点击进入产业资源包详情页"
+		} else {
+			redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(resourceId)
+			remark = "点击查看活动详情"
+		}
 	} else {
-		redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(resourceId)
-		remark = "点击查看活动详情"
+		redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=" + mapSource[resourceId]
 	}
 	sendInfo := new(SendWxTemplate)
 	sendInfo.First = first
@@ -240,20 +241,22 @@ func SendWxMsgWithMicroRoadshowAsk(req models.AddVideoCommnetReq, user *models.W
 	sendInfo.Keyword3 = keyword3
 	sendInfo.Keyword4 = keyword4
 	sendInfo.Remark = remark
-	sendInfo.TemplateId = utils.WxMsgTemplateIdAskMsgXzs
+	sendInfo.TemplateId = utils.WxMsgTemplateIdApplyXzs
 	sendInfo.RedirectUrl = redirectUrl
 	sendInfo.RedirectTarget = 3
 	sendInfo.Resource = strconv.Itoa(req.Id)
 	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_COMMENT
 	sendInfo.OpenIdArr = openIdArr
 	err = PublicSendTemplateMsg(sendInfo)
+
 	if err != nil {
 		return
 	}
 	return
 }
 
-func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail) (err error) {
+// 发送用户留言提醒
+func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.WxUserItem, articleInfo *models.ArticleDetail, msgId int) (err error) {
 	var msg string
 	defer func() {
 		if err != nil {
@@ -281,11 +284,11 @@ func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.
 
 	first = "【" + articleInfo.Title + "】有新的留言,请及时处理"
 	keyword1 = user.CompanyName + "——" + user.RealName + "(" + companyItem.SellerName + ")"
-	keyword2 = "-"
+	keyword2 = "留言:" + articleInfo.Title
 	keyword3 = time.Now().Format(utils.FormatDateTime)
 	keyword4 = req.Content
 	remark = "点击查看报告详情"
-	if articleInfo.ArticleId >= utils.SummaryArticleId {
+	if articleInfo.ArticleTypeId > 0 {
 		//研选报告添加汪洋
 		mobile = companyItem.Mobile + "," + utils.WxMsgTemplateIdAskMsgMobilePublic + "," + utils.ActSendMsgMobile
 	} else {
@@ -300,7 +303,13 @@ func SendCommentWxTemplateMsg(req models.AddCygxArticleCommentReq, user *models.
 	for _, v := range openIdList {
 		openIdArr = append(openIdArr, v.OpenId)
 	}
-	redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleInfo.ArticleId)
+	//mapSource留言跳转类型,1:文章、2:活动、3:微路演视频、4:活动视频、5:活动音频
+	if utils.RunMode != "release" {
+		redirectUrl = utils.WX_MSG_PATH_ARTICLE_DETAIL + strconv.Itoa(articleInfo.ArticleId)
+	} else {
+		redirectUrl = utils.WX_MSG_PATH_TEMPLATE_MSG + "SourceId=" + strconv.Itoa(msgId) + "&SourceType=1"
+	}
+
 	sendInfo := new(SendWxTemplate)
 	sendInfo.First = first
 	sendInfo.Keyword1 = keyword1
@@ -355,3 +364,41 @@ func SendWxMsgWithActivityUserRemind(keyWord1, keyWord2 string, openIdList []*mo
 	WxSendTemplateMsg(sendUrl, sendMap, openIdList, strconv.Itoa(activityId), utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD)
 	return
 }
+
+// 发送用户阅读报告消息提醒
+func SendWxMsgWithArticleUserRemind(keyWord1, keyWord2 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("发送报告提问消息提醒模版消息失败,文章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
+	}
+	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": "--", "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)
+	return
+}

+ 4 - 0
utils/config.go

@@ -33,6 +33,7 @@ var (
 	WxMsgTemplateIdApplyCancelXzs     string //预约取消提醒(小助手)
 	WxMsgTemplateIdApply              string //申请待处理
 	WxMsgTemplateIdAskMsgMobile       string //手机号用户【XXX】发送模板消息
+	WxMsgTemplateIdAskMsgMobileAll    string //手机号用户【XXX】发送模板消rm --
 	WxMsgTemplateIdAskMsgXzs          string //手机号用户【XXX】发送模板消息模板ID(小助手)
 	IndexName                         string
 	WxMsgTemplateIdAskMsgMobilePublic string //手机号用户【XXX】发送模板消rm --
@@ -92,6 +93,7 @@ func init() {
 	}
 	WxAppId = "wxcc32b61f96720d2f"
 	WxAppSecret = "06894933fafb24dafead7eaae09c08e0"
+	WxMsgTemplateIdAskMsgMobileAll = "15557270714,18767183922,18621268829,18955528215"
 	WxMsgTemplateIdAskMsgMobilePublic = "15557270714,18767183922,18621268829"
 	if RunMode == "release" {
 		WxPublicAppId = "wxb7cb8a15abad5b8e"                                          //查研观向小助手
@@ -108,6 +110,7 @@ func init() {
 
 		IndexName = "cygx_article_v03_23"
 		ActSendMsgMobile = "15618524605"
+		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
 	} else {
 		WxPublicAppId = "wx9b5d7291e581233a"                                          //弘则投研公众号 开发者ID(AppID)
 		WxPublicAppSecret = "f4d52e34021eee262dce9682b31f8861"                        //弘则投研公众号秘钥
@@ -123,6 +126,7 @@ func init() {
 
 		IndexName = "cygx_article_v1"
 		ActSendMsgMobile = "17634786714"
+		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
 	}
 	HeadimgurlDefault = "https://hongze.oss-cn-shanghai.aliyuncs.com/static/images/202202/20220225/XFBBOUmDC5AXkfxnHiuqKpPtoofH.png"
 

+ 11 - 0
utils/constants.go

@@ -187,3 +187,14 @@ const (
 const (
 	GAO_YI_ZI_CHAN_COMPANY_ID = 5285 // 高毅资产ID
 )
+
+// 模板消息地址路由2
+const (
+	WX_MSG_PATH_TEMPLATE_MSG = "/pages-message/templateMsg/templateMsg?" //留言带问模版消息地址详情
+)
+
+const (
+	TPL_MSG_WANG_YANG           = "tpl_msg_wang_yang"           //汪洋手机号地址参数
+	TPL_MSG_WANG_FANG_WANG_YANG = "tpl_msg_wang_fang_wang_yang" //权限模板消息接收人,王芳,汪洋
+	TPL_MSG                     = "tpl_msg"                     //王芳手机号地址参数
+)