Browse Source

Merge branch 'master' into feature/pool151_predict_calculate

xiexiaoyuan 2 years ago
parent
commit
3688f93ee7

+ 1 - 1
controllers/base_auth.go

@@ -16,7 +16,7 @@ var apiLog *log.Log
 
 func init() {
 	if utils.RunMode == "release" {
-		logDir := `/data/rdlucklog/hongze_admin`
+		logDir := `/data/rdlucklog/hongze_chart_lib`
 		apiLog = log.Init("20060102.api", logDir)
 	} else {
 		apiLog = log.Init("20060102.api")

+ 160 - 0
controllers/chart.go

@@ -332,3 +332,163 @@ func GetLeadUnitEn(unit string) (unitEn string) {
 	}
 	return
 }
+
+// GetChartInfoDetailFromUniqueCode 根据编码获取图表详情
+func GetChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo,key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
+	resp = new(models.ChartInfoDetailResp)
+
+
+	chartInfoId := chartInfo.ChartInfoId
+
+	dateType := chartInfo.DateType
+	if dateType <= 0 {
+		dateType = 3
+	}
+	startDate := chartInfo.StartDate
+	endDate := chartInfo.EndDate
+	seasonStartDate := chartInfo.SeasonStartDate
+	seasonEndDate := chartInfo.SeasonEndDate
+	calendar := chartInfo.Calendar
+	chartType := chartInfo.ChartType
+
+	if calendar == "" {
+		calendar = "公历"
+	}
+
+	switch dateType {
+	case 1:
+		startDate = "2000-01-01"
+		//endDate = time.Now().Format(utils.FormatDate)
+		endDate = ""
+	case 2:
+		startDate = "2010-01-01"
+		//endDate = time.Now().Format(utils.FormatDate)
+		endDate = ""
+	case 3:
+		startDate = "2015-01-01"
+		//endDate = time.Now().Format(utils.FormatDate)
+		endDate = ""
+	case 4:
+		startDate = strconv.Itoa(time.Now().Year()) + "-01-01"
+		startDate = "2021-01-01"
+		//endDate = time.Now().Format(utils.FormatDate)
+		endDate = ""
+	case 5:
+		startDate = startDate + "-01"
+		endDate = endDate + "-01"
+	case 6:
+		//startDate = startDate + "-01"
+		//endDate = time.Now().Format(utils.FormatDate)
+		endDate = ""
+	case 7:
+		startDate = "2018-01-01"
+		//endDate = time.Now().Format(utils.FormatDate)
+		endDate = ""
+	case 8:
+		startDate = "2019-01-01"
+		//endDate = time.Now().Format(utils.FormatDate)
+		endDate = ""
+	case 9:
+		startDate = "2020-01-01"
+		//endDate = time.Now().Format(utils.FormatDate)
+		endDate = ""
+	case 11:
+		startDate = "2022-01-01"
+		endDate = ""
+	}
+
+	// 兼容日期错误
+	{
+		if strings.Count(startDate, "-") == 1 {
+			startDate = startDate + "-01"
+		}
+		if strings.Count(endDate, "-") == 1 {
+			endDate = endDate + "-01"
+		}
+	}
+
+	if chartType == 2 {
+		if seasonStartDate != "" {
+			startDate = seasonStartDate + "-01-01"
+		} else {
+			fivePre := time.Now().AddDate(-4, 0, 0).Year()
+			startDate = strconv.Itoa(fivePre) + "-01-01"
+		}
+		if seasonEndDate != "" {
+			endDate = seasonEndDate + "-12-31"
+		} else {
+			//endDate = time.Now().Format(utils.FormatDate)
+			endDate = ""
+		}
+	}
+
+	mappingList, err := models.GetChartEdbMappingList(chartInfoId)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	var barConfig data_manage.BarChartInfoReq
+	barChartInfoDateList := make([]data_manage.BarChartInfoDateReq, 0)
+	barChartInfoSort := data_manage.BarChartInfoSortReq{}
+	// 柱方图的一些配置
+	if chartInfo != nil && chartInfo.ChartType == 7 {
+		if chartInfo.BarConfig == `` {
+			msg = "柱方图未配置"
+			errMsg = "柱方图未配置"
+			return
+		}
+
+		err := json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
+		if err != nil {
+			msg = "柱方图配置异常"
+			errMsg = "柱方图配置异常"
+			return
+		}
+
+		barChartInfoDateList = barConfig.DateList
+		barChartInfoSort = barConfig.Sort
+
+		// 指标别名
+		for _, v := range mappingList {
+			for _, confEdb := range barConfig.EdbInfoIdList {
+				if v.EdbInfoId == confEdb.EdbInfoId {
+					v.EdbAliasName = confEdb.Name
+				}
+			}
+		}
+	}
+
+	edbList, xEdbIdValue, yDataList, err := data.GetChartEdbData(chartInfoId, chartType, calendar, startDate, endDate, mappingList, barChartInfoDateList, barChartInfoSort)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	for _, v := range edbList {
+		// 指标别名
+		if barConfig.EdbInfoIdList != nil && len(barConfig.EdbInfoIdList) > 0 {
+			for _, reqEdb := range barConfig.EdbInfoIdList {
+				if v.EdbInfoId == reqEdb.EdbInfoId {
+					v.EdbAliasName = reqEdb.Name
+				}
+			}
+		}
+	}
+
+	resp.ChartInfo = chartInfo
+	resp.EdbInfoList = edbList
+	resp.XEdbIdValue = xEdbIdValue
+	resp.YDataList = yDataList
+
+	if utils.Re == nil {
+		jsonData, _ := json.Marshal(resp)
+		utils.Rc.Put(key, jsonData, 10*time.Minute)
+	}
+
+	isOk = true
+	return
+}
+

+ 266 - 0
controllers/chart_common.go

