zwxi 11 miesięcy temu
rodzic
commit
891766702f

+ 1 - 1
controllers/company_share.go

@@ -242,7 +242,7 @@ func (this *CompanyController) CompanyShareList() {
 	} else if listParam == 2 {
 		condition += ` AND a.share_seller_id = 0 AND a.is_share=1 `
 	} else if listParam == 3 { // 未共享
-		condition += ` AND a.is_share=0 and b.status="正式"`
+		condition += ` AND b.is_share=0 and ((b.status="正式" AND b.product_id = 1) OR (b.status IN ("正式","试用") AND b.product_id = 2))`
 	}
 
 	if sellerIds != "" {

+ 21 - 0
controllers/cygx/activity.go

@@ -728,21 +728,36 @@ 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 {
+						go services.SendWxCategoryMsgWithCygxActivityUpdateTime(req.ActivityId, activityInfo.ActivityTimeText, item.ActivityTimeText, "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, item.ActivityTimeText, "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.ActivityTimeText, "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.ActivityTimeText, "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.ActivityTimeText, "Theme")
+					}
 				}
 
 				//对于限制人数的活动,如果修改改了可见范围,对于新增的那一部分做新的推送
@@ -766,6 +781,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)
 
@@ -1288,6 +1306,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 {

+ 3 - 0
controllers/cygx/activity_signup.go

@@ -846,6 +846,7 @@ func (this *ActivitySignupCoAntroller) SalonSignupEdit() {
 			br.ErrMsg = "活动ID错误,Err:" + err.Error() + "activityId:" + strconv.Itoa(detail.ActivityId)
 			return
 		}
+		chartPermissionId = activityInfo.ChartPermissionId
 		if activityInfo.IsLimitPeople > 0 {
 			//获取这个活动已经报名的用户数量
 			totalSignup, errSignup := cygx.GetActivitySignupCountByActivityId(detail.ActivityId)
@@ -939,6 +940,7 @@ func (this *ActivitySignupCoAntroller) SalonSignupEdit() {
 	//销售或后台管理员给用户添加报名之后,进行模版消息推送
 	if doFailType == 0 {
 		go cygxService.SendWxMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
+		go services.SendWxCategoryMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
 	}
 	//添加操作日志记录
 	br.Ret = 200
@@ -2055,6 +2057,7 @@ func (this *ActivitySignupCoAntroller) AddSignuUser() {
 	//销售或后台管理员给用户添加报名之后,进行模版消息推送
 	if len(itemsSendWxMsg) > 0 {
 		go cygxService.SendWxMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
+		go services.SendWxCategoryMsgWithCygxActivitySignUpBySell(itemsSendWxMsg)
 	}
 	if len(items) > 0 {
 		//1用户报名添加到处理研选扣点

+ 9 - 0
services/company_approval_message.go

@@ -215,6 +215,13 @@ func AddCompanyApprovalMessageRai(companyId, companyContractId int, applyRealNam
 		return
 	}
 	go SendWxMsgWithRaiSell(first, keyword1, keyword2, keyword3, keyword4, openIdList)
+	for _, v := range contractDetail.PermissionList {
+		for _, vv := range v.Items {
+			if vv.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+				go SendWxCategoryMsgWithRaiSell(companyName, "销售:"+applyRealName, "已签约研选", time.Now().Format(utils.FormatDateTimeMinute2), openIdList)
+			}
+		}
+	}
 	return
 }
 
@@ -267,6 +274,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 +282,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

+ 24 - 0
services/cygx/acitvity.go

@@ -1299,6 +1299,30 @@ func DoActivityOnenIdWxTemplateMsg(activityId int) (err error) {
 		err = errors.New("SendTemplateMsg, Err: " + e.Error())
 		return
 	}
+
+	// 发类目模版消息
+	if activityInfo.ChartPermissionId == utils.CHART_PERMISSION_ID_YANXUAN {
+		first := activityChartPermissionName
+		keyword1 := "发布了新活动"
+		keyword2 := activityInfo.ActivityName
+		keyword3 := activityInfo.ActivityTimeText
+
+		redirectUrl := utils.WX_MSG_PATH_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
 }
 

+ 12 - 1
services/cygx/research_summary.go

@@ -366,14 +366,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("您预约的调研,有新报告发布", "已发布", 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("您预约的调研,有新报告发布", "已发布", articleInfo.Title, articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 							}
-
 						}
 					}
 				}
@@ -401,11 +404,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, "发布了新报告", 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, "发布了新报告", articleInfo.Title, articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 		}
 		//优先推送3: 关注产业
@@ -429,11 +436,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, "发布了新报告", 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, "发布了新报告", articleInfo.Title, articleInfo.PublishDate.Format(utils.FormatDateTimeMinute2), openIditem, articleId)
 			}
 		}
 		//针对哪些没有关注作者,没有关注产业,没有预约纪要的人的推送

