Преглед изворни кода

Merge branch 'master' of http://8.136.199.33:3000/eta_server/eta_mobile into bzq/lib_record

zqbao пре 6 месеци
родитељ
комит
aaa686ae4b

+ 46 - 0
controllers/data_manage/edb_info.go

@@ -1755,6 +1755,52 @@ func (this *EdbInfoController) EdbInfoSearch() {
 			searchItem.Frequency = indexInfo.Frequency
 			searchItem.Unit = indexInfo.Unit
 			searchItem.EdbName = indexInfo.IndexName
+		} else if source == utils.DATA_SOURCE_SCI_HQ {
+			dataItems, err := data_manage.GetEdbDataAllByEdbCode(edbCode, source, subSource, utils.EDB_DATA_LIMIT)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取SCIHQ已存在信息失败,Err:" + err.Error()
+				return
+			}
+
+			fmt.Println("dataItems:", len(dataItems))
+			if len(dataItems) > 0 {
+				searchItem.EdbCode = edbCode
+				minDate, maxDate, err := data_manage.GetEdbDataSciHqMaxAndMinDate(edbCode)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取SCIHQ日期信息失败,Err:" + err.Error()
+					return
+				}
+				searchItem.DataList = dataItems
+				searchItem.StartDate = minDate
+				searchItem.EndDate = maxDate
+			} else {
+				respItem, err := data.AddEdbData(source, edbCode, frequency)
+				if err != nil {
+					br.Msg = "获取失败"
+					br.ErrMsg = "获取失败,Err:" + err.Error()
+					return
+				}
+				if respItem.Ret != 200 {
+					br.Msg = "未搜索到该指标"
+					br.ErrMsg = respItem.ErrMsg + ";EdbCode:" + edbCode
+					return
+				}
+				isAdd = true
+			}
+			//获取指标信息
+			sciHqInfo, err := data_manage.GetSciHqIndexByIndexCode(edbCode)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取SciHq指标详情失败,Err:" + err.Error()
+				return
+			}
+			if sciHqInfo != nil {
+				searchItem.Frequency = sciHqInfo.Frequency
+				searchItem.Unit = sciHqInfo.Unit
+				searchItem.EdbName = sciHqInfo.IndexName
+			}
 		} else {
 			// 代码中没有的来源那么从edb_source中找是否有对应的
 			sourceItem := data_manage.EdbSourceIdMap[source]

+ 43 - 0
controllers/data_manage/manual.go

@@ -0,0 +1,43 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/controllers"
+	"eta/eta_mobile/models"
+	"eta/eta_mobile/services/data"
+)
+
+// 手工数据管理
+type ManualController struct {
+	controllers.BaseAuthController
+}
+
+// @Title 手工数据权限用户搜索
+// @Description 手工数据权限用户搜索
+// @Param   KeyWord   query   string  false       "关键词搜索"
+// @Success 200 {object} data_manage.ManualSysUser
+// @router /manual/sysuser/search [get]
+func (this *ManualController) ManualSysUserSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.Ret = 408
+		return
+	}
+	keyWord := this.GetString("KeyWord")
+	list, err := data.GetManualSysUser(keyWord)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+

+ 37 - 0
controllers/ppt_v2_group.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"eta/eta_mobile/models"
 	"eta/eta_mobile/services/ppt"