@@ -0,0 +1,266 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_chart_lib/models"
+	"hongze/hongze_chart_lib/models/data_manage"
+	future_goodServ "hongze/hongze_chart_lib/services/data/future_good"
+	"hongze/hongze_chart_lib/utils"
+	"strings"
+	"time"
+)
+
+// CommonChartInfoDetailFromUniqueCode
+// @Title 根据编码获取图表详情
+// @Description 根据编码获取图表详情接口
+// @Param   UniqueCode   query   int  true       "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
+// @Param   IsCache   query   bool  true       "是否走缓存,默认false"
+// @Success 200 {object} data_manage.ChartInfoDetailFromUniqueCodeResp
+// @router /common/detail [get]
+func (this *ChartController) CommonChartInfoDetailFromUniqueCode() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	uniqueCode := this.GetString("UniqueCode")
+	if uniqueCode == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,uniqueCode is empty"
+		return
+	}
+	key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
+	resp := new(models.ChartInfoDetailResp)
+	//判断是否有缓存
+	if utils.Re == nil {
+		if utils.Re == nil && utils.Rc.IsExist(key) {
+			if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
+				err := json.Unmarshal(data, &resp)
+				if err == nil && resp != nil {
+					br.Ret = 200
+					br.Success = true
+					br.Msg = "获取成功"
+					br.Data = resp
+					fmt.Println("source redis")
+					return
+				}
+			}
+		}
+	}
+
+	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "该图已被删除,请刷新页面"
+			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	switch chartInfo.Source {
+	case utils.CHART_SOURCE_DEFAULT:
+		resp, isOk, msg, errMsg := GetChartInfoDetailFromUniqueCode(chartInfo, key)
+		if !isOk {
+			br.Msg = msg
+			br.ErrMsg = errMsg
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+	case utils.CHART_SOURCE_FUTURE_GOOD:
+		resp, isOk, msg, errMsg := GetFutureGoodChartInfoDetailFromUniqueCode(chartInfo, key)
+		if !isOk {
+			br.Msg = msg
+			br.ErrMsg = errMsg
+			return
+		}
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		br.Data = resp
+	default:
+		br.Msg = "错误的图表"
+		br.ErrMsg = "错误的图表"
+		return
+	}
+
+}
+
+// GetFutureGoodChartInfoDetailFromUniqueCode 根据编码获取图表详情
+func GetFutureGoodChartInfoDetailFromUniqueCode(chartInfo *models.ChartInfo, key string) (resp *models.ChartInfoDetailResp, isOk bool, msg, errMsg string) {
+	resp = new(models.ChartInfoDetailResp)
+
+	chartInfoId := chartInfo.ChartInfoId
+
+	startDate := chartInfo.StartDate
+	endDate := chartInfo.EndDate
+
+	// 兼容日期错误
+	{
+		if strings.Count(startDate, "-") == 1 {
+			startDate = startDate + "-01"
+		}
+		if strings.Count(endDate, "-") == 1 {
+			endDate = endDate + "-01"
+		}
+	}
+
+	edbInfoMapping, err := models.GetEtaEdbChartEdbMapping(chartInfoId)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取图表,现货指标信息失败,Err:" + err.Error()
+		return
+	}
+	futureGoodEdbInfoMapping, err := models.GetFutureGoodEdbChartEdbMapping(chartInfoId)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取图表的期货商品指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	// 商品价格曲线图的一些配置
+	var barConfig data_manage.BarChartInfoReq
+	barChartInfoDateList := make([]data_manage.BarChartInfoDateReq, 0)
+	barChartInfoSort := data_manage.BarChartInfoSortReq{}
+
+	if chartInfo.BarConfig == `` {
+		msg = "商品价格曲线图未配置"
+		errMsg = "商品价格曲线图未配置"
+		return
+	}
+	err = json.Unmarshal([]byte(chartInfo.BarConfig), &barConfig)
+	if err != nil {
+		msg = "商品价格曲线图配置异常"
+		errMsg = "商品价格曲线图配置异常"
+		return
+	}
+
+	barChartInfoDateList = barConfig.DateList
+	barChartInfoSort = barConfig.Sort
+
+	// 获取图表中的指标数据
+	barConfigEdbInfoIdList, edbList, xEdbIdValue, yDataList, err := future_goodServ.GetChartEdbData(chartInfoId, startDate, endDate, edbInfoMapping, futureGoodEdbInfoMapping, barChartInfoDateList, barChartInfoSort)
+	if err != nil {
+		msg = "获取失败"
+		errMsg = "获取图表,指标信息失败,Err:" + err.Error()
+		return
+	}
+	warnEdbList := make([]string, 0)
+	if len(edbList) <= 0 {
+		msg = "商品价格曲线图表指标异常"
+		errMsg = "商品价格曲线图表异常"
+		return
+	}
+	baseEdbInfo := edbList[0] //现货指标
+
+	for _, v := range edbList {
+		if v.IsNullData {
+			warnEdbList = append(warnEdbList, v.EdbName+"("+v.EdbCode+")")
+		}
+		// 指标别名
+		if barConfigEdbInfoIdList != nil && len(barConfigEdbInfoIdList) > 0 {
+			for _, reqEdb := range barConfigEdbInfoIdList {
+				if v.EdbInfoId == reqEdb.EdbInfoId {
+					v.EdbAliasName = reqEdb.Name
+					v.EdbAliasNameEn = reqEdb.NameEn
+				}
+			}
+		}
+	}
+	chartInfo.UnitEn = baseEdbInfo.UnitEn
+
+	resp.ChartInfo = chartInfo
+	resp.EdbInfoList = edbList
+	resp.XEdbIdValue = xEdbIdValue
+	resp.YDataList = yDataList
+	//resp.BarChartInfo = barConfig
+	//resp.Status = true
+
+	// 将数据加入缓存
+	if utils.Re == nil {
+		data, _ := json.Marshal(resp)
+		utils.Rc.Put(key, data, 2*time.Hour)
+	}
+	isOk = true
+
+	return
+}
+
+// FutureGoodChartInfoRefresh
+// @Title 商品价格图表刷新接口
+// @Description 商品价格图表刷新接口
+// @Param   UniqueCode   query   string  true       "图表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
+// @Success Ret=200 刷新成功
+// @router /future_good/refresh [get]
+func (this *ChartController) FutureGoodChartInfoRefresh() {
+	br := new(models.BaseResponse).Init()
+	chartId := 0
+	defer func() {
+		// 添加日志
+		if chartId > 0 {
+			shareChartRefreshLogInfo := &models.ShareChartRefreshLog{
+				Ip:         this.Ctx.Input.IP(),
+				ChartId:    chartId,
+				CreateTime: time.Now(),
+			}
+			models.AddShareChartRefreshLog(shareChartRefreshLogInfo)
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	uniqueCode := this.GetString("UniqueCode")
+	if uniqueCode == "" {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误,uniqueCode is empty"
+		return
+	}
+	chartInfo, err := models.GetChartInfoByUniqueCode(uniqueCode)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "该图已被删除,请刷新页面"
+			br.ErrMsg = "该图已被删除,请刷新页面,Err:" + err.Error()
+			return
+		}
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+	chartId = chartInfo.ChartInfoId
+
+	err = future_goodServ.FutureGoodChartInfoRefresh(chartInfo.ChartInfoId)
+	if err != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
+		return
+	}
+	//err = data.ChartInfoRefresh(chartInfo.ChartInfoId)
+	//if err != nil {
+	//	br.Msg = "刷新失败"
+	//	br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
+	//	return
+	//}
+
+	//err = data.ChartInfoRefreshV2(chartInfo.ChartInfoId)
+	//if err != nil {
+	//	br.Msg = "刷新失败"
+	//	br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
+	//	return
+	//}
+
+	//清除数据缓存
+	key := utils.HZ_CHART_LIB_DETAIL + uniqueCode
+	if utils.Re == nil {
+		utils.Rc.Delete(key)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "刷新成功"
+}

+ 43 - 35
models/chart.go

@@ -34,6 +34,8 @@ type ChartInfo struct {
 	BarConfig       string    `description:"柱方图的配置,json数据" json:"-"`
 	LeftMin         string    `description:"图表左侧最小值"`
 	LeftMax         string    `description:"图表左侧最大值"`
+	Source          int       `description:"1:ETA图库;2:商品价格曲线"`
+	UnitEn          string    `description:"英文图表名称"`
 }
 
 func GetChartInfoByUniqueCode(uniqueCode string) (item *ChartInfo, err error) {
@@ -44,35 +46,36 @@ func GetChartInfoByUniqueCode(uniqueCode string) (item *ChartInfo, err error) {
 }
 
 type ChartEdbInfoMapping struct {
-	EdbInfoId    int    `description:"指标id"`
-	SourceName   string `description:"来源名称"`
-	Source       int    `description:"来源id"`
-	EdbCode      string `description:"指标编码"`
-	EdbName      string `description:"指标名称"`
-	EdbAliasName string `description:"指标名称(别名)"`
-	EdbNameEn    string `description:"英文指标名称"`
-	Frequency    string `description:"频率"`
-	FrequencyEn  string `description:"英文频率"`
-	Unit         string `description:"单位"`
-	UnitEn       string `description:"英文单位"`
-	StartDate    string `description:"起始日期"`
-	EndDate      string `description:"终止日期"`
-	ModifyTime   string `description:"指标最后更新时间"`
-	//ChartEdbMappingId int     `description:"图表指标id"`
-	ChartInfoId int     `description:"图表id"`
-	MaxData     float64 `description:"上限"`
-	MinData     float64 `description:"下限"`
-	IsOrder     bool    `description:"true:正序,false:逆序"`
-	IsAxis      int     `description:"1:左轴,0:右轴"`
-	EdbInfoType int     `description:"1:标准指标,0:领先指标"`
-	EdbType     int     `description:"指标类型:1:基础指标,2:计算指标"`
-	LeadValue   int     `description:"领先值"`
-	LeadUnit    string  `description:"领先单位"`
-	LeadUnitEn  string  `description:"领先英文单位"`
-	ChartStyle  string  `description:"图表类型"`
-	ChartColor  string  `description:"颜色"`
-	ChartWidth  float64 `description:"线条大小"`
-	DataList    interface{}
+	EdbInfoId         int     `description:"指标id"`
+	SourceName        string  `description:"来源名称"`
+	Source            int     `description:"来源id"`
+	EdbCode           string  `description:"指标编码"`
+	EdbName           string  `description:"指标名称"`
+	EdbAliasName      string  `description:"指标名称(别名)"`
+	EdbAliasNameEn    string  `description:"英文指标名称(别名)"`
+	EdbNameEn         string  `description:"英文指标名称"`
+	Frequency         string  `description:"频率"`
+	FrequencyEn       string  `description:"英文频率"`
+	Unit              string  `description:"单位"`
+	UnitEn            string  `description:"英文单位"`
+	StartDate         string  `description:"起始日期"`
+	EndDate           string  `description:"终止日期"`
+	ModifyTime        string  `description:"指标最后更新时间"`
+	ChartEdbMappingId int     `description:"图表指标id" json:"-"`
+	ChartInfoId       int     `description:"图表id"`
+	MaxData           float64 `description:"上限"`
+	MinData           float64 `description:"下限"`
+	IsOrder           bool    `description:"true:正序,false:逆序"`
+	IsAxis            int     `description:"1:左轴,0:右轴"`
+	EdbInfoType       int     `description:"1:标准指标,0:领先指标"`
+	EdbType           int     `description:"指标类型:1:基础指标,2:计算指标"`
+	LeadValue         int     `description:"领先值"`
+	LeadUnit          string  `description:"领先单位"`
+	LeadUnitEn        string  `description:"领先英文单位"`
+	ChartStyle        string  `description:"图表类型"`
+	ChartColor        string  `description:"颜色"`
+	ChartWidth        float64 `description:"线条大小"`
+	DataList          interface{}
 
 	EdbInfoCategoryType int     `description:"0:普通指标,1:预测指标"`
 	PredictChartColor   string  `description:"预测数据的颜色"`
@@ -82,11 +85,14 @@ type ChartEdbInfoMapping struct {
 	UniqueCode          string  `description:"指标唯一编码"`
 	MinValue            float64 `json:"-" description:"最小值"`
 	MaxValue            float64 `json:"-" description:"最大值"`
+	IsNullData          bool    `json:"-" description:"是否空数据"`
+	MappingSource       int     `description:"1:ETA图库;2:商品价格曲线"`
 }
 
 func GetChartEdbMappingList(chartInfoId int) (list []*ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.source_name,b.source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.edb_type,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type
+	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
+	sql := ` SELECT ` + aField + `,b.source_name,b.source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.edb_type,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type
              FROM chart_edb_mapping AS a
 			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
 			 WHERE chart_info_id=? 
@@ -157,13 +163,15 @@ type ChartInfoDetailResp struct {
 
 // YData 柱方图的y轴数据
 type YData struct {
-	Date  string    `description:"数据日期"`
-	Color string    `description:"数据颜色"`
-	Value []float64 `description:"每个指标的值"`
-	Name  string    `description:"别名"`
+	Date          string    `description:"数据日期"`
+	Color         string    `description:"数据颜色"`
+	Name          string    `description:"别名"`
+	NameEn        string    `description:"英文别名"`
+	Value         []float64 `description:"每个指标的值"`
+	NoDataEdbList []int     `description:"没有数据的指标列表"`
 }
 
-//指标季度数据计算(公历转农历)
+// 指标季度数据计算(公历转农历)
 func AddCalculateQuarterV5(dataList []*EdbDataList) (result *EdbDataResult, err error) {
 	var errMsg string
 	defer func() {

+ 33 - 0
models/chart_edb_mapping.go

@@ -0,0 +1,33 @@
+package models
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"hongze/hongze_chart_lib/utils"
+)
+
+// GetEtaEdbChartEdbMapping       商品曲线图查询对应的普通指标
+func GetEtaEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+
+	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
+	sql := ` SELECT ` + aField + `,b.source_name,b.source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type
+             FROM chart_edb_mapping AS a
+			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
+			 WHERE a.chart_info_id=? AND a.source = ?
+             ORDER BY chart_edb_mapping_id ASC `
+	err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_DEFAULT).QueryRow(&item)
+	return
+}
+
+// GetFutureGoodEdbChartEdbMapping       商品曲线图查询对应的商品指标
+func GetFutureGoodEdbChartEdbMapping(chartInfoId int) (item *ChartEdbInfoMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	aField := `a.chart_edb_mapping_id,a.chart_info_id,a.edb_info_id,a.create_time,a.modify_time,a.unique_code,a.max_data,a.min_data,a.is_order,a.is_axis,a.edb_info_type,a.lead_value,a.lead_unit,a.chart_style,a.chart_color,a.predict_chart_color,a.chart_width,a.source as mapping_source`
+	sql := ` SELECT ` + aField + `,b.future_good_edb_info_id,b.future_good_edb_code as edb_code,b.future_good_edb_name as edb_name,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value
+             FROM chart_edb_mapping AS a
+			 INNER JOIN future_good_edb_info AS b ON a.edb_info_id=b.future_good_edb_info_id
+			 WHERE a.chart_info_id=? AND a.source = ?
+             ORDER BY chart_edb_mapping_id ASC `
+	err = o.Raw(sql, chartInfoId, utils.CHART_SOURCE_FUTURE_GOOD).QueryRow(&item)
+	return
+}

+ 5 - 0
models/data_manage/chart_info.go

@@ -65,7 +65,9 @@ type ChartEdbInfoMapping struct {
 	Source              int     `description:"来源id"`
 	EdbCode             string  `description:"指标编码"`
 	EdbName             string  `description:"指标名称"`
+	EdbAliasName        string  `description:"指标名称(别名)"`
 	EdbNameEn           string  `description:"英文指标名称"`
+	EdbAliasNameEn      string  `description:"英文指标名称(别名)"`
 	EdbType             int     `description:"指标类型:1:基础指标,2:计算指标"`
 	Frequency           string  `description:"频率"`
 	FrequencyEn         string  `description:"英文频率"`
@@ -96,6 +98,7 @@ type ChartEdbInfoMapping struct {
 	MinValue            float64 `json:"-" description:"最小值"`
 	MaxValue            float64 `json:"-" description:"最大值"`
 	DataList            interface{}
+	IsNullData          bool `json:"-" description:"是否空数据"`
 }
 
 func GetChartEdbMappingList(chartInfoId int) (list []*ChartEdbInfoMapping, err error) {
@@ -120,6 +123,8 @@ type BarChartInfoReq struct {
 type BarChartInfoEdbItemReq struct {
 	EdbInfoId int    `description:"指标ID"`
 	Name      string `description:"别名"`
+	NameEn    string `description:"英文别名"`
+	Source    int    `description:"1:ETA图库;2:商品价格"`
 }
 
 // BarChartInfoDateReq 柱方图预览请求数据(日期相关)

+ 169 - 0
models/data_manage/future_good/future_good_chart_classify.go

@@ -0,0 +1,169 @@
+package future_good
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// FutureGoodChartClassify future_good_chart表格分类
+type FutureGoodChartClassify struct {
+	FutureGoodChartClassifyId   int       `orm:"column(future_good_chart_classify_id);pk"`
+	FutureGoodChartClassifyName string    `description:"分类名称"`
+	ParentId                    int       `description:"父级id"`
+	SysUserId                   int       `description:"创建人id"`
+	SysUserRealName             string    `description:"创建人姓名"`
+	Level                       int       `description:"层级"`
+	UniqueCode                  string    `description:"唯一编码"`
+	Sort                        int       `description:"排序字段,越小越靠前,默认值:10"`
+	IsDelete                    int       `description:"排序字段,越小越靠前,默认值:10"`
+	CreateTime                  time.Time `description:"创建时间"`
+	ModifyTime                  time.Time `description:"修改时间"`
+}
+
+// AddFutureGoodChartClassify 添加future_good_chart分类
+func AddFutureGoodChartClassify(item *FutureGoodChartClassify) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+// GetFutureGoodChartClassifyCount 获取同级分类下存在同名分类的数量
+func GetFutureGoodChartClassifyCount(FutureGoodChartClassifyName string, parentId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM future_good_chart_classify WHERE parent_id=? AND future_good_chart_classify_name=? AND is_delete=0 `
+	err = o.Raw(sql, parentId, FutureGoodChartClassifyName).QueryRow(&count)
+	return
+}
+
+func GetFutureGoodChartClassifyById(classifyId int) (item *FutureGoodChartClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM future_good_chart_classify WHERE future_good_chart_classify_id=? AND is_delete=0 `
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+func GetFutureGoodChartClassifyByParentId(parentId int) (items []*FutureGoodChartClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM future_good_chart_classify WHERE parent_id=? AND is_delete=0 order by sort asc,future_good_chart_classify_id asc`
+	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	return
+}
+
+func GetFutureGoodChartClassifyAll() (items []*FutureGoodChartClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM future_good_chart_classify WHERE parent_id<>0 AND is_delete=0 order by sort asc,future_good_chart_classify_id asc`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type FutureGoodChartClassifyItems struct {
+	FutureGoodChartClassifyId   int `description:"分类id"`
+	FutureGoodChartInfoId       int `description:"表格id"`
+	FutureGoodChartClassifyName string
+	ParentId                    int
+	Level                       int    `description:"层级"`
+	Sort                        int    `description:"排序字段,越小越靠前,默认值:10"`
+	UniqueCode                  string `description:"唯一编码"`
+	SysUserId                   int    `description:"创建人id"`
+	SysUserRealName             string `description:"创建人姓名"`
+	StartDate                   string `description:"自定义开始日期"`
+	Children                    []*FutureGoodChartClassifyItems
+}
+
+func GetFutureGoodChartClassifyByCondition(condition string, pars []interface{}) (item *FutureGoodChartClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM future_good_chart_classify WHERE 1=1 AND is_delete=0 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+// GetNextFutureGoodChartClassifyByCondition 获取下一个分类
+func GetNextFutureGoodChartClassifyByCondition(condition string, pars []interface{}) (item *FutureGoodChartClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM future_good_chart_classify WHERE 1=1 AND is_delete=0 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += " ORDER BY sort asc , create_time ASC LIMIT 1 "
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+// GetFirstFutureGoodChartClassifyByParentId 获取当前父级图表分类下的排序第一条的数据
+func GetFirstFutureGoodChartClassifyByParentId(parentId int) (item *FutureGoodChartClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM future_good_chart_classify WHERE parent_id=? AND is_delete=0 order by sort asc,future_good_chart_classify_id asc limit 1`
+	err = o.Raw(sql, parentId).QueryRow(&item)
+	return
+}
+
+// UpdateFutureGoodChartClassifySortByParentId 根据图表父类id更新排序
+func UpdateFutureGoodChartClassifySortByParentId(parentId, classifyId, nowSort int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update future_good_chart_classify set sort = ` + updateSort + ` WHERE parent_id=? and sort > ? AND is_delete=0 `
+	if classifyId > 0 {
+		sql += ` or ( future_good_chart_classify_id > ` + fmt.Sprint(classifyId) + ` and sort= ` + fmt.Sprint(nowSort) + `)`
+	}
+	_, err = o.Raw(sql, parentId, nowSort).Exec()
+	return
+}
+
+// Update 更新图表分类基础信息
+func (FutureGoodChartClassify *FutureGoodChartClassify) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(FutureGoodChartClassify, cols...)
+	return
+}
+
+// GetFutureGoodChartClassifyMaxSort 获取图表分类下最大的排序数
+func GetFutureGoodChartClassifyMaxSort(parentId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT Max(sort) AS sort FROM future_good_chart_classify WHERE parent_id=? AND is_delete=0 `
+	err = o.Raw(sql, parentId).QueryRow(&sort)
+	return
+}
+
+type FutureGoodChartClassifyView struct {
+	FutureGoodChartClassifyId   int    `orm:"column(future_good_chart_classify_id);pk"`
+	FutureGoodChartClassifyName string `description:"分类名称"`
+	ParentId                    int    `description:"父级id"`
+}
+
+func GetFutureGoodChartClassifyViewById(classifyId int) (item *FutureGoodChartClassifyView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM future_good_chart_classify WHERE future_good_chart_classify_id=? AND is_delete=0 `
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+//用于分类展示
+func GetChartInfoAll() (items []*FutureGoodChartClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,
+             unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date
+            FROM chart_info ORDER BY sort asc,create_time ASC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetNoContentFutureGoodInfoAll 获取不含content的表格列表 用于分类展示
+func GetNoContentFutureGoodInfoAll() (items []FutureGoodChartClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT excel_info_id,excel_classify_id,excel_name AS excel_classify_name,
+             unique_code,sys_user_id,sys_user_real_name
+            FROM excel_info where is_delete=0 ORDER BY sort asc,create_time desc `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetFutureGoodChartInfoCountByClassifyId 根据分类id获取名下表格数量
+func GetFutureGoodChartInfoCountByClassifyId(classifyId int) (total int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT count(1) total FROM excel_info WHERE excel_classify_id = ? AND is_delete=0 `
+	err = o.Raw(sql, classifyId).QueryRow(&total)
+	return
+}

+ 129 - 0
models/data_manage/future_good/future_good_edb_info.go

@@ -0,0 +1,129 @@
+package future_good
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// FutureGoodEdbInfo 期货指标表
+type FutureGoodEdbInfo struct {
+	FutureGoodEdbInfoId int       `orm:"column(future_good_edb_info_id);pk"`
+	FutureGoodEdbCode   string    `description:"期货指标code"`
+	FutureGoodEdbName   string    `description:"期货指标名称"`
+	FutureGoodEdbNameEn string    `description:"期货指标英文名称"`
+	ParentId            int       `description:"上级期货id"`
+	Exchange            string    `description:"所属交易所"`
+	Month               int       `description:"所属月份"`
+	StartDate           string    `description:"起始日期"`
+	EndDate             string    `description:"终止日期"`
+	MinValue            float64   `description:"最小值"`
+	MaxValue            float64   `description:"最大值"`
+	LatestValue         float64   `description:"数据最新的值"`
+	LatestDate          time.Time `description:"数据最新的日期"`
+	ServerUrl           string    `description:"服务器地址"`
+	CreateTime          time.Time
+	ModifyTime          time.Time
+}
+
+// GetFutureGoodEdbInfo 期货指标
+func GetFutureGoodEdbInfo(edbInfoId int) (item *FutureGoodEdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM future_good_edb_info WHERE future_good_edb_info_id = ? `
+	sql += ` ORDER BY future_good_edb_info_id DESC `
+	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	return
+}
+
+// GetFutureGoodEdbInfoList 获取指标数据列表
+func GetFutureGoodEdbInfoList(condition string, pars []interface{}) (list []*FutureGoodEdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM future_good_edb_info WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY future_good_edb_info_id DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// GetAllFutureGoodEdbInfoList 获取指标数据列表
+func GetAllFutureGoodEdbInfoList() (list []*FutureGoodEdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM future_good_edb_info  ORDER BY future_good_edb_info_id DESC `
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+// GetFutureGoodEdbInfoListByParentId 根据父级ID获取指标数据列表
+func GetFutureGoodEdbInfoListByParentId(parentId int) (list []*FutureGoodEdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM future_good_edb_info WHERE parent_id = ?  ORDER BY future_good_edb_info_id ASC `
+	_, err = o.Raw(sql, parentId).QueryRows(&list)
+	return
+}
+
+// AddFutureGoodEdbInfo 添加期货数据库指标
+func AddFutureGoodEdbInfo(item *FutureGoodEdbInfo) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err := o.Insert(item)
+	if err != nil {
+		return
+	}
+	item.FutureGoodEdbInfoId = int(lastId)
+	return
+}
+
+// Update 更新指标基础信息
+func (FutureGoodEdbInfo *FutureGoodEdbInfo) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(FutureGoodEdbInfo, cols...)
+	return
+}
+
+// FutureGoodEdbInfoGroupListResp 期货指标数据列表数据返回
+type FutureGoodEdbInfoGroupListResp struct {
+	FutureGoodEdbInfoId   int
+	FutureGoodEdbInfoName string
+	Child                 []FutureGoodEdbInfoGroupListResp
+}
+
+// GetFutureGoodEdbInfoGroupList 获取分組指标数据列表
+func GetFutureGoodEdbInfoGroupList(condition string, pars []interface{}) (list []*FutureGoodEdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM future_good_edb_info WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY future_good_edb_info_id DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
+	return
+}
+
+// BarChartInfoReq 柱方图预览请求数据
+type BarChartInfoReq struct {
+	EdbInfoIdList []BarChartInfoEdbItemReq `description:"指标信息"`
+	DateList      []BarChartInfoDateReq    `description:"日期配置"`
+	Sort          BarChartInfoSortReq      `description:"排序"`
+}
+
+// BarChartInfoEdbItemReq 柱方图预览请求数据(指标相关)
+type BarChartInfoEdbItemReq struct {
+	EdbInfoId int    `description:"指标ID"`
+	Name      string `description:"别名"`
+	Source    int    `description:"1:ETA图库;2:商品价格"`
+}
+
+// BarChartInfoDateReq 柱方图预览请求数据(日期相关)
+type BarChartInfoDateReq struct {
+	Type  int    `description:"配置类型"`
+	Date  string `description:"固定日期"`
+	Value int    `description:"N天的值"`
+	Color string `description:"颜色"`
+	Name  string `description:"别名"`
+}
+
+// BarChartInfoSortReq 柱方图预览请求数据(排序相关)
+type BarChartInfoSortReq struct {
+	Sort      int `description:"排序类型,0:默认,1:升序,2:降序"`
+	DateIndex int `description:"日期数据的下标,从0开始"`
+}

+ 103 - 0
models/data_manage/future_good/future_good_edb_info_data.go

@@ -0,0 +1,103 @@
+package future_good
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// FutureGoodEdbData 期货指标数据的表
+type FutureGoodEdbData struct {
+	FutureGoodEdbDataId int       `orm:"column(future_good_edb_data_id);pk"`
+	FutureGoodEdbInfoId int       `description:"期货指标id"`
+	FutureGoodEdbCode   string    `description:"期货指标code"`
+	DataTime            time.Time `description:"数据日期"`
+	TradeCode           string    `description:"证券代码"`
+	Open                float64   `description:"开盘价"`
+	High                float64   `description:"最高价"`
+	Low                 float64   `description:"最低价"`
+	Close               float64   `description:"收盘价"`
+	Volume              float64   `description:"成交量"`
+	Amt                 float64   `description:"成交额"`
+	Oi                  float64   `description:"持仓量"`
+	Settle              float64   `description:"结算价"`
+	DataTimestamp       int64     `description:"数据日期时间戳"`
+	ModifyTime          time.Time
+	CreateTime          time.Time
+}
+
+// FutureGoodEdbDataListResp 期货指标数据列表数据返回
+type FutureGoodEdbDataListResp struct {
+	Paging *paging.PagingItem
+	List   []*FutureGoodEdbDataItem
+}
+
+// FutureGoodEdbDataItem 期货指标数据列表数据
+type FutureGoodEdbDataItem struct {
+	FutureGoodEdbDataId int     `orm:"column(future_good_edb_data_id);pk"`
+	FutureGoodEdbInfoId int     `description:"期货指标id"`
+	FutureGoodEdbCode   string  `description:"期货指标code"`
+	FutureGoodEdbName   string  `description:"期货指标名称"`
+	DataTime            string  `description:"数据日期"`
+	TradeCode           string  `description:"证券代码"`
+	Open                float64 `description:"开盘价"`
+	High                float64 `description:"最高价"`
+	Low                 float64 `description:"最低价"`
+	Close               float64 `description:"收盘价"`
+	Volume              float64 `description:"成交量"`
+	Amt                 float64 `description:"成交额"`
+	Oi                  float64 `description:"持仓量"`
+	Settle              float64 `description:"结算价"`
+	DataTimestamp       int64   `description:"数据日期时间戳"`
+	ModifyTime          string
+	CreateTime          string
+}
+
+// GetFutureGoodEdbDataListCount 获取期货指标数据汇总数
+func GetFutureGoodEdbDataListCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM future_good_edb_data WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+// GetFutureGoodEdbDataList 获取期货指标数据列表
+func GetFutureGoodEdbDataList(condition string, pars []interface{}, startSize, pageSize int) (list []*FutureGoodEdbDataItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM future_good_edb_data WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY modify_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}
+
+type EdbDataList struct {
+	EdbDataId     int     `description:" 指标数据ID"`
+	EdbInfoId     int     `description:"指标ID"`
+	DataTime      string  //`json:"-" description:"数据日期"`
+	DataTimestamp int64   `description:"数据日期"`
+	Value         float64 `description:"数据值"`
+}
+
+func GetFutureGoodEdbDataListByDate(futureGoodEdbInfoId int, startDate, endDate string) (list []*FutureGoodEdbData, err error) {
+	var pars []interface{}
+	sql := `SELECT * FROM future_good_edb_data WHERE 1=1 AND future_good_edb_info_id = ? `
+	if startDate != "" {
+		sql += ` AND data_time>=? `
+		pars = append(pars, startDate)
+	}
+	if endDate != "" {
+		sql += ` AND data_time<=? `
+		pars = append(pars, endDate)
+	}
+
+	sql += ` ORDER BY data_time ASC `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, futureGoodEdbInfoId, pars).QueryRows(&list)
+	return
+}

+ 7 - 0
models/data_manage/future_good/request/future_good_chart.go

@@ -0,0 +1,7 @@
+package request
+
+type EditChartEnInfoReq struct {
+	ChartInfoId int    `description:"图表ID"`
+	ChartNameEn string `description:"英文图表名称"`
+	UnitEn      string `description:"英文单位"`
+}

+ 32 - 0
models/data_manage/future_good/request/future_good_chart_classify.go

@@ -0,0 +1,32 @@
+package request
+
+// AddFutureGoodChartClassifyReq 添加excel分类请求
+type AddFutureGoodChartClassifyReq struct {
+	FutureGoodChartClassifyName string `description:"分类名称"`
+	ParentId                    int    `description:"父级id,第一级传0" json:"-"`
+	Level                       int    `description:"层级,第一级传0,其余传上一级的层级" json:"-"`
+}
+
+// EditFutureGoodChartClassifyReq 修改excel分类请求
+type EditFutureGoodChartClassifyReq struct {
+	FutureGoodChartClassifyName string `description:"分类名称"`
+	FutureGoodChartClassifyId   int    `description:"分类名称"`
+}
+
+// MoveFutureGoodChartClassifyReq 移动图表分类请求参数
+type MoveFutureGoodChartClassifyReq struct {
+	ClassifyId       int `description:"分类id"`
+	ParentClassifyId int `description:"父级分类id" json:"-"`
+	PrevClassifyId   int `description:"上一个兄弟节点分类id"`
+	NextClassifyId   int `description:"下一个兄弟节点分类id"`
+}
+
+type DeleteFutureGoodChartClassifyReq struct {
+	FutureGoodChartClassifyId int `description:"分类id"`
+	FutureGoodChartInfoId     int `description:"表格id"`
+}
+
+type FutureGoodChartClassifyDeleteCheckReq struct {
+	FutureGoodChartClassifyId int `description:"分类id"`
+	FutureGoodChartInfoId     int `description:"表格id"`
+}

+ 14 - 0
models/data_manage/future_good/response/future_good_chart_classify.go

@@ -0,0 +1,14 @@
+package response
+
+import (
+	"hongze/hongze_chart_lib/models/data_manage/future_good"
+)
+
+type FutureGoodChartClassifyListResp struct {
+	AllNodes []*future_good.FutureGoodChartClassifyItems
+}
+
+type FutureGoodChartClassifyDeleteCheckResp struct {
+	DeleteStatus int    `description:"检测状态:0:默认值,如果为0,继续走其他校验,1:该分类下关联图表不可删除,2:确认删除当前目录及包含的子目录吗"`
+	TipsMsg      string `description:"提示信息"`
+}

+ 12 - 0
models/db.go

@@ -3,6 +3,7 @@ package models
 import (
 	_ "github.com/go-sql-driver/mysql"
 	"hongze/hongze_chart_lib/models/data_manage"
+	"hongze/hongze_chart_lib/models/data_manage/future_good"
 	"hongze/hongze_chart_lib/utils"
 	"time"
 
@@ -44,4 +45,15 @@ func init() {
 		new(data_manage.PredictEdbRuleData),             //预测指标配置生成的数据
 		new(data_manage.PredictEdbConfCalculateMapping), //预测指标关系表
 	)
+	// 期货数据库
+	initFutureGood()
+}
+
+// initFutureGood 注册期货数据 数据表
+func initFutureGood() {
+	//注册对象
+	orm.RegisterModel(
+		new(future_good.FutureGoodEdbInfo), //期货指标表
+		new(future_good.FutureGoodEdbData), //期货指标数据表
+	)
 }

+ 18 - 0
routers/commentsRouter.go

@@ -7,6 +7,15 @@ import (
 
 func init() {
 
+    beego.GlobalControllerRouter["hongze/hongze_chart_lib/controllers:ChartController"] = append(beego.GlobalControllerRouter["hongze/hongze_chart_lib/controllers:ChartController"],
+        beego.ControllerComments{
+            Method: "CommonChartInfoDetailFromUniqueCode",
+            Router: `/common/detail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_chart_lib/controllers:ChartController"] = append(beego.GlobalControllerRouter["hongze/hongze_chart_lib/controllers:ChartController"],
         beego.ControllerComments{
             Method: "ChartInfoDetail",
@@ -16,6 +25,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_chart_lib/controllers:ChartController"] = append(beego.GlobalControllerRouter["hongze/hongze_chart_lib/controllers:ChartController"],
+        beego.ControllerComments{
+            Method: "FutureGoodChartInfoRefresh",
+            Router: `/future_good/refresh`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_chart_lib/controllers:ChartController"] = append(beego.GlobalControllerRouter["hongze/hongze_chart_lib/controllers:ChartController"],
         beego.ControllerComments{
             Method: "ChartInfoRefresh",

+ 71 - 0
services/data/future_good/base_future_good_lib.go

@@ -0,0 +1,71 @@
+package future_good
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_chart_lib/models"
+	"hongze/hongze_chart_lib/utils"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+
+// AddEdbData 添加指标数据
+func AddEdbData(futureGoodEdbCode string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = futureGoodEdbCode
+	urlStr := `future_good/add`
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
+// RefreshEdbData 刷新指标数据
+func RefreshEdbData(futureGoodEdbInfoId int, futureGoodEdbCode, startDate string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["FutureGoodEdbCode"] = futureGoodEdbCode
+	param["FutureGoodEdbInfoId"] = futureGoodEdbInfoId
+	param["StartDate"] = startDate
+	urlStr := `future_good/refresh`
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
+// postRefreshEdbData 刷新指标数据
+func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *models.BaseResponse, err error) {
+	postUrl := utils.EDB_LIB_URL + urlStr
+	postData, err := json.Marshal(param)
+	if err != nil {
+		return
+	}
+	result, err := HttpPost(postUrl, string(postData), "application/json")
+	if err != nil {
+		return
+	}
+	utils.FileLog.Info("postRefreshEdbData:" + postUrl + ";" + string(postData) + ";result:" + string(result))
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+	return resp, nil
+}
+
+func HttpPost(url, postData string, params ...string) ([]byte, error) {
+	body := ioutil.NopCloser(strings.NewReader(postData))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		return nil, err
+	}
+	contentType := "application/x-www-form-urlencoded;charset=utf-8"
+	if len(params) > 0 && params[0] != "" {
+		contentType = params[0]
+	}
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("authorization", utils.MD5(utils.APP_EDB_LIB_NAME_EN+utils.EDB_LIB_Md5_KEY))
+	resp, err := client.Do(req)
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	fmt.Println("HttpPost:" + string(b))
+	return b, err
+}

+ 539 - 0
services/data/future_good/chart_info.go

@@ -0,0 +1,539 @@
+package future_good
+
+import (
+	"errors"
+	"fmt"
+	"github.com/shopspring/decimal"
+	"hongze/hongze_chart_lib/models"
+	"hongze/hongze_chart_lib/models/data_manage"
+	efuture_good "hongze/hongze_chart_lib/models/data_manage/future_good"
+	"hongze/hongze_chart_lib/services/alarm_msg"
+	"hongze/hongze_chart_lib/services/data"
+	"hongze/hongze_chart_lib/utils"
+	"sort"
+	"strconv"
+	"time"
+)
+
+// GetChartEdbData 获取图表的指标数据
+func GetChartEdbData(chartInfoId int, startDate, endDate string, edbInfoMapping, futureGoodEdbInfoMapping *models.ChartEdbInfoMapping, barChartInfoDateList []data_manage.BarChartInfoDateReq, barChartInfoSort data_manage.BarChartInfoSortReq) (barConfigEdbInfoIdList []data_manage.BarChartInfoEdbItemReq, edbList []*models.ChartEdbInfoMapping, xEdbIdValue []int, yDataList []models.YData, err error) {
+	edbList = make([]*models.ChartEdbInfoMapping, 0)
+
+	if futureGoodEdbInfoMapping == nil {
+		err = errors.New("商品指标未选取")
+		return
+	}
+	if edbInfoMapping == nil {
+		err = errors.New("ETA指标未选取")
+		return
+	}
+	// 指标对应的所有数据
+	edbDataListMap := make(map[int][]*models.EdbDataList)
+
+	item := new(data_manage.ChartEdbInfoMapping)
+	edbInfoMapping.FrequencyEn = data.GetFrequencyEn(edbInfoMapping.Frequency)
+
+	if edbInfoMapping.Unit == `无` {
+		edbInfoMapping.Unit = ``
+	}
+	if futureGoodEdbInfoMapping.Unit == `无` {
+		futureGoodEdbInfoMapping.Unit = ``
+	}
+
+	if chartInfoId <= 0 {
+		edbInfoMapping.IsAxis = 1
+		edbInfoMapping.LeadValue = 0
+		edbInfoMapping.LeadUnit = ""
+		edbInfoMapping.ChartEdbMappingId = 0
+		edbInfoMapping.ChartInfoId = 0
+		edbInfoMapping.IsOrder = false
+		edbInfoMapping.EdbInfoType = 1
+		edbInfoMapping.ChartStyle = ""
+		edbInfoMapping.ChartColor = ""
+		edbInfoMapping.ChartWidth = 0
+
+		futureGoodEdbInfoMapping.IsAxis = 1
+		futureGoodEdbInfoMapping.LeadValue = 0
+		futureGoodEdbInfoMapping.LeadUnit = ""
+		futureGoodEdbInfoMapping.ChartEdbMappingId = 0
+		futureGoodEdbInfoMapping.ChartInfoId = 0
+		futureGoodEdbInfoMapping.IsOrder = false
+		futureGoodEdbInfoMapping.EdbInfoType = 1
+		futureGoodEdbInfoMapping.ChartStyle = ""
+		futureGoodEdbInfoMapping.ChartColor = ""
+		futureGoodEdbInfoMapping.ChartWidth = 0
+	} else {
+		edbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(edbInfoMapping.LeadUnit)
+		futureGoodEdbInfoMapping.LeadUnitEn = data.GetLeadUnitEn(futureGoodEdbInfoMapping.LeadUnit)
+	}
+
+	// 普通的指标数据
+	{
+		dataList := make([]*models.EdbDataList, 0)
+
+		dataList, err = models.GetEdbDataList(edbInfoMapping.Source, edbInfoMapping.EdbInfoId, startDate, endDate)
+		edbDataListMap[edbInfoMapping.EdbInfoId] = dataList
+		item.DataList = dataList
+
+		edbList = append(edbList, edbInfoMapping)
+
+		barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, data_manage.BarChartInfoEdbItemReq{
+			EdbInfoId: edbInfoMapping.EdbInfoId,
+			//Name:      edbInfoMapping.EdbName,
+			Name:   "现货价",
+			NameEn: "Spot Price",
+			Source: edbInfoMapping.Source,
+		})
+	}
+
+	nowMonth := time.Now().Month()
+	// 获取期货指标以及期货数据
+	futureGoodEdbInfoList, err := efuture_good.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
+	if err != nil {
+		return
+	}
+
+	futureGoodMappingList := make([]*models.ChartEdbInfoMapping, 0)
+	//当前月份之后的月
+	nextFutureGoodEdbInfoList := make([]*efuture_good.FutureGoodEdbInfo, 0)
+	for k, v := range futureGoodEdbInfoList {
+		// 过滤当前月
+		if v.Month == int(nowMonth) {
+			continue
+		}
+
+		if v.Month < int(nowMonth) {
+			nextFutureGoodEdbInfoList = append(nextFutureGoodEdbInfoList, v)
+			continue
+		}
+		newMappingInfo := &models.ChartEdbInfoMapping{
+			EdbInfoId:           v.FutureGoodEdbInfoId,
+			SourceName:          v.Exchange,
+			Source:              utils.CHART_SOURCE_FUTURE_GOOD,
+			EdbCode:             v.FutureGoodEdbCode,
+			EdbName:             v.FutureGoodEdbName,
+			EdbAliasName:        v.FutureGoodEdbName,
+			EdbNameEn:           v.FutureGoodEdbNameEn,
+			EdbType:             edbInfoMapping.EdbType,
+			Frequency:           edbInfoMapping.Frequency,
+			FrequencyEn:         edbInfoMapping.FrequencyEn,
+			Unit:                edbInfoMapping.Unit,
+			UnitEn:              edbInfoMapping.UnitEn,
+			StartDate:           v.StartDate,
+			EndDate:             v.EndDate,
+			ModifyTime:          v.ModifyTime.Format(utils.FormatDateTime),
+			ChartEdbMappingId:   v.FutureGoodEdbInfoId,
+			ChartInfoId:         edbInfoMapping.ChartInfoId,
+			MaxData:             v.MaxValue,
+			MinData:             v.MinValue,
+			IsOrder:             edbInfoMapping.IsOrder,
+			IsAxis:              edbInfoMapping.IsAxis,
+			EdbInfoType:         edbInfoMapping.EdbInfoType,
+			EdbInfoCategoryType: edbInfoMapping.EdbInfoCategoryType,
+			LeadValue:           edbInfoMapping.LeadValue,
+			LeadUnit:            edbInfoMapping.LeadUnit,
+			LeadUnitEn:          edbInfoMapping.LeadUnitEn,
+			ChartStyle:          edbInfoMapping.ChartStyle,
+			ChartColor:          edbInfoMapping.ChartColor,
+			PredictChartColor:   edbInfoMapping.PredictChartColor,
+			ChartWidth:          edbInfoMapping.ChartWidth,
+			ChartType:           edbInfoMapping.ChartType,
+			LatestDate:          v.LatestDate.Format(utils.FormatDateTime),
+			LatestValue:         v.LatestValue,
+			UniqueCode:          futureGoodEdbInfoMapping.UniqueCode + strconv.Itoa(k),
+			MinValue:            v.MinValue,
+			MaxValue:            v.MaxValue,
+			DataList:            nil,
+			IsNullData:          false,
+		}
+		futureGoodMappingList = append(futureGoodMappingList, newMappingInfo)
+
+		barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, data_manage.BarChartInfoEdbItemReq{
+			EdbInfoId: newMappingInfo.EdbInfoId,
+			Name:      fmt.Sprint("M+", v.Month),
+			NameEn:    fmt.Sprint("M+", v.Month),
+			Source:    newMappingInfo.Source,
+		})
+	}
+
+	//当前月份之前的月
+	for k, v := range nextFutureGoodEdbInfoList {
+		newMappingInfo := &models.ChartEdbInfoMapping{
+			EdbInfoId:           v.FutureGoodEdbInfoId,
+			SourceName:          v.Exchange,
+			Source:              utils.CHART_SOURCE_FUTURE_GOOD,
+			EdbCode:             v.FutureGoodEdbCode,
+			EdbName:             v.FutureGoodEdbName,
+			EdbAliasName:        v.FutureGoodEdbName,
+			EdbNameEn:           v.FutureGoodEdbNameEn,
+			EdbType:             edbInfoMapping.EdbType,
+			Frequency:           edbInfoMapping.Frequency,
+			FrequencyEn:         edbInfoMapping.FrequencyEn,
+			Unit:                edbInfoMapping.Unit,
+			UnitEn:              edbInfoMapping.UnitEn,
+			StartDate:           v.StartDate,
+			EndDate:             v.EndDate,
+			ModifyTime:          v.ModifyTime.Format(utils.FormatDateTime),
+			ChartEdbMappingId:   v.FutureGoodEdbInfoId,
+			ChartInfoId:         edbInfoMapping.ChartInfoId,
+			MaxData:             v.MaxValue,
+			MinData:             v.MinValue,
+			IsOrder:             edbInfoMapping.IsOrder,
+			IsAxis:              edbInfoMapping.IsAxis,
+			EdbInfoType:         edbInfoMapping.EdbInfoType,
+			EdbInfoCategoryType: edbInfoMapping.EdbInfoCategoryType,
+			LeadValue:           edbInfoMapping.LeadValue,
+			LeadUnit:            edbInfoMapping.LeadUnit,
+			LeadUnitEn:          edbInfoMapping.LeadUnitEn,
+			ChartStyle:          edbInfoMapping.ChartStyle,
+			ChartColor:          edbInfoMapping.ChartColor,
+			PredictChartColor:   edbInfoMapping.PredictChartColor,
+			ChartWidth:          edbInfoMapping.ChartWidth,
+			ChartType:           edbInfoMapping.ChartType,
+			LatestDate:          v.LatestDate.Format(utils.FormatDateTime),
+			LatestValue:         v.LatestValue,
+			UniqueCode:          futureGoodEdbInfoMapping.UniqueCode + "1" + strconv.Itoa(k),
+			MinValue:            v.MinValue,
+			MaxValue:            v.MaxValue,
+			DataList:            nil,
+			IsNullData:          false,
+		}
+		futureGoodMappingList = append(futureGoodMappingList, newMappingInfo)
+
+		barConfigEdbInfoIdList = append(barConfigEdbInfoIdList, data_manage.BarChartInfoEdbItemReq{
+			EdbInfoId: newMappingInfo.EdbInfoId,
+			Name:      fmt.Sprint("M+", v.Month),
+			NameEn:    fmt.Sprint("M+", v.Month),
+			Source:    newMappingInfo.Source,
+		})
+	}
+	// 获取数据
+	for _, v := range futureGoodMappingList {
+		dataList := make([]*models.EdbDataList, 0)
+
+		tmpDataList, tmpErr := efuture_good.GetFutureGoodEdbDataListByDate(v.EdbInfoId, startDate, endDate)
+		if tmpErr != nil {
+			return
+		}
+		for _, tmpData := range tmpDataList {
+			dataList = append(dataList, &models.EdbDataList{
+				EdbDataId:     tmpData.FutureGoodEdbDataId,
+				EdbInfoId:     tmpData.FutureGoodEdbInfoId,
+				DataTime:      tmpData.DataTime.Format(utils.FormatDate),
+				DataTimestamp: tmpData.DataTimestamp,
+				Value:         tmpData.Close,
+			})
+		}
+		edbDataListMap[v.EdbInfoId] = dataList
+		v.DataList = dataList
+	}
+
+	edbList = append(edbList, futureGoodMappingList...)
+	xEdbIdValue, yDataList, err = BarChartData(edbList, edbDataListMap, barChartInfoDateList, barChartInfoSort)
+	return
+}
+
+// BarChartData 柱方图的数据处理
+func BarChartData(mappingList []*models.ChartEdbInfoMapping, edbDataListMap map[int][]*models.EdbDataList, barChartInfoDateList []data_manage.BarChartInfoDateReq, barChartInfoSort data_manage.BarChartInfoSortReq) (edbIdList []int, yDataList []models.YData, err error) {
+	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
+	edbDataMap := make(map[int]map[string]float64)
+	for edbInfoId, edbDataList := range edbDataListMap {
+		edbDateData := make(map[string]float64)
+		for _, edbData := range edbDataList {
+			edbDateData[edbData.DataTime] = edbData.Value
+		}
+		edbDataMap[edbInfoId] = edbDateData
+	}
+
+	// edbIdList 指标展示顺序;x轴的指标顺序
+	edbIdList = make([]int, 0)
+	//Sort int    `description:"排序类型,0:默认,1:升序,2:降序"`
+	dateData := make(map[int]float64)
+	if barChartInfoSort.Sort == 0 {
+		for _, v := range mappingList {
+			edbIdList = append(edbIdList, v.EdbInfoId)
+		}
+	} else {
+		lenBarChartInfoDateList := len(barChartInfoDateList)
+		if barChartInfoSort.DateIndex >= lenBarChartInfoDateList {
+			err = errors.New("排序日期异常")
+			return
+		}
+
+		notDataEdbIdList := make([]int, 0) //没有数据的指标id
+		// 日期配置
+		barChartInfoDate := barChartInfoDateList[barChartInfoSort.DateIndex]
+		for edbInfoId, dataList := range edbDataListMap {
+			if len(dataList) <= 0 {
+				// 没有数据的指标id
+				notDataEdbIdList = append(notDataEdbIdList, edbInfoId)
+				continue
+			}
+			findDate := barChartInfoDate.Date
+			switch barChartInfoDate.Type {
+			case 1: //最新值
+				findDate = dataList[len(dataList)-1].DataTime
+			case 2: //近期几天
+				findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				findDateTime = findDateTime.AddDate(0, 0, -barChartInfoDate.Value)
+
+				lenData := len(dataList) - 1
+
+				for i := lenData; i >= 0; i-- {
+					currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
+					if tmpErr != nil {
+						err = tmpErr
+						return
+					}
+					if currDateTime.Equal(findDateTime) || currDateTime.Before(findDateTime) {
+						findDate = dataList[i].DataTime
+						break
+					}
+				}
+			case 3: // 固定日期
+				//最早的日期
+				minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				//寻找固定日期的数据
+				findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
+					tmpDate := tmpDateTime.Format(utils.FormatDate)
+					if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
+						findDate = tmpDate
+						break
+					}
+				}
+			default:
+				err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
+				return
+			}
+			if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
+				dateData[edbInfoId] = tmpValue
+			} else {
+				// 没有数据的指标id
+				notDataEdbIdList = append(notDataEdbIdList, edbInfoId)
+			}
+		}
+
+		//Sort int    `description:"排序类型,0:默认,1:升序,2:降序"`
+		// 排序
+		dateDataSort := utils.NewMapSorter(dateData)
+		sort.Sort(dateDataSort)
+		if barChartInfoSort.Sort == 1 {
+			// 先将没有数据的指标id放在最前面
+			if len(notDataEdbIdList) > 0 {
+				edbIdList = append(edbIdList, notDataEdbIdList...)
+			}
+			for _, v := range dateDataSort {
+				edbIdList = append(edbIdList, v.Key)
+			}
+		} else {
+			for i := len(dateDataSort) - 1; i >= 0; i-- {
+				edbIdList = append(edbIdList, dateDataSort[i].Key)
+			}
+			// 再将没有数据的指标id放在最后面
+			if len(notDataEdbIdList) > 0 {
+				edbIdList = append(edbIdList, notDataEdbIdList...)
+			}
+		}
+	}
+
+	yDataList = make([]models.YData, 0) //y轴的数据列表
+
+	for _, barChartInfoDate := range barChartInfoDateList {
+		var maxDate time.Time
+
+		findDataList := make([]float64, 0)  // 当前日期的数据值
+		noDataIdList := make([]int, 0)      // 没有数据的指标id
+		noDataIdMap := make(map[int]int, 0) // 没有数据的指标map
+		for _, edbInfoId := range edbIdList {
+			findDate := barChartInfoDate.Date     //需要的日期值
+			dataList := edbDataListMap[edbInfoId] //指标的所有数据值
+			if len(dataList) <= 0 {
+				// 没有数据的指标id
+				findDataList = append(findDataList, 0)
+				noDataIdList = append(noDataIdList, edbInfoId)
+				noDataIdMap[edbInfoId] = edbInfoId
+				continue
+			}
+			switch barChartInfoDate.Type {
+			case 1: //最新值
+				dataList := edbDataListMap[edbInfoId]
+				findDate = dataList[len(dataList)-1].DataTime
+			case 2: //近期几天
+				findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[len(dataList)-1].DataTime, time.Local)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				findDateTime = findDateTime.AddDate(0, 0, -barChartInfoDate.Value)
+
+				lenData := len(dataList) - 1
+				for i := lenData; i >= 0; i-- {
+					currDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[i].DataTime, time.Local)
+					if tmpErr != nil {
+						err = tmpErr
+						return
+					}
+					if currDateTime.Equal(findDateTime) || currDateTime.Before(findDateTime) {
+						findDate = dataList[i].DataTime
+						break
+					}
+				}
+			case 3: // 固定日期
+				//最早的日期
+				minDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, dataList[0].DataTime, time.Local)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				//寻找固定日期的数据
+				findDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, barChartInfoDate.Date, time.Local)
+				if tmpErr != nil {
+					err = tmpErr
+					return
+				}
+				for tmpDateTime := findDateTime; tmpDateTime.After(minDateTime) || tmpDateTime.Equal(minDateTime); tmpDateTime = tmpDateTime.AddDate(0, 0, -1) {
+					tmpDate := tmpDateTime.Format(utils.FormatDate)
+					if _, ok := edbDataMap[edbInfoId][tmpDate]; ok { //如果能找到数据,那么就返回
+						findDate = tmpDate
+						break
+					}
+				}
+			default:
+				err = errors.New(fmt.Sprint("日期类型异常,Type:", barChartInfoDate.Type))
+				return
+			}
+			findDateTime, _ := time.ParseInLocation(utils.FormatDate, findDate, time.Local)
+			if maxDate.IsZero() {
+				maxDate = findDateTime
+			} else {
+				if findDateTime.After(maxDate) {
+					maxDate = findDateTime
+				}
+			}
+			if tmpValue, ok := edbDataMap[edbInfoId][findDate]; ok {
+				findDataList = append(findDataList, tmpValue)
+			} else {
+				findDataList = append(findDataList, 0)
+				noDataIdList = append(noDataIdList, edbInfoId)
+				noDataIdMap[edbInfoId] = edbInfoId
+			}
+		}
+		yName := barChartInfoDate.Name
+		yNameEn := barChartInfoDate.Name
+		if yName == `` {
+			if barChartInfoDate.Type == 2 {
+				yName = strconv.Itoa(barChartInfoDate.Value) + "天前"
+				if barChartInfoDate.Value == 1 {
+					yNameEn = strconv.Itoa(barChartInfoDate.Value) + "day ago"
+				} else {
+					yNameEn = strconv.Itoa(barChartInfoDate.Value) + " days ago"
+				}
+			} else {
+				yName = maxDate.Format(utils.FormatDate)
+				yNameEn = maxDate.Format(utils.FormatDate)
+			}
+		}
+		yDate := "0000-00-00"
+		if !maxDate.IsZero() {
+			yDate = maxDate.Format(utils.FormatDate)
+		}
+
+		// 数据处理,将没有数据的下标,赋值平均值
+		{
+			hasDataIndexList := make([]int, 0)
+			for dataK, edbInfoId := range edbIdList {
+				if _, ok := noDataIdMap[edbInfoId]; !ok { // 如果是没有数据的指标id
+					hasDataIndexList = append(hasDataIndexList, dataK)
+				}
+			}
+			lenHasDataIndex := len(hasDataIndexList)
+			if lenHasDataIndex > 0 {
+				for lenHasDataI := 1; lenHasDataI < lenHasDataIndex; lenHasDataI++ {
+					perK := hasDataIndexList[lenHasDataI-1] //上一个有数据的指标下标
+					currK := hasDataIndexList[lenHasDataI]  //当前有数据的指标下标
+					preVal := findDataList[perK]            //上一个有数据的坐标的值
+					currVal := findDataList[currK]          //当前有数据的指标的值
+
+					// 环差值
+					hcValDeci := decimal.NewFromFloat(currVal).Sub(decimal.NewFromFloat(preVal)).Div(decimal.NewFromInt(int64(currK - perK)))
+					var tmpI int64
+					// 将两个中间的数据做平均值补全
+					for hcI := perK + 1; hcI < currK; hcI++ {
+						tmpI++
+						findDataList[hcI], _ = decimal.NewFromFloat(preVal).Add(hcValDeci.Mul(decimal.NewFromInt(tmpI))).RoundCeil(4).Float64()
+					}
+				}
+			}
+		}
+
+		yDataList = append(yDataList, models.YData{
+			Date:          yDate,
+			Value:         findDataList,
+			NoDataEdbList: noDataIdList,
+			Color:         barChartInfoDate.Color,
+			Name:          yName,
+			NameEn:        yNameEn,
+		})
+	}
+
+	return
+}
+
+// FutureGoodChartInfoRefresh
+// @author Roc
+// @datetime 2023-2-2 18:44:46
+// @description 商品价格曲线图表刷新
+func FutureGoodChartInfoRefresh(chartInfoId int) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errMsg, 3)
+			fmt.Println("ChartInfoRefresh Err:" + errMsg)
+		}
+	}()
+
+	edbInfoMapping, err := models.GetEtaEdbChartEdbMapping(chartInfoId)
+	if err != nil {
+		errMsg = "获取需要刷新的ETA指标失败:Err:" + err.Error()
+		return
+	}
+	// 获取期货指标
+	futureGoodEdbInfoMapping, err := models.GetFutureGoodEdbChartEdbMapping(chartInfoId)
+	if err != nil {
+		errMsg = "获取需要刷新的商品期货指标失败:Err:" + err.Error()
+		return
+	}
+
+	// 获取期货指标以及期货数据
+	futureGoodEdbInfoList, err := efuture_good.GetFutureGoodEdbInfoListByParentId(futureGoodEdbInfoMapping.EdbInfoId)
+	if err != nil {
+		return
+	}
+
+	// 批量刷新ETA指标
+	err, _ = data.EdbInfoRefreshAllFromBase([]int{edbInfoMapping.EdbInfoId}, false)
+	if err != nil {
+		return
+	}
+
+	// 批量刷新期货指标
+	err = FutureGoodEdbInfoRefreshAllFromBase(futureGoodEdbInfoList, false)
+	if err != nil {
+		return
+	}
+
+	return
+}

+ 57 - 0
services/data/future_good/future_edb_info.go

@@ -0,0 +1,57 @@
+package future_good
+
+import (
+	"fmt"
+	"hongze/hongze_chart_lib/models/data_manage/future_good"
+	"hongze/hongze_chart_lib/services/alarm_msg"
+	"hongze/hongze_chart_lib/utils"
+	"time"
+)
+
+// FutureGoodEdbInfoRefreshAllFromBase 批量刷新商品期货指标
+// @author Roc
+// @datetime 2022-09-16 11:04:44
+// @description 将原有的单个指标刷新,调整为批量多个指标刷新
+func FutureGoodEdbInfoRefreshAllFromBase(futureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, refreshAll bool) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			fmt.Println("FutureGoodEdbInfoRefreshAllFromBase Err:" + err.Error() + ";errMsg:" + errMsg)
+			go alarm_msg.SendAlarmMsg("FutureGoodEdbInfoRefreshAllFromBase,Err"+err.Error()+";errMsg:"+errMsg, 3)
+		}
+	}()
+	var startDate string
+	for _, bv := range futureGoodEdbInfoList {
+		if bv.StartDate == "0000-00-00" {
+			continue
+		}
+		//开始时间
+		startDate = ``
+		if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+			sTime, err := time.Parse(utils.FormatDate, bv.StartDate)
+			if err != nil {
+				return err
+			}
+			startDate = sTime.Format(utils.FormatDate)
+		} else {
+			sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
+			if err != nil {
+				return err
+			}
+			limitDay := utils.DATA_REFRESH
+			startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+		}
+		result, err := RefreshEdbData(bv.FutureGoodEdbInfoId, bv.FutureGoodEdbCode, startDate)
+		if err != nil {
+			fmt.Println(bv.FutureGoodEdbInfoId, "FutureGoodRefreshBaseEdbData err", time.Now())
+			errMsg = "FutureGoodRefreshBaseEdbData Err:" + err.Error()
+			return err
+		}
+		if result.Ret != 200 {
+			fmt.Println(bv.FutureGoodEdbInfoId, "FutureGoodRefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			errMsg = fmt.Sprint(bv.FutureGoodEdbInfoId, "FutureGoodRefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			return fmt.Errorf("刷新失败, err:%s", errMsg)
+		}
+	}
+	return err
+}

+ 6 - 0
utils/constants.go

@@ -123,3 +123,9 @@ var (
 	APP_EDB_LIB_NAME_EN = "hongze_edb_lib"
 	EDB_LIB_Md5_KEY     = "GuRaB6dY1bXOJcwG"
 )
+
+// 图表类型
+const (
+	CHART_SOURCE_DEFAULT     = 1
+	CHART_SOURCE_FUTURE_GOOD = 2
+)

+ 1 - 1
utils/logs.go

@@ -16,7 +16,7 @@ func init() {
 	FileLog.EnableFuncCallDepth(true)
 
 	FileLogData = logs.NewLogger(1000000)
-	FileLogData.SetLogger(logs.AdapterFile, `{"filename":"./rdlucklog/hongze_admin_data.log"}`)
+	FileLogData.SetLogger(logs.AdapterFile, `{"filename":"./rdlucklog/hongze_chart_lib_data.log"}`)
 
 	//binlog日志
 	binLogDir := `./binlog`