张双江 7 роки тому
батько
коміт
342c084a01
100 змінених файлів з 1322 додано та 484 видалено
  1. 1 1
      mooctest-site-server/pom.xml
  2. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/acyncTask/MutationCallBack.java
  3. 10 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/aspect/PointAspect.java
  4. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/Constants.java
  5. 17 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/ColumnFilterType.java
  6. 1 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/event/listener/ScoreRuleListener.java
  7. 5 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ClientFeatureConfiguration.java
  8. 3 5
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/RabbitMQConfiguration.java
  9. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/CompetitionDao.java
  10. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ContestMentorSubmitRecordDao.java
  11. 25 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/GradeGeneralDao.java
  12. 11 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/GroupDao.java
  13. 7 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/PaperDao.java
  14. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/QualificationDao.java
  15. 9 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/WeightGeneralDao.java
  16. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/GeneralGradeDTO.java
  17. 10 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/UserDTOForMT.java
  18. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Competition.java
  19. 3 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Exam2Case.java
  20. 21 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/GradeGeneral.java
  21. 21 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Group.java
  22. 5 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/IntegralService.java
  23. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/MedalService.java
  24. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/UserService.java
  25. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/impl/IntegralServiceImpl.java
  26. 6 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/impl/MedalServiceImpl.java
  27. 5 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/impl/UserServiceImpl.java
  28. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/CaseService.java
  29. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/Exam2CaseService.java
  30. 5 6
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ExamService.java
  31. 7 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/GeneralCalculateScoreService.java
  32. 4 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/GroupService.java
  33. 6 5
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/PaperService.java
  34. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/SubmitRecordService.java
  35. 2 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/TargetService.java
  36. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/WeightGeneralService.java
  37. 0 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/application/WechatService.java
  38. 87 101
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/application/impl/WechatServiceImpl.java
  39. 10 7
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CaseServiceImpl.java
  40. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CompetitionServiceImpl.java
  41. 10 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/Exam2CaseServiceImpl.java
  42. 22 29
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/ExamServiceImpl.java
  43. 37 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GeneralCalculateScoreServiceImpl.java
  44. 19 9
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GroupServiceImpl.java
  45. 23 5
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/PaperServiceImpl.java
  46. 5 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/SubmitRecordServiceImpl.java
  47. 20 6
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/TargetServiceImpl.java
  48. 2 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/UserCatchServiceImpl.java
  49. 4 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/UserRPCServiceImpl.java
  50. 6 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/WeightGeneralServiceImpl.java
  51. 2 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/updownload/impl/DownloadServiceImpl.java
  52. 4 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/updownload/impl/DownloadServicePCImpl.java
  53. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/webIDE/DockerImageService.java
  54. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/webIDE/WebIDEUrlService.java
  55. 25 37
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/webIDE/impl/DockerImageServiceImpl.java
  56. 36 8
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/webIDE/impl/WebIDEUrlServiceImpl.java
  57. 34 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/util/HostAddressUtils.java
  58. 45 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/BaseSearchController.java
  59. 19 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/CaseController.java
  60. 60 31
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ExamController.java
  61. 21 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/GroupController.java
  62. 13 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/MedalController.java
  63. 0 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/OSSController.java
  64. 30 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/PaperController.java
  65. 38 7
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ScoreController.java
  66. 17 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/TargetController.java
  67. 4 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/TestController.java
  68. 18 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/WechatController.java
  69. 11 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/ColumnFilter.java
  70. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/CompetitionVO.java
  71. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/GroupVO.java
  72. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/PaperVO.java
  73. 19 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/SearchConditionVO.java
  74. 11 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/UserVO.java
  75. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/forMongo/NodeCatch/UserCatchDTO.java
  76. 1 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/forMongo/graph/Node.java
  77. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/AssignedTaskVOWrapper.java
  78. 17 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/PaperVOWrapper.java
  79. 2 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/exception/HttpBadRequestException.java
  80. 4 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/CalculateSocreLogic.java
  81. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/CaseLogic.java
  82. 4 4
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ExamLogic.java
  83. 22 5
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/GeneralCalculateScoreLogic.java
  84. 6 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/GroupLogic.java
  85. 5 2
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/PaperLogic.java
  86. 1 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/TargetLogic.java
  87. 0 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/WechatLogic.java
  88. 8 1
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CalculateScoreLogicImpl.java
  89. 4 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CaseLogicImpl.java
  90. 9 9
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ExamLogicImpl.java
  91. 86 78
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreComponent.java
  92. 25 15
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreLogicImpl.java
  93. 53 5
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GroupLogicImpl.java
  94. 39 23
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/PaperLogicImpl.java
  95. 4 3
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/TargetLogicImpl.java
  96. 9 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/UserLogicImpl.java
  97. 20 22
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/WechatLogicImpl.java
  98. 59 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/strategy/HighestStrategy.java
  99. 43 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/strategy/LatestStrategy.java
  100. 23 0
      mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/strategy/ScoreStrategy.java

+ 1 - 1
mooctest-site-server/pom.xml

@@ -23,7 +23,7 @@
         <dependency>
             <groupId>cn.iselab.mooctest</groupId>
             <artifactId>user-dubbo-api</artifactId>
-            <version>1.0.21</version>
+            <version>1.0.27</version>
         </dependency>
 
         <dependency>

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/acyncTask/MutationCallBack.java

@@ -134,7 +134,7 @@ public class MutationCallBack implements AsyncTaskCallBack {
             dtos.add(dto);
         }
         calculateSocreLogic.catchNode(examId, caseId, userId, String.valueOf(System.currentTimeMillis()), dtos);
-        generalCalculateScoreLogic.calculateScore(examId,caseId,userId);
+        generalCalculateScoreLogic.calculateScore(examId,caseId,userId,"m");
         calculateSocreLogic.calculateExamScoreAuto(examId,userId);
     }
 

+ 10 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/aspect/PointAspect.java

@@ -1,12 +1,15 @@
 package cn.iselab.mooctest.site.common.aspect;
 
+import cn.iselab.mooctest.rpc.user.data.AddIntegralDTO;
 import cn.iselab.mooctest.site.common.annotation.PointChange;
+import cn.iselab.mooctest.site.rpc.user.IntegralService;
 import org.apache.shiro.SecurityUtils;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.annotation.AfterReturning;
 import org.aspectj.lang.annotation.Aspect;
 import org.aspectj.lang.annotation.Pointcut;
 import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.stereotype.Component;
 
