package services

import (
	"context"
	"encoding/json"
	"fmt"
	"github.com/PuerkitoBio/goquery"
	"github.com/olivere/elastic/v7"
	"strconv"

	//"go/doc"
	"hongze/hongze_cygx/models"
	"hongze/hongze_cygx/utils"
	"html"
	//"strconv"
	"errors"
	"strings"
	"time"
)

type SearchComprehensiveItem struct {
	SourceId     int    `description:"资源ID"`
	IsSummary    int    `description:"是否是纪要"`
	Source       string `description:"资源类型 报告 ：article 、图表 ：newchart、微路演 ：roadshow、活动 ：activity、活动视频：activityvideo、活动音频：activityvoice、专项调研活动：activityspecial 、 本周研究汇总： researchsummary 、 上周纪要汇总 ：minutessummary 、晨会精华 ：meetingreviewchapt  、 产品内测：productinterior"`
	Title        string `description:"标题"`
	BodyText     string `description:"内容"`
	PublishDate  string `description:"发布时间"`
	Abstract     string `description:"摘要"`
	Annotation   string `description:"核心观点"`
	IndustryName string `description:"产业名称"`
	SubjectNames string `description:"标的名称"`
	Body         []string
}

type ElasticComprehensiveDetail struct {
	SourceId     int    `description:"资源ID"`
	IsSummary    int    `description:"是否是纪要"`
	Source       string `description:"资源类型 报告 ：article 、图表 ：newchart、微路演 ：roadshow、活动 ：activity、活动视频：activityvideo、活动音频：activityvoice、专项调研活动：activityspecial 、 本周研究汇总： researchsummary 、 上周纪要汇总 ：minutessummary 、晨会精华 ：meetingreviewchapt  、 产品内测：productinterior 、 产业资源包：industrialsource"`
	Title        string `description:"标题"`
	BodyText     string `description:"内容"`
	PublishDate  string `description:"发布时间"`
	Abstract     string `description:"摘要"`
	Annotation   string `description:"核心观点"`
	IndustryName string `description:"产业名称"`
	SubjectNames string `description:"标的名称"`
}

//func init() {
//	AddComprehensiveIndustrialSource("Hz", 0)
//	//AddComprehensiveChart(0)
//	// AddComprehensiveMeetingreviewchapt()
//}

