package cygx

import (
	"encoding/json"
	"fmt"
	"github.com/rdlucklib/rdluck_tools/paging"
	"github.com/tealeg/xlsx"
	"hongze/hz_crm_api/controllers"
	"hongze/hz_crm_api/models"
	"hongze/hz_crm_api/models/company"
	"hongze/hz_crm_api/models/cygx"
	"hongze/hz_crm_api/models/system"
	"hongze/hz_crm_api/services"
	cygxService "hongze/hz_crm_api/services/cygx"
	"hongze/hz_crm_api/utils"
	"html"
	"os"
	"path/filepath"
	"strconv"
	"strings"
	"time"
)

// 报告管理
type ReportArticleController struct {
	controllers.BaseAuthController
}

// @Title 主题列表
// @Description 获取主题列表接口
// @Param   ChartPermissionId   query   int  true       "分类ID"
// @Success 200 {object} cygx.CygxReportMappingListRep
// @router /reportMappingist/list [get]
func (this *ReportArticleController) CygxReportMappingist() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	chartPermissionId, _ := this.GetInt("ChartPermissionId")
	if chartPermissionId < 1 {
		br.Msg = "请输入分类ID"
		return
	}
	list, err := cygx.CygxReportMappingist(chartPermissionId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	resp := new(cygx.CygxReportMappingListRep)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 报告匹配类型列表
// @Description 获取报告匹配类型列表接口
// @Success 200 {object} cygx.CygxReportMappingMatchTypeRep
// @Param   ChartPermissionId   query   int  true       "分类ID"
// @router /reportMappingMatchTypeRep/list [get]
func (this *ReportArticleController) CygxReportMappingMatchTypeList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	chartPermissionId, _ := this.GetInt("ChartPermissionId")
	var condition string
	var pars []interface{}
	if chartPermissionId > 0 {
		condition += ` AND chart_permission_id  = ?  `
		pars = append(pars, chartPermissionId)
	}
	list, err := cygx.GetCygxReportMappingCygxList(condition, pars, 0, 0)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	resp := new(cygx.CygxCygxReportMappingCygxResp)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 报告列表
// @Description 报告列表接口
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Param   IsFilter   query   int  true       "是否过滤 ,1是,0否,不传默认为0"
// @Param   IsClass   query   int  true       "是否归类 ,1是,0否 ,不传默认为0"
// @Param   ChartPermissionId   query   int  true     "行业ID --> 一级分类列表中 ChartPermissionId"
// @Param   SubCategoryName   query   string  true     "主题"
// @Param   MatchTypeName   query   string  true     "报告匹配类型"
// @Param   IndustrialManagementId   int   string  true     "产业ID"
// @Param   StartDate   query   string  true       "开始时间用0 补齐,列如2021-03-06 08:09:01"
// @Param   EndDate   query   string  true       "结束时间用0 补齐,列如2021-03-06 08:09:01"
// @Param   KeyWord   query   string  true       "搜索关键词"
// @Param   KeyWordStock   query   string  true       "搜索关键词.个股标签,关联标的部分"
// @Success 200 {object} cygx.GetReportArticleListRep
// @router /reportArticle/list [get]
func (this *ReportArticleController) ReportArticleList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}

	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	isFilter, _ := this.GetInt("IsFilter")
	isClass, _ := this.GetInt("IsClass")
	chartPermissionId, _ := this.GetInt("ChartPermissionId")
	subCategoryName := this.GetString("SubCategoryName")
	matchTypeName := this.GetString("MatchTypeName")
	industrialManagementId, _ := this.GetInt("IndustrialManagementId")
	startDate := this.GetString("StartDate")
	endDate := this.GetString("EndDate")
	keyWord := this.GetString("KeyWord")
	keyWordStock := this.GetString("KeyWordStock")
	reportLabel := this.GetString("ReportLabel") // 查研观向7.4-报告标签
	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = utils.StartIndex(currentIndex, pageSize)
	var condition string
	var pars []interface{}

	listPermission, errper := cygx.GetPermissionMappingCategoryID()
	if errper != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + errper.Error()
		return
	}
	condition += ` AND art.is_report = 1 AND re.id !=28 `
	if isClass == 0 {
		condition += ` AND art.is_class = 0  `
	} else {
		condition += ` AND art.is_class = 1 `
		if industrialManagementId > 0 {
			condition += ` AND man.industrial_management_id  =  ` + strconv.Itoa(industrialManagementId)
		}
	}
	if keyWord != "" {
		condition += ` AND (art.title LIKE '%` + keyWord + `%' )  `
	}
	//个股标签跟标的的搜索
	if keyWordStock != "" {
		condition += ` AND (art.stock LIKE '%` + keyWordStock + `%' OR art.article_id IN (SELECT article_id FROM cygx_industrial_article_group_subject WHERE industrial_subject_id IN (SELECT industrial_subject_id FROM cygx_industrial_subject WHERE subject_name LIKE '%` + keyWordStock + `%')) )  `
	}
	if isFilter == 0 {
		condition += ` AND art.is_filter = 0 `
	} else {
		condition += ` AND art.is_filter = 1 `
	}
	//行业
	if chartPermissionId > 0 {
		condition += ` AND re.chart_permission_id  =  ` + strconv.Itoa(chartPermissionId)
	}
	//主题
	if subCategoryName != "" {
		condition += ` AND art.sub_category_name  =  ` + "'" + subCategoryName + "' "
	}
	//发布时间
	if startDate != "" {
		condition += ` AND art.publish_date >= ` + "'" + startDate + " 00:00:00'"
	}
	if endDate != "" {
		condition += ` AND art.publish_date <= ` + "'" + endDate + " 23:59:59'"
	}
	//报告匹配类型
	if matchTypeName != "" && chartPermissionId > 0 {
		//condition += ` AND re.match_type_name  =  ` + "'" + matchTypeName + "' "
		//mappingCygxDetai, err := cygx.GetCygxReportMappingCygxDetailByNameAndChartPermissionId(matchTypeName, chartPermissionId)
		//if err != nil && err.Error() != utils.ErrNoRow() {
		//	br.Msg = "获取失败"
		//	br.ErrMsg = "获取失败,Err:" + err.Error()
		//	return
		//}
		//if mappingCygxDetai == nil {
		//	resp := new(cygx.GetReportArticleListRep)
		//	resp.List = make([]*cygx.CygxReportArticle, 0)
		//	page := paging.GetPaging(currentIndex, pageSize, 0)
		//	resp.Paging = page
		//	br.Ret = 200
		//	br.Success = true
		//	br.Msg = "获取成功"
		//	br.Data = resp
		//	return
		//}
		//这里量不大,走一下子查询
		//condition += ` 	AND art.category_id IN ( SELECT category_id_celue FROM cygx_report_mapping_group WHERE id_cygx = ` + strconv.Itoa(mappingCygxDetai.Id) + ` )  `
		condition += ` 	AND art.category_id IN ( SELECT category_id FROM cygx_report_mapping WHERE match_type_name = ` + "'" + matchTypeName + "'" + ` )  `
	}
	// 报告标签
	if reportLabel != "" {
		keywords := "%" + reportLabel + "%"
		// 查询包含关键词的产业/标的所关联的报告IDs
		artIds, e := cygx.GetArticleIdsFromIndustryAndSubjectGroupByKeyword(keywords)
		if e != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "产业/标的关键词获取文章IDs失败, Err:" + e.Error()
			return
		}
		if len(artIds) > 0 {
			condition += ` AND art.article_id IN (` + utils.GetOrmInReplace(len(artIds)) + `)`
			pars = append(pars, artIds)
		}
	}
	total, err := cygx.GetReportArticleCount(condition, pars)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	//return
	condition += `	GROUP BY art.article_id  ORDER BY art.publish_date DESC `
	//fmt.Println(condition)
	list, err := cygx.GetReportArticleList(condition, pars, startSize, pageSize, isClass)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	reportMap := make(map[int]string)
	listMap, err := cygx.GetReportMapping()
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取映射分类失败,Err:" + err.Error()
		return
	}
	for _, v := range listMap {
		reportMap[v.CategoryId] = v.MatchTypeName
	}
	var articleIds string
	for k, v := range list {
		var isShowButton bool
		if sysUser.RoleTypeCode == "rai_admin" || sysUser.RoleTypeCode == "rai_researcher" || sysUser.RoleTypeCode == "admin" {
			isShowButton = true
		} else {
			isShowButton = false
		}
		list[k].MatchTypeName = reportMap[v.CategoryId]
		list[k].ShowButton = true
		for _, vper := range listPermission {
			if v.CategoryId == vper.CategoryId {
				isShowButton = false
			}
			list[k].ShowButton = isShowButton
		}
		articleIds += strconv.Itoa(v.ArticleId) + ","
	}
	mapCommment := make(map[int]int)
	if articleIds != "" {
		articleIds = strings.TrimRight(articleIds, ",")
		condition = `	AND  art.article_id IN (` + articleIds + `)`
		listPv, err := cygx.GetReportArticleListPvUv(condition)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取PV,Uv 失败,Err:" + err.Error()
			return
		}

		var condition string
		var pars []interface{}
		condition = `	AND  k.article_id IN (` + articleIds + `)`
		listComment, err := cygx.GetArticleCommentListSearch(condition, pars)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,Err:" + err.Error()
			return
		}

		for _, v := range listComment {
			mapCommment[v.ArticleId]++
		}

		if len(listPv) > 0 {
			for _, pv := range listPv {
				for k, v := range list {
					if v.ArticleId == pv.ArticleId {
						list[k].Pv = pv.Pv
						list[k].Uv = pv.Uv
						list[k].ClPv = pv.ClPv
						list[k].ClUv = pv.ClUv
						list[k].CollectionNum = pv.CollectionNum
					}
				}
			}
		}
	}
	//ListIndustrial          []*IndustrialActivityGroupManagementRep
	//ListSubject             []*SubjectActivityGroupManagementRep
	mapIndustrial := make(map[int]string)
	mapSubject := make(map[string]string)

	mapIndustrialList := make(map[int][]*cygx.IndustrialActivityGroupManagementRep)
	mapSubjectList := make(map[int][]*cygx.SubjectActivityGroupManagementRep)
	if articleIds != "" {
		industrialList, err := cygx.GetIndustrialArticleGroupListByarticleIds(articleIds)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,GetIndustrialArticleGroupListByarticleIds Err:" + err.Error()
			return
		}
		subjectList, err := cygx.GetSubjectArticleGroupListByarticleIds(articleIds)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,GetSubjectArticleGroupListByarticleIds Err:" + err.Error()
			return
		}
		//合并活动对应的多个标的
		for _, v := range subjectList {
			mapSubject[fmt.Sprint(v.ArticleId, "_", v.IndustrialManagementId)] += v.SubjectName + "/"
			itemSubject := new(cygx.SubjectActivityGroupManagementRep)
			itemSubject.SubjectName = v.SubjectName
			itemSubject.IndustrialSubjectId = v.IndustrialSubjectId
			mapSubjectList[v.ArticleId] = append(mapSubjectList[v.ArticleId], itemSubject)
		}
		//活动对应的产业
		for _, v := range industrialList {
			var labelSubject string
			labelSubject = mapSubject[fmt.Sprint(v.ArticleId, "_", v.IndustrialManagementId)]
			if labelSubject != "" {
				mapIndustrial[v.ArticleId] += v.IndustryName + "--" + strings.TrimRight(labelSubject, "/") + ","
			} else {
				mapIndustrial[v.ArticleId] += v.IndustryName + ","
			}

			itemindustrial := new(cygx.IndustrialActivityGroupManagementRep)
			itemindustrial.IndustryName = v.IndustryName
			itemindustrial.IndustrialManagementId = v.IndustrialManagementId
			mapIndustrialList[v.ArticleId] = append(mapIndustrialList[v.ArticleId], itemindustrial)
		}
	}
	for k, v := range list {
		if mapIndustrial[v.ArticleId] != "" {
			list[k].Label = strings.TrimRight(mapIndustrial[v.ArticleId], ",")
		}
		if v.SubCategoryName == "专项调研" {
			v.PublishDate = cygxService.ArticlePublishDate(v.PublishDate)
		}
		list[k].CommentNum = mapCommment[v.ArticleId]
		list[k].ListIndustrial = mapIndustrialList[v.ArticleId]
		list[k].ListSubject = mapSubjectList[v.ArticleId]

		if v.ReportId > 0 {
			list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/ricc/yb/report/" + strconv.Itoa(v.ReportId)
		} else {
			list[k].HttpUrl = utils.CYGX_WEB_URL + "/material/info/" + strconv.Itoa(v.ArticleId)
		}
	}
	page := paging.GetPaging(currentIndex, pageSize, total)
	resp := new(cygx.GetReportArticleListRep)
	resp.List = list
	resp.Paging = page
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 过滤报告
// @Description 过滤报告接口
// @Param   ReportId   query   int  true       "报告ID"
// @Success Ret=200
// @router /reportArticle/filter [post]
func (this *IndustrialSubjectController) ReportArticleFilter() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	//if sysUser.RoleTypeCode != "rai_admin" && sysUser.RoleTypeCode != "rai_researcher" && sysUser.RoleTypeCode != "admin" {
	//	br.Msg = "你没有操作权限请联系管理员"
	//	return
	//}
	var req cygx.CygxReportArticleID
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	reportId := req.ReportId
	reportInfo, err := cygx.GetReportArticleId(reportId)
	if reportInfo == nil {
		br.Msg = "报告ID不存在!"
		return
	}
	if err != nil {
		br.Msg = "过滤失败!"
		br.ErrMsg = "过滤失败,Err:" + err.Error()
		return
	}
	if reportInfo.IsFilter == 1 {
		br.Msg = "您已过滤请勿重复操作!"
		return
	}
	if reportInfo.ReportType != 2 {
		br.Msg = "操作失败!"
		br.ErrMsg = "报告类型不属于产业报告!"
		return
	}
	err = cygx.FilterReportArticle(reportId)
	if err != nil {
		br.Msg = "过滤失败"
		br.ErrMsg = "过滤失败,Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "过滤成功"
	br.IsAddLog = true
}

