应用集成平台服务端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

262 lines
5.9 KiB

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
}