Browse Source

no message

xingzai 1 year ago
parent
commit
671af9c2cb

+ 14 - 8
controllers/activity.go

@@ -461,10 +461,6 @@ func (this *ActivityController) Detail() {
 		br.ErrMsg = "活动ID错误,Err:" + "activityId:" + strconv.Itoa(activityId)
 		return
 	}
-	// 判断是否属于研选类型的活动
-	if strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		resp.IsResearch = true
-	}
 
 	if activityInfo.ActivityTypeId == utils.C_CLASS_ACTIVITY_TYPE_ID {
 		activityInfo.IsCClassMeeting = true
@@ -601,7 +597,10 @@ func (this *ActivityController) Detail() {
 			return
 		}
 		detailResp.SignupType = mapActivitySignup[activityId]
-
+		// 暂时写死,客户需要 5.16
+		if activityInfo.ActivityId == 2992 {
+			detailResp.ActivityTypeName = "分析师线下沙龙"
+		}
 		resp.Detail = detailResp
 	} else {
 		hasPermission, sellerName, sellerMobile, popupMsg, err := services.GetUserHasPermission(user)
@@ -616,6 +615,11 @@ func (this *ActivityController) Detail() {
 		resp.SellerName = sellerName
 		resp.SellerMobile = sellerMobile
 	}
+	// 判断是否属于研选类型的活动
+	if strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+		resp.IsResearch = true
+		resp.Detail.IsResearch = true
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1481,7 +1485,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()
@@ -1529,7 +1533,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))
 					}
 				}
 			}
@@ -1537,7 +1542,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

