package models

import (
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	"hongze/hongze_cygx/utils"
	"strconv"
	"strings"
	"time"
)

type IndustrialManagementRep struct {
	IndustryName           string `description:"产业名称"`
	IndustrialManagementId int    `description:"产业id"`
	ChartPermissionId      int    `description:"权限id"`
	RecommendedIndex       int    `description:"推荐指数"`
	LayoutTime             string `description:"布局时间"`
	ArticleReadNum         int    `description:"文章阅读数量"`
	IsResearch             bool   `description:"是否属于研选"`
	IsJump                 bool   `description:"是否跳转"`
	IndustryNewLabel       bool   `description:"是否产业新标签"`
}

// 列表
func GetIndustrialManagementRepList(condition string, pars []interface{}, startSize, pageSize int) (items []*IndustrialManagementRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_industrial_management as art WHERE 1= 1 `
	if condition != "" {
		sql += condition
	}
	sql += ` LIMIT ?,?  `
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}

type IndustrialManagementCount struct {
	IndustrialManagementId int `orm:"column(industrial_management_id);pk" description:"产业id"`
}

// 获取产业置顶数量分类列表
func GetIndustrialManagemenCountTop(sqlChartPermissionId string, uid int, condition string) (items []*IndustrialManagementCount, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			man_g.industrial_management_id 
			FROM
			cygx_industrial_article_group_management AS man_g
			INNER JOIN cygx_industrial_management as man ON man.industrial_management_id = man_g.industrial_management_id
			WHERE 1=1 ` + sqlChartPermissionId + `
			AND man_g.industrial_management_id IN ( SELECT industrial_management_id FROM cygx_industry_top WHERE user_id = ? ) ` + condition + `
			GROUP BY
			man_g.industrial_management_id`
	_, err = o.Raw(sql, uid).QueryRows(&items)
	return
}

// 获取产业不置顶数量
func GetIndustrialManagemenCountNoTop(sqlChartPermissionId string, uid int, condition string) (items []*IndustrialManagementCount, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			man_g.industrial_management_id 
			FROM
			cygx_industrial_article_group_management AS man_g
			INNER JOIN cygx_industrial_management as man ON man.industrial_management_id = man_g.industrial_management_id
			WHERE 1=1 ` + sqlChartPermissionId + `
			AND man_g.industrial_management_id NOT IN ( SELECT industrial_management_id FROM cygx_industry_top WHERE user_id = ? ) ` + condition + `
			GROUP BY
			man_g.industrial_management_id`
	_, err = o.Raw(sql, uid).QueryRows(&items)
	return
}

// 产业列表
func GetIndustrialManagementAll(uid int, condition, orderSrt string, startSize, pageSize int) (items []*IndustrialManagement, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			man.*,re.chart_permission_name as permission_name,
			MAX(art.article_id ) AS article_id, 
           	man.new_art_publish_date AS update_time , MIN(art.publish_date) AS min_report_time,(
			SELECT COUNT( 1 ) FROM cygx_article_history_record AS rec WHERE rec.user_id = ` + strconv.Itoa(uid) + ` AND rec.article_id = art.article_id ) AS readnum ,
		    (SELECT COUNT( 1 )  FROM cygx_industry_fllow AS f WHERE f.user_id = ` + strconv.Itoa(uid) + ` AND f.industrial_management_id = man.industrial_management_id AND f.type = 1) AS is_follow
			FROM
			cygx_industrial_management AS man
			INNER JOIN cygx_report_mapping AS re ON re.chart_permission_id = man.chart_permission_id
			INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.industrial_management_id = man.industrial_management_id
			INNER JOIN cygx_article AS art ON art.article_id = man_g.article_id 
			WHERE 1= 1
			AND re.report_type = 2 
			AND art.is_report = 1
			AND art.is_class = 1 ` + condition + `
			GROUP BY
			man.industry_name 
			ORDER BY ` + orderSrt + ` LIMIT ?,?`
	//AND man.industrial_management_id NOT IN ( SELECT industrial_management_id FROM cygx_industry_top WHERE user_id = ` + strconv.Itoa(uid) + ` )
	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
	return
}