// 添加文章：报告、纪要
func AddComprehensiveArticle(articleId int) {
	var err error
	defer func() {
		if err != nil {
			fmt.Println(err)
			go utils.SendAlarmMsg("删除数据综合页面数据Es失败"+err.Error(), 2)
		}
	}()

	IndustrialManagementRespMap, _ := GetIndustrialManagementRespMap()
	IndustrialSubjectMap, _ := GetCygxIndustrialSubjectMap()
	var condition1 string
	var pars1 []interface{}
	mapActivityIndustrialManagement := make(map[int][]string)
	industrialgroupList, e := models.GetIndustrialArticleGroupManagementList(condition1, pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	for _, v := range industrialgroupList {
		if v.ArticleId == 0 {
			continue
		}
		mapActivityIndustrialManagement[v.ArticleId] = append(mapActivityIndustrialManagement[v.ArticleId], IndustrialManagementRespMap[v.IndustrialManagementId])
	}

	mapActivitySubject := make(map[int][]string)
	SubjectgroupList, e := models.GetSubjectArticleGroupManagementList(condition1, pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	for _, v := range SubjectgroupList {
		if v.ArticleId == 0 {
			continue
		}
		mapActivitySubject[v.ArticleId] = append(mapActivitySubject[v.ArticleId], IndustrialSubjectMap[v.IndustrialSubjectId])
	}

	var condition string
	var pars []interface{}
	condition += ` AND publish_status  = 1  `
	if articleId > 0 {
		condition = ` AND article_id = ? `
		pars = append(pars, articleId)
	}
	articleList, e := models.GetArticleList(condition, pars)

	if e != nil {
		err = errors.New("GetArticleList, Err: " + e.Error())
		return
	}
	//indexName := utils.IndexNameComprehensive
	for _, v := range articleList {
		time.Sleep(200 * time.Millisecond)
		content := html.UnescapeString(v.Body)
		doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
		if err != nil {
			fmt.Println("create doc err:", err.Error())
			return
		}
		bodyText := doc.Text()
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.ArticleId
		item.IsSummary = v.IsSummary
		item.Source = "article"
		item.Title = v.Title
		item.PublishDate = v.PublishDate
		item.BodyText = bodyText
		if v.IsSummary == 0 {
			item.SubjectNames = strings.Join(mapActivitySubject[v.ArticleId], ",") + "," + v.FieldName
			item.IndustryName = strings.Join(mapActivityIndustrialManagement[v.ArticleId], ",")
		}
		item.Annotation, _ = GetReportContentTextSubNew(v.Annotation)
		item.Abstract, _ = GetReportContentTextSubNew(v.Abstract)
		EsAddOrEditComprehensiveData(item)
		fmt.Println(item.IndustryName)
		fmt.Println(item.SubjectNames)
	}
}

// 添加图表
func AddComprehensiveChart(chartId int) {
	var err error
	defer func() {
		if err != nil {
			fmt.Println(err)
			go utils.SendAlarmMsg("AddComprehensiveChart Err"+err.Error()+fmt.Sprint(chartId), 2)
		}
	}()
	var condition string
	var pars []interface{}
	condition += ` AND publish_status  = 1 `
	if chartId > 0 {
		condition = ` AND chart_id = ? `
		pars = append(pars, chartId)
	}
	list, e := models.GetChartList(condition, pars, 0, 1000000)
	if e != nil {
		err = errors.New("GetChartList, Err: " + e.Error())
		return
	}
	//indexName := utils.IndexNameComprehensive
	for _, v := range list {
		time.Sleep(200 * time.Millisecond)
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.ChartId
		item.Source = "newchart"
		item.Title = v.Title
		item.PublishDate = v.CreateDate
		EsAddOrEditComprehensiveData(item)
		fmt.Println(v.ChartId)
	}
}

//func init() {
//	AddComprehensiveIndustrialSource("Hz", 9433)
//}

// 添加产业资源包
func AddComprehensiveIndustrialSource(sourceType string, articleId int) {
	var err error
	defer func() {
		if err != nil {
			fmt.Println(err)
			go utils.SendAlarmMsg("AddComprehensiveIndustrialSource"+err.Error(), 2)
		}
	}()
	var condition string
	var pars []interface{}
	mapActivitySubject := make(map[int][]string, 0)
	maplistMeetingTime := make(map[int]time.Time, 0)

	listMeeting, err := models.GetCygxMorningMeetingReviewChapterList(" GROUP BY c.industry_id  ORDER BY r.publish_time DESC ", pars)
	for _, v := range listMeeting {
		resultTime := utils.StrTimeToTime(v.PublishTime)
		maplistMeetingTime[v.IndustryId] = resultTime
	}
	listsubject, e := models.GetCygxIndustrialSubjectListCondition(condition, pars)
	if e != nil {
		err = errors.New("GetIndustrialManagementRepList, Err: " + e.Error())
		return
	}
	for _, v := range listsubject {
		mapActivitySubject[v.IndustrialManagementId] = append(mapActivitySubject[v.IndustrialManagementId], v.SubjectName)
	}
	var industrialsource string
	if sourceType == "Hz" {
		condition = " AND a.article_type_id  = 0  " // 弘则资源包
		industrialsource = "industrialsourceHz"
	} else {
		condition = " AND a.article_type_id  > 0  " //研选资源包
		industrialsource = "industrialsourceYx"
	}
	if articleId > 0 {
		condition += "  AND a.article_id = " + strconv.Itoa(articleId)
	}
	list, err := models.GetSearchResourceList(0, condition, 0, 0)
	if err != nil {
		fmt.Println(err)
		return
	}
	//indexName := utils.IndexNameComprehensive
	for _, v := range list {
		//time.Sleep(200 * time.Millisecond)
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.IndustrialManagementId
		item.Source = industrialsource
		item.IndustryName = v.IndustryName
		item.SubjectNames = strings.Join(mapActivitySubject[v.IndustrialManagementId], ",")
		item.PublishDate = v.PublishDate + " 00:00:00"
		if sourceType == "Hz" {
			//如果时间晚就进行替换
			resultTime := utils.StrTimeToTime(item.PublishDate)
			if maplistMeetingTime[v.IndustrialManagementId].After(resultTime) {
				item.PublishDate = maplistMeetingTime[v.IndustrialManagementId].Format(utils.FormatDateTime)
			}
		}
		fmt.Println(item)
		EsAddOrEditComprehensiveData(item)
		UpdateComprehensiveIndustrialResourceData(item)
	}
}

// 添加晨会精华
func AddComprehensiveMeetingreviewchaptOld() {
	var condition string
	var pars []interface{}
	IndustrialManagementRespMap, _ := GetIndustrialManagementRespMap()
	list, err := models.GetCygxMorningMeetingReviewChapterList(condition, pars)

	if err != nil {
		fmt.Println(err)
		return
	}
	//indexName := utils.IndexNameComprehensive
	for _, v := range list {
		time.Sleep(200 * time.Millisecond)
		content := html.UnescapeString(v.Content)
		doc, err := goquery.NewDocumentFromReader(strings.NewReader(content))
		if err != nil {
			fmt.Println("create doc err:", err.Error())
			return
		}
		bodyText := doc.Text()
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.Id
		item.Source = "meetingreviewchapt"
		item.IndustryName = IndustrialManagementRespMap[v.IndustryId]
		item.PublishDate = v.PublishTime
		item.Abstract = bodyText
		EsAddOrEditComprehensiveData(item)
		fmt.Println(item)
	}
}

func AddComprehensiveMeetingreviewchapt(sourceId int) {
	time.Sleep(3 * time.Second) // 延迟三秒处理
	var err error
	defer func() {
		if err != nil {
			fmt.Println("err：", err)
			go utils.SendAlarmMsg("AddComprehensiveMeetingreviewchapt，Err："+err.Error(), 3)
		}
	}()
	v, e := models.GetCygxMorningMeetingReviewChapterDetail(sourceId)
	if e != nil {
		err = errors.New("GetCygxMorningMeetingReviewChapterDetail" + e.Error())
		return
	}
	content := html.UnescapeString(v.Content)
	doc, e := goquery.NewDocumentFromReader(strings.NewReader(content))
	if e != nil {
		err = errors.New("goquery.NewDocumentFromReader" + e.Error())
		return
	}
	bodyText := doc.Text()
	item := new(ElasticComprehensiveDetail)
	item.SourceId = sourceId
	item.Source = utils.CYGX_OBJ_MEETINGREVIEWCHAPT
	item.IndustryName = v.IndustryName
	item.PublishDate = v.MeetingTime.Format(utils.FormatDateTime)
	item.Abstract = bodyText
	EsAddOrEditComprehensiveData(item) //如果发布了就新增
	return
}

// 添加活动
func AddComprehensiveActivity() {
	var condition string
	var pars []interface{}
	condition = ` AND publish_status = 1 `
	//condition = ` AND publish_status = 1  AND  activity_id = 2407 `
	list, err := models.GetCygxActivityList(condition, pars, 0, 100000)

	if err != nil {
		fmt.Println(err)
		return
	}
	IndustrialManagementRespMap, _ := GetIndustrialManagementRespMap()
	IndustrialSubjectMap, _ := GetCygxIndustrialSubjectMap()
	var condition1 string
	var pars1 []interface{}
	mapActivityIndustrialManagement := make(map[int][]string)
	industrialgroupList, e := models.GetCygxIndustrialActivityGroupManagementList(condition1+"  AND  source = 1 ", pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	for _, v := range industrialgroupList {
		if v.ActivityId == 0 {
			continue
		}
		mapActivityIndustrialManagement[v.ActivityId] = append(mapActivityIndustrialManagement[v.ActivityId], IndustrialManagementRespMap[v.IndustrialManagementId])
	}

	mapActivitySubject := make(map[int][]string)
	SubjectgroupList, e := models.GetCygxIndustrialActivityGroupSubjectList(condition1+"  AND  source = 1 ", pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	for _, v := range SubjectgroupList {
		if v.ActivityId == 0 {
			continue
		}
		mapActivitySubject[v.ActivityId] = append(mapActivitySubject[v.ActivityId], IndustrialSubjectMap[v.IndustrialSubjectId])
	}

	//return
	for _, v := range list {
		time.Sleep(200 * time.Millisecond)
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.ActivityId
		//item.IsSummary = v.IsSummary
		item.Source = "activity"
		//item.SubjectNames = json.Sprint(mapActivitySubject[v.ActivityId])
		item.SubjectNames = strings.Join(mapActivitySubject[v.ActivityId], ",")
		item.IndustryName = strings.Join(mapActivityIndustrialManagement[v.ActivityId], ",")
		item.Title = v.ActivityName
		item.PublishDate = v.ActivityTime
		//item.BodyText = bodyText
		//item.Annotation, _ = GetReportContentTextSubNew(v.Annotation)
		//item.Abstract, _ = GetReportContentTextSubNew(v.Abstract)

		//EsAddOrEditComprehensiveData(indexName, item)
		EsAddOrEditComprehensiveData(item)
		fmt.Println(item)
	}
}

// 添加专项调研活动
func AddComprehensiveActivitySpecial() {
	var condition string
	var pars []interface{}
	condition = ` AND publish_status = 1 `
	list, err := models.GetActivitySpecialListAll(condition, pars, 0, 100000)

	if err != nil {
		fmt.Println(err)
		return
	}
	//indexName := utils.IndexNameComprehensive
	IndustrialManagementRespMap, _ := GetIndustrialManagementRespMap() // 产业标签
	IndustrialSubjectMap, _ := GetCygxIndustrialSubjectMap()           // 标的标签
	var condition1 string
	var pars1 []interface{}
	mapActivityIndustrialManagement := make(map[int][]string)
	industrialgroupList, e := models.GetCygxIndustrialActivityGroupManagementList(condition1+"  AND  source = 2 ", pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	for _, v := range industrialgroupList {
		if v.ActivityId == 0 {
			continue
		}
		mapActivityIndustrialManagement[v.ActivityId] = append(mapActivityIndustrialManagement[v.ActivityId], IndustrialManagementRespMap[v.IndustrialManagementId])
	}

	mapActivitySubject := make(map[int][]string)
	SubjectgroupList, e := models.GetCygxIndustrialActivityGroupSubjectList(condition1+"  AND  source = 2 ", pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	for _, v := range SubjectgroupList {
		if v.ActivityId == 0 {
			continue
		}
		mapActivitySubject[v.ActivityId] = append(mapActivitySubject[v.ActivityId], IndustrialSubjectMap[v.IndustrialSubjectId])
	}
	for _, v := range list {
		time.Sleep(200 * time.Millisecond)
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.ActivityId
		item.Source = "activityspecial"
		item.Title = v.ResearchTheme
		item.PublishDate = v.ActivityTime
		if v.ActivityTime == utils.FormatDateTimeInit {
			item.PublishDate = v.LastUpdatedTime.Format(utils.FormatDateTime)
		} else {
			item.PublishDate = v.ActivityTime
		}
		item.SubjectNames = strings.Join(mapActivitySubject[v.ActivityId], ",")
		item.IndustryName = strings.Join(mapActivityIndustrialManagement[v.ActivityId], ",")
		EsAddOrEditComprehensiveData(item)
	}
}

// 添加活动视频
func AddComprehensiveActivityVideo() {
	var err error
	defer func() {
		if err != nil {
			fmt.Println(err)
			go utils.SendAlarmMsg("添加活动视频综合页面数据Es失败"+err.Error(), 2)
		}
	}()
	var condition string
	var pars []interface{}

	list, e := models.GetActivityVideoListAll(condition, pars, 0, 100000)
	if e != nil {
		err = errors.New("GetActivityVideoListAll, Err: " + e.Error())
		return
	}
	if len(list) == 0 {
		return
	}
	var activityIds []int
	for _, v := range list {
		activityIds = append(activityIds, v.ActivityId)
	}

	pars = make([]interface{}, 0)
	condition = ` AND publish_status = 1  AND art.activity_id IN (` + utils.GetOrmInReplace(len(activityIds)) + `)`
	pars = append(pars, activityIds)
	listArt, e := models.GetCygxActivityList(condition, pars, 0, 100000)
	if e != nil {
		err = errors.New("GetCygxActivityList, Err: " + e.Error())
		return
	}
	mapActivity := make(map[int]string)

	for _, v := range listArt {
		mapActivity[v.ActivityId] = v.ActivityName
	}

	IndustrialManagementRespMap, _ := GetIndustrialManagementRespMap()
	IndustrialSubjectMap, _ := GetCygxIndustrialSubjectMap()
	var condition1 string
	var pars1 []interface{}
	mapActivityIndustrialManagement := make(map[int][]string)
	industrialgroupList, e := models.GetCygxIndustrialActivityGroupManagementList(condition1+"  AND  source = 1 ", pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	//产业名称
	for _, v := range industrialgroupList {
		if v.ActivityId == 0 {
			continue
		}
		mapActivityIndustrialManagement[v.ActivityId] = append(mapActivityIndustrialManagement[v.ActivityId], IndustrialManagementRespMap[v.IndustrialManagementId])
	}

	//标的名称
	mapActivitySubject := make(map[int][]string)
	SubjectgroupList, e := models.GetCygxIndustrialActivityGroupSubjectList(condition1+"  AND  source = 1 ", pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	for _, v := range SubjectgroupList {
		if v.ActivityId == 0 {
			continue
		}
		mapActivitySubject[v.ActivityId] = append(mapActivitySubject[v.ActivityId], IndustrialSubjectMap[v.IndustrialSubjectId])
	}

	//indexName := utils.IndexNameComprehensive
	for _, v := range list {
		time.Sleep(200 * time.Millisecond)
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.Id
		item.Source = "activityvideo"
		item.Title = v.Title
		item.PublishDate = v.ActivityTime
		item.BodyText = mapActivity[v.ActivityId]
		item.SubjectNames = strings.Join(mapActivitySubject[v.ActivityId], ",")
		item.IndustryName = strings.Join(mapActivityIndustrialManagement[v.ActivityId], ",")
		EsAddOrEditComprehensiveData(item)
		fmt.Println(item)
	}
}

// 添加活动音频
func AddComprehensiveActivityVoice() {
	var err error
	defer func() {
		if err != nil {
			fmt.Println(err)
			go utils.SendAlarmMsg("AddComprehensiveActivityVoice"+err.Error(), 2)
		}
	}()
	var condition string
	var pars []interface{}

	list, err := models.GetActivityVoiceList(condition, pars, 0, 100000)
	if err != nil {
		fmt.Println(err)
		return
	}

	if len(list) == 0 {
		return
	}
	var activityIds []int
	for _, v := range list {
		activityIds = append(activityIds, v.ActivityId)
	}

	pars = make([]interface{}, 0)
	condition = ` AND publish_status = 1  AND art.activity_id IN (` + utils.GetOrmInReplace(len(activityIds)) + `)`
	pars = append(pars, activityIds)
	listArt, e := models.GetCygxActivityList(condition, pars, 0, 100000)
	if e != nil {
		err = errors.New("GetCygxActivityList, Err: " + e.Error())
		return
	}
	mapActivity := make(map[int]string)

	for _, v := range listArt {
		mapActivity[v.ActivityId] = v.ActivityName
	}

	IndustrialManagementRespMap, _ := GetIndustrialManagementRespMap()
	IndustrialSubjectMap, _ := GetCygxIndustrialSubjectMap()
	var condition1 string
	var pars1 []interface{}
	mapActivityIndustrialManagement := make(map[int][]string)
	industrialgroupList, e := models.GetCygxIndustrialActivityGroupManagementList(condition1+"  AND  source = 1 ", pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	//产业名称
	for _, v := range industrialgroupList {
		if v.ActivityId == 0 {
			continue
		}
		mapActivityIndustrialManagement[v.ActivityId] = append(mapActivityIndustrialManagement[v.ActivityId], IndustrialManagementRespMap[v.IndustrialManagementId])
	}

	//标的名称
	mapActivitySubject := make(map[int][]string)
	SubjectgroupList, e := models.GetCygxIndustrialActivityGroupSubjectList(condition1+"  AND  source = 1 ", pars1)
	if e != nil {
		fmt.Println(e)
		return
	}
	for _, v := range SubjectgroupList {
		if v.ActivityId == 0 {
			continue
		}
		mapActivitySubject[v.ActivityId] = append(mapActivitySubject[v.ActivityId], IndustrialSubjectMap[v.IndustrialSubjectId])
	}
	//indexName := utils.IndexNameComprehensive
	for _, v := range list {
		time.Sleep(200 * time.Millisecond)
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.ActivityVoiceId
		item.Source = "activityvoice"
		item.Title = v.VoiceName
		item.PublishDate = v.ActivityTime
		item.BodyText = mapActivity[v.ActivityId]
		item.SubjectNames = strings.Join(mapActivitySubject[v.ActivityId], ",")
		item.IndustryName = strings.Join(mapActivityIndustrialManagement[v.ActivityId], ",")
		EsAddOrEditComprehensiveData(item)
		fmt.Println(item)
	}
}

// 微路演
func AddComprehensiveRoadshow() {
	var condition string
	var pars []interface{}
	IndustrialManagementRespMap, _ := GetIndustrialManagementRespMap()
	list, err := models.GetMicroRoadshowVideoListBycondition(condition, pars, 0, 100000)
	if err != nil {
		fmt.Println(err)
		return
	}
	//indexName := utils.IndexNameComprehensive
	for _, v := range list {
		time.Sleep(200 * time.Millisecond)
		item := new(ElasticComprehensiveDetail)
		item.SourceId = v.VideoId
		item.Source = "roadshow"
		item.IndustryName = IndustrialManagementRespMap[v.IndustryId]
		item.Title = v.VideoName
		item.PublishDate = v.PublishDate.Format(utils.FormatDateTime)
		EsAddOrEditComprehensiveData(item)
		fmt.Println(item)
	}
}

// Es研选专栏
func EsAddYanxuanSpecial(sourceId int) {
	var err error
	defer func() {
		if err != nil {
			fmt.Println("err：", err)
			go utils.SendAlarmMsg(fmt.Sprint("更新研选专栏失败sourceId: ", sourceId), 2)
		}
	}()
	detail, e := models.GetYanxuanSpecialItemById(sourceId)
	if e != nil {
		err = errors.New("GetArticleInfoOtherByArticleId" + e.Error())
		return
	}
	content := html.UnescapeString(detail.Content)
	doc, e := goquery.NewDocumentFromReader(strings.NewReader(content))
	if e != nil {
		err = errors.New("goquery.NewDocumentFromReader" + e.Error())
		return
	}
	bodyText := doc.Text()
	item := new(ElasticComprehensiveDetail)
	item.SourceId = detail.Id
	item.Source = utils.CYGX_OBJ_YANXUANSPECIAL
	item.Title = detail.Title
	item.PublishDate = detail.PublishTime
	item.BodyText = bodyText
	item.Abstract = bodyText
	item.IndustryName = detail.IndustryTags
	item.SubjectNames = detail.CompanyTags + detail.Tags
	if detail.Status == 3 {
		EsAddOrEditComprehensiveData(item) //如果发布了就新增
	} else {
		EsDeleteComprehensiveData(item) // 没有发布就删除
	}
	return
}

// 新增和修改数据
func EsAddOrEditComprehensiveData(item *ElasticComprehensiveDetail) (err error) {
	indexName := utils.IndexNameComprehensive
	//return
	defer func() {
		if err != nil {
			fmt.Println(err, item.SourceId)
			//go utils.SendAlarmMsg("更新综合页面数据Es失败"+err.Error()+fmt.Sprint(item), 2)
		}
	}()
	client := utils.Client
	mustMap := make([]interface{}, 0)
	mustMap = append(mustMap, map[string]interface{}{
		"term": map[string]interface{}{
			"SourceId": item.SourceId,
		},
	})
	mustMap = append(mustMap, map[string]interface{}{
		"term": map[string]interface{}{
			"Source": item.Source,
		},
	})
	queryMap := map[string]interface{}{
		"query": map[string]interface{}{
			"bool": map[string]interface{}{
				"must": mustMap,
			},
		},
	}
	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
	total, e := requestTotalHits.Do(context.Background())
	if e != nil {
		err = errors.New("requestTotalHits.Do(context.Background()), Err: " + e.Error())
		return
	}
	//return
	//根据来源以及ID ，判断内容是否存在，如果存在就新增，如果不存在就修改
	if total == 0 {
		resp, e := client.Index().Index(indexName).BodyJson(item).Do(context.Background())
		if e != nil {
			err = errors.New("client.Index().Index(indexName).BodyJson(item).Do(context.Background()), Err: " + e.Error())
			return
		}
		if resp.Status == 0 && resp.Result == "created" {
			//fmt.Println("新增成功")
			//err = nil
			return
		} else {
			//err = errors.New(fmt.Sprint(resp))
			err = errors.New(fmt.Sprint("articleId", item.SourceId))
			return
		}
	} else {
		//拼接需要改动的前置条件
		bool_query := elastic.NewBoolQuery()
		bool_query.Must(elastic.NewTermQuery("SourceId", item.SourceId))
		bool_query.Must(elastic.NewTermQuery("Source", item.Source))
		//设置需要改动的内容
		var script string
		script += fmt.Sprint("ctx._source['SubjectNames'] = '", item.SubjectNames, "';")
		script += fmt.Sprint("ctx._source['PublishDate'] = '", item.PublishDate, "';")
		script += fmt.Sprint("ctx._source['IsSummary'] = ", item.IsSummary, ";")
		script += fmt.Sprint("ctx._source['Abstract'] = '", item.Abstract, "';")
		script += fmt.Sprint("ctx._source['Title'] = '", item.Title, "';")
		script += fmt.Sprint("ctx._source['BodyText'] = '", item.BodyText, "';")
		script += fmt.Sprint("ctx._source['Annotation'] = '", item.Annotation, "';")
		script += fmt.Sprint("ctx._source['IndustryName'] = '", item.IndustryName, "'")

		_, e = client.UpdateByQuery(indexName).
			Query(bool_query).
			Script(elastic.NewScriptInline(script)).
			Refresh("true").
			Do(context.Background())

		if e != nil && e.Error() != "elastic: Error 400 (Bad Request): compile error [type=script_exception]" {
			//文本内容过长的时候，修改会报 400 的错误，暂时先不处理
			//fmt.Println("err", e.Error())
			////err = e
			//err = errors.New("client.UpdateByQuery(indexName), Err: " + e.Error())
			return
		}
	}
	return
}

// 删除数据
func EsDeleteComprehensiveData(item *ElasticComprehensiveDetail) (err error) {
	defer func() {
		if err != nil {
			fmt.Println(err)
			go utils.SendAlarmMsg("删除数据综合页面数据Es失败"+err.Error()+fmt.Sprint(item), 2)
		}
	}()
	indexName := utils.IndexNameComprehensive
	client := utils.Client
	//拼接需要删除的前置条件
	bool_query := elastic.NewBoolQuery()
	bool_query.Must(elastic.NewTermQuery("SourceId", item.SourceId))
	bool_query.Must(elastic.NewTermQuery("Source", item.Source))
	_, e := client.DeleteByQuery(indexName).
		Query(bool_query).
		Do(context.Background())
	if e != nil {
		err = errors.New(" client.DeleteByQuery(indexName), Err: " + e.Error())
		return
	}
	return
}

func EsComprehensiveSearch(keyWord string, startSize, pageSize int) (result []*SearchComprehensiveItem, total int64, err error) {
	indexName := utils.IndexNameComprehensive
	client := utils.Client
	keyWordArr, err := GetIndustryMapNameSliceV3(keyWord)
	keyWordArr = RemoveDuplicatesAndEmpty(keyWordArr)
	keyWordLen := len(keyWordArr)
	if keyWordLen <= 0 {
		keyWordArr = append(keyWordArr, keyWord)
		keyWordLen = len(keyWordArr)
	}

	//Es 的高级查询有 自定义排序 文档一时半会儿撸不懂，先做多次查询手动过滤 2023.2.2
	//ikType 查询方式 ，0：查所有 、 1:查询键入词 、 2：查询除了查询键入词之外的联想词
	mustMap := make([]interface{}, 0)
	shouldMap := make(map[string]interface{}, 0)
	shouldMapquery := make([]interface{}, 0)

	mustNotMap := make([]interface{}, 0)
	shouldNotMap := make(map[string]interface{}, 0)
	shouldNotMapquery := 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 {
			continue
		}
		if k == 0 {
			boost = 2 * 1000
		} else {
			boost = 1
		}

		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":  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":  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":  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, //给查询的值赋予权重
			//				"boost":  boost, //给查询的值赋予权重
			//				"fields": []interface{}{"BodyText"},
			//				"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":  boost, //给查询的值赋予权重
							"fields": []interface{}{"IndustryName"},
							"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":  boost, //给查询的值赋予权重
							"fields": []interface{}{"SubjectNames"},
							"query":  v,
						},
					},
				},
			})
		}
	}
	shouldMap = map[string]interface{}{
		"should": shouldMapquery,
	}

	shouldNotMap = map[string]interface{}{
		"should": shouldNotMapquery,
	}
	//排序
	sortMap := make([]interface{}, 0)

	//时间
	sortMap = append(sortMap, map[string]interface{}{
		"PublishDate": map[string]interface{}{
			"order": "desc",
		},
	})
	//sortMap = append(sortMap, map[string]interface{}{
	//	"_score": map[string]interface{}{
	//		"order": "desc",
	//	},
	//})
	//高亮
	highlightMap := make(map[string]interface{}, 0)
	highlightMap = map[string]interface{}{
		"fields": map[string]interface{}{
			//"BodyText":   map[string]interface{}{},
			"Title":      map[string]interface{}{},
			"Abstract":   map[string]interface{}{},
			"Annotation": map[string]interface{}{},
		},
		//样式 红色
		"post_tags":     []interface{}{"</font>"},
		"pre_tags":      []interface{}{"<font color='red'>"},
		"fragment_size": 50,
	}

	mustMap = append(mustMap, map[string]interface{}{
		"bool": shouldMap,
	})
	mustNotMap = append(mustNotMap, map[string]interface{}{
		"bool": shouldNotMap,
	})

	queryMap := map[string]interface{}{
		"query": map[string]interface{}{
			"bool": map[string]interface{}{
				"must": mustMap,
			},
		},
	}

	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))
	request := client.Search(indexName).Source(queryMap) // sets the JSON request
	searchByMatch, err := request.Do(context.Background())
	if searchByMatch != nil {
		if searchByMatch.Hits != nil {
			for _, v := range searchByMatch.Hits.Hits {
				var isAppend bool
				articleJson, err := v.Source.MarshalJSON()
				if err != nil {
					return nil, 0, err
				}
				article := new(ElasticComprehensiveDetail)
				err = json.Unmarshal(articleJson, &article)
				if err != nil {
					return nil, 0, err
				}
				//fmt.Println(article.SourceId, article.Title, article.Source)
				searchItem := new(SearchComprehensiveItem)
				searchItem.SourceId = article.SourceId
				if len(v.Highlight["Annotation"]) > 0 {
					for _, vText := range v.Highlight["Annotation"] {
						searchItem.Body = append(searchItem.Body, vText)
					}
				}
				if len(v.Highlight["Abstract"]) > 0 {
					for _, vText := range v.Highlight["Abstract"] {
						searchItem.Body = append(searchItem.Body, vText)
					}
				}
				if len(v.Highlight["BodyText"]) > 0 {
					for _, vText := range v.Highlight["BodyText"] {
						searchItem.Body = append(searchItem.Body, vText)
					}
				}
				//searchItem.IsSummary = article.IsSummary
				//if len(searchItem.Body) == 0 {
				//	bodyRune := []rune(article.BodyText)
				//	bodyRuneLen := len(bodyRune)
				//	if bodyRuneLen > 100 {
				//		bodyRuneLen = 100
				//	}
				//	body := string(bodyRune[:bodyRuneLen])
				//	searchItem.Body = []string{body}
				//}
				var title string
				if len(v.Highlight["Title"]) > 0 {
					title = v.Highlight["Title"][0]
				} else {
					title = article.Title
				}
				searchItem.Title = title
				searchItem.Source = article.Source
				searchItem.PublishDate = article.PublishDate

				if !isAppend {
					result = append(result, searchItem)
				}
			}
		}
		total = searchByMatch.Hits.TotalHits.Value
	}
	return
}

