guo00guo 5 سال پیش
والد
کامیت
7d0a8a9dbb

+ 6 - 1
core/src/main/java/com/mooctest/crowd/domain/dao/CrowdTestTaskDao.java

@@ -5,9 +5,12 @@ 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.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.List;
 
@@ -65,5 +68,7 @@ public interface CrowdTestTaskDao extends CrudRepository<CrowdTestTaskPO, Long>,
     @Override
     <S extends CrowdTestTaskPO> S save(S s);
 
-
+    @Modifying
+    @Query(nativeQuery = true,value="update crowd_test_task set CTT_STATUS= ?1 where CTT_CODE=?2")
+    void updateStatusById(@Param("status") int status, @Param("code") String code);
 }

+ 1 - 0
core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestReport.java

@@ -25,6 +25,7 @@ public class CrowdTestReport {
     private String conclusion;
     private int isDeleted;
     private Timestamp createTime;
+    private boolean Updated;//是否能被修改
 
     @Override
     public String toString() {

+ 10 - 2
core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestTask.java

@@ -16,6 +16,13 @@ import java.util.stream.Collectors;
  */
 @Data
 public class CrowdTestTask {
+    public static final int HAS_REJECTED = -1;  //定向发布被拒
+    public static final int HAS_CREATED = 0;    //创建任务
+    public static final int HAS_RELEASED = 1;   //发布任务
+    public static final int HAS_RECEIVED = 2;   //接受任务
+    public static final int HAS_COMMITED = 3;   //区域管理员提交任务
+    public static final int HAS_FINISHED = 4;   //结束任务
+    public static final int HAS_TIME_OUT = 5; //时间截止
     private Long id;
     private String name;
     private String code;
@@ -82,7 +89,7 @@ public class CrowdTestTask {
      * 接收任务(测评机构)
      * @return
      */
-    public void receive(User user) {
+    public void receive(User user){
         //判断是否为测评机构
         EvaluationAgency evaluationAgency = user.getEvaluationAgency();
         if(evaluationAgency == null){
@@ -92,7 +99,7 @@ public class CrowdTestTask {
         if(this.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED){
             if(this.getFullStatus() == CrowdTestTaskAcceptStatus.HAS_FULL)
                 throw new CrowdTestTaskException("当前任务满员!:");
-        }else if (this.getStatus()!=CrowdTestTaskStatus.HAS_RELEASED)
+        }else if(this.getStatus()!=CrowdTestTaskStatus.HAS_RELEASED&&this.getStatus()!=CrowdTestTaskStatus.HAS_REJECTED)
             throw new CrowdTestTaskException("任务当前状态不能被接收,当前状态为:"+this.getStatus());
         //定向发布类型
 //        if (this.getDistributionType() == 0) {
@@ -143,6 +150,7 @@ public class CrowdTestTask {
         this.setStatus(CrowdTestTaskStatus.HAS_REJECTED);
     }
 
+
     public void removeCrowdTestTask() {
         this.isDeleted = DeletedStatus.isDeleted;
     }

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

@@ -23,7 +23,7 @@ import javax.servlet.http.HttpSession;
 @Slf4j
 @RestController
 @RequestMapping("/api")
-public class CrowdTaskController {
+public class CrowdTaskController{
 
     @Autowired
     private CrowdTaskService taskService;

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

@@ -21,6 +21,9 @@ public class CrowdReportVO {
     private String file;
     private String conclusion;
     private String target;
+    private  boolean Updated;//是否可以修改
+
+
 
     public CrowdReportVO(CrowdTestReport report){
         BeanUtils.copyProperties(report, this);

+ 11 - 3
site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java

@@ -334,7 +334,6 @@ public class WebMediatorImpl implements ViewMediator {
 
     @Override
     public IndexDTO renderIndex() {
-
         Pageable pageable = PageRequest.of(0, 10);
         //获取用户排名
         List<UserVO> userRanks = projectDao.findTotalPriceOfUser(pageable).stream().map(rankInfo -> {
@@ -691,15 +690,24 @@ public class WebMediatorImpl implements ViewMediator {
     }
 
     @Override
-    public ReportDetailsDTO renderProjectReportDetails(String projectCode, String reportCode, Long userId) {
+    public ReportDetailsDTO renderProjectReportDetails(String projectCode, String reportCode, Long userId){
         CrowdTestProject project = projectRepo.getByProjectCode(projectCode);
         CrowdTestReport report = project.getCrowdTestReportForProject();
         if (report == null)
             throw new CrowdTestReportNotExistException();
         ReportDetailsDTO reportDetailsDTO = new ReportDetailsDTO();
+        /*
+         如果该项目是已经完成的那么报告是不能修改的这边我在Vo上面加了一个属性Updated
+         */
+        if (project.getStatus() == CrowdTestProjectStatus.HAS_FINISHED){
+            report.setUpdated(false);
+        }
         reportDetailsDTO.setCrowdReportVO(new CrowdReportVO(report));
-        if (project.getStatus() < CrowdTestProjectStatus.HAS_FINISHED && project.getRegionalManagerId().equals(userId))
+
+        if (project.getStatus() < CrowdTestProjectStatus.HAS_FINISHED && project.getRegionalManagerId().equals(userId)) {
             reportDetailsDTO.setOperational(true);
+
+        }
         return reportDetailsDTO;
     }
 

+ 8 - 0
site/src/main/java/com/mooctest/crowd/site/service/ThemeSchedulerTaskService.java

@@ -0,0 +1,8 @@
+package com.mooctest.crowd.site.service;
+
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+
+public interface ThemeSchedulerTaskService {
+    boolean createNewThemeScheduler(CrowdTestTask crowdTestProject);
+    boolean cancelThemeScheduler(CrowdTestTask crowdTestProject);
+}

+ 7 - 0
site/src/main/java/com/mooctest/crowd/site/service/ThemeStatusTaskService.java

@@ -0,0 +1,7 @@
+package com.mooctest.crowd.site.service;
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+
+
+public interface ThemeStatusTaskService {
+    Integer updateStatus(CrowdTestTask crowdTestProject);
+}

+ 5 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdTaskServiceImpl.java

@@ -18,6 +18,7 @@ import com.mooctest.crowd.site.data.vo.CrowdTaskVO;
 import com.mooctest.crowd.site.data.vo.CrowdTestProjectVO;
 import com.mooctest.crowd.site.mediator.ViewMediator;
 import com.mooctest.crowd.site.service.CrowdTaskService;
+import com.mooctest.crowd.site.service.ThemeSchedulerTaskService;
 import com.mooctest.crowd.site.util.GenerateFlowCodeUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +58,9 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
     @Autowired
     private EvaluationAgencyDao agencyDao;
 
+    @Autowired
+    private ThemeSchedulerTaskService themeSchedulerTaskService;
+
     @Override
     public List<CrowdTaskVO> findMoreHotTasks(){
         List<CrowdTaskVO> list=viewMediator.findMoreHotTasks();//根据创建时间已经倒叙排序好
@@ -91,6 +95,7 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
         CrowdTestProject project = projectRepo.getByProjectCode(projectCode);
         String taskCode = GenerateFlowCodeUtil.generateFlowCode("TASK-"+ ProjectType.getCode(command.getType()));
         task.create(taskCode);
+        themeSchedulerTaskService.createNewThemeScheduler(task);
         project.addTask(task);
         projectRepo.saveCrowdTestProject(project);
         return getTaskDetails(projectCode, taskCode, userId);

+ 119 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/ThemeSchedulerTaskServiceImpl.java

@@ -0,0 +1,119 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+import com.mooctest.crowd.site.service.ThemeSchedulerService;
+import com.mooctest.crowd.site.service.ThemeSchedulerTaskService;
+import com.mooctest.crowd.site.service.ThemeStatusService;
+import com.mooctest.crowd.site.service.ThemeStatusTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.support.CronTrigger;
+import org.springframework.stereotype.Service;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
+
+
+/**
+ * @program: crowd
+ * @author: hanyuwei
+ * @create: 2020-07-13 11:30
+ **/
+@Service
+public class ThemeSchedulerTaskServiceImpl implements ThemeSchedulerTaskService {
+
+
+    @Autowired
+    private ThemeStatusTaskService themeStatusTaskService;
+
+    private ConcurrentHashMap<CrowdTestTask, ThemeScheduler> map = new ConcurrentHashMap<>();
+    @Override
+    public boolean createNewThemeScheduler(CrowdTestTask crowdTestTask) {
+        if(! this.map.containsKey(crowdTestTask)) {
+            String cronExp = this.generateNextCronExp(crowdTestTask);
+            if(cronExp==null){
+                return false;
+            }
+            ThemeScheduler crowdTestTaskScheduler = new ThemeScheduler(crowdTestTask, cronExp);
+            crowdTestTaskScheduler.startCron();
+            map.put(crowdTestTask, crowdTestTaskScheduler);
+            return true;
+        }
+        return false;
+    }
+
+    public String generateNextCronExp(CrowdTestTask crowdTestTask) {
+        String cronExp = null;
+        String dateFormat="ss mm HH dd MM EE";
+        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.US);
+        Date now = new Date();
+        if(now.before(crowdTestTask.getCreateTime())) {
+            cronExp = sdf.format(crowdTestTask.getCreateTime());
+        } else if(now.before(crowdTestTask.getDeadTime())){
+            cronExp = sdf.format(crowdTestTask.getDeadTime());
+        }
+        return cronExp;
+    }
+    @Override
+    public boolean cancelThemeScheduler(CrowdTestTask crowdTestTask) {
+        if(this.map.containsKey(crowdTestTask)) {
+            ThemeScheduler crowdTestTaskScheduler = map.get(crowdTestTask);
+            crowdTestTaskScheduler.stopCron();
+            map.remove(crowdTestTask);
+            return true;
+        }
+        return false;
+    }
+
+    private class ThemeScheduler {
+        private ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
+        private ScheduledFuture<?> future;
+        private CrowdTestTask crowdTestTask = null;
+        private String cronExp = null;
+
+        ThemeScheduler() {}
+
+        ThemeScheduler (CrowdTestTask crowdTestTask, String cronExp) {
+            this.crowdTestTask = crowdTestTask;
+            this.cronExp =  cronExp;
+            this.threadPoolTaskScheduler =  new ThreadPoolTaskScheduler();
+            this.threadPoolTaskScheduler.initialize();
+        }
+        public String startCron() {
+            future = this.threadPoolTaskScheduler.schedule(new MyRunnable(this.crowdTestTask), new CronTrigger(this.cronExp));
+            return "startCron";
+        }
+
+        public String stopCron() {
+            if (future != null) {
+                future.cancel(true);
+            }
+            return "stopCron";
+        }
+
+        private class MyRunnable implements Runnable {
+
+            private CrowdTestTask crowdTestTask;
+
+            public MyRunnable() {}
+
+            public MyRunnable (CrowdTestTask crowdTestTask) {
+                this.crowdTestTask = crowdTestTask;
+            }
+
+            @Override
+            public void run() {
+                System.out.println("run111 ");
+                Integer result = themeStatusTaskService.updateStatus(this.crowdTestTask);
+                map.remove(crowdTestTask);
+                if(result.equals(CrowdTestTask.HAS_CREATED) || result.equals(CrowdTestTask.HAS_RELEASED)) {
+                    System.out.println("run22 ");
+                    createNewThemeScheduler(crowdTestTask);
+                }
+            }
+        }
+    }
+}

+ 30 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/ThemeStatusTaskServiceImpl.java

@@ -0,0 +1,30 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.mooctest.crowd.domain.dao.CrowdTestTaskDao;
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+import com.mooctest.crowd.site.service.ThemeStatusTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * @program: crowd
+ * @author: hanyuwei
+ * @create: 2020-07-13 13:11
+ **/
+@Service
+public class ThemeStatusTaskServiceImpl implements ThemeStatusTaskService {
+
+    @Autowired
+    private CrowdTestTaskDao crowdTestProjectDao;
+
+    @Override
+    public Integer updateStatus(CrowdTestTask crowdTestProject) {
+        int status = 0;
+        long curr = System.currentTimeMillis();
+        if (crowdTestProject.getDeadTime().getTime() < curr) {
+            status = CrowdTestTask.HAS_TIME_OUT;
+        }
+        crowdTestProjectDao.updateStatusById(status,crowdTestProject.getCode());
+        return status;
+    }
+}