+	"strings"
 )
 
 type PptV2GroupController struct {
@@ -535,3 +536,39 @@ func (this *PptV2GroupController) PptList() {
 	br.Data = data
 	return
 }
+
+// ListSearch
+// @Title 我的/公开PPT搜索
+// @Description 我的/公开PPT搜索
+// @Param   Keyword		query  string	true	"关键字"
+// @Success 200 {object} models.RespGroupPptList
+// @router /ppt/search [get]
+func (this *PptV2GroupController) ListSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	keyword := this.GetString("Keyword")
+	keyword = strings.TrimSpace(keyword)
+
+	data, err := ppt.SearchPptList(sysUser.AdminId, keyword)
+	if err != nil {
+		br.Msg = err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "查询成功"
+	br.Data = data
+}

+ 11 - 0
controllers/user_login.go

@@ -558,6 +558,8 @@ func (this *UserLoginController) Login() {
 	}
 	resp.ProductName = productName
 	resp.Authority = sysUser.Authority
+	resp.DepartmentName = sysUser.DepartmentName
+	resp.GroupName = sysUser.GroupName
 
 	// 设置redis缓存
 	{
@@ -1031,6 +1033,13 @@ func (this *UserLoginController) BaseInfo() {
 		return
 	}
 
+	companyName, e := models.GetBusinessConfByKey("CompanyName")
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取商家配置失败, Err: " + e.Error()
+		return
+	}
+
 	type BaseInfoResp struct {
 		Icp           *models.BusinessConf `description:"Icp信息"`
 		ETATitle      *models.BusinessConf `description:"eta系统名称"`
@@ -1038,6 +1047,7 @@ func (this *UserLoginController) BaseInfo() {
 		LogoCn        *models.BusinessConf `description:"中文logo"`
 		LogoEn        *models.BusinessConf `description:"英文logo"`
 		LogoMobile    *models.BusinessConf `description:"移动端logo"`
+		CompanyName   *models.BusinessConf `description:"公司名称"`
 	}
 
 	resp := BaseInfoResp{
@@ -1047,6 +1057,7 @@ func (this *UserLoginController) BaseInfo() {
 		LogoCn:        logoCn,
 		LogoEn:        logoEn,
 		LogoMobile:    logoMobile,
+		CompanyName:   companyName,
 	}
 
 	br.Data = resp

+ 379 - 0
models/data_manage/base_from_sci_hq_index.go

@@ -0,0 +1,379 @@
+package data_manage
+
+import (
+	"eta/eta_mobile/utils"
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type BaseFromSciHqIndex struct {
+	BaseFromSciHqIndexId int       `orm:"pk"`
+	ClassifyId           int       `description:"指标分类id"`
+	IndexCode            string    `description:"指标编码"`
+	IndexName            string    `description:"指标名称"`
+	Unit                 string    `description:"单位"`
+	Frequency            string    `description:"频度"`
+	StartDate            string    `description:"开始日期"`
+	EndDate              string    `description:"结束日期"`
+	Sort                 int       `description:"排序"`
+	LatestValue          float64   `description:"最新值"`
+	LatestDate           time.Time `description:"最后更新时间"`
+	TerminalCode         string
+	FilePath             string `json:"-"`
+	CreateTime           time.Time
+	ModifyTime           time.Time
+}
+
+type BaseFromSciHqIndexView struct {
+	BaseFromSciHqIndexId int     `orm:"pk"`
+	EdbInfoId            int     `description:"指标库id"`
+	ClassifyId           int     `description:"指标分类id"`
+	IndexCode            string  `description:"指标编码"`
+	IndexName            string  `description:"指标名称"`
+	UniqueCode           string  `description:"唯一code"`
+	Frequency            string  `description:"频度"`
+	Unit                 string  `description:"单位"`
+	StartDate            string  `description:"开始日期"`
+	EndDate              string  `description:"结束日期"`
+	Sort                 int     `description:"排序"`
+	LatestValue          float64 `description:"最新值"`
+	LatestDate           string  `description:"最后更新时间"`
+	EdbExist             int     `description:"edb是否存在"`
+	ModifyTime           string
+}
+
+type BaseFromSciHqClassifyMaxSort struct {
+	ClassifyId int `description:"分类id"`
+	MaxSort    int `description:"最大排序"`
+}
+
+func (b *BaseFromSciHqIndex) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(b, cols...)
+	return
+}
+
+// GetSciHqIndexByCondition 根据条件获取卓创红期指标列表
+func GetSciHqIndexByCondition(condition string, pars []interface{}) (items []*BaseFromSciHqIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_sci_hq_index WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY sort ASC, base_from_sci_hq_index_id ASC`
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// GetSciHqIndexByCondition 根据条件获取卓创红期指标列表
+func GetSciHqIndexByConditionAndFrequency(condition, frequency string, pars []interface{}) (items []*BaseFromSciHqIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_sci_hq_index WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` AND frequency=?`
+	sql += ` ORDER BY sort ASC, base_from_sci_hq_index_id ASC`
+	_, err = o.Raw(sql, pars, frequency).QueryRows(&items)
+	return
+}
+
+func GetSciHqIndexCountByCondition(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(*) AS count FROM base_from_sci_hq_index WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY sort ASC, base_from_sci_hq_index_id ASC`
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+// GetSciHqIndexAndEdbInfoByCondition 根据条件获取卓创红期index和指标库的信息
+func GetSciHqIndexAndEdbInfoByCondition(condition string, pars []interface{}) (items []*BaseFromSciHqIndexView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT b.*, e.edb_info_id FROM base_from_sci_hq_index AS b LEFT JOIN edb_info AS e ON b.index_code=e.edb_code AND e.source=? WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY sort ASC `
+	_, err = o.Raw(sql, utils.DATA_SOURCE_SCI_HQ, pars).QueryRows(&items)
+	return
+}
+
+// GetSciHqIndexByIndexCode 根据指标编码获取指标信息
+func GetSciHqIndexByIndexCode(indexCode string) (item *BaseFromSciHqIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_sci_hq_index WHERE index_code=? `
+	err = o.Raw(sql, indexCode).QueryRow(&item)
+	return
+}
+
+// GetSciHqIndexByIndexId 根据指标id获取指标信息
+func GetSciHqIndexByIndexId(indexId int) (item *BaseFromSciHqIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_sci_hq_index WHERE base_from_sci_hq_index_id=? `
+	err = o.Raw(sql, indexId).QueryRow(&item)
+	return
+}
+
+// GetSciHqIndexListByIndexIds 根据指标id获取指标信息
+func GetSciHqIndexListByIndexIds(indexIds []int) (items []*BaseFromSciHqIndex, err error) {
+	if len(indexIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM base_from_sci_hq_index WHERE base_from_sci_hq_index_id IN (` + utils.GetOrmInReplace(len(indexIds)) + `) `
+	_, err = o.Raw(sql, indexIds).QueryRows(&items)
+	return
+}
+
+// GetSciHqIndexCountByClassifyIds 获取分类下指标的个数
+func GetSciHqIndexCountByClassifyIds(classifyIds []int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	num := len(classifyIds)
+	if num <= 0 {
+		return
+	}
+	sql := `SELECT COUNT(1) AS count FROM base_from_sci_hq_index WHERE classify_id IN (` + utils.GetOrmInReplace(num) + `) `
+	err = o.Raw(sql, classifyIds).QueryRow(&count)
+	return
+}
+
+// GetSciHqIndexByClassifyId 根据分类id获取卓创红期指标列表
+func GetSciHqIndexByClassifyId(classifyIds []int, startSize, pageSize int) (items []*BaseFromSciHqIndexView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT b.*, e.edb_info_id,
+	CASE WHEN e.edb_info_id IS NULL THEN 0 ELSE 1 END AS edb_exist
+	FROM base_from_sci_hq_index AS b
+	LEFT JOIN edb_info AS e ON b.index_code=e.edb_code AND e.source=88
+	WHERE b.classify_id IN (` + utils.GetOrmInReplace(len(classifyIds)) + `) ORDER BY b.sort ASC LIMIT ?,? `
+	_, err = o.Raw(sql, classifyIds, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetSciHqIndexCountByClassifyId 根据分类id获取卓创红期指标数量
+func GetSciHqIndexCountByClassifyId(classifyIds []int) (count int, err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(*) AS count FROM base_from_sci_hq_index WHERE classify_id IN (` + utils.GetOrmInReplace(len(classifyIds)) + `) `
+	err = o.Raw(sql, classifyIds).QueryRow(&count)
+	return
+}
+
+// GetSciHqIndexCount 获取卓创红期指标数量
+func GetSciHqIndexCount() (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(*) AS count FROM base_from_sci_hq_index `
+	err = o.Raw(sql).QueryRow(&count)
+	return
+}
+
+func GetSciHqIndexByPage(startSize, pageSize int) (items []*BaseFromSciHqIndexView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT b.*, e.edb_info_id,
+	CASE WHEN e.edb_info_id IS NULL THEN 0 ELSE 1 END AS edb_exist
+	FROM base_from_sci_hq_index AS b
+	LEFT JOIN edb_info AS e ON b.index_code=e.edb_code AND e.source=88
+	ORDER BY b.modify_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+// GetSciHqIndexBaseInfoByClassifyId 根据分类id获取卓创红期指标列表
+func GetSciHqIndexBaseInfoByClassifyId(classifyId int) (items []*BaseFromSciHqIndexView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT base_from_sci_hq_index_id, classify_id, index_code, index_name, CONCAT(classify_id, '_', base_from_sci_hq_index_id) AS unique_code  FROM base_from_sci_hq_index WHERE classify_id = ? ORDER BY sort ASC `
+	_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	return
+}
+
+// GetSciHqIndexBaseInfoByClassifyId 根据分类id获取卓创红期指标列表
+func GetSciHqIndexBaseInfoByCondition(condition string, pars []interface{}) (items []*BaseFromSciHqIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT base_from_sci_hq_index_id, index_code, index_name  FROM base_from_sci_hq_index WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY sort ASC `
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
+	return
+}
+
+func GetSciHqDataMaxCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT MAX(t.num) AS count FROM ( SELECT COUNT(1) AS num  FROM base_from_sci_hq_index AS a INNER JOIN base_from_sci_hq_data AS b ON a.index_code=b.index_code WHERE 1=1  `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` GROUP BY a.base_from_sci_hq_index_id) AS t `
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+// GetSciHqIndexMaxSortByClassifyId 根据分类id获取指标最大排序
+func GetSciHqIndexMaxSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT MAX(sort) FROM base_from_sci_index WHERE classify_id=? `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}
+
+func GetSciHqFrequency(classifyId int) (items []*string, err error) {
+	sql := `SELECT DISTINCT frequency FROM base_from_sci_hq_index WHERE classify_id=? ORDER BY FIELD(frequency,'日度','周度','月度','季度','半年','年度') `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, classifyId).QueryRows(&items)
+	return
+}
+
+func GetSciHqFrequencyByCondition(condition string, pars []interface{}) (items []*string, err error) {
+	sql := `SELECT DISTINCT frequency FROM base_from_sci_hq_index WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY FIELD(frequency,'日度','周度','月度','季度','半年','年度') `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, pars...).QueryRows(&items)
+	return
+}
+
+func GetSciHqFrequencyByCode(code string) (items []*string, err error) {
+	sql := `SELECT DISTINCT frequency FROM base_from_sci_hq_index WHERE index_code=? ORDER BY FIELD(frequency,'日度','周度','月度','季度','半年','年度') `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, code).QueryRows(&items)
+	return
+}
+
+// GetSciHqClassifyMaxSortByClassifyIds 通过分类id获取对应分类的最大sort
+func GetSciHqClassifyMaxSortByClassifyIds(classifyIds []int) (items []*BaseFromSciHqClassifyMaxSort, err error) {
+	if len(classifyIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT bc.classify_id, COALESCE(MAX(bi.sort), 0) AS max_sort FROM base_from_sci_hq_classify  AS bc
+	LEFT JOIN base_from_sci_hq_index AS bi
+	ON bc.classify_id=bi.classify_id  
+	WHERE bc.classify_id IN (` + utils.GetOrmInReplace(len(classifyIds)) + `)
+	GROUP BY bc.classify_id
+	`
+	// sql = ` SELECT classify_id, MAX(sort) AS max_sort FROM base_from_sci_hq_index WHERE classify_id IN (` + utils.GetOrmInReplace(len(classifyIds)) + `) GROUP BY classify_id `
+	_, err = o.Raw(sql, classifyIds).QueryRows(&items)
+	return
+}
+
+func BatchModifySciHqIndexClassify(items []*BaseFromSciHqIndex) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `UPDATE base_from_sci_hq_index SET classify_id=?, sort=? WHERE base_from_sci_hq_index_id=? `
+	p, err := o.Raw(sql).Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		p.Close()
+	}()
+	for _, v := range items {
+		_, err = p.Exec(v.ClassifyId, v.Sort, v.BaseFromSciHqIndexId)
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+// MoveDownSciHqIndexBySort 往下移动
+func MoveDownSciHqIndexBySort(classifyId, prevSort, currentSort int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `update base_from_sci_hq_index set sort = sort - 1 where classify_id=? and sort <= ? and sort> ? `
+	_, err = o.Raw(sql, classifyId, prevSort, currentSort).Exec()
+	return
+}
+
+// MoveUpSciHqIndexBySort 往上移动
+func MoveUpSciHqIndexBySort(classifyId, nextSort, currentSort int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `update base_from_sci_hq_index set sort = sort + 1 where classify_id=? and sort >= ? and sort< ?`
+	_, err = o.Raw(sql, classifyId, nextSort, currentSort).Exec()
+	return
+}
+
+func DeleteSciHqIndexById(indexId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	sql := `DELETE FROM base_from_sci_hq_index WHERE base_from_sci_hq_index_id=? `
+	_, err = to.Raw(sql, indexId).Exec()
+	if err != nil {
+		return
+	}
+	sql = `DELETE FROM base_from_sci_hq_data WHERE base_from_sci_hq_index_id=? `
+	_, err = to.Raw(sql, indexId).Exec()
+	if err != nil {
+		return
+	}
+	return
+}
+
+func DeleteSciHqIndexByIds(indexIds []int) (err error) {
+	if len(indexIds) == 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := `DELETE FROM base_from_sci_hq_index WHERE base_from_sci_hq_index_id IN (` + utils.GetOrmInReplace(len(indexIds)) + `) `
+	_, err = o.Raw(sql, indexIds).Exec()
+	if err != nil {
+		return
+	}
+	sql = `DELETE FROM base_from_sci_hq_data WHERE base_from_sci_hq_index_id IN (` + utils.GetOrmInReplace(len(indexIds)) + `) `
+	_, err = o.Raw(sql, indexIds).Exec()
+	if err != nil {
+		return
+	}
+	return
+}
+
+// MoveSciHqIndex 移动指标分类
+func MoveSciHqIndex(indexId, classifyId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE base_from_sci_hq_index
+			SET
+			  classify_id = ?, modify_time=NOW() 
+			WHERE base_from_sci_hq_index_id = ?`
+	_, err = o.Raw(sql, classifyId, indexId).Exec()
+	return
+}
+
+// GetSciHqIndexMinSortByClassifyId 获取最小不等于0的排序
+func GetSciHqIndexMinSortByClassifyId(classifyId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT min(sort) FROM base_from_sci_hq_index WHERE classify_id=? and sort <> 0 `
+	err = o.Raw(sql, classifyId).QueryRow(&sort)
+	return
+}

+ 84 - 10
models/data_manage/chart_info.go

@@ -387,6 +387,9 @@ func GetEdbDataList(source, subSource, edbInfoId int, startDate, endDate string)
 	if source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
 		return getEdbDataListByMongo(source, subSource, edbInfoId, startDate, endDate)
 	}
+	if source == utils.DATA_SOURCE_THS && subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
+		return getThsHfEdbDataListByMongo(source, subSource, edbInfoId, startDate, endDate)
+	}
 
 	return getEdbDataListByMysql(source, subSource, edbInfoId, startDate, endDate)
 
@@ -509,6 +512,9 @@ func GetEdbDataListMinAndMax(source, subSource, edbInfoId int, startDate, endDat
 	if source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
 		return getEdbDataListMinAndMaxByMongo(source, subSource, edbInfoId, startDate, endDate)
 	}
+	if source == utils.DATA_SOURCE_THS && subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
+		return getThsHfEdbDataListMinAndMaxByMongo(source, subSource, edbInfoId, startDate, endDate)
+	}
 
 	return getEdbDataListMinAndMaxByMysql(source, subSource, edbInfoId, startDate, endDate)
 }