// @Title 报告归类
// @Description 报告归类接口
// @Param	request	body cygx.ReportArticleClassificationResp true "type json string"
// @Success Ret=200
// @router /reportArticle/classification [post]
func (this *IndustrialSubjectController) ReportArticleClassification() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	//if sysUser.RoleTypeCode != "rai_admin" && sysUser.RoleTypeCode != "rai_researcher" && sysUser.RoleTypeCode != "admin" {
	//	br.Msg = "你没有操作权限请联系管理员"
	//	return
	//}
	var req cygx.ReportArticleClassificationResp
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	var pars []interface{}
	var condition string
	reportId := req.ReportId
	industrialManagementIdStr := req.IndustrialManagementId
	reportInfo, _ := cygx.GetReportArticleId(reportId)
	if reportInfo == nil {
		br.Msg = "报告ID不存在!"
		return
	}
	if reportInfo.ReportType != 2 {
		br.Msg = "操作失败!"
		br.ErrMsg = "报告类型不属于产业报告!"
		return
	}

	industrialStrList := strings.Split(industrialManagementIdStr, ",")
	for _, v := range industrialStrList {
		condition = `AND industrial_management_id = ` + v
		totalIndustrialManagement, _ := cygx.GetIndustrialManagementCount(condition, pars)
		if totalIndustrialManagement < 1 {
			br.Msg = "操作失败"
			br.ErrMsg = "操作失败,产业不存在IndustrialManagementId:" + v
			return
		}
	}
	if req.IndustrialSubjectIdStr != "0" && req.IndustrialSubjectIdStr != "" {
		strList := strings.Split(req.IndustrialSubjectIdStr, ",")
		for _, v := range strList {
			condition = `AND industrial_subject_id = ` + v + ` AND industrial_management_id IN ( ` + industrialManagementIdStr + `)`
			totalIndustrialSubject, _ := cygx.GetIndustrialSubjectCount(condition, pars)
			if totalIndustrialSubject < 1 {
				br.Msg = "操作失败"
				br.ErrMsg = "操作失败,标的不存在IndustrialSubjectId:" + v
				return
			}
		}
	}

	err = cygx.ReportArticleClassificationEditNew(req.ReportId, industrialManagementIdStr, reportInfo.ArticleId, req.IndustrialSubjectIdStr)
	if err != nil {
		br.Msg = "分类失败"
		br.ErrMsg = "分类失败,Err:" + err.Error()
		return
	}

	go cygxService.DoArticleOnenIdWxTemplateMsg(reportInfo.ArticleId, 2)
	br.Ret = 200
	br.Success = true
	br.Msg = "分类成功"
	br.IsAddLog = true
}

