edb_info.go 50 KB

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