@@ -2382,21 +2388,20 @@ type MarkersLineTime struct {
 // EdbDateExtraConf
 // @Description: 导入指标日期前移和日期变换
 type EdbDateChangeConf struct {
-	MoveForward int `description:"前移的期数"`
-	BaseDate    int `description:"基准日期 0系统日期 1指标最新日期"`
+	MoveForward int `json:"moveForward" description:"前移的期数"`
+	BaseDate    int `json:"baseDate" description:"基准日期 0系统日期 1指标最新日期"`
 	DateChange  []*EdbDateConfDateChange
 }
 
 type EdbDateConfDateChange struct {
-	Year         int
-	Month        int
-	Day          int
-	Frequency    string `description:"频度变换"`
-	FrequencyDay string `description:"频度的固定日期"`
-	ChangeType   int    `description:"日期变换类型1日期位移,2指定频率"`
+	Year         int    `json:"year" description:"前移的期数"`
+	Month        int    `json:"month" description:"前移的期数"`
+	Day          int    `json:"day" description:"前移的期数"`
+	Frequency    string `json:"moveForward" description:"频度变换"`
+	FrequencyDay string `json:"frequencyDay" description:"频度的固定日期"`
+	ChangeType   int    `json:"changeType" description:"日期变换类型1日期位移,2指定频率"`
 }
 
-
 // 自定义右轴指标
 type SeasonRightAxis struct {
 	IndicatorType int     `description:"右轴指标类型 1:左轴指标同比,2:指标库,3:预测指标 "`
@@ -2499,4 +2504,73 @@ type MaxMinLimitsData struct {
 	DataTimestamp int64   `description:"数据日期时间戳"`
 	MaxValue      float64 `description:"最大值"`
 	MinValue      float64 `description:"最小值"`
-}
+}
+
+func getThsHfEdbDataListByMongo(source, subSource, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
+	list = make([]*EdbDataList, 0)
+
+	mogDataObj := mgo.EdbDataThsHf{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
+	}
+
+	// 数据日期
+	dateCondition, err := mgo.BuildDateCondition(startDate, endDate)
+	if err != nil {
+		return
+	}
+	if len(dateCondition) > 0 {
+		queryConditions["data_time"] = dateCondition
+	}
+
+	// 获取列表数据
+	tmpDataList, tmpErr := mogDataObj.GetAllDataList(queryConditions, []string{"data_time"})
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	for k, v := range tmpDataList {
+		list = append(list, &EdbDataList{
+			EdbDataId:     k + 1,
+			EdbInfoId:     v.EdbInfoId,
+			DataTime:      v.DataTime.Format(utils.FormatDate),
+			DataTimestamp: v.DataTimestamp,
+			Value:         v.Value,
+		})
+	}
+	return
+}
+
+func getThsHfEdbDataListMinAndMaxByMongo(source, subSource, edbInfoId int, startDate, endDate string) (minData, maxData float64, err error) {
+	mogDataObj := mgo.EdbDataThsHf{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
+	}
+	// 日期
+	dateCondition, err := mgo.BuildDateCondition(startDate, endDate)
+	if err != nil {
+		return
+	}
+	if len(dateCondition) > 0 {
+		queryConditions["data_time"] = dateCondition
+	}
+
+	pipeline := []bson.M{
+		{"$match": queryConditions},
+		{"$group": bson.M{
+			"_id":       nil,
+			"min_value": bson.M{"$min": "$value"},
+			"max_value": bson.M{"$max": "$value"},
+		}},
+		{"$project": bson.M{"_id": 0}}, // 可选,如果不需要_id字段
+	}
+	result, err := mogDataObj.GetEdbInfoMaxAndMinInfo(pipeline)
+	if err != nil {
+		return
+	}
+	minData = result.MinValue
+	maxData = result.MaxValue
+	return
+}

+ 19 - 20
models/data_manage/chart_theme/request/theme.go

@@ -29,7 +29,6 @@ type SetDefaultThemeReq struct {
 	ChartThemeTypeId int `description:"主题类型id"`
 }
 
-
 type ColorsOptions []string
 
 type LegendOptions struct {
@@ -71,20 +70,20 @@ type DrawOption struct {
 
 type LineOptions struct {
 	DashStyle string  `json:"dashStyle"`
-	LineWidth int     `json:"lineWidth"`
+	LineWidth float64 `json:"lineWidth"`
 	LineType  string  `json:"lineType"`
 	Radius    float64 `json:"radius"`
 }
 
 type OldChartOptions struct {
-	ColorsOptions  []string         `json:"colorsOptions"`
-	LineOptions    LineOptions      `json:"lineOptions"`
-	LegendOptions  interface{}      `json:"legendOptions"`
-	TitleOptions   interface{}      `json:"titleOptions"`
-	MarkerOptions  interface{}      `json:"markerOptions"`
-	XAxisOptions   interface{}      `json:"xAxisOptions"`
-	YAxisOptions   interface{}      `json:"yAxisOptions"`
-	DrawOption     interface{}      `json:"drawOption"`
+	ColorsOptions  []string           `json:"colorsOptions"`
+	LineOptions    LineOptions        `json:"lineOptions"`
+	LegendOptions  interface{}        `json:"legendOptions"`
+	TitleOptions   interface{}        `json:"titleOptions"`
+	MarkerOptions  interface{}        `json:"markerOptions"`
+	XAxisOptions   interface{}        `json:"xAxisOptions"`
+	YAxisOptions   interface{}        `json:"yAxisOptions"`
+	DrawOption     interface{}        `json:"drawOption"`
 	LineOptionList []LineStyleOptions `json:"lineOptionList"`
 }
 
@@ -103,13 +102,13 @@ type NewLineOptions struct {
 }
 
 type LineStyleOptions struct {
-	DashStyle string `json:"dashStyle"`
-	Color     string `json:"color"`
-	LineWidth int    `json:"lineWidth"`
-	LineType  string `json:"lineType"`
-	Radius    int `json:"radius"`
-	DataMark  string `json:"dataMark"`
-	MarkType  string `json:"markType"`
-	MarkSize  int `json:"markSize"`
-	MarkColor string `json:"markColor"`
-}
+	DashStyle string  `json:"dashStyle"`
+	Color     string  `json:"color"`
+	LineWidth float64 `json:"lineWidth"`
+	LineType  string  `json:"lineType"`
+	Radius    int     `json:"radius"`
+	DataMark  string  `json:"dataMark"`
+	MarkType  string  `json:"markType"`
+	MarkSize  int     `json:"markSize"`
+	MarkColor string  `json:"markColor"`
+}

+ 36 - 3
models/data_manage/edb_data_base.go

@@ -13,10 +13,12 @@ import (
 func GetEdbDataTableName(source, subSource int) (tableName string) {
 	switch source {
 	case utils.DATA_SOURCE_THS:
-		tableName = "edb_data_ths"
-		if subSource == utils.DATA_SUB_SOURCE_DATE {
+		switch subSource {
+		case utils.DATA_SUB_SOURCE_DATE:
 			tableName = "edb_data_ths_ds"
-		} else {
+		case utils.DATA_SUB_SOURCE_HIGH_FREQUENCY:
+			tableName = "edb_data_ths_hf"
+		default:
 			tableName = "edb_data_ths"
 		}
 	case utils.DATA_SOURCE_WIND:
@@ -222,6 +224,9 @@ func GetEdbDataAllByEdbCode(edbCode string, source, subSource, limit int) (items
 	if source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
 		return GetEdbDataAllByEdbCodeByMongo(edbCode, source, subSource, limit)
 	}
+	if source == utils.DATA_SOURCE_THS && subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
+		return GetThsHfEdbDataAllByEdbCodeByMongo(edbCode, source, subSource, limit)
+	}
 
 	return GetEdbDataAllByEdbCodeByMysql(edbCode, source, subSource, limit)
 }
@@ -359,3 +364,31 @@ func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string)
 	addSql += "),"
 	return
 }
+
+func GetThsHfEdbDataAllByEdbCodeByMongo(edbCode string, source, subSource, limit int) (list []*EdbInfoSearchData, err error) {
+	list = make([]*EdbInfoSearchData, 0)
+
+	mogDataObj := mgo.EdbDataThsHf{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_code": edbCode,
+	}
+
+	var tmpDataList []*mgo.EdbDataThsHf
+	// 获取列表数据
+	if limit > 0 {
+		tmpDataList, err = mogDataObj.GetLimitDataList(queryConditions, int64(limit), []string{"-data_time"})
+	} else {
+		tmpDataList, err = mogDataObj.GetLimitDataList(queryConditions, int64(limit), []string{"-data_time"})
+	}
+	if err != nil {
+		return
+	}
+	for _, v := range tmpDataList {
+		list = append(list, &EdbInfoSearchData{
+			DataTime: v.DataTime.Format(utils.FormatDate),
+			Value:    v.Value,
+		})
+	}
+	return
+}

+ 101 - 0
models/data_manage/edb_data_insert_config.go

@@ -135,6 +135,8 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 	// 指标明细数据更新
 	if edbInfo.Source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
 		dateStr, err = updateInsertConfigValueByMongo(to, edbInfo, oldConfigDate, date, value)
+	} else if edbInfo.Source == utils.DATA_SOURCE_THS && edbInfo.SubSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
+		dateStr, err = updateThsHfInsertConfigValueByMongo(to, edbInfo, oldConfigDate, date, value)
 	} else {
 		dateStr, err = updateInsertConfigValueByMysql(to, edbInfo, oldConfigDate, date, value)
 	}
@@ -336,3 +338,102 @@ func updateInsertConfigValueByMongo(to orm.TxOrmer, edbInfo *EdbInfo, oldConfigD
 
 	return
 }
+
+func updateThsHfInsertConfigValueByMongo(to orm.TxOrmer, edbInfo *EdbInfo, oldConfigDate, newDate time.Time, value string) (dateStr string, err error) {
+	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
+	if tableName == `` {
+		err = errors.New("找不到该指标的数据表")
+		return
+	}
+
+	dateStr = newDate.Format(utils.FormatDate)
+	timestamp := newDate.UnixNano() / 1e6
+	var floatValue float64
+	if value != "" {
+		floatValue, err = strconv.ParseFloat(value, 64)
+		if err != nil {
+			fmt.Println("转换失败:", err.Error())
+			return
+		}
+	}
+
+	mogDataObj := mgo.EdbDataThsHf{}
+	coll := mogDataObj.GetCollection()
+
+	var edbDateData *mgo.EdbDataThsHf
+	if !oldConfigDate.IsZero() {
+		// 构建查询条件
+		queryConditions := bson.M{
+			"edb_info_id": edbInfo.EdbInfoId,
+			"data_time":   oldConfigDate,
+		}
+
+		edbDateData, err = mogDataObj.GetItem(queryConditions)
+		//if tmpErr != nil && tmpErr == mongo.ErrNoDocuments {
+		//	err = tmpErr
+		//	return
+		//}
+		if err != nil && err != mongo.ErrNoDocuments {
+			return
+		}
+		err = nil
+
+	}
+
+	// 如果是没有历史数据,那么就需要增加数据
+	if edbDateData == nil {
+		addDataItem := mgo.EdbDataThsHf{
+			//ID:            primitive.ObjectID{},
+			EdbInfoId:     edbInfo.EdbInfoId,
+			EdbCode:       edbInfo.EdbCode,
+			DataTime:      newDate,
+			Value:         floatValue,
+			CreateTime:    time.Now(),
+			ModifyTime:    time.Now(),
+			DataTimestamp: timestamp,
+		}
+		err = mogDataObj.InsertDataByColl(coll, addDataItem)
+		if err != nil {
+			fmt.Println("mogDataObj.BatchInsertData() Err:" + err.Error())
+			return
+		}
+		return
+	}
+
+	// 数据清空
+	if value == "" {
+		queryConditions := bson.M{
+			"edb_info_id": edbInfo.EdbInfoId,
+		}
+
+		// 获取最新的两条数据
+		tmpDataList, tmpErr := mogDataObj.GetLimitDataList(queryConditions, 2, []string{"-data_time"})
+		if tmpErr != nil {
+			fmt.Println("mogDataObj.GetLimitDataList() Err:" + tmpErr.Error())
+			return
+		}
+		// 如果并没有两条数据,那么就返回
+		if len(tmpDataList) < 2 {
+			return
+		}
+
+		// 实际应该是倒数第二条数据的日期
+		dateStr = tmpDataList[1].DataTime.Format(utils.FormatDate)
+
+		// 删除插入的数据
+		err = mogDataObj.RemoveManyByColl(coll, bson.M{"_id": tmpDataList[0].ID})
+
+		return
+	}
+
+	// 更新配置的数据
+	updateData := bson.M{"$set": bson.M{
+		"value":          floatValue,
+		"modify_time":    time.Now(),
+		"data_time":      newDate,
+		"data_timestamp": timestamp,
+	}}
+	err = mogDataObj.UpdateDataByColl(coll, bson.M{"_id": edbDateData.ID}, updateData)
+
+	return
+}

+ 10 - 0
models/data_manage/edb_data_sci_hq.go

