edb_info_calculate.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734
  1. package data
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "eta/eta_api/models/data_manage"
  6. "eta/eta_api/utils"
  7. "fmt"
  8. "github.com/shopspring/decimal"
  9. "github.com/yidane/formula"
  10. "math"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. func CheckFormula(formula string) map[string]string {
  16. mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG", "LN"}
  17. str := strings.ToUpper(formula)
  18. for _, v := range mathFormula {
  19. str = strings.Replace(str, v, "", -1)
  20. }
  21. str = strings.Replace(str, "(", "", -1)
  22. str = strings.Replace(str, ")", "", -1)
  23. byteMap := make(map[string]string)
  24. for i := 0; i < len(str); i++ {
  25. byteInt := str[i]
  26. if byteInt >= 65 && byteInt <= 90 {
  27. byteStr := string(byteInt)
  28. if _, ok := byteMap[byteStr]; !ok {
  29. byteMap[byteStr] = byteStr
  30. }
  31. }
  32. }
  33. return byteMap
  34. }
  35. // CheckFormula2 校验公式是否正常(比如说除法的分母不能为0之类的,实际上就是用预设的字段数据做一次计算)
  36. func CheckFormula2(edbInfoArr []*data_manage.EdbInfo, formulaMap map[string]string, formulaStr string, edbInfoIdBytes []string) (ok bool, err error) {
  37. valArr := make(map[int]float64)
  38. for _, v := range edbInfoArr {
  39. valArr[v.EdbInfoId] = 100
  40. }
  41. formulaStr = strings.ToUpper(formulaStr)
  42. formulaFormStr := ReplaceFormula(edbInfoArr, valArr, formulaMap, formulaStr, edbInfoIdBytes)
  43. if formulaFormStr == "" {
  44. return
  45. }
  46. expression := formula.NewExpression(formulaFormStr)
  47. _, err = expression.Evaluate()
  48. if err != nil {
  49. } else {
  50. ok = true
  51. }
  52. return
  53. }
  54. type FormulaListItem struct {
  55. Formula string `json:"f"`
  56. Date string `json:"d"`
  57. }
  58. // CheckFormulaJson 检测计算公式json串是否异常
  59. func CheckFormulaJson(formula string) (formulaSlice []string, err error) {
  60. list := make([]FormulaListItem, 0)
  61. err = json.Unmarshal([]byte(formula), &list)
  62. if err != nil {
  63. err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
  64. return
  65. }
  66. formulaSlice = make([]string, 0)
  67. // 日期排序
  68. for _, v := range list {
  69. formulaSlice = append(formulaSlice, v.Formula)
  70. }
  71. return
  72. }
  73. type CalculateItems struct {
  74. EdbInfoId int
  75. DataMap map[string]float64
  76. }
  77. func Calculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCode, formulaStr string, edbInfoIdBytes []string) (err error) {
  78. defer func() {
  79. if err != nil {
  80. utils.FileLog.Info("Calculate Err:%s" + err.Error())
  81. }
  82. }()
  83. saveDataMap := make(map[string]map[int]float64)
  84. for _, v := range edbInfoIdArr {
  85. var condition string
  86. var pars []interface{}
  87. condition += " AND edb_info_id=? "
  88. pars = append(pars, v.EdbInfoId)
  89. dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, 1)
  90. if err != nil {
  91. return err
  92. }
  93. dataMap := make(map[string]float64)
  94. for _, dv := range dataList {
  95. if val, ok := saveDataMap[dv.DataTime]; ok {
  96. if _, ok := val[v.EdbInfoId]; !ok {
  97. val[v.EdbInfoId] = dv.Value
  98. }
  99. } else {
  100. temp := make(map[int]float64)
  101. temp[v.EdbInfoId] = dv.Value
  102. saveDataMap[dv.DataTime] = temp
  103. }
  104. }
  105. item := new(CalculateItems)
  106. item.EdbInfoId = v.EdbInfoId
  107. item.DataMap = dataMap
  108. }
  109. formulaMap := CheckFormula(formulaStr)
  110. addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  111. nowStr := time.Now().Format(utils.FormatDateTime)
  112. var isAdd bool
  113. for sk, sv := range saveDataMap {
  114. formulaStr = strings.ToUpper(formulaStr)
  115. formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
  116. if formulaStr == "" {
  117. return
  118. }
  119. if formulaFormStr != "" {
  120. expression := formula.NewExpression(formulaFormStr)
  121. calResult, err := expression.Evaluate()
  122. if err != nil {
  123. err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  124. fmt.Println(err)
  125. return err
  126. }
  127. calVal, err := calResult.Float64()
  128. if err != nil {
  129. err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  130. fmt.Println(err)
  131. return err
  132. }
  133. //需要存入的数据
  134. {
  135. dataTime, _ := time.Parse(utils.FormatDate, sk)
  136. timestamp := dataTime.UnixNano() / 1e6
  137. timeStr := fmt.Sprintf("%d", timestamp)
  138. addSql += "("
  139. addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + sk + "'" + "," + utils.SubFloatToString(calVal, 4) + "," + "'" + nowStr + "'" +
  140. "," + "'" + nowStr + "'" + "," + "1"
  141. addSql += "," + "'" + timeStr + "'"
  142. addSql += "),"
  143. isAdd = true
  144. }
  145. } else {
  146. fmt.Println("formulaFormStr is empty")
  147. }
  148. }
  149. if isAdd {
  150. addSql = strings.TrimRight(addSql, ",")
  151. data_manage.AddEdbDataCalculateBySql(addSql)
  152. if err != nil {
  153. fmt.Println("AddEdbDataCalculate Err:" + err.Error())
  154. return err
  155. }
  156. }
  157. return
  158. }
  159. func ReplaceFormula(edbInfoIdArr []*data_manage.EdbInfo, valArr map[int]float64, formulaMap map[string]string, formulaStr string, edbInfoIdBytes []string) string {
  160. funMap := GetFormulaMap()
  161. for k, v := range funMap {
  162. formulaStr = strings.Replace(formulaStr, k, v, -1)
  163. }
  164. replaceCount := 0
  165. for dk, dv := range edbInfoIdArr {
  166. if dk == 0 {
  167. dKey := edbInfoIdBytes[dk]
  168. if _, ok := formulaMap[dKey]; ok { //公式中存在
  169. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  170. dvStr := fmt.Sprintf("%v", val)
  171. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  172. replaceCount++
  173. } else {
  174. fmt.Println("valArr not found:", valArr, valOk)
  175. }
  176. } else {
  177. fmt.Println("formulaMap not found:", dKey, dk)
  178. }
  179. }
  180. if dk == 1 {
  181. dKey := edbInfoIdBytes[dk]
  182. if _, ok := formulaMap[dKey]; ok { //公式中存在
  183. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  184. dvStr := fmt.Sprintf("%v", val)
  185. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  186. replaceCount++
  187. } else {
  188. fmt.Println("valArr not found:", valArr, valOk)
  189. }
  190. } else {
  191. fmt.Println("formulaMap not found:", dKey, dk)
  192. }
  193. }
  194. if dk == 2 {
  195. dKey := edbInfoIdBytes[dk]
  196. if _, ok := formulaMap[dKey]; ok { //公式中存在
  197. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  198. dvStr := fmt.Sprintf("%v", val)
  199. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  200. replaceCount++
  201. }
  202. }
  203. }
  204. if dk == 3 {
  205. dKey := edbInfoIdBytes[dk]
  206. if _, ok := formulaMap[dKey]; ok { //公式中存在
  207. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  208. dvStr := fmt.Sprintf("%v", val)
  209. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  210. replaceCount++
  211. }
  212. }
  213. }
  214. if dk == 4 {
  215. dKey := edbInfoIdBytes[dk]
  216. if _, ok := formulaMap[dKey]; ok { //公式中存在
  217. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  218. dvStr := fmt.Sprintf("%v", val)
  219. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  220. replaceCount++
  221. }
  222. }
  223. }
  224. if dk == 5 {
  225. dKey := edbInfoIdBytes[dk]
  226. if _, ok := formulaMap[dKey]; ok { //公式中存在
  227. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  228. dvStr := fmt.Sprintf("%v", val)
  229. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  230. replaceCount++
  231. }
  232. }
  233. }
  234. if dk == 6 {
  235. dKey := edbInfoIdBytes[dk]
  236. if _, ok := formulaMap[dKey]; ok { //公式中存在
  237. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  238. dvStr := fmt.Sprintf("%v", val)
  239. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  240. replaceCount++
  241. }
  242. }
  243. }
  244. if dk == 7 {
  245. dKey := edbInfoIdBytes[dk]
  246. if _, ok := formulaMap[dKey]; ok { //公式中存在
  247. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  248. dvStr := fmt.Sprintf("%v", val)
  249. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  250. replaceCount++
  251. }
  252. }
  253. }
  254. if dk == 8 {
  255. dKey := edbInfoIdBytes[dk]
  256. if _, ok := formulaMap[dKey]; ok { //公式中存在
  257. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  258. dvStr := fmt.Sprintf("%v", val)
  259. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  260. replaceCount++
  261. }
  262. }
  263. }
  264. if dk == 9 {
  265. dKey := edbInfoIdBytes[dk]
  266. if _, ok := formulaMap[dKey]; ok { //公式中存在
  267. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  268. dvStr := fmt.Sprintf("%v", val)
  269. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  270. replaceCount++
  271. }
  272. }
  273. }
  274. if dk == 10 {
  275. dKey := edbInfoIdBytes[dk]
  276. if _, ok := formulaMap[dKey]; ok { //公式中存在
  277. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  278. dvStr := fmt.Sprintf("%v", val)
  279. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  280. replaceCount++
  281. }
  282. }
  283. }
  284. if dk == 11 {
  285. dKey := edbInfoIdBytes[dk]
  286. if _, ok := formulaMap[dKey]; ok { //公式中存在
  287. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  288. dvStr := fmt.Sprintf("%v", val)
  289. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  290. replaceCount++
  291. }
  292. }
  293. }
  294. if dk == 12 {
  295. dKey := edbInfoIdBytes[dk]
  296. if _, ok := formulaMap[dKey]; ok { //公式中存在
  297. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  298. dvStr := fmt.Sprintf("%v", val)
  299. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  300. replaceCount++
  301. }
  302. }
  303. }
  304. if dk == 13 {
  305. dKey := edbInfoIdBytes[dk]
  306. if _, ok := formulaMap[dKey]; ok { //公式中存在
  307. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  308. dvStr := fmt.Sprintf("%v", val)
  309. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  310. replaceCount++
  311. }
  312. }
  313. }
  314. if dk == 14 {
  315. dKey := edbInfoIdBytes[dk]
  316. if _, ok := formulaMap[dKey]; ok { //公式中存在
  317. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  318. dvStr := fmt.Sprintf("%v", val)
  319. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  320. replaceCount++
  321. }
  322. }
  323. }
  324. if dk == 15 {
  325. dKey := edbInfoIdBytes[dk]
  326. if _, ok := formulaMap[dKey]; ok { //公式中存在
  327. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  328. dvStr := fmt.Sprintf("%v", val)
  329. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  330. replaceCount++
  331. }
  332. }
  333. }
  334. if dk == 16 {
  335. dKey := edbInfoIdBytes[dk]
  336. if _, ok := formulaMap[dKey]; ok { //公式中存在
  337. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  338. dvStr := fmt.Sprintf("%v", val)
  339. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  340. replaceCount++
  341. }
  342. }
  343. }
  344. if dk == 17 {
  345. dKey := edbInfoIdBytes[dk]
  346. if _, ok := formulaMap[dKey]; ok { //公式中存在
  347. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  348. dvStr := fmt.Sprintf("%v", val)
  349. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  350. replaceCount++
  351. }
  352. }
  353. }
  354. if dk == 18 {
  355. dKey := edbInfoIdBytes[dk]
  356. if _, ok := formulaMap[dKey]; ok { //公式中存在
  357. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  358. dvStr := fmt.Sprintf("%v", val)
  359. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  360. replaceCount++
  361. }
  362. }
  363. }
  364. if dk == 19 {
  365. dKey := edbInfoIdBytes[dk]
  366. if _, ok := formulaMap[dKey]; ok { //公式中存在
  367. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  368. dvStr := fmt.Sprintf("%v", val)
  369. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  370. replaceCount++
  371. }
  372. }
  373. }
  374. if dk == 20 {
  375. dKey := edbInfoIdBytes[dk]
  376. if _, ok := formulaMap[dKey]; ok { //公式中存在
  377. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  378. dvStr := fmt.Sprintf("%v", val)
  379. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  380. replaceCount++
  381. }
  382. }
  383. }
  384. if dk == 21 {
  385. dKey := edbInfoIdBytes[dk]
  386. if _, ok := formulaMap[dKey]; ok { //公式中存在
  387. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  388. dvStr := fmt.Sprintf("%v", val)
  389. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  390. replaceCount++
  391. }
  392. }
  393. }
  394. if dk == 22 {
  395. dKey := edbInfoIdBytes[dk]
  396. if _, ok := formulaMap[dKey]; ok { //公式中存在
  397. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  398. dvStr := fmt.Sprintf("%v", val)
  399. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  400. replaceCount++
  401. }
  402. }
  403. }
  404. if dk == 23 {
  405. dKey := edbInfoIdBytes[dk]
  406. if _, ok := formulaMap[dKey]; ok { //公式中存在
  407. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  408. dvStr := fmt.Sprintf("%v", val)
  409. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  410. replaceCount++
  411. }
  412. }
  413. }
  414. if dk == 24 {
  415. dKey := edbInfoIdBytes[dk]
  416. if _, ok := formulaMap[dKey]; ok { //公式中存在
  417. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  418. dvStr := fmt.Sprintf("%v", val)
  419. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  420. replaceCount++
  421. }
  422. }
  423. }
  424. if dk == 25 {
  425. dKey := edbInfoIdBytes[dk]
  426. if _, ok := formulaMap[dKey]; ok { //公式中存在
  427. if val, valOk := valArr[dv.EdbInfoId]; valOk { //值存在
  428. dvStr := fmt.Sprintf("%v", val)
  429. formulaStr = strings.Replace(formulaStr, dKey, dvStr, -1)
  430. replaceCount++
  431. }
  432. }
  433. }
  434. }
  435. for k, v := range funMap {
  436. formulaStr = strings.Replace(formulaStr, v, k, -1)
  437. }
  438. if replaceCount == len(formulaMap) {
  439. return formulaStr
  440. } else {
  441. return ""
  442. }
  443. }
  444. func GetFormulaMap() map[string]string {
  445. funMap := make(map[string]string)
  446. funMap["MAX"] = "[@@]"
  447. funMap["MIN"] = "[@!]"
  448. funMap["ABS"] = "[@#]"
  449. funMap["CEIL"] = "[@$]"
  450. funMap["COS"] = "[@%]"
  451. funMap["FLOOR"] = "[@^]"
  452. funMap["MOD"] = "[@&]"
  453. funMap["POW"] = "[@*]"
  454. funMap["ROUND"] = "[@(]"
  455. return funMap
  456. }
  457. // 刷新数据
  458. func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
  459. defer func() {
  460. if err != nil {
  461. fmt.Println("RefreshCalculate:Err " + err.Error())
  462. utils.FileLog.Info("Calculate Err:%s" + err.Error())
  463. }
  464. }()
  465. saveDataMap := make(map[string]map[int]float64)
  466. for _, v := range edbInfoIdArr {
  467. var condition string
  468. var pars []interface{}
  469. condition += " AND edb_info_id=? "
  470. pars = append(pars, v.EdbInfoId)
  471. if startDate != "" {
  472. condition += " AND data_time>=? "
  473. pars = append(pars, startDate)
  474. }
  475. if endDate != "" {
  476. condition += " AND data_time<=? "
  477. pars = append(pars, endDate)
  478. }
  479. dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, 1)
  480. if err != nil {
  481. return err
  482. }
  483. dataMap := make(map[string]float64)
  484. for _, dv := range dataList {
  485. if val, ok := saveDataMap[dv.DataTime]; ok {
  486. if _, ok := val[v.EdbInfoId]; !ok {
  487. val[v.EdbInfoId] = dv.Value
  488. }
  489. } else {
  490. temp := make(map[int]float64)
  491. temp[v.EdbInfoId] = dv.Value
  492. saveDataMap[dv.DataTime] = temp
  493. }
  494. }
  495. item := new(CalculateItems)
  496. item.EdbInfoId = v.EdbInfoId
  497. item.DataMap = dataMap
  498. }
  499. formulaMap := CheckFormula(formulaStr)
  500. addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
  501. nowStr := time.Now().Format(utils.FormatDateTime)
  502. var isAdd bool
  503. for sk, sv := range saveDataMap {
  504. formulaStr = strings.ToUpper(formulaStr)
  505. formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
  506. if formulaFormStr != "" {
  507. utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
  508. expression := formula.NewExpression(formulaFormStr)
  509. calResult, err := expression.Evaluate()
  510. if err != nil {
  511. err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  512. fmt.Println(err)
  513. return err
  514. }
  515. calVal, err := calResult.Float64()
  516. if err != nil {
  517. err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
  518. fmt.Println(err)
  519. return err
  520. }
  521. count, err := data_manage.GetEdbDataCalculateByCodeAndDate(edbCode, sk)
  522. if err != nil && err.Error() != utils.ErrNoRow() {
  523. return err
  524. }
  525. if count <= 0 { //需要存入的数据
  526. dataTime, _ := time.Parse(utils.FormatDate, sk)
  527. timestamp := dataTime.UnixNano() / 1e6
  528. timeStr := fmt.Sprintf("%d", timestamp)
  529. addSql += "("
  530. addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + sk + "'" + "," + utils.SubFloatToString(calVal, 4) + "," + "'" + nowStr + "'" +
  531. "," + "'" + nowStr + "'" + "," + "1"
  532. addSql += "," + "'" + timeStr + "'"
  533. addSql += "),"
  534. isAdd = true
  535. } else {
  536. calVal = utils.FixFloat(calVal, 4)
  537. err = data_manage.ModifyEdbDataCalculate(int64(edbInfoId), sk, calVal)
  538. if err != nil {
  539. return err
  540. }
  541. }
  542. }
  543. }
  544. if isAdd {
  545. addSql = strings.TrimRight(addSql, ",")
  546. data_manage.AddEdbDataCalculateBySql(addSql)
  547. if err != nil {
  548. fmt.Println("AddEdbDataCalculate Err:" + err.Error())
  549. return err
  550. }
  551. }
  552. return
  553. }
  554. // 处理整个数据
  555. func handleDateSaveDataMap(dateList []string, realSaveDataMap, saveDataMap map[string]map[int]float64, edbInfoIdArr []*data_manage.EdbInfo) {
  556. for _, date := range dateList {
  557. tmpDataMap := realSaveDataMap[date]
  558. for _, edbInfo := range edbInfoIdArr {
  559. tmpEdbInfoId := edbInfo.EdbInfoId // 当前指标id
  560. // 如果该日期不存在该指标数据,那么需要找寻前后日期的数据,进行填补
  561. if _, ok := tmpDataMap[tmpEdbInfoId]; !ok {
  562. //day := 0
  563. //switch edbInfo.Frequency {
  564. //case "周度":
  565. // day = 7
  566. //case "旬度":
  567. // day = 15
  568. //case "月度":
  569. // day = 30
  570. //case "季度":
  571. // day = 90
  572. //case "年度":
  573. // day = 365
  574. //}
  575. // 需求池 255 指标运算文案修改,补数据遍历区间修改(2023-3-7 09:37:23修改)
  576. day := 35
  577. handleDateDataMap(realSaveDataMap, saveDataMap, date, tmpEdbInfoId, day)
  578. }
  579. }
  580. }
  581. }
  582. // handleDataMap 处理单个日期的数据
  583. func handleDateDataMap(realSaveDataMap, saveDataMap map[string]map[int]float64, date string, edbInfoId, day int) {
  584. currDate, _ := time.ParseInLocation(utils.FormatDate, date, time.Local)
  585. // 后一天
  586. nextDateDayStr := currDate.AddDate(0, 0, 1).Format(utils.FormatDate)
  587. // 前一天
  588. preDateDayStr := currDate.AddDate(0, 0, -1).Format(utils.FormatDate)
  589. for i := 1; i <= day; i++ {
  590. // 下个日期的数据
  591. {
  592. if i >= 1 {
  593. nextDateDayStr = currDate.AddDate(0, 0, i).Format(utils.FormatDate)
  594. }
  595. if findDataMap, hasFindDataMap := realSaveDataMap[nextDateDayStr]; hasFindDataMap { // 下一个日期有数据
  596. if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
  597. saveDataMap[date][edbInfoId] = val
  598. return
  599. }
  600. }
  601. }
  602. // 上个日期的数据
  603. {
  604. if i >= 1 {
  605. preDateDayStr = currDate.AddDate(0, 0, -i).Format(utils.FormatDate)
  606. }
  607. if findDataMap, hasFindDataMap := realSaveDataMap[preDateDayStr]; hasFindDataMap { // 下一个日期有数据
  608. if val, hasFindItem := findDataMap[edbInfoId]; hasFindItem {
  609. saveDataMap[date][edbInfoId] = val
  610. return
  611. }
  612. }
  613. }
  614. }
  615. }
  616. // handleDataByLinearRegression 插值法补充数据(线性方程式)
  617. func handleDataByLinearRegression(edbInfoDataList []*data_manage.EdbDataList, handleDataMap map[string]float64) (err error) {
  618. if len(edbInfoDataList) < 2 {
  619. return
  620. }
  621. var startEdbInfoData *data_manage.EdbDataList
  622. for _, v := range edbInfoDataList {
  623. handleDataMap[v.DataTime] = v.Value
  624. // 第一个数据就给过滤了,给后面的试用
  625. if startEdbInfoData == nil {
  626. startEdbInfoData = v
  627. continue
  628. }
  629. // 获取两条数据之间相差的天数
  630. startDataTime, _ := time.ParseInLocation(utils.FormatDate, startEdbInfoData.DataTime, time.Local)
  631. currDataTime, _ := time.ParseInLocation(utils.FormatDate, v.DataTime, time.Local)
  632. betweenHour := int(currDataTime.Sub(startDataTime).Hours())
  633. betweenDay := betweenHour / 24
  634. // 如果相差一天,那么过滤
  635. if betweenDay <= 1 {
  636. startEdbInfoData = v
  637. continue
  638. }
  639. // 生成线性方程式
  640. var a, b float64
  641. {
  642. coordinateData := make([]utils.Coordinate, 0)
  643. tmpCoordinate1 := utils.Coordinate{
  644. X: 1,
  645. Y: startEdbInfoData.Value,
  646. }
  647. coordinateData = append(coordinateData, tmpCoordinate1)
  648. tmpCoordinate2 := utils.Coordinate{
  649. X: float64(betweenDay) + 1,
  650. Y: v.Value,
  651. }
  652. coordinateData = append(coordinateData, tmpCoordinate2)
  653. a, b = utils.GetLinearResult(coordinateData)
  654. if math.IsNaN(a) || math.IsNaN(b) {
  655. err = errors.New("线性方程公式生成失败")
  656. return
  657. }
  658. }
  659. // 生成对应的值
  660. {
  661. for i := 1; i < betweenDay; i++ {
  662. tmpDataTime := startDataTime.AddDate(0, 0, i)
  663. aDecimal := decimal.NewFromFloat(a)
  664. xDecimal := decimal.NewFromInt(int64(i) + 1)
  665. bDecimal := decimal.NewFromFloat(b)
  666. val, _ := aDecimal.Mul(xDecimal).Add(bDecimal).Round(4).Float64()
  667. handleDataMap[tmpDataTime.Format(utils.FormatDate)] = val
  668. }
  669. }
  670. startEdbInfoData = v
  671. }
  672. return
  673. }
  674. // HandleDataByLinearRegression 插值法补充数据(线性方程式)
  675. func HandleDataByLinearRegression(edbInfoDataList []*data_manage.EdbDataList, handleDataMap map[string]float64) (err error) {
  676. return handleDataByLinearRegression(edbInfoDataList, handleDataMap)
  677. }
  678. // CallCalculateComputeCorrelation 调用计算拟合残差的相关系数
  679. func CallCalculateComputeCorrelation(data *data_manage.EdbInfoCalculateBatchSaveReqByEdbLib) (val string, err error, errMsg string) {
  680. errMsg = "计算失败"
  681. // 调用指标库去更新
  682. reqJson, err := json.Marshal(data)
  683. if err != nil {
  684. errMsg = "计算相关系数参数解析异常!"
  685. err = errors.New("参数解析失败,Err:" + err.Error())
  686. return
  687. }
  688. respItem, err := CalculateComputeCorrelation(string(reqJson))
  689. if err != nil {
  690. return
  691. }
  692. if respItem.Ret == 200 {
  693. val = respItem.Data
  694. }
  695. return
  696. }