Browse Source

Merge branch 'master' of http://8.136.199.33:3000/hongze/hongze_cygx into cygx_9.4.0

xingzai 2 years ago
parent
commit
e61c6fccde

+ 72 - 49
controllers/activity.go

@@ -12,6 +12,7 @@ import (
 	"strconv"
 	"strings"
 	"time"
+	"unicode/utf8"
 )
 
 // 活动
@@ -68,7 +69,7 @@ func (this *ActivityCoAntroller) List() {
 // @Param   PlayBack   query   int  false       "是否仅展示回放 1:是、0:否 默认0"
 // @Param   KeyWord   query   string  false       "搜索关键词 多个用 , 隔开"
 // @Success 200 {object} models.GetCygxActivityListRep
-// @router /list [get]
+// @router /list_del_test [get]
 func (this *ActivityCoAntroller) ActivityList() {
 	br := new(models.BaseResponse).Init()
 	defer func() {
@@ -369,16 +370,6 @@ func (this *ActivityCoAntroller) ActivityList() {
 		keyWordItem.PageType = "ActivitSearch"
 		keyWordItem.CreateTime = time.Now()
 		go models.AddUserSearchKeyWord(keyWordItem)
-
-		cacheKey := fmt.Sprint("Search_uid:", user.UserId, "_KeyWord:", keyWordSearch, "_Source:", 6)
-		isExist := utils.Rc.IsExist(cacheKey)
-		if !isExist {
-			setNX := utils.Rc.SetNX(cacheKey, keyWordSearch, time.Minute*1)
-			if !setNX {
-				go utils.SendAlarmMsg("记录用户搜索活动关键词失败,设置Redis Key 过期时间失败:key"+cacheKey, 3)
-			}
-			go services.AddUserSearchLog(user, keyWordSearch, 6)
-		}
 	}
 	resp := new(models.GetCygxActivityListRep)
 	//处理音频回放
@@ -1323,7 +1314,7 @@ func (this *ActivityCoAntroller) SignupAdd() {
 				}
 				if totalRestrict >= 1 {
 					signupStatus = "BreakPromise"
-					resp.PopupMsg = "由于爽约次数过多,您暂时被限制报名资格"
+					resp.PopupMsg = "由于爽约次数过多,您暂时被限制报名资格,请联系对口销售"
 					item.FailType = 3
 				}
 				totalSignupCompany, err := models.GetActivitySignupCompanyCount(activityId, user.CompanyId)
@@ -2567,9 +2558,9 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	//	return
 	//	fmt.Println("len", len(listDing))
 	//}
-	condition = ""
+	condition = " AND art.is_limit_people = 1 AND art.publish_status = 1  "
 	//活动可见限制
-	conditionActivity, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack)
+	conditionActivityAll, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 3)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
@@ -2578,22 +2569,21 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	if source == 1 {
 		condition += ` AND art.yidong_activity_id = '' `
 	}
-	//
-	//if playBack == 1 {
-	//	//活动音频,设置有效时间为30天,失效后该活动就不再支持音频回放。有效期起始时间为活动的开始时间
-	//	endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
-	//	condition += ` AND art.activity_time > ? `
-	//	pars = append(pars, endTime)
-	//}
-
-	condition += ` AND art.is_limit_people = 1 AND art.publish_status = 1 ` + conditionActivity
-	total, err := models.GetActivityCount(condition, playBack, pars, filter)
+	var conditionCount string
+	conditionCount = condition + conditionActivityAll
+	total, err := models.GetActivityCount(conditionCount, playBack, pars, filter)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	//搜索关键词初始化
+	conditionActivityKey, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 1)
 	if err != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + err.Error()
 		return
 	}
-
 	var conditionOrder string
 	if activeState == "2" || activeState == "3" {
 		conditionOrder = ` ORDER BY art.activity_time DESC  `
@@ -2602,7 +2592,6 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	} else {
 		conditionOrder = ` ORDER BY art.activity_time DESC ,  art.active_state ASC   `
 	}
-
 	if label != "" && activeState == "1" {
 		conditionOrder = ` ORDER BY art.activity_time ASC  `
 	}
@@ -2610,15 +2599,53 @@ func (this *ActivityCoAntroller) ActivityListNew() {
 	if activeState == "1" {
 		conditionOrder = ` ORDER BY art.activity_time ASC  `
 	}
+	conditionActivityKey += condition + conditionOrder
 
-	condition += conditionOrder
-
-	list, errList := models.GetActivityListNew(condition, pars, uid, startSize, pageSize, playBack, filter, typeName)
+	list, errList := models.GetActivityListNew(conditionActivityKey, pars, uid, startSize, pageSize, playBack, filter, typeName)
 	if errList != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取失败,Err:" + errList.Error()
 		return
 	}
+
+	if keyWord != "" {
+		keyWordArr, err := services.GetIndustryMapNameSliceV3(keyWord)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分词失败,GetIndustryMapNameSliceV3 Err: " + err.Error()
+			return
+		}
+		keyWordArr = services.RemoveDuplicatesAndEmpty(keyWordArr)
+
+		startSizeIk := utils.StartIndex(currentIndex, pageSize)
+		startSizeIk = startSizeIk - total
+		if startSizeIk < 0 {
+			startSizeIk = 0
+		}
+		var pageSizeIk int
+		pageSizeIk = pageSize - len(list)
+		if pageSizeIk > 0 {
+			//搜索关键词联想
+			conditionActivityIk, err := services.GetActivityonditionList(user, activityTypeId, chartPermissionIds, whichDay, activeState, label, 0, source, keyWord, playBack, 2)
+			if err != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + err.Error()
+				return
+			}
+			conditionActivityIk += condition + conditionOrder
+			listIk, errList := models.GetActivityListNew(conditionActivityIk, pars, uid, startSizeIk, pageSizeIk, playBack, filter, typeName)
+			if errList != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取失败,Err:" + errList.Error()
+				return
+			}
+
+			for _, item := range listIk {
+				list = append(list, item)
+			}
+		}
+	}
+
 	var isShow bool
 	isShow = services.GetShowSustainable()
 	detail, err := models.GetConfigByCode("city_img_url")
@@ -3123,7 +3150,7 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 			continue
 		}
 		var condition string
-		conditionActivity, err := services.GetActivityonditionList(user, strconv.Itoa(v.ActivityTypeId), chartPermissionIds, whichDay, activeState, "", isPower, 0, "", 0)
+		conditionActivity, err := services.GetActivityonditionList(user, strconv.Itoa(v.ActivityTypeId), chartPermissionIds, whichDay, activeState, "", isPower, 0, "", 0, 1)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
@@ -3137,15 +3164,26 @@ func (this *ActivityCoAntroller) LabelTypeListV5() {
 			br.ErrMsg = "获取失败,Err:" + err.Error()
 			return
 		}
+		var itemslabe []*models.CygxActivityLabelList
+
+		mapkeyWord := make(map[string]string)
 		//标签字段关联的产业与标签处理
 		for k2, v2 := range labelList {
 			if v2.YidongActivityId != 0 {
 				v2.IsExternalLabel = true
 			}
+			if utf8.RuneCountInString(v2.City) != 2 {
+				labelList[k2].City = ""
+			}
 			labelList[k2].KeyWord = services.LabelStrV5(v2.KeyWord, v2.IsShowSubjectName, v2.TemporaryLabel)
 			labelList[k2].ImgUrlBg = v.ImgUrlBgs
+			if _, ok := mapkeyWord[fmt.Sprint(v.ActivityTypeId, "-", labelList[k2].KeyWord)]; ok {
+				continue
+			}
+			itemslabe = append(itemslabe, labelList[k2])
+			mapkeyWord[fmt.Sprint(v.ActivityTypeId, "-", labelList[k2].KeyWord)] = labelList[k2].KeyWord
 		}
-		list[k].List = labelList
+		list[k].List = itemslabe
 		list[k].Resource = 1
 	}
 
@@ -4006,7 +4044,7 @@ func (this *ActivityCoAntroller) LabelTypeListV6Pc() {
 		}
 		var condition string
 
