Browse Source

Merge branch '12.22fix'

zwxi 1 year ago
parent
commit
c67b6c7ef7

+ 56 - 24
controllers/commodity_trade_base_index.go

@@ -11,7 +11,7 @@ type TradeCommonController struct {
 	BaseAuthController
 }
 
-type Data []struct {
+type SHData []struct {
 	Title    string
 	ItemList []ShanghaiList
 }
@@ -19,6 +19,38 @@ type ShanghaiList struct {
 	Code string
 	Item []*data_manage.BaseFromTradeShanghaiIndex
 }
+type CffexData []struct {
+	Title    string
+	ItemList []CffexList
+}
+type CffexList struct {
+	Code string
+	Item []*data_manage.BaseFromTradeCffexIndex
+}
+type DLData []struct {
+	Title    string
+	ItemList []DalianList
+}
+type DalianList struct {
+	Code string
+	Item []*data_manage.BaseFromTradeDalianIndex
+}
+type ZZData []struct {
+	Title    string
+	ItemList []ZhengzhouList
+}
+type ZhengzhouList struct {
+	Code string
+	Item []*data_manage.BaseFromTradeZhengzhouIndex
+}
+type IneData []struct {
+	Title    string
+	ItemList []IneList
+}
+type IneList struct {
+	Code string
+	Item []*data_manage.BaseFromTradeIneIndex
+}
 type EicData struct {
 	Country                string
 	Type                   string
@@ -145,7 +177,7 @@ func (this *TradeCommonController) ShfeDataList() {
 		br.ErrMsg = "获取持仓排名失败,Err:" + err.Error()
 		return
 	}
-	var data Data
+	var data SHData
 	var j, k int
 	if len(frequencyList) == 0 {
 		br.Ret = 200
@@ -153,7 +185,7 @@ func (this *TradeCommonController) ShfeDataList() {
 		br.Data = data
 	} else {
 		if classifyName == "" {
-			data = make(Data, 50)
+			data = make(SHData, 50)
 			for i, item := range frequencyList {
 				if item.DealCode == "" {
 					item.DealValue = ""
@@ -202,7 +234,7 @@ func (this *TradeCommonController) ShfeDataList() {
 			br.Msg = "获取成功"
 			br.Data = data
 		} else {
-			data = make(Data, 1)
+			data = make(SHData, 1)
 			for i, item := range frequencyList {
 				if item.DealCode == "" {
 					item.DealValue = ""
@@ -257,21 +289,21 @@ func (this *TradeCommonController) IneDataList() {
 	date := this.GetString("Date")
 	classifyName := this.GetString("ClassifyName")
 	classifyType := this.GetString("ClassifyType")
-	frequencyList, err := data_manage.GetBaseFromTradeIndexByParam("ine", date, classifyName, classifyType)
+	frequencyList, err := data_manage.GetBaseFromTradeIneIndexByParam("ine", date, classifyName, classifyType)
 	if err != nil {
 		br.Msg = "获取持仓排名失败"
 		br.ErrMsg = "获取持仓排名失败,Err:" + err.Error()
 		return
 	}
 
-	var data Data
+	var data IneData
 	var k int
 	if len(frequencyList) == 0 {
 		br.Ret = 200
 		br.Msg = "获取成功"
 		br.Data = data
 	} else {
-		data = make(Data, 1)
+		data = make(IneData, 1)
 		if len(frequencyList) > 20 {
 			for i, item := range frequencyList {
 				if item.DealCode == "" {
@@ -288,7 +320,7 @@ func (this *TradeCommonController) IneDataList() {
 				}
 				data[0].Title = classifyName
 				if data[0].ItemList == nil {
-					list := make([]ShanghaiList, 200)
+					list := make([]IneList, 200)
 					data[0].ItemList = list
 				}
 				if data[0].ItemList[k].Code == item.ClassifyType {
@@ -322,7 +354,7 @@ func (this *TradeCommonController) IneDataList() {
 				}
 				data[0].Title = item.ClassifyName
 				if data[0].ItemList == nil {
-					list := make([]ShanghaiList, 1)
+					list := make([]IneList, 1)
 					data[0].ItemList = list
 				}
 				if data[0].ItemList[0].Code == item.ClassifyType {
@@ -363,20 +395,20 @@ func (this *TradeCommonController) CffexDataList() {
 	date = strings.Replace(date, "-", "", -1)
 	classifyName := this.GetString("ClassifyName")
 	classifyType := this.GetString("ClassifyType")
-	frequencyList, err := data_manage.GetBaseFromTradeIndexByParam("cffex", date, classifyName, classifyType)
+	frequencyList, err := data_manage.GetBaseFromTradeCffexIndexByParam("cffex", date, classifyName, classifyType)
 	if err != nil {
 		br.Msg = "获取持仓排名失败"
 		br.ErrMsg = "获取持仓排名失败,Err:" + err.Error()
 		return
 	}
-	var data Data
+	var data CffexData
 	var k int
 	if len(frequencyList) == 0 {
 		br.Ret = 200
 		br.Msg = "获取成功"
 		br.Data = data
 	} else {
-		data = make(Data, 1)
+		data = make(CffexData, 1)
 		if len(frequencyList) > 20 {
 			for i, item := range frequencyList {
 				if item.DealCode == "" {
@@ -393,7 +425,7 @@ func (this *TradeCommonController) CffexDataList() {
 				}
 				data[0].Title = classifyName
 				if data[0].ItemList == nil {
-					list := make([]ShanghaiList, 200)
+					list := make([]CffexList, 200)
 					data[0].ItemList = list
 				}
 				if data[0].ItemList[k].Code == item.ClassifyType {
@@ -427,7 +459,7 @@ func (this *TradeCommonController) CffexDataList() {
 				}
 				data[0].Title = item.ClassifyName
 				if data[0].ItemList == nil {
-					list := make([]ShanghaiList, 1)
+					list := make([]CffexList, 1)
 					data[0].ItemList = list
 				}
 				if data[0].ItemList[0].Code == item.ClassifyType {
@@ -470,20 +502,20 @@ func (this *TradeCommonController) ZhengzhouDataList() {
 	fmt.Println(date)
 	classifyName := this.GetString("ClassifyName")
 	classifyType := this.GetString("ClassifyType")
-	frequencyList, err := data_manage.GetBaseFromTradeIndexByParam("zhengzhou", date, classifyName, classifyType)
+	frequencyList, err := data_manage.GetBaseFromTradeZhengzhouIndexByParam("zhengzhou", date, classifyName, classifyType)
 	if err != nil {
 		br.Msg = "获取持仓排名失败"
 		br.ErrMsg = "获取持仓排名失败,Err:" + err.Error()
 		return
 	}
-	var data Data
+	var data ZZData
 	var k int
 	if len(frequencyList) == 0 {
 		br.Ret = 200
 		br.Msg = "获取成功"
 		br.Data = data
 	} else {
-		data = make(Data, 1)
+		data = make(ZZData, 1)
 		fmt.Println(len(frequencyList))
 		if len(frequencyList) > 21 {
 			for i, item := range frequencyList {
@@ -501,7 +533,7 @@ func (this *TradeCommonController) ZhengzhouDataList() {
 				}
 				data[0].Title = classifyName
 				if data[0].ItemList == nil {
-					list := make([]ShanghaiList, 200)
+					list := make([]ZhengzhouList, 200)
 					data[0].ItemList = list
 				}
 				if data[0].ItemList[k].Code == item.ClassifyType {
@@ -535,7 +567,7 @@ func (this *TradeCommonController) ZhengzhouDataList() {
 				}
 				data[0].Title = item.ClassifyName
 				if data[0].ItemList == nil {
-					list := make([]ShanghaiList, 1)
+					list := make([]ZhengzhouList, 1)
 					data[0].ItemList = list
 				}
 				if data[0].ItemList[0].Code == item.ClassifyType {
@@ -575,20 +607,20 @@ func (this *TradeCommonController) DalianDataList() {
 	date := this.GetString("Date")
 	classifyName := this.GetString("ClassifyName")
 	classifyType := this.GetString("ClassifyType")
-	frequencyList, err := data_manage.GetBaseFromTradeIndexByParam("dalian", date, classifyName, classifyType)
+	frequencyList, err := data_manage.GetBaseFromTradeDalianIndexByParam("dalian", date, classifyName, classifyType)
 	if err != nil {
 		br.Msg = "获取持仓排名失败"
 		br.ErrMsg = "获取持仓排名失败,Err:" + err.Error()
 		return
 	}
-	var data Data
+	var data DLData
 	var k int
 	if len(frequencyList) == 0 {
 		br.Ret = 200
 		br.Msg = "获取成功"
 		br.Data = data
 	} else {
-		data = make(Data, 1)
+		data = make(DLData, 1)
 		fmt.Println("len:", len(frequencyList))
 		if len(frequencyList) > 21 {
 			for i, item := range frequencyList {
@@ -606,7 +638,7 @@ func (this *TradeCommonController) DalianDataList() {
 				}
 				data[0].Title = classifyName
 				if data[0].ItemList == nil {
-					list := make([]ShanghaiList, 200)
+					list := make([]DalianList, 200)
 					data[0].ItemList = list
 				}
 				if data[0].ItemList[k].Code == item.ClassifyType {
@@ -640,7 +672,7 @@ func (this *TradeCommonController) DalianDataList() {
 				}
 				data[0].Title = item.ClassifyName
 				if data[0].ItemList == nil {
-					list := make([]ShanghaiList, 1)
+					list := make([]DalianList, 1)
 					data[0].ItemList = list
 				}
 				if data[0].ItemList[0].Code == item.ClassifyType {

+ 32 - 0
controllers/edb.go

@@ -4,6 +4,7 @@ import (
 	"eta/eta_hub/models"
 	"eta/eta_hub/models/data_manage"
 	"eta/eta_hub/services"
+	"eta/eta_hub/services/data"
 	"eta/eta_hub/utils"
 )
 
@@ -245,3 +246,34 @@ func (this *EdbController) EdbData() {
 	br.Ret = 200
 	br.Msg = "获取成功"
 }
+
+// TraceEdbInfo
+// @Title 指标溯源接口
+// @Description 指标溯源接口
+// @Param   EdbInfoId   query   int  true       "指标id"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /edb_info/trace [get]
+func (this *EdbInfoController) TraceEdbInfo() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	edbInfoId, _ := this.GetInt("EdbInfoId")
+	if edbInfoId <= 0 {
+		br.Msg = "参数错误"
+		br.ErrMsg = "参数错误"
+		return
+	}
+
+	resp, err := data.TraceEdbInfoByEdbInfoId(edbInfoId)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.Msg = "获取失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Data = resp
+	br.Msg = "刷新成功"
+}

+ 116 - 0
models/data_manage/base_from_trade_index.go

@@ -84,6 +84,58 @@ type BaseFromTradeIneIndex struct {
 	DataTime                string
 }
 
+type BaseFromTradeZhengzhouIndex struct {
+	BaseFromTradeZhengzhouIndexId int `orm:"column(base_from_trade_zhengzhou_index_id);pk"`
+	Rank                      int
+	DealShortName             string
+	DealName                  string
+	DealCode                  string
+	DealValue                 string
+	DealChange                string
+	BuyShortName              string
+	BuyName                   string
+	BuyCode                   string
+	BuyValue                  string
+	BuyChange                 string
+	SoldShortName             string
+	SoldName                  string
+	SoldCode                  string
+	SoldValue                 string
+	SoldChange                string
+	Frequency                 string
+	ClassifyName              string
+	ClassifyType              string
+	CreateTime                time.Time
+	ModifyTime                time.Time
+	DataTime                  string
+}
+
+type BaseFromTradeDalianIndex struct {
+	BaseFromTradeDalianIndexId int `orm:"column(base_from_trade_dalian_index_id);pk"`
+	Rank                      int
+	DealShortName             string
+	DealName                  string
+	DealCode                  string
+	DealValue                 string
+	DealChange                string
+	BuyShortName              string
+	BuyName                   string
+	BuyCode                   string
+	BuyValue                  string
+	BuyChange                 string
+	SoldShortName             string
+	SoldName                  string
+	SoldCode                  string
+	SoldValue                 string
+	SoldChange                string
+	Frequency                 string
+	ClassifyName              string
+	ClassifyType              string
+	CreateTime                time.Time
+	ModifyTime                time.Time
+	DataTime                  string
+}
+
 type BaseFromTradeEicIndex struct {
 	BaseFromEicIndexId     int `orm:"column(base_from_eic_index_id);pk"`
 	Country                string
@@ -130,6 +182,70 @@ func GetBaseFromTradeIndexByParam(exchange, date, classifyName, classifyType str
 		return
 	}
 }
+func GetBaseFromTradeIneIndexByParam(exchange, date, classifyName, classifyType string) (list []*BaseFromTradeIneIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	if classifyName == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=?"
+		_, err = o.Raw(sql, date).QueryRows(&list)
+		return
+	} else if classifyType == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? ORDER BY classify_type,rank"
+		_, err = o.Raw(sql, date, classifyName).QueryRows(&list)
+		return
+	} else {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? and classify_type=?"
+		_, err = o.Raw(sql, date, classifyName, classifyType).QueryRows(&list)
+		return
+	}
+}
+func GetBaseFromTradeCffexIndexByParam(exchange, date, classifyName, classifyType string) (list []*BaseFromTradeCffexIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	if classifyName == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=?"
+		_, err = o.Raw(sql, date).QueryRows(&list)
+		return
+	} else if classifyType == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? ORDER BY classify_type,rank"
+		_, err = o.Raw(sql, date, classifyName).QueryRows(&list)
+		return
+	} else {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? and classify_type=?"
+		_, err = o.Raw(sql, date, classifyName, classifyType).QueryRows(&list)
+		return
+	}
+}
+func GetBaseFromTradeZhengzhouIndexByParam(exchange, date, classifyName, classifyType string) (list []*BaseFromTradeZhengzhouIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	if classifyName == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=?"
+		_, err = o.Raw(sql, date).QueryRows(&list)
+		return
+	} else if classifyType == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? ORDER BY classify_type,rank"
+		_, err = o.Raw(sql, date, classifyName).QueryRows(&list)
+		return
+	} else {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? and classify_type=?"
+		_, err = o.Raw(sql, date, classifyName, classifyType).QueryRows(&list)
+		return
+	}
+}
+func GetBaseFromTradeDalianIndexByParam(exchange, date, classifyName, classifyType string) (list []*BaseFromTradeDalianIndex, err error) {
+	o := orm.NewOrmUsingDB("data")
+	if classifyName == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=?"
+		_, err = o.Raw(sql, date).QueryRows(&list)
+		return
+	} else if classifyType == "" {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? ORDER BY classify_type,rank"
+		_, err = o.Raw(sql, date, classifyName).QueryRows(&list)
+		return
+	} else {
+		sql := "SELECT * FROM base_from_trade_" + exchange + "_index where data_time=? and classify_name=? and classify_type=?"
+		_, err = o.Raw(sql, date, classifyName, classifyType).QueryRows(&list)
+		return
+	}
+}
 
 func GetExchangeClassify(exchange, dataTime string) (classifyName []string, err error) {
 	o := orm.NewOrmUsingDB("data")

+ 32 - 0
models/data_manage/edb_info.go

@@ -135,3 +135,35 @@ func FormatEdbInfo2Item(origin *EdbInfo) (item *EdbInfoItem) {
 	//item.EdbData = edbData
 	return
 }
+
+// TraceEdbInfoResp 指标追溯数据返回
+type TraceEdbInfoResp struct {
+	EdbInfoId   int                `description:"指标id"`
+	EdbInfoType int                `description:"指标类型: 0-普通指标; 1-预测指标"`
+	EdbName     string             `description:"指标名称"`
+	EdbType     int                `description:"指标类型: 1-基础指标; 2-计算指标"`
+	RuleTitle   string             `description:"指标规则"`
+	UniqueCode  string             `description:"唯一编码"`
+	ClassifyId  int                `description:"分类ID"`
+	Child       []TraceEdbInfoResp `description:"下级来源"`
+	EdbInfo     *EdbInfo           `description:"指标信息" json:"-"`
+}
+
+func GetEdbInfoById(edbInfoId int) (item *EdbInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info WHERE edb_info_id=? `
+	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	return
+}
+
+// GetEdbInfoByIdList 根据指标id集合 获取 指标列表
+func GetEdbInfoByIdList(edbInfoIdList []int) (items []*EdbInfo, err error) {
+	num := len(edbInfoIdList)
+	if num <= 0 {
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM edb_info WHERE edb_info_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, edbInfoIdList).QueryRows(&items)
+	return
+}

+ 101 - 0
models/data_manage/edb_info_calculate_mapping.go

@@ -0,0 +1,101 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// EdbInfoCalculateMapping 计算指标于基础指标,关系表
+type EdbInfoCalculateMapping struct {
+	EdbInfoCalculateMappingId int       `orm:"column(edb_info_calculate_mapping_id);pk"`
+	EdbInfoId                 int       `description:"计算指标id"`
+	Source                    int       `description:"计算指标来源"`
+	SourceName                string    `description:"计算指标来源名称"`
+	EdbCode                   string    `description:"计算指标编码"`
+	FromEdbInfoId             int       `description:"基础指标id"`
+	FromEdbCode               string    `description:"基础指标编码"`
+	FromEdbName               string    `description:"基础指标名称"`
+	FromSource                int       `description:"基础指标来源"`
+	FromSourceName            string    `description:"基础指标来源名称"`
+	FromTag                   string    `description:"来源指标标签"`
+	Sort                      int       `description:"计算指标名称排序"`
+	CreateTime                time.Time `description:"创建时间"`
+	ModifyTime                time.Time `description:"修改时间"`
+}
+
+func AddEdbInfoCalculateMappingMulti(items []*EdbInfoCalculateMapping) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.InsertMulti(1, items)
+	return
+}
+
+func GetEdbInfoCalculateMappingCount(edbInfoId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_mapping WHERE from_edb_info_id=? `
+	err = o.Raw(sql, edbInfoId).QueryRow(&count)
+	return
+}
+
+type EdbInfoCalculateMappingView struct {
+	EdbInfoCalculateMappingId int       `orm:"column(edb_info_calculate_mapping_id);pk"`
+	EdbInfoId                 int       `description:"计算指标id"`
+	Source                    int       `description:"计算指标来源"`
+	SourceName                string    `description:"计算指标来源名称"`
+	EdbCode                   string    `description:"计算指标编码"`
+	FromEdbInfoId             int       `description:"基础指标id"`
+	FromEdbCode               string    `description:"基础指标编码"`
+	FromEdbName               string    `description:"基础指标名称"`
+	FromSource                int       `description:"基础指标来源"`
+	FromSourceName            string    `description:"基础指标来源名称"`
+	FromTag                   string    `description:"来源指标标签"`
+	Sort                      int       `description:"计算指标名称排序"`
+	CreateTime                time.Time `description:"创建时间"`
+	ModifyTime                time.Time `description:"修改时间"`
+	StartDate                 string    `description:"开始日期"`
+	EndDate                   string    `description:"结束日期"`
+	CalculateFormula          string    `description:"N值"`
+	MoveType                  int       `description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency             string    `description:"移动频度"`
+}
+
+func GetEdbInfoCalculateMappingDetail(edbInfoId int) (item *EdbInfoCalculateMappingView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT a.*,b.start_date,b.end_date,b.calculate_formula,b.move_type,b.move_frequency FROM edb_info_calculate_mapping AS a
+			INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
+			WHERE a.edb_info_id=? `
+	err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	return
+}
+
+// EdbInfoCalculateMappingInfo
+type EdbInfoCalculateMappingInfo struct {
+	EdbInfoCalculateMappingId int       `orm:"column(edb_info_calculate_mapping_id);pk"`
+	EdbInfoId                 int       `description:"计算指标id"`
+	Source                    int       `description:"计算指标来源"`
+	SourceName                string    `description:"计算指标来源名称"`
+	EdbCode                   string    `description:"计算指标编码"`
+	FromEdbInfoId             int       `description:"基础指标id"`
+	FromEdbCode               string    `description:"基础指标编码"`
+	FromEdbName               string    `description:"基础指标名称"`
+	FromSource                int       `description:"基础指标来源"`
+	FromSourceName            string    `description:"基础指标来源名称"`
+	MoveValue                 int       `description:"领先值"`
+	FromTag                   string    `description:"来源指标标签"`
+	Sort                      int       `description:"计算指标名称排序"`
+	CreateTime                time.Time `description:"创建时间"`
+	ModifyTime                time.Time `description:"修改时间"`
+	FromEdbType               int       `description:"来源指标类型:1:基础指标,2:计算指标"`
+	FromEdbInfoType           int       `description:"来源指标类型: 0-基础指标; 1-预测指标"`
+	FromClassifyId            int       `description:"来源指标分类ID"`
+	FromUniqueCode            string    `description:"来源指标唯一编码"`
+}
+
+// GetEdbInfoCalculateMappingListByEdbInfoId 根据生成的指标id获取来源的指标id列表
+func GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId int) (items []*EdbInfoCalculateMappingInfo, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT a.*,b.edb_type as from_edb_type,b.edb_info_type as from_edb_info_type, b.unique_code AS from_unique_code, b.classify_id AS from_classify_id FROM edb_info_calculate_mapping AS a
+			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
+			WHERE a.edb_info_id=? `
+	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	return
+}

+ 9 - 0
routers/commentsRouter.go

@@ -115,6 +115,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_hub/controllers:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_hub/controllers:EdbInfoController"],
+        beego.ControllerComments{
+            Method: "TraceEdbInfo",
+            Router: `/edb_info/trace`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_hub/controllers:EdbInfoController"] = append(beego.GlobalControllerRouter["eta/eta_hub/controllers:EdbInfoController"],
         beego.ControllerComments{
             Method: "EiaSteoClassify",

+ 359 - 0
services/data/edb_info.go

@@ -0,0 +1,359 @@
+package data
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_hub/models/data_manage"
+	"eta/eta_hub/utils"
+	"fmt"
+	"strings"
+	"time"
+)
+
+// TraceEdbInfoByEdbInfoId 指标追溯
+func TraceEdbInfoByEdbInfoId(edbInfoId int) (traceEdbInfo data_manage.TraceEdbInfoResp, err error) {
+	edbInfo, err := data_manage.GetEdbInfoById(edbInfoId)
+	if err != nil {
+		return
+	}
+	edbInfoRuleMap := make(map[int]string, 0)
+	edbMappingMap := make(map[int][]*data_manage.EdbInfoCalculateMappingInfo)
+	//edbInfoRuleMap[edbInfoId] = getEdbRuleTitle(edbInfo)
+	traceEdbInfo = data_manage.TraceEdbInfoResp{
+		//EdbInfoId: edbInfo.EdbInfoId,
+		EdbInfoId:   edbInfoId,
+		EdbInfoType: edbInfo.EdbInfoType,
+		EdbName:     edbInfo.EdbName,
+		EdbType:     edbInfo.EdbType,
+		//Source:      edbInfo.Source,
+		UniqueCode: edbInfo.UniqueCode,
+		ClassifyId: edbInfo.ClassifyId,
+		EdbInfo:    edbInfo,
+	}
+	findIdMap := make(map[int]int)
+	findIdMap[edbInfoId] = edbInfoId
+	existMap := make(map[int]data_manage.TraceEdbInfoResp)
+	traceEdbInfo.Child, err = traceEdbInfoByEdbInfoId(edbInfoId, traceEdbInfo, edbInfoRuleMap, findIdMap, existMap, edbMappingMap)
+
+	edbInfoIdList := make([]int, 0)
+	for _, v := range findIdMap {
+		edbInfoIdList = append(edbInfoIdList, v)
+	}
+	edbInfoList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+	if err != nil {
+		return
+	}
+	edbInfoMap := make(map[int]*data_manage.EdbInfo)
+	for _, tmpEdbInfo := range edbInfoList {
+		edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo
+	}
+	traceEdbInfo, err = handleTraceEdbInfo(traceEdbInfo, 0, edbInfoMap, edbMappingMap)
+	return
+}
+
+// traceEdbInfoByEdbInfoId 指标追溯
+func traceEdbInfoByEdbInfoId(edbInfoId int, traceEdbInfo data_manage.TraceEdbInfoResp, edbInfoRuleMap map[int]string, findIdMap map[int]int, existMap map[int]data_manage.TraceEdbInfoResp, edbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo) (child []data_manage.TraceEdbInfoResp, err error) {
+	traceEdbInfo, ok := existMap[edbInfoId]
+	if ok {
+		return
+	}
+	child = make([]data_manage.TraceEdbInfoResp, 0)
+
+	edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
+	if e != nil {
+		err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
+		return
+	}
+
+	// 指标信息map
+	edbInfoMap := make(map[int]*data_manage.EdbInfo)
+	if len(edbInfoMappingList) > 0 {
+		fromEdbInfoIdList := make([]int, 0)
+		for _, v := range edbInfoMappingList {
+			fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
+		}
+		edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(fromEdbInfoIdList)
+		if tmpErr != nil {
+			err = fmt.Errorf("traceEdbInfoByEdbInfoId GetEdbInfoByIdList err: %s", tmpErr.Error())
+			return
+		}
+		for _, v := range edbInfoList {
+			edbInfoMap[v.EdbInfoId] = v
+		}
+
+	}
+
+	edbMappingMap[edbInfoId] = edbInfoMappingList
+	for _, v := range edbInfoMappingList {
+		tmpEdbInfoId := v.FromEdbInfoId
+		tmpTraceEdbInfo := data_manage.TraceEdbInfoResp{
+			EdbInfoId:   tmpEdbInfoId,
+			EdbInfoType: v.FromEdbInfoType,
+			EdbType:     v.FromEdbType,
+			UniqueCode:  v.FromUniqueCode,
+			ClassifyId:  v.FromClassifyId,
+			EdbInfo:     edbInfoMap[v.FromEdbInfoId],
+		}
+
+		// 计算指标/预测指标继续溯源
+		if v.FromEdbType == 2 || v.FromEdbInfoType == 1 {
+			// 查过了就不查了
+			if _, ok2 := findIdMap[tmpEdbInfoId]; !ok2 {
+				tmpTraceEdbInfo.Child, e = traceEdbInfoByEdbInfoId(tmpEdbInfoId, tmpTraceEdbInfo, edbInfoRuleMap, findIdMap, existMap, edbMappingMap)
+				if e != nil {
+					err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
+					return
+				}
+			}
+		}
+		child = append(child, tmpTraceEdbInfo)
+		findIdMap[tmpEdbInfoId] = tmpEdbInfoId
+	}
+	existMap[edbInfoId] = traceEdbInfo
+	return
+}
+
+func handleTraceEdbInfo(traceEdbInfoResp data_manage.TraceEdbInfoResp, parentEdbInfoId int, edbInfoMap map[int]*data_manage.EdbInfo, edbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo) (newTraceEdbInfoResp data_manage.TraceEdbInfoResp, err error) {
+	edbInfo, ok := edbInfoMap[traceEdbInfoResp.EdbInfoId]
+	if !ok {
+		err = errors.New("指标异常")
+		return
+	}
+
+	var parentEdbInfo *data_manage.EdbInfo
+	if parentEdbInfoId > 0 {
+		parentEdbInfo, ok = edbInfoMap[parentEdbInfoId]
+		if !ok {
+			err = errors.New("指标异常")
+			return
+		}
+	}
+
+	//traceEdbInfoResp.EdbName = edbInfo.EdbName
+	traceEdbInfoResp.EdbName, traceEdbInfoResp.RuleTitle = getEdbRuleTitle(edbInfo, parentEdbInfo, traceEdbInfoResp.Child, edbInfoMap, edbMappingMap)
+
+	if traceEdbInfoResp.Child != nil && len(traceEdbInfoResp.Child) > 0 {
+		for k, v := range traceEdbInfoResp.Child {
+			traceEdbInfoResp.Child[k], err = handleTraceEdbInfo(v, traceEdbInfoResp.EdbInfoId, edbInfoMap, edbMappingMap)
+			if err != nil {
+				return
+			}
+		}
+	}
+	newTraceEdbInfoResp = traceEdbInfoResp
+
+	return
+}
+
+// getEdbRule 获取规则名称
+func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []data_manage.TraceEdbInfoResp, edbInfoMap map[int]*data_manage.EdbInfo, edbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo) (edbName, ruleTitle string) {
+	edbName = edbInfo.EdbName
+	ruleTitle = `来源于` + edbInfo.SourceName
+
+	if parentEdbInfo != nil {
+		edbMappingList, ok := edbMappingMap[parentEdbInfo.EdbInfoId]
+		if !ok {
+			edbMappingList = []*data_manage.EdbInfoCalculateMappingInfo{}
+		}
+		// 指标名称
+		switch parentEdbInfo.Source {
+		case utils.DATA_SOURCE_CALCULATE, utils.DATA_SOURCE_PREDICT_CALCULATE:
+			for _, v := range edbMappingList {
+				if v.FromEdbInfoId == edbInfo.EdbInfoId {
+					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, v.FromTag)
+				}
+			}
+
+		case utils.DATA_SOURCE_CALCULATE_ZJPJ, utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ, utils.DATA_SOURCE_CALCULATE_LJZTBPJ, utils.DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ: // 直接拼接 ,累计值同比拼接
+			for _, v := range edbMappingList {
+				if v.FromEdbInfoId == edbInfo.EdbInfoId {
+					tmpName := ``
+					if v.FromTag == `A` {
+						tmpName = `拼接日期前`
+					} else if v.FromTag == `B` {
+						tmpName = `拼接日期后`
+					}
+					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, tmpName)
+				}
+			}
+		case utils.DATA_SOURCE_CALCULATE_NHCC, utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC: //计算指标(拟合残差)
+			for _, v := range edbMappingList {
+				//(需对上游指标+自变量,领先10天/因变量)
+				if v.FromEdbInfoId == edbInfo.EdbInfoId {
+					tmpName := ``
+					if v.FromTag == `A` {
+						tmpName = fmt.Sprintf(`自变量,领先%d天`, v.MoveValue)
+					} else if v.FromTag == `B` {
+						tmpName = `因变量`
+					}
+					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, tmpName)
+				}
+			}
+		case utils.DATA_SOURCE_CALCULATE_CORRELATION: // 滚动相关性
+			for _, v := range edbMappingList {
+				if v.FromEdbInfoId == edbInfo.EdbInfoId {
+					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, v.FromTag)
+				}
+			}
+
+		}
+
+	}
+
+	if edbInfo.EdbType == 1 {
+		// 基础指标的话,直接返回来源名称
+		//ruleTitle = `来源于`+edbInfo.SourceName
+
+		return
+	}
+
+	// 规则
+	switch edbInfo.Source {
+	case utils.DATA_SOURCE_CALCULATE, utils.DATA_SOURCE_PREDICT_CALCULATE:
+		ruleTitle = "=" + edbInfo.CalculateFormula
+	case utils.DATA_SOURCE_CALCULATE_LJZZY, utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZY:
+		ruleTitle = `累计转月值计算`
+	case utils.DATA_SOURCE_CALCULATE_TBZ, utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ:
+		ruleTitle = `同比值计算`
+	case utils.DATA_SOURCE_CALCULATE_TCZ, utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ:
+		ruleTitle = `同差值计算`
+	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS:
+		ruleTitle = fmt.Sprintf("N数值移动均值计算(N=%s)", edbInfo.CalculateFormula)
+	case utils.DATA_SOURCE_CALCULATE_HBZ, utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ:
+		ruleTitle = fmt.Sprintf("N数值环比值计算(N=%s)", edbInfo.CalculateFormula)
+	case utils.DATA_SOURCE_CALCULATE_HCZ, utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ:
+		ruleTitle = fmt.Sprintf("N数值环差值计算(N=%s)", edbInfo.CalculateFormula)
+	case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT, utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT:
+		moveType := `领先`
+		if edbInfo.MoveType == 2 {
+			moveType = "滞后"
+		}
+		ruleTitle = fmt.Sprintf("时间移位计算(%s%s%s)", moveType, edbInfo.CalculateFormula, edbInfo.MoveFrequency)
+	case utils.DATA_SOURCE_CALCULATE_BP, utils.DATA_SOURCE_PREDICT_CALCULATE_BP: // 变频
+		childFrequency := ``
+		if len(childList) > 0 {
+			if childEdbInfo, ok := edbInfoMap[childList[0].EdbInfoId]; ok {
+				childFrequency = childEdbInfo.Frequency
+			}
+
+		}
+		ruleTitle = fmt.Sprintf("升频计算(%s转%s)", childFrequency, edbInfo.Frequency)
+	case utils.DATA_SOURCE_CALCULATE_ZJPJ, utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ: // 直接拼接
+		ruleTitle = fmt.Sprintf("直接拼接计算(%s)", edbInfo.CalculateFormula)
+	case utils.DATA_SOURCE_CALCULATE_LJZTBPJ, utils.DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ: // 累计值同比拼
+		ruleTitle = fmt.Sprintf("累计值同比值拼接计算(%s)", edbInfo.CalculateFormula)
+	case utils.DATA_SOURCE_PYTHON:
+		ruleTitle = `代码运算`
+	case utils.DATA_SOURCE_CALCULATE_CJJX, utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX:
+		ruleTitle = fmt.Sprintf("超季节性计算(N=%s,%s)", edbInfo.CalculateFormula, edbInfo.Calendar)
+	case utils.DATA_SOURCE_CALCULATE_NHCC, utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC: //计算指标(拟合残差)
+		var startDate, endDate string
+		dateList := strings.Split(edbInfo.CalculateFormula, ",")
+		if len(dateList) == 2 {
+			startDate = dateList[0]
+			endDate = dateList[1]
+		}
+		ruleTitle = fmt.Sprintf("拟合残差计算(%s至%s)", startDate, endDate)
+	case utils.DATA_SOURCE_CALCULATE_ADJUST:
+		ruleTitle = `数据调整`
+	case utils.DATA_SOURCE_CALCULATE_NH, utils.DATA_SOURCE_PREDICT_CALCULATE_NH:
+		ruleTitle = `年化计算`
+	case utils.DATA_SOURCE_CALCULATE_KSZS, utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS: // 扩散指数->53
+		type KszsConfig struct {
+			DateType  int      `description:"扩散指标日期;1:全部指标日期并集;2:部分指标日期并集"`
+			CheckList []string `description:"选中的数据,A,B,C"`
+		}
+		var config KszsConfig
+		err := json.Unmarshal([]byte(edbInfo.CalculateFormula), &config)
+		if err != nil {
+			return
+		}
+		var startDate, endDate time.Time
+
+		childEdbInfoIdList := make([]int, 0)
+		if config.DateType == 1 {
+			for _, v := range childList {
+				childEdbInfoIdList = append(childEdbInfoIdList, v.EdbInfoId)
+			}
+
+		} else {
+			if parentEdbInfo != nil {
+				edbMappingList, ok := edbMappingMap[parentEdbInfo.EdbInfoId]
+				if !ok {
+					edbMappingList = []*data_manage.EdbInfoCalculateMappingInfo{}
+				}
+				tagMap := make(map[string]int)
+				for _, v := range edbMappingList {
+					tagMap[v.FromTag] = v.FromEdbInfoId
+				}
+				for _, v := range config.CheckList {
+					if tmpEdbInfoId, ok := tagMap[v]; ok {
+						childEdbInfoIdList = append(childEdbInfoIdList, tmpEdbInfoId)
+					}
+				}
+			}
+		}
+		for _, v := range childEdbInfoIdList {
+			if childEdbInfo, ok := edbInfoMap[v]; ok {
+				tmpStartDate, tmpErr := time.ParseInLocation(utils.FormatDate, childEdbInfo.StartDate, time.Local)
+				if tmpErr != nil {
+					return
+				}
+				if startDate.IsZero() || startDate.After(tmpStartDate) {
+					startDate = tmpStartDate
+				}
+
+				tmpEndDate, tmpErr := time.ParseInLocation(utils.FormatDate, childEdbInfo.EndDate, time.Local)
+				if tmpErr != nil {
+					return
+				}
+				if endDate.IsZero() || endDate.Before(tmpEndDate) {
+					endDate = tmpEndDate
+				}
+			}
+		}
+		ruleTitle = fmt.Sprintf("扩散指数计算(%s至%s)", startDate.Format(utils.FormatDate), endDate.Format(utils.FormatDate))
+	case utils.DATA_SOURCE_STOCK_PLANT:
+		ruleTitle = `来源于装置分析`
+	case utils.DATA_SOURCE_CALCULATE_CORRELATION:
+		type EdbCalculateFormula struct {
+			BaseCalculateValue int    `description:"基础计算窗口"`
+			BaseCalculateUnit  string `description:"基础计算频度"`
+			LeadValue          int    `description:"领先期数"`
+			LeadUnit           string `description:"频度"`
+			CalculateValue     int    `description:"计算窗口"`
+			CalculateUnit      string `description:"计算频度"`
+		}
+		var correlationConf EdbCalculateFormula
+		err := json.Unmarshal([]byte(edbInfo.CalculateFormula), &correlationConf)
+		if err != nil {
+			return
+		}
+		ruleTitle = fmt.Sprintf("滚动相关性(计算窗口%d%s,B领先A%d%s)", correlationConf.CalculateValue, correlationConf.CalculateUnit, correlationConf.LeadValue, correlationConf.LeadUnit)
+	case utils.DATA_SOURCE_CALCULATE_JP, utils.DATA_SOURCE_PREDICT_CALCULATE_JP:
+		childFrequency := ``
+		if len(childList) > 0 {
+			if childEdbInfo, ok := edbInfoMap[childList[0].EdbInfoId]; ok {
+				childFrequency = childEdbInfo.Frequency
+			}
+
+		}
+		ruleTitle = fmt.Sprintf("降频计算(%s转%s,%s)", childFrequency, edbInfo.Frequency, edbInfo.CalculateFormula)
+	case utils.DATA_SOURCE_CALCULATE_STANDARD_DEVIATION:
+		ruleTitle = fmt.Sprintf("标准差(滚动%s期)", edbInfo.CalculateFormula)
+	case utils.DATA_SOURCE_CALCULATE_PERCENTILE, utils.DATA_SOURCE_PREDICT_CALCULATE_PERCENTILE:
+		type TempCalculate struct {
+			CalculateValue int    `description:"计算窗口"`
+			CalculateUnit  string `description:"计算频度"`
+		}
+		cf := TempCalculate{}
+		if e := json.Unmarshal([]byte(edbInfo.CalculateFormula), &cf); e != nil {
+			return
+		}
+		ruleTitle = fmt.Sprintf("百分位(时间长度%d%s)", cf.CalculateValue, cf.CalculateUnit)
+	case utils.DATA_SOURCE_CALCULATE_ZSXY, utils.DATA_SOURCE_PREDICT_CALCULATE_ZSXY:
+		ruleTitle = `指数修匀计算`
+	}
+
+	return
+}