// @Title 是否展示操作按钮
// @Description 获取是否展示操作按钮接口
// @Success Ret=200 {object} cygx.ShowButton
// @router /reportArticle/showButton [get]
func (this *IndustrialSubjectController) ShowButton() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	resp := new(cygx.ShowButton)
	if sysUser.RoleTypeCode == "rai_admin" || sysUser.RoleTypeCode == "rai_researcher" || sysUser.RoleTypeCode == "admin" {
		resp.IsShowButton = true
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 下载阅读明细
// @Description 获取下载阅读明细接口
// @Param   ReportId   query   int  true       "报告ID"
// @Success Ret=200
// @router /reportArticle/export [get]
func (this *IndustrialSubjectController) Export() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	reportId, _ := this.GetInt("ReportId")
	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
	resp := new(cygx.CanDownload)

	adminInfo, errAdmin := system.GetSysUserById(sysUser.AdminId)
	if errAdmin != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + errAdmin.Error()
		return
	}
	if adminInfo.Role == "admin" || adminInfo.Role == "researcher" {
		resp.IsCanDownload = true
	}

	var list []*cygx.ReportExportRep
	var err error
	if resp.IsCanDownload == false {
		//权益申请销售只能看到自己名下的客户的申请
		companyIds, err := cygxService.GetAdminLookUserCompanyIds(sysUser)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取失败,GetAdminLookUserCompanyIds Err:" + err.Error()
			return
		}
		var companyIdstr []string
		for _, v := range companyIds {
			companyIdstr = append(companyIdstr, strconv.Itoa(v))
		}
		sqlStr := ` AND h.company_id IN  (` + strings.Join(companyIdstr, ",") + `) `
		listSeller, errSeller := cygx.GetReportExportRep(reportId, sqlStr)
		list = listSeller
		err = errSeller

	} else {
		sqlStr := ""
		listAdmin, errAdmin := cygx.GetReportExportRep(reportId, sqlStr)
		list = listAdmin
		err = errAdmin
	}
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	var listNew []*cygx.ReportExportRep
	for k, v := range list {
		if k > 0 && list[k].Id == list[k-1].Id {
			list[k-1].SellerName = list[k-1].SellerName + "/" + v.SellerName
		}
	}
	for k, v := range list {
		if k > 0 && list[k].Id != list[k-1].Id {
			listNew = append(listNew, v)
		}
	}

	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true
	sheet, err := xlsxFile.AddSheet("关键词搜索统计")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	//标头
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "姓名"
	cellB := rowTitle.AddCell()
	cellB.Value = "公司名"
	cellC := rowTitle.AddCell()
	cellC.Value = "销售名称"
	cellD := rowTitle.AddCell()
	cellD.Value = "阅读时间"
	cellE := rowTitle.AddCell()
	cellE.Value = "停留时间(s)"
	for _, item := range listNew {
		row := sheet.AddRow()
		cellA := row.AddCell()
		cellA.Value = item.RealName
		cellB := row.AddCell()
		cellB.Value = item.CompanyName
		cellC := row.AddCell()
		cellC.Value = item.SellerName
		cellD := row.AddCell()
		cellD.Value = item.CreateTime
		cellE := row.AddCell()
		cellE.Value = item.StopTime
	}

	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
	downloadFileName := "阅读明细统计列表" + randStr + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "导出成功"
}

// @Title 通过报告ID获取对应的匹配类型
// @Description 通过报告ID获取对应的匹配类型接口
// @Param   ReportId   query   int  true       "报告ID"
// @Success 200 {object} cygx.ReportMatchTypeNameList
// @router /reportArticle/getMatchTypeName [get]
func (this *IndustrialSubjectController) GetMatchTypeNameByReportId() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	reportId, _ := this.GetInt("ReportId")
	detail, err := cygx.GetArticleDetailById(reportId)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	list, err := cygx.GetMatchTypeName(detail.CategoryId)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取品种信息失败,Err:" + err.Error()
		return
	}
	resp := new(cygx.ReportMatchTypeNameList)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 修改报告的匹配类型
