Explorar el Código

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

Feature v2.0

See merge request crowd-2019/crowd-test-service-backend!151
郭超 hace 4 años
padre
commit
ec94125b31
Se han modificado 28 ficheros con 459 adiciones y 96 borrados
  1. 28 0
      core/src/main/java/com/mooctest/crowd/domain/dao/ToolDao.java
  2. 9 0
      core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestTask.java
  3. 2 0
      core/src/main/java/com/mooctest/crowd/domain/domainobject/EndPoint.java
  4. 20 0
      core/src/main/java/com/mooctest/crowd/domain/domainobject/Tool.java
  5. 14 0
      core/src/main/java/com/mooctest/crowd/domain/exception/CrowdTestEndPointException.java
  6. 6 0
      core/src/main/java/com/mooctest/crowd/domain/model/EndPointPO.java
  7. 39 0
      core/src/main/java/com/mooctest/crowd/domain/model/ToolPO.java
  8. 3 0
      core/src/main/java/com/mooctest/crowd/domain/repository/CrowdTestProjectRepo.java
  9. 13 1
      core/src/main/java/com/mooctest/crowd/domain/repository/CrowdTestTaskRepo.java
  10. 4 0
      core/src/main/java/com/mooctest/crowd/domain/repository/ICrowdTaskRepo.java
  11. 12 0
      core/src/main/java/com/mooctest/crowd/domain/repository/IToolRepo.java
  12. 51 0
      core/src/main/java/com/mooctest/crowd/domain/repository/ToolRepo.java
  13. 17 12
      site/src/main/java/com/mooctest/crowd/site/command/CrowdTestTaskCommand.java
  14. 12 0
      site/src/main/java/com/mooctest/crowd/site/command/TaskDataBoardCommand.java
  15. 0 0
      site/src/main/java/com/mooctest/crowd/site/controller/CommonController.java
  16. 16 0
      site/src/main/java/com/mooctest/crowd/site/controller/CrowdTaskController.java
  17. 6 1
      site/src/main/java/com/mooctest/crowd/site/controller/TechnicalArticlesController.java
  18. 4 1
      site/src/main/java/com/mooctest/crowd/site/controller/advice/ExceptionAdvice.java
  19. 3 0
      site/src/main/java/com/mooctest/crowd/site/data/TaskOperationControl.java
  20. 4 0
      site/src/main/java/com/mooctest/crowd/site/data/dto/TechnicalArticlesDTO.java
  21. 1 0
      site/src/main/java/com/mooctest/crowd/site/data/vo/EndPointVO.java
  22. 1 0
      site/src/main/java/com/mooctest/crowd/site/data/vo/SearchConditionVO.java
  23. 34 0
      site/src/main/java/com/mooctest/crowd/site/data/vo/ToolVO.java
  24. 2 0
      site/src/main/java/com/mooctest/crowd/site/mediator/ViewMediator.java
  25. 101 71
      site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java
  26. 2 0
      site/src/main/java/com/mooctest/crowd/site/service/CrowdTaskService.java
  27. 14 4
      site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdTaskServiceImpl.java
  28. 41 6
      site/src/main/java/com/mooctest/crowd/site/service/impl/TechnicalArticlesServiceImpl.java

+ 28 - 0
core/src/main/java/com/mooctest/crowd/domain/dao/ToolDao.java

@@ -0,0 +1,28 @@
+package com.mooctest.crowd.domain.dao;
+
+import com.mooctest.crowd.domain.model.ToolPO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.repository.CrudRepository;
+import org.springframework.data.repository.PagingAndSortingRepository;
+
+import javax.transaction.Transactional;
+import java.util.List;
+import java.util.Optional;
+
+@Transactional
+public interface ToolDao extends CrudRepository<ToolPO, Long>, JpaSpecificationExecutor<ToolPO>,PagingAndSortingRepository<ToolPO, Long>,JpaRepository<ToolPO, Long> {
+
+    Optional<ToolPO> findByCodeAndIsDeleted(String code, int isDeleted);
+
+    Optional<ToolPO> findByIdAndIsDeleted(Long id, int isDeleted);
+
+    List<ToolPO> findAll();
+
+    Page<ToolPO> findAll(Specification<ToolPO> spec, Pageable pageable);
+
+    List<ToolPO> findByNameLikeAndIsDeleted(String name, int isDeleted);
+}

+ 9 - 0
core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestTask.java

@@ -199,6 +199,15 @@ public class CrowdTestTask {
 
     }
 
