diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java index 540bc77..04a215d 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/CacheNames.java @@ -65,10 +65,11 @@ public interface CacheNames { */ String ONLINE_TOKEN = "online_tokens"; String SYS_QUESTION_ANSWER = "scale:question_answer"; + String SYS_ANSWER = "scale:answer#30d"; + String SYS_SCALE_FACTOR = "scale:factor"; - String SYS_SCALE_FACTOR = "scale:factor"; + String MAP_SCALE_QUESTION = "scale:map:question"; + String MAP_SCALE_ANSWER = "scale:map:answer"; - String MAP_SCALE_QUESTION = "scale:map:question"; - String MAP_SCALE_ANSWER = "scale:map:answer"; } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/constant/MBTICharEnum.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/constant/MBTICharEnum.java new file mode 100644 index 0000000..f9237c1 --- /dev/null +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/constant/MBTICharEnum.java @@ -0,0 +1,41 @@ +package org.dromara.scale.constant; + +import org.dromara.common.core.utils.StringUtils; + +public enum MBTICharEnum { + /** + * + */ + E( "E"), + I( "I"), + S( "S"), + N( "N"), + T( "T"), + F( "F"), + J( "J"), + P( "P"); + + private final String name; + + MBTICharEnum( String name) { + + this.name = name; + } + + public String getName() { + return this.name; + } + public static MBTICharEnum getByName(String name) { + if (StringUtils.isEmpty(name)) { + return null; + } + MBTICharEnum[] flagEnum = MBTICharEnum.values(); + for (int i = 0; i < flagEnum.length; i++){ + if(flagEnum[i].getName().equals(name)){ + return flagEnum[i]; + } + } + return null; + } + +} diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysScaleAnswer.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysScaleAnswer.java index 35cdaea..aa96ec6 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysScaleAnswer.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/SysScaleAnswer.java @@ -46,6 +46,11 @@ public class SysScaleAnswer { */ private BigDecimal score; + /** + * 得分类型 + */ + private String scoreType; + /** * 展示类型 */ diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/bo/SysScaleAnswerBo.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/bo/SysScaleAnswerBo.java index 2589ea7..1f0d13d 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/bo/SysScaleAnswerBo.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/bo/SysScaleAnswerBo.java @@ -50,6 +50,12 @@ public class SysScaleAnswerBo { @NotNull(message = "得分不能为空", groups = {AddGroup.class, EditGroup.class}) private BigDecimal score; + /** + * 得分类型 + */ + private String scoreType; + + /** * 展示类型 */ diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScaleAnswerVo.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScaleAnswerVo.java index 329426f..8dce839 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScaleAnswerVo.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/vo/SysScaleAnswerVo.java @@ -50,6 +50,11 @@ public class SysScaleAnswerVo implements Serializable { @ExcelProperty(value = "得分") private BigDecimal score; + /** + * 得分类型 + */ + private String scoreType; + /** * 展示选择 */ diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleAnswerService.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleAnswerService.java index 76a63c9..6fcbac8 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleAnswerService.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleAnswerService.java @@ -18,4 +18,6 @@ public interface ISysScaleAnswerService { Map> getScaleAnswerMap(Long scaleId); + SysScaleAnswerVo queryQuestionAnswerById(Long answerId); + } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationRecordServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationRecordServiceImpl.java index efd5847..f4f50cb 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationRecordServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationRecordServiceImpl.java @@ -174,9 +174,11 @@ public class SysEvaluationRecordServiceImpl implements ISysEvaluationRecordServi answerScore = answerScore + "↑"; range.append(minValue.doubleValue()); } - } else { + } else if (maxFlag) { range.append(maxValue.doubleValue()); answerScore = answerScore + "↓"; + } else { + range.append("无"); } //处理因子得分表格 RowRenderData one = Rows.of(factorName, answerVo.getQuestionNum().toString(), diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleAnswerServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleAnswerServiceImpl.java index 8cb67b7..b7def32 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleAnswerServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleAnswerServiceImpl.java @@ -63,11 +63,18 @@ public class SysScaleAnswerServiceImpl implements ISysScaleAnswerService { } return questionAnswerVos; } + @Cacheable(cacheNames = CacheNames.MAP_SCALE_ANSWER, key = "#scaleId") @Override - public Map> getScaleAnswerMap(Long scaleId) { + public Map> getScaleAnswerMap(Long scaleId) { List scaleAnswerVos = baseMapper.selectVoList( new LambdaQueryWrapper().eq(SysScaleAnswer::getScaleId, scaleId)); return scaleAnswerVos.stream().collect(Collectors.groupingBy(e -> e.getQuestionId().toString())); } + + @Cacheable(cacheNames = CacheNames.SYS_ANSWER, key = "#answerId") + @Override + public SysScaleAnswerVo queryQuestionAnswerById(Long answerId) { + return baseMapper.selectVoById(answerId); + } } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java index 04353aa..161e0b3 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java @@ -10,10 +10,7 @@ import org.dromara.common.core.enums.UserType; import org.dromara.common.core.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.scale.constant.ScaleDimensionEnum; -import org.dromara.scale.constant.ScoreRuleTypeEnum; -import org.dromara.scale.constant.SituationEnum; -import org.dromara.scale.constant.StatusEnum; +import org.dromara.scale.constant.*; import org.dromara.scale.domain.*; import org.dromara.scale.domain.bo.SubmitAnswerBo; import org.dromara.scale.domain.bo.SysEvaluationAnswerBo; @@ -30,6 +27,7 @@ import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.util.*; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -142,6 +140,7 @@ public class WebServiceImpl implements IWebService { } boolean allowQueryResult = true; Long scaleId = bo.getScaleId(); + SysScale sysScale = scaleMapper.selectById(scaleId); Map> answerMapByQuestion = scaleAnswerService.getScaleAnswerMap(scaleId); int keySize = answerMapByQuestion.keySet().size(); if (ObjectUtil.isEmpty(answerList)) { @@ -159,8 +158,15 @@ public class WebServiceImpl implements IWebService { } List answerAdd = MapstructUtils.convert(answerList, SysEvaluationAnswer.class); evaluationAnswerMapper.insertBatch(answerAdd); - //计算 - List list = calculateEvaluationResult(scaleId, answerList); + // + List list; + if (sysScale.getScaleName().contains("MBTI")) { + //MBTI 另外处理 + list = calculateMBTIResult(scaleId, answerList); + } else { + //计算 + list = calculateEvaluationResult(scaleId, answerList); + } List conclusionAdd = MapstructUtils.convert(list, SysEvaluationConclusion.class); evaluationConclusionMapper.insertBatch(conclusionAdd); //更新记录表完成 @@ -210,7 +216,9 @@ public class WebServiceImpl implements IWebService { private List calculateEvaluationResult(Long scaleId, List answerList) { Long recordId = answerList.get(0).getRecordId(); //暂时使用string解决redis转换问题 + //key为factorId Map> questionMapByFactor = scaleFactorService.getQuestionMapByFactor(scaleId); + //key为questionID Map> answerMapByQuestion = scaleAnswerService.getScaleAnswerMap(scaleId); List scaleFactorList = scaleFactorService.getScaleEvalItemList(scaleId); @@ -303,7 +311,7 @@ public class WebServiceImpl implements IWebService { } } //假如未对应上说明这个量表配置有问题联系管理员 - if(Objects.isNull(evalConclusion.getFactorRangeId())){ + if (Objects.isNull(evalConclusion.getFactorRangeId())) { throw new ServiceException("量表配置项有问题,请联系管理员检查!"); } if (used.contains(evalConclusion.getSituation())) { @@ -375,4 +383,69 @@ public class WebServiceImpl implements IWebService { break; } } + + private List calculateMBTIResult(Long scaleId, List answerList) { + Long recordId = answerList.get(0).getRecordId(); + //key为questionID + ConcurrentHashMap charNumMap = new ConcurrentHashMap<>(8); + for (MBTICharEnum one : MBTICharEnum.values()) { + charNumMap.put(one.getName(), 0); + } + for (SysEvaluationAnswerBo evaluationAnswer : answerList) { + SysScaleAnswerVo answer = scaleAnswerService.queryQuestionAnswerById(evaluationAnswer.getAnswerId()); + String scoreType = answer.getScoreType(); + MBTICharEnum charByNum = MBTICharEnum.getByName(scoreType); + if (ObjectUtil.isEmpty(charByNum)) { + throw new ServiceException("量表配置项有问题,请联系管理员检查!"); + } + Integer num = charNumMap.get(scoreType); + charNumMap.put(scoreType, num + 1); + } + List resultList = new ArrayList<>(4); + Integer eNum = charNumMap.get(MBTICharEnum.E.getName()); + Integer iNum = charNumMap.get(MBTICharEnum.I.getName()); + boolean a = eNum > iNum ? resultList.add(MBTICharEnum.E.getName()) : resultList.add(MBTICharEnum.I.getName()); + Integer sNum = charNumMap.get(MBTICharEnum.S.getName()); + Integer nNum = charNumMap.get(MBTICharEnum.N.getName()); + boolean b = sNum > nNum ? resultList.add(MBTICharEnum.S.getName()) : resultList.add(MBTICharEnum.N.getName()); + Integer tNum = charNumMap.get(MBTICharEnum.T.getName()); + Integer fNum = charNumMap.get(MBTICharEnum.F.getName()); + boolean c = tNum > fNum ? resultList.add(MBTICharEnum.T.getName()) : resultList.add(MBTICharEnum.F.getName()); + Integer jNum = charNumMap.get(MBTICharEnum.J.getName()); + Integer pNum = charNumMap.get(MBTICharEnum.P.getName()); + boolean d = jNum > pNum ? resultList.add(MBTICharEnum.J.getName()) : resultList.add(MBTICharEnum.P.getName()); + + String collect = resultList.stream().sorted().collect(Collectors.joining()); + List scaleFactorList = scaleFactorService.getScaleEvalItemList(scaleId); + List list = new ArrayList<>(1); + for (SysScaleFactorVo scaleFactor : scaleFactorList) { + + String factorName = scaleFactor.getFactorName().trim(); + String split = Arrays.stream(factorName.split("")).sorted().collect(Collectors.joining()); + if (Objects.equals(collect, split)) { + SysEvaluationConclusionVo evalConclusion = new SysEvaluationConclusionVo(); + evalConclusion.setFactorName(scaleFactor.getFactorName()); + evalConclusion.setFactorId(scaleFactor.getFactorId()); + evalConclusion.setRecordId(recordId); + evalConclusion.setStatus(StatusEnum.IN_USE.getValue()); + evalConclusion.setScore(BigDecimal.ZERO); + evalConclusion.setScoreRate(BigDecimal.ZERO); + evalConclusion.setWarnStatus(StatusEnum.DISABLED.getValue()); + List factorRangeList = scaleFactor.getFactorRangeList(); + if (factorRangeList.size() == 1) { + evalConclusion.setEvalDesc(factorRangeList.get(0).getEvalDesc()); + evalConclusion.setEvalPropose(factorRangeList.get(0).getEvalPropose()); + evalConclusion.setFactorRangeId(factorRangeList.get(0).getRangeId()); + evalConclusion.setSituation(factorRangeList.get(0).getSituation()); + evalConclusion.setSituationName(SituationEnum.getNameByCode(factorRangeList.get(0).getSituation())); + } else { + throw new ServiceException("量表配置项有问题,请联系管理员检查!"); + } + list.add(evalConclusion); + break; + } + } + return list; + } + }