Browse Source

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_cygx into crm_14.7

xingzai 1 year ago
parent
commit
45701d25db

+ 105 - 34
controllers/activity_special.go

@@ -7,7 +7,6 @@ import (
 	"hongze/hongze_cygx/services"
 	"hongze/hongze_cygx/utils"
 	"strconv"
-	"strings"
 	"time"
 )
 
@@ -247,10 +246,22 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 			itemBill.Source = 1
 			itemBill.DoType = 1
 			itemBill.BillDetailed = -1 // 流水减一
-			itemBill.RegisterPlatform = 1
+			itemBill.RegisterPlatform = utils.REGISTER_PLATFORM
 			itemBill.ChartPermissionId = activityInfo.ChartPermissionId
 			itemBill.ChartPermissionName = activityInfo.ChartPermissionName
 
+			if activityInfo.ChartPermissionName == utils.CE_LUE_NAME {
+				//如果是策略行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
+				maxChartPermissionId, maxChartPermissionName, err := services.GetSpecialBillMaxChartPermissionId(user)
+				if err != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = "获取销售信息失败,GetSpecialBillMaxChartPermissionId Err:" + err.Error()
+					return
+				}
+				itemBill.ChartPermissionId = maxChartPermissionId
+				itemBill.ChartPermissionName = maxChartPermissionName
+			}
+
 			var itemMeeting = new(models.CygxActivitySpecialMeetingDetail)
 			itemMeeting.UserId = user.UserId
 			itemMeeting.ActivityId = activityId
@@ -300,6 +311,14 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 						item.CountryCode = user.CountryCode
 					}
 				}
