|
|
@@ -0,0 +1,160 @@
|
|
|
+package cn.seecoder.data.server.service.Impl;
|
|
|
+
|
|
|
+
|
|
|
+import cn.seecoder.bok.client.SeecoderBokClient;
|
|
|
+import cn.seecoder.bok.common.vo.QuestionVO;
|
|
|
+import cn.seecoder.data.server.dto.knowledge.KnowledgeNodeDTO;
|
|
|
+import cn.seecoder.data.server.repository.GeneralRecordRepository;
|
|
|
+import cn.seecoder.data.server.repository.KnowledgeRepository;
|
|
|
+import cn.seecoder.data.server.service.GeneralService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+
|
|
|
+@Service
|
|
|
+public class GeneralServiceImpl implements GeneralService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private GeneralRecordRepository generalRecordRepository;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private KnowledgeRepository knowledgeRepository;
|
|
|
+
|
|
|
+ public GeneralServiceImpl(GeneralRecordRepository generalRecordRepository
|
|
|
+ ,KnowledgeRepository knowledgeRepository){
|
|
|
+ this.generalRecordRepository = generalRecordRepository;
|
|
|
+ this.knowledgeRepository = knowledgeRepository;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public KnowledgeNodeDTO getTreeNode(int userId) {
|
|
|
+ List generalScoreList = generalRecordRepository.getByUserIdMaxScore(userId);
|
|
|
+ ArrayList<String> questionIds = new ArrayList<>();
|
|
|
+ ArrayList<Double> scores = new ArrayList<>();
|
|
|
+ ArrayList<Double> scoresTotal = new ArrayList<>();
|
|
|
+ for(int i=0;i<generalScoreList.size();i++) {
|
|
|
+ Object[] cells = (Object[]) generalScoreList.get(i);
|
|
|
+ questionIds.add((String)cells[0]);
|
|
|
+ scores.add(Double.valueOf(cells[1].toString()));
|
|
|
+ scoresTotal.add(Double.valueOf(generalRecordRepository.getByQuestionId((String)cells[0]).get(0).getScoreTotal().toString()));
|
|
|
+ }
|
|
|
+ SeecoderBokClient seecoderBokClient = new SeecoderBokClient("http://bok.seec.seecoder.cn");
|
|
|
+ List<QuestionVO> questionVOS = seecoderBokClient.getQuestionListByIds(questionIds);
|
|
|
+ ArrayList<KnowledgeNodeDTO> knowledgeNodeDTOS = new ArrayList<>();
|
|
|
+ ArrayList<String> knowledgeName = new ArrayList<>();
|
|
|
+ double[] weights = {1,1,1,1.1,1.2};
|
|
|
+ for(int i=0;i<questionVOS.size();i++){
|
|
|
+ QuestionVO questionVO = questionVOS.get(i);
|
|
|
+ ArrayList<String> knowledgeList = (ArrayList<String>) questionVO.getKnowledgeId();
|
|
|
+ if(knowledgeList!=null && knowledgeList.size()>0) {
|
|
|
+ for (String knowledge : knowledgeList) {
|
|
|
+ if(knowledgeName.contains(knowledge)){
|
|
|
+ int index = knowledgeName.indexOf(knowledge);
|
|
|
+ KnowledgeNodeDTO knowledgeNodeDTO = knowledgeNodeDTOS.get(index);
|
|
|
+ if(questionVO.getWeight()==null || questionVO.getWeight()==0){
|
|
|
+ knowledgeNodeDTO.setScoreGotten(knowledgeNodeDTO.getScoreGotten()+scores.get(i));
|
|
|
+ knowledgeNodeDTO.setScoreTotal(knowledgeNodeDTO.getScoreTotal()+scoresTotal.get(i));
|
|
|
+ knowledgeNodeDTO.setQuestionsNumDone(knowledgeNodeDTO.getQuestionsNumDone()+1);
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ knowledgeNodeDTO.setScoreGotten(knowledgeNodeDTO.getScoreGotten()+scores.get(i)*weights[questionVO.getWeight()]);
|
|
|
+ knowledgeNodeDTO.setScoreTotal(knowledgeNodeDTO.getScoreTotal()+scoresTotal.get(i));
|
|
|
+ knowledgeNodeDTO.setQuestionsNumDone(knowledgeNodeDTO.getQuestionsNumDone()+1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ knowledgeName.add(knowledge);
|
|
|
+ if(questionVO.getWeight()!=null && questionVO.getWeight()!=0)
|
|
|
+ knowledgeNodeDTOS.add(new KnowledgeNodeDTO(knowledge,scores.get(i)*weights[questionVO.getWeight()]
|
|
|
+ ,scoresTotal.get(i),1,0,null));
|
|
|
+ else
|
|
|
+ knowledgeNodeDTOS.add(new KnowledgeNodeDTO(knowledge,scores.get(i)
|
|
|
+ ,scoresTotal.get(i),1,0,null));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for(int i=0;i<knowledgeNodeDTOS.size();i++){
|
|
|
+ KnowledgeNodeDTO knowledgeNodeDTO = knowledgeNodeDTOS.get(i);
|
|
|
+ ArrayList<String> knowledgeIds = new ArrayList<>();
|
|
|
+ knowledgeIds.add(knowledgeNodeDTO.getKnowledge());
|
|
|
+ long questionNum = seecoderBokClient.getQuestionList(null,null,knowledgeIds,null).getTotalElements();
|
|
|
+ knowledgeNodeDTO.setQuestionsNumTotal(questionNum);
|
|
|
+ }
|
|
|
+ KnowledgeNodeDTO root = new KnowledgeNodeDTO("SE",0,0,0,0,null);
|
|
|
+ root.setName("Software Engineering");
|
|
|
+ for(int i=0;i<knowledgeNodeDTOS.size();i++){
|
|
|
+ KnowledgeNodeDTO node = knowledgeNodeDTOS.get(i);
|
|
|
+ String[] tempNodes = node.getKnowledge().split("\\.");
|
|
|
+ boolean newNode = false;
|
|
|
+ if(tempNodes.length>0){
|
|
|
+ if(tempNodes[0].trim().equals("SE")) {
|
|
|
+ addstatistics(root,node);
|
|
|
+ }
|
|
|
+ else{
|
|
|
+ int deep = 0;
|
|
|
+ KnowledgeNodeDTO target = root;
|
|
|
+ String prefix = "";
|
|
|
+ while (tempNodes.length>deep){
|
|
|
+ ArrayList<String> abbreviations = getAbbreviationOnDTO(target.getKnowledgeNodeDTOs());
|
|
|
+ String knowledgeAbb;
|
|
|
+ if(!newNode)
|
|
|
+ addstatistics(target,node);
|
|
|
+ if(prefix.equals(""))
|
|
|
+ knowledgeAbb = prefix + tempNodes[deep];
|
|
|
+ else
|
|
|
+ knowledgeAbb = prefix + "." + tempNodes[deep];
|
|
|
+ if(abbreviations.contains(knowledgeAbb))
|
|
|
+ target = target.getKnowledgeNodeDTOs().get(abbreviations.indexOf(knowledgeAbb));
|
|
|
+ else{
|
|
|
+ newNode = true;
|
|
|
+ KnowledgeNodeDTO temp = new KnowledgeNodeDTO(knowledgeAbb, node.getScoreGotten(), node.getScoreTotal(),
|
|
|
+ node.getQuestionsNumDone(), node.getQuestionsNumTotal(), null);
|
|
|
+ if(knowledgeRepository.findByAbbreviation(knowledgeAbb).size()>0) {
|
|
|
+ temp.setName(knowledgeRepository.findByAbbreviation(knowledgeAbb).get(0).getName());
|
|
|
+ }
|
|
|
+ ArrayList<KnowledgeNodeDTO> know = (ArrayList<KnowledgeNodeDTO>) target.getKnowledgeNodeDTOs();
|
|
|
+ if(know == null)
|
|
|
+ know = new ArrayList<>();
|
|
|
+ know.add(temp);
|
|
|
+ target.setKnowledgeNodeDTOs(know);
|
|
|
+ target = temp;
|
|
|
+ }
|
|
|
+ prefix = knowledgeAbb;
|
|
|
+ deep++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ getCoverAndCorretRates(root);
|
|
|
+ return root;
|
|
|
+ }
|
|
|
+
|
|
|
+ public ArrayList<String> getAbbreviationOnDTO(List<KnowledgeNodeDTO> knowledgeNodeDTOS){
|
|
|
+ ArrayList<String> arrayList= new ArrayList<>();
|
|
|
+ if(knowledgeNodeDTOS!=null && knowledgeNodeDTOS.size()>0) {
|
|
|
+ for (KnowledgeNodeDTO knowledgeNodeDTO : knowledgeNodeDTOS)
|
|
|
+ arrayList.add(knowledgeNodeDTO.getKnowledge());
|
|
|
+ }
|
|
|
+ return arrayList;
|
|
|
+ }
|
|
|
+
|
|
|
+ public void addstatistics(KnowledgeNodeDTO target,KnowledgeNodeDTO adder){
|
|
|
+ target.setScoreGotten(target.getScoreGotten()+adder.getScoreGotten());
|
|
|
+ target.setScoreTotal(target.getScoreTotal()+adder.getScoreTotal());
|
|
|
+ target.setQuestionsNumDone(target.getQuestionsNumDone()+adder.getQuestionsNumDone());
|
|
|
+ target.setQuestionsNumTotal(target.getQuestionsNumTotal()+adder.getQuestionsNumTotal());
|
|
|
+ }
|
|
|
+
|
|
|
+ public void getCoverAndCorretRates(KnowledgeNodeDTO root){
|
|
|
+ root.setCoverageRate(root.getQuestionsNumDone()/ root.getQuestionsNumTotal());
|
|
|
+ root.setCorrectRate(root.getScoreGotten()/root.getScoreTotal());
|
|
|
+ if(root.getKnowledgeNodeDTOs()!=null && root.getKnowledgeNodeDTOs().size()>0){
|
|
|
+ for(KnowledgeNodeDTO temp : root.getKnowledgeNodeDTOs())
|
|
|
+ getCoverAndCorretRates(temp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|