wucl před 2 roky
rodič
revize
edc87c36bf
39 změnil soubory, kde provedl 792 přidání a 135 odebrání
  1. 72 19
      .idea/workspace.xml
  2. 5 0
      pom.xml
  3. 8 0
      src/main/java/com/dayou/controller/DocumentController.java
  4. 4 2
      src/main/java/com/dayou/controller/ProfessorResultController.java
  5. 12 4
      src/main/java/com/dayou/controller/QuestionAnalysisController.java
  6. 2 0
      src/main/java/com/dayou/dao/CycleMapper.java
  7. 14 0
      src/main/java/com/dayou/dao/FailQuestionMapper.java
  8. 8 1
      src/main/java/com/dayou/dao/ProfessorResultMapper.java
  9. 5 2
      src/main/java/com/dayou/dao/QuestionAnalysisMapper.java
  10. 2 0
      src/main/java/com/dayou/dao/QuestionMapper.java
  11. 11 1
      src/main/java/com/dayou/entity/Cycle.java
  12. 19 0
      src/main/java/com/dayou/entity/FailQuestion.java
  13. 7 0
      src/main/java/com/dayou/entity/ProfessorResult.java
  14. 4 0
      src/main/java/com/dayou/entity/QuestionAnalysis.java
  15. 2 0
      src/main/java/com/dayou/service/ICycleService.java
  16. 3 0
      src/main/java/com/dayou/service/IDocumentService.java
  17. 14 0
      src/main/java/com/dayou/service/IFailQuestionService.java
  18. 10 1
      src/main/java/com/dayou/service/IProfessorResultService.java
  19. 5 2
      src/main/java/com/dayou/service/IQuestionAnalysisService.java
  20. 2 0
      src/main/java/com/dayou/service/IQuestionService.java
  21. 92 4
      src/main/java/com/dayou/service/impl/CycleServiceImpl.java
  22. 41 23
      src/main/java/com/dayou/service/impl/DocumentServiceImpl.java
  23. 18 0
      src/main/java/com/dayou/service/impl/FailQuestionServiceImpl.java
  24. 41 19
      src/main/java/com/dayou/service/impl/ProfessorResultServiceImpl.java
  25. 165 30
      src/main/java/com/dayou/service/impl/QuestionAnalysisServiceImpl.java
  26. 9 0
      src/main/java/com/dayou/service/impl/QuestionServiceImpl.java
  27. 32 0
      src/main/java/com/dayou/utils/MathUtil.java
  28. 11 1
      src/main/java/com/dayou/vo/AnalysisResultVO.java
  29. 1 1
      src/main/java/com/dayou/vo/CycleVO.java
  30. 4 4
      src/main/java/com/dayou/vo/MergeTableVO.java
  31. 10 1
      src/main/java/com/dayou/vo/MergeVO.java
  32. 21 0
      src/main/java/com/dayou/vo/OriginScoreVO.java
  33. 2 1
      src/main/java/com/dayou/vo/ProfessorResultVO.java
  34. 27 0
      src/main/java/com/dayou/vo/TableCellVO.java
  35. 42 9
      src/main/resources/mapper/AnalysisResultMapper.xml
  36. 18 3
      src/main/resources/mapper/CycleMapper.xml
  37. 3 3
      src/main/resources/mapper/DocumentMapper.xml
  38. 37 4
      src/main/resources/mapper/ProfessorResultMapper.xml
  39. 9 0
      src/main/resources/mapper/QuestionMapper.xml

+ 72 - 19
.idea/workspace.xml

@@ -5,15 +5,44 @@
   </component>
   <component name="ChangeListManager">
     <list default="true" id="298c0123-5a38-45f2-a872-7d3a74d33353" name="Changes" comment="">
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/controller/ConfigurationController.java" afterDir="false" />
-      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/entity/Configuration.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/dao/FailQuestionMapper.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/entity/FailQuestion.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/IFailQuestionService.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/FailQuestionServiceImpl.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/utils/MathUtil.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/vo/OriginScoreVO.java" afterDir="false" />
+      <change afterPath="$PROJECT_DIR$/src/main/java/com/dayou/vo/TableCellVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/pom.xml" beforeDir="false" afterPath="$PROJECT_DIR$/pom.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/controller/DocumentController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/controller/DocumentController.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/controller/ProfessorResultController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/controller/ProfessorResultController.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/controller/QuestionAnalysisController.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/controller/QuestionAnalysisController.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/dao/DocumentQuestionMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/dao/ConfigurationMapper.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/interceptor/LoginInterceptor.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/interceptor/LoginInterceptor.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/IDocumentQuestionService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/IConfigurationService.java" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/DocumentQuestionServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/ConfigurationServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/dao/CycleMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/dao/CycleMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/dao/ProfessorResultMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/dao/ProfessorResultMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/dao/QuestionAnalysisMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/dao/QuestionAnalysisMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/dao/QuestionMapper.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/dao/QuestionMapper.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/entity/Cycle.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/entity/Cycle.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/entity/ProfessorResult.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/entity/ProfessorResult.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/entity/QuestionAnalysis.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/entity/QuestionAnalysis.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/ICycleService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/ICycleService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/IDocumentService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/IDocumentService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/IProfessorResultService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/IProfessorResultService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/IQuestionAnalysisService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/IQuestionAnalysisService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/IQuestionService.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/IQuestionService.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/CycleServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/CycleServiceImpl.java" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/DocumentServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/DocumentServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/ProfessorResultServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/ProfessorResultServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/QuestionAnalysisServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/QuestionAnalysisServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/QuestionServiceImpl.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/service/impl/QuestionServiceImpl.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/vo/AnalysisResultVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/vo/AnalysisResultVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/vo/CycleVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/vo/CycleVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/vo/MergeTableVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/vo/MergeTableVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/vo/MergeVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/vo/MergeVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/java/com/dayou/vo/ProfessorResultVO.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/java/com/dayou/vo/ProfessorResultVO.java" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mapper/AnalysisResultMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/AnalysisResultMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mapper/CycleMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/CycleMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mapper/DocumentMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/DocumentMapper.xml" afterDir="false" />
       <change beforePath="$PROJECT_DIR$/src/main/resources/mapper/ProfessorResultMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/ProfessorResultMapper.xml" afterDir="false" />
+      <change beforePath="$PROJECT_DIR$/src/main/resources/mapper/QuestionMapper.xml" beforeDir="false" afterPath="$PROJECT_DIR$/src/main/resources/mapper/QuestionMapper.xml" afterDir="false" />
     </list>
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -95,7 +124,33 @@
       <recent name="com.dayou" />
     </key>
   </component>
-  <component name="RunManager">
+  <component name="RunManager" selected="Spring Boot.BASEAPPLICATION">
+    <configuration name="CycleServiceImpl" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.dayou.service.impl.CycleServiceImpl" />
+      <module name="kps-phase" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.dayou.service.impl.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="MathUtil" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.dayou.utils.MathUtil" />
+      <module name="kps-phase" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.dayou.utils.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
     <configuration name="BASEAPPLICATION" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
       <option name="ACTIVE_PROFILES" />
       <option name="ALTERNATIVE_JRE_PATH" value="F:\development\java\jdk1.8.0_121\jre" />
