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.DimensionOrgEntity;
import com.rf.psychological.scale.dao.model.ScaleMarksEntity;
import com.rf.psychological.scale.dao.model.WarnEntity;
import com.rf.psychological.scale.scaleresult.ScaleConstant;
import com.rf.psychological.scale.service.DimensionOrgService;
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 zsy
 * @description:MMPI量表
 * @date 2022/4/22 15:55
 */
public class MMPIScale extends BaseScale {

    public MMPIScale(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 = resultJson.getString("gender");
        String desc= null;

        //获取答案列表
        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()];
/*        String institutionNo = resultJson.getString("institutionNo");
        String userId = resultJson.getString("userId");
        DimensionOrgService dimensionOrgService = (DimensionOrgService) resultJson.get("dimensionOrgService");
        List<WarnEntity> warnEntityList = new ArrayList<>();*/
        Map<String,Double> dimensionScoreMap = new HashMap<>();
        int Q = 0;
        //jsonArray:用户自己选择的题目选项
        for (int i = 0; i < jsonArray.size(); i++) {
            JSONObject jsonObject1 = jsonArray.getJSONObject(i);
            if (Q > 22){
                List<NewResultDto> newResultDtos = new ArrayList<>();
                JSONObject iconInfo = new JSONObject();
                //雷达图需要的维度以及最大值
                List<Map<String, Object>> indicator = new LinkedList<>();
                //雷达图所需要的常模参考值
                LinkedList<String> reference = new LinkedList<>();
                //雷达图需要的分数
                LinkedList<String> scoreList = new LinkedList<>();
                iconInfo.put("indicator", indicator);
                iconInfo.put("reference", reference);
                iconInfo.put("scoreList", scoreList);
                newResult.put("iconInfo", iconInfo);

                newResultDtos.add(new NewResultDto("总分", "0", "无", "测验结果不可信，逃避现实和想要回避承认自己所不希望的事情",
                        "无", "无", "无", "无", "是"));
                newResult.put("result", newResultDtos);
                resultMap0.put("总分", df.format(score));
                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;
            }
            if (jsonObject1.getString("checkItems").replaceAll("\\s", "").equals("不好回答")){
                Q++;
            }
            //计算总分
            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", ""))) {
                                dimensionScore[y] += Double.parseDouble(answerEntity.getScore());
                                dimensionScoreMap.put(dimensionEntity.getId(),dimensionScoreMap.get(dimensionEntity.getId())==null?Double.parseDouble(answerEntity.getScore()):(dimensionScoreMap.get(dimensionEntity.getId()) +Double.parseDouble(answerEntity.getScore())));
                                break;
                            }
                        }
                    }
                }
            }

        }

        /*if(dimensionEntities != null && dimensionEntities.size() > 0){
            for (int y = 0; y < dimensionEntities.size(); y++) {
                //计算维度逻辑是否需要预警
                DimensionOrgEntity byInstitutionNoAndDimensionId = dimensionOrgService.findByInstitutionNoAndDimensionId(institutionNo, dimensionEntities.get(y).getId());
                if(byInstitutionNoAndDimensionId != null){
                    WarnEntity warnEntity = null;
                    switch (byInstitutionNoAndDimensionId.getLogic()){
                        case "lt":
                            if(dimensionScore[y]<Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())){
                                //添加预警信息
                                warnEntityList.add( createWarnEntry(dimensionEntities.get(y).getFlag(),institutionNo,userId,dimensionEntities.get(y).getId(),dimensionScore[y]));
                            }
                            break;
                        case "le":
                            if(dimensionScore[y]<=Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())){
                                //添加预警信息
                                warnEntityList.add( createWarnEntry(dimensionEntities.get(y).getFlag(),institutionNo,userId,dimensionEntities.get(y).getId(),dimensionScore[y]));
                            }
                            break;
                        case "eq":
                            if(dimensionScore[y]==Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())){
                                //添加预警信息
                                warnEntityList.add( createWarnEntry(dimensionEntities.get(y).getFlag(),institutionNo,userId,dimensionEntities.get(y).getId(),dimensionScore[y]));
                            }
                            break;
                        case "ne":
                            if(dimensionScore[y] != Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())){
                                //添加预警信息
                                warnEntityList.add( createWarnEntry(dimensionEntities.get(y).getFlag(),institutionNo,userId,dimensionEntities.get(y).getId(),dimensionScore[y]));
                            }
                            break;
                        case "ge":
                            if(dimensionScore[y]>=Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())){
                                //添加预警信息
                                warnEntityList.add( createWarnEntry(dimensionEntities.get(y).getFlag(),institutionNo,userId,dimensionEntities.get(y).getId(),dimensionScore[y]));
                            }
                            break;
                        case "gt":
                            if(dimensionScore[y]>Double.parseDouble(byInstitutionNoAndDimensionId.getThreshold())){
                                //添加预警信息
                                warnEntityList.add( createWarnEntry(dimensionEntities.get(y).getFlag(),institutionNo,userId,dimensionEntities.get(y).getId(),dimensionScore[y]));
                            }
                            break;
                    }

                }
            }
            resultJson.put("warnEntityList",warnEntityList);
        }*/
        resultJson.put("dimensionScoreMap",dimensionScoreMap);
        double[] a = new double[11];
        //Hs疑病量表
        double Hs = dimensionScore[3];
        a[1] = Hs;
        //D抑郁量表
        double D = dimensionScore[4];
        a[2] = D;
        //Hy癔病量表
        double Hy = dimensionScore[5];
        a[3] = Hy;
        //Pd精神病态量表
        double Pd = dimensionScore[6];
        a[4] = Pd;
        //Mf男性度量表（男被试）
        double M = dimensionScore[7];
        //Mf女性度量表（女被试）
        double F = dimensionScore[8];
        if (gender.equals("0")) {
            a[5] = M;
        } else {
            a[5] = F;
        }
        //Pa妄想症量表
        double Pa = dimensionScore[9];
        a[6] = Pa;
        //Pt精神衰弱量表
        double Pt = dimensionScore[10];
        a[7] = Pt;
        //Sc精神分裂量表
        double Sc = dimensionScore[11];
        a[8] = Sc;
        //Ma轻躁狂量表
        double Ma = dimensionScore[12];
        a[9] = Ma;
        //Si社会内向量表
        double Si = dimensionScore[13];
        a[0] = Si;
        int [] b = new int[11];
        int[] c = new int[11];
        for (int i = 0; i < a.length; i++) {
            b[i] = i;
            c[i] = (int) a[i];
        }
        for (int z = 0; z < c.length - 1; z++) {
            for (int j = z + 1; j < c.length; j++) {
                if (c[z] < c[j]) {//大到小，小到大改>
                    int tempc = c[z];
                    c[z] = c[j];
                    c[j] = tempc;
                    int tempb = b[z];
                    b[z] = b[j];
                    b[j] = tempb;
                }
            }
        }

        if (b[0] == 1){
            if (b[1] == 2){
                desc = "被试者明显的身体关注，伴随情绪抑郁。这种‘ 躯体疾病’可能是功能性的，也可能是器质性的，包括心脏疾病，胃肠道疾病（如溃疡病及呕吐）。经常主诉疼痛，头昏，睡眠障碍，虚弱，疲乏无力，感到情绪焦虑，紧张，神经质，明显缺乏信心，提不起精神，对他人对自己的看法很敏感。潜在的人格是被动依赖性的，容易对药物和酒产生滥用或依赖。被试者以过度压抑和躯体化作为其防御机制，缺乏洞察力和自我判断力。临床上表现该编码型的病人包括消化性溃疡，关节炎和慢性呼吸道疾患。在精神病院的研究发现，几乎半数病人的第一、二诊断是躯体化障碍或心理因素影响躯体功能状态，以及适应性障碍。鉴别诊断包括情感性障碍和恐惧性障碍。人格诊断：焦虑-惊恐型人格障碍，依赖-强迫-被动攻击型人格。";
            }
            if (b[1] == 3){
                desc = "被试者有神经质表现，诉说相当多的躯体症状，包括背痛，头痛，胃肠疾病，爱发脾气，虚弱，偶尔有眩晕，肢体麻木及震颤。有时存在情绪焦虑或抑郁，容易将其心理问题转换为迷惑不清的躯体形式的功能性疾病。自我中心，不成熟，易受暗示，有长期的和过度的受人同情、注意和安慰的需求。很少会因‘ 疾病’而丧失社会功能，但有将自己生活中的问题转化为社会可接受形式的强烈要求，以过度压抑、否认和躯体化等作为主要的防御机制。疾病所造成的继发性获益是亲近家庭成员给予他更多的照顾，使其避免承担各种责任。在有背痛的人中，治疗效果不好。在一项规模较大的，设立了良好对照的研究中，通过单纯医疗手段使其背痛得以缓解的人数不到10%。表现有各种各样的躯体疾病，下背痛，发作性哮喘，假性神经性疾病（如假性多发性硬化症）和女性尿道综合征。除此而外，胃肠及心脏疾病时也可能见到。在被试者中，大多数第一、二、三诊断是躯体形式障碍（ 包括躯体化障碍，心理源性疼痛，疑病）或心理因素影响躯体状况，而以躯体形式障碍及心理因素影响躯体状况占多数。鉴别诊断：情感性障碍和适应性障碍。人格障碍：强迫、被动-攻击或依赖型人格障碍。";
            }
            if (b[1] == 4){
                desc = "被试者表现有典型的疑病症状，特别是有迷惑不清的头痛，犹豫不决，焦虑。虽然表面上外向，与异性交往却很困难。通常有家庭冲突史，缺乏士气，成就低下，或有不寻常的问题行为史，明显的表现有易发脾气，悲观，爱抱怨。总的来说，与被试者很难相处，对酒精有高度易感性。诊断：情感性障碍，抑郁症，物质滥用，躯体形式障碍，心理因素影响躯体状况。人格障碍：被动-攻击型人格。";
            }
            if (b[1] == 5){
                desc = "被动，缺乏果断，依赖。通常有很多躯体陈述，回避承担家庭和社会义务，多诊断为疑病症或者转换反应（障碍）。疗效不好。在青少年，有多动，行为冲动，缺乏男子气，自认为有多种躯体疾病，而且从幼年就有病。被试者极度敏感，人格僵化，执拗，易怒，容易患躯体化障碍，容易受到集中应激的损害。对于认为的额外的要求非常敏感，过分担心躯体健康。有时为早期精神病人，存在躯体先占观念，对他人不信任。诊断：情感性障碍，抑郁症，躯体化障碍，心理因素影响躯体状态，偏执性障碍。人格障碍：回避型人格。";
            }
            if (b[1] == 7){
                desc = "被试者常是慢性神经质患者，情绪紧张，焦虑，有明显的强迫性症状，常表现有躯体障碍，而且往往与紧张和焦虑直接相关，有时显示对躯体功能的强迫性关注。往往缺乏安全感，压抑，缺乏自信，易产生潜在的内疚感和自卑感。可能性诊断包括情感性障碍，抑郁症，焦虑性障碍，躯体化障碍，心理因素影响躯体状态。人格障碍：依赖，被动-攻击，回避或强迫型人格。";
            }
            if (b[1] == 8){
                desc = "被试者行为古怪，令人费解。社交无能，不适当，情绪异己，感到自己和别人不一样。缺乏自信，没有上进心，经常需要别人指导。在应对焦虑和应激上有困难，可能存在躯体妄想，不信任他人，注意力不能集中，常有思维紊乱。人际交往中不适应，尤其在与异性交往中显得无能，常压抑自己的愤怒和敌意感情。在精神病人中，半数以上的人被认为患有精神病性障碍，主要为重症情感性障碍，也可为分裂情感性障碍。主要鉴别诊断是物质滥用障碍。人格障碍：回避-被动攻击型人格。鉴别诊断：边缘型及分裂型人格。";
            }
            if (b[1] == 9){
                desc = "被试者情绪压抑和不安，紧张，焦虑，烦躁，可能患有多种疾病，包括胃肠疾病，头痛，衰弱。往往通过活动过度对潜在的被动性和依赖性需求补偿，但可能会因达不到期望而受挫折。诊断：损伤后应激障碍中较多见，其他诊断：情感性障碍，抑郁，适应性障碍，情感障碍，双相，躯体化障碍。人格障碍：被动-攻击型人格。";
            }
            if (b[1] == 0){
                desc = "被试者害羞，犹豫不决，可能有一些躯体不适。";
            }
        }
        if (b[0] == 2) {
            if (b[1] == 3) {
                desc = "被试者情绪抑郁，紧张，过分担心，悲伤，活动少，容易感到孤单无助，得不到同情和支持，有多种躯体疾病。有不安全感，不能表达自己的感情，可能有某种人格不成熟。常感到社交不适应，特别是对异性。害怕失败，过度控制，因为害怕失败而避免承担额外的责任。尽管如此，通常是小心谨慎的工作者，很看重自己的责任。性行为能力差，包括阴冷（女）及阳痿（男）。可能有长期的家庭不愉快（尤其是女性），但很少离婚。常患溃疡病。压抑和癔症的防卫机制是处理日常生活中遇到的难题的重要应对手段。在精神病人中，往往有不寻常的行为方式，多疑敏感，思维障碍。主要表现为情感性障碍，少数（43%）被认为是躯体化障碍或是心理因素影响躯体状况，并将此作为第一，第二或第三诊断。人格障碍：回避，依赖或被动-攻击性人格。";
            }
            if (b[1] == 4) {
                desc = "被试者人格不成熟，行为冲动，多具有被动-攻击性质。遇到外部问题时，往往表现出情境性抑郁。典型性表现有，缺乏内疚和悔恨感，不诚实，一旦目前的困难被平息，将会旧态复萌。常来源于破裂家庭，比较容易感受到的唯一的长期存在的痛苦是，对其自身缺乏成就和遭受到的挫折体验。对药物及酒精嗜好有高度易感性。往往存在婚姻问题。在教育及职业上无成就，不听劝告，容易冲动，自我陶醉，有时以自杀行为企图指责或要挟他人。在医院里，这些病人常给医务人员留下好印象；但当确实接受治疗时，对治疗者可能产生依赖。在精神病人中，该编码型病人的主要诊断是抑郁-适应性障碍和混合性情感性障碍，而43%的人有物质滥用，并以此作为第一、二诊断。人格：被动-攻击型人格。鉴别诊断：戏剧性和反社会型人格。";
            }
            if (b[1] == 5) {
                desc = "这种编码型少见。被试者难以与异性交往，大多数已经离婚或者分居。对工作往往不满意，多有与工作有关的伤害，或者按照工伤对待。常有躯体不适的陈述，不少人有多种药物滥用史。尽管情绪抑郁，但交谈时能够给人以好印象。多被诊断为患有抑郁性障碍，但很少有躁狂发作或者双相发作。如果是青少年，与同胞姊妹关系不好，犹豫不决，害羞，过分敏感，多疑，消极，缺乏男子气，持续时间长。有的有反社会行为，包括破坏，入室盗窃等。如果是男性大学生，常情绪焦虑，有躯体疾病史，而且持续时间也很长。";
            }
            if (b[1] == 6) {
                desc = "被试者容易受激惹，情绪抑郁，过分敏感。情绪反复无常，烦躁，苛求，很可能存在自杀念头及企图自杀。对他人及自身的恼怒，多数在恼怒之后出现自责及责怪他人。容易受激惹，对他人产生厌倦及情绪抑郁，往往因之导致他人与的疏远，人际关系遭到破坏。治疗困难。在精神病人中，半数病人被认为患适应性障碍伴抑郁情绪或混合性情感障碍，少数人被认为患精神错乱，有重度抑郁或偏执性精神分裂症。人格障碍：回避，依赖，强迫性人格，也有相当数量的人被归于表演性-边缘性人格。";
            }
            if (b[1] == 7) {
                desc = "被试者情绪焦虑，抑郁，神经高度紧张，烦扰，长期过分担忧和过度思虑，有多种神经质的表现，以及与焦虑相关的躯体不适。感到疲乏，衰竭，睡眠障碍，情绪悲观，常有自杀念头及企图。常很懒散，缺乏自信，但比较容易与他人建立亲近的情感联系，常有固定的工作和协调的婚姻。在寻找心理治疗帮助时，病人常诉自己难以集中注意力或管理日常事务。一旦抑郁和焦虑被消除，被试者又会变得积极进取。在精神病人中，大多数诊断：情感障碍，重度抑郁，双相障碍。鉴别诊断：回避，强迫或被动-攻击-依赖人格。";
            }
            if (b[1] == 8) {
                desc = "被试者孤独，绝望，焦虑，激动，紧张，情绪多变，注意力不能集中，睡眠障碍，思维混乱，健忘。常有躯体性症状，有时则是真正的躯体性妄想。不合群，不善交际，敏感，多疑，可能有情感遭受伤害的历史，因此害怕再次受到伤害。有明显的失望及失去自我价值的感觉，可能有妄想及牵连观念，偶尔有幻听。往往有与异性关系中感到不适应，容易出现性冲突。常有自杀念头及企图，少数人还会有预谋的自杀计划或行为。常怕失去自我控制，在寻求帮助时，易表现内在不安。存在情绪不稳，易激动，焦虑及强迫性思维，难于思考问题及集中注意力，解决问题的方式呆板，通常不能有效地处理各种事务。主诉还有睡眠障碍，记忆力减退，衰弱，容易疲劳，头昏。在精神病人中，主要诊断是情感性障碍，70%被试者的诊断是重度情感性障碍、双相障碍、抑郁、重度抑郁。人格障碍：回避，强迫，被动-攻击性人格。";
            }
            if (b[1] == 9) {
                desc = "明显的情绪压抑，烦躁，焦虑，抑郁，激动，可能表现活动过多。来源于三种有明确分类和诊断的病人。1.混合性情感障碍中受激惹的抑郁症病人。2.有认识危机，并可能是自恋的，受激惹的被试者。3.器质性损伤的被试者，仍能意识到器官的丧失并因此抑郁，企图过度补偿这种损伤。在这种情况下，企图否认其缺陷。";
            }
            if (b[1] == 0) {
                desc = "在精神病人中，大多数人存在情感表达障碍，有重度情感障碍，重度抑郁和循环性障碍。主要的鉴别诊断是，适应性障碍伴混合性情感障碍。潜在人格特征回避型人格，往往显示抑郁，敏感的性格特征。";
            }
        }
        if (b[0] == 3) {
            if (b[1] == 2) {
                desc = "如果是妇女，常有婚姻适应障碍，但是很少离婚。有性冷淡，对夫妻性行为没有兴趣。常埋怨丈夫有外遇和酗酒，自我意识，很容易受批评伤害。在内科，具有这种病人大多数只就诊一次，躯体症状虽然没有改变也不再去找医生。却很少抑郁症状，似乎没有自知力。";
            }
            if (b[1] == 4) {
                desc = "被试者通常是有长期冲动性行为历史的人格障碍者，容易恼怒，平时隐藏其敌意及攻击性冲动，往往以被动-攻击方式或通过发作性暴怒反应释放其冲动行为。可能经历过爆发性行为时期，间歇期善交际，合作，友好，但却有心身症候。这种情况往往交替发生。通常有长期的家庭不愉快和长期婚姻问题史。常见多种行为发泄，性问题及性发泄，对药物及酒精嗜好有高度易感性。往往要求受人注意和获得别人的认同，对他人的反对态度极敏感，对向提出要求敏感。通常在一段时间的情绪发泄或过量饮酒后可能发生冲动性自杀企图。躯体疾病包括头痛，胃肠疾病，反复的眩晕发作。有时，与反社会者有着持久的联系，并通过发泄出来。被试者有显著的依赖-自立性冲突，往往有反社会问题。对物质滥用有易感性。大多数诊断是适应性障碍，伴随情绪抑郁或混合情感障碍。人格障碍：表演性或边缘性与被动-攻击人格。";
            }
            if (b[1] == 5) {
                desc = "被试者反复无常，人格不成熟，要求很多。有躯体不适，诸如溃疡病，下背疼痛，头痛，或者有阳痿等，对自己的工作不满意。大多数被诊断为人格障碍，躯体化反应，或者疑病症。";
            }
            if (b[1] == 6) {
                desc = "被试者长期紧张，焦虑，有躯体疾病（ 如头痛，胃肠疾病）。还有长期的，根深蒂固的坏脾气，经常对家庭成员发无名之火。不善于直接表达自身的感受，一般不否认其自身的敌意。当意识到其恼怒时，即以合理化的方式表达。人格僵化，自我中心，容易将自身的问题显露出来。过多应用否认机制，对心理治疗抵触。如果是成年人，婚姻不愉快，不和睦的情况很多，很可能人际关系不良。诊断：情感性障碍，抑郁，适应性障碍，躯体化障碍，偏执性障碍。人格障碍：回避型人格。";
            }
            if (b[1] == 7) {
                desc = "被试者几乎总是表现为神经质，紧张，焦虑，抑郁，容易受到日积月累的应激的损伤。长期精神紧张史，可能主诉睡眠障碍。对自身行为缺乏自知力，过度使用压抑及否认的防御机制，常有心身症候。是焦虑依赖个体，对自身十分苛求。诊断：情感性障碍（抑郁），焦虑性障碍，躯体化障碍，心理因素影响躯体状况。人格障碍：依赖，被动-攻击，回避，强迫人格。";
            }
            if (b[1] == 8) {
                desc = "被试者的心理问题在于思维障碍，可能有妄想，有古怪的躯体不适。有很多心理紊乱表现，甚至对极小的事情也不能作出决定。存在许多精神应激，焦虑，紧张，神经过敏，烦躁，抑郁。情绪焦虑容易以躯体疾病形式表现出来，特别是胃肠道问题，头昏，疼痛，头痛，睡眠障碍。往往有思维障碍及难以集中注意力，分裂样障碍或依赖，强烈地需要他人注意和同情。被试者明显的表现是将其受到的挫折转化至自身，思维习惯与众不同，偶尔有联想散漫，强迫观念，沉思和过分担心。被试者行为退缩，如果存在躯体症候，很可能是继发性的。感到害怕，情感脆弱，忧心忡忡。尽管非常渴望受人注意和同情，却同时害怕情感依赖。如果是大学生，则常优柔寡断，思维混乱，担心，学业不良。诊断：情感性障碍（抑郁），适应性障碍，精神分裂性障碍，躯体化障碍。人格障碍：回避型人格障碍。";
            }
            if (b[1] == 9) {
                desc = "被试者的行为带有表演性，开朗，喜欢社交。有的人可能有急性发作性疾病，或者在躯体疾病的发作期。容易出现急性应激障碍，有焦虑及躯体疾病（如心动过速和头痛）。可能有潜在的抑郁，偶尔存在幻觉。过多应用压抑和否认的防御机制。对某一拒绝过的人显示敌意，又对在性行为上受其吸引和过度依赖的人怀有潜在的敌意。常戏剧性地开朗，情感外露，不能意识这对自身和对他人带来的影响。缺乏自知之明，常有依赖冲突。诊断：情感性障碍，焦虑性障碍，躯体化障碍。人格障碍：被动攻击人格，表演性人格也很常见。";
            }
        }
        if (b[0] == 4) {
            if (b[1] == 3) {
                desc = "被试者不是总能够适当的控制自己的行为，而且具有循环出现的特点。在精神卫生机构，这种病人对拒绝很敏感，控制愤怒的能力很差，有的将愤怒转向自身，出现自杀和酗酒。在司法精神病学鉴定中比较多见，不少人被诊断为边缘性人格障碍，癔症性人格障碍。";
            }
            if (b[1] == 5) {
                desc = "被试者不成熟，自恋，常有强烈的但不被认识的依赖需求并与之抗争。常有性角色识别障碍，对异性的要求过分敏感。尽管不遵从，但很少以吵闹的方式发泄出来，除非在应激状况时或继发于药物或酒精滥用时。内疚感和悔恨感常由外界应激所引起，往往和人际关系问题有关，一般也是暂时性的。对药物及酒精嗜好有高度易感性。这些病人存在的性问题（ 如同性恋），潜在的性冲突或其他性功能障碍。可能是反对清规戒律的，一旦受到良好教育后会热衷于社会事业或社会活动。绝大多数人被认为是被动-攻击性人格障碍。女性更富有攻击性，而男性则更被动和依赖。";
            }
            if (b[1] == 6) {
                desc = "被试者不成熟，对抗，过度敏感，自恋，自我陶醉，人际关系不良，特别是与异性的关系，常有发作性愤怒爆发。常闷闷不乐，易激动，好争辩，常令人讨厌。不满权威，对他人的要求十分敏感。有时报告躯体疾病，如哮喘，高血压，头痛及心脏疾病。与异性的关系上，女性表现非常苛求，依赖他人；男性则表现为苛求和妒忌，对药物及酒精嗜好有高度易感性。与他人在一起感到不舒服，疑心重重--特别对异性。往往有人际关系不良的生活史和工作业绩不良史。敌意，反复无常，多疑，常把自身的问题归之于他人，容易出现违法犯罪问题。在精神病人中，大多数诊断为情感性障碍（ 重度抑郁），物质滥用，约1/3的第二或第三诊断是心理因素影响躯体状况。人格障碍：被动-攻击与表演性，偏执性或分裂型。";
            }
            if (b[1] == 7) {
                desc = "被试者行为矛盾，对他人极不敏感，对自身行为感到内疚。因此，常出现行为发泄，随后对其行为感到非常后悔。如此循环不已。这种内疚和自责常并不足以阻止更进一步的发泄。人格不成熟，情绪反复无常，缺乏安全感。有很高的寻求他人同情的要求，但其情绪变幻莫测和反复无常的行为，却使他人与其疏远。常报告有自卑感，悔恨的时候寻求心理治疗介入，之后又出现发泄行为。经常存在与焦虑相关的躯体疾病（如头痛，胃痛）。还有依赖冲突，缺乏自我价值感。对药物及酒精嗜好有高度易感性，常有性行为问题。寻求治疗的青少年，有行为发泄，反复无常，缺乏安全感，很少有亲密的知心朋友。如果是寻求心理咨询的大学生，大多数人格不成熟，心境灰暗，感到自己低人一等，思维反刍。病人的大多数诊断：情感性障碍（抑郁或双相障碍）。约一半病人存在人格障碍：被动-攻击人格。鉴别诊断：戏剧性人格。约, 1/3的病例是物质滥用者。";
            }
            if (b[1] == 8) {
                desc = "被试者的外表和行为古怪，反复无常，有情感障碍和古怪思维，常有情绪发泄。但是，被试者的情绪发泄通常并不仅为了寻求刺激，而因社会判断能力低下。感到受人排斥，可能在童年时经历过别人的辱骂或者虐待，从小就把世界看得冷酷无情。心存恐惧，情绪不稳定，易有自杀企图。对药物及酒精嗜好有高度易感性。性问题及性行为障碍发生率高，往往有不寻常的行为史。不合群，孤立，同时又强烈要求受人注意和同情，很可能有攻击性暴力发泄，或者发怒时攻击他人。如果是寻求治疗的青少年，其人格不成熟，极度自恋，愤恨，好争辩，在治疗中只有,16%的人得到改善。如果是有犯罪行为的人，其实施的行为让人不可理解，缺乏计划性和预谋，手段残忍，不合情理。有的有药物滥用和酗酒。如果是大学生，倾向于优柔寡断，情绪不悦，担心，思维混乱，与父辈关系紧张。情绪抑郁，头疼，缺乏与异性交往的技巧。如果是住院的精神病人，常有古怪思维和其他精神病性症状，而且存在的时间远比父母所反映的长。可能有自杀观念（应检查4个提示自杀的条目和有关量表）。相当一部分人患精神病性障碍（精神分裂症和情感性障碍），物质滥用或适应性障碍伴抑郁情绪。人格诊断：边缘性，反社会性或表演性人格。";
            }
            if (b[1] == 9) {
                desc = "被试者易冲动，是享乐主义者，反社会者。自我陶醉，自我中心，道德观念差。有多种发泄行为，其动机和目的是寻求刺激，非常渴望兴奋和激动。几乎总是有教育无成就及家庭问题，职业和% 或法律问题。对药物及酒精嗜好有高度易感性。如果是年轻人，从约25岁开始，通常表现为长期的享乐主义，很难改变，预后很差。无责任心，花费许多精力以满足其自身的欲望。当受压制时，容易产生敌意和显示对环境操纵，并且将其合理化。这种青少年不服管教，寻求刺激，逃学，与双亲关系紧张，有可能和自己类似的朋友，有的有药物滥用。容易有反社会行为，好斗，伤害他人。男性多有过量饮酒问题。如果是大学生，学业成绩远不如人们预期应该达到的水平。难以控制攻击，不听规劝。男性往往与父亲有冲突，女性常有家庭冲突，目标茫然不清，缺乏学习动机。如果是一般在校学生，通常学业低下，有的有不良行为；女性大学生有人际关系障碍，但是很少有精神病范畴的问题。如果是被关押的罪犯，除了杀人，很可能还有强奸、放火等暴力犯罪行为。智力高于平均水平，以往很可能有犯罪史。在精神病人中，具容易出现激惹，发怒，对于不适意的事情很容易不安。有的自我中心，情绪不稳，冲动，敌意，对挫折的耐受力很差。占压倒多数的都被认为是反社会性心理变态，或较轻的表演性人格，少数人被诊断为精神病（特别是双相型障碍）。适合于锂盐治疗。75%的病人是物质滥用者。其他诊断是适应性障碍。";
            }
            if (b[1] == 0) {
                desc = "如果是寻求治疗的青少年，多疑，不真诚，反复无常，有大量的愤怒被压制内心，倾向于有情绪发泄。害羞，很少有朋友。缺乏自信，郁闷不乐，有妒忌感，同时在其性格结构上又有回避的方面。感到与别人相处时非常不舒服，人际关系不好。诊断：适应性障碍，物质滥用。人格障碍：被动攻击型人格。如果是精神病人，容易愤怒，敌意，把不幸归于他人。社会判断力和控制冲动的能力很差，不能坚持工作。绝大多数诊断为被动-攻击人格或者依赖型人格障碍。";
            }
        }
        if (b[0] == 5) {
            if (b[1] == 4) {
                desc = "这种男性可能爱发脾气，常加以掩饰后的方式（被动-攻击）表达。如果是男性，缺乏自信，行为和衣着往往公然藐视习俗；如果是女性，则表现与传统女性相反。";
            }
            if (b[1] == 6) {
                desc = "这种青少年喜欢智力性活动，以及财富和物质的占有。容易激惹，有时有暴力和自伤行为。";
            }
            if (b[1] == 7) {
                desc = "如果是男性大学生，常精神紧张，犹豫不决，不高兴，担心，需要他人的保护和保证。陈述学业困难，人际关系不好，特别是和女性和不来。";
            }
            if (b[1] == 8) {
                desc = "这种男性大学生，常报告自己思维混乱，不高兴，与家里人关系不好。";
            }
            if (b[1] == 9) {
                desc = "被试者活动过度，性情浮躁，冲动，常以饮酒缓解焦虑，酒后有高度的暴力倾向。在青少年，更温和，思维合理，有上进心，有很高的抱负和审美兴趣。很少有学校问题，但是表现情绪依赖，缺乏自信，常有多种药物滥用。这种青年男性比较有上进心，有抱负和审美兴趣，很少有学校问题，但是表现情绪依赖，喜欢安静，多愁善感，而且带有明显的强迫性，渴望得到同情和支持。缺乏自信，在社交场合感到不自在，不能得心应手地应对，和异性交往时缺乏技巧，很可能有失恋史。对自身现状不满，对权威人物不满，多抱偏见，有与众不同的想法，有时可能会因此产生情绪焦虑，不安。感到始动性缺乏，情绪低落，提不起精神，常以使用药物或者饮酒缓解焦虑。";
            }
            if (b[1] == 0) {
                desc = "人格不成熟，焦虑，不关心自己的行为仪表。如果是青少年，喜欢智力性活动，但是朋友很少，害羞，胆小，被动。有性冲突，缺乏自信，倾向于过度展现自己的冲动。男性大学生显示明显的内向。";
            }
        }
        if (b[0] == 6) {
            if (b[1] == 4) {
                desc = "这种妇女的特征是，自我中心，敌意，紧张，易受激惹。常以拒绝承认的方式来处理遇到的困难，使用合理化是主要心理防卫机制。";
            }
            if (b[1] == 5) {
                desc = "被试者孤独，警惕，行为冲动，伤害他人，易受激惹，易怒。少数人情绪淡漠，痴笑，有被害观念，明显的幻觉，无自知力。诊断：偏执性障碍或精神病性障碍。";
            }
            if (b[1] == 7) {
                desc = "被试者焦虑，敏感，担心。有人际关系问题，与人保持一定距离，社会判断不良。有时表现与焦虑相关的躯体问题。容易焦虑，抑郁，悲哀，自卑，沉思和内疚，但也怨恨他人。被试者往往不直接表达其敌意。在精神卫生机构咨询的成年人，缺乏自信，感到自己无用，常郁郁寡欢，感到无助，思维混乱。或有慢性躯体性疾病，慢性劳累，恐惧，孤独，优柔寡断，常因不能适应情境而感到失望。缺乏通融性，多疑敏感，抱怨。情绪抑郁、消极观念和性功能障碍，通常都是继发性的。发病时可伴有焦虑，紧张，恐怖等及其他神经症症状；有时还可能伴有被害观念与严重消极思想，甚至自杀；有被害观念，但多事出有因，而非真正的被害妄想，维时也较短暂；平时仍能保持一定的工作能力。大多数被诊断为焦虑性障碍。必须注意帮助他重建自我。对其严重的焦虑、睡眠障碍等，要给予及时的药物治疗。由于心理问题广泛性和慢性倾向，采取任何形式的治疗都很难取得预期疗效。诊断：情感性障碍抑郁，适应性障碍，焦虑障碍，偏执性障碍。人格：回避性人格障碍。";
            }
            if (b[1] == 8) {
                desc = "这种青少年行为古怪，有的有暴力行为，思维不清晰，学业成绩低下，可能经常使用药物。被试者有低劣感和不安全感，多疑，对人缺乏真诚，回避情感涉入。人际关系不稳定，反复无常。集中注意力困难，情绪紧张，记忆困难。对外界缺乏兴趣，情感退缩，喜欢独来独往。可能有思维障碍，幻觉，妄想，敌意，缺乏自知力。可能有攻击性行为，特别是在饮酒后。诊断：精神病性障碍，主要是偏执性精神分裂症，有时被诊断为双相型障碍。鉴别诊断：分裂情感性障碍。人格障碍：边缘人格，偏执及回避性人格。";
            }
            if (b[1] == 9) {
                desc = "被试者易怒，把自己的行为合理化，总是关注某些事情，把自己的所作所为赋予正义性。感到焦虑，紧张，过度控制自己，有时脾气爆发，很可能有危险行为。有强烈的潜在的依赖需求，多疑，警惕别人。不能以适当的方式表达其情感，往往主诉思维和注意力集中困难，易激动，困感，过于理想化。可能存在妄想及幻觉，牵连观念和联想过程障碍。诊断：适应性障碍，情感性障碍（双相），精神分裂症，偏执性障碍。人格障碍：边缘性人格。";
            }
            if (b[1] == 0) {
                desc = "被试者有躯体卑劣感和害羞，退缩，过度敏感，社交不适应。表现遵从，受压制，回避，与别人（尤其是异性）交往困难。诊断：适应性障碍，偏执性障碍。人格障碍：回避性人格。";
            }
        }
        if (b[0] == 7) {
            if (b[1] == 8) {
                desc = "这种青少年过分担心，害羞，焦虑，抑制，思维和行为障碍。男性大学生有自我意识，或者社会不安全感，精神紧张，难以作出决定，可能与母亲和同胞姊妹有冲突；女性，缺乏自信，犹豫不决，社会不安全感，还可能显示精疲力竭和神经质。被试者有思维和注意力集中困难，过分担忧，敏感。如果是住院病人，几乎总是对住院感到不满，精神压抑。有时感到非常迷惑，处于恐惧状态之中。有许多不适当的观念，迟疑不决，缺乏安全感，低劣感，感到自己与传统的性别角色不协调，难以与他人（尤其是异性）建立亲近关系。生活中有丰富的幻想及许多白日梦，常有性冲突及性行为障碍。孤独，抑郁，有与焦虑相关的躯体问题。通常小心谨慎，处理问题时有些死板。有时以过度饮酒以求情绪松弛。可能存在妄想和幻觉，以及人格解体。在医院，大多数被诊断为精神病性障碍（重度抑郁和精神分裂症），有的诊断为适应性障碍，物质滥用。人格：戏剧化，情感性，边缘性或表演性人格。鉴别诊断：分裂性或者分裂型，回避型，被动攻击人格障碍。";
            }
            if (b[1] == 9) {
                desc = "这种青少年过分担心，不能面对现实和没有事实依据的害怕，感到不安全，有强烈的受关注的需求。同时，有明显的情感依赖冲突。如果是大学生，有体重减低，紧张，神经质，猜疑，社会判断不良，思维障碍。大多数被诊断为精神分裂症。被试者焦虑，激动，存在广泛的担忧，常有性行为问题。多疑，紧张，神经质，可能主诉情绪抑郁。不成熟，可能有思维障碍和判断力低下。在出现冲动性和轻率性行为之后，容易继发内疚，烦恼或自责感。人际关系不良。常主诉躯体症状，如背痛，肌痉挛，睡眠障碍。诊断：情感性障碍抑郁，适应性障碍，焦虑障碍，情感性障碍，双相障碍。人格障碍：被动攻击型人格。";
            }
            if (b[1] == 0) {
                desc = "被试者存在严重的广泛性社会适应不良。这种青少年害羞，过度敏感，过分自责，过度控制。不善言谈，缺乏自信和社会技能，害羞。精神紧张，思维混乱，睡眠障碍。";
            }
        }
        if (b[0] == 8) {
            if (b[1] == 5) {
                desc = "被试者过度控制，孤独，可能有精神病家族史和受躯体虐待史。尽管与父母的关系不好，但是常与父母住在一起。很少结婚，看起来似乎无性的欲望。不成熟，在工作中表现被动。女性大多数患有精神病性障碍。";
            }
            if (b[1] == 6) {
                desc = "被试者常有思维混乱，如果没有社会（ 特别是亲属或者关系密切的人）的支持，问题会突显出来。如果是没有结婚的单身，判断能力很差。在精神病人中，往往有攻击行为。女性常有不同寻常的思维和妄想，猜疑。男性病人可能有反社会行为，敌意，攻击，过度敏感，可能有犯罪记录和物质滥用。如果是司法精神病学鉴定的被试者，这种人容易发怒，很少有情绪抑郁，很古怪。受教育水平低下，很可能被作为少年犯罪被拘留过。大多数没有结婚，往往有盗窃行为，屡教不改。有的有幻觉和自杀史。多被诊断为反社会型人格障碍。";
            }
            if (b[1] == 7) {
                desc = "被试者有长期存在的不适当情感、低劣感和不安全感，感到在家里是低人一等的成员。有的是明确的精神病人。因为不成熟，反复无常，对治疗不合作，难以取得预期疗效。";
            }
            if (b[1] == 9) {
                desc = "被试者有严重的精神病理活动，思维混乱，言语不清。处于严重的突发事件压力之下，难以与医生合作。很可能有敌意,偏执，意念飘忽，情绪不稳，没有羞耻感。有非现实的敌意，容易受激惹。与异性相处时感到不舒适，性适应困难。在大学咨询中，常述自己感到不高兴，思维不清，担心，不安。被试者通常处于活动过度和不安定的急性激越状态，犹豫不决，紧张，有敌意，易激动。情感不稳定，不现实，常有夸大妄想，缺乏自知力。害怕或回避亲近的人际关系，不信任他人，同时又渴望受人注意，如不能得到同情则容易陷入烦恼。与异性交往有困难，有严重的性冲突及性适应能力障碍。经常有心烦意乱，在极端的情况下不能定向，困惑，有妄想和幻觉，在应激情况下容易出现精神崩溃。虽然有达到高目标的强烈愿望，但的成绩很平常。容易有不适应感及自卑感，有教育和职业问题，社会关系也受到破坏。诊断：双相性障碍，精神分裂症。";
            }
            if (b[1] == 0) {
                desc = "被试者回避人际关系，孤独，不愿意参加社交活动。感到受他人排斥，情绪抑郁，焦虑，可能有思维紊乱和睡眠障碍，难以与他人建立密切的人际关系。过分多疑，敏感，常在幻想和白日梦中消磨时光。诊断：适应性障碍，精神分裂性障碍。人格障碍：回避性人格障碍。";
            }
        }
        if (b[0] == 9) {
            if (b[1] == 1) {
                desc = "被试者处于急性应激状态，情绪紧张，不安，热切期望对某些问题的解决，常因为达不到高水准的目标感到受挫折。躯体不适（多为消化道问题和头疼）。";
            }
            if (b[1] == 2) {
                desc = "被试者的情绪抑郁不同寻常，主要问题是激越性抑郁。过度活动具有容易疲乏的特点，当感到不能达到目的时就会感到一落千丈。";
            }
        }
        if (b[0] == 0) {
            if (b[1] == 1) {
                desc = "被试者害羞，犹豫不决，可能有一些躯体不适。";
            }
            if (b[1] == 2) {
                desc = "在精神病人中，大多数人存在情感表达障碍，有重度情感障碍，重度抑郁和循环性障碍。主要的鉴别诊断是，适应性障碍伴混合性情感障碍。潜在人格特征回避型人格，往往显示抑郁，敏感的性格特征。";
            }
        }

        //返回值以及存数据库格式
        List<NewResultDto> newResultDtos = new ArrayList<>();
        resultMap0.put("总分", df.format(score));
        resultJson.put("总分", df.format(score));
        //如果没有总分这一栏，需要手动赋值返回
        newResultDtos.add(new NewResultDto("总分", df.format(score), "无", desc,
                    "无", "无", "无", "无", "是"));
        //将量表总维度根据维度名称进行分组
        Map<String, List<ScaleMarksEntity>> scaleMarksMap = scaleMarksEntities.stream().collect(Collectors.groupingBy(ScaleMarksEntity::getName));
        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.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[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.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);
    }

    private WarnEntity createWarnEntry(String flag,  String institutionNo, String userId, String id, double score) {
        WarnEntity warn = new WarnEntity();

        warn.setFlag(flag);
        warn.setInstitutionNo(institutionNo);
        warn.setUserId(userId);
        warn.setDimensionId(id);
        warn.setScore(String.valueOf(score));
        return warn;
    }
}
