guo00guo vor 5 Jahren
Ursprung
Commit
5302e259c8

+ 5 - 1
core/pom.xml

@@ -148,7 +148,11 @@
         <artifactId>fastjson</artifactId>
         <version>1.2.58</version>
     </dependency>
-
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.58</version>
+        </dependency>
 
 
     </dependencies>

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

@@ -8,9 +8,11 @@ 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.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;
@@ -69,4 +71,8 @@ public interface CrowdTestProjectDao extends CrudRepository<CrowdTestProjectPO,
     @Override
     <S extends CrowdTestProjectPO> S save(S s);
 
+
+    @Modifying
+    @Query(nativeQuery = true,value="update crowd_test_project set CTP_STATUS= ?1 where CTP_CODE=?2")
+    void updateStatusById(@Param("status") int status, @Param("code") String code);
 }

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

@@ -2,7 +2,9 @@ package com.mooctest.crowd.domain.domainobject;
 
 import com.google.gson.Gson;
 import com.mooctest.crowd.domain.exception.*;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.sql.Timestamp;
 import java.util.ArrayList;
@@ -14,7 +16,16 @@ import java.util.Optional;
  * @date 2019/7/6 18:27
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class CrowdTestProject {
+    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;

Datei-Diff unterdrückt, da er zu groß ist
+ 0 - 0
site/src/main/java/com/mooctest/crowd/site/controller/CommonController.java


+ 4 - 0
site/src/main/java/com/mooctest/crowd/site/controller/CrowdProjectController.java

@@ -198,6 +198,10 @@ public class CrowdProjectController {
         return projectService.modifyAllData();
     }
 
+    /**
+     * 获取平台总体数据
+     * @return
+     */
     @RequestMapping(value = "/api/allproject", method = RequestMethod.GET)
     public  List<CrowdTestProject>  getByProject(){
         return projectService.getByProject();

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

@@ -11,7 +11,6 @@ import org.codehaus.jettison.json.JSONException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-
 @RestController
 @RequestMapping("/api/personal")
 public class PersonalDataController {

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

@@ -313,7 +313,6 @@ public class UserController extends BaseController {
      */
     @RequestMapping(value = "index/address",method = RequestMethod.GET)
     public Area getAddressByIp(HttpServletRequest request) throws UnsupportedEncodingException {
-
          String ip=DataUtils.getClientIp(request);
          LOG.info("ip地址是========"+ip);
           Area   area= AddressUtils.getProvinceName(ip);

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

@@ -48,8 +48,6 @@ public class CrowdTestProjectVO   {
     private String time_interval;
 
 
-
-
     public CrowdTestProjectVO(CrowdTestProject crowdTestProject) {
         id = crowdTestProject.getId();
         code = crowdTestProject.getCode();

+ 6 - 0
site/src/main/java/com/mooctest/crowd/site/mediator/impl/OperationMediatorImpl.java

@@ -6,6 +6,7 @@ import com.mooctest.crowd.site.command.CrowdTestProjectCommand;
 import com.mooctest.crowd.site.data.dto.ProjectDetailsDTO;
 import com.mooctest.crowd.site.data.vo.CrowdProjectVO;
 import com.mooctest.crowd.site.mediator.OperationMediator;
+import com.mooctest.crowd.site.service.ThemeSchedulerService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -22,6 +23,9 @@ public class OperationMediatorImpl implements OperationMediator {
     @Autowired
     private CrowdTestProjectRepo projectRepo;
 
+    @Autowired
+    private ThemeSchedulerService themeSchedulerService;
+
     @Override
     public ProjectDetailsDTO createCrowdProject(CrowdTestProjectCommand command) {
         CrowdTestProject project = command.toCrowdProject();
@@ -33,6 +37,7 @@ public class OperationMediatorImpl implements OperationMediator {
 
     @Override
     public CrowdTestProject updateProject(CrowdTestProject project, CrowdTestProjectCommand crowdTestProjectCommand) {
+        themeSchedulerService.cancelThemeScheduler(project);
         CrowdTestProject updateProject = crowdTestProjectCommand.toCrowdProject();
         updateProject.setId(project.getId());
         updateProject.setCode(project.getCode());
@@ -40,6 +45,7 @@ public class OperationMediatorImpl implements OperationMediator {
         if(updateProject.getCreateTime() == null){
             updateProject.setCreateTime(new Timestamp(System.currentTimeMillis()));
         }
+        themeSchedulerService.createNewThemeScheduler(updateProject);
         return updateProject;
     }
 }

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

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

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

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

+ 4 - 1
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdProjectServiceImpl.java

@@ -21,6 +21,7 @@ import com.mooctest.crowd.site.data.vo.RegionalManagerVO;
 import com.mooctest.crowd.site.mediator.OperationMediator;
 import com.mooctest.crowd.site.mediator.ViewMediator;
 import com.mooctest.crowd.site.service.CrowdProjectService;
+import com.mooctest.crowd.site.service.ThemeSchedulerService;
 import com.mooctest.crowd.site.util.GenerateFlowCodeUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
@@ -71,6 +72,8 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
     @Autowired
     private FieldDao fieldDao;
 
+    @Autowired
+    private ThemeSchedulerService themeSchedulerService;
 
     @Override
     public List<CrowdTestProjectVO> findAllMoreHotProjects() {
@@ -126,13 +129,13 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
         log.info("\n" + project.toString() + "\n");
         String projectCode = GenerateFlowCodeUtil.generateFlowCode("PROJ");
         project.setCode(projectCode);
-
         if(project.getCreateTime() == null){
             project.setCreateTime(new Timestamp(System.currentTimeMillis()));
         }
         ProjectDetailsDTO projectDetailsDTO = new ProjectDetailsDTO();
         projectRepo.saveCrowdTestProject(project);
         projectDetailsDTO.setProjectDetails(new CrowdProjectVO(project));
+        themeSchedulerService.createNewThemeScheduler(project);
         return projectDetailsDTO;
     }
 

+ 115 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/ThemeSchedulerServiceImpl.java

@@ -0,0 +1,115 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
+import com.mooctest.crowd.site.service.ThemeSchedulerService;
+import com.mooctest.crowd.site.service.ThemeStatusService;
+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 ThemeSchedulerServiceImpl implements ThemeSchedulerService {
+
+
+    @Autowired
+    private ThemeStatusService themeStatusService;
+
+    private ConcurrentHashMap<CrowdTestProject, ThemeScheduler> map = new ConcurrentHashMap<>();
+    @Override
+    public boolean createNewThemeScheduler(CrowdTestProject crowdTestProject) {
+        if(! this.map.containsKey(crowdTestProject)) {
+            String cronExp = this.generateNextCronExp(crowdTestProject);
+            if(cronExp==null){
+                return false;
+            }
+            ThemeScheduler themeDetailScheduler = new ThemeScheduler(crowdTestProject, cronExp);
+            themeDetailScheduler.startCron();
+            map.put(crowdTestProject, themeDetailScheduler);
+            return true;
+        }
+        return false;
+    }
+
+    public String generateNextCronExp(CrowdTestProject themeDetail) {
+        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(themeDetail.getCreateTime())) {
+            cronExp = sdf.format(themeDetail.getCreateTime());
+        } else if(now.before(themeDetail.getDeadTime())){
+            cronExp = sdf.format(themeDetail.getDeadTime());
+        }
+        return cronExp;
+    }
+    @Override
+    public boolean cancelThemeScheduler(CrowdTestProject themeDetail) {
+        if(this.map.containsKey(themeDetail)) {
+            ThemeScheduler themeDetailScheduler = map.get(themeDetail);
+            themeDetailScheduler.stopCron();
+            map.remove(themeDetail);
+            return true;
+        }
+        return false;
+    }
+
+    private class ThemeScheduler {
+        private ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
+        private ScheduledFuture<?> future;
+        private CrowdTestProject crowdTestProject = null;
+        private String cronExp = null;
+
+        ThemeScheduler() {}
+
+        ThemeScheduler (CrowdTestProject crowdTestProject, String cronExp) {
+            this.crowdTestProject = crowdTestProject;
+            this.cronExp =  cronExp;
+            this.threadPoolTaskScheduler =  new ThreadPoolTaskScheduler();
+            this.threadPoolTaskScheduler.initialize();
+        }
+        public String startCron() {
+            future = this.threadPoolTaskScheduler.schedule(new MyRunnable(this.crowdTestProject), new CronTrigger(this.cronExp));
+            return "startCron";
+        }
+
+        public String stopCron() {
+            if (future != null) {
+                future.cancel(true);
+            }
+            return "stopCron";
+        }
+
+        private class MyRunnable implements Runnable {
+
+            private CrowdTestProject crowdTestProject;
+
+            public MyRunnable() {}
+
+            public MyRunnable (CrowdTestProject themeDetail) {
+                this.crowdTestProject = crowdTestProject;
+            }
+
+            @Override
+            public void run() {
+                Integer result = themeStatusService.updateStatus(this.crowdTestProject);
+                map.remove(crowdTestProject);
+                if(result.equals(CrowdTestProject.HAS_CREATED) || result.equals(CrowdTestProject.HAS_RELEASED)) {
+                    createNewThemeScheduler(crowdTestProject);
+                }
+            }
+        }
+    }
+}

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

@@ -0,0 +1,30 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.mooctest.crowd.domain.dao.CrowdTestProjectDao;
+import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
+import com.mooctest.crowd.site.service.ThemeStatusService;
+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 ThemeStatusServiceImpl implements ThemeStatusService {
+
+    @Autowired
+    private CrowdTestProjectDao crowdTestProjectDao;
+
+    @Override
+    public Integer updateStatus(CrowdTestProject crowdTestProject) {
+        int status = 0;
+        long curr = System.currentTimeMillis();
+        if (crowdTestProject.getDeadTime().getTime() < curr) {
+            status = CrowdTestProject.HAS_TIME_OUT;
+        }
+        crowdTestProjectDao.updateStatusById(status,crowdTestProject.getCode());
+        return status;
+    }
+}

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.