@@ -105,6 +160,12 @@
         <option name="Make" enabled="true" />
       </method>
     </configuration>
+    <recent_temporary>
+      <list>
+        <item itemvalue="Application.MathUtil" />
+        <item itemvalue="Application.CycleServiceImpl" />
+      </list>
+    </recent_temporary>
   </component>
   <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
   <component name="TaskManager">
@@ -126,7 +187,10 @@
       <workItem from="1690331871855" duration="13059000" />
       <workItem from="1690420437727" duration="9737000" />
       <workItem from="1690504907314" duration="14920000" />
-      <workItem from="1690764120436" duration="8074000" />
+      <workItem from="1690764120436" duration="21976000" />
+      <workItem from="1690936963250" duration="25050000" />
+      <workItem from="1691023746270" duration="13418000" />
+      <workItem from="1691109689576" duration="9088000" />
     </task>
     <servers />
   </component>
@@ -144,15 +208,4 @@
       </map>
     </option>
   </component>
-  <component name="XDebuggerManager">
-    <breakpoint-manager>
-      <breakpoints>
-        <line-breakpoint enabled="true" type="java-line">
-          <url>file://$PROJECT_DIR$/src/main/java/com/dayou/service/impl/DocumentServiceImpl.java</url>
-          <line>54</line>
-          <option name="timeStamp" value="5" />
-        </line-breakpoint>
-      </breakpoints>
-    </breakpoint-manager>
-  </component>
 </project>

+ 5 - 0
pom.xml

@@ -198,6 +198,11 @@
             <artifactId>spring-boot-starter-websocket</artifactId>
             <version>2.4.9</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-math3</artifactId>
+            <version>3.6.1</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 8 - 0
src/main/java/com/dayou/controller/DocumentController.java

@@ -9,9 +9,11 @@ import com.dayou.configuration.RestResponse;
 import com.dayou.configuration.annotation.IgnoreAuth;
 import com.dayou.dto.CommitDTO;
 import com.dayou.dto.DocumentDTO;
+import com.dayou.entity.Cycle;
 import com.dayou.entity.Document;
 import com.dayou.service.IDocumentService;
 import com.dayou.service.IProfessorResultService;
+import com.dayou.vo.CycleVO;
 import com.dayou.vo.DocumentCycleVO;
 import com.dayou.vo.DocumentVO;
 import lombok.extern.slf4j.Slf4j;
@@ -82,4 +84,10 @@ public class DocumentController {
         Boolean result = documentService.saveOrUpdate(document);
         return RestResponse.data(result);
     }
+
+    @GetMapping("/next/{documentId}")
+    public RestResponse<Cycle> nextCycle(@PathVariable("documentId") Long documentId){
+        Cycle cycle = documentService.nextCycle(documentId);
+        return RestResponse.data(cycle);
+    }
 }

+ 4 - 2
src/main/java/com/dayou/controller/ProfessorResultController.java

@@ -2,8 +2,10 @@ package com.dayou.controller;
 
 import com.dayou.configuration.RestResponse;
 import com.dayou.configuration.annotation.IgnoreAuth;
+import com.dayou.entity.Cycle;
 import com.dayou.service.IProfessorResultService;
 import com.dayou.vo.AnalysisResultVO;
