|
@@ -1,23 +1,27 @@
|
|
package com.dayou.service.impl;
|
|
package com.dayou.service.impl;
|
|
|
|
|
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
+import com.dayou.configuration.ErrorCode;
|
|
import com.dayou.dao.QuestionAnalysisMapper;
|
|
import com.dayou.dao.QuestionAnalysisMapper;
|
|
|
|
+import com.dayou.entity.Cycle;
|
|
|
|
+import com.dayou.entity.ProfessorResult;
|
|
import com.dayou.entity.QuestionAnalysis;
|
|
import com.dayou.entity.QuestionAnalysis;
|
|
|
|
+import com.dayou.service.IProfessorResultService;
|
|
import com.dayou.service.IQuestionAnalysisService;
|
|
import com.dayou.service.IQuestionAnalysisService;
|
|
import com.dayou.utils.Tree;
|
|
import com.dayou.utils.Tree;
|
|
import com.dayou.utils.TreeUtil;
|
|
import com.dayou.utils.TreeUtil;
|
|
-import com.dayou.vo.AnalysisResultVO;
|
|
|
|
-import com.dayou.vo.ChildrenParentName;
|
|
|
|
-import com.dayou.vo.MergeTableVO;
|
|
|
|
-import com.dayou.vo.MergeVO;
|
|
|
|
|
|
+import com.dayou.vo.*;
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Lists;
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
import org.apache.commons.collections.CollectionUtils;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
import java.math.BigDecimal;
|
|
|
|
+import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
+import java.util.Set;
|
|
import java.util.stream.Collectors;
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -33,9 +37,12 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
|
|
@Autowired
|
|
@Autowired
|
|
private QuestionAnalysisMapper questionAnalysisMapper;
|
|
private QuestionAnalysisMapper questionAnalysisMapper;
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
+ private IProfessorResultService professorResultService;
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
- public List<AnalysisResultVO> getAnalysisList() {
|
|
|
|
- List<AnalysisResultVO> analysisList = questionAnalysisMapper.getAnalysisList();
|
|
|
|
|
|
+ public List<AnalysisResultVO> getAnalysisList(Cycle cycle) {
|
|
|
|
+ List<AnalysisResultVO> analysisList = questionAnalysisMapper.getAnalysisList(cycle);
|
|
analysisList = (List<AnalysisResultVO>) TreeUtil.buildTree(analysisList,analysisList.get(0).getTypeId());
|
|
analysisList = (List<AnalysisResultVO>) TreeUtil.buildTree(analysisList,analysisList.get(0).getTypeId());
|
|
return analysisList;
|
|
return analysisList;
|
|
}
|
|
}
|
|
@@ -46,18 +53,31 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public MergeVO getMergeData() {
|
|
|
|
|
|
+ public MergeVO getMergeData(Cycle cycle) {
|
|
MergeVO merge = new MergeVO();
|
|
MergeVO merge = new MergeVO();
|
|
- List<ChildrenParentName> parentLabel = questionAnalysisMapper.getParentLabel();
|
|
|
|
|
|
+ List<ChildrenParentName> parentLabel = questionAnalysisMapper.getParentLabel(cycle);
|
|
Map<String, String> childrenParentMap = parentLabel.stream().collect(Collectors.toMap(ChildrenParentName::getLabel, ChildrenParentName::getParentLabel));
|
|
Map<String, String> childrenParentMap = parentLabel.stream().collect(Collectors.toMap(ChildrenParentName::getLabel, ChildrenParentName::getParentLabel));
|
|
- List<AnalysisResultVO> analysisList = questionAnalysisMapper.getAnalysisList();
|
|
|
|
|
|
+ List<AnalysisResultVO> analysisList = questionAnalysisMapper.getAnalysisList(cycle);
|
|
merge.setItemName(analysisList.get(0).getItemName());
|
|
merge.setItemName(analysisList.get(0).getItemName());
|
|
- merge.setCycleName(analysisList.get(0).getCycleName());
|
|
|
|
|
|
+ merge.setCycleNum(analysisList.get(0).getCycleNum());
|
|
merge.setTypeName(analysisList.get(0).getTypeName());
|
|
merge.setTypeName(analysisList.get(0).getTypeName());
|
|
|
|
+ merge.setProfessorNum(analysisList.get(0).getProfessorNum());
|
|
|
|
+ merge.setProbability(analysisList.get(0).getProbability());
|
|
|
|
+ merge.setStandardValue(analysisList.get(0).getStandardValue());
|
|
|
|
+ merge.setDocumentId(analysisList.get(0).getDocumentId());
|
|
if (analysisList.get(0).getQuestionId()==null){
|
|
if (analysisList.get(0).getQuestionId()==null){
|
|
return merge;
|
|
return merge;
|
|
}
|
|
}
|
|
Map<String, BigDecimal> labelScore = analysisList.stream().collect(Collectors.toMap(AnalysisResultVO::getQuestionName, AnalysisResultVO::getAvgScore));
|
|
Map<String, BigDecimal> labelScore = analysisList.stream().collect(Collectors.toMap(AnalysisResultVO::getQuestionName, AnalysisResultVO::getAvgScore));
|
|
|
|
+ Map<String, BigDecimal> varianceMap = new HashMap<>();
|
|
|
|
+ if (analysisList.get(0).getVariance()!=null){
|
|
|
|
+ varianceMap = analysisList.stream().collect(Collectors.toMap(AnalysisResultVO::getQuestionName, AnalysisResultVO::getVariance));
|
|
|
|
+ }
|
|
|
|
+ Map<String, BigDecimal> validateMap = new HashMap<>();
|
|
|
|
+ if (analysisList.get(0).getValidate()!=null){
|
|
|
|
+ validateMap = analysisList.stream().collect(Collectors.toMap(AnalysisResultVO::getQuestionName, AnalysisResultVO::getValidate));
|
|
|
|
+ }
|
|
|
|
+
|
|
analysisList = (List<AnalysisResultVO>) TreeUtil.buildTree(analysisList,analysisList.get(0).getTypeId());
|
|
analysisList = (List<AnalysisResultVO>) TreeUtil.buildTree(analysisList,analysisList.get(0).getTypeId());
|
|
List<AnalysisResultVO> allChildren = Lists.newArrayList();
|
|
List<AnalysisResultVO> allChildren = Lists.newArrayList();
|
|
for (AnalysisResultVO analysisResultVO : analysisList){
|
|
for (AnalysisResultVO analysisResultVO : analysisList){
|
|
@@ -67,35 +87,92 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
|
|
for (AnalysisResultVO analysisResultVO : allChildren){
|
|
for (AnalysisResultVO analysisResultVO : allChildren){
|
|
if (analysisResultVO.getScope().equals("名称")){
|
|
if (analysisResultVO.getScope().equals("名称")){
|
|
MergeTableVO mergeVO = MergeTableVO.builder()
|
|
MergeTableVO mergeVO = MergeTableVO.builder()
|
|
- .name(analysisResultVO.getQuestionName()
|
|
|
|
- +"-"+ labelScore.get(analysisResultVO.getQuestionName())).build();
|
|
|
|
|
|
+ .name(
|
|
|
|
+ TableCellVO.builder()
|
|
|
|
+ .label(analysisResultVO.getQuestionName())
|
|
|
|
+ .avgScore(labelScore.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .variance(varianceMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .validate(validateMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .build())
|
|
|
|
+ .element(TableCellVO.builder().build())
|
|
|
|
+ .element1(TableCellVO.builder().build())
|
|
|
|
+ .element2(TableCellVO.builder().build())
|
|
|
|
+ .build();
|
|
result.add(mergeVO);
|
|
result.add(mergeVO);
|
|
}
|
|
}
|
|
if (analysisResultVO.getScope().equals("定级因素")){
|
|
if (analysisResultVO.getScope().equals("定级因素")){
|
|
- MergeTableVO mergeVO = MergeTableVO.builder().element(analysisResultVO.getQuestionName()
|
|
|
|
- +"-"+ labelScore.get(analysisResultVO.getQuestionName()) )
|
|
|
|
- .name(childrenParentMap.get(analysisResultVO.getQuestionName())
|
|
|
|
- +"-"+ labelScore.get(childrenParentMap.get(analysisResultVO.getQuestionName()))).build();
|
|
|
|
|
|
+ MergeTableVO mergeVO = MergeTableVO.builder()
|
|
|
|
+ .element(
|
|
|
|
+ TableCellVO.builder()
|
|
|
|
+ .label(analysisResultVO.getQuestionName())
|
|
|
|
+ .avgScore(labelScore.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .variance(varianceMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .validate(validateMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .build())
|
|
|
|
+ .name(
|
|
|
|
+ TableCellVO.builder()
|
|
|
|
+ .label(childrenParentMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .avgScore(labelScore.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .variance(varianceMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .validate(validateMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .build())
|
|
|
|
+ .element1(TableCellVO.builder().build())
|
|
|
|
+ .element2(TableCellVO.builder().build())
|
|
|
|
+ .build();
|
|
|
|
+
|
|
result.add(mergeVO);
|
|
result.add(mergeVO);
|
|
}
|
|
}
|
|
if (analysisResultVO.getScope().equals("一级因子")){
|
|
if (analysisResultVO.getScope().equals("一级因子")){
|
|
- MergeTableVO mergeVO = MergeTableVO.builder().element1(analysisResultVO.getQuestionName()
|
|
|
|
- +"-"+ labelScore.get(analysisResultVO.getQuestionName()))
|
|
|
|
- .element(childrenParentMap.get(analysisResultVO.getQuestionName())
|
|
|
|
- +"-"+ labelScore.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
- .name(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
- +"-"+ labelScore.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))).build();
|
|
|
|
|
|
+ MergeTableVO mergeVO = MergeTableVO.builder()
|
|
|
|
+ .element1(
|
|
|
|
+ TableCellVO.builder().label(analysisResultVO.getQuestionName())
|
|
|
|
+ .avgScore(labelScore.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .variance(varianceMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .validate(validateMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .build())
|
|
|
|
+ .element(
|
|
|
|
+ TableCellVO.builder().label(childrenParentMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .avgScore(labelScore.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .variance(varianceMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .validate(validateMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .build())
|
|
|
|
+ .name(
|
|
|
|
+ TableCellVO.builder().label(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .avgScore(labelScore.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))
|
|
|
|
+ .variance(varianceMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))
|
|
|
|
+ .validate(validateMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))
|
|
|
|
+ .build())
|
|
|
|
+ .element2(TableCellVO.builder().build())
|
|
|
|
+ .build();
|
|
result.add(mergeVO);
|
|
result.add(mergeVO);
|
|
}
|
|
}
|
|
if (analysisResultVO.getScope().equals("二级因子")){
|
|
if (analysisResultVO.getScope().equals("二级因子")){
|
|
- MergeTableVO mergeVO = MergeTableVO.builder().element2(analysisResultVO.getQuestionName()
|
|
|
|
- +"-"+ labelScore.get(analysisResultVO.getQuestionName()))
|
|
|
|
- .element1(childrenParentMap.get(analysisResultVO.getQuestionName())
|
|
|
|
- +"-"+ labelScore.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
- .element(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
- +"-"+ labelScore.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))
|
|
|
|
- .name(childrenParentMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
- +"-"+ labelScore.get(childrenParentMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))).build();
|
|
|
|
|
|
+ MergeTableVO mergeVO = MergeTableVO.builder()
|
|
|
|
+ .element2(
|
|
|
|
+ TableCellVO.builder().label(analysisResultVO.getQuestionName())
|
|
|
|
+ .avgScore(labelScore.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .variance(varianceMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .validate(validateMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .build())
|
|
|
|
+ .element1(
|
|
|
|
+ TableCellVO.builder().label(childrenParentMap.get(analysisResultVO.getQuestionName()))
|
|
|
|
+ .avgScore(labelScore.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .variance(varianceMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .validate(validateMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .build())
|
|
|
|
+ .element(
|
|
|
|
+ TableCellVO.builder().label(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))
|
|
|
|
+ .avgScore(labelScore.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))
|
|
|
|
+ .variance(varianceMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))
|
|
|
|
+ .validate(validateMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))
|
|
|
|
+ .build())
|
|
|
|
+ .name(
|
|
|
|
+ TableCellVO.builder().label(childrenParentMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName()))))
|
|
|
|
+ .avgScore(labelScore.get(childrenParentMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))))
|
|
|
|
+ .variance(varianceMap.get(childrenParentMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))))
|
|
|
|
+ .validate(validateMap.get(childrenParentMap.get(childrenParentMap.get(childrenParentMap.get(analysisResultVO.getQuestionName())))))
|
|
|
|
+ .build())
|
|
|
|
+ .build();
|
|
result.add(mergeVO);
|
|
result.add(mergeVO);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -103,6 +180,47 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
|
|
return merge;
|
|
return merge;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
+ public Boolean doAnalysis() {
|
|
|
|
+ List<ProfessorResult> originScores = professorResultService.getCurrentOriginScore();
|
|
|
|
+ Long currentCycleId = originScores.get(0).getCycleId();
|
|
|
|
+ Integer currentCycleNum = originScores.get(0).getCycleNum();
|
|
|
|
+ Long documentId = originScores.get(0).getDocumentId();
|
|
|
|
+ //计算方差
|
|
|
|
+ Map<Long, List<ProfessorResult>> collect = originScores.stream().collect(Collectors.groupingBy(ProfessorResult::getQuestionId));
|
|
|
|
+ Map<Long,List<BigDecimal>> originData = new HashMap<>();
|
|
|
|
+ for (Map.Entry<Long,List<ProfessorResult>> map : collect.entrySet()){
|
|
|
|
+ List<BigDecimal> scores = map.getValue().stream().map(ProfessorResult::getScore).collect(Collectors.toList());
|
|
|
|
+ originData.put(map.getKey(),scores);
|
|
|
|
+ }
|
|
|
|
+ Map<Long,BigDecimal> avgScoreMap = professorResultService.getCurrentAvgScore();
|
|
|
|
+ Map<Long, BigDecimal> varianceMap = doVariance(originData, avgScoreMap);
|
|
|
|
+ List<QuestionAnalysis> analysisData = this.list(new LambdaQueryWrapper<QuestionAnalysis>().eq(QuestionAnalysis::getCycleId, currentCycleId));
|
|
|
|
+ analysisData.stream().forEach(x->{
|
|
|
|
+ x.setVariance(varianceMap.get(x.getQuestionId()));
|
|
|
|
+ });
|
|
|
|
+ this.updateBatchById(analysisData);
|
|
|
|
+
|
|
|
|
+ //计算校验值
|
|
|
|
+ if (currentCycleNum!=1){
|
|
|
|
+ List<QuestionAnalysis> firstCycleData = questionAnalysisMapper.getPreviousCycleAnalysisData(documentId);
|
|
|
|
+ Map<Long, BigDecimal> firstVariance = firstCycleData.stream().collect(Collectors.toMap(QuestionAnalysis::getQuestionId, QuestionAnalysis::getVariance));
|
|
|
|
+ analysisData.stream().forEach(x->{
|
|
|
|
+ BigDecimal size = BigDecimal.valueOf(originData.get(x.getQuestionId()).size());
|
|
|
|
+ BigDecimal pVariance = firstVariance.get(x.getQuestionId());
|
|
|
|
+ if (pVariance.compareTo(BigDecimal.ZERO)!=0){
|
|
|
|
+ BigDecimal validate = x.getVariance().multiply(size).divide(pVariance, 4, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+ x.setValidate(validate);
|
|
|
|
+ }else {
|
|
|
|
+ x.setValidate(BigDecimal.ZERO);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ });
|
|
|
|
+ this.updateBatchById(analysisData);
|
|
|
|
+ }
|
|
|
|
+ return Boolean.TRUE;
|
|
|
|
+ }
|
|
|
|
+
|
|
private List<AnalysisResultVO> getChildrenAll(AnalysisResultVO analysisResultVO,List<AnalysisResultVO> allChildren){
|
|
private List<AnalysisResultVO> getChildrenAll(AnalysisResultVO analysisResultVO,List<AnalysisResultVO> allChildren){
|
|
List<AnalysisResultVO> children = analysisResultVO.getChildren();
|
|
List<AnalysisResultVO> children = analysisResultVO.getChildren();
|
|
if (CollectionUtils.isEmpty(children)){
|
|
if (CollectionUtils.isEmpty(children)){
|
|
@@ -126,4 +244,21 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
|
|
}
|
|
}
|
|
return childrenNull;
|
|
return childrenNull;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ private Map<Long,BigDecimal> doVariance(Map<Long,List<BigDecimal>> originData,Map<Long,BigDecimal> avgData){
|
|
|
|
+ Map<Long,BigDecimal> variances = new HashMap<>();
|
|
|
|
+ for (Map.Entry<Long,List<BigDecimal>> data : originData.entrySet()){
|
|
|
|
+ BigDecimal avg = avgData.get(data.getKey());
|
|
|
|
+ List<BigDecimal> values = data.getValue();
|
|
|
|
+ double powSum = 0d;
|
|
|
|
+ for (BigDecimal value : values){
|
|
|
|
+ BigDecimal subtract = value.subtract(avg);
|
|
|
|
+ double pow = Math.pow(subtract.doubleValue(), 2);
|
|
|
|
+ powSum += pow;
|
|
|
|
+ }
|
|
|
|
+ BigDecimal variance = BigDecimal.valueOf(powSum / (values.size())).setScale(2, BigDecimal.ROUND_HALF_UP);
|
|
|
|
+ variances.put(data.getKey(),variance);
|
|
|
|
+ }
|
|
|
|
+ return variances;
|
|
|
|
+ }
|
|
}
|
|
}
|