Browse Source

Merge branch 'master' into 'feature-V2.0'

Master

See merge request crowd-2019/crowd-test-service-backend!141
郭超 5 years ago
parent
commit
673257bad6
43 changed files with 784 additions and 81 deletions
  1. 16 0
      core/pom.xml
  2. 2 2
      core/src/main/java/com/mooctest/crowd/domain/dao/CrowdTestProjectDao.java
  3. 2 3
      core/src/main/java/com/mooctest/crowd/domain/dao/CrowdTestTaskDao.java
  4. 24 0
      core/src/main/java/com/mooctest/crowd/domain/dao/EndPointDao.java
  5. 0 2
      core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestProject.java
  6. 6 1
      core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestTask.java
  7. 14 0
      core/src/main/java/com/mooctest/crowd/domain/domainobject/EndPoint.java
  8. 2 0
      core/src/main/java/com/mooctest/crowd/domain/domainobject/TestType.java
  9. 35 0
      core/src/main/java/com/mooctest/crowd/domain/model/EndPointPO.java
  10. 6 0
      core/src/main/java/com/mooctest/crowd/domain/model/TestTypePO.java
  11. 35 12
      core/src/main/java/com/mooctest/crowd/domain/repository/CommonRepo.java
  12. 95 1
      core/src/main/java/com/mooctest/crowd/domain/repository/CrowdTestProjectRepo.java
  13. 9 0
      core/src/main/java/com/mooctest/crowd/domain/repository/ICrowdTestProjectRepo.java
  14. 23 1
      core/src/test/java/com/mooctest/crowd/domain/repository/CrowdTestProjectRepoTest.java
  15. 37 1
      site/pom.xml
  16. 21 0
      site/src/main/java/com/mooctest/crowd/site/command/CrowdTestTaskCommand.java
  17. 16 0
      site/src/main/java/com/mooctest/crowd/site/command/EndPointCommand.java
  18. 143 0
      site/src/main/java/com/mooctest/crowd/site/configuration/Swagger2Configuration.java
  19. 18 0
      site/src/main/java/com/mooctest/crowd/site/configuration/SwaggerEnableCondition.java
  20. 2 0
      site/src/main/java/com/mooctest/crowd/site/controller/AgencyController.java
  21. 0 0
      site/src/main/java/com/mooctest/crowd/site/controller/CommonController.java
  22. 2 3
      site/src/main/java/com/mooctest/crowd/site/controller/CrowTestSquareController.java
  23. 10 1
      site/src/main/java/com/mooctest/crowd/site/controller/CrowdProjectController.java
  24. 16 4
      site/src/main/java/com/mooctest/crowd/site/controller/CrowdReportController.java
  25. 2 0
      site/src/main/java/com/mooctest/crowd/site/controller/CrowdTaskController.java
  26. 1 1
      site/src/main/java/com/mooctest/crowd/site/controller/EnumsController.java
  27. 2 0
      site/src/main/java/com/mooctest/crowd/site/controller/PersonalDataController.java
  28. 2 0
      site/src/main/java/com/mooctest/crowd/site/controller/TechnicalArticlesController.java
  29. 2 0
      site/src/main/java/com/mooctest/crowd/site/controller/UploadController.java
  30. 7 0
      site/src/main/java/com/mooctest/crowd/site/controller/UserController.java
  31. 2 0
      site/src/main/java/com/mooctest/crowd/site/data/TaskOperationControl.java
  32. 2 0
      site/src/main/java/com/mooctest/crowd/site/data/vo/CrowdTaskVO.java
  33. 20 0
      site/src/main/java/com/mooctest/crowd/site/data/vo/EndPointVO.java
  34. 4 0
      site/src/main/java/com/mooctest/crowd/site/data/vo/TestTypeVO.java
  35. 2 0
      site/src/main/java/com/mooctest/crowd/site/mediator/ViewMediator.java
  36. 81 34
      site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java
  37. 1 1
      site/src/main/java/com/mooctest/crowd/site/service/CommonService.java
  38. 16 0
      site/src/main/java/com/mooctest/crowd/site/service/EndPointService.java
  39. 9 3
      site/src/main/java/com/mooctest/crowd/site/service/impl/CommonServiceImpl.java
  40. 15 8
      site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdProjectServiceImpl.java
  41. 10 0
      site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdReportServiceImpl.java
  42. 26 3
      site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdTaskServiceImpl.java
  43. 46 0
      site/src/main/java/com/mooctest/crowd/site/service/impl/EndPointServiceImpl.java

+ 16 - 0
core/pom.xml

@@ -28,6 +28,16 @@
             <groupId>org.powermock</groupId>
             <artifactId>powermock-module-junit4</artifactId>
             <version>1.6.4</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>javassist</artifactId>
+                    <groupId>org.javassist</groupId>
+                </exclusion>
+                <exclusion>
+                    <artifactId>objenesis</artifactId>
+                    <groupId>org.objenesis</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.powermock</groupId>
@@ -119,6 +129,12 @@
             <groupId>cn.afterturn</groupId>
             <artifactId>easypoi-base</artifactId>
             <version>3.0.3</version>
+            <exclusions>
+                <exclusion>
+                    <artifactId>guava</artifactId>
+                    <groupId>com.google.guava</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>cn.afterturn</groupId>

+ 2 - 2
core/src/main/java/com/mooctest/crowd/domain/dao/CrowdTestProjectDao.java

@@ -35,11 +35,11 @@ public interface CrowdTestProjectDao extends CrudRepository<CrowdTestProjectPO,
     List<CrowdTestProjectPO> findAll();
 
     //这个指定了查询条数 适用于众测广场首页 这样性能会高一点。
-    @Query(value = "SELECT * FROM crowd_test_project p WHERE CTP_STATUS =1 and CTP_PDT_ID = 2 and CTP_IS_DELETED = 0 ORDER BY CTP_JOIN_COUNT DESC ,CTP_CREATE_TIME LIMIT 6; ", nativeQuery = true)
+    @Query(value = "SELECT * FROM crowd_test_project p WHERE CTP_STATUS =1 and CTP_PDT_ID = 2 and CTP_IS_DELETED = 0 ORDER BY CTP_CREATE_TIME DESC LIMIT 6; ", nativeQuery = true)
     List<CrowdTestProjectPO> findindexProject();
 
 
-    @Query(value = "SELECT * FROM crowd_test_project p WHERE CTP_STATUS !=4 and CTP_STATUS !=5 and CTP_IS_DELETED = 0 ORDER BY CTP_JOIN_COUNT DESC ,CTP_CREATE_TIME; ", nativeQuery = true)
+    @Query(value = "SELECT * FROM crowd_test_project p WHERE CTP_STATUS !=4 and CTP_STATUS !=5 and CTP_IS_DELETED = 0 ORDER BY CTP_JOIN_COUNT DESC ,CTP_STATUS ASC, CTP_CREATE_TIME DESC; ", nativeQuery = true)
     List<CrowdTestProjectPO> findAllHotProject();
 
     //这个指定了查询条数 适用于众测广场首页 这样性能会高一点对应热门项目

+ 2 - 3
core/src/main/java/com/mooctest/crowd/domain/dao/CrowdTestTaskDao.java

@@ -33,8 +33,7 @@ public interface CrowdTestTaskDao extends CrudRepository<CrowdTestTaskPO, Long>,
     List<CrowdTestTaskPO> findindexTask();
 
 
-    //热门任务
-    @Query(value = "select * FROM crowd_test_task WHERE (CTT_STATUS =1 or (CTT_STATUS =2 and CTT_FULL_STATUS = 0)) and CTT_DISTRIBUTION_TYPE = 2 and CTT_IS_DELETED = 0 ORDER BY CTT_ACCEPTED_COUNT DESC,CTT_CREATE_TIME", nativeQuery = true)
+    @Query(value = "select * FROM crowd_test_task WHERE (CTT_STATUS =1 or (CTT_STATUS =2 and CTT_FULL_STATUS = 0)) and CTT_DISTRIBUTION_TYPE = 2 and CTT_IS_DELETED = 0 ORDER BY CTT_CREATE_TIME DESC", nativeQuery = true)
     List<CrowdTestTaskPO> findCanAcceptTask();
 
     //热门任务
@@ -42,7 +41,7 @@ public interface CrowdTestTaskDao extends CrudRepository<CrowdTestTaskPO, Long>,
     List<CrowdTestTaskPO> findMoreHotTasks();
 
     //热门任务
-    @Query(value = "select * FROM  crowd_test_task WHERE CTT_STATUS !=4 and CTT_STATUS !=5 and CTT_IS_DELETED = 0  ORDER BY CTT_ACCEPTED_COUNT DESC,CTT_CREATE_TIME", nativeQuery = true)
+    @Query(value = "select * FROM  crowd_test_task WHERE CTT_STATUS !=4 and CTT_STATUS !=5 and CTT_IS_DELETED = 0  ORDER BY CTT_ACCEPTED_COUNT DESC, CTT_STATUS ASC ,CTT_CREATE_TIME DESC", nativeQuery = true)
     List<CrowdTestTaskPO> findMoreHotTasksList();
 
     List<CrowdTestTaskPO> findByNameLike(String name);

+ 24 - 0
core/src/main/java/com/mooctest/crowd/domain/dao/EndPointDao.java

@@ -0,0 +1,24 @@
+package com.mooctest.crowd.domain.dao;
+
+import com.mooctest.crowd.domain.model.EndPointPO;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.PagingAndSortingRepository;
+import org.springframework.data.repository.query.Param;
+
+import javax.transaction.Transactional;
+import java.util.Optional;
+
+
+@Transactional
+public interface EndPointDao extends PagingAndSortingRepository<EndPointPO, Long> ,CrudRepository<EndPointPO, Long>, JpaRepository<EndPointPO, Long> ,JpaSpecificationExecutor<EndPointPO>{
+    Optional<EndPointPO> findByTaskCode(String code);
+
+    @Modifying
+    @Query(nativeQuery = true,value="delete from end_point where EP_T_CODE=?")
+    void deleteEndPoint(@Param("taskCode") String code);
+
+}

+ 0 - 2
core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestProject.java

