浏览代码

校验数据

zhoutg 5 年之前
父节点
当前提交
f738ea3edc

+ 1 - 0
knowledgeman-service/src/main/java/com/diagbot/dto/VerifyDataDTO.java

@@ -22,5 +22,6 @@ public class VerifyDataDTO {
 
     @ApiModelProperty(value = "疾病公式")
     private List<DiagnoseDetail> disformula = new ArrayList<>();
+
     private Integer hasQuestion;
 }

+ 1 - 0
knowledgeman-service/src/main/java/com/diagbot/entity/CommonParam.java

@@ -18,4 +18,5 @@ public class CommonParam {
     private int insertOrUpdate;//更新或新增标识
     private int i = 0;
     private int j = 0;
+    private int flag = 0; // 1:表示有问题词或公式错误,0:正确
 }

+ 15 - 133
knowledgeman-service/src/main/java/com/diagbot/facade/DiagnoseFacade.java

@@ -52,8 +52,6 @@ import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Stack;
-import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Component
@@ -212,10 +210,10 @@ public class DiagnoseFacade extends DiagnoseServiceImpl {
 
         // 更新主表状态
         this.update(new UpdateWrapper<Diagnose>()
-                .set("has_question", ListUtil.isNotEmpty(diagnoseQuestionList) ? HasQuestionEnum.HAS_QUESTION.getKey() : HasQuestionEnum.NO_QUESTION.getKey())
+                .set("has_question", param.getFlag())
                 .eq("id", diagnoseWrapper.getId())
         );
-        verifyDataDTO.setHasQuestion(ListUtil.isNotEmpty(diagnoseQuestionList) ? HasQuestionEnum.HAS_QUESTION.getKey() : HasQuestionEnum.NO_QUESTION.getKey());
+        verifyDataDTO.setHasQuestion(param.getFlag());
         verifyDataDTO.setDisFeature(disFeature);
         verifyDataDTO.setDisformula(disformula);
         return verifyDataDTO;
@@ -268,8 +266,7 @@ public class DiagnoseFacade extends DiagnoseServiceImpl {
                     bean.setModifier(param.getPerson());
                     bean.setGmtModified(param.getNow());
                     if (DiagnoseTypeEnum.Confirmed.getKey() == bean.getType() || (DiagnoseTypeEnum.Examination.getKey() == bean.getType() || (DiagnoseTypeEnum.Vigilant.getKey() == bean.getType()))) {
-                        // 校验公式
-                        // TODO
+                        // 不需要校验公式
                     } else {
                         // 校验编码
                         if (StringUtil.isNotEmpty(bean.getCode())) {
@@ -458,6 +455,9 @@ public class DiagnoseFacade extends DiagnoseServiceImpl {
         }
         param.setI(i);
         param.setJ(j);
+        if (ListUtil.isNotEmpty(diagnoseQuestionList)) {
+            param.setFlag(HasQuestionEnum.HAS_QUESTION.getKey());
+        }
     }
 
 
@@ -469,6 +469,7 @@ public class DiagnoseFacade extends DiagnoseServiceImpl {
      * @return
      */
     public void doDisFormula(DiagnoseWrapper diagnoseWrapper, CommonParam param, List<DiagnoseDetail> diagnoseDetailList, List<DiagnoseQuestion> diagnoseQuestionList) {
+        List<String> codeList = diagnoseWrapper.getDisFeature().stream().map(row -> row.getCode()).distinct().collect(Collectors.toList());
         int i = param.getI();
         int j = param.getJ();
         // 遍历诊断公式
@@ -483,7 +484,13 @@ public class DiagnoseFacade extends DiagnoseServiceImpl {
             diagnoseDetail.setDisName(diagnoseWrapper.getDisName());
             diagnoseDetail.setOrderNo(++i);
             // 校验公式
-            // TODO
+            String errMsg = VerifyUtil.verifyFormula(codeList, bean.getFormula());
+            if (StringUtil.isNotEmpty(errMsg)) {
+                diagnoseDetail.setVerifyFormula(errMsg);
+                param.setFlag(HasQuestionEnum.HAS_QUESTION.getKey());
+            } else {
+                diagnoseDetail.setVerifyFormula("");
+            }
             diagnoseDetailList.add(diagnoseDetail);
         }
         param.setI(i);
@@ -530,7 +537,7 @@ public class DiagnoseFacade extends DiagnoseServiceImpl {
     public void  updateNeo(DiagnoseWrapper diagnoseWrapper) {
         VerifyDataDTO verifyDataDTO = verifyData(diagnoseWrapper);
         if (HasQuestionEnum.HAS_QUESTION.getKey() == verifyDataDTO.getHasQuestion()) {
-            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "有问题词存在,不能更新图谱");
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "有问题词存在或公式错误,不能更新图谱");
         }
         // 更新时间
         this.update(new UpdateWrapper<Diagnose>()
@@ -603,129 +610,4 @@ public class DiagnoseFacade extends DiagnoseServiceImpl {
         return dq;
     }
 
-
-    public static void main(String[] args) {
-        String s = "(1.1/1.2/1.3)任一+(1.4/1.17/1.18)任六+(2.1/2.2/2.3/2.4/2.5/2.6/2.7/2.8/2.9/2.11)任一";
-        String s1 = "(1.1)任一+(1.2任二)";
-        System.out.println(isMatch(s1));
-
-
-//        System.out.println(isMatch(s));
-
-        // 待解决,括号是否嵌套,括号内容不能为空
-        /**
-         * 1、括号成对校验
-         * 2、是否出现重复分隔符
-         * 3、获取编码并校验
-         */
-    }
-
-
-
-
-    /**
-     * 校验括号是否嵌套
-     * @param s
-     * @return
-     */
-    public static boolean verifyBracketNest(String s) {
-        int i = s.indexOf("(");
-        while(-1 != i) {
-            if(i == 0) {
-                return false;
-            } else {
-                char ch = s.charAt(i-1);
-                if (')' != ch) {
-                    return false;
-                }
-                i =  s.indexOf("任", i + 1);
-            }
-        }
-        return true;
-    }
-
-
-    /**
-     * 校验任字前面是否“)”
-     * @param s
-     * @return
-     */
-    public static boolean verifyRen(String s) {
-        int i = s.indexOf("任");
-        while(-1 != i) {
-            if(i == 0) {
-                return false;
-            } else {
-                char ch = s.charAt(i-1);
-                if (')' != ch) {
-                    return false;
-                }
-                i =  s.indexOf("任", i + 1);
-            }
-        }
-        return true;
-    }
-
-
-    /**
-     * 获取编码
-     * @param s
-     * @return
-     */
-    public static List<String> splitCode(String s) {
-        List<String> res = new ArrayList<>();
-        String resg1 = "\\(|/|\\)|任一|任二|任三|任四|任五|任六|任七|任八|任九|任十|\\+";
-        String[] arr = s.split(resg1);
-        for(String str : arr) {
-            if (StringUtil.isNotEmpty(str)) {
-                res.add(str);
-            }
-        }
-        return res;
-    }
-
-
-    /**
-     * 括号是否成对匹配
-     * @param s
-     * @return
-     */
-    public static boolean isMatch(String s) {
-        Stack<Character> sc=new Stack<Character>();
-        char[] c=s.toCharArray();
-        for (int i = 0; i < c.length; i++) {
-            if (c[i]=='(') {
-                sc.push(c[i]);
-            }
-            else if (c[i]==')') {
-                if(sc.isEmpty()){
-                    return false;
-                }
-                else{
-                    if (sc.peek()=='(') {
-                        sc.pop();
-                    }
-                }
-            }
-        }
-        if (sc.empty()) {
-            return true;
-        }else {
-            return false;
-        }
-    }
-
-
-    /**
-     * 是否出现重复分隔符
-     * @param s
-     * @return
-     */
-    public static boolean isRepeat(String s) {
-        String regex = ".*((\\()|(\\))|(\\+)|(//)|(任一)|(任二)|(任三)|(任四)|(任五)|(任六)|(任七)|(任八)|(任九)|(任十)){2,}.*";
-        return Pattern.matches(regex, s);
-    }
-
-
-
 }

+ 253 - 4
knowledgeman-service/src/main/java/com/diagbot/util/VerifyUtil.java

@@ -3,11 +3,10 @@ package com.diagbot.util;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Stack;
+import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import com.diagbot.exception.CommonErrorCode;
-import com.diagbot.exception.CommonException;
-
 /**
  * @description: 校验工具类
  * @author: zhoutg
@@ -33,8 +32,12 @@ public class VerifyUtil {
 
 
     public static void main(String[] args) {
-        System.out.println(verifyCode("1", "1.01"));
+    	List<String> list = new ArrayList<>();
+    	list.add("1.1");
+    	list.add("1.2");
+		checkCodeEquation(list, "(1.1/1.2)任一+");
     }
+
     /**
      * 校验公式编码
      * @param coding 编码
@@ -85,4 +88,250 @@ public class VerifyUtil {
 
 		return res;
 	}
+
+
+	/**
+	 * 校验括号中的值是否正确,大于等于任数,不能只有一个编码
+	 *
+	 * @param s
+	 * @return
+	 */
+	public static boolean verifyValue(String s) {
+		String regex = "\\(.*?\\)任"; // 非贪婪模式
+		Pattern pattern = Pattern.compile(regex);
+		Matcher matches = pattern.matcher(s);
+		while(matches.find()) {
+			String str = matches.group();
+			String numStr = s.substring(matches.end(), matches.end()+1);
+
+			int i = 0;
+			switch (numStr) {
+				case "一":
+					i = 1;
+					break;
+				case "二":
+					i = 2;
+					break;
+				case "三":
+					i = 3;
+					break;
+				case "四":
+					i = 4;
+					break;
+				case "五":
+					i = 5;
+					break;
+				case "六":
+					i = 6;
+					break;
+				case "七":
+					i = 7;
+					break;
+				case "八":
+					i = 8;
+					break;
+				case "九":
+					i = 9;
+					break;
+				case "十":
+					i = 10;
+					break;
+			}
+			int num = str.split("/").length;
+			if (i > num || 1 == num) { // 括号内只有一个编码
+				return true;
+			}
+		}
+		return false;
+	}
+
+
+	/**
+	 * 1、校验括号是否匹配,是否嵌套
+	 * 2、校验开头和结尾字符,开头不能是:)+/,结尾不能是:()+/
+	 * 3、校验公式分隔符
+	 * 4、校验公式中的编码值是否全部在编码中 (业务校验)
+	 * 5、校验括号中的值是否正确,大于等于任数,不能只有一个编码(业务校验)
+	 *
+	 * @param s
+	 * @return
+	 */
+	public static String verifyFormula(List<String> codeList, String s) {
+		String errMsg = "公式格式错误";
+		try {
+			// 1、校验括号是否匹配,是否嵌套
+			if (!verifyBracketNest(s)) {
+				return errMsg;
+			}
+
+			// 2、校验开头和结尾字符,开头不能是:)+/,结尾不能是:()+/
+			if (verifyStartEnd(s)) {
+				return errMsg;
+			}
+
+			// 3、校验公式分隔符
+			List<String> splitCode = verifySplit(s);
+			int i = 0;
+			for (String str : splitCode) {
+				// 如果中间出现空字符串,表明出错了
+				if (StringUtil.isEmpty(str) && i != 0 && i != splitCode.size() - 1) {
+					return errMsg;
+				}
+				i++;
+			}
+
+			// 4、校验公式中的编码值是否全部在编码中
+			List<String> codes = new ArrayList<>();
+			for (String str : splitCode) {
+				if (StringUtil.isNotEmpty(str)) {
+					codes.add(str);
+				}
+			}
+			if (!codeList.containsAll(codes)) {
+				return errMsg;
+			}
+
+			// 5、校验括号中的值是否正确,大于等于任数,不能只有一个编码
+			if (verifyValue(s)) {
+				return errMsg;
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			return errMsg;
+		}
+		return "";
+	}
+
+
+	/**
+	 * 校验开头和结尾字符,开头不能是:)+/,结尾不能是:()+/
+	 * @param s
+	 * @return
+	 */
+	public static boolean verifyStartEnd(String s) {
+		String startRegex =
+				".*(\\)|\\+|/)" ;
+		String endRegex =
+				".*(\\(|\\)|\\+|/)" ;
+		if (Pattern.matches(startRegex, s)) {
+			return true;
+		}
+		if (Pattern.matches(endRegex, s)) {
+			return true;
+		}
+		return false;
+	}
+
+
+	/**
+	 * 以最大长度分隔符分隔
+	 * @param s
+	 * @return
+	 */
+	public static List<String> verifySplit(String s) {
+		s = s.replaceAll("\\(", "(");
+		s = s.replaceAll("\\)", ")");
+		s = s.replaceAll(" ", "");
+		String regex =
+				"\\)任一\\+\\(" + "|\\)任二\\+\\(" + "|\\)任三\\+\\(" + "|\\)任四\\+\\(" + "|\\)任五\\+\\(" + "|\\)任六\\+\\(" + "|\\)任七\\+\\(" + "|\\)任八\\+\\(" + "|\\)任九\\+\\(" + "|\\)任十\\+\\(" +
+						"|\\)任一\\+" + "|\\)任二\\+"  + "|\\)任三\\+" + "|\\)任四\\+" + "|\\)任五\\+" + "|\\)任六\\+" + "|\\)任七\\+" + "|\\)任八\\+" + "|\\)任九\\+" + "|\\)任十\\+" +
+						"|\\)任一" + "|\\)任二" + "|\\)任三" + "|\\)任四" + "|\\)任五" + "|\\)任六" + "|\\)任七" + "|\\)任八" + "|\\)任九" + "|\\)任十" +
+						"|\\+\\(" +
+						"|\\(" +
+						"|\\)" +
+						"|\\+" +
+						"|/" ;
+		String[] arr = s.split(regex);
+		return Arrays.asList(arr);
+	}
+
+
+	/**
+	 * 校验括号是否匹配,是否嵌套
+	 * @param s
+	 * @return
+	 */
+	public static boolean verifyBracketNest(String s) {
+		Stack<Character> sc=new Stack<Character>();
+		char[] c=s.toCharArray();
+		for (int i = 0; i < c.length; i++) {
+			if (c[i]=='(') {
+				if(sc.isEmpty()) {
+					sc.push(c[i]);
+				} else {
+					if (sc.peek()=='(') {
+						return false;
+					}
+				}
+			}
+			else if (c[i]==')') {
+				if(sc.isEmpty()){
+					return false;
+				}
+				else{
+					if (sc.peek()=='(') {
+						sc.pop();
+					}
+				}
+			}
+		}
+		if (sc.empty()) {
+			return true;
+		}else {
+			return false;
+		}
+	}
+
+
+	/**
+	 * 校验任字前面是否“)”
+	 * @param s
+	 * @return
+	 */
+	public static boolean verifyRen(String s) {
+		int i = s.indexOf("任");
+		while(-1 != i) {
+			if(i == 0) {
+				return false;
+			} else {
+				char ch = s.charAt(i-1);
+				if (')' != ch) {
+					return false;
+				}
+				i =  s.indexOf("任", i + 1);
+			}
+		}
+		return true;
+	}
+
+
+	/**
+	 * 获取编码
+	 * @param s
+	 * @return
+	 */
+	public static List<String> splitCode(String s) {
+		List<String> res = new ArrayList<>();
+		String resg1 = "\\(|/|\\)|任一|任二|任三|任四|任五|任六|任七|任八|任九|任十|\\+";
+		String[] arr = s.split(resg1);
+		for(String str : arr) {
+			if (StringUtil.isNotEmpty(str)) {
+				res.add(str);
+			}
+		}
+		return res;
+	}
+
+
+	/**
+	 * 是否出现重复分隔符
+	 * @param s
+	 * @return
+	 */
+	public static boolean isRepeat(String s) {
+		String regex = ".*((\\()|(\\))|(\\+)|(//)|(任一)|(任二)|(任三)|(任四)|(任五)|(任六)|(任七)|(任八)|(任九)|(任十)){2,}.*";
+		return Pattern.matches(regex, s);
+	}
+
+
 }