+import com.dayou.vo.OriginScoreVO;
 import com.dayou.vo.ProfessorResultVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,8 +30,8 @@ public class ProfessorResultController {
 
     @IgnoreAuth
     @GetMapping("/current")
-    public RestResponse<List<ProfessorResultVO>> getResultList(){
-        List<ProfessorResultVO> list = professorResultService.getResultList();
+    public RestResponse<List<OriginScoreVO>> getResultList(Cycle cycle){
+        List<OriginScoreVO> list = professorResultService.getResultList(cycle);
         return RestResponse.data(list);
     }
 

+ 12 - 4
src/main/java/com/dayou/controller/QuestionAnalysisController.java

@@ -2,6 +2,7 @@ package com.dayou.controller;
 
 import com.dayou.configuration.RestResponse;
 import com.dayou.configuration.annotation.IgnoreAuth;
+import com.dayou.entity.Cycle;
 import com.dayou.service.IQuestionAnalysisService;
 import com.dayou.vo.AnalysisResultVO;
 import com.dayou.vo.MergeTableVO;
@@ -32,8 +33,8 @@ public class QuestionAnalysisController {
 
     @IgnoreAuth
     @GetMapping("/current")
-    public RestResponse<List<AnalysisResultVO>> getAnalysisList(){
-        List<AnalysisResultVO> list = questionAnalysisService.getAnalysisList();
+    public RestResponse<List<AnalysisResultVO>> getAnalysisList(Cycle cycle){
+        List<AnalysisResultVO> list = questionAnalysisService.getAnalysisList(cycle);
         return RestResponse.data(list);
     }
 
@@ -45,8 +46,15 @@ public class QuestionAnalysisController {
 
     @IgnoreAuth
     @GetMapping("/merge")
-    public RestResponse<MergeVO> getMergeData(){
-        MergeVO mergeVO = questionAnalysisService.getMergeData();
+    public RestResponse<MergeVO> getMergeData(Cycle cycle){
+        MergeVO mergeVO = questionAnalysisService.getMergeData(cycle);
         return RestResponse.data(mergeVO);
     }
+
+    @IgnoreAuth
+    @GetMapping("")
+    public RestResponse<Boolean> doAnalysis(){
+        Boolean b = questionAnalysisService.doAnalysis();
+        return RestResponse.data(b);
+    }
 }

+ 2 - 0
src/main/java/com/dayou/dao/CycleMapper.java

@@ -16,4 +16,6 @@ import org.apache.ibatis.annotations.Param;
  */
 public interface CycleMapper extends BaseMapper<Cycle> {
     IPage<CycleVO> getPage(Page page, @Param("cycle") CycleVO cycleVO);
+
+    Cycle nextCycle(@Param("documentId") Long documentId);
 }

+ 14 - 0
src/main/java/com/dayou/dao/FailQuestionMapper.java

@@ -0,0 +1,14 @@
+package com.dayou.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dayou.entity.FailQuestion;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/8/1
+ * created with IntelliJ IDEA.
+ */
+public interface FailQuestionMapper extends BaseMapper<FailQuestion> {
+}

+ 8 - 1
src/main/java/com/dayou/dao/ProfessorResultMapper.java

@@ -1,13 +1,18 @@
 package com.dayou.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dayou.entity.Cycle;
 import com.dayou.entity.ProfessorResult;
 import com.dayou.entity.QuestionAnalysis;
 import com.dayou.vo.ProfessorResultVO;
 import com.dayou.vo.QuestionVO;
+import org.apache.ibatis.annotations.MapKey;
 import org.apache.ibatis.annotations.Param;
 
+import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 类说明:
@@ -20,8 +25,10 @@ public interface ProfessorResultMapper extends BaseMapper<ProfessorResult> {
     List<QuestionAnalysis> getAvgScore(@Param("cycleId") Long cycleId, @Param("questionId")Long questionId);
 
 
-    List<ProfessorResultVO> getResultList();
+    List<ProfessorResultVO> getResultList(@Param("cycle") Cycle cycle);
 
     List<ProfessorResultVO> getResultByCycleId(@Param("id") Long id);
 
+    List<ProfessorResult> getCurrentOriginScore();
+    List<QuestionAnalysis> getCurrentAvgScore();
 }

+ 5 - 2
src/main/java/com/dayou/dao/QuestionAnalysisMapper.java

@@ -1,6 +1,7 @@
 package com.dayou.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.dayou.entity.Cycle;
 import com.dayou.entity.QuestionAnalysis;
 import com.dayou.vo.AnalysisResultVO;
 import com.dayou.vo.ChildrenParentName;
@@ -17,9 +18,11 @@ import java.util.Map;
  * created with IntelliJ IDEA.
  */
 public interface QuestionAnalysisMapper extends BaseMapper<QuestionAnalysis> {
-    List<AnalysisResultVO> getAnalysisList();
+    List<AnalysisResultVO> getAnalysisList(@Param("cycle") Cycle cycle);
 
     List<AnalysisResultVO> getAnalysisListByCycleId(@Param("id") Long id);
 
-    List<ChildrenParentName> getParentLabel();
+    List<ChildrenParentName> getParentLabel(@Param("cycle") Cycle cycle);
+
+    List<QuestionAnalysis> getPreviousCycleAnalysisData(@Param("documentId") Long documentId);
 }

+ 2 - 0
src/main/java/com/dayou/dao/QuestionMapper.java

@@ -15,4 +15,6 @@ import java.util.List;
  */
 public interface QuestionMapper extends BaseMapper<Question> {
     List<Question> findChildren(@Param("rootId") Long rootId);
+
+    List<Question> getFailQuestions(@Param("parentIds")List<Long> parentIds);
 }

+ 11 - 1
src/main/java/com/dayou/entity/Cycle.java

@@ -5,6 +5,8 @@ import com.github.liangbaika.validate.annations.AbcValidate;
 import com.github.liangbaika.validate.enums.Check;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
  * 类说明:
  *
@@ -19,5 +21,13 @@ public class Cycle extends BaseEntity {
     private Long documentId;
 
     @AbcValidate(required = true,message = "轮数不能为空",fun = Check.NotEmpty)
-    private String cycleName;
+    private Integer cycleNum;
+
+    @AbcValidate(required = true,message = "专家人数不能为空",fun = Check.NotEmpty)
+    private Integer professorNum;
+
+    @AbcValidate(required = true,message = "累积概率不能为空",fun = Check.NotEmpty)
+    private BigDecimal probability;
+
+    private BigDecimal standardValue;
 }

+ 19 - 0
src/main/java/com/dayou/entity/FailQuestion.java

@@ -0,0 +1,19 @@
+package com.dayou.entity;
+
+import com.dayou.configuration.BaseEntity;
+import lombok.Data;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/8/1
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class FailQuestion extends BaseEntity {
+
+    private Long cycleId;
+
+    private Long questionParentId;
+}

+ 7 - 0
src/main/java/com/dayou/entity/ProfessorResult.java

@@ -1,5 +1,6 @@
 package com.dayou.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.dayou.configuration.BaseEntity;
 import lombok.Builder;
 import lombok.Data;
@@ -20,4 +21,10 @@ public class ProfessorResult extends BaseEntity {
     private Long cycleId;
     private Long questionId;
     private BigDecimal score;
+
+    @TableField(exist = false)
+    private Integer cycleNum;
+
+    @TableField(exist = false)
+    private Long documentId;
 }

+ 4 - 0
src/main/java/com/dayou/entity/QuestionAnalysis.java

@@ -20,4 +20,8 @@ public class QuestionAnalysis extends BaseEntity {
     private Long questionId;
 
     private BigDecimal avgScore;
+
+    private BigDecimal variance;
+
+    private BigDecimal validate;
 }

+ 2 - 0
src/main/java/com/dayou/service/ICycleService.java

@@ -17,4 +17,6 @@ public interface ICycleService extends IService<Cycle> {
     IPage<CycleVO> getPage(Page page, CycleVO cycleVO);
 
     Boolean saveCycle(Cycle cycle);
+
+    Cycle nextCycle(Long documentId);
 }

+ 3 - 0
src/main/java/com/dayou/service/IDocumentService.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dayou.dto.DocumentDTO;
+import com.dayou.entity.Cycle;
 import com.dayou.entity.Document;
 import com.dayou.vo.DocumentCycleVO;
 import com.dayou.vo.DocumentVO;
@@ -19,4 +20,6 @@ public interface IDocumentService extends IService<Document> {
     DocumentCycleVO getDocumentCycleVO();
 
     IPage<DocumentVO> getPage(Page page, Document document);
+
+    Cycle nextCycle(Long documentId);
 }

+ 14 - 0
src/main/java/com/dayou/service/IFailQuestionService.java

@@ -0,0 +1,14 @@
+package com.dayou.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dayou.entity.FailQuestion;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/8/1
+ * created with IntelliJ IDEA.
+ */
+public interface IFailQuestionService extends IService<FailQuestion> {
+}

+ 10 - 1
src/main/java/com/dayou/service/IProfessorResultService.java

@@ -2,12 +2,17 @@ package com.dayou.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.dayou.dto.CommitDTO;
+import com.dayou.entity.Cycle;
 import com.dayou.entity.ProfessorResult;
 import com.dayou.vo.AnalysisResultVO;
 import com.dayou.vo.DocumentCycleVO;
+import com.dayou.vo.OriginScoreVO;
 import com.dayou.vo.ProfessorResultVO;
 
+import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 类说明:
@@ -19,10 +24,14 @@ import java.util.List;
 public interface IProfessorResultService extends IService<ProfessorResult> {
     Boolean commitDocument(DocumentCycleVO documentCycleVO);
 
-    List<ProfessorResultVO> getResultList();
+    List<OriginScoreVO> getResultList(Cycle cycle);
 
 
     List<ProfessorResultVO> getResultByCycleId(Long id);
 
     boolean removeScore(Long id);
+
+    List<ProfessorResult> getCurrentOriginScore();
+
+    Map<Long, BigDecimal> getCurrentAvgScore();
 }

+ 5 - 2
src/main/java/com/dayou/service/IQuestionAnalysisService.java

@@ -1,6 +1,7 @@
 package com.dayou.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.dayou.entity.Cycle;
 import com.dayou.entity.QuestionAnalysis;
 import com.dayou.vo.AnalysisResultVO;
 import com.dayou.vo.MergeTableVO;
@@ -16,9 +17,11 @@ import java.util.List;
  * created with IntelliJ IDEA.
  */
 public interface IQuestionAnalysisService extends IService<QuestionAnalysis> {
-    List<AnalysisResultVO> getAnalysisList();
+    List<AnalysisResultVO> getAnalysisList(Cycle cycle);
 
     List<AnalysisResultVO> getAnalysisListByCycleId(Long id);
 
-    MergeVO getMergeData();
+    MergeVO getMergeData(Cycle cycle);
+
+    Boolean doAnalysis();
 }

+ 2 - 0
src/main/java/com/dayou/service/IQuestionService.java

@@ -15,4 +15,6 @@ import java.util.List;
  */
 public interface IQuestionService extends IService<Question> {
     List<QuestionTreeVO> getQuestionTree(Question question);
+
+    List<Question>  getFailQuestions(List<Long> parentIds);
 }

+ 92 - 4
src/main/java/com/dayou/service/impl/CycleServiceImpl.java

@@ -7,14 +7,21 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.configuration.BaseEntity;
 import com.dayou.configuration.ErrorCode;
 import com.dayou.dao.CycleMapper;
-import com.dayou.entity.Cycle;
-import com.dayou.service.ICycleService;
+import com.dayou.entity.*;
+import com.dayou.service.*;
+import com.dayou.utils.MathUtil;
 import com.dayou.vo.CycleVO;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.math3.distribution.ChiSquaredDistribution;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 类说明:
@@ -29,21 +36,102 @@ public class CycleServiceImpl extends ServiceImpl<CycleMapper, Cycle> implements
     @Autowired
     private CycleMapper cycleMapper;
 
+    @Autowired
+    private IProfessorResultService professorResultService;
+
+    @Autowired
+    private IQuestionAnalysisService questionAnalysisService;
+
+    @Autowired
+    private IQuestionService questionService;
+
+    @Autowired
+    private IFailQuestionService failQuestionService;
+
     @Override
     public IPage<CycleVO> getPage(Page page, CycleVO cycleVO) {
         IPage<CycleVO> result = cycleMapper.getPage(page,cycleVO);
         return result;
     }
 
+    @Transactional
     @Override
     public Boolean saveCycle(Cycle cycle) {
+        Integer cycleNum = cycle.getCycleNum();
         List<Cycle> list = this.list(new LambdaQueryWrapper<Cycle>().eq(Cycle::getDocumentId, cycle.getDocumentId())
-                .eq(Cycle::getCycleName, cycle.getCycleName()).eq(BaseEntity::getDeleted, Boolean.FALSE));
+                .eq(Cycle::getCycleNum, cycleNum).eq(BaseEntity::getDeleted, Boolean.FALSE));
         if (CollectionUtils.isEmpty(list)){
-            return this.save(cycle);
+            Integer professorNum = cycle.getProfessorNum();
+            BigDecimal probability = cycle.getProbability();
+            //计算方分布的左尾概率的反函数值
+            double chiSqValDouble = MathUtil.getChiSqVal(probability.doubleValue(),professorNum.doubleValue());
+            BigDecimal chiSqVal = BigDecimal.valueOf(chiSqValDouble).setScale(4, RoundingMode.HALF_UP);
+            cycle.setStandardValue(chiSqVal);
+            this.save(cycle);
+            //如果下发的是第一轮或者第二轮,就全量评分项下发
+            if (cycleNum>2){
+                Cycle previousCycle = this.getOne(new LambdaQueryWrapper<Cycle>().eq(Cycle::getDocumentId, cycle.getDocumentId())
+                        .eq(Cycle::getCycleNum, (cycleNum - 1)));
+                BigDecimal standardValue = previousCycle.getStandardValue();
+                Long cycleId = previousCycle.getId();
+                //获取上一轮的分析数据
+                List<QuestionAnalysis> previousAnalysisData = questionAnalysisService.list(new LambdaQueryWrapper<QuestionAnalysis>().eq(QuestionAnalysis::getCycleId, cycleId));
+                if (CollectionUtils.isEmpty(previousAnalysisData)){
+                    return Boolean.TRUE;
+                }
+                //上一轮的所有评分项
+                List<Long> allQuestionId = previousAnalysisData.stream().map(QuestionAnalysis::getQuestionId).collect(Collectors.toList());
+                //上一轮所有父级评分项id
+                Set<Long> questionsParentId = questionService.list(new LambdaQueryWrapper<Question>()
+                        .in(BaseEntity::getId, allQuestionId).eq(BaseEntity::getDeleted, Boolean.FALSE)).stream().map(Question::getParentId).collect(Collectors.toSet());
+
+                //上一轮未通过的评分项
+                List<Long> notPassQuestionsId = previousAnalysisData.stream().filter(x -> x.getValidate().compareTo(standardValue) == 1).map(QuestionAnalysis::getQuestionId).collect(Collectors.toList());
+                if (CollectionUtils.isEmpty(notPassQuestionsId)){
+                    ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"此问卷评分项已全部通过,若需继续下发,请新建问卷。");
+                }
+                List<Question> questions = questionService.list(new LambdaQueryWrapper<Question>()
+                        .in(BaseEntity::getId, notPassQuestionsId).eq(BaseEntity::getDeleted, Boolean.FALSE));
+                Set<Long> notPassParentIds = questions.stream().map(Question::getParentId).collect(Collectors.toSet());
+                questionsParentId.removeAll(notPassParentIds);
+                //上轮通过的父级id
+                if (CollectionUtils.isNotEmpty(questionsParentId)){
+                    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());
+                    if (CollectionUtils.isNotEmpty(passQuestionsId) && passQuestionsId.size()<previousAnalysisData.size()){
+                        List<ProfessorResult> previousOriginData = professorResultService.list(new LambdaQueryWrapper<ProfessorResult>().eq(ProfessorResult::getCycleId, cycleId)
+                                .in(ProfessorResult::getQuestionId,passQuestionsId));
+                        previousOriginData.stream().forEach(x->{
+                            x.setCycleId(cycle.getId());
+                        });
+                        professorResultService.saveBatch(previousOriginData);
+                        List<FailQuestion> failQuestions = notPassParentIds.stream().map(q -> {
+                            FailQuestion failQuestion = new FailQuestion();
+                            failQuestion.setCycleId(cycle.getId());
+                            failQuestion.setQuestionParentId(q);
+                            return failQuestion;
+                        }).collect(Collectors.toList());
+                        failQuestionService.saveBatch(failQuestions);
+                    }
+                }
+
+            }
+            //如果下发的不是第一轮或者第二轮,专家端只需对上轮未通过的评分项再次评分。后端自动生成已通过评分项的评分数据。插入到professor_result
+            // 找出上一轮未通过评分项的parentId,存入 fail_question
+            return Boolean.TRUE;
         }else {
             ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR,"该问卷此轮已存在。");
             return Boolean.FALSE;
         }
     }
+
+    @Override
+    public Cycle nextCycle(Long documentId) {
+        Cycle cycle = cycleMapper.nextCycle(documentId);
+        if (cycle==null){
+            cycle = new Cycle();
+            cycle.setCycleNum(1);
+        }
+        return cycle;
+    }
+
 }

