优化测评端接口目录,统一入口;添加缓存删除;
This commit is contained in:
parent
391063bad7
commit
0aef5e4362
|
@ -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<SysScalePublishVo> 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<List<QuestionAnswerVo>> 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<Long> 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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
|
|
|
@ -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<SysEvaluationConclusionVo> queryList(SysEvaluationConclusionBo bo);
|
||||
|
||||
Map<String,Object> submitAnswer(List<SysEvaluationAnswerBo> answerList);
|
||||
}
|
||||
|
|
|
@ -30,10 +30,6 @@ public interface ISysEvaluationRecordService {
|
|||
*/
|
||||
List<SysEvaluationRecordVo> queryList(SysEvaluationRecordBo bo);
|
||||
|
||||
/**
|
||||
* 新增量测记录
|
||||
*/
|
||||
Long insertByBo(SysEvaluationRecordBo bo);
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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<SysScaleAnswerVo> queryList(SysScaleAnswerBo bo);
|
||||
|
||||
/**
|
||||
* 新增选项信息
|
||||
*/
|
||||
Boolean insertByBo(SysScaleAnswerBo bo);
|
||||
|
||||
/**
|
||||
* 修改选项信息
|
||||
*/
|
||||
Boolean updateByBo(SysScaleAnswerBo bo);
|
||||
|
||||
/**
|
||||
* 校验并批量删除选项信息信息
|
||||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
List<QuestionAnswerVo> queryQuestionAnswerListByScaleId(Long scaleId);
|
||||
|
||||
Map<Long, List<SysScaleAnswerVo>> getScaleAnswerMap(Long scaleId);
|
||||
|
||||
}
|
||||
|
|
|
@ -46,5 +46,5 @@ public interface ISysScaleFactorService {
|
|||
*/
|
||||
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
|
||||
|
||||
int updateSelectQuestion(SysScaleFactorBo bo);
|
||||
List<SysScaleFactorVo> getScaleEvalItemList(Long scaleId);
|
||||
}
|
||||
|
|
|
@ -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<Long> ids, Boolean isValid);
|
||||
|
||||
Map<Long, List<SysScaleQuestionVo>> getScaleQuestionMap(Long scaleId);
|
||||
}
|
||||
|
|
|
@ -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<QuestionAnswerVo> queryQuestionAnswerListByScaleId(Long scaleId);
|
||||
|
||||
Long newRecord(SysEvaluationRecordBo bo);
|
||||
|
||||
Map<String,Object> submitAnswer(List<SysEvaluationAnswerBo> answerList);
|
||||
}
|
|
@ -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<String, Object> submitAnswer(List<SysEvaluationAnswerBo> answerList) {
|
||||
boolean allowQueryResult = true;
|
||||
Long recordId = answerList.get(0).getRecordId();
|
||||
SysScalePublishVo scalePublishVo = recordMapper.selectPublishByUseRecord(recordId);
|
||||
//查询考核结果
|
||||
if (scalePublishVo.getAllowQueryResult() == 0) {
|
||||
allowQueryResult = false;
|
||||
}
|
||||
List<SysEvaluationAnswer> answerAdd = MapstructUtils.convert(answerList, SysEvaluationAnswer.class);
|
||||
evaluationAnswerMapper.insertBatch(answerAdd);
|
||||
|
||||
List<SysEvaluationConclusionVo> list = calculateEvaluationResult(answerList);
|
||||
List<SysEvaluationConclusion> 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<String, Object>() {{
|
||||
//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<SysEvaluationConclusionVo> calculateEvaluationResult(List<SysEvaluationAnswerBo> answerList) {
|
||||
Long recordId = answerList.get(0).getRecordId();
|
||||
SysEvaluationRecordVo recordVo = recordMapper.selectVoById(recordId);
|
||||
Long scaleId = recordVo.getScaleId();
|
||||
|
||||
Map<Long, List<SysScaleQuestionVo>> questionMapByFactor = getScaleQuestionMap(scaleId);
|
||||
Map<Long, List<SysScaleAnswerVo>> answerMapByQuestion = getScaleAnswerMap(scaleId);
|
||||
|
||||
List<SysScaleFactorVo> scaleFactorList = getScaleEvalItemList(scaleId);
|
||||
List<SysEvaluationConclusionVo> list = new ArrayList<>(scaleFactorList.size());
|
||||
for (SysScaleFactorVo scaleFactor : scaleFactorList) {
|
||||
Long factorId = scaleFactor.getFactorId();
|
||||
AtomicReference<BigDecimal> 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<SysScaleQuestionVo> questionNum = questionMapByFactor.get(factorId);
|
||||
List<Long> questionIds = new ArrayList<>();
|
||||
questionNum.forEach(q -> {
|
||||
Long questionId = q.getQuestionId();
|
||||
questionIds.add(questionId);
|
||||
List<SysScaleAnswerVo> 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<SysScaleFactorRangeVo> 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<Long, List<SysScaleQuestionVo>> getScaleQuestionMap(Long scaleId) {
|
||||
List<SysScaleQuestionVo> scaleQuestionVos = scaleQuestionMapper.selectVoList(
|
||||
new LambdaQueryWrapper<SysScaleQuestion>().eq(SysScaleQuestion::getScaleId, scaleId));
|
||||
return scaleQuestionVos.stream().collect(Collectors.groupingBy(SysScaleQuestionVo::getFactorId));
|
||||
}
|
||||
@Cacheable(cacheNames = CacheNames.MAP_SCALE_ANSWER, key = "#scaleId")
|
||||
public Map<Long, List<SysScaleAnswerVo>> getScaleAnswerMap(Long scaleId) {
|
||||
List<SysScaleAnswerVo> scaleAnswerVos = scaleAnswerMapper.selectVoList(
|
||||
new LambdaQueryWrapper<SysScaleAnswer>().eq(SysScaleAnswer::getScaleId, scaleId));
|
||||
return scaleAnswerVos.stream().collect(Collectors.groupingBy(SysScaleAnswerVo::getQuestionId));
|
||||
}
|
||||
@Cacheable(cacheNames = CacheNames.SYS_SCALE_FACTOR, key = "#scaleId")
|
||||
public List<SysScaleFactorVo> getScaleEvalItemList(Long scaleId) {
|
||||
List<SysScaleFactorVo> scaleFactorVos = scaleFactorMapper.selectVoList(
|
||||
new LambdaQueryWrapper<SysScaleFactor>().eq(SysScaleFactor::getScaleId, scaleId));
|
||||
List<SysScaleFactorRangeVo> scaleFactorRangeVos = scaleFactorRangeMapper.selectVoList(
|
||||
new LambdaQueryWrapper<SysScaleFactorRange>().eq(SysScaleFactorRange::getScaleId, scaleId));
|
||||
if (!ArrayUtil.isEmpty(scaleFactorVos) && !ArrayUtil.isEmpty(scaleFactorRangeVos)) {
|
||||
Map<Long, List<SysScaleFactorRangeVo>> 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<SysEvaluationConclusionVo> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 做一些数据校验,如唯一约束
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -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<Long> ids, Boolean isValid) {
|
||||
if (isValid) {
|
||||
//TODO 做一些业务上的校验,判断是否需要校验
|
||||
}
|
||||
return baseMapper.deleteBatchIds(ids) > 0;
|
||||
}
|
||||
@Cacheable(cacheNames = CacheNames.SYS_QUESTION_ANSWER, key = "#scaleId")
|
||||
@Override
|
||||
public List<QuestionAnswerVo> 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<Long, List<SysScaleAnswerVo>> getScaleAnswerMap(Long scaleId) {
|
||||
List<SysScaleAnswerVo> scaleAnswerVos = baseMapper.selectVoList(
|
||||
new LambdaQueryWrapper<SysScaleAnswer>().eq(SysScaleAnswer::getScaleId, scaleId));
|
||||
return scaleAnswerVos.stream().collect(Collectors.groupingBy(SysScaleAnswerVo::getQuestionId));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<SysScaleFactorRangeVo> rangeList = sysScaleFactorRangeMapper.selectVoList(Wrappers.<SysScaleFactorRange>lambdaQuery().eq(SysScaleFactorRange::getFactorId, factorId));
|
||||
List<SysScaleFactorRangeVo> rangeList = scaleFactorRangeMapper.selectVoList(Wrappers.<SysScaleFactorRange>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<Long> questionIds = bo.getQuestionIds();
|
||||
int i = scaleQuestionMapper.cleanFactorIdByFactorId(factorId);
|
||||
if (questionIds != null && questionIds.size() > 0) {
|
||||
i = scaleQuestionMapper.updateFactorIdByIds(factorId, questionIds);
|
||||
public List<SysScaleFactorVo> getScaleEvalItemList(Long scaleId) {
|
||||
List<SysScaleFactorVo> scaleFactorVos = baseMapper.selectVoList(
|
||||
new LambdaQueryWrapper<SysScaleFactor>().eq(SysScaleFactor::getScaleId, scaleId));
|
||||
List<SysScaleFactorRangeVo> scaleFactorRangeVos = scaleFactorRangeMapper.selectVoList(
|
||||
new LambdaQueryWrapper<SysScaleFactorRange>().eq(SysScaleFactorRange::getScaleId, scaleId));
|
||||
if (!ArrayUtil.isEmpty(scaleFactorVos) && !ArrayUtil.isEmpty(scaleFactorRangeVos)) {
|
||||
Map<Long, List<SysScaleFactorRangeVo>> map = scaleFactorRangeVos.stream()
|
||||
.collect(Collectors.groupingBy(SysScaleFactorRangeVo::getFactorId));
|
||||
scaleFactorVos.forEach(item -> item.setFactorRangeList(map.get(item.getFactorId())));
|
||||
}
|
||||
return i;
|
||||
return scaleFactorVos;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<SysScaleVo> publishScaleVos = sysScaleMapper.findSysScaleByIds(StrUtil.join(StrUtil.COMMA, scaleIds));
|
||||
List<SysEvaluationRecordVo> recordVos = recordMapper.selectSclaeRecordListByUserAndBatch(userId, batchNo);
|
||||
for (SysScaleVo publishScaleVo : publishScaleVos) {
|
||||
SysOss sysOss = sysOssMapper.selectById(publishScaleVo.getCover());
|
||||
publishScaleVo.setCoverUrl(sysOss.getUrl());
|
||||
}
|
||||
|
||||
List<SysEvaluationRecordVo> recordVos = recordMapper.selectSclaeRecordListByUserAndBatch(userId, batchNo);
|
||||
//已做过量表
|
||||
for (SysEvaluationRecordVo recordVo : recordVos) {
|
||||
publishScaleVos.stream().filter(p -> p.getScaleId().equals(recordVo.getScaleId()))
|
||||
.findFirst().ifPresent(m -> m.setUsed(true));
|
||||
if( publishScaleVo.getScaleId().equals(recordVo.getScaleId())){
|
||||
publishScaleVo.setUsed(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
sysScalePublishVo.setScaleList(publishScaleVos);
|
||||
return sysScalePublishVo;
|
||||
|
|
|
@ -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<Long, List<SysScaleQuestionVo>> getScaleQuestionMap(Long scaleId) {
|
||||
List<SysScaleQuestionVo> scaleQuestionVos = baseMapper.selectVoList(
|
||||
new LambdaQueryWrapper<SysScaleQuestion>().eq(SysScaleQuestion::getScaleId, scaleId));
|
||||
return scaleQuestionVos.stream().collect(Collectors.groupingBy(SysScaleQuestionVo::getFactorId));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
/**
|
||||
* <p>测评网页端服务<p>
|
||||
*
|
||||
* @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<QuestionAnswerVo> 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<String, Object> submitAnswer(List<SysEvaluationAnswerBo> answerList) {
|
||||
boolean allowQueryResult = true;
|
||||
Long recordId = answerList.get(0).getRecordId();
|
||||
SysScalePublishVo scalePublishVo = recordMapper.selectPublishByUseRecord(recordId);
|
||||
//查询考核结果
|
||||
if (scalePublishVo.getAllowQueryResult() == 0) {
|
||||
allowQueryResult = false;
|
||||
}
|
||||
List<SysEvaluationAnswer> answerAdd = MapstructUtils.convert(answerList, SysEvaluationAnswer.class);
|
||||
evaluationAnswerMapper.insertBatch(answerAdd);
|
||||
|
||||
List<SysEvaluationConclusionVo> list = calculateEvaluationResult(answerList);
|
||||
List<SysEvaluationConclusion> 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<String, Object>() {{
|
||||
//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<SysEvaluationConclusionVo> calculateEvaluationResult(List<SysEvaluationAnswerBo> answerList) {
|
||||
Long recordId = answerList.get(0).getRecordId();
|
||||
SysEvaluationRecordVo recordVo = recordMapper.selectVoById(recordId);
|
||||
Long scaleId = recordVo.getScaleId();
|
||||
|
||||
Map<Long, List<SysScaleQuestionVo>> questionMapByFactor = scaleQuestionService.getScaleQuestionMap(scaleId);
|
||||
Map<Long, List<SysScaleAnswerVo>> answerMapByQuestion = scaleAnswerService.getScaleAnswerMap(scaleId);
|
||||
|
||||
List<SysScaleFactorVo> scaleFactorList = scaleFactorService.getScaleEvalItemList(scaleId);
|
||||
List<SysEvaluationConclusionVo> list = new ArrayList<>(scaleFactorList.size());
|
||||
for (SysScaleFactorVo scaleFactor : scaleFactorList) {
|
||||
Long factorId = scaleFactor.getFactorId();
|
||||
AtomicReference<BigDecimal> 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<SysScaleQuestionVo> questionNum = questionMapByFactor.get(factorId);
|
||||
List<Long> questionIds = new ArrayList<>();
|
||||
questionNum.forEach(q -> {
|
||||
Long questionId = q.getQuestionId();
|
||||
questionIds.add(questionId);
|
||||
List<SysScaleAnswerVo> 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<SysScaleFactorRangeVo> 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<SysEvaluationConclusionVo> 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;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue