edb_info_relation.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package services
  2. import (
  3. "eta/eta_index_lib/models"
  4. "eta/eta_index_lib/services/alarm_msg"
  5. "eta/eta_index_lib/utils"
  6. "fmt"
  7. "strconv"
  8. "strings"
  9. "time"
  10. )
  11. // 重置单个计算指标中的引用关系
  12. func ResetEdbRelation(edbInfoId int) {
  13. var err error
  14. defer func() {
  15. if err != nil {
  16. msg := fmt.Sprintf("重置单个计算指标中的引用关系失败,错误信息:%s", err.Error())
  17. go alarm_msg.SendAlarmMsg(msg, 3)
  18. }
  19. }()
  20. //查询与该计算指标相关的间接引用或者间接引用关系,如果记录不存在,则不处理
  21. _, err = models.GetEdbInfoRelationByChildEdbInfoId(edbInfoId)
  22. if err != nil {
  23. if err.Error() == utils.ErrNoRow() {
  24. err = nil
  25. return
  26. }
  27. err = fmt.Errorf("查询与该计算指标相关的间接引用或者间接引用关系失败,错误信息:%s", err.Error())
  28. return
  29. }
  30. //查询当前计算指标最新的引用指标列表
  31. newMappingList, err := models.GetEdbInfoCalculateDetailList(edbInfoId)
  32. if err != nil {
  33. err = fmt.Errorf("查询当前计算指标最新的指标列表失败,错误信息:%s", err.Error())
  34. return
  35. }
  36. //整理关联的来源指标ID
  37. newEdbIdList := make([]int, 0)
  38. newMappingListMap := make(map[int]*models.EdbInfoCalculateDetail)
  39. for _, v := range newMappingList {
  40. newEdbIdList = append(newEdbIdList, v.FromEdbInfoId)
  41. newMappingListMap[v.FromEdbInfoId] = v
  42. }
  43. // 排序
  44. //二者匹配一下,如果相同,则不处理,如果不同,先查询所有旧的间接引用记录,整理并分组,则删除旧的间接引用记录,新增新的间接引用记录,
  45. relationList, err := models.GetEdbInfoRelationListByChildEdbInfoId(edbInfoId)
  46. if err != nil {
  47. err = fmt.Errorf("查询当前计算指标的间接引用关系失败,错误信息:%s", err.Error())
  48. return
  49. }
  50. deleteRelationIds := make([]int, 0)
  51. // 根据引用对象和直接引用指标 进行分组
  52. groupMap := make(map[string]map[int]*models.EdbInfoRelation)
  53. // 遍历每组内容,
  54. for _, v := range relationList {
  55. //如果指标ID不在新的
  56. if !utils.InArrayByInt(newEdbIdList, v.EdbInfoId) {
  57. deleteRelationIds = append(deleteRelationIds, v.EdbInfoRelationId)
  58. }
  59. name := fmt.Sprintf("%d_%d_%d_%d", v.ReferObjectId, v.ReferObjectType, v.ReferObjectSubType, v.RootEdbInfoId)
  60. childMap, ok := groupMap[name]
  61. if !ok {
  62. childMap = make(map[int]*models.EdbInfoRelation, 0)
  63. }
  64. childMap[v.EdbInfoId] = v
  65. groupMap[name] = childMap
  66. }
  67. // 遍历每组内容,如果新ID不在组内,则添加
  68. addList := make([]*models.EdbInfoRelation, 0)
  69. indexCodeList := make([]string, 0)
  70. refreshEdbIds := make([]int, 0)
  71. nowTime := time.Now()
  72. for name, childMap := range groupMap {
  73. for _, edbId := range newEdbIdList {
  74. if _, ok := childMap[edbId]; !ok {
  75. // 新增记录
  76. childEdb, ok1 := newMappingListMap[edbId]
  77. if !ok1 {
  78. continue
  79. }
  80. // 获取引用时间
  81. relationObjectInfo := strings.Split(name, "_")
  82. objectId, _ := strconv.Atoi(relationObjectInfo[0])
  83. objectType, _ := strconv.Atoi(relationObjectInfo[1])
  84. objectSubType, _ := strconv.Atoi(relationObjectInfo[2])
  85. rootEdbId, _ := strconv.Atoi(relationObjectInfo[3])
  86. tmp1 := &models.EdbInfoRelation{
  87. ReferObjectId: objectId,
  88. ReferObjectType: objectType,
  89. ReferObjectSubType: objectSubType,
  90. EdbInfoId: childEdb.FromEdbInfoId,
  91. EdbName: childEdb.FromEdbName,
  92. Source: childEdb.FromSource,
  93. EdbCode: childEdb.FromEdbCode,
  94. CreateTime: nowTime,
  95. ModifyTime: nowTime,
  96. RelationTime: nowTime,
  97. RelationType: 1,
  98. RootEdbInfoId: rootEdbId,
  99. ChildEdbInfoId: edbInfoId,
  100. }
  101. tmp1.RelationCode = fmt.Sprintf("%d_%d_%d_%d", tmp1.RootEdbInfoId, tmp1.ReferObjectId, tmp1.ReferObjectType, tmp1.ReferObjectSubType)
  102. addList = append(addList, tmp1)
  103. refreshEdbIds = append(refreshEdbIds, childEdb.FromEdbInfoId)
  104. if childEdb.FromSource == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
  105. indexCodeList = append(indexCodeList, childEdb.FromEdbCode)
  106. }
  107. }
  108. }
  109. }
  110. if len(addList) > 0 || len(deleteRelationIds) > 0 {
  111. err = models.AddOrUpdateEdbInfoRelationByChildEdbInfoId(addList, refreshEdbIds, indexCodeList, deleteRelationIds)
  112. if err != nil {
  113. err = fmt.Errorf("新增引用关系失败,err:%v", err)
  114. return
  115. }
  116. }
  117. return
  118. }
  119. // 设置成禁用状态
  120. func DisableEdbInfoNoUpdate(edbInfo *models.EdbInfo) (err error) {
  121. // 如果一个计算指标里,包涵的基础指标是停用状态,那么计算指标也要是停用状态停用状态
  122. newBaseEdbInfoList := make([]int, 0)
  123. hasFind := make(map[int]struct{})
  124. newBaseEdbInfoIds, err := FindBaseEdbInfo(edbInfo.EdbInfoId, newBaseEdbInfoList, hasFind)
  125. if err != nil {
  126. err = fmt.Errorf("查找基础指标信息失败,err:%v", err)
  127. return
  128. }
  129. // 查询是否存在停用指标,如果存在,则计算指标也要是停用状态
  130. total, err := models.GetEdbInfoNoUpdateTotalByIdList(newBaseEdbInfoIds)
  131. if err != nil {
  132. err = fmt.Errorf("查询基础指标信息失败,err:%v", err)
  133. return
  134. }
  135. if total > 0 {
  136. edbInfo.NoUpdate = 1
  137. edbInfo.ModifyTime = time.Now()
  138. err = edbInfo.Update([]string{"NoUpdate", "ModifyTime"})
  139. if err != nil {
  140. err = fmt.Errorf("更新计算指标刷新状态失败,err:%v", err)
  141. return
  142. }
  143. }
  144. return
  145. }
  146. // 找到基础指标的过程
  147. func FindBaseEdbInfo(edbInfoId int, baseEdbInfoList []int, hasFind map[int]struct{}) (newBaseEdbInfoList []int, err error) {
  148. newBaseEdbInfoList = baseEdbInfoList
  149. if _, ok := hasFind[edbInfoId]; ok {
  150. return
  151. }
  152. // 先找到所有的引用关系
  153. //查询当前计算指标最新的引用指标列表
  154. newMappingList, err := models.GetEdbInfoCalculateDetailList(edbInfoId)
  155. if err != nil {
  156. err = fmt.Errorf("查询当前计算指标最新的指标列表失败,错误信息:%s", err.Error())
  157. return
  158. }
  159. hasFind[edbInfoId] = struct{}{}
  160. for _, mapping := range newMappingList {
  161. if mapping.EdbType == 1 { // 如果是基础指标,则加入,否则继续找
  162. newBaseEdbInfoList = append(newBaseEdbInfoList, mapping.FromEdbInfoId)
  163. } else {
  164. newBaseEdbInfoList, err = FindBaseEdbInfo(mapping.FromEdbInfoId, newBaseEdbInfoList, hasFind)
  165. }
  166. }
  167. return
  168. }