浏览代码

feat:添加商品期货刷新

Roc 1 年之前
父节点
当前提交
f2d37232d4

+ 80 - 0
controllers/future_good/future_good_edb_info.go

@@ -2,11 +2,14 @@ package future_good
 
 import (
 	"encoding/json"
+	"fmt"
 	"hongze/hongze_edb_lib/controllers"
+	"hongze/hongze_edb_lib/logic"
 	"hongze/hongze_edb_lib/models"
 	"hongze/hongze_edb_lib/models/future_good"
 	"hongze/hongze_edb_lib/services"
 	"hongze/hongze_edb_lib/utils"
+	"strings"
 	"time"
 )
 
@@ -192,6 +195,83 @@ func (this *FutureGoodEdbInfoController) Refresh() {
 	br.Msg = "获取成功"
 }
 
+// RefreshRelation
+// @Title 刷新商品期货指标相关的接口
+// @Description 刷新商品期货指标相关的接口
+// @Success 200 {object} models.RefreshEdbInfoReq
+// @router /relation/refresh [post]
+func (this *FutureGoodEdbInfoController) RefreshRelation() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req future_good.RefreshFutureEdbEdbInfoReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.FutureGoodEdbInfoId <= 0 {
+		br.Msg = "请输入指标ID!"
+		br.ErrMsg = "请输入指标ID"
+		return
+	}
+	cacheKey = utils.CACHE_EDB_DATA_REFRESH + "_futuregood_relation_" + req.FutureGoodEdbCode
+
+	if utils.Rc.IsExist(cacheKey) {
+		br.Ret = 501
+		br.Success = true
+		br.Msg = "系统处理中,请稍后重试"
+		return
+	}
+
+	utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+	}()
+
+	//获取指标信息
+	futureGoodEdbInfo, err := future_good.GetFutureGoodEdbInfo(req.FutureGoodEdbInfoId)
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			br.Msg = "系统内找不到该指标"
+		} else {
+			br.Msg = "刷新失败"
+			br.ErrMsg = "添加失败,ERR:" + err.Error()
+		}
+		return
+	}
+
+	// 获取相关图表
+	list, err := models.GetGroupChartEdbMappingListByEdbInfoId(futureGoodEdbInfo.FutureGoodEdbInfoId, 2)
+	if err != nil {
+		br.Msg = "查找相关图表id失败"
+		br.ErrMsg = "添加失败,ERR:" + err.Error()
+		return
+	}
+
+	errMsgList := make([]string, 0)
+	for _, v := range list {
+		err, errMsg := logic.RefreshByChartId(v.ChartInfoId)
+		if err != nil {
+			errMsgList = append(errMsgList, fmt.Sprint(v.ChartInfoId, "更新失败,"+errMsg))
+		}
+	}
+
+	if len(errMsgList) > 0 {
+		br.Msg = "部分刷新失败"
+		br.ErrMsg = "部分刷新失败,Err:" + strings.Join(errMsgList, ";")
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "刷新成功"
+}
+
 //func init() {
 //
 //	list, err := future_good.GetFutureGoodEdbInfoList(" AND start_date = '0000-00-00' ", []interface{}{})

+ 151 - 31
logic/profit_chart_info.go