// 产业列表
func GetIndustrialManagementAllCount(condition string) (count int, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			COUNT(*) as count 
		FROM
			(SELECT
			COUNT(*) 
		FROM
			cygx_industrial_management AS man
			INNER JOIN cygx_report_mapping AS re ON re.chart_permission_id = man.chart_permission_id
			INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.industrial_management_id = man.industrial_management_id
			INNER JOIN cygx_article AS art ON art.article_id = man_g.article_id 
		WHERE
			1 = 1 
			AND re.report_type = 2 
			AND art.is_report = 1 
			AND art.is_class = 1 ` + condition + ` GROUP BY man.industrial_management_id) AS num `
	err = o.Raw(sql).QueryRow(&count)
	return
}

// 产业列表 -置顶
func GetIndustrialManagementTopAll(uid int, condition string, startSize, pageSize int) (items []*IndustrialManagement, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			man.*
			FROM
			cygx_industrial_management AS man
            INNER  JOIN cygx_industry_top as top ON man.industrial_management_id = top.industrial_management_id 
			INNER JOIN cygx_report_mapping AS re ON re.chart_permission_id = man.chart_permission_id
			INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.industrial_management_id = man.industrial_management_id
			INNER JOIN cygx_article AS art ON art.article_id = man_g.article_id 
			WHERE 1=1
	
			AND top.user_id = ` + strconv.Itoa(uid) + `
			AND re.report_type = 2 
			AND art.is_report = 1
			AND art.is_class = 1 ` + condition + `
			GROUP BY
			man.industry_name 
			ORDER BY
			top.create_time DESC 	LIMIT ?,?`
	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
	return
}

// 标的列表
func GetIndustrialSubjectAll(IndustrialManagementId int) (items []*IndustrialSubject, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_management_id = ? `
	_, err = o.Raw(sql, IndustrialManagementId).QueryRows(&items)
	return
}

// 标的列表
func GetIndustrialSubjectAllByIndustrialId(industrialIdArr []int) (items []*IndustrialSubject, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_management_id IN  (` + utils.GetOrmInReplace(len(industrialIdArr)) + `)   `
	_, err = o.Raw(sql, industrialIdArr).QueryRows(&items)
	return
}

// GetTopOneMonthArtReadNumIndustry 获取近一个月报告阅读数量最多的产业信息 根据行业分组
func GetTopOneMonthArtReadNumIndustryAll(condition string, pars []interface{}) (items []*IndustrialManagement, err error) {
	sql := `SELECT * FROM cygx_industrial_management WHERE 1 = 1 `
	if condition != `` {
		sql += condition
	}
	sql += ` ORDER BY article_read_num DESC `
	_, err = orm.NewOrm().Raw(sql, pars).QueryRows(&items)
	return
}

// 分析师列表
func GetIndustrialAnalystAll(IndustrialManagementId int) (items []*IndustrialAnalyst, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_industrial_analyst where industrial_management_id = ? `
	_, err = o.Raw(sql, IndustrialManagementId).QueryRows(&items)
	return
}

// 获取产业数量
func GetIndustrialManagementCount(IndustrialManagementId int) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_industrial_management WHERE industrial_management_id=? `
	o := orm.NewOrm()
	err = o.Raw(sqlCount, IndustrialManagementId).QueryRow(&count)
	return
}