@@ -126,8 +126,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)
@@ -311,6 +309,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
@@ -350,12 +353,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 = "获取数据失败!"
@@ -382,7 +385,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 {
@@ -594,28 +597,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 = "提交成功"

+ 203 - 0
controllers/banner.go

@@ -0,0 +1,203 @@
+package controllers
+
+import (
+	"encoding/json"
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/services"
+)
+
+// Banner
+type BannerController struct {
+	BaseAuthController
+}
+
+type BaseBannerController struct {
+	BaseCommonController
+}
+
+// @Title 列表
+// @Description 列表接口
+// @Success Ret=200 {object} cygx.CygxBannerListResp
+// @router /list [get]
+func (this *BaseBannerController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	resp := new(models.CygxBannerListResp)
+	var condition string
+	var pars []interface{}
+	condition += "	 AND art.status = 1 ORDER BY art. list_type ASC   , art.sort ASC  "
+	list, err := models.GetCygxBannerList(condition, pars, 0, 99999)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	bannerImgList, err := models.GetCygxBannerImgList()
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	mapImg := make(map[int]*models.CygxBannerImgResp)
+	for _, v := range bannerImgList {
+		mapImg[v.ImgId] = v
+	}
+
+	var listA []*models.CygxBannerResp
+	var listB []*models.CygxBannerResp
+	var listC []*models.CygxBannerResp
+	for _, v := range list {
+		v.BannerUrlResp = services.GetBannerUrlBody(v.Link)
+		if v.ListType == "A" {
+			listA = append(listA, v)
+		} else if v.ListType == "B" {
+			listB = append(listB, v)
+		} else if v.ListType == "C" {
+			listC = append(listC, v)
+		}
+	}
+
+	var listCount int
+	if len(listA) == 0 {
+		listA = make([]*models.CygxBannerResp, 0)
+	} else {
+		listCount++
+	}
+
+	if len(listB) == 0 {
+		listB = make([]*models.CygxBannerResp, 0)
+	} else {
+		listCount++
+	}
+
+	if len(listC) == 0 {
+		listC = make([]*models.CygxBannerResp, 0)
+	} else {
+		listCount++
+	}
+	//当有一列的时候过滤图片
+	if listCount == 1 {
+		if len(listA) > 0 {
+			for _, v := range listA {
+				if mapImg[v.ImgId] != nil {
+					v.IndexImg = mapImg[v.ImgId].Img1
+				}
+			}
+		}
+		if len(listB) > 0 {
+			for _, v := range listB {
+				if mapImg[v.ImgId] != nil {
+					v.IndexImg = mapImg[v.ImgId].Img1
+				}
+			}
+		}
+		if len(listC) > 0 {
+			for _, v := range listC {
+				if mapImg[v.ImgId] != nil {
+					v.IndexImg = mapImg[v.ImgId].Img1
+				}
+			}
+		}
+	}
+
+	//当有两列的时候过滤图片
+	if listCount == 2 {
+		if len(listA) > 0 {
+			for _, v := range listA {
+				if mapImg[v.ImgId] != nil {
+					v.IndexImg = mapImg[v.ImgId].Img2
+				}
+			}
+			if len(listB) > 0 {
+				for _, v := range listB {
+					if mapImg[v.ImgId] != nil {
+						v.IndexImg = mapImg[v.ImgId].Img3
+					}
+				}
+			}
+		} else {
+			if len(listB) > 0 {
+				for _, v := range listB {
+					if mapImg[v.ImgId] != nil {
+						v.IndexImg = mapImg[v.ImgId].Img2
+					}
+				}
+			}
+		}
+		if len(listC) > 0 {
+			for _, v := range listC {
+				if mapImg[v.ImgId] != nil {
+					v.IndexImg = mapImg[v.ImgId].Img3
+				}
+			}
+		}
+	}
+
+	//当有三列的时候过滤图片
+	if listCount == 3 {
+		for _, v := range listA {
+			if mapImg[v.ImgId] != nil {
+				v.IndexImg = mapImg[v.ImgId].Img2
+			}
+		}
+		for _, v := range listB {
+			if mapImg[v.ImgId] != nil {
+				v.IndexImg = mapImg[v.ImgId].Img4
+			}
+		}
+		for _, v := range listC {
+			if mapImg[v.ImgId] != nil {
+				v.IndexImg = mapImg[v.ImgId].Img4
+			}
+		}
+	}
+
+	resp.ListA = listA
+	resp.ListB = listB
+	resp.ListC = listC
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title 记录点击信息
+// @Description 记录点击信息
+// @Param	request	body cygx.CygxBannerIdReq true "type json string"
+// @Success 200 Ret=200 发布成功
+// @router /add/history [post]
+func (this *BannerController) History() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	var req models.CygxBannerIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	bannerId := req.BannerId
+	if bannerId == 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,id不可为空"
+		return
+	}
+	go services.AddCygxBannerHistory(user, bannerId)
+	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 = "操作成功"

+ 5 - 5
controllers/report.go

@@ -1099,7 +1099,7 @@ func (this *MobileReportController) SearchReport() {
 	}
 
 	if keyWord != "" {
-		go services.AddUserSearchLog(user, keyWord, 5)
+		//go services.AddUserSearchLog(user, keyWord, 5)
 	}
 	if len(resp.ListHz) == 0 {
 		resp.ListHz = make([]*models.ArticleResearchResp, 0)
@@ -1193,7 +1193,7 @@ func (this *MobileReportController) SearchResource() {
 		}
 	}
 	if keyWord != "" {
-		go services.AddUserSearchLog(user, keyWord, 4)
+		//go services.AddUserSearchLog(user, keyWord, 4)
 	}
 	resp := new(models.SearchResourceResp)
 	if len(listHz) == 0 {
@@ -1282,7 +1282,7 @@ func (this *MobileReportController) SearchReportAndResource() {
 		listHzResource = make([]*models.IndustrialManagement, 0)
 	}
 	if keyWord != "" {
-		go services.AddUserSearchLog(user, keyWord, 5)
+		//go services.AddUserSearchLog(user, keyWord, 5)
 	}
 	page = paging.GetPaging(currentIndex, pageSize, total)
 	resp.Paging = page
@@ -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 = "提交成功"

+ 6 - 0
controllers/search.go

@@ -58,6 +58,12 @@ func (this *MobileSearchController) ListHomeArtAndChart() {
 		br.ErrMsg = "请输入搜索词"
 		return
 	}
+	//添加映射关系
+	keyWord = strings.ToUpper(keyWord)
+	keyWordDetail, _ := models.GetCygxCygxIkWordMapDetail(keyWord)
+	if keyWordDetail != nil {
+		keyWord = keyWordDetail.KeyWordMap
+	}
 	user := this.User
 	if user == nil {
 		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 = "申请失败"

+ 85 - 0
models/banner.go

@@ -0,0 +1,85 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CygxBannerResp struct {
+	BannerId      int            `description:"BannerId等于0新增,大于零修改"`
+	ImgId         int            `description:"cygx_banner_img主键ID"`
+	IndexImg      string         `description:"小程序封面图"`
+	ListType      string         `description:"ABC哪一列"`
+	Title         string         `description:"标题"`
+	Link          string         `description:"链接地址"`
+	Subtitle      string         `description:"副标题"`
+	BannerUrlResp *BannerUrlResp `description:"跳转地址"`
+}
+
+type CygxBannerIdReq struct {
+	BannerId int `description:"BannerId"`
+}
+
+type GetCygxBannerImgRespDetailResp struct {
+	Detail *CygxBannerResp
+}
+
+// 通过ID获取详情
+func GetCygxBannerDetail(banneId int) (item *CygxBannerResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_banner  WHERE banner_id=? `
+	err = o.Raw(sql, banneId).QueryRow(&item)
+	return
+}
+
+// 获取数量
+func GetCygxBannerCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_banner as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}
+
+// 列表
+func GetCygxBannerList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxBannerResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_banner as art WHERE 1= 1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,?  `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+type CygxBannerListResp struct {
+	ListA []*CygxBannerResp
+	ListB []*CygxBannerResp
+	ListC []*CygxBannerResp
+}
+
+type CygxBannerImgResp struct {
+	ImgId    int    `description:"图片ID"`
+	IndexImg string `description:"小程序封面图"`
+	Img1     string `description:"图片1"`
+	Img2     string `description:"图片2"`
+	Img3     string `description:"图片3"`
+	Img4     string `description:"图片4"`
+}
+
+type BannerUrlResp struct {
+	ChartPermissionId int    `description:"行业id"`
+	SourceId          int    `description:"资源ID"`
+	Type              int    `description:"类型:1普通文本,2:文章、3:活动、4:产业、5:关于我们"`
+	Body              string `description:"内容"`
+}
+
+// 列表
+func GetCygxBannerImgList() (items []*CygxBannerImgResp, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_banner_img as art WHERE 1= 1 `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 29 - 0
models/banner_history.go

@@ -0,0 +1,29 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxBannerHistory struct {
+	Id               int `orm:"column(id);pk"`
+	BannerId         int `description:"BannerId等于0新增,大于零修改"`
+	UserId           int
+	CreateTime       time.Time
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	ModifyTime       time.Time `description:"修改时间"`
+	RealName         string    `description:"用户实际名称"`
+	SellerName       string    `description:"所属销售"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+}
+
+// 添加历史信息
+func AddCygxBannerHistory(item *CygxBannerHistory) (lastId int64, err error) {
+	o := orm.NewOrm()
+	item.ModifyTime = time.Now()
+	lastId, err = o.Insert(item)
+	return
+}

+ 1 - 0
models/db.go

@@ -68,6 +68,7 @@ func init() {
 		new(CygxProductInteriorHistory),
 		new(CygxAboutUsVideoHistory),
 		new(CygxTacticsTimeLineHistory),
+		new(CygxBannerHistory),
 	)
 	// 记录ORM查询日志
 	orm.Debug = true

+ 18 - 0
models/ik_word_map.go

@@ -0,0 +1,18 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type CygxIkWordMap struct {
+	KeyWord    string `description:"手机号"`
+	KeyWordMap string `description:"地区编码 国内默认为空"`
+}
+
+// 获取详情
+func GetCygxCygxIkWordMapDetail(keyWord string) (item *CygxIkWordMap, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_ik_word_map  WHERE key_word=?  `
+	err = o.Raw(sql, keyWord).QueryRow(&item)
+	return
+}

+ 18 - 0
routers/commentsRouter.go

@@ -232,6 +232,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BannerController"],
+        beego.ControllerComments{
+            Method: "History",
+            Router: `/add/history`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseBannerController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseBannerController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseConfigController"] = append(beego.GlobalControllerRouter["hongze/hongze_clpt/controllers:BaseConfigController"],
         beego.ControllerComments{
             Method: "ResearchHb",

+ 6 - 0
routers/router.go

@@ -132,6 +132,12 @@ func init() {
 				&controllers.MobileTacticsController{},
 			),
 		),
+		web.NSNamespace("/banner",
+			web.NSInclude(
+				&controllers.BannerController{},
+				&controllers.BaseBannerController{},
+			),
+		),
 	)
 	web.AddNamespace(ns)
 }

+ 72 - 13
services/activity.go

@@ -27,7 +27,7 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 	if err != nil {
 		return
 	}
-	userType, permissionStr, err := GetUserType(user.CompanyId)
+	userType, permissionStr, permissionStrZhengShi, err := GetUserTypeZhengShi(user.CompanyId)
 	if err != nil {
 		return
 	}
@@ -54,6 +54,23 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 	permissionNameStr = strings.Replace(permissionNameStr, "(客观)", "", -1)
 	permissionNameStr = strings.TrimRight(permissionNameStr, ",")
 
+	slicePerZhengShi := strings.Split(permissionStrZhengShi, ",")
+
+	var permissionNameStrZhengShi string
+	for _, v := range slicePerZhengShi {
+		if userType == 1 {
+			//研选权限处理
+			if !strings.Contains(v, utils.CHART_PERMISSION_NAME_YANXUAN) {
+				permissionNameStrZhengShi += "'" + v + "',"
+			}
+		} else {
+			permissionNameStrZhengShi += "'" + v + "',"
+		}
+	}
+	permissionNameStrZhengShi = strings.Replace(permissionNameStrZhengShi, "(主观)", "", -1)
+	permissionNameStrZhengShi = strings.Replace(permissionNameStrZhengShi, "(客观)", "", -1)
+	permissionNameStrZhengShi = strings.TrimRight(permissionNameStrZhengShi, ",")
+
 	mapUserType, e := GetActivityCcustomerTypeList()
 	if e != nil {
 		err = e
@@ -253,7 +270,7 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 
 	if adminIds != "" {
 		if userType == 3 {
-			conditionAdmin += `  AND art.chart_permission_name  IN (` + permissionNameStr + `) `
+			conditionAdmin += `  AND art.chart_permission_name  IN (` + permissionNameStrZhengShi + `) `
 		}
 		conditionOr += ` OR (  art.customer_type_ids LIKE '%` + userTypeStr + `%' ` + ` AND  art.admin_id IN (` + adminIds + `) ` + conditionAdmin + `) `
 		if companyProduct != nil {
@@ -290,7 +307,7 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 		}
 	}
 	if userType == 3 {
-		condition += `  AND art.chart_permission_name  IN (` + permissionNameStr + `) `
+		condition += `  AND art.chart_permission_name  IN (` + permissionNameStrZhengShi + `) `
 	}
 	conditionActivity = condition + permissionSqlStr + sqlExport + conditionOr
 	return
@@ -799,11 +816,36 @@ func GetIndustryNewLabelMap(industryIds []int) (labelMap map[int]bool, err error
 func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.ActivityDetail) (havePower bool, err error) {
 	var companyDetailStatus string
 	var userTypeStr string
-	if user.CompanyId == utils.HZ_COMPANY_ID || activityInfo.ChartPermissionName == utils.HONG_GUAN_NAME {
+	if GetBelongingRai(user.Mobile) || activityInfo.ChartPermissionName == utils.HONG_GUAN_NAME {
 		havePower = true
 		return
 	}
-	userType, permissionStr, e := GetUserType(user.CompanyId)
+	//处理决策人可见权限
+	if user.IsMaker == 0 && activityInfo.IsMakerShow == 1 {
+		havePower = false
+		return
+	}
+	// 处理本组可见权限
+	if activityInfo.VisibleRange == 1 {
+		adminIds, e := models.GetSelleridWhichGroup(user.CompanyId, 2)
+		if e != nil {
+			err = errors.New("GetSelleridWhichGroup, Err: " + e.Error())
+			return
+		}
+		haveVisibleRange := false
+		adminIdSlice := strings.Split(adminIds, ",")
+
+		for _, v := range adminIdSlice {
+			if v == strconv.Itoa(activityInfo.AdminId) {
+				haveVisibleRange = true
+			}
+		}
+		if !haveVisibleRange {
+			havePower = false
+			return
+		}
+	}
+	userType, permissionStr, permissionStrZhengShi, e := GetUserTypeZhengShi(user.CompanyId)
 	if e != nil {
 		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
 		return
@@ -811,6 +853,10 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 	if permissionStr == "" {
 		return
 	}
+	//如果是易董的活动且属于研选类型,只要开通任何权限就可以查看详情
+	if activityInfo.YidongActivityId != "" && permissionStr != "" && strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
+		havePower = true
+	}
 	if activityInfo.LimitPeopleNum > 0 {
 		mapUserType, e := GetActivityCcustomerTypeList()
 		if e != nil {
@@ -825,6 +871,11 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 				//return
 			}
 		}
+	} else {
+		if strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+			havePower = true
+			return
+		}
 	}
 	//判断管理规模是否满足
 	companyProduct, e := models.GetCompanyProductDetail(user.CompanyId, 2)
@@ -869,9 +920,22 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 	} else if (activityInfo.ActivityTypeId == 1 || activityInfo.ActivityTypeId == 3 || activityInfo.ActivityTypeId == 4 || activityInfo.ActivityTypeId == 5) && strings.Contains(permissionStr, "专家") {
 		havePower = true
 	}
-	if (strings.Contains(activityInfo.ChartPermissionName, "研选") || activityInfo.ChartPermissionName == "策略") && strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
-		havePower = true
-		return
+	//if (strings.Contains(activityInfo.ChartPermissionName, "研选") || activityInfo.ChartPermissionName == "策略") && strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+	//	havePower = true
+	//	return
+	//}
+	if strings.Contains(activityInfo.ChartPermissionName, "研选") || activityInfo.ChartPermissionName == "策略" {
+		if strings.Contains(activityInfo.CustomerTypeIds, "5") {
+			if strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
+				havePower = true
+				return
+			}
+		} else {
+			if strings.Contains(permissionStrZhengShi, activityInfo.ChartPermissionName) {
+				havePower = true
+				return
+			}
+		}
 	}
 	if activityInfo.ActivityTypeId == 2 || activityInfo.ActivityTypeId == 6 || activityInfo.ActivityTypeId == 7 {
 		if strings.Contains(permissionStr, activityInfo.ChartPermissionName+"(主观)") {
@@ -891,11 +955,6 @@ func GetActivityDetailUserPower(user *models.WxUserItem, activityInfo *models.Ac
 		return
 	}
 
-	//如果是易董的活动且属于研选类型,只要开通任何权限就可以查看详情
-	if activityInfo.YidongActivityId != "" && permissionStr != "" && strings.Contains(activityInfo.ChartPermissionName, utils.CHART_PERMISSION_NAME_YANXUAN) {
-		havePower = true
-	}
-
 	permissionShengji, errs := models.GetCompanyPermissionByUserTrip(user.CompanyId)
 	if errs != nil {
 		err = errs

+ 11 - 11
services/activity_signup.go

@@ -59,17 +59,17 @@ func CheckActivitySignUpLimit(user *models.WxUserItem, activityInfo *models.Acti
 			return
 		}
 	}
-	totalRestrict, e := models.GetUserRestrictCount(user.Mobile)
-	if e != nil {
-		err = errors.New("GetUserRestrictCount, Err: " + e.Error())
-		return
-	}
-	if totalRestrict >= 1 {
-		signupStatus = "BreakPromise"
-		popupMsg = "由于爽约次数过多,您暂时被限制报名资格,请联系对口销售"
-		failType = 3
-		return
-	}
+	//totalRestrict, e := models.GetUserRestrictCount(user.Mobile)
+	//if e != nil {
+	//	err = errors.New("GetUserRestrictCount, Err: " + e.Error())
+	//	return
+	//}
+	//if totalRestrict >= 1 {
+	//	signupStatus = "BreakPromise"
+	//	popupMsg = "由于爽约次数过多,您暂时被限制报名资格,请联系对口销售"
+	//	failType = 3
+	//	return
+	//}
 	return
 
 }

+ 1 - 1
services/admin.go

@@ -6,7 +6,7 @@ import (
 )
 
 func GetAdminMobileMap() (mapItem map[string]string, err error) {
-	adminList, e := models.GetAdminByRole()
+	adminList, e := models.GetRaiAdmin()
 	if e != nil {
 		err = e
 		return

+ 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
+}

+ 75 - 0
services/banner.go

@@ -0,0 +1,75 @@
+package services
+
+import (
+	"hongze/hongze_clpt/models"
+	"hongze/hongze_clpt/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// GetBannerUrlBody 处理banner的连接并做跳转处理
+func GetBannerUrlBody(url string) (itemResp *models.BannerUrlResp) {
+	//2:文章详情  https://web.hzinsights.com/material/info/8436
+	//3:活动详情  https://web.hzinsights.com/activity/detail/2701
+	//4:产业详情  https://web.hzinsights.com/indepth/info/20/79
+	//5:关于我们  https://clpttest.hzinsights.com/about
+	//6:产品内测 https://clpttest.hzinsights.com/internal/article/29
+	material := "material/info"
+	activity := "activity/detail"
+	indepth := "indepth/info"
+	about := "/about"
+	internal := "internal/article"
+	item := new(models.BannerUrlResp)
+	item.Body = url
+	urlSlice := strings.Split(url, "/")
+	lenurlSlice := len(urlSlice)
+	sourceId, _ := strconv.Atoi(urlSlice[lenurlSlice-1])
+	item.SourceId = sourceId
+	if strings.Contains(url, material) {
+		item.Type = 2
+	} else if strings.Contains(url, activity) {
+		item.Type = 3
+	} else if strings.Contains(url, indepth) {
+		if lenurlSlice >= 2 {
+			chartPermissionId, _ := strconv.Atoi(urlSlice[lenurlSlice-2])
+			item.ChartPermissionId = chartPermissionId
+		}
+		item.Type = 4
+	} else if strings.Contains(url, about) {
+		item.Type = 5
+	} else if strings.Contains(url, internal) {
+		item.Type = 6
+	} else {
+		item.Type = 1
+	}
+	itemResp = item
+	return
+}
+
+func AddCygxBannerHistory(user *models.WxUserItem, bannerId int) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg("产品内测用户浏览信息记录失败"+err.Error(), 2)
+		}
+	}()
+	historyRecord := new(models.CygxBannerHistory)
+	historyRecord.UserId = user.UserId
+	historyRecord.BannerId = bannerId
+	historyRecord.CreateTime = time.Now()
+	historyRecord.Mobile = user.Mobile
+	historyRecord.Email = user.Email
+	historyRecord.CompanyId = user.CompanyId
+	historyRecord.CompanyName = user.CompanyName
+	historyRecord.RegisterPlatform = utils.REGISTER_PLATFORM
+	sellerItem, err := models.GetSellerByCompanyIdCheckFicc(user.CompanyId, 2)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	historyRecord.RealName = user.RealName
+	if sellerItem != nil {
+		historyRecord.SellerName = sellerItem.RealName
+	}
+	_, err = models.AddCygxBannerHistory(historyRecord)
+	return
+}

+ 67 - 4
services/keyword.go

@@ -1,15 +1,16 @@
 package services
 
 import (
+	"errors"
 	"fmt"
 	"hongze/hongze_clpt/models"
 	"hongze/hongze_clpt/utils"
 	"time"
 )
 
-//AddSearchKeyWord 记录用户搜索关键词
+// AddSearchKeyWord 记录用户搜索关键词
 func AddSearchKeyWord(user *models.WxUserItem, keyWord string, source int) (err error) {
-	cacheKey := fmt.Sprint("Search_uid:", user.UserId, "_KeyWord:", keyWord, "_Source:", source)
+	cacheKey := fmt.Sprint("Search_uid:", user.UserId, "_KeyWord:", keyWord)
 	isExist := utils.Rc.IsExist(cacheKey)
 	if isExist {
 		return err
@@ -32,14 +33,15 @@ func AddSearchKeyWord(user *models.WxUserItem, keyWord string, source int) (err
 	_, err = models.AddSearchKeyWord(keyWordItem)
 	go AddUserSearchLog(user, keyWord, source)
 	//一分钟之内的相同搜索词不重复记录
-	setNX := utils.Rc.SetNX(cacheKey, keyWord, time.Minute*1)
+	setNX := utils.Rc.SetNX(cacheKey, keyWord, time.Second*3)
 	if !setNX {
 		go utils.SendAlarmMsg("记录用户搜索关键词失败,设置Redis Key 过期时间失败:key"+cacheKey, 3)
 	}
+	go SearchKeywordUserRmind(user, keyWord)
 	return
 }
 
-//AddUserSearchLog 记录用户搜索关键词的日志
+// AddUserSearchLog 记录用户搜索关键词的日志
 func AddUserSearchLog(user *models.WxUserItem, keyWord string, source int) (err error) {
 	defer func() {
 		if err != nil {
@@ -61,3 +63,64 @@ func AddUserSearchLog(user *models.WxUserItem, keyWord string, source int) (err
 	_, err = models.AddSearchKeyWordLog(item)
 	return
 }
+
+// 用户搜索操作操作行为,模板消息推送
+func SearchKeywordUserRmind(user *models.WxUserItem, keyWord string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go utils.SendAlarmMsg("用户搜索操作操作行为,模板消息推送失败"+err.Error(), 2)
+		}
+	}()
+	countUser, err := models.GetUserRemind(user.UserId)
+	if err != nil {
+		return err
+	}
+	if countUser == 0 {
+		return err
+	}
+	var first string
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var remark 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
+		}
+		first = fmt.Sprint(user.RealName, "--", user.CompanyName, ",有新的互动:搜索")
+		keyword1 = first
+		keyword2 = "搜索关键词:" + keyWord
+		openIdArr := make([]string, 0)
+		for _, v := range openIdList {
+			openIdArr = append(openIdArr, v.OpenId)
+		}
+		redirectUrl := ""
+		sendInfo := new(SendWxTemplate)
+		sendInfo.First = first
+		sendInfo.Keyword1 = keyword1
+		sendInfo.Keyword2 = keyword2
+		sendInfo.Keyword3 = keyword3
+		sendInfo.Keyword4 = keyword4
+		sendInfo.Remark = remark
+		sendInfo.TemplateId = utils.WxMsgTemplateIdArticleUserRemind
+		sendInfo.RedirectUrl = redirectUrl
+		sendInfo.RedirectTarget = 3
+		sendInfo.Resource = "0"
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+		sendInfo.OpenIdArr = openIdArr
+		err = PublicSendTemplateMsg(sendInfo)
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 120 - 0
services/user.go

@@ -137,6 +137,96 @@ func GetUserType(companyId int) (userType int, permissionStrnew string, err erro
 	return
 }
 
+func GetUserTypeZhengShi(companyId int) (userType int, permissionStrnew, permissionStrZhengShinew string, err error) {
+	var permissionStr, permissionZhengShiStr string
+	if companyId <= 1 {
+		userType = 0
+	} else {
+		total, errs := models.GetCountCompanyDetailByIdGroup(companyId)
+		if errs != nil {
+			err = errs
+			return
+		}
+		if total == 0 {
+			userType = 0
+		} else {
+			companyDetail, errs := models.GetCompanyDetailByIdGroup(companyId)
+			if errs != nil {
+				err = errs
+				return
+			}
+			permissionStr, errs = models.GetCompanyPermission(companyId)
+			if errs != nil {
+				err = errs
+				return
+			}
+			permissionStrnew = permissionStr
+			//大套餐客户,数据库添加标识,
+			companyUserTypeDetail, errs := models.GetCygxCompanyUserType(companyId)
+			if errs != nil && errs.Error() != utils.ErrNoRow() {
+				err = errs
+				return
+			}
+			if companyUserTypeDetail != nil {
+				if companyUserTypeDetail.CustomerTypeId != 0 {
+					userType = companyUserTypeDetail.CustomerTypeId
+					return
+				}
+			}
+			permissionZhengShiStr, errs = models.GetCompanyPermissionByUserZhengShi(companyId)
+			if errs != nil {
+				err = errs
+				return
+			}
+			//1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户、 10: 30W套餐客户
+			//大套餐客户定义:医药、消费、科技、智造、策略。5个行业中任意4个及以上是正式权限的,属于大套餐客户(医药、消费、科技、智造需要主客观都开)
+			if companyDetail.Status == "永续" {
+				userType = 1
+			} else if companyDetail.Status == "试用" {
+				userType = 5
+			} else if companyDetail.Status == "冻结" {
+				userType = 6
+			} else if companyDetail.Status == "流失" {
+				userType = 7
+			}
+			//大套餐客户定义:医药、消费、科技、智造、策略。5个行业中任意4个及以上是正式权限的,属于大套餐客户(医药、消费、科技、智造需要主客观都开)
+			if userType == 0 && companyDetail.Status == "正式" {
+				var permissionZhegnshiNum int
+				if strings.Count(permissionZhengShiStr, "医药") == 2 {
+					permissionZhegnshiNum++
+				}
+				if strings.Count(permissionZhengShiStr, "消费") == 2 {
+					permissionZhegnshiNum++
+				}
+				if strings.Count(permissionZhengShiStr, "科技") == 2 {
+					permissionZhegnshiNum++
+				}
+				if strings.Count(permissionZhengShiStr, "智造") == 2 {
+					permissionZhegnshiNum++
+				}
+				if strings.Count(permissionZhengShiStr, "策略") == 1 {
+					permissionZhegnshiNum++
+				}
+				if strings.Count(permissionZhengShiStr, "路演服务") == 1 {
+					permissionZhegnshiNum++
+				}
+				//if permissionZhegnshiNum == 6 {
+				//	userType = 2
+				//} else
+				//大套餐客户,数据库添加标识,条件大于等于四的都是 30W套餐客户
+				if permissionZhegnshiNum >= 4 {
+					userType = 10
+				} else {
+					userType = 3
+				}
+			}
+		}
+	}
+	permissionStrnew = permissionStr
+	permissionStrZhengShinew = permissionZhengShiStr
+	return
+}
+
 // 用户绑定
 func BindWxUser(mobile, countryCode string) (wxUser *models.WxUserItem, err error) {
 	if mobile == "" {
@@ -463,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"                     //王芳手机号地址参数
+)