Browse Source

历史数据添加指标引用

xyxie 9 months ago
parent
commit
ff91e63723

+ 9 - 4
models/data_manage/edb_info.go

@@ -30,6 +30,7 @@ type EdbInfo struct {
 	MaxValue         float64 `description:"指标最大值"`
 	CalculateFormula string  `description:"计算公式"`
 	NoUpdate         int8    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	EdbType          int     `description:"指标类型:1:基础指标,2:计算指标"`
 }
 
 type EdbInfoList struct {
@@ -351,10 +352,14 @@ func ModifyEdbUpdateStatus(edbIdList []int, indexCodeList []string, calculateEdb
 	return
 }
 
-// GetEdbInfoByIdListAndSource 根据指标id集合 获取 指标列表
-func GetEdbInfoByIdListAndSource(edbInfoIdList []int, source []int) (items []*EdbInfo, err error) {
+// 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(len(edbInfoIdList)) + `)  AND source in (` + utils.GetOrmInReplace(len(source)) + `)`
-	_, err = o.Raw(sql, edbInfoIdList, source).QueryRows(&items)
+	sql := ` SELECT * FROM edb_info WHERE edb_info_id in (` + utils.GetOrmInReplace(num) + `) `
+	_, err = o.Raw(sql, edbInfoIdList).QueryRows(&items)
 	return
 }

+ 35 - 0
models/data_manage/edb_info_calculate_mapping.go

@@ -123,3 +123,38 @@ func GetAllCalculateEdbIdsByEdbInfoIds(edbInfoIds []int) (edbIds []int, err erro
 	}
 	return
 }