@@ -0,0 +1,10 @@
+package data_manage
+
+import "github.com/beego/beego/v2/client/orm"
+
+func GetEdbDataSciHqMaxAndMinDate(edbCode string) (min_date, max_date string, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_sci_hq WHERE edb_code=? `
+	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
+	return
+}

+ 87 - 0
models/data_manage/edb_info.go

@@ -233,6 +233,9 @@ func DeleteEdbInfoAndData(edbInfoId, source, subSource int) (err error) {
 	// 删除指标的明细数据
 	if source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
 		err = deleteAllEdbDataByMongo(to, edbInfoId, source, subSource)
+	} else if source == utils.DATA_SOURCE_THS && subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
+		mogDataObj := mgo.EdbDataThsHf{}
+		err = mogDataObj.RemoveMany(bson.M{"edb_info_id": edbInfoId})
 	} else {
 		err = deleteAllEdbDataByMysql(to, edbInfoId, source, subSource)
 	}
@@ -583,6 +586,9 @@ func GetEdbInfoMaxAndMinInfo(source, subSource int, edbCode string) (item *EdbIn
 	if source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
 		return GetEdbInfoMaxAndMinInfoByMongo(source, subSource, edbCode)
 	}
+	if source == utils.DATA_SOURCE_THS && subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
+		return GetThsHfEdbInfoMaxAndMinInfoByMongo(source, subSource, edbCode)
+	}
 
 	// 默认走mysql
 	return GetEdbInfoMaxAndMinInfoByMysql(source, subSource, edbCode)
@@ -1707,6 +1713,9 @@ func GetAllEdbDataListData(edbInfoId, source, subSource int, startDataTime strin
 	if source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
 		return getAllDataByMongo(edbInfoId, source, subSource, startDataTime)
 	}
+	if source == utils.DATA_SOURCE_THS && subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
+		return getThsHfAllDataByMongo(edbInfoId, source, subSource, startDataTime)
+	}
 
 	// 默认走mysql
 	return getAllDataByMysql(edbInfoId, source, subSource, startDataTime)
@@ -1795,3 +1804,81 @@ type ReplaceEdbInfoItem struct {
 	OldEdbInfo *EdbInfo
 	NewEdbInfo *EdbInfo
 }
+
+func GetThsHfEdbInfoMaxAndMinInfoByMongo(source, subSource int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	mogDataObj := new(mgo.EdbDataThsHf)
+	pipeline := []bson.M{
+		{"$match": bson.M{"edb_code": edbCode}},
+		{"$group": bson.M{
+			"_id":       nil,
+			"min_date":  bson.M{"$min": "$data_time"},
+			"max_date":  bson.M{"$max": "$data_time"},
+			"min_value": bson.M{"$min": "$value"},
+			"max_value": bson.M{"$max": "$value"},
+		}},
+		{"$project": bson.M{"_id": 0}}, // 可选,如果不需要_id字段
+	}
+	result, err := mogDataObj.GetEdbInfoMaxAndMinInfo(pipeline)
+	if err != nil {
+		fmt.Println("EdbDataThsHf getEdbDataThsHfList Err:" + err.Error())
+		return
+	}
+
+	if !result.MaxDate.IsZero() {
+		whereQuery := bson.M{"edb_code": edbCode, "data_time": result.MaxDate}
+		selectParam := bson.D{{"value", 1}, {"_id", 0}}
+		latestValue, tmpErr := mogDataObj.GetLatestValue(whereQuery, selectParam)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		result.LatestValue = latestValue.Value
+		result.EndValue = latestValue.Value
+	}
+
+	item = &EdbInfoMaxAndMinInfo{
+		MinDate:     result.MinDate.Format(utils.FormatDate),
+		MaxDate:     result.MaxDate.Format(utils.FormatDate),
+		MinValue:    result.MinValue,
+		MaxValue:    result.MaxValue,
+		LatestValue: result.LatestValue,
+	}
+
+	return
+}
+
+func getThsHfAllDataByMongo(edbInfoId, source, subSource int, startDataTime string) (dataList []*EdbData, err error) {
+	dataList = make([]*EdbData, 0)
+
+	mogDataObj := mgo.EdbDataThsHf{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
+	}
+
+	// 开始日期
+	dateCondition, err := mgo.BuildDateCondition(startDataTime, "")
+	if err != nil {
+		return
+	}
+	if len(dateCondition) > 0 {
+		queryConditions["data_time"] = dateCondition
+	}
+
+	// 获取列表数据
+	tmpDataList, tmpErr := mogDataObj.GetAllDataList(queryConditions, []string{"-data_time"})
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	for k, v := range tmpDataList {
+		dataList = append(dataList, &EdbData{
+			EdbDataId: k + 1,
+			EdbInfoId: v.EdbInfoId,
+			DataTime:  v.DataTime.Format(utils.FormatDate),
+			Value:     v.Value,
+		})
+	}
+
+	return
+}

+ 34 - 0
models/data_manage/manual.go

@@ -0,0 +1,34 @@
+package data_manage
+
+import "github.com/beego/beego/v2/client/orm"
+
+type ManualSysUser struct {
+	ItemId   int    `description:"部门/组/用户 id"`
+	ItemName string `description:"部门/组/用户 名称"`
+	Children []*ManualSysUser
+}
+
+type ManualClassifyEdbInfoCount struct {
+	ClassifyId int
+	Total      int
+}
+
+func GetManualClassifyEdbInfoCount() (items []*ManualClassifyEdbInfoCount, err error) {
+	sql := ` SELECT a.classify_id,COUNT(1) AS total FROM edbdata_classify AS a
+			INNER JOIN edbinfo AS b ON a.classify_id=b.classify_id
+			WHERE a.is_show=1
+			GROUP BY a.classify_id `
+	o := orm.NewOrmUsingDB("edb")
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetManualEdbInfoCountByClassifyId 根据手工指标分类id获取指标数
+func GetManualEdbInfoCountByClassifyId(classifyId int) (total int, err error) {
+	sql := ` SELECT COUNT(1) AS total FROM edbdata_classify AS a
+			INNER JOIN edbinfo AS b ON a.classify_id=b.classify_id
+			WHERE a.is_show=1 AND b.classify_id = ?`
+	o := orm.NewOrmUsingDB("edb")
+	err = o.Raw(sql, classifyId).QueryRow(&total)
+	return
+}

+ 1 - 0
models/db.go

@@ -325,6 +325,7 @@ func initEdbData() {
 		new(data_manage.BaseFromSci),
 		new(data_manage.BaseFromSciIndex),
 		new(data_manage.BaseFromSciData),
+		new(data_manage.BaseFromSciHqIndex),
 		//new(data_manage.BaseFromSciClassify),
 		//new(data_manage.TradePositionDalianTop),
 		//new(data_manage.TradePositionZhengzhouTop),

+ 510 - 0
models/mgo/edb_data_ths_hf.go

@@ -0,0 +1,510 @@
+package mgo
+
+import (
+	"context"
+	"errors"
+	"eta/eta_mobile/utils"
+	"fmt"
+	"github.com/qiniu/qmgo"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"time"
+)
+
+// EdbDataThsHf
+// @Description: 同花顺高频集合(指标库)
+type EdbDataThsHf struct {
+	ID            primitive.ObjectID `json:"_id" bson:"_id,omitempty" `            // 文档id
+	EdbInfoId     int                `json:"edb_info_id" bson:"edb_info_id"`       // 指标ID
+	EdbCode       string             `json:"edb_code" bson:"edb_code"`             // 指标编码
+	DataTime      time.Time          `json:"data_time" bson:"data_time"`           // 数据日期
+	Value         float64            `json:"value" bson:"value"`                   // 数据值
+	CreateTime    time.Time          `json:"create_time" bson:"create_time"`       // 创建时间
+	ModifyTime    time.Time          `json:"modify_time" bson:"modify_time"`       // 修改时间
+	DataTimestamp int64              `json:"data_timestamp" bson:"data_timestamp"` // 数据日期时间戳
+}
+
+// CollectionName
+// @Description:  获取集合名称
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:36
+// @return string
+func (m *EdbDataThsHf) CollectionName() string {
+	return "edb_data_ths_hf"
+}
+
+// DataBaseName
+// @Description: 获取数据库名称
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:33
+// @return string
+func (m *EdbDataThsHf) DataBaseName() string {
+	return utils.MgoDataDbName
+}
+
+// GetCollection
+// @Description: 获取mongodb集合的句柄
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:33
+// @return string
+func (m *EdbDataThsHf) GetCollection() *qmgo.Collection {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	return db.Collection(m.CollectionName())
+}
+
+// GetItem
+// @Description: 根据条件获取单条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-09 10:00:49
+// @param whereParams interface{}
+// @return item *EdbDataThsHf
+// @return err error
+func (m *EdbDataThsHf) GetItem(whereParams interface{}) (item *EdbDataThsHf, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.GetItemByColl(coll, whereParams)
+}
+
+// GetItemByColl
+// @Description: 根据条件获取单条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-09 13:22:06
+// @param coll *qmgo.Collection
+// @param whereParams interface{}
+// @return item *EdbDataThsHf
+// @return err error
+func (m *EdbDataThsHf) GetItemByColl(coll *qmgo.Collection, whereParams interface{}) (item *EdbDataThsHf, err error) {
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).One(&item)
+	if err != nil {
+		return
+	}
+
+	item.DataTime = item.DataTime.In(time.Local)
+	item.CreateTime = item.CreateTime.In(time.Local)
+	item.ModifyTime = item.ModifyTime.In(time.Local)
+
+	return
+}
+
+// GetAllDataList
+// @Description: 根据条件获取所有数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:42:19
+// @param whereParams interface{}
+// @param sort []string
+// @return result []EdbDataThsHf
+// @return err error
+func (m *EdbDataThsHf) GetAllDataList(whereParams interface{}, sort []string) (result []*EdbDataThsHf, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetLimitDataList
+// @Description: 根据条件获取指定数量数据列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-06 17:08:32
+// @param whereParams interface{}
+// @param size int64
+// @param sort []string
+// @return result []*BaseFromBusinessData
+// @return err error
+func (m *EdbDataThsHf) GetLimitDataList(whereParams interface{}, size int64, sort []string) (result []*EdbDataThsHf, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).Limit(size).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetPageDataList
+// @Description: 根据条件获取分页数据列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-07 10:21:07
+// @param whereParams interface{}
+// @param startSize int64
+// @param size int64
+// @param sort []string
+// @return result []*EdbDataThsHf
+// @return err error
+func (m *EdbDataThsHf) GetPageDataList(whereParams interface{}, startSize, size int64, sort []string) (result []*EdbDataThsHf, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).Skip(startSize).Limit(size).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetCountDataList
+// @Description:  根据条件获取数据列表总数
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-07 10:29:00
+// @param whereParams interface{}
+// @return count int64
+// @return err error
+func (m *EdbDataThsHf) GetCountDataList(whereParams interface{}) (count int64, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	count, err = coll.Find(ctx, whereParams).Count()
+
+	return
+}
+
+// InsertDataByColl
+// @Description: 写入单条数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param addData interface{}
+// @return err error
+func (m *EdbDataThsHf) InsertDataByColl(coll *qmgo.Collection, addData interface{}) (err error) {
+	ctx := context.TODO()
+	_, err = coll.InsertOne(ctx, addData)
+	if err != nil {
+		fmt.Println("InsertDataByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+// BatchInsertData
+// @Description: 批量写入数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
+// @return err error
+func (m *EdbDataThsHf) BatchInsertData(bulk int, dataList []interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.BatchInsertDataByColl(coll, bulk, dataList)
+}
+
+// BatchInsertDataByColl
+// @Description: 批量写入数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param coll *qmgo.Collection
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
+// @return err error
+func (m *EdbDataThsHf) BatchInsertDataByColl(coll *qmgo.Collection, bulk int, dataList []interface{}) (err error) {
+	ctx := context.TODO()
+	dataNum := len(dataList)
+	if dataNum <= 0 {
+		return
+	}
+
+	// 不设置每次保存切片数量大小,或者实际数据量小于设置的切片数量大小,那么就直接保存吧
+	if bulk <= 0 || dataNum <= bulk {
+		_, err = coll.InsertMany(ctx, dataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+		return
+	}
+
+	// 分批保存
+	i := 0
+	tmpAddDataList := make([]interface{}, 0)
+	for _, v := range dataList {
+		tmpAddDataList = append(tmpAddDataList, v)
+		i++
+		if i >= bulk {
+			_, err = coll.InsertMany(ctx, tmpAddDataList)
+			if err != nil {
+				fmt.Println("BatchInsertData:Err:" + err.Error())
+				return
+			}
+			i = 0
+			tmpAddDataList = make([]interface{}, 0)
+		}
+	}
+
+	if len(tmpAddDataList) > 0 {
+		_, err = coll.InsertMany(ctx, tmpAddDataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+	}
+
+	return
+}
+
+// UpdateData
+// @Description: 单条数据修改
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 15:01:51
+// @param whereParams interface{}
+// @param updateParams interface{}
+// @return err error
+func (m *EdbDataThsHf) UpdateData(whereParams, updateParams interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.UpdateDataByColl(coll, whereParams, updateParams)
+}
+
+// UpdateDataByColl
+// @Description: 单条数据修改(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 15:01:51
+// @param whereParams interface{}
+// @param updateParams interface{}
+// @return err error
+func (m *EdbDataThsHf) UpdateDataByColl(coll *qmgo.Collection, whereParams, updateParams interface{}) (err error) {
+	ctx := context.TODO()
+	err = coll.UpdateOne(ctx, whereParams, updateParams)
+	if err != nil {
+		fmt.Println("UpdateDataByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+// RemoveMany
+// @Description: 根据条件删除多条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 13:17:02
+// @param whereParams interface{}
+// @return err error
+func (m *EdbDataThsHf) RemoveMany(whereParams interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.RemoveManyByColl(coll, whereParams)
+}
+
+// RemoveManyByColl
+// @Description: 根据条件删除多条数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 13:18:42
+// @param coll *qmgo.Collection
+// @param whereParams interface{}
+// @return err error
+func (m *EdbDataThsHf) RemoveManyByColl(coll *qmgo.Collection, whereParams interface{}) (err error) {
+	ctx := context.TODO()
+	_, err = coll.RemoveAll(ctx, whereParams)
+	if err != nil {
+		fmt.Println("RemoveManyByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+// HandleData
+// @Description: 事务处理数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 10:39:01
+// @param addDataList []AddEdbDataThsHf
+// @param updateDataList []EdbDataThsHf
+// @return result interface{}
+// @return err error
+func (m *EdbDataThsHf) HandleData(addDataList, updateDataList []EdbDataThsHf) (result interface{}, err error) {
+
+	ctx := context.TODO()
+
+	callback := func(sessCtx context.Context) (interface{}, error) {
+		// 重要:确保事务中的每一个操作,都使用传入的sessCtx参数
+
+		db := utils.MgoDataCli.Database(m.DataBaseName())
+		coll := db.Collection(m.CollectionName())
+
+		// 插入数据
+		if len(addDataList) > 0 {
+			_, err = coll.InsertMany(sessCtx, addDataList)
+			if err != nil {
+				return nil, err
+			}
+		}
+
+		// 修改
+
+		if len(updateDataList) > 0 {
+			for _, v := range updateDataList {
+				err = coll.UpdateOne(ctx, bson.M{"_id": v.ID}, bson.M{"$set": bson.M{"value": v.Value, "modify_time": v.ModifyTime}})
+				if err != nil {
+					fmt.Println("BatchInsertData:Err:" + err.Error())
+					return nil, err
+				}
+			}
+		}
+
+		return nil, nil
+	}
+	result, err = utils.MgoDataCli.DoTransaction(ctx, callback)
+
+	return
+}
+
+// EdbInfoMaxAndMinInfo 指标最新数据记录结构体
+//type EdbInfoMaxAndMinInfo struct {
+//	MinDate     time.Time `description:"最小日期" bson:"min_date"`
+//	MaxDate     time.Time `description:"最大日期" bson:"max_date"`
+//	MinValue    float64   `description:"最小值" bson:"min_value"`
+//	MaxValue    float64   `description:"最大值" bson:"max_value"`
+//	LatestValue float64   `description:"最新值" bson:"latest_value"`
+//	LatestDate  time.Time `description:"实际数据最新日期" bson:"latest_date"`
+//	EndValue    float64   `description:"最新值" bson:"end_value"`
+//}
+
+// GetEdbInfoMaxAndMinInfo
+// @Description: 获取当前指标的最大最小值
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 17:15:39
+// @param whereParams interface{}
+// @return result EdbInfoMaxAndMinInfo
+// @return err error
+func (m *EdbDataThsHf) GetEdbInfoMaxAndMinInfo(whereParams interface{}) (result EdbInfoMaxAndMinInfo, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Aggregate(ctx, whereParams).One(&result)
+	if err != nil {
+		return
+	}
+	result.MinDate = result.MinDate.In(time.Local)
+	result.MaxDate = result.MaxDate.In(time.Local)
+	result.LatestDate = result.LatestDate.In(time.Local)
+
+	return
+}
+
+// LatestValue 指标最新数据记录结构体
+//type LatestValue struct {
+//	Value float64 `description:"值" bson:"value"`
+//}
+
+// GetLatestValue
+// @Description: 获取当前指标的最新数据记录
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 17:16:15
+// @param whereParams interface{}
+// @param selectParam interface{}
+// @return latestValue LatestValue
+// @return err error
+func (m *EdbDataThsHf) GetLatestValue(whereParams, selectParam interface{}) (latestValue LatestValue, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+
+	//var result interface{}
+	//err = coll.Find(ctx, whereParams).Select(selectParam).One(&result)
+	err = coll.Find(ctx, whereParams).Select(selectParam).One(&latestValue)
+	return
+}

+ 2 - 0
models/system/sys_user.go

@@ -24,6 +24,8 @@ type LoginResp struct {
 	AdminId         int    `description:"系统用户id"`
 	ProductName     string `description:"产品名称:admin,ficc,权益"`
 	Authority       int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
+	DepartmentName  string `description:"部门名称"`
+	GroupName       string `description:"分组名称"`
 }
 
 type Admin struct {

+ 18 - 0
routers/commentsRouter.go

@@ -2761,6 +2761,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ManualController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:ManualController"],
+        beego.ControllerComments{
+            Method: "ManualSysUserSearch",
+            Router: `/manual/sysuser/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:MyChartController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers/data_manage:MyChartController"],
         beego.ControllerComments{
             Method: "MyChartAdd",
@@ -4930,6 +4939,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mobile/controllers:PptV2GroupController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:PptV2GroupController"],
+        beego.ControllerComments{
+            Method: "ListSearch",
+            Router: `/ppt/search`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mobile/controllers:PptV2GroupController"] = append(beego.GlobalControllerRouter["eta/eta_mobile/controllers:PptV2GroupController"],
         beego.ControllerComments{
             Method: "SharePpt",

+ 1 - 0
routers/router.go

@@ -153,6 +153,7 @@ func init() {
 				&data_manage.PredictEdbInfoController{},
 				&data_manage.ChartThemeController{},
 				&data_manage_permission.DataMangePermissionController{},
+				&data_manage.ManualController{},
 			),
 		),
 		web.NSNamespace("/my_chart",

+ 10 - 4
services/data/base_edb_lib.go

@@ -72,6 +72,8 @@ func AddEdbData(source int, edbCode, frequency string) (resp *models.BaseRespons
 		urlStr = "gz/add"
 	case utils.DATA_SOURCE_ICPI:
 		urlStr = "icpi/add"
+	case utils.DATA_SOURCE_SCI_HQ:
+		urlStr = "sci_hq/add"
 	default:
 		edbSource := data_manage.EdbSourceIdMap[source]
 		if edbSource != nil {
@@ -203,11 +205,13 @@ func RefreshEdbData(edbInfoId, source, subSource int, edbCode, startDate string)
 	urlStr := ``
 	switch source {
 	case utils.DATA_SOURCE_THS:
-		urlStr = "ths/refresh"
-		if subSource == 0 {
-			urlStr = "ths/refresh"
-		} else {
+		switch subSource {
+		case utils.DATA_SUB_SOURCE_DATE:
 			urlStr = "ths/ds/refresh"
+		case utils.DATA_SUB_SOURCE_HIGH_FREQUENCY:
+			urlStr = "ths/hf/edb/refresh"
+		default:
+			urlStr = "ths/refresh"
 		}
 	case utils.DATA_SOURCE_WIND:
 		if subSource == 0 {
@@ -267,6 +271,8 @@ func RefreshEdbData(edbInfoId, source, subSource int, edbCode, startDate string)
 		urlStr = "gz/refresh"
 	case utils.DATA_SOURCE_ICPI:
 		urlStr = "icpi/refresh"
+	case utils.DATA_SOURCE_SCI_HQ:
+		urlStr = "sci_hq/refresh"
 	default:
 		edbSource := data_manage.EdbSourceIdMap[source]
 		if edbSource != nil {

+ 282 - 332
services/data/chart_info.go

@@ -359,7 +359,16 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 	switch chartType {
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
-			dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
+			// 季节性图计算不管图上数据时间,拿所有数据
+			_, tempEdbList, e := getEdbDataMapList(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
+			if e != nil {
+				err = e
+				return
+			}
+			dataResp, err = SeasonChartData(tempEdbList, seasonExtraConfig)
+		} else {
+			// 兼容无配置的老图
+			dataResp = new(data_manage.SeasonChartResp)
 		}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
@@ -2896,7 +2905,16 @@ func GetChartConvertEdbData(chartInfoId, chartType int, calendar, startDate, end
 	switch chartType {
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
-			dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
+			// 季节性图计算不管图上数据时间,拿所有数据
+			_, tempEdbList, e := getEdbDataMapList(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
+			if e != nil {
+				err = e
+				return
+			}
+			dataResp, err = SeasonChartData(tempEdbList, seasonExtraConfig)
+		} else {
+			// 兼容无配置的老图
+			dataResp = new(data_manage.SeasonChartResp)
 		}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
@@ -3255,7 +3273,16 @@ func GetChartEdbDataV2(chartInfoId, chartType int, calendar, startDate, endDate
 	switch chartType {
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
-			dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
+			// 季节性图计算不管图上数据时间,拿所有数据
+			_, tempEdbList, e := getEdbDataMapList(chartInfoId, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
+			if e != nil {
+				err = e
+				return
+			}
+			dataResp, err = SeasonChartData(tempEdbList, seasonExtraConfig)
+		} else {
+			// 兼容无配置的老图
+			dataResp = new(data_manage.SeasonChartResp)
 		}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
@@ -3318,9 +3345,13 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 		if mappingItem.IsAxis == 0 {
 			continue
 		}
-		quarterDataList := mappingItem.DataList.(data_manage.QuarterDataList)
+		quarterDataList, ok := mappingItem.DataList.(data_manage.QuarterDataList)
+		if !ok {
+			continue
+		}
 		// 上下限区间
 		if seasonConfig.MaxMinLimits.Year > 0 {
+			startYear := time.Now().AddDate(-seasonConfig.MaxMinLimits.Year, 0, 0).Year()
 			dataResp.MaxMinLimits.List = make([]*data_manage.MaxMinLimitsData, 0)
 			dataTimeMap := make(map[time.Time]time.Time)
 			dataTimeList := make([]string, 0)
@@ -3328,6 +3359,22 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 			minValueMap := make(map[time.Time]float64)
 
 			maxMinDataList := make([]*data_manage.MaxMinLimitsData, 0)
+			var startDateStr string
+			var endDateStr string
+			var newDate time.Time
+
+			startDateStr = fmt.Sprintf("%d-%s", time.Now().Year(), seasonConfig.XStartDate)
+			endDateStr = fmt.Sprintf("%d-%s", time.Now().Year(), seasonConfig.XEndDate)
+			startDate, e := time.Parse(utils.FormatDate, startDateStr)
+			if e != nil {
+				err = e
+				return
+			}
+			endDate, e := time.Parse(utils.FormatDate, endDateStr)
+			if e != nil {
+				err = e
+				return
+			}
 			// 日度 周度插值
 			for _, v := range quarterDataList {
 				if mappingItem.Frequency == "日度" || mappingItem.Frequency == "周度" {
@@ -3337,35 +3384,123 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 						err = errors.New("插值处理数据异常, Err:" + err.Error())
 						return
 					}
+					// 不包含当年
+					if v.ChartLegend == strconv.Itoa(time.Now().Year()) {
+						continue
+					}
 					for _, date := range dataTimeList {
 						dateTime, e := time.Parse(utils.FormatDate, date)
 						if e != nil {
 							err = errors.New("时间格式化异常, Err:" + e.Error())
 							return
 						}
-						// 不包含今年
-						if dateTime.Year() == time.Now().Year() {
+						if dateTime.Year() < startYear {
 							continue
 						}
-						newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
-						// 处理上下限列表
-						if value, ok := maxValueMap[newDate]; ok {
-							if value < handleDataMap[date] {
-								maxValueMap[newDate] = handleDataMap[date]
+						// 不包含2月29号
+						if dateTime.Month() == 2 && dateTime.Day() == 29 {
+							continue
+						}
+						newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
+						if seasonConfig.JumpYear == 1 {
+							if startDate.After(endDate) {
+								// 如果跨年且不到一年
+								// 全年截取一部分
+								if newDate.Before(startDate.AddDate(0, 0, 1)) && newDate.After(endDate) {
+									continue
+								}
+								if newDate.After(startDate.AddDate(0, 0, -1)) {
+									// 减一年
+									newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year()-1, 0, 0)
+								}
+								// 处理上下限列表
+								if value, ok := maxValueMap[newDate]; ok {
+									if value < handleDataMap[date] {
+										maxValueMap[newDate] = handleDataMap[date]
+									}
+								} else {
+									maxValueMap[newDate] = handleDataMap[date]
+								}
+
+								if value, ok := minValueMap[newDate]; ok {
+									if value > handleDataMap[date] {
+										minValueMap[newDate] = handleDataMap[date]
+									}
+								} else {
+									minValueMap[newDate] = handleDataMap[date]
+								}
+
+								dataTimeMap[newDate] = newDate
+							} else {
+								// 如果跨年且大于等于一年
+								// double后截取
+								if newDate.After(startDate) {
+									// 处理上下限列表
+									if value, ok := maxValueMap[newDate]; ok {
+										if value < handleDataMap[date] {
+											maxValueMap[newDate] = handleDataMap[date]
+										}
+									} else {
+										maxValueMap[newDate] = handleDataMap[date]
+									}
+
+									if value, ok := minValueMap[newDate]; ok {
+										if value > handleDataMap[date] {
+											minValueMap[newDate] = handleDataMap[date]
+										}
+									} else {
+										minValueMap[newDate] = handleDataMap[date]
+									}
+
+									dataTimeMap[newDate] = newDate
+								}
+
+								newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year()+1, 0, 0)
+								newEndDate := endDate.AddDate(1, 0, 0)
+								if newDate.Before(newEndDate) {
+									// 处理上下限列表
+									if value, ok := maxValueMap[newDate]; ok {
+										if value < handleDataMap[date] {
+											maxValueMap[newDate] = handleDataMap[date]
+										}
+									} else {
+										maxValueMap[newDate] = handleDataMap[date]
+									}
+
+									if value, ok := minValueMap[newDate]; ok {
+										if value > handleDataMap[date] {
+											minValueMap[newDate] = handleDataMap[date]
+										}
+									} else {
+										minValueMap[newDate] = handleDataMap[date]
+									}
+
+									dataTimeMap[newDate] = newDate
+								}
+
 							}
 						} else {
-							maxValueMap[newDate] = handleDataMap[date]
-						}
+							// 如果不跨年 正常获取
+							// 获取当前日期所在区间
+							// 处理上下限列表
+							if value, ok := maxValueMap[newDate]; ok {
+								if value < handleDataMap[date] {
+									maxValueMap[newDate] = handleDataMap[date]
+								}
+							} else {
+								maxValueMap[newDate] = handleDataMap[date]
+							}
 
-						if value, ok := minValueMap[newDate]; ok {
-							if value > handleDataMap[date] {
+							if value, ok := minValueMap[newDate]; ok {
+								if value > handleDataMap[date] {
+									minValueMap[newDate] = handleDataMap[date]
+								}
+							} else {
 								minValueMap[newDate] = handleDataMap[date]
 							}
-						} else {
-							minValueMap[newDate] = handleDataMap[date]
-						}
 
-						dataTimeMap[newDate] = newDate
+							dataTimeMap[newDate] = newDate
+						}
 					}
 				} else {
 					// 旬度、月度、季度、半年度 不插值,需要先把日期列表和数据map取出来
@@ -3375,28 +3510,120 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 							err = errors.New("时间格式化异常, Err:" + e.Error())
 							return
 						}
-						// 不包含今年
-						if dateTime.Year() == time.Now().Year() {
+
+						// 不包含当年
+						if v.ChartLegend == strconv.Itoa(time.Now().Year()) {
 							continue
 						}
-						newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 
-						if value, ok := maxValueMap[newDate]; ok {
-							if value < vv.Value {
-								maxValueMap[newDate] = vv.Value
+						if dateTime.Year() < startYear {
+							continue
+						}
+						// 月度的2月29号日期改为2月28日
+						if dateTime.Month() == 2 && dateTime.Day() == 29 {
+							dateTime = dateTime.AddDate(0, 0, -1)
+						}
+						newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
+						if seasonConfig.JumpYear == 1 {
+							if startDate.After(endDate) {
+								// 如果跨年且不到一年
+								// 全年截取一部分
+								if newDate.Before(startDate.AddDate(0, 0, 1)) && newDate.After(endDate) {
+									continue
+								}
+								if newDate.After(startDate.AddDate(0, 0, -1)) {
+									// 减一年
+									newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year()-1, 0, 0)
+								}
+								// 处理上下限列表
+								if value, ok := maxValueMap[newDate]; ok {
+									if value < vv.Value {
+										maxValueMap[newDate] = vv.Value
+									}
+								} else {
+									maxValueMap[newDate] = vv.Value
+								}
+
+								if value, ok := minValueMap[newDate]; ok {
+									if value > vv.Value {
+										minValueMap[newDate] = vv.Value
+									}
+								} else {
+									minValueMap[newDate] = vv.Value
+								}
+
+								dataTimeMap[newDate] = newDate
+							} else {
+								// 如果跨年且大于等于一年
+								// double后截取
+								if newDate.After(startDate) {
+									// 处理上下限列表
+									if value, ok := maxValueMap[newDate]; ok {
+										if value < vv.Value {
+											maxValueMap[newDate] = vv.Value
+										}
+									} else {
+										maxValueMap[newDate] = vv.Value
+									}
+
+									if value, ok := minValueMap[newDate]; ok {
+										if value > vv.Value {
+											minValueMap[newDate] = vv.Value
+										}
+									} else {
+										minValueMap[newDate] = vv.Value
+									}
+
+									dataTimeMap[newDate] = newDate
+								}
+
+								newDate = dateTime.AddDate(time.Now().Year()-dateTime.Year()+1, 0, 0)
+								newEndDate := endDate.AddDate(1, 0, 0)
+								if newDate.Before(newEndDate) {
+									// 处理上下限列表
+									if value, ok := maxValueMap[newDate]; ok {
+										if value < vv.Value {
+											maxValueMap[newDate] = vv.Value
+										}
+									} else {
+										maxValueMap[newDate] = vv.Value
+									}
+
+									if value, ok := minValueMap[newDate]; ok {
+										if value > vv.Value {
+											minValueMap[newDate] = vv.Value
+										}
+									} else {
+										minValueMap[newDate] = vv.Value
+									}
+
+									dataTimeMap[newDate] = newDate
+								}
+
 							}
 						} else {
-							maxValueMap[newDate] = vv.Value
-						}
+							// 如果不跨年 正常获取
+							// 获取当前日期所在区间
+							// 处理上下限列表
+							if value, ok := maxValueMap[newDate]; ok {
+								if value < vv.Value {
+									maxValueMap[newDate] = vv.Value
+								}
+							} else {
+								maxValueMap[newDate] = vv.Value
+							}
 
-						if value, ok := minValueMap[newDate]; ok {
-							if value > vv.Value {
+							if value, ok := minValueMap[newDate]; ok {
+								if value > vv.Value {
+									minValueMap[newDate] = vv.Value
+								}
+							} else {
 								minValueMap[newDate] = vv.Value
 							}
-						} else {
-							minValueMap[newDate] = vv.Value
+
+							dataTimeMap[newDate] = newDate
 						}
-						dataTimeMap[newDate] = newDate
+
 					}
 				}
 			}
@@ -3414,6 +3641,7 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 				} else {
 					maxMinItem.MinValue = maxValueMap[v]
 				}
+
 				maxMinItem.DataTime = v.Format(utils.FormatDate)
 				maxMinItem.DataTimestamp = v.UnixNano() / 1e6
 
@@ -3440,9 +3668,8 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 			dataTimeMap := make(map[time.Time]time.Time)
 			dataTimeList := make([]string, 0)
 			valueMap := make(map[time.Time]float64)
-
 			averageDataList := make([]*data_manage.SamePeriodAverageData, 0)
-			for i := len(quarterDataList) - 1; i > len(quarterDataList)-seasonConfig.SamePeriodAverage.Year && i > 0; i-- {
+			for i := len(quarterDataList) - 1; i >= 0; i-- {
 				// 插值成日度
 				dataTimeList, _, err = HandleDataByLinearRegressionToList(quarterDataList[i].DataList, handleDataMap)
 				if err != nil {
@@ -3455,6 +3682,18 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 						err = errors.New("时间格式化异常, Err:" + e.Error())
 						return
 					}
+					startYear := time.Now().AddDate(-seasonConfig.SamePeriodAverage.Year, 0, 0).Year()
+					if dateTime.Year() < startYear {
+						continue
+					}
+					// 不包含2月29号
+					if dateTime.Month() == 2 && dateTime.Day() == 29 {
+						continue
+					}
+					// 不包含当年
+					if quarterDataList[i].ChartLegend == strconv.Itoa(time.Now().Year()) {
+						continue
+					}
 					newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 					// 处理均值
 					if value, ok := valueMap[newDate]; ok {
@@ -3497,6 +3736,8 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 
 		// 自定义同期标准差
 		if seasonConfig.SamePeriodStandardDeviation.Year > 1 && seasonConfig.SamePeriodStandardDeviation.Multiple > 0 {
+			startYear := time.Now().AddDate(-seasonConfig.SamePeriodStandardDeviation.Year, 0, 0).Year()
+
 			// 先算均值,再算标准差
 			handleDataMap := make(map[string]float64)
 			dataTimeMap := make(map[time.Time]time.Time)
@@ -3518,6 +3759,13 @@ func SeasonChartData(dataList []*data_manage.ChartEdbInfoMapping, seasonExtraCon
 						err = errors.New("时间格式化异常, Err:" + e.Error())
 						return
 					}
+					if dateTime.Year() < startYear {
+						continue
+					}
+					// 不包含2月29号
+					if dateTime.Month() == 2 && dateTime.Day() == 29 {
+						continue
+					}
 					newDate := dateTime.AddDate(time.Now().Year()-dateTime.Year(), 0, 0)
 					// 处理均值
 					if value, ok := valueMap[newDate]; ok {
@@ -3616,304 +3864,6 @@ func PercentileAlgorithm(x float64, data []float64) float64 {
 	return y
 }
 
-func MarkerLineCalculate(markerLine data_manage.MarkersLine, dataList interface{}, chartInfo *data_manage.ChartInfoView) (value string, err error) {
-	if markerLine.Calculation == 1 {
-		// 区间均值
-		averge := 0.0
-		length := 0
-		// 计算左轴
-		if chartInfo.ChartType == 2 && markerLine.EdbType == 0 {
-			//季节性图结构体不一样
-			quarterDataList := dataList.(data_manage.QuarterDataList)
-			for _, quarterData := range quarterDataList[len(quarterDataList)-1:] {
-				for _, vv := range quarterData.DataList {
-					if markerLine.TimeIntervalType == 1 {
-						startDate := markerLine.StartDate.Date
-						endDate := time.Now().Format(utils.FormatDate)
-						if markerLine.StartDate.TimeType == 2 {
-							// 动态
-							if markerLine.StartDate.Conf.BaseDate == 1 {
-								// 指标最新日期
-								startDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
-							} else {
-								// 系统日期
-								startDate = time.Now().Format(utils.FormatDate)
-							}
-							startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
-						}
-						if markerLine.EndDate.TimeType == 1 {
-							// 固定
-							endDate = markerLine.EndDate.Date
-						} else if markerLine.EndDate.TimeType == 2 {
-							// 动态
-							if markerLine.StartDate.Conf.BaseDate == 1 {
-								// 指标最新日期
-								endDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
-							} else {
-								// 系统日期
-								endDate = time.Now().Format(utils.FormatDate)
-							}
-							endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
-						}
-						if vv.DataTime >= startDate && vv.DataTime <= endDate {
-							averge += vv.Value
-							length +=1
-						}
-					} else {
-						averge += vv.Value
-						length +=1
-					}
-				}
-				averge = averge / float64(length)
-				value = fmt.Sprintf("%.2f", averge)
-			}
-		} else {
-			dataList := dataList.([]*data_manage.EdbDataList)
-			for _, dataItem := range dataList {
-				if markerLine.TimeIntervalType == 1 {
-					startDate := markerLine.StartDate.Date
-					endDate := time.Now().Format(utils.FormatDate)
-					if markerLine.StartDate.TimeType == 2 {
-						// 动态
-						if markerLine.StartDate.Conf.BaseDate == 1 {
-							// 指标最新日期
-							startDate = dataList[len(dataList)-1].DataTime
-						} else {
-							// 系统日期
-							startDate = time.Now().Format(utils.FormatDate)
-						}
-						startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
-					}
-					if markerLine.EndDate.TimeType == 1 {
-						// 固定
-						endDate = markerLine.EndDate.Date
-					} else if markerLine.EndDate.TimeType == 2 {
-						// 动态
-						if markerLine.StartDate.Conf.BaseDate == 1 {
-							// 指标最新日期
-							endDate = dataList[len(dataList)-1].DataTime
-						} else {
-							// 系统日期
-							endDate = time.Now().Format(utils.FormatDate)
-						}
-						endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
-					}
-					if dataItem.DataTime >= startDate && dataItem.DataTime <= endDate {
-						averge += dataItem.Value
-						length += 1
-					}
-				} else {
-					averge += dataItem.Value
-					length += 1
-				}
-			}
-			averge = averge / float64(length)
-
-			value = fmt.Sprintf("%.2f", averge)
-		}
-	} else if markerLine.Calculation == 2 {
-		// 区间均值加N倍标准差
-		averge := 0.0
-		length := 0
-		// 计算左轴
-		if chartInfo.ChartType == 2 && markerLine.EdbType == 0 {
-			//季节性图结构体不一样
-			faloatList := make([]float64, 0)
-			quarterDataList := dataList.(data_manage.QuarterDataList)
-			for _, quarterData := range quarterDataList[len(quarterDataList)-1:] {
-				for _, vv := range quarterData.DataList {
-					if markerLine.TimeIntervalType == 1 {
-						startDate := markerLine.StartDate.Date
-						endDate := time.Now().Format(utils.FormatDate)
-						if markerLine.StartDate.TimeType == 2 {
-							// 动态
-							if markerLine.StartDate.Conf.BaseDate == 1 {
-								// 指标最新日期
-								startDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
-							} else {
-								// 系统日期
-								startDate = time.Now().Format(utils.FormatDate)
-							}
-							startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
-						}
-						if markerLine.EndDate.TimeType == 1 {
-							// 固定
-							endDate = markerLine.EndDate.Date
-						} else if markerLine.EndDate.TimeType == 2 {
-							// 动态
-							if markerLine.StartDate.Conf.BaseDate == 1 {
-								// 指标最新日期
-								endDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
-							} else {
-								// 系统日期
-								endDate = time.Now().Format(utils.FormatDate)
-							}
-							endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
-						}
-						if vv.DataTime >= startDate && vv.DataTime <= endDate {
-							faloatList = append(faloatList, vv.Value)
-							averge += vv.Value
-							length += 1
-						}
-					} else {
-						faloatList = append(faloatList, vv.Value)
-						averge += vv.Value
-						length += 1
-					}
-				}
-				averge = averge / float64(length)
-				stdev := utils.CalculateStandardDeviation(faloatList)
-				stdev, _ = decimal.NewFromFloat(stdev).Round(4).Float64()
-
-				value = fmt.Sprintf("%.2f", averge+stdev*markerLine.CalculationValue)
-			}
-
-		} else {
-			dataList := dataList.([]*data_manage.EdbDataList)
-			floatList := make([]float64, 0)
-			for _, dataItem := range dataList {
-				if markerLine.TimeIntervalType == 1 {
-					startDate := markerLine.StartDate.Date
-					endDate := time.Now().Format(utils.FormatDate)
-					if markerLine.StartDate.TimeType == 2 {
-						// 动态
-						if markerLine.StartDate.Conf.BaseDate == 1 {
-							// 指标最新日期
-							startDate = dataList[len(dataList)-1].DataTime
-						} else {
-							// 系统日期
-							startDate = time.Now().Format(utils.FormatDate)
-						}
-						startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
-					}
-					if markerLine.EndDate.TimeType == 1 {
-						// 固定
-						endDate = markerLine.EndDate.Date
-					} else if markerLine.EndDate.TimeType == 2 {
-						// 动态
-						if markerLine.StartDate.Conf.BaseDate == 1 {
-							// 指标最新日期
-							endDate = dataList[len(dataList)-1].DataTime
-						} else {
-							// 系统日期
-							endDate = time.Now().Format(utils.FormatDate)
-						}
-						endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
-					}
-					if dataItem.DataTime >= startDate && dataItem.DataTime <= endDate {
-						floatList = append(floatList, dataItem.Value)
-						averge += dataItem.Value
-						length += 1
-					}
-				} else {
-					floatList = append(floatList, dataItem.Value)
-					averge += dataItem.Value
-					length += 1
-				}
-			}
-			averge = averge / float64(length)
-
-			stdev := utils.CalculateStandardDeviation(floatList)
-			stdev, _ = decimal.NewFromFloat(stdev).Round(4).Float64()
-
-			value = fmt.Sprintf("%.2f", averge+stdev*markerLine.CalculationValue)
-		}
-	} else if markerLine.Calculation == 3 {
-		// 区间个数分位
-		markerLineValue := 0.0
-		if chartInfo.ChartType == 2 && markerLine.EdbType == 0 {
-			//季节性图结构体不一样
-			faloatList := make([]float64, 0)
-			quarterDataList := dataList.(data_manage.QuarterDataList)
-			for _, quarterData := range quarterDataList[len(quarterDataList)-1:] {
-				for _, vv := range quarterData.DataList {
-					if markerLine.TimeIntervalType == 1 {
-						startDate := markerLine.StartDate.Date
-						endDate := time.Now().Format(utils.FormatDate)
-						if markerLine.StartDate.TimeType == 2 {
-							// 动态
-							if markerLine.StartDate.Conf.BaseDate == 1 {
-								// 指标最新日期
-								startDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
-							} else {
-								// 系统日期
-								startDate = time.Now().Format(utils.FormatDate)
-							}
-							startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
-						}
-						if markerLine.EndDate.TimeType == 1 {
-							// 固定
-							endDate = markerLine.EndDate.Date
-						} else if markerLine.EndDate.TimeType == 2 {
-							// 动态
-							if markerLine.StartDate.Conf.BaseDate == 1 {
-								// 指标最新日期
-								endDate = quarterData.DataList[len(quarterData.DataList)-1].DataTime
-							} else {
-								// 系统日期
-								endDate = time.Now().Format(utils.FormatDate)
-							}
-							endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
-						}
-						if vv.DataTime >= startDate && vv.DataTime <= endDate {
-							faloatList = append(faloatList, vv.Value)
-						}
-					} else {
-						faloatList = append(faloatList, vv.Value)
-					}
-				}
-
-				markerLineValue = PercentileAlgorithm(markerLine.CalculationValue, faloatList)
-				value = fmt.Sprintf("%.2f", markerLineValue)
-			}
-
-		} else {
-			dataList := dataList.([]*data_manage.EdbDataList)
-			floatList := make([]float64, 0)
-			for _, dataItem := range dataList {
-				if markerLine.TimeIntervalType == 1 {
-					startDate := markerLine.StartDate.Date
-					endDate := time.Now().Format(utils.FormatDate)
-					if markerLine.StartDate.TimeType == 2 {
-						// 动态
-						if markerLine.StartDate.Conf.BaseDate == 1 {
-							// 指标最新日期
-							startDate = dataList[len(dataList)-1].DataTime
-						} else {
-							// 系统日期
-							startDate = time.Now().Format(utils.FormatDate)
-						}
-						startDate, err = HandleDateChange(startDate, markerLine.StartDate.Conf)
-					}
-					if markerLine.EndDate.TimeType == 1 {
-						// 固定
-						endDate = markerLine.EndDate.Date
-					} else if markerLine.EndDate.TimeType == 2 {
-						// 动态
-						if markerLine.StartDate.Conf.BaseDate == 1 {
-							// 指标最新日期
-							endDate = dataList[len(dataList)-1].DataTime
-						} else {
-							// 系统日期
-							endDate = time.Now().Format(utils.FormatDate)
-						}
-						endDate, err = HandleDateChange(endDate, markerLine.StartDate.Conf)
-					}
-					if dataItem.DataTime >= startDate && dataItem.DataTime <= endDate {
-						floatList = append(floatList, dataItem.Value)
-					}
-				} else {
-					floatList = append(floatList, dataItem.Value)
-				}
-			}
-
-			markerLineValue = PercentileAlgorithm(markerLine.CalculationValue, floatList)
-			value = fmt.Sprintf("%.2f", markerLineValue)
-		}
-	}
-	return
-}
-
 // HandleDateChange 处理日期变换
 func HandleDateChange(date string, edbDateConf data_manage.EdbDateChangeConf) (newDate string, err error) {
 	newDate = date

+ 10 - 1
services/data/chart_theme.go

@@ -79,7 +79,16 @@ func GetThemePreviewChartEdbData(chartType int, calendar, startDate, endDate str
 	switch chartType {
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
-			dataResp, err = SeasonChartData(edbList, seasonExtraConfig)
+			// 季节性图计算不管图上数据时间,拿所有数据
+			_, tempEdbList, e := getEdbDataMapList(0, chartType, calendar, "1990-01-01", "", mappingList, seasonExtraConfig)
+			if e != nil {
+				err = e
+				return
+			}
+			dataResp, err = SeasonChartData(tempEdbList, seasonExtraConfig)
+		} else {
+			// 兼容无配置的老图
+			dataResp = new(data_manage.SeasonChartResp)
 		}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)

+ 48 - 1
services/data/edb_data.go

@@ -412,6 +412,9 @@ func GetPageData(edbInfoId, source, subSource int, endDataTime string, startSize
 	if source == utils.DATA_SOURCE_BUSINESS && utils.UseMongo {
 		return getPageDataByMongo(edbInfoId, source, subSource, endDataTime, startSize, pageSize)
 	}
+	if source == utils.DATA_SOURCE_THS && subSource == utils.DATA_SUB_SOURCE_HIGH_FREQUENCY && utils.UseMongo {
+		return getThsHfPageDataByMongo(edbInfoId, source, subSource, endDataTime, startSize, pageSize)
+	}
 
 	// 默认走mysql
 	return getPageDataByMysql(edbInfoId, source, subSource, endDataTime, startSize, pageSize)
@@ -619,4 +622,48 @@ func GetEdbDataTbzForSeason(frequency string, tmpDataList []*data_manage.EdbData
 	}
 
 	return
-}
+}
+
+func getThsHfPageDataByMongo(edbInfoId, source, subSource int, endDataTime string, startSize, pageSize int) (dataCount int, dataList []*data_manage.EdbData, err error) {
+	dataList = make([]*data_manage.EdbData, 0)
+
+	mogDataObj := mgo.EdbDataThsHf{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
+	}
+
+	// 结束日期
+	dateCondition, err := mgo.BuildDateCondition("", endDataTime)
+	if err != nil {
+		return
+	}
+	if len(dateCondition) > 0 {
+		queryConditions["data_time"] = dateCondition
+	}
+
+	// 获取数据总量
+	tmpCount, tmpErr := mogDataObj.GetCountDataList(queryConditions)
+	if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+		err = tmpErr
+		return
+	}
+	dataCount = int(tmpCount)
+
+	// 获取列表数据
+	tmpDataList, tmpErr := mogDataObj.GetPageDataList(queryConditions, int64(startSize), int64(pageSize), []string{"-data_time"})
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	for k, v := range tmpDataList {
+		dataList = append(dataList, &data_manage.EdbData{
+			EdbDataId: k + 1,
+			EdbInfoId: v.EdbInfoId,
+			DataTime:  v.DataTime.Format(utils.FormatDate),
+			Value:     v.Value,
+		})
+	}
+
+	return
+}

+ 84 - 0
services/data/manual.go

@@ -0,0 +1,84 @@
+package data
+
+import (
+	"eta/eta_mobile/models/data_manage"
+	"eta/eta_mobile/models/system"
+	"eta/eta_mobile/utils"
+	"fmt"
+)
+
+func GetManualSysUser(keyWord string) (list []*data_manage.ManualSysUser, err error) {
+	//departmentId := 1
+	list = make([]*data_manage.ManualSysUser, 0)
+	departmentItems, err := system.GetSysDepartmentAll()
+	if err != nil {
+		return list, err
+	}
+	for _, dv := range departmentItems {
+		department := new(data_manage.ManualSysUser)
+		department.ItemId = dv.DepartmentId * 10000
+		department.ItemName = dv.DepartmentName
+
+		fmt.Println(department.ItemId, department.ItemName)
+		//GetSysuserList
+
+		var condition string
+		var pars []interface{}
+
+		if keyWord != "" {
+			condition += ` AND (real_name LIKE ? OR admin_name LIKE ? OR mobile LIKE ? )  `
+			pars = utils.GetLikeKeywordPars(pars, keyWord, 3)
+		}
+		sysUsers, err := system.GetSysUserItems(condition, pars)
+		if err != nil {
+			return list, err
+		}
+
+		groups, err := system.GetSysGroupByDepartmentId(dv.DepartmentId)
+		if err != nil {
+			return list, err
+		}
+		dg := make([]*data_manage.ManualSysUser, 0)
+		for _, v := range groups {
+			group := new(data_manage.ManualSysUser)
+			group.ItemId = v.DepartmentId * 100000
+			group.ItemName = v.GroupName
+
+			for _, sv := range sysUsers {
+				user := new(data_manage.ManualSysUser)
+				user.ItemId = sv.AdminId
+				user.ItemName = sv.RealName
+				if sv.GroupId == v.GroupId {
+					group.Children = append(group.Children, user)
+				}
+			}
+			if len(group.Children) > 0 {
+				dg = append(dg, group)
+			}
+		}
+
+		if len(groups) <= 0 {
+			group := new(data_manage.ManualSysUser)
+			group.ItemId = dv.DepartmentId * 100000
+			group.ItemName = "无分组"
+
+			for _, sv := range sysUsers {
+				user := new(data_manage.ManualSysUser)
+				user.ItemId = sv.AdminId
+				user.ItemName = sv.RealName
+				if sv.DepartmentId == dv.DepartmentId && sv.GroupId == 0 {
+					group.Children = append(group.Children, user)
+				}
+			}
+			if len(group.Children) > 0 {
+				dg = append(dg, group)
+			}
+		}
+
+		if len(dg) > 0 {
+			department.Children = dg
+			list = append(list, department)
+		}
+	}
+	return
+}

+ 48 - 0
services/ppt/ppt_group.go

@@ -1744,3 +1744,51 @@ func GetPptList(adminId int, keyword string) (ret models.RespGroupPptList, err e
 	ret.Total = len(list)
 	return
 }
+
+
+// SearchPptList PPT搜索(我的/公开PPT)
+func SearchPptList(adminId int, keyword string) (ret models.RespGroupPptList, err error) {
+	list := make([]*models.RespGroupPptListItem, 0)
+	ret.List = list
+
+	var condition string
+	var pars []interface{}
+
+	// 公开的PPT或是我的非公开PPT
+	condition += ` AND (is_share = 1 OR (admin_id = ? AND is_share = 0)) `
+	pars = append(pars, adminId)
+
+	if keyword != `` {
+		kw := fmt.Sprint("%", keyword, "%")
+		condition += ` AND (title LIKE ? OR admin_real_name LIKE ? ) `
+		pars = append(pars, kw, kw)
+	}
+	pptList, err := models.GetAllPptV2List(condition, pars)
+
+	if len(pptList) <= 0 {
+		return
+	}
+
+	for _, v := range pptList {
+		tmpV := &models.RespGroupPptListItem{
+			GroupPptId:    int64(v.PptId),
+			PptId:         int64(v.PptId),
+			TemplateType:  v.TemplateType,
+			BackgroundImg: v.BackgroundImg,
+			Title:         v.Title,
+			PptCreateTime: v.CreateTime.Format(utils.FormatDateTime),
+			AdminId:       v.AdminId,
+			AdminRealName: v.AdminRealName,
+			PptVersion:    v.PptVersion,
+			IsSingleShare: v.IsShare,
+			PptxUrl:       v.PptxUrl,
+			ReportId:      v.ReportId,
+			ReportCode:    v.ReportCode,
+		}
+		list = append(list, tmpV)
+	}
+
+	ret.List = list
+	ret.Total = len(list)
+	return
+}

+ 5 - 2
utils/constants.go

@@ -163,6 +163,7 @@ const (
 	DATA_SOURCE_GFEX                                 = 78       // 广州期货交易所->76
 	DATA_SOURCE_ICPI                                 = 79       // ICPI消费价格指数->79
 	DATA_SOURCE_BUSINESS                             = 84       // 来源于自有数据
+	DATA_SOURCE_SCI_HQ                               = 88       // 卓创红期
 )
 
 // 数据刷新频率
@@ -404,8 +405,9 @@ const (
 
 // 子数据来源渠道
 const (
-	DATA_SUB_SOURCE_EDB  = iota //经济数据库
-	DATA_SUB_SOURCE_DATE        //日期序列
+	DATA_SUB_SOURCE_EDB            = iota //经济数据库
+	DATA_SUB_SOURCE_DATE                  //日期序列
+	DATA_SUB_SOURCE_HIGH_FREQUENCY        //高频数据
 )
 
 const (
@@ -438,6 +440,7 @@ var DataSourceEnMap = map[int]string{
 	DATA_SOURCE_BAIINFO:          "BAIINFO",
 	DATA_SOURCE_MYSTEEL_CHEMICAL: "Horizon Insights",
 	DATA_SOURCE_FUBAO:            "FuBao",
+	DATA_SOURCE_SCI_HQ:           "SCI(hongqi)",
 }
 
 const (