@@ -1,6 +1,7 @@
 package logic
 
 import (
+	"encoding/json"
 	"errors"
 	"fmt"
 	"github.com/shopspring/decimal"
@@ -97,9 +98,97 @@ type BarChartInfoEdbItemReq struct {
 	Source    int    `description:"1:ETA图库;2:商品价格"`
 }
 
-// GetProfitChartEdbData 获取利润图表的指标数据
-func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, chartInfoDateList []ChartInfoDateReq, formulaStr string, edbInfoFromTagList []models.EdbInfoFromTag) (barConfigEdbInfoIdList []BarChartInfoEdbItemReq, xEdbIdValue []int, xDataList []XData, yDataList []YData, err error) {
+// ChartInfoReq 图表预览请求数据
+type ChartInfoReq struct {
+	FutureGoodEdbInfoIdList []models.EdbInfoFromTag `description:"指标信息"`
+	CalculateFormula        string                  `description:"计算公式"`
+	BaseEdbInfoId           int                     `description:"基础的指标id"`
+	DateList                []ChartInfoDateReq      `description:"日期配置"`
+	ProfitNameEn            string                  `description:"利润英文名称"`
+}
+
+// RefreshByChartId 根据图表id刷新图表
+func RefreshByChartId(chartInfoId int) (err error, errMsg string) {
+	// 查找图表
+	chartInfo, err := models.GetChartInfoById(chartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			err = nil
+		}
+		return
+	}
+	if chartInfo.Source != utils.CHART_SOURCE_FUTURE_GOOD_PROFIT {
+		return
+	}
+	var extraConf ChartInfoReq
+	err = json.Unmarshal([]byte(chartInfo.ExtraConfig), &extraConf)
+	if err != nil {
+		errMsg = "商品利润曲线图配置异常"
+		return
+	}
+
+	// 查找商品利润图表的扩展信息
+	chartInfoFutureGoodProfit := new(future_good.ChartInfoFutureGoodProfit)
+	if err = chartInfoFutureGoodProfit.GetItemById(chartInfoId); err != nil {
+		errMsg = "获取失败"
+		if err.Error() == utils.ErrNoRow() {
+			err = nil
+		}
+		return
+	}
+
+	baseEdbInfo, err := models.GetEdbInfoById(extraConf.BaseEdbInfoId)
+	if err != nil {
+		errMsg = "获取失败"
+		return
+	}
+	// 商品数据库指标
+	futureGoodEdbInfoMap := make(map[int]*future_good.FutureGoodEdbInfo)
+	zlFutureGoodEdbInfoList := make([]*future_good.FutureGoodEdbInfo, 0)
+	for _, v := range extraConf.FutureGoodEdbInfoIdList {
+		if _, ok := futureGoodEdbInfoMap[v.EdbInfoId]; ok {
+			continue
+		}
 
+		zlFutureGoodEdbInfo, tmpErr := future_good.GetFutureGoodEdbInfo(v.EdbInfoId)
+		if tmpErr != nil {
+			err = tmpErr
+			errMsg = "获取失败"
+			return
+		}
+
+		futureGoodEdbInfoMap[v.EdbInfoId] = zlFutureGoodEdbInfo
+		zlFutureGoodEdbInfoList = append(zlFutureGoodEdbInfoList, zlFutureGoodEdbInfo)
+	}
+
+	xDataList, yDataList, err := GetProfitChartEdbData(baseEdbInfo, zlFutureGoodEdbInfoList, extraConf.DateList, extraConf.CalculateFormula, extraConf.FutureGoodEdbInfoIdList)
+
+	xDataListByte, err := json.Marshal(xDataList)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("X轴数据转换失败,ERR:" + err.Error())
+		return
+	}
+	yDataListByte, err := json.Marshal(yDataList)
+	if err != nil {
+		errMsg = "保存失败"
+		err = errors.New("Y轴数据转换失败,ERR:" + err.Error())
+		return
+	}
+
+	extraUpdateCol := make([]string, 0)
+	chartInfoFutureGoodProfit.XValue = string(xDataListByte)
+	chartInfoFutureGoodProfit.YValue = string(yDataListByte)
+	chartInfoFutureGoodProfit.ProfitName = zlFutureGoodEdbInfoList[0].FutureGoodEdbName + "盘面利润"
+	chartInfoFutureGoodProfit.ModifyTime = time.Now()
+	extraUpdateCol = []string{"XValue", "YValue", "ProfitName", "ModifyTime"}
+	err = chartInfoFutureGoodProfit.Update(extraUpdateCol)
+
+	return
+}
+
+// GetProfitChartEdbData 获取利润图表的指标数据
+func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, chartInfoDateList []ChartInfoDateReq, formulaStr string, edbInfoFromTagList []models.EdbInfoFromTag) (xDataList []XData, yDataList []YData, err error) {
 	if baseEdbInfo == nil {
 		err = errors.New("ETA指标未选取")
 		return
@@ -167,8 +256,10 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList
 	monthNum := (latestDateTime.Year()-earliestDateTime.Year())*12 + int(latestDateTime.Month()-earliestDateTime.Month())
 
 	// 存储主力合约下的所有月份合约
-	futureGoodEdbInfoMap := make(map[int]map[int]*future_good.FutureGoodEdbInfo)
+	futureGoodEdbInfoDateMap := make(map[int]map[string]*future_good.FutureGoodEdbInfo)
 	futureGoodDataListMap := make(map[int][]*models.EdbDataList, 0)
+	// 特殊的商品期货合约(只有M+N的合约,没有固定日期的合约)
+	specialFutureGoodEdbInfoMap := make(map[int]map[int]*future_good.FutureGoodEdbInfo, 0)
 
 	isAllChina := true // 是否都是国内的期货合约
 	for _, v := range zlFutureGoodEdbInfoList {
@@ -178,7 +269,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList
 		}
 	}
 
-	nMap := make(map[int]int)
+	nMap := make(map[string]string)
 	var maxN int // 最大N值
 	for _, v := range zlFutureGoodEdbInfoList {
 		// 如果不是有效的商品期货指标,那么就过滤掉,不做数据查询处理,避免没必要的请求
@@ -200,12 +291,14 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList
 		if maxN < tmpMaxN {
 			maxN = tmpMaxN
 		}
-		futureGoodEdbInfoMap[v.FutureGoodEdbInfoId] = childFutureGoodEdbInfoMap
+		futureGoodEdbInfoDateMap[v.FutureGoodEdbInfoId] = childFutureGoodEdbInfoMap
 
+		if v.FutureGoodEdbType == 2 {
+			specialFutureGoodEdbInfoMap[v.FutureGoodEdbInfoId] = make(map[int]*future_good.FutureGoodEdbInfo)
+		}
 		// 获取数据
-		for n, childFutureGoodEdbInfo := range childFutureGoodEdbInfoMap {
-			nMap[n] = n
-
+		for date, childFutureGoodEdbInfo := range childFutureGoodEdbInfoMap {
+			nMap[date] = date
 			dataList := make([]*models.EdbDataList, 0)
 
 			tmpDataList, tmpErr := future_good.GetFutureGoodEdbDataListByDate(childFutureGoodEdbInfo.FutureGoodEdbInfoId, "", "")
@@ -222,19 +315,26 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList
 				})
 			}
 			futureGoodDataListMap[childFutureGoodEdbInfo.FutureGoodEdbInfoId] = dataList
+
+			if childFutureGoodEdbInfo.FutureGoodEdbType == 2 {
+				specialFutureGoodEdbInfoMap[v.FutureGoodEdbInfoId][childFutureGoodEdbInfo.Month] = childFutureGoodEdbInfo
+			}
 		}
 	}
 
 	// 找出所有的N值,并进行正序排列
