edb_relation.go 39 KB

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