edb_info.go 51 KB

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