-	nList := make([]int, 0)
+	dateList := make([]string, 0)
 	for _, n := range nMap {
-		nList = append(nList, n)
+		dateList = append(dateList, n)
 	}
-	sort.Slice(nList, func(i, j int) bool {
-		return nList[i] < nList[j]
+	sort.Slice(dateList, func(i, j int) bool {
+		return dateList[i] < dateList[j]
 	})
 
-	_, yDataList, err = ProfitChartChartData(baseDataList, futureGoodEdbInfoMap, futureGoodDataListMap, chartInfoDateList, latestDate, formulaStr, tagEdbIdMap, earliestDateTime, nList)
+	_, yDataList, err = ProfitChartChartData(baseDataList, futureGoodEdbInfoDateMap, futureGoodDataListMap, chartInfoDateList, latestDate, specialFutureGoodEdbInfoMap, formulaStr, tagEdbIdMap, dateList)
+	if err != nil {
+		return
+	}
 
 	tmpXDataList, newYDataList, err := handleProfitResultData(baseEdbInfo, yDataList, earliestDateTime)
 	if err != nil {
@@ -253,7 +353,7 @@ func GetProfitChartEdbData(baseEdbInfo *models.EdbInfo, zlFutureGoodEdbInfoList
 }
 
 // ProfitChartChartData 获取数据
-func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoMap map[int]map[int]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*models.EdbDataList, chartInfoDateList []ChartInfoDateReq, latestDate string, formulaStr string, tagEdbIdMap map[string]int, earliestDateTime time.Time, nList []int) (edbIdList []int, yDataList []YData, err error) {
+func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoMap map[int]map[string]*future_good.FutureGoodEdbInfo, futureGoodEdbDataListMap map[int][]*models.EdbDataList, chartInfoDateList []ChartInfoDateReq, latestDate string, specialFutureGoodEdbInfoMap map[int]map[int]*future_good.FutureGoodEdbInfo, formulaStr string, tagEdbIdMap map[string]int, dateList []string) (edbIdList []int, yDataList []YData, err error) {
 	// 指标数据数组(10086:{"2022-12-02":100.01,"2022-12-01":102.3})
 	//earliestDateTime time.Time
 	// ETA指标数据
@@ -327,18 +427,35 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 		mList := make([]int, 0) // 间隔月份
 
 		// 最小开始的n值
-		minN := (findDateTime.Year()-earliestDateTime.Year())*12 + int(findDateTime.Month()-earliestDateTime.Month())
-		for _, n := range nList {
+		//minN := (findDateTime.Year()-earliestDateTime.Year())*12 + int(findDateTime.Month()-earliestDateTime.Month())
+		for _, date := range dateList {
+			currDate, _ := time.ParseInLocation(utils.FormatYearMonthDate, date, time.Local)
 			// 如果当前的n值小于最小开始的n值,那么就不处理
-			if n < minN {
+			//if n < minN {
+			//	continue
+			//}
+			//findDateTime
+
+			tmpN := (currDate.Year()-findDateTime.Year())*12 + int(currDate.Month()-findDateTime.Month())
+			if tmpN <= 0 {
 				continue
 			}
+
 			zlAndChildEdbId := make(map[int]int)
 			childFutureGoodEdbInfoIdList := make([]int, 0)
-			for futureGoodEdbInfoId, futureGoodEdbInfo := range futureGoodEdbInfoMap {
-				if childFutureGoodEdbInfo, ok := futureGoodEdbInfo[n]; ok {
-					childFutureGoodEdbInfoIdList = append(childFutureGoodEdbInfoIdList, childFutureGoodEdbInfo.FutureGoodEdbInfoId)
-					zlAndChildEdbId[futureGoodEdbInfoId] = childFutureGoodEdbInfo.FutureGoodEdbInfoId
+			for zlFutureGoodEdbInfoId, futureGoodEdbInfoList := range futureGoodEdbInfoMap {
+				// 判断是否特殊合约
+				if childFutureGoodEdbInfoIdMap, ok := specialFutureGoodEdbInfoMap[zlFutureGoodEdbInfoId]; ok {
+					if childFutureGoodEdbInfo, ok2 := childFutureGoodEdbInfoIdMap[tmpN]; ok2 {
+						childFutureGoodEdbInfoIdList = append(childFutureGoodEdbInfoIdList, childFutureGoodEdbInfo.FutureGoodEdbInfoId)
+						zlAndChildEdbId[zlFutureGoodEdbInfoId] = childFutureGoodEdbInfo.FutureGoodEdbInfoId
+					}
+
+				} else {
+					if childFutureGoodEdbInfo, ok2 := futureGoodEdbInfoList[date]; ok2 {
+						childFutureGoodEdbInfoIdList = append(childFutureGoodEdbInfoIdList, childFutureGoodEdbInfo.FutureGoodEdbInfoId)
+						zlAndChildEdbId[zlFutureGoodEdbInfoId] = childFutureGoodEdbInfo.FutureGoodEdbInfoId
+					}
 				}
 			}
 
@@ -401,8 +518,8 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 			}
 			//yDataMap[n] = calVal
 			//xEdbInfoIdList = append(xEdbInfoIdList, n)
-			yDataMap[n+minN] = calVal
-			xEdbInfoIdList = append(xEdbInfoIdList, n+minN)
+			yDataMap[tmpN] = calVal
+			xEdbInfoIdList = append(xEdbInfoIdList, tmpN)
 			findDataList = append(findDataList, calVal)
 		}
 		yName := barChartInfoDate.Name
@@ -443,10 +560,12 @@ func ProfitChartChartData(baseDataList []*models.EdbDataList, futureGoodEdbInfoM
 }
 
 // getFutureGoodEdbInfoList 获取适用的指标列表
-func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbInfo *future_good.FutureGoodEdbInfo, tmpFutureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, isAllChina bool, monthNum int) (futureGoodEdbInfoMap map[int]*future_good.FutureGoodEdbInfo, newMaxN int, err error) {
+func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbInfo *future_good.FutureGoodEdbInfo, tmpFutureGoodEdbInfoList []*future_good.FutureGoodEdbInfo, isAllChina bool, monthNum int) (futureGoodEdbInfoDateMap map[string]*future_good.FutureGoodEdbInfo, newMaxN int, err error) {
 	maxM := 32 //最大32期合约
 	futureGoodEdbInfoList := make([]*future_good.FutureGoodEdbInfo, 0)
-	futureGoodEdbInfoMap = make(map[int]*future_good.FutureGoodEdbInfo)
+	futureGoodEdbInfoDateMap = make(map[string]*future_good.FutureGoodEdbInfo)
+
+	earliestDateTime = time.Date(earliestDateTime.Year(), earliestDateTime.Month(), 1, 0, 0, 0, 0, time.Local)
 	if zlFutureGoodEdbInfo.RegionType == "国内" {
 		startMonth := int(earliestDateTime.Month())
 		if startMonth == 1 {
@@ -467,7 +586,7 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 
 		for i := 1; i < maxM; i++ {
 			k := i % lenFutureGoodEdbInfoList
-			futureGoodEdbInfoMap[i] = futureGoodEdbInfoList[k]
+			futureGoodEdbInfoDateMap[earliestDateTime.AddDate(0, i, 0).Format(utils.FormatYearMonthDate)] = futureGoodEdbInfoList[k]
 			if i > newMaxN {
 				newMaxN = i
 			}
@@ -480,7 +599,7 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 		//海外的连续日期,目前
 		if v.FutureGoodEdbType == 2 {
 			if v.Month <= maxM {
-				futureGoodEdbInfoMap[v.Month] = v
+				futureGoodEdbInfoDateMap[earliestDateTime.AddDate(0, v.Month, 0).Format(utils.FormatYearMonthDate)] = v
 				if v.Month > newMaxN {
 					newMaxN = v.Month
 				}
@@ -501,7 +620,8 @@ func getProfitFutureGoodEdbInfoList(earliestDateTime time.Time, zlFutureGoodEdbI
 		// 如果(当前年-最新日期的年份) * 12个月 + (当前月-最新日期的月份) 小于总月份
 		tmpN := subYear*12 + subMonth
 		if tmpN < maxM {
-			futureGoodEdbInfoMap[tmpN] = v
+			earliestDateTime = time.Date(v.Year, time.Month(v.Month), 0, 0, 0, 0, 0, time.Local)
+			futureGoodEdbInfoDateMap[earliestDateTime.Format(utils.FormatYearMonthDate)] = v
 			if tmpN > newMaxN {
 				newMaxN = tmpN
 			}
@@ -607,6 +727,8 @@ func handleProfitResultData(baseEdbInfo *models.EdbInfo, yDataList []YData, earl
 			newYDataList[yIndex].Value = yData.Value[0 : maxI+1]
 		}
 
+		currDate, _ := time.ParseInLocation(utils.FormatDate, yData.Date, time.Local)
+
 		nameList := make([]string, 0)
 		enNameList := make([]string, 0)
 		for _, n := range newYDataList[yIndex].XEdbInfoIdList {
@@ -621,9 +743,7 @@ func handleProfitResultData(baseEdbInfo *models.EdbInfo, yDataList []YData, earl
 			} else {
 				var date string
 
-				currDate, _ := time.ParseInLocation(utils.FormatDate, yData.Date, time.Local)
-				subN := (currDate.Year()-earliestDateTime.Year())*12 + int(currDate.Month()-earliestDateTime.Month())
-				currDateTime := earliestDateTime.AddDate(0, n-subN-1, 0)
+				currDateTime := currDate.AddDate(0, n-1, 0)
 				month := int(currDateTime.Month())
 				date = fmt.Sprintf("%d%d", currDateTime.Year(), month)
 				if month < 10 {

+ 41 - 0
models/chart.go

@@ -3,7 +3,9 @@ package models
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/beego/beego/v2/client/orm"
 	"hongze/hongze_edb_lib/utils"
+	"time"
 )
 
 type EdbInfoReq struct {
@@ -37,3 +39,42 @@ func GetChartInfoDataKey(chartInfoId int) string {
 	key := fmt.Sprint(utils.CACHE_CHART_INFO_DATA, chartInfoId)
 	return key
 }
+
+type ChartInfo struct {
+	ChartInfoId     int    `orm:"column(chart_info_id);pk"`
+	ChartName       string `description:"来源名称"`
+	ChartNameEn     string `description:"英文图表名称"`
+	ChartClassifyId int    `description:"图表分类id"`
+	SysUserId       int
+	SysUserRealName string
+	UniqueCode      string `description:"图表唯一编码"`
+	CreateTime      time.Time
+	ModifyTime      time.Time
+	DateType        int    `description:"日期类型:1:00年至今,2:10年至今,3:15年至今,4:年初至今,5:自定义时间"`
+	StartDate       string `description:"自定义开始日期"`
+	EndDate         string `description:"自定义结束日期"`
+	IsSetName       int    `description:"设置名称"`
+	EdbInfoIds      string `description:"指标id"`
+	ChartType       int    `description:"生成样式:1:曲线图,2:季节性图,3:面积图,4:柱状图,5:散点图,6:组合图,7:柱方图,8:商品价格曲线图,9:相关性图"`
+	Calendar        string `description:"公历/农历"`
+	SeasonStartDate string `description:"季节性图开始日期"`
+	SeasonEndDate   string `description:"季节性图开始日期"`
+	ChartImage      string `description:"图表图片"`
+	Sort            int    `description:"排序字段,数字越小越排前面"`
+	LeftMin         string `description:"图表左侧最小值"`
+	LeftMax         string `description:"图表左侧最大值"`
+	RightMin        string `description:"图表右侧最小值"`
+	RightMax        string `description:"图表右侧最大值"`
+	Disabled        int    `description:"是否禁用,0:启用,1:禁用,默认:0"`
+	BarConfig       string `description:"柱方图的配置,json数据"`
+	Source          int    `description:"1:ETA图库;2:商品价格曲线"`
+	ExtraConfig     string `description:"图表额外配置,json数据"`
+}
+
+// GetChartInfoById 通过id获取图表信息
+func GetChartInfoById(chartInfoId int) (item *ChartInfo, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM chart_info WHERE chart_info_id=? `
+	err = o.Raw(sql, chartInfoId).QueryRow(&item)
+	return
+}

+ 11 - 0
models/chart_edb_mapping.go

@@ -22,6 +22,7 @@ type ChartEdbMapping struct {
 	ChartStyle        string    `description:"图表类型"`
 	ChartColor        string    `description:"颜色"`
 	ChartWidth        float64   `description:"线条大小"`
+	Source            int       `description:"1:ETA图库;2:商品价格曲线"`
 }
 
 // GetChartEdbMappingListByEdbInfoId 根据指标id获取关联图表列表
@@ -34,3 +35,13 @@ func GetChartEdbMappingListByEdbInfoId(edbInfoId int) (list []*ChartEdbMapping,
 	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
 	return
 }
+
+// GetGroupChartEdbMappingListByEdbInfoId 根据指标id和来源分组获取关联图表列表
+func GetGroupChartEdbMappingListByEdbInfoId(edbInfoId, source int) (list []*ChartEdbMapping, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT *
+             FROM chart_edb_mapping AS a
+			 WHERE edb_info_id=? AND source = ?  GROUP BY chart_info_id `
+	_, err = o.Raw(sql, edbInfoId, source).QueryRows(&list)
+	return
+}

+ 3 - 2
models/db.go

@@ -66,8 +66,9 @@ func init() {
 func initFutureGood() {
 	//注册对象
 	orm.RegisterModel(
-		new(future_good.FutureGoodEdbInfo), //期货指标表
-		new(future_good.FutureGoodEdbData), //期货指标数据表
+		new(future_good.FutureGoodEdbInfo),         //期货指标表
+		new(future_good.FutureGoodEdbData),         //期货指标数据表
+		new(future_good.ChartInfoFutureGoodProfit), //商品期货利润图表相关的信息
 	)
 }
 

+ 1 - 1
models/edb_data_base.go

@@ -184,7 +184,7 @@ func GetEdbDataList(source, endInfoId int, startDate, endDate string) (list []*E
 
 	sql += ` ORDER BY data_time ASC `
 	sql = fmt.Sprintf(sql, tableName)
-	o := orm.NewOrmUsingDB("data")
+	o := orm.NewOrm()
 	_, err = o.Raw(sql, endInfoId, pars).QueryRows(&list)
 	return
 }

+ 88 - 0
models/future_good/chart_info_future_good_profit.go

@@ -0,0 +1,88 @@
+package future_good
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+	"time"
+)
+
+// ChartInfoFutureGoodProfit 商品利润图表-扩展信息
+type ChartInfoFutureGoodProfit struct {
+	ChartInfoId  int       `orm:"column(chart_info_id);pk" description:"商品利润图表ID(chart_info表source=5的)"`
+	ProfitName   string    `description:"利润名称"`
+	ProfitNameEn string    `description:"利润英文名称"`
+	XValue       string    `description:"X轴数据值"`
+	YValue       string    `description:"Y轴数据值"`
+	CreateTime   time.Time `description:"创建时间"`
+	ModifyTime   time.Time `description:"更新时间"`
+}
+
+type CorrelationInfo struct {
+	LeadValue       int    `description:"领先值"`
+	LeadUnit        string `description:"领先单位"`
+	CalculateValue  int    `description:"计算窗口"`
+	CalculateUnit   string `description:"计算频度"`
+	StartDate       string `description:"开始日期"`
+	EndDate         string `description:"结束日期"`
+	EdbInfoIdFirst  int    `description:"A指标ID"`
+	EdbInfoIdSecond int    `description:"B指标ID"`
+	PeriodData      string `description:"X轴-期数数据"`
+	CorrelationData string `description:"Y轴-商品利润系数"`
+}
+
+func (m *ChartInfoFutureGoodProfit) TableName() string {
+	return "chart_info_future_good_profit"
+}
+
+func (m *ChartInfoFutureGoodProfit) Create() (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(m)
+	if err != nil {
+		return
+	}
+	//m.CorrelationChartInfoId = int(id)
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(m, cols...)
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) Delete() (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`DELETE FROM %s WHERE chart_info_id = ? LIMIT 1`, m.TableName())
+	_, err = o.Raw(sql, m.ChartInfoId).Exec()
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) GetItemById(id int) (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE chart_info_id = ? LIMIT 1`, m.TableName())
+	err = o.Raw(sql, id).QueryRow(&m)
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) GetItemByCondition(condition string, pars []interface{}) (err error) {
+	o := orm.NewOrm()
+	sql := fmt.Sprintf(`SELECT * FROM %s WHERE 1=1 %s LIMIT 1`, m.TableName(), condition)
+	err = o.Raw(sql, pars).QueryRow(&m)
+	return
+}
+
+func (m *ChartInfoFutureGoodProfit) GetItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*ChartInfoFutureGoodProfit, err error) {
+	o := orm.NewOrm()
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := ``
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM %s WHERE 1=1 %s %s`, fields, m.TableName(), condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 1 - 1
models/future_good/future_good_edb_data.go

@@ -285,7 +285,7 @@ func GetFutureGoodEdbDataListByDate(futureGoodEdbInfoId int, startDate, endDate
 	}
 
 	sql += ` ORDER BY data_time ASC `
-	o := orm.NewOrmUsingDB("data")
+	o := orm.NewOrm()
 	_, err = o.Raw(sql, futureGoodEdbInfoId, pars).QueryRows(&list)
 	return
 }

+ 10 - 1
models/future_good/future_good_edb_info.go

@@ -30,6 +30,15 @@ type FutureGoodEdbInfo struct {
 	ModifyTime          time.Time
 }
 
+// GetFutureGoodEdbInfo 期货指标
+func GetFutureGoodEdbInfo(edbInfoId int) (item *FutureGoodEdbInfo, err error) {
+	o := orm.NewOrm()
+	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
+}
+
 // GetFutureGoodEdbInfoByCode 根据指标code获取指标信息
 func GetFutureGoodEdbInfoByCode(edbCode string) (item *FutureGoodEdbInfo, err error) {
 	o := orm.NewOrm()
@@ -71,7 +80,7 @@ func AddFutureGoodEdbInfo(item *FutureGoodEdbInfo) (err error) {
 
 // GetChildFutureGoodEdbInfoListByParentId 根据父级ID获取下面所有的指标数据列表
 func GetChildFutureGoodEdbInfoListByParentId(parentId int) (list []*FutureGoodEdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
+	o := orm.NewOrm()
 	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

+ 9 - 0
routers/commentsRouter.go

@@ -25,6 +25,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers/future_good:FutureGoodEdbInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers/future_good:FutureGoodEdbInfoController"],
+        beego.ControllerComments{
+            Method: "RefreshRelation",
+            Router: `/relation/refresh`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:BaiinfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_edb_lib/controllers:BaiinfoController"],
         beego.ControllerComments{
             Method: "Add",

+ 10 - 0
utils/constants.go

@@ -14,6 +14,7 @@ const (
 	FormatDateTime             = "2006-01-02 15:04:05" //完整时间格式
 	FormatDateTimeUnSpace      = "20060102150405"      //完整时间格式
 	FormatShortDateTimeUnSpace = "060102150405"        //省去开头两位年份的时间格式
+	FormatYearMonthDate        = "2006-01"             //日期格式
 	PageSize15                 = 15                    //列表页每页数据量
 	PageSize5                  = 5
 	PageSize10                 = 10
@@ -197,3 +198,12 @@ const (
 	CACHE_CHART_INFO_DATA       = "chart:info:data:"             //图表数据
 	CACHE_STOCK_PLANT_CALCULATE = "CACHE_STOCK_PLANT_CALCULATE_" // 库存装置减产计算
 )
+
+// 图表类型
+const (
+	CHART_SOURCE_DEFAULT             = 1
+	CHART_SOURCE_FUTURE_GOOD         = 2
+	CHART_SOURCE_CORRELATION         = 3 // 相关性图表
+	CHART_SOURCE_ROLLING_CORRELATION = 4 // 滚动相关性图表
+	CHART_SOURCE_FUTURE_GOOD_PROFIT  = 5 // 商品利润曲线
+)