edb_relation.go 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144
  1. package services
  2. import (
  3. "encoding/json"
  4. "eta/eta_task/models/data_manage"
  5. "eta/eta_task/models/data_manage/cross_variety"
  6. "eta/eta_task/models/data_manage/excel"
  7. "eta/eta_task/models/fe_calendar"
  8. "eta/eta_task/models/sandbox"
  9. "eta/eta_task/services/alarm_msg"
  10. "eta/eta_task/utils"
  11. "fmt"
  12. "time"
  13. )
  14. func InitEdbRelation() {
  15. //InitChartEdbRelation()
  16. //InitChartCrossVariety()
  17. //initCalendarIndicatorRelation()
  18. //initSandBoxEdbRelation()
  19. InitExcelEdbRelation()
  20. }
  21. func InitChartEdbRelation() {
  22. fmt.Println("开始处理图表中的指标引用")
  23. var err error
  24. var addNum int
  25. defer func() {
  26. if err != nil {
  27. msg := fmt.Sprintf("初始化指标在图表中的引用失败 InitChartEdbRelation err: %v", err)
  28. utils.FileLog.Info(msg)
  29. fmt.Println(msg)
  30. go alarm_msg.SendAlarmMsg(msg, 3)
  31. }
  32. }()
  33. //查询chart_edb_mapping 表
  34. total, err := data_manage.GetChartEdbMappingTotal()
  35. if err != nil {
  36. err = fmt.Errorf("查询图表关联指标失败 err: %v", err)
  37. return
  38. }
  39. if total == 0 {
  40. return
  41. }
  42. //分页查询,每次处理500条记录
  43. pageSize := 500
  44. totalPage := (total + pageSize - 1) / pageSize // 使用整数除法,并添加一页以防有余数
  45. addList := make([]*data_manage.EdbInfoRelation, 0)
  46. //查询图表列表
  47. for i := 0; i < totalPage; i += 1 {
  48. startSize := i * pageSize
  49. list, e := data_manage.GetChartEdbMappingList(startSize, pageSize)
  50. if e != nil {
  51. err = fmt.Errorf("查询图表关联指标列表失败 Err:%s", e)
  52. return
  53. }
  54. if len(list) == 0 {
  55. break
  56. }
  57. edbInfoIds := make([]int, 0)
  58. for _, v := range list {
  59. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  60. }
  61. // 查询指标信息表
  62. edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  63. if e != nil {
  64. err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
  65. return
  66. }
  67. if len(edbInfoList) == 0 {
  68. continue
  69. }
  70. // 查询计算指标信息,并且建立关联关系
  71. // 查询间接引用的指标信息
  72. calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
  73. if e != nil {
  74. err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
  75. return
  76. }
  77. // 查询指标间接引用
  78. edbInfoMap := make(map[int]*data_manage.EdbInfo)
  79. for _, v := range edbInfoList {
  80. edbInfoMap[v.EdbInfoId] = v
  81. }
  82. // 筛选有用的图表
  83. finalList := make([]*data_manage.ChartEdbMapping, 0)
  84. chartIds := make([]int, 0)
  85. for _, v := range list {
  86. if _, ok2 := edbInfoMap[v.EdbInfoId]; !ok2 {
  87. continue
  88. }
  89. finalList = append(finalList, v)
  90. chartIds = append(chartIds, v.ChartInfoId)
  91. }
  92. if len(chartIds) == 0 {
  93. continue
  94. }
  95. // 查询图表信息
  96. chartInfoList, e := data_manage.GetChartInfoByChartInfoIds(chartIds)
  97. if e != nil {
  98. err = fmt.Errorf("查询图表信息列表失败 Err:%s", e)
  99. return
  100. }
  101. chartInfoMap := make(map[int]*data_manage.ChartInfo)
  102. for _, v := range chartInfoList {
  103. chartInfoMap[v.ChartInfoId] = v
  104. }
  105. //查询引用关系列表,
  106. chartEdbRelationList, e := data_manage.GetEdbInfoRelationByReferObjectIds(chartIds, utils.EDB_RELATION_CHART)
  107. if e != nil {
  108. err = fmt.Errorf("查询图表引用关系列表失败 Err:%s", e)
  109. return
  110. }
  111. existRelationMap := make(map[string]struct{})
  112. for _, v := range chartEdbRelationList {
  113. name := fmt.Sprintf("%d-%d", v.ReferObjectId, v.EdbInfoId)
  114. existRelationMap[name] = struct{}{}
  115. }
  116. for _, v := range finalList {
  117. nowTime := time.Now()
  118. name := fmt.Sprintf("%d-%d", v.ChartInfoId, v.EdbInfoId)
  119. if _, ok := existRelationMap[name]; !ok {
  120. //查询图表信息
  121. chartInfo, ok1 := chartInfoMap[v.ChartInfoId]
  122. if !ok1 {
  123. continue
  124. }
  125. edbInfo, ok2 := edbInfoMap[v.EdbInfoId]
  126. if !ok2 {
  127. continue
  128. }
  129. //todo 引用时间
  130. tmp := &data_manage.EdbInfoRelation{
  131. ReferObjectId: v.ChartInfoId,
  132. ReferObjectType: utils.EDB_RELATION_CHART,
  133. ReferObjectSubType: chartInfo.Source,
  134. EdbInfoId: v.EdbInfoId,
  135. EdbName: edbInfo.EdbName,
  136. Source: edbInfo.Source,
  137. EdbCode: edbInfo.EdbCode,
  138. CreateTime: nowTime,
  139. ModifyTime: nowTime,
  140. RelationTime: v.CreateTime,
  141. }
  142. addList = append(addList, tmp)
  143. existRelationMap[name] = struct{}{}
  144. // 添加间接引用记录
  145. if edbInfo.EdbType == 2 {
  146. childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
  147. if !ok1 {
  148. continue
  149. }
  150. for _, childEdbMappingId := range childEdbMappingIds {
  151. childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
  152. if !ok2 {
  153. continue
  154. }
  155. name1 := fmt.Sprintf("%d-%d", v.ChartInfoId, childEdbMapping.FromEdbInfoId)
  156. if _, ok2 := existRelationMap[name1]; !ok2 { //如果已经被直接引用了,则无需添加到间接引用记录中
  157. continue
  158. }
  159. childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
  160. if !ok2 {
  161. continue
  162. }
  163. tmp1 := &data_manage.EdbInfoRelation{
  164. ReferObjectId: v.ChartInfoId,
  165. ReferObjectType: utils.EDB_RELATION_CHART,
  166. ReferObjectSubType: chartInfo.Source,
  167. EdbInfoId: childEdb.EdbInfoId,
  168. EdbName: childEdb.EdbName,
  169. Source: childEdb.Source,
  170. EdbCode: childEdb.EdbCode,
  171. CreateTime: nowTime,
  172. ModifyTime: nowTime,
  173. RelationTime: v.CreateTime,
  174. RelationType: 1,
  175. RootEdbInfoId: edbInfo.EdbInfoId,
  176. ChildEdbInfoId: childEdbMapping.EdbInfoId,
  177. }
  178. addList = append(addList, tmp1)
  179. // todo 防止重复
  180. }
  181. }
  182. if len(addList) > pageSize {
  183. err = data_manage.AddEdbInfoRelationMulti(addList)
  184. if err != nil {
  185. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  186. return
  187. }
  188. addNum += len(addList)
  189. addList = make([]*data_manage.EdbInfoRelation, 0)
  190. }
  191. }
  192. }
  193. }
  194. //拿到500个数据ID,判断相关的引用记录,如果已存在则直接过滤,不存在则新增
  195. if len(addList) > 0 {
  196. err = data_manage.AddEdbInfoRelationMulti(addList)
  197. if err != nil {
  198. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  199. return
  200. }
  201. addNum += len(addList)
  202. }
  203. fmt.Printf("图表指标引用记录处理完成, 新增%d条记录\n", addNum)
  204. return
  205. }
  206. // InitChartCrossVariety 处理特殊图表,跨品种分析图表
  207. func InitChartCrossVariety() {
  208. fmt.Println("开始跨品种分析图表中的指标引用")
  209. var addNum int
  210. var err error
  211. defer func() {
  212. if err != nil {
  213. msg := fmt.Sprintf("初始化指标在跨品种分析图表中的引用失败 InitChartCrossVariety err: %v", err)
  214. utils.FileLog.Info(msg)
  215. fmt.Println(msg)
  216. go alarm_msg.SendAlarmMsg(msg, 3)
  217. }
  218. }()
  219. total, err := cross_variety.GetChartInfoCrossVarietyTotal()
  220. if err != nil {
  221. err = fmt.Errorf("查询图表关联指标失败 err: %v", err)
  222. return
  223. }
  224. if total == 0 {
  225. return
  226. }
  227. //分页查询,每次处理500条记录
  228. pageSize := 500
  229. totalPage := (total + pageSize - 1) / pageSize // 使用整数除法,并添加一页以防有余数
  230. addList := make([]*data_manage.EdbInfoRelation, 0)
  231. //查询图表列表
  232. for i := 0; i < totalPage; i += 1 {
  233. startSize := i * pageSize
  234. list, e := cross_variety.GetChartInfoCrossVarietyList(startSize, pageSize)
  235. if e != nil {
  236. err = fmt.Errorf("查询图表关联指标列表失败 Err:%s", e)
  237. return
  238. }
  239. if len(list) == 0 {
  240. break
  241. }
  242. chartIds := make([]int, 0)
  243. tagIds := make([]int, 0)
  244. tagIdsMap := make(map[int]struct{})
  245. tagChartMap := make(map[int][]*cross_variety.ChartInfoCrossVariety)
  246. for _, v := range list {
  247. if _, ok := tagIdsMap[v.ChartXTagId]; !ok {
  248. tagIds = append(tagIds, v.ChartXTagId)
  249. tagIdsMap[v.ChartXTagId] = struct{}{}
  250. }
  251. if _, ok := tagIdsMap[v.ChartYTagId]; !ok {
  252. tagIds = append(tagIds, v.ChartYTagId)
  253. tagIdsMap[v.ChartYTagId] = struct{}{}
  254. }
  255. if chartCross, ok := tagChartMap[v.ChartXTagId]; ok {
  256. chartCross = append(chartCross, v)
  257. tagChartMap[v.ChartXTagId] = chartCross
  258. } else {
  259. chartCross = make([]*cross_variety.ChartInfoCrossVariety, 0)
  260. chartCross = append(chartCross, v)
  261. tagChartMap[v.ChartXTagId] = chartCross
  262. }
  263. if chartCross, ok := tagChartMap[v.ChartYTagId]; ok {
  264. chartCross = append(chartCross, v)
  265. tagChartMap[v.ChartYTagId] = chartCross
  266. } else {
  267. chartCross = make([]*cross_variety.ChartInfoCrossVariety, 0)
  268. chartCross = append(chartCross, v)
  269. tagChartMap[v.ChartYTagId] = chartCross
  270. }
  271. }
  272. chartTagVarietyList, e := cross_variety.GetChartTagVarietyEdbInfoIdsByTagIds(tagIds)
  273. if e != nil {
  274. err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
  275. return
  276. }
  277. edbInfoIds := make([]int, 0)
  278. chartTagVarietyMap := make(map[int][]*cross_variety.ChartTagVariety)
  279. for _, v := range chartTagVarietyList {
  280. if tagList, ok := chartTagVarietyMap[v.EdbInfoId]; ok {
  281. tagList = append(tagList, v)
  282. chartTagVarietyMap[v.EdbInfoId] = tagList
  283. } else {
  284. tagList = make([]*cross_variety.ChartTagVariety, 0)
  285. tagList = append(tagList, v)
  286. chartTagVarietyMap[v.EdbInfoId] = tagList
  287. }
  288. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  289. }
  290. // 查询指标信息表
  291. edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  292. if e != nil {
  293. err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
  294. return
  295. }
  296. if len(edbInfoList) == 0 {
  297. continue
  298. }
  299. // 查询计算指标信息,并且建立关联关系
  300. // 查询间接引用的指标信息
  301. calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
  302. if e != nil {
  303. err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
  304. return
  305. }
  306. edbInfoMap := make(map[int]*data_manage.EdbInfo)
  307. chartInfoCrossMap := make(map[int]struct{})
  308. chartInfoCrossList := make([]*cross_variety.ChartInfoCrossVariety, 0)
  309. edbCrossMap := make(map[int][]*cross_variety.ChartInfoCrossVariety)
  310. for _, v := range edbInfoList {
  311. edbInfoMap[v.EdbInfoId] = v
  312. if tagList, ok := chartTagVarietyMap[v.EdbInfoId]; ok {
  313. for _, tag := range tagList {
  314. if chartCross, ok2 := tagChartMap[tag.ChartTagId]; ok2 {
  315. for _, crossItem := range chartCross {
  316. if _, ok3 := chartInfoCrossMap[crossItem.ChartInfoId]; !ok3 {
  317. chartInfoCrossMap[crossItem.ChartInfoId] = struct{}{}
  318. chartInfoCrossList = append(chartInfoCrossList, crossItem)
  319. chartIds = append(chartIds, crossItem.ChartInfoId)
  320. }
  321. }
  322. }
  323. }
  324. }
  325. edbCrossMap[v.EdbInfoId] = chartInfoCrossList
  326. chartInfoCrossMap = make(map[int]struct{})
  327. chartInfoCrossList = make([]*cross_variety.ChartInfoCrossVariety, 0)
  328. }
  329. /*// 查询图表信息
  330. chartInfoList, e := data_manage.GetChartInfoByChartInfoIds(chartIds)
  331. if e != nil {
  332. err = fmt.Errorf("查询图表信息列表失败 Err:%s", e)
  333. return
  334. }
  335. chartInfoMap := make(map[int]*data_manage.ChartInfo)
  336. for _, v := range chartInfoList {
  337. chartInfoMap[v.ChartInfoId] = v
  338. }
  339. */
  340. //查询引用关系列表,
  341. chartEdbRelationList, e := data_manage.GetEdbInfoRelationByReferObjectIds(chartIds, utils.EDB_RELATION_CHART)
  342. if e != nil {
  343. err = fmt.Errorf("查询图表引用关系列表失败 Err:%s", e)
  344. return
  345. }
  346. existRelationMap := make(map[string]struct{})
  347. for _, v := range chartEdbRelationList {
  348. name := fmt.Sprintf("%d-%d", v.ReferObjectId, v.EdbInfoId)
  349. existRelationMap[name] = struct{}{}
  350. }
  351. for edbInfoId, chartCrossList := range edbCrossMap {
  352. nowTime := time.Now()
  353. for _, item := range chartCrossList {
  354. name := fmt.Sprintf("%d-%d", item.ChartInfoId, edbInfoId)
  355. if _, ok1 := existRelationMap[name]; !ok1 {
  356. edbInfo, ok2 := edbInfoMap[edbInfoId]
  357. if !ok2 {
  358. continue
  359. }
  360. //todo 引用时间
  361. tmp := &data_manage.EdbInfoRelation{
  362. ReferObjectId: item.ChartInfoId,
  363. ReferObjectType: utils.EDB_RELATION_CHART,
  364. ReferObjectSubType: utils.CHART_SOURCE_CROSS_HEDGING,
  365. EdbInfoId: edbInfoId,
  366. EdbName: edbInfo.EdbName,
  367. Source: edbInfo.Source,
  368. EdbCode: edbInfo.EdbCode,
  369. CreateTime: nowTime,
  370. ModifyTime: nowTime,
  371. RelationTime: item.CreateTime,
  372. }
  373. addList = append(addList, tmp)
  374. existRelationMap[name] = struct{}{}
  375. // 添加间接引用记录
  376. if edbInfo.EdbType == 2 {
  377. childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
  378. if !ok1 {
  379. continue
  380. }
  381. for _, childEdbMappingId := range childEdbMappingIds {
  382. childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
  383. if !ok2 {
  384. continue
  385. }
  386. name1 := fmt.Sprintf("%d-%d", item.ChartInfoId, childEdbMapping.FromEdbInfoId)
  387. if _, ok2 := existRelationMap[name1]; !ok2 { //如果已经被直接引用了,则无需添加到间接引用记录中
  388. continue
  389. }
  390. childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
  391. if !ok2 {
  392. continue
  393. }
  394. tmp1 := &data_manage.EdbInfoRelation{
  395. ReferObjectId: item.ChartInfoId,
  396. ReferObjectType: utils.EDB_RELATION_CHART,
  397. ReferObjectSubType: utils.CHART_SOURCE_CROSS_HEDGING,
  398. EdbInfoId: childEdb.EdbInfoId,
  399. EdbName: childEdb.EdbName,
  400. Source: childEdb.Source,
  401. EdbCode: childEdb.EdbCode,
  402. CreateTime: nowTime,
  403. ModifyTime: nowTime,
  404. RelationTime: item.CreateTime,
  405. RelationType: 1,
  406. RootEdbInfoId: edbInfo.EdbInfoId,
  407. ChildEdbInfoId: childEdbMapping.EdbInfoId,
  408. }
  409. addList = append(addList, tmp1)
  410. // todo 防止重复
  411. }
  412. }
  413. if len(addList) > pageSize {
  414. err = data_manage.AddEdbInfoRelationMulti(addList)
  415. if err != nil {
  416. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  417. return
  418. }
  419. addNum += len(addList)
  420. addList = make([]*data_manage.EdbInfoRelation, 0)
  421. }
  422. }
  423. }
  424. }
  425. }
  426. //拿到500个数据ID,判断相关的引用记录,如果已存在则直接过滤,不存在则新增
  427. if len(addList) > 0 {
  428. err = data_manage.AddEdbInfoRelationMulti(addList)
  429. if err != nil {
  430. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  431. return
  432. }
  433. addNum += len(addList)
  434. }
  435. fmt.Printf("跨品种分析图表指标引用记录处理完成, 新增%d条记录\n", addNum)
  436. return
  437. }
  438. // 初始化事件日历中的指标引用
  439. func initCalendarIndicatorRelation() {
  440. fmt.Println("开始处理事件日历中的指标引用")
  441. var addNum int
  442. var err error
  443. defer func() {
  444. if err != nil {
  445. msg := fmt.Sprintf("初始化指标在事件日历中的引用失败 initCalendarIndicatorRelation err: %v", err)
  446. utils.FileLog.Info(msg)
  447. fmt.Println(msg)
  448. go alarm_msg.SendAlarmMsg(msg, 3)
  449. }
  450. }()
  451. //查询chart_edb_mapping 表
  452. obj := new(fe_calendar.FeCalendarMatter)
  453. condition := " AND edb_info_id > 0"
  454. total, err := obj.GetCountByCondition(condition, []interface{}{})
  455. if err != nil {
  456. err = fmt.Errorf("查询事件日历关联指标失败 err: %v", err)
  457. return
  458. }
  459. if total == 0 {
  460. return
  461. }
  462. //分页查询,每次处理500条记录
  463. pageSize := 500
  464. totalPage := (total + pageSize - 1) / pageSize // 使用整数除法,并添加一页以防有余数
  465. addList := make([]*data_manage.EdbInfoRelation, 0)
  466. //查询图表列表
  467. for i := 0; i < totalPage; i += 1 {
  468. startSize := i * pageSize
  469. list, e := obj.GetPageItemsByCondition(condition, []interface{}{}, []string{}, "", startSize, pageSize)
  470. if e != nil {
  471. err = fmt.Errorf("查询事件日历关联指标列表失败 Err:%s", e)
  472. return
  473. }
  474. if len(list) == 0 {
  475. break
  476. }
  477. edbInfoIds := make([]int, 0)
  478. edbInfoMatterMap := make(map[int][]*fe_calendar.FeCalendarMatter)
  479. for _, v := range list {
  480. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  481. items, ok := edbInfoMatterMap[v.EdbInfoId]
  482. if ok {
  483. items = append(items, v)
  484. edbInfoMatterMap[v.EdbInfoId] = items
  485. } else {
  486. items = make([]*fe_calendar.FeCalendarMatter, 0)
  487. items = append(items, v)
  488. edbInfoMatterMap[v.EdbInfoId] = items
  489. }
  490. }
  491. // 查询指标信息表
  492. edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  493. if e != nil {
  494. err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
  495. return
  496. }
  497. if len(edbInfoList) == 0 {
  498. continue
  499. }
  500. // 查询计算指标信息,并且建立关联关系
  501. // 查询间接引用的指标信息
  502. calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
  503. if e != nil {
  504. err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
  505. return
  506. }
  507. edbInfoMap := make(map[int]*data_manage.EdbInfo)
  508. matterIds := make([]int, 0)
  509. for _, v := range edbInfoList {
  510. edbInfoMap[v.EdbInfoId] = v
  511. items, ok := edbInfoMatterMap[v.EdbInfoId]
  512. if ok {
  513. for _, item := range items {
  514. matterIds = append(matterIds, item.FeCalendarMatterId)
  515. }
  516. }
  517. }
  518. //查询引用关系列表,
  519. chartEdbRelationList, e := data_manage.GetEdbInfoRelationByReferObjectIds(matterIds, utils.EDB_RELATION_CALENDAR)
  520. if e != nil {
  521. err = fmt.Errorf("查询图表引用关系列表失败 Err:%s", e)
  522. return
  523. }
  524. existRelationMap := make(map[string]struct{})
  525. for _, v := range chartEdbRelationList {
  526. name := fmt.Sprintf("%d-%d", v.ReferObjectId, v.EdbInfoId)
  527. existRelationMap[name] = struct{}{}
  528. }
  529. for edbInfoId, edbInfo := range edbInfoMap {
  530. nowTime := time.Now()
  531. items, ok := edbInfoMatterMap[edbInfoId]
  532. if ok {
  533. for _, v := range items {
  534. name := fmt.Sprintf("%d-%d", v.FeCalendarMatterId, v.EdbInfoId)
  535. if _, ok1 := existRelationMap[name]; !ok1 {
  536. //todo 引用时间
  537. tmp := &data_manage.EdbInfoRelation{
  538. ReferObjectId: v.FeCalendarMatterId,
  539. ReferObjectType: utils.EDB_RELATION_CALENDAR,
  540. EdbInfoId: v.EdbInfoId,
  541. EdbName: edbInfo.EdbName,
  542. Source: edbInfo.Source,
  543. EdbCode: edbInfo.EdbCode,
  544. CreateTime: nowTime,
  545. ModifyTime: nowTime,
  546. RelationTime: v.CreateTime,
  547. }
  548. addList = append(addList, tmp)
  549. existRelationMap[name] = struct{}{}
  550. // 添加间接引用记录
  551. if edbInfo.EdbType == 2 {
  552. childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
  553. if !ok1 {
  554. continue
  555. }
  556. for _, childEdbMappingId := range childEdbMappingIds {
  557. childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
  558. if !ok2 {
  559. continue
  560. }
  561. name1 := fmt.Sprintf("%d-%d", v.FeCalendarMatterId, childEdbMapping.FromEdbInfoId)
  562. if _, ok2 := existRelationMap[name1]; !ok2 { //如果已经被直接引用了,则无需添加到间接引用记录中
  563. continue
  564. }
  565. childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
  566. if !ok2 {
  567. continue
  568. }
  569. tmp1 := &data_manage.EdbInfoRelation{
  570. ReferObjectId: v.FeCalendarMatterId,
  571. ReferObjectType: utils.EDB_RELATION_CALENDAR,
  572. EdbInfoId: childEdb.EdbInfoId,
  573. EdbName: childEdb.EdbName,
  574. Source: childEdb.Source,
  575. EdbCode: childEdb.EdbCode,
  576. CreateTime: nowTime,
  577. ModifyTime: nowTime,
  578. RelationTime: v.CreateTime,
  579. RelationType: 1,
  580. RootEdbInfoId: edbInfo.EdbInfoId,
  581. ChildEdbInfoId: childEdbMapping.EdbInfoId,
  582. }
  583. addList = append(addList, tmp1)
  584. // todo 防止重复
  585. }
  586. }
  587. if len(addList) > pageSize {
  588. err = data_manage.AddEdbInfoRelationMulti(addList)
  589. if err != nil {
  590. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  591. return
  592. }
  593. addNum += len(addList)
  594. addList = make([]*data_manage.EdbInfoRelation, 0)
  595. }
  596. }
  597. }
  598. }
  599. }
  600. }
  601. //拿到500个数据ID,判断相关的引用记录,如果已存在则直接过滤,不存在则新增
  602. if len(addList) > 0 {
  603. err = data_manage.AddEdbInfoRelationMulti(addList)
  604. if err != nil {
  605. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  606. return
  607. }
  608. addNum += len(addList)
  609. }
  610. fmt.Printf("事件日历指标引用记录处理完成, 新增%d条记录\n", addNum)
  611. return
  612. }
  613. // 初始化表格中的指标引用
  614. func InitExcelEdbRelation() {
  615. fmt.Println("开始处理表格中的指标引用")
  616. var err error
  617. var addNum int
  618. defer func() {
  619. if err != nil {
  620. msg := fmt.Sprintf("初始化指标在表格中的引用失败 InitChartEdbRelation err: %v", err)
  621. utils.FileLog.Info(msg)
  622. fmt.Println(msg)
  623. go alarm_msg.SendAlarmMsg(msg, 3)
  624. }
  625. }()
  626. //查询表格指标绑定表
  627. sources := []int{utils.TIME_TABLE, utils.MIXED_TABLE, utils.BALANCE_TABLE}
  628. total, err := excel.GetExcelEdbMappingTotalBySource(sources)
  629. if err != nil {
  630. err = fmt.Errorf("查询表格关联指标失败 err: %v", err)
  631. return
  632. }
  633. if total == 0 {
  634. return
  635. }
  636. //分页查询,每次处理100条记录
  637. pageSize := 100
  638. totalPage := (total + pageSize - 1) / pageSize // 使用整数除法,并添加一页以防有余数
  639. addList := make([]*data_manage.EdbInfoRelation, 0)
  640. //查询表格列表
  641. for i := 0; i < totalPage; i += 1 {
  642. startSize := i * pageSize
  643. list, e := excel.GetExcelEdbMappingListBySource(sources, startSize, pageSize)
  644. if e != nil {
  645. err = fmt.Errorf("查询表格关联指标列表失败 Err:%s", e)
  646. return
  647. }
  648. if len(list) == 0 {
  649. break
  650. }
  651. edbInfoIds := make([]int, 0)
  652. for _, v := range list {
  653. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  654. }
  655. // 查询指标信息表
  656. edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  657. if e != nil {
  658. err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
  659. return
  660. }
  661. if len(edbInfoList) == 0 {
  662. continue
  663. }
  664. // 查询计算指标信息,并且建立关联关系
  665. // 查询间接引用的指标信息
  666. calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
  667. if e != nil {
  668. err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
  669. return
  670. }
  671. // 查询指标间接引用
  672. edbInfoMap := make(map[int]*data_manage.EdbInfo)
  673. for _, v := range edbInfoList {
  674. edbInfoMap[v.EdbInfoId] = v
  675. }
  676. // 筛选有用的表格
  677. excelIds := make([]int, 0)
  678. for _, v := range list {
  679. excelIds = append(excelIds, v.ExcelInfoId)
  680. }
  681. //查询引用关系列表,
  682. chartEdbRelationList, e := data_manage.GetEdbInfoRelationByReferObjectIds(excelIds, utils.EDB_RELATION_TABLE)
  683. if e != nil {
  684. err = fmt.Errorf("查询表格引用关系列表失败 Err:%s", e)
  685. return
  686. }
  687. existRelationMap := make(map[string]struct{})
  688. for _, v := range chartEdbRelationList {
  689. name := fmt.Sprintf("%d-%d", v.ReferObjectId, v.EdbInfoId)
  690. existRelationMap[name] = struct{}{}
  691. }
  692. for _, v := range list {
  693. nowTime := time.Now()
  694. name := fmt.Sprintf("%d-%d", v.ExcelInfoId, v.EdbInfoId)
  695. if _, ok := existRelationMap[name]; !ok {
  696. edbInfo, ok2 := edbInfoMap[v.EdbInfoId]
  697. if !ok2 {
  698. continue
  699. }
  700. //todo 引用时间
  701. tmp := &data_manage.EdbInfoRelation{
  702. ReferObjectId: v.ExcelInfoId,
  703. ReferObjectType: utils.EDB_RELATION_TABLE,
  704. ReferObjectSubType: v.Source,
  705. EdbInfoId: v.EdbInfoId,
  706. EdbName: edbInfo.EdbName,
  707. Source: edbInfo.Source,
  708. EdbCode: edbInfo.EdbCode,
  709. CreateTime: nowTime,
  710. ModifyTime: nowTime,
  711. RelationTime: v.CreateTime,
  712. }
  713. addList = append(addList, tmp)
  714. existRelationMap[name] = struct{}{}
  715. // 添加间接引用记录
  716. if edbInfo.EdbType == 2 {
  717. childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
  718. if !ok1 {
  719. continue
  720. }
  721. for _, childEdbMappingId := range childEdbMappingIds {
  722. childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
  723. if !ok2 {
  724. continue
  725. }
  726. name1 := fmt.Sprintf("%d-%d", v.ExcelInfoId, childEdbMapping.FromEdbInfoId)
  727. if _, ok2 := existRelationMap[name1]; !ok2 { //如果已经被直接引用了,则无需添加到间接引用记录中
  728. continue
  729. }
  730. childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
  731. if !ok2 {
  732. continue
  733. }
  734. tmp1 := &data_manage.EdbInfoRelation{
  735. ReferObjectId: v.ExcelInfoId,
  736. ReferObjectType: utils.EDB_RELATION_TABLE,
  737. ReferObjectSubType: v.Source,
  738. EdbInfoId: childEdb.EdbInfoId,
  739. EdbName: childEdb.EdbName,
  740. Source: childEdb.Source,
  741. EdbCode: childEdb.EdbCode,
  742. CreateTime: nowTime,
  743. ModifyTime: nowTime,
  744. RelationTime: v.CreateTime,
  745. RelationType: 1,
  746. RootEdbInfoId: edbInfo.EdbInfoId,
  747. ChildEdbInfoId: childEdbMapping.EdbInfoId,
  748. }
  749. addList = append(addList, tmp1)
  750. // todo 防止重复
  751. }
  752. }
  753. if len(addList) > pageSize {
  754. err = data_manage.AddEdbInfoRelationMulti(addList)
  755. if err != nil {
  756. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  757. return
  758. }
  759. addNum += len(addList)
  760. addList = make([]*data_manage.EdbInfoRelation, 0)
  761. }
  762. }
  763. }
  764. }
  765. //拿到500个数据ID,判断相关的引用记录,如果已存在则直接过滤,不存在则新增
  766. if len(addList) > 0 {
  767. err = data_manage.AddEdbInfoRelationMulti(addList)
  768. if err != nil {
  769. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  770. return
  771. }
  772. addNum += len(addList)
  773. }
  774. fmt.Printf("表格指标引用记录处理完成, 新增%d条记录\n", addNum)
  775. return
  776. }
  777. // 处理逻辑图中的指标引用
  778. func initSandBoxEdbRelation() {
  779. fmt.Println("开始处理逻辑图中的指标引用")
  780. var err error
  781. var addNum int
  782. defer func() {
  783. if err != nil {
  784. msg := fmt.Sprintf("初始化指标在逻辑图中的引用失败 initSandBoxEdbRelation err: %v", err)
  785. utils.FileLog.Info(msg)
  786. fmt.Println(msg)
  787. go alarm_msg.SendAlarmMsg(msg, 3)
  788. }
  789. }()
  790. condition := " AND is_delete = 0"
  791. total, err := sandbox.GetSandboxListCountByCondition(condition, []interface{}{})
  792. if err != nil {
  793. err = fmt.Errorf("查询逻辑图总数失败 err: %v", err)
  794. return
  795. }
  796. if total == 0 {
  797. return
  798. }
  799. //分页查询,每次处理500条记录
  800. pageSize := 100
  801. totalPage := (total + pageSize - 1) / pageSize // 使用整数除法,并添加一页以防有余数
  802. addList := make([]*data_manage.EdbInfoRelation, 0)
  803. //查询图表列表
  804. for i := 0; i < totalPage; i += 1 {
  805. startSize := i * pageSize
  806. list, e := sandbox.GetSandboxListByCondition(condition, []interface{}{}, startSize, pageSize)
  807. if e != nil {
  808. err = fmt.Errorf("查询逻辑图列表失败 Err:%s", e)
  809. return
  810. }
  811. if len(list) == 0 {
  812. break
  813. }
  814. edbInfoIds := make([]int, 0)
  815. edbSandboxMap := make(map[int][]*sandbox.Sandbox)
  816. for _, v := range list {
  817. if v.Content == "" {
  818. continue
  819. }
  820. edbInfoIdsTmp, e := getSandBoxEdbIdsByContent(v.Content)
  821. if e != nil {
  822. continue
  823. //err = fmt.Errorf("查询逻辑图关联的指标Id失败 Err:%s", e)
  824. //return
  825. }
  826. for _, edbId := range edbInfoIdsTmp {
  827. edbInfoIds = append(edbInfoIds, edbId)
  828. edbSandboxMap[edbId] = append(edbSandboxMap[edbId], v)
  829. }
  830. }
  831. if len(edbInfoIds) <= 0 {
  832. continue
  833. }
  834. // 查询指标信息表
  835. edbInfoList, e := data_manage.GetEdbInfoByIdList(edbInfoIds)
  836. if e != nil {
  837. err = fmt.Errorf("查询指标信息列表失败 Err:%s", e)
  838. return
  839. }
  840. if len(edbInfoList) == 0 {
  841. continue
  842. }
  843. // 查询计算指标信息,并且建立关联关系
  844. // 查询间接引用的指标信息
  845. calculateEdbListMap, calculateEdbMappingListMap, calculateEdbMappingIdsMap, e := GetEdbListByEdbInfoId(edbInfoList)
  846. if e != nil {
  847. err = fmt.Errorf("查询计算指标信息失败,%s", e.Error())
  848. return
  849. }
  850. edbInfoMap := make(map[int]*data_manage.EdbInfo)
  851. sandboxIds := make([]int, 0)
  852. for _, v := range edbInfoList {
  853. edbInfoMap[v.EdbInfoId] = v
  854. if items, ok := edbSandboxMap[v.EdbInfoId]; ok {
  855. for _, item := range items {
  856. sandboxIds = append(sandboxIds, item.SandboxId)
  857. }
  858. }
  859. }
  860. //查询引用关系列表,
  861. chartEdbRelationList, e := data_manage.GetEdbInfoRelationByReferObjectIds(sandboxIds, utils.EDB_RELATION_SANDBOX)
  862. if e != nil {
  863. err = fmt.Errorf("查询逻辑图引用关系列表失败 Err:%s", e)
  864. return
  865. }
  866. existRelationMap := make(map[string]struct{})
  867. for _, v := range chartEdbRelationList {
  868. name := fmt.Sprintf("%d-%d", v.ReferObjectId, v.EdbInfoId)
  869. existRelationMap[name] = struct{}{}
  870. }
  871. for edbInfoId, sandboxList := range edbSandboxMap {
  872. nowTime := time.Now()
  873. for _, v := range sandboxList {
  874. name := fmt.Sprintf("%d-%d", v.SandboxId, edbInfoId)
  875. if _, ok := existRelationMap[name]; !ok {
  876. edbInfo, ok2 := edbInfoMap[edbInfoId]
  877. if !ok2 {
  878. continue
  879. }
  880. //todo 引用时间
  881. tmp := &data_manage.EdbInfoRelation{
  882. ReferObjectId: v.SandboxId,
  883. ReferObjectType: utils.EDB_RELATION_SANDBOX,
  884. EdbInfoId: edbInfoId,
  885. EdbName: edbInfo.EdbName,
  886. Source: edbInfo.Source,
  887. EdbCode: edbInfo.EdbCode,
  888. CreateTime: nowTime,
  889. ModifyTime: nowTime,
  890. RelationTime: v.CreateTime,
  891. }
  892. addList = append(addList, tmp)
  893. existRelationMap[name] = struct{}{}
  894. // 添加间接引用记录
  895. if edbInfo.EdbType == 2 {
  896. childEdbMappingIds, ok1 := calculateEdbMappingIdsMap[edbInfo.EdbInfoId]
  897. if !ok1 {
  898. continue
  899. }
  900. for _, childEdbMappingId := range childEdbMappingIds {
  901. childEdbMapping, ok2 := calculateEdbMappingListMap[childEdbMappingId]
  902. if !ok2 {
  903. continue
  904. }
  905. name1 := fmt.Sprintf("%d-%d", v.SandboxId, childEdbMapping.FromEdbInfoId)
  906. if _, ok2 := existRelationMap[name1]; !ok2 { //如果已经被直接引用了,则无需添加到间接引用记录中
  907. continue
  908. }
  909. childEdb, ok2 := calculateEdbListMap[childEdbMapping.FromEdbInfoId]
  910. if !ok2 {
  911. continue
  912. }
  913. tmp1 := &data_manage.EdbInfoRelation{
  914. ReferObjectId: v.SandboxId,
  915. ReferObjectType: utils.EDB_RELATION_SANDBOX,
  916. EdbInfoId: childEdb.EdbInfoId,
  917. EdbName: childEdb.EdbName,
  918. Source: childEdb.Source,
  919. EdbCode: childEdb.EdbCode,
  920. CreateTime: nowTime,
  921. ModifyTime: nowTime,
  922. RelationTime: v.CreateTime,
  923. RelationType: 1,
  924. RootEdbInfoId: edbInfo.EdbInfoId,
  925. ChildEdbInfoId: childEdbMapping.EdbInfoId,
  926. }
  927. addList = append(addList, tmp1)
  928. // todo 防止重复
  929. }
  930. }
  931. if len(addList) > pageSize {
  932. err = data_manage.AddEdbInfoRelationMulti(addList)
  933. if err != nil {
  934. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  935. return
  936. }
  937. addNum += len(addList)
  938. addList = make([]*data_manage.EdbInfoRelation, 0)
  939. }
  940. }
  941. }
  942. }
  943. }
  944. //拿到500个数据ID,判断相关的引用记录,如果已存在则直接过滤,不存在则新增
  945. if len(addList) > 0 {
  946. err = data_manage.AddEdbInfoRelationMulti(addList)
  947. if err != nil {
  948. err = fmt.Errorf("新增引用记录失败 Err:%s", err)
  949. return
  950. }
  951. addNum += len(addList)
  952. }
  953. fmt.Printf("逻辑图指标引用记录处理完成, 新增%d条记录\n", addNum)
  954. return
  955. }
  956. func getSandBoxEdbIdsByContent(content string) (edbInfoIds []int, err error) {
  957. var contentInfo sandbox.ContentDataStruct
  958. err = json.Unmarshal([]byte(content), &contentInfo)
  959. if err != nil {
  960. err = fmt.Errorf("json.Unmarshal err:%s", err.Error())
  961. return
  962. }
  963. // 遍历所有节点
  964. for _, node := range contentInfo.Cells {
  965. if node.Data == nil {
  966. continue
  967. }
  968. for _, v := range node.Data.LinkData {
  969. if v.Type == 1 {
  970. edbInfoIds = append(edbInfoIds, v.Id)
  971. }
  972. }
  973. }
  974. return
  975. }
  976. func GetEdbListByEdbInfoId(edbInfoList []*data_manage.EdbInfo) (edbInfoMap map[int]*data_manage.EdbInfo, edbMappingListMap map[int]*data_manage.EdbInfoCalculateMapping, edbInfoMappingRootIdsMap map[int][]int, err error) {
  977. if len(edbInfoList) == 0 {
  978. return
  979. }
  980. edbInfoIds := make([]int, 0)
  981. for _, v := range edbInfoList {
  982. if v.EdbType == 2 {
  983. edbInfoIds = append(edbInfoIds, v.EdbInfoId)
  984. }
  985. }
  986. if len(edbInfoIds) == 0 {
  987. return
  988. }
  989. //查询指标信息
  990. allEdbMappingMap := make(map[int][]*data_manage.EdbInfoCalculateMappingInfo, 0)
  991. allMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoIds(edbInfoIds)
  992. if e != nil {
  993. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoIds err: %s", e.Error())
  994. return
  995. }
  996. for _, v := range allMappingList {
  997. if _, ok := allEdbMappingMap[v.EdbInfoId]; !ok {
  998. allEdbMappingMap[v.EdbInfoId] = make([]*data_manage.EdbInfoCalculateMappingInfo, 0)
  999. }
  1000. allEdbMappingMap[v.EdbInfoId] = append(allEdbMappingMap[v.EdbInfoId], v)
  1001. }
  1002. //查询指标映射
  1003. //查询所有指标数据
  1004. //查询这个指标相关的mapping信息放到数组里,
  1005. //将得到的指标ID信息放到数组里
  1006. hasFindMap := make(map[int]struct{})
  1007. edbInfoIdMap := make(map[int]struct{})
  1008. edbMappingList := make([]*data_manage.EdbInfoCalculateMapping, 0)
  1009. edbInfoMappingRootIdsMap = make(map[int][]int, 0)
  1010. edbMappingMap := make(map[int]struct{})
  1011. for _, edbInfo := range edbInfoList {
  1012. if edbInfo.EdbType == 2 {
  1013. edbInfoId := edbInfo.EdbInfoId
  1014. edbMappingList, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, edbInfoId)
  1015. if err != nil {
  1016. err = fmt.Errorf(" GetCalculateEdbInfoByEdbInfoId err: %s", err.Error())
  1017. return
  1018. }
  1019. }
  1020. }
  1021. if len(edbMappingList) == 0 {
  1022. return
  1023. }
  1024. // 查询指标信息
  1025. // 指标信息map
  1026. edbInfoIdList := make([]int, 0)
  1027. for k, _ := range edbInfoIdMap {
  1028. edbInfoIdList = append(edbInfoIdList, k)
  1029. }
  1030. edbInfoMap = make(map[int]*data_manage.EdbInfo)
  1031. edbMappingListMap = make(map[int]*data_manage.EdbInfoCalculateMapping)
  1032. if len(edbInfoIdList) > 0 {
  1033. edbInfoList, err = data_manage.GetEdbInfoByIdList(edbInfoIdList)
  1034. if err != nil {
  1035. err = fmt.Errorf(" GetEdbInfoByIdList err: %s", err.Error())
  1036. return
  1037. }
  1038. for _, v := range edbInfoList {
  1039. edbInfoMap[v.EdbInfoId] = v
  1040. }
  1041. }
  1042. if len(edbMappingList) > 0 {
  1043. for _, v := range edbMappingList {
  1044. edbMappingListMap[v.EdbInfoCalculateMappingId] = v
  1045. }
  1046. }
  1047. return
  1048. }
  1049. // getCalculateEdbInfoByEdbInfoId 计算指标追溯
  1050. func getCalculateEdbInfoByEdbInfoId(allEdbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo, 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) {
  1051. newEdbMappingList = edbMappingList
  1052. _, ok := hasFindMap[edbInfoId]
  1053. if ok {
  1054. return
  1055. }
  1056. if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
  1057. edbInfoIdMap[edbInfoId] = struct{}{}
  1058. }
  1059. edbInfoMappingList := make([]*data_manage.EdbInfoCalculateMappingInfo, 0)
  1060. edbInfoMappingList, ok = allEdbMappingMap[edbInfoId]
  1061. if !ok {
  1062. edbInfoMappingList, err = data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  1063. if err != nil {
  1064. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", err.Error())
  1065. return
  1066. }
  1067. }
  1068. hasFindMap[edbInfoId] = struct{}{}
  1069. if len(edbInfoMappingList) > 0 {
  1070. fromEdbInfoIdList := make([]int, 0)
  1071. edbInfoMappingIdList := make([]int, 0)
  1072. for _, v := range edbInfoMappingList {
  1073. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  1074. edbInfoMappingIdList = append(edbInfoMappingIdList, v.EdbInfoCalculateMappingId)
  1075. if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
  1076. edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
  1077. }
  1078. if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
  1079. edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
  1080. tmp := &data_manage.EdbInfoCalculateMapping{
  1081. EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
  1082. EdbInfoId: v.EdbInfoId,
  1083. Source: v.Source,
  1084. SourceName: v.SourceName,
  1085. EdbCode: v.EdbCode,
  1086. FromEdbInfoId: v.FromEdbInfoId,
  1087. FromEdbCode: v.FromEdbCode,
  1088. FromEdbName: v.FromEdbName,
  1089. FromSource: v.FromSource,
  1090. FromSourceName: v.FromSourceName,
  1091. FromTag: v.FromTag,
  1092. Sort: v.Sort,
  1093. CreateTime: v.CreateTime,
  1094. ModifyTime: v.ModifyTime,
  1095. }
  1096. newEdbMappingList = append(newEdbMappingList, tmp)
  1097. }
  1098. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  1099. // 查过了就不查了
  1100. if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
  1101. newEdbMappingList, err = getCalculateEdbInfoByEdbInfoId(allEdbMappingMap, v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap, edbInfoMappingRootIdsMap, rootEdbInfoId)
  1102. if err != nil {
  1103. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", err.Error())
  1104. return
  1105. }
  1106. }
  1107. }
  1108. hasFindMap[v.FromEdbInfoId] = struct{}{}
  1109. }
  1110. edbInfoMappingRootIdsMap[rootEdbInfoId] = append(edbInfoMappingRootIdsMap[rootEdbInfoId], edbInfoMappingIdList...)
  1111. }
  1112. return
  1113. }