func GetIndustrialManagementDetail(industrialManagementId int) (items *IndustrialManagementRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_industrial_management WHERE industrial_management_id = ?`
	err = o.Raw(sql, industrialManagementId).QueryRow(&items)
	return
}

// 获取该产业下最新的文章详情
func GetIndustrialNewArticleDetail(industrialManagementId int) (item *ArticleDetail, err error) {
	o := orm.NewOrm()
	sql := `SELECT
				*
			FROM
				cygx_article
			WHERE
				article_id IN (
					SELECT
						article_id
					FROM
						cygx_industrial_article_group_management
					WHERE
						industrial_management_id = ?
				)
			AND is_class = 1 AND is_report = 1
			ORDER BY
				is_report DESC,
				publish_date DESC
			LIMIT 0,1`
	err = o.Raw(sql, industrialManagementId).QueryRow(&item)
	return
}

// 修改产业是否属于新标签
func UpdateIndustrialIsNewLabel() (err error) {
	o := orm.NewOrm()
	resultTime := time.Now().AddDate(0, -2, 0).Format(utils.FormatDateTime)
	var condition string
	condition += ` AND is_hand_new_label = 0 AND  create_time < ` + "'" + resultTime + "'"
	msql := " UPDATE cygx_industrial_management SET is_new_label = 0 WHERE 1 = 1 " + condition
	_, err = o.Raw(msql).Exec()
	return
}

type IndustrialManagementId struct {
	IndustrialManagementId string `description:"产业Id"`
}

type IndustrialManagementName struct {
	IndustryName string `description:"产业名称"`
}

// 获取归类产业报告数量大于10的
func GetIndustrialMorethan10() (items []*IndustrialManagementId, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM
			( SELECT industrial_management_id, COUNT( 1 ) AS ca FROM cygx_industrial_article_group_management GROUP BY industrial_management_id ) AS na 
			WHERE ca > 10 `
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 修改产业是否属于深度标签
func UpdateIndustrialIsDeepLabel(idStr string) (err error) {
	o := orm.NewOrm()
	msql := `UPDATE cygx_industrial_management
	SET is_deep_label = 1
	WHERE
	industrial_management_id IN (
		SELECT
	a.industrial_management_id
	FROM
	cygx_industrial_article_group_management AS a
	INNER JOIN cygx_article AS b ON b.id = a.cygx_article_id
	WHERE
	1 = 1
	AND b.match_type_name = '行业深度'
	AND a.industrial_management_id IN ( ` + idStr + `)
	GROUP BY
	a.industrial_management_id)`
	_, err = o.Raw(msql).Exec()
	return
}

type IndustrialManagementIdInt struct {
	IndustrialManagementId int    `description:"产业Id"`
	IndustryName           string `description:"产业名称"`
	SubjectName            string `description:"标的名称"`
	ArticleId              int    `description:"文章ID"`
	IsResearch             bool   `description:"是否属于研选"`
	ChartPermissionId      int    `description:"权限id"`
}

type IndustrialManagementIdInts struct {
	IndustrialManagementId  int    `description:"产业Id"`
	IndustryName            string `description:"产业名称"`
	SubjectNames            string `description:"标的名称"`
	ArticleId               int    `description:"文章ID"`
	IndustrialAndSubjectIds string `description:"关联标的以及产业ID"`
}

type IndustrialManagementIdName struct {
	DepartmentId int    `description:"作者ID"`
	ArticleId    int    `description:"文章id"`
	IndustryName string `description:"产业名称"`
	SubjectName  string `description:"标的名称"`
	IsReport     string `description:"1观点,0纪要"`
}

// 获取归类产业报告数量大于10的
func GetIndustrialManagementIds() (items []*IndustrialManagementIdInt, err error) {
	o := orm.NewOrm()
	//sql := `SELECT a.industrial_management_id FROM
	//		cygx_industrial_management AS a
	//		INNER JOIN cygx_industrial_subject as b ON b.industrial_management_id=a.industrial_management_id
	//		WHERE b.industrial_subject_id > 0
	//		GROUP BY a.industrial_management_id `

	sql := `SELECT industrial_management_id,industry_name FROM cygx_industrial_management `
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func GetcygxIndustrialSubject(industrialManagementId int) (items []*IndustrialSubject, err error) {
	o := orm.NewOrm()
	sql := `SELECT subject_name,industrial_subject_id FROM cygx_industrial_subject  WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, industrialManagementId).QueryRows(&items)
	return
}

// 通过名称获取
func GetcygxIndustrialSubjectByName(name string) (industrial_management_id string, err error) {
	o := orm.NewOrm()
	sql := `	SELECT industrial_subject_id FROM cygx_industrial_subject  WHERE subject_name = ?`
	err = o.Raw(sql, name).QueryRow(&industrial_management_id)
	return
}

func UpdateIndustrialManagementSubjectNames(nameStr string, industrialManagementId int) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE cygx_industrial_management SET subject_names = ? WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, nameStr, industrialManagementId).Exec()
	return
}

// 处理每个产业下所关联的文章的阅读量  start
func IndustrialManagementAll() (items []*IndustrialManagement, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_industrial_management `
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func GetIndustrialManagementArtCount(industrialManagementId int) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count  
	 			FROM  cygx_article_history_record_newpv AS h
				INNER JOIN cygx_industrial_article_group_management as mg ON  mg.article_id = h.article_id
				WHERE mg.industrial_management_id = ?  AND DATE_SUB( CURDATE(), INTERVAL 30 DAY ) <= date( h.create_time ) `
	o := orm.NewOrm()
	err = o.Raw(sqlCount, industrialManagementId).QueryRow(&count)
	return
}

type IndustrialManagementArtHistoryCount struct {
	IndustrialManagementId int `description:"产业id"`
	Count                  int `description:"数量"`
}

func GetIndustrialManagementArtHistoryCount(condition string) (items []*IndustrialManagementArtHistoryCount, err error) {
	sql := `SELECT
				COUNT( 1 ) AS count,
				mg.industrial_management_id 
			FROM
				cygx_article_history_record_newpv AS h
				INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = h.article_id
				INNER JOIN cygx_article AS a ON a.article_id = h.article_id 
			WHERE
				1 = 1 
				AND DATE_SUB( CURDATE(), INTERVAL 30 DAY ) <= date( h.create_time )  ` + condition + `
			GROUP BY
				mg.industrial_management_id `
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func GetIndustrialManagementActivityHistoryCount() (items []*IndustrialManagementArtHistoryCount, err error) {
	sql := `SELECT
			COUNT( 1 ) AS count,
			mg.industrial_management_id 
		FROM
			cygx_activity_meet_detail_log AS h
			INNER JOIN cygx_industrial_activity_group_management AS mg ON mg.activity_id = h.activity_id
			INNER JOIN cygx_activity AS a ON a.activity_id = h.activity_id 
		WHERE
			1 = 1 
			AND DATE_SUB( CURDATE(), INTERVAL 30 DAY ) <= date( a.activity_time ) 
		GROUP BY
			mg.industrial_management_id `
	o := orm.NewOrm()
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func UpdateIndustrialManagementArtticleReadNum() (err error) {
	o := orm.NewOrm()
	sql := `UPDATE cygx_industrial_management SET article_read_num = 0 ,yanxuan_article_read_num = 0 ,activity_num = 0  `
	_, err = o.Raw(sql).Exec()
	return
}

func UpdateIndustrialManagementArtReadNum(num, industrialManagementId int) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE cygx_industrial_management SET article_read_num = ? WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, num, industrialManagementId).Exec()
	return
}

func UpdateIndustrialManagementArtYanXuanReadNum(num, industrialManagementId int) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE cygx_industrial_management SET yanxuan_article_read_num = ? WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, num, industrialManagementId).Exec()
	return
}

func UpdateIndustrialManagementActivityNum(num, industrialManagementId int) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE cygx_industrial_management SET activity_num = ? WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, num, industrialManagementId).Exec()
	return
}

// 更新产业布局时间
func UpdateIndustrialManagementLayoutTime(layoutTime string, industrialManagementId int) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE cygx_industrial_management SET layout_time = ? WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, layoutTime, industrialManagementId).Exec()
	return
}

// 获取产业下阅读数量第三的产业详情
func GetIndustrialManagementHot3(chartPermissionId int) (item *IndustrialManagementRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_industrial_management WHERE chart_permission_id = ? ORDER BY article_read_num DESC LIMIT 2,1`
	err = o.Raw(sql, chartPermissionId).QueryRow(&item)
	return
}

// 获取产业关联标的的数量
func GetIndustrialManagementSubjectCount(industrialManagementId int) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count FROM
				cygx_industrial_subject AS s 
				INNER JOIN cygx_industrial_article_group_subject as sg ON sg.industrial_subject_id = s.industrial_subject_id
				INNER JOIN cygx_article as a ON a.article_id = sg.article_id
				WHERE a.industrial_management_id = ?
				AND a.publish_status = 1`
	o := orm.NewOrm()
	err = o.Raw(sqlCount, industrialManagementId).QueryRow(&count)
	return
}

// 获取产业关联标的列表
func GetIndustrialManagementSubjectList(articleId int) (items []*IndustrialSubject, err error) {
	o := orm.NewOrm()
	sql := `SELECT
	s.subject_name 
FROM
	cygx_industrial_subject AS s
	INNER JOIN cygx_industrial_article_group_subject AS sg ON sg.industrial_subject_id = s.industrial_subject_id
	INNER JOIN cygx_article AS a 
WHERE
	sg.article_id = ? 
	AND a.publish_status = 1 
GROUP BY
	s.industrial_subject_id 
ORDER BY
	sg.id ASC 
	LIMIT 4`
	_, err = o.Raw(sql, articleId).QueryRows(&items)
	return
}

type IndustrialManagementNewResp struct {
	IndustrialManagementId int    `description:"产业Id"`
	IndustryName           string `description:"产业名称"`
	IsHot                  bool   `description:"是否是热门"`
	ArticleReadNum         int    `description:"文章阅读数量"`
}

type IndustrialManagementNewList struct {
	List []*IndustrialManagementNewResp
}

// 近期更新主题列表
func GetIndustrialManagementNewList(condition string) (items []*IndustrialManagementNewResp, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			m.industrial_management_id,
			m.industry_name,
			m.article_read_num,
			MAX( a.publish_date ) AS publish_date 
		FROM
			cygx_article AS a
			INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id 
		WHERE
			1 = 1
			AND a.article_type_id > 0
			AND publish_status = 1 ` + condition + `
		GROUP BY
			m.industrial_management_id 
		ORDER BY
			publish_date DESC LIMIT 12`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 获取产业关联标的列表
func GetIndustrialManagementForSubjecName(subjectName string, chartPermissionId int) (items []*IndustrialSubject, err error) {
	o := orm.NewOrm()
	sql := `SELECT s.subject_name,s.industrial_subject_id,m.industrial_management_id,m.industry_name,layout_time
			FROM cygx_industrial_subject as s 
			INNER JOIN cygx_industrial_management as m ON m.industrial_management_id = s.industrial_management_id
			WHERE subject_name IN (` + subjectName + `) AND m.chart_permission_id = ? `
	_, err = o.Raw(sql, chartPermissionId).QueryRows(&items)
	return
}

// 报告分类的新增与修改
func ReportArticleClassificationEditNew(reportId int, industrialManagementIdStr string, articleId int, ndustrialSubjectIdStr string) (err error) {
	to, err := orm.NewOrm().Begin()
	if err != nil {
		return
	}
	defer func() {
		fmt.Println(err)
		if err == nil {
			to.Commit()
		} else {
			to.Rollback()
		}
	}()
	//修改文章是否过滤字段
	sql := `UPDATE cygx_article SET is_filter=0,  is_class=1 WHERE article_id=? `
	_, err = to.Raw(sql, articleId).Exec()
	if err != nil {
		return
	}
	//删除文章关联标的
	sql = `	DELETE FROM cygx_industrial_article_group_subject WHERE article_id = ?`
	fmt.Println(articleId)
	_, err = to.Raw(sql, articleId).Exec()
	if err != nil {
		return
	}
	//添加文章关联标的
	if ndustrialSubjectIdStr != "0" && ndustrialSubjectIdStr != "" {
		strList := strings.Split(ndustrialSubjectIdStr, ",")
		for _, v := range strList {
			sql := `INSERT INTO cygx_industrial_article_group_subject ( cygx_article_id, article_id, industrial_subject_id, create_time ) VALUES ( ?, ?, ?, ? )`
			_, err = to.Raw(sql, reportId, articleId, v, time.Now()).Exec()
			if err != nil {
				return
			}
		}
	}
	//删除文章关联行业 (避免截断表时产生的脏数据,故不用update而是先删除再增加)
	sql = `	DELETE FROM cygx_industrial_article_group_management WHERE article_id = ?`
	_, err = to.Raw(sql, articleId).Exec()
	if err != nil {
		return
	}
	//添加文章关联行业
	industrialStrList := strings.Split(industrialManagementIdStr, ",")
	for _, v := range industrialStrList {
		sql = `	INSERT INTO cygx_industrial_article_group_management ( cygx_article_id, article_id, industrial_management_id, create_time ) VALUES ( ?, ?, ?, ? )`
		_, err = to.Raw(sql, reportId, articleId, v, time.Now()).Exec()
		if err != nil {
			return
		}
	}
	return
}

// 通过标的名称获取相关联的活动ID
func GetActivityIdListBySubjecName(subjectName string) (items []*ActivityIdRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT  * FROM cygx_industrial_activity_group_subject WHERE industrial_subject_id	 IN (SELECT industrial_subject_id FROM cygx_industrial_subject WHERE subject_name IN(` + subjectName + `) ) GROUP BY activity_id`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 产业关注榜
func GetIndustrialManagementFllowBillboard(pars []interface{}, condition, orderSrt string, startSize, pageSize int) (items []*IndustrialManagement, err error) {
	o := orm.NewOrm()
	sql := `SELECT
				man.* 
			FROM
				cygx_industrial_management AS man
				INNER JOIN cygx_report_mapping AS re ON re.chart_permission_id = man.chart_permission_id
				INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.industrial_management_id = man.industrial_management_id
				INNER JOIN cygx_article AS art ON art.article_id = man_g.article_id 
			WHERE
				1 = 1 
				AND re.report_type = 2 
				AND art.is_report = 1 
				AND art.is_class = 1 
				AND art.publish_status = 1 ` + condition + ` GROUP BY man.industrial_management_id  ORDER BY ` + orderSrt + ` LIMIT ?,?`
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}

// 获取标的列表
func GetSubjectList(pars []interface{}, condition string) (items []*IndustrialManagementIdInt, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			subject_name,
			s.industrial_management_id 
		FROM
			cygx_industrial_subject AS s
			INNER JOIN cygx_industrial_article_group_subject AS sg ON sg.industrial_subject_id = s.industrial_subject_id 
		WHERE
			1 = 1 ` + condition + `
		GROUP BY
			s.industrial_subject_id`
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

// 获取标的列表
func GetIndustrialListByarticleId(pars []interface{}, condition string) (items []*IndustrialManagementIdInt, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			mg.article_id,
			m.industry_name,
			mg.industrial_management_id 
		FROM
			cygx_industrial_management AS m
			INNER JOIN cygx_industrial_article_group_management AS mg ON mg.industrial_management_id = m.industrial_management_id 
		WHERE
			1 = 1  ` + condition + ` GROUP BY  mg.article_id,	mg.industrial_management_id `
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}

// 修改产业关注数量
func UpdateIndustrialManagementFllowNum(num, industrialManagementId int) (err error) {
	o := orm.NewOrm()
	sql := `UPDATE cygx_industrial_management SET user_fllow_num = ? WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, num, industrialManagementId).Exec()
	return
}

// 通过id 获取详情
func GetIndustrialManagemenDetailByAaticleID(articleId int) (items []*IndustrialManagementRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			article_id,
			m.industrial_management_id,
			industry_name 
		FROM
			cygx_industrial_article_group_management AS mg
			INNER JOIN cygx_industrial_management AS m ON mg.industrial_management_id = m.industrial_management_id 
		WHERE
			mg.article_id = ?  GROUP BY mg.industrial_management_id `
	_, err = o.Raw(sql, articleId).QueryRows(&items)
	return
}

// 获取所有的产业
func GetindustrialManagement() (items []*IndustrialManagementRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			i.* 
		FROM
			cygx_industrial_management AS i
			INNER JOIN cygx_industrial_article_group_management AS m ON m.industrial_management_id = i.industrial_management_id 
		GROUP BY
			i.industrial_management_id `
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// GetActiveArticleIndustryIds 获取有已归类行业报告的行业IDs
func GetActiveArticleIndustryIds() (ids []int, err error) {
	sql := `SELECT
				man.industrial_management_id
			FROM
				cygx_industrial_management AS man
			JOIN cygx_report_mapping AS re ON re.chart_permission_id = man.chart_permission_id
			JOIN cygx_industrial_article_group_management AS man_g ON man_g.industrial_management_id = man.industrial_management_id
			JOIN cygx_article AS art ON art.article_id = man_g.article_id
			WHERE
				1 = 1 AND re.report_type = 2 AND art.is_report = 1 AND art.is_class = 1 AND art.publish_status = 1
			GROUP BY
				man.industrial_management_id`
	_, err = orm.NewOrm().Raw(sql).QueryRows(&ids)
	return
}

// GetTopOneMonthArtReadNumIndustry 获取近一个月报告阅读数量最多的产业信息
func GetTopOneMonthArtReadNumIndustry(condition string, pars []interface{}) (item *IndustrialManagement, err error) {
	sql := `SELECT * FROM cygx_industrial_management WHERE 1 = 1 `
	if condition != `` {
		sql += condition
	}
	sql += ` ORDER BY article_read_num DESC LIMIT 1`
	err = orm.NewOrm().Raw(sql, pars).QueryRow(&item)
	return
}

// GetSourceIndustryByName 通过名称获取资源包产业
func GetSourceIndustryByName(industryName string) (item *IndustrialManagement, err error) {
	sql := `SELECT
				m.industry_name,
				m.industrial_management_id,
				m.chart_permission_id
			FROM
				cygx_industrial_management AS m
			INNER JOIN cygx_industrial_article_group_management AS mg ON mg.industrial_management_id = m.industrial_management_id
			INNER JOIN cygx_article AS a ON a.article_id = mg.article_id AND a.article_type != 'lyjh'
			WHERE
				1 = 1 AND m.industry_name = ? AND a.publish_status = 1 AND a.article_id < 1000000
			GROUP BY
				m.industrial_management_id`
	err = orm.NewOrm().Raw(sql, industryName).QueryRow(&item)
	return
}

// GetIndustryByName 通过名称获取产业
func GetIndustryByName(industryName string) (item *IndustrialManagement, err error) {
	sql := `SELECT * FROM cygx_industrial_management WHERE industry_name = ? LIMIT 1`
	err = orm.NewOrm().Raw(sql, industryName).QueryRow(&item)
	return
}

type IndustrialManagementArticle struct {
	IndustrialManagementId int    `description:"产业Id"`
	IndustryName           string `description:"产业名称"`
	ArticleId              int    `description:"文章ID"`
	PublishDate            string `description:"发布时间"`
}

// 时间线的更新时间
func GetTimeLineReportIndustrialPublishdateList(industrialIdArr []int) (items []*IndustrialManagementArticle, err error) {
	if len(industrialIdArr) == 0 {
		return
	}
	o := orm.NewOrm()
	sql := `SELECT	
			mmc.id,
			0,
			mmc.industry_id AS industrial_management_id,			
			mmc.content AS title,
			MAX( mm.meeting_time ) AS publish_date 
		FROM
			cygx_morning_meeting_review_chapter AS mmc
			INNER JOIN cygx_morning_meeting_reviews AS mm 
		WHERE
			mm.id = mmc.meeting_id 
			AND mm.STATUS = 1 
			AND mmc.industry_id IN (` + utils.GetOrmInReplace(len(industrialIdArr)) + `)
		GROUP BY industrial_management_id ORDER BY publish_date DESC  `
	_, err = o.Raw(sql, industrialIdArr).QueryRows(&items)
	return
}

// 获取该产业下最新的文章详情
func GetNewArticleDetailByIndustrialIds(industrialIdArr []int) (items []*IndustrialManagementArticle, err error) {
	arrLen := len(industrialIdArr)
	if arrLen == 0 {
		return
	}
	o := orm.NewOrm()
	sql := `SELECT
			mg.industrial_management_id,
			MAX( a.article_id ) AS article_id,
			a.title,
			MAX( a.publish_date ) AS publish_date 
		FROM
			cygx_industrial_article_group_management AS mg
			INNER JOIN cygx_article AS a ON mg.article_id = a.article_id 
		WHERE
			1 = 1
			AND a.is_report = 1
			AND a.is_class = 1
			AND mg.industrial_management_id IN(` + utils.GetOrmInReplace(len(industrialIdArr)) + `)   
		GROUP BY
			mg.industrial_management_id `
	_, err = o.Raw(sql, industrialIdArr).QueryRows(&items)
	return
}

// 获取该产业下最新的产品内测详情
func GetNewProductInteriorByIndustrialIds(industrialIdArr []int) (items []*IndustrialManagementArticle, err error) {
	arrLen := len(industrialIdArr)
	if arrLen == 0 {
		return
	}
	o := orm.NewOrm()
	sql := `SELECT
			mg.industrial_management_id,
			MAX( a.product_interior_id ) AS article_id,
			a.title,
			MAX( a.publish_time ) AS publish_date 
		FROM
			cygx_product_interior_industrial_group_management AS mg
			INNER JOIN cygx_product_interior AS a ON mg.product_interior_id = a.product_interior_id 
		WHERE
			1 = 1 
			AND a.STATUS = 1 
			AND a.visible_range = 1 
			AND mg.industrial_management_id IN(` + utils.GetOrmInReplace(len(industrialIdArr)) + `)   
		GROUP BY
			mg.industrial_management_id`
	_, err = o.Raw(sql, industrialIdArr).QueryRows(&items)
	return
}

// GetIndustrialManagementArticleNewPublishData 获取产业关联文章的最新发布时间
func GetIndustrialManagementArticleNewPublishData() (items []*IndustrialManagement, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			man.industrial_management_id,
			MAX( art.publish_date ) AS update_time 
		FROM
			cygx_industrial_management AS man
			INNER JOIN cygx_report_mapping AS re ON re.chart_permission_id = man.chart_permission_id
			INNER JOIN cygx_industrial_article_group_management AS man_g ON man_g.industrial_management_id = man.industrial_management_id
			INNER JOIN cygx_article AS art ON art.article_id = man_g.article_id 
		WHERE
			1 = 1 
			AND re.report_type = 2 
			AND art.is_report = 1 
			AND art.is_class = 1 
		GROUP BY
			man.industry_name 
		ORDER BY
			update_time DESC`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// UpdateIndustrialManagementArticleNewPublishData 批量修改获取产业关联文章的最新发布时间
func UpdateIndustrialManagementArticleNewPublishData(items map[int]string) (err error) {
	o := orm.NewOrm()
	p, err := o.Raw("UPDATE cygx_industrial_management SET new_art_publish_date = ? WHERE industrial_management_id = ?").Prepare()
	if err != nil {
		return
	}
	defer func() {
		_ = p.Close() // 别忘记关闭 statement
	}()
	for k, v := range items {
		_, err = p.Exec(v, k)
		if err != nil {
			return
		}
	}
	return
}

// UpdateIndustrialManagementInit 初始化每月产业用户关注数量
func UpdateIndustrialManagementInit() (err error) {
	o := orm.NewOrm()
	sql := `UPDATE cygx_industrial_management SET one_month_follow_num = 0 `
	_, err = o.Raw(sql).Exec()
	return
}

// UpdateIndustrialManagementOneMonthFollowNumMulti  批量修改每月产业用户关注数量
func UpdateIndustrialManagementOneMonthFollowNumMulti(items []*CygxIndustryFllowNumResp) (err error) {
	o := orm.NewOrm()
	p, err := o.Raw(` UPDATE cygx_industrial_management SET one_month_follow_num = ? WHERE industrial_management_id = ?  `).Prepare()
	if err != nil {
		return
	}
	defer func() {
		_ = p.Close() // 别忘记关闭 statement
	}()
	for _, v := range items {
		_, err = p.Exec(
			v.Total,
			v.IndustrialManagementId)
		if err != nil {
			return
		}
	}
	return
}