瀏覽代碼

Merge branch 'yx_1.1'

zwxi 11 月之前
父節點
當前提交
3cd473505a

+ 28 - 0
controllers/cygx/activity.go

@@ -728,21 +728,43 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				errAct = err
 				if activityInfo.PublishStatus == 1 && activityInfo.ActivityTimeText != item.ActivityTimeText {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.ActivityTimeText, "timeType")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						activityTime, err := time.Parse(utils.FormatDateTime, item.ActivityTime)
+						if err != nil {
+							br.Msg = "转换失败"
+							br.ErrMsg = "转换失败,Err:" + err.Error()
+							return
+						}
+						activityTimeStr := activityTime.Format(utils.FormatDateTimeMinute2)
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, activityTimeStr, "timeType")
+					}
 				}
 				oldExpert, _ := cygx.GetReportContentTextSub(activityInfo.Expert)
 				newExpert, _ := cygx.GetReportContentTextSub(item.Expert)
 				if activityInfo.PublishStatus == 1 && oldExpert != newExpert {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, oldExpert, newExpert, "expertType")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, newExpert, "expertType")
+					}
 				}
 				if activityInfo.PublishStatus == 1 && activityInfo.Address != item.Address {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.Address, item.Address, "addressType")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.Address, "addressType")
+					}
 				}
 				if activityInfo.PublishStatus == 1 && activityInfo.ParticipationCode != item.ParticipationCode {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ParticipationCode, item.ParticipationCode, "participationCode")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.ParticipationCode, "participationCode")
+					}
 				}
 
 				if activityInfo.PublishStatus == 1 && activityInfo.Theme != item.Theme {
 					go services.SendWxMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.Theme, item.Theme, "Theme")
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.Theme, "Theme")
+					}
 				}
 
 				//对于限制人数的活动,如果修改改了可见范围,对于新增的那一部分做新的推送
@@ -766,6 +788,9 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				//修改活动人数限制之后,对于因为人数已满而失败的用户,推送模板消息
 				if activityInfo.PublishStatus == 1 && activityInfo.IsLimitPeople != 0 && activityInfo.LimitPeopleNum != strconv.Itoa(req.LimitPeopleNum) {
 					go cygxService.SendWxMsgWithCygxActivityUpdateLimitPeople(req.ActivityId)
+					if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateLimitPeople(activityId)
+					}
 				}
 				go cygxService.YiDongSaveRoadshowDetail(activityId)
 
