edb_info_relation.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352
  1. package services
  2. import (
  3. "eta_gn/eta_index_lib/models"
  4. "eta_gn/eta_index_lib/services/alarm_msg"
  5. "eta_gn/eta_index_lib/utils"
  6. "fmt"
  7. "sort"
  8. "strconv"
  9. "time"
  10. )
  11. func ResetEdbRelation(edbInfoId int) {
  12. var logMsg string
  13. var replaceTotal int
  14. var err error
  15. defer func() {
  16. if err != nil {
  17. msg := fmt.Sprintf(" 重置单个计算指标中的引用关系失败 ResetEdbRelation err: %v", err)
  18. utils.FileLog.Info(msg)
  19. fmt.Println(msg)
  20. go alarm_msg.SendAlarmMsg(msg, 3)
  21. }
  22. if logMsg != `` {
  23. utils.FileLog.Info(fmt.Sprintf("重置单个计算指标中的引用关系失败 重置总数%d,涉及到的引用id:%s", replaceTotal, logMsg))
  24. }
  25. }()
  26. _, err = models.GetEdbInfoRelationByChildEdbInfoId(edbInfoId)
  27. if err != nil {
  28. if err.Error() == utils.ErrNoRow() {
  29. err = nil
  30. return
  31. }
  32. err = fmt.Errorf("查询与该计算指标相关的间接引用或者间接引用关系失败,错误信息:%s", err.Error())
  33. return
  34. }
  35. newMappingList, err := models.GetEdbInfoCalculateDetailList(edbInfoId)
  36. if err != nil {
  37. err = fmt.Errorf("查询当前计算指标最新的指标列表失败,错误信息:%s", err.Error())
  38. return
  39. }
  40. newEdbIdList := make([]string, 0)
  41. newMappingListMap := make(map[int]*models.EdbInfoCalculateDetail)
  42. for _, v := range newMappingList {
  43. newEdbIdList = append(newEdbIdList, strconv.Itoa(v.FromEdbInfoId))
  44. newMappingListMap[v.FromEdbInfoId] = v
  45. }
  46. sort.Strings(newEdbIdList)
  47. newEdbIdStr := ""
  48. for _, v := range newEdbIdList {
  49. newEdbIdStr += v + ","
  50. }
  51. tmpList, err := models.GetEdbInfoRelationListByChildEdbInfoId(edbInfoId)
  52. if err != nil {
  53. err = fmt.Errorf("查询当前计算指标的间接引用关系失败,错误信息:%s", err.Error())
  54. return
  55. }
  56. parentRelationIds := make([]int, 0)
  57. for _, v := range tmpList {
  58. parentRelationIds = append(parentRelationIds, v.ParentRelationId)
  59. }
  60. if len(parentRelationIds) > 0 {
  61. oldEdbIdList, err := models.GetEdbInfoRelationEdbIdsByParentRelationId(parentRelationIds[0], edbInfoId)
  62. if err != nil {
  63. err = fmt.Errorf("查询当前计算指标的间接引用关系失败,错误信息:%s", err.Error())
  64. return
  65. }
  66. sort.Ints(oldEdbIdList)
  67. oldEdbIdStr := ""
  68. for _, v := range oldEdbIdList {
  69. oldEdbIdStr += strconv.Itoa(v) + ","
  70. }
  71. if newEdbIdStr == oldEdbIdStr {
  72. return
  73. }
  74. list, e := models.GetEdbInfoRelationByRelationIds(parentRelationIds)
  75. if e != nil {
  76. err = fmt.Errorf("查询图表关联指标列表失败 Err:%s", e)
  77. return
  78. }
  79. edbInfoListMap := make(map[int]struct{})
  80. edbInfoIds := make([]int, 0)
  81. for _, v := range list {
  82. if _, ok := edbInfoListMap[v.EdbInfoId]; !ok {
  83. edbInfoListMap[v.EdbInfoId] = struct{}{}
  84. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  85. }
  86. }
  87. edbInfoList := make([]*models.EdbInfo, 0)
  88. if len(edbInfoIds) > 0 {
  89. edbInfoList, err = models.GetEdbInfoByIdList(edbInfoIds)
  90. if err != nil {
  91. err = fmt.Errorf("查询指标信息失败 Err:%s", err)
  92. return
  93. }
  94. }
  95. calculateEdbMappingListMap, calculateEdbMappingIdsMap, err := GetEdbListByEdbInfoId(edbInfoList)
  96. if err != nil {
  97. err = fmt.Errorf("查询指标关联指标列表失败 Err:%s", err)
  98. return
  99. }
  100. replaceTotal1, logMsg1, e := UpdateSecondEdbInRelation(list, calculateEdbMappingListMap, calculateEdbMappingIdsMap, edbInfoList)
  101. if e != nil {
  102. err = e
  103. return
  104. }
  105. replaceTotal += replaceTotal1
  106. logMsg += logMsg1
  107. }
  108. return
  109. }
  110. func UpdateSecondEdbInRelation(list []*models.EdbInfoRelation, calculateEdbMappingListMap map[int]*models.EdbInfoCalculateMapping, calculateEdbMappingIdsMap map[int][]int, edbInfoList []*models.EdbInfo) (replaceTotal int, logMsg string, err error) {
  111. nowTime := time.Now()
  112. edbInfoRelationIds := make([]int, 0)
  113. indexCodeList := make([]string, 0)
  114. addList := make([]*models.EdbInfoRelation, 0)
  115. refreshIds := make([]int, 0)
  116. edbInfoMap := make(map[int]*models.EdbInfo)
  117. for _, v := range edbInfoList {
  118. edbInfoMap[v.EdbInfoId] = v
  119. }
  120. for _, v := range list {
  121. if v.RelationType == 0 {
  122. edbInfoRelationIds = append(edbInfoRelationIds, v.EdbInfoRelationId)
  123. edbInfo, ok := edbInfoMap[v.EdbInfoId]
  124. if !ok {
  125. err = fmt.Errorf("查询指标信息失败 EdbInfoId:%d", v.EdbInfoId)
  126. return
  127. }
  128. if edbInfo.EdbType == 2 { //计算指标
  129. childEdbMappingIds, ok := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
  130. if !ok {
  131. err = fmt.Errorf("查询%d指标关联指标列表为空", edbInfo.EdbInfoId)
  132. return
  133. }
  134. for _, childEdbMappingId := range childEdbMappingIds {
  135. childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
  136. if !ok2 {
  137. continue
  138. }
  139. if childEdbMapping.FromSource == utils.DATA_SOURCE_MYSTEEL_CHEMICAL {
  140. indexCodeList = append(indexCodeList, childEdbMapping.FromEdbCode)
  141. }
  142. tmp1 := &models.EdbInfoRelation{
  143. ReferObjectId: v.ReferObjectId,
  144. ReferObjectType: v.ReferObjectType,
  145. ReferObjectSubType: v.ReferObjectSubType,
  146. EdbInfoId: childEdbMapping.FromEdbInfoId,
  147. EdbName: childEdbMapping.FromEdbName,
  148. Source: childEdbMapping.FromSource,
  149. EdbCode: childEdbMapping.FromEdbCode,
  150. CreateTime: nowTime,
  151. ModifyTime: nowTime,
  152. RelationTime: childEdbMapping.CreateTime,
  153. RelationType: 1,
  154. RootEdbInfoId: edbInfo.EdbInfoId,
  155. ChildEdbInfoId: childEdbMapping.EdbInfoId,
  156. }
  157. tmp1.RelationCode = fmt.Sprintf("%d_%d_%d_%d", tmp1.RootEdbInfoId, tmp1.ReferObjectId, tmp1.ReferObjectType, tmp1.ReferObjectSubType)
  158. addList = append(addList, tmp1)
  159. refreshIds = append(refreshIds, childEdbMapping.FromEdbInfoId)
  160. }
  161. }
  162. }
  163. }
  164. if len(edbInfoRelationIds) > 0 {
  165. err = models.UpdateSecondRelationEdbInfoId(edbInfoRelationIds, addList, refreshIds, indexCodeList)
  166. if err != nil {
  167. logMsg = ""
  168. err = fmt.Errorf("替换指标引用表中的指标ID失败 Err:%s", err)
  169. return
  170. }
  171. replaceTotal = len(edbInfoRelationIds)
  172. }
  173. return
  174. }
  175. func DisableEdbInfoNoUpdate(edbInfo *models.EdbInfo) (err error) {
  176. newBaseEdbInfoList := make([]int, 0)
  177. hasFind := make(map[int]struct{})
  178. newBaseEdbInfoIds, err := FindBaseEdbInfo(edbInfo.EdbInfoId, newBaseEdbInfoList, hasFind)
  179. if err != nil {
  180. err = fmt.Errorf("查找基础指标信息失败,err:%v", err)
  181. return
  182. }
  183. total, err := models.GetEdbInfoNoUpdateTotalByIdList(newBaseEdbInfoIds)
  184. if err != nil {
  185. err = fmt.Errorf("查询基础指标信息失败,err:%v", err)
  186. return
  187. }
  188. if total > 0 {
  189. edbInfo.NoUpdate = 1
  190. edbInfo.ModifyTime = time.Now()
  191. err = edbInfo.Update([]string{"NoUpdate", "ModifyTime"})
  192. if err != nil {
  193. err = fmt.Errorf("更新计算指标刷新状态失败,err:%v", err)
  194. return
  195. }
  196. }
  197. return
  198. }
  199. func FindBaseEdbInfo(edbInfoId int, baseEdbInfoList []int, hasFind map[int]struct{}) (newBaseEdbInfoList []int, err error) {
  200. newBaseEdbInfoList = baseEdbInfoList
  201. if _, ok := hasFind[edbInfoId]; ok {
  202. return
  203. }
  204. newMappingList, err := models.GetEdbInfoCalculateDetailList(edbInfoId)
  205. if err != nil {
  206. err = fmt.Errorf("查询当前计算指标最新的指标列表失败,错误信息:%s", err.Error())
  207. return
  208. }
  209. hasFind[edbInfoId] = struct{}{}
  210. for _, mapping := range newMappingList {
  211. newBaseEdbInfoList = append(newBaseEdbInfoList, mapping.FromEdbInfoId)
  212. if mapping.EdbType == 1 { // 如果是基础指标,则加入,否则继续找
  213. } else {
  214. newBaseEdbInfoList, err = FindBaseEdbInfo(mapping.FromEdbInfoId, newBaseEdbInfoList, hasFind)
  215. }
  216. }
  217. return
  218. }
  219. func GetEdbListByEdbInfoId(edbInfoList []*models.EdbInfo) (edbMappingListMap map[int]*models.EdbInfoCalculateMapping, edbInfoMappingRootIdsMap map[int][]int, err error) {
  220. if len(edbInfoList) == 0 {
  221. return
  222. }
  223. edbInfoIds := make([]int, 0)
  224. for _, v := range edbInfoList {
  225. if v.EdbType == 2 && v.EdbInfoType == 0 { //普通计算指标,排除预算指标
  226. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  227. }
  228. }
  229. if len(edbInfoIds) == 0 {
  230. return
  231. }
  232. allEdbMappingMap := make(map[int][]*models.EdbInfoCalculateMappingInfo, 0)
  233. allMappingList, e := models.GetEdbInfoCalculateMappingListByEdbInfoIds(edbInfoIds)
  234. if e != nil {
  235. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoIds err: %s", e.Error())
  236. return
  237. }
  238. for _, v := range allMappingList {
  239. if _, ok := allEdbMappingMap[v.EdbInfoId]; !ok {
  240. allEdbMappingMap[v.EdbInfoId] = make([]*models.EdbInfoCalculateMappingInfo, 0)
  241. }
  242. allEdbMappingMap[v.EdbInfoId] = append(allEdbMappingMap[v.EdbInfoId], v)
  243. }
  244. hasFindMap := make(map[int]struct{})
  245. edbInfoIdMap := make(map[int]struct{})
  246. edbMappingList := make([]*models.EdbInfoCalculateMapping, 0)
  247. edbInfoMappingRootIdsMap = make(map[int][]int, 0)
  248. edbMappingMap := make(map[int]struct{})
  249. for _, edbInfo := range edbInfoList {
  250. if edbInfo.EdbType == 2 && edbInfo.EdbInfoType == 0 {
  251. edbInfoId := edbInfo.EdbInfoId
  252. edbMappingList, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, edbInfoId)
  253. if err != nil {
  254. err = fmt.Errorf(" GetCalculateEdbInfoByEdbInfoId err: %s", err.Error())
  255. return
  256. }
  257. }
  258. }
  259. if len(edbMappingList) == 0 {
  260. return
  261. }
  262. edbInfoIdList := make([]int, 0)
  263. for k, _ := range edbInfoIdMap {
  264. edbInfoIdList = append(edbInfoIdList, k)
  265. }
  266. edbMappingListMap = make(map[int]*models.EdbInfoCalculateMapping)
  267. if len(edbMappingList) > 0 {
  268. for _, v := range edbMappingList {
  269. edbMappingListMap[v.EdbInfoCalculateMappingId] = v
  270. }
  271. }
  272. return
  273. }
  274. 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) {
  275. newEdbMappingList = edbMappingList
  276. _, ok := hasFindMap[edbInfoId]
  277. if ok {
  278. return
  279. }
  280. if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
  281. edbInfoIdMap[edbInfoId] = struct{}{}
  282. }
  283. edbInfoMappingList := make([]*models.EdbInfoCalculateMappingInfo, 0)
  284. edbInfoMappingList, ok = allEdbMappingMap[edbInfoId]
  285. if !ok {
  286. edbInfoMappingList, err = models.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  287. if err != nil {
  288. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", err.Error())
  289. return
  290. }
  291. }
  292. hasFindMap[edbInfoId] = struct{}{}
  293. if len(edbInfoMappingList) > 0 {
  294. fromEdbInfoIdList := make([]int, 0)
  295. edbInfoMappingIdList := make([]int, 0)
  296. for _, v := range edbInfoMappingList {
  297. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  298. edbInfoMappingIdList = append(edbInfoMappingIdList, v.EdbInfoCalculateMappingId)
  299. if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
  300. edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
  301. }
  302. if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
  303. edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
  304. tmp := &models.EdbInfoCalculateMapping{
  305. EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
  306. EdbInfoId: v.EdbInfoId,
  307. Source: v.Source,
  308. SourceName: v.SourceName,
  309. EdbCode: v.EdbCode,
  310. FromEdbInfoId: v.FromEdbInfoId,
  311. FromEdbCode: v.FromEdbCode,
  312. FromEdbName: v.FromEdbName,
  313. FromSource: v.FromSource,
  314. FromSourceName: v.FromSourceName,
  315. FromTag: v.FromTag,
  316. Sort: v.Sort,
  317. CreateTime: v.CreateTime,
  318. ModifyTime: v.ModifyTime,
  319. }
  320. newEdbMappingList = append(newEdbMappingList, tmp)
  321. }
  322. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  323. if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
  324. newEdbMappingList, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, rootEdbInfoId)
  325. if err != nil {
  326. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", err.Error())
  327. return
  328. }
  329. }
  330. }
  331. hasFindMap[v.FromEdbInfoId] = struct{}{}
  332. }
  333. edbInfoMappingRootIdsMap[rootEdbInfoId] = append(edbInfoMappingRootIdsMap[rootEdbInfoId], edbInfoMappingIdList...)
  334. }
  335. return
  336. }