+    public void addToken(String token) {
+        // 具有配置项,管理员可以配置token
+        EndPoint endPoint = this.getEndPoint();
+        if(endPoint != null){
+            endPoint.setToken(token);
+            this.setEndPoint(endPoint);
+        }
+    }
+
     public void create(String taskCode) {
         this.setCode(taskCode);
         this.setStatus(CrowdTestTaskStatus.HAS_RELEASED);

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

@@ -11,4 +11,6 @@ public class EndPoint {
     private String examId;
     private String serverCode;
     private String url;
+    private String token;
+    private int isShowed;
 }

+ 20 - 0
core/src/main/java/com/mooctest/crowd/domain/domainobject/Tool.java

@@ -0,0 +1,20 @@
+package com.mooctest.crowd.domain.domainobject;
+
+import lombok.Data;
+
+/**
+ * @author guochao
+ * @date 2020/11/16 10:54
+ */
+
+@Data
+public class Tool {
+    private Long id;
+    private String code;
+    private String name;
+    private String description;
+    private String photoUrl;
+    private String owner;
+    private String linkUrl;
+    private int isDeleted;
+}

+ 14 - 0
core/src/main/java/com/mooctest/crowd/domain/exception/CrowdTestEndPointException.java

@@ -0,0 +1,14 @@
+package com.mooctest.crowd.domain.exception;
+
+import lombok.AllArgsConstructor;
+
+/**
+ * @author guochao
+ * @date 2019-07-30 17:24
+ */
+@AllArgsConstructor
+public class CrowdTestEndPointException extends BaseException {
+    public CrowdTestEndPointException(String msg) {
+        super(msg);
+    }
+}

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

@@ -32,4 +32,10 @@ public class EndPointPO {
 
     @Column(name = "EP_URL")
     private String url;
+
+    @Column(name = "EP_TOKEN")
+    private String token;
+
+    @Column(name = "EP_IS_SHOWED")
+    private int isShowed;
 }

+ 39 - 0
core/src/main/java/com/mooctest/crowd/domain/model/ToolPO.java

@@ -0,0 +1,39 @@
+package com.mooctest.crowd.domain.model;
+
+import lombok.Data;
+
+import javax.persistence.*;
+
+/**
+ * @author guochao
+ * @date 2020/11/16 10:54
+ */
+@Data
+@Entity(name = "tool")
+public class ToolPO {
+    @Id
+    @Column(name = "T_ID")
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @Column(name = "T_CODE")
+    private String code;
+
+    @Column(name = "T_NAME")
+    private String name;
+
+    @Column(name = "T_DESCRIPTION")
+    private String description;
+
+    @Column(name = "T_PHOTO_URL")
+    private String photoUrl;
+
+    @Column(name = "T_OWNER")
+    private String owner;
+
+    @Column(name = "T_LINK_URL")
+    private String linkUrl;
+
+    @Column(name = "T_IS_DELETED")
+    private int isDeleted;
+}

+ 3 - 0
core/src/main/java/com/mooctest/crowd/domain/repository/CrowdTestProjectRepo.java

@@ -170,6 +170,9 @@ public class CrowdTestProjectRepo implements ICrowdTestProjectRepo {
                             addEndPointPO.setId(endPointPO.get().getId());
                             addEndPointPO.setProjectCode(crowdTestProject.getCode());
                             addEndPointPO.setTaskCode(crowdTestTask.getCode());
+                            if(endPoint.getToken() != null && endPoint.getToken() != ""){
+                                addEndPointPO.setToken(endPoint.getToken());
+                            }
                             endPointDao.save(addEndPointPO);
                         }else{
                             EndPointPO addEndPointPO = new EndPointPO();

+ 13 - 1
core/src/main/java/com/mooctest/crowd/domain/repository/CrowdTestTaskRepo.java

@@ -1,8 +1,10 @@
 package com.mooctest.crowd.domain.repository;
 
 import com.mooctest.crowd.domain.dao.CrowdTestTaskDao;
+import com.mooctest.crowd.domain.dao.EndPointDao;
 import com.mooctest.crowd.domain.dao.TaskToUserDao;
 import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+import com.mooctest.crowd.domain.domainobject.EndPoint;
 import com.mooctest.crowd.domain.domainobject.TaskToUser;
 import com.mooctest.crowd.domain.model.CrowdTestProjectPO;
 import com.mooctest.crowd.domain.model.TaskToUserPO;
@@ -20,6 +22,8 @@ import javax.persistence.criteria.CriteriaBuilder;
 import javax.persistence.criteria.CriteriaQuery;
 import javax.persistence.criteria.Predicate;
 import javax.persistence.criteria.Root;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author:xx
@@ -29,13 +33,16 @@ import javax.persistence.criteria.Root;
 
 @Slf4j
 @Component
-public class CrowdTestTaskRepo  implements  ICrowdTaskRepo{
+public class CrowdTestTaskRepo implements ICrowdTaskRepo{
     @Autowired
     private CrowdTestTaskDao taskDao;
 
     @Autowired
     private TaskToUserDao taskToUserDao;
 
+    @Autowired
+    private EndPointDao endPointDao;
+
     @Override
     public Page<CrowdTestTask> findAllByPage(Pageable pageable, String keyword, int deletedStatus){
         Specifications<CrowdTestProjectPO> where =  Specifications.where(getProjectByIsNotDeleted(keyword, deletedStatus));
@@ -63,4 +70,9 @@ public class CrowdTestTaskRepo  implements  ICrowdTaskRepo{
         taskToUserDao.delete(Converter.convert(TaskToUserPO.class, taskToUser));
     }
 
+    @Override
+    public List<EndPoint> getEndPointShowList() {
+        return endPointDao.findAll().stream().filter(endPointPO -> endPointPO.getIsShowed() == 1).map(endPointPO -> Converter.convert(EndPoint.class, endPointPO)).collect(Collectors.toList());
+    }
+
 }

+ 4 - 0
core/src/main/java/com/mooctest/crowd/domain/repository/ICrowdTaskRepo.java

@@ -1,14 +1,18 @@
 package com.mooctest.crowd.domain.repository;
 
 import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+import com.mooctest.crowd.domain.domainobject.EndPoint;
 import com.mooctest.crowd.domain.domainobject.TaskToUser;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 
+import java.util.List;
+
 public interface ICrowdTaskRepo {
 
      Page<CrowdTestTask> findAllByPage(Pageable pageable, String keyword, int deletedStatus);
 
      void deleteTaskToUser(TaskToUser taskToUser);
 
+     List<EndPoint> getEndPointShowList();
 }

+ 12 - 0
core/src/main/java/com/mooctest/crowd/domain/repository/IToolRepo.java

@@ -0,0 +1,12 @@
+package com.mooctest.crowd.domain.repository;
+
+import com.mooctest.crowd.domain.domainobject.Tool;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+
+
+public interface IToolRepo {
+
+    Page<Tool> getAllTool(Pageable pageable, String keyword);
+
+}

+ 51 - 0
core/src/main/java/com/mooctest/crowd/domain/repository/ToolRepo.java

@@ -0,0 +1,51 @@
+package com.mooctest.crowd.domain.repository;
+
+import com.mooctest.crowd.domain.dao.ToolDao;
+import com.mooctest.crowd.domain.domainobject.DeletedStatus;
+import com.mooctest.crowd.domain.domainobject.Tool;
+import com.mooctest.crowd.domain.model.ToolPO;
+import com.mooctest.crowd.domain.util.Converter;
+import lombok.extern.slf4j.Slf4j;
+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.jpa.domain.Specification;
+import org.springframework.data.jpa.domain.Specifications;
+import org.springframework.stereotype.Component;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+@Slf4j
+@Component
+public class ToolRepo implements IToolRepo{
+
+
+    @Autowired
+    private ToolDao toolDao;
+
+    @Override
+    public Page<Tool> getAllTool(Pageable pageable, String keyword) {
+        Specifications<ToolPO> where =  Specifications.where(getToolByIsNotDeleted(keyword));
+        return toolDao.findAll(where, pageable).map(ToolPO->Converter.convert(Tool.class, ToolPO));
+    }
+
+    private Specification<ToolPO> getToolByIsNotDeleted(String keyword) {
+        return new Specification<ToolPO>() {
+            @Override
+            public Predicate toPredicate(Root<ToolPO> a, CriteriaQuery<?> q, CriteriaBuilder cb) {
+                Predicate predicate = cb.conjunction();
+                if(keyword != null) {
+                    Predicate title=cb.like(a.get("name"), "%" + StringUtils.trim(keyword) + "%");
+                    Predicate description=cb.like(a.get("description"), "%" + StringUtils.trim(keyword) + "%");
+                    predicate.getExpressions().add(cb.or(title,description));
+                }
+                predicate.getExpressions().add(cb.equal(a.get("isDeleted"), DeletedStatus.isNotDeleted));
+                return predicate;
+            }
+        };
+    }
+}

+ 17 - 12
site/src/main/java/com/mooctest/crowd/site/command/CrowdTestTaskCommand.java

@@ -2,6 +2,7 @@ package com.mooctest.crowd.site.command;
 
 import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
 import com.mooctest.crowd.domain.domainobject.EndPoint;
+import com.mooctest.crowd.domain.exception.CrowdTestEndPointException;
 import lombok.Data;
 import org.springframework.beans.BeanUtils;
 
@@ -75,19 +76,23 @@ public class CrowdTestTaskCommand {
 
         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_","");
+            try {
+                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);
+            }catch (IllegalArgumentException e){
+                throw new CrowdTestEndPointException();
             }
-            endPoint.setUrl(url);
-            crowdTestTask.setEndPoint(endPoint);
         }
         return crowdTestTask;
     }

+ 12 - 0
site/src/main/java/com/mooctest/crowd/site/command/TaskDataBoardCommand.java

@@ -0,0 +1,12 @@
+package com.mooctest.crowd.site.command;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class TaskDataBoardCommand {
+    private String token;
+}

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
site/src/main/java/com/mooctest/crowd/site/controller/CommonController.java


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

@@ -4,6 +4,7 @@ import com.mooctest.crowd.domain.exception.BaseException;
 import com.mooctest.crowd.domain.exception.UnauthorizedException;
 import com.mooctest.crowd.site.annotation.LoginRequired;
 import com.mooctest.crowd.site.command.CrowdTestTaskCommand;
+import com.mooctest.crowd.site.command.TaskDataBoardCommand;
 import com.mooctest.crowd.site.data.dto.TaskDetailsDTO;
 import com.mooctest.crowd.site.data.dto.TaskSquareDTO;
 import com.mooctest.crowd.site.service.CrowdTaskService;
@@ -107,6 +108,21 @@ public class CrowdTaskController{
         return taskService.confirmFinish(projectCode, taskCode, userId);
     }
 
+    /**
+     * 存储众测给的token
+     * @param projectCode
+     * @param taskCode
+     * @param session
+     * @return
+     */
+    @LoginRequired
+    @RequestMapping(value = "/project/{projectCode}/task/{taskCode}/addToken", method = RequestMethod.PUT)
+    public TaskDetailsDTO confirmFinishTask(@PathVariable("projectCode") String projectCode, @PathVariable("taskCode") String taskCode,
+                                            @RequestBody TaskDataBoardCommand command, HttpSession session){
+        Long userId = Long.parseLong((String)session.getAttribute("userId"));
+        return taskService.addToken(projectCode, taskCode, userId, command.getToken());
+    }
+
 
     @RequestMapping(value = "/jump/{projectCode}/{taskCode}/{userId}", method = RequestMethod.GET)
     public void jumpPublicTesting(@PathVariable("projectCode") String projectCode, @PathVariable("taskCode") String taskCode,

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

@@ -30,6 +30,11 @@ public class TechnicalArticlesController extends BaseSearchController{
     @Autowired
     private TechnicalArticlesService technical;
 
+    /**
+     * 众测技术相关搜索
+     * @param searchConditionVO
+     * @return
+     */
     @RequestMapping(value = "/articles", method = RequestMethod.POST)
     public ResponseVO<TechnicalArticlesDTO> technicalArticles(@RequestBody SearchConditionVO searchConditionVO){
         Map<String, String> extraCondition = searchConditionVO.getColumnFilters()==null? new HashMap<>() :super.getExtraCondition(searchConditionVO);
@@ -45,7 +50,7 @@ public class TechnicalArticlesController extends BaseSearchController{
 
     Pageable getPageable(SearchConditionVO searchConditionVO){
         int activePage = searchConditionVO.getActivePage() == 0?1:searchConditionVO.getActivePage();
-        Sort sort = new Sort(Sort.Direction.DESC,"publicTime");
+        Sort sort = new Sort(Sort.Direction.DESC,searchConditionVO.getSortType());
         return new PageRequest(activePage-1, CommonConstant.TECHNOLOGY_ROWS_ON_PAGE, sort);
     }
 

+ 4 - 1
site/src/main/java/com/mooctest/crowd/site/controller/advice/ExceptionAdvice.java

@@ -53,8 +53,11 @@ public class ExceptionAdvice {
             return "您未认证为接包用户,请认证后操作。";
         } else if (e instanceof HaveNotPartAuthException){
             return "您未认证为发包用户,请认证后操作。";
-        }  else
+        } else if(e instanceof CrowdTestEndPointException){
+            return "任务的服务序列号输入有误,不是base64加密后的序列号。";
+        } else {
             return e.getMessage();
+        }
     }
 
     @ExceptionHandler(UnauthorizedException.class)

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

@@ -20,6 +20,7 @@ public class TaskOperationControl {
     private boolean finish = false;
     private boolean confirmFinish = false;
     private boolean writeReport = false;
+    private boolean taskDemonstrate = false;
 
     public void hasAll(){
         this.receive = true;
@@ -28,6 +29,7 @@ public class TaskOperationControl {
         this.update = true;
         this.finish = true;
         this.uploadReport = true;
+        this.taskDemonstrate = true;
     }
 
     public void noAll(){
@@ -38,5 +40,6 @@ public class TaskOperationControl {
         this.finish = false;
         this.uploadReport = false;
         this.writeReport = false;
+        this.taskDemonstrate = false;
     }
 }

+ 4 - 0
site/src/main/java/com/mooctest/crowd/site/data/dto/TechnicalArticlesDTO.java

@@ -1,7 +1,9 @@
 package com.mooctest.crowd.site.data.dto;
 
+import com.mooctest.crowd.site.data.vo.CrowdTaskVO;
 import com.mooctest.crowd.site.data.vo.PublicationsVO;
 import com.mooctest.crowd.site.data.vo.TechnicalArticlesVO;
+import com.mooctest.crowd.site.data.vo.ToolVO;
 import lombok.Data;
 import org.springframework.data.domain.Page;
 
@@ -9,5 +11,7 @@ import org.springframework.data.domain.Page;
 public class TechnicalArticlesDTO {
     Page<TechnicalArticlesVO>  technicalArticlesPage;
     Page<PublicationsVO>  publicationsPage;
+    Page<ToolVO> toolVOPage;
+    Page<CrowdTaskVO> taskVOS;
     int count;
 }

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

@@ -13,6 +13,7 @@ import org.springframework.beans.BeanUtils;
 @Data
 public class EndPointVO {
     private String serverCode;
+    private String token;
 
     public EndPointVO(EndPoint endPoint){
         BeanUtils.copyProperties(endPoint, this);

+ 1 - 0
site/src/main/java/com/mooctest/crowd/site/data/vo/SearchConditionVO.java

@@ -18,4 +18,5 @@ public class SearchConditionVO {
     private Integer totalPage;
     private List<ColumnFilter> columnFilters;
     private Map<String,String> extraCondition;
+    private String sortType;
 }

+ 34 - 0
site/src/main/java/com/mooctest/crowd/site/data/vo/ToolVO.java

@@ -0,0 +1,34 @@
+package com.mooctest.crowd.site.data.vo;
+
+import com.mooctest.crowd.domain.domainobject.Tool;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author guochao
+ * @date 2020/11/16 10:54
+ */
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ToolVO {
+    private String code;
+    private String name;
+    private String description;
+    private String photoUrl;
+    private String owner;
+    private String linkUrl;
+    private int isDeleted;
+
+    public ToolVO(Tool tool){
+        this.code = tool.getCode();
+        this.name = tool.getName();
+        this.photoUrl=tool.getPhotoUrl();
+        this.description=tool.getDescription();
+        this.owner=tool.getOwner();
+        this.linkUrl=tool.getLinkUrl();
+        this.isDeleted=tool.getIsDeleted();
+    }
+}

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

@@ -64,6 +64,8 @@ public interface ViewMediator {
 
     TaskDetailsDTO renderTaskDetails(String projectCode, String taskCode, Long userId);
 
+    CrowdTaskVO renderTaskDetailsByTourist(String projectCode, String taskCode);
+
     UserDTO renderUser(User user);
 
     List<RegionalManagerVO> renderRegionManagerList();

+ 101 - 71
site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java

@@ -664,12 +664,12 @@ public class WebMediatorImpl implements ViewMediator {
                 if(allTaskOfAgency != null && allTaskOfAgency.size() > 0){
                     unfinishedTasks = allTaskOfAgency.stream()
                             .filter(crowdTestTask -> crowdTestTask.getStatus() >= CrowdTestTaskStatus.HAS_RELEASED && crowdTestTask.getStatus() < CrowdTestTaskStatus.HAS_FINISHED)
-                            .sorted(Comparator.comparing(CrowdTestTask::getCreateTime))
+                            .sorted(Comparator.comparing(CrowdTestTask::getCreateTime).reversed())
                             .map(CrowdTaskVO::new).collect(Collectors.toList());
 
                     finishedTasks = allTaskOfAgency.stream()
                             .filter(crowdTestTask -> crowdTestTask.getStatus() == CrowdTestTaskStatus.HAS_FINISHED)
-                            .sorted(Comparator.comparing(CrowdTestTask::getCreateTime))
+                            .sorted(Comparator.comparing(CrowdTestTask::getCreateTime).reversed())
                             .map(CrowdTaskVO::new).collect(Collectors.toList());
                 }
             }
@@ -990,6 +990,21 @@ public class WebMediatorImpl implements ViewMediator {
     }
 
     @Override
+    public CrowdTaskVO renderTaskDetailsByTourist(String projectCode, String taskCode) {
+        CrowdTestProject project = projectRepo.getByProjectCode(projectCode);
+        Optional<CrowdTestTask> task = project.getCrowdTestTaskList().stream().filter(crowdTestTask -> crowdTestTask.getCode().equals(taskCode)).findFirst();
+        if (!task.isPresent())
+            throw new CrowdTestTaskNotExistException();
+
+        CrowdTestTask crowdTestTask = task.get();
+        CrowdTaskVO crowdTaskVO = new CrowdTaskVO(crowdTestTask);
+        if(crowdTestTask.getEndPoint() != null){
+            crowdTaskVO.setEndPointVO(new EndPointVO(Converter.convert(EndPoint.class, crowdTestTask.getEndPoint())));
+        }
+        return crowdTaskVO;
+    }
+
+    @Override
     public UserDTO renderUser(User user) {
         UserDTO userDTO = new UserDTO();
         userDTO.setRoleList(user.getRoleList().stream().map(Role::getName).collect(Collectors.toList()));
@@ -1632,98 +1647,113 @@ public class WebMediatorImpl implements ViewMediator {
         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) {
+        if (user == null || task.getStatus() == CrowdTestTaskStatus.HAS_TIME_OUT) {
             return taskOperationControl;
         }
 
-        //区域管理员或系统管理员视角
-        if (user.getRoleList().stream().anyMatch(role -> role.getName().equals("SystemAdministrator"))
-                || (user.getRegionalManager() != null && user.getId().equals(project.getRegionalManagerId()))) {
-            if (task.getStatus() < CrowdTestTaskStatus.HAS_RECEIVED) {
-                taskOperationControl.setUpdate(true);
-                // 具有配置项,需要在第三方进行填写报告
-                if(endPointPOOptional.isPresent()){
-                    taskOperationControl.setWriteReport(true);
+        // 任务已结束,如果存在配置项的任务展示token则显示 任务面板按钮
+        if(task.getStatus() == CrowdTestTaskStatus.HAS_FINISHED){
+            if(endPointPOOptional.isPresent()){
+                if(endPointPOOptional.get().getToken() != null &&  !endPointPOOptional.get().getToken().equals("")){
+                    taskOperationControl.setTaskDemonstrate(true);
                 }
             }
-            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);
+        }else{
+            //区域管理员或系统管理员视角
+            if (user.getRoleList().stream().anyMatch(role -> role.getName().equals("SystemAdministrator"))
+                    || (user.getRegionalManager() != null && user.getId().equals(project.getRegionalManagerId()))) {
+                if (task.getStatus() < CrowdTestTaskStatus.HAS_RECEIVED) {
+                    taskOperationControl.setUpdate(true);
+                    // 具有配置项,需要在第三方进行填写报告
+                    if(endPointPOOptional.isPresent()){
+                        taskOperationControl.setWriteReport(true);
+                    }
                 }
-            }
+                else{
+                    if ((task.getParticipantHasCommittedCount() == task.getAcceptedCount() && task.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED) || (task.getParticipantHasCommittedCount() == task.getParticipantCount() && task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED)) {
+                        taskOperationControl.setConfirmFinish(true);
+                    }
 
-        }
-        // TODO 已拒绝视图
-        //评测机构和测评人员视角
-        else if (AuthCheckServiceImpl.isAgency(user) && task.getStatus() != CrowdTestTaskStatus.HAS_REJECTED) {
-            if ((task.getDistributionType() == 0 && task.getEvaluationAgencyId().equals(user.getId()))
-                    || (task.getDistributionType() == 2 && task.getStatus() >= CrowdTestTaskStatus.HAS_RECEIVED)) {
-                List<TaskToUser> acceptedUserList = task.getAcceptedUserList();
-                Optional<TaskToUser> taskToUserOptional = acceptedUserList.stream().filter(taskToUser -> taskToUser.getUserId().equals(user.getId())).findFirst();
-
-                if (taskToUserOptional.isPresent()) {
-                    // 已接收用户
-                    if (task.getStatus() == CrowdTestTaskStatus.HAS_RELEASED) {
-                        taskOperationControl.setReceive(true);
-                        if (task.getDistributionType() == 0)
-                            taskOperationControl.setReject(true);
-                    } else if (task.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED) {
+                    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);
-                        if (taskToUserOptional.get().getHasReport() == 1 && taskToUserOptional.get().getIsCommitted() == 0) {
-                            taskOperationControl.setFinish(true);
-                        } else if (taskToUserOptional.get().getHasReport() == 1 && taskToUserOptional.get().getIsCommitted() == 1) {
-                            taskOperationControl.setFinish(false);
-                            taskOperationControl.setUploadReport(false);
-                        }
-
-                        // 具有配置项,需要在第三方进行填写报告
-                        if(endPointPOOptional.isPresent()){
-                            taskOperationControl.noAll();
-                            taskOperationControl.setWriteReport(true);
+                        taskOperationControl.setConfirmFinish(true);
+                        if(endPointPOOptional.get().getToken() != null &&  !endPointPOOptional.get().getToken().equals("")){
+                            taskOperationControl.setTaskDemonstrate(true);
                         }
-                    } else if (task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED) {
-                        taskOperationControl.setUploadReport(false);
                     }
-                } else {
-                    // 未接收用户
-                    if(task.getFullStatus() == 1){
-                        taskOperationControl.noAll();
-                    }else{
-                        taskOperationControl.setReceive(true);
+                }
+
+            }
+            // TODO 已拒绝视图
+            //评测机构和测评人员视角
+            else if (AuthCheckServiceImpl.isAgency(user) && task.getStatus() != CrowdTestTaskStatus.HAS_REJECTED) {
+                if ((task.getDistributionType() == 0 && task.getEvaluationAgencyId().equals(user.getId()))
+                        || (task.getDistributionType() == 2 && task.getStatus() >= CrowdTestTaskStatus.HAS_RECEIVED)) {
+                    List<TaskToUser> acceptedUserList = task.getAcceptedUserList();
+                    Optional<TaskToUser> taskToUserOptional = acceptedUserList.stream().filter(taskToUser -> taskToUser.getUserId().equals(user.getId())).findFirst();
+
+                    if (taskToUserOptional.isPresent()) {
+                        // 已接收用户
                         if (task.getStatus() == CrowdTestTaskStatus.HAS_RELEASED) {
-                            // 定向的
+                            taskOperationControl.setReceive(true);
                             if (task.getDistributionType() == 0) {
                                 taskOperationControl.setReject(true);
                             }
+                        } else if (task.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED) {
+                            taskOperationControl.setUploadReport(true);
+                            if (taskToUserOptional.get().getHasReport() == 1 && taskToUserOptional.get().getIsCommitted() == 0) {
+                                taskOperationControl.setFinish(true);
+                            } else if (taskToUserOptional.get().getHasReport() == 1 && taskToUserOptional.get().getIsCommitted() == 1) {
+                                taskOperationControl.setFinish(false);
+                                taskOperationControl.setUploadReport(false);
+                            }
+
+                            // 具有配置项,需要在第三方进行填写报告
+                            if(endPointPOOptional.isPresent()){
+                                taskOperationControl.noAll();
+                                taskOperationControl.setWriteReport(true);
+                            }
+                        } else if (task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED) {
+                            taskOperationControl.setUploadReport(false);
+                        }
+                    } else {
+                        // 未接收用户
+                        if(task.getFullStatus() == 1){
+                            taskOperationControl.noAll();
+                        }else{
+                            taskOperationControl.setReceive(true);
+                            if (task.getStatus() == CrowdTestTaskStatus.HAS_RELEASED) {
+                                // 定向的
+                                if (task.getDistributionType() == 0) {
+                                    taskOperationControl.setReject(true);
+                                }
+                            }
                         }
-                    }
 
-                }
-            } else if (task.getDistributionType() == 2) {
-                if (task.getStatus() == CrowdTestTaskStatus.HAS_RELEASED) {
-                    taskOperationControl.setReceive(true);
+                    }
+                } else if (task.getDistributionType() == 2) {
+                    if (task.getStatus() == CrowdTestTaskStatus.HAS_RELEASED) {
+                        taskOperationControl.setReceive(true);
 //                    // 项目发起者
 //                    if (project.getUserId().equals(user.getId())) {
 //                        taskOperationControl.setReceive(false);
 //                    }
+                    }
                 }
             }
+            //发包机构和发包人员视角
+            else if (AuthCheckServiceImpl.isPart(user) && task.getStatus() != CrowdTestTaskStatus.HAS_REJECTED) {
+                return taskOperationControl;
+            }
         }
-        //发包机构和发包人员视角
-        else if (AuthCheckServiceImpl.isPart(user) && task.getStatus() != CrowdTestTaskStatus.HAS_REJECTED) {
-            return taskOperationControl;
-        }
+
+
 
         System.out.println(taskOperationControl);
         return taskOperationControl;

+ 2 - 0
site/src/main/java/com/mooctest/crowd/site/service/CrowdTaskService.java

@@ -39,4 +39,6 @@ public interface CrowdTaskService {
     List<CrowdTaskVO> findMoreHotTasksList(String keyword);
 
     void  jumpPublicTesting(String projectCode, String taskCode, Long userId);
+
+    TaskDetailsDTO addToken(String projectCode, String taskCode, Long userId, String token);
 }

+ 14 - 4
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdTaskServiceImpl.java

@@ -2,10 +2,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;
-import com.mooctest.crowd.domain.domainobject.DistributeType;
+import com.mooctest.crowd.domain.domainobject.*;
 import com.mooctest.crowd.domain.exception.BaseException;
 import com.mooctest.crowd.domain.exception.CrowdTestTaskNotExistException;
 import com.mooctest.crowd.domain.exception.UnauthorizedException;
@@ -215,4 +212,17 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
         projectRepo.saveCrowdTestProject(project);
         return getTaskDetails(projectCode, taskCode, userId);
     }
+
+    @Override
+    public TaskDetailsDTO addToken(String projectCode, String taskCode, Long userId, String token) {
+        CrowdTestProject project = projectRepo.getByProjectCode(projectCode);
+        if (!project.getRegionalManagerId().equals(userId))
+            throw new UnauthorizedException("无权限对此任务进行此操作");
+        CrowdTestTask task = project.getTask(taskCode);
+        task.addToken(token);
+        projectRepo.saveCrowdTestProject(project);
+        return getTaskDetails(projectCode, taskCode, userId);
+    }
+
 }
+

+ 41 - 6
site/src/main/java/com/mooctest/crowd/site/service/impl/TechnicalArticlesServiceImpl.java

@@ -1,25 +1,28 @@
 package com.mooctest.crowd.site.service.impl;
 
 
-import com.mooctest.crowd.domain.repository.PublicationsRepo;
-import com.mooctest.crowd.domain.repository.TechnicalArticlesRepo;
+import com.mooctest.crowd.domain.domainobject.EndPoint;
+import com.mooctest.crowd.domain.repository.*;
 import com.mooctest.crowd.site.data.dto.TechnicalArticlesDTO;
+import com.mooctest.crowd.site.data.vo.CrowdTaskVO;
 import com.mooctest.crowd.site.data.vo.PublicationsVO;
 import com.mooctest.crowd.site.data.vo.TechnicalArticlesVO;
+import com.mooctest.crowd.site.data.vo.ToolVO;
 import com.mooctest.crowd.site.mediator.ViewMediator;
 import com.mooctest.crowd.site.service.TechnicalArticlesService;
+import com.mooctest.crowd.site.util.DataUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 @Service
 public class TechnicalArticlesServiceImpl implements TechnicalArticlesService{
-
-
-
-
     @Autowired
     private ViewMediator viewMediator;
 
@@ -27,8 +30,17 @@ public class TechnicalArticlesServiceImpl implements TechnicalArticlesService{
     private TechnicalArticlesRepo technicalArticlesRepo;
 
     @Autowired
+    private CrowdTestTaskRepo crowdTestTaskRepo;
+
+    @Autowired
     private PublicationsRepo publicationsRepo;
 
+    @Autowired
+    private ToolRepo toolRepo;
+
+    @Autowired
+    private CommonRepo commonRepo;
+
     @Override
     public TechnicalArticlesDTO getArticles(Pageable pageable,String keyword,Map<String, String> extraCondition) {
         TechnicalArticlesDTO  technicalArticlesDTO= new  TechnicalArticlesDTO();
@@ -38,6 +50,29 @@ public class TechnicalArticlesServiceImpl implements TechnicalArticlesService{
                 technicalArticlesDTO.setTechnicalArticlesPage(technicalArticlesRepo.getTechnicalArticles(pageable, keyword).map(technicalArticles -> new TechnicalArticlesVO(technicalArticles)));
             }else if(value.equals("1")){
                 technicalArticlesDTO.setPublicationsPage(publicationsRepo.getPublications(pageable, keyword).map(publications -> new PublicationsVO(publications)));
+            }else if(value.equals("2")){
+                technicalArticlesDTO.setToolVOPage(toolRepo.getAllTool(pageable, keyword).map(tool -> new ToolVO(tool)));
+            }else if(value.equals("3")){
+                List<EndPoint> endPointShowList = crowdTestTaskRepo.getEndPointShowList();
+                List<CrowdTaskVO> crowdTaskVOS = new ArrayList<>();
+                if(keyword != null && keyword != ""){
+                    crowdTaskVOS = endPointShowList.stream()
+                            .map(endPoint -> {
+                                CrowdTaskVO crowdTaskVO = viewMediator.renderTaskDetailsByTourist(endPoint.getProjectCode(), endPoint.getTaskCode());
+                                String typeName = commonRepo.getTypeNameByCode(crowdTaskVO.getServiceType());
+                                crowdTaskVO.setServiceType(typeName);
+                                return crowdTaskVO;
+                            }).filter(crowdTaskVO -> crowdTaskVO.getTitle().contains(keyword)).sorted(Comparator.comparing(CrowdTaskVO::getCode).reversed()).collect(Collectors.toList());
+                }else{
+                    crowdTaskVOS = endPointShowList.stream()
+                            .map(endPoint -> {
+                                CrowdTaskVO crowdTaskVO = viewMediator.renderTaskDetailsByTourist(endPoint.getProjectCode(), endPoint.getTaskCode());
+                                String typeName = commonRepo.getTypeNameByCode(crowdTaskVO.getServiceType());
+                                crowdTaskVO.setServiceType(typeName);
+                                return crowdTaskVO;
+                            }).sorted(Comparator.comparing(CrowdTaskVO::getCode).reversed()).collect(Collectors.toList());
+                }
+                technicalArticlesDTO.setTaskVOS(DataUtils.listToPage(crowdTaskVOS, pageable));
             }
         }
         return technicalArticlesDTO;

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio