edb_info.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. package chart
  2. import (
  3. "errors"
  4. "fmt"
  5. edbInfoModel "hongze/hongze_yb/models/tables/edb_info"
  6. "hongze/hongze_yb/services/alarm_msg"
  7. "hongze/hongze_yb/utils"
  8. "sort"
  9. "time"
  10. )
  11. // EdbInfoRefreshAllFromBase 全部刷新指标(切换到edb_lib服务)
  12. // @author Roc
  13. // @datetime 2022-09-16 11:04:44
  14. // @description 将原有的单个指标刷新,调整为批量多个指标刷新
  15. func EdbInfoRefreshAllFromBase(edbInfoIdList []int, refreshAll bool) (err error) {
  16. var errmsg string
  17. defer func() {
  18. if err != nil {
  19. fmt.Println("EdbInfoRefreshAllFromBaseV2 Err:" + err.Error() + ";errmsg:" + errmsg)
  20. go alarm_msg.SendAlarmMsg("EdbInfoRefreshFromBaseV2,Err"+err.Error()+";errMsg:"+errmsg, 3)
  21. //go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "EdbInfoRefreshFromBase:"+errmsg, utils.EmailSendToUsers)
  22. }
  23. }()
  24. // 获取关联的基础指标
  25. newBaseEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr, err, errmsg := getRefreshEdbInfoListByIds(edbInfoIdList)
  26. if err != nil {
  27. return
  28. }
  29. var startDate string
  30. for _, bv := range newBaseEdbInfoArr {
  31. //source := bv.Source
  32. //edbInfoId := bv.EdbInfoId
  33. //edbCode := bv.EdbCode
  34. if bv.StartDate.IsZero() {
  35. continue
  36. }
  37. //开始时间
  38. startDate = ``
  39. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  40. startDate = bv.StartDate.Format(utils.FormatDate)
  41. } else {
  42. sTime := bv.EndDate
  43. frequency := bv.Frequency
  44. var limitDay int
  45. switch frequency {
  46. case "日度":
  47. limitDay = utils.DATA_START_REFRESH_LIMIT
  48. case "周度":
  49. limitDay = utils.DATA_START_REFRESH_LIMIT * 7
  50. case "月度":
  51. limitDay = utils.DATA_START_REFRESH_LIMIT * 30
  52. case "季度":
  53. limitDay = utils.DATA_START_REFRESH_LIMIT * 90
  54. case "年度":
  55. limitDay = utils.DATA_START_REFRESH_LIMIT * 365
  56. default:
  57. limitDay = utils.DATA_START_REFRESH_LIMIT
  58. }
  59. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  60. }
  61. result, err := RefreshEdbData(bv.EdbInfoId, bv.Source, bv.EdbCode, startDate)
  62. if err != nil {
  63. fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err", time.Now())
  64. errmsg = "RefreshBaseEdbData Err:" + err.Error()
  65. return err
  66. }
  67. if result.Ret != 200 {
  68. fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  69. errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  70. return fmt.Errorf("刷新失败, err:", errmsg)
  71. }
  72. //maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
  73. //if err != nil {
  74. // if err.Error() == utils.ErrNoRow() { //找不到数据,那么就进入到下一条数据做处理
  75. // continue
  76. // }
  77. // return err
  78. //}
  79. //if maxAndMinItem != nil {
  80. // err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
  81. // if err != nil {
  82. // return err
  83. // }
  84. //}
  85. fmt.Println("end newBaseEdbInfoArr:", bv, time.Now())
  86. }
  87. //刷新相关普通计算指标
  88. for _, v := range calculateArr {
  89. edbInfo := newCalculateMap[v]
  90. if edbInfo == nil {
  91. return err
  92. }
  93. startDate = edbInfo.StartDate.Format(utils.FormatDate)
  94. source := edbInfo.Source
  95. if edbInfo.StartDate.IsZero() { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
  96. startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
  97. } else {
  98. if source == utils.DATA_SOURCE_CALCULATE {
  99. startDate = ``
  100. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  101. startDate = edbInfo.StartDate.Format(utils.FormatDate)
  102. } else {
  103. sTime := edbInfo.EndDate
  104. frequency := edbInfo.Frequency
  105. var limitDay int
  106. switch frequency {
  107. case "日度":
  108. limitDay = utils.DATA_START_REFRESH_LIMIT
  109. case "周度":
  110. limitDay = utils.DATA_START_REFRESH_LIMIT * 7
  111. case "月度":
  112. limitDay = utils.DATA_START_REFRESH_LIMIT * 30
  113. case "季度":
  114. limitDay = utils.DATA_START_REFRESH_LIMIT * 90
  115. case "年度":
  116. limitDay = utils.DATA_START_REFRESH_LIMIT * 365
  117. default:
  118. limitDay = utils.DATA_START_REFRESH_LIMIT
  119. }
  120. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  121. }
  122. }
  123. }
  124. result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  125. if err != nil {
  126. fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
  127. errmsg = "RefreshEdbCalculateData Err:" + err.Error()
  128. return err
  129. }
  130. if result.Ret != 200 {
  131. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  132. errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  133. return fmt.Errorf("刷新失败")
  134. }
  135. }
  136. //刷新相关预测计算指标
  137. for _, v := range predictCalculateArr {
  138. edbInfo := newPredictCalculateMap[v]
  139. if edbInfo == nil {
  140. return err
  141. }
  142. startDate = edbInfo.StartDate.Format(utils.FormatDate)
  143. source := edbInfo.Source
  144. if edbInfo.StartDate.IsZero() { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
  145. startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
  146. } else {
  147. if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
  148. startDate = ``
  149. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  150. startDate = edbInfo.StartDate.Format(utils.FormatDate)
  151. } else {
  152. sTime := edbInfo.EndDate
  153. frequency := edbInfo.Frequency
  154. var limitDay int
  155. switch frequency {
  156. case "日度":
  157. limitDay = utils.DATA_START_REFRESH_LIMIT
  158. case "周度":
  159. limitDay = utils.DATA_START_REFRESH_LIMIT * 7
  160. case "月度":
  161. limitDay = utils.DATA_START_REFRESH_LIMIT * 30
  162. case "季度":
  163. limitDay = utils.DATA_START_REFRESH_LIMIT * 90
  164. case "年度":
  165. limitDay = utils.DATA_START_REFRESH_LIMIT * 365
  166. default:
  167. limitDay = utils.DATA_START_REFRESH_LIMIT
  168. }
  169. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  170. }
  171. }
  172. }
  173. result, err := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  174. if err != nil {
  175. fmt.Println(v, "RefreshPredictEdbCalculateData err", time.Now())
  176. errmsg = "RefreshPredictEdbCalculateData Err:" + err.Error()
  177. return err
  178. }
  179. if result.Ret != 200 {
  180. fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  181. errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  182. return fmt.Errorf("刷新失败")
  183. }
  184. }
  185. return err
  186. }
  187. // getRefreshEdbInfoList 获取待更新的指标(普通基础指标、普通运算指标,预测运算指标)
  188. func getRefreshEdbInfoListByIds(edbInfoIdList []int) (newBaseEdbInfoArr []*edbInfoModel.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*edbInfoModel.EdbInfo, calculateArr, predictCalculateArr []int, err error, errMsg string) {
  189. calculateList, err := edbInfoModel.GetEdbInfoAllCalculateByEdbInfoIdList(edbInfoIdList)
  190. if err != nil && err != utils.ErrNoRow {
  191. err = errors.New("GetEdbInfoAllCalculate Err:" + err.Error())
  192. return
  193. }
  194. // 获取指标信息
  195. edbInfoList, err := edbInfoModel.GetEdbInfoByIdList(edbInfoIdList)
  196. if err != nil {
  197. err = errors.New("GetEdbInfoAllCalGetEdbInfoByIdr:" + err.Error())
  198. return
  199. }
  200. baseEdbInfoArr := make([]*edbInfoModel.EdbInfo, 0) // 基础普通指标
  201. calculateInfoArr := make([]*edbInfoModel.EdbInfo, 0) //基础运算指标
  202. basePredictEdbInfoArr := make([]*edbInfoModel.EdbInfo, 0) // 预测普通指标
  203. predictCalculateInfoArr := make([]*edbInfoModel.EdbInfo, 0) //预测运算指标
  204. for _, baseEdbInfo := range edbInfoList {
  205. if baseEdbInfo.EdbInfoType == 0 { //普通指标
  206. switch baseEdbInfo.EdbType {
  207. case 1: //基础指标
  208. baseEdbInfoArr = append(baseEdbInfoArr, baseEdbInfo)
  209. case 2: //计算指标
  210. calculateList = append(calculateList, baseEdbInfo)
  211. }
  212. } else { //预测指标
  213. switch baseEdbInfo.EdbType {
  214. case 1: //基础指标
  215. basePredictEdbInfoArr = append(basePredictEdbInfoArr, baseEdbInfo)
  216. case 2: //计算指标
  217. predictCalculateInfoArr = append(predictCalculateInfoArr, baseEdbInfo)
  218. }
  219. }
  220. }
  221. // 计算指标
  222. for _, v := range calculateList {
  223. getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := edbInfoModel.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  224. if tmpErr != nil {
  225. err = tmpErr
  226. fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
  227. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  228. return
  229. }
  230. for _, tmpEdbInfo := range getBaseEdbInfoArr {
  231. switch tmpEdbInfo.EdbInfoType {
  232. case 0: //普通基础指标
  233. baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
  234. case 1: //预测基础指标
  235. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  236. }
  237. }
  238. for _, tmpEdbInfo := range getCalculateInfoArr {
  239. switch tmpEdbInfo.EdbInfoType {
  240. case 0: //普通运算指标
  241. calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
  242. case 1: //预测运算指标
  243. //predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  244. if tmpEdbInfo.EdbType == 1 { //预测普通指标
  245. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  246. } else {
  247. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  248. }
  249. }
  250. }
  251. switch v.EdbInfoType {
  252. case 0: //普通运算指标
  253. calculateInfoArr = append(calculateInfoArr, v)
  254. case 1: //预测运算指标
  255. //predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  256. if v.EdbType == 1 { //预测普通指标
  257. basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
  258. } else {
  259. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  260. }
  261. }
  262. }
  263. // 预测计算指标
  264. for _, v := range predictCalculateInfoArr {
  265. getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := edbInfoModel.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  266. if tmpErr != nil {
  267. err = tmpErr
  268. fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
  269. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  270. return
  271. }
  272. for _, tmpEdbInfo := range getBaseEdbInfoArr {
  273. switch tmpEdbInfo.EdbInfoType {
  274. case 0: //普通基础指标
  275. baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
  276. case 1: //预测基础指标
  277. //basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  278. if tmpEdbInfo.EdbType == 1 { //预测普通指标
  279. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  280. } else {
  281. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  282. }
  283. }
  284. }
  285. for _, tmpEdbInfo := range getCalculateInfoArr {
  286. switch tmpEdbInfo.EdbInfoType {
  287. case 0: //普通运算指标
  288. calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
  289. case 1: //预测运算指标
  290. //predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  291. if tmpEdbInfo.EdbType == 1 { //预测普通指标
  292. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  293. } else {
  294. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  295. }
  296. }
  297. }
  298. switch v.EdbInfoType {
  299. case 0: //普通运算指标
  300. calculateInfoArr = append(calculateInfoArr, v)
  301. case 1: //预测运算指标
  302. //predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  303. if v.EdbType == 1 { //预测普通指标
  304. basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
  305. } else {
  306. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  307. }
  308. }
  309. }
  310. // 第一次的计算指标map
  311. newCalculateMap = make(map[int]*edbInfoModel.EdbInfo)
  312. for _, v := range calculateInfoArr {
  313. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  314. calculateArr = append(calculateArr, v.EdbInfoId)
  315. }
  316. newCalculateMap[v.EdbInfoId] = v
  317. }
  318. // 基础预测指标
  319. if len(basePredictEdbInfoArr) > 0 {
  320. basePredictEdbInfoIdList := make([]int, 0)
  321. for _, v := range basePredictEdbInfoArr {
  322. basePredictEdbInfoIdList = append(basePredictEdbInfoIdList, v.EdbInfoId)
  323. }
  324. baseEdbInfoList, tmpErr := edbInfoModel.GetPredictEdbInfoAllCalculate(basePredictEdbInfoIdList)
  325. if tmpErr != nil {
  326. err = tmpErr
  327. return
  328. }
  329. tmpCalculateList := make([]*edbInfoModel.EdbInfo, 0)
  330. for _, v := range baseEdbInfoList {
  331. switch v.EdbType {
  332. case 1:
  333. baseEdbInfoArr = append(baseEdbInfoArr, v)
  334. case 2:
  335. // 如果不在第一次里面,那么在第二次 刷新预测指标的时候 需要加进去
  336. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  337. tmpCalculateList = append(tmpCalculateList, v)
  338. }
  339. }
  340. }
  341. // 这里是查询预测指标用到的 普通计算指标
  342. for _, v := range tmpCalculateList {
  343. getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := edbInfoModel.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  344. if tmpErr != nil {
  345. err = tmpErr
  346. fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
  347. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  348. return
  349. }
  350. // 基础指标
  351. for _, tmpEdbInfo := range getBaseEdbInfoArr {
  352. switch tmpEdbInfo.EdbInfoType {
  353. case 0: //普通基础指标
  354. baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
  355. case 1: //预测基础指标
  356. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  357. }
  358. }
  359. // 计算指标
  360. for _, tmpEdbInfo := range getCalculateInfoArr {
  361. switch tmpEdbInfo.EdbInfoType {
  362. case 0: //普通运算指标
  363. calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
  364. case 1: //预测运算指标
  365. //predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  366. if v.EdbType == 1 { //预测普通指标
  367. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  368. } else {
  369. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  370. }
  371. }
  372. }
  373. switch v.EdbInfoType {
  374. case 0: //普通运算指标
  375. calculateInfoArr = append(calculateInfoArr, v)
  376. case 1: //预测运算指标
  377. //predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  378. if v.EdbType == 1 { //预测普通指标
  379. basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
  380. } else { //预测运算指标
  381. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  382. }
  383. }
  384. }
  385. // 第二次计算指标的map
  386. for _, v := range calculateInfoArr {
  387. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  388. calculateArr = append(calculateArr, v.EdbInfoId)
  389. }
  390. newCalculateMap[v.EdbInfoId] = v
  391. }
  392. }
  393. // 普通基础指标去重
  394. newBaseEdbInfoArr = make([]*edbInfoModel.EdbInfo, 0)
  395. baseMap := make(map[int]int)
  396. for _, v := range baseEdbInfoArr {
  397. if _, ok := baseMap[v.EdbInfoId]; !ok {
  398. newBaseEdbInfoArr = append(newBaseEdbInfoArr, v)
  399. }
  400. baseMap[v.EdbInfoId] = v.EdbInfoId
  401. }
  402. // 普通计算指标的id
  403. sort.Ints(calculateArr)
  404. // 预测计算指标去重
  405. newPredictCalculateMap = make(map[int]*edbInfoModel.EdbInfo)
  406. for _, v := range predictCalculateInfoArr {
  407. if _, ok := newPredictCalculateMap[v.EdbInfoId]; !ok {
  408. predictCalculateArr = append(predictCalculateArr, v.EdbInfoId)
  409. }
  410. newPredictCalculateMap[v.EdbInfoId] = v
  411. }
  412. // 预测计算指标的id
  413. sort.Ints(predictCalculateArr)
  414. return
  415. }