Sfoglia il codice sorgente

1、《自测健康评定量表》无法提交
2、《匹兹堡睡眠质量指数》测试内容不展示
3、《卡特尔16PF测试》无法提交
4、《精神运动警觉度测试》《决策倾向测试》测试结果不展示
5、《医院焦虑抑郁量表》测试完没有结果

yazhe 8 mesi fa
parent
commit
0e34b22459

+ 46 - 41
src/main/java/com/rf/psychological/file/excel/ExcelClass.java

@@ -91,18 +91,21 @@ public class ExcelClass {
             excel.add(new ExcelBean("刺激类型", "stimulateType", 0));
             excel.add(new ExcelBean("按键正误", "rightOrWrong", 0));
         } else if (Constant.QUEST_TYPE_ALERTNESS.equals(flag)) {
-            excel.add(new ExcelBean("试次序号", "index", 0));
-            excel.add(new ExcelBean("被试ID", "cardNo", 0));
-            excel.add(new ExcelBean("姓名", "userName", 0));
-            excel.add(new ExcelBean("年龄", "age", 0));
-            /*excel.add(new ExcelBean("单位名称旅", "org", 0));
-            excel.add(new ExcelBean("单位名称大队", "orgSub", 0));
-            excel.add(new ExcelBean("飞行等级", "FXLevel", 0));
-            excel.add(new ExcelBean("现飞机型", "currentJX", 0));*/
-            excel.add(new ExcelBean("当前试次起始时间", "onceStartTime", 0));
-//            excel.add(new ExcelBean("刺激次数", "key", 0));
+            //yazhe 20241225 柴春阳
+            excel.add(new ExcelBean("刺激次数", "key", 0));
             excel.add(new ExcelBean("反应时长(ms)", "value", 0));
-            excel.add(new ExcelBean("是否反应正确", "isValidResponse", 0));
+//            excel.add(new ExcelBean("试次序号", "index", 0));
+//            excel.add(new ExcelBean("被试ID", "cardNo", 0));
+//            excel.add(new ExcelBean("姓名", "userName", 0));
+//            excel.add(new ExcelBean("年龄", "age", 0));
+//            /*excel.add(new ExcelBean("单位名称旅", "org", 0));
+//            excel.add(new ExcelBean("单位名称大队", "orgSub", 0));
+//            excel.add(new ExcelBean("飞行等级", "FXLevel", 0));
+//            excel.add(new ExcelBean("现飞机型", "currentJX", 0));*/
+//            excel.add(new ExcelBean("当前试次起始时间", "onceStartTime", 0));
+////            excel.add(new ExcelBean("刺激次数", "key", 0));
+//            excel.add(new ExcelBean("反应时长(ms)", "value", 0));
+//            excel.add(new ExcelBean("是否反应正确", "isValidResponse", 0));
         } else if (Constant.QUEST_TYPE_ADDITION.equals(flag)) {
             excel.add(new ExcelBean("数字个数", "key", 0));
             excel.add(new ExcelBean("正确次数", "value", 0));
@@ -255,45 +258,47 @@ public class ExcelClass {
             excel.add(new ExcelBean("反应是否正确", "responseTrue", 0));
             excel.add(new ExcelBean("用户反应时间", "responseTime", 0));*/
         } else if (Constant.QUEST_TYPE_RDT.equals(flag)) {
+            // yazhe 20241225 柴春阳
+            excel.add(new ExcelBean("序号", "index", 0));
+            excel.add(new ExcelBean("本轮得分", "currentEarn", 0));
+            excel.add(new ExcelBean("点击次数", "numberPumps", 0));
 
-            excel.add(new ExcelBean("试次序号", "index", 0));
-            excel.add(new ExcelBean("被试ID", "cardNo", 0));
-            excel.add(new ExcelBean("姓名", "userName", 0));
-            excel.add(new ExcelBean("年龄", "age", 0));
-            /*excel.add(new ExcelBean("单位名称旅", "org", 0));
-            excel.add(new ExcelBean("单位名称大队", "orgSub", 0));
-            excel.add(new ExcelBean("飞行等级", "FXLevel", 0));
-            excel.add(new ExcelBean("现飞机型", "currentJX", 0));*/
-            excel.add(new ExcelBean("当前试次起始时间", "onceStartTime", 0));
-            excel.add(new ExcelBean("每轮得分", "currentEarn", 0));
-            excel.add(new ExcelBean("每轮点击数", "numberPumps", 0));
-            excel.add(new ExcelBean("截止当前轮次累计得分", "totalEarn", 0));
-            excel.add(new ExcelBean("截止当前轮次累计点击次数", "totalPumps", 0));
-            excel.add(new ExcelBean("预期爆炸次数", "expectedNumberExplosions", 0));
+//            excel.add(new ExcelBean("试次序号", "index", 0));
+//            excel.add(new ExcelBean("被试ID", "cardNo", 0));
+//            excel.add(new ExcelBean("姓名", "userName", 0));
+//            excel.add(new ExcelBean("年龄", "age", 0));
+//            /*excel.add(new ExcelBean("单位名称旅", "org", 0));
+//            excel.add(new ExcelBean("单位名称大队", "orgSub", 0));
+//            excel.add(new ExcelBean("飞行等级", "FXLevel", 0));
+//            excel.add(new ExcelBean("现飞机型", "currentJX", 0));*/
+//            excel.add(new ExcelBean("当前试次起始时间", "onceStartTime", 0));
+//            excel.add(new ExcelBean("每轮得分", "currentEarn", 0));
+//            excel.add(new ExcelBean("每轮点击数", "numberPumps", 0));
+//            excel.add(new ExcelBean("截止当前轮次累计得分", "totalEarn", 0));
+//            excel.add(new ExcelBean("截止当前轮次累计点击次数", "totalPumps", 0));
+//            excel.add(new ExcelBean("预期爆炸次数", "expectedNumberExplosions", 0));
         } else if (Constant.QUEST_TYPE_IGT.equals(flag)) {
             excel.add(new ExcelBean("扑克类型", "pokerChoice", 0));
             excel.add(new ExcelBean("收益", "earnings", 0));
             excel.add(new ExcelBean("金钱总额", "moneySum", 0));
         } else if (Constant.QUEST_TYPE_SC.equals(flag)) {
-            excel.add(new ExcelBean("试次序号", "index", 0));
-            excel.add(new ExcelBean("被试ID", "cardNo", 0));
-            excel.add(new ExcelBean("姓名", "userName", 0));
-            excel.add(new ExcelBean("年龄", "age", 0));
-            /*excel.add(new ExcelBean("单位名称旅", "org", 0));
-            excel.add(new ExcelBean("单位名称大队", "orgSub", 0));
-            excel.add(new ExcelBean("飞行等级", "FXLevel", 0));
-            excel.add(new ExcelBean("现飞机型", "currentJX", 0));*/
-            excel.add(new ExcelBean("当前试次起始时间", "onceStartTime", 0));
-            excel.add(new ExcelBean("试次难度等级", "level", 0));
-            excel.add(new ExcelBean("试次反应误差", "error", 0));
-            excel.add(new ExcelBean("是否反应", "hasResponse", 0));
-/*
-
-
+//            excel.add(new ExcelBean("试次序号", "index", 0));
+//            excel.add(new ExcelBean("被试ID", "cardNo", 0));
+//            excel.add(new ExcelBean("姓名", "userName", 0));
+//            excel.add(new ExcelBean("年龄", "age", 0));
+//            /*excel.add(new ExcelBean("单位名称旅", "org", 0));
+//            excel.add(new ExcelBean("单位名称大队", "orgSub", 0));
+//            excel.add(new ExcelBean("飞行等级", "FXLevel", 0));
+//            excel.add(new ExcelBean("现飞机型", "currentJX", 0));*/
+//            excel.add(new ExcelBean("当前试次起始时间", "onceStartTime", 0));
+//            excel.add(new ExcelBean("试次难度等级", "level", 0));
+//            excel.add(new ExcelBean("试次反应误差", "error", 0));
+//            excel.add(new ExcelBean("是否反应", "hasResponse", 0));
+            // yazhe 20241224 柴春阳
             excel.add(new ExcelBean("序号", "imgIndex", 0));
             excel.add(new ExcelBean("小球运动速度", "speed", 0));
             excel.add(new ExcelBean("方块长度", "length", 0));
-            excel.add(new ExcelBean("误差", "error", 0));*/
+            excel.add(new ExcelBean("误差", "error", 0));
         } else if (Constant.QUEST_TYPE_GBE.equals(flag)) {
             excel.add(new ExcelBean("关卡", "level", 0));
             excel.add(new ExcelBean("是否通过", "isPassed", 0));

+ 196 - 80
src/main/java/com/rf/psychological/scale/resultBusiness/cognitiveResult/ALERTNESSCognize.java

@@ -2,6 +2,7 @@ package com.rf.psychological.scale.resultBusiness.cognitiveResult;
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.rf.psychological.dao.model.ObjectEntity;
 import com.rf.psychological.dao.model.ObjectNewEntity;
 import com.rf.psychological.file.excel.ExcelClass;
 import com.rf.psychological.scale.resultBusiness.scaleResult.BaseScale;
@@ -28,89 +29,62 @@ public class ALERTNESSCognize extends BaseScale {
         super(jsonArray, resultJson);
     }
 
-    public JSONObject scaleCalculate() throws Exception {
+    // yazhe 20241225 柴春阳
+    public  JSONObject scaleCalculate() throws Exception {
         List<Map<String, String>> resultMapList = new ArrayList<>();
         JSONObject jsonObject = resultJson.getJSONObject("jsonObject");
         String fileName = resultJson.getString("fileName");
         String name;
         String type = resultJson.getString("type");
+
         JSONObject resultDBJson = new JSONObject(true);
 
         resultMapList = new ArrayList<>();
-        //正确反应总时长
-        double allTime = 0;
-        //正确反应总次数
-        int allCount = 0;
+        //总时长
+        int allTime = 0;
         //500ms- 1000ms 次数
         int time500 = 0;
         //1000ms 次数
         int time1000 = 0;
         JSONArray jsonArray = jsonObject.getJSONArray("data");
-        List<ObjectNewEntity> dataList = jsonArray.toJavaList(ObjectNewEntity.class);
-        for (ObjectNewEntity roa : dataList) {
-            double temp = Double.parseDouble(roa.getValue());
-            if (roa.getIsValidResponse() == 1) {
-                allTime += temp;
-                allCount++;
-            }
+        List<ObjectEntity> dataList = jsonArray.toJavaList(ObjectEntity.class);
+        for (ObjectEntity roa : dataList) {
+            int temp = Integer.parseInt(roa.getValue());
+            allTime += temp;
             if (temp > 500 && temp < 1000) {
                 time500 += 1;
             } else if (temp >= 1000) {
                 time1000 += 1;
             }
         }
-        int i = 1;
-        for (ObjectNewEntity entity : dataList) {
-            entity.setCardNo(resultJson.getString("cardNo"));
-            entity.setUserName(resultJson.getString("userName"));
-            entity.setAge(resultJson.getString("age"));
-            entity.setOrg(resultJson.getString("org"));
-            entity.setOrgSub(resultJson.getString("orgSub"));
-            entity.setFXLevel(resultJson.getString("FXLevel"));
-            entity.setCurrentJX(resultJson.getString("currentJX"));
-            entity.setIndex(i + "");
-            i++;
-        }
 
         //平均时长(ms)
-        double averageTime =0;
-        if (allCount!=0){
-            averageTime=new BigDecimal((double) allTime / allCount).setScale(2, RoundingMode.HALF_UP).doubleValue();
-        }
-
+        double averageTime = new BigDecimal((double) allTime / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue();
         //超过0.5秒的比例
-        double ratio500 = new BigDecimal((double) time500 / (double) dataList.size()).setScale(4, RoundingMode.HALF_UP).doubleValue();
+        double ratio500 = new BigDecimal((double) time500 / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue();
         //超过1秒的比例
-        double ratio1000 = new BigDecimal((double) time1000 / (double) dataList.size()).setScale(4, RoundingMode.HALF_UP).doubleValue();
-        //平均正确率
-        double corrent = dataList.stream().mapToInt(item -> item.getIsValidResponse()).sum();
-        corrent = new BigDecimal((double) corrent / (double) dataList.size()).setScale(4, RoundingMode.HALF_UP).doubleValue();
+        double ratio1000 = new BigDecimal((double) time1000 / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue();
 
         String alertness;
         String desc;
 
-        resultDBJson.put("versionNo", Constant.COGNITION_RESULT_VERSION);
-        if (averageTime >= 550) {
+        resultDBJson.put("versionNo",Constant.COGNITION_RESULT_VERSION);
+        if (averageTime >= 550){
             alertness = "警觉度5级";
             desc = "您的注意力稳定性和专注力很差,不能够在较长时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力的敏锐程度很差,不能很好地觉察情景中危险刺激。建议您后续加强注意稳定性训练,提高反应能力和专注力。";
-        } else if (averageTime >= 500 && averageTime < 550) {
+        }else if(averageTime >= 500 && averageTime < 550){
             alertness = "警觉度4级";
             desc = "您的注意力稳定性和专注力较差,不能够在较长时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力的敏锐程度较差,不能很好地觉察情景中危险刺激。建议您后续加强注意稳定性训练,提高反应能力和专注力。";
-        } else if (averageTime >= 450 && averageTime < 500) {
+        }else if(averageTime >= 450 && averageTime < 500){
             alertness = "警觉度3级";
             desc = "您具有一般水平的注意力稳定性和专注力,能够在较长时间但不能在很长时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力的敏锐程度一般,能够较好但不能很好地觉察情景中危险刺激。";
-        } else if (averageTime >= 400 && averageTime < 450) {
+        }else if(averageTime >= 400 && averageTime < 450){
             alertness = "警觉度2级";
             desc = "您的注意力稳定性和专注力较好,能够在较长的时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力较敏锐,觉察情景中危险刺激的能力较高。";
-        } else {
+        }else {
             alertness = "警觉度1级";
             desc = "您的注意力稳定性和专注力非常好,能够在非常长的时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力非常敏锐,觉察情景中危险刺激的能力非常高,在物种生存法则中更易生存下来。";
         }
-
-        String taskStartTime = jsonObject.getString("taskStartTime");
-        SimpleDateFormat insdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        SimpleDateFormat outsdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
-        taskStartTime = outsdf.format(insdf.parse(taskStartTime));
         //表格数据
         JSONArray tableModule = new JSONArray();
         JSONObject table1 = new JSONObject(true);
@@ -118,60 +92,202 @@ public class ALERTNESSCognize extends BaseScale {
         columnName.add("指标名称");
         columnName.add("指标值");
         JSONArray columnValue = new JSONArray();
-
-        columnValue.add("当前任务起始时间;平均正确率;超过0.5秒的比例;超过1秒的比例;平均时长(ms)");
-        columnValue.add(taskStartTime + ";" + String.format("%.4f", corrent) + ";" + String.format("%.4f", ratio500) + ";" + String.format("%.4f", ratio1000) + ";" + String.format("%.2f", averageTime));
-        table1.put("tableName", "table1");
-        table1.put("columnName", columnName);
-        table1.put("columnValue", columnValue);
+        columnValue.add("超过0.5秒的比例;超过1秒的比例;平均时长(ms);警觉度等级;解释");
+        columnValue.add(ratio500+";"+ratio1000+";"+averageTime+";"+alertness+";"+desc);
+        table1.put("tableName","table1");
+        table1.put("columnName",columnName);
+        table1.put("columnValue",columnValue);
         tableModule.add(table1);
         resultDBJson.put("tableModule", tableModule);
 
         JSONObject ifShow = new JSONObject(true);
-        ifShow.put("totalScore", false);
-        ifShow.put("dimensions", false);
-        ifShow.put("note", false);
-        ifShow.put("radar", false);
-        ifShow.put("table", true);
-        resultDBJson.put("ifShow", ifShow);
+        ifShow.put("totalScore",false);
+        ifShow.put("dimensions",false);
+        ifShow.put("note",false);
+        ifShow.put("radar",false);
+        ifShow.put("table",true);
+        resultDBJson.put("ifShow",ifShow);
 
         Map<String, String> resultMap = new LinkedHashMap<>();
-        resultMap.put("当前任务起始时间", taskStartTime);
-        resultMap.put("平均正确率", String.format("%.4f", corrent));
-        resultMap.put("超过0.5秒的比例", String.format("%.4f", ratio500));
-        resultMap.put("超过1秒的比例", String.format("%.4f", ratio1000));
-        //resultMap.put("平均时长(ms)", String.valueOf(new BigDecimal((double) allTime / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
-        resultMap.put("平均时长(ms)", String.format("%.2f", averageTime));
-        /*resultMap.put("警觉度等级", alertness);
-        resultMap.put("解释", desc);*/
-        resultDBJson.put("当前任务起始时间", taskStartTime);
-        resultDBJson.put("平均正确率", String.format("%.4f", corrent));
-        resultDBJson.put("超过0.5秒的比例",String.format("%.4f", ratio500));
-        resultDBJson.put("超过1秒的比例",String.format("%.4f", ratio1000));
-        //resultDBJson.put("平均时长(ms)", String.valueOf(new BigDecimal((double) allTime / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
-        resultDBJson.put("平均时长(ms)", String.format("%.2f", averageTime));
-        /*resultDBJson.put("警觉度等级", alertness);
-        resultDBJson.put("解释", desc);*/
+        resultMap.put("超过0.5秒的比例", String.valueOf(new BigDecimal((double) time500 / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
+        resultMap.put("超过1秒的比例", String.valueOf(new BigDecimal((double) time1000 / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
+        resultMap.put("平均时长(ms)", String.valueOf(new BigDecimal((double) allTime / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
+        resultMap.put("警觉度等级", alertness);
+        resultMap.put("解释", desc);
+
+        resultDBJson.put("超过0.5秒的比例", String.valueOf(new BigDecimal((double) time500 / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
+        resultDBJson.put("超过1秒的比例", String.valueOf(new BigDecimal((double) time1000 / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
+        resultDBJson.put("平均时长(ms)", String.valueOf(new BigDecimal((double) allTime / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
+        resultDBJson.put("警觉度等级", alertness);
+        resultDBJson.put("解释", desc);
         resultMapList.add(resultMap);
-        if (Constant.QUEST_TYPE_ALERTNESS.equals(type)) {
+        if (Constant.QUEST_TYPE_ALERTNESS.equals(type)){
             fileName = fileName + "-" + Constant.SHEET_NAME_ALERTNESS + ".xlsx";
             name = Constant.SHEET_NAME_ALERTNESS;
-        } else if (Constant.QUEST_TYPE_ALERTNESS_CHILD.equals(type)) {
+        }else if (Constant.QUEST_TYPE_ALERTNESS_CHILD.equals(type)){
             fileName = fileName + "-" + Constant.SHEET_NAME_ALERTNESS_CHILD + ".xlsx";
             name = Constant.SHEET_NAME_ALERTNESS_CHILD;
-        } else {
+        }else {
             fileName = fileName + "-" + Constant.SHEET_NAME_ALERTNESS_ADDICTION + ".xlsx";
             name = Constant.SHEET_NAME_ALERTNESS_ADDICTION;
         }
+
         String datas = jsonArray.toString();
-        ExcelUtil.createExcelFile(ObjectNewEntity.class, dataList, resultMapList, new ExcelClass().contentExcel(Constant.QUEST_TYPE_ALERTNESS), fileName, name);
+        ExcelUtil.createExcelFile(ObjectEntity.class, dataList, resultMapList, new ExcelClass().contentExcel(Constant.QUEST_TYPE_ALERTNESS), fileName, name);
+
         JSONObject returnJson = new JSONObject(true);
-        returnJson.put("fileName", fileName);
+        returnJson.put("fileName",fileName);
         returnJson.put("name", name);
-        returnJson.put("resultJson", resultDBJson);
-        returnJson.put("datas", datas);
+        returnJson.put("resultJson",resultDBJson);
+        returnJson.put("datas",datas);
+
         return returnJson;
     }
 
+//    public JSONObject scaleCalculate() throws Exception {
+//        List<Map<String, String>> resultMapList = new ArrayList<>();
+//        JSONObject jsonObject = resultJson.getJSONObject("jsonObject");
+//        String fileName = resultJson.getString("fileName");
+//        String name;
+//        String type = resultJson.getString("type");
+//        JSONObject resultDBJson = new JSONObject(true);
+//
+//        resultMapList = new ArrayList<>();
+//        //正确反应总时长
+//        double allTime = 0;
+//        //正确反应总次数
+//        int allCount = 0;
+//        //500ms- 1000ms 次数
+//        int time500 = 0;
+//        //1000ms 次数
+//        int time1000 = 0;
+//        JSONArray jsonArray = jsonObject.getJSONArray("data");
+//        List<ObjectNewEntity> dataList = jsonArray.toJavaList(ObjectNewEntity.class);
+//        for (ObjectNewEntity roa : dataList) {
+//            double temp = Double.parseDouble(roa.getValue());
+//            if (roa.getIsValidResponse() == 1) {
+//                allTime += temp;
+//                allCount++;
+//            }
+//            if (temp > 500 && temp < 1000) {
+//                time500 += 1;
+//            } else if (temp >= 1000) {
+//                time1000 += 1;
+//            }
+//        }
+//        int i = 1;
+//        for (ObjectNewEntity entity : dataList) {
+//            entity.setCardNo(resultJson.getString("cardNo"));
+//            entity.setUserName(resultJson.getString("userName"));
+//            entity.setAge(resultJson.getString("age"));
+//            entity.setOrg(resultJson.getString("org"));
+//            entity.setOrgSub(resultJson.getString("orgSub"));
+//            entity.setFXLevel(resultJson.getString("FXLevel"));
+//            entity.setCurrentJX(resultJson.getString("currentJX"));
+//            entity.setIndex(i + "");
+//            i++;
+//        }
+//
+//        //平均时长(ms)
+//        double averageTime =0;
+//        if (allCount!=0){
+//            averageTime=new BigDecimal((double) allTime / allCount).setScale(2, RoundingMode.HALF_UP).doubleValue();
+//        }
+//
+//        //超过0.5秒的比例
+//        double ratio500 = new BigDecimal((double) time500 / (double) dataList.size()).setScale(4, RoundingMode.HALF_UP).doubleValue();
+//        //超过1秒的比例
+//        double ratio1000 = new BigDecimal((double) time1000 / (double) dataList.size()).setScale(4, RoundingMode.HALF_UP).doubleValue();
+//        //平均正确率
+//        double corrent = dataList.stream().mapToInt(item -> item.getIsValidResponse()).sum();
+//        corrent = new BigDecimal((double) corrent / (double) dataList.size()).setScale(4, RoundingMode.HALF_UP).doubleValue();
+//
+//        String alertness;
+//        String desc;
+//
+//        resultDBJson.put("versionNo", Constant.COGNITION_RESULT_VERSION);
+//        if (averageTime >= 550) {
+//            alertness = "警觉度5级";
+//            desc = "您的注意力稳定性和专注力很差,不能够在较长时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力的敏锐程度很差,不能很好地觉察情景中危险刺激。建议您后续加强注意稳定性训练,提高反应能力和专注力。";
+//        } else if (averageTime >= 500 && averageTime < 550) {
+//            alertness = "警觉度4级";
+//            desc = "您的注意力稳定性和专注力较差,不能够在较长时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力的敏锐程度较差,不能很好地觉察情景中危险刺激。建议您后续加强注意稳定性训练,提高反应能力和专注力。";
+//        } else if (averageTime >= 450 && averageTime < 500) {
+//            alertness = "警觉度3级";
+//            desc = "您具有一般水平的注意力稳定性和专注力,能够在较长时间但不能在很长时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力的敏锐程度一般,能够较好但不能很好地觉察情景中危险刺激。";
+//        } else if (averageTime >= 400 && averageTime < 450) {
+//            alertness = "警觉度2级";
+//            desc = "您的注意力稳定性和专注力较好,能够在较长的时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力较敏锐,觉察情景中危险刺激的能力较高。";
+//        } else {
+//            alertness = "警觉度1级";
+//            desc = "您的注意力稳定性和专注力非常好,能够在非常长的时间内将注意力专注于一件事情上。您的视觉反应能力和洞察力非常敏锐,觉察情景中危险刺激的能力非常高,在物种生存法则中更易生存下来。";
+//        }
+//
+//        String taskStartTime = jsonObject.getString("taskStartTime");
+//        SimpleDateFormat insdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//        SimpleDateFormat outsdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
+//        taskStartTime = outsdf.format(insdf.parse(taskStartTime));
+//        //表格数据
+//        JSONArray tableModule = new JSONArray();
+//        JSONObject table1 = new JSONObject(true);
+//        JSONArray columnName = new JSONArray();
+//        columnName.add("指标名称");
+//        columnName.add("指标值");
+//        JSONArray columnValue = new JSONArray();
+//
+//        columnValue.add("当前任务起始时间;平均正确率;超过0.5秒的比例;超过1秒的比例;平均时长(ms)");
+//        columnValue.add(taskStartTime + ";" + String.format("%.4f", corrent) + ";" + String.format("%.4f", ratio500) + ";" + String.format("%.4f", ratio1000) + ";" + String.format("%.2f", averageTime));
+//        table1.put("tableName", "table1");
+//        table1.put("columnName", columnName);
+//        table1.put("columnValue", columnValue);
+//        tableModule.add(table1);
+//        resultDBJson.put("tableModule", tableModule);
+//
+//        JSONObject ifShow = new JSONObject(true);
+//        ifShow.put("totalScore", false);
+//        ifShow.put("dimensions", false);
+//        ifShow.put("note", false);
+//        ifShow.put("radar", false);
+//        ifShow.put("table", true);
+//        resultDBJson.put("ifShow", ifShow);
+//
+//        Map<String, String> resultMap = new LinkedHashMap<>();
+//        resultMap.put("当前任务起始时间", taskStartTime);
+//        resultMap.put("平均正确率", String.format("%.4f", corrent));
+//        resultMap.put("超过0.5秒的比例", String.format("%.4f", ratio500));
+//        resultMap.put("超过1秒的比例", String.format("%.4f", ratio1000));
+//        //resultMap.put("平均时长(ms)", String.valueOf(new BigDecimal((double) allTime / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
+//        resultMap.put("平均时长(ms)", String.format("%.2f", averageTime));
+//        /*resultMap.put("警觉度等级", alertness);
+//        resultMap.put("解释", desc);*/
+//        resultDBJson.put("当前任务起始时间", taskStartTime);
+//        resultDBJson.put("平均正确率", String.format("%.4f", corrent));
+//        resultDBJson.put("超过0.5秒的比例",String.format("%.4f", ratio500));
+//        resultDBJson.put("超过1秒的比例",String.format("%.4f", ratio1000));
+//        //resultDBJson.put("平均时长(ms)", String.valueOf(new BigDecimal((double) allTime / (double) dataList.size()).setScale(2, RoundingMode.HALF_UP).doubleValue()));
+//        resultDBJson.put("平均时长(ms)", String.format("%.2f", averageTime));
+//        /*resultDBJson.put("警觉度等级", alertness);
+//        resultDBJson.put("解释", desc);*/
+//        resultMapList.add(resultMap);
+//        if (Constant.QUEST_TYPE_ALERTNESS.equals(type)) {
+//            fileName = fileName + "-" + Constant.SHEET_NAME_ALERTNESS + ".xlsx";
+//            name = Constant.SHEET_NAME_ALERTNESS;
+//        } else if (Constant.QUEST_TYPE_ALERTNESS_CHILD.equals(type)) {
+//            fileName = fileName + "-" + Constant.SHEET_NAME_ALERTNESS_CHILD + ".xlsx";
+//            name = Constant.SHEET_NAME_ALERTNESS_CHILD;
+//        } else {
+//            fileName = fileName + "-" + Constant.SHEET_NAME_ALERTNESS_ADDICTION + ".xlsx";
+//            name = Constant.SHEET_NAME_ALERTNESS_ADDICTION;
+//        }
+//        String datas = jsonArray.toString();
+//        ExcelUtil.createExcelFile(ObjectNewEntity.class, dataList, resultMapList, new ExcelClass().contentExcel(Constant.QUEST_TYPE_ALERTNESS), fileName, name);
+//        JSONObject returnJson = new JSONObject(true);
+//        returnJson.put("fileName", fileName);
+//        returnJson.put("name", name);
+//        returnJson.put("resultJson", resultDBJson);
+//        returnJson.put("datas", datas);
+//        return returnJson;
+//    }
+
 
 }

+ 131 - 0
src/main/java/com/rf/psychological/scale/resultBusiness/cognitiveResult/RDTCognizeOld.java

@@ -0,0 +1,131 @@
+package com.rf.psychological.scale.resultBusiness.cognitiveResult;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.rf.psychological.dao.model.RDTEntity;
+import com.rf.psychological.file.excel.ExcelClass;
+import com.rf.psychological.scale.resultBusiness.scaleResult.BaseScale;
+import com.rf.psychological.utils.Constant;
+import com.rf.psychological.utils.ExcelUtil;
+
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zsy
+ * @description:风险决策测试
+ * @date 2021/7/20 15:55
+ */
+public class RDTCognizeOld extends BaseScale {
+
+    public RDTCognizeOld(JSONArray jsonArray, JSONObject resultJson) {
+        super(jsonArray, resultJson);
+    }
+
+    public  JSONObject scaleCalculate() throws Exception {
+        List<Map<String, String>> resultMapList = new ArrayList<>();
+        JSONObject jsonObject = resultJson.getJSONObject("jsonObject");
+        String fileName = resultJson.getString("fileName");
+        String name;
+
+        JSONObject resultDBJson = new JSONObject(true);
+
+        JSONArray jsonArray = jsonObject.getJSONArray("rawData");
+        List<RDTEntity> rdtEntityList = jsonArray.toJavaList(RDTEntity.class);
+        double totalEarned = jsonObject.getDouble("totalEarned");
+        int totalAerated = jsonObject.getInteger("totalAerated");
+        double BART = 0;
+        for (RDTEntity rdtent:rdtEntityList){
+            if (!rdtent.getExplosion()){
+                BART ++;
+            }
+        }
+        DecimalFormat df = new DecimalFormat("######0.00");
+        if (BART != 0){
+            BART = Double.parseDouble(df.format(10 / BART));
+        }else {
+            BART = 10;
+        }
+
+        resultDBJson.put("versionNo",Constant.COGNITION_RESULT_VERSION);
+        JSONArray totalScores = new JSONArray();
+        JSONObject totalScore = new JSONObject(true);
+        String desc = null;
+        totalScore.put("totalScore",BART);
+
+        if (BART>4){
+            desc = "风险偏好决策风格:您在决策时比较冒险激进,会更看重失去的部分,因为不愿意失去而甘愿冒更大风险。比如给你两种选择,一种是给你100%的几率拿走50元,另一种是给你两个盲盒,一个盲盒里有500块,一个盲盒里一分钱没有,对于您这种决策风格的人会更倾向选第二种。";
+        }else if(BART>1 && BART<=4){
+            desc = "中性决策风格:您在决策时不会太保守也不会太冒险,做事追求稳中求进,是非常理想的决策风格。";
+        }else if(BART>0 && BART<=1){
+            desc = "风险规避决策风格:您在决策时比较保守谨慎,不会太冒险,更看重能获得的部分,比如在投资时您会更看重确定性的回报而不是不确定的期望收益。";
+        }
+        totalScore.put("totalScoreDesc",desc);
+        totalScores.add(totalScore);
+        resultDBJson.put("totalScore",totalScores);
+        //维度得分及结论模块
+        JSONArray dimensions = new JSONArray();
+        JSONObject scoreA = new JSONObject(true);
+        scoreA.put("name","得分");
+        scoreA.put("score",String.valueOf(totalEarned));
+        scoreA.put("Describe","无");
+        scoreA.put("maximum","无");
+        scoreA.put("groupName","第一组");
+        dimensions.add(scoreA);
+        JSONObject scoreB = new JSONObject(true);
+        scoreB.put("name","总点击次数");
+        scoreB.put("score",String.valueOf(totalAerated));
+        scoreB.put("Describe","无");
+        scoreB.put("maximum","无");
+        scoreB.put("groupName","第一组");
+        dimensions.add(scoreB);
+        resultDBJson.put("dimensions", dimensions);
+        //表格数据
+        JSONArray tableModule = new JSONArray();
+        JSONObject table1 = new JSONObject(true);
+        JSONArray columnName = new JSONArray();
+        columnName.add("指标名称");
+        columnName.add("指标值");
+        JSONArray columnValue = new JSONArray();
+        columnValue.add("总分;总点击次数");
+        columnValue.add(totalEarned +";"+totalAerated);
+        table1.put("tableName","table1");
+        table1.put("columnName",columnName);
+        table1.put("columnValue",columnValue);
+        tableModule.add(table1);
+        resultDBJson.put("tableModule", tableModule);
+
+        JSONObject ifShow = new JSONObject(true);
+        ifShow.put("totalScore",true);
+        ifShow.put("dimensions",true);
+        ifShow.put("note",false);
+        ifShow.put("radar",false);
+        ifShow.put("table",true);
+        resultDBJson.put("ifShow",ifShow);
+
+        Map<String, String> resultMap = new LinkedHashMap<>();
+        resultMap.put("总分", String.valueOf(totalEarned));
+        resultDBJson.put("总分", String.valueOf(totalEarned));
+        resultMap.put("总点击次数", String.valueOf(totalAerated));
+        resultDBJson.put("总点击次数", String.valueOf(totalAerated));
+        resultMapList = new ArrayList<>();
+        resultMapList.add(resultMap);
+        fileName = fileName + "-" + Constant.SHEET_NAME_RDT + ".xlsx";
+        name = Constant.SHEET_NAME_RDT;
+        String datas = jsonArray.toString();
+        ExcelUtil.createExcelFile(RDTEntity.class, rdtEntityList, resultMapList, new ExcelClass().contentExcel(Constant.QUEST_TYPE_RDT), fileName, Constant.SHEET_NAME_RDT);
+
+        JSONObject returnJson = new JSONObject(true);
+        returnJson.put("fileName",fileName);
+        returnJson.put("name", name);
+        returnJson.put("resultJson",resultDBJson);
+        returnJson.put("datas",datas);
+
+        return returnJson;
+    }
+
+
+}

+ 18 - 12
src/main/java/com/rf/psychological/scale/resultBusiness/scaleResult/C16PFTScale.java

@@ -7,6 +7,7 @@ import com.rf.psychological.dao.model.AnswerEntity;
 import com.rf.psychological.dao.model.DimensionEntity;
 import com.rf.psychological.scale.dao.model.ScaleMarksEntity;
 import com.rf.psychological.scale.scaleresult.ScaleConstant;
+import jodd.util.StringUtil;
 import org.springframework.beans.BeanUtils;
 
 import java.math.BigDecimal;
@@ -277,18 +278,23 @@ public class C16PFTScale extends BaseScale {
             }
             resultJson.put("dimensionScoreMap",dimensionScoreMap);
         }
-        //计算标准分
-        for (int y = 0; y < dimensionEntities.size(); y++) {
-            for (int i = 0; i < scaleMarksEntities.size(); i++) {
-                if (dimensionEntities.get(y).getName().equals(scaleMarksEntities.get(i).getName())) {
-                    String[] splits = scaleMarksEntities.get(i).getReference().split("±");
-                    double a = Double.valueOf(splits[0]);
-                    double b = Double.valueOf(splits[1]);
-                    dimensionScore[y] = Math.floor(((dimensionScore[y] - a)/b)*1.5 + 5.5);
-                    break;
-                }
-            }
-        }
+        //计算标准分  yazhe  20241225 暂时过滤
+//        for (int y = 0; y < dimensionEntities.size(); y++) {
+//            for (int i = 1; i < scaleMarksEntities.size(); i++) {
+//                if (dimensionEntities.get(y).getName().equals(scaleMarksEntities.get(i).getName())) {
+//                    String[] splits = scaleMarksEntities.get(i).getReference().split("±");
+//                    ScaleMarksEntity scaleMarksEntity = scaleMarksEntities.get(i);
+//                    String reference = scaleMarksEntities.get(i).getReference();
+//                    if(StringUtil.isNotEmpty(reference) || "无".equals(reference)){
+//                        String split = splits[0];
+//                        double a = Double.valueOf(splits[0]);
+//                        double b = Double.valueOf(splits[1]);
+//                        dimensionScore[y] = Math.floor(((dimensionScore[y] - a)/b)*1.5 + 5.5);
+//                    }
+//                    break;
+//                }
+//            }
+//        }
 
         //返回值以及存数据库格式
         List<NewResultDto> newResultDtos = new ArrayList<>();

+ 434 - 0
src/main/java/com/rf/psychological/scale/resultBusiness/scaleResult/NEWCOMMONScaleCPH.java

@@ -0,0 +1,434 @@
+package com.rf.psychological.scale.resultBusiness.scaleResult;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.rf.psychological.dao.dto.scale.NewResultDto;
+import com.rf.psychological.dao.model.AnswerEntity;
+import com.rf.psychological.dao.model.DimensionEntity;
+import com.rf.psychological.scale.dao.model.ScaleMarksEntity;
+import com.rf.psychological.scale.scaleresult.ScaleConstant;
+import com.rf.psychological.utils.Constant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.lang.Nullable;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author lpf
+ * @description:新量表(需要图表信息之类的)保存处理接口
+ * @date 2022/4/22 15:55
+ */
+@Slf4j
+public class NEWCOMMONScaleCPH extends BaseScale {
+
+    public NEWCOMMONScaleCPH(JSONArray jsonArray, JSONObject resultJson) {
+        super(jsonArray, resultJson);
+    }
+
+    public JSONObject scaleCalculate() throws Exception {
+
+        //总分
+        double score = 0;
+        DecimalFormat df = new DecimalFormat("######0.00");
+
+        Map<String, String> resultMap0 = new LinkedHashMap<>();
+        List<Map<String, String>> resultMapList = new ArrayList<>();
+        //新版本数据格式
+        Map<String, Object> newResult = new LinkedHashMap<>();
+
+        String gender = (String) resultJson.get("gender");
+        String flag = (String) resultJson.get("flag");
+        //获取答案列表
+        List<AnswerEntity> answerEntities = (List<AnswerEntity>) resultJson.get("answerEntities");
+        AnswerEntity answer=answerEntities.stream().filter(item->StringUtils.isEmpty(item.getScore())).findFirst().orElse(null);
+        log.info("空分数==="+answer);
+        //获取评分规则列表
+        List<ScaleMarksEntity> scaleMarksEntities = (List<ScaleMarksEntity>) resultJson.get("scaleMarksEntities");
+        //抑郁形容词检查表特殊处理
+        if (Constant.QUEST_FLAG_DACL.equals(flag)) {
+            for (int i = 0; i < scaleMarksEntities.size(); i++) {
+                ScaleMarksEntity entity = scaleMarksEntities.get(i);
+                if (i % 4 == 0) {
+                    if ("0".equals(gender)) {
+                        entity.setScoreStart("0");
+                        entity.setScoreEnd("10");
+                    } else {
+                        entity.setScoreStart("0");
+                        entity.setScoreEnd("11");
+                    }
+                }
+                if (i % 4 == 1) {
+                    if ("0".equals(gender)) {
+                        entity.setScoreStart("11");
+                        entity.setScoreEnd("15");
+                    } else {
+                        entity.setScoreStart("12");
+                        entity.setScoreEnd("16");
+                    }
+                }
+                if (i % 4 == 2) {
+                    if ("0".equals(gender)) {
+                        entity.setScoreStart("16");
+                        entity.setScoreEnd("21");
+                    } else {
+                        entity.setScoreStart("17");
+                        entity.setScoreEnd("23");
+                    }
+                }
+                if (i % 4 == 3) {
+                    if ("0".equals(gender)) {
+                        entity.setScoreStart("22");
+                        entity.setScoreEnd("34");
+                    } else {
+                        entity.setScoreStart("24");
+                        entity.setScoreEnd("34");
+                    }
+                }
+            }
+        }
+        //艾森克人格量表常模参考值处理
+        if (Constant.QUEST_FLAG_EPQ.equals(flag) || Constant.QUEST_FLAG_TAS_26.equals(flag)) {
+            for (int i = 0; i < scaleMarksEntities.size(); i++) {
+                ScaleMarksEntity entity = scaleMarksEntities.get(i);
+                if (StringUtils.isEmpty(entity.getReference())) {
+                    continue;
+                }
+                String[] referencs = entity.getReference().split(")");
+                if (referencs.length < 2) {
+                    continue;
+                }
+                String manReferenc = referencs[0].replace("男", "").replace("(", "").trim();
+                String wouManReferenc = referencs[1].replace("女", "").replace("(", "").replace(")", "")
+                        .replace("(", "").trim();
+                if ("0".equals(gender)) {
+                    entity.setReference(manReferenc);
+                } else {
+                    entity.setReference(wouManReferenc);
+                }
+
+            }
+        }
+        //获取维度信息列表
+        List<DimensionEntity> dimensionEntities = (List<DimensionEntity>) resultJson.get("dimensionEntities");
+        //计算每个维度得分dimensionEntities
+        double[] dimensionScore = new double[dimensionEntities.size()];
+        Map<String, Double> dimensionScoreMap = new HashMap<>();
+        //jsonArray:用户自己选择的题目选项
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
+            //计算总分
+            for (AnswerEntity answerEntity : answerEntities) {
+                if (answerEntity.getQuestionNo().equals(jsonObject1.getString("questionNo"))) {
+                    if (answerEntity.getName().replaceAll("\\s", "").equals(jsonObject1.getString("checkItems").replaceAll("\\s", ""))) {
+                        score += Double.parseDouble(answerEntity.getScore());
+                        break;
+                    }
+                }
+            }
+            //计算维度分数
+            for (int y = 0; y < dimensionEntities.size(); y++) {
+                //获取维度信息
+                DimensionEntity dimensionEntity = dimensionEntities.get(y);
+                //获取该维度下有哪些选项
+                String questionNos = dimensionEntity.getQuestionNo();
+                //删除空白字符后得到进行划分得到选择题号
+                String[] questionNo = questionNos.replaceAll("\\s", "").split(";");
+                //计算每道题的得分
+                for (String question : questionNo) {
+                    if (question.equals(jsonObject1.getString("questionNo"))) {
+                        //获取所有答案中本道题目的答案list数组
+                        List<AnswerEntity> nowQuestionAnswerList = answerEntities.stream().filter(answerEntity -> answerEntity.getQuestionNo().equals(question)).collect(Collectors.toList());
+                        //本题目的正确答案与自己的选项进行对比,正确的话相应分数进行相加
+                        for (AnswerEntity answerEntity : nowQuestionAnswerList) {
+                            if (answerEntity.getName().replaceAll("\\s", "").equals(jsonObject1.getString("checkItems").replaceAll("\\s", ""))) {
+                                dimensionScoreMap.put(dimensionEntity.getId(), dimensionScoreMap.get(dimensionEntity.getId()) == null ? Double.parseDouble(answerEntity.getScore()) : (dimensionScoreMap.get(dimensionEntity.getId()) + Double.parseDouble(answerEntity.getScore())));
+                                dimensionScore[y] += Double.parseDouble(answerEntity.getScore());
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+            resultJson.put("dimensionScoreMap", dimensionScoreMap);
+        }
+
+        //判断维度分是否为求平均值
+        boolean totalMark = true;
+        if (dimensionEntities.size() > 0) {
+            for (int y = 0; y < dimensionEntities.size(); y++) {
+                String[] questionNo = dimensionEntities.get(y).getQuestionNo().split(";");
+                for (ScaleMarksEntity scaleMarksEntity : scaleMarksEntities) {
+                    //判断总分是否需要处理
+                    if (totalMark) {
+                        if (scaleMarksEntity.getName().equals("总分") || scaleMarksEntity.getName().equals("无")) {
+                            if (Constant.DEFAULT_VALUE_ONE.equals(StringUtils.isEmpty(scaleMarksEntity.getScoringType()) ? Constant.DEFAULT_VALUE_ZERO : scaleMarksEntity.getScoringType())) {
+                                score = Double.parseDouble(df.format(score / jsonArray.size()));
+                                totalMark = false;
+                            } else if (Constant.QUESTION_TYPE_TWO.equals(StringUtils.isEmpty(scaleMarksEntity.getScoringType()) ? Constant.DEFAULT_VALUE_ZERO : scaleMarksEntity.getScoringType())) {
+                                score = Math.round(score / jsonArray.size());
+                                totalMark = false;
+                            }
+                        }
+                    }
+                    //判断维度分是否需要处理
+                    if (scaleMarksEntity.getName().equals(dimensionEntities.get(y).getName())) {
+                        if (Constant.DEFAULT_VALUE_ONE.equals(StringUtils.isEmpty(scaleMarksEntity.getScoringType()) ? Constant.DEFAULT_VALUE_ZERO : scaleMarksEntity.getScoringType())) {
+                            dimensionScore[y] = Double.parseDouble(df.format(dimensionScore[y] / questionNo.length));
+                            dimensionScoreMap.put(dimensionEntities.get(y).getId(), dimensionScore[y]);
+                            break;
+                        } else if (Constant.QUESTION_TYPE_TWO.equals(StringUtils.isEmpty(scaleMarksEntity.getScoringType()) ? Constant.DEFAULT_VALUE_ZERO : scaleMarksEntity.getScoringType())) {
+                            dimensionScore[y] = Math.round(dimensionScore[y] / questionNo.length);
+                            dimensionScoreMap.put(dimensionEntities.get(y).getId(), dimensionScore[y]);
+                            break;
+                        }
+
+                    }
+                }
+            }
+        }
+
+
+        //将量表总维度根据维度名称进行分组
+        Map<String, List<ScaleMarksEntity>> scaleMarksMap = scaleMarksEntities.stream().collect(Collectors.groupingBy(ScaleMarksEntity::getName));
+        //返回值以及存数据库格式
+        List<NewResultDto> newResultDtos = new ArrayList<>();
+        resultMap0.put("总分", df.format(score));
+        resultJson.put("总分", df.format(score));
+        BigDecimal scoreDecimal = new BigDecimal(df.format(score));
+        //如果没有总分这一栏,需要手动赋值返回
+        List<ScaleMarksEntity> totalScore = scaleMarksMap.get("总分");
+        List<ScaleMarksEntity> totalScores = scaleMarksMap.get("无");
+        if (totalScore == null) {
+            if (totalScores == null) {
+                newResultDtos.add(new NewResultDto("总分", df.format(score), "无", "无",
+                        "无", "无", "无", "无", "是"));
+            } else {
+                for (ScaleMarksEntity tempTotalScore : totalScores) {
+                    BigDecimal scoreStart = new BigDecimal(tempTotalScore.getScoreStart());
+                    BigDecimal scoreEnd = new BigDecimal(tempTotalScore.getScoreEnd());
+                    if (scoreDecimal.compareTo(scoreEnd) <= 0 && scoreDecimal.compareTo(scoreStart) >= 0) {
+                        newResultDtos.add(new NewResultDto("总分", df.format(score), tempTotalScore.getSymptom(), tempTotalScore.getImprovementSuggestions(),
+                                tempTotalScore.getFlag(), tempTotalScore.getReference(), tempTotalScore.getNameExplain(), tempTotalScore.getSuggestion(), tempTotalScore.getIsTotalScoreExplain()));
+                        resultMap0.put("总分症状", tempTotalScore.getSymptom());
+                        resultMap0.put("总分指导语", tempTotalScore.getImprovementSuggestions());
+                        resultMap0.put("总分因子解释", tempTotalScore.getNameExplain());
+                        resultMap0.put("总分建议", tempTotalScore.getSuggestion());
+                        resultJson.put("总分症状", tempTotalScore.getSymptom());
+                        resultJson.put("总分指导语", tempTotalScore.getImprovementSuggestions());
+                        resultJson.put("总分因子解释", tempTotalScore.getNameExplain());
+                        resultJson.put("总分建议", tempTotalScore.getSuggestion());
+                    }
+                }
+            }
+        } else {
+            for (ScaleMarksEntity tempTotalScore : totalScore) {
+                BigDecimal scoreStart = new BigDecimal(tempTotalScore.getScoreStart());
+                BigDecimal scoreEnd = new BigDecimal(tempTotalScore.getScoreEnd());
+                if (scoreDecimal.compareTo(scoreEnd) <= 0 && scoreDecimal.compareTo(scoreStart) >= 0) {
+                    newResultDtos.add(new NewResultDto("总分", df.format(score), tempTotalScore.getSymptom(), tempTotalScore.getImprovementSuggestions(),
+                            tempTotalScore.getFlag(), tempTotalScore.getReference(), tempTotalScore.getNameExplain(), tempTotalScore.getSuggestion(), tempTotalScore.getIsTotalScoreExplain()));
+                    resultMap0.put("总分症状", tempTotalScore.getSymptom());
+                    resultMap0.put("总分指导语", tempTotalScore.getImprovementSuggestions());
+                    resultMap0.put("总分因子解释", tempTotalScore.getNameExplain());
+                    resultMap0.put("总分建议", tempTotalScore.getSuggestion());
+                    resultJson.put("总分症状", tempTotalScore.getSymptom());
+                    resultJson.put("总分指导语", tempTotalScore.getImprovementSuggestions());
+                    resultJson.put("总分因子解释", tempTotalScore.getNameExplain());
+                    resultJson.put("总分建议", tempTotalScore.getSuggestion());
+                }
+            }
+        }
+
+
+        JSONObject iconInfo = new JSONObject();
+        //雷达图需要的维度以及最大值
+        List<Map<String, Object>> indicator = new LinkedList<>();
+        //雷达图所需要的常模参考值
+        LinkedList<String> reference = new LinkedList<>();
+        //雷达图需要的分数
+        LinkedList<String> scoreList = new LinkedList<>();
+        //计算维度所在评分区间
+        commonComputeDimensionScore(df, resultMap0, resultJson, dimensionEntities, dimensionScore, scaleMarksMap, newResultDtos, indicator, reference, scoreList);
+        //需要图表展示的
+        iconInfo.put("indicator", indicator);
+        //判断是否有常模参考值,即reference的内容如果全为0,则不进行返回
+        if (!reference.stream().allMatch("0"::equals)) {
+            iconInfo.put("reference", reference);
+        }
+        iconInfo.put("scoreList", scoreList);
+        if (indicator.size() == 0 && reference.size() == 0) {
+            newResult.put("iconInfo", "");
+        } else {
+            newResult.put("iconInfo", iconInfo);
+        }
+        newResult.put("result", newResultDtos);
+        resultMapList.add(resultMap0);
+
+
+        JSONObject returnJson = new JSONObject(true);
+        returnJson.put("resultMapList", resultMapList);
+        returnJson.put("resultJson", resultJson);
+        returnJson.put(ScaleConstant.ResultEnum.RESULT_NEW_FIELD.getKeyword(), newResult);
+
+        return returnJson;
+    }
+
+    /**
+     * 通用计算量表所有维度分数,以及其维度所在分数段症状等
+     *
+     * @param df                用来设置小数位数,例如保留两位小数DecimalFormat df = new DecimalFormat("######0.00");
+     * @param resultMap         用来向数据库存
+     * @param resultJson        WebScaleResultController传递过来的评分规则等相关参数
+     * @param dimensionEntities 量表维度list信息
+     * @param dimensionScore    量表维度分数,需要和量表维度list对应
+     * @param scaleMarksMap     评分规则的map
+     * @param newResultDtos     各个维度的结论,等级解释等list
+     * @param indicator         雷达图需要的维度以及最大值
+     * @param reference         雷达图所需要的常模参考值
+     * @param scoreList         雷达图需要的分数
+     */
+    public static void commonComputeDimensionScore(@Nullable DecimalFormat df, Map<String, String> resultMap, JSONObject resultJson, List<DimensionEntity> dimensionEntities, double[] dimensionScore, Map<String, List<ScaleMarksEntity>> scaleMarksMap, List<NewResultDto> newResultDtos, List<Map<String, Object>> indicator, List<String> reference, List<String> scoreList) {
+        if (df == null) {
+            df = new DecimalFormat("######0.00");
+        }
+        for (int y = 0; y < dimensionEntities.size(); y++) {
+            Map<String, Object> indicatorMap = new HashMap<>();
+            DimensionEntity dimensionEntity = dimensionEntities.get(y);
+            NewResultDto newResultDto1 = new NewResultDto();
+            //存放该维度总分
+            resultMap.put(dimensionEntity.getName() + "得分", df.format(dimensionScore[y]));
+            resultJson.put(dimensionEntity.getName() + "得分", df.format(dimensionScore[y]));
+            newResultDto1.setScore(df.format(dimensionScore[y]));
+            newResultDtos.add(newResultDto1);
+            BigDecimal dimensionScoreDecimal = new BigDecimal(df.format(dimensionScore[y]));
+            //获取当前维度的评分规则
+            List<ScaleMarksEntity> scaleMarksEntities1 = scaleMarksMap.get(dimensionEntity.getName());
+            if (scaleMarksEntities1 != null) {
+                //循环遍历判断得分在哪个区间
+                for (ScaleMarksEntity scaleMarksEntity : scaleMarksEntities1) {
+                    BigDecimal decimalScoreEnd = new BigDecimal(scaleMarksEntity.getScoreEnd());
+                    BigDecimal decimalScoreStart = new BigDecimal(scaleMarksEntity.getScoreStart());
+                    if (dimensionScoreDecimal.compareTo(decimalScoreEnd) <= 0 && dimensionScoreDecimal.compareTo(decimalScoreStart) >= 0) {
+                        putDimResult(resultMap, resultJson, dimensionEntity.getName(), newResultDto1, scaleMarksEntity);
+                        //需要进行图表展示的维度放入map
+                        if ("1".equals(dimensionEntity.getIsIconFlag())) {
+                            indicatorMap.put("text", dimensionEntity.getName());
+                            //将当前维度按照分数的结尾值来进行排序scaleMarksEntities1
+                            List<ScaleMarksEntity> collect = scaleMarksEntities1.stream().sorted(Comparator.comparing(ScaleMarksEntity::getScoreEnd, Comparator.comparingDouble(Double::parseDouble))
+                                    .reversed()).collect(Collectors.toList());
+                            //排序完成后第一个的scoreEnd最大,也就是该维度最大的
+                            indicatorMap.put("max", collect.get(0).getScoreEnd());
+                            indicator.add(indicatorMap);
+                            if ("无".equals(scaleMarksEntity.getReference()) || "无".equals(scaleMarksEntity.getStandardDeviation())) {
+                                //常模参考值设为0
+                                reference.add("0");
+                            } else {
+                                reference.add(scaleMarksEntity.getReference());
+                            }
+                            scoreList.add(String.valueOf(dimensionScore[y]));
+                        }
+                    }
+                }
+            } else {
+                //如果分数规则表中无维度,而维度表中有相应维度,则只显示维度分数
+                newResultDto1.setFlag("无");
+                newResultDto1.setImprovementSuggestions("无");
+                newResultDto1.setName(dimensionEntity.getName());
+                newResultDto1.setReference("无");
+                newResultDto1.setNameExplain("无");
+                newResultDto1.setSuggestion("无");
+                newResultDto1.setIsTotalScoreExplain("否");
+                newResultDto1.setSymptom("无");
+            }
+        }
+    }
+
+    /**
+     * 通用计算单个维度分数,以及其维度所在分数段症状等
+     *
+     * @param df              默认为两位小数,可以为null,用来设置小数位数,例如保留两位小数DecimalFormat df = new DecimalFormat("######0.00");
+     * @param resultMap       用来向数据库存
+     * @param resultJson      WebScaleResultController传递过来的评分规则等相关参数
+     * @param dimensionName   维度名称
+     * @param dimensionScore  维度分数
+     * @param isDimensionShow 是否在雷达图中展示
+     * @param scaleMarksMap   评分规则的map
+     * @param newResultDtos   各个维度的结论,等级解释等list
+     * @param indicator       雷达图需要的维度以及最大值
+     * @param reference       雷达图所需要的常模参考值
+     * @param scoreList       雷达图需要的分数
+     */
+    public static void commonComputeDimensionScore(@Nullable DecimalFormat df, Map<String, String> resultMap, JSONObject resultJson, String dimensionName, double dimensionScore, Boolean isDimensionShow, Map<String, List<ScaleMarksEntity>> scaleMarksMap, List<NewResultDto> newResultDtos, List<Map<String, Object>> indicator, List<String> reference, List<String> scoreList) {
+        if (df == null) {
+            df = new DecimalFormat("######0.00");
+        }
+        Map<String, Object> indicatorMap = new HashMap<>();
+        NewResultDto newResultDto = new NewResultDto();
+        //存放该维度总分
+        resultMap.put(dimensionName + "得分", df.format(dimensionScore));
+        resultJson.put(dimensionName + "得分", df.format(dimensionScore));
+        newResultDto.setScore(df.format(dimensionScore));
+        newResultDtos.add(newResultDto);
+        BigDecimal dimensionScoreDecimal = new BigDecimal(df.format(dimensionScore));
+        //获取当前维度的评分规则
+        List<ScaleMarksEntity> scaleMarksEntities1 = scaleMarksMap.get(dimensionName);
+        if (scaleMarksEntities1 != null) {
+            //循环遍历判断得分在哪个区间
+            for (ScaleMarksEntity scaleMarksEntity : scaleMarksEntities1) {
+                BigDecimal decimalScoreEnd = new BigDecimal(scaleMarksEntity.getScoreEnd());
+                BigDecimal decimalScoreStart = new BigDecimal(scaleMarksEntity.getScoreStart());
+                if (dimensionScoreDecimal.compareTo(decimalScoreEnd) <= 0 && dimensionScoreDecimal.compareTo(decimalScoreStart) >= 0) {
+                    putDimResult(resultMap, resultJson, dimensionName, newResultDto, scaleMarksEntity);
+                    //需要进行图表展示的维度放入map
+                    if (isDimensionShow) {
+                        indicatorMap.put("text", dimensionName);
+                        //将当前维度按照分数的结尾值来进行排序scaleMarksEntities1
+                        List<ScaleMarksEntity> collect = scaleMarksEntities1.stream().sorted(Comparator.comparing(ScaleMarksEntity::getScoreEnd, Comparator.comparingInt(Integer::parseInt))
+                                .reversed()).collect(Collectors.toList());
+                        //排序完成后第一个的scoreEnd最大,也就是该维度最大的
+                        indicatorMap.put("max", collect.get(0).getScoreEnd());
+                        indicator.add(indicatorMap);
+                        if ("无".equals(scaleMarksEntity.getReference()) || "无".equals(scaleMarksEntity.getStandardDeviation())) {
+                            //常模参考值设为0
+                            reference.add("0");
+                        } else {
+                            reference.add(scaleMarksEntity.getReference());
+                        }
+                        scoreList.add(String.valueOf(dimensionScore));
+                    }
+                }
+            }
+        } else {
+            //如果分数规则表中无维度,而维度表中有相应维度,则只显示维度分数
+            newResultDto.setFlag("无");
+            newResultDto.setImprovementSuggestions("无");
+            newResultDto.setName(dimensionName);
+            newResultDto.setReference("无");
+            newResultDto.setNameExplain("无");
+            newResultDto.setSuggestion("无");
+            newResultDto.setIsTotalScoreExplain("否");
+            newResultDto.setSymptom("无");
+        }
+    }
+
+
+    private static void putDimResult(Map<String, String> resultMap0, JSONObject resultJson, String dimensionName, NewResultDto newResultDto1, ScaleMarksEntity scaleMarksEntity) {
+        //resultMap0.put(dimensionName + "常模参考值", scaleMarksEntity.getReference());
+        resultMap0.put(dimensionName + "症状", scaleMarksEntity.getSymptom());
+        resultJson.put(dimensionName + "结论", scaleMarksEntity.getSymptom());
+        resultMap0.put(dimensionName + "因子解释", scaleMarksEntity.getNameExplain());
+        resultJson.put(dimensionName + "因子解释", scaleMarksEntity.getNameExplain());
+        resultMap0.put(dimensionName + "指导语", scaleMarksEntity.getImprovementSuggestions());
+        resultJson.put(dimensionName + "指导语", scaleMarksEntity.getImprovementSuggestions());
+        resultMap0.put(dimensionName + "建议", scaleMarksEntity.getSuggestion());
+        resultJson.put(dimensionName + "建议", scaleMarksEntity.getSuggestion());
+        BeanUtils.copyProperties(scaleMarksEntity, newResultDto1);
+    }
+
+
+}

+ 473 - 0
src/main/java/com/rf/psychological/scale/resultBusiness/scaleResult/NEWPSQIScale.java

@@ -0,0 +1,473 @@
+package com.rf.psychological.scale.resultBusiness.scaleResult;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.rf.psychological.dao.dto.scale.NewResultDto;
+import com.rf.psychological.scale.resultBusiness.scaleResult.BaseScale;
+import com.rf.psychological.scale.scaleresult.ScaleConstant;
+import com.rf.psychological.utils.RandomSuggestionUtil;
+
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Author: 李东锋
+ * @Date: 2024/9/28 15:47
+ * @Description: *
+ */
+public class NEWPSQIScale extends BaseScale {
+    //睡眠等级
+    private static final String excellentSleep = "睡眠质量很好";
+    private static final String goodSleep = "睡眠质量较好";
+    private static final String fairSleep = "睡眠质量一般";
+    private static final String poorSleep = "睡眠质量很差";
+    //睡眠等级评论
+    private static final String excellentComment = "1. 你的睡眠质量处于一个非常理想的水平。这意味着你每晚都能享受到充足、连续且深度的睡眠,这不仅对身体健康至关重要,也是精神状态良好和日间活力充沛的坚实基础。 你的睡眠模式表明,你已经掌握了一套有效的睡眠习惯,能够有效地帮助你放松身心,快速进入梦乡,并在清晨醒来时感到精神焕发。继续保持这些良好的睡眠习惯,如定时作息、创造舒适的睡眠环境、避免晚上摄入咖啡因和电子产品蓝光等,将有助于你长期维持高质量的睡眠。同时,定期评估自己的睡眠模式,留意任何可能影响睡眠质量的因素,及时调整,将确保你的睡眠健康持续处于最佳状态。继续保持,你的睡眠质量将继续成为你健康生活的强大后盾。\n" +
+            "此外,尝试在睡前进行一些放松活动,如阅读一本好书、听轻柔的音乐或进行冥想,也可以进一步提高你的睡眠质量。保持适度的身体锻炼,注意饮食习惯,晚餐避免过量,保持卧室的黑暗和安静,能进一步优化自己的睡眠习惯,使之更加适合自身的生理和心理需求,确保每天都能以最佳状态迎接新的挑战和机遇。#;\n" +
+            "2. 你的睡眠质量正处于令人羡慕的理想状态,每晚的睡眠不仅充足而且连续,深度睡眠阶段的充分保障让你的身体得以彻底恢复,精神状态也因此而保持在最佳水平。这种高质量的睡眠是你日间活力充沛、工作效率高以及心情愉悦的坚实基础,对维护长期健康、促进身体修复和精神平衡具有不可估量的价值。\n" +
+            "在保持现有良好习惯的同时,持续探索和实践有助于提高睡眠质量的新方法。例如,尝试不同的放松技巧,找到最适合自己的方式;定期锻炼,但避免在睡前进行剧烈运动;保持健康的饮食习惯,避免晚餐过饱或食用辛辣刺激食物。这些小的调整和优化,将在长期中积累成巨大的效益,使你的睡眠质量不断提高,成为健康生活的强大后盾。\n" +
+            "保持良好的睡眠习惯,定期评估和调整睡眠模式,同时不断探索优化睡眠质量的方法,是长期保持优质睡眠的关键。优质的睡眠不仅能够提升日间的表现和生活质量,还将为你的身心健康奠定坚实的基础,助力你在生活的各个方面展现出最佳状态。#;\n" +
+            "3. 您的睡眠质量正位于令人艳羡的理想状态,每晚的睡眠不仅时间充裕,而且连贯无中断,高质量的深度睡眠阶段确保了身体与心灵的全面修复与更新。这种高水平的睡眠,不仅为您的日间活动提供了充沛的能量,提高了工作效率,还保持了心情的愉悦与平和,对长期健康、身体机能的恢复以及精神状态的平衡起到了至关重要的作用。\n" +
+            "在保持现有良好习惯的基础上,勇于探索并实践新的睡眠优化策略,将为您的睡眠质量带来进一步的提升。尝试不同的放松技巧,如冥想、深呼吸或温水浴,找到最适合您的放松方式,有助于更快地进入睡眠状态。定期进行适量的体育活动,增强体质,但需注意避免临近睡眠时间的高强度运动,以免影响睡眠质量。维持均衡的饮食,特别是晚餐应避免过量或食用辛辣刺激性食物,以免造成消化不良,影响睡眠。\n" +
+            "同时,定期对自己的睡眠模式进行评估,留意任何可能影响睡眠质量的变化因素,如生活压力、环境噪音或光照等,并及时作出相应的调整,是长期保持优质睡眠质量的关键。#;\n" +
+            "4. 您的睡眠质量处于一个非常理想的水平。这意味着您每晚都能享受到充足、连续且深度的睡眠,这不仅对身体健康至关重要,也是精神状态良好和日间活力充沛的坚实基础。您的睡眠模式表明,您已经掌握了一套有效的睡眠习惯,能够有效地帮助您放松身心,快速进入梦乡,并在清晨醒来时感到精神焕发。\n" +
+            "优质睡眠是每个人追求的目标之一,它不仅仅是在夜间眼睛闭合、身体放松的简单状态。在优质睡眠中,一个人能够迅速进入深度睡眠阶段,整夜保持较低的醒来次数,即使偶尔醒来也能迅速入睡。这种睡眠状态下,个体的睡眠时间符合理想范围,一般为7至9小时,这有助于身体各系统的修复和恢复功能。睡眠期间,大脑通过整理和储存白天的信息,促进记忆和学习能力的提升。而身体的免疫系统也在这段时间内变得更加有效。\n" +
+            "为了继续保持和进一步提升您的睡眠质量,建议您继续坚持良好的作息规律,并定期评估自己的睡眠模式,不断优化您的睡眠环境和生活方式,这不仅能提升您的日间表现和生活质量,还将为您的身心健康奠定坚实的基础,助力您在生活的各个方面展现出最佳状态。#;\n" +
+            "5. 您的睡眠质量很好,这意味着您每晚都能享受到充足的深度睡眠,入睡迅速,夜间醒来次数极少,且能够保持睡眠的连续性。早晨醒来时,您感到精神饱满,精力充沛,这表明您的睡眠质量对日间精力、情绪稳定性和整体生活质量产生了积极而深远的影响。\n" +
+            "您拥有优异睡眠质量的背后,是良好的睡眠习惯和适宜的睡眠环境。规律的作息时间帮助您的生物钟保持稳定,确保了睡眠的规律性和深度。安静、黑暗、适宜温度的睡眠环境减少了夜间干扰,促进了深度睡眠。健康的生活习惯,如合理饮食、适量运动以及睡前远离电子设备,避免了对睡眠的负面影响。此外,有效的情绪管理和较低的心理压力水平也有助于您快速进入深度睡眠状态,享受高质量的休息。\n" +
+            "为了保持并进一步优化您优异的睡眠质量,建议您定期自我监测睡眠模式,留意任何可能影响睡眠质量的变化,如工作压力、生活习惯的改变或健康状况的波动,及时作出相应的调整,从而维持并进一步提升优异的睡眠质量,享受更高质量的休息,从而在日间保持充沛的精力和良好的情绪状态,促进整体健康和生活质量。";
+    private static final String goodComment = "1. 您的睡眠质量总体较好,意味着您每晚都能享受到充足、连续且深度的睡眠,这对身体健康和精神状态都有显著的积极影响。然而,尽管总体睡眠状况良好,仍存在一些细微的问题,需要引起注意。这些小问题若不加以重视,可能会逐渐对您的睡眠质量产生负面影响。\n" +
+            "影响睡眠的可能性因素有多个方面。首先,不规律的作息时间会干扰您的生物钟,从而影响入睡和醒来的时间。其次,睡眠环境的适宜性也至关重要,如温度、噪音和光线等因素都会对睡眠质量产生影响。此外,饮食习惯在睡眠中扮演了重要角色,晚餐过饱或摄入含咖啡因的食物饮料可能会影响入睡的难易程度和睡眠的深度。心理压力和焦虑情绪也会导致入睡困难,影响整体睡眠质量。最后,睡前使用电子设备,尤其是发出蓝光的屏幕,会抑制褪黑素的分泌,进一步干扰睡眠。\n" +
+            "为了进一步提升和维持高质量的睡眠,建议您保持规律的作息时间,确保每晚在固定时间上床和起床。同时,优化睡眠环境,保持卧室的安静、黑暗和凉爽,可以使用遮光窗帘、耳塞和白噪音机来改善睡眠条件。在饮食方面,避免晚餐过饱和摄入辛辣或含咖啡因的食物。减轻心理压力,通过冥想、深呼吸或进行轻松的活动来帮助身心放松。减少睡前使用电子设备的时间,建议在睡前至少一小时停止使用手机、电脑等设备,转而进行阅读或听音乐等放松活动。通过这些小的调整和优化,您的睡眠质量将进一步提升,成为您健康生活的强大后盾。#;\n" +
+            "2. 您的睡眠质量总体较好,这意味着您的睡眠状况在一定程度上满足了身体的基本需求,但仍有提升空间,以达到更高质量的睡眠标准。您的睡眠模式表现出一定的规律性和连续性,但可能在深度睡眠、睡眠效率或睡眠环境方面存在一些不足。深度睡眠对于身体修复、记忆巩固和情绪调节至关重要,因此,增加深度睡眠的时间将对您的整体健康产生积极影响。此外,您的睡眠可能偶尔被中断,这可能会影响到睡眠的连续性,进而影响第二天的精神状态和工作效率。\n" +
+            "为了提高您的睡眠质量,您可以审视您的生活习惯,尤其是晚上摄入咖啡因、酒精或使用电子设备的习惯。这些因素可能干扰您的睡眠周期。建议在睡前几小时内避免摄入刺激性饮品,减少蓝光暴露,以便于更快入睡。学习并实践放松技巧,如深呼吸、冥想或瑜伽,可以帮助您在睡前放松身心,促进更好的睡眠。\n" +
+            "优质的睡眠对于维持健康、提高日间表现和提升生活质量至关重要。通过持续的改进,优化您的睡眠习惯,您将能够享受到更高质量的睡眠,从而在生活的各个方面展现出最佳状态。#;\n" +
+            "3. 您的睡眠质量较好,这表明您的睡眠状况在基本层面上满足了身体的需求,但距离理想的睡眠状态仍有提升的潜力。您的睡眠模式展示出一定的规律性,表明您已经形成了相对固定的睡眠习惯,这是保持睡眠质量稳定的重要基础。然而,测试结果也提示您在深度睡眠、睡眠效率和睡眠环境等方面存在改进空间,尤其是深度睡眠的不足可能影响到身体的修复能力和日间的精神状态。\n" +
+            "为了进一步提高您的睡眠质量,您可以审视并调整晚上摄入咖啡因、酒精的量,以及使用电子设备的习惯。这些因素可能干扰您的睡眠周期,导致入睡困难或睡眠质量下降。建议在睡前几小时内避免摄入刺激性饮品,减少蓝光暴露,帮助身体更快进入休息状态。同时,检查并优化您的睡眠环境,确保卧室安静、黑暗、温度适宜。\n" +
+            "优质的睡眠是健康生活的基石,对提高日间表现和生活质量有着不可估量的影响。通过持续的关注和改进,优化您的睡眠习惯和环境,您将能够享受到更高质量的睡眠,从而在工作、学习和个人生活中展现出最佳状态。#;\n" +
+            "4. 您的睡眠质量还行,这意味着您当前的睡眠模式在一定程度上满足了身体的基本需求,但仍有较大的提升空间,以达到更优质、更高效的睡眠状态。您的睡眠模式显示出一定的规律性,表明您已经形成了一些有益的睡眠习惯,但可能在深度睡眠的充分性、睡眠的连续性和睡眠环境的优化方面存在不足。此外,您的睡眠可能偶尔会被中断,这不仅降低了睡眠的连续性,还可能影响到睡眠效率和第二天的精神状态。保持睡眠的连续性,确保充足的睡眠时间,对于维持良好的日间表现和提高生活质量至关重要。\n" +
+            "为了提升您的睡眠质量,你可以减少晚上使用电子设备的时间,特别是睡前,以减少蓝光对睡眠周期的负面影响。同时在晚上避免摄入咖啡因、酒精等可能干扰睡眠的物质,特别是在睡前几小时内,并尝试深呼吸、冥想、瑜伽等放松方法,帮助身心放松,改善入睡质量和深度睡眠。\n" +
+            "优质的睡眠对于维持健康、提高日间表现和提升生活质量至关重要。通过持续关注和调整生活习惯与睡眠环境,您将能够显著提升睡眠质量,享受更高效、更恢复性的睡眠。记住,改善睡眠是一个渐进的过程,需要时间和耐心,但其带来的长期健康益处是值得的。#;\n" +
+            "5. 你的睡眠质量还行,这意味着您当前的睡眠模式虽然满足了基本的生理需求,但是在深度睡眠阶段的时间可能偏少,这直接影响了身体和精神状态的恢复。深度睡眠是睡眠周期中的黄金时段,对身体修复、记忆力巩固和情绪稳定至关重要。增加深度睡眠的时间,将显著提升您的睡眠质量,对长期健康产生积极影响。此外您的睡眠可能偶尔受到中断,这不仅降低了睡眠的连续性,还可能影响睡眠效率,导致日间疲劳和注意力分散。\n" +
+            "为了提高您的睡眠质量,您可以在生活习惯和睡眠环境方面进行一些调整,如避免晚间刺激性物质,减少使用电子设备的时间,确保睡眠环境安静、黑暗、温度适宜,必要时使用耳塞或眼罩,以创造一个有利于睡眠的环境。\n" +
+            "优质的睡眠是健康生活的基石,对提高日间表现和生活质量有着深远影响。通过持续关注和调整生活习惯与睡眠环境,您将能够显著提升睡眠质量,享受更高效、更恢复性的睡眠。改善睡眠是一个渐进的过程,需要持之以恒的努力,但其带来的健康益处将使这一切付出都值得。";
+    private static final String fairComment = "1. 您的睡眠状况被评定为“一般”,这意味着您当前的睡眠模式虽能满足基本的生理需求,但存在明显的改善空间。您的睡眠可能表现为规律性不佳、深度睡眠不足、睡眠效率较低及易受外界因素干扰的特点。这些因素共同作用,可能影响您的日间精力、情绪状态和整体健康。\n" +
+            "您的睡眠质量可能受到睡眠环境和生活习惯的显著影响。嘈杂的环境、不适宜的室温、床上用品的不适或晚上摄入咖啡因、酒精等刺激性物质,均可能干扰您的睡眠。此外,晚上过度使用电子设备,尤其是在睡前,会因蓝光暴露而抑制褪黑激素的分泌,进一步影响睡眠质量。\n" +
+            "为了显著提升您的睡眠质量,建议您优化睡眠环境,确保卧室安静、黑暗、温度适宜,必要时使用耳塞或眼罩以屏蔽干扰;调整生活习惯,避免晚上摄入咖啡因、酒精等刺激性物质,减少睡前电子设备使用,尤其是蓝光暴露;实践深呼吸、冥想或瑜伽等放松技巧,帮助身心放松,改善入睡质量;并保持规律的作息时间,建立稳定的生物钟,这些综合措施将有助于您享受更高质量的睡眠,助力您在生活的各个方面展现出最佳状态。#;\n" +
+            "2. 结果显示,您的睡眠质量一般,深度睡眠不足与睡眠中断频繁可能是主要问题,这两者直接影响了身体的修复能力和日间的清醒度。深度睡眠缺乏减少了身体修复机会,而频繁的睡眠中断降低了睡眠效率,两者共同作用,可能对日间精力、情绪稳定及长期健康产生不利影响。因此,优化睡眠环境,调整生活习惯,增加深度睡眠,以及减少睡眠中断,是提升整体睡眠质量的重点。\n" +
+            "为了提升睡眠质量,建议优化睡眠环境,确保安静、黑暗、温度适宜;调整生活习惯,避免晚上摄入刺激性物质,减少蓝光暴露;实践放松技巧,如深呼吸、冥想,帮助身心放松;保持规律作息,建立稳定的生物钟。这些措施将有助于改善睡眠质量,提升日间精力和生活质量。\n" +
+            "保持规律的睡眠模式和健康的睡眠习惯是确保获得充足睡眠的关键,避免在睡前过度使用电子设备和刺激性饮食。合理的日常运动和放松技巧,如深呼吸和冥想,有助于减少入睡障碍和提升睡眠质量。通过关注和优化我们的睡眠,我们不仅可以提高白天的注意力和精力,还能够增强抵抗力和情绪调节能力,从而更好地迎接日常生活的挑战。#;\n" +
+            "3. 您的睡眠质量一般,这意味着虽然您每晚都能入睡,但睡眠的连续性和深度可能存在一定问题。您可能会在夜间醒来多次,或感觉睡眠不够深,早晨醒来时精神状态不佳。尽管没有严重的睡眠障碍,但这种睡眠质量可能会影响您的日常精力和情绪。\n" +
+            "影响睡眠质量的因素有很多。不规律的作息时间可能导致生物钟紊乱,从而影响入睡和醒来的时间。其次,睡眠环境的适宜性至关重要,如温度、噪音和光线等因素都会对睡眠产生影响。此外,晚餐过饱、食用辛辣或含咖啡因的食物会导致入睡困难或影响睡眠深度。心理压力和焦虑情绪也会导致入睡困难或夜间频繁醒来。不可忽略的是,睡前使用电子设备,尤其是发出蓝光的屏幕,会抑制褪黑素的分泌,对睡眠有很大的影响。\n" +
+            "为了提升睡眠质量,建议保持规律的作息时间,每天在固定时间上床和起床;优化睡眠环境,确保卧室安静、黑暗且凉爽;避免晚餐过饱,并减少含咖啡因和辛辣食物的摄入;通过冥想、深呼吸等方式减轻心理压力和焦虑;在睡前至少一小时避免使用电子设备,转而进行阅读或听音乐等放松活动;以及进行适度锻炼,但避免在睡前进行剧烈运动。通过这些调整和优化,您可以逐步改善睡眠质量,确保更高质量的休息,进而提升日常生活的精力和情绪状态。#;\n" +
+            "4. 您的睡眠质量一般,这意味着虽然您能够每晚入睡,但睡眠的连续性和深度存在不足,夜间可能多次醒来或感觉睡眠不深,早晨醒来时精神状态欠佳。这种“一般”水平的睡眠质量,虽未构成严重障碍,却可能影响日常精力和情绪稳定。\n" +
+            "不规律的作息时间扰乱生物钟,睡眠环境的噪音、光线和温度影响,以及晚餐过饱、摄入刺激性食物和心理压力等都会影响睡眠质量。为了提升睡眠质量,建议您保持规律的作息,每天固定时间上床和起床;优化睡眠环境,确保卧室安静、黑暗且适宜的温度;避免晚餐过饱,减少摄入含咖啡因和辛辣食物;采用冥想、深呼吸等方法缓解心理压力;睡前至少一小时避免使用电子设备,转而进行阅读或听音乐等放松活动;适量运动,但避免睡前剧烈运动。 通过这些调整,逐步改善睡眠质量。改善睡眠质量的意义通过上述建议的实施,您将逐步改善睡眠质量,确保更高质量的休息。这不仅能提升日常生活的精力和情绪状态,还能长远地促进身心健康,提高生活质量。优化睡眠是维护健康的重要一环,值得持续关注和努力。#;\n" +
+            "5. 您的睡眠质量一般,这意味着您虽然每晚能够入睡,但睡眠的连续性和深度不够理想,夜间醒来次数较多或睡眠感觉较浅,早晨醒来时可能感到疲倦,而非神清气爽。这种睡眠质量可能影响您的日常精力和情绪状态,降低生活质量。\n" +
+            "影响您睡眠质量的主要因素可能包括:不规律的作息时间导致生物钟混乱,影响睡眠的规律性和深度;睡眠环境不佳,如噪音、光线和温度不适,干扰睡眠连续性;晚餐过饱或摄入辛辣、含咖啡因食物,影响睡眠质量;心理压力和焦虑情绪导致入睡困难和夜间频繁醒来;睡前使用电子设备,特别是蓝光屏幕,抑制褪黑素分泌,影响睡眠。\n" +
+            "为了改善睡眠质量,建议您建立规律的作息习惯,每天固定时间上床和起床;优化睡眠环境,保持卧室安静、黑暗和适宜的温度;晚餐避免过饱,减少摄入刺激性食物;采取冥想、深呼吸等放松技巧减轻心理压力;睡前减少电子设备使用,进行阅读或听音乐等放松活动;适量运动,但避免睡前剧烈运动。通过这些调整,您将逐步提升睡眠质量,确保更高质量的休息,进而改善日常精力和情绪状态,促进整体健康和生活质量。";
+    private static final String poorComment = "1. 您的睡眠质量处于较差的水平,表明您在入睡、维持睡眠和恢复精神状态方面存在显著问题。您可能经常难以入睡,夜间频繁醒来,或者早晨醒来时感到疲倦不堪。这种状况不仅影响您的日常精力和情绪,还可能对您的整体健康产生负面影响。\n" +
+            "影响睡眠质量的因素有很多。不规律的作息时间会扰乱生物钟,使得入睡和起床的时间不固定,导致睡眠质量下降;不良的睡眠环境,如噪音、光线、过高或过低的温度,都会干扰睡眠,导致夜间醒来或睡眠浅而不稳;晚餐过饱或摄入含咖啡因、酒精的饮料会影响入睡和睡眠的深度;高压力和焦虑情绪也会导致入睡困难或在夜间频繁醒来等。此外一些健康问题,如睡眠呼吸暂停、慢性疼痛或胃酸反流,也会对睡眠质量产生负面影响。\n" +
+            "为了改善您的睡眠质量,建议保持规律的作息时间,每天在固定时间上床和起床,即使在周末也要保持一致,以帮助稳定生物钟。优化睡眠环境,确保卧室安静、黑暗且凉爽,可以使用遮光窗帘、耳塞和白噪音机来改善睡眠条件。同时避免晚餐过饱,并通过冥想、深呼吸或轻松的活动来减轻压力和焦虑情绪,在睡前至少一小时避免使用手机、电脑等电子设备。如果有呼吸暂停、慢性疼痛或其他健康问题,应及时就医,采取相应的治疗措施。通过这些调整和优化,可在一定程度上改善睡眠质量,从而提升日常生活的精力和情绪状态。#;\n" +
+            "2. 您的睡眠质量很差,这表示您面临着入睡困难、夜间频繁醒来、浅睡眠和早醒等多重睡眠障碍,几乎每晚都无法获得充足且连续的深度睡眠。早晨醒来时,您可能感到疲惫不堪,精神状态不佳,这种长期的睡眠缺乏严重影响了您的日间精力、情绪稳定性以及整体生活质量。\n" +
+            "导致您睡眠质量严重不足的原因可能是多方面的,包括不规律的作息时间扰乱了生物钟,睡眠环境的噪音、光线和温度不适造成的干扰,以及不良生活习惯,如晚餐过饱、摄入含咖啡因或辛辣食物,睡前使用电子设备等。此外,长期的心理压力和焦虑情绪,甚至是潜在的健康问题,如睡眠呼吸暂停、焦虑症或抑郁症,都可能加剧睡眠障碍,形成恶性循环。\n" +
+            "面对严重不足的睡眠质量,您需要采取综合措施来改善睡眠模式。首先,建立规律的作息时间,每天尽量在同一时间上床睡觉和起床,以帮助调整生物钟,改善睡眠规律性。其次,优化睡眠环境,确保卧室安静、黑暗和适宜的温度,必要时使用耳塞或眼罩以屏蔽干扰。同时,调整生活习惯,晚餐避免过饱,减少摄入刺激性食物,睡前两小时避免使用电子设备,改以阅读或听轻音乐作为睡前活动。此外,学会管理心理压力,采取冥想、深呼吸等放松技巧,必要时寻求心理咨询,有效应对压力和焦虑。最后,考虑进行全面健康检查,排除或治疗可能影响睡眠的健康问题,必要时咨询睡眠专家或医生,寻求专业指导。#;\n" +
+            "3. 您的睡眠质量处于较差的水平,这意味着您可能在入睡、保持睡眠和醒来时感到精神焕发方面存在显著问题。每晚的睡眠可能断断续续,夜间多次醒来,早晨醒来时依然疲倦。这种情况不仅会降低您的日常工作效率,还可能导致情绪波动和长期健康问题。\n" +
+            "影响您睡眠质量的因素可能包括多方面,不规律的作息、不均衡的饮食、较差的睡眠环境、电子产品的过度使用等。此外,还需要关注一些一些健康问题,如睡眠呼吸暂停、慢性疼痛或其他慢性疾病,也会对睡眠产生负面影响。\n" +
+            "为了改善您的睡眠质量,建议您制定并保持规律的作息时间,每天在固定的时间上床和起床,帮助稳定生物钟。优化睡眠环境,确保卧室安静、黑暗且凉爽,可以通过使用遮光窗帘、耳塞或白噪音机来改善。避免晚餐过饱,减少含咖啡因和酒精饮料的摄入,选择易消化的食物。管理压力和焦虑情绪,尝试冥想、深呼吸等放松技术,帮助身心在睡前放松。在睡前至少一小时避免使用电子设备,可以进行阅读、听音乐或其他放松活动。如果有慢性健康问题,应及时就医,采取适当的治疗措施。通过这些调整,您可以逐步改善睡眠质量,从而提升日常的生活质量和整体健康水平。#;\n" +
+            "4. 您的睡眠质量处于较差的水平,这意味着您可能在入睡、保持睡眠和醒来时感到精神焕发方面存在显著问题。每晚的睡眠可能断断续续,夜间多次醒来,早晨醒来时依然疲倦,这种情况不仅降低了您的日常工作效率,还可能导致情绪波动和长期健康问题。影响您睡眠质量的因素可能包括多方面,如不规律的作息时间、不均衡的饮食、较差的睡眠环境、电子产品的过度使用,以及潜在的健康问题,如睡眠呼吸暂停、慢性疼痛或其他慢性疾病。\n" +
+            "为了改善您的睡眠质量,建议您制定并保持规律的作息时间,每天在固定的时间上床和起床,这有助于稳定生物钟,改善睡眠规律性。优化睡眠环境至关重要,确保卧室安静、黑暗且凉爽,可以通过使用遮光窗帘、耳塞或白噪音机来减少干扰,创造一个有利于睡眠的环境。在饮食方面,避免晚餐过饱,减少含咖啡因和酒精饮料的摄入,选择易消化的食物,有助于促进睡眠。管理压力和焦虑情绪,尝试冥想、深呼吸等放松技术,帮助身心在睡前放松。在睡前至少一小时避免使用电子设备,转而进行阅读、听音乐或其他放松活动,以减少蓝光对睡眠的影响。如果有慢性健康问题,应及时就医,采取适当的治疗措施,以改善睡眠质量。通过这些综合性的调整和优化,您可以逐步改善睡眠质量,从而提升日常的生活质量和整体健康水平。改善睡眠质量是一个持续的过程,需要您的耐心和坚持,但其带来的健康益处将使一切努力都变得值得。#;\n" +
+            "5. 您的睡眠存在明显的睡眠质量问题,当前的睡眠状况表明您在入睡、保持深度睡眠和醒来时充满活力方面遇到挑战。夜晚可能被多次醒来打断,早晨醒来时常感到疲惫,这直接影响了日间的精力和情绪状态。\n" +
+            "入睡困难可能源于日常的高压力环境、不规律的作息时间或睡前过度使用电子设备等,这些因素均会干扰正常的睡眠周期。而深度睡眠时间的严重不足,则可能由身体健康问题、精神压力或不良睡眠习惯引起,它直接影响身体的自我修复与恢复能力。\n" +
+            "针对上述问题,改进策略应聚焦于多个方面。首先,建立并坚持规律的作息时间,限制晚间咖啡因和酒精的摄入,避免睡前过度兴奋。其次,优化睡眠环境,确保卧室安静、黑暗且温度适宜,减少外界干扰。此外,适度的体育锻炼和放松技巧,如深呼吸、冥想等,也能有效缓解压力,促进睡眠。\n" +
+            "最后,若上述措施无法显著改善睡眠质量,建议被测者寻求专业医疗帮助,进行进一步的健康评估和必要的治疗。通过综合施策,有望从根本上解决睡眠质量差的问题,恢复健康的睡眠模式。";
+
+    public NEWPSQIScale(JSONArray jsonArray, JSONObject resultJson) {
+        super(jsonArray, resultJson);
+    }
+
+//    public  JSONObject scaleCalculate() throws Exception {
+//        return null;
+//    }
+
+    public JSONObject scaleCalculate() throws Exception {
+        //总分
+        double score = 0;
+        Map<String, String> resultMap0 = new LinkedHashMap<>();
+        List<Map<String, String>> resultMapList = new ArrayList<>();
+        //新版本数据格式
+        Map<String, Object> newResult = new LinkedHashMap<>();
+        //返回值以及存数据库格式
+        List<NewResultDto> newResultDtos = new ArrayList<>();
+        if (jsonArray.size() > 0) {
+            score += checkSleepTime(jsonArray) + checkWaitTime(jsonArray) + checkWakeTime(jsonArray) + checkSleepHour(jsonArray) + checkSleepQuality(jsonArray) + checkQuality(jsonArray) + checkEnergy(jsonArray);
+            resultMap0.put("总分", String.valueOf(score));
+            resultJson.put("总分", String.valueOf(score));
+            if (score >= 0 && score <= 12) {
+                String excellentStr = RandomSuggestionUtil.getSuggestion(excellentComment);
+                newResultDtos.add(new NewResultDto("总分", String.valueOf(score), excellentSleep, excellentStr, "无",
+                        "无", "无", "无", "是"));
+                resultMap0.put("总分解释", excellentSleep);
+                resultMap0.put("总分说明", excellentStr);
+                resultMap0.put("总分解读", "无");
+                resultMap0.put("总分建议", "继续保持,你的睡眠质量将继续成为你健康生活的强大后盾。");
+                resultJson.put("总分解释", excellentSleep);
+                resultJson.put("总分说明", excellentStr);
+                resultJson.put("总分解读", "无");
+                resultJson.put("总分建议", "继续保持,你的睡眠质量将继续成为你健康生活的强大后盾。");
+            } else if (score >= 13 && score <= 26) {
+                String goodStr = RandomSuggestionUtil.getSuggestion(goodComment);
+                newResultDtos.add(new NewResultDto("总分", String.valueOf(score), goodSleep, goodStr, "无",
+                        "无", "无", "坚持有规律的作息时间,在周末不要睡得太晚,睡前不要暴饮暴食,也不要喝太多的水。", "是"));
+                resultMap0.put("总分解释", goodSleep);
+                resultMap0.put("总分说明", goodStr);
+                resultMap0.put("总分解读", "无");
+                resultMap0.put("总分建议", "坚持有规律的作息时间,在周末不要睡得太晚,睡前不要暴饮暴食,也不要喝太多的水。");
+                resultJson.put("总分解释", goodSleep);
+                resultJson.put("总分说明", goodStr);
+                resultJson.put("总分解读", "无");
+                resultJson.put("总分建议", "坚持有规律的作息时间,在周末不要睡得太晚,睡前不要暴饮暴食,也不要喝太多的水。");
+            } else if (score >= 27 && score <= 40) {
+                String fairStr = RandomSuggestionUtil.getSuggestion(fairComment);
+                newResultDtos.add(new NewResultDto("总分", String.valueOf(score), fairSleep, fairStr, "无",
+                        "无", "无", "舒缓的心情就可以让患者早日睡眠,还有就是患者要积极锻炼,在肌体劳累之时就可以很快入眠。", "是"));
+                resultMap0.put("总分解释", fairSleep);
+                resultMap0.put("总分说明", fairStr);
+                resultMap0.put("总分解读", "无");
+                resultMap0.put("总分建议", "舒缓的心情就可以让您快速睡眠,还有就是要积极锻炼,在肌体劳累之时就可以很快入眠。");
+                resultJson.put("总分解释", fairSleep);
+                resultJson.put("总分说明", fairStr);
+                resultJson.put("总分解读", "无");
+                resultJson.put("总分建议", "舒缓的心情就可以让您快速睡眠,还有就是要积极锻炼,在肌体劳累之时就可以很快入眠。");
+            } else if (score >= 41 && score <= 54) {
+                String poorStr = RandomSuggestionUtil.getSuggestion(poorComment);
+                newResultDtos.add(new NewResultDto("总分", String.valueOf(score), poorSleep, poorStr, "无",
+                        "无", "无", "建议您及时就医了,必要时采用药物治疗。", "是"));
+                resultMap0.put("总分解释", "睡眠质量很差");
+                resultMap0.put("总分说明", poorStr);
+                resultMap0.put("总分解读", "无");
+                resultMap0.put("总分建议", "建议您及时就医了,必要时采用药物治疗。");
+                resultJson.put("总分解释", "睡眠质量很差");
+                resultJson.put("总分说明", poorStr);
+                resultJson.put("总分解读", "无");
+                resultJson.put("总分建议", "建议您及时就医了,必要时采用药物治疗。");
+            }
+            resultMapList.add(resultMap0);
+        }
+        //需要图表展示的
+        newResult.put("iconInfo", "");
+        newResult.put("result", newResultDtos);
+        JSONObject returnJson = new JSONObject(true);
+        returnJson.put("resultMapList", resultMapList);
+        returnJson.put("resultJson", resultJson);
+        returnJson.put(ScaleConstant.ResultEnum.RESULT_NEW_FIELD.getKeyword(), newResult);
+        return returnJson;
+    }
+
+    /**
+     * 获取第一题分数
+     * @param jsonArray
+     * @return
+     */
+    private static int checkSleepTime(JSONArray jsonArray){
+        //第一题:睡觉时间:22:00前0分,22:00到23:001分;23:00到24:002分;24:00到1:003分
+        //获取睡觉时间小时
+        Integer hour = Integer.parseInt(jsonArray.getJSONObject(0).getString("checkItems").substring(0, jsonArray.getJSONObject(0).getString("checkItems").indexOf(":")));
+        if ((hour > 3) && (hour < 22)){
+            return 0;
+        } else if ((hour == 22) || (hour == 23)){
+            return 1;
+        } else if ((hour == 24) || (hour == 1)){
+            return 2;
+        } else {
+            return 3;
+        }
+    }
+
+    /**
+     * 获取第二题分数
+     * @param jsonArray
+     * @return
+     */
+    private static int checkWaitTime(JSONArray jsonArray){
+        JSONObject jsonObject1 = jsonArray.getJSONObject(1);
+        String minute = jsonObject1.getString("checkItems");
+        if(minute.equals("16~30min")){
+            return 1;
+        } else if(minute.equals("31~60min")){
+            return 2;
+        } else if(minute.equals(">=60min")){
+            return 3;
+        } else {
+            return 0;
+        }
+    }
+    /**
+     * 获取第三题分数
+     * @param jsonArray
+     * @return
+     */
+    private static int checkWakeTime(JSONArray jsonArray){
+        Integer hour = Integer.parseInt(jsonArray.getJSONObject(3).getString("checkItems").substring(0, jsonArray.getJSONObject(0).getString("checkItems").indexOf(":")));
+        if (hour < 6){
+            return 0;
+        } else if ((hour == 6) || (hour == 7)){
+            return 1;
+        } else if ((hour == 8) || (hour == 9)){
+            return 2;
+        } else {
+            return 3;
+        }
+    }
+    /**
+     * 获取第四题分数
+     * @param jsonArray
+     * @return
+     */
+    private int checkSleepHour(JSONArray jsonArray) {
+
+        //睡眠时间 根据条⽬ 4 的应答计分, >7 ⼩时计 0 分,6~7 计 1 分,5~6计 2 分,<5 ⼩时计 3 分。
+        int scoreHour = 0;
+        //JSONObject jsonObject1 = jsonArray.getJSONObject(3);
+        String hourSleepString = jsonArray.getJSONObject(3).getString("checkItems");
+        int hour =Integer.parseInt(hourSleepString.substring(0,hourSleepString.indexOf(":")));
+        if(hour>6&&hour<=7){
+            scoreHour = 1;
+        }else if (hour>=5&&hour<=6){
+            scoreHour = 2 ;
+        }else if (hour<5){
+            scoreHour = 3 ;
+        }
+        return scoreHour;
+    }
+    /**
+     * 获取第五-十四题分数/十六-十七题分数
+     * @param jsonArray
+     * @return
+     */
+    private static int checkSleepQuality(JSONArray jsonArray){
+        //睡眠障碍
+        int score = 0;
+        for(int i=4;i<14;i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            String checkItems = jsonObject.getString("checkItems").trim();
+            if(checkItems.equals("很少出现")){
+                score += 1;
+            }else if(checkItems.equals("有那么一两次")){
+                score += 2;
+            }else if(checkItems.equals("太多次了,根本记不清")){
+                score += 3;
+            }
+        }
+        for(int i=15;i<17;i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            String checkItems = jsonObject.getString("checkItems").trim();
+            if(checkItems.equals("很少出现")){
+                score += 1;
+            }else if(checkItems.equals("有那么一两次")){
+                score += 2;
+            }else if(checkItems.equals("太多次了,根本记不清")){
+                score += 3;
+            }
+        }
+        return score;
+    }
+    /**
+     * 获取第十五题分数
+     * @param jsonArray
+     * @return
+     */
+    private static int checkQuality(JSONArray jsonArray){
+        //睡眠质量,第六题,很好0分 较好1分  较差2分 很差3分
+        int scoreQuality = 0 ;
+        JSONObject jsonObject1 = jsonArray.getJSONObject(14);
+        String checkItems = jsonObject1.getString("checkItems");
+        if(checkItems.equals("有一点点好")){
+            scoreQuality +=1;
+        }else if(checkItems.equals("有一点点不好")){
+            scoreQuality +=2;
+        }else if(checkItems.equals("很不好")){
+            scoreQuality +=3;
+        }
+        return scoreQuality;
+    }
+    /**
+     * 获取第十八题分数
+     * @param jsonArray
+     * @return
+     */
+    private static int checkEnergy(JSONArray jsonArray){
+        //睡眠质量,第六题,很好0分 较好1分  较差2分 很差3分
+        int scoreQuality = 0 ;
+        JSONObject jsonObject1 = jsonArray.getJSONObject(17);
+        String checkItems = jsonObject1.getString("checkItems");
+        if(checkItems.equals("偶尔有一次")){
+            scoreQuality +=1;
+        }else if(checkItems.equals("有时有")){
+            scoreQuality +=2;
+        }else if(checkItems.equals("总是这样")){
+            scoreQuality +=3;
+        }
+        return scoreQuality;
+    }
+    private static int checkTime(JSONArray jsonArray){
+        //入睡时间 ,
+        // 1、第二题 计分为≤ 15 分计 0 分,16~30 分计 1 分,31~60计 2 分,≥60 分计 3 分
+        // 2、 5a⽆计 0 分,<1 周/ 次计 1 分,1~2 周/ 次计 2 分,≥3周/ 次计 3 分3.
+        // 累加条⽬ 2 和 5a 的计分,若累加分为 0 计 0 分,1~2计 1 分,3~4分 2 ,5~6 计 3 分
+        int scoreTime = 0;
+        int scoreTime5a=0;
+        int scoreTime2=0;
+        JSONObject jsonObject1 = jsonArray.getJSONObject(1);
+        String minute = jsonObject1.getString("checkItems");
+        if(minute.equals("16~30min")){
+            scoreTime2 =1;
+        }else if(minute.equals("31~60min")){
+            scoreTime2 =2;
+        }else if(minute.equals(">=60min")){
+            scoreTime2 =3;
+        }
+        jsonObject1=jsonArray.getJSONObject(4);
+        String checkItems = jsonObject1.getString("checkItems").trim();
+        if(checkItems.equals("很少出现")){
+            scoreTime5a = 1;
+        }else if(checkItems.equals("有那么一两次")){
+            scoreTime5a = 2;
+        }else if(checkItems.equals("太多次了,根本记不清")){
+            scoreTime5a=3;
+        }
+        int scoreTemp = scoreTime2+scoreTime5a;
+        if(scoreTemp==0){
+            scoreTime = 0;
+        }else if(scoreTemp>=1 && scoreTemp<= 2 ){
+            scoreTime = 1;
+        }else if(scoreTemp>=3 && scoreTemp<= 4 ){
+            scoreTime = 2;
+        }else if(scoreTemp>=5 && scoreTemp<= 6 ){
+            scoreTime = 3;
+        }
+        return scoreTime;
+    }
+
+    private int checkHour(JSONArray jsonArray) {
+
+        //睡眠时间 根据条⽬ 4 的应答计分, >7 ⼩时计 0 分,6~7 计 1 分,5~6计 2 分,<5 ⼩时计 3 分。
+        int scoreHour = 0;
+        //JSONObject jsonObject1 = jsonArray.getJSONObject(3);
+        String hourSleepString = jsonArray.getJSONObject(3).getString("checkItems");
+        int hour =Integer.parseInt(hourSleepString.substring(0,hourSleepString.indexOf(":")));
+        if(hour>6&&hour<=7){
+            scoreHour = 1;
+        }else if (hour>=5&&hour<=6){
+            scoreHour = 2 ;
+        }else if (hour<5){
+            scoreHour = 3 ;
+        }
+        return scoreHour;
+    }
+
+    private static int checkEfficiency(JSONArray jsonArray){
+//        床上时间 = 条⽬ 3(起床时间) - 条⽬ 1(上床时间)
+        String goBad = "2021-01-27 "+jsonArray.getJSONObject(2).getString("checkItems")+"";
+        LocalDateTime engDate = LocalDateTime.parse(goBad, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
+        String leaveBad = "2021-01-26 "+jsonArray.getJSONObject(0).getString("checkItems");
+        LocalDateTime beginDate = LocalDateTime.parse(leaveBad,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
+        Duration duration = Duration.between(beginDate,engDate);
+        //相差的分钟数
+        long hourOnBed = duration.toMinutes();
+        String hourSleepString = jsonArray.getJSONObject(3).getString("checkItems");
+        int hourSleep = Integer.parseInt(hourSleepString.substring(0,hourSleepString.indexOf(":")))*60 + Integer.parseInt(hourSleepString.substring(hourSleepString.indexOf(":")+1));
+        double efficiencyTemp  = (double)hourSleep/hourOnBed;
+        if(efficiencyTemp>0.85){
+            return 0;
+        }else if(efficiencyTemp>=0.75&&efficiencyTemp<=0.84){
+            return 1;
+        }else if(efficiencyTemp>=0.65&&efficiencyTemp<0.74){
+            return 2;
+        }else{
+            return 3;
+        }
+
+    }
+    private static  int checkObstruct(JSONArray jsonArray){
+        //睡眠障碍
+        int scoreTemp = 0;
+        int score = 0;
+        for(int i=5;i<14;i++){
+            JSONObject jsonObject = jsonArray.getJSONObject(i);
+            String checkItems = jsonObject.getString("checkItems").trim();
+            if(checkItems.equals("很少出现")){
+                scoreTemp += 1;
+            }else if(checkItems.equals("有那么一两次")){
+                scoreTemp += 2;
+            }else if(checkItems.equals("太多次了,根本记不清")){
+                scoreTemp += 3;
+            }
+            if(scoreTemp==0){
+                score = 0;
+            }else if(scoreTemp>=1 && scoreTemp<10){
+                score = 1;
+            }else if(scoreTemp>=10 && scoreTemp<=18){
+                score = 2;
+            }else if(scoreTemp >=19 && scoreTemp<=27){
+                score = 3;
+            }
+        }
+        return score;
+    }
+
+    private int checkMedicine(JSONArray jsonArray){
+        //催眠药物
+        int scoreMedicine = 0 ;
+        JSONObject jsonObject = jsonArray.getJSONObject(15);
+        String checkItems = jsonObject.getString("checkItems").trim();
+        if(checkItems.equals("很少出现")){
+            scoreMedicine = 1;
+        }else if(checkItems.equals("有那么一两次")){
+            scoreMedicine = 2;
+        }else if(checkItems.equals("太多次了,根本记不清")){
+            scoreMedicine = 3;
+        }
+        return scoreMedicine;
+    }
+
+    private static int checkDay(JSONArray jsonArray){
+        //日间功能障碍
+        int scoreDay=0;
+        JSONObject jsonObject = jsonArray.getJSONObject(16);
+        String checkItems = jsonObject.getString("checkItems").trim();
+        if(checkItems.equals("很少出现")){
+            scoreDay += 1;
+        }else if(checkItems.equals("有那么一两次")){
+            scoreDay += 2;
+        }else if(checkItems.equals("太多次了,根本记不清")){
+            scoreDay += 3;
+        }
+
+        jsonObject = jsonArray.getJSONObject(17);
+        checkItems = jsonObject.getString("checkItems").trim();
+        if(checkItems.equals("压根没有")){
+            scoreDay += 0;
+        }else if(checkItems.equals("偶尔有一次")){
+            scoreDay += 1;
+        }else if(checkItems.equals("有时有")){
+            scoreDay += 2;
+        }else if(checkItems.equals("总是这样")){
+            scoreDay += 3;
+        }
+        if(scoreDay == 0){
+            scoreDay = 0;
+        }else if(scoreDay == 1 || scoreDay == 2){
+            scoreDay = 1;
+        }else if(scoreDay == 3 || scoreDay == 4){
+            scoreDay = 2;
+        }else if(scoreDay == 5 || scoreDay == 6){
+            scoreDay = 3;
+        }
+        return scoreDay;
+    }
+}

+ 378 - 0
src/main/java/com/rf/psychological/scale/resultBusiness/scaleResult/SRHMScale.java

@@ -0,0 +1,378 @@
+package com.rf.psychological.scale.resultBusiness.scaleResult;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.rf.psychological.dao.dto.scale.NewResultDto;
+import com.rf.psychological.dao.model.AnswerEntity;
+import com.rf.psychological.dao.model.DimensionEntity;
+import com.rf.psychological.scale.dao.model.ScaleMarksEntity;
+import com.rf.psychological.scale.scaleresult.ScaleConstant;
+import com.rf.psychological.utils.Constant;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.lang.Nullable;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author: 李东锋
+ * @Date: 2024/8/14 10:15
+ * @Description: 自测健康评定量表
+ */
+public class SRHMScale extends BaseScale {
+    public SRHMScale(JSONArray jsonArray, JSONObject resultJson) {
+        super(jsonArray, resultJson);
+    }
+
+    public JSONObject scaleCalculate() throws Exception {
+
+        //总分
+        double score = 0;
+        DecimalFormat df = new DecimalFormat("######0.00");
+
+        Map<String, String> resultMap0 = new LinkedHashMap<>();
+        List<Map<String, String>> resultMapList = new ArrayList<>();
+        //新版本数据格式
+        Map<String, Object> newResult = new LinkedHashMap<>();
+
+        //获取答案列表
+        List<AnswerEntity> answerEntities = (List<AnswerEntity>) resultJson.get("answerEntities");
+        //获取评分规则列表
+        List<ScaleMarksEntity> scaleMarksEntities = (List<ScaleMarksEntity>) resultJson.get("scaleMarksEntities");
+        //获取维度信息列表
+        List<DimensionEntity> dimensionEntities = (List<DimensionEntity>) resultJson.get("dimensionEntities");
+        //计算每个维度得分dimensionEntities
+        double[] dimensionScore = new double[dimensionEntities.size()];
+        Map<String, Double> dimensionScoreMap = new HashMap<>();
+        //jsonArray:用户自己选择的题目选项
+
+
+        for (int i = 0; i < jsonArray.size(); i++) {
+            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
+            //计算总分
+            for (AnswerEntity answerEntity : answerEntities) {
+                if (answerEntity.getQuestionNo().equals(jsonObject1.getString("questionNo"))) {
+                    if (answerEntity.getName().replaceAll("\\s", "").equals(jsonObject1.getString("checkItems").replaceAll("\\s", ""))) {
+                        score += Double.parseDouble(answerEntity.getScore());
+                        break;
+                    }
+                }
+            }
+            //计算维度分数
+            for (int y = 0; y < dimensionEntities.size(); y++) {
+                //获取维度信息
+                DimensionEntity dimensionEntity = dimensionEntities.get(y);
+                //获取该维度下有哪些选项
+                String questionNos = dimensionEntity.getQuestionNo();
+                //删除空白字符后得到进行划分得到选择题号
+                String[] questionNo = questionNos.replaceAll("\\s", "").split(";");
+                //计算每道题的得分
+                for (String question : questionNo) {
+                    if (question.equals(jsonObject1.getString("questionNo"))) {
+                        //获取所有答案中本道题目的答案list数组
+                        List<AnswerEntity> nowQuestionAnswerList = answerEntities.stream().filter(answerEntity -> answerEntity.getQuestionNo().equals(question)).collect(Collectors.toList());
+                        //本题目的正确答案与自己的选项进行对比,正确的话相应分数进行相加
+                        for (AnswerEntity answerEntity : nowQuestionAnswerList) {
+                            if (answerEntity.getName().replaceAll("\\s", "").equals(jsonObject1.getString("checkItems").replaceAll("\\s", ""))) {
+
+                                dimensionScoreMap.put(dimensionEntity.getId(), dimensionScoreMap.get(dimensionEntity.getId()) == null ? Double.parseDouble(answerEntity.getScore()) : (dimensionScoreMap.get(dimensionEntity.getId()) + Double.parseDouble(answerEntity.getScore())));
+                                dimensionScore[y] += Double.parseDouble(answerEntity.getScore());
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+
+        }
+        for (int y = 0; y < dimensionEntities.size(); y++) {
+            //获取维度信息
+            DimensionEntity dimensionEntity = dimensionEntities.get(y);
+            //获取该维度下有哪些选项
+            String questionNos = dimensionEntity.getQuestionNo();
+            //删除空白字符后得到进行划分得到选择题号
+            String[] questionNo = questionNos.replaceAll("\\s", "").split(";");
+            double diScore = dimensionScore[y] / (questionNo.length * 10) * 100;
+            diScore = Double.parseDouble(String.format("%.2f",diScore));
+            dimensionScoreMap.put(dimensionEntity.getId(), diScore);
+            dimensionScore[y] = diScore;
+        }
+        resultJson.put("dimensionScoreMap", dimensionScoreMap);
+        //判断维度分是否为求平均值
+        boolean totalMark = true;
+        if (dimensionEntities.size() > 0) {
+            for (int y = 0; y < dimensionEntities.size(); y++) {
+                String[] questionNo = dimensionEntities.get(y).getQuestionNo().split(";");
+                for (ScaleMarksEntity scaleMarksEntity : scaleMarksEntities) {
+                    //判断总分是否需要处理
+                    if (totalMark) {
+                        if (scaleMarksEntity.getName().equals("总分") || scaleMarksEntity.getName().equals("无")) {
+                            if (Constant.DEFAULT_VALUE_ONE.equals(StringUtils.isEmpty(scaleMarksEntity.getScoringType()) ? Constant.DEFAULT_VALUE_ZERO : scaleMarksEntity.getScoringType())) {
+                                score = Double.parseDouble(df.format(score / jsonArray.size()));
+                                totalMark = false;
+                            } else if (Constant.QUESTION_TYPE_TWO.equals(StringUtils.isEmpty(scaleMarksEntity.getScoringType()) ? Constant.DEFAULT_VALUE_ZERO : scaleMarksEntity.getScoringType())) {
+                                score = Math.round(score / jsonArray.size());
+                                totalMark = false;
+                            }
+                        }
+                    }
+                    //判断维度分是否需要处理
+                    if (scaleMarksEntity.getName().equals(dimensionEntities.get(y).getName())) {
+                        if (Constant.DEFAULT_VALUE_ONE.equals(StringUtils.isEmpty(scaleMarksEntity.getScoringType()) ? Constant.DEFAULT_VALUE_ZERO : scaleMarksEntity.getScoringType())) {
+                            dimensionScore[y] = Double.parseDouble(df.format(dimensionScore[y] / questionNo.length));
+                            dimensionScoreMap.put(dimensionEntities.get(y).getId(), dimensionScore[y]);
+                            break;
+                        } else if (Constant.QUESTION_TYPE_TWO.equals(StringUtils.isEmpty(scaleMarksEntity.getScoringType()) ? Constant.DEFAULT_VALUE_ZERO : scaleMarksEntity.getScoringType())) {
+                            dimensionScore[y] = Math.round(dimensionScore[y] / questionNo.length);
+                            dimensionScoreMap.put(dimensionEntities.get(y).getId(), dimensionScore[y]);
+                            break;
+                        }
+
+                    }
+                }
+            }
+        }
+
+
+        //将量表总维度根据维度名称进行分组
+        Map<String, List<ScaleMarksEntity>> scaleMarksMap = scaleMarksEntities.stream().collect(Collectors.groupingBy(ScaleMarksEntity::getName));
+        //返回值以及存数据库格式
+        List<NewResultDto> newResultDtos = new ArrayList<>();
+        score = score / 480 * 100;
+        resultMap0.put("总分", df.format(score));
+        resultJson.put("总分", df.format(score));
+        BigDecimal scoreDecimal = new BigDecimal(df.format(score));
+        //如果没有总分这一栏,需要手动赋值返回
+        List<ScaleMarksEntity> totalScore = scaleMarksMap.get("总分");
+        List<ScaleMarksEntity> totalScores = scaleMarksMap.get("无");
+        if (totalScore == null) {
+            if (totalScores == null) {
+                newResultDtos.add(new NewResultDto("总分", df.format(score), "无", "无",
+                        "无", "无", "无", "无", "是"));
+            } else {
+                for (ScaleMarksEntity tempTotalScore : totalScores) {
+                    BigDecimal scoreStart = new BigDecimal(tempTotalScore.getScoreStart());
+                    BigDecimal scoreEnd = new BigDecimal(tempTotalScore.getScoreEnd());
+                    if (scoreDecimal.compareTo(scoreEnd) <= 0 && scoreDecimal.compareTo(scoreStart) >= 0) {
+                        newResultDtos.add(new NewResultDto("总分", df.format(score), tempTotalScore.getSymptom(), tempTotalScore.getImprovementSuggestions(),
+                                tempTotalScore.getFlag(), tempTotalScore.getReference(), tempTotalScore.getNameExplain(), tempTotalScore.getSuggestion(), tempTotalScore.getIsTotalScoreExplain()));
+                        resultMap0.put("总分症状", tempTotalScore.getSymptom());
+                        resultMap0.put("总分指导语", tempTotalScore.getImprovementSuggestions());
+                        resultMap0.put("总分因子解释", tempTotalScore.getNameExplain());
+                        resultMap0.put("总分建议", tempTotalScore.getSuggestion());
+                        resultJson.put("总分症状", tempTotalScore.getSymptom());
+                        resultJson.put("总分指导语", tempTotalScore.getImprovementSuggestions());
+                        resultJson.put("总分因子解释", tempTotalScore.getNameExplain());
+                        resultJson.put("总分建议", tempTotalScore.getSuggestion());
+                    }
+                }
+            }
+        } else {
+            for (ScaleMarksEntity tempTotalScore : totalScore) {
+                BigDecimal scoreStart = new BigDecimal(tempTotalScore.getScoreStart());
+                BigDecimal scoreEnd = new BigDecimal(tempTotalScore.getScoreEnd());
+                if (scoreDecimal.compareTo(scoreEnd) <= 0 && scoreDecimal.compareTo(scoreStart) >= 0) {
+                    newResultDtos.add(new NewResultDto("总分", df.format(score), tempTotalScore.getSymptom(), tempTotalScore.getImprovementSuggestions(),
+                            tempTotalScore.getFlag(), tempTotalScore.getReference(), tempTotalScore.getNameExplain(), tempTotalScore.getSuggestion(), tempTotalScore.getIsTotalScoreExplain()));
+                    resultMap0.put("总分症状", tempTotalScore.getSymptom());
+                    resultMap0.put("总分指导语", tempTotalScore.getImprovementSuggestions());
+                    resultMap0.put("总分因子解释", tempTotalScore.getNameExplain());
+                    resultMap0.put("总分建议", tempTotalScore.getSuggestion());
+                    resultJson.put("总分症状", tempTotalScore.getSymptom());
+                    resultJson.put("总分指导语", tempTotalScore.getImprovementSuggestions());
+                    resultJson.put("总分因子解释", tempTotalScore.getNameExplain());
+                    resultJson.put("总分建议", tempTotalScore.getSuggestion());
+                }
+            }
+        }
+
+
+        JSONObject iconInfo = new JSONObject();
+        //雷达图需要的维度以及最大值
+        List<Map<String, Object>> indicator = new LinkedList<>();
+        //雷达图所需要的常模参考值
+        LinkedList<String> reference = new LinkedList<>();
+        //雷达图需要的分数
+        LinkedList<String> scoreList = new LinkedList<>();
+        //计算维度所在评分区间
+        commonComputeDimensionScore(df, resultMap0, resultJson, dimensionEntities, dimensionScore, scaleMarksMap, newResultDtos, indicator, reference, scoreList);
+        //需要图表展示的
+        iconInfo.put("indicator", indicator);
+        //判断是否有常模参考值,即reference的内容如果全为0,则不进行返回
+        if (!reference.stream().allMatch("0"::equals)) {
+            iconInfo.put("reference", reference);
+        }
+        iconInfo.put("scoreList", scoreList);
+        if (indicator.size() == 0 && reference.size() == 0) {
+            newResult.put("iconInfo", "");
+        } else {
+            newResult.put("iconInfo", iconInfo);
+        }
+        newResult.put("result", newResultDtos);
+        resultMapList.add(resultMap0);
+
+
+        JSONObject returnJson = new JSONObject(true);
+        returnJson.put("resultMapList", resultMapList);
+        returnJson.put("resultJson", resultJson);
+        returnJson.put(ScaleConstant.ResultEnum.RESULT_NEW_FIELD.getKeyword(), newResult);
+
+        return returnJson;
+    }
+
+    /**
+     * 通用计算量表所有维度分数,以及其维度所在分数段症状等
+     *
+     * @param df                用来设置小数位数,例如保留两位小数DecimalFormat df = new DecimalFormat("######0.00");
+     * @param resultMap         用来向数据库存
+     * @param resultJson        WebScaleResultController传递过来的评分规则等相关参数
+     * @param dimensionEntities 量表维度list信息
+     * @param dimensionScore    量表维度分数,需要和量表维度list对应
+     * @param scaleMarksMap     评分规则的map
+     * @param newResultDtos     各个维度的结论,等级解释等list
+     * @param indicator         雷达图需要的维度以及最大值
+     * @param reference         雷达图所需要的常模参考值
+     * @param scoreList         雷达图需要的分数
+     */
+    public static void commonComputeDimensionScore(@Nullable DecimalFormat df, Map<String, String> resultMap, JSONObject resultJson, List<DimensionEntity> dimensionEntities, double[] dimensionScore, Map<String, List<ScaleMarksEntity>> scaleMarksMap, List<NewResultDto> newResultDtos, List<Map<String, Object>> indicator, List<String> reference, List<String> scoreList) {
+        if (df == null) {
+            df = new DecimalFormat("######0.00");
+        }
+        for (int y = 0; y < dimensionEntities.size(); y++) {
+            Map<String, Object> indicatorMap = new HashMap<>();
+            DimensionEntity dimensionEntity = dimensionEntities.get(y);
+            NewResultDto newResultDto1 = new NewResultDto();
+            //存放该维度总分
+            resultMap.put(dimensionEntity.getName() + "得分", df.format(dimensionScore[y]));
+            resultJson.put(dimensionEntity.getName() + "得分", df.format(dimensionScore[y]));
+            newResultDto1.setScore(df.format(dimensionScore[y]));
+            newResultDtos.add(newResultDto1);
+            BigDecimal dimensionScoreDecimal = new BigDecimal(df.format(dimensionScore[y]));
+            //获取当前维度的评分规则
+            List<ScaleMarksEntity> scaleMarksEntities1 = scaleMarksMap.get(dimensionEntity.getName());
+            if (scaleMarksEntities1 != null) {
+                //循环遍历判断得分在哪个区间
+                for (ScaleMarksEntity scaleMarksEntity : scaleMarksEntities1) {
+                    BigDecimal decimalScoreEnd = new BigDecimal(scaleMarksEntity.getScoreEnd());
+                    BigDecimal decimalScoreStart = new BigDecimal(scaleMarksEntity.getScoreStart());
+                    if (dimensionScoreDecimal.compareTo(decimalScoreEnd) <= 0 && dimensionScoreDecimal.compareTo(decimalScoreStart) >= 0) {
+                        putDimResult(resultMap, resultJson, dimensionEntity.getName(), newResultDto1, scaleMarksEntity);
+                        //需要进行图表展示的维度放入map
+                        if ("1".equals(dimensionEntity.getIsIconFlag())) {
+                            indicatorMap.put("text", dimensionEntity.getName());
+                            //将当前维度按照分数的结尾值来进行排序scaleMarksEntities1
+                            List<ScaleMarksEntity> collect = scaleMarksEntities1.stream().sorted(Comparator.comparing(ScaleMarksEntity::getScoreEnd, Comparator.comparingDouble(Double::parseDouble))
+                                    .reversed()).collect(Collectors.toList());
+                            //排序完成后第一个的scoreEnd最大,也就是该维度最大的
+                            indicatorMap.put("max", collect.get(0).getScoreEnd());
+                            indicator.add(indicatorMap);
+                            if ("无".equals(scaleMarksEntity.getReference()) || "无".equals(scaleMarksEntity.getStandardDeviation())) {
+                                //常模参考值设为0
+                                reference.add("0");
+                            } else {
+                                reference.add(scaleMarksEntity.getReference());
+                            }
+                            scoreList.add(String.valueOf(dimensionScore[y]));
+                        }
+                    }
+                }
+            } else {
+                //如果分数规则表中无维度,而维度表中有相应维度,则只显示维度分数
+                newResultDto1.setFlag("无");
+                newResultDto1.setImprovementSuggestions("无");
+                newResultDto1.setName(dimensionEntity.getName());
+                newResultDto1.setReference("无");
+                newResultDto1.setNameExplain("无");
+                newResultDto1.setSuggestion("无");
+                newResultDto1.setIsTotalScoreExplain("否");
+                newResultDto1.setSymptom("无");
+            }
+        }
+    }
+
+    /**
+     * 通用计算单个维度分数,以及其维度所在分数段症状等
+     *
+     * @param df              默认为两位小数,可以为null,用来设置小数位数,例如保留两位小数DecimalFormat df = new DecimalFormat("######0.00");
+     * @param resultMap       用来向数据库存
+     * @param resultJson      WebScaleResultController传递过来的评分规则等相关参数
+     * @param dimensionName   维度名称
+     * @param dimensionScore  维度分数
+     * @param isDimensionShow 是否在雷达图中展示
+     * @param scaleMarksMap   评分规则的map
+     * @param newResultDtos   各个维度的结论,等级解释等list
+     * @param indicator       雷达图需要的维度以及最大值
+     * @param reference       雷达图所需要的常模参考值
+     * @param scoreList       雷达图需要的分数
+     */
+    public static void commonComputeDimensionScore(@Nullable DecimalFormat df, Map<String, String> resultMap, JSONObject resultJson, String dimensionName, double dimensionScore, Boolean isDimensionShow, Map<String, List<ScaleMarksEntity>> scaleMarksMap, List<NewResultDto> newResultDtos, List<Map<String, Object>> indicator, List<String> reference, List<String> scoreList) {
+        if (df == null) {
+            df = new DecimalFormat("######0.00");
+        }
+        Map<String, Object> indicatorMap = new HashMap<>();
+        NewResultDto newResultDto = new NewResultDto();
+        //存放该维度总分
+        resultMap.put(dimensionName + "得分", df.format(dimensionScore));
+        resultJson.put(dimensionName + "得分", df.format(dimensionScore));
+        newResultDto.setScore(df.format(dimensionScore));
+        newResultDtos.add(newResultDto);
+        BigDecimal dimensionScoreDecimal = new BigDecimal(df.format(dimensionScore));
+        //获取当前维度的评分规则
+        List<ScaleMarksEntity> scaleMarksEntities1 = scaleMarksMap.get(dimensionName);
+        if (scaleMarksEntities1 != null) {
+            //循环遍历判断得分在哪个区间
+            for (ScaleMarksEntity scaleMarksEntity : scaleMarksEntities1) {
+                BigDecimal decimalScoreEnd = new BigDecimal(scaleMarksEntity.getScoreEnd());
+                BigDecimal decimalScoreStart = new BigDecimal(scaleMarksEntity.getScoreStart());
+                if (dimensionScoreDecimal.compareTo(decimalScoreEnd) <= 0 && dimensionScoreDecimal.compareTo(decimalScoreStart) >= 0) {
+                    putDimResult(resultMap, resultJson, dimensionName, newResultDto, scaleMarksEntity);
+                    //需要进行图表展示的维度放入map
+                    if (isDimensionShow) {
+                        indicatorMap.put("text", dimensionName);
+                        //将当前维度按照分数的结尾值来进行排序scaleMarksEntities1
+                        List<ScaleMarksEntity> collect = scaleMarksEntities1.stream().sorted(Comparator.comparing(ScaleMarksEntity::getScoreEnd, Comparator.comparingInt(Integer::parseInt))
+                                .reversed()).collect(Collectors.toList());
+                        //排序完成后第一个的scoreEnd最大,也就是该维度最大的
+                        indicatorMap.put("max", collect.get(0).getScoreEnd());
+                        indicator.add(indicatorMap);
+                        if ("无".equals(scaleMarksEntity.getReference()) || "无".equals(scaleMarksEntity.getStandardDeviation())) {
+                            //常模参考值设为0
+                            reference.add("0");
+                        } else {
+                            reference.add(scaleMarksEntity.getReference());
+                        }
+                        scoreList.add(String.valueOf(dimensionScore));
+                    }
+                }
+            }
+        } else {
+            //如果分数规则表中无维度,而维度表中有相应维度,则只显示维度分数
+            newResultDto.setFlag("无");
+            newResultDto.setImprovementSuggestions("无");
+            newResultDto.setName(dimensionName);
+            newResultDto.setReference("无");
+            newResultDto.setNameExplain("无");
+            newResultDto.setSuggestion("无");
+            newResultDto.setIsTotalScoreExplain("否");
+            newResultDto.setSymptom("无");
+        }
+    }
+
+
+    private static void putDimResult(Map<String, String> resultMap0, JSONObject resultJson, String dimensionName, NewResultDto newResultDto1, ScaleMarksEntity scaleMarksEntity) {
+        //resultMap0.put(dimensionName + "常模参考值", scaleMarksEntity.getReference());
+        resultMap0.put(dimensionName + "症状", scaleMarksEntity.getSymptom());
+        resultJson.put(dimensionName + "结论", scaleMarksEntity.getSymptom());
+        resultMap0.put(dimensionName + "因子解释", scaleMarksEntity.getNameExplain());
+        resultJson.put(dimensionName + "因子解释", scaleMarksEntity.getNameExplain());
+        resultMap0.put(dimensionName + "指导语", scaleMarksEntity.getImprovementSuggestions());
+        resultJson.put(dimensionName + "指导语", scaleMarksEntity.getImprovementSuggestions());
+        resultMap0.put(dimensionName + "建议", scaleMarksEntity.getSuggestion());
+        resultJson.put(dimensionName + "建议", scaleMarksEntity.getSuggestion());
+        BeanUtils.copyProperties(scaleMarksEntity, newResultDto1);
+    }
+
+}

+ 26 - 0
src/main/java/com/rf/psychological/utils/RandomSuggestionUtil.java

@@ -0,0 +1,26 @@
+package com.rf.psychological.utils;
+
+import cn.hutool.core.util.RandomUtil;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @Description:随机获取总分说明工具类
+ * @Author: mimang
+ * @Date: 2024/5/7
+ */
+public class RandomSuggestionUtil {
+
+    public static String getSuggestion(String suggestion){
+        List<String> list = Arrays.asList(suggestion.split("#;"));
+        if (list.size()>1){
+            int size = list.size();
+            int num = RandomUtil.randomInt(0,size-1);
+            String text = list.get(num).substring(list.get(num).indexOf(".")+1);
+            return text.contains("#")?text.replace("#",""):text;
+        }else {
+            return suggestion;
+        }
+    }
+}

+ 7 - 2
src/main/resources/config/application-lan.yml

@@ -1,15 +1,20 @@
 #局域网版
 server:
   #群体局域网版
-  port: 8105
+  port: 8113
+  #port: 8105
   address: 0.0.0.0
 spring:
   datasource:
     driver-class-name: com.mysql.cj.jdbc.Driver
     #url: jdbc:mysql://49.232.26.44:3306/psychological_112?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
     #群体
-    url: jdbc:mysql://127.0.0.1:54051/psychological_wlb?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
+    url: jdbc:mysql://127.0.0.1:54059/psychological_cph?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
+    #url: jdbc:mysql://127.0.0.1:54051/psychological_wlb?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
     #url: jdbc:mysql://127.0.0.1:3306/psychological_wlb?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
     username: root
     password: Mysql@.2020
     #password: Aa123456
+#swagger 显示隐藏配置
+swagger:
+  show: true