+ 41 - 23
src/main/java/com/dayou/service/impl/DocumentServiceImpl.java

@@ -1,6 +1,5 @@
 package com.dayou.service.impl;
 
-import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -8,25 +7,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.configuration.BaseEntity;
 import com.dayou.dao.DocumentMapper;
 import com.dayou.dao.QuestionMapper;
-import com.dayou.dto.DocumentDTO;
-import com.dayou.entity.Configuration;
-import com.dayou.entity.Document;
-import com.dayou.entity.DocumentQuestion;
-import com.dayou.entity.Question;
-import com.dayou.service.IConfigurationService;
-import com.dayou.service.IDocumentService;
-import com.dayou.service.IQuestionService;
-import com.dayou.utils.ConvertUtil;
-import com.dayou.utils.TreeUtil;
+import com.dayou.entity.*;
+import com.dayou.service.*;
 import com.dayou.vo.DocumentCycleVO;
 import com.dayou.vo.DocumentVO;
-import com.dayou.vo.QuestionTreeVO;
 import com.google.common.collect.Lists;
 import org.apache.commons.collections.CollectionUtils;
-import org.checkerframework.checker.units.qual.K;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
 import java.util.stream.Collectors;
@@ -48,8 +36,17 @@ public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, Document> i
     private QuestionMapper questionMapper;
 
     @Autowired