// @Description 修改报告的匹配类型接口
// @Param	request	body cygx.UpdateReportMatchTypeNameRep true "type json string"
// @Success Ret=200
// @router /reportArticle/updateMatchTypeName [post]
func (this *IndustrialSubjectController) UpdateMatchTypeName() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	var req cygx.UpdateReportMatchTypeNameRep

	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	reportId := req.ReportId
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	detail, err := cygx.GetMatchTypeNameById(req.MatchID)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	detailArt, err := cygx.GetArticleDetailById(reportId)
	if err != nil {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	err = cygx.UpdateReportMatchTypeName(detail.MatchTypeName, detail.ReportType, detail.CategoryId, req.ReportId, detailArt.IsSummary, detailArt.IsClass)
	if err != nil {
		br.Msg = "修改失败"
		br.ErrMsg = "获取信息失败,Err:" + err.Error()
		return
	}
	go cygxService.DoArticleOnenIdWxTemplateMsg(detailArt.ArticleId, 2)
	go cygxService.AddCygxReportMappingCategoryGroupByArticleId(detailArt.ArticleId) // 手动修改报告归类
	go cygxService.UpdateArticleResourceData(detailArt.ArticleId)                    //写入首页最新  cygx_resource_data 表
	br.Ret = 200
	br.Success = true
	br.Msg = "修改成功"
	br.IsAddLog = true
}

// @Title 报告内容的保存与发布
// @Description 报告内容的保存与发布接口
// @Param	request	body cygx.ReportAddRep true "type json string"
// @Success 200 操作成功
// @router /reportArticle/PreserveAndPublish [post]
func (this *ReportArticleController) PreserveAndPublish() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,用户信息为空"
		br.Ret = 408
		return
	}
	var req cygx.ReportAddRep
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if req.Title == "" {
		br.Msg = "标题不可为空"
		br.ErrMsg = "标题不可为空"
		return
	}
	if req.Abstract == "" {
		br.Msg = "摘要不可为空"
		br.ErrMsg = "摘要不可为空"
		return
	}
	var articleId int
	industrialManagementIds := req.IndustrialManagementIds
	industrialSubjectIds := req.IndustrialSubjectIds
	chartPermissionId := req.ChartPermissionId
	publishDate := req.PublishDate
	if industrialManagementIds == "" {
		br.Msg = "请选择产业"
		return
	}
	if publishDate == "" {
		br.Msg = "请选择发布时间"
		return
	}
	industryIds := make([]int, 0)
	industrialManagementIdList := strings.Split(industrialManagementIds, ",")
	for _, v := range industrialManagementIdList {
		i, err := strconv.Atoi(v)
		if err != nil {
			br.Msg = "参数解析异常!"
			br.ErrMsg = "产业ID不规范,Err:" + err.Error() + industrialManagementIds
			return
		}
		industryIds = append(industryIds, i)
	}
	if industrialSubjectIds != "" {
		industrialSubjectIdList := strings.Split(industrialSubjectIds, ",")
		for _, v := range industrialSubjectIdList {
			_, err := strconv.Atoi(v)
			if err != nil {
				br.Msg = "参数解析异常!"
				br.ErrMsg = "标的ID不规范,Err:" + err.Error() + industrialSubjectIds
				return
			}
		}
	}
	var pars []interface{}
	var condition string
	condition += ` AND chart_permission_id = ? AND sub_category_name = '专项调研' `
	pars = append(pars, chartPermissionId)
	charInfo, err := cygx.GetReportMappingDetail(condition, pars)
	if err != nil {
		br.Msg = "请选择所属行业"
		br.ErrMsg = "获取所属行业信息失败,Err:" + err.Error()
		return
	}
	var articleIdNew int
	if articleId == 0 {
		maxArticleIdArticleInfo, errMax := cygx.GetMaxArticleIdInfo()
		if errMax != nil {
			br.Msg = "发布失败"
			br.ErrMsg = "发布失败,Err:" + errMax.Error()
			return
		}
		if maxArticleIdArticleInfo.ArticleId < utils.SummaryArticleId {
			articleIdNew = utils.SummaryArticleId
		} else {
			articleIdNew = maxArticleIdArticleInfo.ArticleId + 1
		}
	}
	expertNumStr, expertContentStr, interviewDateStr, fileLink := cygx.BodyAnalysis(req.Body)
	item := new(cygx.CygxArticle)
	item.AdminId = AdminUser.AdminId
	item.AdminName = AdminUser.AdminName
	item.Title = req.Title
	item.Body = cygxService.GetRichtext(req.Body)
	item.BodyText, _ = cygx.GetReportContentTextSub(item.Body)
	item.Abstract = req.Abstract
	item.CategoryName = charInfo.MatchTypeName
	item.SubCategoryName = charInfo.SubCategoryName
	item.ArticleId = articleId
	item.CreateDate = time.Now()
	item.LastUpdatedTime = time.Now()
	item.IsReport = 1
	item.IsSummary = 1
	item.Source = 1
	item.IsClass = 1
	item.IsReport = 1
	item.ReportType = 2
	item.ArticleIdMd5 = utils.MD5(strconv.Itoa(articleIdNew))
	item.UpdateFrequency = "unknow"
	item.SellerAndMobile = req.SellerAndMobile
	item.ExpertBackground = expertContentStr
	item.ExpertNumber = expertNumStr
	item.InterviewDate = interviewDateStr
	item.FileLink = fileLink
	item.CategoryId = charInfo.CategoryId
	item.CategoryIdTwo = charInfo.CategoryId
	item.ChartPermissionIds = strconv.Itoa(chartPermissionId)
	item.PublishDate = utils.StrTimeToTime(publishDate + " 00:00:00") //时间字符串格式转时间格式
	//处理作者内容的格式信息
	if req.DoType == 1 {
		item.PublishStatus = 1
	}

	itemDepartment := new(cygx.CygxArticleDepartment)
	if req.ArticleId == 0 {
		item.ArticleId = articleIdNew
		//需求修改纪要的新增与修改与报告一致
		_, err := cygx.AddAReportrticle(item, 0, "", "", itemDepartment, industrialManagementIds, industrialSubjectIds)
		if err != nil {
			br.Msg = "发布失败"
			br.ErrMsg = "发布失败,Err:" + err.Error()
			return
		}
	} else {
		articleInfo, err := cygx.GetArticleIdInfoByArticleId(req.ArticleId)
		if err != nil {
			br.Msg = "文章不存在"
			return
		}
		if item.PublishStatus == 0 {
			item.PublishStatus = articleInfo.PublishStatus
		}
		item.ArticleId = req.ArticleId
		err = cygx.EditReportrticle(item, 0, "", "", articleInfo.PublishStatus, itemDepartment, industrialManagementIds, industrialSubjectIds)
		if err != nil {
			br.Msg = "发布失败"
			br.ErrMsg = "发布失败,Err:" + err.Error()
			return
		}
	}
	//if req.DoType == 1 {
	//	go cygxService.DoArticleOnenIdWxTemplateMsg(articleId, 1)
	//}
	//{|1|}表示报告类型,{|2|}表示纪要类型
	//cygx.UpdateSubjecIds(subjectIds+"—"+strconv.Itoa(industrialDetail.IndustrialManagementId)+"{|2|}", industrialDetail.IndustrialManagementId, articleId)
	if item.PublishStatus == 1 {
		services.EsAddOrEditData(item)
		//go cygxService.UpdateResourceData(item.ArticleId, "article", "add", time.Now().Format(utils.FormatDateTime))
		go cygxService.UpdateArticleResourceData(item.ArticleId) //写入首页最新  cygx_resource_data 表
	}

	// 查研观向7.4-更新产业布局时间
	if len(industryIds) > 0 {
		go cygxService.UpdateIndustryLayoutTime(industryIds, false)
	}
	if len(industryIds) > 0 && req.DoType == 1 {
		//查研观向8.2.1专项调研报告模板消息推送
		cygxService.SendWxMsgWithCygxActivitySpecialArticle(item.ArticleId)
	}
	go cygxService.AddCygxReportMappingCategoryGroupByArticleId(item.ArticleId) // 手动修改报告归类
	br.Ret = 200
	br.Success = true
	br.Msg = "操作成功"
	br.IsAddLog = true
}