+
+				err = services.DeductTripRemainingtimesByUser(user, activityInfo) //扣除用户专项调研剩余次数
+				if err != nil {
+					br.Msg = "操作失败"
+					br.ErrMsg = "操作失败,Err:" + err.Error()
+					return
+				}
+
 				err = models.AddCygxActivitySpecialTrip(item)
 				if err != nil {
 					br.Msg = "操作失败"
@@ -323,26 +342,42 @@ func (this *ActivitySpecialCoAntroller) SpecialTripAdd() {
 				//48小时之内的取消也扣除一次参会记录
 				if time.Now().Add(+time.Hour * 48).After(resultTime) {
 					itemBill.BillDetailed = 0 //48小时之内,取消报名之后二次报名,不扣除流水记录
+				} else {
+					err = services.DeductTripRemainingtimesByUser(user, activityInfo) //扣除用户专项调研剩余次数
+					if err != nil {
+						br.Msg = "操作失败"
+						br.ErrMsg = "操作失败,Err:" + err.Error()
+						return
+					}
 				}
 			}
-			userType, tripRemaining, mapChartName, err := services.GetChartPermissionSpecialSurplusByCompany(user.CompanyId)
+			//userType, tripRemaining, mapChartName, err := services.GetChartPermissionSpecialSurplusByCompany(user.CompanyId)
+			//if err != nil {
+			//	br.Msg = "获取专项调研剩余次数失败"
+			//	br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
+			//	return
+			//}
+			//if userType == 2 {
+			//	tripRemaining = tripRemaining + itemBill.BillDetailed
+			//	itemBill.Total = strconv.Itoa(tripRemaining) + "次"
+			//} else {
+			//	for k, num := range mapChartName {
+			//		if activityInfo.ChartPermissionName == k {
+			//			num = num + itemBill.BillDetailed
+			//		}
+			//		itemBill.Total += k + strconv.Itoa(num) + "次+"
+			//	}
+			//	itemBill.Total = strings.TrimRight(itemBill.Total, "+")
+			//}
+
+			totalText, err := services.HandleActivitySpecialTripBillTotalText(user)
 			if err != nil {
-				br.Msg = "获取专项调研剩余次数失败"
-				br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
+				br.Msg = "报名失败,"
+				br.ErrMsg = "二次报名,更改报名是否有效状态失败,Err:" + err.Error()
 				return
 			}
-			if userType == 2 {
-				tripRemaining = tripRemaining + itemBill.BillDetailed
-				itemBill.Total = strconv.Itoa(tripRemaining) + "次"
-			} else {
-				for k, num := range mapChartName {
-					if activityInfo.ChartPermissionName == k {
-						num = num + itemBill.BillDetailed
-					}
-					itemBill.Total += k + strconv.Itoa(num) + "次+"
-				}
-				itemBill.Total = strings.TrimRight(itemBill.Total, "+")
-			}
+			itemBill.Total = totalText
+
 			//添加流水记录
 			err = models.AddCygxActivitySpecialTripBill(itemBill)
 			if err != nil {
@@ -404,6 +439,16 @@ func (this *ActivitySpecialCoAntroller) Tripcancel() {
 		return
 	}
 	activityId := req.ActivityId
+	total, err := models.GetUserActivitySpecialTripCount(user.UserId, activityId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取日程数量信息失败,Err:" + err.Error()
+		return
+	}
+	if total == 0 {
+		br.Msg = "已取消报名!"
+		return
+	}
 	activityInfo, errInfo := models.GetCygxActivitySpecialDetailById(uid, activityId)
 	if activityInfo == nil {
 		br.Msg = "操作失败"
@@ -428,35 +473,61 @@ func (this *ActivitySpecialCoAntroller) Tripcancel() {
 	itemBill.Source = 1
 	itemBill.DoType = 2
 	itemBill.BillDetailed = 1 // 流水加一
-	itemBill.RegisterPlatform = 1
+	itemBill.RegisterPlatform = utils.REGISTER_PLATFORM
 	itemBill.ChartPermissionId = activityInfo.ChartPermissionId
 	itemBill.ChartPermissionName = activityInfo.ChartPermissionName
 	resultTime := utils.StrTimeToTime(activityInfo.ActivityTime)
+
+	if activityInfo.ChartPermissionName == utils.CE_LUE_NAME {
+		//如果是策略行业,把代扣行业信息放入流水表,取消报名的时候,返点使用
+		lastTripBill, err := models.GetCygxActivitySpecialTripBillLastDetialByActivityId(activityInfo.ActivityId, user.UserId)
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "获取销售信息失败,GetSpecialBillMaxChartPermissionId Err:" + err.Error()
+			return
+		}
+		itemBill.ChartPermissionId = lastTripBill.ChartPermissionId
+		itemBill.ChartPermissionName = lastTripBill.ChartPermissionName
+	}
 	//48小时之内的取消也扣除一次参会记录
 	var isValid int
 	if time.Now().Add(+time.Hour * 48).After(resultTime) {
 		isValid = 1
 		itemBill.BillDetailed = 0 //48小时之内取消的活动扣点不返回
-	}
-	userType, tripRemaining, mapChartName, err := services.GetChartPermissionSpecialSurplusByCompany(user.CompanyId)
-	if err != nil {
-		br.Msg = "获取专项调研剩余次数失败"
-		br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
-		return
-	}
-	if userType == 2 {
-		tripRemaining += itemBill.BillDetailed
-		itemBill.Total = strconv.Itoa(tripRemaining) + "次"
 	} else {
-		for k, num := range mapChartName {
-			if activityInfo.ChartPermissionName == k {
-				num += itemBill.BillDetailed
-			}
-			itemBill.Total += k + strconv.Itoa(num) + "次+"
+		err = services.RebateTripRemainingtimesByUser(user, activityInfo) // 返点
+		if err != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "操作失败,RebateTripRemainingtimesByUserErr:" + err.Error()
+			return
 		}
-		itemBill.Total = strings.TrimRight(itemBill.Total, "+")
 	}
+	//userType, tripRemaining, mapChartName, err := services.GetChartPermissionSpecialSurplusByCompany(user.CompanyId)
+	//if err != nil {
+	//	br.Msg = "获取专项调研剩余次数失败"
+	//	br.ErrMsg = "获取专项调研剩余次数失败,err:" + err.Error()
+	//	return
+	//}
+	//if userType == 2 {
+	//	tripRemaining += itemBill.BillDetailed
+	//	itemBill.Total = strconv.Itoa(tripRemaining) + "次"
+	//} else {
+	//	for k, num := range mapChartName {
+	//		if activityInfo.ChartPermissionName == k {
+	//			num += itemBill.BillDetailed
+	//		}
+	//		itemBill.Total += k + strconv.Itoa(num) + "次+"
+	//	}
+	//	itemBill.Total = strings.TrimRight(itemBill.Total, "+")
+	//}
 
+	totalText, err := services.HandleActivitySpecialTripBillTotalText(user)
+	if err != nil {
+		br.Msg = "操作失败,"
+		br.ErrMsg = "HandleActivitySpecialTripBillTotalText,Err:" + err.Error()
+		return
+	}
+	itemBill.Total = totalText
 	err = models.CancelActivitySpecialTripIsValid(isValid, activityInfo.ActivityId, uid)
 	if err != nil {
 		br.Msg = "操作失败"

+ 4 - 2
controllers/article.go

@@ -226,6 +226,7 @@ func (this *ArticleController) Detail() {
 			goto Loop
 		} else {
 			var articlePermissionName string
+			var matchTypeName string //查研观向这边的匹配类型
 			if detail.CategoryId > 0 {
 				articlePermission, err := models.GetArticlePermission(detail.CategoryId)
 				if err != nil {
@@ -239,6 +240,7 @@ func (this *ArticleController) Detail() {
 					return
 				}
 				articlePermissionName = articlePermission.PermissionName
+				matchTypeName = articlePermission.MatchTypeName
 			} else {
 				articlePermissionName = detail.CategoryName
 			}
@@ -288,8 +290,8 @@ func (this *ArticleController) Detail() {
 			//}
 			//}
 
-			//大行业通过权限校验,再校验主客观权限。只有医药、消费、科技、智造,才会校验主客观权限
-			if hasPersion && utils.InArrayByStr([]string{utils.YI_YAO_NAME, utils.XIAO_FEI_NAME, utils.KE_JI_NAME, utils.ZHI_ZAO_NAME}, articlePermissionName) {
+			//大行业通过权限校验,再校验主客观权限。只有医药、消费、科技、智造,才会校验主客观权限,热点问答这个匹配类型下的所有报告,也不做主客观校验
+			if hasPersion && utils.InArrayByStr([]string{utils.YI_YAO_NAME, utils.XIAO_FEI_NAME, utils.KE_JI_NAME, utils.ZHI_ZAO_NAME}, articlePermissionName) && matchTypeName != "热点问答" {
 				hasPersion = services.CheckArticlePermissionType(articleId, user)
 			}
 			if hasPersion {

+ 1 - 1
controllers/collection.go

@@ -35,7 +35,7 @@ func (this *CollectionController) BannerList() {
 	var listA []*models.CollectionBannerResp
 	listB := new(models.CollectionBannerResp)
 	listA = []*models.CollectionBannerResp{
-		&models.CollectionBannerResp{Title: "", IndexImg: "https://hzstatic.hzinsights.com/cygx/banner/xcx/lyhf.png", Path: "/reportPages/internalDetials/internalDetials?id=43"},
+		&models.CollectionBannerResp{Title: "", IndexImg: "https://hzstatic.hzinsights.com/cygx/banner/xcx/lyhf.png", Path: "/reportPages/trainVideoPages/trainVideoPages"},
 	}
 	listB.Title = ""
 	listB.IndexImg = "https://hzstatic.hzinsights.com/cygx/banner/xcx/jxkb.png"

+ 134 - 0
controllers/micro_roadshow.go

@@ -865,3 +865,137 @@ func (this *MicroRoadShowController) CommentDetail() {
 	br.Msg = "操作成功"
 	return
 }
+
+// @Title 策略系列培训视频
+// @Description 策略系列培训视频接口
+// @Param   PageSize		query	int		true	"每页数据条数"
+// @Param   CurrentIndex	query	int		true	"当前页页码,从1开始"
+// @Success 200 {object} models.HomeListResp
+// @router /training/list [get]
+func (this *MicroRoadShowController) TrainingList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,用户信息为空"
+		br.Ret = 408
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+
+	var audioIds []string
+	var videoIds []string
+	var activityVideoIds []string
+	var askserieVideoIds []string                                                                                                  //问答系列视频
+	activityVideoIds = []string{"461", "462", "463", "464", "465", "466"}                                                          // 系列培训视频,固定的六个,这里先写死
+	activityVideoTitle := []string{"第一期_A股运行特征探讨", "第二期_行业比较研究", "第三期_市场风格观察与我们的研究方法", "第四期_市场估值指标追踪", "第五期_宏观经济研究", "第六期_市场回顾专题"} // 系列培训视频,固定的六个,这里先写死
+	audioIdstr := strings.Join(audioIds, ",")
+	ideoIdsStr := strings.Join(videoIds, ",")
+	activityVideoIdsStr := strings.Join(activityVideoIds, ",")
+	askserieVideoIdsStr := strings.Join(askserieVideoIds, ",")
+	// 微路演列表
+	list, total, e := services.GetMicroRoadShowMycollectV12(pageSize, currentIndex, audioIdstr, activityVideoIdsStr, ideoIdsStr, askserieVideoIdsStr, user)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取微路演列表失败, Err: " + e.Error()
+		return
+	}
+
+	//存储反转数据
+	reversed := []*models.MicroRoadShowPageList{}
+	for i := range list {
+		n := list[len(list)-1-i]
+		reversed = append(reversed, n)
+	}
+	list = reversed
+
+	// 用户权限
+	authInfo, permissionArr, e := services.GetUserRaiPermissionInfo(user.UserId, user.CompanyId)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取用户权限失败, Err: " + e.Error()
+		return
+	}
+
+	// 获取默认图配置
+	audioMap, videoMap, audioShareMap, videoShareMap, e := services.GetMicroRoadShowDefaultImgConfig()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取微路演列表失败, Err: " + e.Error()
+		return
+	}
+	for i := range list {
+		// 权限
+		au := new(models.UserPermissionAuthInfo)
+		au.SellerName = authInfo.SellerName
+		au.SellerMobile = authInfo.SellerMobile
+		au.HasPermission = authInfo.HasPermission
+		au.OperationMode = authInfo.OperationMode
+		if au.HasPermission == 1 {
+			// 非宏观权限进一步判断是否有权限
+			if list[i].ChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, list[i].ChartPermissionName) {
+				au.HasPermission = 2
+			}
+		}
+		// 无权限的弹框提示
+		if au.HasPermission != 1 {
+			if au.OperationMode == services.UserPermissionOperationModeCall {
+				if list[i].Type == 1 {
+					au.PopupMsg = services.UserPermissionPopupMsgCallActivity
+				} else {
+					au.PopupMsg = services.UserPermissionPopupMsgCallMicroVideo
+				}
+			} else {
+				if list[i].Type == 1 {
+					au.PopupMsg = services.UserPermissionPopupMsgApplyActivity
+				} else {
+					au.PopupMsg = services.UserPermissionPopupMsgApplyMicroVideo
+				}
+			}
+		}
+		list[i].AuthInfo = au
+		list[i].PublishTime = utils.StrTimeToTime(list[i].PublishTime).Format(utils.FormatDate)
+		// 默认图
+		if list[i].BackgroundImg == "" {
+			if list[i].Type == 1 {
+				list[i].BackgroundImg = audioMap[list[i].ChartPermissionId]
+			} else {
+				list[i].BackgroundImg = videoMap[list[i].ChartPermissionId]
+			}
+		}
+		list[i].BackgroundImg = "https://hzstatic.hzinsights.com/cygx/micro_roadshow_default_cl_video.png" //前端小程序忘记添加音视频图标,先手动替换
+		// 分享图
+		if list[i].ShareImg == "" {
+			if list[i].Type == 1 {
+				list[i].ShareImg = audioShareMap[list[i].ChartPermissionId]
+			} else {
+				list[i].ShareImg = videoShareMap[list[i].ChartPermissionId]
+			}
+		}
+		if i <= len(activityVideoTitle)-1 {
+			list[i].Title = activityVideoTitle[i]
+		}
+	}
+
+	resp := new(models.MicroRoadShowListResp)
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp.List = list
+	resp.Paging = page
+	resp.Describe = "弘则策略首席 马冬凡 主讲"
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 10 - 12
controllers/morning_meeting.go

@@ -169,18 +169,16 @@ func (this *MorningMeetingController) GatherDetail() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取失败,Err:" + err.Error()
 		}
-		detailResp.List = listMeet
-		//for _, v := range listMeet {
-		//	detailResp.List = append(detailResp.List, &models.CygxMorningMeetingGatherDetailListResp{
-		//		Id:                  v.Id,
-		//		IndustryId:          v.IndustryId,
-		//		IndustryName:        v.IndustryName,
-		//		ChartPermissionName: v.ChartPermissionName,
-		//		ChartPermissionId:   v.ChartPermissionId,
-		//		MeetingId:           int(v.MeetingId),
-		//		Content:             v.Content,
-		//	})
-		//}
+
+		var meetingreviewchaptIds []int
+		for _, v := range listMeet {
+			meetingreviewchaptIds = append(meetingreviewchaptIds, v.Id)
+		}
+		detailResp.List, err = services.GetCygxMorningMeetingReviewChapterListByIds(meetingreviewchaptIds)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "GetCygxMorningMeetingReviewChapterListByIds,Err:" + err.Error()
+		}
 	} else {
 		detailResp.List = make([]*models.CygxMorningMeetingGatherDetailListResp, 0)
 	}

+ 1 - 0
controllers/product_interior.go

@@ -131,6 +131,7 @@ func (this *ProductInteriorController) Detail() {
 		br.Msg = "获取信息失败"
 		br.ErrMsg = "获取用户权限信息失败,Err:" + err.Error()
 	}
+	resp.Disclaimers = utils.DISCLAIMERS // 免责声明
 	go services.AddCygxProductInteriorHistory(user, productInteriorId)
 	go services.ProductInteriorHistoryUserRmind(user, productInteriorId)
 	br.Ret = 200

+ 78 - 52
controllers/report.go

@@ -407,44 +407,44 @@ func (this *ReportController) ArticleCategoryList() {
 			return
 		}
 		//查询用户今天是否看过时间线
-		haveMorningMeeting := false
-		var morningMeetingTime string
-		count, err := models.GetTimeLineRecordCount(user.UserId, industrialManagementId)
-		if err != nil {
-			br.Msg = "查询浏览记录数量失败"
-			br.ErrMsg = "查询浏览记录数量失败,Err:" + err.Error()
-			return
-		}
-		var recordItem *models.CygxPageHistoryRecord
-		if count > 1 {
-			recordItem, err = models.GetTimeLineRecordItem(user.UserId, industrialManagementId)
-			if err != nil {
-				br.Msg = "查询浏览记录失败"
-				br.ErrMsg = "查询浏览记录失败,Err:" + err.Error()
-				return
-			}
-		}
+		//haveMorningMeeting := false
+		//var morningMeetingTime string
+		//count, err := models.GetTimeLineRecordCount(user.UserId, industrialManagementId)
+		//if err != nil {
+		//	br.Msg = "查询浏览记录数量失败"
+		//	br.ErrMsg = "查询浏览记录数量失败,Err:" + err.Error()
+		//	return
+		//}
+		//var recordItem *models.CygxPageHistoryRecord
+		//if count > 1 {
+		//	recordItem, err = models.GetTimeLineRecordItem(user.UserId, industrialManagementId)
+		//	if err != nil {
+		//		br.Msg = "查询浏览记录失败"
+		//		br.ErrMsg = "查询浏览记录失败,Err:" + err.Error()
+		//		return
+		//	}
+		//}
 
 		for _, v := range timeLineList {
 			if v.Readnum == 0 && user.CreatedTime.Before(utils.StrTimeToTime(v.PublishTime)) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(v.PublishTime)) {
 				if v.SubCategoryName == "时间线" {
-					haveMorningMeeting = true
-					morningMeetingTime = v.PublishTime
+					//haveMorningMeeting = true
+					//morningMeetingTime = v.PublishTime
 					continue
 				}
 				timeLineItem.IsRed = true
 			}
 		}
 		//因为无法记录用户是否看过晨会点评,所以用用户今天是否看过时间线来判断是否显示小红点,这里是判断分类的小红点
-		timeLineRed := false
-		if count < 2 {
-			timeLineRed = true
-		} else if count > 1 && recordItem.CreateTime.Before(utils.StrTimeToTime(morningMeetingTime)) {
-			timeLineRed = true
-		}
-		if !timeLineItem.IsRed && timeLineRed && haveMorningMeeting {
-			timeLineItem.IsRed = true
-		}
+		//timeLineRed := false
+		//if count < 2 {
+		//	timeLineRed = true
+		//} else if count > 1 && recordItem.CreateTime.Before(utils.StrTimeToTime(morningMeetingTime)) {
+		//	timeLineRed = true
+		//}
+		//if !timeLineItem.IsRed && timeLineRed && haveMorningMeeting {
+		//	timeLineItem.IsRed = true
+		//}
 		list = append([]*models.IndustrialToArticleCategoryRep{&timeLineItem}, list...)
 
 		if chapterId > 0 && isSendWx == 1 {
@@ -650,6 +650,28 @@ func (this *ReportController) List() {
 			br.ErrMsg = "获取帖子数据失败,Err:" + err.Error()
 			return
 		}
+
+		//处理晨会精华关联的标的,以及要跳转的文章ID
+		var meetingreviewchaptIds []int
+		mapchaptIdAndArticleId := make(map[int]int)                            // 晨会精华ID与跳转文章ID的映射关系
+		mapchaptIdListSubject := make(map[int][]*models.CygxIndustrialSubject) // 晨会精华ID与标的列表的映射关系
+		for _, v := range list {
+			if v.Resource == 3 {
+				meetingreviewchaptIds = append(meetingreviewchaptIds, v.Id)
+				v.Content = services.AnnotationHtml(v.Content)
+			}
+		}
+		if len(meetingreviewchaptIds) > 0 {
+			listMeet, err := services.GetCygxMorningMeetingReviewChapterListByIds(meetingreviewchaptIds)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "GetCygxMorningMeetingReviewChapterListByIds,Err:" + err.Error()
+			}
+			for _, v := range listMeet {
+				mapchaptIdAndArticleId[v.Id] = v.LinkArticleId
+				mapchaptIdListSubject[v.Id] = v.ListSubject
+			}
+		}
 		//对应分类的所图片
 		detailCategoryUrl, err := models.GetConfigByCode("category_map_img_url")
 		if err != nil {
@@ -677,35 +699,35 @@ func (this *ReportController) List() {
 		//}
 
 		//查询用户今天是否看过时间线
-		count, err := models.GetTimeLineRecordCount(user.UserId, industrialManagementId)
-		if err != nil {
-			br.Msg = "查询浏览记录数量失败"
-			br.ErrMsg = "查询浏览记录数量失败,Err:" + err.Error()
-			return
-		}
-		var recordItem *models.CygxPageHistoryRecord
-		if count > 1 {
-			recordItem, err = models.GetTimeLineRecordItem(user.UserId, industrialManagementId)
-			if err != nil {
-				br.Msg = "查询浏览记录失败"
-				br.ErrMsg = "查询浏览记录失败,Err:" + err.Error()
-				return
-			}
-		}
+		//count, err := models.GetTimeLineRecordCount(user.UserId, industrialManagementId)
+		//if err != nil {
+		//	br.Msg = "查询浏览记录数量失败"
+		//	br.ErrMsg = "查询浏览记录数量失败,Err:" + err.Error()
+		//	return
+		//}
+		//var recordItem *models.CygxPageHistoryRecord
+		//if count > 1 {
+		//	recordItem, err = models.GetTimeLineRecordItem(user.UserId, industrialManagementId)
+		//	if err != nil {
+		//		br.Msg = "查询浏览记录失败"
+		//		br.ErrMsg = "查询浏览记录失败,Err:" + err.Error()
+		//		return
+		//	}
+		//}
 
 		for k, v := range list {
 			if v.SubCategoryName != "时间线" && v.Readnum == 0 && user.CreatedTime.Before(utils.StrTimeToTime(v.PublishTime)) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(v.PublishTime)) {
 				list[k].IsRed = true
 			}
-			timeLineRed := false
-			if count < 2 && v.SubCategoryName == "时间线" {
-				timeLineRed = true
-			} else if count > 1 && recordItem.CreateTime.Before(utils.StrTimeToTime(v.PublishTime)) {
-				timeLineRed = true
-			}
-			if v.SubCategoryName == "时间线" && timeLineRed {
-				list[k].IsRed = true
-			}
+			//timeLineRed := false
+			//if count < 2 && v.SubCategoryName == "时间线" {
+			//	timeLineRed = true
+			//} else if count > 1 && recordItem.CreateTime.Before(utils.StrTimeToTime(v.PublishTime)) {
+			//	timeLineRed = true
+			//}
+			//if v.SubCategoryName == "时间线" && timeLineRed {
+			list[k].IsRed = true
+			//}
 			if v.VideoUrl != "" {
 				list[k].IsHaveVideo = true
 			}
@@ -719,6 +741,10 @@ func (this *ReportController) List() {
 					}
 				}
 			}
+			if v.Resource == 3 {
+				v.LinkArticleId = mapchaptIdAndArticleId[v.Id]
+				v.ListSubject = mapchaptIdListSubject[v.Id]
+			}
 		}
 
 		resp := new(models.TimeLineReportListResp)

+ 1 - 0
controllers/research.go

@@ -831,6 +831,7 @@ func (this *ResearchController) ArticleNewList() {
 			SpecialTags:     v.SpecialTags,
 			UserId:          v.UserId,
 			List:            v.List,
+			TopTime:         v.TopTime,
 		}
 		if v.ArticleTypeId == -1 {
 			item.ArticleTypeName = utils.CYGX_YANXUAN_SPECIAL

+ 1 - 0
controllers/tactics.go

@@ -372,6 +372,7 @@ func (this *TacticsController) TacticsTimeLineList() {
 	for _, v := range list {
 		v.PublishTime = utils.TimeRemoveHms2(v.PublishTime)
 		v.Resource = 1
+		v.Content = services.AnnotationHtml(v.Content)
 	}
 	if len(list) == 0 {
 		list = make([]*models.CygxTacticsTimeLineResp, 0)

+ 5 - 1
controllers/tag.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/services"
+	"hongze/hongze_cygx/utils"
 )
 
 type TagController struct {
@@ -79,7 +80,10 @@ func (this *TagController) TagCustomizeList() {
 		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
 		return
 	}
-
+	item := new(models.ChartPermission)
+	item.ChartPermissionId = utils.GU_SHOU_ID
+	item.PermissionName = utils.GU_SHOU_NAME
+	listPermission = append(listPermission, item)
 	resp := new(models.CygxTagListResp)
 
 	resp.List = list

+ 36 - 0
models/activity_special_permission_points.go

@@ -0,0 +1,36 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type CygxActivitySpecialPermissionPoints struct {
+	Id                  int       `orm:"column(id);pk"`
+	CompanyId           int       `description:"公司ID"`
+	Points              int       `description:"剩余点数"`
+	CompanyName         string    `description:"公司名称"`
+	ChartPermissionId   int       `description:"行业id"`
+	ChartPermissionName string    `description:"行业名称"`
+	CreateTime          time.Time `description:"创建时间"`
+	ModifyTime          time.Time `description:"更新时间"`
+}
+
+// 获取公司每个行业剩余研选点数列表
+func GetCygxActivitySpecialPermissionPointsList(condition string, pars []interface{}) (items []*CygxActivitySpecialPermissionPoints, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_activity_special_permission_points WHERE 1 = 1  `
+	if condition != "" {
+		sql += condition
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// 更新公司每个行业剩余研选点数
+func UpdateCygxActivitySpecialPermissionPoints(points, companyId, chartPermissionId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE cygx_activity_special_permission_points SET points = ?  WHERE company_id=?  AND chart_permission_id=? `
+	_, err = o.Raw(sql, points, companyId, chartPermissionId).Exec()
+	return
+}

+ 11 - 0
models/activity_special_trip_bill.go

@@ -187,3 +187,14 @@ func UpdateCygxActivitySpecialTripBillByCompanyIdForInit(total string, id int) (
 	_, err = o.Raw(sql, total, id).Exec()
 	return
 }
+
+// GetCygxActivitySpecialTripBillLastDetialByActivityId  根据活动ID获取最后一条扣点明细
+func GetCygxActivitySpecialTripBillLastDetialByActivityId(activityId, userId int) (item *CygxActivitySpecialTripBill, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT *
+			FROM
+			cygx_activity_special_trip_bill  
+			WHERE 1 = 1  AND activity_id =?  AND  user_id = ?    ORDER BY id  DESC LIMIT 1 `
+	err = o.Raw(sql, activityId, userId).QueryRow(&item)
+	return
+}

+ 2 - 2
models/article.go

@@ -229,10 +229,10 @@ func GetArticleDetailByIdStr(articleIdStr string) (items []*ArticleDetail, err e
 	return
 }
 
-func GetArticlePermission(companyId int) (item *ChartPermission, err error) {
+func GetArticlePermission(companyId int) (item *ChartPermissionItemResp, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT
-			a.chart_permission_name as  permission_name
+			a.chart_permission_name as  permission_name,a.match_type_name
 			FROM
 			cygx_report_mapping AS a
 			WHERE

+ 9 - 0
models/chart_permission.go

@@ -13,6 +13,15 @@ type ChartPermission struct {
 	IsChoose          bool   `description:"是否选择"`
 }
 
+type ChartPermissionItemResp struct {
+	ChartPermissionId int    `description:"权限id"`
+	PermissionName    string `description:"权限名称"`
+	IsShowSustainable bool   `description:"是否展示限免标签"`
+	ImageUrlM         string `description:"图片地址"`
+	IsChoose          bool   `description:"是否选择"`
+	MatchTypeName     string `description:"匹配类型名称"`
+}
+
 type ActivityChartPermission struct {
 	ChartPermissionId int    `description:"权限id"`
 	PermissionName    string `description:"权限名称"`

+ 13 - 8
models/cygx_morning_meeting_gather.go

@@ -67,14 +67,19 @@ func GetCygxMorningMeetingGatherById(condition string, pars []interface{}) (item
 }
 
 type CygxMorningMeetingGatherDetailListResp struct {
-	Id                  int    `description:"ID"`
-	IndustryId          int    `description:"产业id"` // 产业id
-	IndustryName        string `description:"产业名称"` // 产业名称
-	ChartPermissionName string `description:"行业名称"` // 行业名称
-	ChartPermissionId   int    `description:"行业id"` // 行业id
-	MeetingId           int    `description:"主表id"` // 主表id
-	Content             string `description:"内容"`   // 内容
-	PublishTime         string `description:"发布日期"`
+	Id                   int                      `description:"ID"`
+	IndustryId           int                      `description:"产业id"` // 产业id
+	IndustryName         string                   `description:"产业名称"` // 产业名称
+	ChartPermissionName  string                   `description:"行业名称"` // 行业名称
+	ChartPermissionId    int                      `description:"行业id"` // 行业id
+	MeetingId            int                      `description:"主表id"` // 主表id
+	Content              string                   `description:"内容"`   // 内容
+	PublishTime          string                   `description:"发布日期"`
+	ReportLink           string                   `description:"报告链接"`
+	LinkArticleId        int                      `description:"报告ID链接"`
+	Title                string                   `description:"标题"`
+	IndustrialSubjectIds string                   `description:"标的id"`
+	ListSubject          []*CygxIndustrialSubject `description:"标的列表"`
 }
 
 type CygxMorningMeetingGatherDetailResp struct {

+ 5 - 6
models/industrial_subject.go

@@ -2,15 +2,14 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
-	"time"
 )
 
 type CygxIndustrialSubject struct {
-	IndustrialSubjectId    int       `orm:"column(industrial_subject_id);pk" description:"标的id"`
-	IndustrialManagementId int       `description:"产业id"`
-	SubjectName            string    `description:"标的名称"`
-	CreateTime             time.Time `description:"创建时间"`
-	Source                 int       `description:"来源,1正常添加,2:通过文章添加,3通过活动添加(默认为1)"`
+	IndustrialSubjectId    int    `orm:"column(industrial_subject_id);pk" description:"标的id"`
+	IndustrialManagementId int    `description:"产业id"`
+	SubjectName            string `description:"标的名称"`
+	CreateTime             string `description:"创建时间"`
+	Source                 int    `description:"来源,1正常添加,2:通过文章添加,3通过活动添加(默认为1)"`
 }
 
 // 获取标的列表

+ 3 - 2
models/micro_roadshow.go

@@ -9,8 +9,9 @@ import (
 
 // MicroRoadShowListResp 微路演列表响应体
 type MicroRoadShowListResp struct {
-	Paging *paging.PagingItem
-	List   []*MicroRoadShowPageList
+	Paging   *paging.PagingItem
+	List     []*MicroRoadShowPageList
+	Describe string `description:"说明"`
 }
 
 type CygxMicroRoadshowVideo struct {

+ 3 - 2
models/product_interior.go

@@ -91,8 +91,9 @@ func GetCygxProductInteriorList(condition string, pars []interface{}, startSize,
 
 type GetCygxProductInteriorDetailResp struct {
 	Detail        *CygxProductInteriorResp
-	HasPermission int  `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
-	IsShow        bool `description:"是否展示"`
+	HasPermission int    `description:"1:有该行业权限,正常展示,2:无该行业权限,不存在权益客户下,3:无该品类权限,已提交过申请,4:无该行业权限,未提交过申请,5:潜在客户,未提交过申请,6:潜在客户,已提交过申请"`
+	IsShow        bool   `description:"是否展示"`
+	Disclaimers   string `description:"免责声明"`
 }
 
 // 通过ID获取详情

+ 25 - 21
models/report.go

@@ -510,6 +510,7 @@ type ArticleCollectionResp struct {
 	IndustryTags           string                      `description:"研选专栏行业标签"`
 	CompanyTags            string                      `description:"研选专栏公司标签"`
 	ArticleTypeName        string                      `description:"文章类型名称"`
+	TopTime                int                         `description:"置顶时间"`
 }
 
 type IndustrialManagementResp struct {
@@ -719,6 +720,7 @@ type ArticleResearchResp struct {
 	SpecialTags     string                      `description:"研选专栏标签"`
 	UserId          int                         `description:"作者id"`
 	List            []*IndustrialManagementResp `description:"产业列表"`
+	TopTime         int                         `description:"置顶时间"`
 }
 
 // 获取我的日程数量
@@ -817,7 +819,8 @@ func GetArticleResearchList(condition string, pars []interface{}, startSize, pag
 			0 AS special_type,
 			0 AS user_id,
 			'' AS company_tags, 
-			'' AS industry_tags
+			'' AS industry_tags,
+			a.top_time
 		FROM
 			cygx_article AS a
 			INNER JOIN cygx_article_department AS d ON d.department_id = a.department_id 
@@ -843,19 +846,18 @@ func GetArticleResearchList(condition string, pars []interface{}, startSize, pag
 		a.type AS special_type,
 		a.user_id AS user_id,
 		a.company_tags AS company_tags, 
-		a.industry_tags AS industry_tags 
+		a.industry_tags AS industry_tags,
+		0 as top_time
 	FROM
 	cygx_yanxuan_special AS a
 	JOIN cygx_yanxuan_special_author AS b ON a.user_id = b.user_id
 	WHERE
 	1 = 1  AND a.status = 3 `
-		sql += ` ORDER  BY publish_time DESC  LIMIT ?,? `
-		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
-	} else {
-		sql += ` ORDER  BY publish_time DESC  LIMIT ?,? `
-		_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	}
 
+	sql += ` ORDER  BY top_time DESC, publish_time DESC  LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+
 	return
 }
 
@@ -1380,19 +1382,21 @@ WHERE
 }
 
 type TimeLineReportItem struct {
-	Id               int    `description:"文章或晨报点评id"`
-	Title            string `description:"标题"`
-	PublishTime      string `description:"发布时间"`
-	Content          string `description:"内容"`
-	VideoUrl         string `description:"视频链接"`
-	VoiceUrl         string `description:"音频链接"`
-	VoicePlaySeconds string `description:"音频时长"`
-	IsHaveVideo      bool   `description:"是否包含视频"`
-	ImgUrlPc         string `description:"pc图片"`
-	SubCategoryName  string `description:"二级分类"`
-	IsRed            bool   `description:"是否标红"`
-	Readnum          int    `description:"阅读数量"`
-	Resource         int    `description:"来源类型,1:文章、2:产品内测、3:晨报点评 4:活动回放视频 5:活动回放音频 "`
+	Id               int                      `description:"文章或晨报点评id"`
+	Title            string                   `description:"标题"`
+	PublishTime      string                   `description:"发布时间"`
+	Content          string                   `description:"内容"`
+	VideoUrl         string                   `description:"视频链接"`
+	VoiceUrl         string                   `description:"音频链接"`
+	VoicePlaySeconds string                   `description:"音频时长"`
+	IsHaveVideo      bool                     `description:"是否包含视频"`
+	ImgUrlPc         string                   `description:"pc图片"`
+	SubCategoryName  string                   `description:"二级分类"`
+	IsRed            bool                     `description:"是否标红"`
+	Readnum          int                      `description:"阅读数量"`
+	Resource         int                      `description:"来源类型,1:文章、2:产品内测、3:晨报点评 4:活动回放视频 5:活动回放音频 "`
+	LinkArticleId    int                      `description:"晨会精华报告ID链接"`
+	ListSubject      []*CygxIndustrialSubject `description:"标的列表"`
 }
 
 // 获取产业报告+晨会点评列表
@@ -1422,7 +1426,7 @@ FROM
 		AND man_g.industrial_management_id = ? GROUP BY id UNION ALL
 	SELECT
 		mmc.id,
-		'' AS title,
+		mmc.title,
 		mm.publish_time AS publish_time,
 		'' AS video_url,
 		'' AS voice_url,

+ 9 - 0
routers/commentsRouter.go

@@ -871,6 +871,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:MicroRoadShowController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:MicroRoadShowController"],
+        beego.ControllerComments{
+            Method: "TrainingList",
+            Router: `/training/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:MicroRoadShowController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:MicroRoadShowController"],
         beego.ControllerComments{
             Method: "VideoHistoryAdd",

+ 8 - 1
services/activity_special.go

@@ -984,6 +984,14 @@ func GetSpecialDetailUserPower(user *models.WxUserItem, activityInfo *models.Cyg
 		err = errors.New("GetCompanyPermissionUpgrade, Err: " + e.Error())
 		return
 	}
+
+	//如果有升级权限的自动添加策略的升级权限
+	if permissionStr != "" {
+		if activityInfo.ChartPermissionName == utils.CE_LUE_NAME {
+			permissionStr += "," + utils.CE_LUE_NAME
+		}
+	}
+
 	//如果没有对应的升级权限,则返回
 	if !strings.Contains(permissionStr, activityInfo.ChartPermissionName) {
 		return
@@ -1010,7 +1018,6 @@ func GetSpecialDetailUserPower(user *models.WxUserItem, activityInfo *models.Cyg
 		havePower = true
 		return
 	}
-
 	if strings.Contains(permissionStr, activityInfo.ChartPermissionName) && strings.Contains(activityInfo.CustomerTypeIds, "8") {
 		havePower = true
 		return

+ 273 - 81
services/activity_special_trip.go

@@ -6,6 +6,7 @@ import (
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/utils"
 	"strconv"
+	"strings"
 	"time"
 )
 
@@ -19,7 +20,7 @@ func SpecialTripPopupMsg(activityInfo *models.CygxActivitySpecialDetail, user *m
 		return
 	}
 
-	errMsg, _, e := GetTripRemainingtimesBycompany(user, activityInfo)
+	errMsg, e := CheckTripRemainingtimesBycompany(user, activityInfo)
 	if e != nil {
 		err = errors.New("获取客户剩余报名次数失败 GetActivitySpecialUserType, Err: " + e.Error())
 		return
@@ -52,107 +53,298 @@ func SpecialTripPopupMsg(activityInfo *models.CygxActivitySpecialDetail, user *m
 }
 
 // 获取用户剩余报名次数
-func GetTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (errMsg string, tripRemaining int, err error) {
+//func GetTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (errMsg string, tripRemaining int, err error) {
+//
+//	//获取 专项调研客户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户 8:行业升级套餐客户
+//	msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
+//	//var tripTota int
+//	//var airborneTota int
+//	//userType, _, e := GetActivitySpecialUserType(user.CompanyId)
+//	userType, _, e := GetUserType(user.CompanyId)
+//	if e != nil {
+//		err = errors.New("获取客户身份信息失败 GetActivitySpecialUserType, Err: " + e.Error())
+//		return
+//	}
+//	if userType == 0 {
+//		errMsg = msgTemplate
+//		return
+//	} else if userType == 1 {
+//		tripRemaining = 999
+//		return
+//	} else if userType == 2 {
+//		var condition string
+//		var pars []interface{}
+//
+//		condition += ` AND company_id = ? `
+//		pars = append(pars, user.CompanyId)
+//
+//		//airborneTota, e = models.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
+//		//if e != nil {
+//		//	err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
+//		//	return
+//		//}
+//		//condition += ` AND is_valid = 1 `
+//		//查询当年的数据
+//		condition += ` AND create_time >= ?  `
+//		pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
+//		listTripBill, e := models.GetCygxActivitySpecialTripBill(condition, pars)
+//		if e != nil {
+//			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
+//			return
+//		}
+//		var TripBillNum int
+//		for _, v := range listTripBill {
+//			TripBillNum += v.BillDetailed
+//		}
+//		var packageType int
+//		//大套餐客户,数据库添加标识,
+//		companyUserTypeDetail, errs := models.GetCygxCompanyUserType(user.CompanyId)
+//		if errs != nil && errs.Error() != utils.ErrNoRow() {
+//			err = errs
+//			return
+//		}
+//		if companyUserTypeDetail != nil {
+//			packageType = companyUserTypeDetail.PackageType
+//			if companyUserTypeDetail.CustomerTypeId != 0 {
+//				userType = companyUserTypeDetail.CustomerTypeId
+//				return
+//			}
+//		}
+//
+//		packageTypeMap := map[int]int{1: 16, 2: 10}
+//		totalTrip := packageTypeMap[packageType]
+//		//tripRemaining = 10 - airborneTota + TripBillNum
+//		tripRemaining = totalTrip + TripBillNum
+//		if tripRemaining <= 0 {
+//			errMsg = msgTemplate
+//			return
+//		}
+//		//tripRemaining = 12 - tripTota
+//	} else {
+//		var condition string
+//		var pars []interface{}
+//
+//		condition += ` AND company_id = ? `
+//		pars = append(pars, user.CompanyId)
+//
+//		condition += ` AND chart_permission_id = ? `
+//		pars = append(pars, activityInfo.ChartPermissionId)
+//
+//		//airborneTota, e = models.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
+//		//if e != nil {
+//		//	err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
+//		//	return
+//		//}
+//		//查询当年的数据
+//		condition += ` AND create_time >= ?  `
+//		pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
+//		listTripBill, e := models.GetCygxActivitySpecialTripBill(condition, pars)
+//		if e != nil {
+//			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
+//			return
+//		}
+//		var TripBillNum int
+//		for _, v := range listTripBill {
+//			TripBillNum += v.BillDetailed
+//		}
+//		//tripRemaining = 5 - airborneTota + TripBillNum
+//		tripRemaining = 5 + TripBillNum
+//		if tripRemaining <= 0 {
+//			errMsg = msgTemplate
+//			return
+//		}
+//	}
+//	return
+//}
 
-	//获取 专项调研客户类型   //1、永续客户 //2、大套餐客户(4个行业全开通的正式客户) //3、分行业套餐客户(开通对应行业的正式客户) //4、仅开通专家套餐的正式客户 //5、开通对应行业套餐或专家套餐的试用客户;6、冻结客户;7、流失客户 8:行业升级套餐客户
+// 校验是否还有剩余次数
+func CheckTripRemainingtimesBycompany(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (errMsg string, err error) {
 	msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
-	//var tripTota int
-	//var airborneTota int
-	//userType, _, e := GetActivitySpecialUserType(user.CompanyId)
-	userType, _, e := GetUserType(user.CompanyId)
+	companyId := user.CompanyId
+	chartPermissionName := activityInfo.ChartPermissionName
+
+	companyDetail, e := models.GetCompanyDetailByIdGroup(companyId)
 	if e != nil {
-		err = errors.New("获取客户身份信息失败 GetActivitySpecialUserType, Err: " + e.Error())
+		err = errors.New("GetCompanyDetailByIdGroup, Err:" + e.Error())
 		return
 	}
-	if userType == 0 {
-		errMsg = msgTemplate
+	//永续客户不限制次数
+	if companyDetail.Status == utils.COMPANY_STATUS_FOREVER {
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition = " AND  company_id  = ?  AND points  > 0   ORDER BY  chart_permission_id DESC  "
+	pars = append(pars, companyId)
+	activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
 		return
-	} else if userType == 1 {
-		tripRemaining = 999
+	}
+	//如果没有剩余的点数,就返回
+	if len(activitySpecialPermissionPointsList) == 0 {
+		errMsg = msgTemplate
 		return
-	} else if userType == 2 {
-		var condition string
-		var pars []interface{}
-
-		condition += ` AND company_id = ? `
-		pars = append(pars, user.CompanyId)
+	}
 
-		//airborneTota, e = models.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
-		//if e != nil {
-		//	err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
-		//	return
-		//}
-		//condition += ` AND is_valid = 1 `
-		//查询当年的数据
-		condition += ` AND create_time >= ?  `
-		pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
-		listTripBill, e := models.GetCygxActivitySpecialTripBill(condition, pars)
-		if e != nil {
-			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
-			return
-		}
-		var TripBillNum int
-		for _, v := range listTripBill {
-			TripBillNum += v.BillDetailed
-		}
-		var packageType int
-		//大套餐客户,数据库添加标识,
-		companyUserTypeDetail, errs := models.GetCygxCompanyUserType(user.CompanyId)
-		if errs != nil && errs.Error() != utils.ErrNoRow() {
-			err = errs
-			return
-		}
-		if companyUserTypeDetail != nil {
-			packageType = companyUserTypeDetail.PackageType
-			if companyUserTypeDetail.CustomerTypeId != 0 {
-				userType = companyUserTypeDetail.CustomerTypeId
+	//判断是不是策略行业的活动,策略的任何一个行业有剩余点数都能参加
+	if chartPermissionName == utils.CE_LUE_NAME {
+		return
+	} else {
+		for _, v := range activitySpecialPermissionPointsList {
+			if v.ChartPermissionName == chartPermissionName || v.ChartPermissionId == 0 {
 				return
-			}
+			} // 如果对应行业有剩余次数,或者是属于大套餐且有次数,那么校验也通过
 		}
+	}
+	errMsg = msgTemplate
+	return
 
-		packageTypeMap := map[int]int{1: 16, 2: 10}
-		totalTrip := packageTypeMap[packageType]
-		//tripRemaining = 10 - airborneTota + TripBillNum
-		tripRemaining = totalTrip + TripBillNum
-		if tripRemaining <= 0 {
-			errMsg = msgTemplate
-			return
-		}
-		//tripRemaining = 12 - tripTota
-	} else {
-		var condition string
-		var pars []interface{}
+}
+
+// GetSpecialBillMaxChartPermissionId  获取专项调研剩余点数最多的行业
+func GetSpecialBillMaxChartPermissionId(user *models.WxUserItem) (maxChartPermissionId int, maxChartPermissionName string, err error) {
+	companyId := user.CompanyId
+	var condition string
+	var pars []interface{}
+	condition = " AND  company_id  = ?  AND points  > 0   ORDER BY  points DESC LIMIT 1   "
+	pars = append(pars, companyId)
+
+	activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
+		return
+	}
+	for _, v := range activitySpecialPermissionPointsList {
+		maxChartPermissionId = v.ChartPermissionId
+		maxChartPermissionName = v.ChartPermissionName
+	}
+	return
+}
+
+// DeductTripRemainingtimesByUser 扣除用户专项调研剩余次数
+func DeductTripRemainingtimesByUser(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (err error) {
+	msgTemplate := "您的专项调研次数已用完,如仍想参加,请与您的对口销售商议"
+	companyId := user.CompanyId
+	chartPermissionName := activityInfo.ChartPermissionName
+	var condition string
+	var pars []interface{}
+	condition = " AND  company_id  = ?  AND points  > 0   ORDER BY  points DESC LIMIT 1   "
+	pars = append(pars, companyId)
 
-		condition += ` AND company_id = ? `
-		pars = append(pars, user.CompanyId)
+	//判断是不是策略行业的活动,如果不是策略就获取对应行业的点数 ,策略的任何一个行业有剩余点数都能参加
+	if chartPermissionName != utils.CE_LUE_NAME {
+		pars = make([]interface{}, 0)
+		condition = " AND  company_id  = ?  AND  chart_permission_id  = ?   AND points  > 0   ORDER BY  points DESC LIMIT 1   "
+		pars = append(pars, companyId, activityInfo.ChartPermissionId)
+	}
+	activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
+		return
+	}
+	//如果没有剩余的点数,就返回
+	if len(activitySpecialPermissionPointsList) == 0 {
+		err = errors.New(msgTemplate)
+		return
+	}
+	var maxChartPermissionId int // 剩余点数最多的行业
+	var points int               // 剩余点数
+	for _, v := range activitySpecialPermissionPointsList {
+		maxChartPermissionId = v.ChartPermissionId
+		points = v.Points - 1
+	}
+	//更新对应行业剩余点数
+	e = models.UpdateCygxActivitySpecialPermissionPoints(points, companyId, maxChartPermissionId)
+	if e != nil {
+		err = errors.New("UpdateCygxActivitySpecialPermissionPoints, Err:" + e.Error())
+		return
+	}
+	return
+}
 
-		condition += ` AND chart_permission_id = ? `
-		pars = append(pars, activityInfo.ChartPermissionId)
+// RebateTripRemainingtimesByUser 返点用户专项调研剩余次数
+func RebateTripRemainingtimesByUser(user *models.WxUserItem, activityInfo *models.CygxActivitySpecialDetail) (err error) {
+	companyId := user.CompanyId
+	chartPermissionName := activityInfo.ChartPermissionName
+	var condition string
+	var pars []interface{}
+	condition = " AND  company_id  = ?    ORDER BY  points DESC LIMIT 1   "
+	pars = append(pars, companyId)
 
-		//airborneTota, e = models.GetActivitySpecialTripAirborneCountByActivitySpecial(condition, pars)
-		//if e != nil {
-		//	err = errors.New("GetActivitySpecialTripAirborneCountByActivitySpecial, Err: " + e.Error())
-		//	return
-		//}
-		//查询当年的数据
-		condition += ` AND create_time >= ?  `
-		pars = append(pars, time.Now().Format(utils.FormatYearDate)+"-01-01")
-		listTripBill, e := models.GetCygxActivitySpecialTripBill(condition, pars)
+	//判断是不是策略行业的活动,如果不是策略就获取对应行业的点数 ,策略的任何一个行业有剩余点数都能参加
+	if chartPermissionName != utils.CE_LUE_NAME {
+		pars = make([]interface{}, 0)
+		condition = " AND  company_id  = ?  AND  chart_permission_id  = ?   LIMIT 1   "
+		pars = append(pars, companyId, activityInfo.ChartPermissionId)
+	} else {
+		lastTripBill, e := models.GetCygxActivitySpecialTripBillLastDetialByActivityId(activityInfo.ActivityId, user.UserId)
 		if e != nil {
 			err = errors.New("GetActivitySpecialTripCountByActivitySpecial, Err: " + e.Error())
 			return
 		}
-		var TripBillNum int
-		for _, v := range listTripBill {
-			TripBillNum += v.BillDetailed
+
+		pars = make([]interface{}, 0)
+		condition = " AND  company_id  = ?  AND  chart_permission_id  = ?    LIMIT 1   "
+		pars = append(pars, companyId, lastTripBill.ChartPermissionId)
+	}
+	activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
+		return
+	}
+
+	var maxChartPermissionId int // 剩余点数最多的行业(返点行业)
+	var points int               // 剩余点数
+	for _, v := range activitySpecialPermissionPointsList {
+		maxChartPermissionId = v.ChartPermissionId
+		points = v.Points + 1
+	}
+	//更新对应行业剩余点数
+	e = models.UpdateCygxActivitySpecialPermissionPoints(points, companyId, maxChartPermissionId)
+	if e != nil {
+		err = errors.New("UpdateCygxActivitySpecialPermissionPoints, Err:" + e.Error())
+		return
+	}
+	return
+}
+
+// 预处理专项调研流水明细表描述内容
+func HandleActivitySpecialTripBillTotalText(user *models.WxUserItem) (totalText string, err error) {
+	companyId := user.CompanyId
+	companyDetail, e := models.GetCompanyDetailByIdGroup(companyId)
+	if e != nil {
+		err = errors.New("GetCompanyDetailByIdGroup, Err:" + e.Error())
+		return
+	}
+	//永续客户不限制次数
+	if companyDetail.Status == utils.COMPANY_STATUS_FOREVER {
+		totalText = "0次"
+		return
+	}
+	var condition string
+	var pars []interface{}
+	pars = make([]interface{}, 0)
+	condition = " AND  company_id  = ?  AND points  != 0   ORDER BY  chart_permission_id DESC  "
+	pars = append(pars, companyId)
+	activitySpecialPermissionPointsList, e := models.GetCygxActivitySpecialPermissionPointsList(condition, pars)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetCygxActivitySpecialPermissionPointsList, Err:" + e.Error())
+		return
+	}
+
+	var itemBillTotal []string
+	for _, v := range activitySpecialPermissionPointsList {
+		if v.ChartPermissionId > 0 {
+			itemBillTotal = append(itemBillTotal, fmt.Sprint(v.ChartPermissionName, v.Points, "次")) // 行业套餐客户展示规则
 		}
-		//tripRemaining = 5 - airborneTota + TripBillNum
-		tripRemaining = 5 + TripBillNum
-		if tripRemaining <= 0 {
-			errMsg = msgTemplate
-			return
+		if v.ChartPermissionId == 0 {
+			totalText = fmt.Sprint(v.Points, "次") // 大套餐客户展示规则
 		}
 	}
+	if len(itemBillTotal) > 0 {
+		totalText = strings.Join(itemBillTotal, "+")
+	}
 	return
 }
 

+ 4 - 4
services/es_comprehensive.go

@@ -1082,11 +1082,11 @@ func GetResourceDataEsList(list []*SearchComprehensiveItem, user *models.WxUserI
 
 	//处理晨会精华
 	if len(meetingreviewchaptIds) > 0 {
-		pars = make([]interface{}, 0)
-		condition = ` AND c.id IN (` + utils.GetOrmInReplace(len(meetingreviewchaptIds)) + `)`
-		pars = append(pars, meetingreviewchaptIds)
+		//pars = make([]interface{}, 0)
+		//condition = ` AND c.id IN (` + utils.GetOrmInReplace(len(meetingreviewchaptIds)) + `)`
+		//pars = append(pars, meetingreviewchaptIds)
 
-		listrMeet, e := models.GetCygxMorningMeetingReviewChapterList(condition, pars)
+		listrMeet, e := GetCygxMorningMeetingReviewChapterListByIds(meetingreviewchaptIds)
 		if e != nil {
 			err = errors.New("GetResourceDataList, Err: " + e.Error())
 			return

+ 69 - 0
services/morning_meeting.go

@@ -112,3 +112,72 @@ func AddCygxMorningMeetingReviewChapterHistory(user *models.WxUserItem, articleI
 	}
 	return
 }
+
+// 通过晨会精华子ID,获取出参列表详情
+func GetCygxMorningMeetingReviewChapterListByIds(meetingreviewchaptIds []int) (items []*models.CygxMorningMeetingGatherDetailListResp, err error) {
+	lenArr := len(meetingreviewchaptIds)
+	if lenArr == 0 {
+		return
+	}
+	defer func() {
+		if err != nil {
+			go utils.SendAlarmMsg(fmt.Sprint("通过晨会精华子ID,获取出参列表详情失败 ,GetCygxMorningMeetingReviewChapterListByIds err"+err.Error(), "meetingreviewchaptIds:", meetingreviewchaptIds), 2)
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	pars = make([]interface{}, 0)
+	condition = ` AND c.id IN (` + utils.GetOrmInReplace(lenArr) + `)`
+	pars = append(pars, meetingreviewchaptIds)
+
+	//查询晨会
+	listrMeet, e := models.GetCygxMorningMeetingReviewChapterList(condition, pars)
+	if e != nil {
+		err = errors.New("GetCygxMorningMeetingReviewChapterList, Err: " + e.Error())
+		return
+	}
+
+	//获取晨会相关的标的
+	var subjectIds []string
+	for _, v := range listrMeet {
+		if v.IndustrialSubjectIds != "" {
+			slice := strings.Split(v.IndustrialSubjectIds, ",")
+			for _, vS := range slice {
+				subjectIds = append(subjectIds, vS)
+			}
+		}
+	}
+
+	lensubjectIds := len(subjectIds)
+	if lensubjectIds > 0 {
+		//获取标的信息
+		pars = make([]interface{}, 0)
+		condition = ` AND industrial_subject_id  IN (` + utils.GetOrmInReplace(lensubjectIds) + `)`
+		pars = append(pars, subjectIds)
+		listsubject, e := models.GetCygxIndustrialSubjectListCondition(condition, pars)
+		if e != nil {
+			err = errors.New("GetCygxIndustrialSubjectListCondition, Err: " + e.Error())
+			return
+		}
+
+		var meetSubjectItems = make(map[string]*models.CygxIndustrialSubject)
+		for _, v := range listsubject {
+			meetSubjectItems[strconv.Itoa(v.IndustrialSubjectId)] = v
+		}
+
+		//建立标的与晨会的映射关系
+		for _, v := range listrMeet {
+			if v.IndustrialSubjectIds != "" {
+				slice := strings.Split(v.IndustrialSubjectIds, ",")
+				for _, vS := range slice {
+					if meetSubjectItems[vS] != nil {
+						v.ListSubject = append(v.ListSubject, meetSubjectItems[vS])
+					}
+				}
+			}
+		}
+	}
+	items = listrMeet
+	return
+}

+ 6 - 5
services/resource_data.go

@@ -102,15 +102,16 @@ func GetResourceDataList(condition string, pars []interface{}, startSize, pageSi
 
 	//处理晨会精华
 	if len(meetingreviewchaptIds) > 0 {
-		pars = make([]interface{}, 0)
-		condition = ` AND c.id IN (` + utils.GetOrmInReplace(len(meetingreviewchaptIds)) + `)`
-		pars = append(pars, meetingreviewchaptIds)
+		//pars = make([]interface{}, 0)
+		//condition = ` AND c.id IN (` + utils.GetOrmInReplace(len(meetingreviewchaptIds)) + `)`
+		//pars = append(pars, meetingreviewchaptIds)
 
-		listrMeet, e := models.GetCygxMorningMeetingReviewChapterList(condition, pars)
+		listrMeet, e := GetCygxMorningMeetingReviewChapterListByIds(meetingreviewchaptIds)
 		if e != nil {
-			err = errors.New("GetResourceDataList, Err: " + e.Error())
+			err = errors.New("GetCygxMorningMeetingReviewChapterListByIds, Err: " + e.Error())
 			return
 		}
+
 		for _, v := range listrMeet {
 			v.Content = AnnotationHtml(v.Content)
 			v.PublishTime = utils.TimeRemoveHms2(v.PublishTime)

+ 1 - 2
services/task.go

@@ -93,7 +93,7 @@ func Task() {
 		reportBillboardUpdate := task.NewTask("reportBillboardUpdate", "0 10 0 * * *", ReportBillboardUpdate) //报告榜单更新
 		task.AddTask("reportBillboardUpdate", reportBillboardUpdate)
 
-		doActivityOnenIdWxTemplateMsg := task.NewTask("doActivityOnenIdWxTemplateMsg", "0 30 16 * * 0", DoActivityOnenIdWxTemplateMsg) //周日下午四点半推送全部活动
+		doActivityOnenIdWxTemplateMsg := task.NewTask("doActivityOnenIdWxTemplateMsg", "0 30 16 * * 1", DoActivityOnenIdWxTemplateMsg) //周日下午四点半推送全部活动
 		task.AddTask("doActivityOnenIdWxTemplateMsg", doActivityOnenIdWxTemplateMsg)
 
 		updateCygxActivitySpecialSignupNum := task.NewTask("updateCygxActivitySpecialSignupNum", "0 25 0 * * *", UpdateCygxActivitySpecialSignupNum) //修改专项调研,用户与公司的参与数量
@@ -104,7 +104,6 @@ func Task() {
 
 		updateDailyMonthReadBillboard := task.NewTask("updateDailyMonthReadBillboard", "0 0 3 * * *", UpdateDailyMonthReadBillboard) // 每日3:00更新阅读飙升榜单
 		task.AddTask("updateDailyMonthReadBillboard", updateDailyMonthReadBillboard)
-
 		addctivitySignupDetail := task.NewTask("addctivitySignupDetail", "0 0 23 * * *", AddctivitySignupDetail) // 获取当天已结束的活动的报名信息。添加到到会详情
 		task.AddTask("addctivitySignupDetail", addctivitySignupDetail)
 

+ 17 - 0
utils/constants.go

@@ -260,6 +260,11 @@ const (
 	FULLSTARFFED_MSG      string = "FullStarffed"              // 报名的时候人数已满的状态
 )
 
+// 免责声明
+const (
+	DISCLAIMERS string = "<div style=\"padding:20px\"><p>本报告仅供弘则弥道(上海)投资咨询有限公司正式签约的机构客户使用,不会因接收人/接收机构收到本报告而将其视为客户。本报告根据国际和行业通行的准则,以合法渠道获得这些信息,尽可能保证可靠、准确和完整,但并不保证报告所述信息的准确性和完整性,也不保证本报告所包含的信息或建议在本报告发出后不会发生任何变更。本报告中所提供的信息仅供参考。报告中的内容不对投资者做出的最终操作建议做任何的担保,也没有任何形式的分享投资收益或者分担投资损失的书面或口头承诺。不作为客户在投资、法律、会计或税务等方面的最终操作建议,也不作为道义的、责任的和法律的依据或者凭证,无论是否已经明示或者暗示。在任何情况下,本公司不对客户/接收人/接收机构因使用报告中内容所引致的一切损失负责任,客户/接收人/接收机构需自行承担全部风险。</p></div>"
+)
+
 // GetWeeklyDatabase 获取 weekly_report 库名
 func GetWeeklyDatabase() (databaseName string) {
 	if RunMode == "release" {
@@ -269,3 +274,15 @@ func GetWeeklyDatabase() (databaseName string) {
 	}
 	return
 }
+
+// 客户状态
+const (
+	COMPANY_STATUS_TRY_OUT   = "试用"
+	COMPANY_STATUS_FOREVER   = "永续"
+	COMPANY_STATUS_FREEZE    = "冻结"
+	COMPANY_STATUS_LOSE      = "流失"
+	COMPANY_STATUS_LOSE_FLAG = "loss"
+	COMPANY_STATUS_FORMAL    = "正式"
+	COMPANY_STATUS_POTENTIAL = "潜在"
+	COMPANY_STATUS_CLOSE     = "关闭"
+)