CycleServiceImpl.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package com.dayou.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.dayou.configuration.BaseEntity;
  7. import com.dayou.configuration.ErrorCode;
  8. import com.dayou.dao.CycleMapper;
  9. import com.dayou.entity.*;
  10. import com.dayou.service.*;
  11. import com.dayou.utils.MathUtil;
  12. import com.dayou.vo.CycleVO;
  13. import org.apache.commons.collections.CollectionUtils;
  14. import org.apache.commons.math3.distribution.ChiSquaredDistribution;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import org.springframework.transaction.annotation.Transactional;
  18. import java.math.BigDecimal;
  19. import java.math.RoundingMode;
  20. import java.util.List;
  21. import java.util.Set;
  22. import java.util.stream.Collectors;
  23. /**
  24. * 类说明:
  25. *
  26. * @author: wucl
  27. * @since: 2023/7/20
  28. * created with IntelliJ IDEA.
  29. */
  30. @Service
  31. public class CycleServiceImpl extends ServiceImpl<CycleMapper, Cycle> implements ICycleService {
  32. @Autowired
  33. private CycleMapper cycleMapper;
  34. @Autowired
  35. private IProfessorResultService professorResultService;
  36. @Autowired
  37. private IQuestionAnalysisService questionAnalysisService;
  38. @Autowired
  39. private IQuestionService questionService;
  40. @Autowired
  41. private IFailQuestionService failQuestionService;
  42. @Override
  43. public IPage<CycleVO> getPage(Page page, CycleVO cycleVO) {
  44. IPage<CycleVO> result = cycleMapper.getPage(page,cycleVO);
  45. return result;
  46. }
  47. @Transactional
  48. @Override
  49. public Boolean saveCycle(Cycle cycle) {
  50. Integer cycleNum = cycle.getCycleNum();
  51. List<Cycle> list = this.list(new LambdaQueryWrapper<Cycle>().eq(Cycle::getDocumentId, cycle.getDocumentId())
  52. .eq(Cycle::getCycleNum, cycleNum).eq(BaseEntity::getDeleted, Boolean.FALSE));
  53. if (CollectionUtils.isEmpty(list)){
  54. Integer professorNum = cycle.getProfessorNum();
  55. BigDecimal probability = cycle.getProbability();
  56. //计算方分布的左尾概率的反函数值
  57. double chiSqValDouble = MathUtil.getChiSqVal(probability.doubleValue(),professorNum.doubleValue());
  58. BigDecimal chiSqVal = BigDecimal.valueOf(chiSqValDouble).setScale(4, RoundingMode.HALF_UP);
  59. cycle.setStandardValue(chiSqVal);
  60. this.save(cycle);
  61. //如果下发的是第一轮或者第二轮,就全量评分项下发
  62. if (cycleNum>2){
  63. Cycle previousCycle = this.getOne(new LambdaQueryWrapper<Cycle>().eq(Cycle::getDocumentId, cycle.getDocumentId())
  64. .eq(Cycle::getCycleNum, (cycleNum - 1)));
  65. BigDecimal standardValue = previousCycle.getStandardValue();
  66. Long cycleId = previousCycle.getId();
  67. //获取上一轮的分析数据
  68. List<QuestionAnalysis> previousAnalysisData = questionAnalysisService.list(new LambdaQueryWrapper<QuestionAnalysis>().eq(QuestionAnalysis::getCycleId, cycleId));
  69. if (CollectionUtils.isEmpty(previousAnalysisData)){
  70. return Boolean.TRUE;
  71. }
  72. //上一轮的所有评分项
  73. List<Long> allQuestionId = previousAnalysisData.stream().map(QuestionAnalysis::getQuestionId).collect(Collectors.toList());
  74. //上一轮所有父级评分项id
  75. Set<Long> questionsParentId = questionService.list(new LambdaQueryWrapper<Question>()
  76. .in(BaseEntity::getId, allQuestionId).eq(BaseEntity::getDeleted, Boolean.FALSE)).stream().map(Question::getParentId).collect(Collectors.toSet());
  77. //上一轮未通过的评分项
  78. List<Long> notPassQuestionsId = previousAnalysisData.stream().filter(x -> x.getValidate().compareTo(standardValue) == 1).map(QuestionAnalysis::getQuestionId).collect(Collectors.toList());
  79. if (CollectionUtils.isEmpty(notPassQuestionsId)){
  80. ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"此问卷评分项已全部通过,若需继续下发,请新建问卷。");
  81. }
  82. List<Question> questions = questionService.list(new LambdaQueryWrapper<Question>()
  83. .in(BaseEntity::getId, notPassQuestionsId).eq(BaseEntity::getDeleted, Boolean.FALSE));
  84. Set<Long> notPassParentIds = questions.stream().map(Question::getParentId).collect(Collectors.toSet());
  85. questionsParentId.removeAll(notPassParentIds);
  86. //上轮通过的父级id
  87. if (CollectionUtils.isNotEmpty(questionsParentId)){
  88. List<Long> passQuestionsId = questionService.list(new LambdaQueryWrapper<Question>().select(BaseEntity::getId).in(Question::getParentId, questionsParentId).eq(BaseEntity::getDeleted, Boolean.FALSE)).stream().map(BaseEntity::getId).collect(Collectors.toList());
  89. if (CollectionUtils.isNotEmpty(passQuestionsId) && passQuestionsId.size()<previousAnalysisData.size()){
  90. List<ProfessorResult> previousOriginData = professorResultService.list(new LambdaQueryWrapper<ProfessorResult>().eq(ProfessorResult::getCycleId, cycleId)
  91. .in(ProfessorResult::getQuestionId,passQuestionsId));
  92. previousOriginData.stream().forEach(x->{
  93. x.setCycleId(cycle.getId());
  94. });
  95. professorResultService.saveBatch(previousOriginData);
  96. List<FailQuestion> failQuestions = notPassParentIds.stream().map(q -> {
  97. FailQuestion failQuestion = new FailQuestion();
  98. failQuestion.setCycleId(cycle.getId());
  99. failQuestion.setQuestionParentId(q);
  100. return failQuestion;
  101. }).collect(Collectors.toList());
  102. failQuestionService.saveBatch(failQuestions);
  103. }
  104. }
  105. }
  106. //如果下发的不是第一轮或者第二轮,专家端只需对上轮未通过的评分项再次评分。后端自动生成已通过评分项的评分数据。插入到professor_result
  107. // 找出上一轮未通过评分项的parentId,存入 fail_question
  108. return Boolean.TRUE;
  109. }else {
  110. ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"该问卷此轮已存在。");
  111. return Boolean.FALSE;
  112. }
  113. }
  114. @Override
  115. public Cycle nextCycle(Long documentId) {
  116. Cycle cycle = cycleMapper.nextCycle(documentId);
  117. if (cycle==null){
  118. cycle = new Cycle();
  119. cycle.setCycleNum(1);
  120. }
  121. return cycle;
  122. }
  123. }