|
@@ -0,0 +1,381 @@
|
|
|
+package services
|
|
|
+
|
|
|
+import (
|
|
|
+ "eta/eta_index_lib/models"
|
|
|
+ "eta/eta_index_lib/services/alarm_msg"
|
|
|
+ "eta/eta_index_lib/utils"
|
|
|
+ "fmt"
|
|
|
+ "sort"
|
|
|
+ "strconv"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+// 重置单个计算指标中的引用关系
|
|
|
+func ResetEdbRelation(edbInfoId int) {
|
|
|
+ var logMsg string
|
|
|
+ var replaceTotal int
|
|
|
+ var err error
|
|
|
+ defer func() {
|
|
|
+ if err != nil {
|
|
|
+ msg := fmt.Sprintf(" 重置单个计算指标中的引用关系失败 ResetEdbRelation err: %v", err)
|
|
|
+ utils.FileLog.Info(msg)
|
|
|
+ fmt.Println(msg)
|
|
|
+ go alarm_msg.SendAlarmMsg(msg, 3)
|
|
|
+ }
|
|
|
+ if logMsg != `` {
|
|
|
+ utils.FileLog.Info(fmt.Sprintf("重置单个计算指标中的引用关系失败 重置总数%d,涉及到的引用id:%s", replaceTotal, logMsg))
|
|
|
+ }
|
|
|
+ }()
|
|
|
+ //查询与该计算指标相关的间接引用或者间接引用关系,如果记录不存在,则不处理
|
|
|
+ _, err = models.GetEdbInfoRelationByChildEdbInfoId(edbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ if err.Error() == utils.ErrNoRow() {
|
|
|
+ err = nil
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err = fmt.Errorf("查询与该计算指标相关的间接引用或者间接引用关系失败,错误信息:%s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询当前计算指标最新的引用指标列表
|
|
|
+ newMappingList, err := models.GetEdbInfoCalculateDetailList(edbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("查询当前计算指标最新的指标列表失败,错误信息:%s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //整理关联的来源指标ID
|
|
|
+ newEdbIdList := make([]string, 0)
|
|
|
+ newMappingListMap := make(map[int]*models.EdbInfoCalculateDetail)
|
|
|
+ for _, v := range newMappingList {
|
|
|
+ newEdbIdList = append(newEdbIdList, strconv.Itoa(v.FromEdbInfoId))
|
|
|
+ newMappingListMap[v.FromEdbInfoId] = v
|
|
|
+ }
|
|
|
+ //对指标ID进行排序
|
|
|
+ sort.Strings(newEdbIdList)
|
|
|
+ newEdbIdStr := ""
|
|
|
+ for _, v := range newEdbIdList {
|
|
|
+ newEdbIdStr += v + ","
|
|
|
+ }
|
|
|
+ //二者匹配一下,如果相同,则不处理,如果不同,先查询所有旧的间接引用记录,整理并分组,则删除旧的间接引用记录,新增新的间接引用记录,
|
|
|
+ tmpList, err := models.GetEdbInfoRelationListByChildEdbInfoId(edbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("查询当前计算指标的间接引用关系失败,错误信息:%s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ parentRelationIds := make([]int, 0)
|
|
|
+ for _, v := range tmpList {
|
|
|
+ parentRelationIds = append(parentRelationIds, v.ParentRelationId)
|
|
|
+ }
|
|
|
+ if len(parentRelationIds) > 0 {
|
|
|
+ // 查询单个项目的引用列表作为判断依据
|
|
|
+ oldEdbIdList, err := models.GetEdbInfoRelationEdbIdsByParentRelationId(parentRelationIds[0], edbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("查询当前计算指标的间接引用关系失败,错误信息:%s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sort.Ints(oldEdbIdList)
|
|
|
+ oldEdbIdStr := ""
|
|
|
+ for _, v := range oldEdbIdList {
|
|
|
+ oldEdbIdStr += strconv.Itoa(v) + ","
|
|
|
+ }
|
|
|
+ // 把切片转成字符串
|
|
|
+ if newEdbIdStr == oldEdbIdStr {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ list, e := models.GetEdbInfoRelationByRelationIds(parentRelationIds)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("查询图表关联指标列表失败 Err:%s", e)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //查询直接引用指标关联关系
|
|
|
+ edbInfoListMap := make(map[int]struct{})
|
|
|
+ edbInfoIds := make([]int, 0)
|
|
|
+ for _, v := range list {
|
|
|
+ if _, ok := edbInfoListMap[v.EdbInfoId]; !ok {
|
|
|
+ edbInfoListMap[v.EdbInfoId] = struct{}{}
|
|
|
+ edbInfoIds = append(edbInfoIds, v.EdbInfoId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ edbInfoList := make([]*models.EdbInfo, 0)
|
|
|
+ if len(edbInfoIds) > 0 {
|
|
|
+ // 查询指标信息
|
|
|
+ edbInfoList, err = models.GetEdbInfoByIdList(edbInfoIds)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("查询指标信息失败 Err:%s", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ calculateEdbMappingListMap, calculateEdbMappingIdsMap, err := GetEdbListByEdbInfoId(edbInfoList)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("查询指标关联指标列表失败 Err:%s", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //如何过滤掉只有间接引用,没有直接引用的
|
|
|
+ replaceTotal1, logMsg1, e := UpdateSecondEdbInRelation(list, calculateEdbMappingListMap, calculateEdbMappingIdsMap, edbInfoList)
|
|
|
+ if e != nil {
|
|
|
+ err = e
|
|
|
+ return
|
|
|
+ }
|
|
|
+ replaceTotal += replaceTotal1
|
|
|
+ logMsg += logMsg1
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 更新间接引用
|
|
|
+func UpdateSecondEdbInRelation(list []*models.EdbInfoRelation, calculateEdbMappingListMap map[int]*models.EdbInfoCalculateMapping, calculateEdbMappingIdsMap map[int][]int, edbInfoList []*models.EdbInfo) (replaceTotal int, logMsg string, err error) {
|
|
|
+ nowTime := time.Now()
|
|
|
+ edbInfoRelationIds := make([]int, 0)
|
|
|
+ indexCodeList := make([]string, 0)
|
|
|
+ addList := make([]*models.EdbInfoRelation, 0)
|
|
|
+ refreshIds := make([]int, 0)
|
|
|
+ edbInfoMap := make(map[int]*models.EdbInfo)
|
|
|
+ for _, v := range edbInfoList {
|
|
|
+ edbInfoMap[v.EdbInfoId] = v
|
|
|
+ }
|
|
|
+ // 查询所有的直接引用,删除所有的间接引用,添加所有直接引用的间接引用
|
|
|
+ for _, v := range list {
|
|
|
+ if v.RelationType == 0 {
|
|
|
+ edbInfoRelationIds = append(edbInfoRelationIds, v.EdbInfoRelationId)
|
|
|
+ edbInfo, ok := edbInfoMap[v.EdbInfoId]
|
|
|
+ if !ok {
|
|
|
+ err = fmt.Errorf("查询指标信息失败 EdbInfoId:%d", v.EdbInfoId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if edbInfo.EdbType == 2 { //计算指标
|
|
|
+ childEdbMappingIds, ok := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
|
|
|
+ if !ok {
|
|
|
+ err = fmt.Errorf("查询%d指标关联指标列表为空", edbInfo.EdbInfoId)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, childEdbMappingId := range childEdbMappingIds {
|
|
|
+ childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
|
|
|
+ if !ok2 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ if childEdbMapping.FromSource == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
|
|
|
+ indexCodeList = append(indexCodeList, childEdbMapping.FromEdbCode)
|
|
|
+ }
|
|
|
+ tmp1 := &models.EdbInfoRelation{
|
|
|
+ ReferObjectId: v.ReferObjectId,
|
|
|
+ ReferObjectType: v.ReferObjectType,
|
|
|
+ ReferObjectSubType: v.ReferObjectSubType,
|
|
|
+ EdbInfoId: childEdbMapping.FromEdbInfoId,
|
|
|
+ EdbName: childEdbMapping.FromEdbName,
|
|
|
+ Source: childEdbMapping.FromSource,
|
|
|
+ EdbCode: childEdbMapping.FromEdbCode,
|
|
|
+ CreateTime: nowTime,
|
|
|
+ ModifyTime: nowTime,
|
|
|
+ RelationTime: childEdbMapping.CreateTime,
|
|
|
+ RelationType: 1,
|
|
|
+ RootEdbInfoId: edbInfo.EdbInfoId,
|
|
|
+ ChildEdbInfoId: childEdbMapping.EdbInfoId,
|
|
|
+ }
|
|
|
+ tmp1.RelationCode = fmt.Sprintf("%d_%d_%d_%d", tmp1.RootEdbInfoId, tmp1.ReferObjectId, tmp1.ReferObjectType, tmp1.ReferObjectSubType)
|
|
|
+ addList = append(addList, tmp1)
|
|
|
+ refreshIds = append(refreshIds, childEdbMapping.FromEdbInfoId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if len(edbInfoRelationIds) > 0 {
|
|
|
+ err = models.UpdateSecondRelationEdbInfoId(edbInfoRelationIds, addList, refreshIds, indexCodeList)
|
|
|
+ if err != nil {
|
|
|
+ logMsg = ""
|
|
|
+ err = fmt.Errorf("替换指标引用表中的指标ID失败 Err:%s", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ replaceTotal = len(edbInfoRelationIds)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 设置成禁用状态
|
|
|
+func DisableEdbInfoNoUpdate(edbInfo *models.EdbInfo) (err error) {
|
|
|
+ // 如果一个计算指标里,包涵的基础指标是停用状态,那么计算指标也要是停用状态停用状态
|
|
|
+ newBaseEdbInfoList := make([]int, 0)
|
|
|
+ hasFind := make(map[int]struct{})
|
|
|
+ newBaseEdbInfoIds, err := FindBaseEdbInfo(edbInfo.EdbInfoId, newBaseEdbInfoList, hasFind)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("查找基础指标信息失败,err:%v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 查询是否存在停用指标,如果存在,则计算指标也要是停用状态
|
|
|
+ total, err := models.GetEdbInfoNoUpdateTotalByIdList(newBaseEdbInfoIds)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("查询基础指标信息失败,err:%v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if total > 0 {
|
|
|
+ edbInfo.NoUpdate = 1
|
|
|
+ edbInfo.ModifyTime = time.Now()
|
|
|
+ err = edbInfo.Update([]string{"NoUpdate", "ModifyTime"})
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("更新计算指标刷新状态失败,err:%v", err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 找到基础指标的过程
|
|
|
+func FindBaseEdbInfo(edbInfoId int, baseEdbInfoList []int, hasFind map[int]struct{}) (newBaseEdbInfoList []int, err error) {
|
|
|
+ newBaseEdbInfoList = baseEdbInfoList
|
|
|
+ if _, ok := hasFind[edbInfoId]; ok {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 先找到所有的引用关系
|
|
|
+ //查询当前计算指标最新的引用指标列表
|
|
|
+ newMappingList, err := models.GetEdbInfoCalculateDetailList(edbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("查询当前计算指标最新的指标列表失败,错误信息:%s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ hasFind[edbInfoId] = struct{}{}
|
|
|
+ for _, mapping := range newMappingList {
|
|
|
+ newBaseEdbInfoList = append(newBaseEdbInfoList, mapping.FromEdbInfoId)
|
|
|
+ if mapping.EdbType == 1 { // 如果是基础指标,则加入,否则继续找
|
|
|
+ } else {
|
|
|
+ newBaseEdbInfoList, err = FindBaseEdbInfo(mapping.FromEdbInfoId, newBaseEdbInfoList, hasFind)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// 查找当前计算指标的所有溯源指标
|
|
|
+func GetEdbListByEdbInfoId(edbInfoList []*models.EdbInfo) (edbMappingListMap map[int]*models.EdbInfoCalculateMapping, edbInfoMappingRootIdsMap map[int][]int, err error) {
|
|
|
+ if len(edbInfoList) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ edbInfoIds := make([]int, 0)
|
|
|
+ for _, v := range edbInfoList {
|
|
|
+ if v.EdbType == 2 && v.EdbInfoType == 0 { //普通计算指标,排除预算指标
|
|
|
+ edbInfoIds = append(edbInfoIds, v.EdbInfoId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if len(edbInfoIds) == 0 {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //查询指标信息
|
|
|
+ allEdbMappingMap := make(map[int][]*models.EdbInfoCalculateMappingInfo, 0)
|
|
|
+ allMappingList, e := models.GetEdbInfoCalculateMappingListByEdbInfoIds(edbInfoIds)
|
|
|
+ if e != nil {
|
|
|
+ err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoIds err: %s", e.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ for _, v := range allMappingList {
|
|
|
+ if _, ok := allEdbMappingMap[v.EdbInfoId]; !ok {
|
|
|
+ allEdbMappingMap[v.EdbInfoId] = make([]*models.EdbInfoCalculateMappingInfo, 0)
|
|
|
+ }
|
|
|
+ allEdbMappingMap[v.EdbInfoId] = append(allEdbMappingMap[v.EdbInfoId], v)
|
|
|
+ }
|
|
|
+ //查询指标映射
|
|
|
+ //查询所有指标数据
|
|
|
+ //查询这个指标相关的mapping信息放到数组里,
|
|
|
+ //将得到的指标ID信息放到数组里
|
|
|
+ hasFindMap := make(map[int]struct{})
|
|
|
+ edbInfoIdMap := make(map[int]struct{})
|
|
|
+ edbMappingList := make([]*models.EdbInfoCalculateMapping, 0)
|
|
|
+ edbInfoMappingRootIdsMap = make(map[int][]int, 0)
|
|
|
+ edbMappingMap := make(map[int]struct{})
|
|
|
+ for _, edbInfo := range edbInfoList {
|
|
|
+ if edbInfo.EdbType == 2 && edbInfo.EdbInfoType == 0 {
|
|
|
+ edbInfoId := edbInfo.EdbInfoId
|
|
|
+ edbMappingList, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, 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)
|
|
|
+ }
|
|
|
+ edbMappingListMap = make(map[int]*models.EdbInfoCalculateMapping)
|
|
|
+
|
|
|
+ if len(edbMappingList) > 0 {
|
|
|
+ for _, v := range edbMappingList {
|
|
|
+ edbMappingListMap[v.EdbInfoCalculateMappingId] = v
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+// getCalculateEdbInfoByEdbInfoId 计算指标追溯
|
|
|
+func getCalculateEdbInfoByEdbInfoId(allEdbMappingMap map[int][]*models.EdbInfoCalculateMappingInfo, edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*models.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}, edbInfoMappingRootIdsMap map[int][]int, rootEdbInfoId int) (newEdbMappingList []*models.EdbInfoCalculateMapping, err error) {
|
|
|
+ newEdbMappingList = edbMappingList
|
|
|
+ _, ok := hasFindMap[edbInfoId]
|
|
|
+ if ok {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
|
|
|
+ edbInfoIdMap[edbInfoId] = struct{}{}
|
|
|
+ }
|
|
|
+ edbInfoMappingList := make([]*models.EdbInfoCalculateMappingInfo, 0)
|
|
|
+ edbInfoMappingList, ok = allEdbMappingMap[edbInfoId]
|
|
|
+ if !ok {
|
|
|
+ edbInfoMappingList, err = models.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ hasFindMap[edbInfoId] = struct{}{}
|
|
|
+ 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 := &models.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, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, rootEdbInfoId)
|
|
|
+ if err != nil {
|
|
|
+ err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ hasFindMap[v.FromEdbInfoId] = struct{}{}
|
|
|
+ }
|
|
|
+ edbInfoMappingRootIdsMap[rootEdbInfoId] = append(edbInfoMappingRootIdsMap[rootEdbInfoId], edbInfoMappingIdList...)
|
|
|
+ }
|
|
|
+
|
|
|
+ return
|
|
|
+}
|