123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- package utils
- import (
- "encoding/json"
- "fmt"
- "sort"
- "strings"
- "time"
- )
- // CheckFormula 检测计算公式是否异常
- func CheckFormula(formula string) (byteMap map[string]string, err error) {
- mathFormula := []string{"MAX", "MIN", "ABS", "ACOS", "ASIN", "CEIL", "MOD", "POW", "ROUND", "SIGN", "SIN", "TAN", "LOG10", "LOG2", "LOG", "LN", "EXP"}
- str := strings.ToUpper(formula)
- for _, v := range mathFormula {
- str = strings.Replace(str, v, "", -1)
- }
- str = strings.Replace(str, "(", "", -1)
- str = strings.Replace(str, ")", "", -1)
- byteMap = make(map[string]string)
- for i := 0; i < len(str); i++ {
- byteInt := str[i]
- if byteInt >= 65 && byteInt <= 90 {
- // 判断前一位是否是数字,如果是数字就报错
- if i > 0 {
- if str[i-1] >= '0' && str[i-1] <= '9' {
- err = fmt.Errorf("计算公式异常,请检查公式:%s", formula)
- return
- }
- }
- byteStr := string(byteInt) //获取计算公式中的占位符A,B, AA,AB
- if i+1 < len(str) {
- next := str[i+1]
- if next >= 65 && next <= 90 {
- byteStr += string(next)
- i++
- }
- }
- if _, ok := byteMap[byteStr]; !ok {
- byteMap[byteStr] = byteStr
- }
- }
- }
- return
- }
- type FormulaListItem struct {
- Formula string `json:"f"`
- Date string `json:"d"`
- }
- // HandleFormulaJson 处理计算公式json串是否异常
- func HandleFormulaJson(formula string, endDate time.Time) (dateSlice []string, formulaMap map[string]string, err error) {
- list := make([]FormulaListItem, 0)
- err = json.Unmarshal([]byte(formula), &list)
- if err != nil {
- err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
- return
- }
- formulaMap = make(map[string]string)
- dateSlice = make([]string, 0)
- // 查找最后的一天作为首个公式的起始日期
- maxDate := endDate.AddDate(0, 0, 1).Format(FormatDate)
- // 日期排序
- for k, v := range list {
- if k == 0 { // 首个日期均为起始日
- v.Date = maxDate
- }
- formulaMap[v.Date] = v.Formula
- dateSlice = append(dateSlice, v.Date)
- }
- // 得到的日期序列是从大到小,还是从小到大?
- sort.Slice(dateSlice, func(i, j int) bool {
- return dateSlice[i] < dateSlice[j]
- })
- return
- }
- // CheckFormulaJson 检测计算公式json串是否异常
- func CheckFormulaJson(formula string) (formulaSlice []string, err error) {
- list := make([]FormulaListItem, 0)
- err = json.Unmarshal([]byte(formula), &list)
- if err != nil {
- err = fmt.Errorf("公式串解析失败: json.Unmarshal Err: %v", err)
- return
- }
- formulaSlice = make([]string, 0)
- // 日期排序
- for _, v := range list {
- formulaSlice = append(formulaSlice, v.Formula)
- }
- return
- }
|