diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/web/WebController.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/web/WebController.java index 559ebf5..1506912 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/web/WebController.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/controller/web/WebController.java @@ -13,10 +13,7 @@ import org.dromara.scale.domain.bo.SysEvaluationAnswerBo; import org.dromara.scale.domain.bo.SysEvaluationRecordBo; import org.dromara.scale.domain.vo.QuestionAnswerVo; import org.dromara.scale.domain.vo.SysScalePublishVo; -import org.dromara.scale.service.ISysEvaluationConclusionService; -import org.dromara.scale.service.ISysEvaluationRecordService; -import org.dromara.scale.service.ISysScaleAnswerService; -import org.dromara.scale.service.ISysScalePublishService; +import org.dromara.scale.service.*; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -36,13 +33,7 @@ import java.util.Map; @RequestMapping("/web/scale") public class WebController extends BaseController { - private final ISysScalePublishService scalePublishService; - - private final ISysEvaluationRecordService evaluationRecordService; - - private final ISysScaleAnswerService scaleAnswerService; - - private final ISysEvaluationConclusionService evaluationConclusionService; + private final IWebService webService; /** @@ -50,7 +41,7 @@ public class WebController extends BaseController { */ @GetMapping("/publish") public R queryPublish() { - return R.ok(scalePublishService.queryPublishScale()); + return R.ok(webService.queryPublishScale()); } /** @@ -59,7 +50,7 @@ public class WebController extends BaseController { @GetMapping("/answer/{id}") public R> queryAnswer(@NotNull(message = "主键不能为空") @PathVariable Long id) { - return R.ok(scaleAnswerService.queryQuestionAnswerListByScaleId(id)); + return R.ok(webService.queryQuestionAnswerListByScaleId(id)); } /** @@ -69,7 +60,7 @@ public class WebController extends BaseController { @RepeatSubmit() @PostMapping("/record") public R addRecord(@Validated(AddGroup.class) @RequestBody SysEvaluationRecordBo bo) { - return R.ok(evaluationRecordService.insertByBo(bo)); + return R.ok(webService.newRecord(bo)); } /** @@ -82,6 +73,6 @@ public class WebController extends BaseController { if (ArrayUtil.isEmpty(answerList)) { R.fail("请先填写,再提交"); } - return R.ok(evaluationConclusionService.submitAnswer(answerList)); + return R.ok(webService.submitAnswer(answerList)); } } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/bo/SysScaleBo.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/bo/SysScaleBo.java index 2cd7a57..875465e 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/bo/SysScaleBo.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/domain/bo/SysScaleBo.java @@ -65,7 +65,7 @@ public class SysScaleBo extends BaseEntity { /** * 状态(0停用 1正常) */ - @NotBlank(message = "状态(0停用 1正常)不能为空", groups = {AddGroup.class, EditGroup.class}) + @NotNull(message = "状态(0停用 1正常)不能为空", groups = {AddGroup.class, EditGroup.class}) private Integer status; /** diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysEvaluationConclusionService.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysEvaluationConclusionService.java index 23d2e4f..33e5ce2 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysEvaluationConclusionService.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysEvaluationConclusionService.java @@ -2,12 +2,10 @@ package org.dromara.scale.service; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.scale.domain.bo.SysEvaluationAnswerBo; import org.dromara.scale.domain.bo.SysEvaluationConclusionBo; import org.dromara.scale.domain.vo.SysEvaluationConclusionVo; import java.util.List; -import java.util.Map; /** * 量测结果Service接口 @@ -32,5 +30,4 @@ public interface ISysEvaluationConclusionService { */ List queryList(SysEvaluationConclusionBo bo); - Map submitAnswer(List answerList); } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysEvaluationRecordService.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysEvaluationRecordService.java index 41ae068..0849d51 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysEvaluationRecordService.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysEvaluationRecordService.java @@ -30,10 +30,6 @@ public interface ISysEvaluationRecordService { */ List queryList(SysEvaluationRecordBo bo); - /** - * 新增量测记录 - */ - Long insertByBo(SysEvaluationRecordBo bo); } 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 2460230..a79023d 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 @@ -6,8 +6,8 @@ import org.dromara.scale.domain.bo.SysScaleAnswerBo; import org.dromara.scale.domain.vo.QuestionAnswerVo; import org.dromara.scale.domain.vo.SysScaleAnswerVo; -import java.util.Collection; import java.util.List; +import java.util.Map; /** * 选项信息Service接口 @@ -32,21 +32,10 @@ public interface ISysScaleAnswerService { */ List queryList(SysScaleAnswerBo bo); - /** - * 新增选项信息 - */ - Boolean insertByBo(SysScaleAnswerBo bo); - /** - * 修改选项信息 - */ - Boolean updateByBo(SysScaleAnswerBo bo); - - /** - * 校验并批量删除选项信息信息 - */ - Boolean deleteWithValidByIds(Collection ids, Boolean isValid); List queryQuestionAnswerListByScaleId(Long scaleId); + Map> getScaleAnswerMap(Long scaleId); + } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleFactorService.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleFactorService.java index e60768d..b63022a 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleFactorService.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleFactorService.java @@ -46,5 +46,5 @@ public interface ISysScaleFactorService { */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - int updateSelectQuestion(SysScaleFactorBo bo); + List getScaleEvalItemList(Long scaleId); } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleQuestionService.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleQuestionService.java index ef8ab15..3bf8666 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleQuestionService.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/ISysScaleQuestionService.java @@ -1,13 +1,13 @@ package org.dromara.scale.service; -import org.dromara.scale.domain.SysScaleQuestion; -import org.dromara.scale.domain.vo.SysScaleQuestionVo; -import org.dromara.scale.domain.bo.SysScaleQuestionBo; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.scale.domain.bo.SysScaleQuestionBo; +import org.dromara.scale.domain.vo.SysScaleQuestionVo; import java.util.Collection; import java.util.List; +import java.util.Map; /** * 量问题内容Service接口 @@ -46,4 +46,6 @@ public interface ISysScaleQuestionService { * 校验并批量删除量问题内容信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Map> getScaleQuestionMap(Long scaleId); } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/IWebService.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/IWebService.java new file mode 100644 index 0000000..0e0a9a1 --- /dev/null +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/IWebService.java @@ -0,0 +1,20 @@ +package org.dromara.scale.service; + +import org.dromara.scale.domain.bo.SysEvaluationAnswerBo; +import org.dromara.scale.domain.bo.SysEvaluationRecordBo; +import org.dromara.scale.domain.vo.QuestionAnswerVo; +import org.dromara.scale.domain.vo.SysScalePublishVo; + +import java.util.List; +import java.util.Map; + +public interface IWebService { + + SysScalePublishVo queryPublishScale(); + + List queryQuestionAnswerListByScaleId(Long scaleId); + + Long newRecord(SysEvaluationRecordBo bo); + + Map submitAnswer(List answerList); +} diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationConclusionServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationConclusionServiceImpl.java index d1efab9..fbd636e 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationConclusionServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysEvaluationConclusionServiceImpl.java @@ -1,33 +1,20 @@ package org.dromara.scale.service.impl; -import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; -import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; -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.domain.*; -import org.dromara.scale.domain.bo.SysEvaluationAnswerBo; +import org.dromara.scale.domain.SysEvaluationConclusion; import org.dromara.scale.domain.bo.SysEvaluationConclusionBo; -import org.dromara.scale.domain.vo.*; +import org.dromara.scale.domain.vo.SysEvaluationConclusionVo; import org.dromara.scale.mapper.*; import org.dromara.scale.service.ISysEvaluationConclusionService; -import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import java.math.BigDecimal; import java.math.MathContext; -import java.math.RoundingMode; -import java.util.*; -import java.util.concurrent.atomic.AtomicReference; -import java.util.stream.Collectors; +import java.util.List; /** * 量测结果Service业务层处理 @@ -39,7 +26,7 @@ import java.util.stream.Collectors; @Service public class SysEvaluationConclusionServiceImpl implements ISysEvaluationConclusionService { - private static final MathContext mathContext = new MathContext(2); + private final MathContext mathContext = new MathContext(2); private final SysEvaluationConclusionMapper baseMapper; @@ -103,248 +90,4 @@ public class SysEvaluationConclusionServiceImpl implements ISysEvaluationConclus private void validEntityBeforeSave(SysEvaluationConclusion entity) { //TODO 做一些数据校验,如唯一约束 } - - @Override - public Map submitAnswer(List answerList) { - boolean allowQueryResult = true; - Long recordId = answerList.get(0).getRecordId(); - SysScalePublishVo scalePublishVo = recordMapper.selectPublishByUseRecord(recordId); - //查询考核结果 - if (scalePublishVo.getAllowQueryResult() == 0) { - allowQueryResult = false; - } - List answerAdd = MapstructUtils.convert(answerList, SysEvaluationAnswer.class); - evaluationAnswerMapper.insertBatch(answerAdd); - - List list = calculateEvaluationResult(answerList); - List conclusionAdd = MapstructUtils.convert(list, SysEvaluationConclusion.class); - baseMapper.insertBatch(conclusionAdd); - - Integer riskLevel = -1; - String riskName = ""; - //选择风险等级最高 - for (SysEvaluationConclusionVo ec : list) { - if (ec.getSituation() > riskLevel) { - riskLevel = ec.getSituation(); - riskName = ec.getSituationName(); - } - } - //判断风险等级是否为"高风险、重大风险",若是,则形成预警记录 -// if(riskName.equals("高风险") || riskName.equals("重大风险")){ -// WarnRecordEval wre = new WarnRecordEval(); -// wre.setId(idWorker.nextId()); -// wre.setErId(evalRecord.getId()); -// wre.setRiskLevel(riskName); -// wre.setUserId(evalRecord.getEvalUid()); -// wre.setScaleId(evalRecord.getScaleId()); -// wre.setTenantNo(sysUser.getTenantNo()); -// warnRecordDAO.evalWarn(wre); -// } - //不允许查看考核结果 - if (!allowQueryResult) { - return null; - } - - BigDecimal totalScore = list.stream() - // 将Opportunity对象的金额属性取出 - .map(SysEvaluationConclusionVo::getScore) - // 使用reduce()聚合函数,得到金额总和 - .reduce(BigDecimal.ZERO, BigDecimal::add); - return new HashMap() {{ - //put("evalRecordId",evalRecord.getId()); - //put("scaleName",scaleInfo.getName()); - put("totalScore", totalScore.doubleValue()); - put("list", list.stream().filter(item -> item.getStatus().equals(StatusEnum.IN_USE.getValue())).collect( - Collectors.toList())); - }}; - } - - private List calculateEvaluationResult(List answerList) { - Long recordId = answerList.get(0).getRecordId(); - SysEvaluationRecordVo recordVo = recordMapper.selectVoById(recordId); - Long scaleId = recordVo.getScaleId(); - - Map> questionMapByFactor = getScaleQuestionMap(scaleId); - Map> answerMapByQuestion = getScaleAnswerMap(scaleId); - - List scaleFactorList = getScaleEvalItemList(scaleId); - List list = new ArrayList<>(scaleFactorList.size()); - for (SysScaleFactorVo scaleFactor : scaleFactorList) { - Long factorId = scaleFactor.getFactorId(); - AtomicReference totalSocre = new AtomicReference<>(BigDecimal.ZERO); - - SysEvaluationConclusionVo evalConclusion = new SysEvaluationConclusionVo(); - evalConclusion.setFactorId(factorId); - evalConclusion.setRecordId(recordId); - evalConclusion.setStatus(StatusEnum.DISABLED.getValue()); - evalConclusion.setScore(BigDecimal.ZERO); - list.add(evalConclusion); - - List questionNum = questionMapByFactor.get(factorId); - List questionIds = new ArrayList<>(); - questionNum.forEach(q -> { - Long questionId = q.getQuestionId(); - questionIds.add(questionId); - List answerNum = answerMapByQuestion.get(questionId); - if (!ArrayUtil.isEmpty(answerNum)) { - //找出分数最大的选项 - BigDecimal s = answerNum.stream() - .max(Comparator.comparing(SysScaleAnswerVo::getScore)).get().getScore(); - totalSocre.updateAndGet(v -> v.add(s)); - SysEvaluationAnswerBo evaluationAnswer = answerList.stream() - .filter(answer -> questionId.equals(answer.getQuestionId())).findFirst().orElse(null); - if (evaluationAnswer != null) { - answerNum.stream().filter(o -> o.getAnswerId().equals(evaluationAnswer.getAnswerId())).findFirst() - .ifPresent( - m -> evalConclusion.setScore(m.getScore().add(evalConclusion.getScore()))); - } - } - }); - scaleFactor.setQuestionIds(questionIds); - //计算得分率 - - if (totalSocre.get().compareTo(BigDecimal.ZERO) > 0) { - evalConclusion.setScoreRate(evalConclusion.getScore() - .multiply(new BigDecimal(100)).divide(totalSocre.get()).setScale(2, RoundingMode.HALF_UP)); - } - //计算量表加强后得分 - calcScoreByRuleType(evalConclusion, scaleFactor); - //根据将强后的分数划分到对应的范围上 - //根据将强后的分数划分到对应的范围上 - 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()); - } else { - for (SysScaleFactorRangeVo range : factorRangeList) { - if (Objects.nonNull(range.getMinValue()) && Objects.nonNull(range.getMaxValue())) { - if (evalConclusion.getScore().compareTo(range.getMinValue()) >= 0 - && evalConclusion.getScore().compareTo(range.getMaxValue()) <= 0) { - evalConclusion.setEvalDesc(range.getEvalDesc()); - evalConclusion.setEvalPropose(range.getEvalPropose()); - evalConclusion.setFactorRangeId(range.getRangeId()); - evalConclusion.setSituation(range.getSituation()); - evalConclusion.setSituationName(SituationEnum.getNameByCode(range.getSituation())); - break; - } - } else { - //最大值不是空,最小值是空 - if (Objects.nonNull(range.getMaxValue()) && Objects.isNull(range.getMinValue())) { - if (evalConclusion.getScore().compareTo(range.getMaxValue()) <= 0) { - evalConclusion.setEvalDesc(range.getEvalDesc()); - evalConclusion.setEvalPropose(range.getEvalPropose()); - evalConclusion.setFactorRangeId(range.getRangeId()); - evalConclusion.setSituation(range.getSituation()); - evalConclusion.setSituationName(SituationEnum.getNameByCode(range.getSituation())); - break; - } - } else if (Objects.nonNull(range.getMinValue()) && Objects.isNull(range.getMaxValue())) { - //最大值为空,最小值不为空 - if (evalConclusion.getScore().compareTo(range.getMinValue()) >= 0) { - evalConclusion.setEvalDesc(range.getEvalDesc()); - evalConclusion.setEvalPropose(range.getEvalPropose()); - evalConclusion.setFactorRangeId(range.getRangeId()); - evalConclusion.setSituation(range.getSituation()); - evalConclusion.setSituationName(SituationEnum.getNameByCode(range.getSituation())); - break; - } - } //else { -// logger.error("量表scaleId = {},配置项={} 配置的范围超过1条,但是存在配置范围最大最小值都为null", -// evalSubmitAnswerDto.getScaleId(), scaleEvalItem.getId()); -// throw new EdfRuntimeException("量表配置项有问题,请联系管理员检查!"); -// } - } - } - } - } - //处理维度问题及status - //量表 - SysScale scaleInfo = scaleMapper.selectById(scaleId); - scaleDimension(list, scaleInfo); - //保存结果 - return list; - } - @Cacheable(cacheNames = CacheNames.MAP_SCALE_QUESTION, key = "#scaleId") - public Map> getScaleQuestionMap(Long scaleId) { - List scaleQuestionVos = scaleQuestionMapper.selectVoList( - new LambdaQueryWrapper().eq(SysScaleQuestion::getScaleId, scaleId)); - return scaleQuestionVos.stream().collect(Collectors.groupingBy(SysScaleQuestionVo::getFactorId)); - } - @Cacheable(cacheNames = CacheNames.MAP_SCALE_ANSWER, key = "#scaleId") - public Map> getScaleAnswerMap(Long scaleId) { - List scaleAnswerVos = scaleAnswerMapper.selectVoList( - new LambdaQueryWrapper().eq(SysScaleAnswer::getScaleId, scaleId)); - return scaleAnswerVos.stream().collect(Collectors.groupingBy(SysScaleAnswerVo::getQuestionId)); - } - @Cacheable(cacheNames = CacheNames.SYS_SCALE_FACTOR, key = "#scaleId") - public List getScaleEvalItemList(Long scaleId) { - List scaleFactorVos = scaleFactorMapper.selectVoList( - new LambdaQueryWrapper().eq(SysScaleFactor::getScaleId, scaleId)); - List scaleFactorRangeVos = scaleFactorRangeMapper.selectVoList( - new LambdaQueryWrapper().eq(SysScaleFactorRange::getScaleId, scaleId)); - if (!ArrayUtil.isEmpty(scaleFactorVos) && !ArrayUtil.isEmpty(scaleFactorRangeVos)) { - Map> map = scaleFactorRangeVos.stream() - .collect(Collectors.groupingBy(SysScaleFactorRangeVo::getFactorId)); - scaleFactorVos.forEach(item -> item.setFactorRangeList(map.get(item.getFactorId()))); - } - return scaleFactorVos; - } - - private void calcScoreByRuleType(SysEvaluationConclusionVo evalConclusion, SysScaleFactorVo scaleFactor) { - ScoreRuleTypeEnum scoleRuleTypeEnum = ScoreRuleTypeEnum.getByCode(scaleFactor.getRuleType()); - if (Objects.isNull(scoleRuleTypeEnum)) { - return; - } - switch (scoleRuleTypeEnum) { - case SUM_TYPE: - evalConclusion.setScore(evalConclusion.getScore().multiply(scaleFactor.getWeight(), mathContext)); - break; - case AVG_TYPE: - BigDecimal sum = evalConclusion.getScore().multiply(scaleFactor.getWeight(), mathContext); - int size = scaleFactor.getQuestionIds().size(); - //均值四舍五入2位小数 - BigDecimal avgScore = sum.divide(new BigDecimal(size), 2, RoundingMode.HALF_UP); - evalConclusion.setScore(avgScore); - break; - case SUM_INT_TYPE: - BigDecimal sum2 = evalConclusion.getScore().multiply(scaleFactor.getWeight(), mathContext); - evalConclusion.setScore(sum2); - break; - default: - break; - } - } - - private void scaleDimension(List evalConclusions, SysScale scaleInfo) { - ScaleDimensionEnum scaleDimensionEnum = ScaleDimensionEnum.getByCode(scaleInfo.getDimensionType()); - if (Objects.isNull(scaleDimensionEnum)) { - //throw new EdfRuntimeException("暂不支持该维度"); - return; - } - switch (scaleDimensionEnum) { - case SING_SING: - if (evalConclusions.size() > 1) { - //log.error("{} - 量表维度配置有误,单项单维量表配置了多个维度",scaleInfo.getName()); - //throw new EdfRuntimeException(String.format("%s 量表配置有误!,请联系管理员!",scaleInfo.getName())); - break; - } - evalConclusions.forEach(item -> item.setStatus(StatusEnum.IN_USE.getValue())); - break; - case MULTIPE_SINGL: - //择低录取 - if (scaleInfo.getSelectDirection() == 1) { - evalConclusions.stream().min(Comparator.comparing(SysEvaluationConclusionVo::getScore)).get().setStatus(StatusEnum.IN_USE.getValue()); - } else { - //高分录取 - evalConclusions.stream().max(Comparator.comparing(SysEvaluationConclusionVo::getScore)).get().setStatus(StatusEnum.IN_USE.getValue()); - } - break; - case MULTIPE_MULTIPE: - evalConclusions.forEach(item -> item.setStatus(1)); - break; - default: - break; - } - } } 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 5186ff2..16d8d90 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 @@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.scale.domain.SysEvaluationRecord; @@ -15,11 +13,8 @@ import org.dromara.scale.mapper.SysEvaluationRecordMapper; import org.dromara.scale.service.ISysEvaluationRecordService; import org.springframework.stereotype.Service; -import java.util.Date; import java.util.List; -import static org.dromara.common.satoken.utils.LoginHelper.getLoginUser; - /** * 量测记录Service业务层处理 * @@ -68,33 +63,4 @@ public class SysEvaluationRecordServiceImpl implements ISysEvaluationRecordServi return lqw; } - /** - * 新增量测记录 - */ - @Override - public Long insertByBo(SysEvaluationRecordBo bo) { - LoginUser loginUser = getLoginUser(); - SysEvaluationRecord add = MapstructUtils.convert(bo, SysEvaluationRecord.class); - add.setUserId(loginUser.getUserId()); - add.setCreateTime(new Date()); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setRecordId(add.getRecordId()); - } - return add.getRecordId(); - } - - - - - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysEvaluationRecord entity){ - //TODO 做一些数据校验,如唯一约束 - } - - } 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 8774c5e..086c9e8 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 @@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import org.dromara.common.core.constant.CacheNames; -import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -21,7 +20,10 @@ import org.dromara.scale.service.ISysScaleAnswerService; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; -import java.util.*; +import java.util.Comparator; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -74,47 +76,6 @@ public class SysScaleAnswerServiceImpl implements ISysScaleAnswerService { return lqw; } - /** - * 新增选项信息 - */ - @Override - public Boolean insertByBo(SysScaleAnswerBo bo) { - SysScaleAnswer add = MapstructUtils.convert(bo, SysScaleAnswer.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - bo.setAnswerId(add.getAnswerId()); - } - return flag; - } - - /** - * 修改选项信息 - */ - @Override - public Boolean updateByBo(SysScaleAnswerBo bo) { - SysScaleAnswer update = MapstructUtils.convert(bo, SysScaleAnswer.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysScaleAnswer entity) { - //TODO 做一些数据校验,如唯一约束 - } - - /** - * 批量删除选项信息 - */ - @Override - public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if (isValid) { - //TODO 做一些业务上的校验,判断是否需要校验 - } - return baseMapper.deleteBatchIds(ids) > 0; - } @Cacheable(cacheNames = CacheNames.SYS_QUESTION_ANSWER, key = "#scaleId") @Override public List queryQuestionAnswerListByScaleId(Long scaleId) { @@ -143,4 +104,11 @@ public class SysScaleAnswerServiceImpl implements ISysScaleAnswerService { } return questionAnswerVos; } + @Cacheable(cacheNames = CacheNames.MAP_SCALE_ANSWER, key = "#scaleId") + @Override + public Map> getScaleAnswerMap(Long scaleId) { + List scaleAnswerVos = baseMapper.selectVoList( + new LambdaQueryWrapper().eq(SysScaleAnswer::getScaleId, scaleId)); + return scaleAnswerVos.stream().collect(Collectors.groupingBy(SysScaleAnswerVo::getQuestionId)); + } } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleFactorServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleFactorServiceImpl.java index 9a0451d..b4cb750 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleFactorServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleFactorServiceImpl.java @@ -1,10 +1,12 @@ package org.dromara.scale.service.impl; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ArrayUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; +import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -19,6 +21,9 @@ import org.dromara.scale.domain.vo.SysScaleFactorVo; import org.dromara.scale.domain.vo.SysScaleQuestionVo; import org.dromara.scale.mapper.*; import org.dromara.scale.service.ISysScaleFactorService; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,9 +42,8 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { private final SysScaleFactorMapper baseMapper; private final SysScaleMapper scaleMapper; - private final SysScaleFormulaMapper scaleFormulaMapper; private final SysScaleQuestionMapper scaleQuestionMapper; - private final SysScaleFactorRangeMapper sysScaleFactorRangeMapper; + private final SysScaleFactorRangeMapper scaleFactorRangeMapper; /** * 查询测评因子 @@ -55,7 +59,7 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { sysScaleFactorVo.setQuestionIds(Collections.emptyList()); } - List rangeList = sysScaleFactorRangeMapper.selectVoList(Wrappers.lambdaQuery().eq(SysScaleFactorRange::getFactorId, factorId)); + List rangeList = scaleFactorRangeMapper.selectVoList(Wrappers.lambdaQuery().eq(SysScaleFactorRange::getFactorId, factorId)); if (CollUtil.isNotEmpty(rangeList)) { sysScaleFactorVo.setFactorRangeList(rangeList); } else { @@ -101,6 +105,10 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { /** * 新增测评因子 */ + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.MAP_SCALE_QUESTION, key = "#bo.scaleId"), + @CacheEvict(cacheNames = CacheNames.SYS_SCALE_FACTOR, key = "#bo.scaleId") + }) @Transactional(rollbackFor = Exception.class) @Override public Boolean insertByBo(SysScaleFactorBo bo) { @@ -129,7 +137,7 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { range.setScaleId(bo.getScaleId()); list.add(range); } - sysScaleFactorRangeMapper.insertBatch(list, 100); + scaleFactorRangeMapper.insertBatch(list, 100); } private void updateQuestionFactor(SysScaleFactorBo bo) { @@ -147,6 +155,10 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { /** * 修改测评因子 */ + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.MAP_SCALE_QUESTION, key = "#bo.scaleId"), + @CacheEvict(cacheNames = CacheNames.SYS_SCALE_FACTOR, key = "#bo.scaleId") + }) @Transactional(rollbackFor = Exception.class) @Override public Boolean updateByBo(SysScaleFactorBo bo) { @@ -158,7 +170,7 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { } if (CollUtil.isNotEmpty(bo.getFactorRangeList())) { - sysScaleFactorRangeMapper.delete(Wrappers.lambdaQuery(SysScaleFactorRange.class).eq(SysScaleFactorRange::getFactorId, bo.getFactorId())); + scaleFactorRangeMapper.delete(Wrappers.lambdaQuery(SysScaleFactorRange.class).eq(SysScaleFactorRange::getFactorId, bo.getFactorId())); insertFactorRange(bo); } @@ -183,14 +195,20 @@ public class SysScaleFactorServiceImpl implements ISysScaleFactorService { return baseMapper.deleteBatchIds(ids) > 0; } + + + @Cacheable(cacheNames = CacheNames.SYS_SCALE_FACTOR, key = "#scaleId") @Override - public int updateSelectQuestion(SysScaleFactorBo bo) { - Long factorId = bo.getFactorId(); - List questionIds = bo.getQuestionIds(); - int i = scaleQuestionMapper.cleanFactorIdByFactorId(factorId); - if (questionIds != null && questionIds.size() > 0) { - i = scaleQuestionMapper.updateFactorIdByIds(factorId, questionIds); + public List getScaleEvalItemList(Long scaleId) { + List scaleFactorVos = baseMapper.selectVoList( + new LambdaQueryWrapper().eq(SysScaleFactor::getScaleId, scaleId)); + List scaleFactorRangeVos = scaleFactorRangeMapper.selectVoList( + new LambdaQueryWrapper().eq(SysScaleFactorRange::getScaleId, scaleId)); + if (!ArrayUtil.isEmpty(scaleFactorVos) && !ArrayUtil.isEmpty(scaleFactorRangeVos)) { + Map> map = scaleFactorRangeVos.stream() + .collect(Collectors.groupingBy(SysScaleFactorRangeVo::getFactorId)); + scaleFactorVos.forEach(item -> item.setFactorRangeList(map.get(item.getFactorId()))); } - return i; + return scaleFactorVos; } } diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScalePublishServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScalePublishServiceImpl.java index f477f77..93c5e03 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScalePublishServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScalePublishServiceImpl.java @@ -44,11 +44,11 @@ import static org.dromara.common.satoken.utils.LoginHelper.getLoginUser; public class SysScalePublishServiceImpl implements ISysScalePublishService { private final SysScalePublishMapper baseMapper; + private final SysScaleMapper sysScaleMapper; - private final SysScaleMapper scaleMapper; - private final SysEvaluationRecordMapper recordMapper; + private final SysOssMapper sysOssMapper; /** @@ -179,15 +179,16 @@ public class SysScalePublishServiceImpl implements ISysScalePublishService { Long batchNo = sysScalePublishVo.getBatchNo(); String scaleIds = sysScalePublishVo.getScaleIds(); List publishScaleVos = sysScaleMapper.findSysScaleByIds(StrUtil.join(StrUtil.COMMA, scaleIds)); + List recordVos = recordMapper.selectSclaeRecordListByUserAndBatch(userId, batchNo); for (SysScaleVo publishScaleVo : publishScaleVos) { SysOss sysOss = sysOssMapper.selectById(publishScaleVo.getCover()); publishScaleVo.setCoverUrl(sysOss.getUrl()); - } - - List recordVos = recordMapper.selectSclaeRecordListByUserAndBatch(userId, batchNo); - for (SysEvaluationRecordVo recordVo : recordVos) { - publishScaleVos.stream().filter(p -> p.getScaleId().equals(recordVo.getScaleId())) - .findFirst().ifPresent(m -> m.setUsed(true)); + //已做过量表 + for (SysEvaluationRecordVo recordVo : recordVos) { + if( publishScaleVo.getScaleId().equals(recordVo.getScaleId())){ + publishScaleVo.setUsed(true); + } + } } sysScalePublishVo.setScaleList(publishScaleVos); return sysScalePublishVo; diff --git a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleQuestionServiceImpl.java b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleQuestionServiceImpl.java index b06a311..2c5f98e 100644 --- a/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleQuestionServiceImpl.java +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/SysScaleQuestionServiceImpl.java @@ -19,6 +19,7 @@ import org.dromara.scale.mapper.SysScaleAnswerMapper; import org.dromara.scale.mapper.SysScaleQuestionMapper; import org.dromara.scale.service.ISysScaleQuestionService; import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Caching; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; /** * 量问题内容Service业务层处理 @@ -87,7 +89,11 @@ public class SysScaleQuestionServiceImpl implements ISysScaleQuestionService { /** * 新增量问题内容 */ - @CacheEvict(cacheNames = CacheNames.SYS_QUESTION_ANSWER, key = "#bo.scaleId") + @Caching(evict = { + @CacheEvict(cacheNames = CacheNames.SYS_QUESTION_ANSWER, key = "#bo.scaleId"), + @CacheEvict(cacheNames = CacheNames.MAP_SCALE_QUESTION, key = "#bo.scaleId"), + @CacheEvict(cacheNames = CacheNames.MAP_SCALE_ANSWER, key = "#bo.scaleId") + }) @Transactional(rollbackFor = Exception.class) @Override public Boolean insertByBo(SysScaleQuestionBo bo) { @@ -115,13 +121,14 @@ public class SysScaleQuestionServiceImpl implements ISysScaleQuestionService { */ @Caching(evict = { @CacheEvict(cacheNames = CacheNames.SYS_QUESTION_ANSWER, key = "#bo.scaleId"), - @CacheEvict(cacheNames = CacheNames.SYS_QUESTION_ANSWER, key = "#bo.scaleId")}) + @CacheEvict(cacheNames = CacheNames.MAP_SCALE_QUESTION, key = "#bo.scaleId"), + @CacheEvict(cacheNames = CacheNames.MAP_SCALE_ANSWER, key = "#bo.scaleId") + }) @Transactional(rollbackFor = Exception.class) @Override public Boolean updateByBo(SysScaleQuestionBo bo) { SysScaleQuestion update = MapstructUtils.convert(bo, SysScaleQuestion.class); validEntityBeforeSave(update); - scaleAnswerMapper.deleteScaleAnswerByQuestionId(update.getQuestionId()); batchInsertAnswer(bo, update); return baseMapper.updateById(update) > 0; @@ -144,4 +151,12 @@ public class SysScaleQuestionServiceImpl implements ISysScaleQuestionService { } return baseMapper.deleteBatchIds(ids) > 0; } + + @Cacheable(cacheNames = CacheNames.MAP_SCALE_QUESTION, key = "#scaleId") + @Override + public Map> getScaleQuestionMap(Long scaleId) { + List scaleQuestionVos = baseMapper.selectVoList( + new LambdaQueryWrapper().eq(SysScaleQuestion::getScaleId, scaleId)); + return scaleQuestionVos.stream().collect(Collectors.groupingBy(SysScaleQuestionVo::getFactorId)); + } } 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 new file mode 100644 index 0000000..227f865 --- /dev/null +++ b/ruoyi-modules/rouyi-scale/src/main/java/org/dromara/scale/service/impl/WebServiceImpl.java @@ -0,0 +1,303 @@ +package org.dromara.scale.service.impl; + +import cn.hutool.core.util.ArrayUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.utils.MapstructUtils; +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.domain.SysEvaluationAnswer; +import org.dromara.scale.domain.SysEvaluationConclusion; +import org.dromara.scale.domain.SysEvaluationRecord; +import org.dromara.scale.domain.SysScale; +import org.dromara.scale.domain.bo.SysEvaluationAnswerBo; +import org.dromara.scale.domain.bo.SysEvaluationRecordBo; +import org.dromara.scale.domain.vo.*; +import org.dromara.scale.mapper.SysEvaluationAnswerMapper; +import org.dromara.scale.mapper.SysEvaluationConclusionMapper; +import org.dromara.scale.mapper.SysEvaluationRecordMapper; +import org.dromara.scale.mapper.SysScaleMapper; +import org.dromara.scale.service.*; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; +import java.util.*; +import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; + +import static org.dromara.common.satoken.utils.LoginHelper.getLoginUser; + +/** + *

测评网页端服务

+ * + * @author cjw + * @version V1.0.0 + * @date 2024/4/15 9:18 + */ +@RequiredArgsConstructor +@Service +public class WebServiceImpl implements IWebService { + + private final ISysScalePublishService scalePublishService; + + private final ISysScaleFactorService scaleFactorService; + + private final ISysScaleQuestionService scaleQuestionService; + + private final ISysScaleAnswerService scaleAnswerService; + + private final SysScaleMapper scaleMapper; + + private final SysEvaluationRecordMapper recordMapper; + + private final SysEvaluationConclusionMapper evaluationConclusionMapper; + + private final SysEvaluationAnswerMapper evaluationAnswerMapper; + private final MathContext mathContext = new MathContext(2); + + + @Override + public SysScalePublishVo queryPublishScale() { + return scalePublishService.queryPublishScale(); + } + + @Override + public List queryQuestionAnswerListByScaleId(Long scaleId) { + return scaleAnswerService.queryQuestionAnswerListByScaleId(scaleId); + } + + @Override + public Long newRecord(SysEvaluationRecordBo bo) { + LoginUser loginUser = getLoginUser(); + SysEvaluationRecord add = MapstructUtils.convert(bo, SysEvaluationRecord.class); + add.setUserId(loginUser.getUserId()); + add.setCreateTime(new Date()); + //validEntityBeforeSave(add); + boolean flag = recordMapper.insert(add) > 0; + if (flag) { + bo.setRecordId(add.getRecordId()); + } + return add.getRecordId(); + } + + @Override + public Map submitAnswer(List answerList) { + boolean allowQueryResult = true; + Long recordId = answerList.get(0).getRecordId(); + SysScalePublishVo scalePublishVo = recordMapper.selectPublishByUseRecord(recordId); + //查询考核结果 + if (scalePublishVo.getAllowQueryResult() == 0) { + allowQueryResult = false; + } + List answerAdd = MapstructUtils.convert(answerList, SysEvaluationAnswer.class); + evaluationAnswerMapper.insertBatch(answerAdd); + + List list = calculateEvaluationResult(answerList); + List conclusionAdd = MapstructUtils.convert(list, SysEvaluationConclusion.class); + evaluationConclusionMapper.insertBatch(conclusionAdd); + + Integer riskLevel = -1; + String riskName = ""; + //选择风险等级最高 + for (SysEvaluationConclusionVo ec : list) { + if (ec.getSituation() > riskLevel) { + riskLevel = ec.getSituation(); + riskName = ec.getSituationName(); + } + } + //判断风险等级是否为"高风险、重大风险",若是,则形成预警记录 +// if(riskName.equals("高风险") || riskName.equals("重大风险")){ +// WarnRecordEval wre = new WarnRecordEval(); +// wre.setId(idWorker.nextId()); +// wre.setErId(evalRecord.getId()); +// wre.setRiskLevel(riskName); +// wre.setUserId(evalRecord.getEvalUid()); +// wre.setScaleId(evalRecord.getScaleId()); +// wre.setTenantNo(sysUser.getTenantNo()); +// warnRecordDAO.evalWarn(wre); +// } + //不允许查看考核结果 + if (!allowQueryResult) { + return null; + } + + BigDecimal totalScore = list.stream() + .map(SysEvaluationConclusionVo::getScore) + // 使用reduce()聚合函数,得到金额总和 + .reduce(BigDecimal.ZERO, BigDecimal::add); + return new HashMap() {{ + //put("evalRecordId",evalRecord.getId()); + //put("scaleName",scaleInfo.getName()); + put("totalScore", totalScore.doubleValue()); + put("list", list.stream().filter(item -> item.getStatus().equals(StatusEnum.IN_USE.getValue())).collect( + Collectors.toList())); + }}; + } + + private List calculateEvaluationResult(List answerList) { + Long recordId = answerList.get(0).getRecordId(); + SysEvaluationRecordVo recordVo = recordMapper.selectVoById(recordId); + Long scaleId = recordVo.getScaleId(); + + Map> questionMapByFactor = scaleQuestionService.getScaleQuestionMap(scaleId); + Map> answerMapByQuestion = scaleAnswerService.getScaleAnswerMap(scaleId); + + List scaleFactorList = scaleFactorService.getScaleEvalItemList(scaleId); + List list = new ArrayList<>(scaleFactorList.size()); + for (SysScaleFactorVo scaleFactor : scaleFactorList) { + Long factorId = scaleFactor.getFactorId(); + AtomicReference totalSocre = new AtomicReference<>(BigDecimal.ZERO); + + SysEvaluationConclusionVo evalConclusion = new SysEvaluationConclusionVo(); + evalConclusion.setFactorId(factorId); + evalConclusion.setRecordId(recordId); + evalConclusion.setStatus(StatusEnum.DISABLED.getValue()); + evalConclusion.setScore(BigDecimal.ZERO); + list.add(evalConclusion); + + List questionNum = questionMapByFactor.get(factorId); + List questionIds = new ArrayList<>(); + questionNum.forEach(q -> { + Long questionId = q.getQuestionId(); + questionIds.add(questionId); + List answerNum = answerMapByQuestion.get(questionId); + if (!ArrayUtil.isEmpty(answerNum)) { + //找出分数最大的选项 + BigDecimal s = answerNum.stream() + .max(Comparator.comparing(SysScaleAnswerVo::getScore)).get().getScore(); + totalSocre.updateAndGet(v -> v.add(s)); + SysEvaluationAnswerBo evaluationAnswer = answerList.stream() + .filter(answer -> questionId.equals(answer.getQuestionId())).findFirst().orElse(null); + if (evaluationAnswer != null) { + answerNum.stream().filter(o -> o.getAnswerId().equals(evaluationAnswer.getAnswerId())).findFirst() + .ifPresent( + m -> evalConclusion.setScore(m.getScore().add(evalConclusion.getScore()))); + } + } + }); + scaleFactor.setQuestionIds(questionIds); + //计算得分率 + + if (totalSocre.get().compareTo(BigDecimal.ZERO) > 0) { + evalConclusion.setScoreRate(evalConclusion.getScore() + .multiply(new BigDecimal(100)).divide(totalSocre.get()).setScale(2, RoundingMode.HALF_UP)); + } + //计算量表加强后得分 + calcScoreByRuleType(evalConclusion, scaleFactor); + //根据将强后的分数划分到对应的范围上 + 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()); + } else { + for (SysScaleFactorRangeVo range : factorRangeList) { + if (Objects.nonNull(range.getMinValue()) && Objects.nonNull(range.getMaxValue())) { + if (evalConclusion.getScore().compareTo(range.getMinValue()) >= 0 + && evalConclusion.getScore().compareTo(range.getMaxValue()) <= 0) { + evalConclusion.setEvalDesc(range.getEvalDesc()); + evalConclusion.setEvalPropose(range.getEvalPropose()); + evalConclusion.setFactorRangeId(range.getRangeId()); + evalConclusion.setSituation(range.getSituation()); + evalConclusion.setSituationName(SituationEnum.getNameByCode(range.getSituation())); + break; + } + } else { + //最大值不是空,最小值是空 + if (Objects.nonNull(range.getMaxValue()) && Objects.isNull(range.getMinValue())) { + if (evalConclusion.getScore().compareTo(range.getMaxValue()) <= 0) { + evalConclusion.setEvalDesc(range.getEvalDesc()); + evalConclusion.setEvalPropose(range.getEvalPropose()); + evalConclusion.setFactorRangeId(range.getRangeId()); + evalConclusion.setSituation(range.getSituation()); + evalConclusion.setSituationName(SituationEnum.getNameByCode(range.getSituation())); + break; + } + } else if (Objects.nonNull(range.getMinValue()) && Objects.isNull(range.getMaxValue())) { + //最大值为空,最小值不为空 + if (evalConclusion.getScore().compareTo(range.getMinValue()) >= 0) { + evalConclusion.setEvalDesc(range.getEvalDesc()); + evalConclusion.setEvalPropose(range.getEvalPropose()); + evalConclusion.setFactorRangeId(range.getRangeId()); + evalConclusion.setSituation(range.getSituation()); + evalConclusion.setSituationName(SituationEnum.getNameByCode(range.getSituation())); + break; + } + } //else { +// logger.error("量表scaleId = {},配置项={} 配置的范围超过1条,但是存在配置范围最大最小值都为null", +// evalSubmitAnswerDto.getScaleId(), scaleEvalItem.getId()); +// throw new EdfRuntimeException("量表配置项有问题,请联系管理员检查!"); +// } + } + } + } + } + //处理维度问题及status + //量表 + SysScale scaleInfo = scaleMapper.selectById(scaleId); + scaleDimension(list, scaleInfo); + //保存结果 + return list; + } + + private void calcScoreByRuleType(SysEvaluationConclusionVo evalConclusion, SysScaleFactorVo scaleFactor) { + ScoreRuleTypeEnum scoleRuleTypeEnum = ScoreRuleTypeEnum.getByCode(scaleFactor.getRuleType()); + if (Objects.isNull(scoleRuleTypeEnum)) { + return; + } + switch (scoleRuleTypeEnum) { + case SUM_TYPE: + evalConclusion.setScore(evalConclusion.getScore().multiply(scaleFactor.getWeight(), mathContext)); + break; + case AVG_TYPE: + BigDecimal sum = evalConclusion.getScore().multiply(scaleFactor.getWeight(), mathContext); + int size = scaleFactor.getQuestionIds().size(); + //均值四舍五入2位小数 + BigDecimal avgScore = sum.divide(new BigDecimal(size), 2, RoundingMode.HALF_UP); + evalConclusion.setScore(avgScore); + break; + case SUM_INT_TYPE: + BigDecimal sum2 = evalConclusion.getScore().multiply(scaleFactor.getWeight(), mathContext); + evalConclusion.setScore(sum2); + break; + default: + break; + } + } + + private void scaleDimension(List evalConclusions, SysScale scaleInfo) { + ScaleDimensionEnum scaleDimensionEnum = ScaleDimensionEnum.getByCode(scaleInfo.getDimensionType()); + if (Objects.isNull(scaleDimensionEnum)) { + //throw new EdfRuntimeException("暂不支持该维度"); + return; + } + switch (scaleDimensionEnum) { + case SING_SING: + if (evalConclusions.size() > 1) { + //log.error("{} - 量表维度配置有误,单项单维量表配置了多个维度",scaleInfo.getName()); + //throw new EdfRuntimeException(String.format("%s 量表配置有误!,请联系管理员!",scaleInfo.getName())); + break; + } + evalConclusions.forEach(item -> item.setStatus(StatusEnum.IN_USE.getValue())); + break; + case MULTIPE_SINGL: + //择低录取 + if (scaleInfo.getSelectDirection() == 1) { + evalConclusions.stream().min(Comparator.comparing(SysEvaluationConclusionVo::getScore)).get().setStatus(StatusEnum.IN_USE.getValue()); + } else { + //高分录取 + evalConclusions.stream().max(Comparator.comparing(SysEvaluationConclusionVo::getScore)).get().setStatus(StatusEnum.IN_USE.getValue()); + } + break; + case MULTIPE_MULTIPE: + evalConclusions.forEach(item -> item.setStatus(1)); + break; + default: + break; + } + } +}