Эх сурвалжийг харах

Merge branch 'master' into feature/eta1.9.7_range_chart

xyxie 6 сар өмнө
parent
commit
a58b3f2cf6

+ 2 - 1
.gitignore

@@ -7,4 +7,5 @@
 /.idea/
 /.DS_Store
 *.tar.gz
-*.exe
+*.exe
+/.vscode/

+ 68 - 2
controllers/data_manage/edb_info.go

@@ -20,11 +20,12 @@ import (
 	etaTrialService "eta/eta_mobile/services/eta_trial"
 	"eta/eta_mobile/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"strconv"
 	"strings"
 	"sync"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // EdbInfoController 数据管理
@@ -1754,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]
@@ -2384,6 +2431,11 @@ func (this *EdbInfoController) EdbInfoEdit() {
 		return
 	}
 
+	// 记录旧的指标基本信息
+	oldEdbName := edbInfo.EdbName
+	oldFrequency := edbInfo.Frequency
+	oldUnit := edbInfo.Unit
+
 	var haveOperaAuth bool
 	// 权限校验
 	{
@@ -2475,8 +2527,22 @@ func (this *EdbInfoController) EdbInfoEdit() {
 	//			}
 	//		}
 	//	}
-	//}
 
+	// 新增操作记录
+	{
+		oldEdbInfo := new(data_manage.EdbInfo)
+		oldEdbInfo.EdbInfoId = edbInfo.EdbInfoId
+		oldEdbInfo.EdbName = oldEdbName
+		oldEdbInfo.Frequency = oldFrequency
+		oldEdbInfo.Unit = oldUnit
+		newEdbInfoRecord := new(data_manage.EdbInfoEditRecord)
+		newEdbInfoRecord.EdbName = req.EdbName
+		newEdbInfoRecord.Frequency = req.Frequency
+		newEdbInfoRecord.Unit = req.Unit
+		newEdbInfoRecord.OperateUserId = sysUser.AdminId
+		newEdbInfoRecord.OperateUserRealName = sysUser.RealName
+		go data.AddEditEdbInfoRcord(oldEdbInfo, newEdbInfoRecord)
+	}
 	//新增操作日志
 	{
 		edbLog := new(data_manage.EdbInfoLog)

+ 4 - 1
controllers/data_manage/edb_info_calculate.go

@@ -9,11 +9,12 @@ import (
 	"eta/eta_mobile/services/data/data_manage_permission"
 	"eta/eta_mobile/utils"
 	"fmt"
-	"github.com/rdlucklib/rdluck_tools/paging"
 	"net/url"
 	"strconv"
 	"strings"
 	"time"
+
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 // 计算指标
@@ -848,6 +849,8 @@ func (this *ChartInfoController) CalculateBatchEdit() {
 		Frequency:     req.Frequency,
 		Unit:          req.Unit,
 		ClassifyId:    req.ClassifyId,
+		AdminId:       sysUser.AdminId,
+		AdminName:     sysUser.RealName,
 		Formula:       req.Formula, //N数值移动平均计算、环比值、环差值
 		FromEdbInfoId: req.FromEdbInfoId,
 		Source:        req.Source,

+ 38 - 3
controllers/data_manage/future_good/future_good_chart_info.go

@@ -549,6 +549,9 @@ func (this *FutureGoodChartInfoController) ChartInfoAdd() {
 	resp.UniqueCode = chartInfo.UniqueCode
 	resp.ChartType = req.ChartType
 
+	chartInfo.ChartInfoId = chartInfoId
+	// 添加指标引用记录
+	//_ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartInfo)
 	//添加es数据
 	go data.EsAddOrEditChartInfo(chartInfoId)
 
@@ -772,6 +775,9 @@ func (this *FutureGoodChartInfoController) ChartInfoEdit() {
 	resp.UniqueCode = chartItem.UniqueCode
 	resp.ChartType = req.ChartType
 
+	// 添加指标引用记录
+	//_ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartItem)
+
 	//添加es数据
 	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
 	//修改my eta es数据
@@ -1303,6 +1309,10 @@ func getFutureGoodChartInfo(chartInfo *data_manage.ChartInfoView, chartType, dat
 	}
 	futureGoodEdbInfoMapping, err = data_manage.GetFutureGoodEdbChartEdbMapping(chartInfoId)
 	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "期货指标不存在"
+			return
+		}
 		br.Msg = "获取失败"
 		br.ErrMsg = "获取图表,指标信息失败,Err:" + err.Error()
 		return
@@ -1348,7 +1358,7 @@ func getFutureGoodChartInfo(chartInfo *data_manage.ChartInfoView, chartType, dat
 
 	baseEdbInfoId := barConfig.BaseEdbInfoId
 	var baseEdbInfoMapping *data_manage.ChartEdbInfoMapping
-	// todo 兼容历史数据,
+
 	if baseEdbInfoId == 0 {
 		// 默认取第一个现货指标
 		baseEdbInfoId = edbInfoMappingList[0].EdbInfoId
@@ -1678,7 +1688,7 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 
 	baseEdbInfoId := barConfig.BaseEdbInfoId
 	var baseEdbInfoMapping *data_manage.ChartEdbInfoMapping
-	// todo 兼容历史数据,
+
 	if baseEdbInfoId == 0 {
 		// 默认取第一个现货指标
 		baseEdbInfoId = edbInfoMappingList[0].EdbInfoId
@@ -2154,7 +2164,6 @@ func (this *FutureGoodChartInfoController) BaseChartInfoDetailFromUniqueCode() {
 
 		baseEdbInfoId := barConfig.BaseEdbInfoId
 		var baseEdbInfoMapping *data_manage.ChartEdbInfoMapping
-		// todo 兼容历史数据,
 		if baseEdbInfoId == 0 {
 			// 默认取第一个现货指标
 			baseEdbInfoId = edbInfoMappingList[0].EdbInfoId
@@ -3400,6 +3409,32 @@ func (this *FutureGoodChartInfoController) BaseInfoEdit() {
 				return
 			}
 			chartItem.ExtraConfig = string(barConfigByte)
+
+			xDataByte, e := json.Marshal(xDataList)
+			if e != nil {
+				br.Msg = "商品价格曲线图配置异常"
+				br.ErrMsg = "商品价格曲线图配置异常 Err:" + e.Error()
+				return
+			}
+			//同步修改利润表扩展表
+			chartInfoFutureGoodProfit := new(future_good.ChartInfoFutureGoodProfit)
+			if e = chartInfoFutureGoodProfit.GetItemById(chartItem.ChartInfoId); e != nil {
+				br.Msg = "商品利润曲线图不存在"
+				br.ErrMsg = "商品利润曲线图查询出错 Err:" + e.Error()
+				return
+			}
+			chartInfoFutureGoodProfit.XValue = string(xDataByte)
+			// 更改扩展图表信息
+			// 查找商品利润图表的扩展信息
+			chartInfoFutureGoodProfit.ModifyTime = time.Now()
+			updateStr := []string{"ModifyTime", "XValue"}
+			err = chartInfoFutureGoodProfit.Update(updateStr)
+			if err != nil {
+				br.Msg = "商品利润曲线图更新失败"
+				br.ErrMsg = "商品利润曲线图更新失败 Err:" + e.Error()
+				return
+			}
+
 		}
 		err = data_manage.EditBaseFutureGoodProfitChartInfoAndEdbEnInfo(chartItem, &req, this.Lang)
 	default:

+ 13 - 1
controllers/data_manage/future_good/future_good_profit_chart_info.go

@@ -332,6 +332,8 @@ func (this *FutureGoodChartInfoController) ProfitChartInfoAdd() {
 	resp.UniqueCode = chartInfo.UniqueCode
 	resp.ChartType = req.ChartType
 
+	// 添加指标引用记录
+	//_ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartInfo)
 	//添加es数据
 	go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
 
@@ -664,6 +666,8 @@ func (this *FutureGoodChartInfoController) ProfitChartInfoEdit() {
 	resp.UniqueCode = chartItem.UniqueCode
 	resp.ChartType = req.ChartType
 
+	// 添加指标引用记录
+	//_ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartItem)
 	//添加es数据
 	go data.EsAddOrEditChartInfo(chartItem.ChartInfoId)
 	//修改my eta es数据
@@ -844,7 +848,15 @@ func copyProfitChartInfo(oldChartInfo *data_manage.ChartInfo, chartClassifyId in
 		br.ErrMsg = "保存商品利润图表失败,Err:" + err.Error()
 		return
 	}
-
+	// 添加指标引用记录
+	edbInfoIdArr := make([]int, 0)
+	edbInfoIdArrStr := strings.Split(oldChartInfo.EdbInfoIds, ",")
+	for _, v := range edbInfoIdArrStr {
+		i, _ := strconv.Atoi(v)
+		edbInfoIdArr = append(edbInfoIdArr, i)
+	}
+	//保存图表与指标的关系
+	//_ = data.SaveChartEdbInfoRelation(edbInfoIdArr, chartInfo)
 	//添加es数据
 	go data.EsAddOrEditChartInfo(chartInfo.ChartInfoId)
 	//修改my eta es数据

+ 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
+}

+ 140 - 138
models/data_manage/chart_info.go

@@ -1607,6 +1607,18 @@ type SetChartInfoImageReq struct {
 	ImageUrl    string `description:"图表图片地址"`
 }
 
+type FutureChartInfoDetailFromUniqueCodeResp struct {
+	ChartInfo            *ChartInfoView
+	Status               bool `description:"true:图表存在,false:图表不存在"`
+	EdbInfoList          []*ChartEdbInfoMapping
+	XEdbIdValue          []int                     `description:"柱方图的x轴数据,指标id"`
+	YDataList            []YData                   `description:"柱方图的y轴数据"`
+	XDataList            []XData                   `description:"商品价格曲线的X轴数据"`
+	BarChartInfo         FutureGoodBarChartInfoReq `description:"柱方图的配置"`
+	CorrelationChartInfo *CorrelationInfo          `description:"相关性图表信息"`
+	DataResp             interface{}               `description:"图表数据,根据图的类型而定的,没有确定的数据格式"`
+}
+
 func EditChartInfoImage(req *SetChartInfoImageReq) (err error) {
 	o := orm.NewOrmUsingDB("data")
 
@@ -1631,17 +1643,6 @@ type ChartInfoDetailFromUniqueCodeResp struct {
 	CorrelationChartInfo *CorrelationInfo `description:"相关性图表信息"`
 	DataResp             interface{}      `description:"图表数据,根据图的类型而定的,没有确定的数据格式"`
 }
-type FutureChartInfoDetailFromUniqueCodeResp struct {
-	ChartInfo            *ChartInfoView
-	Status               bool `description:"true:图表存在,false:图表不存在"`
-	EdbInfoList          []*ChartEdbInfoMapping
-	XEdbIdValue          []int                     `description:"柱方图的x轴数据,指标id"`
-	YDataList            []YData                   `description:"柱方图的y轴数据"`
-	XDataList            []XData                   `description:"商品价格曲线的X轴数据"`
-	BarChartInfo         FutureGoodBarChartInfoReq `description:"柱方图的配置"`
-	CorrelationChartInfo *CorrelationInfo          `description:"相关性图表信息"`
-	DataResp             interface{}               `description:"图表数据,根据图的类型而定的,没有确定的数据格式"`
-}
 
 func GetChartInfoByUniqueCode(uniqueCode string) (item *ChartInfo, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -1933,6 +1934,13 @@ func ModifyChartInfoUserIdByOldUserId(oldUserIdList []int, userId int, userName
 	return
 }
 
+type FutureGoodBarChartInfoReq struct {
+	EdbInfoIdList []BarChartInfoEdbItemReq `description:"指标信息"`
+	DateList      []BarChartInfoDateReq    `description:"日期配置"`
+	XDataList     []XData                  `description:"横轴配置"`
+	BaseEdbInfoId int                      `description:"日期基准指标id"`
+}
+
 // BarChartInfoReq 柱方图预览请求数据
 type BarChartInfoReq struct {
 	EdbInfoIdList []BarChartInfoEdbItemReq `description:"指标信息"`
@@ -1944,13 +1952,6 @@ type BarChartInfoReq struct {
 	UnitEn        string                   `description:"英文单位"`
 }
 
-type FutureGoodBarChartInfoReq struct {
-	EdbInfoIdList []BarChartInfoEdbItemReq `description:"指标信息"`
-	DateList      []BarChartInfoDateReq    `description:"日期配置"`
-	XDataList     []XData                  `description:"横轴配置"`
-	BaseEdbInfoId int                      `description:"日期基准指标id"`
-}
-
 // BarChartInfoEdbItemReq 柱方图预览请求数据(指标相关)
 type BarChartInfoEdbItemReq struct {
 	EdbInfoId     int     `description:"指标ID"`
@@ -2395,6 +2396,127 @@ type RadarYData struct {
 	Value []float64 `description:"每个指标的值"`
 }
 
+// 截面组合图额外配置
+type ChartSectionExtraConf struct {
+	DateConfList        []*ChartSectionDateConfItem
+	IsHeap              int                      `description:"是否堆积(1.堆积,0不堆积)"`
+	XDataList           []XData                  `description:"横轴名称设置"`
+	UnitList            *ChartSectionCombineUnit `description:"纵轴单位设置"`
+	BaseChartSeriesName string                   `description:"基准系列名称"`
+	SortType            int                      `description:"排序类型,0默认,1升序,2降序"`
+}
+
+// 截面组合图额外配置
+type ChartSectionAllExtraConf struct {
+	ChartSectionExtraConf
+	SeriesList []*ChartSectionSeriesItem
+}
+
+type ChartSectionDateConfItem struct {
+	MoveForward    int    `description:"前移的期数"`
+	EdbInfoId      int    `description:"指标ID"`
+	EdbName        string `description:"指标名称"`
+	EdbNameEn      string `description:"指标名称英文"`
+	EdbInfoType    int    `description:"指标类型"`
+	Frequency      string `description:"频度"`
+	EndDate        string `description:"最新日期"`
+	StaticDate     string `description:"固定日期"`
+	DateType       int    `description:"日期类型:0 指标日期,1系统日期, 2固定日期"`
+	DateConfName   string `description:"引用日期名称"` // 引用日期名称不能重复
+	DateConfNameEn string `description:"引用日期英文名称"`
+	DateChange     []*ChartSectionDateChange
+}
+
+// 截面组合图引用日期配置
+type ChartSectionDateChange struct {
+	Year         int
+	Month        int
+	Day          int
+	Frequency    string `description:"频度变换"`
+	FrequencyDay string `description:"频度的固定日期"`
+	ChangeType   int    `description:"日期变换类型1日期位移,2指定频率"`
+}
+
+// 截面组合图系列配置
+type ChartSectionSeriesItem struct {
+	ChartSeriesId int     `description:"系列ID"`
+	SeriesName    string  `description:"系列名称"` //系列名称不可同名
+	SeriesNameEn  string  `description:"系列英文名称"`
+	ChartStyle    string  `description:"图表类型"`
+	ChartColor    string  `description:"颜色"`
+	ChartWidth    int     `description:"线条大小"`
+	IsPoint       int     `description:"是否用数据点展示(0 否,1是)"`
+	IsNumber      int     `description:"是否用数值展示(0 否,1是)"`
+	IsAxis        int     `description:"1:左轴,0:右轴"`
+	MaxData       float64 `description:"上限"`
+	MinData       float64 `description:"下限"`
+	//IsOrder         bool    `description:"true:正序,false:逆序"`
+	EdbInfoList    []*ChartSectionSeriesEdbConf
+	DataList       []float64
+	NoDataEdbIndex []int
+}
+type ChartSectionSeriesEdbConf struct {
+	ChartSeriesEdbMappingId int `description:"映射ID"`
+	ChartSeriesId           int `description:"系列ID"`
+	//ChartInfoId             int `description:"图表ID"`
+	EdbInfoId    int `description:"指标id"`
+	DateConf     *ChartSectionSeriesDateConfItem
+	EdbName      string `description:"中文别名"`
+	EdbNameEn    string `description:"英文别名"`
+	EdbInfoType  int    `description:"指标类型"`
+	Unit         string `description:"单位"`
+	UnitEn       string `description:"英文单位"`
+	DateConfName string `description:"引用日期名称"`
+	DateConfType int    `description:"日期类型,0指标最新日期, 1引用日期"`
+}
+
+type ChartSectionCombineDataResp struct {
+	DateConfList        []*ChartSectionDateConfItem
+	IsHeap              int                      `description:"是否堆积(1.堆积,0不堆积)"`
+	XDataList           []XData                  `description:"横轴名称设置"`
+	UnitList            *ChartSectionCombineUnit `description:"纵轴单位设置"`
+	BaseChartSeriesName string                   `description:"基准系列名称"`
+	SortType            int                      `description:"排序类型,0默认,1升序,2降序"`
+	SeriesList          []*ChartSectionSeriesItem
+	LeftMin             string `description:"图表左侧最小值"`
+	LeftMax             string `description:"图表左侧最大值"`
+	RightMin            string `description:"图表右侧最小值"`
+	RightMax            string `description:"图表右侧最大值"`
+	Right2Min           string `description:"图表右侧最小值"`
+	Right2Max           string `description:"图表右侧最大值"`
+}
+
+// 系列里的指标日期配置
+type ChartSectionSeriesDateConfItem struct {
+	MoveForward int `description:"前移的期数"`
+	DateChange  []*ChartSectionDateChange
+}
+
+// PreviewSectionCombineChartReq 预览截面组合图的请求
+type PreviewSectionCombineChartReq struct {
+	ChartName       string `description:"图表名称"`
+	ChartClassifyId int    `description:"分类id"`
+	ExtraConfig     string `description:"图表额外配置信息,json字符串"`
+}
+
+type ChartSectionCombineUnit struct {
+	LeftName       string `description:"左轴单位"`
+	LeftNameEn     string `description:"左轴英文单位"`
+	RightName      string `description:"右轴单位"`
+	RightNameEn    string `description:"右轴英文单位"`
+	RightTwoName   string `description:"右2轴单位"`
+	RightTwoNameEn string `description:"右2轴英文单位"`
+}
+
+// 时序组合图额外配置
+type ChartTimeCombineExtraConf struct {
+	IsHeap int `description:"是否堆积(1.堆积,0不堆积)"`
+}
+
+type ChartTimeCombineDataResp struct {
+	IsHeap int `description:"是否堆积(1.堆积,0不堆积)"`
+}
+
 type MarkersLine struct {
 	Axis             int             `json:"axis" description:"1左轴 2右轴 3横轴"`
 	AxisName         string          `json:"axisName" description:"轴的名称,例如'左轴'"`
@@ -2615,123 +2737,3 @@ func getThsHfEdbDataListMinAndMaxByMongo(source, subSource, edbInfoId int, start
 	maxData = result.MaxValue
 	return
 }
-
-// 截面组合图额外配置
-type ChartSectionExtraConf struct {
-	DateConfList        []*ChartSectionDateConfItem
-	IsHeap              int                      `description:"是否堆积(1.堆积,0不堆积)"`
-	XDataList           []XData                  `description:"横轴名称设置"`
-	UnitList            *ChartSectionCombineUnit `description:"纵轴单位设置"`
-	BaseChartSeriesName string                   `description:"基准系列名称"`
-	SortType            int                      `description:"排序类型,0默认,1升序,2降序"`
-}
-
-// 截面组合图额外配置
-type ChartSectionAllExtraConf struct {
-	ChartSectionExtraConf
-	SeriesList []*ChartSectionSeriesItem
-}
-
-type ChartSectionDateConfItem struct {
-	MoveForward    int    `description:"前移的期数"`
-	EdbInfoId      int    `description:"指标ID"`
-	EdbName        string `description:"指标名称"`
-	EdbNameEn      string `description:"指标名称英文"`
-	EdbInfoType    int    `description:"指标类型"`
-	Frequency      string `description:"频度"`
-	EndDate        string `description:"最新日期"`
-	DateType       int    `description:"日期类型:0 指标日期,1系统日期"`
-	DateConfName   string `description:"引用日期名称"` // 引用日期名称不能重复
-	DateConfNameEn string `description:"引用日期英文名称"`
-	DateChange     []*ChartSectionDateChange
-}
-
-// 截面组合图引用日期配置
-type ChartSectionDateChange struct {
-	Year         int
-	Month        int
-	Day          int
-	Frequency    string `description:"频度变换"`
-	FrequencyDay string `description:"频度的固定日期"`
-	ChangeType   int    `description:"日期变换类型1日期位移,2指定频率"`
-}
-
-// 截面组合图系列配置
-type ChartSectionSeriesItem struct {
-	ChartSeriesId int     `description:"系列ID"`
-	SeriesName    string  `description:"系列名称"` //系列名称不可同名
-	SeriesNameEn  string  `description:"系列英文名称"`
-	ChartStyle    string  `description:"图表类型"`
-	ChartColor    string  `description:"颜色"`
-	ChartWidth    int     `description:"线条大小"`
-	IsPoint       int     `description:"是否用数据点展示(0 否,1是)"`
-	IsNumber      int     `description:"是否用数值展示(0 否,1是)"`
-	IsAxis        int     `description:"1:左轴,0:右轴"`
-	MaxData       float64 `description:"上限"`
-	MinData       float64 `description:"下限"`
-	//IsOrder         bool    `description:"true:正序,false:逆序"`
-	EdbInfoList    []*ChartSectionSeriesEdbConf
-	DataList       []float64
-	NoDataEdbIndex []int
-}
-type ChartSectionSeriesEdbConf struct {
-	ChartSeriesEdbMappingId int `description:"映射ID"`
-	ChartSeriesId           int `description:"系列ID"`
-	//ChartInfoId             int `description:"图表ID"`
-	EdbInfoId    int `description:"指标id"`
-	DateConf     *ChartSectionSeriesDateConfItem
-	EdbName      string `description:"中文别名"`
-	EdbNameEn    string `description:"英文别名"`
-	EdbInfoType  int    `description:"指标类型"`
-	Unit         string `description:"单位"`
-	UnitEn       string `description:"英文单位"`
-	DateConfName string `description:"引用日期名称"`
-	DateConfType int    `description:"日期类型,0指标最新日期, 1引用日期"`
-}
-
-type ChartSectionCombineDataResp struct {
-	DateConfList        []*ChartSectionDateConfItem
-	IsHeap              int                      `description:"是否堆积(1.堆积,0不堆积)"`
-	XDataList           []XData                  `description:"横轴名称设置"`
-	UnitList            *ChartSectionCombineUnit `description:"纵轴单位设置"`
-	BaseChartSeriesName string                   `description:"基准系列名称"`
-	SortType            int                      `description:"排序类型,0默认,1升序,2降序"`
-	SeriesList          []*ChartSectionSeriesItem
-	LeftMin             string `description:"图表左侧最小值"`
-	LeftMax             string `description:"图表左侧最大值"`
-	RightMin            string `description:"图表右侧最小值"`
-	RightMax            string `description:"图表右侧最大值"`
-	Right2Min           string `description:"图表右侧最小值"`
-	Right2Max           string `description:"图表右侧最大值"`
-}
-
-// 系列里的指标日期配置
-type ChartSectionSeriesDateConfItem struct {
-	MoveForward int `description:"前移的期数"`
-	DateChange  []*ChartSectionDateChange
-}
-
-// PreviewSectionCombineChartReq 预览截面组合图的请求
-type PreviewSectionCombineChartReq struct {
-	ChartName       string `description:"图表名称"`
-	ChartClassifyId int    `description:"分类id"`
-	ExtraConfig     string `description:"图表额外配置信息,json字符串"`
-}
-
-type ChartSectionCombineUnit struct {
-	LeftName       string `description:"左轴单位"`
-	LeftNameEn     string `description:"左轴英文单位"`
-	RightName      string `description:"右轴单位"`
-	RightNameEn    string `description:"右轴英文单位"`
-	RightTwoName   string `description:"右2轴单位"`
-	RightTwoNameEn string `description:"右2轴英文单位"`
-}
-
-// 时序组合图额外配置
-type ChartTimeCombineExtraConf struct {
-	IsHeap int `description:"是否堆积(1.堆积,0不堆积)"`
-}
-
-type ChartTimeCombineDataResp struct {
-	IsHeap int `description:"是否堆积(1.堆积,0不堆积)"`
-}

+ 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
+}

+ 24 - 3
models/data_manage/edb_info.go

@@ -7,12 +7,14 @@ import (
 	"eta/eta_mobile/services/alarm_msg"
 	"eta/eta_mobile/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
-	"go.mongodb.org/mongo-driver/bson"
 	"strconv"
 	"strings"
 	"time"
+
+	"go.mongodb.org/mongo-driver/bson"
+
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 type EdbInfo struct {
@@ -1658,6 +1660,25 @@ func GetEdbInfoCount(source int, edbCode string) (count int, err error) {
 	return
 }
 
+type EdbInfoEditRecord struct {
+	EdbInfoId           int    `description:"指标ID"`
+	EdbName             string `description:"指标名称"`
+	Frequency           string `description:"频率"`
+	Unit                string `description:"单位"`
+	ClassifyId          int    `description:"分类id"`
+	CalculateFormula    string `description:"计算公式"`
+	OperateUserId       int    `description:"操作人id"`
+	OperateUserRealName string `description:"操作人姓名"`
+}
+
+func ModifyEdbInfoBaseTimeById(edbInfoId int, cTime time.Time) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	// 更新修改时间
+	sql := ` UPDATE edb_info SET base_modify_time = ? WHERE edb_info_id = ? `
+	_, err = o.Raw(sql, cTime, edbInfoId).Exec()
+	return
+}
+
 // GetEdbInfoByNameArr 根据名称获取指标
 func GetEdbInfoByNameArr(names []string, edbInfoType int) (items []*EdbInfo, err error) {
 	if len(names) == 0 {

+ 6 - 2
models/data_manage/edb_info_calculate.go

@@ -2,10 +2,12 @@ package data_manage
 
 import (
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/rdlucklib/rdluck_tools/paging"
+
 	"strings"
 	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
 )
 
 type EdbInfoCalculateSaveReq struct {
@@ -254,6 +256,8 @@ type EdbInfoCalculateBatchEditReqByEdbLib struct {
 	Frequency     string `description:"频度"`
 	Unit          string `description:"单位"`
 	ClassifyId    int    `description:"分类id"`
+	AdminId       int    `description:"操作人id"`
+	AdminName     string `description:"操作人姓名"`
 	Formula       string `description:"N值"`
 	EdbInfoId     int    `description:"编辑指标id"`
 	FromEdbInfoId int    `description:"计算来源指标id"`

+ 28 - 0
models/data_manage/edb_info_record.go

@@ -0,0 +1,28 @@
+package data_manage
+
+import (
+	"time"
+
+	"github.com/beego/beego/v2/client/orm"
+)
+
+type EdbInfoRecord struct {
+	EdbInfoRecordId     int       `orm:"column(edb_info_record_id);pk"`
+	EdbInfoId           int       `orm:"column(edb_info_id)"`
+	OldEdbName          string    `description:"旧的指标名称"`
+	OldFrequency        string    `description:"旧的频率"`
+	OldUnit             string    `description:"旧的单位"`
+	NewEdbName          string    `description:"新的指标名称"`
+	NewFrequency        string    `description:"新的频率"`
+	NewUnit             string    `description:"新的单位"`
+	OperateUserId       int       `description:"执行人id"`
+	OperateUserRealName string    `description:"执行人名称"`
+	CreateTime          time.Time `description:"记录的生成时间"`
+	Timestamp           int64     `description:"时间戳"`
+}
+
+func AddEditEdbInfoRcord(edbRecord *EdbInfoRecord) (e error) {
+	o := orm.NewOrmUsingDB("data")
+	_, e = o.Insert(edbRecord)
+	return
+}

+ 4 - 1
models/db.go

@@ -20,9 +20,10 @@ import (
 	"eta/eta_mobile/models/system"
 	"eta/eta_mobile/models/yb"
 	"eta/eta_mobile/utils"
-	_ "github.com/go-sql-driver/mysql"
 	"time"
 
+	_ "github.com/go-sql-driver/mysql"
+
 	"github.com/beego/beego/v2/client/orm"
 )
 
@@ -295,6 +296,7 @@ func initEdbData() {
 	orm.RegisterModel(
 		new(data_manage.EdbClassify),
 		new(data_manage.EdbInfo), //hz_data库的edb_info表
+		new(data_manage.EdbInfoRecord),
 		new(data_manage.EdbDataThs),
 		new(data_manage.EdbDataWind),
 		new(data_manage.EdbDataPb),
@@ -323,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),

+ 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 {

+ 4 - 0
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 {
@@ -269,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 {

+ 93 - 95
services/data/chart_extra_config.go

@@ -13,8 +13,9 @@ import (
 	"time"
 )
 
-func HandleExtraConfig(chartType int, extraConfigStr string) (newExtraConfigStr string, newAllExtraConfigStr string, err error, errMsg string) {
+func HandleExtraConfig(chartInfoId int, chartType int, extraConfigStr string) (newExtraConfigStr string, newAllExtraConfigStr string, err error, errMsg string) {
 	newExtraConfigStr = extraConfigStr
+
 	switch chartType {
 	case 10: // 截面散点图
 		var tmpExtraConfig data_manage.SectionScatterReq
@@ -46,7 +47,7 @@ func HandleExtraConfig(chartType int, extraConfigStr string) (newExtraConfigStr
 			err = errors.New(errMsg)
 			return
 		}
-		newAllExtraConfig, e, msg := handleChartSectionCombineData(sectionExtraConfig)
+		newAllExtraConfig, e, msg := handleChartSectionCombineData(chartInfoId, sectionExtraConfig)
 		if e != nil {
 			err = e
 			errMsg = msg
@@ -244,95 +245,62 @@ func GetEnNameMapByCnNameList(cnNameList []string) (contentEnMap map[string]stri
 }
 
 // handleSectionScatterChartData 截面组合图的英文文案处理
-func handleChartSectionCombineData(extraConfig data_manage.ChartSectionAllExtraConf) (newExtraConfig data_manage.ChartSectionAllExtraConf, err error, errMsg string) {
-	translateNameList := make([]string, 0)
-	translateNameMap := make(map[string]bool, 0)
-	for _, v := range extraConfig.DateConfList {
-		if _, ok := translateNameMap[v.DateConfName]; !ok && v.DateConfNameEn == "" {
-			translateNameMap[v.DateConfName] = true
-			tmpName := strings.TrimSuffix(v.DateConfName, " ")
-			tmpName = strings.TrimPrefix(tmpName, " ")
-			translateNameList = append(translateNameList, tmpName)
+func handleChartSectionCombineData(chartInfoId int, extraConfig data_manage.ChartSectionAllExtraConf) (newExtraConfig data_manage.ChartSectionAllExtraConf, err error, errMsg string) {
+	dateConfListMapSave := make(map[string]bool)
+	for k, v := range extraConfig.DateConfList {
+		if v.DateConfNameEn == "" {
+			extraConfig.DateConfList[k].DateConfNameEn = v.DateConfName
 		}
 	}
 
-	if _, ok := translateNameMap[extraConfig.UnitList.LeftName]; !ok && extraConfig.UnitList.LeftNameEn == "" {
-		translateNameMap[extraConfig.UnitList.LeftName] = true
-		tmpName := strings.TrimSuffix(extraConfig.UnitList.LeftName, " ")
-		tmpName = strings.TrimPrefix(tmpName, " ")
-		translateNameList = append(translateNameList, tmpName)
+	if extraConfig.UnitList.LeftNameEn == "" {
+		extraConfig.UnitList.LeftNameEn = extraConfig.UnitList.LeftName
 	}
-	if _, ok := translateNameMap[extraConfig.UnitList.RightName]; !ok && extraConfig.UnitList.RightNameEn == "" {
-		translateNameMap[extraConfig.UnitList.RightName] = true
-		tmpName := strings.TrimSuffix(extraConfig.UnitList.RightName, " ")
-		tmpName = strings.TrimPrefix(tmpName, " ")
-		translateNameList = append(translateNameList, tmpName)
+	if extraConfig.UnitList.RightNameEn == "" {
+		extraConfig.UnitList.RightNameEn = extraConfig.UnitList.RightName
 	}
-	if _, ok := translateNameMap[extraConfig.UnitList.RightTwoName]; !ok && extraConfig.UnitList.RightTwoNameEn == "" {
-		translateNameMap[extraConfig.UnitList.RightTwoName] = true
-		tmpName := strings.TrimSuffix(extraConfig.UnitList.RightTwoName, " ")
-		tmpName = strings.TrimPrefix(tmpName, " ")
-		translateNameList = append(translateNameList, tmpName)
+	if extraConfig.UnitList.RightTwoNameEn == "" {
+		extraConfig.UnitList.RightTwoNameEn = extraConfig.UnitList.RightTwoName
 	}
 
-	for _, v := range extraConfig.XDataList {
-		if _, ok := translateNameMap[v.Name]; !ok && v.NameEn == "" {
-			translateNameMap[v.Name] = true
-			tmpName := strings.TrimSuffix(v.Name, " ")
-			tmpName = strings.TrimPrefix(tmpName, " ")
-			translateNameList = append(translateNameList, tmpName)
+	for k, v := range extraConfig.XDataList {
+		if v.NameEn == "" {
+			extraConfig.XDataList[k].NameEn = v.Name
 		}
 	}
-	for _, v := range extraConfig.SeriesList {
+	for k, v := range extraConfig.SeriesList {
 		if v.SeriesNameEn == `` {
-			if _, ok := translateNameMap[v.SeriesName]; !ok {
-				translateNameMap[v.SeriesName] = true
-				tmpName := strings.TrimSuffix(v.SeriesName, " ")
-				tmpName = strings.TrimPrefix(tmpName, " ")
-				translateNameList = append(translateNameList, tmpName)
+			extraConfig.SeriesList[k].SeriesNameEn = v.SeriesName
+		}
+		for _, info := range v.EdbInfoList {
+			if info.DateConfType == 1 && info.DateConfName != "" {
+				dateConfListMapSave[info.DateConfName] = true
 			}
 		}
 	}
 
-	// 获取英文名称map
-	enNameMap, _, _ := GetEnNameMapByCnNameList(translateNameList)
-
-	for k, seriesItem := range extraConfig.SeriesList {
-		if len(seriesItem.EdbInfoList) <= 0 {
-			errMsg = "指标不能为空"
-			err = errors.New(errMsg)
+	if chartInfoId > 0 {
+		// 查询表里的系列信息
+		chartSectionCombineEdbList, e := data_manage.GetChartSeriesEdbByChartInfoId(chartInfoId)
+		if e != nil {
+			err = e
+			errMsg = "查询图表系列信息失败"
 			return
 		}
-		if seriesItem.SeriesNameEn == `` { //系列英文名称
-			if tmpNameEn, ok := enNameMap[seriesItem.SeriesName]; ok {
-				seriesItem.SeriesNameEn = tmpNameEn
+		for _, info := range chartSectionCombineEdbList {
+			if info.DateConfType == 1 && info.DateConfName != "" {
+				dateConfListMapSave[info.DateConfName] = true
 			}
 		}
-		extraConfig.SeriesList[k] = seriesItem
-	}
-
-	for k, v := range extraConfig.XDataList {
-		if tmpNameEn, ok := enNameMap[v.Name]; ok && v.NameEn == "" {
-			extraConfig.XDataList[k].NameEn = tmpNameEn
-		}
-	}
-
-	if tmpNameEn, ok := enNameMap[extraConfig.UnitList.LeftName]; ok && extraConfig.UnitList.LeftNameEn == "" {
-		extraConfig.UnitList.LeftName = tmpNameEn
-	}
-	if tmpNameEn, ok := enNameMap[extraConfig.UnitList.RightName]; ok && extraConfig.UnitList.RightNameEn == "" {
-		extraConfig.UnitList.RightName = tmpNameEn
-	}
-	if tmpNameEn, ok := enNameMap[extraConfig.UnitList.RightTwoName]; ok && extraConfig.UnitList.RightTwoNameEn == "" {
-		extraConfig.UnitList.RightTwoName = tmpNameEn
 	}
-	for k, v := range extraConfig.DateConfList {
-		if tmpNameEn, ok := enNameMap[v.DateConfName]; ok && v.DateConfNameEn == "" {
-			extraConfig.DateConfList[k].DateConfNameEn = tmpNameEn
+	newExtraConfig = extraConfig
+	// 去掉没有被引用的配置
+	newExtraConfig.DateConfList = make([]*data_manage.ChartSectionDateConfItem, 0)
+	for _, v := range extraConfig.DateConfList {
+		if _, ok := dateConfListMapSave[v.DateConfName]; ok {
+			newExtraConfig.DateConfList = append(newExtraConfig.DateConfList, v)
 		}
 	}
-
-	newExtraConfig = extraConfig
 	return
 }
 
@@ -428,18 +396,34 @@ func GetChartSectionCombineData(chartInfo *data_manage.ChartInfo, mappingList []
 				}
 				// todo 根据日期变换得到最终日期
 				edbDataListTmp := make([]*data_manage.EdbDataList, 0)
-				if dateConfItem.EdbInfoId > 0 {
-					edbDataListTmp, ok1 = edbDataListMap[dateConfItem.EdbInfoId]
-					if !ok1 {
-						err = fmt.Errorf("指标%d的日期数据不存在", dateConfItem.EdbInfoId)
+				if dateConfItem.DateType == 0 {
+					if dateConfItem.EdbInfoId > 0 {
+						edbDataListTmp, ok1 = edbDataListMap[dateConfItem.EdbInfoId]
+						if !ok1 {
+							err = fmt.Errorf("指标%d的日期数据不存在", dateConfItem.EdbInfoId)
+							return
+						}
+						findDate, err = GetChartSectionSeriesDateByDateChange(dateConfItem.EdbInfoId, edbDataListTmp, dateConfItem.DateChange, dateConfItem.MoveForward)
+						if err != nil {
+							err = fmt.Errorf("指标%d的日期变换处理失败", dateConfItem.EdbInfoId)
+							return
+						}
+					} else {
+						err = fmt.Errorf("请选择指标")
 						return
 					}
-				}
-
-				findDate, err = GetChartSectionSeriesDateByDateChange(dateConfItem.EdbInfoId, edbDataListTmp, dateConfItem.DateChange, dateConfItem.MoveForward)
-				if err != nil {
-					err = fmt.Errorf("指标%d的日期变换处理失败", dateConfItem.EdbInfoId)
-					return
+				} else if dateConfItem.DateType == 1 {
+					findDate, err = GetChartSectionSeriesDateByDateChange(dateConfItem.EdbInfoId, edbDataListTmp, dateConfItem.DateChange, dateConfItem.MoveForward)
+					if err != nil {
+						err = fmt.Errorf("指标%d的日期变换处理失败", dateConfItem.EdbInfoId)
+						return
+					}
+				} else if dateConfItem.DateType == 2 {
+					if dateConfItem.StaticDate == "" {
+						err = fmt.Errorf("请输入固定日期")
+						return
+					}
+					findDate = dateConfItem.StaticDate
 				}
 			}
 			findDateTime, _ := time.ParseInLocation(utils.FormatDate, findDate, time.Local)
@@ -525,9 +509,26 @@ func GetChartSectionCombineData(chartInfo *data_manage.ChartInfo, mappingList []
 		err = fmt.Errorf("基准系列不存在")
 		return
 	}
+	defaultIndexXDataList := make([]int, 0)            //默认排序时的横轴
+	defaultXDataMap := make(map[int]data_manage.XData) //默认排序时的横轴单位
+	for index, item := range baseSeries.EdbInfoList {
+		if index == 0 {
+			firstUnit = &data_manage.XData{
+				Name:   item.Unit,
+				NameEn: item.UnitEn,
+			}
+		}
+
+		tmp := data_manage.XData{
+			Name:   item.EdbName,
+			NameEn: item.EdbNameEn,
+		}
+		defaultXDataMap[index] = tmp
+		defaultIndexXDataList = append(defaultIndexXDataList, index)
+	}
 	// 处理系列排序
 	if extraConfig.SortType > 0 {
-		newSeriesDataListMap, newSeriesNoDataIndexMap := SortChartSeriesDataSet(baseSeries.SeriesName, baseSeries.DataList, baseSeries.NoDataEdbIndex, seriesDataListMap, seriesNoDataIndexMap, extraConfig.SortType)
+		newSeriesDataListMap, newSeriesNoDataIndexMap, newIndexXDataList := SortChartSeriesDataSet(baseSeries.SeriesName, baseSeries.DataList, baseSeries.NoDataEdbIndex, seriesDataListMap, seriesNoDataIndexMap, extraConfig.SortType)
 		for k, item := range extraConfig.SeriesList {
 			dataList, ok := newSeriesDataListMap[item.SeriesName]
 			if ok {
@@ -538,28 +539,24 @@ func GetChartSectionCombineData(chartInfo *data_manage.ChartInfo, mappingList []
 				extraConfig.SeriesList[k].NoDataEdbIndex = noIndex
 			}
 		}
+		defaultIndexXDataList = newIndexXDataList
 	}
 
 	xDataList := make([]data_manage.XData, 0)
-	for index, item := range baseSeries.EdbInfoList {
-		if index == 0 {
-			firstUnit = &data_manage.XData{
-				Name:   item.Unit,
-				NameEn: item.UnitEn,
-			}
-		}
-		tmp := data_manage.XData{
-			Name:   item.EdbName,
-			NameEn: item.EdbNameEn,
+	for index, itemIndex := range defaultIndexXDataList {
+		nameItem, ok := defaultXDataMap[itemIndex]
+		if !ok {
+			err = fmt.Errorf("单位不存在")
+			return
 		}
 		// 如果已经设置了横轴名称,则用设置的名称替换
 		if len(extraConfig.XDataList) > index {
 			newItem := extraConfig.XDataList[index]
 			if newItem.Name != "" {
-				tmp = newItem
+				nameItem = newItem
 			}
 		}
-		xDataList = append(xDataList, tmp)
+		xDataList = append(xDataList, nameItem)
 	}
 	dataListResp.XDataList = xDataList
 
@@ -634,7 +631,6 @@ func GetChartSectionCombineData(chartInfo *data_manage.ChartInfo, mappingList []
 					extraConfig.DateConfList[i].Frequency = edbItem.Frequency
 					extraConfig.DateConfList[i].EndDate = edbItem.EndDate
 				}
-
 			}
 		}
 	}
@@ -847,7 +843,7 @@ func handleSystemAppointDateT(currDate time.Time, appointDay, frequency string)
 }
 
 // sortTripleDataSet 以第一组数据为基准,排序之后,空数组的位置也要同步变更
-func SortChartSeriesDataSet(baseName string, baseDataList []float64, baseSeriesNoDataIndexList []int, dataListMap map[string][]float64, noDataListIndexMap map[string][]int, asc int) (newDataListMap map[string][]float64, newNoDataListIndexMap map[string][]int) {
+func SortChartSeriesDataSet(baseName string, baseDataList []float64, baseSeriesNoDataIndexList []int, dataListMap map[string][]float64, noDataListIndexMap map[string][]int, asc int) (newDataListMap map[string][]float64, newNoDataListIndexMap map[string][]int, newIndexXDataList []int) {
 	newDataListMap = make(map[string][]float64)
 	newNoDataListIndexMap = make(map[string][]int)
 
@@ -886,6 +882,7 @@ func SortChartSeriesDataSet(baseName string, baseDataList []float64, baseSeriesN
 				newDataListMap[k][i] = dataListMap[k][idx]
 			}
 		}
+
 		dataListMap = newDataListMap
 		noDataListIndexMap = newNoDataListIndexMap
 		newDataListMap = make(map[string][]float64)
@@ -937,5 +934,6 @@ func SortChartSeriesDataSet(baseName string, baseDataList []float64, baseSeriesN
 			newDataListMap[k][i] = dataListMap[k][idx]
 		}
 	}
+	newIndexXDataList = newIndices
 	return
 }

+ 26 - 24
services/data/chart_info.go

@@ -522,6 +522,15 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 
 	// 特殊图形数据处理
 	switch chartType {
+	case 6: //时序组合图
+		//判断是否堆积
+		timeConf := extraConfig.(data_manage.ChartTimeCombineExtraConf)
+		if extraConfigStr == "" { //历史数据,默认开启堆积
+			timeConf = data_manage.ChartTimeCombineExtraConf{
+				IsHeap: 1,
+			}
+		}
+		dataResp = data_manage.ChartTimeCombineDataResp{IsHeap: timeConf.IsHeap}
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
 			// 季节性图计算不管图上数据时间,拿所有数据
@@ -535,15 +544,6 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 			// 兼容无配置的老图
 			dataResp = new(data_manage.SeasonChartResp)
 		}
-	case 6: //时序组合图
-		//判断是否堆积
-		timeConf := extraConfig.(data_manage.ChartTimeCombineExtraConf)
-		if extraConfigStr == "" { //历史数据,默认开启堆积
-			timeConf = data_manage.ChartTimeCombineExtraConf{
-				IsHeap: 1,
-			}
-		}
-		dataResp = data_manage.ChartTimeCombineDataResp{IsHeap: timeConf.IsHeap}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
 		xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartConf.DateList, barChartConf.Sort)
@@ -604,6 +604,7 @@ func GetChartEdbData(chartInfoId, chartType int, calendar, startDate, endDate st
 	case utils.CHART_TYPE_RADAR: //雷达图
 		radarConf := extraConfig.(data_manage.RadarChartInfoReq)
 		xEdbIdValue, dataResp, err = RadarChartData(mappingList, edbDataListMap, radarConf)
+
 	}
 	return
 }
@@ -2419,7 +2420,7 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 	// 图表额外配置
 	// 图表额外配置
 	var allExtraConfig string
-	extraConfig, allExtraConfig, err, errMsg = HandleExtraConfig(chartType, extraConfig)
+	extraConfig, allExtraConfig, err, errMsg = HandleExtraConfig(0, chartType, extraConfig)
 	if err != nil {
 		if errMsg == `` {
 			errMsg = "指标异常!"
@@ -2601,7 +2602,6 @@ func AddChartInfo(req data_manage.AddChartInfoReq, sysUserId int, sysUserRealNam
 		err = errors.New("保存失败,Err:" + err.Error())
 		return
 	}
-
 	if chartType == utils.CHART_TYPE_SECTION_COMBINE {
 		err = data_manage.AddChartSeriesAndEdbMapping(allExtraConfig, int(newId))
 		if err != nil {
@@ -2812,7 +2812,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin, lang
 	}
 
 	// 图表额外配置
-	extraConfig, allExtraConfig, err, errMsg := HandleExtraConfig(req.ChartType, req.ExtraConfig)
+	extraConfig, allExtraConfig, err, errMsg := HandleExtraConfig(req.ChartInfoId, req.ChartType, req.ExtraConfig)
 	if err != nil {
 		if errMsg == `` {
 			errMsg = "指标异常!"
@@ -2970,6 +2970,7 @@ func EditChartInfo(req data_manage.EditChartInfoReq, sysUser *system.Admin, lang
 			return
 		}
 	}
+
 	//添加es数据
 	go EsAddOrEditChartInfo(chartItem.ChartInfoId)
 	//修改my eta es数据
@@ -3147,6 +3148,7 @@ func GetChartConvertEdbData(chartInfoId, chartType int, calendar, startDate, end
 
 	var extraConfig interface{}
 	switch chartType {
+
 	case 7: // 柱形图
 		var barConfig data_manage.BarChartInfoReq
 		if extraConfigStr == `` {
@@ -3736,6 +3738,15 @@ func GetChartEdbDataV2(chartInfoId, chartType int, calendar, startDate, endDate
 
 	// 特殊图形数据处理
 	switch chartType {
+	case 6: //时序组合图
+		//判断是否堆积
+		timeConf := extraConfig.(data_manage.ChartTimeCombineExtraConf)
+		if extraConfigStr == "" { //历史数据,默认开启堆积
+			timeConf = data_manage.ChartTimeCombineExtraConf{
+				IsHeap: 1,
+			}
+		}
+		dataResp = data_manage.ChartTimeCombineDataResp{IsHeap: timeConf.IsHeap}
 	case 2: // 季节性图
 		if seasonExtraConfig != "" {
 			// 季节性图计算不管图上数据时间,拿所有数据
@@ -3749,15 +3760,6 @@ func GetChartEdbDataV2(chartInfoId, chartType int, calendar, startDate, endDate
 			// 兼容无配置的老图
 			dataResp = new(data_manage.SeasonChartResp)
 		}
-	case 6: //时序组合图
-		//判断是否堆积
-		timeConf := extraConfig.(data_manage.ChartTimeCombineExtraConf)
-		if extraConfigStr == "" { //历史数据,默认开启堆积
-			timeConf = data_manage.ChartTimeCombineExtraConf{
-				IsHeap: 1,
-			}
-		}
-		dataResp = data_manage.ChartTimeCombineDataResp{IsHeap: timeConf.IsHeap}
 	case 7: // 柱形图
 		barChartConf := extraConfig.(data_manage.BarChartInfoReq)
 		xEdbIdValue, yDataList, err = BarChartData(mappingList, edbDataListMap, barChartConf.DateList, barChartConf.Sort)
@@ -3798,6 +3800,9 @@ func GetChartEdbDataV2(chartInfoId, chartType int, calendar, startDate, endDate
 		for _, v := range edbList {
 			v.DataList = nil
 		}
+	case utils.CHART_TYPE_RADAR: //雷达图
+		radarConf := extraConfig.(data_manage.RadarChartInfoReq)
+		xEdbIdValue, dataResp, err = RadarChartData(mappingList, edbDataListMap, radarConf)
 	case utils.CHART_TYPE_SECTION_COMBINE: // 截面组合图
 		sectionConf := extraConfig.(data_manage.ChartSectionAllExtraConf)
 		var chartInfo *data_manage.ChartInfo
@@ -3814,9 +3819,6 @@ func GetChartEdbDataV2(chartInfoId, chartType int, calendar, startDate, endDate
 		for _, v := range edbList {
 			v.DataList = nil
 		}
-	case utils.CHART_TYPE_RADAR: //雷达图
-		radarConf := extraConfig.(data_manage.RadarChartInfoReq)
-		xEdbIdValue, dataResp, err = RadarChartData(mappingList, edbDataListMap, radarConf)
 	}
 	return
 }

+ 30 - 0
services/data/edb_info_record.go

@@ -0,0 +1,30 @@
+package data
+
+import (
+	"eta/eta_mobile/models/data_manage"
+	"time"
+)
+
+func AddEditEdbInfoRcord(oldEdbInfo *data_manage.EdbInfo, newEdbInfo *data_manage.EdbInfoEditRecord) (err error) {
+	if oldEdbInfo.EdbName != newEdbInfo.EdbName || oldEdbInfo.Frequency != newEdbInfo.Frequency || oldEdbInfo.Unit != newEdbInfo.Unit {
+		ctime := time.Now()
+		edbRecord := new(data_manage.EdbInfoRecord)
+		edbRecord.EdbInfoId = oldEdbInfo.EdbInfoId
+		edbRecord.OldEdbName = oldEdbInfo.EdbName
+		edbRecord.OldFrequency = oldEdbInfo.Frequency
+		edbRecord.OldUnit = oldEdbInfo.Unit
+		edbRecord.NewEdbName = newEdbInfo.EdbName
+		edbRecord.NewFrequency = newEdbInfo.Frequency
+		edbRecord.NewUnit = newEdbInfo.Unit
+		edbRecord.OperateUserId = newEdbInfo.OperateUserId
+		edbRecord.OperateUserRealName = newEdbInfo.OperateUserRealName
+		edbRecord.CreateTime = ctime
+		edbRecord.Timestamp = ctime.Unix()
+		err = data_manage.AddEditEdbInfoRcord(edbRecord)
+		if err != nil {
+			return
+		}
+		err = data_manage.ModifyEdbInfoBaseTimeById(edbRecord.EdbInfoId, ctime)
+	}
+	return
+}

+ 13 - 12
services/data/future_good/chart_info.go

@@ -114,6 +114,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, baseEdbInfoMapp
 		// 寻找主力合约
 		zlFutureGoodEdbInfo, err = future_good2.GetFutureGoodEdbInfo(futureGoodEdbInfoMapping.EdbInfoId)
 		if err != nil {
+			err = fmt.Errorf("查不到期货指标,GetFutureGoodEdbInfo err: %v", err)
 			return
 		}
 		regionType = zlFutureGoodEdbInfo.RegionType
@@ -123,7 +124,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, baseEdbInfoMapp
 		if zlFutureGoodEdbInfo.DateSourceId != zlFutureGoodEdbInfo.FutureGoodEdbInfoId {
 			sourceDateFutureGoodEdbInfo, tmpErr := future_good2.GetFutureGoodEdbInfo(zlFutureGoodEdbInfo.DateSourceId)
 			if tmpErr != nil {
-				err = tmpErr
+				err = fmt.Errorf("获取期货指标 %d 的日期来源的指标信息失败,错误:%s", zlFutureGoodEdbInfo.DateSourceId, tmpErr.Error())
 				return
 			}
 			latestDate = sourceDateFutureGoodEdbInfo.EndDate // 最新日期是这个
@@ -145,6 +146,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, baseEdbInfoMapp
 	latestDateTime, _ := time.ParseInLocation(utils.FormatDate, latestDate, time.Local)
 	_, futureGoodEdbInfoList, err := getFutureGoodEdbInfoList(latestDateTime, tmpFutureGoodEdbInfoList, barChartInfoDateList)
 	if err != nil {
+		err = fmt.Errorf("获取期货指标列表失败,getFutureGoodEdbInfoList 错误:%s", err.Error())
 		return
 	}
 
@@ -158,7 +160,7 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, baseEdbInfoMapp
 			EdbName:             v.FutureGoodEdbName,
 			EdbAliasName:        v.FutureGoodEdbName,
 			EdbNameEn:           v.FutureGoodEdbNameEn,
-			EdbType:             baseEdbInfoMapping.EdbType, //todo baseEdbInfoMapping
+			EdbType:             baseEdbInfoMapping.EdbType,
 			Frequency:           baseEdbInfoMapping.Frequency,
 			FrequencyEn:         baseEdbInfoMapping.FrequencyEn,
 			Unit:                baseEdbInfoMapping.Unit,
@@ -298,8 +300,9 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, baseEdbInfoMapp
 		dataList := make([]*data_manage.EdbDataList, 0)
 		tmpDataList, ok := tmpDataListMap[v.EdbInfoId]
 		if !ok {
-			err = fmt.Errorf("期货数据不存在 FutureGoodEdbInfoId: %d", v.EdbInfoId)
-			return
+			/*err = fmt.Errorf("期货数据不存在 FutureGoodEdbInfoId: %d", v.EdbInfoId)
+			return*/
+			continue
 		}
 		for _, tmpData := range tmpDataList {
 			dataList = append(dataList, &data_manage.EdbDataList{
@@ -388,8 +391,8 @@ func GetChartEdbData(chartInfoId int, startDate, endDate string, baseEdbInfoMapp
 
 		for i := lenEdbId - 1; i >= 0; i-- {
 			// 如果没有在无数据的指标列表中找到,那么就找到了最大x轴的下标
-			if _, ok := noDataEdbIdMap[edbInfoIdList[i]]; !ok || utils.InArrayByInt(baseEdbIds, edbInfoIdList[i]) {
-				// 如果最大x轴的下标 小于 当前下标,那么就重新赋值
+			if _, ok := noDataEdbIdMap[edbInfoIdList[i]]; !ok || utils.InArrayByInt(baseEdbIds, edbInfoIdList[i]) { //以往的逻辑是碰到第一个无数据的期货指标,那后续的月份都是无数据的,因此需要特殊处理,改成多个现货指标之后需要排除无值的现货指标
+				// 如果最大x轴的下标 小于 当前下标,那么就重新赋值
 				if maxIndex < i-1 {
 					maxIndex = i - 1
 				}
@@ -457,8 +460,7 @@ func BarChartData(baseEdbInfoMapping *data_manage.ChartEdbInfoMapping, edbInfoMa
 		}
 	}
 
-	// 期货指标数据map
-	futureGoodEdbDataMap := make(map[int]map[string]float64)
+	edbDataMap := make(map[int]map[string]float64)
 	for edbInfoId, edbDataList := range edbDataListMap {
 		if _, ok := edbInfoMappingMap[edbInfoId]; ok {
 			continue
@@ -467,7 +469,7 @@ func BarChartData(baseEdbInfoMapping *data_manage.ChartEdbInfoMapping, edbInfoMa
 		for _, edbData := range edbDataList {
 			edbDateData[edbData.DataTime] = edbData.Value
 		}
-		futureGoodEdbDataMap[edbInfoId] = edbDateData
+		edbDataMap[edbInfoId] = edbDateData
 	}
 
 	// edbIdList 指标展示顺序;x轴的指标顺序
@@ -518,7 +520,7 @@ func BarChartData(baseEdbInfoMapping *data_manage.ChartEdbInfoMapping, edbInfoMa
 
 		// 先找到基准日期
 		var realDateTime time.Time
-		realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[baseEdbInfoMapping.EdbInfoId], baseEdbDataMap[baseEdbInfoMapping.EdbInfoId], futureGoodEdbDataMap)
+		realDateTime, findDataValue, isFind, tmpErr := GetNeedDateData(findDateTime, edbDataListMap[baseEdbInfoMapping.EdbInfoId], baseEdbDataMap[baseEdbInfoMapping.EdbInfoId], edbDataMap)
 		if tmpErr != nil {
 			err = tmpErr
 			return
@@ -590,7 +592,7 @@ func BarChartData(baseEdbInfoMapping *data_manage.ChartEdbInfoMapping, edbInfoMa
 			//}
 			//tmpRealDateTime := findDateTime	// 按照配置找到的日期
 			tmpRealDateTime := realDateTime // 实际现货的日期
-			tmpFindDataValue, tmpIsFind := futureGoodEdbDataMap[futureGoodMapping.FutureGoodEdbInfoId][tmpRealDateTime.Format(utils.FormatDate)]
+			tmpFindDataValue, tmpIsFind := edbDataMap[futureGoodMapping.FutureGoodEdbInfoId][tmpRealDateTime.Format(utils.FormatDate)]
 			yDataMap[futureGoodMapping.FutureGoodEdbInfoId] = tmpFindDataValue
 
 			findDataList = append(findDataList, tmpFindDataValue)
@@ -680,7 +682,6 @@ func handleResultData(regionType string, futureGoodEdbType, baseEdbLen int, yDat
 			if i > maxIndex {
 				break
 			}
-			// todo x轴 内容调整
 			xDataList = append(xDataList, data_manage.XData{
 				Name:   fmt.Sprint("M+", i),
 				NameEn: fmt.Sprint("M+", i),

+ 1 - 3
services/data/future_good/profit_chart_info.go

@@ -327,8 +327,6 @@ func ProfitChartChartData(baseEdbInfo *data_manage.EdbInfo, baseDataListMap map[
 			//findDateTime
 
 			// 获取当前日期相对开始日期的期数
-			//tmpN := (currDate.Year()-findDateTime.Year())*12 + int(currDate.Month()-findDateTime.Month())
-			// 用实际日期的月份作为基准,往前推12个月(2024-5-13 16:26:43修改)
 			tmpN := (currDate.Year()-realDateTime.Year())*12 + int(currDate.Month()-realDateTime.Month())
 			if tmpN <= 0 {
 				continue
@@ -652,7 +650,7 @@ func handleProfitResultData(xDataListInit []data_manage.XData, baseEdbInfo *data
 	}
 
 	earliestDateTime = time.Date(earliestDateTime.Year(), earliestDateTime.Month(), 1, 0, 0, 0, 0, time.Local)
-	xDataList = xDataList[0:maxI]
+	xDataList = xDataList[0 : maxI+1]
 	for yIndex, yData := range newYDataList {
 		if len(yData.XEdbInfoIdList) > maxI+1 {
 			newYDataList[yIndex].XEdbInfoIdList = yData.XEdbInfoIdList[0 : maxI+1]

+ 2 - 0
utils/constants.go

@@ -164,6 +164,7 @@ const (
 	DATA_SOURCE_GFEX                                 = 78       // 广州期货交易所->76
 	DATA_SOURCE_ICPI                                 = 79       // ICPI消费价格指数->79
 	DATA_SOURCE_BUSINESS                             = 84       // 来源于自有数据
+	DATA_SOURCE_SCI_HQ                               = 88       // 卓创红期
 )
 
 // 数据刷新频率
@@ -442,6 +443,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 (