diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CalcUtils.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CalcUtils.java index 4f4da43..8ed9e6c 100644 --- a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CalcUtils.java +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CalcUtils.java @@ -15,15 +15,16 @@ public class CalcUtils { * 工具类,计算公式计算,使用PB的计算公式加入参得出结果值 * @param CalcExpression PB原始计算公式 * @param variableMap 入参MAP + * @param def 默认返回值,当计算公式失败不符合计算条件时返回默认值 * @return */ - public static String getValueFromCalc(String CalcExpression, Map variableMap) { + public static String getValueFromCalc(String CalcExpression, Map variableMap,String def) { ExpressionParser parser = new SpelExpressionParser(); StandardEvaluationContext context = new StandardEvaluationContext(); variableMap=replaceAllSpecialKeys(variableMap); for (Map.Entry entry : variableMap.entrySet()) { String str = entry.getValue(); - if (isNumber(str)) { + if (isNumber(str) && getnumbervalue(entry.getKey())) { context.setVariable(entry.getKey(), Double.parseDouble(str)); } else { context.setVariable(entry.getKey(), entry.getValue()); @@ -55,14 +56,24 @@ public class CalcUtils { return result.toString(); } catch (Exception e) { - throw new RuntimeException("表达式计算失败: " + expression, e); + //throw new RuntimeException("表达式计算失败: " + expression, e); + return def; } } - + public static boolean getnumbervalue(String keyname) { + if("DEPT".equals(keyname))return false; + if("GIAG".equals(keyname))return false; + if("YBZT".equals(keyname))return false; + return true; + } public static boolean getBooleanFromCalc(String CalcExpression, Map variableMap) { - String resultcondition = "if((" + CalcExpression + ") ,1,0)"; - String result1 = getValueFromCalc(resultcondition, variableMap); + return getBooleanFromCalc(CalcExpression,variableMap,false); + } + public static boolean getBooleanFromCalc(String CalcExpression, Map variableMap,boolean def) { + String resultcondition = "if((" + CalcExpression + "),1,0)"; + String result1 = getValueFromCalc(resultcondition, variableMap,"-1"); if ("1".equals(result1)) return true; + if ("-1".equals(result1)) return def; return false; } /** @@ -87,7 +98,9 @@ public class CalcUtils { * @return */ public static String getCalc(String CalcExpression){ - + CalcExpression=trimCalc(CalcExpression); + // 匹配 isnull(...) 格式,兼容括号内外的空格 + CalcExpression = CalcExpression.replaceAll("isnull\\s*\\(\\s*(.*?)\\s*\\)", "($1 == null)"); // 1. 替换逻辑运算符:and→&&,or→|| String processed = CalcExpression.replaceAll("\\band|AND\\b", "&&").replaceAll("\\bor|OR\\b", "||"); // 2. 替换变量格式:[a] → #a @@ -97,12 +110,31 @@ public class CalcUtils { processed = replaceLenFunction(processed); //4.like '%aa'或者 like 'aa%'或者 like '%aa%' processed = replaceLikeExpressions(processed); + processed = processed.replaceAll("not\\s*\\.contains", "!contains"); // 1. 先将所有比较用的=替换为==(关键修复) processed = processed.replaceAll("(\\w+)\\s*=\\s*('.*?'|\\w+)", "$1 == $2"); //5. 递归处理if结构:if(cond, trueExpr, falseExpr) → cond?trueExpr:falseExpr return processIf(processed); } + /** + * 规整公式 + * @param CalcExpression + * @return + */ + public static String trimCalc(String CalcExpression){ + String expr=CalcExpression.replace(" "," "); + expr=expr.replace(" (","("); + expr=expr.replace(") ",")"); + expr=expr.replace(", ",","); + expr=expr.replace(" ,",","); + expr=expr.replace("isNull","isnull"); + expr=expr.replace("ISNULL","isnull"); + expr=expr.replace(" LIKE "," like "); + expr=expr.replace(" NOT "," not "); + expr = expr.replace("IF(", "if("); + return expr; + } /** * 取出公式中所有[参数]返回数组,供调用传值引用 * @param input @@ -172,7 +204,7 @@ public class CalcUtils { String wrappedFalse = needsParentheses(processedFalse) ? "(" + processedFalse + ")" : processedFalse; // 拼接三元表达式 - String ternary = condition + "?" + wrappedTrue + ":" + wrappedFalse; + String ternary ="(("+condition + ")?" + wrappedTrue + ":" + wrappedFalse+")"; String before = expr.substring(0, start); String after = expr.substring(end + 1); @@ -274,33 +306,47 @@ public class CalcUtils { return result.toString(); } /** - * 处理like表达式转换 - * 支持:like '%xxx'、like 'xxx%'、like '%xxx%'、like 'xxx'(精确匹配) + * 处理like和not like表达式转换 + * 支持: + * - like '%xxx'、like 'xxx%'、like '%xxx%'、like 'xxx'(精确匹配) + * - not like '%xxx'、not like 'xxx%'、not like '%xxx%'、not like 'xxx' */ private static String replaceLikeExpressions(String expression) { - // 修正正则:左侧表达式允许包含#、字母、数字、下划线(#[a-zA-Z0-9_]+) - Pattern pattern = Pattern.compile("([#\\w]+)\\s+like\\s+'([^']+)'", Pattern.CASE_INSENSITIVE); + // 修正正则: + // 1. 增加 (not\\s+)? 分组,用于匹配可选的 "not " 前缀,CASE_INSENSITIVE 会处理大小写 + // 2. 左侧表达式允许包含#、字母、数字、下划线(#[a-zA-Z0-9_]+) + Pattern pattern = Pattern.compile("([#\\w]+)\\s+(not\\s+)?like\\s+'([^']+)'", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(expression); StringBuffer result = new StringBuffer(); while (matcher.find()) { - String leftExpr = matcher.group(1); // 支持#变量(如#RESULT) - String patternStr = matcher.group(2); - String replacement = generateLikeReplacement(leftExpr, patternStr); + String leftExpr = matcher.group(1); // 左侧表达式,如 #DEPT + String notPrefix = matcher.group(2); // 匹配到的 "not " 部分,如果是 like 则为 null + String patternStr = matcher.group(3); // like 后面的匹配模式,如 '%内分泌%' + + // 生成 like 的基础替换字符串 + String likeReplacement = generateLikeReplacement(leftExpr, patternStr); + + // 如果存在 "not " 前缀,则在整个表达式前加上 "!" + String replacement = (notPrefix != null && !notPrefix.isEmpty()) + ? "!" + likeReplacement + : likeReplacement; + matcher.appendReplacement(result, replacement); } matcher.appendTail(result); return result.toString(); } + /** - * 根据like模式生成对应的SpEL方法调用 + * 根据like模式生成对应的SpEL方法调用(内部使用) */ private static String generateLikeReplacement(String leftExpr, String patternStr) { boolean startsWithWildcard = patternStr.startsWith("%"); boolean endsWithWildcard = patternStr.endsWith("%"); String content = patternStr.replace("%", ""); // 提取实际匹配内容 - // 处理三种like场景 + // 处理三种like场景和一种精确匹配场景 if (startsWithWildcard && endsWithWildcard) { // like '%xxx%' → 包含:xxx.contains('content') return String.format("%s.contains('%s')", leftExpr, escapeQuotes(content)); @@ -315,6 +361,8 @@ public class CalcUtils { return String.format("%s.equals('%s')", leftExpr, escapeQuotes(content)); } } + + /** * 转义字符串中的单引号,避免SpEL语法错误 */ @@ -336,15 +384,17 @@ public class CalcUtils { // 测试 public static void main(String[] args) { Map variables = new HashMap<>(); - variables.put("SEX", "1"); + variables.put("DEPT", "0123"); variables.put("CREA", "30.3"); variables.put("AGE", "30"); // 示例值 // variables.put("TP", "6.0"); - String testCalc = "if([AGE]>18,(if([SEX]=1,(( [CREA] / 88.4)^(-1.234)) * ([AGE]^(-0.179))*175 ,(( [CREA] / 88.4)^(-1.234)) * ([AGE]^(-0.179))*175*0.79)),0)"; + String testCalc = "[DEPT] like '%内分泌%'"; // testCalc=testCalc.replace("[结果]", "[RESULT]"); - //System.out.println(getCalc(testCalc)); - System.out.println(getValueFromCalc(testCalc,variables)); + System.out.println(getCalc(testCalc)); + testCalc = "[DEPT] not like '%内分泌%'"; + System.out.println(getCalc(testCalc)); + System.out.println(getBooleanFromCalc(testCalc,variables)); } } diff --git a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CheckResultUtils.java b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CheckResultUtils.java index 9ef12a3..8502cc5 100644 --- a/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CheckResultUtils.java +++ b/lis-interfaceCommon/src/main/java/com/czlis/interfaceCommon/utils/CheckResultUtils.java @@ -125,8 +125,8 @@ public class CheckResultUtils { } //项目不全,此公式跳过 if (setjgsg) { - boolean result = CalcUtils.getBooleanFromCalc(jsgs, variables); - if (result) { + boolean result = CalcUtils.getBooleanFromCalc(jsgs, variables,true); + if (!result) { errmsg = errmsg + LisUtil.LINE_SEPARATOR + "审核条件: " + jsgs + " 规则触发,未通过审核!"; } @@ -339,7 +339,7 @@ public class CheckResultUtils { } } flag = CalcUtils.getBooleanFromCalc(checkrules, variables); - if (flag = true) errmsg = "审核条件: " + ruledisplay + " 规则触发,未通过审核!"; + if (flag) errmsg = "审核条件: " + ruledisplay + " 规则触发,未通过审核!"; } return errmsg; } diff --git a/lis-interfaceCommon/src/main/resources/mapper/LabPatMapper.xml b/lis-interfaceCommon/src/main/resources/mapper/LabPatMapper.xml index c6d562b..ecd32fb 100644 --- a/lis-interfaceCommon/src/main/resources/mapper/LabPatMapper.xml +++ b/lis-interfaceCommon/src/main/resources/mapper/LabPatMapper.xml @@ -10,7 +10,7 @@ select * from lab_pat where sqh = #{sqh} - select jyrq,yq,ybh,jzbz,jgbz,dybz,brly,brdh,brxm,brxb,nl,nldw,ksdh,jymd,yljg from lab_pat + select jyrq,yq,ybh,jzbz,jgbz,dybz,brly,brdh,brxm,brxb,nl,nldw,ksdh,jymd,yljg,alarmflag,finish,fslx,autojgbz,lstd,shcs from lab_pat