@@ -1290,6 +1315,9 @@ func (this *ActivityCoAntroller) PublishAndCancel() {
 		go services.SendWxMsgWithCygxActivity(req.ActivityId)
 		//同步活动到最新数据表
 		//go cygxService.UpdateResourceData(req.ActivityId, "activity", "delete", "")
+		if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+			go services.SendWxCategoryMsgWithCygxActivity(req.ActivityId)
+		}
 	}
 	item.ActivityId = req.ActivityId
 	if item.PublishStatus == 1 {

+ 5 - 0
controllers/cygx/activity_signup.go

@@ -939,6 +939,7 @@ func (this *ActivitySignupCoAntroller) SalonSignupEdit() {
 	//销售或后台管理员给用户添加报名之后,进行模版消息推送
 	if doFailType == 0 {
 		go cygxService.SendWxMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
+		go services.SendWxCategoryMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
 	}
 	//添加操作日志记录
 	br.Ret = 200
@@ -2055,6 +2056,7 @@ func (this *ActivitySignupCoAntroller) AddSignuUser() {
 	//销售或后台管理员给用户添加报名之后,进行模版消息推送
 	if len(itemsSendWxMsg) > 0 {
 		go cygxService.SendWxMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
+		go services.SendWxCategoryMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
 	}
 	if len(items) > 0 {
 		//1用户报名添加到处理研选扣点
@@ -2480,6 +2482,9 @@ func (this *ActivitySignupCoAntroller) SignupCancel() {
 		return
 	}
 	go cygxService.YanXuanActivityPointsBillSignupCancel(detail.ActivityId, detail.UserId, adminInfo.AdminId)
+	if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN{
+		go services.SendWxCategoryMsgWithYxActivityCancelSignUpBySell(detail.UserId, activityInfo.ActivityId)
+	}
 	//添加操作日志记录
 	br.IsAddLog = true
 	br.Ret = 200

+ 3 - 0
controllers/cygx/yanxuan_special.go

@@ -9,6 +9,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/company"
 	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services"
 	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/services/elastic"
 	"hongze/hz_crm_api/utils"
@@ -536,8 +537,10 @@ func (this *YanxuanSpecialController) Enable() {
 	}
 	if req.Status == 1 {
 		go cygxService.SendWxMsgSpecialFollow(req.Id)
+		go services.SendWxCategoryMsgSpecialFollow(req.Id)
 	}
 	go cygxService.SendWxMsgSpecialAuthor(req.Id, req.Status) // 研选专栏审核完成时,给提交人发送模板消息
+	go services.SendWxCategoryMsgSpecialAuthor(req.Id, req.Status) // 研选专栏审核完成时,给提交人发送模板消息
 	go cygxService.UpdateYanxuanSpecialResourceData(req.Id)   //  写入首页最新  cygx_resource_data 表
 	go elastic.EsAddYanxuanSpecial(req.Id)                    //  写入es 综合搜索
 	br.Msg = "审批成功"

+ 1 - 1
models/cygx/cygx_user_record.go

@@ -143,7 +143,7 @@ func GetCygxUserFllowDepartmentOpenid(articleId int) (items []*OpenIdList, err e
 			cr.cygx_user_id  as user_id 
 		FROM
 			cygx_article_department_follow AS f
-			INNER JOIN cygx_user_record AS cr ON cr.cygx_user_id = f.user_id 
+			INNER JOIN cygx_user_record AS cr ON cr.cygx_bind_account = f.mobile 
 			INNER JOIN cygx_article AS a ON a.department_id = f.department_id 
 		WHERE
 			 1=1   

+ 24 - 0
models/user_record.go

@@ -106,3 +106,27 @@ func GetUserRecordRegisterByUserIdsMyfx(userIds string) (items []*UserRecordRegi
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// 根据手机号获取用户的openid
+func GeCygxtUserRecordListByMobile(bindAccount string) (items []*OpenIdList, err error) {
+	var sql string
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql = `SELECT
+			cr.open_id,
+			cr.cygx_user_id as  user_id 
+		FROM
+		  cygx_user_record  as cr 
+		WHERE 1= 1	AND cygx_bind_account IN (` + bindAccount + `)`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetWxOpenIdByMobileList(mobile string) (items []*OpenIdList, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT
+				union_id,open_id,
+				cygx_user_id AS user_id
+				FROM cygx_user_record	WHERE	1 = 1	AND cygx_bind_account IN (` + mobile + `)`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 10 - 0
models/wx_user.go

@@ -625,3 +625,13 @@ func GetCompanyFollowCount(companyId int) (count int, err error) {
 	err = o.Raw(sql, companyId).QueryRow(&count)
 	return
 }
+
+// 根据用户ID获取相关信息
+func GetWxUserItemByUserId(userId int) (item *WxUserItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.*,b.company_name FROM wx_user AS a
+			LEFT JOIN company AS b on a.company_id=b.company_id
+			WHERE a.user_id=? `
+	err = o.Raw(sql, userId).QueryRow(&item)
+	return
+}

+ 18 - 0
services/company_approval_message.go

@@ -215,6 +215,22 @@ func AddCompanyApprovalMessageRai(companyId, companyContractId int, applyRealNam
 		return
 	}
 	go SendWxMsgWithRaiSell(first, keyword1, keyword2, keyword3, keyword4, openIdList)
+
+	list, e := company.GetCompanyContractPermissionByCompanyContractId(companyContractId)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCompanyContractPermissionByCompanyContractId, Err: " + e.Error())
+		return
+	}
+
+	if len(list) == 0 {
+		return
+	}
+
+	for _, v := range list {
+		if v.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN || v.ChartPermissionId == utils.YAN_XUAN_KOU_DIAN_BAO_ID {
+			go SendWxCategoryMsgWithRaiSell(companyName, "销售:"+applyRealName, "已签约研选", time.Now().Format(utils.FormatDateTimeMinute2), openIdList)
+		}
+	}
 	return
 }
 
@@ -267,6 +283,7 @@ func AddCompanyApprovalMessageWangYang(companyId, companyContractId int, applyRe
 		keyword2 = time.Now().Format(utils.FormatDateTime)
 		keyword3 = "签约【研选订阅】"
 		go SendWxMsgWithRaiWangYang(keyword1, keyword2, keyword3, keyword4, openIdList)
+		go SendWxCategoryMsgWithRaiWangYang(companyName, "销售:"+applyRealName, keyword3, time.Now().Format(utils.FormatDateTimeMinute2), openIdList)
 	}
 
 	if points > 0 {
@@ -274,6 +291,7 @@ func AddCompanyApprovalMessageWangYang(companyId, companyContractId int, applyRe
 		keyword2 = time.Now().Format(utils.FormatDateTime)
 		keyword3 = "签约【研选扣点包(" + fmt.Sprint(points) + "个点)】"
 		go SendWxMsgWithRaiWangYang(keyword1, keyword2, keyword3, keyword4, openIdList)
+		go SendWxCategoryMsgWithRaiWangYang(companyName, "销售:"+applyRealName, keyword3, time.Now().Format(utils.FormatDateTimeMinute2), openIdList)
 	}
 
 	return

+ 34 - 1
services/cygx/acitvity.go

@@ -854,7 +854,10 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 	if err != nil {
 		return
 	}
-
+	industrialList, err := cygx.GetIndustrialActivityGroupManagementList(activityId, 1)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
 	if activityInfo.VisibleRange == 1 {
 		return //只要是仅对本组可见的活动,发布时,模板消息统一不发送, p2_876
 	}
@@ -1299,6 +1302,36 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 		err = errors.New("SendTemplateMsg, Err: " + e.Error())
 		return
 	}
+
+	industrialName := ""
+	for _, v := range industrialList {
+		industrialName += v.IndustryName + ","
+	}
+	industrialName = strings.TrimRight(industrialName, ",")
+	// 发类目模版消息
+	if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		actTime,_ := time.Parse(utils.FormatDateTime,activityInfo.ActivityTime)
+		first := industrialName
+		keyword1 := "发布了新活动"
+		keyword2 := utils.TruncateActivityNameString(activityInfo.ActivityName)
+		keyword3 := actTime.Format(utils.FormatDateTimeMinute2)
+
+		redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+		sendInfo := new(services.SendWxCategoryTemplate)
+		sendInfo.Keywords = []string{first, keyword1, keyword2, keyword3}
+
+		sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+		sendInfo.RedirectUrl = redirectUrl
+		sendInfo.RedirectTarget = 3
+		sendInfo.Resource = strconv.Itoa(activityId)
+		sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
+		sendInfo.OpenIdArr = openIdArr
+		e := services.SendCategoryTemplateMsg(sendInfo)
+		if e != nil {
+			err = errors.New("SendTemplateMsg, Err: " + e.Error())
+			return
+		}
+	}
 	return
 }
 

+ 160 - 0
services/cygx/activity_poster.go

@@ -405,3 +405,163 @@ func MakeActivityMomentsImg(activityId int) {
 		return
 	}
 }
+
+// MakeMfyxActivitySigninImg 生成mfyx太阳码并上传OSS
+//func MakeMfyxActivitySigninImg(activityId int) (imgUrl string, err error) {
+//	var msg string
+//	defer func() {
+//		if err != nil || msg != "" {
+//			fmt.Println(err)
+//			utils.FileLog.Info("MakeMfyxActivitySigninImg Err:", err.Error())
+//			go alarm_msg.SendAlarmMsg("扫码签到日志记录,失败,活动ID:"+strconv.Itoa(activityId)+err.Error()+";msg:"+msg, 3)
+//		}
+//	}()
+//	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+//	if e != nil {
+//		err = errors.New("活动不存在, Err: " + e.Error())
+//		return
+//	}
+//	if activityInfo == nil {
+//		return
+//	}
+//	if activityInfo.ActivityTypeId != 5 && activityInfo.ActivityTypeId != 6 && activityInfo.ActivityTypeId != 8 {
+//		return
+//	}
+//	itemToken, err := models.GetWxToken(utils.WxMfyxAppId, utils.WxMfyxAppSecret)
+//	if err != nil {
+//		return
+//	}
+//	if itemToken.AccessToken == "" {
+//		msg = "accessToken is empty"
+//		return
+//	}
+//	var envVersion string
+//	var resourceUrl string
+//	if utils.RunMode == "release" {
+//		envVersion = "release"
+//	} else {
+//		envVersion = "trial"
+//	}
+//	url := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + itemToken.AccessToken
+//	method := "POST"
+//	payload := strings.NewReader(`{
+//		"page":"` + utils.WX_MSG_PATH_ACTIVITY_SIGNIN + `",
+//		"scene":"` + strconv.Itoa(activityId) + `",
+//		"env_version":"` + envVersion + `",
+//		"check_path":false,
+//		"auto_color":true
+//				}`)
+//	client := &http.Client{}
+//	req, err := http.NewRequest(method, url, payload)
+//	if err != nil {
+//		msg = "获取微信二维码失败,Err:" + err.Error()
+//		return
+//	}
+//	req.Header.Add("Content-Type", "application/json")
+//	postBody, err := client.Do(req)
+//	if err != nil {
+//		msg = "获取微信二维码失败,Err:" + err.Error()
+//		return
+//	}
+//	defer postBody.Body.Close()
+//	uploadDir := "static/img/share/"
+//	uuid := utils.GetRandStringNoSpecialChar(28)
+//	if !utils.FileIsExist(uploadDir) {
+//		err = os.MkdirAll(uploadDir, 0755)
+//		if err != nil {
+//			msg = "生成文件夹失败,Err:" + err.Error()
+//			return
+//		}
+//	}
+//	imagePath := uploadDir + uuid + ".jpg"
+//	switch header := postBody.Header.Get("Content-Type"); {
+//	case strings.HasPrefix(header, "application/json"):
+//		tokenResp := ReturnBodyRule{}
+//		decoder := json.NewDecoder(postBody.Body)
+//		if decodeErr := decoder.Decode(&tokenResp); decodeErr != nil {
+//			msg = "获取微信二维码失败,Err:" + decodeErr.Error()
+//			return
+//		}
+//	case strings.HasPrefix(header, "image"):
+//		reply, e := ioutil.ReadAll(postBody.Body)
+//		if e != nil {
+//			err = e
+//			msg = "获取微信二维码失败,Err:" + err.Error()
+//			return
+//		}
+//		imageContent, e := os.Create(imagePath)
+//		if e != nil {
+//			err = e
+//			msg = "获取微信二维码失败,Err:" + err.Error()
+//			return
+//		}
+//		writeStringRes, e := io.WriteString(imageContent, string(reply))
+//		if e != nil {
+//			err = e
+//			fmt.Println(writeStringRes)
+//			return
+//		}
+//		closeErr := imageContent.Close()
+//		if closeErr != nil {
+//			err = closeErr
+//			return
+//		}
+//		randStr := utils.GetRandStringNoSpecialChar(28)
+//		fileName := randStr + ".jpg"
+//		savePath := uploadDir + time.Now().Format("200601/20060102/")
+//		savePath += fileName
+//		//上传到阿里云
+//		err = services.UploadFileToAliyun(fileName, imagePath, savePath)
+//		if err != nil {
+//			fmt.Println("文件上传失败,Err:" + err.Error())
+//			return
+//		}
+//		fileHost := "https://hzstatic.hzinsights.com/"
+//		resourceUrl = fileHost + savePath
+//		defer func() {
+//			os.Remove(imagePath)
+//		}()
+//	default:
+//		msg = "生成二维码失败"
+//		return
+//	}
+//
+//	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_activity_sigin_html)
+//	if e != nil {
+//		err = errors.New("GetCygxConfigDetailByCode 获取配置签到码格式信息失败, Err: " + e.Error())
+//		return
+//	}
+//	configValue := detailConfig.ConfigValue
+//	configValue = strings.Replace(configValue, "{{TITLE}}", activityInfo.ActivityName, -1)
+//	configValue = strings.Replace(configValue, "{{IMG}}", resourceUrl, -1)
+//	configValue = strings.Replace(configValue, "{{PLEASE}}", "请扫码确认签到", -1)
+//	configValue = strings.Replace(configValue, "{{SHOWTEXT}}", "将签到成功页面出示给接待人员", -1)
+//	htm2ImgReq := make(map[string]interface{})
+//	htm2ImgReq["html_content"] = configValue
+//	htm2ImgReq["width"] = 1364
+//	htm2ImgReq["height"] = 2060
+//	res, err := postHtml2Img(htm2ImgReq)
+//	if err != nil || res == nil {
+//		msg = "html转图片请求失败"
+//		return
+//	}
+//	if res.Code != 200 {
+//		msg = "html转图片请求失败"
+//		err = errors.New("html转图片失败: " + res.Msg)
+//		return
+//	}
+//	imgUrl = res.Data
+//	// 记录海报信息
+//
+//	err = cygx.UpdateCygxActivitySigninImg(imgUrl, activityId)
+//	if err != nil {
+//		return
+//	}
+//	item := new(cygx.CygxActivityPoster)
+//	item.ActivityId = activityId
+//	item.ImgXcx = resourceUrl
+//	item.ImgPoster = imgUrl
+//	item.CreateTime = time.Now()
+//	err = cygx.AddCygxActivityPoster(item)
+//	return
+//}

+ 24 - 1
services/cygx/research_summary.go

@@ -367,14 +367,17 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 							if mapUserIdChooseSend[openIditem.UserId] == 0 {
 								services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 								mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+								// 研选发类目模板消息
+								go services.SendWxCategoryMsgWithCygxActivityAppointmentNew("您预约的调研,有新报告发布", "已发布", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 							}
 
 							//如果小助手勾选了对应的权限信息 就做正常推送
 							if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" {
 								services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 								mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+								// 研选发类目模板消息
+								go services.SendWxCategoryMsgWithCygxActivityAppointmentNew("您预约的调研,有新报告发布", "已发布", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 							}
-
 						}
 					}
 				}
