资讯 小学 初中 高中 语言 会计职称 学历提升 法考 计算机考试 医护考试 建工考试 教育百科
栏目分类:
子分类:
返回
空麓网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
空麓网 > 计算机考试 > 软件开发 > 后端开发 > Java

java 使用JEXL实现自定义公式计算(从数据库查询数据)

Java 更新时间: 发布时间: 计算机考试归档 最新发布

java 使用JEXL实现自定义公式计算(从数据库查询数据)

自定义计算公式思路解析:

  • Jexl,表达式引擎,可以将字符串公式解析成可执行表达式
  • 从数据库中查询出数据,通过计算公式计算出结果,然后将结果再存储到数据表中
  • 前端报表展示:直接查询存入数据库表中的结果

计算公式解析代码工具类:

  • 首先新建一个类,我这里将类名定义为:CharacterReplacementUtil
  • Maven导入依赖jar包:在项目的pom文件导入,大家都知道,不做过多叙述
    
        org.apache.commons
        commons-jexl
        2.1.1
    
  • 公式来源:先定义需要添加公式的字段,点击新增,弹窗增加公式的窗口,输入计算公式,这里我用两个百分号作为区分,%这里是输入的中文%,中文是让客户看的,在添加公式的service层,调用工具类解析,将%%里面的中文替换成数据库中对应的表字段
  • 公式解析工具类:使用正则表达式,替换%%里面的中文
    图片中代码如下:

    @SuppressWarnings(“all”)
    public class CharacterReplacementUtil {

    public static String solveCharacter(String exhibitionFormula) throws Exception { // 处理函数
    int i = 0;
    String[] strings = {“completeNum”,“conversionRate”,“processYield”,“additionAmount”}; // 用来替换的对象
    String pattern = “KaTeX parse error: Expected group after '^' at position 2: [^̲] " ; / / 匹配 "; // 匹配 ";//匹配 $ 的表达式
    Pattern p = Pattern.compile(pattern);
    Matcher m = p.matcher(exhibitionFormula);
    while(m.find()){ // 当字符串中有匹配到 {} 时
    String param = m.group(0); // {} 和里面的内容
    System.out.println(param.substring(1,param.length()-1)); // 输出{} 里面的内容
    String subParam = param.substring(1,param.length()-1);
    //判断读取的汉字是什么
    switch (subParam){
    case “浇筑数量”:
    exhibitionFormula = exhibitionFormula.replaceFirst("KaTeX parse error: Expected group after '^' at position 2: [^̲]
    $”,strings[0]); // 替换 {} 和里面的内容
    break;
    case “计划数量”:
    exhibitionFormula = exhibitionFormula.replaceFirst(“KaTeX parse error: Expected group after '^' at position 2: [^̲]$“,strings[0]); // 替换 {} 和里面的内容
    break;
    case “单重”:
    exhibitionFormula = exhibitionFormula.replaceFirst(”KaTeX parse error: Expected group after '^' at position 2: [^̲]
    $”,strings[1]); // 替换 {} 和里面的内容
    break;
    case “出品率”:
    exhibitionFormula = exhibitionFormula.replaceFirst(“KaTeX parse error: Expected group after '^' at position 2: [^̲]$“,strings[2]); // 替换 {} 和里面的内容
    break;
    default:
    exhibitionFormula = exhibitionFormula.replaceFirst(”KaTeX parse error: Expected group after '^' at position 2: [^̲]
    $”,strings[3]); // 替换 {} 和里面的内容
    break;
    }
    }
    return exhibitionFormula; //这个返回值,就是解析后的公式字符串
    }
    }

数据库存入结果格式如图:
公式调用:查询公式,并计算结果

  • 计算公式工具类:
    第一步: 新建一个类:FormulaConversionUtil
    第二步:复制代码进去,结果是保存两位小数的值
    代码如图:
    图片中代码如下:
    public class FormulaConversionUtil {

    public static Object convertToCode(String jexlExp, Map map) {
    JexlEngine jexl = new JexlEngine();
    Expression expression = jexl.createExpression(jexlExp);
    JexlContext jc = new MapContext();
    //需要set源代码Math,否则报错
    jc.set(“Math”, Math.class);
    //需要set源代码 BigDecimal,否则报错
    jc.set(“BigDecimal”, BigDecimal.class);
    for (String key : map.keySet()) {
    Object p = map.get(key);
    Double val = 0.0;
    if (null != p) {
    if (p instanceof BigDecimal) {
    BigDecimal temp = (BigDecimal) p;
    val = temp.doubleValue ();
    }else {
    if (NumberUtils.isNumber((String) p)){
    val = Double.valueOf(p.toString());
    }else {
    return p;
    }
    }
    }
    jc.set(key,val);
    // jc.set(key, map.get(key));
    }
    if (null == expression.evaluate(jc)) {
    return “”;
    }
    Object obj = expression.evaluate(jc);
    BigDecimal result = new BigDecimal ( null == obj ? “0” : obj.toString () );
    // return expression.evaluate(jc);
    return result.setScale ( 2, BigDecimal.ROUND_HALF_UP );
    }
    }
    计算出结果值之后,将结果值保存到数据库中
    如图:
    结语:
    自定义解析公式,也可以自己写一个解析工具类,通过中缀转后缀表达式解析,这里就直接用java中原生的工具类进行解析,一般中下等复杂的公式解析没什么问题,超复杂的公式还没试过,不过足够满足业务需求了!
    写的可能不太详细,有不懂的可以私信我,不过主要的就是那两个工具类,一个是解析前端传来带有中文的公式,一个是调用工具类结算出结果,具体如何用,还是根据业务需求来进行改动!
    通过CV大法,实现这个也挺简单的,自定义公式一般业务中见得也不太多,主要用在报表,有不足的还请各位多多指教,加油!
转载请注明:文章转载自 http://www.konglu.com/
本文地址:http://www.konglu.com/it/1024123.html
免责声明:

我们致力于保护作者版权,注重分享,被刊用文章【java 使用JEXL实现自定义公式计算(从数据库查询数据)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理,本文部分文字与图片资源来自于网络,转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益,请立即通知我们,情况属实,我们会第一时间予以删除,并同时向您表示歉意,谢谢!

我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2023 成都空麓科技有限公司

ICP备案号:蜀ICP备2023000828号-2