+ 544 - 0
services/wechat_send_category_template_msg.go

@@ -0,0 +1,544 @@
+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:查研观向"`
+	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 + "】"
+	} else if strType == "expertType" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了专家变更"
+		keyword2 = "专家变更为:【" + newStr + "】"
+	} else if strType == "addressType" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】发生了地址变更"
+		keyword2 = "地点变更为:【" + newStr + "】"
+	} else if strType == "participationCode" {
+		//first = "您有一场【" + activityInfo.ActivityTypeName + "】公布了拨入密码"
+		keyword2 = "拨入密码为: " + newStr
+	} 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
+	}
+
+	keyword1 = activityInfo.ActivityName
+	openIdArr := make([]string, len(openIdList))
+	for i, v := range openIdList {
+		openIdArr[i] = v.OpenId
+	}
+
+	keyword3 = time.Now().Format(utils.FormatDateTimeMinute)
+
+	redirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId) + "&IsSendWx=1"
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords  = []string{keyword1, keyword2, keyword3}
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityChangeApply
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	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 = 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_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 = 3
+	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 := activityInfo.ActivityName
+	keyword2 := "活动名额增加"
+	keyword3 := "名额增至" + activityInfo.LimitPeopleNum + "人,欢迎报名"
+
+	redirectUrl := utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+	sendInfo := new(SendWxCategoryTemplate)
+	sendInfo.Keywords = []string{keyword1, keyword2, keyword3}
+
+	sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityChangeApply
+	sendInfo.RedirectUrl = redirectUrl
+	sendInfo.RedirectTarget = 3
+	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_ARTICLE_DETAIL + strconv.Itoa(articleId)
+	sendInfo.RedirectTarget = 3
+	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 = 3
+	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 = 3
+	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.GetWxUserByUserId(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 := activityInfo.ActivityName
+		keyword4 := resultTime.Format(utils.FormatDateTimeMinute2)
+
+		sendInfo := new(SendWxCategoryTemplate)
+		sendInfo.Keywords = []string{keyword1, keyword2, keyword3, keyword4}
+		sendInfo.TemplateId = utils.WxMsgCategoryTemplateIdActivityApplyXzs
+		sendInfo.RedirectUrl = utils.WX_MSG_PATH_ACTIVITY_DETAIL + strconv.Itoa(activityId)
+		sendInfo.RedirectTarget = 3
+		sendInfo.SendType = utils.TEMPLATE_MSG_APPLY
+		sendInfo.OpenIdArr = openIdArr
+		err = SendCategoryTemplateMsg(sendInfo)
+		if e != nil {
+			err = errors.New("SendCategoryTemplateMsg, Err: " + e.Error())
+			return
+		}
+	}
+	return
+}

+ 22 - 1
utils/config.go

@@ -63,6 +63,11 @@ var (
 	WxMsgTemplateIdWithRoadshowDeleteNotice  string //路演->研究员收到活动删除通知
 	CYGX_WEB_URL                             string //查研观向web端网址
 
+	WxMsgCategoryTemplateIdActivityChangeApply       string //买方研选活动变更通知-类目模板ID
+	WxMsgCategoryTemplateIdActivityCancleApply       string //买方研选活动取消通知-类目模板ID
+	WxMsgCategoryTemplateIdActivityPublishApply      string //买方研选关注的产业下,单个活动/研选报告发布通知-类目模板ID
+	WxMsgCategoryTemplateIdCompanyApprovalMessageRai string //权益销售签约成功通知买方研选类目模版消息
+
 	WxMsgTemplateIdWithYbCommunityQuestion string // 研报小程序->问答社区回复通知
 	WxMsgTemplateIdWithSealApplyFinished   string // 用印申请-已签回通知
 
@@ -137,7 +142,8 @@ var (
 // 公共api内部服务调用
 var (
 	// SendWxTemplateMsgUrl 模板消息推送
-	SendWxTemplateMsgUrl string
+	SendWxTemplateMsgUrl         string
+	SendWxCategoryTemplateMsgUrl string
 	// HandleVideoDecibelUrl 处理音频分贝的url
 	HandleVideoDecibelUrl string
 )
@@ -264,6 +270,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"
@@ -302,6 +309,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"
@@ -361,6 +369,12 @@ 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
 	}
 
 	//查研观向小助手
@@ -399,6 +413,13 @@ 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
+
 	}
 
 	//查研观向小助手

+ 8 - 0
utils/constants.go

@@ -14,6 +14,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零值字符串
@@ -578,3 +579,10 @@ func GetWeeklyDatabase() (databaseName string) {
 const (
 	EnCompanyIdStep = 10000000
 )
+
+const (
+	MobileShenTao       = "18767183922" //沈涛手机号
+	MobileZhangChuanXin = "15557270714" // 张传星手机号
+	MobileWangFang      = "18621268829" // 王芳手机号
+	MobileWuAngDi       = "18701809782" // 吴昂迪手机号
+)