Browse Source

增加直接生成项目及任务接口,调整GenerateFlowCodeUtil方法静态调用

Diors.Po 6 years ago
parent
commit
7233e8a8b5

+ 3 - 3
core/src/main/java/com/mooctest/crowd/domain/controller/CrowdTestProjectController.java

@@ -471,7 +471,7 @@ public class CrowdTestProjectController {
 
         for(int i = 0; i < crowdTestProjectPOList.size(); i++){
             CrowdTestProject crowdTestProject = Converter.convert(CrowdTestProject.class, crowdTestProjectPOList.get(i));
-            CrowdTestProject crowdTestProjectResult = crowdTestProject.setTaskAndReportData();
+            CrowdTestProject crowdTestProjectResult = crowdTestProject.generateDefaultTaskAndReportData();
             //TODO 保存数据库
             crowdTestProjectRepo.saveCrowdTestProject(crowdTestProjectResult);
 
@@ -620,7 +620,7 @@ public class CrowdTestProjectController {
             }
             for(int i = 0; i < crowdTestProjectPOList.size(); i++){
                 CrowdTestProject crowdTestProject = Converter.convert(CrowdTestProject.class, crowdTestProjectPOList.get(i));
-                CrowdTestProject crowdTestProjectResult = crowdTestProject.setTaskAndReportData();
+                CrowdTestProject crowdTestProjectResult = crowdTestProject.generateDefaultTaskAndReportData();
                 //TODO 保存数据库
                 crowdTestProjectRepo.saveCrowdTestProject(crowdTestProjectResult);
             }
@@ -646,7 +646,7 @@ public class CrowdTestProjectController {
         crowdTestProject.setDescription("测试项目中存在的bug");
 
         //具体操作
-        CrowdTestProject crowdTestProjectResult = crowdTestProject.setTaskAndReportData();
+        CrowdTestProject crowdTestProjectResult = crowdTestProject.generateDefaultTaskAndReportData();
         //TODO 保存数据库
         crowdTestProjectRepo.saveCrowdTestProject(crowdTestProjectResult);
         return "success";

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

@@ -260,7 +260,7 @@ public class CrowdTestProject {
      * 设置任务和报告的数据
      * @return
      */
-    public CrowdTestProject setTaskAndReportData() {
+    public CrowdTestProject generateDefaultTaskAndReportData() {
         this.setCode("PROJ-"+ this.getName()); //换成名称
         this.setUserId(11L);
         this.setRegionalManagerId(13L);
@@ -275,7 +275,7 @@ public class CrowdTestProject {
         this.setDeadTime(new Timestamp(getBeforeDay(new Date(System.currentTimeMillis()),1).getTime()));
         
         //初始化任务
-        int taskCount = 5;
+        int taskCount = 1;
         List<CrowdTestTask> crowdTestTaskList = new ArrayList<>();
         for(int j = 0; j < taskCount; j++){
             CrowdTestTask crowdTestTask = new CrowdTestTask();
@@ -296,7 +296,7 @@ public class CrowdTestProject {
             crowdTestTask.setDeadTime(new Timestamp(getBeforeDay(new Date(System.currentTimeMillis()),2).getTime()));
 
             //初始化任务报告
-            int reportCount = 2;
+            int reportCount = 1;
             List<CrowdTestReport> crowdTestReportList = new ArrayList<>();
 
             for(int k = 0; k < reportCount; k++){

+ 12 - 0
core/src/main/java/com/mooctest/crowd/domain/factory/CrowdTestProjectFactory.java

@@ -1,6 +1,8 @@
 package com.mooctest.crowd.domain.factory;
 
 import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+import com.mooctest.crowd.domain.domainobject.CrowdTestTaskStatus;
 import org.springframework.stereotype.Component;
 
 /**
@@ -13,4 +15,14 @@ public class CrowdTestProjectFactory {
     public static CrowdTestProject createCrowdTestProject() {
         return new CrowdTestProject();
     }
+
+    public static CrowdTestTask defaultFinishedCrowdTask() {
+        CrowdTestTask task = new CrowdTestTask();
+        task.setStatus(CrowdTestTaskStatus.HAS_FINISHED);
+        task.setEvaluationAgencyId(1l);
+        task.setDistributionType(0l);
+        task.setDistributionProvince("江苏");
+        task.setDistributionCity("南京");
+        return task;
+    }
 }

+ 15 - 0
site/pom.xml

@@ -95,6 +95,21 @@
 			<groupId>org.springframework.session</groupId>
 			<artifactId>spring-session-data-redis</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>cn.afterturn</groupId>
+			<artifactId>easypoi-base</artifactId>
+			<version>3.0.3</version>
+		</dependency>
+		<dependency>
+			<groupId>cn.afterturn</groupId>
+			<artifactId>easypoi-web</artifactId>
+			<version>3.0.3</version>
+		</dependency>
+		<dependency>
+			<groupId>cn.afterturn</groupId>
+			<artifactId>easypoi-annotation</artifactId>
+			<version>3.0.3</version>
+		</dependency>
 	</dependencies>
 
 	<build>

+ 77 - 0
site/src/main/java/com/mooctest/crowd/site/command/GenerateProjectCommand.java

@@ -0,0 +1,77 @@
+package com.mooctest.crowd.site.command;
+
+import com.alibaba.fastjson.JSONObject;
+import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
+import com.mooctest.crowd.domain.domainobject.CrowdTestProjectStatus;
+import com.mooctest.crowd.domain.domainobject.ProjectDistributeType;
+import com.mooctest.crowd.domain.factory.CrowdTestProjectFactory;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+import java.sql.Timestamp;
+import java.util.ArrayList;
+import java.util.Map;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-09 13:44
+ */
+@Data
+public class GenerateProjectCommand {
+    private Long userId;
+
+    @NotNull(message = "项目名称不可为空")
+    private String name;
+
+    @NotNull(message = "项目服务类型不可为空")
+    private ArrayList<Integer> type;
+
+    private ArrayList<Integer> platform;
+
+    @NotNull(message = "项目描述不可为空")
+    private String description;
+
+    @NotNull(message = "项目联系人不可为空")
+    private String contactName;
+
+    @NotNull(message = "项目联系人电话不可为空")
+    @Pattern(regexp = "^[0-9]{11}$", message = "Mobile number is illegal")
+    private String contactPhone;
+
+    @NotNull(message = "请上传需求文档")
+    private String doc;
+
+    private String file;
+
+    @NotNull(message = "请填写截止时间")
+    private Timestamp datetime;
+
+    @NotNull(message = "请填写价格")
+    private Double price;
+
+    public CrowdTestProject toCrowdProject() {
+        CrowdTestProject crowdTestProject = CrowdTestProjectFactory.createCrowdTestProject();
+        crowdTestProject.setName(this.name);
+        if (userId == null)
+            userId = 0L;
+        crowdTestProject.setUserId(userId);
+        crowdTestProject.setLinkMan(this.contactName);
+        crowdTestProject.setLinkManMobile(this.contactPhone);
+        crowdTestProject.setStatus(CrowdTestProjectStatus.HAS_FINISHED);
+        crowdTestProject.setType(JSONObject.toJSONString(this.type));
+        crowdTestProject.setPlatform(JSONObject.toJSONString(this.platform));
+        crowdTestProject.setDescription(this.description);
+        crowdTestProject.setRequirementFile(this.doc);
+        crowdTestProject.setProjectFile(this.file);
+        crowdTestProject.setProjectDistributionTypeId(0L);
+        crowdTestProject.setDistributionProvince("");
+        crowdTestProject.setDistributionCity("");
+        crowdTestProject.setRegionalManagerId(1L);
+        crowdTestProject.setDeadTime(this.datetime);
+        crowdTestProject.setQuotedPrice(this.price);
+        crowdTestProject.setFixedPrice(this.price);
+        return crowdTestProject;
+    }
+}

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

@@ -1,16 +1,21 @@
 package com.mooctest.crowd.site.controller;
 
+import com.mooctest.crowd.domain.exception.BadRequestException;
 import com.mooctest.crowd.domain.exception.BaseException;
 import com.mooctest.crowd.site.command.CrowdTestProjectCommand;
+import com.mooctest.crowd.site.command.GenerateProjectCommand;
 import com.mooctest.crowd.site.data.dto.ProjectDetailsDTO;
 import com.mooctest.crowd.site.service.CrowdProjectService;
+import com.mooctest.crowd.site.util.FileUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpSession;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -58,4 +63,20 @@ public class CrowdProjectController {
     public void deleteProject(@PathVariable("projectId") Long projectId, HttpSession session){
         projectService.deleteProject(projectId, (Long)session.getAttribute("userId"));
     }
+
+    @RequestMapping(value = "/api/greenChannel/project", method = RequestMethod.POST)
+    public ProjectDetailsDTO generateProjectWithData(@RequestBody GenerateProjectCommand command){
+        return projectService.generateProjectWithData(command);
+    }
+
+    @RequestMapping(value = "/api/greenChannel/projects", method = RequestMethod.POST)
+    public List<ProjectDetailsDTO> multiProjectsImport(MultipartFile file){
+        try {
+            if (!FileUtil.checkExcel(file.getInputStream()))
+                throw new BadRequestException("请上传Excel文件,xls/xlsx");
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return projectService.importMultiProjectsByExcel(file);
+    }
 }

+ 0 - 5
site/src/main/java/com/mooctest/crowd/site/controller/TestController.java

@@ -1,13 +1,8 @@
 package com.mooctest.crowd.site.controller;
 
-import com.aliyun.oss.OSS;
-import com.aliyun.oss.OSSClient;
-import com.mooctest.crowd.domain.exception.BaseException;
 import com.mooctest.crowd.site.annotation.LoginRequired;
-import com.mooctest.crowd.site.configuration.OSSConfiguration;
 import com.mooctest.crowd.site.service.UploadService;
 import com.mooctest.crowd.site.util.FileUtil;
-import com.mooctest.crowd.site.util.GenerateFlowCodeUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;

+ 10 - 2
site/src/main/java/com/mooctest/crowd/site/controller/advice/ExceptionAdvice.java

@@ -5,6 +5,7 @@ import com.mooctest.crowd.site.data.ResponseMessage;
 import com.mooctest.crowd.domain.exception.*;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpStatus;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
 import org.springframework.web.bind.annotation.ResponseBody;
 import org.springframework.web.bind.annotation.ResponseStatus;
@@ -46,11 +47,18 @@ public class ExceptionAdvice {
         return e.getMessage();
     }
 
+    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
+    @ResponseStatus(HttpStatus.METHOD_NOT_ALLOWED)
+    public String handlMethodNotAllowdd(HttpRequestMethodNotSupportedException e){
+        log.info("method not allowdd", e);
+        return e.getMessage();
+    }
+
     @ExceptionHandler(Exception.class)
     @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
     @ResponseBody
     public String handleSystemException(Exception e){
-        log.error("System Error", e);
-        return "There is a system error";
+        log.error("System Error: "+e.getMessage(), e);
+        return "There is a system error: "+e.getMessage();
     }
 }

+ 9 - 0
site/src/main/java/com/mooctest/crowd/site/service/CrowdProjectService.java

@@ -1,7 +1,12 @@
 package com.mooctest.crowd.site.service;
 
+import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
 import com.mooctest.crowd.site.command.CrowdTestProjectCommand;
+import com.mooctest.crowd.site.command.GenerateProjectCommand;
 import com.mooctest.crowd.site.data.dto.ProjectDetailsDTO;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
 
 /**
  * @author: Diors.Po
@@ -16,4 +21,8 @@ public interface CrowdProjectService {
     ProjectDetailsDTO updateProject(String projectCode, CrowdTestProjectCommand crowdTestProjectCommand);
 
     void deleteProject(Long projectId, Long userId);
+
+    ProjectDetailsDTO generateProjectWithData(GenerateProjectCommand command);
+
+    List<ProjectDetailsDTO> importMultiProjectsByExcel(MultipartFile file);
 }

+ 42 - 3
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdProjectServiceImpl.java

@@ -2,19 +2,28 @@ package com.mooctest.crowd.site.service.impl;
 
 import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
 import com.mooctest.crowd.domain.domainobject.CrowdTestProjectStatus;
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
 import com.mooctest.crowd.domain.exception.BaseException;
+import com.mooctest.crowd.domain.factory.CrowdTestProjectFactory;
 import com.mooctest.crowd.domain.repository.CrowdTestProjectRepo;
 import com.mooctest.crowd.site.command.CrowdTestProjectCommand;
+import com.mooctest.crowd.site.command.GenerateProjectCommand;
 import com.mooctest.crowd.site.data.dto.ProjectDetailsDTO;
 import com.mooctest.crowd.site.data.enums.ProjectType;
 import com.mooctest.crowd.site.data.vo.CrowdProjectVO;
 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.util.FileUtil;
 import com.mooctest.crowd.site.util.GenerateFlowCodeUtil;
+import com.sun.deploy.util.GeneralUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * @author: Diors.Po
@@ -34,8 +43,6 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
     @Autowired
     private OperationMediator operationMediator;
 
-    @Autowired
-    private GenerateFlowCodeUtil codeUtil;
 
     @Override
     public ProjectDetailsDTO getProjectDetails(String projectCode) {
@@ -47,7 +54,7 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
         CrowdTestProject project = command.toCrowdProject();
         project.setStatus(CrowdTestProjectStatus.HAS_CREATED);
         log.info("\n"+project.toString()+"\n");
-        String projectCode = codeUtil.generateFlowCode("PROJ-");
+        String projectCode = GenerateFlowCodeUtil.generateFlowCode("PROJ");
         project.setCode(projectCode);
         ProjectDetailsDTO projectDetailsDTO = new ProjectDetailsDTO();
         projectRepo.saveCrowdTestProject(project);
@@ -74,4 +81,36 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
             throw new BaseException("没有权限");
         projectRepo.deleteByProjectId(projectId);
     }
+
+    @Override
+    public ProjectDetailsDTO generateProjectWithData(GenerateProjectCommand command) {
+        CrowdTestProject project = command.toCrowdProject();
+        project.setCode(GenerateFlowCodeUtil.generateProjCode());
+        List<CrowdTestTask> tasks = new ArrayList<>();
+        command.getType().forEach(integer -> {
+            CrowdTestTask task = CrowdTestProjectFactory.defaultFinishedCrowdTask();
+            task.setType(integer);
+            task.setCode(GenerateFlowCodeUtil.generateTaskCode(ProjectType.getCode(integer)));
+            task.setCrowdTestProjectCode(project.getCode());
+            task.setEndTime(command.getDatetime());
+            task.setDeadTime(command.getDatetime());
+            task.setRequirementFile(command.getFile());
+            task.setName(command.getName()+"-"+ProjectType.getName(integer));
+            task.setQuotedPrice(command.getPrice()/command.getType().size());
+            task.setFixedPrice(command.getPrice()/command.getType().size());
+            tasks.add(task);
+        });
+        project.setCrowdTestTaskList(tasks);
+        projectRepo.saveCrowdTestProject(project);
+        log.info(project.toString());
+        return getProjectDetails(project.getCode());
+    }
+
+    @Override
+    public List<ProjectDetailsDTO> importMultiProjectsByExcel(MultipartFile file) {
+        List<CrowdTestProject> projects = FileUtil.importExcel(file, 0, 1, CrowdTestProject.class);
+        return null;
+    }
+
+
 }

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

@@ -26,8 +26,8 @@ public class CrowdReportServiceImpl implements CrowdReportService {
     @Autowired
     private CrowdTestProjectRepo projectRepo;
 
-    @Autowired
-    private GenerateFlowCodeUtil codeUtil;
+//    @Autowired
+//    private GenerateFlowCodeUtil codeUtil;
 
     @Override
     public ReportDetailsDTO getTaskReport(String projectCode, String taskCode, String reportCode) {
@@ -54,7 +54,7 @@ public class CrowdReportServiceImpl implements CrowdReportService {
         if (task.get().getStatus() != CrowdTestTaskStatus.HAS_RECEIVED)
             throw new BaseException("当前阶段无法创建报告");
         CrowdTestReport report = command.toCrowdTestReport();
-        String reportCode = codeUtil.generateFlowCode("REPORT");
+        String reportCode = GenerateFlowCodeUtil.generateFlowCode("REPORT");
         report.setDependencyCode(taskCode);
         report.setCode(reportCode);
         task.get().getCrowdTestReportList().add(report);

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

@@ -33,8 +33,8 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
     @Autowired
     CrowdTestProjectRepo projectRepo;
 
-    @Autowired
-    GenerateFlowCodeUtil codeUtil;
+//    @Autowired
+//    GenerateFlowCodeUtil codeUtil;
 
     @Override
     public TaskDetailsDTO getTaskDetails(String projectCode, String taskCode) {
@@ -56,7 +56,7 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
     public TaskDetailsDTO createTask(String projectCode, CrowdTestTaskCommand command) {
         CrowdTestTask task = command.toCrowdTask(projectCode);
         CrowdTestProject project = projectRepo.getByProjectCode(projectCode);
-        String taskCode = codeUtil.generateFlowCode("TASK-"+ ProjectType.getCode(new Integer(command.getType())));
+        String taskCode = GenerateFlowCodeUtil.generateFlowCode("TASK-"+ ProjectType.getCode(new Integer(command.getType())));
         task.setCode(taskCode);
         task.setStatus(CrowdTestTaskStatus.HAS_CREATED);
         project.addTask(task);

+ 42 - 0
site/src/main/java/com/mooctest/crowd/site/util/FileUtil.java

@@ -1,11 +1,16 @@
 package com.mooctest.crowd.site.util;
 
+import cn.afterturn.easypoi.excel.ExcelImportUtil;
+import cn.afterturn.easypoi.excel.entity.ImportParams;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
+import java.util.NoSuchElementException;
 
 /**
  * @author: Diors.Po
@@ -60,10 +65,28 @@ public class FileUtil {
         } catch (IOException e) {
             e.printStackTrace();
         }
+        return true;
+    }
 
+    public static boolean checkExcel(InputStream inputStream){
+        String headStr = getHeadStr(inputStream);
+        log.info("The Head of File: "+headStr);
+        String name = FILE_TYPE_MAP.get(headStr);
+        if (name == null || (!name.contains("doc")&&(!name.contains("wps"))))
+            return false;
         return true;
     }
 
+    public static String getHeadStr(InputStream inputStream){
+        try {
+            byte[] headBytes = new byte[3];
+            inputStream.read(headBytes, 0, headBytes.length);
+            return bytesToHexString(headBytes).toLowerCase();
+        } catch (IOException e) {
+            throw new RuntimeException("读取文件头出错!", e);
+        }
+    }
+
     private static String bytesToHexString(byte[] src) {
         StringBuilder builder = new StringBuilder();
         if (src == null || src.length <= 0) {
@@ -81,4 +104,23 @@ public class FileUtil {
         System.out.println("HexString: " + builder.toString());
         return builder.toString();
     }
+
+    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass){
+        if (file == null){
+            return null;
+        }
+        ImportParams params = new ImportParams();
+        params.setTitleRows(titleRows);
+        params.setHeadRows(headerRows);
+        List<T> list = null;
+        try {
+            list = ExcelImportUtil.importExcel(file.getInputStream(), pojoClass, params);
+        }catch (NoSuchElementException e){
+            log.info("excel文件不能为空");
+            throw new RuntimeException("excel文件不能为空");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+        return list;
+    }
 }

+ 19 - 3
site/src/main/java/com/mooctest/crowd/site/util/GenerateFlowCodeUtil.java

@@ -17,10 +17,14 @@ import java.util.Date;
 @Component
 public class GenerateFlowCodeUtil {
 
+    private static RedisTemplate redisTemplate;
+
     @Autowired
-    RedisTemplate redisTemplate;
+    public void setRedisTemplate(RedisTemplate redisTemplate){
+        GenerateFlowCodeUtil.redisTemplate = redisTemplate;
+    }
 
-    public String generateFlowCode(String prefix){
+    public static String generateFlowCode(String prefix){
         int codeNum = 1;
         if (redisTemplate.hasKey(prefix)){
             codeNum = (int) redisTemplate.opsForValue().get(prefix);
@@ -34,7 +38,19 @@ public class GenerateFlowCodeUtil {
         return code;
     }
 
-    private String getSequence(int seq, int length){
+    public static String generateProjCode(){
+        return generateFlowCode("PROJECT");
+    }
+
+    public static String generateReportCode(){
+        return generateFlowCode("REPORT");
+    }
+
+    public static String generateTaskCode(String type){
+        return generateFlowCode("TASK-"+type);
+    }
+
+    private static String getSequence(int seq, int length){
         String str = String.valueOf(seq);
         if (str.length()>length)
             return str;