-		conditionActivity, err := services.GetActivityonditionList(user, strconv.Itoa(v.ActivityTypeId), chartPermissionIds, whichDay, activeState, "", isPower, 1, "", playBack)
+		conditionActivity, err := services.GetActivityonditionList(user, strconv.Itoa(v.ActivityTypeId), chartPermissionIds, whichDay, activeState, "", isPower, 1, "", playBack, 1)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
@@ -4665,7 +4703,7 @@ func (this *ActivityCoAntroller) ActivityListSearch() {
 	startSize = utils.StartIndex(currentIndex, pageSize)
 	var condition string
 	//活动可见限制
-	conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "", "", 0, 1, keyWord, playBack)
+	conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "", "", 0, 1, keyWord, playBack, 1)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()
@@ -4821,23 +4859,8 @@ func (this *ActivityCoAntroller) OverActivityList() {
 	if len(chartPermissionIds) > 0 {
 		condition += ` AND art.chart_permission_id  IN (` + chartPermissionIds + `)`
 	}
-	//if typeName != "" {
-	//typeSlice := strings.Split(typeName, ",")
-	//tempCondition := ""
-	//for _, s := range typeSlice {
-	//	if s == "1" {
-	//		tempCondition += "'专家电话会',"
-	//	} else if s == "2" {
-	//		tempCondition += "'分析师电话会',"
-	//	} else if s == "1,2" {
-	//		tempCondition += "'专家电话会','分析师电话会',"
-	//	}
-	//}
-	//tempCondition = strings.TrimRight(tempCondition, ",")
-	//condition += ` AND art.activity_type_id IN (` + typeName + `)`
-	//}
 
-	conditionActivity, err := services.GetActivityonditionList(user, typeName, chartPermissionIds, whichDay, "3", "", 0, 0, "", 0)
+	conditionActivity, err := services.GetActivityonditionList(user, typeName, chartPermissionIds, whichDay, "3", "", 0, 0, "", 0, 1)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()

+ 39 - 0
controllers/config.go

@@ -3,6 +3,7 @@ package controllers
 import (
 	"encoding/json"
 	"hongze/hongze_cygx/models"
+	"hongze/hongze_cygx/services"
 	"time"
 )
 
@@ -176,3 +177,41 @@ func (this *BaseConfigController) HotDetail() {
 	br.Success = true
 	br.Data = resp
 }
+
+// @Title 用户搜索记录统计
+// @Description 用户搜索记录统计
+// @Param   KeyWord   query   string  false       "搜索关键词"
+// @Success Ret=200 新增成功
+// @router /user/search/keyWordLog [post]
+func (this *ConfigController) KeyWordLog() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.CygxSearchKeyWordLogRep
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	keyWord := req.KeyWord
+	if keyWord == "" {
+		br.Msg = "搜索内容不能为空"
+		return
+	}
+	user := this.User
+	if user == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	if keyWord != "" {
+		go services.AddUserSearchLog(user, keyWord, 1)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "新增成功"
+}

+ 1 - 1
controllers/home.go

@@ -686,7 +686,7 @@ func (this *HomeController) NewList() {
 		}
 	} else {
 		condition += ` AND source NOT IN ('activity','activityspecial','newchart') ` + conditionInit
-		conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "1,2,3", "", 0, 0, "", 0)
+		conditionActivity, err := services.GetActivityonditionList(user, "", "", "", "1,2,3", "", 0, 0, "", 0, 1)
 		if err != nil && err.Error() != utils.ErrNoRow() {
 			br.Msg = "获取失败"
 			br.ErrMsg = "获取活动权限数据失败,Err:" + err.Error()

+ 68 - 32
controllers/micro_roadshow.go

@@ -53,53 +53,94 @@ func (this *MicroRoadShowController) List() {
 	activityVideoIds := this.GetString("ActivityVideoIds")
 	activityVideoId, _ := this.GetInt("ActivityVideoId")
 	filter, _ := this.GetInt("Filter", 0)
-
 	if pageSize <= 0 {
 		pageSize = utils.PageSize20
 	}
 	if currentIndex <= 0 {
 		currentIndex = 1
 	}
-
+	var keyWordArr []string
+	var err error
+	if keywords != "" {
+		keyWordArr, err = services.GetIndustryMapNameSliceV3(keywords)
+		if err != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取分词失败,GetIndustryMapNameSliceV3 Err: " + err.Error()
+			return
+		}
+		keyWordArr = services.RemoveDuplicatesAndEmpty(keyWordArr)
+	}
+	var list []*models.MicroRoadShowPageList
+	var total int
+	var e error
 	// 微路演列表
-	list, total, e := services.GetMicroRoadShowPageListV8(pageSize, currentIndex, audioId, videoId, activityVideoId, filter, keywords, audioIds, videoIds, activityVideoIds)
+	list, total, e = services.GetMicroRoadShowPageListV8(pageSize, currentIndex, audioId, videoId, activityVideoId, filter, keywords, audioIds, videoIds, activityVideoIds)
 	if e != nil {
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取微路演列表失败, Err: " + e.Error()
 		return
 	}
+	var pageSizeIk int
+
+	//获取总的数量
+	totalIk, e := services.CountMicroRoadShowPageListIkWord(audioId, videoId, activityVideoId, filter, keyWordArr, audioIds, videoIds, activityVideoIds)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取微路演联想词列表失败, Err: " + e.Error()
+		return
+	}
+	pageSizeIk = totalIk - len(list)
+	//处理IK分词部分的分页获取条数
+	startSizeIk := utils.StartIndex(currentIndex, pageSize)
+	startSizeIk = startSizeIk - total
+	if startSizeIk < 0 {
+		startSizeIk = 0
+	}
+	if pageSizeIk > 0 {
+		lisIk, e := services.GetMicroRoadShowPageListIkWord(startSizeIk, pageSizeIk, audioId, videoId, activityVideoId, filter, keyWordArr, audioIds, videoIds, activityVideoIds, keywords)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取微路演列表失败, Err: " + e.Error()
+			return
+		}
+		for _, item := range lisIk {
+			list = append(list, item)
+		}
+	}
+	total = totalIk
+	userId := user.UserId
+	listMycollect, err := models.GetUserMicroRoadshowCollectList(userId)
+	if err != nil {
+		br.Msg = "获取数据失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	mapaudioIds := make(map[int]int)         //活动音频
+	mapvideoIds := make(map[int]int)         // 微路演视频
+	mapactivityVideoIds := make(map[int]int) // 活动视频
+	for _, item := range listMycollect {
+		if item.ActivityVoiceId > 0 {
+			mapaudioIds[item.ActivityVoiceId] = item.ActivityVoiceId
+		} else if item.VideoId > 0 {
+			mapvideoIds[item.VideoId] = item.VideoId
+		} else if item.ActivityVideoId > 0 {
+			mapactivityVideoIds[item.ActivityVoiceId] = item.ActivityVoiceId
+		}
+	}
 	for _, item := range list {
 		if item.Type == 1 {
 			//音频
-			count, err := models.GetVoiceCollectCount(user.UserId, item.Id)
-			if err != nil {
-				br.Msg = "获取数据失败!"
-				br.ErrMsg = "获取数据失败,Err:" + err.Error()
-				return
-			}
-			if count > 0 {
+			if mapaudioIds[item.Id] > 0 {
 				item.IsCollect = true
 			}
 		} else if item.Type == 2 {
 			//活动视频
-			count, err := models.GetActivityVideoCollectCount(user.UserId, item.Id)
-			if err != nil {
-				br.Msg = "获取数据失败!"
-				br.ErrMsg = "获取数据失败,Err:" + err.Error()
-				return
-			}
-			if count > 0 {
+			if mapactivityVideoIds[item.Id] > 0 {
 				item.IsCollect = true
 			}
 		} else if item.Type == 3 {
 			//微路演视频
-			count, err := models.GetVideoCollectCount(user.UserId, item.Id)
-			if err != nil {
-				br.Msg = "获取数据失败!"
-				br.ErrMsg = "获取数据失败,Err:" + err.Error()
-				return
-			}
-			if count > 0 {
+			if mapvideoIds[item.Id] > 0 {
 				item.IsCollect = true
 			}
 		}
@@ -111,7 +152,6 @@ func (this *MicroRoadShowController) List() {
 		br.ErrMsg = "获取用户权限失败, Err: " + e.Error()
 		return
 	}
-
 	// 获取默认图配置
 	audioMap, videoMap, audioShareMap, videoShareMap, e := services.GetMicroRoadShowDefaultImgConfig()
 	if e != nil {
@@ -119,7 +159,6 @@ func (this *MicroRoadShowController) List() {
 		br.ErrMsg = "获取微路演列表失败, Err: " + e.Error()
 		return
 	}
-
 	for i := range list {
 		// 权限
 		au := new(models.UserPermissionAuthInfo)
@@ -167,18 +206,15 @@ func (this *MicroRoadShowController) List() {
 				list[i].ShareImg = videoShareMap[list[i].ChartPermissionId]
 			}
 		}
-
-		//修改产业视频的标题
-		//if list[i].Type == 3 && list[i].IndustryName != "" {
-		//	list[i].Title = "5min" + "【" + list[i].IndustryName + "】" + "逻辑解析"
-		//}
 	}
 
+	if len(list) == 0 {
+		list = make([]*models.MicroRoadShowPageList, 0)
+	}
 	resp := new(models.MicroRoadShowListResp)
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp.List = list
 	resp.Paging = page
-
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"

+ 278 - 24
controllers/report.go

@@ -15,7 +15,7 @@ import (
 	"time"
 )
 
-//报告
+// 报告
 type ReportController struct {
 	BaseAuthController
 }
@@ -389,12 +389,45 @@ func (this *ReportController) ArticleCategoryList() {
 			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
+					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
+		}
 		list = append([]*models.IndustrialToArticleCategoryRep{&timeLineItem}, list...)
 	}
 
@@ -632,8 +665,34 @@ func (this *ReportController) List() {
 		//	//list[i].Abstract, _ = services.GetReportContentTextSub(item.Abstract)
 		//}
 
+		//查询用户今天是否看过时间线
+		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.Readnum == 0 && user.CreatedTime.Before(utils.StrTimeToTime(v.PublishTime)) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(v.PublishTime)) {
+			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
 			}
 			if v.VideoUrl != "" {
@@ -2511,7 +2570,7 @@ func (this *ReportController) SearchReport() {
 		keyWordItem.PageType = "ReortSearch"
 		keyWordItem.CreateTime = time.Now()
 		go models.AddUserSearchKeyWord(keyWordItem)
-		go services.AddUserSearchLog(user, keyWord, 5)
+		//go services.AddUserSearchLog(user, keyWord, 5)
 	}
 	if len(listYx) == 0 {
 		listYx = make([]*models.ArticleCollectionResp, 0)
@@ -2637,8 +2696,6 @@ func (this *ReportController) SearchResource() {
 		keyWordItem.PageType = "ReortSearch"
 		keyWordItem.CreateTime = time.Now()
 		go models.AddUserSearchKeyWord(keyWordItem)
-
-		go services.AddUserSearchLog(user, keyWord, 4)
 	}
 
 	resp := new(models.SearchResourceResp)
@@ -2687,30 +2744,124 @@ func (this *ReportController) SearchReportAndResource() {
 	} else {
 		sqlGroup += ` LIMIT 100 `
 	}
-	ListYxReport, err := models.GetArticleCollectionList(` AND a.article_id >= 1000000 `+condition+sqlGroup, user.UserId)
+	ListYxReport, err := models.GetArticleCollectionList(` AND a.article_type_id IN (`+utils.YAN_XUAN_ARTICLE_TYPE_IDS+`) `+condition+sqlGroup, user.UserId)
 	if err != nil {
 		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取文章列表失败,Err:" + err.Error()
+		br.ErrMsg = "获取研选文章列表失败,Err:" + err.Error()
+		return
+	}
+
+	ListHzReport, err := models.GetReoprtSearchList(` AND a.article_type_id NOT IN (`+utils.YAN_XUAN_ARTICLE_TYPE_IDS+`) `+condition+sqlGroup, user.UserId)
+	if err != nil {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取弘则报告文章列表失败,Err:" + err.Error()
 		return
 	}
+
+	keyWordArr, err := services.GetIndustryMapNameSliceV3(keyWord)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取分词失败,GetIndustryMapNameSliceV3 Err: " + err.Error()
+		return
+	}
+	keyWordArr = services.RemoveDuplicatesAndEmpty(keyWordArr)
+	var keyWordIk string
+	if len(keyWordArr) > 1 {
+		keyWordIk = services.KeyWordArrSqlRegexp(keyWordArr)
+		var conditionIk string
+		var sqlGroupIk string
+		conditionIk = `AND ( a.title REGEXP '` + keyWordIk + `' OR  a.annotation REGEXP '` + keyWordIk + `' OR  a.abstract REGEXP '` + keyWordIk + `') AND a.publish_status = 1 `
+		sqlGroupIk = ` GROUP BY  a.article_id  ORDER BY a.publish_date DESC  `
+		if pageSize > 0 {
+			sqlGroupIk += ` LIMIT 5 `
+		} else {
+			sqlGroupIk += ` LIMIT 20 `
+		}
+		//研选的联想词列表
+		ListYxReportIk, err := models.GetArticleCollectionList(` AND a.article_type_id IN (`+utils.YAN_XUAN_ARTICLE_TYPE_IDS+`) `+conditionIk+sqlGroupIk, user.UserId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取研选IK文章列表失败,Err:" + err.Error()
+			return
+		}
+		if len(ListYxReportIk) > 0 {
+			for _, v := range ListYxReportIk {
+				ListYxReport = append(ListYxReport, v)
+			}
+		}
+		//弘则的联想词列表
+		ListHzReportIk, err := models.GetReoprtSearchList(`  AND a.article_type_id NOT IN (`+utils.YAN_XUAN_ARTICLE_TYPE_IDS+`) `+conditionIk+sqlGroupIk, user.UserId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取研选IK文章列表失败,Err:" + err.Error()
+			return
+		}
+		if len(ListHzReportIk) > 0 {
+			for _, v := range ListHzReportIk {
+				ListHzReport = append(ListHzReport, v)
+			}
+		}
+	}
+	for k, v := range ListHzReport {
+		ListHzReport[k].Source = 1
+		if v.MyCollectNum > 0 {
+			ListHzReport[k].IsCollect = true
+		}
+	}
 	for k, v := range ListYxReport {
 		ListYxReport[k].Source = 2
 		if v.MyCollectNum > 0 {
 			ListYxReport[k].IsCollect = true
 		}
 	}
-	ListHzReport, err := models.GetReoprtSearchList(` AND a.article_id < 1000000 `+condition+` OR ( article_type = 'lyjh' `+condition+` ) OR ( a.sub_category_name = '专项调研' `+condition+` )  `+sqlGroup, user.UserId)
+
+	var articleIds string
+	for _, v := range ListHzReport {
+		articleIds += strconv.Itoa(v.ArticleId) + ","
+	}
+	for _, v := range ListYxReport {
+		articleIds += strconv.Itoa(v.ArticleId) + ","
+	}
+	articleIds = strings.TrimRight(articleIds, ",")
+	silcearticleIds := strings.Split(articleIds, ",")
+	var parsindustrial []interface{}
+	parsindustrial = make([]interface{}, 0)
+	articleIdList := make([]string, 0)
+	for _, v := range silcearticleIds {
+		articleIdList = append(articleIdList, v)
+	}
+	conditionindustrial := ` AND mg.article_id IN (  ` + utils.GetOrmInReplace(len(silcearticleIds)) + ` )  `
+	parsindustrial = append(parsindustrial, articleIdList)
+	industrialList, err := models.GetIndustrialListByarticleId(parsindustrial, conditionindustrial)
 	if err != nil {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取文章列表失败,Err:" + err.Error()
 		return
 	}
+	industrialMap := make(map[int][]*models.IndustrialManagementResp)
+	if len(industrialList) > 0 {
+		for _, v := range industrialList {
+			item := new(models.IndustrialManagementResp)
+			//item.ArticleId = v.ArticleId
+			item.IndustrialManagementId = v.IndustrialManagementId
+			item.IndustryName = v.IndustryName
+			item.ChartPermissionId = v.ChartPermissionId
+			industrialMap[v.ArticleId] = append(industrialMap[v.ArticleId], item)
+		}
+	}
 	for k, v := range ListHzReport {
-		ListHzReport[k].Source = 1
-		if v.MyCollectNum > 0 {
-			ListHzReport[k].IsCollect = true
+		if len(industrialMap[v.ArticleId]) > 0 {
+			ListHzReport[k].List = industrialMap[v.ArticleId]
+		} else {
+			ListHzReport[k].List = make([]*models.IndustrialManagementResp, 0)
 		}
 	}
+	for k, v := range ListYxReport {
+		if len(industrialMap[v.ArticleId]) > 0 {
+			ListYxReport[k].List = industrialMap[v.ArticleId]
+		} else {
+			ListYxReport[k].List = make([]*models.IndustrialManagementResp, 0)
+		}
+	}
+	//获取文章关联的产业
 
 	if len(ListYxReport) == 0 {
 		ListYxReport = make([]*models.ArticleCollectionResp, 0)
@@ -2732,9 +2883,7 @@ func (this *ReportController) SearchReportAndResource() {
 		}
 	}
 
-	var conditionOr string
-	conditionOr += ` OR ( m.subject_names LIKE '%` + keyWord + `%' AND a.article_id < ` + strconv.Itoa(utils.SummaryArticleId) + `  AND publish_status = 1 ) `
-	condition = ` AND m.industry_name LIKE '%` + keyWord + `%' AND a.article_id < ` + strconv.Itoa(utils.SummaryArticleId) + conditionOr
+	condition = `  AND a.publish_status = 1 AND a.article_type_id NOT IN (` + utils.YAN_XUAN_ARTICLE_TYPE_IDS + `)  AND (m.industry_name LIKE '%` + keyWord + `%' OR m.subject_names LIKE '%` + keyWord + `%'  )  `
 
 	listHzResource, err := models.GetSearchResourceList(user.UserId, condition, 0, pageSize)
 	if err != nil {
@@ -2743,8 +2892,7 @@ func (this *ReportController) SearchReportAndResource() {
 		return
 	}
 
-	conditionOr = ` OR ( m.subject_names LIKE '%` + keyWord + `%' AND a.article_id >= ` + strconv.Itoa(utils.SummaryArticleId) + `  AND publish_status = 1 ) `
-	condition = ` AND m.industry_name LIKE '%` + keyWord + `%' AND a.article_id >= ` + strconv.Itoa(utils.SummaryArticleId) + conditionOr
+	condition = `  AND a.publish_status = 1 AND a.article_type_id IN (` + utils.YAN_XUAN_ARTICLE_TYPE_IDS + `)  AND (m.industry_name LIKE '%` + keyWord + `%' OR m.subject_names LIKE '%` + keyWord + `%'  )  `
 
 	listYxResource, err := models.GetSearchResourceList(user.UserId, condition, 0, pageSize)
 	if err != nil {
@@ -2772,6 +2920,7 @@ func (this *ReportController) SearchReportAndResource() {
 		return
 	}
 	for _, v := range listHot {
+		industrialIdArr = append(industrialIdArr, v.IndustrialManagementId)
 		mapHot[v.IndustryName] = v.IndustrialManagementId
 	}
 	orderSrt := "man.recommended_index DESC,update_time DESC"
@@ -2829,9 +2978,115 @@ func (this *ReportController) SearchReportAndResource() {
 			return
 		}
 
-		for _, v2 := range list {
-			if mapHistroyArticleId[v2.ArticleId] == 0 && user.CreatedTime.Before(utils.StrDateToTime(v.PublishDate)) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrDateToTime(v.PublishDate)) {
-				listHzResource[k].IsRed = true
+		mapUPdateTime := make(map[int]string)
+		//获取这些产业下最新更新的文章
+
+		//时间线的更新时间
+		//	maptimelineUPdateTime := make(map[int]string)
+		listtimelinePublishdate, err := models.GetTimeLineReportIndustrialPublishdateList(industrialIdArr)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return
+		}
+		for _, v := range listtimelinePublishdate {
+			if mapUPdateTime[v.IndustrialManagementId] != "" {
+				if utils.StrTimeToTime(v.PublishDate).After(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
+					mapUPdateTime[v.IndustrialManagementId] = v.PublishDate
+				}
+			}
+		}
+
+		//mapHistroyArticleId := make(map[int]int)
+
+		//if userId > 0 {
+		//	listArticleHistory, e := models.GetUserToArticleHistory(userId, articleIdArr)
+		//	if e != nil && e.Error() != utils.ErrNoRow() {
+		//		err = errors.New("获取产业关联的视频失败,GetindustryVideo " + e.Error())
+		//		return
+		//	}
+		//	for _, v := range listArticleHistory {
+		//		mapHistroyArticleId[v.ArticleId] = v.ArticleId
+		//	}
+		//}
+		var industrialIds string
+		for _, id := range industrialIdArr {
+			industrialIds += strconv.Itoa(id) + ","
+		}
+		industrialIds = strings.TrimRight(industrialIds, ",")
+		articleList, err := models.GetReportIndustrialReadNumList(user.UserId, industrialIds, user.CreatedTime)
+		mapHistroyindustrialId := make(map[int]int)
+		for _, v := range articleList {
+			mapHistroyindustrialId[v.IndustrialManagementId] = v.Readnum
+		}
+		//nowTime := time.Now().Local()
+		//threeMonBefore := nowTime.AddDate(0, -3, 0)
+
+		//查询用户今天是否看过时间线
+		//haveMorningMeeting := false
+		//var morningMeetingTime string
+		recrodList, err := models.GetTimeLineRecordAllCount(user.UserId, time.Now().Format(utils.FormatDate))
+		if err != nil {
+			return
+		}
+		var industrialManagementIdstr string
+		industrialIdMap := make(map[string]time.Time)
+		for _, v := range recrodList {
+			industrialManagementIdstr = strings.TrimLeft(v.Parameter, "PageSize=10&CurrentIndex=1&CategoryId=99999&IndustrialManagementId=")
+			if createTime, ok := industrialIdMap[industrialManagementIdstr]; ok{
+				if createTime.Before(v.CreateTime) {
+					industrialIdMap[industrialManagementIdstr] = v.CreateTime
+				}
+			}else {
+				industrialIdMap[industrialManagementIdstr] = v.CreateTime
+			}
+		}
+
+		mmList, err := models.GetCygxMorningMeetingReviewsListByIndustrialIds(industrialIds)
+		if err != nil {
+			return
+		}
+		morningMeetingTimeMap := make(map[int]time.Time)
+		for _, v := range mmList {
+			morningMeetingTimeMap[v.IndustryId] = v.CreateTime
+		}
+		timeLineRedMap := make(map[int]bool, 0)
+
+		for _, industrialId := range industrialIdArr {
+			if createTime, ok := industrialIdMap[strconv.Itoa(industrialId)]; ok{
+				if createTime.Before(morningMeetingTimeMap[industrialId]) {
+					timeLineRedMap[industrialId] = true
+				}
+			}
+		}
+
+		for k, v := range list {
+			list[k].UpdateTime = utils.TimeRemoveHms(mapUPdateTime[v.IndustrialManagementId])
+			if user.UserId > 0 {
+				//如果文章没有阅读,而且,文章的发布时间晚于项目的上线时间,而且文章的发布时间晚于用户的注册时间,就进行标红处理
+				if mapHistroyindustrialId[v.IndustrialManagementId] == 0 || timeLineRedMap[v.IndustrialManagementId] {
+					if user.CreatedTime.Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
+						list[k].IsRed = true
+					}
+				}
+			} else {
+				if utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
+					list[k].IsRed = true
+				}
+				list[k].IsFollow = 0
+			}
+
+			list[k].UpdateTime = utils.TimeRemoveHms(mapUPdateTime[v.IndustrialManagementId])
+			if user.UserId > 0 {
+				//如果文章没有阅读,而且,文章的发布时间晚于项目的上线时间,而且文章的发布时间晚于用户的注册时间,就进行标红处理
+				if mapHistroyindustrialId[v.IndustrialManagementId] == 0 || timeLineRedMap[v.IndustrialManagementId] {
+					if user.CreatedTime.Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
+						list[k].IsRed = true
+					}
+				}
+			} else {
+				if utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
+					list[k].IsRed = true
+				}
+				list[k].IsFollow = 0
 			}
 		}
 
@@ -2858,7 +3113,6 @@ func (this *ReportController) SearchReportAndResource() {
 			listYxResource[k].IsFollw = true
 		}
 		industrialIdArr = append(industrialIdArr, v.IndustrialManagementId)
-
 	}
 
 	if len(industrialIdArr) > 0 {
@@ -2986,7 +3240,7 @@ func (this *ReportController) SearchReportAndResource() {
 		keyWordItem.PageType = "ReortSearch"
 		keyWordItem.CreateTime = time.Now()
 		go models.AddUserSearchKeyWord(keyWordItem)
-		go services.AddUserSearchLog(user, keyWord, 5)
+		//go services.AddUserSearchLog(user, keyWord, 5)
 	}
 
 	resp.ListHzResource = listHzResource

+ 5 - 2
models/activity.go

@@ -714,12 +714,15 @@ type CygxActivityLabelList struct {
 	IsNew             bool   `description:"是否为新:活动存在关联的的产业所关联的报告均在3个月内/无报告则标记新"`
 	YidongActivityId  int    `description:"易董活动ID"`
 	IsExternalLabel   bool   `description:"是否为外部资源"`
+	TripStatus        int    `description:"行程进行状态 1:预报名,2:确定行程"`
+	City              string `description:"城市"`
+	Days              int    `description:"天数"`
 }
 
 // 主题列表
 func GetActivityLabelListAll(condition, sortTime string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityLabelList, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT	activity_id, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id 
+	sql := `SELECT	activity_id, label,temporary_label,is_show_subject_name, MAX( art.activity_time ) AS timesort, MIn( art.activity_time ) AS mintimesort , yidong_activity_id,city
 		FROM cygx_activity as art WHERE 1= 1 `
 	if condition != "" {
 		sql += condition
@@ -812,7 +815,7 @@ func GetAskEmail() (item []*AskEmailRep, err error) {
 // 主题列表
 func GetActivityLabelSpecialListAll(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityLabelList, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT	label,activity_id,is_show_subject_name
+	sql := `SELECT	label,activity_id,is_show_subject_name,days
 		FROM cygx_activity_special as art WHERE 1= 1 `
 	if condition != "" {
 		sql += condition

+ 13 - 12
models/article.go

@@ -76,7 +76,7 @@ type CygxArticleEs struct {
 	MatchTypeName    string `description:"匹配类型"`
 }
 
-//新增文章
+// 新增文章
 func AddCygxArticle(item *CygxArticle) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
@@ -161,6 +161,7 @@ type ArticleDetail struct {
 	IsShowLinkButton        int    `description:"这种报告类型是否展示查看报告链接"`
 	ArticleTypeId           int    `description:"文章类型ID"`
 	IsSpecialArticle        bool   `description:"是否属于专项调研报告"`
+	Annotation              string `description:"核心观点"`
 }
 
 type ArticleDetailFileLink struct {
@@ -246,7 +247,7 @@ func ModifyArticleExpert(articleId int, expertNumStr, expertContentStr, intervie
 	return
 }
 
-//更改文章发布状态
+// 更改文章发布状态
 func UpdateArticlePublish(articleId, publishStatus int) (err error) {
 	o := orm.NewOrm()
 	sql := `UPDATE cygx_article SET publish_status=? WHERE article_id=? `
@@ -270,7 +271,7 @@ func GetArticleDetailTestById(articleId int) (item *ArticleDetail, err error) {
 
 func GetArticleAll() (item []*ArticleDetail, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT * FROM cygx_article WHERE is_summary=1 `
+	sql := `SELECT * FROM cygx_article WHERE is_summary=1`
 	_, err = o.Raw(sql).QueryRows(&item)
 	return
 }
@@ -288,7 +289,7 @@ func GetArticleAll2() (item []*ArticleDetail, err error) {
 	return
 }
 
-//获取文章列表
+// 获取文章列表
 func GetArticleList(condition string, pars []interface{}) (items []*ArticleDetail, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT	article_id FROM cygx_article  WHERE 1= 1 ` + condition
@@ -359,7 +360,7 @@ type CygxArticles struct {
 	ReportType       int    `description:"报告类型,1行业报告,2产业报告,0无"`
 }
 
-//新增文章
+// 新增文章
 func AddCygxArticles(item *CygxArticle) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
@@ -432,7 +433,7 @@ func GetPermissionMappingCategoryID() (item []*PermissionMappingCategoryRep, err
 	return
 }
 
-//检查用户是否阅读某一分类最新文章
+// 检查用户是否阅读某一分类最新文章
 func GetUserIsReadThisNewCategoryArticleCount(categoryId, uid int) (count int, err error) {
 	sqlCount := `SELECT COUNT(1) as count FROM
 	cygx_article_history_record 
@@ -448,7 +449,7 @@ type ArticleId struct {
 	ArticleId int `description:"文章id"`
 }
 
-//获取自定义分类的文章ID
+// 获取自定义分类的文章ID
 func GetCustomArticleId() (item []*ArticleId, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT article_id  FROM cygx_article WHERE is_custom = 1 `
@@ -463,7 +464,7 @@ type ArticleFollowDetail struct {
 	MacNum int `description:"本人是否收藏这个文章"`
 }
 
-//获取文章被关注被收藏的详情
+// 获取文章被关注被收藏的详情
 func GetArticleFollowDetail(articleId, uid int) (item *ArticleFollowDetail, err error) {
 	//d_num 作者被关注的数量 、 md_num 本人是否关注这个作者 、ac_num 文章被收藏的数量 、 mac_num 本人是否收藏这个文章
 	o := orm.NewOrm()
@@ -483,7 +484,7 @@ WHERE
 	return
 }
 
-//日度点评的数据同步
+// 日度点评的数据同步
 type ReportDetail struct {
 	Id                 int    `orm:"column(id)" description:"报告Id"`
 	AddType            int    `description:"新增方式:1:新增报告,2:继承报告"`
@@ -654,7 +655,7 @@ WHERE
 	return
 }
 
-//通过文章ID获取文章所关联的标的ID
+// 通过文章ID获取文章所关联的标的ID
 func GetSubjectIds(articleId int) (subjects string, err error) {
 	sql := ` SELECT
 			GROUP_CONCAT( DISTINCT industrial_subject_id ORDER BY id ASC SEPARATOR ',' ) AS subjects 
@@ -665,7 +666,7 @@ func GetSubjectIds(articleId int) (subjects string, err error) {
 	return
 }
 
-//修改发布状态
+// 修改发布状态
 func UpdateIsClassFail(articleId int) (err error) {
 	sql := `UPDATE cygx_article SET  is_class_fail=1  WHERE article_id=? `
 	o := orm.NewOrm()
@@ -679,7 +680,7 @@ type SummaryArticleStock struct {
 	Stock     string `description:"个股标签"`
 }
 
-//综述报告
+// 综述报告
 func GetSummaryArticle(chartPermissionId int) (items []*SummaryArticleStock, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT

+ 12 - 12
models/chart.go

@@ -98,14 +98,14 @@ func GetChartCountById(chartId int) (count int, err error) {
 	return
 }
 
-//新增图表
+// 新增图表
 func AddCygxChart(item *CygxChart) (lastId int64, err error) {
 	o := orm.NewOrm()
 	lastId, err = o.Insert(item)
 	return
 }
 
-//标签分类
+// 标签分类
 type ChartPtagResultApi struct {
 	Data []ChartPtagResultApidate `json:"data"`
 	Code int                      `json:"code"`
@@ -167,7 +167,7 @@ type ChartCollectReq struct {
 	ChartId int `description:"图表ID"`
 }
 
-//获取图表列表
+// 获取图表列表
 func GetChartList(condition string, pars []interface{}, startSize, pageSize int) (items []*HomeChartListResp, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT * FROM cygx_chart AS a WHERE a.publish_status=1 `
@@ -179,7 +179,7 @@ func GetChartList(condition string, pars []interface{}, startSize, pageSize int)
 	return
 }
 
-//获取所有同步过来的图表
+// 获取所有同步过来的图表
 func GetChartListAll() (items []*HomeChartListResp, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT chart_id FROM cygx_chart  `
@@ -195,7 +195,7 @@ func GetChartListAll() (items []*HomeChartListResp, err error) {
 //	return
 //}
 
-//获取图表列表
+// 获取图表列表
 func GetChartListCollection(chartIds string, userId, startSize, pageSize int) (items []*HomeChartListResp, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT a.*,
@@ -208,7 +208,7 @@ func GetChartListCollection(chartIds string, userId, startSize, pageSize int) (i
 			LEFT JOIN cygx_chart_top AS t ON t.chart_id = a.chart_id
 			LEFT JOIN cygx_chart_collect AS c ON c.chart_id = a.chart_id 
 		WHERE
-			a.publish_status = 1 
+			1=1
 			AND a.chart_id IN (` + chartIds + `) 
 		GROUP BY
 			a.chart_id 
@@ -219,7 +219,7 @@ func GetChartListCollection(chartIds string, userId, startSize, pageSize int) (i
 	return
 }
 
-//获取图表列表
+// 获取图表列表
 func GetChartListCollectionNew(condition string, pars []interface{}, userId, startSize, pageSize int) (items []*HomeChartListResp, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT a.*,
@@ -244,7 +244,7 @@ func GetChartListCollectionNew(condition string, pars []interface{}, userId, sta
 	return
 }
 
-//获取图表列表本地
+// 获取图表列表本地
 func GetChartListCollectionWithCygx(userId, startSize, pageSize int) (items []*HomeChartListResp, err error) {
 	o := orm.NewOrm()
 	sql := ` SELECT
@@ -258,7 +258,7 @@ func GetChartListCollectionWithCygx(userId, startSize, pageSize int) (items []*H
 			INNER JOIN cygx_chart AS a ON c.chart_id = a.chart_id
 			LEFT JOIN cygx_chart_top AS t ON t.chart_id = a.chart_id 
 		WHERE
-			a.publish_status = 1 
+			1=1 
 			AND c.user_id =? 
 		GROUP BY
 			a.chart_id 
@@ -276,7 +276,7 @@ func GetChartListConfig() (items []*HomeChartListResp, err error) {
 	return
 }
 
-//获取图表数量
+// 获取图表数量
 func GetChartCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT COUNT(1) AS count
@@ -289,12 +289,12 @@ func GetChartCount(condition string, pars []interface{}) (count int, err error)
 	return
 }
 
-//获取图表数量
+// 获取图表数量
 func GetChartCollentCount(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT COUNT(1) AS count
                 FROM cygx_chart_all AS a
-                WHERE a.publish_status=1 `
+                WHERE  1=1  `
 	if condition != "" {
 		sql += condition
 	}

+ 129 - 0
models/cygx_morning_meeting_review_chapter.go

@@ -0,0 +1,129 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// CygxMorningMeetingReviewChapter [...]
+type CygxMorningMeetingReviewChapter struct {
+	Id                   int       `orm:"column(id);pk"`
+	MeetingTime          time.Time `json:"meetingTime"` // 晨会日期
+	CreateTime           time.Time `json:"createTime"`
+	ModifyTime           time.Time `json:"modifyTime"`
+	IndustryId           int       `json:"industryId"`          // 产业id
+	IndustryName         string    `json:"industryName"`        // 产业名称
+	ChartPermissionName  string    `json:"chartPermissionName"` // 行业名称
+	ChartPermissionId    int       `json:"chartPermissionId"`   // 行业id
+	IndustrialSubjectIds string    `json:"industrialSubjectId"` // 标的id
+	MeetingId            int64     `json:"meetingId"`           // 主表id
+	Content              string    `json:"content"`             // 内容
+}
+
+type AddMorningMeetingReviewItem struct {
+	ChapterId            int
+	Content              string
+	ChartPermissionId    int
+	ChartPermissionName  string
+	IndustryId           int
+	IndustryName         string
+	IndustrialSubjectIds string
+}
+
+type AddMorningMeetingReviewsReq struct {
+	List        []*AddMorningMeetingReviewItem
+	MeetingId   int
+	MeetingTime string
+	PublishTime string
+	DoType      int `description:"操作类型 0,保存 、1,发布"`
+}
+
+//添加晨报点评章节
+func AddCygxMorningMeetingReviewChapter(item *CygxMorningMeetingReviewChapter) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+//列表
+func GetCygxMorningMeetingReviewsListById(meetingId int) (items []*CygxMorningMeetingReviewChapter, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_morning_meeting_review_chapter WHERE meeting_id = ? `
+	_, err = o.Raw(sql, meetingId).QueryRows(&items)
+	return
+}
+
+type IndustrialSubjectItem struct {
+	IndustrialSubjectId int    `orm:"column(industrial_subject_id);pk" description:"标的id"`
+	SubjectName         string `description:"标的名称"`
+}
+
+type CygxMorningMeetingReviewChapterRespItem struct {
+	Id                    int                      `orm:"column(id);pk"`
+	MeetingTime           time.Time                `json:"meetingTime"` // 晨会日期
+	CreateTime            time.Time                `json:"createTime"`
+	ModifyTime            time.Time                `json:"modifyTime"`
+	IndustryId            int                      `json:"industryId"`            // 产业id
+	IndustryName          string                   `json:"industryName"`          // 产业名称
+	ChartPermissionName   string                   `json:"chartPermissionName"`   // 行业名称
+	ChartPermissionId     int                      `json:"chartPermissionId"`     // 行业id
+	IndustrialSubjectList []*IndustrialSubjectItem `json:"industrialSubjectList"` // 标的list
+	MeetingId             int64                    `json:"meetingId"`             // 主表id
+	Content               string                   `json:"content"`               // 内容
+}
+
+type CygxMorningMeetingReviewChapterResp struct {
+	MeetingTime string
+	Status int
+	List []*CygxMorningMeetingReviewChapterRespItem
+}
+
+//删除晨会点评章节
+func DeleteMorningMeetingChapter(reviewId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM cygx_morning_meeting_review_chapter WHERE meeting_id =? `
+	_, err = o.Raw(sql, reviewId).Exec()
+	return
+}
+
+//更新晨报点评章节
+func UpdateCygxMorningMeetingReviewChapter(item *CygxMorningMeetingReviewChapter) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE cygx_morning_meeting_review_chapter
+			SET
+			  meeting_time =?,
+			  modify_time = ?,
+			  industry_id = ?,
+			  industry_name = ?,
+			  chart_permission_id = ?,
+			  chart_permission_name = ?,
+			  industrial_subject_ids = ?,
+			  content = ? 
+			WHERE id = ? `
+	_, err = o.Raw(sql, item.MeetingTime, item.ModifyTime, item.IndustryId, item.IndustryName,
+		item.ChartPermissionId, item.ChartPermissionName, item.IndustrialSubjectIds, item.Content, item.Id).Exec()
+
+	return
+}
+
+func GetCygxMorningMeetingReviewsListByIdAndIndustryId(meetingId,  industryId int) (item *CygxMorningMeetingReviewChapter, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_morning_meeting_review_chapter WHERE meeting_id = ? AND industry_id = ? `
+	err = o.Raw(sql, meetingId, industryId).QueryRow(&item)
+	return
+}
+
+//删除晨会点评章节
+func DeleteMorningMeetingChapterById(chapterId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM cygx_morning_meeting_review_chapter WHERE id =? `
+	_, err = o.Raw(sql, chapterId).Exec()
+	return
+}
+
+func GetCygxMorningMeetingReviewsListByIndustrialIds(industrialIds string) (items []*CygxMorningMeetingReviewChapter, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_morning_meeting_review_chapter WHERE industry_id IN (` + industrialIds + `)  `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}

+ 125 - 0
models/cygx_morning_meeting_reviews.go

@@ -0,0 +1,125 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// CygxMorningMeetingReviews [...]
+type CygxMorningMeetingReviews struct {
+	Id            int       `orm:"column(id);pk"`
+	MeetingTime   time.Time `json:"meetingTime"` // 晨会日期
+	PublishTime   time.Time `json:"publishTime"` // 发布日期
+	CreateTime    time.Time `json:"createTime"`
+	ModifyTime    time.Time `json:"modifyTime"`
+	Status        int       `json:"status"`       // 0:未发布,1:已发布
+	PartNums      int       `json:"partNums"`     // 段落数
+	IndustryNames string    `json:"industryName"` // 产业名称
+}
+
+//添加晨报点评
+func AddCygxMorningMeetingReviews(item *CygxMorningMeetingReviews) (id int64, err error) {
+	o := orm.NewOrm()
+	id, err = o.Insert(item)
+	return
+}
+
+//列表
+func GetCygxMorningMeetingReviewsList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxMorningMeetingReviews, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_morning_meeting_reviews WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetCygxMorningMeetingReviewsListCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM cygx_morning_meeting_reviews WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+type CygxMorningMeetingReviewItem struct {
+	Id            int    `orm:"column(id);pk"`
+	MeetingTime   string `json:"meetingTime"` // 晨会日期
+	PublishTime   string `json:"publishTime"` // 发布日期
+	CreateTime    string `json:"createTime"`
+	ModifyTime    string `json:"modifyTime"`
+	Status        int    `json:"status"`       // 0:未发布,1:已发布
+	PartNums      int    `json:"partNums"`     // 段落数
+	IndustryNames string `json:"industryName"` // 产业名称
+}
+
+type CygxMorningMeetingReviewsList struct {
+	List   []*CygxMorningMeetingReviewItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+func GetMorningMeetingReviewById(reviewId int) (item *CygxMorningMeetingReviews, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_morning_meeting_reviews WHERE id=?`
+	err = o.Raw(sql, reviewId).QueryRow(&item)
+	return
+}
+
+// 发布报告
+func PublishMorningMeetingReviewById(reviewId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE cygx_morning_meeting_reviews SET status=1,publish_time=now(),modify_time=NOW() WHERE id = ? `
+	_, err = o.Raw(sql, reviewId).Exec()
+	return
+}
+
+type MorningReviewPublishReq struct {
+	ReviewIds string `description:"晨会id,多个用英文逗号隔开"`
+}
+
+type MorningReviewPublishCancelReq struct {
+	ReviewId int `description:"晨会id"`
+}
+
+//取消发布报告
+func PublishCancelMorningMeetingReview(reviewId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE cygx_morning_meeting_reviews SET status=0,publish_time=null WHERE id =?  `
+	_, err = o.Raw(sql, reviewId).Exec()
+	return
+}
+
+type MorningReviewDeleteReq struct {
+	ReviewId int `description:"晨会id"`
+}
+
+
+//删除晨会点评
+func DeleteMorningMeeting(reviewId int) (err error) {
+	o := orm.NewOrm()
+	sql := ` DELETE FROM cygx_morning_meeting_reviews WHERE id =? `
+	_, err = o.Raw(sql, reviewId).Exec()
+	return
+}
+
+//更新晨报点评
+func UpdateCygxMorningMeetingReviews(item *CygxMorningMeetingReviews) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE cygx_morning_meeting_reviews
+			SET
+			  meeting_time =?,
+			  publish_time = ?,
+			  modify_time = ?,
+			  part_nums = ?,
+			  industry_names = ?,
+			  status = ? 
+			WHERE id = ? `
+	_, err = o.Raw(sql, item.MeetingTime, item.PublishTime, item.ModifyTime, item.PartNums, item.IndustryNames, item.Status, item.Id).Exec()
+
+	return
+}

+ 181 - 24
models/micro_roadshow.go

@@ -63,8 +63,8 @@ type MicroRoadShowPageList struct {
 func GetMicroRoadShowVideoPageListV8(startSize, pageSize int, condition string, pars []interface{}, conditionAct string, parsAct []interface{}, conditionAudio string, parsAudio []interface{}, audioId, videoId, activityVideoId, filter int) (total int, list []*MicroRoadShowPageList, err error) {
 	o := orm.NewOrm()
 	var sql string
-	if audioId+activityVideoId == 0 && filter != 2 {
-		sql += `SELECT
+	//if audioId+activityVideoId == 0 && filter != 2 {
+	sql += `SELECT
 			video_id AS id,
 			video_name AS title,
 			video_url AS resource_url,
@@ -81,16 +81,99 @@ func GetMicroRoadShowVideoPageListV8(startSize, pageSize int, condition string,
 			cygx_micro_roadshow_video 
 		WHERE
 			publish_status = 1 `
-		if condition != `` {
-			sql += condition
-		}
+	if condition != `` {
+		sql += condition
+	}
+	//}
+	//if audioId+videoId+activityVideoId == 0 && filter != 2 {
+	//	sql += `  UNION ALL `
+	//}
+	sql += `  UNION ALL `
+	//if audioId+videoId == 0 && filter != 2 {
+	sql += `
+		SELECT
+			video_id AS id,
+			video_name AS title,
+			video_url AS resource_url,
+			2 AS type,
+	    	art.activity_time as publish_time,
+			art.chart_permission_id,
+			art.chart_permission_name,
+			"" AS play_seconds,
+			"" AS background_img,
+			"" AS industry_name,
+			"" AS share_img,
+			v.activity_id
+		FROM
+			cygx_activity_video as v
+			INNER JOIN cygx_activity as art on art.activity_id = v.activity_id WHERE 1= 1  `
+	if conditionAct != `` {
+		sql += conditionAct
+	}
+	//}
+	//if audioId+videoId+activityVideoId == 0 && filter == 0 {
+	//	sql += `  UNION ALL `
+	//}
+	sql += `  UNION ALL `
+	//if videoId+activityVideoId == 0 && filter != 1 {
+	sql += `
+			SELECT
+			a.activity_voice_id AS id,
+			a.voice_name AS title,
+			a.voice_url AS resource_url,
+			1 AS type,
+			b.activity_time AS publish_time,
+			b.chart_permission_id,
+			b.chart_permission_name,
+			a.voice_play_seconds AS play_seconds,
+			a.img_url AS background_img,
+			"" AS industry_name,
+			"" AS share_img,
+			a.activity_id 
+		FROM
+			cygx_activity_voice AS a
+			JOIN cygx_activity AS b ON a.activity_id = b.activity_id  WHERE 1= 1  `
+	if conditionAudio != `` {
+		sql += conditionAudio
 	}
-	if audioId+videoId+activityVideoId == 0 && filter != 2 {
-		sql += `  UNION ALL `
+	//}
+	sql += ` ORDER BY publish_time DESC`
+	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
+	err = o.Raw(totalSql, pars, parsAct, parsAudio).QueryRow(&total)
+	if err != nil {
+		return
 	}
+	sql += ` LIMIT ?,?`
+	_, err = o.Raw(sql, pars, parsAct, parsAudio, startSize, pageSize).QueryRows(&list)
+	return
+}
 
-	if audioId+videoId == 0 && filter != 2 {
-		sql += `
+// CountMicroRoadShowVideoPageList 获取微路演视频数量
+func CountMicroRoadShowVideoPageList(condition string, pars []interface{}, conditionAct string, parsAct []interface{}, conditionAudio string, parsAudio []interface{}) (total int, err error) {
+	o := orm.NewOrm()
+	var sql string
+	sql += `SELECT
+			video_id AS id,
+			video_name AS title,
+			video_url AS resource_url,
+			3 AS type,
+			publish_date AS publish_time,
+			chart_permission_id,
+			chart_permission_name,
+			video_duration AS play_seconds,
+			img_url AS background_img,            
+			industry_name,
+			share_img_url AS share_img,
+			"" as  activity_id
+		FROM
+			cygx_micro_roadshow_video 
+		WHERE
+			publish_status = 1 `
+	if condition != `` {
+		sql += condition
+	}
+	sql += `  UNION ALL `
+	sql += `
 		SELECT
 			video_id AS id,
 			video_name AS title,
@@ -107,16 +190,11 @@ func GetMicroRoadShowVideoPageListV8(startSize, pageSize int, condition string,
 		FROM
 			cygx_activity_video as v
 			INNER JOIN cygx_activity as art on art.activity_id = v.activity_id WHERE 1= 1  `
-		if conditionAct != `` {
-			sql += conditionAct
-		}
-	}
-	if audioId+videoId+activityVideoId == 0 && filter == 0 {
-		sql += `  UNION ALL `
+	if conditionAct != `` {
+		sql += conditionAct
 	}
-
-	if videoId+activityVideoId == 0 && filter != 1 {
-		sql += `
+	sql += `  UNION ALL `
+	sql += `
 			SELECT
 			a.activity_voice_id AS id,
 			a.voice_name AS title,
@@ -133,16 +211,95 @@ func GetMicroRoadShowVideoPageListV8(startSize, pageSize int, condition string,
 		FROM
 			cygx_activity_voice AS a
 			JOIN cygx_activity AS b ON a.activity_id = b.activity_id  WHERE 1= 1  `
-		if conditionAudio != `` {
-			sql += conditionAudio
-		}
+	if conditionAudio != `` {
+		sql += conditionAudio
 	}
+
 	sql += ` ORDER BY publish_time DESC`
 	totalSql := `SELECT COUNT(1) total FROM (` + sql + `) z `
 	err = o.Raw(totalSql, pars, parsAct, parsAudio).QueryRow(&total)
-	if err != nil {
-		return
+	return
+}
+
+// GetMicroRoadShowVideoPageList 获取微路演视频列表-分页
+func GetMicroRoadShowVideoPageListIkWord(startSize, pageSize int, condition string, pars []interface{}, conditionAct string, parsAct []interface{}, conditionAudio string, parsAudio []interface{}, audioId, videoId, activityVideoId, filter int) (list []*MicroRoadShowPageList, err error) {
+	o := orm.NewOrm()
+	var sql string
+	//if audioId+activityVideoId == 0 && filter != 2 {
+	sql += `SELECT
+			video_id AS id,
+			video_name AS title,
+			video_url AS resource_url,
+			3 AS type,
+			publish_date AS publish_time,
+			chart_permission_id,
+			chart_permission_name,
+			video_duration AS play_seconds,
+			img_url AS background_img,            
+			industry_name,
+			share_img_url AS share_img,
+			"" as  activity_id
+		FROM
+			cygx_micro_roadshow_video 
+		WHERE
+			publish_status = 1 `
+	if condition != `` {
+		sql += condition
+	}
+	//}
+	//if audioId+videoId+activityVideoId == 0 && filter != 2 {
+	//	sql += `  UNION ALL `
+	//}
+	sql += `  UNION ALL `
+	//if audioId+videoId == 0 && filter != 2 {
+	sql += `
+		SELECT
+			video_id AS id,
+			video_name AS title,
+			video_url AS resource_url,
+			2 AS type,
+			art.activity_time as publish_time,
+			art.chart_permission_id,
+			art.chart_permission_name,
+			"" AS play_seconds,
+			"" AS background_img,
+			"" AS industry_name,
+			"" AS share_img,
+			v.activity_id
+		FROM
+			cygx_activity_video as v
+			INNER JOIN cygx_activity as art on art.activity_id = v.activity_id WHERE 1= 1  `
+	if conditionAct != `` {
+		sql += conditionAct
+	}
+	//}
+	//if audioId+videoId+activityVideoId == 0 && filter == 0 {
+	//	sql += `  UNION ALL `
+	//}
+	sql += `  UNION ALL `
+	//if videoId+activityVideoId == 0 && filter != 1 {
+	sql += `
+			SELECT
+			a.activity_voice_id AS id,
+			a.voice_name AS title,
+			a.voice_url AS resource_url,
+			1 AS type,
+			b.activity_time AS publish_time,
+			b.chart_permission_id,
+			b.chart_permission_name,
+			a.voice_play_seconds AS play_seconds,
+			a.img_url AS background_img,
+			"" AS industry_name,
+			"" AS share_img,
+			a.activity_id 
+		FROM
+			cygx_activity_voice AS a
+			JOIN cygx_activity AS b ON a.activity_id = b.activity_id  WHERE 1= 1  `
+	if conditionAudio != `` {
+		sql += conditionAudio
 	}
+	//}
+	sql += ` ORDER BY publish_time DESC`
 	sql += ` LIMIT ?,?`
 	_, err = o.Raw(sql, pars, parsAct, parsAudio, startSize, pageSize).QueryRows(&list)
 	return
@@ -349,7 +506,7 @@ func GetMicroRoadshowVideoList() (list []*MicroRoadshowVideo, err error) {
 	return
 }
 
-//GetMicroRoadshowVideoByIndustryIdCount  根据行业ID查询产业视频是否存在
+// GetMicroRoadshowVideoByIndustryIdCount  根据行业ID查询产业视频是否存在
 func GetMicroRoadshowVideoByIndustryIdCount(industryId int) (count int, err error) {
 	o := orm.NewOrm()
 	sql := `SELECT COUNT(1) count

+ 22 - 0
models/page_history_record.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	"github.com/beego/beego/v2/client/orm"
+	"strconv"
 	"time"
 )
 
@@ -48,4 +49,25 @@ func AddCygxPageHistoryRecord(item *CygxPageHistoryRecord) (lastId int64, err er
 
 type PageRouter struct {
 	PageRouter string
+}
+
+func GetTimeLineRecordCount(userId, industrialManagementId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM cygx_page_history_record WHERE user_id=? AND router = '/api/report/industry/ArticleList?PageSize=10&CurrentIndex=1&CategoryId=99999&IndustrialManagementId=`+strconv.Itoa(industrialManagementId)+`'`
+	err = o.Raw(sql, userId).QueryRow(&count)
+	return
+}
+
+func GetTimeLineRecordItem(userId, industrialManagementId int) (item *CygxPageHistoryRecord, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_page_history_record WHERE user_id=? AND router = '/api/report/industry/ArticleList?PageSize=10&CurrentIndex=1&CategoryId=99999&IndustrialManagementId=`+strconv.Itoa(industrialManagementId)+ `' ORDER BY create_time DESC LIMIT 1,1 `
+	err = o.Raw(sql, userId).QueryRow(&item)
+	return
+}
+
+func GetTimeLineRecordAllCount(userId int, date string) (items []*CygxPageHistoryRecord, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM cygx_page_history_record WHERE user_id=? AND router LIKE '%/api/report/industry/ArticleList?PageSize=10&CurrentIndex=1&CategoryId=99999&IndustrialManagementId=%' AND create_time > ? `
+	_, err = o.Raw(sql, userId, date).QueryRows(&items)
+	return
 }

+ 61 - 15
models/report.go

@@ -4,6 +4,8 @@ import (
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
 	"strconv"
+	"time"
+
 	//"github.com/rdlucklib/rdluck_tools/paging"
 )
 
@@ -150,17 +152,30 @@ func IndustrialUserRecordArticleCount(userId, industrialManagementId, categoryId
 FROM
 	cygx_article_history_record 
 WHERE
-	article_id = ( SELECT article_id FROM cygx_article WHERE article_id IN (SELECT article_id FROM cygx_industrial_article_group_management WHERE industrial_management_id = ? ) AND match_type_name = any( SELECT match_type_name FROM cygx_report_mapping WHERE category_id = ? ) ORDER BY publish_date DESC LIMIT 0, 1 ) 
+	article_id = ( SELECT article_id FROM cygx_article WHERE article_id IN (SELECT article_id FROM cygx_industrial_article_group_management WHERE industrial_management_id = ? ) AND category_id  IN (SELECT
+	category_id 
+FROM
+	cygx_report_mapping 
+WHERE
+	chart_permission_id = any( SELECT chart_permission_id FROM cygx_report_mapping WHERE category_id = ? ) 
+	AND match_type_name = any( SELECT match_type_name FROM cygx_report_mapping WHERE category_id = ? ) ) ORDER BY publish_date DESC LIMIT 0, 1 ) 
 	AND user_id = ? `
-	err = o.Raw(sql, industrialManagementId, categoryId, userId).QueryRow(&count)
+	err = o.Raw(sql, industrialManagementId, categoryId, categoryId, userId).QueryRow(&count)
 	return
 }
 
 //获取最新文章
 func GetNewIndustrialUserRecordArticle(industrialManagementId, categoryId int) (item *ArticleDetail, err error) {
 	o := orm.NewOrm()
-	sql := ` SELECT * FROM cygx_article WHERE article_id IN (SELECT article_id FROM cygx_industrial_article_group_management WHERE industrial_management_id = ? ) AND match_type_name = any( SELECT match_type_name FROM cygx_report_mapping WHERE category_id = ? ) ORDER BY publish_date DESC LIMIT 0, 1`
-	err = o.Raw(sql, industrialManagementId, categoryId).QueryRow(&item)
+	//sql := ` SELECT * FROM cygx_article WHERE article_id IN (SELECT article_id FROM cygx_industrial_article_group_management WHERE industrial_management_id = ? ) AND match_type_name = any( SELECT match_type_name FROM cygx_report_mapping WHERE category_id = ? ) ORDER BY publish_date DESC LIMIT 0, 1`
+	sql := ` SELECT * FROM cygx_article WHERE article_id IN (SELECT article_id FROM cygx_industrial_article_group_management WHERE industrial_management_id = ? ) AND category_id  IN (SELECT
+	category_id 
+FROM
+	cygx_report_mapping 
+WHERE
+	chart_permission_id = any( SELECT chart_permission_id FROM cygx_report_mapping WHERE category_id = ? ) 
+	AND match_type_name = any( SELECT match_type_name FROM cygx_report_mapping WHERE category_id = ? ) ) ORDER BY publish_date DESC LIMIT 0, 1`
+	err = o.Raw(sql, industrialManagementId, categoryId, categoryId).QueryRow(&item)
 	return
 }
 
@@ -349,18 +364,25 @@ func GetArticleIdsBySubId(subjectId string) (articleIds string, err error) {
 
 //用户收藏榜start
 type ArticleCollectionResp struct {
-	ArticleId              int    `description:"文章id"`
-	Title                  string `description:"标题"`
-	PublishDate            string `description:"发布时间"`
+	ArticleId              int                         `description:"文章id"`
+	Title                  string                      `description:"标题"`
+	PublishDate            string                      `description:"发布时间"`
+	IndustrialManagementId int                         `description:"产业Id"`
+	IndustryName           string                      `description:"产业名称"`
+	DepartmentId           int                         `description:"作者Id"`
+	NickName               string                      `description:"作者昵称"`
+	MyCollectNum           int                         `description:"本人是否收藏"`
+	IsCollect              bool                        `description:"本人是否收藏"`
+	Pv                     int                         `description:"PV"`
+	CollectNum             int                         `description:"收藏人数"`
+	Source                 int                         `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
+	List                   []*IndustrialManagementResp `description:"产业列表"`
+}
+
+type IndustrialManagementResp struct {
 	IndustrialManagementId int    `description:"产业Id"`
 	IndustryName           string `description:"产业名称"`
-	DepartmentId           int    `description:"作者Id"`
-	NickName               string `description:"作者昵称"`
-	MyCollectNum           int    `description:"本人是否收藏"`
-	IsCollect              bool   `description:"本人是否收藏"`
-	Pv                     int    `description:"PV"`
-	CollectNum             int    `description:"收藏人数"`
-	Source                 int    `description:"来源 1:弘则资源包(报告)、2:研选主题(报告)"`
+	ChartPermissionId      int    `description:"权限id"`
 }
 
 type ArticleCollectionLIstResp struct {
@@ -894,7 +916,7 @@ FROM
 	SELECT
 		mmc.id,
 		'' AS title,
-		mm.meeting_time AS publish_time,
+		mm.publish_time AS publish_time,
 		'' AS video_url,
 		'时间线' AS sub_category_name,
 		mmc.content,
@@ -919,3 +941,27 @@ type ArticleIdReq struct {
 	PlaySeconds int    `description:"播放时长"`
 	PageRouter  string `description:"页面路径"`
 }
+
+type IndustrialReadNum struct {
+	IndustrialManagementId int `description:"产业id"`
+	Readnum                int `description:"阅读次数"`
+}
+
+//获取该产业下文章的用户阅读次数-小红点用
+func GetReportIndustrialReadNumList(userId int, industrialIds string, createtime time.Time) (items []*IndustrialReadNum, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.industrial_management_id, MIN(a.readnum) AS readnum FROM (
+SELECT man_g.industrial_management_id,( SELECT COUNT( 1 ) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(userId) + ` AND rec.article_id = a.article_id ) AS readnum 
+FROM
+	cygx_article AS a 
+	INNER JOIN cygx_industrial_article_group_management as man_g ON man_g.article_id = a.article_id
+WHERE
+	a.publish_status = 1 
+	AND a.is_class = 1
+	AND man_g.industrial_management_id IN (` + industrialIds + `)  
+	AND a.publish_date > ? 
+GROUP BY a.article_id ORDER BY publish_date DESC
+) AS a GROUP BY industrial_management_id`
+	_, err = o.Raw(sql, createtime).QueryRows(&items)
+	return
+}

+ 4 - 0
models/search_key_word_log.go

@@ -18,6 +18,10 @@ type CygxSearchKeyWordLog struct {
 	Source      int       `description:"来源;1:纪要、2:图表、3:纪要/图表、4:产业资源包、5:报告、6:活动"`
 }
 
+type CygxSearchKeyWordLogRep struct {
+	KeyWord string `description:"搜索关键词"`
+}
+
 //新增搜索
 func AddSearchKeyWordLog(item *CygxSearchKeyWordLog) (lastId int64, err error) {
 	o := orm.NewOrm()

+ 9 - 0
routers/commentsRouter.go

@@ -664,6 +664,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ConfigController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:ConfigController"],
+        beego.ControllerComments{
+            Method: "KeyWordLog",
+            Router: `/user/search/keyWordLog`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:HomeController"] = append(beego.GlobalControllerRouter["hongze/hongze_cygx/controllers:HomeController"],
         beego.ControllerComments{
             Method: "ListHomeArtAndChart",

+ 24 - 14
services/activity.go

@@ -500,7 +500,9 @@ func GetHavePower(activityInfo *models.ActivityDetail, permissionStr, companyDet
 // @Param   Label   query   string  false       "搜索主题 多个用 , 隔开"
 // @Param   PlayBack   query   int  false       "是否仅展示回放 1:是、0:否 默认0"
 // @Param   KeyWord   query   string  false       "搜索关键词 多个用 , 隔开"
-func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermissionIds, whichDay, activeState, label string, isPower, source int, keyWord string, playBack int) (conditionActivity string, err error) {
+// @Param   ikType   query   int  false       "联想词类型 , 1不做联想,2,做除初始词的联想,3所有联想"
+func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermissionIds, whichDay, activeState, label string, isPower, source int, keyWord string, playBack, ikType int) (conditionActivity string, err error) {
+	keyWordNoIk := keyWord
 	adminIds, err := models.GetSelleridWhichGroup(user.CompanyId, 2)
 	if err != nil {
 		return
@@ -620,7 +622,24 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 
 	//有搜索条件传过来时,不判进行状态条件
 	if keyWord != "" {
-		condition += ` AND (art.label  LIKE '%` + keyWord + `%' OR art.activity_name  LIKE '%` + keyWord + `%' ) `
+		if ikType == 2 || ikType == 3 {
+			keyWordArr, e := GetIndustryMapNameSliceV3(keyWord)
+			if e != nil {
+				err = errors.New("获取分词失败,GetIndustryMapNameSliceV3, Err: " + keyWord + e.Error())
+				return
+			}
+			keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr)
+			//var keywords string
+			if len(keyWordArr) > 1 {
+				if ikType == 2 {
+					keyWord = KeyWordArrSqlRegexp(keyWordArr)
+					condition += `	AND (art.label NOT LIKE  '%` + keyWordNoIk + `%' AND   art.activity_name NOT LIKE '%` + keyWordNoIk + `%' ) `
+				} else if ikType == 3 {
+					keyWord = KeyWordArrSqlRegexpAll(keyWordArr)
+				}
+			}
+		}
+		condition += ` AND (art.label   REGEXP '` + keyWord + `' OR art.activity_name  REGEXP '` + keyWord + `' ) `
 	} else {
 		if activeState != "" {
 			// 默认查看未开始跟进行中
@@ -660,7 +679,6 @@ func GetActivityonditionList(user *models.WxUserItem, activityTypeId, chartPermi
 		//condition += ` AND art.activity_time > '` + endTime + `'  `
 		if len(ativityVIdArry) > 0 {
 			ativityVIdstr := strings.Join(ativityVIdArry, ",")
-			fmt.Println(ativityVIdstr)
 			condition += ` AND art.activity_id IN  (` + ativityVIdstr + `) `
 		}
 	}
@@ -1590,7 +1608,9 @@ func ActivityButtonShow(item *models.ActivityDetail) (articleDetail *models.Acti
 			articleDetail.IsShowMeetingReminder = true
 		}
 	}
-	articleDetail.SourceType = 1
+	if articleDetail.SourceType != 2 {
+		articleDetail.SourceType = 1
+	}
 	activityTimeText := articleDetail.ActivityTimeText
 	activityTimeText = strings.Replace(activityTimeText, "(", "(", -1)
 	activityTimeText = strings.Replace(activityTimeText, ")", ")", -1)
@@ -1686,16 +1706,6 @@ func AddActivitykeyWordSearch(keyWordSearch string, user *models.WxUserItem) {
 		keyWordItem.PageType = "ActivitSearch"
 		keyWordItem.CreateTime = time.Now()
 		go models.AddUserSearchKeyWord(keyWordItem)
-
-		cacheKey := fmt.Sprint("Search_uid:", user.UserId, "_KeyWord:", keyWordSearch, "_Source:", 6)
-		isExist := utils.Rc.IsExist(cacheKey)
-		if !isExist {
-			setNX := utils.Rc.SetNX(cacheKey, keyWordSearch, time.Minute*1)
-			if !setNX {
-				go utils.SendAlarmMsg("记录用户搜索活动关键词失败,设置Redis Key 过期时间失败:key"+cacheKey, 3)
-			}
-			go AddUserSearchLog(user, keyWordSearch, 6)
-		}
 	}
 }
 

+ 46 - 1
services/activity_special.go

@@ -140,6 +140,11 @@ func GetActivityLabelSpecialList(user *models.WxUserItem, isPower int, chartPerm
 	}
 	//}
 	for k2, v2 := range specialList {
+		if v2.Days == 0 {
+			specialList[k2].TripStatus = 1
+		} else {
+			specialList[k2].TripStatus = 2
+		}
 		specialList[k2].KeyWord = LabelStrV5(v2.KeyWord, v2.IsShowSubjectName, v2.TemporaryLabel)
 		specialList[k2].ImgUrlBg = "https://hzstatic.hzinsights.com/static/temp/20220426202204/20220426/XDLLsjC9XAAy8LIzQr7GsjrBbtX6.png"
 		specialList[k2].ImgUrlBg = utils.ACTIVITY_ZXDY_ImgUrl3
@@ -520,6 +525,7 @@ func HandleActivitySpecialShow(activityDetail *models.CygxActivitySpecialDetail,
 func GetActivitySpecialSearcheList(user *models.WxUserItem, condition string, startSize, pageSize int, keywords string) (items []*models.ActivityDetail, total int, err error) {
 	var conditionSpecil string
 	var pars, parsSpecil []interface{}
+	keyword := keywords
 	if keywords != "" {
 		keywords = "%" + keywords + "%"
 		conditionSpecil += ` AND art.days > 0 AND (art.research_theme LIKE ? OR art.label LIKE ? OR art.industrial_name LIKE ? OR art.industrial_subject_name LIKE ? ) `
@@ -530,12 +536,51 @@ func GetActivitySpecialSearcheList(user *models.WxUserItem, condition string, st
 		err = errors.New("GetActivitySpecialSearcheList, Err: " + e.Error())
 		return
 	}
+
+	// 查询IK分词后那一部分的数据
+	conditionActivityIk, e := GetActivityonditionList(user, "", "", "", "", "", 0, 1, keyword, 0, 2)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = errors.New("GetActivityonditionList, Err: " + e.Error())
+		return
+	}
+	conditionActivityIk += " AND art.is_limit_people = 1 AND art.publish_status = 1  "
+
+	totalIk, e := models.GetActivityCount(conditionActivityIk, 0, pars, 0)
+	if e != nil {
+		err = errors.New("GetActivityonditionList, Err: " + e.Error())
+		return
+	}
+	total = totalSearche + totalIk
+	keyWordArr, e := GetIndustryMapNameSliceV3(keywords)
+	if e != nil {
+		err = errors.New("GetActivityonditionList, Err: " + e.Error())
+		return
+	}
+	keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr)
+	startSizeIk := startSize - totalSearche
+	if startSizeIk < 0 {
+		startSizeIk = 0
+	}
+	var pageSizeIk int
+	pageSizeIk = pageSize - len(list)
+	if pageSizeIk > 0 {
+		//搜索关键词联想
+		conditionActivityIk += ` ORDER BY art.activity_time DESC ,  art.active_state ASC   `
+		listIk, e := models.GetActivityListNew(conditionActivityIk, pars, user.UserId, startSizeIk, pageSizeIk, 0, 0, "")
+		if e != nil {
+			err = errors.New("GetActivityonditionList, Err: " + e.Error())
+			return
+		}
+		for _, item := range listIk {
+			list = append(list, item)
+		}
+	}
+
 	items, e = HandleActivityListButton(list, user)
 	if e != nil {
 		err = errors.New("HandleActivityListButton, Err: " + e.Error())
 		return
 	}
-	total = totalSearche
 	return
 }
 

+ 9 - 3
services/article.go

@@ -674,9 +674,15 @@ func GetArticleListByApi(cont context.Context) (err error) {
 	return
 }
 
-//func init() {
-//	HandleArticleListByApi(7801)
-//}
+func init122() {
+	allList, err := models.GetArticleAll()
+
+	fmt.Println(err)
+	for _, v := range allList {
+		HandleArticleListByApi(v.ArticleId)
+	}
+
+}
 
 //处理同步过来的文章
 func HandleArticleListByApi(artcleId int) (err error) {

+ 55 - 19
services/elastic.go

@@ -332,6 +332,8 @@ func EsAddOrEditData(indexName, docId string, item *ElasticTestArticleDetail) (e
 			"PublishDate":      item.PublishDate,
 			"CategoryId":       item.CategoryId,
 			"ExpertBackground": item.ExpertBackground,
+			"Abstract":         item.Abstract,
+			"Annotation":       item.Annotation,
 		}).Do(context.Background())
 		if err != nil {
 			return err
@@ -894,44 +896,66 @@ func EsArticleSearch(keyWord string, startSize, pageSize int, orderColumn string
 	client := utils.Client
 	keyWordArr, err := GetIndustryMapNameSliceV3(keyWord)
 	keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr)
+	fmt.Println(keyWordArr)
 	keyWordLen := len(keyWordArr)
 	if keyWordLen <= 0 {
 		keyWordArr = append(keyWordArr, keyWord)
 		keyWordLen = len(keyWordArr)
 	}
-	//fmt.Println(keyWordArr)
+	fmt.Println(keyWordArr)
 	mustMap := make([]interface{}, 0)
 	shouldMap := make(map[string]interface{}, 0)
 	//shouldMapquery := make(map[string]interface{}, 0)
 	shouldMapquery := make([]interface{}, 0)
 	// @Param   OrderColumn   query   int  true       "排序字段 ,Comprehensive综合 ,Matching匹配度 ,PublishDate 发布时间 "
 	//keyWordWeight := GetWeight(keyWordLen)
-	var boost int
-	lenkeyWordArr := len(keyWordArr)
-	for k, v := range keyWordArr {
-		if k == 0 {
-			boost = 2 * 1000
-		} else {
-			boost = 1000
-		}
+	//var boost int
+	//lenkeyWordArr := len(keyWordArr)
+	for _, v := range keyWordArr {
+		//if k == 0 {
+		//	boost = 2 * 1000
+		//} else {
+		//	boost = 1000
+		//}
 		if v != "" {
 			shouldMapquery = append(shouldMapquery, map[string]interface{}{
 				"function_score": map[string]interface{}{
 					"query": map[string]interface{}{
 						"multi_match": map[string]interface{}{
-							"boost":  (lenkeyWordArr - k) * boost, //给查询的值赋予权重
+							//"boost":  (lenkeyWordArr - k) * boost, //给查询的值赋予权重
 							"fields": []interface{}{"Title"},
 							"query":  v,
 						},
 					},
 				},
 			})
-
 			shouldMapquery = append(shouldMapquery, map[string]interface{}{
 				"function_score": map[string]interface{}{
 					"query": map[string]interface{}{
 						"multi_match": map[string]interface{}{
-							"boost":  (lenkeyWordArr-k)*boost - 1, //给查询的值赋予权重
+							//"boost":  (lenkeyWordArr - k) * boost, //给查询的值赋予权重
+							"fields": []interface{}{"Abstract"},
+							"query":  v,
+						},
+					},
+				},
+			})
+			shouldMapquery = append(shouldMapquery, map[string]interface{}{
+				"function_score": map[string]interface{}{
+					"query": map[string]interface{}{
+						"multi_match": map[string]interface{}{
+							//"boost":  (lenkeyWordArr - k) * boost, //给查询的值赋予权重
+							"fields": []interface{}{"Annotation"},
+							"query":  v,
+						},
+					},
+				},
+			})
+			shouldMapquery = append(shouldMapquery, map[string]interface{}{
+				"function_score": map[string]interface{}{
+					"query": map[string]interface{}{
+						"multi_match": map[string]interface{}{
+							//"boost":  (lenkeyWordArr-k)*boost - 1, //给查询的值赋予权重
 							"fields": []interface{}{"BodyText"},
 							"query":  v,
 						},
@@ -955,8 +979,10 @@ func EsArticleSearch(keyWord string, startSize, pageSize int, orderColumn string
 	highlightMap := make(map[string]interface{}, 0)
 	highlightMap = map[string]interface{}{
 		"fields": map[string]interface{}{
-			"BodyText": map[string]interface{}{},
-			"Title":    map[string]interface{}{},
+			"BodyText":   map[string]interface{}{},
+			"Title":      map[string]interface{}{},
+			"Abstract":   map[string]interface{}{},
+			"Annotation": map[string]interface{}{},
 		},
 		//样式 红色
 		"post_tags": []interface{}{"</font>"},
@@ -973,15 +999,15 @@ func EsArticleSearch(keyWord string, startSize, pageSize int, orderColumn string
 			},
 		},
 	}
-	if orderColumn == "PublishDate" {
+	if orderColumn == "Matching" {
 		queryMap["sort"] = sortMap
 	}
 	queryMap["from"] = startSize
 	queryMap["size"] = pageSize
 	queryMap["highlight"] = highlightMap
-	jsonBytes, _ := json.Marshal(queryMap)
-	fmt.Println(string(jsonBytes))
-	utils.FileLog.Info(string(jsonBytes))
+	//jsonBytes, _ := json.Marshal(queryMap)
+	//fmt.Println(string(jsonBytes))
+	//utils.FileLog.Info(string(jsonBytes))
 	request := client.Search(indexName).Source(queryMap) // sets the JSON request
 	searchByMatch, err := request.Do(context.Background())
 	if searchByMatch != nil {
@@ -999,8 +1025,18 @@ func EsArticleSearch(keyWord string, startSize, pageSize int, orderColumn string
 				}
 				searchItem := new(models.SearchItem)
 				searchItem.ArticleId, _ = strconv.Atoi(v.Id)
-				if len(v.Highlight["BodyText"]) > 0 {
+				if len(v.Highlight["BodyText"]) > 0 || len(v.Highlight["Abstract"]) > 0 || len(v.Highlight["Annotation"]) > 0 {
 					searchItem.Body = v.Highlight["BodyText"]
+					if len(v.Highlight["Abstract"]) > 0 {
+						for _, vRed := range v.Highlight["Abstract"] {
+							searchItem.Body = append(searchItem.Body, vRed)
+						}
+					}
+					if len(v.Highlight["Annotation"]) > 0 {
+						for _, vRed := range v.Highlight["Annotation"] {
+							searchItem.Body = append(searchItem.Body, vRed)
+						}
+					}
 				} else {
 					bodyRune := []rune(article.BodyText)
 					bodyRuneLen := len(bodyRune)

+ 28 - 4
services/elasticsearch.go

@@ -263,7 +263,7 @@ func SearchByKeyWordBack02(keyWord string) (result []*models.SearchItem, err err
 	return
 }
 
-func SearchByKeyWordBack(indexName,keyWord string,startSize, pageSize,userId int) (result []*models.SearchItem,total int, err error) {
+func SearchByKeyWordBack(indexName, keyWord string, startSize, pageSize, userId int) (result []*models.SearchItem, total int, err error) {
 	keyWordArr, err := GetIndustryMapNameSlice(keyWord)
 	if err != nil {
 		go utils.SendEmail(utils.APPNAME+" "+utils.RunMode+"异常提醒:", "GetIndustryMapNameSlice:"+err.Error(), utils.EmailSendToUsers)
@@ -292,18 +292,18 @@ func SearchByKeyWordBack(indexName,keyWord string,startSize, pageSize,userId int
 		highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
 		searchByMatch, err := client.Search(esIndex).Highlight(highlight).Size(pageSize).Query(boolquery).Do(context.Background())
 		if err != nil {
-			return result,0, err
+			return result, 0, err
 		}
 		if searchByMatch.Hits != nil {
 			for _, v := range searchByMatch.Hits.Hits {
 				articleJson, err := v.Source.MarshalJSON()
 				if err != nil {
-					return nil,0, err
+					return nil, 0, err
 				}
 				article := new(models.CygxArticle)
 				err = json.Unmarshal(articleJson, &article)
 				if err != nil {
-					return nil,0, err
+					return nil, 0, err
 				}
 				if _, ok := searchMap[article.ArticleId]; !ok {
 					searchItem := new(models.SearchItem)
@@ -397,6 +397,30 @@ func RemoveDuplicatesAndEmpty(a []string) (ret []string) {
 	return
 }
 
+//KeyWordArrSqlRegexp 预处理ik联想词的模糊查询语句
+func KeyWordArrSqlRegexp(a []string) (ret string) {
+	a_len := len(a)
+	for i := 0; i < a_len; i++ {
+		if i == 0 {
+			continue
+		}
+		ret += a[i] + "|"
+	}
+	ret = strings.TrimRight(ret, "|")
+	return
+}
+
+//KeyWordArrSqlRegexp 预处理ik联想词的模糊查询语句
+func KeyWordArrSqlRegexpAll(a []string) (ret string) {
+	a_len := len(a)
+	for i := 0; i < a_len; i++ {
+		ret += a[i] + "|"
+	}
+	ret = strings.TrimRight(ret, "|")
+	//ret = "'" + ret + "'"
+	return
+}
+
 func init21123() {
 	fmt.Println("start")
 	client, err := elastic.NewClient(elastic.SetURL(ES_URL), elastic.SetBasicAuth(ES_USERNAME, ES_PASSWORD), elastic.SetSniff(false))

+ 68 - 14
services/industrial_management.go

@@ -6,6 +6,7 @@ import (
 	"fmt"
 	"hongze/hongze_cygx/models"
 	"hongze/hongze_cygx/utils"
+	"strconv"
 	"strings"
 	"time"
 )
@@ -395,26 +396,77 @@ func HandleIndustryList(list []*models.IndustrialManagement, user *models.WxUser
 		}
 	}
 
-	mapHistroyArticleId := make(map[int]int)
+	//mapHistroyArticleId := make(map[int]int)
 
-	if userId > 0 {
-		listArticleHistory, e := models.GetUserToArticleHistory(userId, articleIdArr)
-		if e != nil && e.Error() != utils.ErrNoRow() {
-			err = errors.New("获取产业关联的视频失败,GetindustryVideo " + e.Error())
-			return
-		}
-		for _, v := range listArticleHistory {
-			mapHistroyArticleId[v.ArticleId] = v.ArticleId
-		}
+	//if userId > 0 {
+	//	listArticleHistory, e := models.GetUserToArticleHistory(userId, articleIdArr)
+	//	if e != nil && e.Error() != utils.ErrNoRow() {
+	//		err = errors.New("获取产业关联的视频失败,GetindustryVideo " + e.Error())
+	//		return
+	//	}
+	//	for _, v := range listArticleHistory {
+	//		mapHistroyArticleId[v.ArticleId] = v.ArticleId
+	//	}
+	//}
+	var industrialIds string
+	for _, id := range industrialIdArr {
+		industrialIds += strconv.Itoa(id) + ","
+	}
+	industrialIds = strings.TrimRight(industrialIds, ",")
+	articleList, err := models.GetReportIndustrialReadNumList(userId, industrialIds, user.CreatedTime)
+	mapHistroyindustrialId := make(map[int]int)
+	for _, v := range articleList {
+		mapHistroyindustrialId[v.IndustrialManagementId] = v.Readnum
 	}
 	nowTime := time.Now().Local()
 	threeMonBefore := nowTime.AddDate(0, -3, 0)
+
+	//查询用户今天是否看过时间线
+	//haveMorningMeeting := false
+	//var morningMeetingTime string
+	recrodList, err := models.GetTimeLineRecordAllCount(user.UserId, time.Now().Format(utils.FormatDate))
+	if err != nil {
+		return
+	}
+	var industrialManagementIdstr string
+	industrialIdMap := make(map[string]time.Time)
+	for _, v := range recrodList {
+		industrialManagementIdstr = strings.TrimLeft(v.Parameter, "PageSize=10&CurrentIndex=1&CategoryId=99999&IndustrialManagementId=")
+		if createTime, ok := industrialIdMap[industrialManagementIdstr]; ok{
+			if createTime.Before(v.CreateTime) {
+				industrialIdMap[industrialManagementIdstr] = v.CreateTime
+			}
+		}else {
+			industrialIdMap[industrialManagementIdstr] = v.CreateTime
+		}
+	}
+
+	mmList, err := models.GetCygxMorningMeetingReviewsListByIndustrialIds(industrialIds)
+	if err != nil {
+		return
+	}
+	morningMeetingTimeMap := make(map[int]time.Time)
+	for _, v := range mmList {
+		morningMeetingTimeMap[v.IndustryId] = v.CreateTime
+	}
+	timeLineRedMap := make(map[int]bool, 0)
+
+	for _, industrialId := range industrialIdArr {
+		if createTime, ok := industrialIdMap[strconv.Itoa(industrialId)]; ok{
+			if createTime.Before(morningMeetingTimeMap[industrialId]) {
+				timeLineRedMap[industrialId] = true
+			}
+		}
+	}
+
 	for k, v := range list {
 		list[k].UpdateTime = utils.TimeRemoveHms(mapUPdateTime[v.IndustrialManagementId])
 		if userId > 0 {
 			//如果文章没有阅读,而且,文章的发布时间晚于项目的上线时间,而且文章的发布时间晚于用户的注册时间,就进行标红处理
-			if mapHistroyArticleId[v.ArticleId] == 0 && user.CreatedTime.Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
-				list[k].IsRed = true
+			if mapHistroyindustrialId[v.IndustrialManagementId] == 0 || timeLineRedMap[v.IndustrialManagementId] {
+				if user.CreatedTime.Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
+					list[k].IsRed = true
+				}
 			}
 		} else {
 			if utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
@@ -426,8 +478,10 @@ func HandleIndustryList(list []*models.IndustrialManagement, user *models.WxUser
 		list[k].UpdateTime = utils.TimeRemoveHms(mapUPdateTime[v.IndustrialManagementId])
 		if userId > 0 {
 			//如果文章没有阅读,而且,文章的发布时间晚于项目的上线时间,而且文章的发布时间晚于用户的注册时间,就进行标红处理
-			if mapHistroyArticleId[v.ArticleId] == 0 && user.CreatedTime.Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
-				list[k].IsRed = true
+			if mapHistroyindustrialId[v.IndustrialManagementId] == 0 || timeLineRedMap[v.IndustrialManagementId] {
+				if user.CreatedTime.Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) && utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {
+					list[k].IsRed = true
+				}
 			}
 		} else {
 			if utils.StrTimeToTime(utils.OnlineTime).Before(utils.StrTimeToTime(mapUPdateTime[v.IndustrialManagementId])) {

+ 11 - 11
services/keyword.go

@@ -10,11 +10,11 @@ import (
 
 //AddSearchKeyWord 记录用户搜索关键词
 func AddSearchKeyWord(user *models.WxUserItem, keyWord string, source int) (err error) {
-	cacheKey := fmt.Sprint("Search_uid:", user.UserId, "_KeyWord:", keyWord, "_Source:", source)
-	isExist := utils.Rc.IsExist(cacheKey)
-	if isExist {
-		return err
-	}
+	//cacheKey := fmt.Sprint("Search_uid:", user.UserId, "_KeyWord:", keyWord, "_Source:", source)
+	//isExist := utils.Rc.IsExist(cacheKey)
+	//if isExist {
+	//	return err
+	//}
 	defer func() {
 		if err != nil {
 			go utils.SendAlarmMsg(" 记录用户搜索关键词失败"+err.Error(), 2)
@@ -31,12 +31,12 @@ func AddSearchKeyWord(user *models.WxUserItem, keyWord string, source int) (err
 	keyWordItem.CompanyName = user.CompanyName
 	keyWordItem.RealName = user.RealName
 	_, err = models.AddSearchKeyWord(keyWordItem)
-	go AddUserSearchLog(user, keyWord, source)
-	//一分钟之内的相同搜索词不重复记录
-	setNX := utils.Rc.SetNX(cacheKey, keyWord, time.Minute*1)
-	if !setNX {
-		go utils.SendAlarmMsg("记录用户搜索关键词失败,设置Redis Key 过期时间失败:key"+cacheKey, 3)
-	}
+	//go AddUserSearchLog(user, keyWord, source)
+	////一分钟之内的相同搜索词不重复记录
+	//setNX := utils.Rc.SetNX(cacheKey, keyWord, time.Minute*1)
+	//if !setNX {
+	//	go utils.SendAlarmMsg("记录用户搜索关键词失败,设置Redis Key 过期时间失败:key"+cacheKey, 3)
+	//}
 	return
 }
 

+ 301 - 73
services/micro_roadshow.go

@@ -178,94 +178,322 @@ func GetMicroRoadShowPageListV8(pageSize, currentIndex, audioId, videoId, activi
 	var audioCond string
 	var audioPars []interface{}
 	// 如果筛选条件为指定视频ID或只看视频则不做音频查询
-	fmt.Println("filter:", filter)
-	if videoId > 0 || activityVideoId > 0 || filter == 1 {
-		fmt.Println("11111")
-		audioCond = ""
-	} else {
-		// 活动已发布且已结束
-		audioCond += ` AND b.publish_status = 1 AND b.active_state = 3`
-		//活动音频,设置有效时间为30天,失效后该活动就不再支持音频回放。有效期起始时间为活动的开始时间
-		//endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
-		//audioCond += ` AND b.activity_time > ? `
-		//audioPars = append(audioPars, endTime)
-		if keywords != "" {
-			audioCond += ` AND a.voice_name LIKE ? OR b.label LIKE ?`
-			audioPars = append(audioPars, keywords, keywords)
-		}
-		if audioId > 0 {
-			audioCond += ` AND a.activity_voice_id = ?`
-			audioPars = append(audioPars, audioId)
-		}
-		if audioIds != "" {
-			sliceId := strings.Split(audioIds, ",")
-			var idSqlStr string
-			for _, v := range sliceId {
-				idSqlStr += "'" + v + "',"
-			}
-			idSqlStr = strings.TrimRight(idSqlStr, ",")
-			audioCond += ` AND a.activity_voice_id IN (` + idSqlStr + `)`
+	//if videoId > 0 || activityVideoId > 0 || filter == 1 {
+	//	audioCond = ""
+	//} else {
+	// 活动已发布且已结束
+	audioCond += ` AND b.publish_status = 1 AND b.active_state = 3`
+	//活动音频,设置有效时间为30天,失效后该活动就不再支持音频回放。有效期起始时间为活动的开始时间
+	//endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
+	//audioCond += ` AND b.activity_time > ? `
+	//audioPars = append(audioPars, endTime)
+	if keywords != "" {
+		audioCond += ` AND ( a.voice_name LIKE ? OR b.label LIKE ? )`
+		audioPars = append(audioPars, keywords, keywords)
+	}
+	if audioId > 0 {
+		audioCond += ` AND a.activity_voice_id = ?`
+		audioPars = append(audioPars, audioId)
+	}
+	if audioIds != "" {
+		sliceId := strings.Split(audioIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
 		}
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		audioCond += ` AND a.activity_voice_id IN (` + idSqlStr + `)`
 	}
+	//}
 	//视频的处理
 	var videoCond string
 	var videoCondAct string
 	var videoPars []interface{}
 	var videoParsAct []interface{}
-	if audioId > 0 || filter == 2 {
-		fmt.Println("22222")
-		videoCond = ""
-	} else {
-		if keywords != "" {
-			videoCond += ` AND video_name LIKE ?`
-			videoPars = append(videoPars, keywords)
-			videoCondAct += ` AND video_name LIKE ?`
-			videoParsAct = append(videoParsAct, keywords)
+	//if audioId > 0 || filter == 2 {
+	//	videoCond = ""
+	//} else {
+	if keywords != "" {
+		videoCond += ` AND video_name LIKE ?`
+		videoPars = append(videoPars, keywords)
+		videoCondAct += ` AND (video_name LIKE ?  OR art.label LIKE ?)`
+		videoParsAct = append(videoParsAct, keywords, keywords)
+	}
+	if videoId > 0 {
+		videoCond += ` AND video_id = ?`
+		videoPars = append(videoPars, videoId)
+	}
+	if activityVideoId > 0 {
+		videoCondAct += ` AND video_id = ?`
+		videoParsAct = append(videoParsAct, activityVideoId)
+	}
+	if activityVideoIds != "" {
+		sliceId := strings.Split(activityVideoIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
 		}
-		if videoId > 0 {
-			videoCond += ` AND video_id = ?`
-			videoPars = append(videoPars, videoId)
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		videoCondAct += ` AND v.video_id IN (` + idSqlStr + `)`
+	}
+
+	//如果传了路演的或者活动的视频ID只查询一个
+	if videoId > 0 {
+		videoCondAct += ` AND video_id = 0 `
+		audioCond += ` AND a.activity_voice_id = 0 `
+	}
+	if activityVideoId > 0 {
+		videoCond += ` AND video_id = 0 `
+		audioCond += ` AND a.activity_voice_id = 0 `
+	}
+	if audioId > 0 {
+		videoCondAct += ` AND video_id = 0 `
+		videoCond += ` AND video_id = 0 `
+	}
+	if filter == 1 {
+		audioCond += ` AND a.activity_voice_id = 0 `
+	} else if filter == 2 {
+		videoCondAct += ` AND video_id = 0 `
+		videoCond += ` AND video_id = 0 `
+	}
+	if videoIds != "" {
+		sliceId := strings.Split(videoIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
 		}
-		if activityVideoId > 0 {
-			videoCondAct += ` AND video_id = ?`
-			videoParsAct = append(videoParsAct, activityVideoId)
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		videoCond += ` AND video_id IN (` + idSqlStr + `)`
+	}
+	videoCond += ` AND publish_status = 1`
+	//}
+	total, videoList, e = models.GetMicroRoadShowVideoPageListV8(startSize, pageSize, videoCond, videoPars, videoCondAct, videoParsAct, audioCond, audioPars, audioId, videoId, activityVideoId, filter)
+	if e != nil {
+		err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
+		return
+	}
+	respList = videoList
+	return
+}
+
+// GetMicroRoadShowPageListIkWord  添加IK分词联想词 获取微路演列表添加活动视频 更新与8.1版本
+func CountMicroRoadShowPageListIkWord(audioId, videoId, activityVideoId, filter int, keywordArr []string, audioIds, videoIds, activityVideoIds string) (total int, err error) {
+	var e error
+	var keywords string
+	if len(keywordArr) > 0 {
+		keywords = KeyWordArrSqlRegexpAll(keywordArr)
+	}
+	//if keywords == "" {
+	//	return
+	//}
+	//音频的查询
+	var audioCond string
+	var audioPars []interface{}
+	// 如果筛选条件为指定视频ID或只看视频则不做音频查询
+	//if videoId > 0 || activityVideoId > 0 || filter == 1 {
+	//	audioCond += ` AND a.activity_voice_id  = 0 `
+	//} else {
+	// 活动已发布且已结束
+	audioCond += ` AND b.publish_status = 1 AND b.active_state = 3`
+	if keywords != "" {
+		audioCond += ` AND (a.voice_name REGEXP ? OR b.label REGEXP ? ) `
+		audioPars = append(audioPars, keywords, keywords)
+	}
+	if audioId > 0 {
+		audioCond += ` AND a.activity_voice_id = ?`
+		audioPars = append(audioPars, audioId)
+	}
+	if audioIds != "" {
+		sliceId := strings.Split(audioIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
 		}
-		if activityVideoIds != "" {
-			sliceId := strings.Split(activityVideoIds, ",")
-			var idSqlStr string
-			for _, v := range sliceId {
-				idSqlStr += "'" + v + "',"
-			}
-			idSqlStr = strings.TrimRight(idSqlStr, ",")
-			videoCondAct += ` AND v.video_id IN (` + idSqlStr + `)`
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		audioCond += ` AND a.activity_voice_id IN (` + idSqlStr + `)`
+	}
+	//}
+	//视频的处理
+	var videoCond string
+	var videoCondAct string
+	var videoPars []interface{}
+	var videoParsAct []interface{}
+	//if audioId > 0 || filter == 2 {
+	//	videoCond = ""
+	//} else {
+	if keywords != "" {
+		videoCond += ` AND video_name REGEXP ? `
+		videoPars = append(videoPars, keywords)
+		videoCondAct += ` AND (video_name REGEXP ?  OR art.label REGEXP ? )`
+		videoParsAct = append(videoParsAct, keywords, keywords)
+	}
+	if videoId > 0 {
+		videoCond += ` AND video_id = ? `
+		videoPars = append(videoPars, videoId)
+	}
+	if activityVideoId > 0 {
+		videoCondAct += ` AND video_id = ?`
+		videoParsAct = append(videoParsAct, activityVideoId)
+	}
+	if activityVideoIds != "" {
+		sliceId := strings.Split(activityVideoIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
 		}
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		videoCondAct += ` AND v.video_id IN (` + idSqlStr + `)`
+	}
+
+	//如果传了路演的或者活动的视频ID只查询一个
+	if videoId > 0 {
+		videoCondAct += ` AND video_id = 0 `
+		audioCond += ` AND a.activity_voice_id = 0 `
+	}
+	if activityVideoId > 0 {
+		videoCond += ` AND video_id = 0 `
+		audioCond += ` AND a.activity_voice_id = 0 `
+	}
+	if audioId > 0 {
+		videoCondAct += ` AND video_id = 0 `
+		videoCond += ` AND video_id = 0 `
+	}
+	if filter == 1 {
+		audioCond += ` AND a.activity_voice_id = 0 `
+	} else if filter == 2 {
+		videoCondAct += ` AND video_id = 0 `
+		videoCond += ` AND video_id = 0 `
+	}
 
-		//如果传了路演的或者活动的视频ID只查询一个
-		if videoId > 0 {
-			videoCondAct += ` AND video_id = 0 `
+	if videoIds != "" {
+		sliceId := strings.Split(videoIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
 		}
-		if activityVideoId > 0 {
-			videoCond += ` AND video_id = 0 `
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		videoCond += ` AND video_id IN (` + idSqlStr + `)`
+	}
+	videoCond += ` AND publish_status = 1`
+	//}
+	total, e = models.CountMicroRoadShowVideoPageList(videoCond, videoPars, videoCondAct, videoParsAct, audioCond, audioPars)
+	if e != nil {
+		err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
+		return
+	}
+	return
+}
+
+// GetMicroRoadShowPageListIkWord  添加IK分词联想词 获取微路演列表添加活动视频 更新与8.1版本
+func GetMicroRoadShowPageListIkWord(startSize, pageSize, audioId, videoId, activityVideoId, filter int, keywordArr []string, audioIds, videoIds, activityVideoIds, keywords string) (respList []*models.MicroRoadShowPageList, err error) {
+
+	videoList := make([]*models.MicroRoadShowPageList, 0)
+	var e error
+	var keywordsIk string
+	if len(keywordArr) > 1 {
+		keywordsIk = KeyWordArrSqlRegexp(keywordArr)
+	}
+	if keywords != "" {
+		keywords = "%" + keywords + "%"
+	}
+	//音频的查询
+	var audioCond string
+	var audioPars []interface{}
+	// 如果筛选条件为指定视频ID或只看视频则不做音频查询
+	//if videoId > 0 || activityVideoId > 0 || filter == 1 {
+	//	audioCond += ` AND a.activity_voice_id  = 0 `
+	//} else {
+	// 活动已发布且已结束
+	audioCond += ` AND b.publish_status = 1 AND b.active_state = 3`
+	if keywordsIk != "" {
+		audioCond += ` AND ( a.voice_name REGEXP ? OR b.label REGEXP ? )`
+		audioCond += ` AND ( a.voice_name NOT LIKE ? AND  b.label NOT LIKE ? )`
+		audioPars = append(audioPars, keywordsIk, keywordsIk, keywords, keywords)
+	}
+	if audioId > 0 {
+		audioCond += ` AND a.activity_voice_id = ?`
+		audioPars = append(audioPars, audioId)
+	}
+	if audioIds != "" {
+		sliceId := strings.Split(audioIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
 		}
-		//if videoId == 0 {
-		//	endTime := time.Now().AddDate(0, 0, -30).Format("2006-01-02 15:04:05")
-		//	videoCondAct += ` AND art.activity_time > ? `
-		//	videoParsAct = append(videoParsAct, endTime)
-		//}
-		if videoIds != "" {
-			sliceId := strings.Split(videoIds, ",")
-			var idSqlStr string
-			for _, v := range sliceId {
-				idSqlStr += "'" + v + "',"
-			}
-			idSqlStr = strings.TrimRight(idSqlStr, ",")
-			videoCond += ` AND video_id IN (` + idSqlStr + `)`
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		audioCond += ` AND a.activity_voice_id IN (` + idSqlStr + `)`
+	}
+	//}
+	//视频的处理
+	var videoCond string
+	var videoCondAct string
+	var videoPars []interface{}
+	var videoParsAct []interface{}
+	//if audioId > 0 || filter == 2 {
+	//	videoCond = ""
+	//} else {
+	if keywordsIk != "" {
+		videoCond += ` AND video_name REGEXP ?`
+		videoPars = append(videoPars, keywordsIk)
+
+		videoCondAct += ` AND ( v.video_name REGEXP ? OR art.label REGEXP ? )`
+		videoCondAct += ` AND ( v.video_name NOT LIKE ? AND art.label NOT LIKE ? )`
+
+		//videoCondAct += ` AND video_name REGEXP ?`
+		videoParsAct = append(videoParsAct, keywordsIk, keywordsIk, keywords, keywords)
+	}
+	if videoId > 0 {
+		videoCond += ` AND video_id = ?`
+		videoPars = append(videoPars, videoId)
+	}
+	if activityVideoId > 0 {
+		videoCondAct += ` AND video_id = ?`
+		videoParsAct = append(videoParsAct, activityVideoId)
+	}
+	if activityVideoIds != "" {
+		sliceId := strings.Split(activityVideoIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
+		}
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		videoCondAct += ` AND v.video_id IN (` + idSqlStr + `)`
+	}
+
+	//如果传了路演的或者活动的视频ID只查询一个
+	if videoId > 0 {
+		videoCondAct += ` AND video_id = 0 `
+		audioCond += ` AND a.activity_voice_id = 0 `
+	}
+	if activityVideoId > 0 {
+		videoCond += ` AND video_id = 0 `
+		audioCond += ` AND a.activity_voice_id = 0 `
+	}
+	if audioId > 0 {
+		videoCondAct += ` AND video_id = 0 `
+		videoCond += ` AND video_id = 0 `
+	}
+	if filter == 1 {
+		audioCond += ` AND a.activity_voice_id = 0 `
+	} else if filter == 2 {
+		videoCondAct += ` AND video_id = 0 `
+		videoCond += ` AND video_id = 0 `
+	}
+
+	if videoIds != "" {
+		sliceId := strings.Split(videoIds, ",")
+		var idSqlStr string
+		for _, v := range sliceId {
+			idSqlStr += "'" + v + "',"
 		}
-		videoCond += ` AND publish_status = 1`
+		idSqlStr = strings.TrimRight(idSqlStr, ",")
+		videoCond += ` AND video_id IN (` + idSqlStr + `)`
 	}
-	total, videoList, e = models.GetMicroRoadShowVideoPageListV8(startSize, pageSize, videoCond, videoPars, videoCondAct, videoParsAct, audioCond, audioPars, audioId, videoId, activityVideoId, filter)
+	videoCond += ` AND publish_status = 1`
+	//}
+	videoList, e = models.GetMicroRoadShowVideoPageListIkWord(startSize, pageSize, videoCond, videoPars, videoCondAct, videoParsAct, audioCond, audioPars, audioId, videoId, activityVideoId, filter)
 	if e != nil {
-		err = errors.New("获取微路演音视频列表失败, Err: " + e.Error())
+		err = errors.New("获取微路演音视频列表失败分词, Err: " + e.Error())
 		return
 	}
 	respList = videoList
@@ -334,7 +562,7 @@ func GetMicroRoadShowMycollect(pageSize, currentIndex int, audioIds, videoIds, a
 	return
 }
 
-//GetMicroRoadshowVideoMap 获取已经发布的微路演的产业ID
+// GetMicroRoadshowVideoMap 获取已经发布的微路演的产业ID
 func GetMicroRoadshowVideoMap() (items map[int]int, err error) {
 	list, e := models.GetMicroRoadshowVideoList()
 	if e != nil && e.Error() != utils.ErrNoRow() {
@@ -413,7 +641,7 @@ func GetindustryVideo(user *models.WxUserItem, industrialManagementId int) (indu
 	return
 }
 
-//用户微路演视频回放操作操作行为,模板消息推送
+// 用户微路演视频回放操作操作行为,模板消息推送
 func MicroRoadshowVideoUserRmind(user *models.WxUserItem, videoId int) (err error) {
 	defer func() {
 		if err != nil {

+ 2 - 0
services/tactics.go

@@ -754,6 +754,8 @@ func GetSummarytoEs(articleId int) (err error) {
 	item.BodyText = bodyText
 	item.CategoryId = strconv.Itoa(v.CategoryId)
 	item.ExpertBackground = v.ExpertBackground
+	item.Annotation, _ = GetReportContentTextSubNew(v.Annotation)
+	item.Abstract, _ = GetReportContentTextSubNew(v.Abstract)
 	EsAddOrEditData(indexName, strconv.Itoa(v.ArticleId), item)
 	fmt.Println(v.ArticleId)
 	//}

+ 14 - 1
services/task.go

@@ -107,7 +107,6 @@ func Task() {
 		getArticleListByApi := task.NewTask("getArticleListByApi", "0 */60 * * * *", GetArticleListByApi) //通过三方接口获取策略平台上的文章
 		task.AddTask("getArticleListByApi", getArticleListByApi)
 	}
-
 	//GetCygxActivityAttendanceDetail()
 	//CreateIndexNameArticleHistory()
 	//AddAllArticleHistory()
@@ -161,6 +160,16 @@ func CreateIndex() {
        "term_vector": "with_positions_offsets",
 		"analyzer": "ik_smart"
      },
+     "Abstract": {
+       "type": "text",
+       "term_vector": "with_positions_offsets",
+		"analyzer": "ik_smart"
+     },
+     "Annotation": {
+       "type": "text",
+       "term_vector": "with_positions_offsets",
+		"analyzer": "ik_smart"
+     },
      "TitleEn": {
        "type": "text",
        "term_vector": "with_positions_offsets"
@@ -203,6 +212,8 @@ func AddAllArticle() {
 		item.PublishDate = v.PublishDate
 		item.BodyText = bodyText
 		item.ExpertBackground = v.ExpertBackground
+		item.Annotation, _ = GetReportContentTextSubNew(v.Annotation)
+		item.Abstract, _ = GetReportContentTextSubNew(v.Abstract)
 		item.CategoryId = strconv.Itoa(v.CategoryId)
 		EsAddOrEditData(indexName, strconv.Itoa(v.ArticleId), item)
 		fmt.Println(v.ArticleId)
@@ -272,6 +283,8 @@ type ElasticTestArticleDetail struct {
 	PublishDate      string `description:"发布时间"`
 	ExpertBackground string `description:"专家背景"`
 	CategoryId       string `description:"文章分类"`
+	Abstract         string `description:"摘要"`
+	Annotation       string `description:"核心观点"`
 }
 
 type ElasticTestArticleDetailV4 struct {

+ 4 - 4
utils/config.go

@@ -18,7 +18,7 @@ var (
 	Re          error        //redis错误
 )
 
-//微信配置信息
+// 微信配置信息
 var (
 	WxId        string //微信原始ID
 	WxAppId     string //查研观向小程序
@@ -45,7 +45,7 @@ var (
 	WxMsgTemplateIdArticleUserRemindXzs string //用户阅读报告通知-模板ID(小助手)
 )
 
-//微信公众号配置信息
+// 微信公众号配置信息
 var (
 	WxPublicId        string //微信原始ID
 	WxPublicAppId     string
@@ -83,7 +83,7 @@ var (
 	ShangHaiCrmApiLink        string //上海CRM用户同步api调用地址
 )
 
-//模板消息推送
+// 模板消息推送
 var (
 	SendWxTemplateMsgUrl string
 )
@@ -159,7 +159,7 @@ func init() {
 		WxPublicAppId = "wx4a844c734d8c8e56"
 		WxPublicAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
 		WxPublicId = "gh_b67e0049fb8c"
-		IndexName = "cygx_article_v1213"
+		IndexName = "cygx_article_v02_01"
 		IndexNameArticleHistory = "cygx_article_history_v07_08"
 
 		//接收附件邮箱

+ 11 - 9
utils/constants.go

@@ -4,7 +4,7 @@ const (
 	Md5Key = "Ks@h64WJ#tcVgG8$&WlNfqvLAtMgpxWN"
 )
 
-//常量定义
+// 常量定义
 const (
 	FormatTime             = "15:04:05"                //时间格式
 	FormatDate             = "2006-01-02"              //日期格式
@@ -28,7 +28,7 @@ const (
 	ApiUrl            = "https://vmp.hzinsights.com/v2api/"
 )
 
-//手机号,电子邮箱正则
+// 手机号,电子邮箱正则
 const (
 	RegularMobile             = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0-9])|(17[0-9])|(16[0-9])|(19[0-9]))\\d{8}$" //手机号码
 	RegularFixedTelephone     = "^(\\(\\d{3,4}\\)|\\d{3,4}-|\\s)?\\d{7,14}$"                                              //手机号码
@@ -36,7 +36,7 @@ const (
 	RegularEmail              = `\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`                                             //匹配电子邮箱
 )
 
-//聚合短信
+// 聚合短信
 var (
 	JhGnTplId = "250078" //聚合国内模板编码
 	JhGjTplId = "10054"  //聚合国内模板编码
@@ -45,7 +45,7 @@ var (
 	JhGjAppKey = "3326ad2c1047a4cd92ace153e6044ca3"
 )
 
-//OSS
+// OSS
 var (
 	Endpoint   string = "oss-cn-shanghai.aliyuncs.com"
 	Bucketname string = "hongze"
@@ -59,13 +59,13 @@ var (
 	AccessKeySecret string = "12kk1ptCHoGWedhBnKRVW5hRJzq9Fq"
 )
 
-//缓存key
+// 缓存key
 const (
 	CACHE_KEY_USER_VIEW           = "user_view_record"           //用户阅读数据
 	CACHE_KEY_ARTICLE_ID_TEMPLATE = "ce_lue_article_id_template" //策略平台同步过来的文章ID,做微信模板消息推送,同一篇报告12小时只推送一次
 )
 
-//模板消息推送类型
+// 模板消息推送类型
 const (
 	TEMPLATE_MSG_CYGX_ACTIVITY_ADD = 12 //查研观向小程序活动更新推送 12
 	TEMPLATE_MSG_CYGX_ARTICLE_ADD  = 13 //查研观向报告更新推送  13
@@ -98,6 +98,8 @@ const (
 	HZ_COMPANY_ID                    int    = 16                                                                                                                                                                                                 // 弘则公司的ID
 	HONG_GUAN_NAME                   string = "宏观"
 	HONG_GUAN_ID                     int    = 1
+	YAN_XUAN_ARTICLE_TYPE_IDS        string = "1,2,12" // 属于研选的报告类型ID
+	NO_YAN_XUAN_ARTICLE_TYPE_IDS     string = "13"     // 不属于研选的报告类型ID
 )
 
 const (
@@ -139,12 +141,12 @@ const (
 	COMPANY_PRODUCT_RAI_NAME  = "权益"
 )
 
-//微信模板消息推送公共接口的秘钥
+// 微信模板消息推送公共接口的秘钥
 const (
 	SendTemplateMsgAuthorization = "dc855fce962a639faa779cbdd4cd332f"
 )
 
-//模板消息地址路由
+// 模板消息地址路由
 const (
 	WX_MSG_PATH_ARTICLE_DETAIL           = "pageMy/reportDetail/reportDetail?id="            //文章详情模板消息地址
 	WX_MSG_PATH_ACTIVITY_SPECIAL_DETAIL  = "activityPages/specialDetail/specialDetail?id="   //专项调研活动模板消息地址
@@ -152,7 +154,7 @@ const (
 	WX_MSG_PATH_ACTIVITY_DETAIL          = "activityPages/activityDetail/activityDetail?id=" //活动模板消息地址
 )
 
-//模板消息地址路由
+// 模板消息地址路由
 const (
 	ACtIVITY_SPECIAL_EXPLAIN      = "此类调研具体行程尚未确定,待预报名人数满10人后弘则会确定行程并推送给您活动日期,只有在确定行程中再次报名才完成占位。"                        //专项调研说明
 	ACtIVITY_SPECIAL_TRIP_EXPLAIN = "此类调研时间安排已经确定,点击报名后按人次扣除对应机构的服务点数。由于每场活动人数有限,如果不能参加请提前48小时取消,未及时取消导致影响其他客户报名将会维持扣点。" //专项调研说明