package matsformula import ( "appPlatform/overall/publicmethod" "fmt" "math" "strconv" "strings" "github.com/dengsgo/math-engine/engine" "github.com/gin-gonic/gin" ) /* * @ 作者: 秦东 @ 时间: 2024-01-02 08:53:21 @ 功能: 解析数学公式 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) AnalyticalMathematicalFormulas(c *gin.Context) { var requestsData Formula err := c.ShouldBindJSON(&requestsData) if err != nil { publicmethod.Result(1, err, c) return } mathsStr := requestsData.Val for _, v := range requestsData.FormJson { zhi := strconv.FormatFloat(v.Val, 'f', -1, 64) mathsStr = strings.Replace(mathsStr, v.Keys, zhi, 1) } sendData := publicmethod.MapOut[string]() sendData["mathsStr"] = mathsStr runMaths, err := AnalyticCalculation(mathsStr, 0, 2) sendData["runMaths"] = runMaths sendData["err"] = err publicmethod.Result(0, sendData, c) } /* * @ 作者: 秦东 @ 时间: 2024-01-08 10:46:15 @ 功能: 解析数学公式 @ 参数 #mathsFormula 组合后的公式 #takingMethod 结果保留形式 0:原始数据; 1:四舍五入;2:向上取整;3:向下取整;4:舍去 #digit 保留位数 @ 返回值 # @ 方法原型 # */ func AnalyticCalculation(mathsFormula string, takingMethod, digit int) (runMaths float64, err error) { //自定义一个Sum计算 engine.RegFunction("sum", -1, func(expr ...engine.ExprAST) float64 { var sum float64 for _, v := range expr { sum = sum + engine.ExprASTResult(v) } return sum }) engine.RegFunction("average", -1, func(expr ...engine.ExprAST) float64 { var sum float64 num := 0 for _, v := range expr { sum = sum + engine.ExprASTResult(v) num++ } if num > 0 { sum = sum / float64(num) } return sum }) //解析、执行数学公式字符串 runMaths, err = engine.ParseAndExec(mathsFormula) switch takingMethod { case 1: // fmt.Printf("1:%v--1-->%v---->%v\n", takingMethod, digit, runMaths) runMaths = publicmethod.DecimalEs(runMaths, digit) // fmt.Printf("1:%v---->%v---->%v\n", takingMethod, digit, runMaths) case 2: runMaths = math.Ceil(runMaths) // fmt.Printf("2:%v---->%v---->%v\n", takingMethod, digit, runMaths) case 3: runMaths = math.Floor(runMaths) // fmt.Printf("3:%v---->%v---->%v\n", takingMethod, digit, runMaths) case 4: runMaths = float64(int64(runMaths)) // fmt.Printf("4:%v---->%v---->%v\n", takingMethod, digit, runMaths) default: // fmt.Printf("5:%v---->%v---->%v\n", takingMethod, digit, runMaths) return } return } /* * @ 作者: 秦东 @ 时间: 2024-01-09 14:48:06 @ 功能: 数学计算 @ 参数 # @ 返回值 # @ 方法原型 # */ func (a *ApiMethod) MathematicalCalculations(c *gin.Context) { var requestsData ReceiveMathsFornula err := c.ShouldBindJSON(&requestsData) if err != nil { publicmethod.Result(1, err, c) return } zhi := make(map[string]float64) var formulaList []FormJsonInfor for i, v := range requestsData.MathsFornula { var formulaCont FormJsonInfor formulaCont.Keys = i formulaCont.Val = v.MathsFormula formulaList = append(formulaList, formulaCont) if i != requestsData.FieldKey { zhiVal := FieldToValue(v.MathsFormula, requestsData.KeyVal, v.TakingMethod, v.Digit) zhi[i] = zhiVal } } // publicmethod.Result(10000, zhi, c) sendData := publicmethod.MapOut[string]() sendData["formulaList"] = formulaList sendData["zhi"] = zhi sendData["requestsData"] = requestsData publicmethod.Result(0, zhi, c) } /* * @ 作者: 秦东 @ 时间: 2024-01-09 15:52:41 @ 功能: 解析计算数值 @ 参数 #formula 计算公式 #formKeyVal 表单字段 #takingMethod 结果保留形式 1:四舍五入;2:向上取整;3:向下取整;4:舍去 #digit 保留位数 @ 返回值 # @ 方法原型 # */ func FieldToValue(formula string, formKeyVal map[string]interface{}, takingMethod, digit int) (runMaths float64) { for i, v := range formKeyVal { if val, isOk := v.(string); isOk { if val == "" { val = "0" } formula = strings.Replace(formula, i, val, -1) } if val, isOk := v.(int); isOk { valStr := strconv.Itoa(val) formula = strings.Replace(formula, i, valStr, -1) } if val, isOk := v.(int64); isOk { valStr := strconv.FormatInt(val, 10) formula = strings.Replace(formula, i, valStr, -1) } if val, isOk := v.(float32); isOk { valStr := strconv.FormatFloat(float64(val), 'f', -1, 64) formula = strings.Replace(formula, i, valStr, -1) } if val, isOk := v.(float64); isOk { valStr := strconv.FormatFloat(val, 'f', -1, 64) formula = strings.Replace(formula, i, valStr, -1) } } formula = strings.Replace(formula, ",", ",", -1) smaillMathsStr := strings.ToLower(formula) fmt.Printf("smaillMathsStr===>%v\n", smaillMathsStr) runMaths, err := AnalyticCalculation(smaillMathsStr, takingMethod, digit) if err != nil { runMaths = 0 return } return } /* * @ 作者: 秦东 @ 时间: 2024-01-09 15:00:33 @ 功能: 数学公式字段转化数值 @ 参数 # @ 返回值 # @ 方法原型 # */ func FieldToValues(formulaList []FormJsonInfor, key string, val string, takingMethod, digit int) map[string]float64 { var fieldVal map[string]float64 for _, v := range formulaList { mathsStr := strings.Replace(v.Val, key, val, -1) mathsStr = strings.Replace(mathsStr, ",", ",", -1) smaillMathsStr := strings.ToLower(mathsStr) fmt.Printf("smaillMathsStr===>%v\n", smaillMathsStr) runMaths, err := AnalyticCalculation(smaillMathsStr, takingMethod, digit) fmt.Printf("runMaths===>%v\n err===>%v\n", runMaths, err) // if err == nil { // switch takingMethod { // case 2: // fieldVal[v.Keys] = math.Ceil(runMaths) // case 3: // fieldVal[v.Keys] = math.Floor(runMaths) // case 4: // fieldVal[v.Keys] = math.Floor(runMaths) // default: // fieldVal[v.Keys] = math.Round(publicmethod.DecimalEs(runMaths, digit)) // } // } else { // fieldVal[v.Keys] = 0 // } } return fieldVal }