chart_info.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. package services
  2. import (
  3. "context"
  4. "encoding/json"
  5. "eta/eta_forum_task/models"
  6. "eta/eta_forum_task/services/alarm_msg"
  7. "eta/eta_forum_task/services/eta_forum"
  8. "eta/eta_forum_task/utils"
  9. "fmt"
  10. "time"
  11. )
  12. func EtaForumChartUpdate(cont context.Context) (err error) {
  13. var tmpErr []error
  14. deleteCache := true
  15. cacheKey := "eta_forum_task:EtaForumChartUpdate"
  16. defer func() {
  17. if deleteCache {
  18. _ = utils.Rc.Delete(cacheKey)
  19. }
  20. stack := ""
  21. if err != nil {
  22. stack = fmt.Sprintln(stack + err.Error())
  23. }
  24. if len(tmpErr) > 0 {
  25. for _, v := range tmpErr {
  26. stack = fmt.Sprintln(stack + v.Error())
  27. }
  28. }
  29. if stack != "" {
  30. go alarm_msg.SendAlarmMsg(utils.APP_NAME_CN+"更新社区图表信息失败"+time.Now().Format("2006-01-02 15:04:05")+"<br/>"+stack, 3)
  31. }
  32. }()
  33. if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
  34. deleteCache = false
  35. err = fmt.Errorf("系统处理中,请稍后重试!")
  36. return
  37. }
  38. // 设置缓存判断处理中则不更新
  39. condition := " and forum_chart_info_id > 0 and source=1 "
  40. // 查询需要更新的图表信息总数
  41. total, err := models.GetChartInfoCountByCondition(condition, []interface{}{})
  42. if err != nil {
  43. return
  44. }
  45. if total == 0 {
  46. return
  47. }
  48. // 更新图表数据
  49. offset := 0
  50. pageSize := 100
  51. success := 0
  52. // 循环更新100个图表数据
  53. for i := 0; offset < total; i++ {
  54. // 查询需要更新的图表信息
  55. chartInfos, e := models.GetChartInfoListByCondition(condition, []interface{}{}, offset, pageSize)
  56. if e != nil {
  57. err = fmt.Errorf("查询需要更新的图表信息失败: %v", e)
  58. return
  59. }
  60. // 循环更新图表数据
  61. for _, chartInfo := range chartInfos {
  62. // 更新图表数据
  63. er, msg := UpdateChart(chartInfo.ChartInfoId)
  64. if er != nil {
  65. er = fmt.Errorf("图表ID %d, 更新图表数据失败: %s, %v", chartInfo.ChartInfoId, msg, er)
  66. tmpErr = append(tmpErr, er)
  67. continue
  68. }
  69. success += 1
  70. }
  71. offset = (i + 1) * pageSize
  72. time.Sleep(2 * time.Second)
  73. }
  74. fmt.Println("更新图表数据完成, 更新图表数据总数:", success)
  75. return
  76. }
  77. // UpdateChart 更新社区里的图表接口
  78. func UpdateChart(chartInfoId int) (err error, errMsg string) {
  79. // 查询图表信息
  80. chartInfo, err := models.GetChartInfoById(chartInfoId)
  81. if err != nil {
  82. if err.Error() == utils.ErrNoRow() {
  83. errMsg = "图表不存在"
  84. err = fmt.Errorf(errMsg)
  85. return
  86. }
  87. errMsg = "获取图表信息失败"
  88. err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
  89. return
  90. }
  91. if chartInfo.ForumChartInfoId <= 0 {
  92. return
  93. }
  94. //查询图表指标
  95. //获取原图表关联的指标信息列表
  96. chartMappingList, err := models.GetChartMappingList(chartInfoId)
  97. if err != nil {
  98. errMsg = "获取图表关联的指标信息失败"
  99. err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
  100. return
  101. }
  102. edbIds := make([]int, 0)
  103. for _, v := range chartMappingList {
  104. edbIds = append(edbIds, v.EdbInfoId)
  105. }
  106. var (
  107. edbInfoList []*models.EdbInfo
  108. edbMappingList []*models.EdbInfoCalculateMapping
  109. edbInfoDataList []*eta_forum.AddEdbDataReq
  110. )
  111. //查询指标详情
  112. edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
  113. if err != nil {
  114. errMsg = "获取指标详情失败"
  115. err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
  116. return
  117. }
  118. req := new(eta_forum.ChartSaveLibReq)
  119. req.ChartInfo = chartInfo
  120. req.ChartInfo.ChartInfoId = chartInfo.ForumChartInfoId
  121. req.ChartEdbMapping = chartMappingList
  122. req.EdbInfoList = edbInfoList
  123. req.EdbInfoDataList = edbInfoDataList
  124. req.EdbInfoCalculateMapping = edbMappingList
  125. // 添加计算指标
  126. reqJson, err := json.Marshal(req)
  127. if err != nil {
  128. errMsg = "参数解析异常"
  129. err = fmt.Errorf("参数解析异常,Err:" + err.Error())
  130. return
  131. }
  132. respItem, err := eta_forum.ChartUpdateLib(string(reqJson))
  133. if err != nil {
  134. errMsg = "更新失败"
  135. err = fmt.Errorf("上传失败,Err:" + err.Error())
  136. return
  137. }
  138. if respItem.Ret != 200 {
  139. errMsg = "更新失败"
  140. err = fmt.Errorf(respItem.ErrMsg)
  141. return
  142. }
  143. return
  144. }
  145. func GetEdbListByEdbInfoId(edbInfoIds []int) (edbInfoList []*models.EdbInfo, edbMappingList []*models.EdbInfoCalculateMapping, edbInfoDataList []*eta_forum.AddEdbDataReq, err error) {
  146. //查询指标信息
  147. //查询指标映射
  148. //查询所有指标数据
  149. //查询这个指标相关的mapping信息放到数组里,
  150. //将得到的指标ID信息放到数组里
  151. hasFindMap := make(map[int]struct{})
  152. edbInfoIdMap := make(map[int]struct{})
  153. edbMappingList = make([]*models.EdbInfoCalculateMapping, 0)
  154. edbMappingMap := make(map[int]struct{})
  155. for _, edbInfoId := range edbInfoIds {
  156. edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
  157. if err != nil {
  158. return
  159. }
  160. }
  161. // 指标信息map
  162. edbInfoIdList := make([]int, 0)
  163. for k, _ := range edbInfoIdMap {
  164. edbInfoIdList = append(edbInfoIdList, k)
  165. }
  166. edbInfoList, err = models.GetEdbInfoByIdList(edbInfoIdList)
  167. if err != nil {
  168. err = fmt.Errorf("traceEdbInfoByEdbInfoId GetEdbInfoByIdList err: %s", err.Error())
  169. return
  170. }
  171. for _, v := range edbInfoList {
  172. dataList, e := models.GetEdbDataBaseByEdbCode(v.EdbInfoId, v.Source, v.SubSource)
  173. if e != nil {
  174. err = fmt.Errorf("查询指标数据失败 Err: %s", e.Error())
  175. return
  176. }
  177. tmp := new(eta_forum.AddEdbDataReq)
  178. tmp.EdbCode = v.EdbCode
  179. tmp.EdbType = v.EdbType
  180. tmp.DataList = dataList
  181. edbInfoDataList = append(edbInfoDataList, tmp)
  182. }
  183. return
  184. }
  185. // traceEdbInfoByEdbInfoId 指标追溯
  186. func traceEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*models.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}) (newEdbMappingList []*models.EdbInfoCalculateMapping, err error) {
  187. newEdbMappingList = edbMappingList
  188. _, ok := hasFindMap[edbInfoId]
  189. if ok {
  190. return
  191. }
  192. if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
  193. edbInfoIdMap[edbInfoId] = struct{}{}
  194. }
  195. edbInfoMappingList, e := models.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  196. if e != nil {
  197. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
  198. return
  199. }
  200. if len(edbInfoMappingList) > 0 {
  201. fromEdbInfoIdList := make([]int, 0)
  202. for _, v := range edbInfoMappingList {
  203. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  204. if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
  205. edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
  206. }
  207. if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
  208. edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
  209. tmp := &models.EdbInfoCalculateMapping{
  210. EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
  211. EdbInfoId: v.EdbInfoId,
  212. Source: v.Source,
  213. SourceName: v.SourceName,
  214. EdbCode: v.EdbCode,
  215. FromEdbInfoId: v.FromEdbInfoId,
  216. FromEdbCode: v.FromEdbCode,
  217. FromEdbName: v.FromEdbName,
  218. FromSource: v.FromSource,
  219. FromSourceName: v.FromSourceName,
  220. FromTag: v.FromTag,
  221. Sort: v.Sort,
  222. CreateTime: v.CreateTime,
  223. ModifyTime: v.ModifyTime,
  224. }
  225. newEdbMappingList = append(newEdbMappingList, tmp)
  226. }
  227. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  228. // 查过了就不查了
  229. if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
  230. newEdbMappingList, e = traceEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap)
  231. if e != nil {
  232. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
  233. return
  234. }
  235. }
  236. }
  237. hasFindMap[v.FromEdbInfoId] = struct{}{}
  238. }
  239. }
  240. hasFindMap[edbInfoId] = struct{}{}
  241. return
  242. }