// @Title  报告详情
// @Description 获取报告详情接口
// @Param   ReportId   query   int  true       "报告ID"
// @Success Ret=200 {object} cygx.CygxArticleReport
// @router /reportArticle/detail [get]
func (this *ReportArticleController) Detail() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	AdminUser := this.SysUser
	if AdminUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,用户信息为空"
		br.Ret = 408
		return
	}
	//reportId, _ := this.GetInt("ReportId")
	//if reportId < 1 {
	//	br.Msg = "请输入报告ID"
	//	return
	//}
	//articleInfo, err := cygx.GetArticleIdInfoByreportIdEdit(reportId)
	//if err != nil {
	//	br.Msg = "报告不存在"
	//	br.ErrMsg = "报告ID错误,Err:" + err.Error()
	//	return
	//}

	articleId, _ := this.GetInt("ArticleId")
	if articleId < 1 {
		br.Msg = "请输入文章ID"
		return
	}
	articleInfo, err := cygx.GetArticleIdInfoByreportIdEdit(articleId)
	if err != nil {
		br.Msg = "文章内容不存在"
		br.ErrMsg = "纪要ID错误,Err:" + err.Error()
		return
	}
	industrialList, err := cygx.GetIndustrialArticleGroupManagementList(articleInfo.ArticleId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取活动关联的产业列表信息失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(articleInfo.ArticleId)
		return
	}
	subjectList, err := cygx.GetSubjectArticleGroupManagementList(articleInfo.ArticleId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取活动关联的标的列表信息失败,Err:" + err.Error() + "activityId:" + strconv.Itoa(articleInfo.ArticleId)
		return
	}
	articleInfo.PublishDate = cygxService.ArticlePublishDate(articleInfo.PublishDate)
	articleInfo.ListIndustrial = industrialList
	articleInfo.ListSubject = subjectList
	if articleInfo.ChartPermissionIds != "" {
		chartPermissionIdArr := strings.Split(articleInfo.ChartPermissionIds, ",")
		if len(chartPermissionIdArr) > 0 {
			articleInfo.ChartPermissionId, _ = strconv.Atoi(chartPermissionIdArr[0])
		}
	}

	if articleId < utils.SummaryArticleId {
		articleInfo.Abstract, _ = cygx.GetReportContentTextSub(articleInfo.Abstract)
		articleInfo.Body = html.UnescapeString(articleInfo.Body)
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = articleInfo
}

// @Title 获取作者列表
// @Description 获取作者列表接口
// @Param   KeyWord   query   string  true       "搜索关键词"
// @Success Ret=200  {object} cygx.CygxArticleDepartmentList
// @router /reportArticle/departmentList [get]
func (this *ReportArticleController) DepartmentList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	var condition string
	keyWord := this.GetString("KeyWord")
	if keyWord != "" {
		condition = `WHERE nick_name LIKE'%` + keyWord + `%'  ORDER BY create_time DESC `
	} else {
		condition += `  ORDER BY create_time DESC`
	}
	list, err := cygx.GetCygxArticleDepartmentList(condition)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	resp := new(cygx.CygxArticleDepartmentList)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 下载客户阅读记录
// @Description 下载客户阅读记录接口
// @Param   CompanyId   query   int  true       "公司ID"
// @Success Ret=200
// @router /reportArticle/companyHistory [get]
func (this *IndustrialSubjectController) CompanyHistory() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	companyId, _ := this.GetInt("CompanyId")
	if companyId < 1 {
		br.Msg = "请输入公司ID"
		return
	}
	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
	var isCanDownload bool
	adminInfo, err := system.GetSysUserById(sysUser.AdminId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	if adminInfo.Role == "admin" || strings.Index(adminInfo.RoleTypeCode, "rai") > -1 {
		isCanDownload = true
	}
	if !isCanDownload {
		br.Msg = "暂无下载权限"
		return
	}
	//获取企业客户信息
	companyInfo, err := company.GetCompanyById(companyId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取企业客户信息失败,Err:" + err.Error()
		return
	}

	mapChartPermissionName := make(map[int]string)

	listMap, err := cygx.GetPermissionMappingCategoryAll()
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	for _, v := range listMap {
		mapChartPermissionName[v.CategoryId] = v.ChartPermissionName
	}

	mobiles, err := models.GetCompanyUserMobilesByCompanyId(companyId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取客户手机号信息失败,Err:" + err.Error()
		return
	}
	if mobiles != "" {
		mobiles = strings.Replace(mobiles, ",", "','", -1)
		mobiles = "'" + mobiles + "'"
	} else {
		mobiles = "'1'"
	}

	emails, err := models.GetCompanyUserEmailsByCompanyId(companyId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取客户邮箱信息失败,Err:" + err.Error()
		return
	}
	if emails != "" {
		emails = strings.Replace(emails, ",", "','", -1)
		emails = "'" + emails + "'"
	} else {
		emails = "'1'"
	}

	list, err := cygx.GetCompanyHistoryRecordNewPv(mobiles, emails)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	for k, v := range list {
		list[k].PermissionName = mapChartPermissionName[v.CategoryId]
	}
	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true
	sheet, err := xlsxFile.AddSheet("客户阅读记录")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	//标头
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "姓名"
	cellB := rowTitle.AddCell()
	cellB.Value = "手机号/邮箱"
	cellC := rowTitle.AddCell()
	cellC.Value = "报告标题"
	cellD := rowTitle.AddCell()
	cellD.Value = "所属行业"
	cellE := rowTitle.AddCell()
	cellE.Value = "所属产业"
	cellF := rowTitle.AddCell()
	cellF.Value = "关联标的"
	cellG := rowTitle.AddCell()
	cellG.Value = "发布时间"
	cellH := rowTitle.AddCell()
	cellH.Value = "阅读时间"
	cellI := rowTitle.AddCell()
	cellI.Value = "阅读时长"

	for _, item := range list {
		row := sheet.AddRow()
		cellA := row.AddCell()
		cellA.Value = item.RealName
		cellB := row.AddCell()
		cellB.Value = item.Mobile
		if item.Mobile == "" {
			cellB.Value = item.Email
		}
		cellC := row.AddCell()
		cellC.Value = item.Title
		cellD := row.AddCell()
		if item.CategoryId == 0 {
			cellD.Value = "研选"
		} else {
			cellD.Value = item.PermissionName
		}
		cellE := row.AddCell()
		cellE.Value = item.IndustryName
		cellF := row.AddCell()
		cellF.Value = item.SubjectNameStr
		cellG := row.AddCell()
		cellG.Value = item.PublishDate
		cellH := row.AddCell()
		cellH.Value = item.CreateTime
		cellI := row.AddCell()
		cellI.Value = item.StopTime
	}
	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
	downloadFileName := companyInfo.CompanyName + "阅读记录" + randStr + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "导出成功"
}