@@ -19,6 +22,9 @@ import java.lang.reflect.Method;
 @Component
 public class PointAspect {
 
+    @Autowired
+    IntegralService integralService;
+
     @Pointcut("@annotation(pointChange)")
     private void pointcut(PointChange pointChange){}
 
@@ -26,7 +32,10 @@ public class PointAspect {
     public void afterReturning(PointChange pointChange) {
 
         Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
-
+        AddIntegralDTO dto=new AddIntegralDTO();
+        dto.setUserId(userId);
+        dto.setEvent(pointChange.value());
+        integralService.checkIntegral(dto);
         System.out.println("Point Change : user="+userId+" event="+pointChange.value());
 
     }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/constant/Constants.java

@@ -26,4 +26,6 @@ public class Constants {
 
     public static final String OAUTH2APIVERSION = "1.0.19";
 
+    public static final Integer DEFAULT_ROWS_ON_PAGE = 10;
+
 }

+ 17 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/enums/ColumnFilterType.java

@@ -0,0 +1,17 @@
+package cn.iselab.mooctest.site.common.enums;
+import lombok.Getter;
+
+public enum  ColumnFilterType {
+
+    SORT("sort",(short)1),
+    ENUM("enums",(short)2);
+
+    @Getter
+    private String name;
+    @Getter
+    private short index;
+    ColumnFilterType(String name,short index){
+        this.name = name;
+        this.index = index;
+    }
+}

+ 1 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/common/event/listener/ScoreRuleListener.java

@@ -24,7 +24,6 @@ public class ScoreRuleListener {
 
     @Subscribe
     public void calculateGeneralScore(ScoreRuleChangeEvent event) {
-        generalCalculateScoreLogic.calculateScore(event.getExamId(), event.getCaseId(), null);
-
+        generalCalculateScoreLogic.calculateCaseScore(event.getExamId(),event.getCaseId());
     }
 }

+ 5 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/ClientFeatureConfiguration.java

@@ -2,18 +2,22 @@ package cn.iselab.mooctest.site.configure;
 
 import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.context.config.annotation.RefreshScope;
 import org.springframework.stereotype.Component;
 
+import java.io.Serializable;
+
 /**
  * Created by tangshanshan on 2017/11/17.
  */
 @Data
 @Component
 @ConfigurationProperties(prefix="featureSwitch.client")
-public class ClientFeatureConfiguration {
+public class ClientFeatureConfiguration{
     private boolean sms;
     private boolean email;
     private boolean oss;
     private boolean webide;
     private boolean wechat;
+    private boolean medal;
 }

+ 3 - 5
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/configure/RabbitMQConfiguration.java

@@ -1,25 +1,23 @@
 package cn.iselab.mooctest.site.configure;
 
 import cn.iselab.mooctest.site.common.mqListener.AsyncToolMessageReceiver;
+import cn.iselab.mooctest.site.util.HostAddressUtils;
 import org.springframework.amqp.core.Queue;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-
-import java.util.UUID;
-
 /**
  * Created by tangshanshan on 2018/5/7.
  */
 @Configuration
 public class RabbitMQConfiguration {
 
-    public static final String JOB_RESULT_QUEUE = "jobResultQueue."+UUID.randomUUID().toString();
+    public static final String JOB_RESULT_QUEUE = "JobResult@"+HostAddressUtils.getHostHardwareAddress();
 
     @Bean
     @ConditionalOnExpression("${featureSwitch.server.enableRabbitListener}==true")
     public Queue jobResultQueue(){
-        return new Queue(JOB_RESULT_QUEUE,true,false,true);
+        return new Queue(JOB_RESULT_QUEUE,true,false,false);
     }
 
     @Bean

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/CompetitionDao.java

@@ -11,6 +11,6 @@ import java.util.List;
  */
 @Transactional
 public interface CompetitionDao extends CrudRepository<Competition, Long> {
-    List<Competition> findByIsActive(boolean isActive);
+    List<Competition> findByIsActiveOrderByRankWeightDesc(boolean isActive);
     Competition findById(Long id);
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/ContestMentorSubmitRecordDao.java

@@ -24,4 +24,6 @@ public interface ContestMentorSubmitRecordDao extends PagingAndSortingRepository
 
     @Query("select a from ContestMentorSubmitRecord a where a.examId=:examId and a.mentorId=:mentorId")
     List<ContestMentorSubmitRecord> findByExamIdAndMentorId(@Param("examId")Long examId, @Param("mentorId") Long mentorId);
+
+    List<ContestMentorSubmitRecord> findByMentorId(@Param("mentorId")Long mentor);
 }

+ 25 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/GradeGeneralDao.java

@@ -1,9 +1,13 @@
 package cn.iselab.mooctest.site.dao;
 
+import cn.iselab.mooctest.site.models.Grade;
 import cn.iselab.mooctest.site.models.GradeGeneral;
+import java.util.List;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import javax.transaction.Transactional;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
 /**
  * grade general dao
@@ -16,4 +20,25 @@ public interface GradeGeneralDao extends JpaRepository<GradeGeneral,Long> {
 
   GradeGeneral findByWorkerIdAndExamIdAndCaseIdAndType(long workerId, long examId, long caseId, String type);
 
+  GradeGeneral findByWorkerIdAndExamIdAndCaseIdAndTypeAndUploadTime(long workerId, long examId,
+      long caseId, String type, String uploadTime);
+
+  @Query("select distinct g.workerId from GradeGeneral g "
+      + "where g.examId = :examId and g.caseId = :caseId")
+  List<Long> retrieveUserIdsByExamIdAndCaseId(@Param("examId") long examId, @Param("caseId") long
+      caseId);
+
+  @Query("select g from GradeGeneral g where g.uploadTime="
+      + "(select max(g1.uploadTime) from GradeGeneral g1 where g1.workerId=:workerId and "
+      + "g1.examId=:examId and g1.caseId=:caseId)")
+  List<GradeGeneral> getLatestScores(@Param("workerId")long workerId, @Param("examId")long
+      examId, @Param("caseId")long caseId);
+
+  @Query("select distinct g.uploadTime from GradeGeneral g where g.workerId=:workerId and "
+      + "g.examId=:examId and g.caseId=:caseId")
+  List<String> getUserUploadTimes(@Param("workerId")long workerId, @Param("examId")long examId,
+      @Param("caseId")long caseId);
+
+  List<GradeGeneral> findByWorkerIdAndExamIdAndCaseIdAndUploadTime(long workerId, long examId,
+      long caseId, String uploadTime);
 }

+ 11 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/GroupDao.java

@@ -24,12 +24,14 @@ public interface GroupDao extends PagingAndSortingRepository<Group, Long> {
 
     Page<Group> findByOwnerId(long ownerId, Pageable pageable);
 
+    Page<Group> findByOwnerIdAndIsDeleted(long ownerId, boolean isDeleted, Pageable pageable);
+
     Group findById(long groupId);
 
 
     @Query("SELECT g FROM Group g, Group2Worker g2w " +
             "WHERE g2w.participantId = :participantId " +
-            "AND g.id = g2w.groupId AND g.isActive=1")
+            "AND g.id = g2w.groupId AND g.isActive=1 AND g.isDeleted=0")
     List<Group> findGroupListByParticipant(@Param("participantId") long participantId);
 
     @Query("SELECT g FROM Exam2Group t2g, Group g " +
@@ -59,11 +61,17 @@ public interface GroupDao extends PagingAndSortingRepository<Group, Long> {
             "or u.email LIKE concat('%',:keyword,'%') " +
             "or u.mobile LIKE concat('%',:keyword,'%') " +
             "or u.school LIKE concat('%',:keyword,'%'))")
-    Page<User> findByIdAndKeyWord(@Param("groupId")long groupId, @Param("keyword") String keyword, Pageable pageable);
+    Page<User> findByIdAndKeyWord(@Param("groupId") long groupId, @Param("keyword") String keyword, Pageable pageable);
+
+    List<Group> findByOwnerIdAndIsActiveAndIsDeleted(long ownerId, boolean isActive, boolean isDeleted, Sort sort);
 
-    List<Group> findByOwnerIdAndIsActive(long ownerId, boolean isActive, Sort sort);
+    List<Group> findByOwnerIdAndIsActiveAndIsDeleted(long ownerId, boolean isActive, boolean isDeleted);
 
     List<Group> findByOwnerIdAndIsActive(long ownerId, boolean isActive);
+
+    @Query("select case when COUNT(e2g.groupId)>0 then true else false end " +
+            "from Competition2Exam c2e, Exam2Group e2g where c2e.examId=e2g.examId and e2g.groupId= :groupId")
+    boolean isCompetitionGroup(@Param("groupId") long groupId);
 }
 
 

+ 7 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/PaperDao.java

@@ -9,6 +9,7 @@ import org.springframework.data.repository.PagingAndSortingRepository;
 import org.springframework.data.repository.query.Param;
 
 import javax.transaction.Transactional;
+import java.util.List;
 
 /**
  * Created by major on 2017/7/6.
@@ -27,6 +28,12 @@ public interface PaperDao extends PagingAndSortingRepository<Paper, Long>, JpaSp
     Page<Paper> findByCaseIdPrivate(@Param("caseId") Long caseId,
                                     @Param("ownerId") Long ownerId, Pageable pageable);
 
+    @Query("select p from Paper p where p.ownerId = :ownerId and p.isDeleted = 0 and p.isPublic = 0")
+    List<Paper> findByIsDeletedAndPrivacy(Long ownerId);
+
+    @Query("select p from Paper p where p.isDeleted = 0 and p.isPublic =1")
+    List<Paper> findByIsDeletedAndPublicity();
+
 //    @Query("select p from Paper p where p.ownerId=:ownerId")
 //    Page<Paper> findByOwnerId(@Param("ownerId")long ownerId, String keyword, Pageable pageable);
 

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/QualificationDao.java

@@ -1,6 +1,7 @@
 package cn.iselab.mooctest.site.dao;
 
 import cn.iselab.mooctest.site.models.Qualification;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.repository.CrudRepository;
 
 import javax.transaction.Transactional;

+ 9 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/dao/WeightGeneralDao.java

@@ -4,6 +4,8 @@ import cn.iselab.mooctest.site.models.WeightGeneral;
 import org.springframework.data.jpa.repository.JpaRepository;
 
 import java.util.List;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
 
 /**
  * weight general dao
@@ -17,4 +19,11 @@ public interface WeightGeneralDao extends JpaRepository<WeightGeneral,Long> {
 
   List<WeightGeneral> findByExamIdAndCaseId(long taskId, long caseId);
 
+//  @Query("select distinct w.type from WeightGeneral w "
+//      + "where w.examId = :examId and w.caseId = :caseId")
+//  List<String> retrieveCategoriesByExamIdAndCaseId(@Param("examId") long examId, @Param("caseId")
+//      long caseId);
+
+
+
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/GeneralGradeDTO.java

@@ -21,6 +21,8 @@ public class GeneralGradeDTO {
     private long caseId;
     private String type;
     private double score;
+    private String uploadTime;
+    private String source;
 
     public GradeGeneral toEntity(){
       GradeGeneral entity = new GradeGeneral();

+ 10 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/data/UserDTOForMT.java

@@ -48,6 +48,8 @@ public class UserDTOForMT {
 
     private Integer availability;
 
+    private Long integral;
+
     public Long getId() {
         return id;
     }
@@ -199,4 +201,12 @@ public class UserDTOForMT {
     public void setAvailability(Integer availability) {
         this.availability = availability;
     }
+
+    public Long getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Long integral) {
+        this.integral = integral;
+    }
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Competition.java

@@ -30,5 +30,7 @@ public class Competition {
     private String description;
     @Column(name="allow_enter")
     private Boolean allowEnter;
+    @Column(name="rank_weight")
+    private Integer rankWeight;
 }
 

+ 3 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Exam2Case.java

@@ -28,4 +28,7 @@ public class Exam2Case {
 
     @Column(name = "weight")
     private double weight;
+
+    @Column(name = "score_strategy")
+    private Integer scoreStrategy;
 }

+ 21 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/GradeGeneral.java

@@ -39,6 +39,27 @@ public class GradeGeneral {
 
   private double score;
 
+  @Column(name = "upload_time")
+  private String uploadTime;
+
+  private String source;
+
+  public String getUploadTime() {
+    return uploadTime;
+  }
+
+  public void setUploadTime(String uploadTime) {
+    this.uploadTime = uploadTime;
+  }
+
+  public String getSource() {
+    return source;
+  }
+
+  public void setSource(String source) {
+    this.source = source;
+  }
+
   public long getId() {
     return id;
   }

+ 21 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/models/Group.java

@@ -27,6 +27,9 @@ public class Group {
     @Column(name = "is_active")
     private Boolean isActive = true;
 
+    @Column(name = "is_deleted")
+    private Boolean isDeleted = Boolean.FALSE;
+
     @ManyToMany
     @JoinTable(name = "exam_2_group", joinColumns = @JoinColumn(name = "group_id"),
             inverseJoinColumns = @JoinColumn(name = "exam_id"))
@@ -72,11 +75,27 @@ public class Group {
         this.examSet = examSet;
     }
 
-    public void setIsActive(Boolean isActive){
+    public void setIsActive(Boolean isActive) {
         this.isActive = isActive;
     }
 
-    public Boolean getIsActive(){
+    public Boolean getIsActive() {
         return this.isActive;
     }
+
+    public Boolean getActive() {
+        return isActive;
+    }
+
+    public void setActive(Boolean active) {
+        isActive = active;
+    }
+
+    public Boolean getDeleted() {
+        return isDeleted;
+    }
+
+    public void setDeleted(Boolean deleted) {
+        isDeleted = deleted;
+    }
 }

+ 5 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/IntegralService.java

@@ -1,5 +1,6 @@
 package cn.iselab.mooctest.site.rpc.user;
 
+import cn.iselab.mooctest.rpc.user.data.AddIntegralDTO;
 import cn.iselab.mooctest.rpc.user.data.IntegralCaughtDTO;
 import cn.iselab.mooctest.rpc.user.data.UserIntegralDTO;
 import org.springframework.data.domain.Page;
@@ -20,4 +21,8 @@ public interface IntegralService {
     List<IntegralCaughtDTO> getIntegralCaughts(long userId, long startTime, long endTime);
 
     List<UserIntegralDTO> getUserIntegrals(String kerword);
+
+    boolean checkIntegral(AddIntegralDTO dto);
+
+    UserIntegralDTO getUserIntegral(Long userId);
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/MedalService.java

@@ -17,6 +17,8 @@ public interface MedalService {
 
     MedalDTO updateMedal(MedalDTO dto);
 
+    MedalDTO getMedal(long medalId);
+
     void deleteMedal(long medalId);
 
     List<MedalDTO> getMedals(String keyword, Long userId);

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/UserService.java

@@ -66,4 +66,6 @@ public interface UserService {
     List<UserDTO> getUserByFuzzyProvince(UserDTO userDTO);
 
     List<UserDTO> getUserByFuzzyCity(UserDTO userDTO);
+
+    List<UserDTO> findAll(List<Long> userIds);
 }

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/impl/IntegralServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.iselab.mooctest.site.rpc.user.impl;
 
+import cn.iselab.mooctest.rpc.user.data.AddIntegralDTO;
 import cn.iselab.mooctest.rpc.user.data.IntegralCaughtDTO;
 import cn.iselab.mooctest.rpc.user.data.UserIntegralDTO;
 import cn.iselab.mooctest.site.rpc.user.IntegralService;
@@ -36,4 +37,14 @@ public class IntegralServiceImpl implements IntegralService {
     public List<UserIntegralDTO> getUserIntegrals(String kerword){
         return integralService.getUserIntegrals(kerword);
     }
+
+    @Override
+    public boolean checkIntegral(AddIntegralDTO dto){
+        return integralService.checkIntegral(dto);
+    }
+
+    @Override
+    public UserIntegralDTO getUserIntegral(Long userId){
+        return integralService.getUserIntegral(userId);
+    }
 }

+ 6 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/impl/MedalServiceImpl.java

@@ -24,10 +24,16 @@ public class MedalServiceImpl implements MedalService {
 
     @Override
     public MedalDTO saveMedal(MedalDTO dto){
+        System.out.println(medalService);
         return medalService.saveMedal(dto);
     }
 
     @Override
+    public MedalDTO getMedal(long medalId){
+        return medalService.getMedal(medalId);
+    }
+
+    @Override
     public MedalDTO updateMedal(MedalDTO dto){
         return medalService.updateMedal(dto);
     }

+ 5 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/rpc/user/impl/UserServiceImpl.java

@@ -73,4 +73,9 @@ public class UserServiceImpl implements UserService {
     public List<UserDTO> getUserByFuzzyCity(UserDTO userDTO) {
         return userService.getUserByFuzzyCity(userDTO);
     }
+
+    @Override
+    public List<UserDTO> findAll(List<Long> userIds) {
+        return userService.findAll(userIds);
+    }
 }

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/CaseService.java

@@ -19,7 +19,7 @@ public interface CaseService {
 
     CaseExtends getCaseExtendsById(long caseId);
 
-    Page<CaseExtends> searchCases(Boolean isPublic, Long userId, Long subjectId, String keyword, Pageable pageable);
+    Page<CaseExtends> searchCases(Boolean isPublic, Long userId, Map<String,String> extraCondition, String keyword, Pageable pageable);
 
     CaseExtends save(CaseExtends caseExtends);
 

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/Exam2CaseService.java

@@ -22,4 +22,6 @@ public interface Exam2CaseService {
     List<CaseBlock> getCaseBlocks(long examId,long paperId);
 
     List<CaseBlock> getCasesByExamId(Long examId);
+
+    int getScoreStrategyByExamIdAndCaseId(Long examId, Long caseId);
 }

+ 5 - 6
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/ExamService.java

@@ -3,24 +3,23 @@ package cn.iselab.mooctest.site.service;
 import cn.iselab.mooctest.site.data.CaseBlock;
 import cn.iselab.mooctest.site.models.*;
 import org.springframework.data.domain.Page;
-
-import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by major on 2017/6/23.
  */
 public interface ExamService {
 
-    Page<Exam> getExams(Long organizerId, Byte type, Integer status, String keyword, Pageable pageable);
+    Page<Exam> getExams(Long organizerId, Map<String,String> extraCondition, String keyword, Pageable pageable);
 
-    Page<ParticipantExam> getExamsByParticipantId(Long participantId, Byte type, Integer status, String keyword, Pageable pageable);
+    Page<ParticipantExam> getExamsByParticipantId(Long participantId, Map<String,String> extraCondition, String keyword, Pageable pageable);
 
-    Page<AssistManagerExam> getExamsByAssistManagerId(Long assistManagerId, Byte type, Integer status, String keyword, PageRequest pageable);
+    Page<AssistManagerExam> getExamsByAssistManagerId(Long assistManagerId, Map<String,String> extraCondition, String keyword, Pageable pageable);
 
-    Page<ContestMentorExam> getExamsByContestMentorId(Long contestMentorId, Byte type, Integer status, String keyword, PageRequest pageable);
+    Page<ContestMentorExam> getExamsByContestMentorId(Long contestMentorId, Map<String,String> extraCondition, String keyword, Pageable pageable);
 
     Exam getExamByIdAndParticipantIdIfPermitted(Long examId, Long participantId);
 

+ 7 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/GeneralCalculateScoreService.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.service;
 
 import cn.iselab.mooctest.site.data.GeneralGradeDTO;
 import java.util.List;
+import java.util.Map;
 
 /**
  * general calculate score service
@@ -16,4 +17,10 @@ public interface GeneralCalculateScoreService {
   void updateTypeGrade(List<GeneralGradeDTO> dtos);
 
   double getTypeScore(long workerId, long taskId, long caseId, String type);
+
+  List<Long> getUploadUsers(long examId,long caseId);
+
+  Map<String,Double> getLatestTypeScore(long workerId, long examId, long caseId);
+
+  Map<String,Map<String,Double>> getTimeTypeScore(long workerId, long examId, long caseId);
 }

+ 4 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/GroupService.java

@@ -53,4 +53,8 @@ public interface GroupService {
 
     boolean isUserInGroup(long userId, Long groupId);
 
+    Boolean ifExamsAssignedtoGroup(Long id);
+
+    boolean isCompetitionGroup(long groupId);
+
 }

+ 6 - 5
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/PaperService.java

@@ -1,12 +1,10 @@
 package cn.iselab.mooctest.site.service;
 
 import cn.iselab.mooctest.site.models.Paper;
-
 import cn.iselab.mooctest.site.models.Paper2Case;
 import cn.iselab.mooctest.site.web.data.CaseBlockVO;
-
 import java.util.List;
-
+import java.util.Map;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 
@@ -25,9 +23,9 @@ public interface PaperService {
 
     boolean isUsedByExam(long paperId);
 
-    Page<Paper> findAll(Pageable pageable, String keyword);
+    Page<Paper> findAll(Pageable pageable, String keyword, Map<String,String> extraCondition);
 
-    Page<Paper> findAllByOwnerId(long ownerId,String keyword, Pageable pageable);
+    Page<Paper> findAllByOwnerId(long ownerId,String keyword, Pageable pageable, Map<String,String> extraCondition);
 
     boolean deletePaperCase(long paperId, long caseId);
 
@@ -35,4 +33,7 @@ public interface PaperService {
 
     List<Paper2Case> copyCase(long oldPaperId, long newPaperId);
 
+    List<Paper> getUndeletedPrivatePapers(Long userId);
+
+    List<Paper> getUndeletedPulicPapers();
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/SubmitRecordService.java

@@ -43,6 +43,8 @@ public interface SubmitRecordService {
 
     List<ContestMentorSubmitRecord> getConestAssignedTasks(Long examId, Long mentorId);
 
+    List<ContestMentorSubmitRecord> getConestAssignedTasks(Long mentorId);
+
     List<SubmitRecord> getAssignedTaskByScore(Long taskId, Double score);
 
 }

+ 2 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/TargetService.java

@@ -12,9 +12,9 @@ import java.util.Map;
  */
 public interface TargetService {
 
-    Page<Target2User> getTargets(long ownerId, String keyword, Pageable pageable);
+    Page<Target2User> getTargets(long ownerId, String keyword,Map<String,String> extraCondition, Pageable pageable);
 
-    Page<Target> getMyTargets(long ownerId, String keyword, Pageable pageable);
+    Page<Target> getMyTargets(long ownerId, String keyword, Map<String,String> extraCondition, Pageable pageable);
 
     void updateTarget(Target target);
 

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/WeightGeneralService.java

@@ -3,6 +3,7 @@ package cn.iselab.mooctest.site.service;
 import cn.iselab.mooctest.site.models.WeightGeneral;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * general weight service

+ 0 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/application/WechatService.java

@@ -32,7 +32,5 @@ public interface WechatService {
 
     String getWorkersGrade(long taskId);
 
-    String getContests(long userId);
-
     int getContestParticipant(String taskName);
 }

+ 87 - 101
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/application/impl/WechatServiceImpl.java

@@ -1,10 +1,13 @@
 package cn.iselab.mooctest.site.service.application.impl;
 
 import cn.iselab.mooctest.site.dao.*;
+import cn.iselab.mooctest.site.data.UserDTOForMT;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.service.ExamService;
 import cn.iselab.mooctest.site.service.User2RoleService;
+import cn.iselab.mooctest.site.service.UserService;
 import cn.iselab.mooctest.site.service.application.WechatService;
+import cn.iselab.mooctest.site.util.data.Converter;
 import cn.iselab.mooctest.site.util.data.EncryptionUtil;
 import org.json.JSONArray;
 import org.json.JSONObject;
@@ -30,7 +33,7 @@ public class WechatServiceImpl implements WechatService {
     private GroupDao groupDao;
 
     @Autowired
-    private UserDao userDao;
+    private UserService userService;
 
     @Autowired
     private User2RoleService user2RoleService;
@@ -51,11 +54,10 @@ public class WechatServiceImpl implements WechatService {
     public String checkAccount(String account, String password) throws Exception {
         JSONObject result = new JSONObject();
         String encryptedPassword = EncryptionUtil.encryptMD5(password);
-        User user=checkUser(account);
-        if (user == null || (!user.getPassword().equals(encryptedPassword))){
+        User user = checkUser(account);
+        if (user == null || (!user.getPassword().equals(encryptedPassword))) {
             result.put("success", false);
-        }
-        else{
+        } else {
             result.put("success", true);
         }
 
@@ -65,15 +67,15 @@ public class WechatServiceImpl implements WechatService {
     @Override
     public String getTaskInfo(String account) {
         JSONArray result = new JSONArray();
-        User user=checkUser(account);
-        if (user == null){
+        User user = checkUser(account);
+        if (user == null) {
             return null;
         }
         List<ParticipantExam> participantExams = participantExamDao.findByParticipantId(user.getId());
-        for(ParticipantExam participantExam : participantExams){
+        for (ParticipantExam participantExam : participantExams) {
             Exam exam = examService.getExamByName(participantExam.getName());
             Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis());
-            if (exam.getEndTime().after(currentTimestamp)){
+            if (exam.getEndTime().after(currentTimestamp)) {
                 JSONObject taskObj = new JSONObject();
                 taskObj.put("id", exam.getId());
                 taskObj.put("taskName", exam.getName());
@@ -94,15 +96,15 @@ public class WechatServiceImpl implements WechatService {
     @Override
     public String getFinishedTaskInfo(String account) {
         JSONArray result = new JSONArray();
-        User user=checkUser(account);
-        if (user == null){
+        User user = checkUser(account);
+        if (user == null) {
             return null;
         }
         List<SubmitRecord> submitRecordList = submitRecordDao.findByParticipantId(user.getId());
-        for (SubmitRecord submitRecord : submitRecordList){
+        for (SubmitRecord submitRecord : submitRecordList) {
             Exam exam = examDao.findOne(submitRecord.getExamId());
             Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis());
-            if (exam.getEndTime().before(currentTimestamp)){
+            if (exam.getEndTime().before(currentTimestamp)) {
                 JSONObject taskObj = new JSONObject();
                 taskObj.put("id", exam.getId());
                 taskObj.put("taskName", exam.getName());
@@ -115,48 +117,50 @@ public class WechatServiceImpl implements WechatService {
 
     @Override
     public String getGroupList(String account) {
-       JSONArray result = new JSONArray();
+        JSONArray result = new JSONArray();
 
-        User user=checkUser(account);
-        if (user == null){
+        User user = checkUser(account);
+        if (user == null) {
             return null;
         }
         List<Group2Worker> group2Workers = group2WorkerDao.findByParticipantId(user.getId());
 
-        for (Group2Worker group2Worker : group2Workers){
+        for (Group2Worker group2Worker : group2Workers) {
             Group group = groupDao.findOne(group2Worker.getGroupId());
 
             JSONObject groupObj = new JSONObject();
             groupObj.put("id", group.getId());
             groupObj.put("groupName", group.getName());
-            User user1 = userDao.findOne(group.getOwnerId());
-            groupObj.put("managerName", user1.getName());
+            UserDTOForMT userDTOForMT = userService.findByUserId(group.getOwnerId());
+            if (userDTOForMT==null){
+                continue;
+            }
+            groupObj.put("managerName", userDTOForMT.getName());
 
             result.put(groupObj);
         }
 
-       return result.toString();
+        return result.toString();
     }
 
     @Override
     public String joinGroup(String account, Long groupId, String managerName) {
         JSONObject result = new JSONObject();
-        User user=checkUser(account);
-        Group  group = groupDao.findOne(groupId);
-        if (user == null || group == null){
+        User user = checkUser(account);
+        Group group = groupDao.findOne(groupId);
+        if (user == null || group == null) {
             result.put("success", false);
             result.put("message", "group or worker not found");
         }
         else{
-            User user2= userDao.findOne(group.getOwnerId());
+            UserDTOForMT user2= userService.findByUserId(group.getOwnerId());
             if (!user2.getName().equals(managerName)){
                 result.put("success", false);
                 result.put("message", "manager name mismatch");
-            }
-            else{
+            } else {
                 // Join group
                 Group2Worker group2Worker = new Group2Worker();
-                if (group2WorkerDao.findByParticipantIdAndGroupId(user.getId(), group.getId()) != null){
+                if (group2WorkerDao.findByParticipantIdAndGroupId(user.getId(), group.getId()) != null) {
                     result.put("success", false);
                     result.put("message", "worker already in group");
                 }
@@ -175,22 +179,22 @@ public class WechatServiceImpl implements WechatService {
     @Override
     public String getGroupsByManager(long managerId) {
         JSONObject result = new JSONObject();
-        User user=userDao.findById(managerId);
+        UserDTOForMT user=userService.findByUserId(managerId);
         if (user == null){
             return null;
-        }else {
-            boolean isManager=false;
-            List<User2Role> user2Roles=user2RoleService.getByUserId(user.getId());
-            for(User2Role user2Role:user2Roles){
-                if(user2Role.getRoleId()==2) {
+        } else {
+            boolean isManager = false;
+            List<User2Role> user2Roles = user2RoleService.getByUserId(user.getId());
+            for (User2Role user2Role : user2Roles) {
+                if (user2Role.getRoleId() == 2) {
                     isManager = true;
                 }
             }
-            if(!isManager) {
+            if (!isManager) {
                 result.put("message", "manager not found");
             } else {
                 JSONArray groupArr = new JSONArray();
-                List<Group> groups = groupDao.findByOwnerIdAndIsActive(user.getId(),true);
+                List<Group> groups = groupDao.findByOwnerIdAndIsActiveAndIsDeleted(user.getId(), true, false);
                 for (Group group : groups) {
                     JSONObject groupObj = new JSONObject();
                     groupObj.put("id", group.getId());
@@ -209,10 +213,10 @@ public class WechatServiceImpl implements WechatService {
     public String getUserInfoWechat(long userId) {
         JSONObject resultObj = new JSONObject();
 
-        User user=userDao.findById(userId);
+        UserDTOForMT user=userService.findByUserId(userId);
         if(user==null){
             resultObj.put("message", "user not found");
-        }else {
+        } else {
             resultObj.put("email", user.getEmail());
             resultObj.put("mobile", user.getMobile());
             resultObj.put("name", user.getName());
@@ -226,7 +230,7 @@ public class WechatServiceImpl implements WechatService {
         JSONObject result = new JSONObject();
         Group group = groupDao.findOne(groupId);
 
-        if (group == null){
+        if (group == null) {
             return null;
         }
 
@@ -234,7 +238,10 @@ public class WechatServiceImpl implements WechatService {
         List<Group2Worker> group2Workers = group2WorkerDao.findByGroupId(groupId);
         for (Group2Worker group2Worker : group2Workers){
             if(group2Worker.getParticipantId()!=null) {
-                User user = userDao.findOne(group2Worker.getParticipantId());
+                UserDTOForMT user = userService.findByUserId(group2Worker.getParticipantId());
+                if (user==null){
+                    continue;
+                }
                 JSONObject workerObj = new JSONObject();
                 workerObj.put("id", user.getId());
                 workerObj.put("email", user.getEmail());
@@ -246,24 +253,23 @@ public class WechatServiceImpl implements WechatService {
         }
 
         result.put("workers", workerArr);
-        return  result.toString();
+        return result.toString();
     }
 
     @Override
     public String checkManager(String account, String password) {
         JSONObject resultObj = new JSONObject();
-        User user=checkUser(account);
+        User user = checkUser(account);
         if (user == null) {
             resultObj.put("message", "manager not found");
-        }
-        else {
-            boolean isManager=false;
-            List<User2Role> user2Roles=user2RoleService.getByUserId(user.getId());
-            for(User2Role user2Role:user2Roles){
-                if(user2Role.getRoleId()==2)
-                    isManager=true;
+        } else {
+            boolean isManager = false;
+            List<User2Role> user2Roles = user2RoleService.getByUserId(user.getId());
+            for (User2Role user2Role : user2Roles) {
+                if (user2Role.getRoleId() == 2)
+                    isManager = true;
             }
-            if(!isManager)
+            if (!isManager)
                 resultObj.put("message", "manager not found");
             else {
                 String encryptedPassword = EncryptionUtil.encryptMD5(password);
@@ -282,10 +288,9 @@ public class WechatServiceImpl implements WechatService {
     public String checkWorker(String account, String password) {
         JSONObject resultObj = new JSONObject();
         User user = checkUser(account);
-        if (user == null){
+        if (user == null) {
             resultObj.put("message", "worker not found");
-        }
-        else {
+        } else {
             String encryptedPassword = EncryptionUtil.encryptMD5(password);
             if (user.getPassword().equals(encryptedPassword)) {
                 resultObj.put("id", user.getId());
@@ -300,18 +305,17 @@ public class WechatServiceImpl implements WechatService {
     @Override
     public String getManagerTask(long userId) {
         JSONObject resultObj = new JSONObject();
-        User user = userDao.findById(userId);
+        UserDTOForMT user = userService.findByUserId(userId);
         if (user == null){
             resultObj.put("message", "manager not found");
-        }
-        else {
-            boolean isManager=false;
-            List<User2Role> user2Roles=user2RoleService.getByUserId(user.getId());
-            for(User2Role user2Role:user2Roles){
-                if(user2Role.getRoleId()==2)
-                    isManager=true;
+        } else {
+            boolean isManager = false;
+            List<User2Role> user2Roles = user2RoleService.getByUserId(user.getId());
+            for (User2Role user2Role : user2Roles) {
+                if (user2Role.getRoleId() == 2)
+                    isManager = true;
             }
-            if(!isManager)
+            if (!isManager)
                 resultObj.put("message", "manager not found");
             else {
                 JSONArray taskArr = new JSONArray();
@@ -346,17 +350,16 @@ public class WechatServiceImpl implements WechatService {
     public String getWorkersPassword(long taskId) {
         JSONObject resultObj = new JSONObject();
         Exam exam = examDao.findOne(taskId);
-        if (exam == null){
+        if (exam == null) {
             resultObj.put("message", "exam not found");
-        }
-        else {
+        } else {
             JSONArray passwordArr = new JSONArray();
             List<Exam2Group> exam2Groups = exam2GroupDao.findByExamId(taskId);
-            List<Group2Worker> workers=group2WorkerDao.findByGroupId(exam2Groups.get(0).getGroupId());
-            for (Group2Worker group2Worker:workers){
+            List<Group2Worker> workers = group2WorkerDao.findByGroupId(exam2Groups.get(0).getGroupId());
+            for (Group2Worker group2Worker : workers) {
                 JSONObject passwordObj = new JSONObject();
                 if(group2Worker.getParticipantId()!=null) {
-                    User user = userDao.findOne(group2Worker.getParticipantId());
+                    UserDTOForMT user = userService.findByUserId(group2Worker.getParticipantId());
                     passwordObj.put("workerId", user.getId());
                     passwordObj.put("workerName", user.getName());
                     try {
@@ -378,16 +381,15 @@ public class WechatServiceImpl implements WechatService {
     public String getWorkersGrade(long taskId) {
         JSONObject resultObj = new JSONObject();
         Exam exam = examDao.findOne(taskId);
-        if (exam == null){
+        if (exam == null) {
             resultObj.put("message", "exam not found");
-        }
-        else {
+        } else {
             JSONArray gradeArr = new JSONArray();
             List<SubmitRecord> submitRecords = submitRecordDao.findByExamId(taskId);
-            for (SubmitRecord submitRecord : submitRecords){
+            for (SubmitRecord submitRecord : submitRecords) {
                 JSONObject gradeObj = new JSONObject();
                 if(submitRecord.getParticipantId()!=null) {
-                    User user = userDao.findOne(submitRecord.getParticipantId());
+                    UserDTOForMT user = userService.findByUserId(submitRecord.getParticipantId());
                     if (user != null) {
                         gradeObj.put("workerId", user.getId());
                         gradeObj.put("workerName", user.getName());
@@ -401,49 +403,33 @@ public class WechatServiceImpl implements WechatService {
 
         return resultObj.toString();
     }
-
-    public String getContests(long userId){
-        JSONObject resultObj=new JSONObject();
-        List<SubmitRecord> tasks= submitRecordDao.findByParticipantId(userId);
-        if (tasks == null || tasks.isEmpty()){
-            resultObj.put("message", "task not found");
-            return resultObj.toString();
-        }else {
-            JSONArray jsonArray=new JSONArray();
-            tasks.forEach(task-> {
-                JSONObject object=new JSONObject();
-                object.put("id",task.getExamId());
-                object.put("name",task.getName());
-                jsonArray.put(object);
-            });
-            return jsonArray.toString();
-        }
-    }
-
     public int getContestParticipant(String taskName){
         if(taskName.indexOf("开发者")!=-1) {
-            return 4897;
+            if (taskName.indexOf("团队")>-1){
+                return 273;
+            }
+            return 1394;
         }else if(taskName.indexOf("移动应用")!=-1){
             if(taskName.indexOf("个人")!=-1)
-                return 2925;
+                return 1054;
             else
-                return 1269;
+                return 338;
         }else if(taskName.indexOf("Web")!=-1){
-            if(taskName.indexOf("应用")!=-1)
-                return 1653;
+            if(taskName.indexOf("团队")!=-1)
+                return 607;
             else
-                return 3148;
+                return 587;
         }else if(taskName.indexOf("嵌入式")!=-1){
-            return 1838;
+            return 319;
         }else
             return 0;
     }
 
     private User checkUser(String account){
-        User user=userDao.findByEmail(account);
+        UserDTOForMT user=userService.findByEmail(account);
         if(user==null){
-            user=userDao.findByMobile(account);
+            user=userService.findByMobile(account);
         }
-        return user;
+        return user!=null? Converter.convert(User.class,user):null;
     }
 }

+ 10 - 7
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CaseServiceImpl.java

@@ -15,6 +15,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.Map;
 
 /**
  * @author sean
@@ -40,8 +41,8 @@ public class CaseServiceImpl implements CaseService {
     }
 
     @Override
-    public Page<CaseExtends> searchCases(Boolean isPublic, Long userId, Long subjectId, String keyword, Pageable pageable) {
-        Specifications<CaseExtends> where = Specifications.where(getWhereClause(isPublic, userId, subjectId, keyword));
+    public Page<CaseExtends> searchCases(Boolean isPublic, Long userId, Map<String,String> extraConditon, String keyword, Pageable pageable) {
+        Specifications<CaseExtends> where = Specifications.where(getWhereClause(isPublic, userId, extraConditon, keyword));
         return caseExtendsDao.findAll(where, pageable);
     }
 
@@ -56,7 +57,7 @@ public class CaseServiceImpl implements CaseService {
         return caseExtendsDao.save(caseExtends);
     }
 
-    private Specification<CaseExtends> getWhereClause(Boolean isPublic, Long userId, Long subjectId, String keyword) {
+    private Specification<CaseExtends> getWhereClause(Boolean isPublic, Long userId, Map<String,String> extraCondition, String keyword) {
         return new Specification<CaseExtends>() {
             @Override
             public Predicate toPredicate(Root<CaseExtends> a, CriteriaQuery<?> q, CriteriaBuilder cb) {
@@ -71,10 +72,12 @@ public class CaseServiceImpl implements CaseService {
                             cb.equal(a.<Long>get("ownerId"), userId)
                     );
                 }
-                if (subjectId != null) {
-                    predicate.getExpressions().add(
-                            cb.equal(a.<Integer>get("subjectId"), subjectId)
-                    );
+                if (extraCondition != null) {
+                    for (String key:extraCondition.keySet()) {
+                        predicate.getExpressions().add(
+                                cb.equal(a.get(key), extraCondition.get(key))
+                        );
+                    }
                 }
                 if (keyword != null) {
                     predicate.getExpressions().add(

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/CompetitionServiceImpl.java

@@ -36,7 +36,7 @@ public class CompetitionServiceImpl implements CompetitionService {
 
     @Override
     public List<Competition> getActiveCompetitions() {
-        return competitionDao.findByIsActive(true);
+        return competitionDao.findByIsActiveOrderByRankWeightDesc(true);
     }
 
     @Override

+ 10 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/Exam2CaseServiceImpl.java

@@ -95,4 +95,14 @@ public class Exam2CaseServiceImpl implements Exam2CaseService {
     public List<CaseBlock> getCasesByExamId(Long examId) {
         return getCaseBlocks(exam2CaseDao.findByExamId(examId));
     }
+
+    @Override
+    public int getScoreStrategyByExamIdAndCaseId(Long examId, Long caseId) {
+        Exam2Case exam2Case = exam2CaseDao.findByExamIdAndCaseId(examId,caseId).get(0);
+        if(exam2Case.getScoreStrategy()!=null){
+            return exam2Case.getScoreStrategy();
+        }else{
+            return 0;
+        }
+    }
 }

+ 22 - 29
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/ExamServiceImpl.java

@@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.domain.Specifications;
@@ -47,30 +46,30 @@ public class ExamServiceImpl extends BaseService implements ExamService {
     private WeightDao weightDao;
 
     @Override
-    public Page<Exam> getExams(Long organizerId, Byte type, Integer status, String keyword, Pageable pageable) {
-        Specifications<Exam> where = Specifications.where(getTaskWhereClause(organizerId, status, type, keyword));
+    public Page<Exam> getExams(Long organizerId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
+        Specifications<Exam> where = Specifications.where(getTaskWhereClause(organizerId, extraCondition, keyword));
         return examDao.findAll(where, pageable);
 //        return examDao.findBygroupSet_Id(340L,pageable);
     }
 
     @Override
-    public Page<ParticipantExam> getExamsByParticipantId(Long participantId, Byte type, Integer status, String keyword, Pageable pageable) {
+    public Page<ParticipantExam> getExamsByParticipantId(Long participantId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
         Specifications<ParticipantExam> where = Specifications.where(
-                getExamListQuery(ParticipantExam.class, "participantId", participantId, status, type, keyword));
+                getExamListQuery(ParticipantExam.class, "participantId", participantId, extraCondition, keyword));
         return participantExamDao.findAll(where, pageable);
     }
 
     @Override
-    public Page<AssistManagerExam> getExamsByAssistManagerId(Long assistManagerId, Byte type, Integer status, String keyword, PageRequest pageable) {
+    public Page<AssistManagerExam> getExamsByAssistManagerId(Long assistManagerId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
         Specifications<AssistManagerExam> where = Specifications.where(
-                getExamListQuery(AssistManagerExam.class, "assistManagerId", assistManagerId, status, type, keyword));
+                getExamListQuery(AssistManagerExam.class, "assistManagerId", assistManagerId, extraCondition, keyword));
         return assistManagerExamDao.findAll(where, pageable);
     }
 
     @Override
-    public Page<ContestMentorExam> getExamsByContestMentorId(Long contestMentorId, Byte type, Integer status, String keyword, PageRequest pageable) {
+    public Page<ContestMentorExam> getExamsByContestMentorId(Long contestMentorId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
         Specifications<ContestMentorExam> where = Specifications.where(
-                getExamListQuery(ContestMentorExam.class, "ContestMentorId", contestMentorId, status, type, keyword));
+                getExamListQuery(ContestMentorExam.class, "ContestMentorId", contestMentorId, extraCondition, keyword));
         return contestMentorExamDao.findAll(where, pageable);
     }
 
@@ -130,7 +129,7 @@ public class ExamServiceImpl extends BaseService implements ExamService {
         }
     }
 
-    private Specification<Exam> getTaskWhereClause(Long ownerId, Integer status, Byte type, String keyword) {
+    private Specification<Exam> getTaskWhereClause(Long ownerId, Map<String,String> extraCondition, String keyword) {
         return new Specification<Exam>() {
             @Override
             public Predicate toPredicate(Root<Exam> a, CriteriaQuery<?> q, CriteriaBuilder cb) {
@@ -141,15 +140,12 @@ public class ExamServiceImpl extends BaseService implements ExamService {
                             cb.equal(a.<Long>get("ownerId"), ownerId)
                     );
                 }
-                if (status != null) {
-                    predicate.getExpressions().add(
-                            cb.equal(a.<Integer>get("status"), status)
-                    );
-                }
-                if (type != null) {
-                    predicate.getExpressions().add(
-                            cb.equal(a.<Byte>get("type"), type)
-                    );
+                if (extraCondition != null) {
+                    for (String key:extraCondition.keySet()) {
+                        predicate.getExpressions().add(
+                                cb.equal(a.get(key), extraCondition.get(key))
+                        );
+                    }
                 }
                 if (keyword != null) {
                     Predicate searchTaskName = cb.like(a.<String>get("name"), "%" + StringUtils.trim(keyword) + "%");
@@ -161,7 +157,7 @@ public class ExamServiceImpl extends BaseService implements ExamService {
         };
     }
 
-    private <T> Specification<T> getExamListQuery(Class<T> model, String JoinedUserColumn, Long userId, Integer status, Byte type, String keyword) {
+    private <T> Specification<T> getExamListQuery(Class<T> model, String JoinedUserColumn, Long userId, Map<String,String> extraCondition, String keyword) {
         return new Specification<T>() {
 
             @Override
@@ -172,15 +168,12 @@ public class ExamServiceImpl extends BaseService implements ExamService {
                             cb.equal(a.<Long>get(JoinedUserColumn), userId)
                     );
                 }
-                if (status != null) {
-                    predicate.getExpressions().add(
-                            cb.equal(a.<Integer>get("status"), status)
-                    );
-                }
-                if (type != null) {
-                    predicate.getExpressions().add(
-                            cb.equal(a.<Byte>get("type"), type)
-                    );
+                if (extraCondition != null) {
+                    for (String key:extraCondition.keySet()) {
+                        predicate.getExpressions().add(
+                                cb.equal(a.get(key), extraCondition.get(key))
+                        );
+                    }
                 }
                 if (keyword != null) {
                     predicate.getExpressions().add(

+ 37 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GeneralCalculateScoreServiceImpl.java

@@ -1,10 +1,13 @@
 package cn.iselab.mooctest.site.service.impl;
 
 import cn.iselab.mooctest.site.dao.GradeGeneralDao;
+import cn.iselab.mooctest.site.models.Grade;
 import cn.iselab.mooctest.site.models.GradeGeneral;
 import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
 import cn.iselab.mooctest.site.data.GeneralGradeDTO;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -37,7 +40,8 @@ public class GeneralCalculateScoreServiceImpl implements GeneralCalculateScoreSe
   public void updateTypeGrade(List<GeneralGradeDTO> dtos){
     List<GradeGeneral> entities = dtos.stream().map(GeneralGradeDTO::toEntity).collect(Collectors.toList());
     entities.forEach(x->{
-      GradeGeneral entity = gradeGeneralDao.findByWorkerIdAndExamIdAndCaseIdAndType(x.getWorkerId(),x.getExamId(),x.getCaseId(),x.getType());
+      GradeGeneral entity = gradeGeneralDao.findByWorkerIdAndExamIdAndCaseIdAndTypeAndUploadTime(x
+          .getWorkerId(),x.getExamId(),x.getCaseId(),x.getType(),x.getUploadTime());
       if(entity != null){
         x.setId(entity.getId());
       }
@@ -55,4 +59,36 @@ public class GeneralCalculateScoreServiceImpl implements GeneralCalculateScoreSe
     }
 
   }
+
+  @Override
+  public List<Long> getUploadUsers(long examId, long caseId) {
+    return gradeGeneralDao.retrieveUserIdsByExamIdAndCaseId(examId,caseId);
+  }
+
+  @Override
+  public Map<String,Double> getLatestTypeScore(long workerId, long examId, long caseId) {
+    List<GradeGeneral> gradeGeneralList = gradeGeneralDao.getLatestScores(workerId, examId, caseId);
+    Map<String,Double> latestTypeScore = new HashMap<>();
+    if(gradeGeneralList != null){
+      gradeGeneralList.forEach(gradeGeneral-> latestTypeScore.put(gradeGeneral.getType(),gradeGeneral.getScore()));
+    }
+    return latestTypeScore;
+  }
+
+  @Override
+  public Map<String, Map<String, Double>> getTimeTypeScore(long workerId, long examId,
+      long caseId) {
+    Map<String, Map<String, Double>> timeTypeScoreMap = new HashMap<>();
+    List<String> uploadTimes = gradeGeneralDao.getUserUploadTimes(workerId, examId, caseId);
+    uploadTimes.forEach(uploadTime->{
+      List<GradeGeneral> gradeGeneralList = gradeGeneralDao
+          .findByWorkerIdAndExamIdAndCaseIdAndUploadTime(workerId,examId,caseId,uploadTime);
+      Map<String,Double> typeScoreMap = new HashMap<>();
+      gradeGeneralList.forEach(x->typeScoreMap.put(x.getType(),x.getScore()));
+      timeTypeScoreMap.put(uploadTime,typeScoreMap);
+    });
+    return timeTypeScoreMap;
+  }
+
+
 }

+ 19 - 9
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/GroupServiceImpl.java

@@ -1,19 +1,19 @@
 package cn.iselab.mooctest.site.service.impl;
 
+import cn.iselab.mooctest.site.dao.Exam2GroupDao;
 import cn.iselab.mooctest.site.dao.Group2WorkerDao;
 import cn.iselab.mooctest.site.dao.GroupDao;
 import cn.iselab.mooctest.site.dao.ManagerPropertyDao;
-import cn.iselab.mooctest.site.dao.Exam2GroupDao;
 import cn.iselab.mooctest.site.models.*;
 import cn.iselab.mooctest.site.models.instancePermission.GroupPermission;
-import cn.iselab.mooctest.site.service.SubmitRecordService;
 import cn.iselab.mooctest.site.service.GroupService;
+import cn.iselab.mooctest.site.service.SubmitRecordService;
 import cn.iselab.mooctest.site.service.UserService;
 import cn.iselab.mooctest.site.service.instancePermission.GroupPermissionService;
+import cn.iselab.mooctest.site.util.data.Converter;
 import cn.iselab.mooctest.site.web.exception.IllegalOperationException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import cn.iselab.mooctest.site.util.data.Converter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -69,13 +69,13 @@ public class GroupServiceImpl implements GroupService {
     @Override
     public List<Group> getGroupsByOwnerId(long ownerId) {
         Sort sort = new Sort(Sort.Direction.DESC, "id");
-        List<Group> groupList = groupDao.findByOwnerIdAndIsActive(ownerId, true, sort);
+        List<Group> groupList = groupDao.findByOwnerIdAndIsActiveAndIsDeleted(ownerId, true, false, sort);
         return groupList;
     }
 
     @Override
     public Page<Group> getPageableGroupsByOwnerId(long ownerId, Pageable pageable) {
-        return groupDao.findByOwnerId(ownerId, pageable);
+        return groupDao.findByOwnerIdAndIsDeleted(ownerId, false, pageable);
     }
 
     @Override
@@ -99,12 +99,12 @@ public class GroupServiceImpl implements GroupService {
         }
 
         this.privateAddUserIntoGroup(userId, group.getId());
-        Date day=new Date();
+        Date day = new Date();
         SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String userIdStr = String.valueOf(userId);
         String groupId = String.valueOf(group.getId());
         String groupName = String.valueOf(group.getName());
-        LOG.info("{}用户:{}加入班级,班级名称:{},班级编号:{}",new Object[]{df.format(day),userIdStr,groupName,groupId});
+        LOG.info("{}用户:{}加入班级,班级名称:{},班级编号:{}", new Object[]{df.format(day), userIdStr, groupName, groupId});
         return group;
     }
 
@@ -226,7 +226,7 @@ public class GroupServiceImpl implements GroupService {
 
     @Override
     public int getUserTotalCount(long managerId) {
-        List<Group> groups = this.groupDao.findByOwnerIdAndIsActive(managerId, true);
+        List<Group> groups = this.groupDao.findByOwnerIdAndIsActiveAndIsDeleted(managerId, true, false);
         int userCount = 0;
         for (Group group : groups) {
             userCount += this.getWorkerCount(group.getId());
@@ -237,10 +237,20 @@ public class GroupServiceImpl implements GroupService {
     @Override
     public boolean isUserInGroup(long userId, Long groupId) {
         Group2Worker result = group2WorkerDao.findByParticipantIdAndGroupId(userId, groupId);
-        if(result == null) {
+        if (result == null) {
             return false;
         }
         return true;
     }
 
+    @Override
+    public Boolean ifExamsAssignedtoGroup(Long id) {
+        return exam2GroupDao.findByGroupId(id).size() != 0;
+    }
+
+    @Override
+    public boolean isCompetitionGroup(long groupId) {
+        return groupDao.isCompetitionGroup(groupId);
+    }
+
 }

+ 23 - 5
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/PaperServiceImpl.java

@@ -28,6 +28,7 @@ import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -69,14 +70,14 @@ public class PaperServiceImpl extends BaseService implements PaperService {
     }
 
     @Override
-    public Page<Paper> findAll(Pageable pageable, String keyword) {
-        Specifications<Paper> where =  Specifications.where(getWhereClause(null, keyword));
+    public Page<Paper> findAll(Pageable pageable, String keyword, Map<String,String> extraCondition) {
+        Specifications<Paper> where =  Specifications.where(getWhereClause(null, keyword,extraCondition));
         return paperDao.findAll(where, pageable);
     }
 
     @Override
-    public Page<Paper> findAllByOwnerId(long ownerId, String keyword, Pageable pageable) {
-        Specifications<Paper> where =  Specifications.where(getWhereClause(ownerId, keyword));
+    public Page<Paper> findAllByOwnerId(long ownerId, String keyword, Pageable pageable, Map<String,String> extraCondition) {
+        Specifications<Paper> where =  Specifications.where(getWhereClause(ownerId, keyword,extraCondition));
         return paperDao.findAll(where, pageable);
     }
 
@@ -170,12 +171,19 @@ public class PaperServiceImpl extends BaseService implements PaperService {
 
     }
 
-    private Specification<Paper> getWhereClause(Long ownerId, String keyword) {
+    private Specification<Paper> getWhereClause(Long ownerId, String keyword, Map<String,String> extraCondition) {
         User thirdUser = userDao.findByEmail(OwningPartyConstants.THIRDEMAIL);
         return new Specification<Paper>() {
             @Override
             public Predicate toPredicate(Root<Paper> a, CriteriaQuery<?> q, CriteriaBuilder cb) {
                 Predicate predicate = cb.conjunction();
+                if (extraCondition != null) {
+                    for (String key:extraCondition.keySet()) {
+                        predicate.getExpressions().add(
+                                cb.equal(a.get(key), extraCondition.get(key))
+                        );
+                    }
+                }
                 if(ownerId!=null) {
                     predicate.getExpressions().add(
                             cb.equal(a.<Long>get("ownerId"), ownerId)
@@ -202,4 +210,14 @@ public class PaperServiceImpl extends BaseService implements PaperService {
             }
         };
     }
+
+    @Override
+    public List<Paper> getUndeletedPrivatePapers(Long userId) {
+        return paperDao.findByIsDeletedAndPrivacy(userId);
+    }
+
+    @Override
+    public List<Paper> getUndeletedPulicPapers() {
+        return paperDao.findByIsDeletedAndPublicity();
+    }
 }

+ 5 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/SubmitRecordServiceImpl.java

@@ -284,6 +284,11 @@ public class SubmitRecordServiceImpl extends BaseService implements SubmitRecord
     }
 
     @Override
+    public List<ContestMentorSubmitRecord> getConestAssignedTasks(Long mentorId){
+        return contestMentorSubmitRecordDao.findByMentorId(mentorId);
+    }
+
+    @Override
     public List<SubmitRecord> getAssignedTaskByScore(Long taskId, Double score) {
         return submitRecordDao.findByExamIdAndScoreGreaterThan(taskId, score);
     }

+ 20 - 6
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/TargetServiceImpl.java

@@ -42,14 +42,14 @@ public class TargetServiceImpl extends BaseService implements TargetService {
     TargetExtendsDao targetExtendsDao;
 
     @Override
-    public Page<Target2User> getTargets(long ownerId, String keyword, Pageable pageable) {
-        Specifications<Target2User> where = Specifications.where(getPublic(keyword));
+    public Page<Target2User> getTargets(long ownerId, String keyword,Map<String,String> extraCondition, Pageable pageable) {
+        Specifications<Target2User> where = Specifications.where(getPublic(keyword,extraCondition));
         return target2UserDao.findAll(where, pageable);
     }
 
     @Override
-    public Page<Target> getMyTargets(long ownerId, String keyword, Pageable pageable) {
-        Specifications<Target> where = Specifications.where(getWhereClause(ownerId, keyword));
+    public Page<Target> getMyTargets(long ownerId, String keyword,Map<String,String> extraCondition, Pageable pageable) {
+        Specifications<Target> where = Specifications.where(getWhereClause(ownerId, keyword,extraCondition));
         return targetDao.findAll(where, pageable);
     }
 
@@ -65,11 +65,18 @@ public class TargetServiceImpl extends BaseService implements TargetService {
         targetDao.save(target);
     }
 
-    private Specification<Target> getWhereClause(Long ownerId, String keyword) {
+    private Specification<Target> getWhereClause(Long ownerId, String keyword,Map<String,String> extraCondition) {
         return new Specification<Target>() {
             @Override
             public Predicate toPredicate(Root<Target> a, CriteriaQuery<?> q, CriteriaBuilder cb) {
                 Predicate predicate = cb.conjunction();
+                if (extraCondition != null) {
+                    for (String key:extraCondition.keySet()) {
+                        predicate.getExpressions().add(
+                                cb.equal(a.get(key), extraCondition.get(key))
+                        );
+                    }
+                }
                 if (ownerId != null) {
                     predicate.getExpressions().add(
                             cb.equal(a.<Long>get("ownerId"), ownerId)
@@ -88,7 +95,7 @@ public class TargetServiceImpl extends BaseService implements TargetService {
         };
     }
 
-    private Specification<Target2User> getPublic(String keyword) {
+    private Specification<Target2User> getPublic(String keyword,Map<String,String> extraCondition) {
         return new Specification<Target2User>() {
             @Override
             public Predicate toPredicate(Root<Target2User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
@@ -96,6 +103,13 @@ public class TargetServiceImpl extends BaseService implements TargetService {
                 predicate.getExpressions().add(
                         criteriaBuilder.equal(root.get("visible"), true)
                 );
+                if (extraCondition != null) {
+                    for (String key:extraCondition.keySet()) {
+                        predicate.getExpressions().add(
+                                criteriaBuilder.equal(root.get(key), extraCondition.get(key))
+                        );
+                    }
+                }
                 if (keyword != null) {
                     Predicate byAppName = criteriaBuilder.like(root.get("name"), "%" + StringUtils.trim(keyword) + "%");
                     Predicate byOwnerName = criteriaBuilder.like(root.get("owner"), "%" + StringUtils.trim(keyword) + "%");

+ 2 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/UserCatchServiceImpl.java

@@ -49,7 +49,8 @@ public class UserCatchServiceImpl implements UserCatchService {
         HttpHeaders headers = MongoAPIUtils.createAuthHeaderForMongo();
         headers.setContentType(MediaType.APPLICATION_JSON);
         UserCatchDTO newUserCatchDTO = new UserCatchDTO
-                (null, userCatchDTO.getUserId(), userCatchDTO.getExamId(), userCatchDTO.getCaseId(), userCatchDTO.getCatchDTOs());
+                (null, userCatchDTO.getUserId(), userCatchDTO.getExamId(), userCatchDTO.getCaseId
+                    (), userCatchDTO.getCatchDTOs(),userCatchDTO.getLatestDTOS());
         HttpEntity<UserCatchDTO> httpEntity = new HttpEntity<>(userCatchDTO, headers);
         String url = MongoAPIUtils.generateCommonUrl(mongoDBConfig.getDb(),
                 mongoDBConfig.getUserCatchCollection());

+ 4 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/UserRPCServiceImpl.java

@@ -143,8 +143,9 @@ public class UserRPCServiceImpl implements UserService {
     @Override
     public Map<Long, UserDTOForMT> getUserMap(List<Long> userIds) {
         Map<Long, UserDTOForMT> userMap = new HashMap<>();
-        for (Long userId : userIds) {
-            userMap.put(userId, Converter.convert(UserDTOForMT.class, userService.getUserById(userId)));
+        List<UserDTO> userDTOs = userService.findAll(userIds);
+        for (UserDTO userDTO : userDTOs) {
+            userMap.put(userDTO.getId(), Converter.convert(UserDTOForMT.class, userDTO));
         }
         return userMap;
     }
@@ -188,7 +189,7 @@ public class UserRPCServiceImpl implements UserService {
 //            userDTO.setSchool(condition.get("city"));
 //            userDTOs = userService.getUserByFuzzySchool(userDTO);
 //        }
-        if(condition.get("name")!= null) {
+        if (condition.get("name") != null) {
             userDTO.setName(condition.get("name"));
             userDTOs = userService.getUserByFuzzyName(userDTO);
         }

+ 6 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/impl/WeightGeneralServiceImpl.java

@@ -3,6 +3,9 @@ package cn.iselab.mooctest.site.service.impl;
 import cn.iselab.mooctest.site.dao.WeightGeneralDao;
 import cn.iselab.mooctest.site.models.WeightGeneral;
 import cn.iselab.mooctest.site.service.WeightGeneralService;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -32,7 +35,8 @@ public class WeightGeneralServiceImpl implements WeightGeneralService {
 
   @Override
   public List<WeightGeneral> get(long taskId, long caseId) {
-    return weightGeneralDao.findByExamIdAndCaseId(taskId, caseId);
+    List<WeightGeneral> weightGeneralList = weightGeneralDao.findByExamIdAndCaseId(taskId, caseId);
+    return weightGeneralList!=null?weightGeneralList:new ArrayList<>();
   }
 
   @Override
@@ -56,4 +60,5 @@ public class WeightGeneralServiceImpl implements WeightGeneralService {
   }
 
 
+
 }

+ 2 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/updownload/impl/DownloadServiceImpl.java

@@ -75,9 +75,9 @@ public class DownloadServiceImpl implements DownloadService {
                 for(File childFile:file.listFiles()){
                     String fileName=childFile.getName();
                     latestTimestamp=checkoutTimestamp(fileName,caseName,latestTimestamp);
-                    String downloadUrl = DOWNLOAD_PATH + caseName + "_" + latestTimestamp + ".zip";
-                    return host+downloadUrl;
                 }
+                String downloadUrl = DOWNLOAD_PATH + caseName + "_" + latestTimestamp + ".zip";
+                return host+downloadUrl;
             }
             return null;
         }

+ 4 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/updownload/impl/DownloadServicePCImpl.java

@@ -33,9 +33,9 @@ public class DownloadServicePCImpl implements DownloadService{
             for(File childFile:file.listFiles()){
                 String fileName=childFile.getName();
                 latestTimestamp=checkoutTimestamp(fileName,caseName,latestTimestamp);
-                String downloadUrl = DOWNLOAD_PATH + caseName + "_" + latestTimestamp + ".zip";
-                return host+downloadUrl;
             }
+            String downloadUrl = DOWNLOAD_PATH+ ossDir+ caseName + "_" + latestTimestamp + ".zip";
+            return host+downloadUrl;
         }
         return null;
     }
@@ -58,4 +58,6 @@ public class DownloadServicePCImpl implements DownloadService{
         }
         return latestTimestamp;
     }
+
+
 }

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/webIDE/DockerImageService.java

@@ -5,6 +5,6 @@ package cn.iselab.mooctest.site.service.webIDE;
  */
 public interface DockerImageService {
 
-    String getImageName(long targetId, long caseId);
+    String getImageName(long caseId);
 
 }

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/webIDE/WebIDEUrlService.java

@@ -4,7 +4,7 @@ package cn.iselab.mooctest.site.service.webIDE;
  * Created by major on 2018/3/28.
  */
 public interface WebIDEUrlService {
-    public String generateUrlForWebIDE(long userId, long examId, long targetId, long caseId, String caseName);
+    public String generateUrlForWebIDE(long userId, long examId, long targetId, long caseId, String caseName, Long answerWay);
 
     public String generateUrlForWebIDE(long userId, long examId, long targetId, long caseId, String caseName, boolean canSubmit, boolean monitor);
 }

+ 25 - 37
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/webIDE/impl/DockerImageServiceImpl.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.service.webIDE.impl;
 
 import cn.iselab.mooctest.site.common.constant.AnswerWayConstants;
 import cn.iselab.mooctest.site.common.constant.TargetTypeConstants;
+import cn.iselab.mooctest.site.dao.CaseExtendsDao;
 import cn.iselab.mooctest.site.dao.TargetExtendsDao;
 import cn.iselab.mooctest.site.models.Target;
 import cn.iselab.mooctest.site.models.TargetExtends;
@@ -9,6 +10,7 @@ import cn.iselab.mooctest.site.service.CaseService;
 import cn.iselab.mooctest.site.service.TargetService;
 import cn.iselab.mooctest.site.service.webIDE.DockerImageService;
 import cn.iselab.mooctest.site.web.exception.HttpNotFoundException;
+import org.json.JSONObject;
 import org.springframework.beans.factory.InitializingBean;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -21,48 +23,34 @@ import java.util.Map;
  * Created by major on 2018/3/27.
  */
 @Service
-public class DockerImageServiceImpl implements DockerImageService, InitializingBean {
+public class DockerImageServiceImpl implements DockerImageService {
 
 
     @Autowired
-    TargetService targetService;
-
-    @Autowired
-    CaseService caseService;
-
-    @Autowired
-    TargetExtendsDao targetExtendsDao;
-    private Map<String, String> targetDockerMap = new HashMap();
+    CaseExtendsDao caseExtendsDao;
 
     @Override
-    public String getImageName(long targetId, long caseId) {
-        Target target = targetService.findById(targetId);
-        String key = target.getTargetType() + "";
-        if (target.getTargetType() == TargetTypeConstants.DEV) {
-            String language = getTargetLanguage(targetId);
-            key = key + "_" + language;
-        } else if (target.getTargetType() == TargetTypeConstants.WEB) {
-            key = key + "_" + caseService.getCaseExtendsById(caseId).getAnswerWay();
-        }
-        return targetDockerMap.get(key);
+    public String getImageName(long caseId) {
+        JSONObject caseProperties = new JSONObject(caseExtendsDao.findOne(caseId).getProperties());
+        return caseProperties.getString("imgName");
     }
 
-    private String getTargetLanguage(Long targetId){
-        List<TargetExtends> targetExtendsList = targetExtendsDao.findByTargetId(targetId);
-        for (TargetExtends t:targetExtendsList){
-            if ("language".equals(t.getPropertyName())){
-                return t.getPropertyValue();
-            }
-        }
-        throw new HttpNotFoundException(String.format("Target[%s] don't have language property",targetId));
-    }
-
-    @Override
-    public void afterPropertiesSet() throws Exception {
-
-        targetDockerMap.put(TargetTypeConstants.WEB + "_" + AnswerWayConstants.JMETER, "jmeter:latest");
-        targetDockerMap.put(TargetTypeConstants.WEB + "_" + AnswerWayConstants.WEB_ECLIPSE, "selenium:latest");
-        targetDockerMap.put(TargetTypeConstants.DEV + "_Java", "java:latest");
-        targetDockerMap.put(TargetTypeConstants.DEV + "_Python", "python:latest");
-    }
+//    private String getTargetLanguage(Long targetId){
+//        List<TargetExtends> targetExtendsList = targetExtendsDao.findByTargetId(targetId);
+//        for (TargetExtends t:targetExtendsList){
+//            if ("language".equals(t.getPropertyName())){
+//                return t.getPropertyValue();
+//            }
+//        }
+//        throw new HttpNotFoundException(String.format("Target[%s] don't have language property",targetId));
+//    }
+
+//    @Override
+//    public void afterPropertiesSet() throws Exception {
+//
+//        targetDockerMap.put(TargetTypeConstants.WEB + "_" + AnswerWayConstants.JMETER, "jmeter:latest");
+//        targetDockerMap.put(TargetTypeConstants.WEB + "_" + AnswerWayConstants.WEB_ECLIPSE, "selenium:latest");
+//        targetDockerMap.put(TargetTypeConstants.DEV + "_Java", "java:latest");
+//        targetDockerMap.put(TargetTypeConstants.DEV + "_Python", "python:latest");
+//    }
 }

+ 36 - 8
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/service/webIDE/impl/WebIDEUrlServiceImpl.java

@@ -1,18 +1,26 @@
 package cn.iselab.mooctest.site.service.webIDE.impl;
 
+import cn.iselab.mooctest.site.common.constant.AnswerWayConstants;
 import cn.iselab.mooctest.site.service.fromDev.IndexService;
 import cn.iselab.mooctest.site.service.webIDE.DockerImageService;
 import cn.iselab.mooctest.site.service.webIDE.WebIDEUrlService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+
 /**
  * Created by major on 2018/3/28.
  */
 @Service
 public class WebIDEUrlServiceImpl implements WebIDEUrlService {
 
+    protected final Logger LOG = LoggerFactory.getLogger(getClass());
+
 
     @Autowired
     IndexService indexService;
@@ -25,24 +33,44 @@ public class WebIDEUrlServiceImpl implements WebIDEUrlService {
 
 
     @Override
-    public String generateUrlForWebIDE(long userId, long examId, long targetId, long caseId, String caseName) {
+    public String generateUrlForWebIDE(long userId, long examId, long targetId, long caseId, String caseName, Long answerWay){
 
         String token = indexService.getSecret(userId, examId);
-        String extraCode = indexService.getEntranceJson(examId, caseId, caseName, dockerImageService.getImageName(targetId, caseId), true, false);
-        return generateUrlForWebIDE(token, extraCode);
-
+        String extraCode = indexService.getEntranceJson(examId, caseId, caseName, dockerImageService.getImageName(caseId), true, false);
+        try {
+            if (answerWay== AnswerWayConstants.JMETER) {
+                return generateUrlForWebIDEJmeter(token, extraCode);
+            }else if (answerWay== AnswerWayConstants.APP_ECLIPSE||answerWay.equals(AnswerWayConstants.WEB_ECLIPSE)){
+                return null;
+            }else {
+                return generateUrlForWebIDE(token, extraCode);
+            }
+        }catch (UnsupportedEncodingException e){
+            LOG.error("试题"+caseId+"url生成失败");
+            return null;
+        }
     }
 
     @Override
     public String generateUrlForWebIDE(long userId, long examId, long targetId, long caseId, String caseName, boolean canSubmit, boolean monitor) {
 
         String token = indexService.getSecret(userId, examId);
-        String extraCode = indexService.getEntranceJson(examId, caseId, caseName, dockerImageService.getImageName(targetId, caseId), canSubmit, monitor);
-        return generateUrlForWebIDE(token, extraCode);
+        String extraCode = indexService.getEntranceJson(examId, caseId, caseName, dockerImageService.getImageName(caseId), canSubmit, monitor);
+        try {
+            return generateUrlForWebIDE(token, extraCode);
+        }catch (UnsupportedEncodingException e){
+            LOG.error("试题"+caseId+"url生成失败");
+            return null;
+        }
 
     }
-    private String generateUrlForWebIDE(String token, String extraCode) {
+    private String generateUrlForWebIDE(String token, String extraCode) throws UnsupportedEncodingException {
+
+        return "http://" + webIdeAddress + "/?token=" + URLEncoder.encode(token,"utf-8") + "&extraCode=" + extraCode;
+    }
+
+    private String generateUrlForWebIDEJmeter(String token, String extraCode) throws UnsupportedEncodingException {
 
-        return "http://" + webIdeAddress + "/?token=" + token + "&extraCode=" + extraCode;
+        return "http://" + webIdeAddress + "/jmeter/#/exam?token=" + URLEncoder.encode(token,"utf-8") + "&extraCode=" + extraCode;
     }
 }

+ 34 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/util/HostAddressUtils.java

@@ -0,0 +1,34 @@
+package cn.iselab.mooctest.site.util;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.util.UUID;
+
+/**
+ * Created by tangshanshan on 2018/6/7.
+ */
+public class HostAddressUtils {
+
+    private static Logger LOG = LoggerFactory.getLogger(HostAddressUtils.class);
+
+    public static String getHostHardwareAddress() {
+        InetAddress ip;
+        try {
+            ip = InetAddress.getLocalHost();
+            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
+            byte[] aMac = network.getHardwareAddress();
+            StringBuilder sbMac = new StringBuilder();
+            for (int i = 0; i < aMac.length; i++) {
+                sbMac.append(String.format("%02X%s", aMac[i], (i < aMac.length - 1) ? "-" : ""));
+            }
+            return sbMac.toString();
+
+        } catch (Exception e) {
+            LOG.warn("未能正确获取主机mac地址,重启项目可能导致未完成的异步任务失败");
+            return UUID.randomUUID().toString();
+        }
+    }
+}

+ 45 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/BaseSearchController.java

@@ -0,0 +1,45 @@
+package cn.iselab.mooctest.site.web.ctrl;
+
+import cn.iselab.mooctest.site.common.constant.Constants;
+import cn.iselab.mooctest.site.common.enums.ColumnFilterType;
+import cn.iselab.mooctest.site.web.data.ColumnFilter;
+import cn.iselab.mooctest.site.web.data.SearchConditionVO;
+import org.json.JSONObject;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author henrylee
+ */
+public abstract class BaseSearchController {
+    public abstract  Page<?> search(String searchCondition);
+    Pageable getPageable(SearchConditionVO searchConditionVO){
+        int activePage = searchConditionVO.getActivePage() == 0?1:searchConditionVO.getActivePage();
+        Sort sort = new Sort(Sort.Direction.DESC,"id");
+        for (ColumnFilter columnFilter:searchConditionVO.getColumnFilters()) {
+            if (ColumnFilterType.SORT.getName().equals(columnFilter.getType()) && columnFilter.getValue() != null) {
+                sort = new Sort(Sort.Direction.fromString(columnFilter.getValue()),columnFilter.getField());
+                break;
+            }
+        }
+        return new PageRequest(activePage-1, Constants.DEFAULT_ROWS_ON_PAGE, sort);
+    }
+    Map<String,String> getExtraCondition(SearchConditionVO searchConditionVO) {
+        Map<String,String> result = searchConditionVO.getExtraCondition();
+        if (result == null) {
+            result = new HashMap<>();
+        }
+        for (ColumnFilter columnFilter:searchConditionVO.getColumnFilters()) {
+            if (ColumnFilterType.ENUM.getName().equals(columnFilter.getType())
+                    && columnFilter.getValue() != null && !columnFilter.getValue().equals("all")) {
+                result.put(columnFilter.getField(),columnFilter.getValue());
+            }
+        }
+        return result;
+    }
+}

+ 19 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/CaseController.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.web.ctrl;
 
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
 import cn.iselab.mooctest.site.models.instancePermission.ExamPermission;
+import cn.iselab.mooctest.site.web.data.SearchConditionVO;
 import cn.iselab.mooctest.site.web.response.ErrorResult;
 import cn.iselab.mooctest.site.web.response.ResponseMessage;
 import cn.iselab.mooctest.site.web.response.StatusCode;
@@ -13,6 +14,7 @@ import cn.iselab.mooctest.site.web.data.CaseVO;
 import cn.iselab.mooctest.site.web.data.forMongo.CaseGraphDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.graph.Node;
 import cn.iselab.mooctest.site.web.logic.CaseLogic;
+import com.google.gson.Gson;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -34,15 +36,13 @@ import java.util.Map;
  * @date 2017-03-06.
  */
 @RestController
-public class CaseController extends BaseController {
+public class CaseController extends BaseSearchController {
 
     @Autowired
     private CaseLogic caseLogic;
     @Autowired
     private ExamService examService;
 
-    @RequiresPermissions("cases:view")
-    @RequestMapping(value = UrlConstants.API + "case", method = RequestMethod.GET)
     public Page<CaseExtendsVO> search(@RequestParam(name = "isPublic", required = false) Boolean isPublic,
                                       @RequestParam(name = "subjectId", required = false) Long subjectId,
                                       @RequestParam(name = "keyword", required = false) String keyword, HttpServletRequest request) throws Exception {
@@ -60,7 +60,21 @@ public class CaseController extends BaseController {
         }
         Sort sortById = new Sort(Sort.Direction.DESC, "id");
         Pageable pageable = new PageRequest(Integer.parseInt(activePage) - 1, Integer.parseInt(rowsOnPage), sortById);
-        return caseLogic.searchCases(isPublic, userId, subjectId, keyword, pageable);
+        return caseLogic.searchCases(isPublic, userId, null, keyword, pageable);
+    }
+
+    @Override
+    @RequiresPermissions("cases:view")
+    @RequestMapping(value = UrlConstants.API + "case", method = RequestMethod.GET)
+    public Page<CaseExtendsVO> search(@RequestParam(name = "searchCondition") String searchCondition) {
+        Gson gson = new Gson();
+        SearchConditionVO searchConditionVO = gson.fromJson(searchCondition, SearchConditionVO.class);
+        Pageable pageable = super.getPageable(searchConditionVO);
+        Boolean isPublic = searchConditionVO.getIsPublic();
+        String keyword = searchConditionVO.getKeyword();
+        Map<String, String> extraCondition = super.getExtraCondition(searchConditionVO);
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        return caseLogic.searchCases(isPublic, userId,extraCondition, keyword, pageable);
     }
 
     @RequiresPermissions("case:create")
@@ -166,6 +180,7 @@ public class CaseController extends BaseController {
         try {
             return SuccessResult.ok(ResponseMessage.ITEM_RESULT, caseLogic.getCasesByKey(key));
         } catch (Exception e) {
+            e.printStackTrace();
             return new ErrorResult(StatusCode.PARAMETER_ERROR);
         }
     }

+ 60 - 31
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ExamController.java

@@ -9,6 +9,7 @@ import cn.iselab.mooctest.site.web.logic.ExamLogic;
 import cn.iselab.mooctest.site.web.logic.PaperLogic;
 import cn.iselab.mooctest.site.web.logic.SimilarityLogic;
 import cn.iselab.mooctest.site.web.logic.UserLogic;
+import com.google.gson.Gson;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
@@ -27,13 +28,14 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by major on 2017/6/15.
  */
 
 @RestController
-public class ExamController extends BaseController {
+public class ExamController extends BaseSearchController {
 
     @Autowired
     ExamLogic examLogic;
@@ -46,34 +48,63 @@ public class ExamController extends BaseController {
 
     private Logger LOG = LoggerFactory.getLogger(getClass());
 
-    @RequiresPermissions("tasks:view")
-    @RequestMapping(value = "api/exams", method = RequestMethod.GET)
-    public Page<ExamVO> getExamList(@RequestParam(value = "queryBy") String queryBy,
-                                    @RequestParam(value = "type", required = false) Byte type,
-                                    @RequestParam(value = "status", required = false) Integer status,
-                                    @RequestParam(value = "keyword", required = false) String keyword,
-                                    HttpServletRequest request) {
-        String activePageStr = request.getHeader("activePage");
-        String rowsOnPageStr = request.getHeader("rowsOnPage");
-        if (activePageStr == null || activePageStr.isEmpty() || rowsOnPageStr == null || rowsOnPageStr.isEmpty())
-            throw new IllegalOperationException();
-        Integer activePage = Integer.parseInt(activePageStr);
-        Integer rowsOnPage = Integer.parseInt(rowsOnPageStr);
-        Sort sortByStatus = new Sort(Sort.Direction.ASC, "status");
-        Sort sortById = new Sort(Sort.Direction.DESC, "id");
+//    @RequiresPermissions("tasks:view")
+//    @RequestMapping(value = "api/exams", method = RequestMethod.GET)
+//    public Page<ExamVO> getExamList(@RequestParam(value = "queryBy") String queryBy,
+//                                    @RequestParam(value = "type", required = false) Byte type,
+//                                    @RequestParam(value = "status", required = false) Integer status,
+//                                    @RequestParam(value = "keyword", required = false) String keyword,
+//                                    HttpServletRequest request) {
+//        String activePageStr = request.getHeader("activePage");
+//        String rowsOnPageStr = request.getHeader("rowsOnPage");
+//        if (activePageStr == null || activePageStr.isEmpty() || rowsOnPageStr == null || rowsOnPageStr.isEmpty())
+//            throw new IllegalOperationException();
+//        Integer activePage = Integer.parseInt(activePageStr);
+//        Integer rowsOnPage = Integer.parseInt(rowsOnPageStr);
+//        Sort sortByStatus = new Sort(Sort.Direction.ASC, "status");
+//        Sort sortById = new Sort(Sort.Direction.DESC, "id");
+//        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+//
+//        if (queryBy.equals("organizer")) {
+//            if (SecurityUtils.getSubject().hasRole("admin")) {
+//                userId = null;
+//            }
+//            return examLogic.getExamList(userId, type, status, keyword, new PageRequest(activePage - 1, rowsOnPage, sortById));
+//        } else if (queryBy.equals("participant")) {
+//            return examLogic.getParticipantExamList(userId, type, status, keyword, new PageRequest(activePage - 1, rowsOnPage, sortByStatus));
+//        } else if (queryBy.equals("assistManager")) {
+//            return examLogic.getAssistManagerExamList(userId, type, status, keyword, new PageRequest(activePage - 1, rowsOnPage, sortByStatus));
+//        } else {
+//            return examLogic.getContestMentorExamList(userId, type, status, keyword, new PageRequest(activePage - 1, rowsOnPage, sortByStatus));
+//        }
+//    }
+
+    @Override
+    @RequestMapping(value = UrlConstants.API + "exams", method = RequestMethod.GET)
+    public Page<ExamVO> search(@RequestParam(name = "searchCondition") String searchCondition) {
+        Gson gson = new Gson();
+        SearchConditionVO searchConditionVO = gson.fromJson(searchCondition, SearchConditionVO.class);
+        Pageable pageable = super.getPageable(searchConditionVO);
+        String keyword = searchConditionVO.getKeyword();
+        Map<String, String> extraCondition = super.getExtraCondition(searchConditionVO);
         Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
-        if (queryBy.equals("organizer")) {
-            if (SecurityUtils.getSubject().hasRole("admin")) {
-                userId = null;
+        if (extraCondition != null && extraCondition.containsKey("queryBy")) {
+            String queryBy = extraCondition.get("queryBy");
+            extraCondition.remove("queryBy");
+            if ("organizer".equals(queryBy)) {
+                if (SecurityUtils.getSubject().hasRole("admin")) {
+                    userId = null;
+                }
+                return examLogic.getExamList(userId, extraCondition, keyword, pageable);
+            } else if ("participant".equals(queryBy)) {
+                return examLogic.getParticipantExamList(userId, extraCondition, keyword, pageable);
+            } else if ("assistManager".equals(queryBy)) {
+                return examLogic.getAssistManagerExamList(userId, extraCondition, keyword, pageable);
+            } else {
+                return examLogic.getContestMentorExamList(userId, extraCondition, keyword, pageable);
             }
-            return examLogic.getExamList(userId, type, status, keyword, new PageRequest(activePage - 1, rowsOnPage, sortById));
-        } else if (queryBy.equals("participant")) {
-            return examLogic.getParticipantExamList(userId, type, status, keyword, new PageRequest(activePage - 1, rowsOnPage, sortByStatus));
-        } else if (queryBy.equals("assistManager")) {
-            return examLogic.getAssistManagerExamList(userId, type, status, keyword, new PageRequest(activePage - 1, rowsOnPage, sortByStatus));
-        } else {
-            return examLogic.getContestMentorExamList(userId, type, status, keyword, new PageRequest(activePage - 1, rowsOnPage, sortByStatus));
         }
+        return null;
     }
 
     @RequiresPermissions("task:view")
@@ -160,8 +191,6 @@ public class ExamController extends BaseController {
         return examLogic.getAssignedTasks(examId, keyword, needFilter, pageable);
     }
 
-
-    @RequestMapping(value = UrlConstants.API + "exam/user", method = RequestMethod.GET)
     public Page<UserVO> getUsersExamId(@RequestParam(name = "examId", required = false) Long examId,
                                        @RequestParam(name = "sortOrder", required = false, defaultValue = "desc") String sortOrder,
                                        @RequestParam(name = "sortBy", required = false, defaultValue = "id") String sortBy,
@@ -210,10 +239,11 @@ public class ExamController extends BaseController {
             throw new IllegalArgumentException("缺少分页信息");
         }
         Sort sort;
-        if (sortOrder.equals("desc"))
+        if (sortOrder.equals("desc")) {
             sort = new Sort(Sort.Direction.DESC, sortBy);
-        else
+        } else {
             sort = new Sort(Sort.Direction.ASC, sortBy);
+        }
 
         return new PageRequest(Integer.parseInt(activePage) - 1, Integer.parseInt(rowsOnPage), sort);
     }
@@ -269,5 +299,4 @@ public class ExamController extends BaseController {
             throw new UnauthorizedException("unauthorized");
         }
     }
-
 }

+ 21 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/GroupController.java

@@ -190,4 +190,25 @@ public class GroupController extends BaseController {
         return groupLogic.getManagerGroupSize(userId);
     }
 
+    @RequiresRoles(value = "manager")
+    @RequestMapping(value = UrlConstants.API + "group/name", method = RequestMethod.PUT)
+    public GroupVO changeGroupName(@RequestBody GroupVO groupVO) {
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        String permission = userId + ":group:update:" + groupVO.getId();
+        if (!SecurityUtils.getSubject().isPermitted(new GroupPermission(permission))) {
+            throw new UnauthorizedException("unauthorized");
+        }
+        return groupLogic.updateGroupName(groupVO.getName(), groupVO.getId());
+    }
+
+    @RequiresRoles(value = "manager")
+    @RequestMapping(value = UrlConstants.API + "group/isDeleted/{groupId:\\d+}", method = RequestMethod.PUT)
+    public void deleteGroups(@PathVariable Long groupId) {
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        String permission = userId + ":group:update:" + groupId;
+        if (!SecurityUtils.getSubject().isPermitted(new GroupPermission(permission))) {
+            throw new UnauthorizedException("unauthorized");
+        }
+        groupLogic.deleteGroup(groupId);
+    }
 }

+ 13 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/MedalController.java

@@ -39,9 +39,20 @@ public class MedalController extends BaseController {
         }
     }
 
-    @RequiresUser
+    @RequiresRoles("admin")
     @RequestMapping(value = UrlConstants.API + "medal", method = RequestMethod.GET)
-    public Map<String, Object> getMedalsForUser(@RequestParam(value = "keyword", required = false) String keyword) {
+    public Map<String, Object> getMedal(@RequestParam(value = "medalId") Long medalId) {
+        try {
+            return SuccessResult.ok(ResponseMessage.ITEM_RESULT, medalService.getMedal(medalId));
+        } catch (Exception e) {
+            e.printStackTrace();
+            return new ErrorResult(e.getMessage());
+        }
+    }
+
+    @RequiresUser
+    @RequestMapping(value = UrlConstants.API + "medals/user", method = RequestMethod.GET)
+    public Map<String, Object> getMedalsForUser(@RequestParam(value = "keyword",required = false) String keyword) {
         try {
             Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
             return SuccessResult.ok(ResponseMessage.ITEM_RESULT, medalService.getMedals(keyword, userId));

+ 0 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/OSSController.java

@@ -87,7 +87,6 @@ public class OSSController extends BaseController {
         return fileLogic.getHeadImage(userId);
     }
 
-    @RequiresRoles("manager")
     @RequestMapping(value = UrlConstants.API_COMMON + "upload/file", consumes = MediaType.MULTIPART_FORM_DATA_VALUE, method = RequestMethod.POST)
     public Map<String, Object> uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("path") String path, HttpServletRequest request) throws IOException {
         String result = ossLogic.saveFile(file, path);

+ 30 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/PaperController.java

@@ -1,6 +1,7 @@
 package cn.iselab.mooctest.site.web.ctrl;
 
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
+import cn.iselab.mooctest.site.web.data.SearchConditionVO;
 import cn.iselab.mooctest.site.web.response.ErrorResult;
 import cn.iselab.mooctest.site.web.response.StatusCode;
 import cn.iselab.mooctest.site.web.response.SuccessResult;
@@ -8,9 +9,11 @@ import cn.iselab.mooctest.site.models.instancePermission.PaperPermission;
 import cn.iselab.mooctest.site.web.data.PaperVO;
 import cn.iselab.mooctest.site.web.logic.DetailStatisticsLogic;
 import cn.iselab.mooctest.site.web.logic.PaperLogic;
+import com.google.gson.Gson;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.apache.shiro.authz.annotation.RequiresRoles;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -20,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.constraints.NotNull;
+import java.util.List;
 import java.util.Map;
 
 
@@ -28,7 +32,7 @@ import java.util.Map;
  */
 
 @RestController
-public class PaperController {
+public class PaperController extends BaseSearchController{
     @Autowired
     PaperLogic paperLogic;
     @Autowired
@@ -79,8 +83,6 @@ public class PaperController {
         return paperLogic.updatePaper(paperVO);
     }
 
-    @RequiresPermissions("papers:view")
-    @RequestMapping(value = "api/papers", method = RequestMethod.GET)
     public Page<PaperVO> getPaperList(@RequestParam(name = "keyword", required = false) String keyword,
                                       @RequestParam(name = "isPublic", required = false) boolean isPublic,
                                       @RequestParam(name = "sortOrder", required = false) String sortOrder,
@@ -100,7 +102,7 @@ public class PaperController {
         }
         Pageable pageable = new PageRequest(Integer.parseInt(activePage) - 1, Integer.parseInt(rowsOnPage), sort);
         if (caseId == null) {
-            return paperLogic.getPaperList(isPublic, keyword, pageable);
+            return paperLogic.getPaperList(isPublic, keyword, pageable,null);
         } else {
             return detailStatisticsLogic.findPapersByCaseId(caseId, isPublic, pageable);
         }
@@ -133,4 +135,28 @@ public class PaperController {
         return paperLogic.publicityPaper(paperId);
     }
 
+    @Override
+    @RequiresPermissions("papers:view")
+    @RequestMapping(value = "api/papers", method = RequestMethod.GET)
+    public Page<PaperVO> search(@RequestParam(name = "searchCondition") String searchCondition) {
+        Gson gson = new Gson();
+        SearchConditionVO searchConditionVO = gson.fromJson(searchCondition, SearchConditionVO.class);
+        Pageable pageable = super.getPageable(searchConditionVO);
+        Boolean isPublic = searchConditionVO.getIsPublic();
+        String keyword = searchConditionVO.getKeyword();
+        Map<String, String> extraCondition = super.getExtraCondition(searchConditionVO);
+        if (extraCondition != null && extraCondition.containsKey("caseId")) {
+            return detailStatisticsLogic.findPapersByCaseId(Long.parseLong(extraCondition.get("caseId")),
+                    isPublic, pageable);
+        } else {
+            return paperLogic.getPaperList(isPublic, keyword, pageable, extraCondition);
+        }
+    }
+
+    @RequiresRoles("manager")
+    @RequestMapping(value = UrlConstants.API + "unassignedPapers", method = RequestMethod.GET)
+    public List<PaperVO> getUnAssignedPaper() {
+        Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
+        return paperLogic.getUnassignedPaperList(userId);
+    }
 }

+ 38 - 7
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/ScoreController.java

@@ -89,19 +89,50 @@ public class ScoreController extends BaseController {
                                  @RequestBody List<CaughtNodeDTO> caughtNodeDTOs) {
 
         calculateSocreLogic.catchNode(examId, caseId, userId, uploadTime, caughtNodeDTOs);
-        //计算分数并存储
- //       generalCalculateScoreLogic.calculateScore(examId, caseId, userId);
-//        return caughtNodeDTOList;
 
     }
 
-    @RequestMapping(value = UrlConstants.API_COMMON + "generalCalculateScoreAll/{examId}/{caseId}", method = RequestMethod.PUT)
+    @RequestMapping(value = UrlConstants.API_COMMON +
+        "generalUploadCaughtNode/{examId}/{caseId}/{userId}/{uploadTime}/{source}", method =
+        RequestMethod
+        .PUT)
     public void generalCatchNode(@PathVariable("examId") long examId,
-                                 @PathVariable("caseId") long caseId) {
-        //重新计算所有人的分数
-        generalCalculateScoreLogic.calculateScore(examId, caseId, null);
+        @PathVariable("caseId") long caseId,
+        @PathVariable("userId") long userId,
+        @PathVariable("uploadTime") String uploadTime,
+        @PathVariable("source") String source,
+        @RequestBody List<CaughtNodeDTO> caughtNodeDTOs) {
+
+        calculateSocreLogic.catchNode(examId, caseId, userId, uploadTime,source, caughtNodeDTOs);
+
+    }
+
+    @RequestMapping(value = UrlConstants.API_COMMON +
+        "generalCalculateScoreAll", method = RequestMethod.PUT)
+    public void updateCaseScore(@RequestParam("examId") long examId,
+        @RequestParam("caseId") long caseId) {
+        //重新从type得分计算所有人的分数(修改type权重后调用)
+        generalCalculateScoreLogic.calculateCaseScore(examId, caseId);
     }
 
+    @RequestMapping(value = UrlConstants.API_COMMON +
+        "generalCalculateScoreAllFromNode", method = RequestMethod.PUT)
+    public void generalCatchNode(@RequestParam("examId") long examId,
+        @RequestParam("caseId") long caseId,
+        @RequestParam("source") String source) {
+        //重新从node计算所有人的分数
+        generalCalculateScoreLogic.calculateScore(examId, caseId, null,source);
+    }
+
+    @RequestMapping(value = UrlConstants.API_COMMON +
+        "uploadCaseScore", method = RequestMethod.PUT)
+    public void updateCaseScore(@RequestParam("examId") long examId,
+        @RequestParam("caseId") long caseId,
+        @RequestParam("userId")long userId,
+        @RequestParam("score")double score){
+        //直接传递case的分数
+        generalCalculateScoreLogic.uploadCaseScore(examId,caseId,userId,score);
+    }
 
     @RequiresRoles("manager")
     @RequestMapping(value = UrlConstants.API + "competeAnalysis", method = RequestMethod.GET)

+ 17 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/TargetController.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.web.ctrl;
 
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
 import cn.iselab.mooctest.site.models.instancePermission.TargetPermission;
+import cn.iselab.mooctest.site.web.data.SearchConditionVO;
 import cn.iselab.mooctest.site.web.data.TargetVO;
 import cn.iselab.mooctest.site.web.data.targetVO.TargetCreateVO;
 import cn.iselab.mooctest.site.web.data.targetVO.TargetListVO;
@@ -10,6 +11,7 @@ import cn.iselab.mooctest.site.web.exception.IllegalOperationException;
 import cn.iselab.mooctest.site.web.logic.TargetLogic;
 import cn.iselab.mooctest.site.web.response.ResponseMessage;
 import cn.iselab.mooctest.site.web.response.SuccessResult;
+import com.google.gson.Gson;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.UnauthorizedException;
 import org.apache.shiro.authz.annotation.RequiresRoles;
@@ -27,7 +29,7 @@ import java.util.Map;
  * Created by ROGK on 2017/6/18.
  */
 @RestController
-public class TargetController extends BaseController {
+public class TargetController extends BaseSearchController {
 
     @Autowired
     private TargetLogic targetLogic;
@@ -85,8 +87,6 @@ public class TargetController extends BaseController {
         return targetLogic.createTarget(newTarget);
     }
 
-    @RequiresRoles("manager")
-    @RequestMapping(value = UrlConstants.API + "targets", method = RequestMethod.GET)
     public Page<TargetListVO> getTargets(@RequestParam(name = "keyword", required = false) String keyword,
                                          @RequestParam(name = "visible", required = false, defaultValue = "false") boolean visible,
                                          HttpServletRequest request) {
@@ -97,6 +97,19 @@ public class TargetController extends BaseController {
             return null;
         }
         Pageable pageable = new PageRequest(activePage - 1, rowsOnPage, sortByCreate);
-        return targetLogic.getTargets(keyword, visible, pageable);
+        return targetLogic.getTargets(keyword, visible,null, pageable);
+    }
+
+    @Override
+    @RequiresRoles("manager")
+    @RequestMapping(value = UrlConstants.API + "targets", method = RequestMethod.GET)
+    public Page<?> search(@RequestParam(name = "searchCondition") String searchCondition) {
+        Gson gson = new Gson();
+        SearchConditionVO searchConditionVO = gson.fromJson(searchCondition, SearchConditionVO.class);
+        Pageable pageable = super.getPageable(searchConditionVO);
+        Boolean isPublic = searchConditionVO.getIsPublic();
+        String keyword = searchConditionVO.getKeyword();
+        Map<String, String> extraCondition = super.getExtraCondition(searchConditionVO);
+        return targetLogic.getTargets(keyword, isPublic,extraCondition, pageable);
     }
 }

+ 4 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/TestController.java

@@ -1,5 +1,7 @@
 package cn.iselab.mooctest.site.web.ctrl;
 
+import cn.iselab.mooctest.rpc.user.constants.IntegralEventConstants;
+import cn.iselab.mooctest.site.common.annotation.PointChange;
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
 import cn.iselab.mooctest.site.configure.ClientFeatureConfiguration;
 import cn.iselab.mooctest.site.configure.realm.DefaultUsernamepasswordToken;
@@ -22,6 +24,7 @@ import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authc.AccountException;
 import org.apache.shiro.authz.annotation.RequiresUser;
 import org.apache.shiro.subject.Subject;
+import org.aspectj.lang.annotation.Pointcut;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -75,6 +78,7 @@ public class TestController {
 
     private Logger LOG = LoggerFactory.getLogger(getClass());
 
+    @PointChange(value = "login")
     @RequestMapping(value = "/api/test/login", method = RequestMethod.POST)
     public UserVO login(@RequestBody UserVO userVO, BindingResult bindingResult, HttpServletRequest request) {
         if (bindingResult.hasErrors()) {

+ 18 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/ctrl/WechatController.java

@@ -4,12 +4,18 @@ import cn.iselab.mooctest.rpc.user.data.UserWechatDTO;
 import cn.iselab.mooctest.site.common.constant.UrlConstants;
 import cn.iselab.mooctest.site.web.data.UserVO;
 import cn.iselab.mooctest.site.web.data.internal.*;
+import cn.iselab.mooctest.site.web.logic.CompetitionLogic;
 import cn.iselab.mooctest.site.web.logic.WechatLogic;
+import cn.iselab.mooctest.site.web.response.ResponseMessage;
+import cn.iselab.mooctest.site.web.response.StatusCode;
+import cn.iselab.mooctest.site.web.response.SuccessResult;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.net.URL;
+import java.util.Map;
 
 /**
  * @author sean
@@ -25,6 +31,9 @@ public class WechatController extends BaseController {
     @Autowired
     private WechatLogic wechatLogic;
 
+    @Autowired
+    private CompetitionLogic competitionLogic;
+
     /**
      *
      * GET methods
@@ -93,13 +102,12 @@ public class WechatController extends BaseController {
         return wechatLogic.getContest(request);
     }
 
-    @RequestMapping(value = UrlConstants.API_WECHAT + "contests",method = RequestMethod.GET)
-    public String getContestList(HttpServletRequest request) { return wechatLogic.getContests(request); }
-
     @RequestMapping(value = UrlConstants.API_WECHAT + "contests/worker",method = RequestMethod.GET)
-    public String getWorkersContest(HttpServletRequest request) {
+    public String getWorkersContest(HttpServletRequest request)
+    {
         return wechatLogic.getWorkerContests(request);
     }
+
     /**
      *
      * POST methods
@@ -124,4 +132,10 @@ public class WechatController extends BaseController {
     public boolean bind(@RequestBody UserWechatDTO wechatDTO){
         return wechatLogic.bind(wechatDTO);
     }
+
+    @RequestMapping(value = UrlConstants.API_WECHAT + "competition",method = RequestMethod.POST)
+    public Map<String,Object> enterCompetition(@RequestParam(value = "userId")Long userId,
+                                               @RequestParam(value = "competitionId")Long competitionId){
+        return SuccessResult.ok(ResponseMessage.ITEM_RESULT,competitionLogic.enterCompetition(competitionId,userId));
+    }
 }

+ 11 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/ColumnFilter.java

@@ -0,0 +1,11 @@
+package cn.iselab.mooctest.site.web.data;
+
+import cn.iselab.mooctest.site.common.enums.ColumnFilterType;
+import lombok.Data;
+
+@Data
+public class ColumnFilter {
+    private String field;
+    private String value;
+    private String type;
+}

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/CompetitionVO.java

@@ -19,6 +19,7 @@ public class CompetitionVO {
     private Boolean isQualified;
     private Long qualificationId;
     private Boolean allowEnter;
+    private Integer rankWeight;
 
     private List<AddonsVO> addonsList;
 

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/GroupVO.java

@@ -18,6 +18,7 @@ public class GroupVO extends CaptchaBaseVO {
     private Boolean allowJoin;
     private Long ownerId;
     private Boolean isActive;
+    private Boolean isDeleted;
 
     @Override
     public String getCaptcha() {

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/PaperVO.java

@@ -18,6 +18,7 @@ public class PaperVO {
     private String description;
     private List<CaseBlockVO> caseBlocks;
     private List<ExamVO> exams;
+    private Boolean haveDeletedCase;
 
     private Byte difficult;
 

+ 19 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/SearchConditionVO.java

@@ -0,0 +1,19 @@
+package cn.iselab.mooctest.site.web.data;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author henrylee
+ */
+@Data
+public class SearchConditionVO {
+    private Boolean isPublic;
+    private String keyword;
+    private Integer activePage;
+    private Integer totalPage;
+    private List<ColumnFilter> columnFilters;
+    private Map<String,String> extraCondition;
+}

+ 11 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/UserVO.java

@@ -53,9 +53,11 @@ public class UserVO extends BaseVO {
 
     private Boolean manualCheckValid;
 
-    @JsonIgnore
+//    @JsonIgnore
     private Integer availability;
 
+    private Long integral;
+
     public Long getId() {
         return id;
     }
@@ -199,4 +201,12 @@ public class UserVO extends BaseVO {
     public void setManualCheckValid(Boolean manualCheckValid) {
         this.manualCheckValid = manualCheckValid;
     }
+
+    public Long getIntegral() {
+        return integral;
+    }
+
+    public void setIntegral(Long integral) {
+        this.integral = integral;
+    }
 }

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/forMongo/NodeCatch/UserCatchDTO.java

@@ -25,4 +25,6 @@ public class UserCatchDTO {
 
     private List<CatchDTO> catchDTOs;
 
+    private List<CatchDTO> latestDTOS;
+
 }

+ 1 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/forMongo/graph/Node.java

@@ -16,4 +16,5 @@ public class Node {
     Double relativeY;
     Integer catchNum;
     Integer totalNum;
+    Integer weight;
 }

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/AssignedTaskVOWrapper.java

@@ -38,7 +38,7 @@ public class AssignedTaskVOWrapper extends BaseWrapper<AssignedTaskVO, SubmitRec
         AssignedTaskVO vo = new AssignedTaskVO();
         vo.setId(submitRecord.getId());
         vo.setTaskName(submitRecord.getName());
-
+        vo.setWorkerId(submitRecord.getParticipantId());
         vo.setTaskId(submitRecord.getExamId());
         vo.setScore(submitRecord.getScore());
 

+ 17 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/data/wrapper/PaperVOWrapper.java

@@ -4,7 +4,9 @@ import cn.iselab.mooctest.site.data.CaseBlock;
 import cn.iselab.mooctest.site.data.UserDTOForMT;
 import cn.iselab.mooctest.site.models.Paper;
 import cn.iselab.mooctest.site.service.*;
+import cn.iselab.mooctest.site.web.data.CaseExtendsVO;
 import cn.iselab.mooctest.site.web.data.PaperVO;
+import cn.iselab.mooctest.site.web.logic.CaseLogic;
 import cn.iselab.mooctest.site.web.logic.DetailStatisticsLogic;
 import cn.iselab.mooctest.site.util.data.Converter;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +35,8 @@ public class PaperVOWrapper extends BaseWrapper<PaperVO, Paper> {
     private PaperService paperService;
     @Autowired
     private DetailStatisticsLogic detailStatisticsLogic;
+    @Autowired
+    private CaseLogic caseLogic;
 
     @Override
     public PaperVO wrap(Paper paper) {
@@ -106,6 +110,19 @@ public class PaperVOWrapper extends BaseWrapper<PaperVO, Paper> {
                 UserDTOForMT user = userService.findByUserId(paper.getOwnerId());
                 paperVO.setOwnerName(user.getName());
                 paperVO.setExams(detailStatisticsLogic.findExamByPaperId(paper.getId()));
+                boolean haveDeletedCase = false;
+                try {
+                    List<CaseExtendsVO> caseExtendsVOS = caseLogic.getCasesByTaskId(paper.getId());
+                    for (CaseExtendsVO caseExtendsVO : caseExtendsVOS) {
+                        if (caseExtendsVO.getDeleted()) {
+                            haveDeletedCase = true;
+                            break;
+                        }
+                    }
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                paperVO.setHaveDeletedCase(haveDeletedCase);
                 return paperVO;
             }
         });

+ 2 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/exception/HttpBadRequestException.java

@@ -3,6 +3,8 @@ package cn.iselab.mooctest.site.web.exception;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.ResponseStatus;
 
+import java.io.IOException;
+
 /**
  * @author sean
  * @date 2017-03-19.

+ 4 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/CalculateSocreLogic.java

@@ -33,6 +33,10 @@ public interface CalculateSocreLogic {
 
     void catchNode(Long examId, Long caseId, Long userId, String uploadTime, List<CaughtNodeDTO> caughtNodeDTOs);
 
+    void catchNode(Long examId, Long caseId, Long userId, String uploadTime,
+        String source,List<CaughtNodeDTO> caughtNodeDTOs);
+
+
     PageData<CompeteAnalysisVO> getCompeteAnalysisByPage(Long userId, Long examId, Long caseId, int activePage, int pageSize,
                                                                 Sort sort, CompeteAnalysisType competeAnalysisType);
 }

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/CaseLogic.java

@@ -18,7 +18,7 @@ public interface CaseLogic {
 
     List<CaseExtendsVO> getCasesByTaskId(Long taskId) throws Exception;
 
-    Page<CaseExtendsVO> searchCases(Boolean isPublic, Long userId, Long subjectId, String keyword, Pageable pageable);
+    Page<CaseExtendsVO> searchCases(Boolean isPublic,Long userId, Map<String,String> extraCondition, String keyword, Pageable pageable);
 
     CaseExtendsVO create(CaseExtendsVO caseExtendsVO, Long userId) throws Exception;
 

+ 4 - 4
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/ExamLogic.java

@@ -19,13 +19,13 @@ public interface ExamLogic {
 
     ExamVO getExamByIdAndParticipantIdIfPermited(Long examId, Long userId);
 
-    Page<ExamVO> getExamList(Long organizerId, Byte type, Integer status, String keyword, Pageable pageable);
+    Page<ExamVO> getExamList(Long organizerId, Map<String,String> extraCondition, String keyword, Pageable pageable);
 
-    Page<ExamVO> getParticipantExamList(Long participantId, Byte type, Integer status, String keyword, Pageable pageable);
+    Page<ExamVO> getParticipantExamList(Long participantId, Map<String,String> extraCondition, String keyword, Pageable pageable);
 
-    Page<ExamVO> getAssistManagerExamList(Long assistManagerId, Byte type, Integer status, String keyword, PageRequest pageRequest);
+    Page<ExamVO> getAssistManagerExamList(Long assistManagerId, Map<String,String> extraCondition, String keyword, Pageable pageRequest);
 
-    Page<ExamVO> getContestMentorExamList(Long contestMentorId, Byte type, Integer status, String keyword, PageRequest pageRequest);
+    Page<ExamVO> getContestMentorExamList(Long contestMentorId, Map<String,String> extraCondition, String keyword, Pageable pageRequest);
 
     ExamVO createExam(ExamVO examVO);
 

+ 22 - 5
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/GeneralCalculateScoreLogic.java

@@ -9,12 +9,29 @@ package cn.iselab.mooctest.site.web.logic;
 public interface GeneralCalculateScoreLogic {
 
   /**
-   * 计算一场考试中一道题的每种类型的node得分
-   * @param taskId 考试id
-   * @param caseId 题目id
-   * @param userId 考生id 考生id为null时,计算所有人的分数
+   * 计算一场考试中一道题的得分
+   * @param examId examId
+   * @param caseId caseId
+   * @param userId userId
+   * @param source source
    */
-  void calculateScore(long taskId, long caseId, Long userId);
+  void calculateScore(long examId, long caseId, Long userId, String source);
+
+  /**
+   * 计算该用户一个case的得分
+   * @param examId 考试id
+   * @param caseId  题目id
+   * @param userId  考生id
+   */
+  void calculateCaseScore(long examId, long caseId, long userId);
+
+  /**
+   * 计算所有考生一个case的得分
+   * @param examId 考试id
+   * @param caseId  题目id
+   */
+  void calculateCaseScore(long examId, long caseId);
 
 
+  void uploadCaseScore(long examId, long caseId, long userId, double score);
 }

+ 6 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/GroupLogic.java

@@ -14,7 +14,7 @@ import java.util.List;
  */
 public interface GroupLogic {
 
-    GroupVO joinGroupByQrCode(long workerId,long groupId);
+    GroupVO joinGroupByQrCode(long workerId, long groupId);
 
     List<GroupVO> getOwnerGroups(long ownerId);
 
@@ -24,7 +24,7 @@ public interface GroupLogic {
 
     GroupVO getGroupDetail(long groupId);
 
-    List<UserVO>  getManagerWorkersInGroup(long groupId);
+    List<UserVO> getManagerWorkersInGroup(long groupId);
 
     Page<UserVO> getManagerWorkersInGroupPageable(long groupId, String keyword, Pageable pageable);
 
@@ -43,4 +43,8 @@ public interface GroupLogic {
     int getUserTotalCount(long managerId);
 
     int getManagerGroupSize(long managerId);
+
+    GroupVO updateGroupName(String name, Long groupId);
+
+    void deleteGroup(Long id);
 }

+ 5 - 2
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/PaperLogic.java

@@ -1,9 +1,10 @@
 package cn.iselab.mooctest.site.web.logic;
 
-import cn.iselab.mooctest.site.models.Paper;
 import cn.iselab.mooctest.site.web.data.PaperVO;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
+import java.util.Map;
+import java.util.List;
 
 /**
  * Created by major on 2017/6/15.
@@ -17,9 +18,11 @@ public interface PaperLogic {
 
     PaperVO createPaper(PaperVO paperVO);
     PaperVO updatePaper(PaperVO paperVO);
-    Page<PaperVO> getPaperList(boolean isPublic, String keyword, Pageable pageable);
+    Page<PaperVO> getPaperList(boolean isPublic, String keyword, Pageable pageable,Map<String,String> extraCondition);
 
     boolean deletePaperCase(long paperId, long caseId);
 
     PaperVO publicityPaper(Long paperId) throws Exception;
+
+    List<PaperVO> getUnassignedPaperList(Long userId);
 }

+ 1 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/TargetLogic.java

@@ -31,5 +31,5 @@ public interface TargetLogic {
 
     TargetCreateVO createTarget(TargetCreateVO targetCreateVO);
 
-    Page<TargetListVO> getTargets(String keyword, boolean visible, Pageable pageable);
+    Page<TargetListVO> getTargets(String keyword, boolean visible,Map<String,String> extraCondition, Pageable pageable);
 }

+ 0 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/WechatLogic.java

@@ -39,13 +39,10 @@ public interface WechatLogic {
 
     String getContest(HttpServletRequest request);
 
-    String getContests(HttpServletRequest request);
-
     String getWorkerContests(HttpServletRequest request);
 
     String wxLogin(String code,HttpServletRequest request)throws Exception;
 
     boolean bind(UserWechatDTO dto);
 
-    UserVO register(UserWechatDTO dto);
 }

+ 8 - 1
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CalculateScoreLogicImpl.java

@@ -475,6 +475,12 @@ public class CalculateScoreLogicImpl extends BaseLogic implements CalculateSocre
     @Override
     public void catchNode(Long examId, Long caseId, Long userId, String uploadTime,
                           List<CaughtNodeDTO> caughtNodeDTOs) {
+        catchNode(examId,caseId,userId,uploadTime,null,caughtNodeDTOs);
+    }
+
+    @Override
+    public void catchNode(Long examId, Long caseId, Long userId, String uploadTime, String source,
+        List<CaughtNodeDTO> caughtNodeDTOs) {
         List<CatchDTO> catchDTOList = new ArrayList<>();
         List<Node> nodesFromCase = caseLogic.getGraph(caseId, null).getNodes();
         for (CaughtNodeDTO caughtNodeDTO : caughtNodeDTOs) {
@@ -492,7 +498,8 @@ public class CalculateScoreLogicImpl extends BaseLogic implements CalculateSocre
         }
         catchService.postBulkCatchDTOS(catchDTOList);
 
-        generalCalculateScoreComponent.saveCaughtDetails(examId, caseId, userId, caughtNodeDTOs, catchDTOList);
+        generalCalculateScoreComponent.saveCaughtDetails(examId, caseId, userId,source,
+            caughtNodeDTOs, catchDTOList);
     }
 
 }

+ 4 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/CaseLogicImpl.java

@@ -34,6 +34,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.net.URLEncoder;
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
@@ -172,8 +173,8 @@ public class CaseLogicImpl implements CaseLogic {
     }
 
     @Override
-    public Page<CaseExtendsVO> searchCases(Boolean isPublic, Long userId, Long subjectId, String keyword, Pageable pageable) {
-        Page<CaseExtends> caseExtends = caseService.searchCases(isPublic, userId, subjectId, keyword, pageable);
+    public Page<CaseExtendsVO> searchCases(Boolean isPublic, Long userId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
+        Page<CaseExtends> caseExtends = caseService.searchCases(isPublic, userId, extraCondition, keyword, pageable);
         Page<CaseExtendsVO> caseExtendsVOs = caseExtends.map(new org.springframework.core.convert.converter.Converter<CaseExtends, CaseExtendsVO>() {
             @Override
             public CaseExtendsVO convert(CaseExtends caseExtend) {
@@ -310,7 +311,7 @@ public class CaseLogicImpl implements CaseLogic {
             if (caseExtendsVO.getAnswerWay() == AnswerWayConstants.DEV_ECLIPSE || caseExtendsVO.getAnswerWay() == AnswerWayConstants.APP_ECLIPSE
                     || caseExtendsVO.getAnswerWay() == AnswerWayConstants.WEB_ECLIPSE || caseExtendsVO.getAnswerWay() == AnswerWayConstants.JMETER) {
                 caseExtendsVO.setSecret(indexService.getSecret(userId, examId));
-                caseExtendsVO.setWebIDE(webIDEUrlService.generateUrlForWebIDE(userId,examId, caseExtends.getAppId(), caseid,caseExtends.getName()));
+                caseExtendsVO.setWebIDE(webIDEUrlService.generateUrlForWebIDE(userId,examId, caseExtends.getAppId(), caseid,caseExtends.getName(),caseExtendsVO.getAnswerWay()));
                 caseExtendsVO.setSubmitted(submitRecordService.isSubmitted(examId, userId, caseExtendsVO.getId(), caseExtendsVO.getCaseId()));
             }
             if (caseExtendsVO.getAnswerWay() == AnswerWayConstants.REPORT) {

+ 9 - 9
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/ExamLogicImpl.java

@@ -18,7 +18,6 @@ import org.apache.poi.ss.usermodel.Workbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.core.convert.converter.Converter;
 import org.springframework.data.domain.Page;
-import org.springframework.data.domain.PageRequest;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
@@ -105,8 +104,8 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
     }
 
     @Override
-    public Page<ExamVO> getExamList(Long organizerId, Byte type, Integer status, String keyword, Pageable pageable) {
-        Page<Exam> taskPage = examService.getExams(organizerId, type, status, keyword, pageable);
+    public Page<ExamVO> getExamList(Long organizerId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
+        Page<Exam> taskPage = examService.getExams(organizerId, extraCondition, keyword, pageable);
         Page<ExamVO> examVOPage = taskPage.map(new Converter<Exam, ExamVO>() {
             @Override
             public ExamVO convert(Exam task) {
@@ -117,8 +116,8 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
     }
 
     @Override
-    public Page<ExamVO> getParticipantExamList(Long participantId, Byte type, Integer status, String keyword, Pageable pageable) {
-        Page<ParticipantExam> taskPage = examService.getExamsByParticipantId(participantId, type, status, keyword, pageable);
+    public Page<ExamVO> getParticipantExamList(Long participantId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
+        Page<ParticipantExam> taskPage = examService.getExamsByParticipantId(participantId,extraCondition, keyword, pageable);
         Page<ExamVO> examVOPage = taskPage.map(new Converter<ParticipantExam, ExamVO>() {
             @Override
             public ExamVO convert(ParticipantExam examGroupUser) {
@@ -130,8 +129,8 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
     }
 
     @Override
-    public Page<ExamVO> getAssistManagerExamList(Long assistManagerId, Byte type, Integer status, String keyword, PageRequest pageable) {
-        Page<AssistManagerExam> taskPage = examService.getExamsByAssistManagerId(assistManagerId, type, status, keyword, pageable);
+    public Page<ExamVO> getAssistManagerExamList(Long assistManagerId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
+        Page<AssistManagerExam> taskPage = examService.getExamsByAssistManagerId(assistManagerId, extraCondition, keyword, pageable);
         Page<ExamVO> examVOPage = taskPage.map(new Converter<AssistManagerExam, ExamVO>() {
             @Override
             public ExamVO convert(AssistManagerExam assistManagerExam) {
@@ -143,8 +142,8 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
     }
 
     @Override
-    public Page<ExamVO> getContestMentorExamList(Long contestMentorId, Byte type, Integer status, String keyword, PageRequest pageable) {
-        Page<ContestMentorExam> taskPage = examService.getExamsByContestMentorId(contestMentorId, type, status, keyword, pageable);
+    public Page<ExamVO> getContestMentorExamList(Long contestMentorId, Map<String,String> extraCondition, String keyword, Pageable pageable) {
+        Page<ContestMentorExam> taskPage = examService.getExamsByContestMentorId(contestMentorId, extraCondition, keyword, pageable);
         Page<ExamVO> examVOPage = taskPage.map(new Converter<ContestMentorExam, ExamVO>() {
             @Override
             public ExamVO convert(ContestMentorExam contestMentorExam) {
@@ -223,6 +222,7 @@ public class ExamLogicImpl extends BaseLogic implements ExamLogic {
                 UserDTOForMT participant = participantMap.get(assignedTask.getParticipantId());
                 vo.setWorkerName(participant.getName());
                 vo.setWorkerSchool(participant.getSchool());
+                vo.setWorkerId(participant.getId());
                 vo.setAssignedCases(assignedCaseVOWrapper.wrap(submitRecordService.wrapAssignedCases(assignedTask)));
                 vo.setResultZip(ossLogic.zipFilePath(participant.getName()+"_"+assignedTask.getName()+".zip"));
                 vo.setResultPdf(ossLogic.pdfFilePath(participant.getName()+"_"+assignedTask.getName()+".pdf"));

+ 86 - 78
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreComponent.java

@@ -8,8 +8,10 @@ import cn.iselab.mooctest.site.web.data.forMongo.CaseGraphDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.CatchDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.CaughtNodeDTO;
 import cn.iselab.mooctest.site.web.data.forMongo.NodeCatch.UserCatchDTO;
-import cn.iselab.mooctest.site.web.data.forMongo.graph.Category;
 import cn.iselab.mooctest.site.web.data.forMongo.graph.Node;
+import cn.iselab.mooctest.site.web.logic.strategy.HighestStrategy;
+import cn.iselab.mooctest.site.web.logic.strategy.LatestStrategy;
+import cn.iselab.mooctest.site.web.logic.strategy.ScoreStrategy;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
@@ -44,69 +46,65 @@ public class GeneralCalculateScoreComponent {
     WeightGeneralService weightGeneralService;
     @Autowired
     SubmitRecordService submitRecordService;
+    @Autowired
+    Exam2CaseService exam2CaseService;
+    @Autowired
+    LatestStrategy latestStrategy;
+    @Autowired
+    HighestStrategy highestStrategy;
 
-    @Async("calculateGradeAsync")
-    public void calculateGrade(long taskId, long caseId, Long userId) {
+
+    public void calculateGrade(long examId, long caseId, Long userId, String source){
+        recordTypeScore(examId, caseId, userId,source);
+        if(userId!=null){
+            calculateCaseScore(examId,caseId,userId);
+        }else{ //计算所有人的分数
+            List<Long> uploadUsers = generalCalculateScoreService.getUploadUsers(examId, caseId);
+            uploadUsers.forEach(uid-> calculateCaseScore(examId, caseId,uid));
+        }
+
+    }
+
+    private void recordTypeScore(long examId, long caseId, Long userId, String
+        source){
 
         List<UserCatchDTO> userCatchDTOList;
         if (userId == null) {
-            userCatchDTOList = userCatchService.getUserCatchListOneBigPage(taskId, caseId);
+            userCatchDTOList = userCatchService.getUserCatchListOneBigPage(examId, caseId);
         } else {
-            userCatchDTOList = userCatchService.getUserCatchDTOs(userId, taskId, caseId);
+            userCatchDTOList = userCatchService.getUserCatchDTOs(userId, examId, caseId);
         }
-        Map<Long, Map<String, Double>> userScoreMap = calculateTypeScore(caseId, userCatchDTOList);
-        List<GeneralGradeDTO> gradeDTOList = new ArrayList<>();
-        List<Long> uidList = new ArrayList<>();//记录所有考生id
-
-        if (userScoreMap != null) {
-            userScoreMap.keySet().forEach(uid -> {
-                uidList.add(uid);
-                Map<String, Double> typeScoreMap = userScoreMap.get(uid);
-                typeScoreMap.keySet().forEach(type -> {
-                    GeneralGradeDTO gradeDTO = new GeneralGradeDTO(uid, taskId, caseId, type, typeScoreMap.get(type));
-                    gradeDTOList.add(gradeDTO);
-                });
-            });
-
 
+        List<GeneralGradeDTO> gradeDTOList = calculateTypeScore(caseId, userCatchDTOList);
+        if(gradeDTOList != null){
+            gradeDTOList.forEach(x->x.setSource(source));
             generalCalculateScoreService.updateTypeGrade(gradeDTOList);
-
-            uidList.forEach(uid -> saveGrade(uid, taskId, caseId, calculateCaseScore(taskId, caseId, uid)));
-
         }
 
     }
 
-    private void saveGrade(long workerId, long taskId, long caseId, double score) {
-        submitRecordService.addCase(taskId, caseId, workerId, "");
-        submitRecordService.recordScore(taskId, caseId, workerId, score);
+
+    public double calculateCaseScore(long examId, long caseId, long userId) {
+        ScoreStrategy strategy = getTypeScoreStrategy(examId,caseId);
+        double caseScore = strategy.getCaseScore(examId,caseId,userId);
+        saveGrade(userId,examId,caseId,caseScore);
+        return caseScore;
+
     }
 
+    private List<GeneralGradeDTO> calculateTypeScore(long caseId,
+        List<UserCatchDTO> userCatchDTOS) {
 
-    /**
-     * 计算一位用户一道题所有type的分数
-     *
-     * @param caseId        题目id
-     * @param userCatchDTOS userCatchDTOS
-     * @return <userId, <type,score>>
-     */
-    private Map<Long, Map<String, Double>> calculateTypeScore(long caseId, List<UserCatchDTO> userCatchDTOS) {
+        List<GeneralGradeDTO> generalGradeDTOList = new ArrayList<>();
         //元node数据
         CaseGraphDTO basicNode = caseGraphService.getCaseGraph(caseId);
-        //List<UserCatchDTO> userCatchDTOS = userCatchService.getUserCatchDTOs(userId,examId,caseId);
 
-        if (basicNode == null) {
-            return null;
-        }
-
-
-        if (userCatchDTOS != null && userCatchDTOS.size() != 0) {
-            Map<Long, Map<String, Double>> userScoreMap = new HashMap<>();
+        if (basicNode!=null && userCatchDTOS != null && userCatchDTOS.size() != 0) {
             for (UserCatchDTO userCatchDTO : userCatchDTOS) {
 
-                Map<String, Double> typeScoreMap = new HashMap<>();
+                Map<String,Double> typeScoreMap = new HashMap<>();
                 for (Node node : basicNode.getNodes()) {
-                    for (CatchDTO catchDTO : userCatchDTO.getCatchDTOs()) {
+                    for (CatchDTO catchDTO : userCatchDTO.getLatestDTOS()) {
                         if (node.getName().equals(catchDTO.getNodeName())) {//用户命中了该node
                             double scoreGot = 0;
                             String key = node.getCategory();
@@ -114,19 +112,22 @@ public class GeneralCalculateScoreComponent {
                                 scoreGot = typeScoreMap.get(key);
                             }
                             //获取权重
-                            double singleNodeWeight = getNodeWeight(basicNode, node.getCategory(), node.getName());
+                            double singleNodeWeight = getNodeWeight(basicNode, node);
                             typeScoreMap.put(key, scoreGot + singleNodeWeight);
                             break;//一旦找到命中node则跳出,无需继续遍历
                         }
                     }
                 }
-                userScoreMap.put(userCatchDTO.getUserId(), typeScoreMap);
-            }
-
-            return userScoreMap;
 
+                typeScoreMap.keySet().forEach(type->{
+                    GeneralGradeDTO generalGradeDTO = new GeneralGradeDTO(userCatchDTO.getUserId
+                        (),userCatchDTO.getExamId(),userCatchDTO.getCaseId(),type,typeScoreMap
+                        .get(type),userCatchDTO.getLatestDTOS().get(0).getUploadTime(),"");
+                    generalGradeDTOList.add(generalGradeDTO);
+                });
+            }
         }
-        return null;
+        return generalGradeDTOList;
     }
 
 
@@ -134,22 +135,33 @@ public class GeneralCalculateScoreComponent {
      * 获取node节点的权重
      *
      * @param basicNode 元node
-     * @param nodeName  node名称
+     * @param singleNode  要计算权重的node节点
      * @return node节点的权重
      */
-    private double getNodeWeight(CaseGraphDTO basicNode, String category, String nodeName) {
-        int nodeNum = 0;
+    private double getNodeWeight(CaseGraphDTO basicNode, Node singleNode) {
+        int weightNum = 0;
+        int thisNodeWeight = singleNode.getWeight()==null?1:singleNode.getWeight();
         for (Node node : basicNode.getNodes()) {
-            if (node.getCategory().equals(category)) {
-                nodeNum++;
+            if (node.getCategory().equals(singleNode.getCategory())) {
+                if(node.getWeight()!=null){
+                    if(node.getWeight() >= 0){
+                        weightNum+=node.getWeight();
+                    }
+                }else{
+                    weightNum++;//同类型的node节点默认权重为1
+                }
             }
         }
-        BigDecimal bg = new BigDecimal(100.00 / nodeNum).setScale(10, RoundingMode.HALF_UP);
+        if(weightNum == 0){
+            return 0.0;
+        }
+        BigDecimal bg = new BigDecimal((100.00*thisNodeWeight)/weightNum).setScale(10, RoundingMode
+            .HALF_UP);
 
-        double singleNodeWeight = bg.doubleValue(); //同类型的node节点默认权重相等
+        double singleNodeWeight = bg.doubleValue();
 
         for (Node node : basicNode.getNodes()) {
-            if (node.getName().equals(nodeName)) {
+            if (node.getName().equals(singleNode.getName())) {
                 String description = node.getDescription();
                 if ((!(description == null)) && (description.contains("\"weight\":"))) {//描述中含有权重字段,暂时这样存放单个node的权重
                     NodeExtends nodeExtension = JSONUtil.json2Obj(description, NodeExtends.class);
@@ -162,31 +174,24 @@ public class GeneralCalculateScoreComponent {
         return singleNodeWeight;
     }
 
-
-    /**
-     * 计算用户一个case的分数
-     *
-     * @param taskId 考试id
-     * @param caseId 题目id
-     * @param userId 用户id
-     * @return case的得分
-     */
-    private double calculateCaseScore(long taskId, long caseId, long userId) {
-        CaseGraphDTO basicNode = caseGraphService.getCaseGraph(caseId);
-        double caseScore = 0;
-        for (Category category : basicNode.getCategories()) {
-            int weight = weightGeneralService.getWeight(taskId, caseId, category.getName());
-            double typeScore = generalCalculateScoreService.getTypeScore(userId, taskId, caseId, category.getName());
-            caseScore += (weight * 0.01 * typeScore);
+    private ScoreStrategy getTypeScoreStrategy(long examId, long caseId){
+        int number = exam2CaseService.getScoreStrategyByExamIdAndCaseId(examId,caseId);
+        switch (number){
+            case 0: return latestStrategy;
+            case 1: return highestStrategy;
+            default: return latestStrategy;
         }
+    }
 
-        return caseScore;
-
+    public void saveGrade(long workerId, long taskId, long caseId, double score) {
+        submitRecordService.addCase(taskId, caseId, workerId, "");
+        submitRecordService.recordScore(taskId, caseId, workerId, score);
     }
 
+
     @Async
-    public void saveCaughtDetails(Long examId, Long caseId, Long userId,
-                                  List<CaughtNodeDTO> caughtNodeDTOs, List<CatchDTO> catchDTOList) {
+    public void saveCaughtDetails(Long examId, Long caseId, Long userId, String
+        source, List<CaughtNodeDTO> caughtNodeDTOs, List<CatchDTO> catchDTOList) {
 
         List<CaughtNodeDTO> caughtNodeDTOList = caughtNodeService.getCaughtNodeList(examId, caseId);
         if (caughtNodeDTOList == null) {
@@ -236,6 +241,8 @@ public class GeneralCalculateScoreComponent {
             List<CatchDTO> catchDTOs = userCatchDTO.getCatchDTOs();
             catchDTOs.addAll(catchDTOList);
             userCatchDTO.setCatchDTOs(catchDTOs);
+            //存储该学生每次最新覆盖的Nodelist
+            userCatchDTO.setLatestDTOS(catchDTOList);
             userCatchService.updateUserCatch(userCatchDTO);
         } else {
             UserCatchDTO userCatchDTO = new UserCatchDTO();
@@ -245,10 +252,11 @@ public class GeneralCalculateScoreComponent {
             List<CatchDTO> catchDTOs = new ArrayList<>();
             catchDTOs.addAll(catchDTOList);
             userCatchDTO.setCatchDTOs(catchDTOs);
+            userCatchDTO.setLatestDTOS(catchDTOs);
             userCatchService.createUserCatch(userCatchDTO);
         }
         //上传caughtNode userCatch结束,调用算分
 
-        calculateGrade(examId, caseId, userId);
+        calculateGrade(examId, caseId, userId,source);
     }
 }

+ 25 - 15
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GeneralCalculateScoreLogicImpl.java

@@ -1,12 +1,10 @@
 package cn.iselab.mooctest.site.web.logic.impl;
 
 import cn.iselab.mooctest.site.service.SubmitRecordService;
-import cn.iselab.mooctest.site.service.CaseGraphService;
-import cn.iselab.mooctest.site.service.CaughtNodeService;
 import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
-import cn.iselab.mooctest.site.service.UserCatchService;
 import cn.iselab.mooctest.site.service.WeightGeneralService;
 import cn.iselab.mooctest.site.web.logic.GeneralCalculateScoreLogic;
+import java.util.List;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -19,27 +17,39 @@ import org.springframework.stereotype.Service;
 @Service
 public class GeneralCalculateScoreLogicImpl implements GeneralCalculateScoreLogic{
 
-  //获取元node服务
-  @Autowired
-  CaseGraphService caseGraphService;
-  //获取被命中nodes的服务
-  @Autowired
-  CaughtNodeService caughtNodeService;
-  @Autowired
-  UserCatchService userCatchService;
-  @Autowired
-  GeneralCalculateScoreService generalCalculateScoreService;
   @Autowired
   WeightGeneralService weightGeneralService;
   @Autowired
   SubmitRecordService submitRecordService;
+
+  @Autowired
+  GeneralCalculateScoreService generalCalculateScoreService;
+
   @Autowired
   GeneralCalculateScoreComponent generalCalculateScoreComponent;
 
 
+
   @Override
-  public void calculateScore(long taskId, long caseId, Long userId) {
-    generalCalculateScoreComponent.calculateGrade(taskId,caseId,userId);
+  public void calculateScore(long examId, long caseId, Long userId, String source) {
+    generalCalculateScoreComponent.calculateGrade(examId, caseId, userId, source);
   }
 
+  @Override
+  public void calculateCaseScore(long examId, long caseId, long userId) {
+    generalCalculateScoreComponent.calculateCaseScore(examId, caseId, userId);
+  }
+
+  @Override
+  public void calculateCaseScore(long examId, long caseId) {
+    List<Long> uploadUsers = generalCalculateScoreService.getUploadUsers(examId, caseId);
+    uploadUsers.forEach(uid-> calculateCaseScore(examId, caseId,uid));
+  }
+
+  @Override
+  public void uploadCaseScore(long examId, long caseId, long userId,double score){
+    generalCalculateScoreComponent.saveGrade(userId,examId,caseId,score);
+  }
+
+
 }

+ 53 - 5
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/GroupLogicImpl.java

@@ -5,10 +5,13 @@ import cn.iselab.mooctest.site.models.Group;
 import cn.iselab.mooctest.site.models.ManagerProperty;
 import cn.iselab.mooctest.site.models.User;
 import cn.iselab.mooctest.site.models.instancePermission.GroupPermission;
+import cn.iselab.mooctest.site.service.ExamService;
 import cn.iselab.mooctest.site.service.GroupService;
 import cn.iselab.mooctest.site.service.ManagerPropertyService;
 import cn.iselab.mooctest.site.service.UserService;
 import cn.iselab.mooctest.site.service.instancePermission.GroupPermissionService;
+import cn.iselab.mooctest.site.util.CaptchaUtils;
+import cn.iselab.mooctest.site.util.data.Converter;
 import cn.iselab.mooctest.site.web.data.GroupVO;
 import cn.iselab.mooctest.site.web.data.UserVO;
 import cn.iselab.mooctest.site.web.data.wrapper.GroupVOWrapper;
@@ -18,8 +21,6 @@ import cn.iselab.mooctest.site.web.exception.HttpNotFoundException;
 import cn.iselab.mooctest.site.web.exception.IllegalOperationException;
 import cn.iselab.mooctest.site.web.logic.BaseLogic;
 import cn.iselab.mooctest.site.web.logic.GroupLogic;
-import cn.iselab.mooctest.site.util.CaptchaUtils;
-import cn.iselab.mooctest.site.util.data.Converter;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -54,6 +55,9 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
     @Autowired
     private ManagerPropertyService managerPropertyService;
 
+    @Autowired
+    private ExamService examService;
+
     @Override
     public List<GroupVO> getOwnerGroups(long ownerId) {
         List<Group> groups = groupService.getGroupsByOwnerId(ownerId);
@@ -98,6 +102,8 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
         if (group == null) {
             throw new HttpNotFoundException(String.format("Group[id=%s] doesn't exist", groupId));
         }
+        if (group.getDeleted().equals(Boolean.TRUE))
+            throw new HttpForbiddenException("group has been deleted");
         GroupVO groupVO = Converter.convert(GroupVO.class, group);
         groupVO.setWorkerCount(groupService.getWorkerCount(groupId));
         return groupVO;
@@ -109,6 +115,8 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
         if (group == null) {
             throw new HttpNotFoundException(String.format("Group[id=%s] doesn't exist", groupId));
         }
+        if (group.getDeleted().equals(Boolean.TRUE))
+            throw new HttpBadRequestException("group has been deleted");
         List<UserVO> UserVOs = new ArrayList<UserVO>();
         List<User> users = groupService.getUserByGroupId(groupId);
         users.forEach(user -> {
@@ -161,6 +169,8 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
         if (group == null) {
             throw new HttpNotFoundException("班级[id=" + groupVO.getId() + "]不存在!");
         }
+        if (group.getDeleted().equals(Boolean.TRUE))
+            throw new HttpBadRequestException("班级已被删除");
         if (group.getIsActive() == false) {
             throw new HttpBadRequestException("班级已关闭");
         }
@@ -192,6 +202,9 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
         if (group == null) {
             throw new HttpNotFoundException("班级[id=" + groupId + "]不存在!");
         }
+        if (group.getDeleted().equals(Boolean.TRUE)) {
+            throw new HttpBadRequestException("班级已被删除");
+        }
         if (group.getIsActive() == false) {
             throw new HttpBadRequestException("班级已关闭");
         }
@@ -217,15 +230,22 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
     public UserVO deleteUserFromGroup(long userId, long groupId) {
         Group group = groupService.getGroup(groupId);
         if (group == null) {
-            throw new HttpNotFoundException(String.format("Group[id=%s] not exist", groupId));
+            throw new HttpNotFoundException(String.format("班级[id=%s] 不存在", groupId));
+        }
+        if (group.getDeleted().equals(Boolean.TRUE)) {
+            throw new HttpBadRequestException("Group has been deleted");
         }
         UserDTOForMT user = userService.findByUserId(userId);
         if (user == null) {
-            throw new HttpNotFoundException(String.format("User[id=%s] not exist", userId));
+            throw new HttpNotFoundException(String.format("用户[id=%s] 不存在", userId));
         }
         if (!groupService.checkUserExist(userId, groupId)) {
-            throw new HttpBadRequestException(String.format("User[id=%s] not exists in Group[id=%s]", user.getId(), groupId));
+            throw new HttpBadRequestException(String.format("用户[id=%s] 不在班级[id=%s]中", user.getId(), groupId));
         }
+        if(groupService.isCompetitionGroup(groupId)){
+            throw new HttpBadRequestException("不允许退出大赛班级");
+        }
+
         UserVO UserVO = new UserVO();
         UserVO = Converter.copy(UserVO, groupService.deleteUserFromGroup(userId, groupId));
         UserVO.setPassword("");
@@ -236,6 +256,8 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
     @Override
     public GroupVO updateAllowJoin(long groupId) {
         Group group = groupService.getGroup(groupId);
+        if (group.getDeleted().equals(Boolean.TRUE))
+            throw new HttpBadRequestException("group has been deleted");
         group.setAllowJoin(!group.getAllowJoin());
         return Converter.convert(GroupVO.class, groupService.save(group));
     }
@@ -243,11 +265,22 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
     @Override
     public GroupVO updateGroupActive(Long groupId) {
         Group group = groupService.getGroup(groupId);
+        if (group.getDeleted().equals(Boolean.TRUE))
+            throw new HttpBadRequestException("group has been deleted");
         group.setIsActive(false);
         return Converter.convert(GroupVO.class, groupService.save(group));
     }
 
     @Override
+    public GroupVO updateGroupName(String name, Long groupId) {
+        Group group = groupService.getGroup(groupId);
+        if (group.getDeleted().equals(Boolean.TRUE))
+            throw new HttpForbiddenException("group has been deleted");
+        group.setName(name);
+        return Converter.convert(GroupVO.class, groupService.save(group));
+    }
+
+    @Override
     public int getUserTotalCount(long managerId) {
         return groupService.getUserTotalCount(managerId);
     }
@@ -273,7 +306,22 @@ public class GroupLogicImpl extends BaseLogic implements GroupLogic {
             throw new HttpForbiddenException("Group not allowed to join");
         }
 
+        if (group.getDeleted().equals(Boolean.TRUE)) {
+            throw new HttpBadRequestException("Group has been deleted");
+        }
         return groupVOWrapper.wrap(groupService.joinGroup(userId, group));
     }
 
+    @Override
+    public void deleteGroup(Long id) {
+        if (groupService.getUserByGroupId(id).size() != 0) {
+            throw new HttpForbiddenException("already have users in this group");
+        }
+        if (groupService.ifExamsAssignedtoGroup(id)) {
+            throw new HttpForbiddenException("already have exams assigned to this group");
+        }
+        Group group = groupService.getGroup(id);
+        group.setDeleted(Boolean.TRUE);
+        groupService.save(group);
+    }
 }

+ 39 - 23
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/PaperLogicImpl.java

@@ -3,10 +3,10 @@ package cn.iselab.mooctest.site.web.logic.impl;
 import cn.iselab.mooctest.site.common.event.EventUtil;
 import cn.iselab.mooctest.site.common.event.PublicityCaseEvent;
 import cn.iselab.mooctest.site.models.Paper;
-import cn.iselab.mooctest.site.models.Paper2Case;
 import cn.iselab.mooctest.site.service.PaperService;
 import cn.iselab.mooctest.site.service.UserService;
 import cn.iselab.mooctest.site.service.instancePermission.PaperPermissionService;
+import cn.iselab.mooctest.site.util.data.Converter;
 import cn.iselab.mooctest.site.web.data.CaseBlockVO;
 import cn.iselab.mooctest.site.web.data.CaseExtendsVO;
 import cn.iselab.mooctest.site.web.data.PaperVO;
@@ -14,14 +14,15 @@ import cn.iselab.mooctest.site.web.data.wrapper.PaperVOWrapper;
 import cn.iselab.mooctest.site.web.logic.BaseLogic;
 import cn.iselab.mooctest.site.web.logic.CaseLogic;
 import cn.iselab.mooctest.site.web.logic.PaperLogic;
-import cn.iselab.mooctest.site.util.data.Converter;
 import org.apache.shiro.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by major on 2017/6/15.
@@ -48,27 +49,27 @@ public class PaperLogicImpl extends BaseLogic implements PaperLogic {
     EventUtil eventUtil;
 
     @Override
-    public PaperVO getPaperById(long paperId,Long examId) {
+    public PaperVO getPaperById(long paperId, Long examId) {
         Paper paper = paperService.getById(paperId);
         PaperVO paperVO;
-        if(examId==null){
+        if (examId == null) {
             paperVO = paperVOWrapper.wrap(paper);
-        }else{
-            paperVO = paperVOWrapper.wrapExamPaper(paper,examId);
+        } else {
+            paperVO = paperVOWrapper.wrapExamPaper(paper, examId);
         }
         return paperVO;
     }
 
     @Override
     public PaperVO deletePaper(long paperId) {
-        Paper paper=paperService.getById(paperId);
-        if(paper == null){
+        Paper paper = paperService.getById(paperId);
+        if (paper == null) {
             throw new IllegalArgumentException("试卷不存在");
         }
-        if(paperService.isUsedByExam(paperId)){
+        if (paperService.isUsedByExam(paperId)) {
             throw new IllegalArgumentException("试卷已被使用");
         }
-        if(paper.getIsPublic()==true) {
+        if (paper.getIsPublic() == true) {
             throw new IllegalArgumentException("无法删除公开试卷");
         }
         paperService.deletePaper(paperId);
@@ -77,11 +78,11 @@ public class PaperLogicImpl extends BaseLogic implements PaperLogic {
 
     @Override
     public PaperVO copyPaper(long paperId) {
-        Paper paper=paperService.getById(paperId);
-        if(paper == null){
+        Paper paper = paperService.getById(paperId);
+        if (paper == null) {
             throw new IllegalArgumentException("试卷不存在,不可删除");
         }
-        Paper newPaper=new Paper();
+        Paper newPaper = new Paper();
         newPaper.setDescription(paper.getDescription());
         newPaper.setDifficult(paper.getDifficult());
         newPaper.setName(paper.getName() + "-副本");
@@ -92,12 +93,12 @@ public class PaperLogicImpl extends BaseLogic implements PaperLogic {
         paperPermissionService.createPaper(userId, newPaper.getId());
         paperPermissionService.publishPaper(newPaper.getId());
 
-        return Converter.convert(PaperVO.class,newPaper);
+        return Converter.convert(PaperVO.class, newPaper);
     }
 
     @Override
     public PaperVO createPaper(PaperVO paperVO) {
-        PaperVO savedPaper =  savePaperVO(paperVO);
+        PaperVO savedPaper = savePaperVO(paperVO);
         Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
         paperPermissionService.createPaper(userId, savedPaper.getId());
         paperPermissionService.publishPaper(savedPaper.getId());
@@ -106,10 +107,10 @@ public class PaperLogicImpl extends BaseLogic implements PaperLogic {
 
     @Override
     public PaperVO updatePaper(PaperVO paperVO) {
-        if(paperService.isUsedByExam(paperVO.getId())){
+        if (paperService.isUsedByExam(paperVO.getId())) {
             throw new IllegalArgumentException("试卷已被使用,不可更改");
         }
-        if(paperService.getById(paperVO.getId()).getIsDeleted()) {
+        if (paperService.getById(paperVO.getId()).getIsDeleted()) {
             throw new IllegalArgumentException("试卷已被删除,不可更改");
         }
         return savePaperVO(paperVO);
@@ -120,7 +121,7 @@ public class PaperLogicImpl extends BaseLogic implements PaperLogic {
         List<CaseBlockVO> caseBlocks = paperVO.getCaseBlocks();
 
         paper = paperService.createOrUpdate(paper);
-        if(caseBlocks != null) {
+        if (caseBlocks != null) {
             paperService.updateCaseAndWeight(paper.getId(), caseBlocks);
         }
         PaperVO paperVO1 = paperVOWrapper.wrap(paperService.getById(paper.getId()));
@@ -128,11 +129,11 @@ public class PaperLogicImpl extends BaseLogic implements PaperLogic {
     }
 
     @Override
-    public Page<PaperVO> getPaperList(boolean isPublic,String keyword, Pageable pageable) {
-        Page<Paper> papers = paperService.findAll(pageable, keyword);
-        if(!isPublic){
+    public Page<PaperVO> getPaperList(boolean isPublic, String keyword, Pageable pageable, Map<String,String> extraCondition) {
+        Page<Paper> papers = paperService.findAll(pageable, keyword,extraCondition);
+        if (!isPublic) {
             Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
-            papers = paperService.findAllByOwnerId(userId,keyword,pageable);
+            papers = paperService.findAllByOwnerId(userId, keyword, pageable,extraCondition);
         }
 
         return paperVOWrapper.wrapPaperList(papers);
@@ -146,7 +147,7 @@ public class PaperLogicImpl extends BaseLogic implements PaperLogic {
 
     @Override
     public PaperVO publicityPaper(Long paperId) throws Exception {
-        Paper paper= paperService.getById(paperId);
+        Paper paper = paperService.getById(paperId);
         if (paper == null) {
             throw new IllegalArgumentException("Cannot find the paper");
         }
@@ -165,4 +166,19 @@ public class PaperLogicImpl extends BaseLogic implements PaperLogic {
 
         return paperVOWrapper.wrap(paper);
     }
+
+    @Override
+    public List<PaperVO> getUnassignedPaperList(Long userId) {
+        //私有&未删除的paper
+        List<Paper> papers = paperService.getUndeletedPrivatePapers(userId);
+        //公有&未删除的paper
+        papers.addAll(paperService.getUndeletedPulicPapers());
+
+        List<Paper> returnList = new ArrayList<>();
+        for (Paper paper : papers) {
+            if (!paperService.isUsedByExam(paper.getId()))
+                returnList.add(paper);
+        }
+        return paperVOWrapper.wrap(returnList);
+    }
 }

+ 4 - 3
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/TargetLogicImpl.java

@@ -36,6 +36,7 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * Created by ROGK on 2017/6/18.
@@ -201,14 +202,14 @@ public class TargetLogicImpl extends BaseLogic implements TargetLogic {
     }
 
     @Override
-    public Page<TargetListVO> getTargets(String keyword, boolean visible, Pageable pageable) {
+    public Page<TargetListVO> getTargets(String keyword, boolean visible, Map<String,String> extraCondition, Pageable pageable) {
         Long userId = (Long) SecurityUtils.getSubject().getSession().getAttribute("userId");
         Page<TargetListVO> targetListVOS;
         if (visible) {
-            Page<Target2User> app2Users = targetService.getTargets(userId, keyword, pageable);
+            Page<Target2User> app2Users = targetService.getTargets(userId, keyword,extraCondition, pageable);
             targetListVOS = app2Users.map(app -> targetVOWrapper.wrapTargetListVO(app));
         } else {
-            Page<Target> apps = targetService.getMyTargets(userId, keyword, pageable);
+            Page<Target> apps = targetService.getMyTargets(userId, keyword,extraCondition, pageable);
             targetListVOS = apps.map(app -> targetVOWrapper.wrapTargetListVO(app));
         }
         return targetListVOS;

+ 9 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/UserLogicImpl.java

@@ -2,6 +2,7 @@ package cn.iselab.mooctest.site.web.logic.impl;
 
 import cn.afterturn.easypoi.excel.ExcelExportUtil;
 import cn.afterturn.easypoi.excel.entity.ExportParams;
+import cn.iselab.mooctest.rpc.user.data.UserIntegralDTO;
 import cn.iselab.mooctest.site.common.annotation.PointChange;
 import cn.iselab.mooctest.site.common.constant.Constants;
 import cn.iselab.mooctest.site.configure.realm.DefaultUsernamepasswordToken;
@@ -11,6 +12,7 @@ import cn.iselab.mooctest.site.models.ManagerProperty;
 import cn.iselab.mooctest.site.models.Role;
 import cn.iselab.mooctest.site.models.User;
 import cn.iselab.mooctest.site.models.User2Role;
+import cn.iselab.mooctest.site.rpc.user.IntegralService;
 import cn.iselab.mooctest.site.service.*;
 import cn.iselab.mooctest.site.util.data.EncryptionUtil;
 import cn.iselab.mooctest.site.web.data.ManagerPropertyVO;
@@ -108,6 +110,9 @@ public class UserLogicImpl extends BaseLogic implements UserLogic {
     @Autowired
     private MenuVOWrapper menuVOWrapper;
 
+    @Autowired
+    private IntegralService integralService;
+
     private UserDTOForMT transfer(UserVO userVO) {
         return Converter.convert(UserDTOForMT.class, userVO);
     }
@@ -744,6 +749,10 @@ public class UserLogicImpl extends BaseLogic implements UserLogic {
         userVO.setMenuVOs(menuVOs);
         userVO.setOpenId(openId2UserIdService.findOpenIdByUserId(userVO.getId()));
         userVO.setPassword("");
+        UserIntegralDTO integralDTO=integralService.getUserIntegral(userVO.getId());
+        if (integralDTO!=null) {
+            userVO.setIntegral(integralDTO.getTotal());
+        }
 
         if (managerPropertyService.getManagerPropertyByUserId(userVO.getId()) != null) {
             ManagerProperty managerProperty = managerPropertyService.getManagerPropertyByUserId(userVO.getId());

+ 20 - 22
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/impl/WechatLogicImpl.java

@@ -300,6 +300,11 @@ public class WechatLogicImpl implements WechatLogic {
         return result;
     }
 
+    /**
+     * 某个学生获取自己参加的赛项的成绩情况
+     * @param request
+     * @return
+     */
     @Override
     public String getContest(HttpServletRequest request){
         if(request.getParameter("userId")==null)
@@ -351,16 +356,13 @@ public class WechatLogicImpl implements WechatLogic {
         }
     }
 
-    @Override
-    public String getContests(HttpServletRequest request){
-        if(request.getParameter("userId")==null)
-            return missingParameterResponse;
-        long userId = Long.parseLong(request.getParameter("userId"));
-        String result=wechatService.getContests(userId);
-        result = generateResponse(HTTP_OK, "", result);
-        return result;
-    }
-
+    /**
+     * 微信服务号获取某个老师指导的所有赛项中成绩最好的学生的成绩情况
+     * @param request
+     * @return
+     * award 排名
+     * rank 击败的多少对手(百分比)
+     */
     @Override
     public String getWorkerContests(HttpServletRequest request){
         if(request.getParameter("userId")==null)
@@ -373,21 +375,23 @@ public class WechatLogicImpl implements WechatLogic {
         UserDTOForMT user = userService.findByUserId(userId);
 
         JSONArray jsonArray=new JSONArray();
-//        List<Long> examIds = contestMentorService.getExamIdByTeacherName(user.getEmail());
-        List<Long> examIds =  new ArrayList<>();
+
+        List<ContestMentorSubmitRecord> contestMentorSubmitRecords = submitRecordService.getConestAssignedTasks(userId);
+
+        List<Long> examIds = contestMentorSubmitRecords.stream().map(c-> c.getExamId()).distinct().collect(Collectors.toList());
         System.out.println(examIds.size());
         if(examIds==null||examIds.size()==0)
             return generateResponse(HTTP_INTERNAL_ERROR, "none exam", "{}");
         examIds.forEach(examId-> {
-            List<ContestMentorSubmitRecord> contestMentorSubmitRecords = submitRecordService.getConestAssignedTasks(examId,userId);
-            contestMentorSubmitRecords.sort(new Comparator<ContestMentorSubmitRecord>() {
+            List<ContestMentorSubmitRecord> submitRecordsForExam = contestMentorSubmitRecords.stream().filter(c-> c.getExamId().equals(examId)).collect(Collectors.toList());
+            submitRecordsForExam.sort(new Comparator<ContestMentorSubmitRecord>() {
                 @Override
                 public int compare(ContestMentorSubmitRecord o1, ContestMentorSubmitRecord o2) {
                     return (int)(o2.getScore()-o1.getScore());
                 }
             });
-            if(contestMentorSubmitRecords !=null&& contestMentorSubmitRecords.size()!=0) {
-                ContestMentorSubmitRecord contestMentorSubmitRecord = contestMentorSubmitRecords.get(0);
+            if(submitRecordsForExam !=null&& submitRecordsForExam.size()!=0) {
+                ContestMentorSubmitRecord contestMentorSubmitRecord = submitRecordsForExam.get(0);
                 UserDTOForMT user1= userService.findByUserId(contestMentorSubmitRecord.getParticipantId());
                 List<SubmitRecord> submitRecords = submitRecordService.getAssignedTasks(examId);
                 List<Double> scores = submitRecords.stream().map(SubmitRecord::getScore).collect(Collectors.toList());
@@ -436,7 +440,6 @@ public class WechatLogicImpl implements WechatLogic {
             userVO.setOpenId(openId2UserIdService.findOpenIdByUserId(userVO.getId()));
 
             List<Permission> permissions=permissionService.findByUserId(userDTO.getId());
-            System.out.println(new Gson().toJson(userVO).toString());
             return "<html><head><script>"+
                     "localStorage.setItem('permissionSet','"+new Gson().toJson(permissions.stream().map(p-> p.toString()).collect(Collectors.toList())).toString()
                     +"');"+ "localStorage.setItem('user','"+new Gson().toJson(userVO).toString()+"');"+
@@ -457,9 +460,4 @@ public class WechatLogicImpl implements WechatLogic {
         return true;
     }
 
-    @Override
-    public UserVO register(UserWechatDTO dto){
-        UserVO userVO=new UserVO();
-        return userVO;
-    }
 }

+ 59 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/strategy/HighestStrategy.java

@@ -0,0 +1,59 @@
+package cn.iselab.mooctest.site.web.logic.strategy;
+
+import cn.iselab.mooctest.site.models.WeightGeneral;
+import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
+import cn.iselab.mooctest.site.service.WeightGeneralService;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 最高分
+ *
+ * @author yyy
+ * @create 2018-06-07 17:40
+ */
+@Component
+public class HighestStrategy implements ScoreStrategy {
+
+  @Autowired
+  GeneralCalculateScoreService generalCalculateScoreService;
+  @Autowired
+  WeightGeneralService weightGeneralService;
+
+  @Override
+  public double getCaseScore(long examId, long caseId, Long userId) {
+    Map<String,Map<String,Double>> timeTypeScoreMap = generalCalculateScoreService
+        .getTimeTypeScore(userId,examId,caseId);
+    List<WeightGeneral> weightGeneralList = weightGeneralService.get(examId,caseId);
+    List<Double> caseScores = new ArrayList<>();
+
+    timeTypeScoreMap.keySet().forEach(key->{
+      double caseScore = 0.0;
+      Map<String,Double> scoreMap = timeTypeScoreMap.get(key);
+      for(WeightGeneral weightGeneral:weightGeneralList){
+        int weight = weightGeneral.getWeight();
+        String category = weightGeneral.getType();
+        double typeScore = scoreMap.get(category)!=null?scoreMap.get(category):0.0;
+        caseScore += (weight * 0.01 * typeScore);
+      }
+      caseScores.add(caseScore);
+    });
+
+    double maxCaseScore = 0.0;
+    if(caseScores.size()>0){
+      maxCaseScore = caseScores.get(0);
+    }else{
+      return maxCaseScore;
+    }
+    for(int i=1;i<caseScores.size();i++){
+      if(caseScores.get(i)>maxCaseScore){
+        maxCaseScore = caseScores.get(i);
+      }
+    }
+
+    return maxCaseScore;
+  }
+}

+ 43 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/strategy/LatestStrategy.java

@@ -0,0 +1,43 @@
+package cn.iselab.mooctest.site.web.logic.strategy;
+
+import cn.iselab.mooctest.site.models.WeightGeneral;
+import cn.iselab.mooctest.site.service.GeneralCalculateScoreService;
+import cn.iselab.mooctest.site.service.WeightGeneralService;
+import java.util.List;
+import java.util.Map;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 最新一次成绩
+ *
+ * @author yyy
+ * @create 2018-06-07 17:39
+ */
+@Component
+public class LatestStrategy implements ScoreStrategy {
+
+  @Autowired
+  GeneralCalculateScoreService generalCalculateScoreService;
+
+  @Autowired
+  WeightGeneralService weightGeneralService;
+
+  @Override
+  public double getCaseScore(long examId, long caseId, Long userId) {
+
+    double caseScore = 0;
+    Map<String,Double> scoreMap = generalCalculateScoreService.getLatestTypeScore(userId,
+        examId, caseId);
+    for(WeightGeneral weightGeneral:weightGeneralService.get(examId,caseId)) {
+      int weight = weightGeneral.getWeight();
+      String category = weightGeneral.getType();
+      double typeScore = scoreMap.get(category)!=null?scoreMap.get(category):0.0;
+      caseScore += (weight * 0.01 * typeScore);
+    }
+    return caseScore;
+
+  }
+
+
+}

+ 23 - 0
mooctest-site-server/src/main/java/cn/iselab/mooctest/site/web/logic/strategy/ScoreStrategy.java

@@ -0,0 +1,23 @@
+package cn.iselab.mooctest.site.web.logic.strategy;
+
+import cn.iselab.mooctest.site.data.GeneralGradeDTO;
+import java.util.List;
+
+/**
+ * 获取type score的抽象策略
+ *
+ * @author yyy
+ * @create 2018-05-29 16:01
+ */
+public interface ScoreStrategy {
+
+  /**
+   * 获取一场考试一个case的分数
+   * @param examId 考试id
+   * @param caseId 题目id
+   * @param userId 用户id
+   * @return
+   */
+  double getCaseScore(long examId, long caseId, Long userId);
+
+}

Деякі файли не було показано, через те що забагато файлів було змінено