Browse Source

Merge branch 'master' of http://8.136.199.33:3000/hongze/hz_crm_api into crm/crm_16.7

zhangchuanxing 1 week ago
parent
commit
566795b40f

+ 1 - 0
controllers/cygx/activity.go

@@ -851,6 +851,7 @@ func (this *ActivityCoAntroller) PreserveAndPublish() {
 				//}()
 			}
 			go cygxService.MakeActivitySigninImg(v)
+			go cygxService.MakeActivityDetailImg2(v)
 		}
 	} else {
 		if req.DoType == 1 {

+ 25 - 0
controllers/cygx/activity_meet.go

@@ -340,6 +340,30 @@ func (this *ActivityMeetCoAntroller) MeetingDo() {
 			utils.Rc.Delete(redisKey)
 		}()
 	}
+
+	var conditionOld string //点了到会,又点了取消的人,对应的活动标签给取消掉
+	conditionOld += ` AND s.is_meeting = 1  AND  s.activity_id = ` + strconv.Itoa(activityId)
+	listOld, err := cygx.GetOfflineMeetingList(conditionOld)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+
+	var deleteUserids []int
+	sliceNew := strings.Split(meetingUids, ",")
+	mapNewUserIds := make(map[string]bool)
+	for _, v := range sliceNew {
+		mapNewUserIds[v] = true
+	}
+
+	for _, v := range listOld {
+		if !mapNewUserIds[strconv.Itoa(v.UserId)] {
+			deleteUserids = append(deleteUserids, v.UserId)
+		}
+	} //点了到会,又点了取消的人,对应的活动标签给取消掉 end
+
+	//return
 	//加入缓存机制,避免创建同一个名称的指标 end
 	activityInfo, errInfo := cygx.GetAddActivityInfoById(activityId)
 	if activityInfo == nil {
@@ -445,6 +469,7 @@ func (this *ActivityMeetCoAntroller) MeetingDo() {
 	go cygxService.AddctivitySignupDetailList(itemDs, activityId)                        // 处理个人以及机构到会数量
 	go cygxService.ActivityUserLabelLogAdd(activityId, userIdArr)                        // 处理用户标签
 	go cygxService.YanXuanActivityPointsBillSubmitMeeting(activityId, AdminUser.AdminId) // 处理用户到会研选扣点
+	go cygxService.DeleteActivityWxUserRaiLabel(deleteUserids, activityId)               // 点了到会,又点了取消的人,对应的活动标签给取消掉
 	//添加操作日志记录
 	br.Ret = 200
 	br.Success = true

+ 13 - 0
controllers/cygx/report_article.go

@@ -493,6 +493,17 @@ func (this *IndustrialSubjectController) ReportArticleClassification() {
 		return
 	}
 
+	detailIndustryNameList, err := cygx.GetIndustrialManagemenDetailByAaticleID(reportInfo.ArticleId)
+	if err != nil {
+		br.Msg = "分类失败"
+		br.ErrMsg = "获取报告原有分类失败,Err:" + err.Error()
+		return
+	}
+	var industryId []string
+	for _, v := range detailIndustryNameList {
+		industryId = append(industryId, strconv.Itoa(v.IndustrialManagementId))
+	}
+
 	industrialStrList := strings.Split(industrialManagementIdStr, ",")
 	for _, v := range industrialStrList {
 		condition = `AND industrial_management_id = ` + v
@@ -502,6 +513,7 @@ func (this *IndustrialSubjectController) ReportArticleClassification() {
 			br.ErrMsg = "操作失败,产业不存在IndustrialManagementId:" + v
 			return
 		}
+		industryId = append(industryId, v)
 	}
 	if req.IndustrialSubjectIdStr != "0" && req.IndustrialSubjectIdStr != "" {
 		strList := strings.Split(req.IndustrialSubjectIdStr, ",")
@@ -524,6 +536,7 @@ func (this *IndustrialSubjectController) ReportArticleClassification() {
 	}
 
 	go cygxService.DoArticleOnenIdWxTemplateMsg(reportInfo.ArticleId, 2)
+	go cygxService.UpdateIndustrialsourceHzResourceDataById(industryId, "Hz") //修改相关产业关联的报告信息
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "分类成功"

+ 28 - 3
controllers/cygx/summary_manage.go

@@ -80,6 +80,17 @@ func (this *SummaryManage) PreserveAndPublish() {
 	articleId := req.ArticleId
 	articleTypeId := req.ArticleTypeId
 
+	detailIndustryNameList, err := cygx.GetIndustrialManagemenDetailByAaticleID(articleId)
+	if err != nil {
+		br.Msg = "分类失败"
+		br.ErrMsg = "获取报告原有分类失败,Err:" + err.Error()
+		return
+	}
+	var industryId []string
+	for _, v := range detailIndustryNameList {
+		industryId = append(industryId, strconv.Itoa(v.IndustrialManagementId))
+	}
+
 	// 产业ID校验
 	industryIds := make([]int, 0)
 	industrialManagementIdList := strings.Split(industrialManagementIds, ",")
@@ -91,6 +102,7 @@ func (this *SummaryManage) PreserveAndPublish() {
 			return
 		}
 		industryIds = append(industryIds, i)
+		industryId = append(industryId, v)
 	}
 	if industrialSubjectIds != "" {
 		industrialSubjectIdList := strings.Split(industrialSubjectIds, ",")
@@ -319,9 +331,10 @@ func (this *SummaryManage) PreserveAndPublish() {
 		go cygxService.UpdateIndustryLayoutTime(industryIds, false)       // 查研观向7.4-更新产业布局时间
 		go elastic.AddComprehensiveIndustrialSource("Yx", item.ArticleId) // 查研观向10.6 更新搜索引擎的产业资源包
 	}
-	go elastic.AddComprehensiveArticle(item.ArticleId)       // ES添加文章:报告、纪要
-	go cygxService.UpdateArticleResourceData(item.ArticleId) //写入首页最新  cygx_resource_data 表
-	go cygxService.MakeArticleMomentsImg(item.ArticleId)     //生成文章分享到朋友圈的图片
+	go elastic.AddComprehensiveArticle(item.ArticleId)                        // ES添加文章:报告、纪要
+	go cygxService.UpdateArticleResourceData(item.ArticleId)                  //写入首页最新  cygx_resource_data 表
+	go cygxService.MakeArticleMomentsImg(item.ArticleId)                      //生成文章分享到朋友圈的图片
+	go cygxService.UpdateIndustrialsourceHzResourceDataById(industryId, "Yx") //修改相关产业关联的报告信息
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"
@@ -411,6 +424,18 @@ func (this *SummaryManage) PublishAndCancel() {
 	}
 	go elastic.AddComprehensiveArticle(articleId)            // ES添加文章:报告、纪要
 	go cygxService.UpdateArticleResourceData(item.ArticleId) //写入首页最新  cygx_resource_data 表
+
+	detailIndustryNameList, err := cygx.GetIndustrialManagemenDetailByAaticleID(articleId)
+	if err != nil {
+		br.Msg = "分类失败"
+		br.ErrMsg = "获取报告原有分类失败,Err:" + err.Error()
+		return
+	}
+	var industryId []string
+	for _, v := range detailIndustryNameList {
+		industryId = append(industryId, strconv.Itoa(v.IndustrialManagementId))
+	}
+	go cygxService.UpdateIndustrialsourceHzResourceDataById(industryId, "Yx") //修改相关产业关联的报告信息
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "操作成功"

+ 24 - 7
controllers/cygx/user.go

@@ -20,6 +20,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	"unicode/utf8"
 )
 
 // 权益用户管理
@@ -204,9 +205,19 @@ func (this *UserController) List() {
 			condition += ` AND (a.company_name LIKE '%` + keyWord + `%' OR a.credit_code LIKE '%` + keyWord + `%' ) `
 		}
 	}
-	if label != "" {
-		usercondition += ` AND u.user_label LIKE '%` + label + `%'`
+
+	var joinTable string
+	var tableField string
+	var labelSort string
+	if label != "" && utf8.RuneCountInString(label) > 1 {
+		//usercondition += ` AND u.user_label LIKE '%` + label + `%'`
+		//usercondition += ` AND u.user_id IN ( SELECT user_id  FROM ` + utils.GetCygxDatabase() + `.wx_user_rai_label WHERE label LIKE '%` + label + `%'  AND create_time >= '` + time.Now().AddDate(0, -4, 0).Format(utils.FormatDate) + `' ) `
+		usercondition += ` AND l.label LIKE '%` + label + `%'  AND l.create_time >= '` + time.Now().AddDate(0, -4, 0).Format(utils.FormatDate) + `' `
+		joinTable = ` 	INNER JOIN ` + utils.GetCygxDatabase() + `.wx_user_rai_label as l ON  l.user_id = u.user_id   `
+		tableField = ` MAX(l.create_time) as max_create_time,   `
+		labelSort = `  max_create_time DESC ,   `
 	}
+
 	//
 	usercondition += ` AND cp.product_id = 2  	AND sr.product_id = 2  `
 
@@ -218,23 +229,23 @@ func (this *UserController) List() {
 		usercondition += ` AND u.cygx_subscribe = 1 `
 	}
 	condition += ` AND cp.product_id = 2  `
-	total, err := cygx.GetCompanyListCount(usercondition, keyWord, kwywordcondition, condition, roleTypeCode, pars)
+	total, err := cygx.GetCompanyListCount(joinTable, usercondition, keyWord, kwywordcondition, condition, roleTypeCode, pars)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据总数失败,Err:" + err.Error()
 		return
 	}
 	if sortType == "" {
-		sqlOrder = ` GROUP by u.user_id  ORDER BY c.created_time  DESC, u.register_time  DESC `
+		sqlOrder = ` GROUP by u.user_id  ORDER BY ` + labelSort + ` c.created_time  DESC, u.register_time  DESC `
 	} else {
 		if sortType == "asc" {
-			sqlOrder = ` GROUP by u.user_id  ORDER BY u.interaction_num  ASC , u.register_time  DESC `
+			sqlOrder = ` GROUP by u.user_id  ORDER BY  u.interaction_num  ASC ,` + labelSort + ` u.register_time  DESC `
 		} else {
-			sqlOrder = ` GROUP by u.user_id  ORDER BY u.interaction_num  DESC , u.register_time  DESC  `
+			sqlOrder = ` GROUP by u.user_id  ORDER BY u.interaction_num  DESC , ` + labelSort + `  u.register_time  DESC  `
 		}
 	}
 
-	list, err := cygx.GetCygxCompanyUserList(usercondition, keyWord, kwywordcondition, condition, roleTypeCode, sqlOrder, parsUser, startSize, pageSize)
+	list, err := cygx.GetCygxCompanyUserList(joinTable, tableField, usercondition, keyWord, kwywordcondition, condition, roleTypeCode, sqlOrder, parsUser, startSize, pageSize)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取数据失败,Err:" + err.Error()
@@ -316,6 +327,7 @@ func (this *UserController) List() {
 		UserRemindListMap := cygxService.GetCygxUserRemindListMap(userIdArr)
 		mapIsUserMaker := cygxService.GetCompanyProductIsUserMakerByCompanyIds(companyIds) //根据公司ID获取近四周之内有决策人互动的客户
 		userHaveMoveMap := services.GetWxUserHaveMoveMap(mobilesSlice)                     // 处理用户是否移动过按钮回显
+		userLabelMap := cygxService.GetUserLabelByUserIdArr(userIdArr)                     // 根据多个userId 获取每个UserId最新的十条数据
 
 		for k, v := range list {
 			for _, vsplit := range splitList {
@@ -343,6 +355,11 @@ func (this *UserController) List() {
 			if v.Mobile != "" {
 				v.HaveMoveButton = userHaveMoveMap[v.Mobile]
 			}
+			if len(userLabelMap[int(v.UserId)]) == 0 {
+				list[k].RaiLabelList = make([]*cygx.WxUserRaiLabelListResp, 0)
+			} else {
+				list[k].RaiLabelList = userLabelMap[int(v.UserId)]
+			}
 		}
 		for k := range list {
 			list[k].InteractionNum = list[k].HistoryNum + list[k].CountNum + list[k].IndustryFllowNum + list[k].DepartmentFollowNum + list[k].KeyWordNum + list[k].OnLineNum + list[k].OfficeNum + list[k].ChartNum + list[k].TripNum + list[k].RoadshowVideoNum + list[k].ActivityVideoNum + list[k].ActivityVoiceNum + list[k].YanxuanspecialNum

+ 364 - 0
controllers/cygx/user_rai_label.go

@@ -0,0 +1,364 @@
+package cygx
+
+import (
+	"encoding/json"
+	"hongze/hz_crm_api/controllers"
+	"hongze/hz_crm_api/models"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/models/roadshow"
+	cygxService "hongze/hz_crm_api/services/cygx"
+	"hongze/hz_crm_api/utils"
+	"strconv"
+	"time"
+)
+
+// 权益用户标签
+type UserRaiLabelController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 销售输入标签
+// @Description 销售输入标签接口
+// @Param	request	body cygx.WxUserRaiLabelAddReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /use_rai_label/add [post]
+func (this *UserRaiLabelController) Add() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.WxUserRaiLabelAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	userId := req.UserId
+	label := req.Label
+	wxUser, err := models.GetWxUserItemByUserId(userId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败, GetWxUserItemByUserId  Err:" + err.Error()
+		return
+	}
+	item := new(cygx.WxUserRaiLabel)
+	item.UserId = wxUser.UserId
+	item.RealName = wxUser.RealName
+	item.Mobile = wxUser.Mobile
+	item.Email = wxUser.Email
+	item.CompanyId = wxUser.CompanyId
+	item.CompanyName = wxUser.CompanyName
+	item.Label = label
+	item.SysUserId = AdminUser.AdminId
+	item.SysUserRealName = AdminUser.RealName
+	item.SourceType = 6
+	item.CreateTime = time.Now()
+	item.ModifyTime = time.Now()
+	err = cygx.AddWxUserRaiLabel(item)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title 删除销售输入标签
+// @Description 删除销售输入标签接口
+// @Param	request	body cygx.WxUserRaiLabelAddReq true "type json string"
+// @Success 200 {object} "保存成功"
+// @router /use_rai_label/delte [post]
+func (this *UserRaiLabelController) Delte() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req cygx.WxUserRaiLabelIdReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	raiLabelId := req.RaiLabelId
+	err = cygx.DeleteWxUserRaiLabel(raiLabelId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+	br.Msg = "操作成功"
+}
+
+// @Title  标签详情
+// @Description 获取标签详情接口
+// @Param   RaiLabelId   query   int  true       "标签ID"
+// @Success Ret=200 {object} cygx.ActivityDetail
+// @router /use_rai_label/detail [get]
+func (this *UserRaiLabelController) Detail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	raiLabelId, _ := this.GetInt("RaiLabelId")
+	detail, err := cygx.GetWxUserRaiLabelDetailById(raiLabelId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,标签不存在Err:" + err.Error() + "RaiLabelId:" + strconv.Itoa(raiLabelId)
+		return
+	}
+	resp := new(cygx.WxUserRaiLabelDetailResp)
+	sourceType := detail.SourceType
+	sourceId := detail.SourceId
+	//来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签
+	switch sourceType {
+	case 1:
+		item := new(cygx.WxUserRaiLabelKeyWordResp)
+		item.Label = detail.Label
+		item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+		resp.KeyWord = item
+	case 2, 4:
+		item := new(cygx.WxUserRaiLabelActivityResp)
+		activityInfo, errInfo := cygx.GetAddActivityInfoById(sourceId)
+		if activityInfo == nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "活动ID错误,不存在activityId:" + strconv.Itoa(sourceId)
+			return
+		}
+		if errInfo != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "操作失败,Err:" + errInfo.Error()
+			return
+		}
+		activitySignupDetai, _ := cygx.GetCygxActivitySignupDetailDetailLast(sourceId, detail.Mobile)
+		item.ActivityName = activityInfo.ActivityName
+		item.ActivityTypeName = activityInfo.ActivityTypeName
+		item.ActivityTime = activityInfo.ActivityTime
+		if activitySignupDetai != nil {
+			item.Duration = activitySignupDetai.Duration
+		}
+		item.Label = detail.Label
+		resp.Activity = item
+	case 3, 5:
+		item := new(cygx.WxUserRaiLabelRoadShowResp)
+		rsCalendarMeetingUserItem, err := roadshow.GetRsCalendarMeetingUserFirst(sourceId)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败!GetRsCalendarMeetingUserFirst:" + err.Error()
+			return
+		}
+		if rsCalendarMeetingUserItem == nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败!GetRsCalendarMeetingUserFirst:" + err.Error()
+			return
+		}
+		rsCalendarResearcherList, tmpErr := roadshow.GetRsCalendarResearcherListByRsCalendarId(sourceId)
+		if tmpErr != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败!GetRsCalendarResearcherListByRsCalendarId:" + tmpErr.Error()
+			return
+		}
+		for _, v := range rsCalendarResearcherList {
+			item.ResearcherName = v.ResearcherName
+			item.RoadShowTime = v.StartDate + " " + v.StartTime
+		}
+		item.Theme = rsCalendarMeetingUserItem.RoadShowTheme
+		item.Label = detail.Label
+		resp.RoadShow = item
+	case 6:
+		item := new(cygx.WxUserRaiLabelSellerResp)
+		item.Label = detail.Label
+		item.SysUserRealName = detail.SysUserRealName
+		item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+		resp.Seller = item
+	case 7, 8:
+		item := new(cygx.WxUserRaiLabelArticleResp)
+		switch detail.TableName {
+		case "cygx_article":
+			//文章
+			detailArticle, err := cygx.GetArticleIdInfoByArticleId(sourceId)
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			historyDetail := new(cygx.CygxArticleHistoryRecordAll)
+			if detail.Mobile != "" {
+				historyDetail, err = cygx.GetCygxArticleHistoryRecordAllDetailLastByMobile(sourceId, detail.Mobile)
+			} else {
+				historyDetail, err = cygx.GetCygxArticleHistoryRecordAllDetailLast(sourceId, detail.UserId)
+			}
+
+			item.Title = detailArticle.Title
+			item.PublishDate = detailArticle.PublishDate.Format(utils.FormatDateTime)
+			item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+			item.SourceText = cygxService.GetArticleSourcePlatformText(historyDetail.RegisterPlatform)
+			item.StopTime = strconv.Itoa(historyDetail.StopTime)
+
+		case "cygx_report_selection":
+			//报告精选
+			detailReportSelection, err := cygx.GetCygxReportSelectionInfoById(sourceId)
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			historyDetail, err := cygx.GetCygxReportHistoryRecordDetailLast(sourceId, detail.Mobile, "bgjx")
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			item.Title = detailReportSelection.Title
+			item.PublishDate = detailReportSelection.PublishDate
+			item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+			item.SourceText = cygxService.GetArticleSourcePlatformText(historyDetail.RegisterPlatform)
+			item.StopTime = strconv.Itoa(historyDetail.StopTime)
+
+		case "cygx_research_summary":
+			//本周研究汇总
+			detailResearchSummary, err := cygx.GetCygxResearchSummaryInfoById(sourceId)
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			historyDetail, err := cygx.GetCygxReportHistoryRecordDetailLast(sourceId, detail.Mobile, "bzyjhz")
+			if err != nil {
+				br.Msg = "内容不存在"
+				br.ErrMsg = "操作失败,Err:" + err.Error()
+				return
+			}
+			item.Title = detailResearchSummary.Title
+			item.PublishDate = detailResearchSummary.PublishDate
+			item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+			item.SourceText = cygxService.GetArticleSourcePlatformText(historyDetail.RegisterPlatform)
+			item.StopTime = strconv.Itoa(historyDetail.StopTime)
+		}
+
+		item.Label = detail.Label
+		resp.Article = item
+
+	case 9:
+		item := new(cygx.WxUserRaiLabelActivityVivoResp)
+		activityInfo, err := cygx.GetAddActivityInfoById(sourceId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败,GetAddActivityInfoById Err:" + err.Error()
+			return
+		}
+		var title string
+		totalVoice, err := cygx.GetCygxActivityVoiceCountByActivityId(sourceId)
+		if err != nil {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取信息失败, GetCygxActivityVoiceCountByActivityId :" + err.Error()
+			return
+		}
+		if totalVoice > 0 {
+			voiceDetail, err := cygx.GetCygxActivityVoiceReqDetail(sourceId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败, GetCygxActivityVoiceReqDetail :" + err.Error()
+				return
+			}
+			title = voiceDetail.VoiceName
+		} else {
+			totalVideo, err := cygx.GetActivityVideoCountByActivityId(sourceId)
+			if err != nil {
+				br.Msg = "获取信息失败"
+				br.ErrMsg = "获取信息失败, GetActivityVideoCountByActivityId :" + err.Error()
+				return
+			}
+
+			if totalVideo > 0 {
+				videoDetail, err := cygx.GetCygxActivityVideoReqDetail(sourceId)
+				if err != nil {
+					br.Msg = "获取信息失败"
+					br.ErrMsg = "GetCygxActivityVideoReqDetail,Err:" + err.Error() + "activityId:" + strconv.Itoa(sourceId)
+					return
+				}
+				title = videoDetail.VideoName
+			}
+		}
+
+		item.Title = title
+		item.ActivityTime = activityInfo.ActivityTime
+		item.Label = detail.Label
+		item.CreateTime = detail.CreateTime.Format(utils.FormatDateTime)
+		resp.ActivityVivo = item
+	}
+
+	resp.SourceType = detail.SourceType
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// @Title  标签详情
+// @Description 获取标签详情接口
+// @Param   UserId   query   int  true       "用户ID"
+// @Success Ret=200 {object} cygx.ActivityDetail
+// @router /use_rai_label/list [get]
+func (this *UserRaiLabelController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	AdminUser := this.SysUser
+	if AdminUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	userId, _ := this.GetInt("UserId")
+
+	resp := new(cygx.WxUserRaiLabelList)
+	list, err := cygx.GetWxUserRaiLabelListByUserId(userId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error() + "userId:" + strconv.Itoa(userId)
+		return
+	}
+	if len(list) == 0 {
+		list = make([]*cygx.WxUserRaiLabelListResp, 0)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 19 - 0
controllers/roadshow/calendar_meeting_user.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/models/roadshow"
+	cygxService "hongze/hz_crm_api/services/cygx"
 	"hongze/hz_crm_api/utils"
 	"strconv"
 	"strings"
@@ -115,6 +116,10 @@ func (this *CalendarMeetingUserController) Add() {
 		br.ErrMsg = "操作失败-MultiAddRsCalendarMeetingUser!Err:" + err.Error()
 		return
 	}
+
+	for _, v := range items {
+		cygxService.RoadShowWxUserRaiLabelRedisAdd(rsCalendarId, v.UserId, v.CreateTime) //添加用户参加路演标签到Redis
+	}
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "添加成功"
@@ -268,6 +273,20 @@ func (this *CalendarMeetingUserController) Delete() {
 	}
 
 	rsCalendarMeetingUserId := req.RsCalendarMeetingUserId
+
+	//rsCalendarMeetingUserItem, err := roadshow.GetRsCalendarMeetingUserByRsCalendarMeetingUserId(rsCalendarMeetingUserId)
+	//if err != nil {
+	//	br.Msg = "获取数据失败!"
+	//	br.ErrMsg = "获取数据失败!GetRsCalendarMeetingUserFirst:" + err.Error()
+	//	return
+	//}
+	//err = cygx.DeleteWxUserRaiLabelWithRoadshow(rsCalendarMeetingUserItem.UserId, rsCalendarMeetingUserItem.RsCalendarId) // 路演到会删除后,删除对应的标签
+	//if err != nil {
+	//	br.Msg = "删除失败!"
+	//	br.ErrMsg = "删除失败-DeleteWxUserRaiLabelWithRoadshow!Err:" + err.Error()
+	//	return
+	//}
+
 	err = roadshow.DeleteRsCalendarMeetingUser(rsCalendarMeetingUserId)
 	if err != nil {
 		br.Msg = "删除失败!"

+ 6 - 5
go.mod

@@ -63,6 +63,7 @@ require (
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/garyburd/redigo v1.6.3 // indirect
 	github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc // indirect
+	github.com/go-resty/resty/v2 v2.16.5 // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect
@@ -100,12 +101,12 @@ require (
 	github.com/wechatpay-apiv3/wechatpay-go v0.2.18 // indirect
 	github.com/xuri/efp v0.0.0-20220603152613-6918739fd470 // indirect
 	github.com/xuri/nfp v0.0.0-20220409054826-5e722a1d9e22 // indirect
-	golang.org/x/crypto v0.5.0 // indirect
+	golang.org/x/crypto v0.31.0 // indirect
 	golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 // indirect
-	golang.org/x/net v0.9.0 // indirect
-	golang.org/x/sys v0.7.0 // indirect
-	golang.org/x/text v0.9.0 // indirect
-	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/sys v0.28.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	golang.org/x/time v0.6.0 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect

+ 12 - 0
go.sum

@@ -153,6 +153,8 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc h1:jZY+lpZB92nvBo2f31oPC/ivGll6NcsnEOORm8Fkr4M=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc/go.mod h1:25mL1NKxbJhB63ihiK8MnNeTRd+xAizd6bOdydrTLUQ=
+github.com/go-resty/resty/v2 v2.16.5 h1:hBKqmWrr7uRc3euHVqmh1HTHcKn99Smr7o5spptdhTM=
+github.com/go-resty/resty/v2 v2.16.5/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA=
 github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
 github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
@@ -454,6 +456,8 @@ golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0
 golang.org/x/crypto v0.0.0-20220817201139-bc19a97f63c8/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
 golang.org/x/crypto v0.5.0/go.mod h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
+golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
+golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/image v0.0.0-20190501045829-6d32002ffd75/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20220413100746-70e8d0d3baa9 h1:LRtI4W37N+KFebI/qV0OFiLUv4GLOWeEW5hn/KEJvxE=
@@ -493,6 +497,8 @@ golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfS
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.9.0 h1:aWJ/m6xSmxWBx+V0XRHTlrYrPG56jKsLdTFmsSsCzOM=
 golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -536,6 +542,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU=
 golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
+golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -549,10 +557,14 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.6.0 h1:eTDhh4ZXt5Qf0augr54TN6suAUudPcawVZeIAPU7D4U=
+golang.org/x/time v0.6.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
 golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

+ 9 - 0
models/cygx/activity.go

@@ -586,6 +586,7 @@ type CygxActivityList struct {
 	SigninImg                 string `description:"签到码图片"`
 	ChartPermissionNameDeputy string `description:"副行业名称"`
 	TopTime                   int    `description:"置顶时间"`
+	XcxDetailImg              string `description:"小程序二维码详情图片"`
 }
 
 type GetCygxActivityListRep struct {
@@ -740,6 +741,14 @@ func UpdateCygxActivityMomentsImg(momentsImg string, activityId int) (err error)
 	return
 }
 
+// 添加活动详情图片
+func UpdateCygxActivityXcxDetailImg(xcxDetailImg string, activityId int) (err error) {
+	sql := `UPDATE cygx_activity SET  xcx_detail_img=?  WHERE activity_id=? `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	_, err = o.Raw(sql, xcxDetailImg, activityId).Exec()
+	return
+}
+
 // UpdateCygxActivityyidongActivityId  ,建立与易董的活动关联
 func UpdateCygxActivityyidongActivityId(yidongActivityId string, activityId int) (err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 8 - 0
models/cygx/activity_signup_detail.go

@@ -156,3 +156,11 @@ func UpdateActivitySignupDetailMultiByYiDong(items []*CygxActivitySignupDetail)
 	}
 	return
 }
+
+// 根据用户ID,文章ID获取用户最新一条参会记录
+func GetCygxActivitySignupDetailDetailLast(articleId int, mobile string) (item *CygxActivitySignupDetail, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_activity_signup_detail WHERE   activity_id = ?  AND mobile = ?     ORDER BY id DESC    LIMIT 1 `
+	err = o.Raw(sql, articleId, mobile).QueryRow(&item)
+	return
+}

+ 11 - 0
models/cygx/activity_special.go

@@ -499,3 +499,14 @@ func GetactivitySpecilIdsByLabel(name string) (activityIds string, err error) {
 	err = o.Raw(sql).QueryRow(&activityIds)
 	return
 }
+
+// 获取数量
+func GetActivitySpecilCount(condition string, pars []interface{}) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_special as art WHERE 1= 1  `
+	if condition != "" {
+		sqlCount += condition
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, pars).QueryRow(&count)
+	return
+}

+ 1 - 2
models/cygx/activity_video.go

@@ -105,8 +105,7 @@ func GetActivityVideoCountByActivityId(activityId int) (count int, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")
 	sqlCount := ` SELECT
 				COUNT( 1 ) AS count 
-			FROM
-   				JOIN cygx_activity_video
+			FROM cygx_activity_video
 			WHERE activity_id = ? `
 	err = o.Raw(sqlCount, activityId).QueryRow(&count)
 	return

+ 8 - 0
models/cygx/activity_voice.go

@@ -67,6 +67,14 @@ func GetCygxActivityVoiceCount(condition string, pars []interface{}) (count int,
 	return
 }
 
+// 获取数量
+func GetCygxActivityVoiceCountByActivityId(activityId int) (count int, err error) {
+	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_activity_voice   WHERE activity_id= ?  `
+	o := orm.NewOrmUsingDB("hz_cygx")
+	err = o.Raw(sqlCount, activityId).QueryRow(&count)
+	return
+}
+
 // 列表
 func GetCygxActivityVoiceReqList(activityId int) (items []*CygxActivityVoiceReq, err error) {
 	o := orm.NewOrmUsingDB("hz_cygx")

+ 43 - 1
models/cygx/askserie_video_history_record.go

@@ -1,6 +1,9 @@
 package cygx
 
-import "github.com/beego/beego/v2/client/orm"
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
 
 type CygxAskserieVideoHistoryRecordResp struct {
 	Id               int    `orm:"column(id);pk"`
@@ -72,3 +75,42 @@ func GetCygxAskserieVideoCollectionList(condition string, pars []interface{}) (i
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+type CygxArticleHistoryRecordAll struct {
+	Id               int `orm:"column(id);pk"`
+	ArticleId        int
+	UserId           int
+	CreateTime       string
+	ModifyTime       time.Time
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	StopTime         int       `description:"停留时间"`
+	OutType          int       `description:"退出方式,1正常退出,2强制关闭"`
+	Source           string    `description:"来源,MOBILE:手机端,PC:电脑端"`
+	RealName         string    `description:"用户实际名称"`
+	CreateDateApi    time.Time `description:"同步创建时间"`
+	CelueHistoryId   int       `description:"策略平台记录的ID"`
+	Platfor          int       `description:"PV阅读记录来源,1:查研观向,2:策略平台"`
+	IsDel            int       `description:"是否删除"`
+	RegisterPlatform int       `description:"来源"`
+	CompanyStatus    string    `description:"公司状态"`
+	SellerName       string    `description:"所属销售"`
+}
+
+// 根据用户ID,文章ID获取用户最新一条阅读记录
+func GetCygxArticleHistoryRecordAllDetailLast(articleId, userId int) (item *CygxArticleHistoryRecordAll, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_article_history_record_all WHERE   article_id = ?  AND user_id = ?   AND is_del = 0  AND stop_time > 0  ORDER BY id DESC    LIMIT 1 `
+	err = o.Raw(sql, articleId, userId).QueryRow(&item)
+	return
+}
+
+// 根据用户ID,文章ID获取用户最新一条阅读记录
+func GetCygxArticleHistoryRecordAllDetailLastByMobile(articleId int, mobile string) (item *CygxArticleHistoryRecordAll, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_article_history_record_all WHERE   article_id = ?  AND mobile = ?   AND is_del = 0  AND stop_time > 0 ORDER BY id DESC    LIMIT 1 `
+	err = o.Raw(sql, articleId, mobile).QueryRow(&item)
+	return
+}

+ 50 - 49
models/cygx/cygx_user.go

@@ -12,50 +12,51 @@ import (
 )
 
 type CygxCompanyUser struct {
-	UserId                      int64  `orm:"column(user_id);pk"`
-	Mobile                      string `description:"手机号"`
-	Email                       string `description:"邮箱"`
-	CompanyId                   int    `description:"公司id"`
-	CompanyName                 string `description:"公司名称"`
-	RealName                    string `description:"姓名"`
-	CreatedTime                 string `description:"创建时间"`
-	IsMaker                     int    `description:"是否决策人,1:是,0:否"`
-	IsRegister                  bool   `description:"是否注册,true:已注册,false:未注册"`
-	Status                      string `description:"客户状态"`
-	RegisterTime                string `description:"注册时间"`
-	SellerName                  string `description:"销售名称"`
-	InteractionNum              int    `description:"互动量"`
-	CompanyInteractionNum       int    `description:"企业互动量"`
-	CompanyInteractionNumSeller int    `description:"销售可见企业互动量"`
-	Labels                      string `description:"标签,用英文,隔开"`
-	ActivityLabel               string `description:"活动标签,用英文,隔开"`
-	IsShowSee                   bool   `description:"是否展示查看"`
-	IsShowSeeNum                int    `description:"是否展示查看"`
-	HistoryNum                  int    `description:"报告阅读"`
-	CountNum                    int    `description:"报告收藏"`
-	IndustryFllowNum            int    `description:"产业关注"`
-	DepartmentFollowNum         int    `description:"作者关注"`
-	KeyWordNum                  int    `description:"搜索关键词"`
-	OnLineNum                   int    `description:"线上互动活动"`
-	OfficeNum                   int    `description:"线下互动活动"`
-	ChartNum                    int    `description:"图表收藏数量"`
-	TripNum                     int    `description:"图表数量"`
-	RoadshowVideoNum            int    `description:"产业视频播放量"`
-	ActivityVideoNum            int    `description:"活动视频播放量"`
-	ActivityVoiceNum            int    `description:"活动音频播放量"`
-	YanxuanspecialNum           int    `description:"研选专栏查看数量"`
-	RsCalendarNum               int    `description:"1V1 路演数量"`
-	FeedbackNum                 int    `description:"交流反馈数量"`
-	PackageType                 int    `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
-	TryStage                    int    `description:"试用客户子标签:0全部、1未分类、2 推进、3 跟踪、4 预备"`
-	Content                     string `description:"备注信息"`
-	IsRemind                    bool   `description:"是否添加互动提醒"`
-	IsSubscribeCygx             int    `description:"是否关注了查研观向微信公众号: 0-未关注; 1-已关注"`
-	IsSubscribeMfyx             int    `description:"是否关注了买方研选微信公众号: 0-未关注; 1-已关注"`
-	IsUserMaker                 int    `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
-	HaveMoveButton              bool   `description:"是否移动过"`
-	MfyxIsBinding               bool   `description:"买方研选是否绑定"`
-	Position                    string `description:"职位"`
+	UserId                      int64                     `orm:"column(user_id);pk"`
+	Mobile                      string                    `description:"手机号"`
+	Email                       string                    `description:"邮箱"`
+	CompanyId                   int                       `description:"公司id"`
+	CompanyName                 string                    `description:"公司名称"`
+	RealName                    string                    `description:"姓名"`
+	CreatedTime                 string                    `description:"创建时间"`
+	IsMaker                     int                       `description:"是否决策人,1:是,0:否"`
+	IsRegister                  bool                      `description:"是否注册,true:已注册,false:未注册"`
+	Status                      string                    `description:"客户状态"`
+	RegisterTime                string                    `description:"注册时间"`
+	SellerName                  string                    `description:"销售名称"`
+	InteractionNum              int                       `description:"互动量"`
+	CompanyInteractionNum       int                       `description:"企业互动量"`
+	CompanyInteractionNumSeller int                       `description:"销售可见企业互动量"`
+	Labels                      string                    `description:"标签,用英文,隔开"`
+	ActivityLabel               string                    `description:"活动标签,用英文,隔开"`
+	IsShowSee                   bool                      `description:"是否展示查看"`
+	IsShowSeeNum                int                       `description:"是否展示查看"`
+	HistoryNum                  int                       `description:"报告阅读"`
+	CountNum                    int                       `description:"报告收藏"`
+	IndustryFllowNum            int                       `description:"产业关注"`
+	DepartmentFollowNum         int                       `description:"作者关注"`
+	KeyWordNum                  int                       `description:"搜索关键词"`
+	OnLineNum                   int                       `description:"线上互动活动"`
+	OfficeNum                   int                       `description:"线下互动活动"`
+	ChartNum                    int                       `description:"图表收藏数量"`
+	TripNum                     int                       `description:"图表数量"`
+	RoadshowVideoNum            int                       `description:"产业视频播放量"`
+	ActivityVideoNum            int                       `description:"活动视频播放量"`
+	ActivityVoiceNum            int                       `description:"活动音频播放量"`
+	YanxuanspecialNum           int                       `description:"研选专栏查看数量"`
+	RsCalendarNum               int                       `description:"1V1 路演数量"`
+	FeedbackNum                 int                       `description:"交流反馈数量"`
+	PackageType                 int                       `description:"套餐类型,0:无,1:大套餐,2:小套餐"`
+	TryStage                    int                       `description:"试用客户子标签:0全部、1未分类、2 推进、3 跟踪、4 预备"`
+	Content                     string                    `description:"备注信息"`
+	IsRemind                    bool                      `description:"是否添加互动提醒"`
+	IsSubscribeCygx             int                       `description:"是否关注了查研观向微信公众号: 0-未关注; 1-已关注"`
+	IsSubscribeMfyx             int                       `description:"是否关注了买方研选微信公众号: 0-未关注; 1-已关注"`
+	IsUserMaker                 int                       `description:"近四周之内是否包含决策人互动过 ,0否,1是"`
+	HaveMoveButton              bool                      `description:"是否移动过"`
+	MfyxIsBinding               bool                      `description:"买方研选是否绑定"`
+	Position                    string                    `description:"职位"`
+	RaiLabelList                []*WxUserRaiLabelListResp `description:"权益用户标签列表'"`
 }
 
 type CompanyUserListResp struct {
@@ -64,7 +65,7 @@ type CompanyUserListResp struct {
 }
 
 // 获取数量
-func GetCompanyListCount(userCondition, keyWord, kwywordcondition, condition, roleTypeCode string, pars []interface{}) (count int, err error) {
+func GetCompanyListCount(joinTable, userCondition, keyWord, kwywordcondition, condition, roleTypeCode string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	companyCondition := `SELECT a.company_id FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE a.enabled=1  `
 	kwywordcondition = companyCondition + kwywordcondition
@@ -78,7 +79,7 @@ func GetCompanyListCount(userCondition, keyWord, kwywordcondition, condition, ro
 			INNER JOIN company AS c ON c.company_id = u.company_id
 			INNER JOIN company_product AS cp ON cp.company_id = c.company_id
 			INNER JOIN admin AS m ON m.admin_id = cp.seller_id 
-			INNER JOIN user_seller_relation AS sr ON sr.user_id = u.user_id 
+			INNER JOIN user_seller_relation AS sr ON sr.user_id = u.user_id ` + joinTable + `
 			 WHERE  u.company_id IN (` + companyCondition + `)`
 	if userCondition != "" {
 		sql += userCondition
@@ -96,14 +97,14 @@ func GetCompanyListCount(userCondition, keyWord, kwywordcondition, condition, ro
 }
 
 // 列表
-func GetCygxCompanyUserList(userCondition, keyWord, kwywordcondition, condition, roleTypeCode, sqlOrder string, pars []interface{}, startSize, pageSize int) (items []*CygxCompanyUser, err error) {
+func GetCygxCompanyUserList(joinTable, tableField, userCondition, keyWord, kwywordcondition, condition, roleTypeCode, sqlOrder string, pars []interface{}, startSize, pageSize int) (items []*CygxCompanyUser, err error) {
 	o := orm.NewOrm()
 	companyCondition := `SELECT a.company_id FROM company AS a  INNER JOIN company_product AS b ON a.company_id=b.company_id   WHERE a.enabled=1  `
 	kwywordcondition = companyCondition + kwywordcondition
 	if condition != "" {
 		companyCondition += condition
 	}
-	sql := `SELECT
+	sql := `SELECT` + tableField + `
 			u.user_id,
 			u.mobile,
 			u.email,
@@ -129,7 +130,7 @@ func GetCygxCompanyUserList(userCondition, keyWord, kwywordcondition, condition,
 			INNER JOIN company AS c ON c.company_id = u.company_id
 			INNER JOIN company_product AS cp ON cp.company_id = c.company_id
 			INNER JOIN admin AS m ON m.admin_id = cp.seller_id 
-			INNER JOIN user_seller_relation AS sr ON sr.user_id = u.user_id 
+			INNER JOIN user_seller_relation AS sr ON sr.user_id = u.user_id ` + joinTable + `
 			 WHERE u.company_id IN (` + companyCondition + `)`
 	if userCondition != "" {
 		sql += userCondition

+ 34 - 0
models/cygx/industrial_article_group_management.go

@@ -208,3 +208,37 @@ func GetSearchResourceList(userId int, condition string, startSize, pageSize int
 	_, err = o.Raw(sql).QueryRows(&items)
 	return
 }
+
+// GetIndustrialManagementGroupArticleMaxPublishDateByHz 获取产业ID关联最新发布文章的发布时间(弘则资源包)
+func GetIndustrialManagementGroupArticleMaxPublishDateByHz(industrialManagementId int) (maxTime string, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` SELECT
+			MAX( a.publish_date ) AS max_time 
+		FROM
+			cygx_industrial_article_group_management AS m
+			INNER JOIN cygx_article AS a ON a.article_id = m.article_id 
+		WHERE
+			1 = 1 
+			AND m.industrial_management_id = ? 
+			AND a.publish_status = 1 
+			AND a.article_type_id = 0 `
+	err = o.Raw(sql, industrialManagementId).QueryRow(&maxTime)
+	return
+}
+
+// GetIndustrialManagementGroupArticleMaxPublishDateByYx 获取产业ID关联最新发布文章的发布时间(研选资源包)
+func GetIndustrialManagementGroupArticleMaxPublishDateByYx(industrialManagementId int) (maxTime string, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			MAX( a.publish_date ) AS max_time 
+		FROM
+			cygx_industrial_article_group_management AS m
+			INNER JOIN cygx_article AS a ON a.article_id = m.article_id 
+		WHERE
+			1 = 1 
+			AND m.industrial_management_id = ? 
+			AND a.publish_status = 1  
+			AND a.article_type_id > 0 `
+	err = o.Raw(sql, industrialManagementId).QueryRow(&maxTime)
+	return
+}

+ 32 - 0
models/cygx/report_history_record.go

@@ -0,0 +1,32 @@
+package cygx
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxReportHistoryRecord struct {
+	Id               int `orm:"column(id);pk"`
+	ArticleId        int
+	UserId           int
+	CreateTime       time.Time
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	ModifyTime       time.Time `description:"修改时间"`
+	ReportType       string    `description:"报告类型,bgjx:报告精选、bzyjhz:本周研究汇总、szjyhz:上周纪要汇总"`
+	RealName         string    `description:"用户实际名称"`
+	SellerName       string    `description:"所属销售"`
+	StopTime         int       `description:"停留时间"`
+	OutType          int       `description:"退出方式,1正常退出,2强制关闭"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+}
+
+// 根据用户ID,文章ID获取用户最新一条阅读记录
+func GetCygxReportHistoryRecordDetailLast(articleId int, mobile, reportType string) (item *CygxArticleHistoryRecordAll, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT * FROM cygx_report_history_record WHERE   article_id = ?  AND mobile = ?   AND report_type = ?    ORDER BY id DESC    LIMIT 1 `
+	err = o.Raw(sql, articleId, mobile, reportType).QueryRow(&item)
+	return
+}

+ 282 - 0
models/cygx/wx_user_rai_label.go

@@ -0,0 +1,282 @@
+package cygx
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+type WxUserRaiLabel struct {
+	RaiLabelId      int       `orm:"column(rai_label_id);pk"`
+	UserId          int       `description:"用户ID"`
+	RealName        string    `description:"用户实际名称"`
+	Mobile          string    `description:"手机号"`
+	Email           string    `description:"邮箱"`
+	CompanyId       int       `description:"公司id"`
+	CompanyName     string    `description:"公司名称"`
+	Label           string    `description:"标签内容"`
+	SourceId        int       `description:"来源ID"`
+	SourceType      int       `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	SysUserId       int       `description:"创建人id"`
+	SysUserRealName string    `description:"创建人名称"`
+	CreateTime      time.Time `description:"创建时间"`
+	ModifyTime      time.Time `description:"更新时间"`
+	TableName       string    `description:"数据来源的表名"`
+}
+
+// 标签记录表,所有内容都不删除
+type WxUserRaiLabelLog struct {
+	RaiLabelId       int       `orm:"column(rai_label_id);pk"`
+	UserId           int       `description:"用户ID"`
+	RealName         string    `description:"用户实际名称"`
+	Mobile           string    `description:"手机号"`
+	Email            string    `description:"邮箱"`
+	CompanyId        int       `description:"公司id"`
+	CompanyName      string    `description:"公司名称"`
+	Label            string    `description:"标签内容"`
+	SourceId         int       `description:"来源ID"`
+	SourceType       int       `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	SysUserId        int       `description:"创建人id"`
+	SysUserRealName  string    `description:"创建人名称"`
+	CreateTime       time.Time `description:"创建时间"`
+	ModifyTime       time.Time `description:"更新时间"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+	TableName        string    `description:"数据来源的表名"`
+}
+
+type WxUserRaiLabelList struct {
+	List []*WxUserRaiLabelListResp
+}
+
+type WxUserRaiLabelListResp struct {
+	UserId     int    `description:"用户ID"`
+	RaiLabelId int    `description:"ID"`
+	Label      string `description:"标签内容"`
+	SourceType int    `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+}
+
+type WxUserRaiLabelAddReq struct {
+	UserId int    `description:"用户ID"`
+	Label  string `description:"标签内容"`
+}
+
+type WxUserRaiLabelIdReq struct {
+	RaiLabelId int `description:"ID"`
+}
+
+// 添加
+//func AddWxUserRaiLabel(item *WxUserRaiLabel) (err error) {
+//	o := orm.NewOrmUsingDB("hz_cygx")
+//	_, err = o.Insert(item)
+//	return
+//}
+
+func AddWxUserRaiLabel(item *WxUserRaiLabel) (err error) {
+	o, err := orm.NewOrmUsingDB("hz_cygx").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		fmt.Println(err)
+		if err == nil {
+			o.Commit()
+		} else {
+			o.Rollback()
+		}
+	}()
+
+	//删除原有数据
+	sql := ` DELETE FROM wx_user_rai_label WHERE user_id = ? AND label = ?  `
+	_, err = o.Raw(sql, item.UserId, item.Label).Exec()
+	if err != nil {
+		return
+	}
+
+	_, err = o.Insert(item)
+
+	if err != nil {
+		return
+	}
+
+	itemLog := new(WxUserRaiLabelLog)
+	itemLog.UserId = item.UserId
+	itemLog.RealName = item.RealName
+	itemLog.Mobile = item.Mobile
+	itemLog.Email = item.Email
+	itemLog.CompanyId = item.CompanyId
+	itemLog.CompanyName = item.CompanyName
+	itemLog.Label = item.Label
+	itemLog.SourceId = item.SourceId
+	itemLog.SourceType = item.SourceType
+	itemLog.SysUserId = item.SysUserId
+	itemLog.SysUserRealName = item.SysUserRealName
+	itemLog.CreateTime = item.CreateTime
+	itemLog.ModifyTime = item.ModifyTime
+	//itemLog.RegisterPlatform = item.RegisterPlatform
+	itemLog.TableName = item.TableName
+	_, err = o.Insert(itemLog)
+	return
+}
+
+// DeleteWxUserRaiLabel 根据主键ID删除数据
+func DeleteWxUserRaiLabel(raiLabelId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM wx_user_rai_label WHERE rai_label_id = ? `
+	_, err = o.Raw(sql, raiLabelId).Exec()
+	return
+}
+
+// DeleteWxUserRaiLabelWithRoadshow 路演到会删除后,删除对应的标签
+func DeleteWxUserRaiLabelWithRoadshow(userId, sourceId int) (err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM wx_user_rai_label WHERE user_id  = ?  AND source_id =?  AND  source_type IN  (3,5) `
+	_, err = o.Raw(sql, userId, sourceId).Exec()
+	return
+}
+
+// DeleteWxUserRaiLabelWithActivity 线下活动取消到会后,删除对应的标签
+func DeleteWxUserRaiLabelWithActivity(userIds []int, sourceId int) (err error) {
+	lenArr := len(userIds)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := ` DELETE FROM wx_user_rai_label WHERE user_id IN (` + utils.GetOrmInReplace(lenArr) + `)  AND source_id =?  AND  source_type IN  (2,4) `
+	_, err = o.Raw(sql, userIds, sourceId).Exec()
+	return
+}
+
+// GetWxUserRaiLabelListByUserIds 根据多个userId 获取每个UserId最新的十条数据
+func GetWxUserRaiLabelListByUserIds(userIdArr []int) (list []*WxUserRaiLabelListResp, err error) {
+	lenArr := len(userIdArr)
+	if lenArr == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			t.rai_label_id,
+			t.user_id,
+			t.label,
+			t.source_type 
+		FROM
+			(
+			SELECT
+				rai_label_id,
+				user_id,
+				label,
+				source_type,
+				create_time,
+				@row_number :=
+			IF
+				( @prev_user_id = user_id, @row_number + 1, 1 ) AS rank,
+				@prev_user_id := user_id 
+			FROM
+				wx_user_rai_label,
+				( SELECT @row_number := 0, @prev_user_id := NULL ) AS vars 
+			WHERE
+				user_id IN ( ` + utils.GetOrmInReplace(lenArr) + ` ) 
+				AND create_time > ?
+			ORDER BY
+				create_time DESC 
+			) AS t 
+		WHERE
+			t.rank <= 10 
+		ORDER BY
+			t.create_time DESC  `
+	_, err = o.Raw(sql, userIdArr, time.Now().AddDate(0, -4, 0).Format(utils.FormatDate)).QueryRows(&list)
+	return
+}
+
+// GetWxUserRaiLabelListByUserId 根据用户ID,获取最近四个月的数据信息
+func GetWxUserRaiLabelListByUserId(userId int) (list []*WxUserRaiLabelListResp, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			rai_label_id,
+			user_id,
+			label,
+			source_type 
+		FROM
+			wx_user_rai_label
+		WHERE
+			 user_id = ? AND  create_time >= ?
+		ORDER BY
+		    create_time DESC  LIMIT  1000  `
+	_, err = o.Raw(sql, userId, time.Now().AddDate(0, -4, 0).Format(utils.FormatDate)).QueryRows(&list)
+	return
+}
+
+// 通过纪要ID获取详情
+func GetWxUserRaiLabelDetailById(raiLabelId int) (item *WxUserRaiLabel, err error) {
+	o := orm.NewOrmUsingDB("hz_cygx")
+	sql := `SELECT
+			*
+		FROM
+			wx_user_rai_label 
+		WHERE
+			rai_label_id =? `
+	err = o.Raw(sql, raiLabelId).QueryRow(&item)
+	return
+}
+
+type WxUserRaiLabelDetailResp struct {
+	SourceType   int `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	KeyWord      *WxUserRaiLabelKeyWordResp
+	Activity     *WxUserRaiLabelActivityResp
+	RoadShow     *WxUserRaiLabelRoadShowResp
+	Seller       *WxUserRaiLabelSellerResp
+	Article      *WxUserRaiLabelArticleResp
+	ActivityVivo *WxUserRaiLabelActivityVivoResp
+}
+
+type WxUserRaiLabelKeyWordResp struct {
+	Label      string `description:"标签内容"`
+	CreateTime string `description:"创建时间"`
+}
+
+type WxUserRaiLabelActivityResp struct {
+	ActivityName     string `description:"活动名称"`
+	ActivityTypeName string `description:"活动类型名称"`
+	ActivityTime     string `description:"活动时间"`
+	Duration         string `description:"参会时长"`
+	Label            string `description:"标签内容"`
+}
+
+type WxUserRaiLabelActivityVivoResp struct {
+	Title        string `description:"活动名称"`
+	ActivityTime string `description:"活动时间"`
+	Label        string `description:"标签内容"`
+	CreateTime   string `description:"查看时间"`
+}
+
+type WxUserRaiLabelRoadShowResp struct {
+	Theme          string `description:"会议主题"`
+	ResearcherName string `description:"研究员名称"`
+	RoadShowTime   string `description:"开始时间"`
+	Label          string `description:"标签内容"`
+}
+
+type WxUserRaiLabelSellerResp struct {
+	Label           string `description:"标签内容"`
+	SysUserRealName string `description:"创建人名称"`
+	CreateTime      string `description:"创建时间"`
+}
+
+type WxUserRaiLabelArticleResp struct {
+	Title       string `description:"标题"`
+	PublishDate string `description:"发布时间"`
+	CreateTime  string `description:"创建时间"`
+	SourceText  string `description:"阅读来源"`
+	StopTime    string `description:"阅读停留时间"`
+	Label       string `description:"标签内容"`
+}
+
+type WxUserRaiLabelRedis struct {
+	UserId           int       `description:"用户ID"`
+	SourceId         int       `description:"资源ID"`
+	Label            string    `description:"标签内容"`
+	SourceType       int       `description:"来源1:搜索关键字标签、2:产业/个股标签(线下活动)、3:产业/个股标签(线下路演)、4:产业/个股标签(线上活动)、5:产业/个股标签(线上路演)、6:销售输入标签、7:产业/个股标签(报告)、8:报告类型标签"`
+	CreateTime       time.Time `description:"创建时间"`
+	RegisterPlatform int       `description:"来源 1小程序,2:网页"`
+	TableName        string    `description:"数据来源的表名"`
+}

+ 2 - 0
models/db.go

@@ -490,6 +490,8 @@ func initCygx() {
 		new(cygx.CygxUserFeedback),
 		new(cygx.CygxReportSelectionThirdName),
 		new(cygx.CygxGushouTimeLine),
+		new(cygx.WxUserRaiLabel),
+		new(cygx.WxUserRaiLabelLog),
 	)
 }
 

+ 9 - 1
models/roadshow/rs_calendar_meeting_user.go

@@ -85,13 +85,21 @@ func MultiAddRsCalendarMeetingUser(items []*RsCalendarMeetingUser, roadShowTheme
 }
 
 // 获取第一个提交参会信息内容
-func GetRsCalendarMeetingUserFirst(rsCalendarId int) (item *RsCalendarResearcher, err error) {
+func GetRsCalendarMeetingUserFirst(rsCalendarId int) (item *RsCalendarMeetingUser, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT * FROM rs_calendar_meeting_user WHERE rs_calendar_id=? LIMIT 1   `
 	err = o.Raw(sql, rsCalendarId).QueryRow(&item)
 	return
 }
 
+// 获取第一个提交参会信息内容
+func GetRsCalendarMeetingUserByRsCalendarMeetingUserId(rsCalendarMeetingUserId int) (item *RsCalendarMeetingUser, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM rs_calendar_meeting_user WHERE rs_calendar_meeting_user_id =?  `
+	err = o.Raw(sql, rsCalendarMeetingUserId).QueryRow(&item)
+	return
+}
+
 // 删除
 func DeleteRsCalendarMeetingUser(rsCalendarMeetingUserID int) (err error) {
 	o := orm.NewOrm()

+ 36 - 0
routers/commentsRouter.go

@@ -3328,6 +3328,42 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/use_rai_label/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"],
+        beego.ControllerComments{
+            Method: "Delte",
+            Router: `/use_rai_label/delte`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"],
+        beego.ControllerComments{
+            Method: "Detail",
+            Router: `/use_rai_label/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:UserRaiLabelController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/use_rai_label/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"] = append(beego.GlobalControllerRouter["hongze/hz_crm_api/controllers/cygx:YanxuanSpecialController"],
         beego.ControllerComments{
             Method: "ApprovalLogList",

+ 1 - 0
routers/router.go

@@ -167,6 +167,7 @@ func init() {
 				&cygx.RaiServeCoAntroller{},
 				&cygx.UserFeedbackController{},
 				&cygx.GushouTimeLineController{},
+				&cygx.UserRaiLabelController{},
 			),
 		),
 		web.NSNamespace("/advisory",

+ 4 - 4
services/cygx/acitvity.go

@@ -44,7 +44,7 @@ func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
 	}
 	mobileList, _ := cygx.GetUserMeetingMobile(activityId)
 	var userIdArr []int
-	if len(mobileList) >= 0 {
+	if len(mobileList) > 0 {
 		for _, v := range mobileList {
 			userIdArr = append(userIdArr, v.UserId)
 		}
@@ -56,7 +56,7 @@ func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
 		pars = append(pars, userIdArr)
 		restrictSignupList, e := cygx.GetCygxActivityRestrictSignupList(condition, pars, 0, 9999)
 		if e != nil {
-			err = errors.New("GetCygxActivityRestrictSignupList" + e.Error())
+			err = errors.New("GetCygxActivityRestrictSignupList 1 " + e.Error())
 			return
 		}
 		//获取这些用户是否被加入到限制报名了
@@ -120,7 +120,7 @@ func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
 		item.SellerName = v.SellerName
 		items = append(items, item)
 	}
-	if len(list) == 0 {
+	if len(userIdSiginArr) == 0 {
 		return
 	}
 
@@ -133,7 +133,7 @@ func AddCygxActivityRestrictSignupByAdmin(activityId int) (err error) {
 	pars = append(pars, userIdSiginArr)
 	restrictSignupList, e := cygx.GetCygxActivityRestrictSignupList(condition, pars, 0, 9999)
 	if e != nil {
-		err = errors.New("GetCygxActivityRestrictSignupList" + e.Error())
+		err = errors.New("GetCygxActivityRestrictSignupList 2" + e.Error())
 		return
 	}
 	//获取这些用户是否被加入到限制报名了

+ 21 - 1
services/cygx/activity_meet.go

@@ -100,7 +100,7 @@ func AddCygxActivityMeetDetailLogOffline(meetingUids string, activityId int) (er
 			itemsUpdateCompany = append(itemsUpdateCompany, item)
 		}
 	}
-	fmt.Println(111)
+
 	var itemsUpdateMobile []*cygx.MeetDetailLoggGroupCount
 	lenmobileArr := len(mobileArr)
 	if lenmobileArr > 0 {
@@ -225,6 +225,13 @@ func AddctivitySignupDetailList(itemsDetail []*cygx.CygxActivitySignupDetail, ac
 		}
 	}
 
+	//添加到Redis队列消息中,处理用户标签
+	for _, v := range itemsAdd {
+		if v.UserId > 0 {
+			ActivityWxUserRaiLabelRedisAdd(v.ActivityId, v.UserId, v.CreateTime)
+		}
+	}
+
 	return err
 }
 
@@ -346,6 +353,12 @@ func AddctivitySignupDetailListByHand(itemsDetail []*cygx.CygxActivityAttendance
 		}
 	}
 
+	//添加到Redis队列消息中,处理用户标签
+	for _, v := range itemsAdd {
+		if v.UserId > 0 {
+			ActivityWxUserRaiLabelRedisAdd(v.ActivityId, v.UserId, v.CreateTime)
+		}
+	}
 	return err
 }
 
@@ -435,6 +448,13 @@ func AddctivitySignupDetailListByAdminSignup(activityIdsStr string) (err error)
 			err = errors.New("AddCygxActivitySignupDetail, Err: " + e.Error())
 			return
 		}
+
+		//添加到Redis队列消息中,处理用户标签
+		for _, v := range items {
+			if v.UserId > 0 {
+				ActivityWxUserRaiLabelRedisAdd(v.ActivityId, v.UserId, v.CreateTime)
+			}
+		}
 	}
 
 	return err

+ 234 - 0
services/cygx/activity_poster.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"errors"
 	"fmt"
+	"github.com/go-resty/resty/v2"
 	"hongze/hz_crm_api/models"
 	"hongze/hz_crm_api/models/cygx"
 	"hongze/hz_crm_api/services"
@@ -198,6 +199,7 @@ func MakeActivitySigninImg(activityId int) (imgUrl string, err error) {
 		return
 	}
 
+	fmt.Println("resourceUrl", resourceUrl)
 	detailConfig, e := cygx.GetCygxConfigDetailByCode(Cygx_activity_sigin_html)
 	if e != nil {
 		err = errors.New("GetCygxConfigDetailByCode 获取配置签到码格式信息失败, Err: " + e.Error())
@@ -582,3 +584,235 @@ func MakeActivityMomentsImg(activityId int) {
 //	err = cygx.AddCygxActivityPoster(item)
 //	return
 //}
+
+//func init() {
+//	MakeActivityDetailImg2(2992)
+//}
+
+//func init() {
+//	var condition string
+//	var pars []interface{}
+//
+//	condition = " AND active_state = 1   AND xcx_detail_img = ''   "
+//	list, errList := cygx.GetActivityListAll(condition, pars, 0, 999)
+//	if errList != nil {
+//		fmt.Println(errList)
+//		return
+//	}
+//
+//	for _, v := range list {
+//		MakeActivityDetailImg2(v.ActivityId)
+//	}
+//}
+
+// MakeActivityDetailImg  生成活动详情二维码 生成太阳码并上传OSS 30天有效
+func MakeActivityDetailImg(activityId int) (imgUrl string, err error) {
+	var msg string
+	defer func() {
+		if err != nil || msg != "" {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg("生成活动详情二维码,失败,MakeActivityDetailImg 活动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
+	}
+	itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
+	if err != nil {
+		return
+	}
+	if itemToken.AccessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	client := resty.New()
+	resp, err := client.R().
+		SetQueryParam("access_token", itemToken.AccessToken).
+		SetBody(map[string]interface{}{
+			"path":  "activityPages/activityDetail/activityDetail?id=" + strconv.Itoa(activityId),
+			"width": 430,
+		}).
+		Post("https://api.weixin.qq.com/wxa/getwxacode")
+
+	if err != nil {
+		return
+	}
+	if resp.StatusCode() != http.StatusOK {
+		return
+	}
+	fmt.Println(resp.Status())
+	var resourceUrl string
+
+	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"
+	imageContent, e := os.Create(imagePath)
+	if e != nil {
+		err = e
+		msg = "获取微信二维码失败,Err:" + err.Error()
+		return
+	}
+	writeStringRes, e := io.WriteString(imageContent, string(resp.Body()))
+	if e != nil {
+		err = e
+		fmt.Println("writeStringRes", 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)
+	}()
+	fmt.Println(resourceUrl)
+	return
+}
+
+// MakeActivityDetailImg2  生成活动详情二维码 生成太阳码并上传OSS 永久有效
+func MakeActivityDetailImg2(activityId int) (imgUrl string, err error) {
+	var msg string
+	defer func() {
+		if err != nil || msg != "" {
+			fmt.Println(err)
+			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
+	}
+
+	itemToken, err := models.GetWxToken(utils.WxCygxAppId, utils.WxCygxAppSecret)
+	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":"activityPages/activityDetail/activityDetail",
+		"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
+	}
+
+	err = cygx.UpdateCygxActivityXcxDetailImg(resourceUrl, activityId)
+	fmt.Println("resourceUrl", resourceUrl)
+
+	return
+}

+ 110 - 2
services/cygx/resource_data.go

@@ -7,6 +7,7 @@ import (
 	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -181,7 +182,7 @@ func UpdateActivitySpecialResourceData(sourceId int) {
 	var pars []interface{}
 	condition = ` AND publish_status = 1  AND  activity_id = ?  `
 	pars = append(pars, sourceId)
-	total, e := cygx.GetActivityCount(condition, pars)
+	total, e := cygx.GetActivitySpecilCount(condition, pars)
 	if e != nil {
 		err = errors.New("GetCygxReportSelection, Err: " + e.Error())
 		return
@@ -229,7 +230,6 @@ func UpdateActivitySpecialResourceData(sourceId int) {
 		} else {
 			item.SearchOrderTime = activityInfo.PublishDate
 		}
-
 		if totalData == 0 {
 			newId, e := cygx.AddCygxResourceData(item)
 			if e != nil {
@@ -1290,6 +1290,114 @@ func UpdateAskserieVideoResourceData(sourceId int) {
 	return
 }
 
+//func init() {
+//	UpdateIndustrialsourceHzResourceData(731, "HZ")
+//}
+
+func UpdateIndustrialsourceHzResourceDataById(industrialManagementIds []string, sourceType string) {
+	for _, v := range industrialManagementIds {
+		if v == "" {
+			continue
+		}
+		industrialManagementId, _ := strconv.Atoi(v)
+		if industrialManagementId < 1 {
+			continue
+		}
+		UpdateIndustrialsourceHzResourceData(industrialManagementId, sourceType)
+	}
+
+}
+
+// 更新产业资源包  写入首页最新  cygx_resource_data 表
+func UpdateIndustrialsourceHzResourceData(sourceId int, sourceType string) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("UpdateIndustrialsourceHzResourceData 失败: ", sourceId, err.Error()), 2)
+		}
+	}()
+	var source string
+	var e error
+	var maxData string
+	if sourceType == "Hz" {
+		maxData, e = cygx.GetIndustrialManagementGroupArticleMaxPublishDateByHz(sourceId)
+		if e != nil {
+			err = errors.New("GetIndustrialManagementGroupArticleMaxPublishDateByHz, Err: " + e.Error())
+			return
+		}
+		source = "industrialsourceHz"
+	} else {
+		maxData, e = cygx.GetIndustrialManagementGroupArticleMaxPublishDateByYx(sourceId)
+		if e != nil {
+			err = errors.New("GetIndustrialManagementGroupArticleMaxPublishDateByYx, Err: " + e.Error())
+			return
+		}
+		source = "industrialsourceYx"
+	}
+
+	if maxData == "" {
+		e = cygx.DeleteResourceData(sourceId, source)
+		if e != nil {
+			err = errors.New("DeleteResourceData, Err: " + e.Error())
+			return
+		}
+		return
+	}
+
+	industrialItem, e := cygx.GetIndustrialManagementInfo(sourceId)
+	if e != nil {
+		err = errors.New("GetIndustrialManagementInfo, Err: " + e.Error())
+		return
+	}
+
+	var subjectNames []string
+	listSub, e := cygx.GetcygxIndustrialSubject(sourceId)
+	if e != nil {
+		err = errors.New("GetcygxIndustrialSubject, Err: " + e.Error())
+		return
+	}
+	for _, v := range listSub {
+		subjectNames = append(subjectNames, v.SubjectName)
+	}
+
+	//判断是否存在,如果不存在就新增,存在就更新
+	totalData, e := cygx.GetCygxResourceDataBySourceAndIdCount(sourceId, source)
+	if e != nil {
+		err = errors.New("GetCygxResourceDataBySourceAndIdCount, Err: " + e.Error())
+		return
+	}
+
+	item := new(cygx.CygxResourceData)
+	item.SourceId = sourceId
+	item.Source = source
+	item.PublishDate = maxData
+	item.CreateTime = time.Now()
+	if len(subjectNames) == 0 {
+		item.SearchTitle = industrialItem.IndustryName
+	} else {
+		item.SearchTitle = industrialItem.IndustryName + "," + strings.Join(subjectNames, ",")
+	}
+	item.SearchContent = ""
+	item.SearchOrderTime = maxData
+	//fmt.Println(item)
+	//return
+	if totalData == 0 {
+		_, e := cygx.AddCygxResourceData(item)
+		if e != nil {
+			err = errors.New("AddCygxResourceData, Err: " + e.Error())
+			return
+		}
+	} else {
+		e = cygx.UpdateResourceDataByItem(item)
+		if e != nil {
+			err = errors.New("UpdateResourceDataByItem, Err: " + e.Error())
+			return
+		}
+	}
+	return
+}
+
 func init300() {
 	//var condition string
 	//var pars []interface{}

+ 92 - 0
services/cygx/user_rai_label.go

@@ -0,0 +1,92 @@
+package cygx
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hz_crm_api/models/cygx"
+	"hongze/hz_crm_api/services/alarm_msg"
+	"hongze/hz_crm_api/utils"
+	"time"
+)
+
+// GetUserLabelByUserIdArr 根据多个userId 获取每个UserId最新的十条数据
+func GetUserLabelByUserIdArr(userIdArr []int) (mapRsp map[int][]*cygx.WxUserRaiLabelListResp) {
+	if len(userIdArr) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("根据多个userId 获取每个UserId最新的十条数据失败:"+err.Error(), "userIdArr", userIdArr), 2)
+		}
+	}()
+	labelList, e := cygx.GetWxUserRaiLabelListByUserIds(userIdArr)
+	if e != nil {
+		err = errors.New("GetWxUserRaiLabelListByUserIds, Err: " + e.Error())
+		return
+	}
+	mapRsp = make(map[int][]*cygx.WxUserRaiLabelListResp)
+	for _, v := range labelList {
+		mapRsp[v.UserId] = append(mapRsp[v.UserId], v)
+	}
+	return
+}
+
+// DeleteActivityWxUserRaiLabel 点了到会,又点了取消的人,对应的活动标签给取消掉
+func DeleteActivityWxUserRaiLabel(userIdArr []int, activityId int) {
+	if len(userIdArr) == 0 {
+		return
+	}
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			go alarm_msg.SendAlarmMsg(fmt.Sprint("点了到会,又点了取消的人,对应的活动标签给取消掉失败, DeleteActivityWxUserRaiLabel Err:"+err.Error(), "userIdArr", userIdArr), 2)
+		}
+	}()
+	e := cygx.DeleteWxUserRaiLabelWithActivity(userIdArr, activityId)
+	if e != nil {
+		err = errors.New("DeleteWxUserRaiLabelWithActivity, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// 添加用户参加活动标签到Redis
+func ActivityWxUserRaiLabelRedisAdd(sourceId, uid int, createTime time.Time) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("sourceId:", sourceId, "userId:", uid)
+			go alarm_msg.SendAlarmMsg("添加用户参加活动标签,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	log := &cygx.WxUserRaiLabelRedis{UserId: uid, SourceId: sourceId, SourceType: 2, CreateTime: createTime}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.WX_USER_RAI_LABEL_KEY, log)
+		if err != nil {
+			fmt.Println("ActivityWxUserRaiLabelRedisAdd LPush Err:" + err.Error())
+		}
+	}
+	return
+}
+
+// 添加用户参加路演标签到Redis
+func RoadShowWxUserRaiLabelRedisAdd(sourceId, uid int, createTime time.Time) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println(err)
+			msg := fmt.Sprint("sourceId:", sourceId, "userId:", uid)
+			go alarm_msg.SendAlarmMsg("添加用户参加路演标签,写入Redis队列消息失败:"+err.Error()+msg, 2)
+		}
+	}()
+	log := &cygx.WxUserRaiLabelRedis{UserId: uid, SourceId: sourceId, SourceType: 3, CreateTime: createTime}
+	if utils.Re == nil {
+		err := utils.Rc.LPush(utils.WX_USER_RAI_LABEL_KEY, log)
+		if err != nil {
+			fmt.Println("RoadShowWxUserRaiLabelRedisAdd LPush Err:" + err.Error())
+		}
+	}
+	return
+}

+ 1 - 1
services/elastic/es_comprehensive.go

@@ -578,7 +578,7 @@ func AddComprehensiveIndustrialSource(sourceType string, articleId int) {
 		item.SubjectNames = strings.Join(mapActivitySubject[v.IndustrialManagementId], ",")
 		item.PublishDate = v.PublishDate + " 00:00:00"
 		EsAddOrEditComprehensiveData(item)
-		UpdateComprehensiveIndustrialResourceData(item)
+		//UpdateComprehensiveIndustrialResourceData(item)
 	}
 }
 

+ 9 - 0
utils/constants.go

@@ -425,6 +425,7 @@ const (
 	CHART_PERMISSION_ID_45W                        = 2002     // 权益45w大套餐表示的权限ID(自定义)
 	HONG_GUAN_NAME                          string = "宏观"
 	CYGX_ARTICLE_TIME_LINE_KEY                     = "CYGX_ARTICLE_TIME_LINE_KEY" //产业时间线关联的文章key
+	WX_USER_RAI_LABEL_KEY                          = "CYGX_WX_USER_RAI_LABEL_KEY" //用户列表标签key
 )
 
 // 权益cygx_config配置主键以后放这里
@@ -595,6 +596,14 @@ func GetWeeklyDatabase() (databaseName string) {
 	}
 	return
 }
+func GetCygxDatabase() (databaseName string) {
+	if RunMode == "release" {
+		databaseName = `hz_cygx`
+	} else {
+		databaseName = `test_hz_cygx`
+	}
+	return
+}
 
 const (
 	EnCompanyIdStep = 10000000