// @Title 客户其他行为数据
// @Description 下载客户其他行为数据接口
// @Param   CompanyId   query   int  true       "公司ID"
// @Success Ret=200
// @router /reportArticle/companyOtherHistory [get]
func (this *IndustrialSubjectController) CompanyOtherHistory() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	companyId, _ := this.GetInt("CompanyId")
	if companyId <= 0 {
		br.Msg = "请选择客户"
		br.ErrMsg = "客户参数错误"
		return
	}
	//获取企业客户信息
	companyInfo, err := company.GetCompanyById(companyId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取企业客户信息失败,Err:" + err.Error()
		return
	}
	var condition string
	var pars []interface{}

	//非管理员,那么只能看到该产品下的联系人
	if sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_ADMIN {
		productId := services.GetProductId(sysUser.RoleTypeCode)
		condition += ` AND b.product_id = ? `
		pars = append(pars, productId)

		//流失客户(除非是超级管理员或者是部门管理员,要不然不允许看对应的联系人)
		var companyProduct *company.CompanyProduct

		if productId == 2 && sysUser.RoleTypeCode != utils.ROLE_TYPE_CODE_RAI_ADMIN {
			// 当前是权益权限,且非 权益管理员
			tmpCompanyProduct, _ := company.GetCompanyProductByCompanyIdAndProductId(companyId, 2)
			companyProduct = tmpCompanyProduct
			if companyProduct != nil && companyProduct.Status == utils.COMPANY_STATUS_LOSE {
				condition += ` AND seller_id=? `
				pars = append(pars, sysUser.AdminId)
			}
		}
	}
	list, err := company.GetCompanyUserListV2(condition, pars, companyId, 0, 1000)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	var userIdstr string
	for _, v := range list {
		userIdstr += strconv.Itoa(int(v.UserId)) + ","
	}
	userIdstr = strings.TrimRight(userIdstr, ",")
	resp := new(cygx.CompanyOtherHistoryListResp)

	condition = `	AND user_id IN (` + userIdstr + `)`
	listArticle, err := cygx.GetArticleCollectList(condition)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	listIndustry, err := cygx.GetCygxIndustryList(companyId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	listDepartment, err := cygx.GetArticleDepartmentList(companyId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}

	//listkeyWord, err := cygx.GetCygxUserSearchKeyWordList(userIdstr)
	//if err != nil {
	//	br.Msg = "获取失败"
	//	br.ErrMsg = "获取数据失败,Err:" + err.Error()
	//	return
	//}

	//listkeyWord, err := cygx.GetCygxUserSearchKeyWordList(userIdstr)
	//if err != nil {
	//	br.Msg = "获取失败"
	//	br.ErrMsg = "获取数据失败,Err:" + err.Error()
	//	return
	//}

	for _, v := range list {
		userItem := new(cygx.CompanyOtherHistoryList)
		var artItems []*cygx.CygxArticleCollect
		var industryItems []*cygx.CygxArticleIndustry
		var departmentItems []*cygx.ArticleDepartment
		//var keyWordItems []*cygx.KeyWord
		for _, vArt := range listArticle {
			if vArt.UserId == int(v.UserId) {
				artItems = append(artItems, vArt)
			}
		}
		for _, vIn := range listIndustry {
			if vIn.UserId == int(v.UserId) {
				industryItems = append(industryItems, vIn)
			}
		}
		for _, vDe := range listDepartment {
			if vDe.UserId == int(v.UserId) {
				departmentItems = append(departmentItems, vDe)
			}
		}
		//for _, vKw := range listkeyWord {
		//	if vKw.UserId == int(v.UserId) {
		//		keyWordItems = append(keyWordItems, vKw)
		//	}
		//}
		if len(artItems) > 0 || len(industryItems) > 0 || len(departmentItems) > 0 {
			userItem.RealName = v.RealName
			userItem.Email = v.Email
			userItem.Mobile = v.Mobile
			userItem.ListArticle = artItems
			userItem.ListIndustrial = industryItems
			userItem.ListDepartment = departmentItems
			//userItem.ListKeyWord = keyWordItems
			resp.List = append(resp.List, userItem)
		}
	}

	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true
	sheet, err := xlsxFile.AddSheet("客户其他行为数据(收藏,关注)")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}

	//标题样式
	titleStyle := xlsx.NewStyle()
	titleFont := xlsx.NewFont(16, "宋体")
	titleFont.Bold = true
	titleStyle.Font = *titleFont
	titleStyle.Alignment = alignment
	sheet.SetColWidth(0, 0, 20)
	sheet.SetColWidth(1, 1, 20)
	sheet.SetColWidth(2, 2, 20)
	sheet.SetColWidth(3, 3, 20)
	sheet.SetColWidth(4, 4, 20)

	titleSonStyle := xlsx.NewStyle()
	titleSonFont := xlsx.NewFont(16, "宋体")
	titleSonFont.Bold = true
	titleSonStyle.Font = *titleSonFont

	for _, item := range resp.List {

		rowTitle := sheet.AddRow()
		//标题列
		titleCell := rowTitle.AddCell()
		titleCell.HMerge = 6 //向右合并列数,不包括自身列
		titleCell.SetValue("客户姓名:" + item.RealName + "      手机号/邮箱:" + item.Mobile)
		titleCell.SetStyle(titleStyle)

		//文章
		if len(item.ListArticle) > 0 {
			rowArticle := sheet.AddRow()
			cellA := rowArticle.AddCell()
			cellA.Value = "收藏报告"
			cellB := rowArticle.AddCell()
			cellB.Value = "收藏时间"
			cellC := rowArticle.AddCell()
			cellC.Value = "发布时间"
			cellD := rowArticle.AddCell()
			cellD.Value = "报告类型"
			cellE := rowArticle.AddCell()
			cellE.Value = "所属产业"
			cellF := rowArticle.AddCell()
			cellF.Value = "关联标的"

			cellA.SetStyle(titleSonStyle)
			cellB.SetStyle(titleSonStyle)
			cellC.SetStyle(titleSonStyle)
			cellD.SetStyle(titleSonStyle)
			cellE.SetStyle(titleSonStyle)
			cellF.SetStyle(titleSonStyle)
			for _, vArt := range item.ListArticle {
				rowArticleVal := sheet.AddRow()
				cellA := rowArticleVal.AddCell()
				cellA.Value = vArt.Title
				cellB := rowArticleVal.AddCell()
				cellB.Value = vArt.CreateTime
				cellC := rowArticleVal.AddCell()
				cellC.Value = vArt.PublishDate
				cellD := rowArticleVal.AddCell()
				cellD.Value = vArt.MatchTypeName
				cellE := rowArticleVal.AddCell()
				cellE.Value = vArt.IndustryName
				cellF := rowArticleVal.AddCell()
				cellF.Value = vArt.SubjectName
			}
		}
		//产业
		if len(item.ListIndustrial) > 0 {
			rowIndustrial := sheet.AddRow()
			cellA := rowIndustrial.AddCell()
			cellA.Value = "关注产业"
			cellB := rowIndustrial.AddCell()
			cellB.Value = "关注时间"

			cellA.SetStyle(titleSonStyle)
			cellB.SetStyle(titleSonStyle)
			for _, vArt := range item.ListIndustrial {
				rowIndustrialVal := sheet.AddRow()
				cellA := rowIndustrialVal.AddCell()
				cellA.Value = vArt.IndustryName
				cellB := rowIndustrialVal.AddCell()
				cellB.Value = vArt.CreateTime
			}
		}
		//作者
		if len(item.ListDepartment) > 0 {
			rowDepartment := sheet.AddRow()
			cellA := rowDepartment.AddCell()
			cellA.Value = "关注作者"
			cellB := rowDepartment.AddCell()
			cellB.Value = "关注时间"
			cellC := rowDepartment.AddCell()
			cellC.Value = "作者相关产业"

			cellA.SetStyle(titleSonStyle)
			cellB.SetStyle(titleSonStyle)
			cellC.SetStyle(titleSonStyle)
			for _, vArt := range item.ListDepartment {
				rowDepartmentVal := sheet.AddRow()
				cellA := rowDepartmentVal.AddCell()
				cellA.Value = vArt.NickName
				cellB := rowDepartmentVal.AddCell()
				cellB.Value = vArt.CreateTime
				cellC := rowDepartmentVal.AddCell()
				cellC.Value = vArt.IndustryName
			}
		}
	}
	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
	downloadFileName := companyInfo.CompanyName + "其他行为数据(收藏,关注)" + randStr + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Data = resp
	br.Success = true
	br.Msg = "导出成功"
}

