瀏覽代碼

计算体质规则

zhoutg 6 年之前
父節點
當前提交
ac9d0a70b8
共有 1 個文件被更改,包括 71 次插入268 次删除
  1. 71 268
      prec-service/src/main/java/com/diagbot/facade/EvaluatorFacade.java

+ 71 - 268
prec-service/src/main/java/com/diagbot/facade/EvaluatorFacade.java

@@ -24,7 +24,6 @@ import org.springframework.stereotype.Component;
 import java.math.BigDecimal;
 import java.util.Comparator;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -43,13 +42,14 @@ public class EvaluatorFacade extends EvaluatorServiceImpl {
     public static void main(String[] args) {
         EvaluatorFacade evaluatorFacade = new EvaluatorFacade();
         Evaluator evaluator = new Evaluator();
-        evaluator.setMildValue(new BigDecimal(40.0)); // 平和体质
-        evaluator.setFaintValue(new BigDecimal(40.0)); // 气虚体质
-        evaluator.setWetValue(new BigDecimal(40.0)); // 湿滞体质
+        evaluator.setMildValue(new BigDecimal(42.0)); // 平和体质
+        evaluator.setFaintValue(new BigDecimal(41.0)); // 气虚体质
+        evaluator.setStagnantValue(new BigDecimal(82.00)); // 积滞同质
+        evaluator.setWetValue(new BigDecimal(41.0)); // 湿滞体质
         evaluator.setHeartValue(new BigDecimal(41.)); // 心肝火旺体质
-        evaluator.setStagnantValue(new BigDecimal(42.00)); // 积滞同质
         evaluator.setExceptValue(new BigDecimal(42.01)); // 异禀体质
-        evaluatorFacade.valueSort(evaluator);
+//        evaluatorFacade.valueSort(evaluator);
+        evaluatorFacade.cal(evaluator);
 
     }
 
@@ -62,8 +62,9 @@ public class EvaluatorFacade extends EvaluatorServiceImpl {
      */
     public Evaluator cal(Evaluator evaluator) {
 
-        Double max = getMax5(evaluator);
-        Double min = getMin5(evaluator);
+        List<PhysicalVal> list = this.valueSort(evaluator);
+        Double max = list.get(0).getValue();
+        Double min = list.get(4).getValue();
         /**
          * 判断平和质:
          * 平和质转化分≥60分,同时其他5种体质转化分均<30分,判断结果:“平和质”。
@@ -72,29 +73,42 @@ public class EvaluatorFacade extends EvaluatorServiceImpl {
          * 不满足上述条件,判断结果:否。
          */
         // 平和质转化分≥60分
-         if (evaluator.getMildValue().doubleValue() >= 60.0) {
-             if (max < 30) {
-                 // 同时其他5种体质转化分均<30分, max[2/3/4/5/6] < 30
-                 evaluator.setPhysicalRes("平和体质");
-                 evaluator.setPhysicalTypes(String.valueOf(PhysicalTypeEnum.mild.getKey()));
-             } else if (max < 50 && min >= 30) {
-                 // 同时其他5种体质转化分均<50分,min[2/3/4/5/6] >= 30 and max[2/3/4/5/6] < 50
-                 evaluator.setPhysicalRes("基本是平和体质");
-                 evaluator.setPhysicalTypes(String.valueOf(PhysicalTypeEnum.mild.getKey()) );
-             } else if (max < 50 && max >= 30 && min < 30){
-                 // 同时其他5种体质转化分有30-49分,max[2/3/4/5/6] < 50 and max[2/3/4/5/6] >= 30 and min[2/3/4/5/6] < 30
-                 Map map = getMap(evaluator);
-                 evaluator.setPhysicalRes("基本是平和体质兼倾向" + map.get("msg"));
-                 evaluator.setPhysicalTypes(String.valueOf(PhysicalTypeEnum.mild.getKey()) + "," +  map.get("type"));
-             } else if (max >= 50){
-                 // 同时其他5种体质转化分有>=50分, max[2/3/4/5/6] >= 50
-                 Map map = getMapWithMild(evaluator, max);
-                 // 最大值有多个【是XX体质兼有XX体质】,最大值只有1个【是XX体质】
-                 evaluator.setPhysicalRes(String.valueOf(map.get("msg")));
-                 evaluator.setPhysicalTypes(String.valueOf(map.get("type")));
-             }
-         }
-
+        if (evaluator.getMildValue().doubleValue() >= 60.0) {
+            if (max < 30) {
+                // 同时其他5种体质转化分均<30分, max[2/3/4/5/6] < 30
+                evaluator.setPhysicalRes("平和体质");
+                evaluator.setPhysicalTypes(String.valueOf(PhysicalTypeEnum.mild.getKey()));
+            } else if (max < 50 && min >= 30) {
+                // 同时其他5种体质转化分均<50分,min[2/3/4/5/6] >= 30 and max[2/3/4/5/6] < 50
+                evaluator.setPhysicalRes("基本是平和体质");
+                evaluator.setPhysicalTypes(String.valueOf(PhysicalTypeEnum.mild.getKey()));
+            } else if (max < 50 && max >= 30 && min < 30) {
+                // 同时其他5种体质转化分有30-49分,max[2/3/4/5/6] < 50 and max[2/3/4/5/6] >= 30 and min[2/3/4/5/6] < 30
+                evaluator.setPhysicalRes("基本是平和体质兼倾向" + PhysicalTypeEnum.getName(list.get(0).getEnumNo()));
+                evaluator.setPhysicalTypes(String.valueOf(PhysicalTypeEnum.mild.getKey()) + "," + list.get(0).getEnumNo());
+            } else if (max >= 50) {
+                // 同时其他5种体质转化分有>=50分, max[2/3/4/5/6] >= 50
+                String msg = "";
+                String type = "";
+                if (evaluator.getMildValue().doubleValue() > max) {
+                    msg = "是平和体质";
+                    type = String.valueOf(PhysicalTypeEnum.mild.getKey());
+                } else if (evaluator.getMildValue().doubleValue() == max) {
+                    msg = "是平和体质兼有" + PhysicalTypeEnum.getName(list.get(0).getEnumNo());
+                    type = String.valueOf(PhysicalTypeEnum.mild.getKey()) + "," + list.get(0).getEnumNo();
+                } else {
+                    if ((list.get(0).getValue() == list.get(1).getValue()) || (list.get(1).getValue() > 50)) {
+                        msg = "是" + PhysicalTypeEnum.getName(list.get(0).getEnumNo()) + "兼有" + PhysicalTypeEnum.getName(list.get(1).getEnumNo());
+                        type = list.get(0).getEnumNo() + "," + list.get(1).getEnumNo();
+                    } else {
+                        msg = "是" + PhysicalTypeEnum.getName(list.get(0).getEnumNo());
+                        type = "" + list.get(0).getEnumNo();
+                    }
+                }
+                evaluator.setPhysicalRes(msg);
+                evaluator.setPhysicalTypes(type);
+            }
+        }
 
         /**
          * 判断偏颇体质:
@@ -109,260 +123,49 @@ public class EvaluatorFacade extends EvaluatorServiceImpl {
          * 平和质转化分<60分,同时其他6种体质转化分30-49分,判断结果:倾向是XX体质。如果有两种或以上的得分一样,则按照6种偏颇体质的排列顺序为:气虚质、积滞质、湿滞质、心肝火旺质、异禀质,判断结果:“倾向是XX体质兼XX体质”,其余不考虑。如果等分倾向是体质有3个或以上,则仅选择分值最高的前两个,判断结果:“倾向是XX体质兼XX体质”,其余不考虑。
          * 注意:有偏颇体质的不再考虑倾向体质。
          */
-         else if (evaluator.getMildValue().doubleValue() < 60.0) {
+        else if (evaluator.getMildValue().doubleValue() < 60.0) {
             if (max < 30) { // max[2/3/4/5/6] < 30
                 evaluator.setPhysicalRes("平和体质");
                 evaluator.setPhysicalTypes(String.valueOf(PhysicalTypeEnum.mild.getKey()));
-            } else if (max < 50 && max >= 30 ) { // min[2/3/4/5/6] >= 30 and max[2/3/4/5/6] < 50
+            } else if (max < 50 && max >= 30) { // min[2/3/4/5/6] >= 30 and max[2/3/4/5/6] < 50
                 // 最大值有多个【倾向XX体质兼有XX体质】, 最大值只有1个【倾向XX体质】
-                Map map = getMapNoMild(evaluator, "倾向是", max);
-                evaluator.setPhysicalRes(String.valueOf(map.get("msg")));
-                evaluator.setPhysicalTypes(String.valueOf(map.get("type")));
-            } else if (max >= 50) { // max[2/3/4/5/6] >= 50
-                // 最大值有多个【是XX体质兼有XX体质】,最大值只有1个【是XX体质】
-                Map map = getMapNoMild(evaluator, "是", max);
-                evaluator.setPhysicalRes(String.valueOf(map.get("msg")));
-                evaluator.setPhysicalTypes(String.valueOf(map.get("type")));
-            }
-        }
-        return evaluator;
-    }
-
-
-    /**
-     *  获取偏颇体质的最大值
-     *
-     * @param evaluator
-     * @return 最大值
-     */
-    public Double getMax5(Evaluator evaluator) {
-        Double max = evaluator.getFaintValue().doubleValue(); // 气虚质
-        if (max < evaluator.getWetValue().doubleValue()) { // 湿滞质
-            max = evaluator.getWetValue().doubleValue();
-        }
-        if (max < evaluator.getHeartValue().doubleValue()) { // 心肝火旺质
-            max = evaluator.getHeartValue().doubleValue();
-        }
-        if (max < evaluator.getStagnantValue().doubleValue()) { // 积滞质
-            max = evaluator.getStagnantValue().doubleValue();
-        }
-        if (max < evaluator.getExceptValue().doubleValue()) { // 异禀体质
-            max = evaluator.getExceptValue().doubleValue();
-        }
-        return max;
-    }
-
-
-    /**
-     * 获取偏颇体质的最小值
-     *
-     * @param evaluator
-     * @return 最小值
-     */
-    public Double getMin5(Evaluator evaluator) {
-        Double min = evaluator.getFaintValue().doubleValue();// 气虚质
-        if (min > evaluator.getWetValue().doubleValue()) { // 湿滞质
-            min = evaluator.getWetValue().doubleValue();
-        }
-        if (min > evaluator.getHeartValue().doubleValue()) { // 心肝火旺质
-            min = evaluator.getHeartValue().doubleValue();
-        }
-        if (min > evaluator.getStagnantValue().doubleValue()) { // 积滞质
-            min = evaluator.getStagnantValue().doubleValue();
-        }
-        if (min > evaluator.getExceptValue().doubleValue()) { // 异禀体质
-            min = evaluator.getExceptValue().doubleValue();
-        }
-        return min;
-    }
-
-
-    /**
-     * 获取无平和体质下的结果
-     *
-     * @param evaluator 参数
-     * @param prefix 前缀
-     * @param max 最大值
-     * @return
-     */
-    public Map getMapNoMild(Evaluator evaluator, String prefix, Double max) {
-        Map map = new HashMap<>();
-        String msg = "";
-        String type = "";
-        max = getMax5(evaluator);
-        int flag = 0;
-        if (evaluator.getFaintValue().doubleValue() == max) {
-            ++flag; // 最大值加1
-            msg =  prefix + "气虚体质";
-            type = "2";
-        }
-        if (evaluator.getWetValue().doubleValue() == max && flag < 2) {
-            if (flag == 1) {
-                msg += "兼有湿滞体质";
-                type += ",3";
-            } else {
-                msg = prefix + "湿滞体质";
-                type = "3";
-            }
-            ++flag;
-        }
-        if (evaluator.getHeartValue().doubleValue() == max && flag < 2) {
-            if (flag == 1) {
-                msg += "兼有心肝火旺体质";
-                type += ",4";
-            } else {
-                msg = prefix + "心肝火旺体质";
-                type = "4";
-            }
-            ++flag;
-        }
-        if (evaluator.getStagnantValue().doubleValue() == max && flag < 2) {
-            if (flag == 1) {
-                msg += "兼有积滞体质";
-                type += ",5";
-            } else {
-                msg = prefix + "积滞体质";
-                type = "5";
-            }
-            ++flag;
-        }
-        if (evaluator.getExceptValue().doubleValue() == max && flag < 2) {
-            if (flag == 1) {
-                msg += "兼有异禀体质";
-                type += ",6";
-            } else {
-                msg = prefix + "异禀体质";
-                type = "6";
-            }
-        }
-        map.put("msg", msg);
-        map.put("type", type);
-        return map;
-    }
-
-
-    /**
-     * 获取有平和体质下的结果
-     *
-     * @param evaluator 参数
-     * @param max 前缀
-     * @return
-     */
-    public Map getMapWithMild(Evaluator evaluator, Double max) {
-        Map map = new HashMap<>();
-        String msg = "";
-        String type = "";
-        max = getMax5(evaluator);
-        if (evaluator.getMildValue().doubleValue() > max) {
-            msg = "是平和体质";
-            type = String.valueOf(PhysicalTypeEnum.mild.getKey());
-        } else if (evaluator.getMildValue().doubleValue() == max) {
-            if (evaluator.getFaintValue().doubleValue() == max) {
-                msg = "是平和体质兼有气虚体质";
-                type = "1,2";
-            } else if (evaluator.getWetValue().doubleValue() == max) {
-                msg = "是平和体质兼有湿滞体质";
-                type = "1,3";
-            } else if (evaluator.getHeartValue().doubleValue() == max) {
-                msg = "是平和体质兼有心肝火旺体质";
-                type = "1,4";
-            } else if (evaluator.getFaintValue().doubleValue() == max) {
-                msg = "是平和体质兼有积滞同质";
-                type = "1,5";
-            } else if (evaluator.getExceptValue().doubleValue() == max) {
-                msg = "是平和体质兼有异禀体质";
-                type = "1,6";
-            }
-        } else {
-            int flag = 0;
-            if (evaluator.getFaintValue().doubleValue() == max) {
-                ++flag; // 最大值加1
-                msg = "是气虚体质";
-                type = "2";
-            }
-            if (evaluator.getWetValue().doubleValue() == max && flag < 2) {
-                if (flag == 1) {
-                    msg += "兼有湿滞体质";
-                    type += ",3";
-                } else {
-                    msg = "是湿滞体质";
-                    type = "3";
-                }
-                ++flag;
-            }
-            if (evaluator.getHeartValue().doubleValue() == max && flag < 2) {
-                if (flag == 1) {
-                    msg += "兼有心肝火旺体质";
-                    type += ",4";
+                if (list.get(0).getValue() == list.get(1).getValue()) {
+                    evaluator.setPhysicalRes(
+                            "倾向是" +
+                                    PhysicalTypeEnum.getName(list.get(0).getEnumNo())
+                                    + "兼有" +
+                                    PhysicalTypeEnum.getName(list.get(1).getEnumNo()));
+                    evaluator.setPhysicalTypes("" + list.get(0).getEnumNo() + "," + list.get(1).getEnumNo());
                 } else {
-                    msg = "是心肝火旺体质";
-                    type = "4";
+                    evaluator.setPhysicalRes("倾向是" +
+                            PhysicalTypeEnum.getName(list.get(0).getEnumNo()));
+                    evaluator.setPhysicalTypes("" + list.get(0).getEnumNo());
                 }
-                ++flag;
-            }
-            if (evaluator.getStagnantValue().doubleValue() == max && flag < 2) {
-                if (flag == 1) {
-                    msg += "兼有积滞同质";
-                    type += ",5";
-                } else {
-                    msg = "是积滞同质";
-                    type = "5";
-                }
-                ++flag;
-            }
-            if (evaluator.getExceptValue().doubleValue() == max && flag < 2) {
-                if (flag == 1) {
-                    msg += "兼有异禀体质";
-                    type += ",6";
+            } else if (max >= 50) { // max[2/3/4/5/6] >= 50
+                // 最大值有多个【是XX体质兼有XX体质】,最大值只有1个【是XX体质】
+                if ((list.get(0).getValue() == list.get(1).getValue()) || (list.get(1).getValue() > 50)) {
+                    evaluator.setPhysicalRes("是" +
+                            PhysicalTypeEnum.getName(list.get(0).getEnumNo())
+                            + "兼有" +
+                            PhysicalTypeEnum.getName(list.get(1).getEnumNo()));
+                    evaluator.setPhysicalTypes("" + list.get(0).getEnumNo() + "," + list.get(1).getEnumNo());
                 } else {
-                    msg = "是异禀体质";
-                    type = "6";
+                    evaluator.setPhysicalRes("是" +
+                            PhysicalTypeEnum.getName(list.get(0).getEnumNo()));
+                    evaluator.setPhysicalTypes("" + list.get(0).getEnumNo());
                 }
             }
         }
-        map.put("msg", msg);
-        map.put("type", type);
-        return map;
+        return evaluator;
     }
 
 
     /**
-     * 获取平和体质下的结果
+     * 对偏颇体质排序
      *
      * @param evaluator
-     * @return
+     * @return 列表
      */
-    public Map getMap(Evaluator evaluator) {
-        Map map = new HashMap<>();
-        String msg = "气虚体质";
-        String type = String.valueOf(PhysicalTypeEnum.faint.getKey());
-        Double max = evaluator.getFaintValue().doubleValue(); // 气虚质
-
-        if (max < evaluator.getWetValue().doubleValue()) { // 湿滞质
-            max = evaluator.getWetValue().doubleValue();
-            msg = "湿滞体质";
-            type = String.valueOf(PhysicalTypeEnum.wet.getKey());
-        }
-        if (max < evaluator.getHeartValue().doubleValue()) { // 心肝火旺质
-            max = evaluator.getHeartValue().doubleValue();
-            msg = "心肝火旺体质";
-            type = String.valueOf(PhysicalTypeEnum.heart.getKey());
-        }
-        if (max < evaluator.getStagnantValue().doubleValue()) { // 积滞质
-            max = evaluator.getStagnantValue().doubleValue();
-            msg = "积滞体质";
-            type = String.valueOf(PhysicalTypeEnum.stagnant.getKey());
-        }
-        if (max < evaluator.getExceptValue().doubleValue()) { // 异禀体质
-            max = evaluator.getExceptValue().doubleValue();
-            msg = "异禀体质";
-            type = String.valueOf(PhysicalTypeEnum.except.getKey());
-        }
-        map.put("msg", msg);
-        map.put("type", type);
-        return map;
-    }
-
     private List<PhysicalVal> valueSort(Evaluator evaluator){
         List<PhysicalVal> res = ListUtil.newArrayList();
         //气虚体质转化分