@@ -402,11 +405,15 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			if mapUserIdChooseSend[openIditem.UserId] == 0 {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 				mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(articleInfo.NickName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 			//如果小助手勾选了对应的权限信息 就做正常推送
 			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidDepartmentFllow[openIditem.UserId] != "" {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 				mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(articleInfo.NickName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 		}
 		//优先推送3: 关注产业
@@ -430,11 +437,15 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			if mapUserIdChooseSend[openIditem.UserId] == 0 {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 				mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 			//如果小助手勾选了对应的权限信息 就做正常推送
 			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
 				mapOpenidPushed[openIditem.UserId] = openIditem.OpenId
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 		}
 		//针对哪些没有关注作者,没有关注产业,没有预约纪要的人的推送
@@ -452,10 +463,14 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 			//如果有权限而且小助手没有提交过信息的 就做正常推送
 			if mapUserIdChooseSend[openIditem.UserId] == 0 {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 			//如果小助手勾选了对应的权限信息 就做正常推送
 			if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" {
 				services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+				// 研选发类目模板消息
+				go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 		}
 
@@ -489,10 +504,14 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 				//如果有权限而且小助手没有提交过信息的 就做正常推送
 				if mapUserIdChooseSend[openIditem.UserId] == 0 {
 					services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+					// 研选发类目模板消息
+					go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 				}
 				//如果小助手勾选了对应的权限信息 就做正常推送
 				if mapUserIdChooseSend[openIditem.UserId] != 0 && mapUserFllowCeLue[openIditem.UserId] != "" {
 					services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+					// 研选发类目模板消息
+					go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 				}
 			}
 		} else {
@@ -505,10 +524,14 @@ func DoArticleOnenIdWxTemplateMsg(articleId int, source int) (err error) {
 				//如果有权限而且小助手没有提交过信息的 就做正常推送
 				if mapUserIdChooseSend[openIditem.UserId] == 0 {
 					services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+					// 研选发类目模板消息
+					go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 				}
 				//如果小助手勾选了对应的权限信息 就做正常推送
 				if mapUserIdChooseSend[openIditem.UserId] != 0 && mapOpenidFllow[openIditem.UserId] != "" {
 					services.SendWxMsgWithCygxActivityAppointmentNew(first, keyword1, keyword2, keyword3, keyword4, openIditem, articleId)
+					// 研选发类目模板消息
+					go services.SendWxCategoryMsgWithCygxActivityAppointmentNew(industryName, "发布了新报告", utils.TruncateActivityNameString(articleInfo.Title), articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 				}
 			}
 		}

+ 828 - 0
services/wechat_send_category_template_msg.go

@@ -0,0 +1,828 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"html"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+	"strings"
+	"time"
+)
+
+type SendWxCategoryTemplate struct {
+	WxAppId        string   `description:"公众号appId"`
+	Keywords       []string `description:"模板消息keyword字段"`
+	TemplateId     string   `description:"模板id"`
+	RedirectUrl    string   `description:"跳转地址"`
+	RedirectTarget int      `description:"小程序跳转目标:1:弘则研报小程序,2:随手办公小程序,3:查研观向,4:买方研选"`
+	Resource       string   `description:"资源唯一标识"`
+	SendType       int      `description:"发送的消息类型:1:报告,2:指标更新提醒,3:审批通知,4:销售领取客户通知,5:活动取消通知,6活动更改时间通知,7:关注的作者发布报告通知,8:发送日报(周报、双周报、月报)模板消息,9:活动预约/报名时间通知"`
+	OpenIdArr      []string `description:"消息接收者openid"`
+}
+
+// 推送类目模板消息
+func SendCategoryTemplateMsg(sendInfo *SendWxCategoryTemplate) (err error) {
+	postData, err := json.Marshal(sendInfo)
+	if err != nil {
+		alarm_msg.SendAlarmMsg("SendCategoryTemplateMsg json.Marshal Err:"+err.Error(), 1)
+		return err
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(postData)))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", utils.SendWxCategoryTemplateMsgUrl, body)
+	if err != nil {
+		alarm_msg.SendAlarmMsg("SendCategoryTemplateMsg http.NewRequest Err:"+err.Error(), 1)
+		return err
+	}
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", utils.SendTemplateMsgAuthorization)
+	resp, err := client.Do(req)
+	if err != nil {
+		fmt.Println("http client.Do Err:" + err.Error())
+		return err
+	}
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		return err
+	}
+	result := new(models.BaseResponse)
+	err = json.Unmarshal(b, &result)
+	if err != nil {
+		return err
+	}
+	if result.Ret != 200 {
+		err = errors.New(string(b))
+		return err
+	}
+	return
+}
+
+// 活动更改时间消息通知
+func SendWxCategoryMsgWithCygxActivityUpdateTime(activityId int, oldStr, newStr, strType string) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("发送类目模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLogCygx.Info(fmt.Sprintf("发送类目模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+		if msg != "" {
+			utils.FileLogCygx.Info("发送类目模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	activityInfo, err := cygx.GetAddActivityInfoById(activityId)
+	if err != nil {
+		msg = "GetReportInfo Err:" + err.Error()
+		return
+	}
+	if activityInfo == nil {
+		utils.FileLogCygx.Info("活动信息不存在")
+		return
+	}
+
+	var openIdList []*cygx.OpenIdList
+
+	openIdList, err = cygx.GetActivityOpenIdList(activityId)
+	if err != nil {
+		msg = "get openIdList err:" + err.Error()
+		return
+	}
+
+	mapOpenid := make(map[int]string)
+	for _, v := range openIdList {
+		mapOpenid[v.UserId] = v.OpenId
+	}
+	//添加预约纪要的openid
+	openIdListAppointment, err := cygx.GetActivityAppointmentOpenIdList(activityId)
+	if err != nil {
+		msg = "GetActivityAppointmentOpenIdList err:" + err.Error()
+		return
+	}
+	if len(openIdListAppointment) > 0 {
+		for _, v := range openIdListAppointment {
+			if _, ok := mapOpenid[v.UserId]; !ok {
+				item := new(cygx.OpenIdList)
+				item.UserId = v.UserId
+				item.OpenId = v.OpenId
+				openIdList = append(openIdList, item)
+			}
+			mapOpenid[v.UserId] = v.OpenId
+
+		}
+	}
+
+	//添加带问的openid
+	openIdListActivityHelpAsk, err := cygx.GetActivityHelpAskOpenIdList(activityId)
+	if err != nil {
+		msg = "openIdListActivityHelpAsk err:" + err.Error()
+		return
+	}
+	if len(openIdListActivityHelpAsk) > 0 {
+		for _, v := range openIdListActivityHelpAsk {
+			if _, ok := mapOpenid[v.UserId]; !ok {
+				item := new(cygx.OpenIdList)
+				item.UserId = v.UserId
+				item.OpenId = v.OpenId
+				openIdList = append(openIdList, item)
+			}
+			mapOpenid[v.UserId] = v.OpenId
+		}
+	}
+
+	if len(openIdList) == 0 {
+		return err
+	}
+	//sendMap := make(map[string]interface{})
+	//sendData := make(map[string]interface{})
+	var keyword1, keyword2, keyword3, redirectUrl string
+
+	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
+	if strType == "timeType" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了时间变更"
+		//keyword2 = "时间变更为-- " + newStr
+		keyword2 = "时间变更为"
+	} else if strType == "expertType" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了专家变更"
+		//keyword2 = "专家变更为--" + newStr
+		keyword2 = "专家变更"
+	} else if strType == "addressType" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了地址变更"
+		//keyword2 = "地点变更为--" + newStr
+		keyword2 = "地点变更"
+	} else if strType == "participationCode" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】公布了拨入密码"
+		//keyword2 = "拨入密码为--" + newStr
+		keyword2 = "拨入密码"
+	} else if strType == "Theme" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】更新了活动主题"
+		newStr = strings.Replace(newStr, "</p><p>", "\n", -1)
+		newStr = html.EscapeString(newStr)
+		newStrHtml, _ := cygx.GetReportContentTextSub(newStr)
+		newStr = newStrHtml
+		//keyword2 = "主题变更为--" + newStr
+		keyword2 = "主题变更"
+	}
+
+	keyword1 = utils.TruncateActivityNameString(activityInfo.ActivityName)
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		openIdArr[i] = v.OpenId
+	}
+
+	keyword3 = utils.TruncateActivityNameString(newStr)
+
+	redirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId) + "&IsSendWx=1"
+	sendInfo := new(SendWxCategoryTemplate)
+	//sendInfo.WxAppId = utils.WxAppId
+	sendInfo.Keywords = []string{keyword1, keyword2, keyword3}
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityChangeApply
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 4
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_UPDATE
+	sendInfo.OpenIdArr = openIdArr
+	e := SendCategoryTemplateMsg(sendInfo)
+	if e != nil {
+		err = errors.New("推送模板消息失败" + e.Error())
+		return
+	}
+	return
+}
+
+// 活动取消消息通知
+func SendWxCategoryMsgWithCygxActivity(activityId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("发送类目模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLogCygx.Info(fmt.Sprintf("发送类目模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+		if msg != "" {
+			utils.FileLogCygx.Info("发送类目模版消息失败,msg:%s", msg)
+		}
+	}()
+	activityInfo, err := cygx.GetAddActivityInfoById(activityId)
+	if err != nil {
+		msg = "GetReportInfo Err:" + err.Error()
+		return
+	}
+	var openIdList []*cygx.OpenIdList
+	openIdList, err = cygx.GetActivityOpenIdList(activityId)
+	if err != nil {
+		msg = "get GetActivityOpenIdList err:" + err.Error()
+		return
+	}
+	mapOpenid := make(map[int]string)
+	for _, v := range openIdList {
+		mapOpenid[v.UserId] = v.OpenId
+	}
+	//添加预约纪要的openid
+	openIdListAppointment, err := cygx.GetActivityAppointmentOpenIdList(activityId)
+	if err != nil {
+		msg = "GetActivityAppointmentOpenIdList err:" + err.Error()
+		return
+	}
+	if len(openIdListAppointment) > 0 {
+		for _, v := range openIdListAppointment {
+			if _, ok := mapOpenid[v.UserId]; !ok {
+				item := new(cygx.OpenIdList)
+				item.UserId = v.UserId
+				item.OpenId = v.OpenId
+				openIdList = append(openIdList, item)
+			}
+			mapOpenid[v.UserId] = v.OpenId
+
+		}
+	}
+
+	//添加带问的openid
+	openIdListActivityHelpAsk, err := cygx.GetActivityHelpAskOpenIdList(activityId)
+	if err != nil {
+		msg = "openIdListActivityHelpAsk err:" + err.Error()
+		return
+	}
+	if len(openIdListActivityHelpAsk) > 0 {
+		for _, v := range openIdListActivityHelpAsk {
+			if _, ok := mapOpenid[v.UserId]; !ok {
+				item := new(cygx.OpenIdList)
+				item.UserId = v.UserId
+				item.OpenId = v.OpenId
+				openIdList = append(openIdList, item)
+			}
+			mapOpenid[v.UserId] = v.OpenId
+		}
+	}
+	activityInfo.ActivityTypeName = strings.Replace(activityInfo.ActivityTypeName, "(C类)", "", -1)
+	if len(openIdList) == 0 {
+		return err
+	}
+	var keyword1, keyword2, keyword3, redirectUrl string
+	keyword1 = utils.TruncateActivityNameString(activityInfo.ActivityName)
+	keyword2 = "活动已取消"
+	keyword3 = time.Now().Format(utils.FormatDateTimeMinute)
+
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		openIdArr[i] = v.OpenId
+	}
+	redirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId) + "&IsSendWx=1"
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = append(sendInfo.Keywords, keyword1, keyword2, keyword3)
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityCancleApply
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 4
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_CACLE
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// 修改活动人数限制之后,对于因为人数已满而失败的用户,推送模板消息
+func SendWxCategoryMsgWithCygxActivityUpdateLimitPeople(activityId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("修改活动人数限制之后,对于因为人数已满而失败的用户,推送模板消息,发送模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLogCygx.Info(fmt.Sprintf("发送类目模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+	}()
+	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("活动不存在, Err: " + e.Error())
+		return
+	}
+	if activityInfo == nil {
+		return
+	}
+	//已经推送过的不做二次推送
+	listSendOpendId, err := models.GeUserTemplateRecordListBysendType(utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE, strconv.Itoa(activityId))
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+	mapSendOpenid := make(map[string]int)
+	for _, v := range listSendOpendId {
+		mapSendOpenid[v.OpenId] = v.UserId
+	}
+
+	var condition string
+	var pars []interface{}
+
+	condition = ` AND do_fail_type = 1 AND  activity_id = ?  `
+	pars = append(pars, activityId)
+	listSignup, e := cygx.GetActivitySignupList(condition, pars)
+	if e != nil {
+		err = errors.New("GetResourceDataList, Err: " + e.Error())
+		return
+	}
+	var mobileArr []string
+	for _, v := range listSignup {
+		if v.Mobile != "" {
+			mobileArr = append(mobileArr, v.Mobile)
+		}
+	}
+	mobileLen := len(mobileArr)
+	if mobileLen == 0 {
+		return
+	}
+	//condition = ""
+	//pars = make([]interface{}, 0)
+	//condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
+	//pars = append(pars, mobileArr)
+
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
+	if e != nil {
+		err = errors.New("GetWxOpenIdBList, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		if mapSendOpenid[v.OpenId] > 0 {
+			continue
+		}
+		openIdArr[i] = v.OpenId
+	}
+	keyword1 := utils.TruncateActivityNameString(activityInfo.ActivityName)
+	keyword2 := "活动名额增加"
+	keyword3 := "名额增至" + activityInfo.LimitPeopleNum + "人,欢迎报名"
+
+	redirectUrl := utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = []string{keyword1, keyword2, keyword3}
+
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityChangeApply
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 4
+	sendInfo.Resource = strconv.Itoa(activityId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ACTIVITY_LIMIT_PEOPLE
+	sendInfo.OpenIdArr = openIdArr
+	e = SendCategoryTemplateMsg(sendInfo)
+	if e != nil {
+		err = errors.New("SendTemplateMsg, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 推送预约研选的纪要活动、策略报告、研选报告
+func SendWxCategoryMsgWithCygxActivityAppointmentNew(keyword1, keyword2, keyword3, keyword4 string, item *cygx.OpenIdList, articleId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("查研观向,推送预约研选的纪要活动、策略报告、研选报告,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLog.Info(fmt.Sprintf("发送类目模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+
+	var openIdList []*cygx.OpenIdList
+	openIdList = append(openIdList, item)
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		openIdArr[i] = v.OpenId
+	}
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4}
+
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+	sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo.RedirectTarget = 4
+	sendInfo.Resource = strconv.Itoa(articleId)
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// SendWxCategoryMsgWithRaiSell 权益销售客户申请转正后,消息群发给所有销售
+func SendWxCategoryMsgWithRaiSell(keyword1, keyword2, keyword3, keyword4 string, openIdList []*cygx.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("权益销售客户申请转正后,消息群发给所有销售,Err:"+err.Error()+";msg:"+msg, 3)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送类目模版消息失败,msg:%s", msg)
+		}
+	}()
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		openIdArr[i] = v.OpenId
+	}
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4}
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdCompanyApprovalMessageRai
+	sendInfo.RedirectUrl = ""
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	fmt.Println(sendInfo)
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// SendWxCategoryMsgWithRaiWangYang 客户研选行业转正时(王芳审批通过),模板消息提醒 董衡、高亦文、吴昂迪和沈涛
+func SendWxCategoryMsgWithRaiWangYang(keyword1, keyword2, keyword3, keyword4 string, openIdList []*cygx.OpenIdList) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println("err:", err)
+			go alarm_msg.SendAlarmMsg("客户研选行业转正时(王芳审批通过),类目模板消息提醒汪洋,Err:"+err.Error()+";msg:"+msg, 3)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送类目模版消息失败,msg:%s", msg)
+		}
+	}()
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		openIdArr[i] = v.OpenId
+	}
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4}
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdCompanyApprovalMessageRai
+	sendInfo.RedirectUrl = ""
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	return
+}
+
+// 销售或后台管理员给用户添加报名之后,进行模版消息推送-研选类目模版
+func SendWxCategoryMsgWithCygxActivitySignUpBySell(items []*cygx.CygxSignupUser) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("修改活动人数限制之后,对于因为人数已满而失败的用户,推送模板消息,发送类目模版消息失败,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLogCygx.Info(fmt.Sprintf("发送类目模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+	}()
+
+	if len(items) == 0 {
+		return
+	}
+	//var condition string
+	//var pars []interface{}
+
+	for _, v := range items {
+		activityId := v.ActivityId
+		uid := v.UserId
+		activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+		if e != nil {
+			err = errors.New("活动不存在, Err: " + e.Error())
+			return
+		}
+		//只发研选的
+		if activityInfo.ChartPermissionId != utils.CHART_PERMISSION_ID_YANXUAN {
+			continue
+		}
+		if activityInfo == nil {
+			return
+		}
+		wxUser, e := models.GetWxUserItemByUserId(uid)
+		if e != nil {
+			err = errors.New("查询用户信息失败, Err: " + e.Error())
+			return
+		}
+		var mobileArr []string
+		mobileArr = append(mobileArr, wxUser.Mobile)
+		mobileLen := len(mobileArr)
+		if mobileLen == 0 {
+			return
+		}
+		//condition = ""
+		//pars = make([]interface{}, 0)
+		//condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
+		//pars = append(pars, mobileArr)
+
+		openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
+		if e != nil {
+			err = errors.New("GetWxOpenIdBList, Err: " + e.Error())
+			return
+		}
+		if len(openIdList) == 0 {
+			return
+		}
+		openIdArr := make([]string, len(openIdList))
+		for i, v := range openIdList {
+			fmt.Println(v.OpenId)
+			openIdArr[i] = v.OpenId
+		}
+		resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
+
+		keyword1 := "销售已为您报名"
+		keyword2 := "报名成功"
+		keyword3 := utils.TruncateActivityNameString(activityInfo.ActivityName)
+		keyword4 := resultTime.Format(utils.FormatDateTimeMinute2)
+
+		sendInfo := new(SendWxCategoryTemplate)
+		sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4}
+		sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+		sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+		sendInfo.RedirectTarget = 4
+		sendInfo.SendType = utils.TEMPLATE_MSG_APPLY
+		sendInfo.OpenIdArr = openIdArr
+		err = SendCategoryTemplateMsg(sendInfo)
+		if e != nil {
+			err = errors.New("SendCategoryTemplateMsg, Err: " + e.Error())
+			return
+		}
+
+		if activityInfo.ActivityTypeId == 5 {
+			sellerItem, tmpErr := cygx.GetSellerByCompanyIdCheckFicc(wxUser.CompanyId, 2)
+			if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+				err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+				return
+			}
+			configCode := utils.TPL_MSG_NEI_RONG_ZU
+			cnfNeiRong, tmpErr := cygx.GetConfigByCode(configCode)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			mobileArr = append(mobileArr, sellerItem.Mobile, utils.MobileShenTao)
+			cnfNeiRongArr := strings.Split(cnfNeiRong.ConfigValue, ",")
+			for _, v := range cnfNeiRongArr {
+				mobileArr = append(mobileArr, v)
+			}
+			openIdList, e = cygx.GetUserRecordListByMobileArr(mobileArr)
+			if e != nil {
+				err = errors.New("GetWxOpenIdBList, Err: " + e.Error())
+				return
+			}
+			openIdArr := make([]string, len(openIdList))
+			for i, v := range openIdList {
+				fmt.Println(v.OpenId)
+				openIdArr[i] = v.OpenId
+			}
+			// 专家线下沙龙再发一条给口销售和内容组4人(高:15000123056,董:15216736473,冯:18652179672,吴:18701809782)和沈涛
+			keyword1 := wxUser.RealName
+			keyword2 := wxUser.CompanyName
+			keyword3 := sellerItem.RealName
+			keyword4 := resultTime.Format(utils.FormatDateTimeMinute2)
+			keyword5 := utils.TruncateActivityNameString("报名:"+activityInfo.ActivityName)
+
+			sendInfo := new(SendWxCategoryTemplate)
+			sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4, keyword5}
+			sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityApply
+			sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+			sendInfo.RedirectTarget = 4
+			sendInfo.SendType = utils.TEMPLATE_MSG_APPLY
+			sendInfo.OpenIdArr = openIdArr
+			err = SendCategoryTemplateMsg(sendInfo)
+			if e != nil {
+				err = errors.New("SendCategoryTemplateMsg, Err: " + e.Error())
+				return
+			}
+		}
+	}
+	return
+}
+
+// 研选专栏审核完成时,给提交人发送类目模板消息
+func SendWxCategoryMsgSpecialAuthor(specialId, status int) (err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("研选专栏审核完成时,给提交人发送类目模板消息 specialId:", specialId, err.Error()), 2)
+		}
+	}()
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+	var redirectUrl string
+
+	specialItem, e := cygx.GetYanxuanSpecialItemById(specialId)
+	if e != nil {
+		err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
+		return
+	}
+	user, e := models.GetWxUserItemByUserId(specialItem.UserId)
+	if e != nil {
+		err = errors.New("GetWxUserItemByUserId, Err: " + e.Error())
+		return err
+	}
+
+	openIdList, err := models.GeCygxtUserRecordListByMobile(user.Mobile)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+
+	keyword1 = specialItem.Title
+	keyword2 = specialItem.NickName
+	if status == 1 {
+		keyword3 = "文章已通过审核,点击查看详情"
+		redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_DETAIL + strconv.Itoa(specialId)
+	} else {
+		keyword3 = "文章未通过审核,点击查看驳回原因"
+		redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_CENTER
+	}
+	keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+
+	keywords := []string{keyword1, keyword2, keyword3, keyword4}
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdCompanyApprovalMessageRai
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	sendInfo.RedirectUrl = redirectUrl
+	err = SendCategoryTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 研选专栏有新内容审核通过时,给关注此专栏的客户发送模板消息
+func SendWxCategoryMsgSpecialFollow(specialId int) (err error) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("研选专栏审核完成时,给提交人发送类目模板消息 specialId:", specialId, err.Error()), 2)
+		}
+	}()
+	var keyword1 string
+	var keyword2 string
+	var keyword3 string
+	var keyword4 string
+
+	followers, e := cygx.GetYanxuanSpecialFollowUserById(specialId)
+	if e != nil {
+		err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
+		return
+	}
+	if len(followers) == 0 {
+		return
+	}
+	specialItem, e := cygx.GetYanxuanSpecialItemById(specialId)
+	if e != nil {
+		err = errors.New("GetYanxuanSpecialFollowUserById, Err: " + e.Error())
+		return
+	}
+	specialAuthor, e := cygx.GetCygxYanxuanSpecialAuthorByUserId(specialItem.UserId)
+	if e != nil {
+		err = errors.New("GetCygxYanxuanSpecialAuthorByUserId, Err: " + e.Error())
+		return
+	}
+	var allInUserId string
+	for _, v := range followers {
+		allInUserId += strconv.Itoa(v) + ","
+	}
+
+	allInUserId = strings.TrimRight(allInUserId, ",")
+
+	userList, err := models.GetWxUserListByUserIds(allInUserId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return err
+	}
+
+	mobile := ``
+
+	for _, v := range userList {
+		mobile += v.Mobile + ","
+	}
+
+	mobile = strings.TrimRight(mobile, ",")
+
+	openIdList, e := models.GetWxOpenIdByMobileList(mobile)
+	if e != nil {
+		err = errors.New("GetSellerByAdminId, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+
+	keyword1 = specialAuthor.NickName
+	keyword2 = "发布了新报告"
+	keyword3 = specialItem.Title
+	keyword4 = time.Now().Format(utils.FormatDateTimeMinute2)
+	openIdArr := make([]string, 0)
+	for _, v := range openIdList {
+		openIdArr = append(openIdArr, v.OpenId)
+	}
+	redirectUrl := ""
+	redirectUrl = utils.WX_MSG_PATH_YX_SPECIAL_DETAIL + strconv.Itoa(specialId)
+	keywords := []string{keyword1, keyword2, keyword3, keyword4}
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = keywords
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityPublishApply
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_CYGX_ARTICLE_ADD
+	sendInfo.OpenIdArr = openIdArr
+	sendInfo.RedirectUrl = redirectUrl
+	err = SendCategoryTemplateMsg(sendInfo)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// 销售或后台管理员给用户取消报名之后,进行模版消息推送-研选类目模版
+func SendWxCategoryMsgWithYxActivityCancelSignUpBySell(uid, activityId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("销售或后台管理员给用户取消报名之后,进行模版消息推送-研选类目模版,Err:"+err.Error()+";msg:"+msg, 3)
+			utils.FileLogCygx.Info(fmt.Sprintf("发送类目模版消息失败,Err:%s,%s", err.Error(), msg))
+		}
+	}()
+
+	//var condition string
+	//var pars []interface{}
+
+	activityInfo, e := cygx.GetAddActivityInfoById(activityId)
+	if e != nil {
+		err = errors.New("活动不存在, Err: " + e.Error())
+		return
+	}
+
+	wxUser, e := models.GetWxUserItemByUserId(uid)
+	if e != nil {
+		err = errors.New("查询用户信息失败, Err: " + e.Error())
+		return
+	}
+	var mobileArr []string
+	mobileArr = append(mobileArr, wxUser.Mobile)
+	mobileLen := len(mobileArr)
+	if mobileLen == 0 {
+		return
+	}
+	//condition = ""
+	//pars = make([]interface{}, 0)
+	//condition += ` AND u.mobile IN (` + utils.GetOrmInReplace(mobileLen) + `)`
+	//pars = append(pars, mobileArr)
+	sellerItem, e := cygx.GetSellerByCompanyIdCheckFicc(wxUser.CompanyId, 2)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetSellerByCompanyIdCheckFicc, Err: " + e.Error())
+		return
+	}
+	configCode := utils.TPL_MSG_NEI_RONG_ZU
+	cnfNeiRong, err := cygx.GetConfigByCode(configCode)
+	if err != nil {
+		return
+	}
+	mobileArr = append(mobileArr, sellerItem.Mobile, utils.MobileShenTao)
+	cnfNeiRongArr := strings.Split(cnfNeiRong.ConfigValue, ",")
+	for _, v := range cnfNeiRongArr {
+		mobileArr = append(mobileArr, v)
+	}
+	openIdList, e := cygx.GetUserRecordListByMobileArr(mobileArr)
+	if e != nil {
+		err = errors.New("GetWxOpenIdBList, Err: " + e.Error())
+		return
+	}
+	if len(openIdList) == 0 {
+		return
+	}
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		fmt.Println(v.OpenId)
+		openIdArr[i] = v.OpenId
+	}
+	resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
+	keyword1 := wxUser.RealName
+	keyword2 := wxUser.CompanyName
+	keyword3 := sellerItem.RealName
+	keyword4 := resultTime.Format(utils.FormatDateTimeMinute2)
+	keyword5 := utils.TruncateActivityNameString("取消报名:"+activityInfo.ActivityName)
+
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4, keyword5}
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityApply
+	sendInfo.RedirectUrl = utils.WX_MSG_PATH_YX_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+	sendInfo.RedirectTarget = 4
+	sendInfo.SendType = utils.TEMPLATE_MSG_APPLY
+	sendInfo.OpenIdArr = openIdArr
+	err = SendCategoryTemplateMsg(sendInfo)
+	if e != nil {
+		err = errors.New("SendCategoryTemplateMsg, Err: " + e.Error())
+		return
+	}
+	return
+}