// @Title 客户阅读量月度统计
// @Description 客户阅读量月度统计
// @Param   CompanyId   query   int  true       "公司ID"
// @Success Ret=200
// @router /reportArticle/companyCount [get]
func (this *IndustrialSubjectController) CompanyCount() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	companyId, _ := this.GetInt("CompanyId")
	if companyId < 1 {
		br.Msg = "请输入公司ID"
		return
	}
	//超级管理员和权益管理员、权益研究员可以下载所有客户,销售组长能下载本组客户,销售只能下载本人名下客户
	var isCanDownload bool
	adminInfo, err := system.GetSysUserById(sysUser.AdminId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	if adminInfo.Role == "admin" || strings.Index(adminInfo.RoleTypeCode, "rai") > -1 {
		isCanDownload = true
	}
	if !isCanDownload {
		br.Msg = "暂无下载权限"
		return
	}
	//获取企业客户信息
	companyInfo, err := company.GetCompanyById(companyId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取企业客户信息失败,Err:" + err.Error()
		return
	}
	mobiles, err := models.GetCompanyUserMobilesByCompanyId(companyId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取客户手机号信息失败,Err:" + err.Error()
		return
	}
	if mobiles != "" {
		mobiles = strings.Replace(mobiles, ",", "','", -1)
		mobiles = "'" + mobiles + "'"
	} else {
		mobiles = "'1'"
	}

	emails, err := models.GetCompanyUserEmailsByCompanyId(companyId)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取信息失败"
		br.ErrMsg = "获取客户邮箱信息失败,Err:" + err.Error()
		return
	}
	if emails != "" {
		emails = strings.Replace(emails, ",", "','", -1)
		emails = "'" + emails + "'"
	} else {
		emails = "'1'"
	}
	listDate, err := cygx.GetCompanyHistoryRecordPvGroupDate(mobiles, emails)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	dateMap := make(map[string]int)
	permissionNameMap := make(map[string]int)
	list, err := cygx.GetCompanyHistoryRecordPv(mobiles, emails)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	for _, v := range list {
		if dateMap[v.CreateTime] == 0 {
			dateMap[v.CreateTime] = 1
		} else {
			dateMap[v.CreateTime] += 1
		}
		if v.CategoryId == 0 {
			v.PermissionName = "研选"
		}

		if permissionNameMap[v.CreateTime+v.PermissionName] == 0 {
			permissionNameMap[v.CreateTime+v.PermissionName] = 1
		} else {
			permissionNameMap[v.CreateTime+v.PermissionName] += 1
		}
	}
	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true
	sheet, err := xlsxFile.AddSheet("客户阅读量月度统计")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	//标头
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "月份"
	cellB := rowTitle.AddCell()
	cellB.Value = "总阅读数"
	cellC := rowTitle.AddCell()
	cellC.Value = "医药"
	cellD := rowTitle.AddCell()
	cellD.Value = "消费"
	cellE := rowTitle.AddCell()
	cellE.Value = "科技"
	cellF := rowTitle.AddCell()
	cellF.Value = "智造"
	cellG := rowTitle.AddCell()
	cellG.Value = "策略"
	cellH := rowTitle.AddCell()
	cellH.Value = "研选"

	for _, item := range listDate {
		row := sheet.AddRow()
		cellA := row.AddCell()
		cellA.Value = item.CreateTimes
		cellB := row.AddCell()
		cellB.Value = strconv.Itoa(dateMap[item.CreateTimes])
		cellC := row.AddCell()
		cellC.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"医药"])
		cellD := row.AddCell()
		cellD.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"消费"])
		cellE := row.AddCell()
		cellE.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"科技"])
		cellF := row.AddCell()
		cellF.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"智造"])
		cellG := row.AddCell()
		cellG.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"策略"])
		cellH := row.AddCell()
		cellH.Value = strconv.Itoa(permissionNameMap[item.CreateTimes+"研选"])
	}
	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
	downloadFileName := companyInfo.CompanyName + "客户阅读量月度统计" + randStr + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "导出成功"
}