+
+// EdbInfoCalculateMappingInfo
+// @Description: 计算指标与基础指标关系表
+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:"来源指标唯一编码"`
+	NoUpdate                  int8      `description:"是否停止更新,0:继续更新;1:停止更新"`
+}
+
+// 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,b.no_update 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
+}

+ 4 - 1
models/data_manage/edb_info_relation.go

@@ -18,6 +18,9 @@ type EdbInfoRelation struct {
 	CreateTime         time.Time `description:"创建时间"`
 	ModifyTime         time.Time `description:"修改时间"`
 	RelationTime       time.Time `description:"引用时间"`
+	RelationType       int       `description:"引用类型,0:直接饮用,1间接引用"`
+	RootEdbInfoId      int       `description:"间接引用时,关联的直接引用的指标ID"`
+	ChildEdbInfoId     int       `description:"间接引用时,计算指标直接关联的指标ID"`
 }
 
 func (e *EdbInfoRelation) TableName() string {
@@ -44,7 +47,7 @@ func GetEdbInfoRelationByEdbInfoIds(edbInfoIds []int) (edbIds []int, err error)
 // GetEdbInfoRelationByReferObjectIds 查询引用的指标ID
 func GetEdbInfoRelationByReferObjectIds(referObjectIds []int, referObjectType int) (items []*EdbInfoRelation, err error) {
 	o := orm.NewOrmUsingDB("data")
-	msql := ` SELECT * FROM edb_info_relation WHERE refer_object_id in (` + utils.GetOrmInReplace(len(referObjectIds)) + `) AND refer_object_type=?`
+	msql := ` SELECT * FROM edb_info_relation WHERE refer_object_id in (` + utils.GetOrmInReplace(len(referObjectIds)) + `) AND refer_object_type=? AND relation_type=0`
 	_, err = o.Raw(msql, referObjectIds, referObjectType).QueryRows(&items)
 	return
 }

+ 288 - 4
services/edb_relation.go

@@ -60,7 +60,7 @@ func InitChartEdbRelation() {
 			edbInfoIds = append(edbInfoIds, v.EdbInfoId)
 		}
 		// 查询指标信息表
-		edbInfoList, e := data_manage.GetEdbInfoByIdListAndSource(edbInfoIds, []int{utils.DATA_SOURCE_WIND, utils.DATA_SOURCE_MYSTEEL_CHEMICAL})
+		edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
 		if e != nil {
 			err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
 			return
@@ -68,6 +68,14 @@ func InitChartEdbRelation() {
 		if len(edbInfoList) == 0 {
 			continue
 		}
+		// 查询计算指标信息,并且建立关联关系
+		// 查询间接引用的指标信息
+		calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
+		if e != nil {
+			err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
+			return
+		}
+		// 查询指标间接引用
 		edbInfoMap := make(map[int]*data_manage.EdbInfo)
 		for _, v := range edbInfoList {
 			edbInfoMap[v.EdbInfoId] = v
@@ -136,6 +144,41 @@ func InitChartEdbRelation() {
 				}
 				addList = append(addList, tmp)
 				existRelationMap[name] = struct{}{}
+				// 添加间接引用记录
+				if edbInfo.EdbType == 2 {
+					childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
+					if !ok1 {
+						continue
+					}
+					for _, childEdbMappingId := range childEdbMappingIds {
+						childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
+						if !ok2 {
+							continue
+						}
+						childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
+						if !ok2 {
+							continue
+						}
+						tmp1 := &data_manage.EdbInfoRelation{
+							ReferObjectId:      v.ChartInfoId,
+							ReferObjectType:    utils.EDB_RELATION_CHART,
+							ReferObjectSubType: chartInfo.Source,
+							EdbInfoId:          childEdb.EdbInfoId,
+							EdbName:            childEdb.EdbName,
+							Source:             childEdb.Source,
+							EdbCode:            childEdb.EdbCode,
+							CreateTime:         nowTime,
+							ModifyTime:         nowTime,
+							RelationTime:       v.CreateTime,
+							RelationType:       1,
+							RootEdbInfoId:      edbInfo.EdbInfoId,
+							ChildEdbInfoId:     childEdbMapping.EdbInfoId,
+						}
+						addList = append(addList, tmp1)
+						// todo 防止重复
+					}
+				}
+
 				if len(addList) > pageSize {
 					err = data_manage.AddEdbInfoRelationMulti(addList)
 					if err != nil {
@@ -248,7 +291,7 @@ func InitChartCrossVariety() {
 		}
 
 		// 查询指标信息表
-		edbInfoList, e := data_manage.GetEdbInfoByIdListAndSource(edbInfoIds, []int{utils.DATA_SOURCE_WIND, utils.DATA_SOURCE_MYSTEEL_CHEMICAL})
+		edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
 		if e != nil {
 			err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
 			return
@@ -256,6 +299,13 @@ func InitChartCrossVariety() {
 		if len(edbInfoList) == 0 {
 			continue
 		}
+		// 查询计算指标信息,并且建立关联关系
+		// 查询间接引用的指标信息
+		calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
+		if e != nil {
+			err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
+			return
+		}
 		edbInfoMap := make(map[int]*data_manage.EdbInfo)
 		chartInfoCrossMap := make(map[int]struct{})
 		chartInfoCrossList := make([]*cross_variety.ChartInfoCrossVariety, 0)
@@ -326,6 +376,40 @@ func InitChartCrossVariety() {
 					}
 					addList = append(addList, tmp)
 					existRelationMap[name] = struct{}{}
+					// 添加间接引用记录
+					if edbInfo.EdbType == 2 {
+						childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
+						if !ok1 {
+							continue
+						}
+						for _, childEdbMappingId := range childEdbMappingIds {
+							childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
+							if !ok2 {
+								continue
+							}
+							childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
+							if !ok2 {
+								continue
+							}
+							tmp1 := &data_manage.EdbInfoRelation{
+								ReferObjectId:      item.ChartInfoId,
+								ReferObjectType:    utils.EDB_RELATION_CHART,
+								ReferObjectSubType: utils.CHART_SOURCE_CROSS_HEDGING,
+								EdbInfoId:          childEdb.EdbInfoId,
+								EdbName:            childEdb.EdbName,
+								Source:             childEdb.Source,
+								EdbCode:            childEdb.EdbCode,
+								CreateTime:         nowTime,
+								ModifyTime:         nowTime,
+								RelationTime:       item.CreateTime,
+								RelationType:       1,
+								RootEdbInfoId:      edbInfo.EdbInfoId,
+								ChildEdbInfoId:     childEdbMapping.EdbInfoId,
+							}
+							addList = append(addList, tmp1)
+							// todo 防止重复
+						}
+					}
 					if len(addList) > pageSize {
 						err = data_manage.AddEdbInfoRelationMulti(addList)
 						if err != nil {
@@ -407,7 +491,7 @@ func initCalendarIndicatorRelation() {
 			}
 		}
 		// 查询指标信息表
-		edbInfoList, e := data_manage.GetEdbInfoByIdListAndSource(edbInfoIds, []int{utils.DATA_SOURCE_WIND, utils.DATA_SOURCE_MYSTEEL_CHEMICAL})
+		edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
 		if e != nil {
 			err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
 			return
@@ -415,6 +499,14 @@ func initCalendarIndicatorRelation() {
 		if len(edbInfoList) == 0 {
 			continue
 		}
+
+		// 查询计算指标信息,并且建立关联关系
+		// 查询间接引用的指标信息
+		calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
+		if e != nil {
+			err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
+			return
+		}
 		edbInfoMap := make(map[int]*data_manage.EdbInfo)
 		matterIds := make([]int, 0)
 		for _, v := range edbInfoList {
@@ -459,6 +551,39 @@ func initCalendarIndicatorRelation() {
 						}
 						addList = append(addList, tmp)
 						existRelationMap[name] = struct{}{}
+						// 添加间接引用记录
+						if edbInfo.EdbType == 2 {
+							childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
+							if !ok1 {
+								continue
+							}
+							for _, childEdbMappingId := range childEdbMappingIds {
+								childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
+								if !ok2 {
+									continue
+								}
+								childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
+								if !ok2 {
+									continue
+								}
+								tmp1 := &data_manage.EdbInfoRelation{
+									ReferObjectId:   v.FeCalendarMatterId,
+									ReferObjectType: utils.EDB_RELATION_CALENDAR,
+									EdbInfoId:       childEdb.EdbInfoId,
+									EdbName:         childEdb.EdbName,
+									Source:          childEdb.Source,
+									EdbCode:         childEdb.EdbCode,
+									CreateTime:      nowTime,
+									ModifyTime:      nowTime,
+									RelationTime:    v.CreateTime,
+									RelationType:    1,
+									RootEdbInfoId:   edbInfo.EdbInfoId,
+									ChildEdbInfoId:  childEdbMapping.EdbInfoId,
+								}
+								addList = append(addList, tmp1)
+								// todo 防止重复
+							}
+						}
 						if len(addList) > pageSize {
 							err = data_manage.AddEdbInfoRelationMulti(addList)
 							if err != nil {
@@ -546,7 +671,7 @@ func initSandBoxEdbRelation() {
 			continue
 		}
 		// 查询指标信息表
-		edbInfoList, e := data_manage.GetEdbInfoByIdListAndSource(edbInfoIds, []int{utils.DATA_SOURCE_WIND, utils.DATA_SOURCE_MYSTEEL_CHEMICAL})
+		edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
 		if e != nil {
 			err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
 			return
@@ -554,6 +679,13 @@ func initSandBoxEdbRelation() {
 		if len(edbInfoList) == 0 {
 			continue
 		}
+		// 查询计算指标信息,并且建立关联关系
+		// 查询间接引用的指标信息
+		calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
+		if e != nil {
+			err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
+			return
+		}
 		edbInfoMap := make(map[int]*data_manage.EdbInfo)
 		sandboxIds := make([]int, 0)
 		for _, v := range edbInfoList {
@@ -599,6 +731,39 @@ func initSandBoxEdbRelation() {
 					}
 					addList = append(addList, tmp)
 					existRelationMap[name] = struct{}{}
+					// 添加间接引用记录
+					if edbInfo.EdbType == 2 {
+						childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
+						if !ok1 {
+							continue
+						}
+						for _, childEdbMappingId := range childEdbMappingIds {
+							childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
+							if !ok2 {
+								continue
+							}
+							childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
+							if !ok2 {
+								continue
+							}
+							tmp1 := &data_manage.EdbInfoRelation{
+								ReferObjectId:   v.SandboxId,
+								ReferObjectType: utils.EDB_RELATION_SANDBOX,
+								EdbInfoId:       childEdb.EdbInfoId,
+								EdbName:         childEdb.EdbName,
+								Source:          childEdb.Source,
+								EdbCode:         childEdb.EdbCode,
+								CreateTime:      nowTime,
+								ModifyTime:      nowTime,
+								RelationTime:    v.CreateTime,
+								RelationType:    1,
+								RootEdbInfoId:   edbInfo.EdbInfoId,
+								ChildEdbInfoId:  childEdbMapping.EdbInfoId,
+							}
+							addList = append(addList, tmp1)
+							// todo 防止重复
+						}
+					}
 					if len(addList) > pageSize {
 						err = data_manage.AddEdbInfoRelationMulti(addList)
 						if err != nil {
@@ -645,3 +810,122 @@ func getSandBoxEdbIdsByContent(content string) (edbInfoIds []int, err error) {
 	}
 	return
 }
+
+func GetEdbListByEdbInfoId(edbInfoList []*data_manage.EdbInfo) (edbInfoMap map[int]*data_manage.EdbInfo, edbMappingListMap map[int]*data_manage.EdbInfoCalculateMapping, edbInfoMappingRootIdsMap map[int][]int, err error) {
+	//查询指标信息
+	//查询指标映射
+	//查询所有指标数据
+	//查询这个指标相关的mapping信息放到数组里,
+	//将得到的指标ID信息放到数组里
+	hasFindMap := make(map[int]struct{})
+	edbInfoIdMap := make(map[int]struct{})
+	edbMappingList := make([]*data_manage.EdbInfoCalculateMapping, 0)
+	edbInfoMappingRootIdsMap = make(map[int][]int, 0)
+	edbMappingMap := make(map[int]struct{})
+	for _, edbInfo := range edbInfoList {
+		if edbInfo.EdbType == 2 {
+			edbInfoId := edbInfo.EdbInfoId
+			edbMappingList, err = getCalculateEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, edbInfoId)
+			if err != nil {
+				err = fmt.Errorf(" GetCalculateEdbInfoByEdbInfoId err: %s", err.Error())
+				return
+			}
+		}
+	}
+	if len(edbMappingList) == 0 {
+		return
+	}
+	// 查询指标信息
+	// 指标信息map
+	edbInfoIdList := make([]int, 0)
+	for k, _ := range edbInfoIdMap {
+		edbInfoIdList = append(edbInfoIdList, k)
+	}
+	edbInfoMap = make(map[int]*data_manage.EdbInfo)
+	edbMappingListMap = make(map[int]*data_manage.EdbInfoCalculateMapping)
+	if len(edbInfoIdList) > 0 {
+		edbInfoList, err = data_manage.GetEdbInfoByIdList(edbInfoIdList)
+		if err != nil {
+			err = fmt.Errorf(" GetEdbInfoByIdList err: %s", err.Error())
+			return
+		}
+		for _, v := range edbInfoList {
+			edbInfoMap[v.EdbInfoId] = v
+		}
+	}
+
+	if len(edbMappingList) > 0 {
+		for _, v := range edbMappingList {
+			edbMappingListMap[v.EdbInfoCalculateMappingId] = v
+		}
+	}
+	return
+}
+
+// getCalculateEdbInfoByEdbInfoId 计算指标追溯
+func getCalculateEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}, edbInfoMappingRootIdsMap map[int][]int, rootEdbInfoId int) (newEdbMappingList []*data_manage.EdbInfoCalculateMapping, err error) {
+	newEdbMappingList = edbMappingList
+	_, ok := hasFindMap[edbInfoId]
+	if ok {
+		return
+	}
+
+	if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
+		edbInfoIdMap[edbInfoId] = struct{}{}
+	}
+
+	edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
+	if e != nil {
+		err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
+		return
+	}
+
+	if len(edbInfoMappingList) > 0 {
+		fromEdbInfoIdList := make([]int, 0)
+		edbInfoMappingIdList := make([]int, 0)
+		for _, v := range edbInfoMappingList {
+			fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
+			edbInfoMappingIdList = append(edbInfoMappingIdList, v.EdbInfoCalculateMappingId)
+			if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
+				edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
+			}
+			if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
+				edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
+				tmp := &data_manage.EdbInfoCalculateMapping{
+					EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
+					EdbInfoId:                 v.EdbInfoId,
+					Source:                    v.Source,
+					SourceName:                v.SourceName,
+					EdbCode:                   v.EdbCode,
+					FromEdbInfoId:             v.FromEdbInfoId,
+					FromEdbCode:               v.FromEdbCode,
+					FromEdbName:               v.FromEdbName,
+					FromSource:                v.FromSource,
+					FromSourceName:            v.FromSourceName,
+					FromTag:                   v.FromTag,
+					Sort:                      v.Sort,
+					CreateTime:                v.CreateTime,
+					ModifyTime:                v.ModifyTime,
+				}
+				newEdbMappingList = append(newEdbMappingList, tmp)
+
+			}
+
+			if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
+				// 查过了就不查了
+				if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
+					newEdbMappingList, e = getCalculateEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, rootEdbInfoId)
+					if e != nil {
+						err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
+						return
+					}
+				}
+			}
+			hasFindMap[v.FromEdbInfoId] = struct{}{}
+		}
+		edbInfoMappingRootIdsMap[rootEdbInfoId] = append(edbInfoMappingRootIdsMap[rootEdbInfoId], edbInfoMappingIdList...)
+	}
+
+	hasFindMap[edbInfoId] = struct{}{}
+	return
+}