+    private IQuestionService questionService;
+
+    @Autowired
     private IConfigurationService configurationService;
 
+    @Autowired
+    private IFailQuestionService failQuestionService;
+
+    @Autowired
+    private ICycleService cycleService;
+
     @Override
     public DocumentCycleVO getDocumentCycleVO() {
         Configuration mini = configurationService.getOne(new LambdaQueryWrapper<Configuration>().eq(Configuration::getName, "mini").eq(BaseEntity::getDeleted, Boolean.FALSE));
@@ -57,17 +54,32 @@ public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, Document> i
             return new DocumentCycleVO();
         }
         DocumentCycleVO documentCycleVO = documentMapper.getDocumentCycleVO();
+
+        List<FailQuestion> failQuestions = failQuestionService.list(new LambdaQueryWrapper<FailQuestion>()
+                .eq(FailQuestion::getCycleId, documentCycleVO.getId()).eq(BaseEntity::getDeleted, Boolean.FALSE));
         List<List<Question>> results = new ArrayList<>();
-        Long typeId = documentCycleVO.getTypeId();
-        List<Question> children = Lists.newArrayList();
-        children = findChildren(typeId, children);
-        Map<Long,List<Question>> result = new LinkedHashMap<>();
-        Map<Long, List<Question>> collect = children.stream().collect(Collectors.groupingBy(Question::getParentId));
-        collect.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(e->result.put(e.getKey(),e.getValue()));
-        for(Map.Entry<Long,List<Question>> map :result.entrySet()){
-            results.add(map.getValue());
+        if (CollectionUtils.isNotEmpty(failQuestions)){
+            //未通过评分项下发逻辑
+            List<Long> parentIds = failQuestions.stream().map(FailQuestion::getQuestionParentId).collect(Collectors.toList());
+            List<Question> fQuestions = questionService.getFailQuestions(parentIds);
+            Map<Long, List<Question>> fails = fQuestions.stream().collect(Collectors.groupingBy(Question::getParentId));
+            for(Map.Entry<Long,List<Question>> map :fails.entrySet()){
+                results.add(map.getValue());
+            }
+            documentCycleVO.setQuestions(results);
+        }else {
+            //全量评分项下发逻辑
+            Long typeId = documentCycleVO.getTypeId();
+            List<Question> children = Lists.newArrayList();
+            children = findChildren(typeId, children);
+            Map<Long,List<Question>> result = new LinkedHashMap<>();
+            Map<Long, List<Question>> collect = children.stream().collect(Collectors.groupingBy(Question::getParentId));
+            collect.entrySet().stream().sorted(Map.Entry.comparingByKey()).forEachOrdered(e->result.put(e.getKey(),e.getValue()));
+            for(Map.Entry<Long,List<Question>> map :result.entrySet()){
+                results.add(map.getValue());
+            }
+            documentCycleVO.setQuestions(results);
         }
-        documentCycleVO.setQuestions(results);
         return documentCycleVO;
     }
 
@@ -77,6 +89,12 @@ public class DocumentServiceImpl extends ServiceImpl<DocumentMapper, Document> i
         return result;
     }
 
+    @Override
+    public Cycle nextCycle(Long documentId) {
+        Cycle cycle = cycleService.nextCycle(documentId);
+        return cycle;
+    }
+
     private List<Question> findChildren(Long rootId,List<Question> children){
         List<Question> list = questionMapper.findChildren(rootId);
         if (CollectionUtils.isNotEmpty(list)){

+ 18 - 0
src/main/java/com/dayou/service/impl/FailQuestionServiceImpl.java

@@ -0,0 +1,18 @@
+package com.dayou.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.dao.FailQuestionMapper;
+import com.dayou.entity.FailQuestion;
+import com.dayou.service.IFailQuestionService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/8/1
+ * created with IntelliJ IDEA.
+ */
+@Service
+public class FailQuestionServiceImpl extends ServiceImpl<FailQuestionMapper, FailQuestion> implements IFailQuestionService {
+}

+ 41 - 19
src/main/java/com/dayou/service/impl/ProfessorResultServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.dayou.configuration.BaseEntity;
 import com.dayou.dao.ProfessorResultMapper;
+import com.dayou.entity.Cycle;
 import com.dayou.entity.ProfessorResult;
 import com.dayou.entity.Question;
 import com.dayou.entity.QuestionAnalysis;
@@ -11,14 +12,17 @@ import com.dayou.service.IProfessorResultService;
 import com.dayou.service.IQuestionAnalysisService;
 import com.dayou.service.websocket.WebSocketServer;
 import com.dayou.vo.DocumentCycleVO;
+import com.dayou.vo.OriginScoreVO;
 import com.dayou.vo.ProfessorResultVO;
 import com.dayou.vo.QuestionVO;
+import com.google.common.collect.Lists;
 import org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.List;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -46,9 +50,11 @@ public class ProfessorResultServiceImpl extends ServiceImpl<ProfessorResultMappe
         List<Question> questions = documentCycleVO.getResult();
         String professorNo = documentCycleVO.getProfessorNo();
         Long cycleId = documentCycleVO.getId();
-
+        List<Long> questionIds = questions.stream().map(Question::getId).collect(Collectors.toList());
+        //存在已提交的评分项再次提交
         List<ProfessorResult> list = this.list(new LambdaQueryWrapper<ProfessorResult>()
-                .eq(ProfessorResult::getCycleId, cycleId).eq(ProfessorResult::getProfessorNo, professorNo).eq(BaseEntity::getDeleted, Boolean.FALSE));
+                .eq(ProfessorResult::getCycleId, cycleId).eq(ProfessorResult::getProfessorNo, professorNo).in(ProfessorResult::getQuestionId,questionIds)
+                .eq(BaseEntity::getDeleted, Boolean.FALSE));
         if (CollectionUtils.isEmpty(list)){
             List<ProfessorResult> collect = questions.stream().map(x -> {
                 ProfessorResult professorResult = new ProfessorResult();
@@ -60,27 +66,30 @@ public class ProfessorResultServiceImpl extends ServiceImpl<ProfessorResultMappe
             }).collect(Collectors.toList());
             this.saveBatch(collect);
         }
-        else {
-            for (Question questionVO : questions){
-                for (ProfessorResult professorResult :list){
-                    if (professorResult.getQuestionId().equals(questionVO.getId())){
-                        professorResult.setScore(questionVO.getScore());
-                    }
-                }
-            }
-            this.updateBatchById(list);
-        }
 
-        List<Long> questionIds = questions.stream().map(Question::getId).collect(Collectors.toList());
-        analysisScore(cycleId,questionIds);
+        Set<Long> allQuestionId = this.list(new LambdaQueryWrapper<ProfessorResult>().eq(ProfessorResult::getCycleId, cycleId)).stream().map(ProfessorResult::getQuestionId).collect(Collectors.toSet());
+        analysisScore(cycleId,allQuestionId);
         webSocketServer.sendSocket("data");
         return Boolean.TRUE;
     }
 
     @Override
