base_from_calculate.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package utils
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "sort"
  6. "strings"
  7. "time"
  8. )
  9. func CheckFormula(formula string) (byteMap map[string]string, err error) {
  10. mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG", "LN", "EXP"}
  11. str := strings.ToUpper(formula)
  12. for _, v := range mathFormula {
  13. str = strings.Replace(str, v, "", -1)
  14. }
  15. str = strings.Replace(str, "(", "", -1)
  16. str = strings.Replace(str, ")", "", -1)
  17. byteMap = make(map[string]string)
  18. for i := 0; i < len(str); i++ {
  19. byteInt := str[i]
  20. if byteInt >= 65 && byteInt <= 90 {
  21. if i > 0 {
  22. if str[i-1] >= '0' && str[i-1] <= '9' {
  23. err = fmt.Errorf("计算公式异常,请检查公式:%s", formula)
  24. return
  25. }
  26. }
  27. byteStr := string(byteInt) //获取计算公式中的占位符A,B, AA,AB
  28. if i+1 < len(str) {
  29. next := str[i+1]
  30. if next >= 65 && next <= 90 {
  31. byteStr += string(next)
  32. i++
  33. }
  34. }
  35. if _, ok := byteMap[byteStr]; !ok {
  36. byteMap[byteStr] = byteStr
  37. }
  38. }
  39. }
  40. return
  41. }
  42. type FormulaListItem struct {
  43. Formula string `json:"f"`
  44. Date string `json:"d"`
  45. }
  46. func HandleFormulaJson(formula string, endDate time.Time) (dateSlice []string, formulaMap map[string]string, err error) {
  47. list := make([]FormulaListItem, 0)
  48. err = json.Unmarshal([]byte(formula), &list)
  49. if err != nil {
  50. err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
  51. return
  52. }
  53. formulaMap = make(map[string]string)
  54. dateSlice = make([]string, 0)
  55. maxDate := endDate.AddDate(0, 0, 1).Format(FormatDate)
  56. for k, v := range list {
  57. if k == 0 { // 首个日期均为起始日
  58. v.Date = maxDate
  59. }
  60. formulaMap[v.Date] = v.Formula
  61. dateSlice = append(dateSlice, v.Date)
  62. }
  63. sort.Slice(dateSlice, func(i, j int) bool {
  64. return dateSlice[i] < dateSlice[j]
  65. })
  66. return
  67. }
  68. func CheckFormulaJson(formula string) (formulaSlice []string, err error) {
  69. list := make([]FormulaListItem, 0)
  70. err = json.Unmarshal([]byte(formula), &list)
  71. if err != nil {
  72. err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
  73. return
  74. }
  75. formulaSlice = make([]string, 0)
  76. for _, v := range list {
  77. formulaSlice = append(formulaSlice, v.Formula)
  78. }
  79. return
  80. }