|
|
|
package com.fanruan.api.cal;
|
|
|
|
|
|
|
|
import com.fanruan.api.err.KitError;
|
|
|
|
import com.fanruan.api.util.GeneralKit;
|
|
|
|
import com.fr.base.BaseFormula;
|
|
|
|
import com.fr.base.ScriptFormula;
|
|
|
|
import com.fr.log.FineLoggerFactory;
|
|
|
|
import com.fr.script.Calculator;
|
|
|
|
import com.fr.stable.FormulaProvider;
|
|
|
|
import com.fr.stable.StringUtils;
|
|
|
|
import com.fr.stable.UtilEvalError;
|
|
|
|
import com.fr.stable.script.CalculatorProvider;
|
|
|
|
import com.fr.stable.script.Expression;
|
|
|
|
import com.fr.third.antlr.ANTLRException;
|
|
|
|
import org.jetbrains.annotations.NotNull;
|
|
|
|
import org.jetbrains.annotations.Nullable;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @author richie
|
|
|
|
* @version 10.0
|
|
|
|
* Created by richie on 2019-08-15
|
|
|
|
* 公式计算相关的工具类
|
|
|
|
*/
|
|
|
|
public class FormulaKit {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 计算公式的值,会新建一个算子对象来计算该公式
|
|
|
|
*
|
|
|
|
* @param formula 公式内容
|
|
|
|
* @return 公式计算后的结果值
|
|
|
|
* @throws KitError 如果计算过程中出现错误,则抛出此异常
|
|
|
|
*/
|
|
|
|
public static @Nullable Object eval(String formula) throws KitError {
|
|
|
|
return eval(Calculator.createCalculator(), formula);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 计算公式的值
|
|
|
|
*
|
|
|
|
* @param calculator 自定义算子
|
|
|
|
* @param formula 公式内容
|
|
|
|
* @return 公式计算后的结果值
|
|
|
|
* @throws KitError 如果计算过程中出现错误,则抛出此异常
|
|
|
|
*/
|
|
|
|
public static @Nullable Object eval(CalculatorProvider calculator, String formula) throws KitError {
|
|
|
|
try {
|
|
|
|
return BaseFormula.createFormulaBuilder().build(formula).eval(calculator);
|
|
|
|
} catch (UtilEvalError u) {
|
|
|
|
throw new KitError(u);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 生成公式对象
|
|
|
|
*
|
|
|
|
* @param content 公式的内容
|
|
|
|
* @return 公式对象
|
|
|
|
*/
|
|
|
|
public static @NotNull BaseFormula newFormula(Object content) {
|
|
|
|
return BaseFormula.createFormulaBuilder().build(content);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 生成脚本公式对象
|
|
|
|
*
|
|
|
|
* @param content 公式的内容,是一段javascript脚本
|
|
|
|
* @return 脚本公式
|
|
|
|
*/
|
|
|
|
public @NotNull static BaseFormula newScriptFormula(Object content) {
|
|
|
|
return new ScriptFormula(GeneralKit.objectToString(content));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 检查公式内容合法性
|
|
|
|
*
|
|
|
|
* @param content 公式文本
|
|
|
|
* @return 如果非空且不合法返回false, 反之返回true
|
|
|
|
*/
|
|
|
|
public static boolean checkFormulaContent(String content) {
|
|
|
|
String formulaText = content.trim();
|
|
|
|
|
|
|
|
if (StringUtils.isNotEmpty(formulaText)) {
|
|
|
|
FormulaProvider formula = newFormula(formulaText);
|
|
|
|
Expression expression = null;
|
|
|
|
try {
|
|
|
|
expression = formula.parse(Calculator.createCalculator());
|
|
|
|
} catch (ANTLRException e) {
|
|
|
|
FineLoggerFactory.getLogger().error(e.getMessage(), e);
|
|
|
|
}
|
|
|
|
return null != expression;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 公式合法性校验
|
|
|
|
*
|
|
|
|
* @param formula 公式对象
|
|
|
|
* @return 当前公式是否合法
|
|
|
|
*/
|
|
|
|
public static boolean checkFormulaContent(FormulaProvider formula) {
|
|
|
|
if (formula == null) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return checkFormulaContent(formula.getPureContent());
|
|
|
|
}
|
|
|
|
}
|