func GetResourceDataEsList(list []*SearchComprehensiveItem, user *models.WxUserItem) (items []*models.CygxResourceDataResp, err error) {
	var condition string
	var pars []interface{}
	uid := user.UserId
	titleHighlight := make(map[int]string)
	bodyHighlight := make(map[int][]string)
	yanXuanbodyHighlight := make(map[int][]string)
	//var bodyHighlight []string
	mapItems := make(map[string]*models.CygxResourceDataResp)
	for _, v := range list {
		//预处理文章
		item := new(models.CygxResourceDataResp)
		item.SourceId = v.SourceId
		item.Source = v.Source
		//if v.IsSummary == 1 {
		item.BodyHighlight = v.Body
		titleHighlight[v.SourceId] = v.Title
		bodyHighlight[v.SourceId] = v.Body
		//fmt.Println(v.Title)
		//} else {
		//	item.BodyHighlight = make([]string, 0)
		//}
		item.PublishDate = utils.TimeRemoveHms2(v.PublishDate)
		mapItems[fmt.Sprint(v.Source, v.SourceId)] = item
	}

	var articleIds []int
	var newchartIds []int
	var roadshowIds []string
	var activityIds []int
	var activityvideoIds []string
	var activityvoiceIds []string
	var activityspecialIds []int
	var researchsummaryIds []int
	var minutessummaryIds []int
	var meetingreviewchaptIds []int
	var productinteriorIds []int
	var industrialResourceIdsHz []int // 弘则产业资源包
	var industrialResourceIdsYx []int // 研选产业资源包
	var yanxuanSpecialIds []int       // 研选专栏
	var askserieVideoIds []string     //问答系列视频
	var reportselectionIds []int      //报告精选
	var ficcreporrtIds []string       //FICC研报
	//Source      string    `description:"资源类型 报告 ：article 、图表 ：newchart、微路演 ：roadshow、活动 ：activity、活动视频：activityvideo、活动音频：activityvoice、专项调研活动：activityspecial 、 本周研究汇总： researchsummary 、 上周纪要汇总 ：minutessummary 、晨会精华 ：meetingreviewchapt "`
	for _, v := range list {
		if v.Source == "article" {
			articleIds = append(articleIds, v.SourceId)
		} else if v.Source == "newchart" {
			newchartIds = append(newchartIds, v.SourceId)
		} else if v.Source == "roadshow" {
			roadshowIds = append(roadshowIds, strconv.Itoa(v.SourceId))
		} else if v.Source == "activity" {
			activityIds = append(activityIds, v.SourceId)
		} else if v.Source == "activityvideo" {
			activityvideoIds = append(activityvideoIds, strconv.Itoa(v.SourceId))
		} else if v.Source == "activityvoice" {
			activityvoiceIds = append(activityvoiceIds, strconv.Itoa(v.SourceId))
		} else if v.Source == "activityspecial" {
			activityspecialIds = append(activityspecialIds, v.SourceId)
		} else if v.Source == "researchsummary" {
			researchsummaryIds = append(researchsummaryIds, v.SourceId)
		} else if v.Source == "minutessummary" {
			minutessummaryIds = append(minutessummaryIds, v.SourceId)
		} else if v.Source == "meetingreviewchapt" {
			meetingreviewchaptIds = append(meetingreviewchaptIds, v.SourceId)
		} else if v.Source == "productinterior" {
			productinteriorIds = append(productinteriorIds, v.SourceId)
		} else if v.Source == "industrialsourceHz" {
			industrialResourceIdsHz = append(industrialResourceIdsHz, v.SourceId)
		} else if v.Source == "industrialsourceYx" {
			industrialResourceIdsYx = append(industrialResourceIdsYx, v.SourceId)
		} else if v.Source == utils.CYGX_OBJ_YANXUANSPECIAL {
			yanxuanSpecialIds = append(yanxuanSpecialIds, v.SourceId)
			yanXuanbodyHighlight[v.SourceId] = v.Body
		} else if v.Source == utils.CYGX_OBJ_ASKSERIEVIDEO {
			askserieVideoIds = append(askserieVideoIds, strconv.Itoa(v.SourceId))
		} else if v.Source == "reportselection" {
			reportselectionIds = append(reportselectionIds, v.SourceId)
		} else if v.Source == utils.CYGX_OBJ_FICC_REPORT {
			ficcreporrtIds = append(ficcreporrtIds, strconv.Itoa(v.SourceId))
		}
	}
	//处理文章
	if len(articleIds) > 0 {
		pars = make([]interface{}, 0)
		condition = ` AND a.article_id IN (` + utils.GetOrmInReplace(len(articleIds)) + `)`
		pars = append(pars, articleIds)

		listArticle, e := models.GetHomeList(condition, pars, 0, len(articleIds))
		if e != nil {
			err = errors.New("GetResourceDataList, Err: " + e.Error())
			return
		}

		listArticle, e = HandleArticleCategoryImg(listArticle)
		if e != nil {
			err = errors.New("HandleArticleCategoryImg, Err: " + e.Error())
			return
		}
		for _, v := range listArticle {
			v.Body = ""
			v.BodyHtml = ""
			if titleHighlight[v.ArticleId] != "" {
				v.Title = titleHighlight[v.ArticleId]
			}
			if len(bodyHighlight[v.ArticleId]) > 0 {
				v.Abstract = ""
				v.Annotation = ""
				v.BodyHighlight = bodyHighlight[v.ArticleId]
			} else {
				v.BodyHighlight = make([]string, 0)
			}
			mapItems[fmt.Sprint("article", v.ArticleId)].Article = v
		}
	}

	//处理晨会精华
	if len(meetingreviewchaptIds) > 0 {
		//pars = make([]interface{}, 0)
		//condition = ` AND c.id IN (` + utils.GetOrmInReplace(len(meetingreviewchaptIds)) + `)`
		//pars = append(pars, meetingreviewchaptIds)

		listrMeet, e := GetCygxMorningMeetingReviewChapterListByIds(meetingreviewchaptIds)
		if e != nil {
			err = errors.New("GetResourceDataList, Err: " + e.Error())
			return
		}
		for _, v := range listrMeet {
			v.Content = AnnotationHtml(v.Content)
			v.PublishTime = utils.TimeRemoveHms2(v.PublishTime)
			mapItems[fmt.Sprint("meetingreviewchapt", v.Id)].Meetingreviewchapt = v
		}
	}

	//处理上周纪要汇总
	if len(minutessummaryIds) > 0 {
		pars = make([]interface{}, 0)
		condition = ` AND article_id IN (` + utils.GetOrmInReplace(len(minutessummaryIds)) + `)`
		pars = append(pars, minutessummaryIds)

		listresearchsummary, e := models.GetReportSelectionListHome(condition, "cygx_minutes_summary", pars, 0, len(minutessummaryIds))
		if e != nil {
			err = errors.New("GetResourceDataList, Err: " + e.Error())
			return
		}
		for _, v := range listresearchsummary {
			v.PublishDate = utils.TimeRemoveHms2(v.PublishDate)
			mapItems[fmt.Sprint("minutessummary", v.ArticleId)].Minutessummary = v
		}
	}

	//处理本周纪要汇总
	if len(researchsummaryIds) > 0 {
		pars = make([]interface{}, 0)
		condition = ` AND article_id IN (` + utils.GetOrmInReplace(len(researchsummaryIds)) + `)`
		pars = append(pars, researchsummaryIds)

		listresearchsummary, e := models.GetReportSelectionListHome(condition, "cygx_research_summary", pars, 0, len(researchsummaryIds))
		if e != nil {
			err = errors.New("GetReportSelectionListHome, Err: " + e.Error())
			return
		}
		for _, v := range listresearchsummary {
			v.PublishDate = utils.TimeRemoveHms2(v.PublishDate)
			mapItems[fmt.Sprint("researchsummary", v.ArticleId)].Researchsummary = v
		}
	}

	//处理产品内测
	if len(productinteriorIds) > 0 {
		pars = make([]interface{}, 0)
		condition = `  AND art.status = 1 AND art.product_interior_id  IN (` + utils.GetOrmInReplace(len(productinteriorIds)) + `)`
		pars = append(pars, productinteriorIds)
		listProductInterior, e := models.GetCygxProductInteriorList(condition, pars, 0, len(productinteriorIds))
		if e != nil {
			err = errors.New("GetCygxProductInteriorList, Err: " + e.Error())
			return
		}
		for _, v := range listProductInterior {
			v.Body = ProductInteriorHtml(v.Body)
			v.PublishTime = utils.TimeRemoveHms2(v.PublishTime)
			mapItems[fmt.Sprint("productinterior", v.ProductInteriorId)].ProductInterior = v
		}
	}

	//处理报告精选
	lenreportselectionIds := len(reportselectionIds)
	if lenreportselectionIds > 0 {
		pars = make([]interface{}, 0)
		condition = ` AND article_id IN (` + utils.GetOrmInReplace(lenreportselectionIds) + `)`
		pars = append(pars, reportselectionIds)
		listreportselection, e := models.GetReportSelectionList(condition, pars, 0, lenreportselectionIds)
		if e != nil {
			err = errors.New("GetReportSelectionList, Err: " + e.Error())
			return
		}
		mapPv := GetCygxReportHistoryRecordListMap(reportselectionIds, "bgjx")
		for _, v := range listreportselection {
			v.Title += "(第" + v.Periods + "期)"
			v.MarketStrategy = AnnotationHtml(v.MarketStrategy)
			v.PublishDate = utils.TimeRemoveHms2(v.PublishDate)
			v.Pv = mapPv[v.ArticleId]
			mapItems[fmt.Sprint("reportselection", v.ArticleId)].ReportSelection = v
		}
	}

	detail, e := models.GetConfigByCode("city_img_url")
	if e != nil {
		err = errors.New("GetResourceDataList, Err: " + e.Error())
		return
	}
	detailChart, e := models.GetConfigByCode("chart_img_url")
	if e != nil {
		err = errors.New("GetResourceDataList, Err: " + e.Error())
		return
	}
	addressList := strings.Split(detail.ConfigValue, "{|}")
	mapAddress := make(map[string]string)
	chartList := strings.Split(detailChart.ConfigValue, "{|}")
	mapChart := make(map[string]string)
	var cityName string
	var chartName string
	var imgUrl string
	var imgUrlChart string
	for _, v := range addressList {
		vslice := strings.Split(v, "_")
		cityName = vslice[0]
		imgUrl = vslice[len(vslice)-1]
		mapAddress[cityName] = imgUrl
	}
	for _, v := range chartList {
		vslice := strings.Split(v, "_")
		chartName = vslice[0]
		imgUrlChart = vslice[len(vslice)-1]
		mapChart[chartName] = imgUrlChart
	}
	var imgUrlResp string
	//处理活动
	if len(activityIds) > 0 {
		for _, vss := range activityIds {
			imgUrlResp += strconv.Itoa(vss) + ","
		}
		pars = make([]interface{}, 0)
		condition = ` AND art.activity_id IN (` + utils.GetOrmInReplace(len(activityIds)) + `)`
		pars = append(pars, activityIds)
		activityList, e := models.GetActivityListNew(condition, pars, uid, 0, len(activityIds), 0, 0, "")
		if e != nil {
			err = errors.New("GetResourceDataList, Err: " + e.Error())
			return
		}
		//处理不同的报名方式按钮回显
		mapActivitySignup, e := GetActivitySignupResp(activityIds, user)
		if e != nil {
			e = errors.New("GetActivitySignupResp, Err: " + e.Error())
			return
		}
		activityTypeIdMap := GetActivityTypeIdMap()

		var activityListRersp []*models.ActivityDetail
		for _, v := range activityList {
			v.SignupType = mapActivitySignup[v.ActivityId]
			v.ActivityType = activityTypeIdMap[v.ActivityTypeId] // 线上还是线下
			activityListRersp = append(activityListRersp, ActivityButtonShow(v))
		}
		for _, v := range activityListRersp {
			if v == nil {
				continue
			}
			if v.ActivityType == 0 {
				if mapAddress[v.City] != "" {
					imgUrlResp = mapAddress[v.City]
				} else {
					imgUrlResp = mapAddress["其它"]
				}
			} else {
				if mapChart[v.ChartPermissionName] != "" {
					imgUrlResp = mapChart[v.ChartPermissionName]
				}
			}
			v.SourceType = 1
			v.Expert, _ = GetReportContentTextSub(v.Expert)
			mapItems[fmt.Sprint("activity", v.ActivityId)].Activity = v
		}
	}

	//产业资源包
	if len(industrialResourceIdsHz) > 0 {
		pars = make([]interface{}, 0)

		var industrialResourceIdstring []string
		for _, v := range industrialResourceIdsHz {
			industrialResourceIdstring = append(industrialResourceIdstring, strconv.Itoa(v))
		}
		industrialId := strings.Join(industrialResourceIdstring, ",")
		condition = ` AND  m.industrial_management_id IN  (` + industrialId + `)   AND a.article_type_id = 0 `
		listIndustrialResourceIds, e := models.GetSearchResourceList(user.UserId, condition, 0, len(industrialResourceIdsHz))
		if e != nil {
			err = errors.New("GetSearchResourceList, Err: " + e.Error())
			return
		}
		//合并产业关联的标的
		listSubjcet, e := models.GetIndustrialSubjectAllByIndustrialId(industrialResourceIdsHz)
		if e != nil {
			e = errors.New("GetIndustrialSubjectAllByIndustrialId, Err: " + e.Error())
			return
		}
		mapIndustrial := make(map[string]int)
		for _, v := range listSubjcet {
			for k2, v2 := range listIndustrialResourceIds {
				if v2.IndustrialManagementId == v.IndustrialManagementId && mapIndustrial[fmt.Sprint(v2.IndustrialManagementId, "Hz", v.SubjectName)] == 0 {
					listIndustrialResourceIds[k2].IndustrialSubjectList = append(listIndustrialResourceIds[k2].IndustrialSubjectList, v)
				}
			}
		}
		for _, v := range listIndustrialResourceIds {
			if v.TimeLineData == "" {
				v.ListTimeLine = make([]models.TimeLineReportResp, 0)
			} else {
				if err = json.Unmarshal([]byte(v.TimeLineData), &v.ListTimeLine); err != nil {
					e = errors.New("Unmarshal, Err: " + e.Error())
					//return
				}
			}
			v.Source = 1
			mapItems[fmt.Sprint("industrialsourceHz", v.IndustrialManagementId)].IndustrialResource = v
		}
	}

	if len(industrialResourceIdsYx) > 0 {
		pars = make([]interface{}, 0)

		var industrialResourceIdstring []string
		for _, v := range industrialResourceIdsYx {
			industrialResourceIdstring = append(industrialResourceIdstring, strconv.Itoa(v))
		}
		industrialId := strings.Join(industrialResourceIdstring, ",")
		condition = ` AND  m.industrial_management_id IN  (` + industrialId + `)   AND a.article_type_id > 0 `
		listIndustrialResourceIds, e := models.GetSearchResourceList(user.UserId, condition, 0, len(industrialResourceIdsYx))
		if e != nil {
			err = errors.New("GetSearchResourceList, Err: " + e.Error())
			return
		}
		//合并产业关联的标的
		listSubjcet, e := models.GetIndustrialSubjectAllByIndustrialId(industrialResourceIdsYx)
		if e != nil {
			e = errors.New("GetIndustrialSubjectAllByIndustrialId, Err: " + e.Error())
			return
		}
		mapIndustrial := make(map[string]int)
		for _, v := range listSubjcet {
			for k2, v2 := range listIndustrialResourceIds {
				if v2.IndustrialManagementId == v.IndustrialManagementId && mapIndustrial[fmt.Sprint(v2.IndustrialManagementId, "Yx", v.SubjectName)] == 0 {
					listIndustrialResourceIds[k2].IndustrialSubjectList = append(listIndustrialResourceIds[k2].IndustrialSubjectList, v)
				}
			}
		}
		for _, v := range listIndustrialResourceIds {
			v.Source = 2
			mapItems[fmt.Sprint("industrialsourceYx", v.IndustrialManagementId)].IndustrialResource = v
		}
	}

	//处理图表
	if len(newchartIds) > 0 {
		pars = make([]interface{}, 0)
		condition = ` AND a.chart_id IN (` + utils.GetOrmInReplace(len(newchartIds)) + `)`
		pars = append(pars, newchartIds)
		chartDateList, e := models.GetChartListCollectionNew(condition, pars, uid, 0, len(newchartIds))
		if e != nil {
			err = errors.New("GetResourceDataList, Err: " + e.Error())
			return
		}
		for _, v := range chartDateList {
			mapItems[fmt.Sprint("newchart", v.ChartId)].Newchart = v
		}
	}

	//处理专项调研
	if len(activityspecialIds) > 0 {
		pars = make([]interface{}, 0)
		condition = ` AND art.activity_id IN (` + utils.GetOrmInReplace(len(activityspecialIds)) + `)`
		pars = append(pars, activityspecialIds)
		activitySpeciallist, e := models.GetCygxActivitySpecialDetailList(condition, pars, user.UserId, 0, len(activityspecialIds))
		if e != nil {
			err = errors.New("GetCygxActivitySpecialDetailList, Err: " + e.Error())
			return
		}
		UserMap, e := GetSpecialTripUserMap(activityIds, user.UserId)
		if e != nil {
			err = errors.New("GetSpecialTripUserMap, Err: " + e.Error())
			return
		}
		for _, v := range activitySpeciallist {
			if mapChart[v.ChartPermissionName] != "" {
				imgUrlResp = mapChart[v.ChartPermissionName]
			}
			if _, ok := UserMap[v.ActivityId]; ok {
				v.IsTrip = 1
			}
			if v.Days == 0 {
				v.TripStatus = 1
				v.TripImgLink = v.TripImgLink
			} else {
				v.TripStatus = 2
				v.TripImgLink = v.TripImgLinkFix
				v.ActivityTimeText = v.ActivityTimeTextByDay
			}
			resultTimeStart := utils.StrTimeToTime(v.ActivityTime)  //时间字符串格式转时间格式
			resultTimeEnd := utils.StrTimeToTime(v.ActivityTimeEnd) //时间字符串格式转时间格式
			if resultTimeStart.After(time.Now()) {
				v.ActiveState = 1
			} else if time.Now().After(resultTimeEnd) {
				v.ActiveState = 3
			} else {
				v.ActiveState = 2
			}
			v.ImgUrl = imgUrlResp
			mapItems[fmt.Sprint("activityspecial", v.ActivityId)].Activityspecial = v

		}
	}

	if len(roadshowIds)+len(activityvideoIds)+len(activityvoiceIds)+len(askserieVideoIds) > 0 {

		audioIdstr := strings.Join(activityvoiceIds, ",")
		activityVideoIdsStr := strings.Join(activityvideoIds, ",")
		roadshowIdsStr := strings.Join(roadshowIds, ",")
		askserieVideoIdsStr := strings.Join(askserieVideoIds, ",")

		list, _, e := GetMicroRoadShowMycollectV12(len(roadshowIds)+len(activityvideoIds)+len(activityvoiceIds)+len(askserieVideoIds), 0, audioIdstr, activityVideoIdsStr, roadshowIdsStr, askserieVideoIdsStr, user)
		if e != nil {
			err = errors.New("GetMicroRoadShowMycollectV12, Err: " + e.Error())
			return
		}

		// 用户权限
		authInfo, permissionArr, e := GetUserRaiPermissionInfo(user.UserId, user.CompanyId)
		if e != nil {
			err = errors.New("GetUserRaiPermissionInfo, Err: " + e.Error())
			return
		}

		// 获取默认图配置
		audioMap, videoMap, audioShareMap, videoShareMap, e := GetMicroRoadShowDefaultImgConfig()
		if e != nil {
			err = errors.New("GetMicroRoadShowDefaultImgConfig, Err: " + e.Error())
			return
		}
		//Source      string    `description:"资源类型 报告 ：article 、图表 ：newchart、微路演 ：roadshow、活动 ：activity、活动视频：activityvideo、活动音频：activityvoice、专项调研活动：activityspecial"`
		for i := range list {
			// 权限
			au := new(models.UserPermissionAuthInfo)
			au.SellerName = authInfo.SellerName
			au.SellerMobile = authInfo.SellerMobile
			au.HasPermission = authInfo.HasPermission
			au.OperationMode = authInfo.OperationMode
			if au.HasPermission == 1 {
				// 非宏观权限进一步判断是否有权限
				if list[i].ChartPermissionId != utils.HONG_GUAN_ID && !utils.InArrayByStr(permissionArr, list[i].ChartPermissionName) {
					au.HasPermission = 2
				}
			}
			// 无权限的弹框提示
			if au.HasPermission != 1 {
				if au.OperationMode == UserPermissionOperationModeCall {
					if list[i].Type == 1 {
						au.PopupMsg = UserPermissionPopupMsgCallActivity
					} else {
						au.PopupMsg = UserPermissionPopupMsgCallMicroVideo
					}
				} else {
					if list[i].Type == 1 {
						au.PopupMsg = UserPermissionPopupMsgApplyActivity
					} else {
						au.PopupMsg = UserPermissionPopupMsgApplyMicroVideo
					}
				}
			}
			list[i].AuthInfo = au
			list[i].PublishTime = utils.StrTimeToTime(list[i].PublishTime).Format(utils.FormatDate)
			// 默认图
			if list[i].BackgroundImg == "" {
				if list[i].Type == 1 {
					list[i].BackgroundImg = audioMap[list[i].ChartPermissionId]
				} else {
					list[i].BackgroundImg = videoMap[list[i].ChartPermissionId]
				}
			}
			// 分享图
			if list[i].ShareImg == "" {
				if list[i].Type == 1 {
					list[i].ShareImg = audioShareMap[list[i].ChartPermissionId]
				} else {
					list[i].ShareImg = videoShareMap[list[i].ChartPermissionId]
				}
			}
		}
		//Type                int    `description:"类型: 1-音频; 2-活动视频； 3-产业视频"`
		for _, item := range list {
			if item.Type == 1 {
				mapItems[fmt.Sprint("activityvoice", item.Id)].Activityvoice = item
			} else if item.Type == 2 {
				mapItems[fmt.Sprint("activityvideo", item.Id)].Activityvideo = item
			} else if item.Type == 3 {
				mapItems[fmt.Sprint("roadshow", item.Id)].Roadshow = item
			} else if item.Type == 4 {
				mapItems[fmt.Sprint(utils.CYGX_OBJ_ASKSERIEVIDEO, item.Id)].AskserieVideo = item
			}
		}
	}

	//处理研选专栏
	lenyanxuanSpecialIds := len(yanxuanSpecialIds)
	if lenyanxuanSpecialIds > 0 {
		pars = make([]interface{}, 0)
		condition = ` AND a.id IN (` + utils.GetOrmInReplace(lenyanxuanSpecialIds) + `) `
		pars = append(pars, yanxuanSpecialIds)
		listyanxuanSpecial, e := models.GetYanxuanSpecialList(user.UserId, condition, pars, 0, 0)
		if e != nil {
			err = errors.New("GetYanxuanSpecialList, Err: " + e.Error())
			return
		}

		for _, v := range listyanxuanSpecial {
			v.PublishTime = utils.TimeRemoveHms2(v.PublishTime)
			v.Annotation, _ = GetReportContentTextSubNew(v.Content)
			if len(yanXuanbodyHighlight[v.Id]) > 0 {
				v.BodyHighlight = yanXuanbodyHighlight[v.Id]
			} else {
				v.BodyHighlight = append(v.BodyHighlight, v.Annotation)
			}
			v.Annotation = "" //强制置空，兼容前端优先级
			// Source  PublishDate 字段兼容前端样式
			v.Source = utils.CYGX_OBJ_YANXUANSPECIAL
			v.PublishDate = v.PublishTime
			mapItems[fmt.Sprint(utils.CYGX_OBJ_YANXUANSPECIAL, v.Id)].YanxuanSpecial = v
		}
	}

	//处理FICC研报
	if len(ficcreporrtIds) > 0 {
		pars = make([]interface{}, 0)
		condition = ` AND a.report_id IN (` + utils.GetOrmInReplace(len(ficcreporrtIds)) + `)`
		pars = append(pars, ficcreporrtIds)

		listArticle, e := models.GetHomeList(condition, pars, 0, len(ficcreporrtIds))
		if e != nil {
			err = errors.New("GetHomeList, Err: " + e.Error())
			return
		}

		listArticle, e = HandleArticleCategoryImg(listArticle)
		if e != nil {
			err = errors.New("HandleArticleCategoryImg, Err: " + e.Error())
			return
		}
		for _, v := range listArticle {
			//fmt.Println(v.ArticleId)
			v.Body = ""
			v.Source = 0          //配合前端这里强制改为 0
			v.ArticleResponse = 0 //配合前端这里强制改为 0
			//v.Source = utils.CYGX_OBJ_YANXUANSPECIAL
			mapItems[fmt.Sprint("ficcreport", v.ReportId)].FiccReport = v
		}

		//listArticle, e = HandleArticleCategoryImg(listArticle)
		//if e != nil {
		//	err = errors.New("HandleArticleCategoryImg, Err: " + e.Error())
		//	return
		//}
		//for _, v := range listArticle {
		//	//reportInfoItem := new(ficc_report.ReportDetail)
		//	//reportInfoItem.ReportInfo.ReportId = v.ReportId
		//	//reportInfoItem.ReportInfo.PublishTime = utils.StrTimeToTime(v.PublishDate)
		//	//reportInfoItem.ReportInfo.Title = v.Title
		//	mapItems[fmt.Sprint("ficcreport", v.ArticleId)].FiccReport = v
		//
		//}
	}

	for _, vList := range list {
		for _, v := range mapItems {
			//如果这些类型都为空，那么就不合并
			if v.Article == nil && v.Newchart == nil && v.Roadshow == nil && v.Activity == nil && v.Activityvideo == nil && v.Activityvoice == nil && v.Activityspecial == nil && v.Researchsummary == nil && v.Minutessummary == nil && v.Meetingreviewchapt == nil && v.ProductInterior == nil && v.IndustrialResource == nil && v.YanxuanSpecial == nil && v.AskserieVideo == nil && v.ReportSelection == nil && v.FiccReport == nil {
				continue
			}
			if v.SourceId == vList.SourceId && v.Source == vList.Source {
				items = append(items, v)
			}
		}
	}

	for _, v := range items {
		if v.IndustrialResource != nil {
			v.Source = "industrialsource"
		}
	}
	return
}

