edb_info.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  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 EdbInfoRefreshAllFromBaseV3(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, "RefreshEdbCalculateData err", time.Now())
  189. errmsg = "RefreshEdbCalculateData Err:" + err.Error()
  190. return err
  191. }
  192. if result.Ret != 200 {
  193. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  194. errmsg = fmt.Sprint(v, "RefreshEdbCalculateData 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. }
  258. }
  259. switch v.EdbInfoType {
  260. case 0: //普通运算指标
  261. calculateInfoArr = append(calculateInfoArr, v)
  262. case 1: //预测运算指标
  263. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  264. }
  265. }
  266. // 预测计算指标
  267. for _, v := range predictCalculateInfoArr {
  268. getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  269. if tmpErr != nil {
  270. err = tmpErr
  271. fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
  272. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  273. return
  274. }
  275. for _, tmpEdbInfo := range getBaseEdbInfoArr {
  276. switch tmpEdbInfo.EdbInfoType {
  277. case 0: //普通基础指标
  278. baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
  279. case 1: //预测基础指标
  280. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  281. }
  282. }
  283. for _, tmpEdbInfo := range getCalculateInfoArr {
  284. switch tmpEdbInfo.EdbInfoType {
  285. case 0: //普通运算指标
  286. calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
  287. case 1: //预测运算指标
  288. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  289. }
  290. }
  291. switch v.EdbInfoType {
  292. case 0: //普通运算指标
  293. calculateInfoArr = append(calculateInfoArr, v)
  294. case 1: //预测运算指标
  295. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  296. }
  297. }
  298. // 第一次的计算指标map
  299. newCalculateMap = make(map[int]*data_manage.EdbInfo)
  300. for _, v := range calculateInfoArr {
  301. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  302. calculateArr = append(calculateArr, v.EdbInfoId)
  303. }
  304. newCalculateMap[v.EdbInfoId] = v
  305. }
  306. // 基础预测指标
  307. if len(basePredictEdbInfoArr) > 0 {
  308. basePredictEdbInfoIdList := make([]int, 0)
  309. for _, v := range basePredictEdbInfoArr {
  310. basePredictEdbInfoIdList = append(basePredictEdbInfoIdList, v.EdbInfoId)
  311. }
  312. baseEdbInfoList, tmpErr := data_manage.GetPredictEdbInfoAllCalculate(basePredictEdbInfoIdList)
  313. if tmpErr != nil {
  314. err = tmpErr
  315. return
  316. }
  317. tmpCalculateList := make([]*data_manage.EdbInfo, 0)
  318. for _, v := range baseEdbInfoList {
  319. switch v.EdbType {
  320. case 1:
  321. baseEdbInfoArr = append(baseEdbInfoArr, v)
  322. case 2:
  323. // 如果不在第一次里面,那么在第二次 刷新预测指标的时候 需要加进去
  324. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  325. tmpCalculateList = append(tmpCalculateList, v)
  326. }
  327. }
  328. }
  329. // 这里是查询预测指标用到的 普通计算指标
  330. for _, v := range tmpCalculateList {
  331. getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  332. if tmpErr != nil {
  333. err = tmpErr
  334. fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
  335. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  336. return
  337. }
  338. // 基础指标
  339. for _, tmpEdbInfo := range getBaseEdbInfoArr {
  340. switch tmpEdbInfo.EdbInfoType {
  341. case 0: //普通基础指标
  342. baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
  343. case 1: //预测基础指标
  344. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  345. }
  346. }
  347. // 计算指标
  348. for _, tmpEdbInfo := range getCalculateInfoArr {
  349. switch tmpEdbInfo.EdbInfoType {
  350. case 0: //普通运算指标
  351. calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
  352. case 1: //预测运算指标
  353. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  354. }
  355. }
  356. switch v.EdbInfoType {
  357. case 0: //普通运算指标
  358. calculateInfoArr = append(calculateInfoArr, v)
  359. case 1: //预测运算指标
  360. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  361. }
  362. }
  363. // 第二次计算指标的map
  364. for _, v := range calculateInfoArr {
  365. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  366. calculateArr = append(calculateArr, v.EdbInfoId)
  367. }
  368. newCalculateMap[v.EdbInfoId] = v
  369. }
  370. }
  371. // 普通基础指标去重
  372. newBaseEdbInfoArr = make([]*data_manage.EdbInfo, 0)
  373. baseMap := make(map[int]int)
  374. for _, v := range baseEdbInfoArr {
  375. if _, ok := baseMap[v.EdbInfoId]; !ok {
  376. newBaseEdbInfoArr = append(newBaseEdbInfoArr, v)
  377. }
  378. baseMap[v.EdbInfoId] = v.EdbInfoId
  379. }
  380. // 普通计算指标的id
  381. sort.Ints(calculateArr)
  382. // 预测计算指标去重
  383. newPredictCalculateMap = make(map[int]*data_manage.EdbInfo)
  384. for _, v := range predictCalculateInfoArr {
  385. if _, ok := newPredictCalculateMap[v.EdbInfoId]; !ok {
  386. predictCalculateArr = append(predictCalculateArr, v.EdbInfoId)
  387. }
  388. newPredictCalculateMap[v.EdbInfoId] = v
  389. }
  390. // 预测计算指标的id
  391. sort.Ints(predictCalculateArr)
  392. return
  393. }