@@ -54,7 +54,6 @@ public class CrowdTestProject {
     private int isDeleted;
     private int joinCount;
     private Timestamp createTime;
-
     private List<CrowdTestTask> crowdTestTaskList;
     private CrowdTestReport crowdTestReportForProject;
 
@@ -264,7 +263,6 @@ public class CrowdTestProject {
         this.getCrowdTestTaskList().add(task);
     }
 
-
     public void removeTask(CrowdTestTask task) {
         this.setRestPrice(this.getRestPrice() + task.getQuotedPrice());
         this.getCrowdTestTaskList().remove(task);

+ 6 - 1
core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestTask.java

@@ -45,6 +45,7 @@ public class CrowdTestTask {
     private int acceptedCount;
     private int participantHasCommittedCount;
     private List<TaskToUser> acceptedUserList = new ArrayList<>();
+    private EndPoint endPoint;
 //    private List<CrowdTestReport> crowdTestReportList = new ArrayList<>();
 
     @Override
@@ -185,7 +186,11 @@ public class CrowdTestTask {
     }
 
     public void confirmFinish() {
-        if ((this.getParticipantHasCommittedCount() == this.getAcceptedCount() && this.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED) || (this.getParticipantHasCommittedCount() == this.getParticipantCount() && this.getStatus() == CrowdTestTaskStatus.HAS_COMMITED)) {
+        // 具有配置项,管理员可以结束任务
+        if(this.getEndPoint() != null){
+            this.setStatus(CrowdTestTaskStatus.HAS_FINISHED);
+            this.setEndTime(new Timestamp(System.currentTimeMillis()));
+        } else if ((this.getParticipantHasCommittedCount() == this.getAcceptedCount() && this.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED) || (this.getParticipantHasCommittedCount() == this.getParticipantCount() && this.getStatus() == CrowdTestTaskStatus.HAS_COMMITED)) {
             this.setStatus(CrowdTestTaskStatus.HAS_FINISHED);
             this.setEndTime(new Timestamp(System.currentTimeMillis()));
         } else {

+ 14 - 0
core/src/main/java/com/mooctest/crowd/domain/domainobject/EndPoint.java

@@ -0,0 +1,14 @@
+package com.mooctest.crowd.domain.domainobject;
+
+import lombok.Data;
+
+@Data
+public class EndPoint {
+    private Long id;
+    private String projectCode;
+    private String taskCode;
+    private String caseId;
+    private String examId;
+    private String serverCode;
+    private String url;
+}

+ 2 - 0
core/src/main/java/com/mooctest/crowd/domain/domainobject/TestType.java

@@ -12,4 +12,6 @@ public class TestType {
     private String code;
     private String name;
     private String introduction;
+    private int type; //0-无跳转 1-有跳转
+    private String url;
 }

+ 35 - 0
core/src/main/java/com/mooctest/crowd/domain/model/EndPointPO.java

@@ -0,0 +1,35 @@
+package com.mooctest.crowd.domain.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+
+@Data
+@Entity
+@Table(name = "end_point")
+public class EndPointPO {
+
+    @Id
+    @Column(name = "EP_ID")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(name = "EP_P_CODE")
+    private String projectCode;
+
+    @Column(name = "EP_T_CODE")
+    private String taskCode;
+
+    @Column(name = "EP_CASEID")
+    private String caseId;
+
+    @Column(name = "EP_EXAMID")
+    private String examId;
+
+    @Column(name = "EP_SERVER_CODE")
+    private String serverCode;
+
+    @Column(name = "EP_URL")
+    private String url;
+}

+ 6 - 0
core/src/main/java/com/mooctest/crowd/domain/model/TestTypePO.java

@@ -24,4 +24,10 @@ public class TestTypePO {
 
     @Column(name = "TT_INTRODUCTION")
     private String introduction;
+
+    @Column(name = "TT_TYPE")
+    private int type; //0-无跳转 1-有跳转
+
+    @Column(name = "TT_URL")
+    private String url;
 }

+ 35 - 12
core/src/main/java/com/mooctest/crowd/domain/repository/CommonRepo.java

@@ -2,13 +2,17 @@ package com.mooctest.crowd.domain.repository;
 
 import com.mooctest.crowd.domain.dao.*;
 import com.mooctest.crowd.domain.domainobject.*;
-import com.mooctest.crowd.domain.exception.*;
+import com.mooctest.crowd.domain.exception.ApplicationTypeNoExistException;
+import com.mooctest.crowd.domain.exception.BadRequestException;
+import com.mooctest.crowd.domain.exception.HttpBadRequestException;
+import com.mooctest.crowd.domain.exception.TestTypeNoExistException;
 import com.mooctest.crowd.domain.model.*;
 import com.mooctest.crowd.domain.util.Converter;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.data.jpa.domain.Specifications;
 import org.springframework.stereotype.Component;
@@ -17,6 +21,7 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 import java.util.stream.Collectors;
@@ -199,27 +204,45 @@ public class CommonRepo {
         };
     }
 
-    public Page<CrowdTestProject> getProjectList(Pageable pageable, String code, String keyword) {
-        System.out.println("code " + code);
+    public List<CrowdTestProject> getProjectList(Pageable pageable, String code, String keyword) {
         Specifications<CrowdTestProjectPO> where = Specifications.where(getCode(code, keyword));
-        return crowdTestProjectDao.findAll(where, pageable).map(crowdTestProjectPO -> Converter.convert(CrowdTestProject.class, crowdTestProjectPO));
+        //添加排序
+        Sort sort = new Sort(Sort.Direction.ASC,"status");
+        return crowdTestProjectDao.findAll(where, sort).stream().map(crowdTestProjectPO -> Converter.convert(CrowdTestProject.class, crowdTestProjectPO)).collect(Collectors.toList());
     }
 
     private Specification<CrowdTestProjectPO> getCode(String code, String keyword) {
         return new Specification<CrowdTestProjectPO>() {
+//            @Override
+//            public Predicate toPredicate(Root<CrowdTestProjectPO> a, CriteriaQuery<?> q, CriteriaBuilder cb) {
+//                Predicate predicate = cb.conjunction();
+//                if (code != null) {
+//                    predicate.getExpressions().add(cb.equal(a.get("applicationType"), code));
+//                }
+//                if (keyword != null && keyword != "") {
+//                    predicate.getExpressions().add(
+//                            cb.like(a.<String>get("name"), "%" + StringUtils.trim(keyword) + "%")
+//                    );
+//                }
+////                q.orderBy(cb.desc(a.get("status").as(Integer.class)));
+//                return predicate;
+//            }
+
             @Override
-            public Predicate toPredicate(Root<CrowdTestProjectPO> a, CriteriaQuery<?> q, CriteriaBuilder cb) {
-                Predicate predicate = cb.conjunction();
+            public Predicate toPredicate(Root<CrowdTestProjectPO> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
+                //用于暂时存放查询条件的集合
+                List<Predicate> predicatesList = new ArrayList<>();
                 if (code != null) {
-                    predicate.getExpressions().add(cb.equal(a.get("applicationType"), code));
+                    Predicate codePredicate = cb.equal(root.get("applicationType"), code);
+                    predicatesList.add(codePredicate);
                 }
                 if (keyword != null && keyword != "") {
-                    predicate.getExpressions().add(
-                            cb.like(a.<String>get("name"), "%" + StringUtils.trim(keyword) + "%")
-                    );
+                    Predicate namePredicate = cb.like(root.get("name"), '%'+StringUtils.trim(keyword)+'%');
+                    predicatesList.add(namePredicate);
                 }
-//                q.orderBy(cb.desc(a.get("status").as(Integer.class)));
-                return predicate;
+                //最终将查询条件拼好然后return
+                Predicate[] predicates = new Predicate[predicatesList.size()];
+                return cb.and(predicatesList.toArray(predicates));
             }
         };
     }

+ 95 - 1
core/src/main/java/com/mooctest/crowd/domain/repository/CrowdTestProjectRepo.java

@@ -50,6 +50,12 @@ public class CrowdTestProjectRepo implements ICrowdTestProjectRepo {
     @Autowired
     private ApplicationTypeDao applicationTypeDao;
 
+    @Autowired
+    private EndPointDao endPointDao;
+
+    @Autowired
+    private CommonRepo commonRepo;
+
     @Override
     public Page<CrowdTestProjectPO> findAll(Specification specification, Pageable pageable) {
         return crowdTestProjectDao.findAll(specification, pageable);
@@ -134,7 +140,6 @@ public class CrowdTestProjectRepo implements ICrowdTestProjectRepo {
     public void saveCrowdTestProject(CrowdTestProject crowdTestProject) {
         CrowdTestProjectPO crowdTestProjectPO = Converter.convert(CrowdTestProjectPO.class, crowdTestProject);
         crowdTestProjectDao.save(crowdTestProjectPO);
-
         List<CrowdTestTask> crowdTestTaskList = crowdTestProject.getCrowdTestTaskList();
         if (crowdTestTaskList != null) {
             for (CrowdTestTask crowdTestTask : crowdTestTaskList) {
@@ -153,6 +158,41 @@ public class CrowdTestProjectRepo implements ICrowdTestProjectRepo {
 //                Set<Long> collect = taskToUserPOS.stream().map(TaskToUserPO::getUserId).collect(Collectors.toSet());
 //                crowdTestTaskPO.setParticipantHasReportCount(collect.size());
                 crowdTestTaskDao.save(crowdTestTaskPO);
+
+                // 判断是否存在配置项
+                if(commonRepo.getTestTypeByAppCode(crowdTestTask.getType()).getType() == 1){
+                    // 保存配置项信息
+                    if(crowdTestTask.getEndPoint() != null){
+                        Optional<EndPointPO> endPointPO = endPointDao.findByTaskCode(crowdTestTask.getCode());
+                        EndPoint endPoint = crowdTestTask.getEndPoint();
+                        if(endPointPO.isPresent()){
+                            EndPointPO addEndPointPO = Converter.convert(EndPointPO.class, endPoint);
+                            addEndPointPO.setId(endPointPO.get().getId());
+                            addEndPointPO.setProjectCode(crowdTestProject.getCode());
+                            addEndPointPO.setTaskCode(crowdTestTask.getCode());
+                            endPointDao.save(addEndPointPO);
+                        }else{
+                            EndPointPO addEndPointPO = new EndPointPO();
+                            if(endPoint.getExamId() != null){
+                                addEndPointPO.setExamId(endPoint.getExamId());
+                            }
+                            if(endPoint.getCaseId() != null){
+                                addEndPointPO.setCaseId(endPoint.getCaseId());
+                            }
+                            addEndPointPO.setProjectCode(crowdTestProject.getCode());
+                            addEndPointPO.setTaskCode(crowdTestTask.getCode());
+                            addEndPointPO.setServerCode(endPoint.getServerCode());
+                            addEndPointPO.setUrl(endPoint.getUrl());
+                            endPointDao.save(addEndPointPO);
+                        }
+                    }
+                }else{
+                    Optional<EndPointPO> endPointPO = endPointDao.findByTaskCode(crowdTestTask.getCode());
+                    if(endPointPO.isPresent()){
+                        endPointDao.deleteEndPoint(crowdTestTask.getCode());
+                    }
+                }
+
             }
         }
         // 保存项目报告
@@ -178,6 +218,54 @@ public class CrowdTestProjectRepo implements ICrowdTestProjectRepo {
         return crowdTestProjectList;
     }
 
+    @Override
+    public EndPoint getEndPoint(String taskCode) {
+        Optional<EndPointPO> endPointPO=endPointDao.findByTaskCode(taskCode);
+        if(endPointPO.isPresent()){
+            EndPoint endPoint = Converter.convert(EndPoint.class, endPointPO.get());
+            return endPoint;
+        }
+        return null;
+    }
+
+    @Override
+    public EndPoint addEndPoint(String taskCode, EndPoint endPoint) {
+        Optional<EndPointPO> endPointPO=endPointDao.findByTaskCode(taskCode);
+        if(!endPointPO.isPresent()){
+            EndPointPO addEndPointPO = Converter.convert(EndPointPO.class, endPoint);
+            endPointDao.save(addEndPointPO);
+        }else {
+            throw new HttpBadRequestException("任务已存在");
+        }
+        return this.getEndPoint(taskCode);
+    }
+
+    @Override
+    public void deleteEndPoint(String taskCode) {
+        Optional<EndPointPO> endPointPO=endPointDao.findByTaskCode(taskCode);
+        if(endPointPO.isPresent()){
+            endPointDao.deleteEndPoint(taskCode);
+            throw new HttpBadRequestException("任务已删除");
+        }else{
+            throw new HttpBadRequestException("任务不存在");
+        }
+    }
+
+    @Override
+    public EndPoint updateEndPoint(String taskCode, EndPoint endPoint) {
+        Optional<EndPointPO> endPointPO=endPointDao.findByTaskCode(taskCode);
+        if(endPointPO.isPresent()){
+            endPointPO.get().setProjectCode(endPoint.getProjectCode());
+            endPointPO.get().setTaskCode(endPoint.getTaskCode());
+            endPointPO.get().setCaseId(endPoint.getCaseId());
+            endPointPO.get().setExamId(endPoint.getExamId());
+            endPointDao.save(endPointPO.get());
+            return this.getEndPoint(endPoint.getTaskCode());
+        }else {
+            throw new HttpBadRequestException("任务不存在");
+        }
+    }
+
 //    @Override
 //    public void removeCrowdTestProject(String crowdTestProjectCode){
 //        CrowdTestProject crowdTestProject = getByProjectCode(crowdTestProjectCode);
@@ -261,6 +349,12 @@ public class CrowdTestProjectRepo implements ICrowdTestProjectRepo {
         List<CrowdTestTask> crowdTestTaskListResult = new ArrayList<>();
         for (CrowdTestTaskPO crowdTestTaskPO : crowdTestTaskPOList) {
             CrowdTestTask crowdTestTaskResult = Converter.convert(CrowdTestTask.class, crowdTestTaskPO);
+            // 判断否存在配置项
+            Optional<EndPointPO> endPointPO = endPointDao.findByTaskCode(crowdTestTaskResult.getCode());
+            if(endPointPO.isPresent()){
+                crowdTestTaskResult.setEndPoint(Converter.convert(EndPoint.class, endPointPO.get()));
+            }
+
             // 检索任务中的所有已接收任务的人员信息
             List<TaskToUserPO> taskToUserPOList = taskToUserDao.findByTaskCode(crowdTestTaskResult.getCode());
             List<TaskToUser> taskToUserList = taskToUserPOList.stream().map(taskToUserPO -> {

+ 9 - 0
core/src/main/java/com/mooctest/crowd/domain/repository/ICrowdTestProjectRepo.java

@@ -1,5 +1,6 @@
 package com.mooctest.crowd.domain.repository;
 import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
+import com.mooctest.crowd.domain.domainobject.EndPoint;
 import com.mooctest.crowd.domain.exception.CrowdTestProjectNotExistException;
 import com.mooctest.crowd.domain.model.CrowdTestProjectPO;
 import org.springframework.data.domain.Page;
@@ -54,4 +55,12 @@ public interface ICrowdTestProjectRepo {
 //
 //    CrowdTestProject updateCrowdTestProjectStatus(Long id, String status) throws CrowdTestProjectNotExistException;
 
+    EndPoint getEndPoint(String taskCode);
+
+    EndPoint addEndPoint(String taskCode,EndPoint endPoint);
+
+    void deleteEndPoint(String taskCode);
+
+    EndPoint updateEndPoint(String taskCode,EndPoint endPoint);
+
 }

+ 23 - 1
core/src/test/java/com/mooctest/crowd/domain/repository/CrowdTestProjectRepoTest.java

@@ -3,6 +3,7 @@ package com.mooctest.crowd.domain.repository;
 import com.mooctest.crowd.domain.dao.CrowdTestProjectDao;
 import com.mooctest.crowd.domain.dao.CrowdTestReportDao;
 import com.mooctest.crowd.domain.dao.CrowdTestTaskDao;
+import com.mooctest.crowd.domain.dao.EndPointDao;
 import com.mooctest.crowd.domain.domainobject.*;
 import com.mooctest.crowd.domain.exception.CrowdTestProjectNotExistException;
 import com.mooctest.crowd.domain.model.CrowdTestProjectPO;
@@ -39,6 +40,12 @@ public class CrowdTestProjectRepoTest {
     @Mock
     private CrowdTestReportDao crowdTestReportDao;
 
+    @Mock
+    private EndPointDao endPointDao;
+
+    @Mock
+    private CommonRepo commonRepo;
+
     private CrowdTestProjectPO crowdTestProjectPO = new CrowdTestProjectPO();
     private List<CrowdTestProjectPO> crowdTestProjectPOList = new ArrayList<>();
     private CrowdTestTaskPO crowdTestTaskPO = new CrowdTestTaskPO();
@@ -55,6 +62,8 @@ public class CrowdTestProjectRepoTest {
     private CrowdTestTask crowdTestTask = new CrowdTestTask();
     private List<CrowdTestTask> crowdTestTaskList = new ArrayList<>();
     private List<CrowdTestProject> crowdTestProjectList = new ArrayList<>();
+    private TestType testType = new TestType();
+
 
 
     @Before
@@ -99,6 +108,17 @@ public class CrowdTestProjectRepoTest {
 
         crowdTestTaskPOList.add(crowdTestTaskPO);
 
+        crowdTestTask.setCode("PROR-IOS-TASK-ONE");
+        crowdTestTask.setId(1L);
+        crowdTestTask.setCrowdTestProjectCode(crowdTestProjectPO.getCode());
+        crowdTestTask.setDistributionProvince(crowdTestProjectPO.getDistributionProvince());
+        crowdTestTask.setDistributionCity(crowdTestProjectPO.getDistributionCity());
+        crowdTestTask.setDescription("测试任务一");
+        crowdTestTask.setStatus(0);
+        crowdTestTask.setIsDeleted(0);
+
+        //
+        testType.setType(0);
 
         //测试报告
         crowdTestReportPO.setCode("PROR-IOS-TASK-ONE-REPO-ONE");
@@ -109,6 +129,7 @@ public class CrowdTestProjectRepoTest {
         crowdTestReportPO.setIsDeleted(0);
         crowdTestReportPOList.add(crowdTestReportPO);
 
+
         //项目报告
         crowdTestProjectReportPO.setCode("PROR-IOS");
         crowdTestProjectReportPO.setId(2L);
@@ -214,10 +235,11 @@ public class CrowdTestProjectRepoTest {
 
     @Test
     public void should_return_void_when_save_project(){
-
         //arrange
         when(crowdTestProjectDao.save(crowdTestProjectPO)).thenReturn(crowdTestProjectPO);
         when(crowdTestTaskDao.save(crowdTestTaskPO)).thenReturn(crowdTestTaskPO);
+        when(commonRepo.getTestTypeByAppCode(crowdTestTaskPO.getType())).thenReturn(testType);
+        when(endPointDao.findByTaskCode(crowdTestTask.getCode())).thenReturn(Optional.empty());
         when(crowdTestReportDao.save(crowdTestReportPO)).thenReturn(crowdTestReportPO);
         //action
         crowdTestProjectRepo.saveCrowdTestProject(crowdTestProject);

+ 37 - 1
site/pom.xml

@@ -61,6 +61,20 @@
 			<groupId>com.mooctest.crowd</groupId>
 			<artifactId>core</artifactId>
 			<version>1.0-SNAPSHOT</version>
+			<exclusions>
+				<exclusion>
+					<artifactId>javassist</artifactId>
+					<groupId>org.javassist</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>objenesis</artifactId>
+					<groupId>org.objenesis</groupId>
+				</exclusion>
+				<exclusion>
+					<artifactId>guava</artifactId>
+					<groupId>com.google.guava</groupId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 
 		<dependency>
@@ -99,6 +113,12 @@
 			<groupId>cn.afterturn</groupId>
 			<artifactId>easypoi-base</artifactId>
 			<version>3.0.3</version>
+			<exclusions>
+				<exclusion>
+					<artifactId>guava</artifactId>
+					<groupId>com.google.guava</groupId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<dependency>
 			<groupId>cn.afterturn</groupId>
@@ -125,6 +145,12 @@
 			<groupId>commons-validator</groupId>
 			<artifactId>commons-validator</artifactId>
 			<version>1.4.1</version>
+			<exclusions>
+				<exclusion>
+					<artifactId>commons-logging</artifactId>
+					<groupId>commons-logging</groupId>
+				</exclusion>
+			</exclusions>
 		</dependency>
 		<!-- kaptcha verification code -->
 		<dependency>
@@ -142,6 +168,17 @@
 			<groupId>org.yaml</groupId>
 			<artifactId>snakeyaml</artifactId>
 		</dependency>
+
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger2</artifactId>
+			<version>2.9.2</version>
+		</dependency>
+		<dependency>
+			<groupId>io.springfox</groupId>
+			<artifactId>springfox-swagger-ui</artifactId>
+			<version>2.9.2</version>
+		</dependency>
 	</dependencies>
 	<build>
 		<plugins>
@@ -151,5 +188,4 @@
 			</plugin>
 		</plugins>
 	</build>
-
 </project>

+ 21 - 0
site/src/main/java/com/mooctest/crowd/site/command/CrowdTestTaskCommand.java

@@ -1,11 +1,13 @@
 package com.mooctest.crowd.site.command;
 
 import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+import com.mooctest.crowd.domain.domainobject.EndPoint;
 import lombok.Data;
 import org.springframework.beans.BeanUtils;
 
 import javax.validation.constraints.NotNull;
 import java.sql.Timestamp;
+import java.util.Base64;
 import java.util.Map;
 
 /**
@@ -43,6 +45,8 @@ public class CrowdTestTaskCommand {
 
     private int participantCount;
 
+    private EndPoint endPoint;
+
     public boolean isLegal(){
         if (this.resource == 1 && this.location == null)
             return false;
@@ -68,6 +72,23 @@ public class CrowdTestTaskCommand {
         crowdTestTask.setFixedPrice(fixedPrice);
         crowdTestTask.setRequirementFile(requirementFile);
         crowdTestTask.setParticipantCount(participantCount);
+
+        if(endPoint.getServerCode() != null && endPoint.getServerCode() != ""){
+            String serverCode = endPoint.getServerCode();
+            byte[] decodedBytes = Base64.getDecoder().decode(serverCode);
+            String url = new String(decodedBytes);
+
+            if(url.contains("examId_")){
+                endPoint.setExamId(url.split("examId_")[1].split("/")[0]);
+                url = url.replaceFirst("examId_","");
+            }
+            if(url.contains("caseId_")){
+                endPoint.setCaseId(url.split("caseId_")[1].split("/")[0]);
+                url = url.replaceFirst("caseId_","");
+            }
+            endPoint.setUrl(url);
+            crowdTestTask.setEndPoint(endPoint);
+        }
         return crowdTestTask;
     }
 

+ 16 - 0
site/src/main/java/com/mooctest/crowd/site/command/EndPointCommand.java

@@ -0,0 +1,16 @@
+package com.mooctest.crowd.site.command;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class EndPointCommand {
+    private String projectCode;
+    private String taskCode;
+    private String  caseId;
+    private String  examId;
+}

+ 143 - 0
site/src/main/java/com/mooctest/crowd/site/configuration/Swagger2Configuration.java

@@ -0,0 +1,143 @@
+package com.mooctest.crowd.site.configuration;
+
+/**
+ * @author guochao
+ * @date 2020-08-11 10:09
+ */
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Conditional;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Swagger使用的配置文件
+ */
+@Conditional(SwaggerEnableCondition.class)
+@Configuration
+@EnableSwagger2
+public class Swagger2Configuration {
+//    @Bean
+//    public Docket createRestApi(){
+//        return new Docket(DocumentationType.SWAGGER_2)
+//                .apiInfo(apiInfo())
+//                .select()
+//                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
+//                .paths(PathSelectors.any())
+//                .build();
+//    }
+//
+//    //基本信息的配置,信息会在api文档上显示
+//    private ApiInfo apiInfo(){
+//        return new ApiInfoBuilder()
+//                .title("群智平台后端接口文档")
+//                .description("群智平台后端接口的文档")
+//                .termsOfServiceUrl("http://localhost:8080/api/hello")
+//                .version("1.0")
+//                .build();
+//    }
+
+//    @Bean
+//    public Docket customDocket(){
+//        ParameterBuilder ticketPar = new ParameterBuilder();
+//        List<Parameter> pars = new ArrayList<Parameter>();
+//        ticketPar.name("Cookie").description("认证cookie")
+//                .modelRef(new ModelRef("string")).parameterType("header")
+//                .required(false).build(); //header中的ticket参数非必填,传空也可以
+//        pars.add(ticketPar.build());    //根据每个方法名也知道当前方法在设置什么参数
+//
+//        return new Docket(DocumentationType.SWAGGER_2)
+//                .select()
+//                .apis(RequestHandlerSelectors.any())
+//                .build()
+//                .globalOperationParameters(pars)
+//                .apiInfo(apiInfo());
+//    }
+//
+//    //构建 api文档的详细信息函数,注意这里的注解引用的是哪个
+//    private ApiInfo apiInfo() {
+//        return new ApiInfoBuilder()
+//                //页面标题
+//                .title("demo")
+//                //创建人
+//                .contact(new Contact("demo", "", ""))
+//                //版本号
+//                .version("1.0")
+//                //描述
+//                .description("demo REST API")
+//                .build();
+//    }
+
+
+
+    /* Docket,一个代表了一组API,没有配置组名则为默认组 */
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.SWAGGER_2)
+                .groupName("task")
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.mooctest.crowd.site.controller"))
+                .paths(PathSelectors.any())
+                .build()
+                /* 设置安全模式,swagger可以设置访问token */
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts());
+    }
+
+    /* API信息 */
+    private ApiInfo apiInfo() {
+
+        /* 联系人 */
+        Contact contact = new Contact("ChaoGuo","https://github.com/crayon-shin-chan","1021172957@qq.com");
+        return new ApiInfoBuilder()
+                /* API标题 */
+                .title("群智平台API文档")
+                /* API描述 */
+                .description("简单优雅的restful风格")
+                /* 版本 */
+                .version("1.0")
+                /* 许可 */
+                .license("Apache License")
+                .contact(contact)
+                .build();
+    }
+
+    /* 安全模式,这里指定token通过Authorization头请求头传递 */
+    private List<ApiKey> securitySchemes() {
+        List<ApiKey> apiKeyList= new ArrayList<>();
+        apiKeyList.add(new ApiKey("Cookie", "apiKey", "header"));
+        return apiKeyList;
+    }
+
+    /* 安全上下文 */
+    private List<SecurityContext> securityContexts() {
+        List<SecurityContext> securityContexts=new ArrayList<>();
+        securityContexts.add(
+                SecurityContext.builder()
+                        .securityReferences(defaultAuth())
+                        .forPaths(PathSelectors.any())
+                        .build());
+        return securityContexts;
+    }
+
+    /* 默认的安全引用 */
+    List<SecurityReference> defaultAuth() {
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        List<SecurityReference> securityReferences= new ArrayList<>();
+        securityReferences.add(new SecurityReference("Cookie", authorizationScopes));
+        return securityReferences;
+    }
+}

+ 18 - 0
site/src/main/java/com/mooctest/crowd/site/configuration/SwaggerEnableCondition.java

@@ -0,0 +1,18 @@
+package com.mooctest.crowd.site.configuration;
+
+import org.springframework.context.annotation.Condition;
+import org.springframework.context.annotation.ConditionContext;
+import org.springframework.core.type.AnnotatedTypeMetadata;
+
+
+/**
+ * @author guochao
+ * @date 2020-08-19 21:44
+ */
+public class SwaggerEnableCondition implements Condition {
+    @Override
+    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
+        String active = context.getEnvironment().getProperty("spring.profiles.active");
+        return "dev-localhost".equals(active) || "pre".equals(active);
+    }
+}

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/controller/AgencyController.java

@@ -16,6 +16,7 @@ import com.mooctest.crowd.site.data.vo.SearchConditionVO;
 import com.mooctest.crowd.site.service.AgencyService;
 import com.mooctest.crowd.site.service.ResidentAgencyService;
 import com.mooctest.crowd.site.util.DataUtils;
+import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -32,6 +33,7 @@ import java.util.List;
  */
 @RestController
 @RequestMapping("/api")
+@Api(tags = "机构相关接口", description = "提供企业认证、查看企业信息相关的 Rest API")
 public class AgencyController extends BaseSearchController {
 
     @Autowired

File diff suppressed because it is too large
+ 0 - 0
site/src/main/java/com/mooctest/crowd/site/controller/CommonController.java


+ 2 - 3
site/src/main/java/com/mooctest/crowd/site/controller/CrowTestSquareController.java

@@ -7,11 +7,11 @@ import com.mooctest.crowd.site.data.vo.CrowdProjectVO;
 import com.mooctest.crowd.site.data.vo.CrowdTaskVO;
 import com.mooctest.crowd.site.data.vo.CrowdTestProjectVO;
 import com.mooctest.crowd.site.data.vo.SearchConditionVO;
-import com.mooctest.crowd.site.service.CommonService;
 import com.mooctest.crowd.site.service.CrowdProjectService;
 import com.mooctest.crowd.site.service.CrowdTaskService;
 import com.mooctest.crowd.site.service.CrowdTestSquareService;
 import com.mooctest.crowd.site.util.DataUtils;
+import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
@@ -28,6 +28,7 @@ import java.util.List;
 
 @RestController
 @RequestMapping("/api/square")
+@Api(tags = "众测广场相关接口", description = "提供众测广场相关的 Rest API")
 public class CrowTestSquareController extends BaseSearchController {
 
     @Autowired
@@ -35,8 +36,6 @@ public class CrowTestSquareController extends BaseSearchController {
     @Autowired
     private CrowdTaskService crowdTaskService;
     @Autowired
-    private CommonService commonService;
-    @Autowired
     private CrowdTestSquareService crowdTestSquareService;
 
 

+ 10 - 1
site/src/main/java/com/mooctest/crowd/site/controller/CrowdProjectController.java

@@ -10,6 +10,8 @@ import com.mooctest.crowd.site.data.dto.ProjectDetailsDTO;
 import com.mooctest.crowd.site.data.vo.RegionalManagerVO;
 import com.mooctest.crowd.site.service.CrowdProjectService;
 import com.mooctest.crowd.site.util.FileUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
@@ -28,6 +30,7 @@ import java.util.List;
  */
 @Slf4j
 @RestController
+@Api(tags = "项目相关接口", description = "提供项目相关的 Rest API")
 public class CrowdProjectController{
 
     @Autowired
@@ -40,8 +43,14 @@ public class CrowdProjectController{
      * @return
      */
     @RequestMapping(value = "/api/project/", method = RequestMethod.POST)
+    @ApiOperation(value = "创建项目接口", notes = "创建项目")
     public ProjectDetailsDTO createProject(@Validated @RequestBody CrowdTestProjectCommand crowdTestProjectCommand, BindingResult result,HttpSession session){
-        long  userId=Long.parseLong((String) session.getAttribute("userId"));
+        long userId;
+        try{
+            userId = Long.parseLong((String) session.getAttribute("userId"));
+        }catch (Exception e){
+            throw new BaseException("未登录,请先登录");
+        }
 
         if (result.hasErrors()) {
             throw new BaseException(result.getFieldErrors().toString());

+ 16 - 4
site/src/main/java/com/mooctest/crowd/site/controller/CrowdReportController.java

@@ -4,6 +4,7 @@ import com.mooctest.crowd.domain.exception.BaseException;
 import com.mooctest.crowd.site.command.CrowdTestReportCommand;
 import com.mooctest.crowd.site.data.dto.ReportDetailsDTO;
 import com.mooctest.crowd.site.service.CrowdReportService;
+import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
@@ -20,6 +21,7 @@ import javax.servlet.http.HttpSession;
 @Slf4j
 @RestController
 @RequestMapping("/api")
+@Api(tags = "报告相关接口", description = "提供报告相关的 Rest API")
 public class CrowdReportController {
 
     @Autowired
@@ -30,7 +32,7 @@ public class CrowdReportController {
                                           @PathVariable("taskCode") String taskCode,
                                           @PathVariable("reportCode") String reportCode,
                                           HttpSession session){
-        long userId = Long.parseLong((String) session.getAttribute("userId"));
+        long userId = getUserFromSession(session);
         return reportService.getTaskReport(projectCode, taskCode, reportCode, userId);
     }
 
@@ -42,7 +44,8 @@ public class CrowdReportController {
         log.info("projectCode: " + projectCode + ", taskCode: "+taskCode);
         if (result.hasErrors())
             throw new BaseException(result.getFieldError().getDefaultMessage());
-        return reportService.createTaskReport(projectCode, taskCode, command, Long.parseLong((String) session.getAttribute("userId")));
+        long userId = getUserFromSession(session);
+        return reportService.createTaskReport(projectCode, taskCode, command, userId);
     }
 
     @RequestMapping(value = "/project/{projectCode}/task/{taskCode}/report/{reportCode}", method = RequestMethod.PUT)
@@ -54,7 +57,8 @@ public class CrowdReportController {
         log.info("projectCode: " + projectCode + ", taskCode: "+taskCode);
         if (result.hasErrors())
             throw new BaseException(result.getFieldError().getDefaultMessage());
-        return reportService.updateTaskReport(projectCode, taskCode, reportCode, command, Long.parseLong((String) session.getAttribute("userId")));
+        long userId = getUserFromSession(session);
+        return reportService.updateTaskReport(projectCode, taskCode, reportCode, command, userId);
     }
 
     @RequestMapping(value = "/project/{projectCode}/task/{taskCode}/report/{reportCode}", method = RequestMethod.DELETE)
@@ -98,5 +102,13 @@ public class CrowdReportController {
         return reportService.updatePorjctReport(projectCode, reportCode, command);
     }
 
-
+    public long getUserFromSession(HttpSession session) {
+        long userId;
+        try {
+            userId = Long.parseLong((String) session.getAttribute("userId"));
+        } catch (Exception e) {
+            throw new BaseException("未登录,请先登录");
+        }
+        return userId;
+    }
 }

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/controller/CrowdTaskController.java

@@ -7,6 +7,7 @@ import com.mooctest.crowd.site.command.CrowdTestTaskCommand;
 import com.mooctest.crowd.site.data.dto.TaskDetailsDTO;
 import com.mooctest.crowd.site.data.dto.TaskSquareDTO;
 import com.mooctest.crowd.site.service.CrowdTaskService;
+import io.swagger.annotations.Api;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
@@ -23,6 +24,7 @@ import javax.servlet.http.HttpSession;
 @Slf4j
 @RestController
 @RequestMapping("/api")
+@Api(tags = "任务相关接口", description = "提供任务相关的 Rest API")
 public class CrowdTaskController{
 
     @Autowired

+ 1 - 1
site/src/main/java/com/mooctest/crowd/site/controller/EnumsController.java

@@ -1 +1 @@
-
package com.mooctest.crowd.site.controller;

import com.mooctest.crowd.site.data.vo.ApplicationTypeVO;
import com.mooctest.crowd.site.data.vo.FieldVO;
import com.mooctest.crowd.site.data.vo.TestTypeVO;
import com.mooctest.crowd.site.service.EnumsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @Author: guochao
 * @Date: 2020.7.9 22:33
 */
@RestController
@RequestMapping("/api")
public class EnumsController {

    @Autowired
    private EnumsService enumsService;

    /**
     * 获取所有领域类型
     * @return
     */
    @RequestMapping(value = "/list/filed", method = RequestMethod.GET)
    public List<FieldVO> getAllField(HttpServletRequest request) {
        return enumsService.getAllField();
    }

    /**
     * 获取所有应用类型
     * @return
     */
    @RequestMapping(value = "/list/application", method = RequestMethod.GET)
    public List<ApplicationTypeVO> getAllApplicationType(HttpServletRequest request) {
        return enumsService.getAllApplicationType();
    }

    /**
     * 获取所有服务类型
     * @return
     */
    @RequestMapping(value = "/list/type", method = RequestMethod.GET)
    public List<TestTypeVO> getAllType(HttpServletRequest request) {
        return enumsService.getAllType();
    }
}
+
package com.mooctest.crowd.site.controller;

import com.mooctest.crowd.site.data.vo.ApplicationTypeVO;
import com.mooctest.crowd.site.data.vo.FieldVO;
import com.mooctest.crowd.site.data.vo.TestTypeVO;
import com.mooctest.crowd.site.service.EnumsService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @Author: guochao
 * @Date: 2020.7.9 22:33
 */
@RestController
@RequestMapping("/api")
@Api(tags = "枚举类型相关接口", description = "提供领域类型、应用类型、测试类型的 Rest API")
public class EnumsController {

    @Autowired
    private EnumsService enumsService;

    /**
     * 获取所有领域类型
     * @return
     */
    @RequestMapping(value = "/list/filed", method = RequestMethod.GET)
    public List<FieldVO> getAllField(HttpServletRequest request) {
        return enumsService.getAllField();
    }

    /**
     * 获取所有应用类型
     * @return
     */
    @RequestMapping(value = "/list/application", method = RequestMethod.GET)
    public List<ApplicationTypeVO> getAllApplicationType(HttpServletRequest request) {
        return enumsService.getAllApplicationType();
    }

    /**
     * 获取所有测试类型
     * @return
     */
    @RequestMapping(value = "/list/type", method = RequestMethod.GET)
    public List<TestTypeVO> getAllType(HttpServletRequest request) {
        return enumsService.getAllType();
    }
}

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/controller/PersonalDataController.java

@@ -7,12 +7,14 @@ import com.mooctest.crowd.site.data.vo.BankCardVO;
 import com.mooctest.crowd.site.data.vo.QualificationVO;
 import com.mooctest.crowd.site.data.vo.UserVO;
 import com.mooctest.crowd.site.service.PersonalDataService;
+import io.swagger.annotations.Api;
 import org.codehaus.jettison.json.JSONException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 @RestController
 @RequestMapping("/api/personal")
+@Api(tags = "个人资料相关接口", description = "提供个人信息、我的资质、我的银行卡相关的 Rest API")
 public class PersonalDataController {
 
     @Autowired

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/controller/TechnicalArticlesController.java

@@ -6,6 +6,7 @@ import com.mooctest.crowd.site.data.response.ResponseVO;
 import com.mooctest.crowd.site.data.response.ServerCode;
 import com.mooctest.crowd.site.data.vo.SearchConditionVO;
 import com.mooctest.crowd.site.service.TechnicalArticlesService;
+import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -23,6 +24,7 @@ import java.util.Map;
  */
 @RestController
 @RequestMapping("/api/technical")
+@Api(tags = "众测技术相关接口", description = "提供众测技术相关的 Rest API")
 public class TechnicalArticlesController extends BaseSearchController{
 
     @Autowired

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/controller/UploadController.java

@@ -1,6 +1,7 @@
 package com.mooctest.crowd.site.controller;
 
 import com.mooctest.crowd.site.service.UploadService;
+import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -15,6 +16,7 @@ import org.springframework.web.multipart.MultipartFile;
  */
 @RestController
 @RequestMapping("/api/files")
+@Api(tags = "上传相关接口", description = "提供上传相关的 Rest API")
 public class UploadController {
 
     @Autowired

+ 7 - 0
site/src/main/java/com/mooctest/crowd/site/controller/UserController.java

@@ -17,6 +17,7 @@ import com.mooctest.crowd.site.service.EnterpriseAuthService;
 import com.mooctest.crowd.site.service.PersonalAuthService;
 import com.mooctest.crowd.site.service.UserService;
 import com.mooctest.crowd.site.util.DataUtils;
+import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
@@ -33,6 +34,7 @@ import java.util.List;
  * @Email: 171256175@qq.com
  * @date 2019-07-24 23:50
  */
+@Api(tags = "用户相关接口", description = "提供用户相关、个人认证的 Rest API")
 @RestController
 @RequestMapping("/api")
 public class UserController extends BaseController{
@@ -45,6 +47,11 @@ public class UserController extends BaseController{
     @Autowired
     private UserService userService;
 
+    @RequestMapping(value = "/hello", method = RequestMethod.GET)
+    public String hello() {
+        return "hello";
+    }
+
     @RequestMapping(value = "/user", method = RequestMethod.POST)
     public UserDTO register(@Validated RegisterCommand registerCommand, BindingResult result) {
         if (result.hasErrors())

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/data/TaskOperationControl.java

@@ -19,6 +19,7 @@ public class TaskOperationControl {
     private boolean uploadReport = false;
     private boolean finish = false;
     private boolean confirmFinish = false;
+    private boolean writeReport = false;
 
     public void hasAll(){
         this.receive = true;
@@ -36,5 +37,6 @@ public class TaskOperationControl {
         this.update = false;
         this.finish = false;
         this.uploadReport = false;
+        this.writeReport = false;
     }
 }

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/data/vo/CrowdTaskVO.java

@@ -48,6 +48,8 @@ public class CrowdTaskVO implements Serializable{
     private Timestamp createTime;
     private List<TaskToUserVO> taskToUserVOS = new ArrayList<>();
     private String time_interval;
+    private EndPointVO endPointVO;
+    private String writeReportUrl;
 
     public CrowdTaskVO(CrowdTestTask task){
         id = task.getCode();

+ 20 - 0
site/src/main/java/com/mooctest/crowd/site/data/vo/EndPointVO.java

@@ -0,0 +1,20 @@
+package com.mooctest.crowd.site.data.vo;
+
+import com.mooctest.crowd.domain.domainobject.EndPoint;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * @program: crowd
+ * @description: ${description}
+ * @author: hanyuwei
+ * @create: 2020-07-28 17:23
+ **/
+@Data
+public class EndPointVO {
+    private String serverCode;
+
+    public EndPointVO(EndPoint endPoint){
+        BeanUtils.copyProperties(endPoint, this);
+    }
+}

+ 4 - 0
site/src/main/java/com/mooctest/crowd/site/data/vo/TestTypeVO.java

@@ -18,10 +18,14 @@ public class TestTypeVO implements Serializable {
     private String code;
     private String name;
     private String introduction;
+    private int type; //0-无跳转 1-有跳转
+    private String url;
 
     public TestTypeVO(TestType testType){
         code = testType.getCode();
         name = testType.getName();
         introduction = testType.getIntroduction();
+        type = testType.getType();
+        url = testType.getUrl();
     }
 }

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/mediator/ViewMediator.java

@@ -128,4 +128,6 @@ public interface ViewMediator {
     List<UserTaskCountVO> getCount();
 
     void  jumpPublicTesting(String projectCode, String taskCode, Long userId);
+
+
 }

+ 81 - 34
site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java

@@ -126,6 +126,9 @@ public class WebMediatorImpl implements ViewMediator {
     @Autowired
     private ThemeStatusTaskService themeStatusTaskService;
 
+    @Autowired
+    private EndPointDao endPointDao;
+
     @Override
     public List<CrowdTestProjectVO> crowdTestProjects() {
         List<CrowdTestProjectVO> authingList = new ArrayList<>();
@@ -563,7 +566,7 @@ public class WebMediatorImpl implements ViewMediator {
         //我的众测 - 项目相关信息
         //获取我创建的项目列表
         List<CrowdProjectVO> myProejcts = projectDao.findByUserIdAndIsDeleted(userId, DeletedStatus.isNotDeleted)
-                .stream().sorted(Comparator.comparing(CrowdTestProjectPO::getCreateTime).thenComparing(CrowdTestProjectPO::getStatus).reversed()).map(crowdTestProjectPO -> {
+                .stream().map(crowdTestProjectPO -> {
                     CrowdTestProject project = new CrowdTestProject();
                     BeanUtils.copyProperties(crowdTestProjectPO, project);
                     CrowdProjectVO projectVO = new CrowdProjectVO(project);
@@ -572,25 +575,25 @@ public class WebMediatorImpl implements ViewMediator {
                         projectVO.setNeedHandle(true);
                     // 应用类型值的转换
                     projectVO = changeApplicationType(projectVO);
+                    // 判断项目是否截止
+                    if (projectVO.getDatetime().getTime() <= System.currentTimeMillis() && project.getStatus() < CrowdTestProjectStatus.HAS_FINISHED) {
+                        project.setStatus(CrowdTestProjectStatus.HAS_TIME_OUT);
+                    }
                     return projectVO;
-                }).collect(Collectors.toList());
+                }).collect(Collectors.toList()).stream().sorted(Comparator.comparing(CrowdProjectVO::getCreateTime).thenComparing(CrowdProjectVO::getStatus).reversed()).collect(Collectors.toList());
         myCrowdDTO.setMyProjects(myProejcts);
-//        List<CrowdProjectVO> myProject=new ArrayList<>();
-//        List<CrowdProjectVO> finishedProjects=new ArrayList<>();
-//        for(int i=0;i<myProejcts.size();i++){
-//            if(myProejcts.get(i).getStatus()<CrowdTestProjectStatus.HAS_FINISHED){
-//                myProject.add(myProejcts.get(i));
-//                myCrowdDTO.setMyProjects(myProject);
-//            }else if(myProejcts.get(i).getStatus()>=CrowdTestProjectStatus.HAS_FINISHED){
-//                finishedProjects.add(myProejcts.get(i));
-//                myCrowdDTO.setFinishedProjects(finishedProjects);
-//            }
-//        }
 
         //对于区域管理员crowdTestProjectPO -> crowdTestProjectPO.getStatus() > CrowdTestProjectStatus.HAS_RELEASED
         if (user.getRoleList().stream().anyMatch(role -> role.getName().equals("RegionalManager"))) {
             List<CrowdTestProjectPO> crowdTestProjectPOList = projectDao.findByRegionalManagerIdAndIsDeleted(userId, DeletedStatus.isNotDeleted)
-                    .stream().sorted(Comparator.comparing(CrowdTestProjectPO::getCreateTime).thenComparing(CrowdTestProjectPO::getStatus).reversed()).collect(Collectors.toList());
+                    .stream().map(crowdTestProjectPO -> {
+                        // 判断项目是否截止
+                        if (crowdTestProjectPO.getDeadTime().getTime() <= System.currentTimeMillis() && crowdTestProjectPO.getStatus() < CrowdTestProjectStatus.HAS_FINISHED) {
+                            crowdTestProjectPO.setStatus(CrowdTestProjectStatus.HAS_TIME_OUT);
+                        }
+                        return crowdTestProjectPO;
+                    }).collect(Collectors.toList())
+                    .stream().sorted(Comparator.comparing(CrowdTestProjectPO::getStatus).reversed().thenComparing(CrowdTestProjectPO::getCreateTime).reversed()).collect(Collectors.toList());
             //获取区域管理员正在处理中的项目列表
             myCrowdDTO.setHandlingProjects(crowdTestProjectPOList.stream().filter(crowdTestProjectPO -> crowdTestProjectPO.getStatus() > CrowdTestProjectStatus.HAS_RELEASED).map(crowdTestProjectPO -> {
                 CrowdTestProject project = new CrowdTestProject();
@@ -646,6 +649,10 @@ public class WebMediatorImpl implements ViewMediator {
                                 // 测试类型的转换
                                 String typeName = commonRepo.getTypeNameByCode(task.getType());
                                 task.setType(typeName);
+                                // 判断任务是否截止
+                                if (task.getDeadTime().getTime() <= System.currentTimeMillis() && task.getStatus() < CrowdTestTaskStatus.HAS_FINISHED) {
+                                    task.setStatus(CrowdTestTaskStatus.HAS_TIME_OUT);
+                                }
                                 return task;
                             }
                             return null;
@@ -894,8 +901,8 @@ public class WebMediatorImpl implements ViewMediator {
 
         CrowdTaskVO taskVO = new CrowdTaskVO(task.get());
         // 测试类型的转换
-        String typeName = commonRepo.getTypeNameByCode(taskVO.getServiceType());
-        taskVO.setServiceType(typeName);
+//        String typeName = commonRepo.getTypeNameByCode(taskVO.getServiceType());
+//        taskVO.setServiceType(typeName);
 
         System.out.println("renderTaskDetails userId:" + userId);
         if (userId == null) {
@@ -906,6 +913,12 @@ public class WebMediatorImpl implements ViewMediator {
             // 区域管理员视图
             List<TaskToUserVO> taskToUserVOS = new ArrayList<>();
             if (userId.equals(project.getRegionalManagerId())) {
+                // 判断否存在配置项
+                Optional<EndPointPO> endPointPO = endPointDao.findByTaskCode(taskVO.getCode());
+                if(endPointPO.isPresent()){
+                    taskVO.setEndPointVO(new EndPointVO(Converter.convert(EndPoint.class, endPointPO.get())));
+                }
+
                 taskToUserVOS = task.get().getAcceptedUserList().stream().map(taskToUser -> {
                     TaskToUserVO taskToUserVO = new TaskToUserVO(taskToUser);
                     taskToUserVO.setUserVO(Converter.convert(UserVO.class, taskToUser.getUser()));
@@ -944,11 +957,20 @@ public class WebMediatorImpl implements ViewMediator {
                         }).collect(Collectors.toList());
             }
             taskDetailsDTO.setAcceptedUserList(taskToUserVOS);
+
+            Optional<EndPointPO> endPointPOOptional = endPointDao.findByTaskCode(task.get().getCode());
+            // 判断是否具有配置项,提供跳转url
+            if(endPointPOOptional.isPresent()){
+                // 获取测试类型对应的跳转url
+                String reportUrl = endPointPOOptional.get().getUrl().replace("userId", String.valueOf(userId));
+                taskVO.setWriteReportUrl(reportUrl);
+            }
         }
 
         if (saveFlag) {
             projectRepo.saveCrowdTestProject(project);
         }
+
         taskDetailsDTO.setCrowdTaskVO(taskVO);
 //        EvaluationAgencyPO agencyPO = agencyDao.findByUserId(task.get().getEvaluationAgencyId());
 //        taskVO.setInstitution(agencyPO==null?"该机构已注销":agencyPO.getEvaluationAgencyName());
@@ -1056,8 +1078,12 @@ public class WebMediatorImpl implements ViewMediator {
         authingList.addAll(projectDao.findByNameLikeAndIsDeleted("%" + name + "%", DeletedStatus.isNotDeleted).stream().map(crowdTestProjectPO -> {
             CrowdTestProject crowdTestProject = new CrowdTestProject();
             BeanUtils.copyProperties(crowdTestProjectPO, crowdTestProject);
-            return new CrowdTestProjectVO(crowdTestProject);
-        }).collect(Collectors.toList()));
+            // 项目测试类型转换
+            String applicationName = commonRepo.getApplicationNameByCode(crowdTestProjectPO.getApplicationType());
+            CrowdTestProjectVO crowdTestProjectVO = new CrowdTestProjectVO(crowdTestProject);
+            crowdTestProjectVO.setApplicationType(applicationName);
+            return crowdTestProjectVO;
+        }).collect(Collectors.toList()).stream().sorted(Comparator.comparing(CrowdTestProjectVO::getCreateTime).reversed()).collect(Collectors.toList()));
         return authingList;
     }
 
@@ -1071,7 +1097,7 @@ public class WebMediatorImpl implements ViewMediator {
             BeanUtils.copyProperties(crowdTestTaskPO, crowdTestTask);
             crowdTestTask.setType(serviceType.get().getName());
             return new CrowdTaskVO(crowdTestTask);
-        }).collect(Collectors.toList()));
+        }).collect(Collectors.toList()).stream().sorted(Comparator.comparing(CrowdTaskVO::getCreateTime).reversed()).collect(Collectors.toList()));
         return authingList;
     }
 
@@ -1080,12 +1106,13 @@ public class WebMediatorImpl implements ViewMediator {
         List<CrowdTestProjectVO> authingList = new ArrayList<>();
         authingList.addAll(projectDao.findAll().stream().map(crowdTestProjectPO ->{
             CrowdTestProject crowdTestProject = new CrowdTestProject();
-//            if(crowdTestProject.getDeadTime().getTime() < System.currentTimeMillis()){
-//
-//            }
             BeanUtils.copyProperties(crowdTestProjectPO, crowdTestProject);
             themeStatusService.updateStatus(crowdTestProject);
-            return new CrowdTestProjectVO(crowdTestProject);
+            // 项目测试类型转换
+            String applicationName = commonRepo.getApplicationNameByCode(crowdTestProjectPO.getApplicationType());
+            CrowdTestProjectVO crowdTestProjectVO = new CrowdTestProjectVO(crowdTestProject);
+            crowdTestProjectVO.setApplicationType(applicationName);
+            return crowdTestProjectVO;
         }).collect(Collectors.toList()));
         return authingList;
     }
@@ -1587,6 +1614,7 @@ public class WebMediatorImpl implements ViewMediator {
     }
 
     private TaskOperationControl initTaskPermission(CrowdTestProject project, CrowdTestTask task, User user) {
+        Optional<EndPointPO> endPointPOOptional = endPointDao.findByTaskCode(task.getCode());
         TaskOperationControl taskOperationControl = new TaskOperationControl();
 
         if (user == null || task.getStatus() == CrowdTestTaskStatus.HAS_FINISHED || task.getStatus() == CrowdTestTaskStatus.HAS_TIME_OUT) {
@@ -1596,16 +1624,30 @@ public class WebMediatorImpl implements ViewMediator {
         //区域管理员或系统管理员视角
         if (user.getRoleList().stream().anyMatch(role -> role.getName().equals("SystemAdministrator"))
                 || (user.getRegionalManager() != null && user.getId().equals(project.getRegionalManagerId()))) {
-            if ((task.getParticipantHasCommittedCount() == task.getAcceptedCount() && task.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED) || (task.getParticipantHasCommittedCount() == task.getParticipantCount() && task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED)) {
-                taskOperationControl.setConfirmFinish(true);
-            }
             if (task.getStatus() < CrowdTestTaskStatus.HAS_RECEIVED) {
                 taskOperationControl.setUpdate(true);
+                // 具有配置项,需要在第三方进行填写报告
+                if(endPointPOOptional.isPresent()){
+                    taskOperationControl.setWriteReport(true);
+                }
             }
-            taskOperationControl.setFinish(false);
-            if (task.getStatus() == CrowdTestTaskStatus.HAS_FINISHED || task.getStatus() == CrowdTestTaskStatus.HAS_TIME_OUT) {
-                taskOperationControl.setConfirmFinish(false);
+            else{
+                if ((task.getParticipantHasCommittedCount() == task.getAcceptedCount() && task.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED) || (task.getParticipantHasCommittedCount() == task.getParticipantCount() && task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED)) {
+                    taskOperationControl.setConfirmFinish(true);
+                }
+
+                taskOperationControl.setFinish(false);
+                if (task.getStatus() == CrowdTestTaskStatus.HAS_FINISHED || task.getStatus() == CrowdTestTaskStatus.HAS_TIME_OUT) {
+                    taskOperationControl.setConfirmFinish(false);
+                }
+                // 具有配置项,需要在第三方进行填写报告
+                if(endPointPOOptional.isPresent()){
+                    taskOperationControl.setWriteReport(true);
+                    taskOperationControl.setUploadReport(true);
+                    taskOperationControl.setConfirmFinish(true);
+                }
             }
+
         }
         // TODO 已拒绝视图
         //评测机构和测评人员视角
@@ -1629,6 +1671,12 @@ public class WebMediatorImpl implements ViewMediator {
                             taskOperationControl.setFinish(false);
                             taskOperationControl.setUploadReport(false);
                         }
+
+                        // 具有配置项,需要在第三方进行填写报告
+                        if(endPointPOOptional.isPresent()){
+                            taskOperationControl.noAll();
+                            taskOperationControl.setWriteReport(true);
+                        }
                     } else if (task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED) {
                         taskOperationControl.setUploadReport(false);
                     }
@@ -1647,14 +1695,13 @@ public class WebMediatorImpl implements ViewMediator {
                     }
 
                 }
-
             } else if (task.getDistributionType() == 2) {
                 if (task.getStatus() == CrowdTestTaskStatus.HAS_RELEASED) {
                     taskOperationControl.setReceive(true);
-                    // 项目发起者
-                    if (project.getUserId().equals(user.getId())) {
-                        taskOperationControl.setReceive(false);
-                    }
+//                    // 项目发起者
+//                    if (project.getUserId().equals(user.getId())) {
+//                        taskOperationControl.setReceive(false);
+//                    }
                 }
             }
         }

+ 1 - 1
site/src/main/java/com/mooctest/crowd/site/service/CommonService.java

@@ -34,7 +34,7 @@ public interface CommonService {
 
     Page<CompetitionVO> getCompetition(Pageable pageable,String keyword);
 
-    Page<CrowdProjectVO> getProjectList(Pageable pageable,String code,String keyword);
+    List<CrowdProjectVO> getProjectList(Pageable pageable,String code,String keyword);
 
     List<ResourceVO>  getResource();
 

+ 16 - 0
site/src/main/java/com/mooctest/crowd/site/service/EndPointService.java

@@ -0,0 +1,16 @@
+package com.mooctest.crowd.site.service;
+
+
+import com.mooctest.crowd.site.command.EndPointCommand;
+import com.mooctest.crowd.site.data.vo.EndPointVO;
+
+
+public interface EndPointService {
+    EndPointVO getEndPoint(String taskCode);
+
+    EndPointVO addEndPoint(String taskCode,EndPointCommand endPointCommand);
+
+    void deleteEndPoint(String taskCode);
+
+    EndPointVO updateEndPoint(String taskCode,EndPointCommand endPointCommand);
+}

+ 9 - 3
site/src/main/java/com/mooctest/crowd/site/service/impl/CommonServiceImpl.java

@@ -3,6 +3,7 @@ package com.mooctest.crowd.site.service.impl;
 import com.mooctest.crowd.domain.dao.CrowdTestProjectDao;
 import com.mooctest.crowd.domain.dao.ResourceTypeDao;
 import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
+import com.mooctest.crowd.domain.domainobject.CrowdTestProjectStatus;
 import com.mooctest.crowd.domain.domainobject.User;
 import com.mooctest.crowd.domain.exception.HaveNotAgencyAuthException;
 import com.mooctest.crowd.domain.exception.HaveNotPartAuthException;
@@ -149,13 +150,18 @@ public class CommonServiceImpl implements CommonService {
     }
 
     @Override
-    public Page<CrowdProjectVO> getProjectList(Pageable pageable, String code,String keyword) {
-        return commonRepo.getProjectList(pageable,code,keyword).map(project->{
+    public List<CrowdProjectVO> getProjectList(Pageable pageable, String code,String keyword) {
+        List<CrowdProjectVO> crowdProjectVOS = commonRepo.getProjectList(pageable, code, keyword).stream().map(project -> {
+            // 判断项目是否截止
+            if (project.getDeadTime().getTime() <= System.currentTimeMillis() && project.getStatus() < CrowdTestProjectStatus.HAS_FINISHED) {
+                project.setStatus(CrowdTestProjectStatus.HAS_TIME_OUT);
+            }
             CrowdProjectVO crowdProjectVO = new CrowdProjectVO(project);
             String applicationName = commonRepo.getApplicationNameByCode(crowdProjectVO.getPlatform());
             crowdProjectVO.setPlatform(applicationName);
             return crowdProjectVO;
-        });
+        }).collect(Collectors.toList());
+        return crowdProjectVOS;
     }
 
     @Override

+ 15 - 8
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdProjectServiceImpl.java

@@ -101,10 +101,12 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
         List<CrowdTestProjectVO> authingList = new ArrayList<>();
         authingList.addAll(projectDao.findindexProject().stream().map(crowdTestProjectPO -> {
             CrowdTestProject crowdTestProject = new CrowdTestProject();
-//            String applicationName = commonRepo.getApplicationNameByCode(crowdTestProjectPO.getApplicationType());
-//            crowdTestProjectPO.setApplicationType(applicationName);
             BeanUtils.copyProperties(crowdTestProjectPO, crowdTestProject);
-            return new CrowdTestProjectVO(crowdTestProject);
+            // 项目测试类型转换
+            String applicationName = commonRepo.getApplicationNameByCode(crowdTestProjectPO.getApplicationType());
+            CrowdTestProjectVO crowdTestProjectVO = new CrowdTestProjectVO(crowdTestProject);
+            crowdTestProjectVO.setApplicationType(applicationName);
+            return crowdTestProjectVO;
         }).collect(Collectors.toList()));
         return authingList;
     }
@@ -129,6 +131,10 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
             // 应用类型值的转换
             String applicationName = commonRepo.getApplicationNameByCode(crowdTestProject.getApplicationType());
             crowdTestProject.setApplicationType(applicationName);
+            // 判断项目是否截止
+            if (crowdTestProject.getDeadTime().getTime() <= System.currentTimeMillis() && crowdTestProject.getStatus() < CrowdTestProjectStatus.HAS_FINISHED) {
+                crowdTestProject.setStatus(CrowdTestProjectStatus.HAS_TIME_OUT);
+            }
             return new CrowdProjectVO(crowdTestProject);
         }).collect(Collectors.toList());
         if (keyword != null && keyword != "") {
@@ -384,14 +390,15 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
                 // 对用户判断认证类型 测评机构为2 测试人员为6
                 Optional<UserTaskCountPO> userTaskCountPOOptional = userTaskCountDao.findByUserId(user.getId());
                 if (!userTaskCountPOOptional.isPresent()) {
-                    Long roleType = 2L;
                     if (user.getRoleList().stream().anyMatch(role -> role.getName().equals(RoleType.EVALUATION_USER.getName()))) {
-                        roleType = RoleType.EVALUATION_USER.getId();
+                        Long roleType = RoleType.EVALUATION_USER.getId();
+                        UserTaskCount userTaskCount = new UserTaskCount(user.getId(), 1L, roleType);
+                        userTaskCountDao.save(Converter.convert(UserTaskCountPO.class, userTaskCount));
                     } else if (user.getRoleList().stream().anyMatch(role -> role.getName().equals(RoleType.AGENCY.getName()))) {
-                        roleType = RoleType.AGENCY.getId();
+                        Long roleType = RoleType.AGENCY.getId();
+                        UserTaskCount userTaskCount = new UserTaskCount(user.getId(), 1L, roleType);
+                        userTaskCountDao.save(Converter.convert(UserTaskCountPO.class, userTaskCount));
                     }
-                    UserTaskCount userTaskCount = new UserTaskCount(user.getId(), 1L, roleType);
-                    userTaskCountDao.save(Converter.convert(UserTaskCountPO.class, userTaskCount));
                 } else {
                     UserTaskCountPO userTaskCountPO = userTaskCountPOOptional.get();
                     userTaskCountPO.setCount(userTaskCountPO.getCount() + 1);

+ 10 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdReportServiceImpl.java

@@ -1,5 +1,6 @@
 package com.mooctest.crowd.site.service.impl;
 
+import com.mooctest.crowd.domain.dao.EndPointDao;
 import com.mooctest.crowd.domain.domainobject.*;
 import com.mooctest.crowd.domain.exception.BaseException;
 import com.mooctest.crowd.domain.exception.CrowdTestReportNotExistException;
@@ -30,6 +31,9 @@ public class CrowdReportServiceImpl implements CrowdReportService {
     private CrowdTestProjectRepo projectRepo;
 
     @Autowired
+    private EndPointDao endPointDao;
+
+    @Autowired
     private ViewMediator viewMediator;
 
     @Override
@@ -50,6 +54,12 @@ public class CrowdReportServiceImpl implements CrowdReportService {
         // 判断报告的可操作性
         List<TaskToUser> acceptedUserList = task.get().getAcceptedUserList();
         Optional<TaskToUser> userOptional = acceptedUserList.stream().filter(user -> user.getUserId().equals(userId)).findFirst();
+
+//        Optional<EndPointPO> endPointPOOptional = endPointDao.findByTaskCode(taskCode);
+//        //具有配置项,需要在第三方进行填写报告
+//        if(endPointPOOptional.isPresent() && userId.equals(project.getRegionalManagerId())){
+//
+//        }
         if(!userOptional.isPresent()){
             throw new BaseException("当前用户没有此任务的操作权限!");
         }

+ 26 - 3
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdTaskServiceImpl.java

@@ -1,6 +1,7 @@
 package com.mooctest.crowd.site.service.impl;
 
 import com.mooctest.crowd.domain.dao.CrowdTestTaskDao;
+import com.mooctest.crowd.domain.dao.EndPointDao;
 import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
 import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
 import com.mooctest.crowd.domain.domainobject.CrowdTestTaskStatus;
@@ -8,6 +9,7 @@ import com.mooctest.crowd.domain.domainobject.DistributeType;
 import com.mooctest.crowd.domain.exception.BaseException;
 import com.mooctest.crowd.domain.exception.CrowdTestTaskNotExistException;
 import com.mooctest.crowd.domain.exception.UnauthorizedException;
+import com.mooctest.crowd.domain.model.EndPointPO;
 import com.mooctest.crowd.domain.repository.CommonRepo;
 import com.mooctest.crowd.domain.repository.CrowdTestProjectRepo;
 import com.mooctest.crowd.domain.repository.CrowdTestTaskRepo;
@@ -39,8 +41,7 @@ import java.util.stream.Collectors;
 public class CrowdTaskServiceImpl implements CrowdTaskService {
 
     @Autowired
-    private CrowdTestTaskRepo taskRepo;
-
+    private EndPointDao endPointDao;
 
     @Autowired
     CrowdTestProjectRepo projectRepo;
@@ -72,6 +73,10 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
             BeanUtils.copyProperties(crowdTestTaskPO, task);
             String typeName = commonRepo.getTypeNameByCode(task.getType());
             task.setType(typeName);
+            // 判断任务是否截止
+            if (task.getDeadTime().getTime() <= System.currentTimeMillis() && task.getStatus() < CrowdTestTaskStatus.HAS_FINISHED) {
+                task.setStatus(CrowdTestTaskStatus.HAS_TIME_OUT);
+            }
             return new CrowdTaskVO(task);
         }).collect(Collectors.toList());
         if (keyword != null && keyword != "") {
@@ -124,7 +129,7 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
             throw new CrowdTestTaskNotExistException();
         if (task.get().getStatus() == CrowdTestTaskStatus.HAS_FINISHED)
             throw new BaseException("禁止修改已结束的任务!");
-        command.setType(commonRepo.getTypeCodeByName(command.getType()));
+//        command.setType(commonRepo.getTypeCodeByName(command.getType()));
         CrowdTestTask updateTask = command.toCrowdTask(projectCode);
         // 定向任务被拒绝,更新时需要删除任务中的taskToUser  acceptedUserList
         if (task.get().getDistributionType().equals(DistributeType.DIRECT.getId())) {
@@ -150,9 +155,27 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
     @Override
     public TaskDetailsDTO acceptTask(String projectCode, String taskCode, Long userId) {
         CrowdTestProject project = projectRepo.getByProjectCode(projectCode);
+        // 项目发起者
+        if (project.getUserId().equals(userId)) {
+            throw new BaseException("您是项目发起者,不可接收自己项目下的测试任务!");
+        }
         CrowdTestTask task = project.getTask(taskCode);
+        // 是否为第一个接包的人标识
+        boolean isFirstAcceptPeople = false;
+        if(task.getStatus() == CrowdTestTaskStatus.HAS_RELEASED){
+            isFirstAcceptPeople = true;
+        }
+
         task.receive(userRepo.getByID(userId));
         project.setJoinCount(project.getJoinCount() + 1);
+
+        // 判断是否为第三方任务,如果是则管理员自身也是一个参与者
+        Optional<EndPointPO> endPointPOOptional = endPointDao.findByTaskCode(task.getCode());
+        if(endPointPOOptional.isPresent() && isFirstAcceptPeople){
+            task.receive(userRepo.getByID(project.getRegionalManagerId()));
+            project.setJoinCount(project.getJoinCount() + 1);
+        }
+
         projectRepo.saveCrowdTestProject(project);
         return getTaskDetails(projectCode, taskCode, userId);
     }

+ 46 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/EndPointServiceImpl.java

@@ -0,0 +1,46 @@
+package com.mooctest.crowd.site.service.impl;
+
+
+import com.mooctest.crowd.domain.domainobject.EndPoint;
+import com.mooctest.crowd.domain.repository.CrowdTestProjectRepo;
+import com.mooctest.crowd.domain.util.Converter;
+import com.mooctest.crowd.site.command.EndPointCommand;
+import com.mooctest.crowd.site.data.vo.EndPointVO;
+import com.mooctest.crowd.site.service.EndPointService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class EndPointServiceImpl implements EndPointService {
+
+    @Autowired
+    private CrowdTestProjectRepo crowdTestProjectRepo;
+    @Override
+    public EndPointVO getEndPoint(String taskCode) {
+        EndPoint endPoint=crowdTestProjectRepo.getEndPoint(taskCode);
+        EndPointVO endPointVO = Converter.convert(EndPointVO.class, endPoint);
+        return endPointVO;
+    }
+
+    @Override
+    public EndPointVO addEndPoint(String taskCode, EndPointCommand endPointCommand) {
+        EndPoint endPoint = Converter.convert(EndPoint.class, endPointCommand);
+        EndPoint addEndPoint=crowdTestProjectRepo.addEndPoint(taskCode,endPoint);
+        EndPointVO endPointVO = Converter.convert(EndPointVO.class, addEndPoint);
+        return  endPointVO;
+    }
+
+    @Override
+    public void deleteEndPoint(String taskCode) {
+        crowdTestProjectRepo.deleteEndPoint(taskCode);
+    }
+
+    @Override
+    public EndPointVO updateEndPoint(String taskCode, EndPointCommand endPointCommand) {
+        EndPoint endPoint = Converter.convert(EndPoint.class, endPointCommand);
+        EndPoint updateEndPoint=crowdTestProjectRepo.updateEndPoint(taskCode,endPoint);
+        EndPointVO endPointVO = Converter.convert(EndPointVO.class, updateEndPoint);
+        return  endPointVO;
+    }
+}

Some files were not shown because too many files changed in this diff