func SqlComprehensiveSearch(keyWord string, startSize, pageSize int) (result []*SearchComprehensiveItem, total int, err error) {
	listListNoEnd, e := models.GetActivityIdListNoEnd()
	var activityIds []string
	for _, v := range listListNoEnd {
		activityIds = append(activityIds, strconv.Itoa(v.ActivityId))
	}
	activityIds = append(activityIds, "0")

	conditionActivity := " AND IF   ( source IN('activity') , source_id IN (" + strings.Join(activityIds, ",") + ")  ,1=1 )"
	keyWord = "%" + keyWord + "%"
	var conditionTitle string
	var parsTitle []interface{}
	conditionTitle = " AND is_hide = 0  AND search_title LIKE ? AND IF   ( source IN('activityvoice','activityvideo') , chart_permission_id != 31 ,1=1 ) " + conditionActivity
	parsTitle = append(parsTitle, keyWord)
	totalTitle, e := models.GetResourceDataCount(conditionTitle, parsTitle)
	if e != nil {
		err = errors.New("GetResourceDataCount, Err: " + e.Error())
		return
	}

	var conditionContent string
	var parsContent []interface{}

	conditionContent = " AND is_hide = 0 AND search_content LIKE ? AND search_title  NOT LIKE ?  AND IF   ( source IN('activityvoice','activityvideo') , chart_permission_id != 31 ,1=1 ) " + conditionActivity
	parsContent = append(parsContent, keyWord, keyWord)
	totalContent, e := models.GetResourceDataCount(conditionContent, parsContent)
	if e != nil {
		err = errors.New("AddCygxArticleViewRecord, Err: " + e.Error())
		return
	}
	var searchTotal int
	searchTotal = (startSize/pageSize + 1) * pageSize
	var list []*models.CygxResourceData
	//fmt.Println("totalTitle", totalTitle)
	//fmt.Println("totalContent", totalContent)
	//fmt.Println(searchTotal)
	if totalTitle >= searchTotal {
		//全部都是标题搜索
		list, e = models.GetResourceDataListCondition(conditionTitle, parsTitle, startSize, pageSize)
		if e != nil && e.Error() != utils.ErrNoRow() {
			err = errors.New("GetResourceDataListCondition, Err: " + e.Error())
			return
		}
	} else if totalTitle <= searchTotal-pageSize {
		//全部都是内容搜索
		startSize = startSize - totalTitle

		list, e = models.GetResourceDataListCondition(conditionContent, parsContent, startSize, pageSize)
		if e != nil && e.Error() != utils.ErrNoRow() {
			err = errors.New("GetResourceDataListCondition, Err: " + e.Error())
			return
		}
	} else {
		//一半标题搜索，一半内容搜索
		list, e = models.GetResourceDataListCondition(conditionTitle, parsTitle, startSize, pageSize)
		if e != nil && e.Error() != utils.ErrNoRow() {
			err = errors.New("GetResourceDataListCondition, Err: " + e.Error())
			return
		}
		listContent, e := models.GetResourceDataListCondition(conditionContent, parsContent, 0, pageSize-totalContent%pageSize)
		if e != nil && e.Error() != utils.ErrNoRow() {
			err = errors.New("GetResourceDataListCondition, Err: " + e.Error())
			return
		}
		for _, v := range listContent {
			list = append(list, v)
		}
	}

	for _, v := range list {
		item := new(SearchComprehensiveItem)
		item.SourceId = v.SourceId
		item.Source = v.Source
		result = append(result, item)
	}
	total = totalTitle + totalContent
	return
}