-    public List<ProfessorResultVO> getResultList() {
-        List<ProfessorResultVO> list = professorResultMapper.getResultList();
-        return list;
+    public List<OriginScoreVO> getResultList(Cycle cycle) {
+        List<ProfessorResultVO> list = professorResultMapper.getResultList(cycle);
+        List<OriginScoreVO> result = Lists.newArrayList();
+        Map<String, List<ProfessorResultVO>> professorNoMap = list.stream().collect(Collectors.groupingBy(ProfessorResultVO::getProfessorNo));
+        for (Map.Entry<String,List<ProfessorResultVO>> map : professorNoMap.entrySet()){
+            OriginScoreVO originScoreVO = new OriginScoreVO();
+            originScoreVO.setProfessorNo(map.getKey());
+            Map<String,BigDecimal> itemMap = new LinkedHashMap<>();
+           // List<ProfessorResultVO> collect = map.getValue().stream().sorted((p1, p2) -> p2.getQuestionId().compareTo(p1.getQuestionId())).collect(Collectors.toList());
+            map.getValue().stream().forEach(x->{
+                itemMap.put(x.getQuestionName(), x.getScore());
+            });
+            originScoreVO.setScoreMap(itemMap);
+            result.add(originScoreVO);
+        }
+        return result;
     }
 
     @Override
@@ -99,7 +108,20 @@ public class ProfessorResultServiceImpl extends ServiceImpl<ProfessorResultMappe
         return questionAnalysisService.saveOrUpdateBatch(avgScores);
     }
 
-    private Boolean analysisScore(Long cycleId,List<Long> questionIds){
+    @Override
+    public List<ProfessorResult> getCurrentOriginScore() {
+        List<ProfessorResult> list = professorResultMapper.getCurrentOriginScore();
+        return list;
+    }
+
+    @Override
+    public Map<Long, BigDecimal> getCurrentAvgScore() {
+        List<QuestionAnalysis> currentAvgScoreList = professorResultMapper.getCurrentAvgScore();
+        Map<Long, BigDecimal> currentAvgScoreMap = currentAvgScoreList.stream().collect(Collectors.toMap(QuestionAnalysis::getQuestionId, QuestionAnalysis::getAvgScore));
+        return currentAvgScoreMap;
+    }
+
+    private Boolean analysisScore(Long cycleId,Set<Long> questionIds){
         for (Long questionId : questionIds){
             List<QuestionAnalysis> avgScores = professorResultMapper.getAvgScore(cycleId,questionId);
             questionAnalysisService.saveOrUpdateBatch(avgScores);

+ 165 - 30
src/main/java/com/dayou/service/impl/QuestionAnalysisServiceImpl.java

@@ -1,23 +1,27 @@
 package com.dayou.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dayou.configuration.ErrorCode;
 import com.dayou.dao.QuestionAnalysisMapper;
+import com.dayou.entity.Cycle;
+import com.dayou.entity.ProfessorResult;
 import com.dayou.entity.QuestionAnalysis;
+import com.dayou.service.IProfessorResultService;
 import com.dayou.service.IQuestionAnalysisService;
 import com.dayou.utils.Tree;
 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 org.apache.commons.collections.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -33,9 +37,12 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
     @Autowired
     private QuestionAnalysisMapper questionAnalysisMapper;
 
+    @Autowired
+    private IProfessorResultService professorResultService;
+
     @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());
         return analysisList;
     }
@@ -46,18 +53,31 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
     }
 
     @Override
-    public MergeVO getMergeData() {
+    public MergeVO getMergeData(Cycle cycle) {
         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));
-        List<AnalysisResultVO> analysisList = questionAnalysisMapper.getAnalysisList();
+        List<AnalysisResultVO> analysisList = questionAnalysisMapper.getAnalysisList(cycle);
         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.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){
             return merge;
         }
         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());
         List<AnalysisResultVO> allChildren = Lists.newArrayList();
         for (AnalysisResultVO analysisResultVO : analysisList){
@@ -67,35 +87,92 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
         for (AnalysisResultVO analysisResultVO : allChildren){
             if (analysisResultVO.getScope().equals("名称")){
                 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);
             }
             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);
             }
             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);
             }
             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);
             }
         }
@@ -103,6 +180,47 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
         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){
         List<AnalysisResultVO> children = analysisResultVO.getChildren();
         if (CollectionUtils.isEmpty(children)){
@@ -126,4 +244,21 @@ public class QuestionAnalysisServiceImpl extends ServiceImpl<QuestionAnalysisMap
         }
         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;
+    }
 }

+ 9 - 0
src/main/java/com/dayou/service/impl/QuestionServiceImpl.java

@@ -11,6 +11,7 @@ import com.dayou.utils.ConvertUtil;
 import com.dayou.utils.TreeUtil;
 import com.dayou.vo.QuestionTreeVO;
 import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -26,6 +27,8 @@ import java.util.stream.Collectors;
  */
 @Service
 public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> implements IQuestionService {
+    @Autowired
+    private QuestionMapper  questionMapper;
     @Override
     public List<QuestionTreeVO> getQuestionTree(Question question) {
         List<QuestionTreeVO> results = null;
@@ -50,4 +53,10 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionMapper, Question> i
         }
         return results;
     }
+
+    @Override
+    public List<Question> getFailQuestions(List<Long> parentIds) {
+        List<Question> list = questionMapper.getFailQuestions(parentIds);
+        return list;
+    }
 }

+ 32 - 0
src/main/java/com/dayou/utils/MathUtil.java

@@ -0,0 +1,32 @@
+package com.dayou.utils;
+
+import org.apache.commons.math3.distribution.ChiSquaredDistribution;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/8/2
+ * created with IntelliJ IDEA.
+ */
+public class MathUtil {
+
+    /**
+     *
+     * @param probability	累积概率
+     * @param degFreedom	自由度数
+     * @return 方分布的左尾概率的反函数值
+     */
+    public static double getChiSqVal(double probability, double degFreedom) {
+        //创建指定自由度的卡方分布,参数传入自由度数
+        ChiSquaredDistribution chiSquaredDistribution = new ChiSquaredDistribution(Double.valueOf(degFreedom));
+        if(probability<1) {
+            //计算卡方分布的右尾概率的反函数值,参数(1-累积概率);卡方分布的左尾概率的反函数值,参数(累积概率)
+            double chiSquaredDistributionVal = chiSquaredDistribution.inverseCumulativeProbability(Double.valueOf(probability));
+            //保留9位小数点
+            return chiSquaredDistributionVal;
+        }else {
+            return 0;
+        }
+    }
+}

