edb_info.go 15 KB

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