+ 23 - 0
utils/common.go

@@ -29,6 +29,7 @@ import (
 	"strings"
 	"time"
 	"unicode"
+	"unicode/utf8"
 )
 
 // 随机数种子
@@ -2319,3 +2320,25 @@ func GetLastDayOfQuarter(t time.Time) time.Time {
 	lastDay := time.Date(year, time.Month(nextQuarter), 1, 0, 0, 0, 0, time.UTC).AddDate(0, 1, 0).Add(-time.Second)
 	return lastDay
 }
+
+// 处理活动名称
+func TruncateActivityNameString(s string) string {
+	// 计算字符串总字数(按汉字、数字、字母和特殊符号计算)
+	totalCharCount := utf8.RuneCountInString(s)
+	// 如果总字数不超过18,则直接返回整个字符串
+	if totalCharCount <= 18 {
+		return s
+	}
+	// 计算前15个汉字所需的字节位置
+	hanziCount := 0
+	byteIndex := 0
+	for byteIndex < len(s) && hanziCount < 15 {
+		r, size := utf8.DecodeRuneInString(s[byteIndex:])
+		if r != utf8.RuneError {
+			hanziCount++
+		}
+		byteIndex += size
+	}
+	// 截取前15个汉字,并添加省略号
+	return s[:byteIndex] + "…"
+}