+ 11 - 1
src/main/java/com/dayou/vo/AnalysisResultVO.java

@@ -25,7 +25,7 @@ public class AnalysisResultVO implements Tree<Long,String>  {
 
     private String scope;
 
-    private String cycleName;
+    private String cycleNum;
 
     private Long questionId;
 
@@ -33,6 +33,10 @@ public class AnalysisResultVO implements Tree<Long,String>  {
 
     private BigDecimal avgScore;
 
+    private BigDecimal variance;
+
+    private BigDecimal validate;
+
     private List<AnalysisResultVO> children;
 
     private Long id;
@@ -43,6 +47,12 @@ public class AnalysisResultVO implements Tree<Long,String>  {
 
     private String typeName;
 
+    private Integer professorNum;
+
+    private BigDecimal standardValue;
+
+    private BigDecimal probability;
+
     @Override
     public Long getId() {
         return id;

+ 1 - 1
src/main/java/com/dayou/vo/CycleVO.java

@@ -18,7 +18,7 @@ public class CycleVO {
 
     private Long documentId;
 
-    private String cycleName;
+    private String cycleNum;
 
     private String itemName;
 

+ 4 - 4
src/main/java/com/dayou/vo/MergeTableVO.java

@@ -14,11 +14,11 @@ import lombok.Data;
 @Builder
 public class MergeTableVO {
 
-    private String name;
+    private TableCellVO name;
 
-    private String element;
+    private TableCellVO element;
 
-    private String element1;
+    private TableCellVO element1;
 
-    private String element2;
+    private TableCellVO element2;
 }

+ 10 - 1
src/main/java/com/dayou/vo/MergeVO.java

@@ -2,6 +2,7 @@ package com.dayou.vo;
 
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -14,11 +15,19 @@ import java.util.List;
 @Data
 public class MergeVO {
 
+    private  Long documentId;
+
     private String itemName;
 
-    private String cycleName;
+    private String cycleNum;
 
     private String typeName;
 
+    private Integer professorNum;
+
+    private BigDecimal standardValue;
+
+    private BigDecimal probability;
+
     private List<MergeTableVO> analysisData;
 }

+ 21 - 0
src/main/java/com/dayou/vo/OriginScoreVO.java

@@ -0,0 +1,21 @@
+package com.dayou.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/8/1
+ * created with IntelliJ IDEA.
+ */
+@Data
+public class OriginScoreVO {
+
+    private String professorNo;
+
+    private Map<String, BigDecimal> scoreMap;
+}

+ 2 - 1
src/main/java/com/dayou/vo/ProfessorResultVO.java

@@ -21,7 +21,7 @@ public class ProfessorResultVO {
 
     private Long cycleId;
 
-    private String cycleName;
+    private String cycleNum;
 
     private Long documentId;
 
@@ -40,4 +40,5 @@ public class ProfessorResultVO {
     private BigDecimal score;
 
     private LocalDateTime created;
+
 }

+ 27 - 0
src/main/java/com/dayou/vo/TableCellVO.java

@@ -0,0 +1,27 @@
+package com.dayou.vo;
+
+import lombok.Builder;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/8/1
+ * created with IntelliJ IDEA.
+ */
+@Data
+@Builder
+public class TableCellVO {
+
+    private String label;
+
+    private BigDecimal avgScore;
+
+    private BigDecimal variance;
+
+    private BigDecimal validate;
+
+}

+ 42 - 9
src/main/resources/mapper/AnalysisResultMapper.xml

@@ -6,19 +6,32 @@
         SELECT
             t.id AS cycle_id,
             qa.question_id,
-            t.cycle_name,
+            t.cycle_num,
             q.label AS questionName,
             d.item_name,
             qa.avg_score,
+            qa.variance,
+            qa.validate,
             t.document_id,
             t.type_id,
             q.parent_id,
             q.id,
             q.scope,
-            qq.label as typeName
+            qq.label as typeName,
+            t.professor_num,
+            t.probability,
+            t.standard_value
         FROM
             question_analysis qa
-                RIGHT JOIN ( SELECT c.id, c.document_id, c.cycle_name,d.type_id FROM cycle c left join document d on d.id = c.document_id ORDER BY c.created DESC LIMIT 1  ) t ON t.id = qa.cycle_id
+                RIGHT JOIN (
+                 SELECT c.id, c.document_id, c.cycle_num,d.type_id,c.professor_num,c.standard_value,c.probability FROM cycle c left join document d on d.id = c.document_id
+                     <if test="cycle!=null and cycle.documentId!=null and cycle.cycleNum!=null">
+                         where c.document_id = #{cycle.documentId} and c.cycle_num = #{cycle.cycleNum}
+                     </if>
+                    <if test="cycle!=null and cycle.documentId==null or cycle.cycleNum==null">
+                        ORDER BY c.created DESC LIMIT 1
+                    </if>
+                    ) t ON t.id = qa.cycle_id
                 LEFT JOIN question q ON q.id = qa.question_id
                 LEFT JOIN document d ON d.id = t.document_id
                 left join question qq on qq.id = d.type_id
@@ -30,14 +43,14 @@
         SELECT
             t.id AS cycle_id,
             qa.question_id,
-            t.cycle_name,
+            t.cycle_num,
             q.label AS questionName,
             d.item_name,
             qa.avg_score,
             t.document_id
         FROM
             question_analysis qa
-                RIGHT JOIN ( SELECT id, document_id, cycle_name FROM cycle where id = #{id} ) t ON t.id = qa.cycle_id
+                RIGHT JOIN ( SELECT id, document_id, cycle_num FROM cycle where id = #{id} ) t ON t.id = qa.cycle_id
                 LEFT JOIN question q ON q.id = qa.question_id
                 LEFT JOIN document d ON d.id = t.document_id
         ORDER BY
@@ -54,14 +67,17 @@
                 SELECT
                     c.id,
                     c.document_id,
-                    c.cycle_name,
+                    c.cycle_num,
                     d.type_id
                 FROM
                     cycle c
                         LEFT JOIN document d ON d.id = c.document_id
-                ORDER BY
-                    c.created DESC
-                    LIMIT 1
+            <if test="cycle!=null and cycle.documentId!=null and cycle.cycleNum!=null">
+                where c.document_id = #{cycle.documentId} and c.cycle_num = #{cycle.cycleNum}
+            </if>
+            <if test="cycle!=null and cycle.documentId==null or cycle.cycleNum==null">
+                ORDER BY c.created DESC LIMIT 1
+            </if>
             ) t ON t.id = qa.cycle_id
                 LEFT JOIN question q ON q.id = qa.question_id
                 LEFT JOIN question qq ON q.parent_id = qq.id
@@ -69,4 +85,21 @@
             q.deleted = 0
           AND qq.deleted = 0
     </select>
+
+    <select id="getPreviousCycleAnalysisData" resultType="com.dayou.entity.QuestionAnalysis">
+        SELECT
+            *
+        FROM
+            question_analysis
+        WHERE
+                cycle_id = (
+                SELECT
+                    c.id
+                FROM
+                    cycle c
+                        LEFT JOIN document d ON d.id = c.document_id
+                WHERE
+                    d.id = #{documentId}
+                  AND cycle_num = 1)
+    </select>
 </mapper>

+ 18 - 3
src/main/resources/mapper/CycleMapper.xml

@@ -8,7 +8,7 @@
         d.id as documentId,
         d.item_name,
         q.label as type,
-        c.cycle_name,
+        c.cycle_num,
         c.created
         FROM
         cycle c
@@ -18,8 +18,8 @@
                 <if test="cycle!=null and cycle.itemName!=null and cycle.itemName!='' ">
                     and d.item_name like concat('%',#{cycle.itemName},'%')
                 </if>
-                <if test="cycle!=null and cycle.cycleName!=null and cycle.cycleName!='' ">
-                    and c.cycle_name like concat('%',#{cycle.cycleName},'%')
+                <if test="cycle!=null and cycle.cycleNum!=null">
+                    and c.cycle_num = #{cycle.cycleNum}
                 </if>
                 <if test="cycle!=null and cycle.typeId!=null">
                     and d.type_id = #{cycle.typeId}
@@ -28,4 +28,19 @@
         order by c.created DESC
     </select>
 
+    <select id="nextCycle" parameterType="java.lang.Long" resultType="com.dayou.entity.Cycle">
+        SELECT
+            document_id,
+            ( cycle_num + 1 ) cycleNum,
+            professor_num,
+            standard_value,
+            probability
+        FROM
+            cycle
+        WHERE
+            document_id = #{documentId}
+        ORDER BY
+            cycle_num DESC
+            LIMIT 1
+    </select>
 </mapper>

+ 3 - 3
src/main/resources/mapper/DocumentMapper.xml

@@ -6,7 +6,7 @@
     <resultMap id="documentCycleMap" type="com.dayou.vo.DocumentCycleVO">
         <result column="id" property="id" />
         <result column="document_id" property="documentId" />
-        <result column="cycle_name" property="cycleName" />
+        <result column="cycle_num" property="cycleNum" />
         <result column="type" property="type" />
         <result column="type_id" property="typeId" />
         <result column="item_name" property="itemName" />
@@ -28,13 +28,13 @@
             d.item_name,
             d.type_id,
             qq.label as type,
-            t.cycle_name,
+            CONCAT('第',t.cycle_num,'轮') as cycleName,
             d.id AS document_id,
             t.id,
             t.created
         FROM
             document d
-                RIGHT JOIN ( SELECT id, document_id, cycle_name, created FROM cycle WHERE deleted = 0 ORDER BY created DESC LIMIT 1 ) t ON t.document_id = d.id
+                RIGHT JOIN ( SELECT id, document_id, cycle_num, created FROM cycle WHERE deleted = 0 ORDER BY created DESC LIMIT 1 ) t ON t.document_id = d.id
                 left join question qq on qq.id=d.type_id
         WHERE
             d.deleted = 0

+ 37 - 4
src/main/resources/mapper/ProfessorResultMapper.xml

@@ -24,7 +24,7 @@
             pr.score,
             t.id AS cycle_id,
             pr.question_id,
-            t.cycle_name,
+            t.cycle_num,
             q.label AS questionName,
             d.item_name,
             q.scope,
@@ -33,7 +33,14 @@
             t.document_id
         FROM
             professor_result pr
-                RIGHT JOIN ( SELECT id, document_id, cycle_name FROM cycle ORDER BY created DESC LIMIT 1 ) t ON t.id = pr.cycle_id
+                RIGHT JOIN ( SELECT id, document_id, cycle_num FROM cycle
+                <if test="cycle!=null and cycle.documentId!=null and cycle.cycleNum!=null">
+                    where document_id = #{cycle.documentId} and cycle_num = #{cycle.cycleNum}
+                </if>
+                <if test="cycle!=null and cycle.documentId==null or cycle.cycleNum==null">
+                    ORDER BY created DESC LIMIT 1
+                </if>
+                ) t ON t.id = pr.cycle_id
                 LEFT JOIN question q ON q.id = pr.question_id
                 LEFT JOIN document d ON d.id = t.document_id
                 left join question qq on qq.id = d.type_id
@@ -48,7 +55,7 @@
             pr.score,
             t.id AS cycle_id,
             pr.question_id,
-            t.cycle_name,
+            t.cycle_num,
             q.label AS questionName,
             d.item_name,
             q.scope,
@@ -56,10 +63,36 @@
             t.document_id
         FROM
             professor_result pr
-                RIGHT JOIN ( SELECT id, document_id, cycle_name FROM cycle where id = #{id} ) t ON t.id = pr.cycle_id
+                RIGHT JOIN ( SELECT id, document_id, cycle_num FROM cycle where id = #{id} ) t ON t.id = pr.cycle_id
                 LEFT JOIN question q ON q.id = pr.question_id
                 LEFT JOIN document d ON d.id = t.document_id
         where pr.deleted = 0
         order by pr.created DESC
     </select>
+
+    <select id="getCurrentOriginScore" resultType="com.dayou.entity.ProfessorResult">
+        SELECT
+            pr.id,
+            pr.professor_no,
+            pr.cycle_id,
+            pr.question_id,
+            pr.score,
+            t.cycle_num,
+            t.document_id
+        FROM
+            professor_result pr
+                RIGHT JOIN ( SELECT c.id, c.document_id, c.cycle_num FROM cycle c left join document d on d.id = c.document_id ORDER BY c.created DESC LIMIT 1 ) t ON t.id = pr.cycle_id
+    </select>
+
+
+    <select id="getCurrentAvgScore" resultType="com.dayou.entity.QuestionAnalysis">
+        SELECT
+            pr.question_id ,
+            ROUND( avg( pr.score ), 2 )  as avgScore
+        FROM
+            professor_result pr
+                RIGHT JOIN ( SELECT c.id, c.document_id, c.cycle_num FROM cycle c ORDER BY c.created DESC LIMIT 1 ) t ON t.id = pr.cycle_id
+        GROUP BY
+            pr.question_id
+    </select>
 </mapper>

+ 9 - 0
src/main/resources/mapper/QuestionMapper.xml

@@ -5,4 +5,13 @@
    <select id="findChildren" parameterType="java.lang.Long" resultType="com.dayou.entity.Question">
        select q.id,q.label,q.parent_id,q.scope,q.min_score,q.max_score,qq.label AS parentLabel from question q left join question qq on q.parent_id = qq.id where q.deleted = 0 and q.parent_id = #{rootId}
    </select>
+
+    <select id="getFailQuestions" parameterType="java.util.List" resultType="com.dayou.entity.Question">
+        select q.id,q.label,q.parent_id,q.scope,q.min_score,q.max_score,qq.label AS parentLabel from question q left join question qq on q.parent_id = qq.id where q.deleted = 0
+        and q.parent_id in (
+            <foreach collection="parentIds" index="index" item="item" separator=",">
+                #{item}
+            </foreach>
+                )
+    </select>
 </mapper>