edb_info.go 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279
  1. package data
  2. import (
  3. "errors"
  4. "eta_gn/eta_chart_lib/models"
  5. "eta_gn/eta_chart_lib/models/data_manage"
  6. "eta_gn/eta_chart_lib/services/alarm_msg"
  7. "eta_gn/eta_chart_lib/utils"
  8. "fmt"
  9. "math"
  10. "sort"
  11. "time"
  12. "github.com/shopspring/decimal"
  13. )
  14. func EdbInfoRefreshAllFromBaseBak(edbInfoIdList []int, refreshAll bool) (err error, errmsg string) {
  15. defer func() {
  16. if err != nil {
  17. fmt.Println("EdbInfoRefreshAllFromBaseV2 Err:" + err.Error() + ";errmsg:" + errmsg)
  18. go alarm_msg.SendAlarmMsg("EdbInfoRefreshFromBaseV2,Err"+err.Error()+";errMsg:"+errmsg, 3)
  19. }
  20. }()
  21. newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr, err, errmsg := getRefreshEdbInfoListByIds(edbInfoIdList)
  22. if err != nil {
  23. return
  24. }
  25. var startDate string
  26. for _, bv := range newBaseEdbInfoArr {
  27. startDate = utils.BaseEdbRefreshStartDate
  28. if !refreshAll { //不是刷新所有数据,用结束时间减去对应期数作为起始日期去刷新
  29. sDate := bv.EndDate
  30. if sDate == `` || sDate == `0000-00-00` {
  31. sDate = utils.BaseEdbRefreshStartDate
  32. }
  33. sTime, tmpErr := time.ParseInLocation(utils.FormatDate, sDate, time.Local)
  34. if tmpErr != nil {
  35. err = tmpErr
  36. errmsg = err.Error()
  37. return
  38. }
  39. frequency := bv.Frequency
  40. var limitDay int
  41. switch frequency {
  42. case "日度":
  43. limitDay = utils.DATA_REFRESH
  44. case "周度":
  45. limitDay = utils.DATA_REFRESH * 7
  46. case "月度":
  47. limitDay = utils.DATA_REFRESH * 30
  48. case "季度":
  49. limitDay = utils.DATA_REFRESH * 90
  50. case "年度":
  51. limitDay = utils.DATA_REFRESH * 365
  52. default:
  53. limitDay = utils.DATA_REFRESH
  54. }
  55. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  56. }
  57. result, tmpErr := RefreshEdbData(bv.EdbInfoId, bv.Source, bv.SubSource, bv.EdbCode, startDate)
  58. if tmpErr != nil {
  59. err = tmpErr
  60. fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err", time.Now())
  61. errmsg = "RefreshBaseEdbData Err:" + tmpErr.Error()
  62. return
  63. }
  64. if result.Ret != 200 {
  65. fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  66. errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  67. err = fmt.Errorf("刷新失败, err:", errmsg)
  68. return
  69. }
  70. fmt.Println("end newBaseEdbInfoArr:", bv, time.Now())
  71. }
  72. for _, v := range calculateArr {
  73. edbInfo := newCalculateMap[v]
  74. if edbInfo == nil {
  75. return
  76. }
  77. startDate = edbInfo.StartDate
  78. source := edbInfo.Source
  79. if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
  80. startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
  81. } else {
  82. if source == utils.DATA_SOURCE_CALCULATE {
  83. startDate = ``
  84. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  85. startDate = edbInfo.StartDate
  86. } else {
  87. sTime, tmpErr := time.Parse(utils.FormatDate, edbInfo.EndDate)
  88. if tmpErr != nil {
  89. err = tmpErr
  90. errmsg = tmpErr.Error()
  91. return
  92. }
  93. frequency := edbInfo.Frequency
  94. var limitDay int
  95. switch frequency {
  96. case "日度":
  97. limitDay = utils.DATA_REFRESH
  98. case "周度":
  99. limitDay = utils.DATA_REFRESH * 7
  100. case "月度":
  101. limitDay = utils.DATA_REFRESH * 30
  102. case "季度":
  103. limitDay = utils.DATA_REFRESH * 90
  104. case "年度":
  105. limitDay = utils.DATA_REFRESH * 365
  106. default:
  107. limitDay = utils.DATA_REFRESH
  108. }
  109. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  110. }
  111. }
  112. }
  113. result, tmpErr := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  114. if tmpErr != nil {
  115. err = tmpErr
  116. fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
  117. errmsg = "RefreshEdbCalculateData Err:" + tmpErr.Error()
  118. return
  119. }
  120. if result.Ret != 200 {
  121. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  122. errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  123. err = fmt.Errorf("刷新失败")
  124. return
  125. }
  126. }
  127. for _, v := range predictCalculateArr {
  128. edbInfo := newPredictCalculateMap[v]
  129. if edbInfo == nil {
  130. return
  131. }
  132. startDate = edbInfo.StartDate
  133. source := edbInfo.Source
  134. if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
  135. startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
  136. } else {
  137. if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
  138. startDate = ``
  139. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  140. startDate = edbInfo.StartDate
  141. } else {
  142. sTime, tmpErr := time.Parse(utils.FormatDate, edbInfo.EndDate)
  143. if tmpErr != nil {
  144. err = tmpErr
  145. errmsg = tmpErr.Error()
  146. return
  147. }
  148. frequency := edbInfo.Frequency
  149. var limitDay int
  150. switch frequency {
  151. case "日度":
  152. limitDay = utils.DATA_REFRESH
  153. case "周度":
  154. limitDay = utils.DATA_REFRESH * 7
  155. case "月度":
  156. limitDay = utils.DATA_REFRESH * 30
  157. case "季度":
  158. limitDay = utils.DATA_REFRESH * 90
  159. case "年度":
  160. limitDay = utils.DATA_REFRESH * 365
  161. default:
  162. limitDay = utils.DATA_REFRESH
  163. }
  164. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  165. }
  166. }
  167. }
  168. result, tmpErr := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  169. if tmpErr != nil {
  170. err = tmpErr
  171. fmt.Println(v, "RefreshPredictEdbCalculateData err", time.Now())
  172. errmsg = "RefreshPredictEdbCalculateData Err:" + tmpErr.Error()
  173. return
  174. }
  175. if result.Ret != 200 {
  176. fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  177. errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  178. err = fmt.Errorf("刷新失败")
  179. return
  180. }
  181. }
  182. {
  183. predictEdbInfoIdList := make([]int, 0)
  184. for _, v := range newBasePredictEdbInfoArr {
  185. predictEdbInfoIdList = append(predictEdbInfoIdList, v.EdbInfoId)
  186. }
  187. fmt.Println("predictEdbConfCalculateMappingDetailList:", predictEdbInfoIdList)
  188. predictEdbConfCalculateMappingDetailList, tmpErr := data_manage.GetPredictEdbConfCalculateMappingDetailListByEdbInfoId(predictEdbInfoIdList)
  189. if tmpErr != nil {
  190. err = tmpErr
  191. errmsg = fmt.Sprint("更新动态环差值时,获取数据失败:" + err.Error())
  192. return
  193. }
  194. for _, bv := range predictEdbConfCalculateMappingDetailList {
  195. result, tmpErr := RefreshEdbData(bv.EdbInfoId, utils.DATA_SOURCE_PREDICT, utils.DATA_SUB_SOURCE_EDB, bv.EdbCode, "")
  196. if tmpErr != nil {
  197. err = tmpErr
  198. fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err", time.Now())
  199. errmsg = "RefreshBasePredictEdbData Err:" + err.Error()
  200. return
  201. }
  202. if result.Ret != 200 {
  203. fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  204. errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBasePredictEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  205. err = errors.New("刷新失败:" + errmsg)
  206. return
  207. }
  208. fmt.Println("end predictEdbConfCalculateMappingDetailList:", bv, time.Now())
  209. }
  210. }
  211. for _, v := range predictCalculateArr {
  212. edbInfo := newPredictCalculateMap[v]
  213. if edbInfo == nil {
  214. return
  215. }
  216. startDate = edbInfo.StartDate
  217. source := edbInfo.Source
  218. if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
  219. startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
  220. } else {
  221. if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
  222. startDate = ``
  223. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  224. startDate = edbInfo.StartDate
  225. } else {
  226. sTime, tmpErr := time.Parse(utils.FormatDate, edbInfo.EndDate)
  227. if tmpErr != nil {
  228. err = tmpErr
  229. errmsg = tmpErr.Error()
  230. return
  231. }
  232. frequency := edbInfo.Frequency
  233. var limitDay int
  234. switch frequency {
  235. case "日度":
  236. limitDay = utils.DATA_REFRESH
  237. case "周度":
  238. limitDay = utils.DATA_REFRESH * 7
  239. case "月度":
  240. limitDay = utils.DATA_REFRESH * 30
  241. case "季度":
  242. limitDay = utils.DATA_REFRESH * 90
  243. case "年度":
  244. limitDay = utils.DATA_REFRESH * 365
  245. default:
  246. limitDay = utils.DATA_REFRESH
  247. }
  248. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  249. }
  250. }
  251. }
  252. result, tmpErr := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  253. if tmpErr != nil {
  254. err = tmpErr
  255. fmt.Println(v, "RefreshPredictEdbCalculateData err", time.Now())
  256. errmsg = "RefreshPredictEdbCalculateData Err:" + tmpErr.Error()
  257. return
  258. }
  259. if result.Ret != 200 {
  260. fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  261. errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  262. err = fmt.Errorf("刷新失败")
  263. return
  264. }
  265. }
  266. return
  267. }
  268. func getRefreshEdbInfoListByIds(edbInfoIdList []int) (newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int, err error, errMsg string) {
  269. calculateList, err := data_manage.GetEdbInfoAllCalculateByEdbInfoIdList(edbInfoIdList)
  270. if err != nil && !utils.IsErrNoRow(err) {
  271. err = errors.New("GetEdbInfoAllCalculate Err:" + err.Error())
  272. return
  273. }
  274. edbInfoList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
  275. if err != nil {
  276. err = errors.New("GetEdbInfoAllCalGetEdbInfoByIdr:" + err.Error())
  277. return
  278. }
  279. baseEdbInfoArr := make([]*data_manage.EdbInfo, 0) // 基础普通指标
  280. calculateInfoArr := make([]*data_manage.EdbInfo, 0) //基础运算指标
  281. basePredictEdbInfoArr := make([]*data_manage.EdbInfo, 0) // 预测普通指标
  282. predictCalculateInfoArr := make([]*data_manage.EdbInfo, 0) //预测运算指标
  283. for _, baseEdbInfo := range edbInfoList {
  284. if baseEdbInfo.EdbInfoType == 0 { //普通指标
  285. switch baseEdbInfo.EdbType {
  286. case 1: //基础指标
  287. baseEdbInfoArr = append(baseEdbInfoArr, baseEdbInfo)
  288. case 2: //计算指标
  289. calculateList = append(calculateList, baseEdbInfo)
  290. }
  291. } else { //预测指标
  292. switch baseEdbInfo.EdbType {
  293. case 1: //基础指标
  294. basePredictEdbInfoArr = append(basePredictEdbInfoArr, baseEdbInfo)
  295. case 2: //计算指标
  296. predictCalculateInfoArr = append(predictCalculateInfoArr, baseEdbInfo)
  297. }
  298. }
  299. }
  300. for _, v := range calculateList {
  301. getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  302. if tmpErr != nil {
  303. err = tmpErr
  304. fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
  305. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  306. return
  307. }
  308. for _, tmpEdbInfo := range getBaseEdbInfoArr {
  309. switch tmpEdbInfo.EdbInfoType {
  310. case 0: //普通基础指标
  311. baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
  312. case 1: //预测基础指标
  313. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  314. }
  315. }
  316. for _, tmpEdbInfo := range getCalculateInfoArr {
  317. switch tmpEdbInfo.EdbInfoType {
  318. case 0: //普通运算指标
  319. calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
  320. case 1: //预测运算指标
  321. if tmpEdbInfo.EdbType == 1 { //预测普通指标
  322. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  323. } else {
  324. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  325. }
  326. }
  327. }
  328. switch v.EdbInfoType {
  329. case 0: //普通运算指标
  330. calculateInfoArr = append(calculateInfoArr, v)
  331. case 1: //预测运算指标
  332. if v.EdbType == 1 { //预测普通指标
  333. basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
  334. } else {
  335. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  336. }
  337. }
  338. }
  339. for _, v := range predictCalculateInfoArr {
  340. getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  341. if tmpErr != nil {
  342. err = tmpErr
  343. fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
  344. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  345. return
  346. }
  347. for _, tmpEdbInfo := range getBaseEdbInfoArr {
  348. switch tmpEdbInfo.EdbInfoType {
  349. case 0: //普通基础指标
  350. baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
  351. case 1: //预测基础指标
  352. if tmpEdbInfo.EdbType == 1 { //预测普通指标
  353. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  354. } else {
  355. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  356. }
  357. }
  358. }
  359. for _, tmpEdbInfo := range getCalculateInfoArr {
  360. switch tmpEdbInfo.EdbInfoType {
  361. case 0: //普通运算指标
  362. calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
  363. case 1: //预测运算指标
  364. if tmpEdbInfo.EdbType == 1 { //预测普通指标
  365. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  366. } else {
  367. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  368. }
  369. }
  370. }
  371. switch v.EdbInfoType {
  372. case 0: //普通运算指标
  373. calculateInfoArr = append(calculateInfoArr, v)
  374. case 1: //预测运算指标
  375. if v.EdbType == 1 { //预测普通指标
  376. basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
  377. } else {
  378. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  379. }
  380. }
  381. }
  382. newCalculateMap = make(map[int]*data_manage.EdbInfo)
  383. for _, v := range calculateInfoArr {
  384. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  385. calculateArr = append(calculateArr, v.EdbInfoId)
  386. }
  387. newCalculateMap[v.EdbInfoId] = v
  388. }
  389. if len(basePredictEdbInfoArr) > 0 {
  390. basePredictEdbInfoIdList := make([]int, 0)
  391. for _, v := range basePredictEdbInfoArr {
  392. basePredictEdbInfoIdList = append(basePredictEdbInfoIdList, v.EdbInfoId)
  393. }
  394. baseEdbInfoList, tmpErr := data_manage.GetPredictEdbInfoAllCalculate(basePredictEdbInfoIdList)
  395. if tmpErr != nil {
  396. err = tmpErr
  397. return
  398. }
  399. tmpCalculateList := make([]*data_manage.EdbInfo, 0)
  400. for _, v := range baseEdbInfoList {
  401. switch v.EdbType {
  402. case 1:
  403. baseEdbInfoArr = append(baseEdbInfoArr, v)
  404. case 2:
  405. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  406. tmpCalculateList = append(tmpCalculateList, v)
  407. }
  408. }
  409. }
  410. for _, v := range tmpCalculateList {
  411. getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  412. if tmpErr != nil {
  413. err = tmpErr
  414. fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
  415. errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
  416. return
  417. }
  418. for _, tmpEdbInfo := range getBaseEdbInfoArr {
  419. switch tmpEdbInfo.EdbInfoType {
  420. case 0: //普通基础指标
  421. baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
  422. case 1: //预测基础指标
  423. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  424. }
  425. }
  426. for _, tmpEdbInfo := range getCalculateInfoArr {
  427. switch tmpEdbInfo.EdbInfoType {
  428. case 0: //普通运算指标
  429. calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
  430. case 1: //预测运算指标
  431. if tmpEdbInfo.EdbType == 1 { //预测普通指标
  432. basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
  433. } else {
  434. predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
  435. }
  436. }
  437. }
  438. switch v.EdbInfoType {
  439. case 0: //普通运算指标
  440. calculateInfoArr = append(calculateInfoArr, v)
  441. case 1: //预测运算指标
  442. if v.EdbType == 1 { //预测普通指标
  443. basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
  444. } else {
  445. predictCalculateInfoArr = append(predictCalculateInfoArr, v)
  446. }
  447. }
  448. }
  449. for _, v := range calculateInfoArr {
  450. if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
  451. calculateArr = append(calculateArr, v.EdbInfoId)
  452. }
  453. newCalculateMap[v.EdbInfoId] = v
  454. }
  455. }
  456. newBaseEdbInfoArr = make([]*data_manage.EdbInfo, 0)
  457. baseMap := make(map[int]int)
  458. for _, v := range baseEdbInfoArr {
  459. if _, ok := baseMap[v.EdbInfoId]; !ok {
  460. newBaseEdbInfoArr = append(newBaseEdbInfoArr, v)
  461. }
  462. baseMap[v.EdbInfoId] = v.EdbInfoId
  463. }
  464. sort.Ints(calculateArr)
  465. newBasePredictEdbInfoArr = make([]*data_manage.EdbInfo, 0)
  466. basePredictMap := make(map[int]int)
  467. for _, v := range basePredictEdbInfoArr {
  468. if _, ok := basePredictMap[v.EdbInfoId]; !ok {
  469. newBasePredictEdbInfoArr = append(newBasePredictEdbInfoArr, v)
  470. }
  471. basePredictMap[v.EdbInfoId] = v.EdbInfoId
  472. }
  473. newPredictCalculateMap = make(map[int]*data_manage.EdbInfo)
  474. for _, v := range predictCalculateInfoArr {
  475. if _, ok := newPredictCalculateMap[v.EdbInfoId]; !ok {
  476. predictCalculateArr = append(predictCalculateArr, v.EdbInfoId)
  477. }
  478. newPredictCalculateMap[v.EdbInfoId] = v
  479. }
  480. sort.Ints(predictCalculateArr)
  481. return
  482. }
  483. func GetEdbSourceByEdbInfoIdList(chartEdbInfoMappingList []*models.ChartEdbInfoMapping) (sourceNameList, sourceNameEnList []string) {
  484. sourceNameList = make([]string, 0)
  485. sourceNameEnList = make([]string, 0)
  486. sourceMap := make(map[int]string)
  487. for _, v := range chartEdbInfoMappingList {
  488. if v.EdbType == 2 || v.EdbInfoCategoryType == 1 {
  489. baseEdbInfoArr, _, _ := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  490. for _, baseEdbInfo := range baseEdbInfoArr {
  491. if baseEdbInfo.EdbInfoType == 0 { //普通指标才参与,预测指标不参与
  492. sourceMap[baseEdbInfo.Source] = baseEdbInfo.SourceName
  493. }
  494. }
  495. } else {
  496. sourceMap[v.Source] = v.SourceName
  497. }
  498. }
  499. for source, sourceName := range sourceMap {
  500. if utils.InArrayByInt([]int{utils.DATA_SOURCE_MANUAL}, source) {
  501. continue
  502. }
  503. sourceNameList = append(sourceNameList, sourceName)
  504. sourceNameEn, ok := utils.DataSourceEnMap[source]
  505. if !ok {
  506. sourceNameEn = sourceName
  507. }
  508. sourceNameEnList = append(sourceNameEnList, sourceNameEn)
  509. }
  510. conf, e := models.GetBusinessConf()
  511. if e != nil {
  512. return
  513. }
  514. if conf[models.BusinessConfCompanyName] != "" {
  515. sourceNameList = append(sourceNameList, conf[models.BusinessConfCompanyName])
  516. sourceNameEnList = append(sourceNameEnList, conf[models.BusinessConfCompanyName])
  517. }
  518. return
  519. }
  520. func edbInfoRefreshAll(refreshAll bool, newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int) (err error, errmsg string) {
  521. defer func() {
  522. if err != nil {
  523. fmt.Println("EdbInfoRefreshAllFromBaseV2 Err:" + err.Error() + ";errmsg:" + errmsg)
  524. go alarm_msg.SendAlarmMsg("EdbInfoRefreshFromBaseV2,Err"+err.Error()+";errMsg:"+errmsg, 3)
  525. }
  526. }()
  527. var startDate string
  528. for _, bv := range newBaseEdbInfoArr {
  529. if bv.StartDate == "0000-00-00" {
  530. continue
  531. }
  532. startDate = utils.BaseEdbRefreshStartDate
  533. if !refreshAll { // 非刷新所有数据,用结束时间减去对应期数作为起始日期去刷新
  534. sDate := bv.EndDate
  535. if sDate == `` || sDate == `0000-00-00` {
  536. sDate = utils.BaseEdbRefreshStartDate
  537. }
  538. sTime, tmpErr := time.Parse(utils.FormatDate, sDate)
  539. if tmpErr != nil {
  540. err = tmpErr
  541. errmsg = "时间格式转换失败2"
  542. return
  543. }
  544. frequency := bv.Frequency
  545. var limitDay int
  546. switch frequency {
  547. case "日度":
  548. limitDay = utils.DATA_REFRESH
  549. case "周度":
  550. limitDay = utils.DATA_REFRESH * 7
  551. case "月度":
  552. limitDay = utils.DATA_REFRESH * 30
  553. case "季度":
  554. limitDay = utils.DATA_REFRESH * 90
  555. case "年度":
  556. limitDay = utils.DATA_REFRESH * 365
  557. default:
  558. limitDay = utils.DATA_REFRESH
  559. }
  560. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  561. }
  562. result, tmpErr := RefreshEdbData(bv.EdbInfoId, bv.Source, bv.SubSource, bv.EdbCode, startDate)
  563. if tmpErr != nil {
  564. err = tmpErr
  565. fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err", time.Now())
  566. errmsg = "RefreshBaseEdbData Err:" + tmpErr.Error()
  567. return
  568. }
  569. if result.Ret != 200 {
  570. fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  571. errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  572. err = fmt.Errorf("刷新失败, err:", errmsg)
  573. return
  574. }
  575. fmt.Println("end newBaseEdbInfoArr:", bv, time.Now())
  576. }
  577. for _, v := range calculateArr {
  578. edbInfo := newCalculateMap[v]
  579. if edbInfo == nil {
  580. return
  581. }
  582. startDate = edbInfo.StartDate
  583. source := edbInfo.Source
  584. if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
  585. startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
  586. } else {
  587. if source == utils.DATA_SOURCE_CALCULATE {
  588. startDate = ``
  589. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  590. startDate = edbInfo.StartDate
  591. } else {
  592. sTime, tmpErr := time.Parse(utils.FormatDate, edbInfo.EndDate)
  593. if tmpErr != nil {
  594. err = tmpErr
  595. errmsg = tmpErr.Error()
  596. return
  597. }
  598. frequency := edbInfo.Frequency
  599. var limitDay int
  600. switch frequency {
  601. case "日度":
  602. limitDay = utils.DATA_REFRESH
  603. case "周度":
  604. limitDay = utils.DATA_REFRESH * 7
  605. case "月度":
  606. limitDay = utils.DATA_REFRESH * 30
  607. case "季度":
  608. limitDay = utils.DATA_REFRESH * 90
  609. case "年度":
  610. limitDay = utils.DATA_REFRESH * 365
  611. default:
  612. limitDay = utils.DATA_REFRESH
  613. }
  614. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  615. }
  616. }
  617. }
  618. result, tmpErr := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  619. if tmpErr != nil {
  620. err = tmpErr
  621. fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
  622. errmsg = "RefreshEdbCalculateData Err:" + tmpErr.Error()
  623. return
  624. }
  625. if result.Ret != 200 {
  626. fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  627. errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  628. err = fmt.Errorf("刷新失败")
  629. return
  630. }
  631. }
  632. for _, v := range predictCalculateArr {
  633. edbInfo := newPredictCalculateMap[v]
  634. if edbInfo == nil {
  635. return
  636. }
  637. startDate = edbInfo.StartDate
  638. source := edbInfo.Source
  639. if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
  640. startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
  641. } else {
  642. if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
  643. startDate = ``
  644. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  645. startDate = edbInfo.StartDate
  646. } else {
  647. sTime, tmpErr := time.Parse(utils.FormatDate, edbInfo.EndDate)
  648. if tmpErr != nil {
  649. err = tmpErr
  650. errmsg = tmpErr.Error()
  651. return
  652. }
  653. frequency := edbInfo.Frequency
  654. var limitDay int
  655. switch frequency {
  656. case "日度":
  657. limitDay = utils.DATA_REFRESH
  658. case "周度":
  659. limitDay = utils.DATA_REFRESH * 7
  660. case "月度":
  661. limitDay = utils.DATA_REFRESH * 30
  662. case "季度":
  663. limitDay = utils.DATA_REFRESH * 90
  664. case "年度":
  665. limitDay = utils.DATA_REFRESH * 365
  666. default:
  667. limitDay = utils.DATA_REFRESH
  668. }
  669. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  670. }
  671. }
  672. }
  673. result, tmpErr := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  674. if tmpErr != nil {
  675. err = tmpErr
  676. fmt.Println(v, "RefreshPredictEdbCalculateData err", time.Now())
  677. errmsg = "RefreshPredictEdbCalculateData Err:" + tmpErr.Error()
  678. return
  679. }
  680. if result.Ret != 200 {
  681. fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  682. errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  683. err = fmt.Errorf("刷新失败")
  684. return
  685. }
  686. }
  687. {
  688. predictEdbInfoIdList := make([]int, 0)
  689. for _, v := range newBasePredictEdbInfoArr {
  690. predictEdbInfoIdList = append(predictEdbInfoIdList, v.EdbInfoId)
  691. }
  692. fmt.Println("predictEdbConfCalculateMappingDetailList:", predictEdbInfoIdList)
  693. predictEdbConfCalculateMappingDetailList, tmpErr := data_manage.GetPredictEdbConfCalculateMappingDetailListByEdbInfoId(predictEdbInfoIdList)
  694. if tmpErr != nil {
  695. err = tmpErr
  696. errmsg = fmt.Sprint("更新动态环差值时,获取数据失败:" + err.Error())
  697. return
  698. }
  699. for _, bv := range predictEdbConfCalculateMappingDetailList {
  700. result, tmpErr := RefreshEdbData(bv.EdbInfoId, utils.DATA_SOURCE_PREDICT, utils.DATA_SUB_SOURCE_EDB, bv.EdbCode, "")
  701. if tmpErr != nil {
  702. err = tmpErr
  703. fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err", time.Now())
  704. errmsg = "RefreshBasePredictEdbData Err:" + err.Error()
  705. return
  706. }
  707. if result.Ret != 200 {
  708. fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  709. errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBasePredictEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  710. err = errors.New("刷新失败:" + errmsg)
  711. return
  712. }
  713. fmt.Println("end predictEdbConfCalculateMappingDetailList:", bv, time.Now())
  714. }
  715. }
  716. for _, v := range predictCalculateArr {
  717. edbInfo := newPredictCalculateMap[v]
  718. if edbInfo == nil {
  719. return
  720. }
  721. startDate = edbInfo.StartDate
  722. source := edbInfo.Source
  723. if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
  724. startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
  725. } else {
  726. if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
  727. startDate = ``
  728. if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
  729. startDate = edbInfo.StartDate
  730. } else {
  731. sTime, tmpErr := time.Parse(utils.FormatDate, edbInfo.EndDate)
  732. if tmpErr != nil {
  733. err = tmpErr
  734. errmsg = tmpErr.Error()
  735. return
  736. }
  737. frequency := edbInfo.Frequency
  738. var limitDay int
  739. switch frequency {
  740. case "日度":
  741. limitDay = utils.DATA_REFRESH
  742. case "周度":
  743. limitDay = utils.DATA_REFRESH * 7
  744. case "月度":
  745. limitDay = utils.DATA_REFRESH * 30
  746. case "季度":
  747. limitDay = utils.DATA_REFRESH * 90
  748. case "年度":
  749. limitDay = utils.DATA_REFRESH * 365
  750. default:
  751. limitDay = utils.DATA_REFRESH
  752. }
  753. startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
  754. }
  755. }
  756. }
  757. result, tmpErr := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
  758. if tmpErr != nil {
  759. err = tmpErr
  760. fmt.Println(v, "RefreshPredictEdbCalculateData err", time.Now())
  761. errmsg = "RefreshPredictEdbCalculateData Err:" + tmpErr.Error()
  762. return
  763. }
  764. if result.Ret != 200 {
  765. fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  766. errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
  767. err = fmt.Errorf("刷新失败")
  768. return
  769. }
  770. }
  771. return
  772. }
  773. func EdbInfoRefreshAllFromBase(edbInfoIdList []int, refreshAll bool) (err error, errMsg string) {
  774. defer func() {
  775. if err != nil {
  776. fmt.Println("EdbInfoRefreshAllFromBaseV3 Err:" + err.Error() + ";errMsg:" + errMsg)
  777. go alarm_msg.SendAlarmMsg("EdbInfoRefreshAllFromBaseV3,Err"+err.Error()+";errMsg:"+errMsg, 3)
  778. }
  779. }()
  780. traceEdbInfoList, err := TraceEdbInfoByEdbInfoIdList(edbInfoIdList)
  781. if err != nil {
  782. return
  783. }
  784. existEdbInfoIdMap := make(map[int]int)
  785. newBaseEdbInfoArr := make([]*data_manage.EdbInfo, 0)
  786. newBasePredictEdbInfoArr := make([]*data_manage.EdbInfo, 0)
  787. newBaseMap := make(map[int]*data_manage.EdbInfo)
  788. newPredictBaseMap := make(map[int]*data_manage.EdbInfo)
  789. newCalculateMap := make(map[int]*data_manage.EdbInfo)
  790. newPredictCalculateMap := make(map[int]*data_manage.EdbInfo)
  791. calculateArr := make([]int, 0)
  792. predictCalculateArr := make([]int, 0)
  793. for _, traceEdbInfo := range traceEdbInfoList {
  794. tmpBaseEdbInfoArr, tmpBasePredictEdbInfoArr, tmpCalculateMap, tmpPredictCalculateMap, _, _ := getRefreshEdbInfoListByTraceEdbInfo(traceEdbInfo, existEdbInfoIdMap)
  795. for _, edbInfo := range tmpBaseEdbInfoArr {
  796. if _, ok := newBaseMap[edbInfo.EdbInfoId]; !ok {
  797. if edbInfo.NoUpdate == 1 {
  798. continue
  799. }
  800. newBaseMap[edbInfo.EdbInfoId] = edbInfo
  801. newBaseEdbInfoArr = append(newBaseEdbInfoArr, edbInfo)
  802. }
  803. }
  804. for _, edbInfo := range tmpBasePredictEdbInfoArr {
  805. if _, ok := newPredictBaseMap[edbInfo.EdbInfoId]; !ok {
  806. newPredictBaseMap[edbInfo.EdbInfoId] = edbInfo
  807. newBasePredictEdbInfoArr = append(newBasePredictEdbInfoArr, edbInfo)
  808. }
  809. }
  810. for _, edbInfo := range tmpCalculateMap {
  811. if _, ok := newCalculateMap[edbInfo.EdbInfoId]; !ok {
  812. if edbInfo.NoUpdate == 1 {
  813. continue
  814. }
  815. newCalculateMap[edbInfo.EdbInfoId] = edbInfo
  816. calculateArr = append(calculateArr, edbInfo.EdbInfoId)
  817. }
  818. }
  819. for _, edbInfo := range tmpPredictCalculateMap {
  820. if _, ok := newPredictCalculateMap[edbInfo.EdbInfoId]; !ok {
  821. newPredictCalculateMap[edbInfo.EdbInfoId] = edbInfo
  822. predictCalculateArr = append(predictCalculateArr, edbInfo.EdbInfoId)
  823. }
  824. }
  825. }
  826. sort.Ints(calculateArr)
  827. sort.Ints(predictCalculateArr)
  828. totalEdbInfo := len(newBaseEdbInfoArr) + len(calculateArr) + len(predictCalculateArr) + len(newBasePredictEdbInfoArr)
  829. if totalEdbInfo == 0 {
  830. return
  831. }
  832. err, errMsg = edbInfoRefreshAll(refreshAll, newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr)
  833. return
  834. }
  835. func getRefreshEdbInfoListByTraceEdbInfo(traceEdbInfo data_manage.TraceEdbInfoResp, existEdbInfoIdMap map[int]int) (newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int) {
  836. newBaseEdbInfoArr = make([]*data_manage.EdbInfo, 0)
  837. newBasePredictEdbInfoArr = make([]*data_manage.EdbInfo, 0)
  838. newCalculateMap = make(map[int]*data_manage.EdbInfo)
  839. newPredictCalculateMap = make(map[int]*data_manage.EdbInfo)
  840. calculateArr = make([]int, 0)
  841. predictCalculateArr = make([]int, 0)
  842. _, ok := existEdbInfoIdMap[traceEdbInfo.EdbInfoId]
  843. if ok {
  844. return
  845. }
  846. existEdbInfoIdMap[traceEdbInfo.EdbInfoId] = traceEdbInfo.EdbInfoId
  847. switch traceEdbInfo.EdbInfoType {
  848. case 0: // 0-普通指标
  849. if traceEdbInfo.EdbType == 1 { //1-基础指标
  850. newBaseEdbInfoArr = append(newBaseEdbInfoArr, traceEdbInfo.EdbInfo)
  851. } else if traceEdbInfo.EdbType == 2 { //2-计算指标
  852. newCalculateMap[traceEdbInfo.EdbInfoId] = traceEdbInfo.EdbInfo
  853. calculateArr = append(calculateArr, traceEdbInfo.EdbInfoId)
  854. }
  855. case 1: // 1-预测指标
  856. if traceEdbInfo.EdbType == 1 { //1-基础指标
  857. newBasePredictEdbInfoArr = append(newBasePredictEdbInfoArr, traceEdbInfo.EdbInfo)
  858. } else if traceEdbInfo.EdbType == 2 { //2-计算指标
  859. newPredictCalculateMap[traceEdbInfo.EdbInfoId] = traceEdbInfo.EdbInfo
  860. predictCalculateArr = append(predictCalculateArr, traceEdbInfo.EdbInfoId)
  861. }
  862. }
  863. if traceEdbInfo.Child != nil && len(traceEdbInfo.Child) > 0 {
  864. for _, v := range traceEdbInfo.Child {
  865. tmpBaseEdbInfoArr, tmpPredictEdbInfoArr, tmpCalculateMap, tmpPredictCalculateMap, tmpCalculateArr, tmpPredictCalculateArr := getRefreshEdbInfoListByTraceEdbInfo(v, existEdbInfoIdMap)
  866. newBaseEdbInfoArr = append(newBaseEdbInfoArr, tmpBaseEdbInfoArr...)
  867. newBasePredictEdbInfoArr = append(newBasePredictEdbInfoArr, tmpPredictEdbInfoArr...)
  868. for k, tmpEdbInfo := range tmpCalculateMap {
  869. newCalculateMap[k] = tmpEdbInfo
  870. }
  871. for k, tmpEdbInfo := range tmpPredictCalculateMap {
  872. newPredictCalculateMap[k] = tmpEdbInfo
  873. }
  874. calculateArr = append(calculateArr, tmpCalculateArr...)
  875. predictCalculateArr = append(predictCalculateArr, tmpPredictCalculateArr...)
  876. }
  877. }
  878. return
  879. }
  880. func TraceEdbInfoByEdbInfoIdList(edbInfoIdList []int) (traceEdbInfoList []data_manage.TraceEdbInfoResp, err error) {
  881. traceEdbInfoList = make([]data_manage.TraceEdbInfoResp, 0)
  882. edbInfoList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
  883. if err != nil {
  884. return
  885. }
  886. edbInfoRuleMap := make(map[int]string, 0)
  887. edbMappingMap := make(map[int][]*data_manage.EdbInfoCalculateMappingInfo)
  888. findIdMap := make(map[int]int)
  889. existMap := make(map[int]data_manage.TraceEdbInfoResp)
  890. for _, edbInfo := range edbInfoList {
  891. findIdMap[edbInfo.EdbInfoId] = edbInfo.EdbInfoId
  892. traceEdbInfo := data_manage.TraceEdbInfoResp{
  893. EdbInfoId: edbInfo.EdbInfoId,
  894. EdbInfoType: edbInfo.EdbInfoType,
  895. EdbName: edbInfo.EdbName,
  896. EdbType: edbInfo.EdbType,
  897. UniqueCode: edbInfo.UniqueCode,
  898. ClassifyId: edbInfo.ClassifyId,
  899. EdbInfo: edbInfo,
  900. }
  901. traceEdbInfo.Child, err = traceEdbInfoByEdbInfoId(edbInfo.EdbInfoId, traceEdbInfo, edbInfoRuleMap, findIdMap, existMap, edbMappingMap)
  902. traceEdbInfoList = append(traceEdbInfoList, traceEdbInfo)
  903. }
  904. return
  905. }
  906. func traceEdbInfoByEdbInfoId(edbInfoId int, traceEdbInfo data_manage.TraceEdbInfoResp, edbInfoRuleMap map[int]string, findIdMap map[int]int, existMap map[int]data_manage.TraceEdbInfoResp, edbMappingMap map[int][]*data_manage.EdbInfoCalculateMappingInfo) (child []data_manage.TraceEdbInfoResp, err error) {
  907. traceEdbInfo, ok := existMap[edbInfoId]
  908. if ok {
  909. return
  910. }
  911. child = make([]data_manage.TraceEdbInfoResp, 0)
  912. edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
  913. if e != nil {
  914. err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
  915. return
  916. }
  917. edbInfoMap := make(map[int]*data_manage.EdbInfo)
  918. if len(edbInfoMappingList) > 0 {
  919. fromEdbInfoIdList := make([]int, 0)
  920. for _, v := range edbInfoMappingList {
  921. fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
  922. }
  923. edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(fromEdbInfoIdList)
  924. if tmpErr != nil {
  925. err = fmt.Errorf("traceEdbInfoByEdbInfoId GetEdbInfoByIdList err: %s", tmpErr.Error())
  926. return
  927. }
  928. for _, v := range edbInfoList {
  929. edbInfoMap[v.EdbInfoId] = v
  930. }
  931. }
  932. edbMappingMap[edbInfoId] = edbInfoMappingList
  933. for _, v := range edbInfoMappingList {
  934. tmpEdbInfoId := v.FromEdbInfoId
  935. tmpTraceEdbInfo := data_manage.TraceEdbInfoResp{
  936. EdbInfoId: tmpEdbInfoId,
  937. EdbInfoType: v.FromEdbInfoType,
  938. EdbType: v.FromEdbType,
  939. UniqueCode: v.FromUniqueCode,
  940. ClassifyId: v.FromClassifyId,
  941. EdbInfo: edbInfoMap[v.FromEdbInfoId],
  942. }
  943. if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
  944. if _, ok2 := findIdMap[tmpEdbInfoId]; !ok2 {
  945. tmpTraceEdbInfo.Child, e = traceEdbInfoByEdbInfoId(tmpEdbInfoId, tmpTraceEdbInfo, edbInfoRuleMap, findIdMap, existMap, edbMappingMap)
  946. if e != nil {
  947. err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
  948. return
  949. }
  950. }
  951. }
  952. child = append(child, tmpTraceEdbInfo)
  953. findIdMap[tmpEdbInfoId] = tmpEdbInfoId
  954. }
  955. existMap[edbInfoId] = traceEdbInfo
  956. return
  957. }
  958. func GetEdbSourceByEdbInfoIdListForExcel(edbInfoIdList []int) (sourceNameList, sourceNameEnList []string, err error) {
  959. sourceNameList = make([]string, 0)
  960. sourceNameEnList = make([]string, 0)
  961. sourceMap := make(map[int]string)
  962. edbInfoList, tmpErr := data_manage.GetEdbInfoByIdList(edbInfoIdList)
  963. if tmpErr != nil {
  964. err = tmpErr
  965. return
  966. }
  967. for _, v := range edbInfoList {
  968. if v.EdbType == 2 {
  969. baseEdbInfoArr, _, _ := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
  970. for _, baseEdbInfo := range baseEdbInfoArr {
  971. if baseEdbInfo.EdbInfoType == 0 { //普通指标才参与,预测指标不参与
  972. sourceMap[baseEdbInfo.Source] = baseEdbInfo.SourceName
  973. }
  974. }
  975. } else {
  976. sourceMap[v.Source] = v.SourceName
  977. }
  978. }
  979. for source, sourceName := range sourceMap {
  980. if utils.InArrayByInt([]int{utils.DATA_SOURCE_MANUAL, utils.DATA_SOURCE_MYSTEEL_CHEMICAL}, source) {
  981. continue
  982. }
  983. sourceNameList = append(sourceNameList, sourceName)
  984. sourceNameEn, ok := utils.DataSourceEnMap[source]
  985. if !ok {
  986. sourceNameEn = sourceName
  987. }
  988. sourceNameEnList = append(sourceNameEnList, sourceNameEn)
  989. }
  990. conf, e := models.GetBusinessConf()
  991. if e != nil {
  992. return
  993. }
  994. if conf[models.BusinessConfCompanyName] != "" {
  995. sourceNameList = append(sourceNameList, conf[models.BusinessConfCompanyName])
  996. sourceNameEnList = append(sourceNameEnList, conf[models.BusinessConfCompanyName])
  997. }
  998. return
  999. }
  1000. func HandleDataByLinearRegressionToList(edbInfoDataList []*models.EdbDataList, handleDataMap map[string]float64) (dataTimeList []string, valueList []float64, err error) {
  1001. if len(edbInfoDataList) < 2 {
  1002. return
  1003. }
  1004. var startEdbInfoData *models.EdbDataList
  1005. for _, v := range edbInfoDataList {
  1006. handleDataMap[v.DataTime] = v.Value
  1007. dataTimeList = append(dataTimeList, v.DataTime)
  1008. if startEdbInfoData == nil {
  1009. startEdbInfoData = v
  1010. continue
  1011. }
  1012. startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
  1013. currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  1014. betweenHour := int(currDataTime.Sub(startDataTime).Hours())
  1015. betweenDay := betweenHour / 24
  1016. if betweenDay <= 1 {
  1017. startEdbInfoData = v
  1018. continue
  1019. }
  1020. var a, b float64
  1021. {
  1022. coordinateData := make([]utils.Coordinate, 0)
  1023. tmpCoordinate1 := utils.Coordinate{
  1024. X: 1,
  1025. Y: startEdbInfoData.Value,
  1026. }
  1027. coordinateData = append(coordinateData, tmpCoordinate1)
  1028. tmpCoordinate2 := utils.Coordinate{
  1029. X: float64(betweenDay) + 1,
  1030. Y: v.Value,
  1031. }
  1032. coordinateData = append(coordinateData, tmpCoordinate2)
  1033. a, b = utils.GetLinearResult(coordinateData)
  1034. if math.IsNaN(a) || math.IsNaN(b) {
  1035. err = errors.New("线性方程公式生成失败")
  1036. return
  1037. }
  1038. }
  1039. {
  1040. for i := 1; i < betweenDay; i++ {
  1041. tmpDataTime := startDataTime.AddDate(0, 0, i)
  1042. aDecimal := decimal.NewFromFloat(a)
  1043. xDecimal := decimal.NewFromInt(int64(i) + 1)
  1044. bDecimal := decimal.NewFromFloat(b)
  1045. val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
  1046. handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
  1047. dataTimeList = append(dataTimeList, tmpDataTime.Format(utils.FormatDate))
  1048. valueList = append(valueList, val)
  1049. }
  1050. }
  1051. startEdbInfoData = v
  1052. }
  1053. return
  1054. }
  1055. func HandleDataByLinearRegressionToListV2(edbInfoDataList []*models.EdbDataList, handleDataMap map[string]float64) (dataTimeList []string, valueList []float64, err error) {
  1056. if len(edbInfoDataList) < 2 {
  1057. return
  1058. }
  1059. if len(edbInfoDataList) < 2 {
  1060. err = errors.New("至少需要两天的数据来执行线性插值")
  1061. return
  1062. }
  1063. sort.Slice(edbInfoDataList, func(i, j int) bool {
  1064. t1, _ := time.ParseInLocation(utils.FormatDate, edbInfoDataList[i].DataTime, time.Local)
  1065. t2, _ := time.ParseInLocation(utils.FormatDate, edbInfoDataList[j].DataTime, time.Local)
  1066. return t1.Before(t2)
  1067. })
  1068. startEdbInfoData := edbInfoDataList[0]
  1069. endEdbInfoData := edbInfoDataList[len(edbInfoDataList)-1]
  1070. startDate, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
  1071. endDate, _ := time.ParseInLocation(utils.FormatDate, endEdbInfoData.DataTime, time.Local)
  1072. actualDays := endDate.Sub(startDate).Hours() / 24
  1073. for _, v := range edbInfoDataList {
  1074. handleDataMap[v.DataTime] = v.Value
  1075. dataTimeList = append(dataTimeList, v.DataTime)
  1076. valueList = append(valueList, v.Value)
  1077. }
  1078. if actualDays < 365 {
  1079. var a, b float64
  1080. coordinateData := []utils.Coordinate{
  1081. {X: 1, Y: startEdbInfoData.Value},
  1082. {X: float64(len(edbInfoDataList)), Y: endEdbInfoData.Value},
  1083. }
  1084. a, b = utils.GetLinearResult(coordinateData)
  1085. if math.IsNaN(a) || math.IsNaN(b) {
  1086. err = errors.New("线性方程公式生成失败")
  1087. return
  1088. }
  1089. for i := 1; i < 365; i++ {
  1090. day := startDate.AddDate(0, 0, i)
  1091. if _, exists := handleDataMap[day.Format(utils.FormatDate)]; !exists {
  1092. aDecimal := decimal.NewFromFloat(a)
  1093. xDecimal := decimal.NewFromInt(int64(i) + 1)
  1094. bDecimal := decimal.NewFromFloat(b)
  1095. val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
  1096. handleDataMap[day.Format(utils.FormatDate)] = val
  1097. dataTimeList = append(dataTimeList, day.Format(utils.FormatDate))
  1098. valueList = append(valueList, val)
  1099. }
  1100. }
  1101. }
  1102. return
  1103. }
  1104. func HandleDataByLinearRegressionToListV3(edbInfoDataList []*models.EdbDataList, handleDataMap map[string]float64) (newEdbInfoDataList []*models.EdbDataList, dataTimeList []string, valueList []float64, err error) {
  1105. if len(edbInfoDataList) < 2 {
  1106. return
  1107. }
  1108. var startEdbInfoData *models.EdbDataList
  1109. for _, v := range edbInfoDataList {
  1110. handleDataMap[v.DataTime] = v.Value
  1111. newEdbInfoDataList = append(newEdbInfoDataList, v)
  1112. dataTimeList = append(dataTimeList, v.DataTime)
  1113. if startEdbInfoData == nil {
  1114. startEdbInfoData = v
  1115. continue
  1116. }
  1117. startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
  1118. currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  1119. betweenHour := int(currDataTime.Sub(startDataTime).Hours())
  1120. betweenDay := betweenHour / 24
  1121. if betweenDay <= 1 {
  1122. startEdbInfoData = v
  1123. continue
  1124. }
  1125. var a, b float64
  1126. {
  1127. coordinateData := make([]utils.Coordinate, 0)
  1128. tmpCoordinate1 := utils.Coordinate{
  1129. X: 1,
  1130. Y: startEdbInfoData.Value,
  1131. }
  1132. coordinateData = append(coordinateData, tmpCoordinate1)
  1133. tmpCoordinate2 := utils.Coordinate{
  1134. X: float64(betweenDay) + 1,
  1135. Y: v.Value,
  1136. }
  1137. coordinateData = append(coordinateData, tmpCoordinate2)
  1138. a, b = utils.GetLinearResult(coordinateData)
  1139. if math.IsNaN(a) || math.IsNaN(b) {
  1140. err = errors.New("线性方程公式生成失败")
  1141. return
  1142. }
  1143. }
  1144. {
  1145. for i := 1; i < betweenDay; i++ {
  1146. tmpDataTime := startDataTime.AddDate(0, 0, i)
  1147. aDecimal := decimal.NewFromFloat(a)
  1148. xDecimal := decimal.NewFromInt(int64(i) + 1)
  1149. bDecimal := decimal.NewFromFloat(b)
  1150. val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
  1151. handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
  1152. dataTimeList = append(dataTimeList, tmpDataTime.Format(utils.FormatDate))
  1153. valueList = append(valueList, val)
  1154. newEdbInfoDataList = append(newEdbInfoDataList, &models.EdbDataList{
  1155. EdbDataId: v.EdbDataId,
  1156. EdbInfoId: v.EdbInfoId,
  1157. DataTime: tmpDataTime.Format(utils.FormatDate),
  1158. DataTimestamp: tmpDataTime.UnixNano() / 1e6,
  1159. Value: val,
  1160. })
  1161. }
  1162. }
  1163. startEdbInfoData = v
  1164. }
  1165. return
  1166. }