+ 31 - 1
utils/config.go

@@ -63,6 +63,14 @@ var (
 	WxMsgTemplateIdWithRoadshowDeleteNotice  string //路演->研究员收到活动删除通知
 	CYGX_WEB_URL                             string //查研观向web端网址
 	CYGX_MFYX_URL                            string //查研观向web端网址
+	WxMfyxAppId                              string //买方研选小程序APPID
+	WxMfyxAppSecret                          string //买方研选小程序 秘钥
+
+	WxMsgCategoryTemplateIdActivityChangeApply       string //买方研选活动变更通知-类目模板ID
+	WxMsgCategoryTemplateIdActivityCancleApply       string //买方研选活动取消通知-类目模板ID
+	WxMsgCategoryTemplateIdActivityPublishApply      string //买方研选关注的产业下,单个活动/研选报告发布通知-类目模板ID
+	WxMsgCategoryTemplateIdCompanyApprovalMessageRai string //权益销售签约成功通知买方研选类目模版消息
+	WxMsgCategoryTemplateIdActivityApply             string //后台研选活动给客户报名或取消报名模版消息
 
 	WxMsgTemplateIdWithYbCommunityQuestion string // 研报小程序->问答社区回复通知
 	WxMsgTemplateIdWithSealApplyFinished   string // 用印申请-已签回通知
@@ -138,7 +146,8 @@ var (
 // 公共api内部服务调用
 var (
 	// SendWxTemplateMsgUrl 模板消息推送
-	SendWxTemplateMsgUrl string
+	SendWxTemplateMsgUrl         string
+	SendWxCategoryTemplateMsgUrl string
 	// HandleVideoDecibelUrl 处理音频分贝的url
 	HandleVideoDecibelUrl string
 )
@@ -230,6 +239,10 @@ func init() {
 	AdminWxAppId = "wx1392111da5426e9e"
 	AdminWxAppSecret = "30eceb7cf29bf2f046031155ab55d7b4"
 
+	// 买方研选
+	WxMfyxAppId = "wx5e3240ab90c247ac"
+	WxMfyxAppSecret = "6b1316b46dc9c63429f5c1df6f51b4ac"
+
 	THS_PubKey = `-----BEGIN PUBLIC KEY-----
 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqugglfCboOEfWtHlGBOW
 40a4Y3xOs0MPBwjTOzHgcaWzx5XCc20VftGVXkWlpjs8u4dza/Bp1SV7SJ5Y7U95
@@ -273,6 +286,7 @@ ZwIDAQAB
 		WxRelease()
 
 		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
+		SendWxCategoryTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_category_template_msg"
 		HandleVideoDecibelUrl = "http://172.19.173.232:8086/v1/report/handle_video_decibel"
 		HongzeOpenApiHost = "http://127.0.0.1:8609"
 		EnglishShareUrl = "https://ybpcen.hzinsights.com"
@@ -319,6 +333,7 @@ ZwIDAQAB
 
 		WxDebug()
 		SendWxTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_template_msg"
+		SendWxCategoryTemplateMsgUrl = "http://127.0.0.1:8086/v1/wechat/send_category_template_msg"
 		HandleVideoDecibelUrl = "http://127.0.0.1:8086/v1/report/handle_video_decibel"
 		HongzeOpenApiHost = "http://127.0.0.1:8608"
 		EnglishShareUrl = "http://8.136.199.33:8301"
@@ -385,6 +400,13 @@ func WxDebug() {
 		WxMsgTemplateIdWithYbCommunityQuestion = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" // 研报小程序->问答社区回复通知
 		WxMsgTemplateIdWithSealApplyFinished = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450"   // 用印申请-已签回通知
 		UserTemplateIdByProduct = "-YjuPOB7Fqd-S3ilabYa6wvjDY9aXmeEfPN6DCiy-EY"
+
+		// 买方研选小程序
+		WxMsgCategoryTemplateIdActivityChangeApply = "M975oDGwJXSX5rv4brhF4mbhl8LLoXcY_HzSKzQOtQs"       //买方研选活动变更通知-类目模板ID
+		WxMsgCategoryTemplateIdActivityCancleApply = "NdnEwNmqTy8LSVGJNGSAEkTdG9U17Vk7dveqwroiTLM"       //买方研选活动取消通知-类目模板ID
+		WxMsgCategoryTemplateIdActivityPublishApply = "wLeV7tVK4ZJBoAvsmfXkHveVW8yefGAkwnVKQWRi8uQ"      //买方研选活动报告发布通知-类目模板ID
+		WxMsgCategoryTemplateIdCompanyApprovalMessageRai = "wU4x_c5XruwuA44VZelyklRNOfq4XrU9ILckTtDs6hg" //权益销售签约成功通知买方研选类目模版消息通知-类目模板ID
+		WxMsgCategoryTemplateIdActivityApply = "IemWOTzbnLBqJ2ozSiFqm13WjaotoC3V4uXaxTij08I"             //后台研选活动给客户报名或取消报名模版消息
 	}
 
 	//查研观向小助手
@@ -423,6 +445,14 @@ func WxRelease() {
 		WxMsgTemplateIdWithYbCommunityQuestion = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450" // 研报小程序->问答社区回复通知
 		WxMsgTemplateIdWithSealApplyFinished = "rciDm9ThigRBGi1SZ4TFd74XA4aoAxSz_ugdv_tZ450"   // 用印申请-已签回通知
 		UserTemplateIdByProduct = "Cp2wF8gvBtxyWV4DeYuI172oqwyYXVRSm3AyJO42d84"                //用户产品允许通知模版
+
+		// 买方研选小程序
+		WxMsgCategoryTemplateIdActivityChangeApply = "mpaOZ8xGABHJE40KaK53vzMtn30Pe9nhYK54Vvl6f0E"       //买方研选活动变更通知-类目模板ID
+		WxMsgCategoryTemplateIdActivityCancleApply = "N1oPORd3cHUJKAX6IZysZPQfemXv-ARf8iTYp0w0IvA"       //买方研选活动取消通知-类目模板ID
+		WxMsgCategoryTemplateIdActivityPublishApply = "IBMqiE61lVgUfFM4rsH0XCH57R_G3PbWvRbnzg9JHPI"      //买方研选活动报告发布通知-类目模板ID
+		WxMsgCategoryTemplateIdCompanyApprovalMessageRai = "t1CcxcOkoZkWZrDRs6zYUlceBGYMV3mhkBYUa8a6Mx0" //权益销售签约成功通知买方研选类目模版消息通知-类目模板ID
+		WxMsgCategoryTemplateIdActivityApply = "HKD03oZfSv8LJgeoHz0pynai3G2Ls4h8zZ6BfOpZmIA"             //后台研选活动给客户报名或取消报名模版消息
+
 	}
 
 	//查研观向小助手

+ 15 - 0
utils/constants.go

@@ -15,6 +15,7 @@ const (
 	FormatDateTime             = "2006-01-02 15:04:05"     //完整时间格式
 	HlbFormatDateTime          = "2006-01-02_15:04:05.999" //完整时间格式
 	FormatDateTimeMinute       = "2006/01/02 15:04"        //时间格式 年/月/日 时:分
+	FormatDateTimeMinute2      = "2006-01-02 15:04"        //时间格式 年-月-日 时:分
 	FormatDateTimeUnSpace      = "20060102150405"          //完整时间格式
 	FormatShortDateTimeUnSpace = "060102150405"            //省去开头两位年份的时间格式
 	EmptyDateTimeStr           = "0000-00-00 00:00:00"     //DateTime零值字符串
@@ -584,3 +585,17 @@ const (
 const (
 	TelAreaCodeHome = "86" // 大陆区号
 )
+
+const (
+	MobileShenTao       = "18767183922" //沈涛手机号18767183922
+	MobileZhangChuanXin = "15557270714" // 张传星手机号
+	MobileWangFang      = "18621268829" // 王芳手机号
+	MobileWuAngDi       = "18701809782" // 吴昂迪手机号
+)
+
+// 买方研选小程序 模版消息路由
+const (
+	WX_MSG_PATH_YX_ACTIVITY_DETAIL = "pages-activity/activityDetail/activityDetail?id=" //研选活动详情
+	WX_MSG_PATH_YX_ARTICLE_DETAIL  = "pages-user/reportDetail/reportDetail?id="         //研选纪要详情
+
+)