edb_info.go 15 KB

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