// @Title 客户导出文件种类
// @Description 客户导出文件种类接口
// @Success Ret=200  {object} cygx.NameAndUrlList
// @router /company/exportList [get]
func (this *ReportArticleController) ExportList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	detail, err := cygx.GetCygxConfigDetailByCode("export_list")
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	resp := new(cygx.NameAndUrlList)
	exportList := strings.Split(detail.ConfigValue, "{|}")
	for _, v := range exportList {
		item := new(cygx.NameAndUrl)
		vslice := strings.Split(v, "_")
		item.Name = vslice[0]
		item.Url = vslice[len(vslice)-1]
		resp.List = append(resp.List, item)
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 留言列表详情
// @Description 获取留言列表详情接口
// @Param   ArticleId   query   int  true       "文章ID"
// @Success 200 {object} cygx.ArticleCommentListResp
// @router /reportArticle/commentList [get]
func (this *ReportArticleController) CommentList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	articleId, _ := this.GetInt("ArticleId")
	articleInfo, _ := cygx.GetArticleIdInfoByArticleId(articleId)
	if articleInfo == nil {
		br.Msg = "操作失败"
		br.ErrMsg = "报告ID错误"
		return
	}
	list, err := cygx.GetArticleCommentList(articleInfo.ArticleId)
	resp := new(cygx.ArticleCommentListResp)
	if err != nil {
		br.Msg = "获取留言失败"
		br.ErrMsg = "获取留言失败,Err:" + err.Error()
		return
	}
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 提问详情excel表格下载
// @Description 提问详情excel表格下载接口
// @Param   SummaryManageId   query   int  true       "纪要ID"
// @Success 200 导出成功
// @router /reportArticle/commnetListExport [get]
func (this *ReportArticleController) CommentListExport() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	articleId, _ := this.GetInt("ArticleId")
	articleInfo, _ := cygx.GetArticleIdInfoByArticleId(articleId)
	if articleInfo == nil {
		br.Msg = "操作失败"
		br.ErrMsg = "报告ID错误"
		return
	}
	list, err := cygx.GetArticleCommentList(articleInfo.ArticleId)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}
	//创建excel
	dir, err := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	if err != nil {
		br.Msg = "生成文件失败"
		br.ErrMsg = "生成文件失败"
		return
	}
	style := xlsx.NewStyle()
	alignment := xlsx.Alignment{
		Horizontal: "center",
		Vertical:   "center",
		WrapText:   true,
	}
	style.Alignment = alignment
	style.ApplyAlignment = true
	sheet, err := xlsxFile.AddSheet("名单")
	if err != nil {
		br.Msg = "新增Sheet失败"
		br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
		return
	}
	//标头
	rowTitle := sheet.AddRow()
	cellA := rowTitle.AddCell()
	cellA.Value = "姓名"
	cellB := rowTitle.AddCell()
	cellB.Value = "公司名称"
	cellC := rowTitle.AddCell()
	cellC.Value = "留言"
	cellD := rowTitle.AddCell()
	cellD.Value = "提交时间"

	for _, item := range list {
		row := sheet.AddRow()
		cellA := row.AddCell()
		cellA.Value = item.RealName
		cellB := row.AddCell()
		cellB.Value = item.CompanyName
		cellC := row.AddCell()
		cellC.Value = item.Content
		cellD := row.AddCell()
		cellD.Value = item.CreateTime
	}
	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		br.Msg = "保存文件失败"
		br.ErrMsg = "保存文件失败"
		return
	}
	randStr := time.Now().Format(utils.FormatDateTimeUnSpace)
	downloadFileName := "留言列表" + randStr + ".xlsx"
	this.Ctx.Output.Download(downLoadnFilePath, downloadFileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Success = true
	br.Ret = 200
	br.Msg = "导出成功"
}

// @Title 新建报告类型
// @Description 新建报告类型接口
// @Param	request	body cygx.CygxReportMappingCygxAdd true "type json string"
// @Success Ret=200  {object} cygx.CygxReportMappingCygx
// @router /reportMapping/add [post]
func (this *IndustrialSubjectController) ReportMappingAdd() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	var req cygx.CygxReportMappingCygxAdd
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}

	var condition string
	var pars []interface{}
	reportType := req.ReportType
	chartPermissionId := req.ChartPermissionId
	chartPermissionName := req.ChartPermissionName
	matchTypeName := req.MatchTypeName
	condition = ` AND match_type_name = ?  AND chart_permission_id = ? `
	pars = append(pars, matchTypeName, chartPermissionId)
	total, err := cygx.GetCygxReportMappingCygxCount(condition, pars)
	if err != nil {
		br.Msg = "新建报告类型失败"
		br.ErrMsg = "新建报告类型失败,Err:" + err.Error()
		return
	}
	if total > 0 {
		br.Msg = "名称已存在"
		br.ErrMsg = "名称已存在,Err:" + matchTypeName
		return
	}

	maxDeatil, err := cygx.GetCygxReportMappingCelueMaxDetail()
	if err != nil {
		br.Msg = "新建报告类型失败"
		br.ErrMsg = "GetCygxReportMappingCelueMaxDetail,Err:" + err.Error()
		return
	}

	itemCygx := new(cygx.CygxReportMappingCygx)
	itemCygx.ChartPermissionId = chartPermissionId
	itemCygx.ChartPermissionName = chartPermissionName
	itemCygx.MatchTypeName = matchTypeName
	itemCygx.ReportType = reportType
	itemCygx.IsReport = 1
	itemCygx.CreateTime = time.Now()
	itemCygx.ModifyTime = time.Now()

	itemCelue := new(cygx.CygxReportMappingCelue)
	itemCelue.ChartPermissionId = chartPermissionId
	itemCelue.ChartPermissionName = chartPermissionName
	itemCelue.SubCategoryName = matchTypeName
	itemCelue.ReportType = reportType
	itemCelue.IsReport = 1
	itemCelue.CategoryId = maxDeatil.CategoryId + 1
	itemCelue.CreateTime = time.Now()
	itemCelue.ModifyTime = time.Now()

	itemCygxId, err := cygx.AddCygxReportMappingCygx(itemCygx, itemCelue)
	if err != nil {
		br.Msg = "新建报告类型失败"
		br.ErrMsg = "AddCygxReportMappingCygx,Err:" + err.Error()
		return
	}
	resp := new(cygx.CygxReportMappingCygx)
	resp.Id = int(itemCygxId)
	resp.MatchTypeName = matchTypeName

	br.Ret = 200
	br.Success = true
	br.Data = resp
	br.Msg = "分类成功"
	br.IsAddLog = true
}