浏览代码

Merge branch 'feature-domain-implement' of ssh://git.mooctest.com:1022/crowd-2019/crowd-test-service-backend into feature-domain-implement

git pull
guochao 6 年之前
父节点
当前提交
4a468087ee
共有 34 个文件被更改,包括 1082 次插入51 次删除
  1. 3 3
      core/src/main/java/com/mooctest/crowd/domain/controller/CrowdTestProjectController.java
  2. 3 3
      core/src/main/java/com/mooctest/crowd/domain/domainobject/CrowdTestProject.java
  3. 33 0
      core/src/main/java/com/mooctest/crowd/domain/exception/Excel2ProjectException.java
  4. 39 1
      core/src/main/java/com/mooctest/crowd/domain/factory/CrowdTestProjectFactory.java
  5. 5 0
      core/src/main/java/com/mooctest/crowd/domain/factory/UserFactory.java
  6. 2 0
      core/src/main/java/com/mooctest/crowd/domain/model/UserToRolePO.java
  7. 22 8
      core/src/main/java/com/mooctest/crowd/domain/repository/UserRepo.java
  8. 15 0
      site/pom.xml
  9. 12 0
      site/src/main/java/com/mooctest/crowd/site/anticorruption/UserAntiCorruption.java
  10. 59 0
      site/src/main/java/com/mooctest/crowd/site/anticorruption/impl/UserAntiCorruptionImpl.java
  11. 25 0
      site/src/main/java/com/mooctest/crowd/site/anticorruption/impl/data/UserInfo.java
  12. 40 0
      site/src/main/java/com/mooctest/crowd/site/command/ApplyAgencyAuthCommand.java
  13. 99 0
      site/src/main/java/com/mooctest/crowd/site/command/GenerateProjectCommand.java
  14. 28 0
      site/src/main/java/com/mooctest/crowd/site/configuration/RestTemplateConfiguration.java
  15. 10 0
      site/src/main/java/com/mooctest/crowd/site/constants/CommonConstant.java
  16. 28 0
      site/src/main/java/com/mooctest/crowd/site/controller/AgencyController.java
  17. 22 0
      site/src/main/java/com/mooctest/crowd/site/controller/CrowdProjectController.java
  18. 39 8
      site/src/main/java/com/mooctest/crowd/site/controller/TestController.java
  19. 18 6
      site/src/main/java/com/mooctest/crowd/site/controller/advice/ExceptionAdvice.java
  20. 2 0
      site/src/main/java/com/mooctest/crowd/site/controller/interceptor/AuthCheckInterceptor.java
  21. 2 0
      site/src/main/java/com/mooctest/crowd/site/data/dto/UserDTO.java
  22. 27 0
      site/src/main/java/com/mooctest/crowd/site/data/vo/AgencyVO.java
  23. 1 0
      site/src/main/java/com/mooctest/crowd/site/data/vo/UserVO.java
  24. 8 10
      site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java
  25. 15 0
      site/src/main/java/com/mooctest/crowd/site/service/AgencyService.java
  26. 9 0
      site/src/main/java/com/mooctest/crowd/site/service/CrowdProjectService.java
  27. 60 0
      site/src/main/java/com/mooctest/crowd/site/service/impl/AgencyServiceImpl.java
  28. 239 3
      site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdProjectServiceImpl.java
  29. 3 3
      site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdReportServiceImpl.java
  30. 3 3
      site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdTaskServiceImpl.java
  31. 147 0
      site/src/main/java/com/mooctest/crowd/site/util/EncryptionUtil.java
  32. 42 0
      site/src/main/java/com/mooctest/crowd/site/util/FileUtil.java
  33. 19 3
      site/src/main/java/com/mooctest/crowd/site/util/GenerateFlowCodeUtil.java
  34. 3 0
      site/src/main/resources/application.yml

+ 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++){

+ 33 - 0
core/src/main/java/com/mooctest/crowd/domain/exception/Excel2ProjectException.java

@@ -0,0 +1,33 @@
+package com.mooctest.crowd.domain.exception;
+
+import lombok.AllArgsConstructor;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-11 22:46
+ */
+@NoArgsConstructor
+public class Excel2ProjectException extends BaseException {
+    private List<String> errorLog;
+
+    public Excel2ProjectException(List<String> errorLog){
+        this.errorLog = errorLog;
+    }
+
+    public Excel2ProjectException(List<String> errorLog, String msg){
+        super(msg);
+        this.errorLog = errorLog;
+    }
+
+    public String getErrorLogs() {
+        String logs = "";
+        for (String s : errorLog){
+            logs += (s+"\n");
+        }
+        return logs;
+    }
+}

+ 39 - 1
core/src/main/java/com/mooctest/crowd/domain/factory/CrowdTestProjectFactory.java

@@ -1,8 +1,11 @@
 package com.mooctest.crowd.domain.factory;
 
-import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
+import com.mooctest.crowd.domain.domainobject.*;
 import org.springframework.stereotype.Component;
 
+import java.sql.Date;
+import java.sql.Timestamp;
+
 /**
  * @author guochao
  * @date 2019/7/6 21:43
@@ -13,4 +16,39 @@ public class CrowdTestProjectFactory {
     public static CrowdTestProject createCrowdTestProject() {
         return new CrowdTestProject();
     }
+
+    public static CrowdTestProject defaulstCrowdTestProject() {
+        CrowdTestProject project = new CrowdTestProject();
+        project.setStatus(CrowdTestProjectStatus.HAS_FINISHED);
+        project.setIsDeleted(0);
+        project.setProjectDistributionTypeId(1L);
+        project.setDistributionProvince("江苏");
+        project.setDistributionCity("南京");
+        project.setRegionalManagerId(1L);
+        project.setUserId(1L);
+        project.setProjectFile("");
+        project.setRequirementFile("");
+        project.setFixedPrice(30000.00);
+        project.setQuotedPrice(30000.00);
+        project.setDeadTime(new Timestamp(new Date(System.currentTimeMillis()).getTime()));
+        project.setEndTime(new Timestamp(new Date(System.currentTimeMillis()).getTime()));
+        return project;
+    }
+
+    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;
+    }
+
+    public static CrowdTestReport defaultProjectReport() {
+        CrowdTestReport report = new CrowdTestReport();
+        report.setScope(0);
+        report.setIsDeleted(0);
+        return report;
+    }
 }

+ 5 - 0
core/src/main/java/com/mooctest/crowd/domain/factory/UserFactory.java

@@ -1,5 +1,6 @@
 package com.mooctest.crowd.domain.factory;
 
+import com.mooctest.crowd.domain.domainobject.EvaluationAgency;
 import com.mooctest.crowd.domain.domainobject.User;
 
 /**
@@ -11,4 +12,8 @@ public class UserFactory {
     public static User createUser() {
         return new User();
     }
+
+    public static EvaluationAgency defaultAgency() {
+        return new EvaluationAgency();
+    }
 }

+ 2 - 0
core/src/main/java/com/mooctest/crowd/domain/model/UserToRolePO.java

@@ -1,6 +1,8 @@
 package com.mooctest.crowd.domain.model;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import javax.persistence.*;
 import java.sql.Timestamp;

+ 22 - 8
core/src/main/java/com/mooctest/crowd/domain/repository/UserRepo.java

@@ -8,6 +8,7 @@ import com.mooctest.crowd.domain.exception.RoleNotFoundException;
 import com.mooctest.crowd.domain.exception.UserNotExistException;
 import com.mooctest.crowd.domain.model.*;
 import com.mooctest.crowd.domain.util.Converter;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -192,23 +193,30 @@ public class UserRepo implements IUserRepo {
      * @throws RoleNotFoundException
      */
     private User saveRoleAndPermissionAndEvaluationAgencyByUser(User user) throws RoleNotFoundException {
-        userDao.save(Converter.convert(UserPO.class, user));
+        UserPO userPO = userDao.save(Converter.convert(UserPO.class, user));
         List<Role> roleList = user.getRoleList();
+        if (roleList==null || roleList.size()==0){
+            UserToRolePO u2r = new UserToRolePO();
+            u2r.setUserId(userPO.getId());
+            u2r.setRoleId(1L);
+            userToRoleDao.save(u2r);
+        }
+        List<UserToRolePO> userToRolePOList = userToRoleDao.findByUserId(userPO.getId());
         for(Role role : roleList){
-            RolePO rolePO = Converter.convert(RolePO.class, role);
-            roleDao.save(rolePO);
-            List<Permission> permissionList = role.getPermissionList();
-            for(Permission permission : permissionList){
-                PermissionPO permissionPO = Converter.convert(PermissionPO.class, permission);
-                permissionDao.save(permissionPO);
+            if (!userToRolePOList.stream().filter(userToRolePO -> userToRolePO.getRoleId() == role.getId()).findFirst().isPresent()) {
+                UserToRolePO userToRolePO = new UserToRolePO();
+                userToRolePO.setRoleId(role.getId());
+                userToRolePO.setUserId(userPO.getId());
+                userToRoleDao.save(userToRolePO);
             }
         }
         EvaluationAgency evaluationAgency = user.getEvaluationAgency();
         if(evaluationAgency != null){
             EvaluationAgencyPO evaluationAgencyPO = Converter.convert(EvaluationAgencyPO.class, evaluationAgency);
+            evaluationAgencyPO.setUserId(userPO.getId());
             evaluationAgencyDao.save(evaluationAgencyPO);
         }
-        return user;
+        return getByID(userPO.getId());
     }
 
     /**
@@ -306,4 +314,10 @@ public class UserRepo implements IUserRepo {
         userResult.setRegionalManager(regionalManager);
         return userResult;
     }
+
+    public Role getRole(String roleName){
+        Role role = new Role();
+        BeanUtils.copyProperties(roleDao.findByName(roleName), role);
+        return role;
+    }
 }

+ 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>

+ 12 - 0
site/src/main/java/com/mooctest/crowd/site/anticorruption/UserAntiCorruption.java

@@ -0,0 +1,12 @@
+package com.mooctest.crowd.site.anticorruption;
+
+import com.mooctest.crowd.domain.domainobject.User;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-08 23:40
+ */
+public interface UserAntiCorruption {
+    User register(String name, String mobile, String password);
+}

+ 59 - 0
site/src/main/java/com/mooctest/crowd/site/anticorruption/impl/UserAntiCorruptionImpl.java

@@ -0,0 +1,59 @@
+package com.mooctest.crowd.site.anticorruption.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.mooctest.crowd.domain.domainobject.User;
+import com.mooctest.crowd.domain.factory.UserFactory;
+import com.mooctest.crowd.domain.repository.UserRepo;
+import com.mooctest.crowd.site.anticorruption.UserAntiCorruption;
+import com.mooctest.crowd.site.anticorruption.impl.data.UserInfo;
+import com.mooctest.crowd.site.util.EncryptionUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-08 23:40
+ */
+@Component
+public class UserAntiCorruptionImpl implements UserAntiCorruption {
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private UserRepo userRepo;
+
+    @Value("${user.service.baseUrl}")
+    private String userServiceUrl;
+
+    @Override
+    public User register(String name, String mobile, String password) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject params = new JSONObject();
+        params.put("name", name);
+        params.put("mobile", mobile);
+        params.put("email", name+"@mooctest.net");
+        params.put("password", EncryptionUtil.encryptMD5(password));
+        params.put("createTime", System.currentTimeMillis());
+
+        HttpEntity<String> entity = new HttpEntity<>(params.toString() , httpHeaders);
+        UserInfo userInfo = restTemplate.exchange(userServiceUrl + "/api/user", HttpMethod.POST, entity, UserInfo.class).getBody();
+        User user = UserFactory.createUser();
+        user.setId(userInfo.getId());
+        user.setName(userInfo.getName());
+        user.setUserName(userInfo.getName());
+        user.setMobile(mobile);
+        user.setPassword(userInfo.getPassword());
+        return user;
+    }
+}

+ 25 - 0
site/src/main/java/com/mooctest/crowd/site/anticorruption/impl/data/UserInfo.java

@@ -0,0 +1,25 @@
+package com.mooctest.crowd.site.anticorruption.impl.data;
+
+import lombok.Data;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 01:47
+ */
+@Data
+public class UserInfo {
+    private Long id;
+    private String email;
+    private String name;
+    private String mobile;
+    private String password;
+    private Long createTime;
+    private String school;
+    private String photoUrl;
+    private String province;
+    private String city;
+    private Boolean manualCheckValid;
+    private Integer availability;
+    private Long integral;
+}

+ 40 - 0
site/src/main/java/com/mooctest/crowd/site/command/ApplyAgencyAuthCommand.java

@@ -0,0 +1,40 @@
+package com.mooctest.crowd.site.command;
+
+import com.mooctest.crowd.domain.domainobject.EvaluationAgency;
+import com.mooctest.crowd.domain.factory.UserFactory;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 01:05
+ */
+@Data
+public class ApplyAgencyAuthCommand {
+
+    @NotNull(message = "手机号不可为空")
+    private String mobile;
+    @NotNull(message = "机构名称不可为空")
+    private String evaluationAgencyName;
+    @NotNull(message = "银行卡号不可为空")
+    private String bankAccount;
+    @NotNull(message = "机构地址不可为空")
+    private String address;
+    @NotNull(message = "评测能力不可为空")
+    private String abilities;
+    @NotNull(message = "机构资源不可为空")
+    private String resources;
+    @NotNull(message = "LOGO不可为空")
+    private String agencyPhoto;
+
+    public EvaluationAgency toAgency(){
+        EvaluationAgency agency = UserFactory.defaultAgency();
+        BeanUtils.copyProperties(this, agency);
+        agency.setIsDeleted(0);
+        agency.setIsAuthentication(0);
+        return agency;
+    }
+}

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

@@ -0,0 +1,99 @@
+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.CrowdTestReport;
+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;
+
+    //报告信息
+    private String reportContent;
+
+    private String reportConclusion;
+
+    private String reportUrl;
+
+    private Integer reportType=6;
+
+    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;
+    }
+
+    public CrowdTestReport getReport() {
+        CrowdTestReport report = CrowdTestProjectFactory.defaultProjectReport();
+        report.setName(this.name + "-测试报告");
+        report.setType(this.reportType);
+        report.setFile(this.reportUrl);
+        report.setDescription("");
+        report.setContent(this.reportContent);
+        report.setConclusion(this.reportConclusion);
+        report.setTestObject("");
+        return report;
+    }
+}

+ 28 - 0
site/src/main/java/com/mooctest/crowd/site/configuration/RestTemplateConfiguration.java

@@ -0,0 +1,28 @@
+package com.mooctest.crowd.site.configuration;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 01:25
+ */
+@Configuration
+public class RestTemplateConfiguration {
+    @Bean
+    public RestTemplate restTemplate(ClientHttpRequestFactory factory){
+        return new RestTemplate(factory);
+    }
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setConnectTimeout(15000);
+        factory.setReadTimeout(5000);
+        return factory;
+    }
+}

+ 10 - 0
site/src/main/java/com/mooctest/crowd/site/constants/CommonConstant.java

@@ -0,0 +1,10 @@
+package com.mooctest.crowd.site.constants;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 00:30
+ */
+public class CommonConstant {
+    public static final Long DEFAULT_REGIONAL_MANAGERID = 1L;
+}

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

@@ -0,0 +1,28 @@
+package com.mooctest.crowd.site.controller;
+
+import com.mooctest.crowd.site.command.ApplyAgencyAuthCommand;
+import com.mooctest.crowd.site.data.dto.UserDTO;
+import com.mooctest.crowd.site.service.AgencyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 01:02
+ */
+@RestController
+@RequestMapping("/api")
+public class AgencyController {
+
+    @Autowired
+    private AgencyService agencyService;
+
+    @RequestMapping(value = "greenChannel/agency", method = RequestMethod.POST)
+    public UserDTO generateAgency(@RequestBody ApplyAgencyAuthCommand command){
+        return agencyService.generateAgency(command);
+    }
+}

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

@@ -1,16 +1,22 @@
 package com.mooctest.crowd.site.controller;
 
+import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
+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 +64,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);
+    }
 }

+ 39 - 8
site/src/main/java/com/mooctest/crowd/site/controller/TestController.java

@@ -1,19 +1,24 @@
 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.alibaba.fastjson.JSONObject;
 import com.mooctest.crowd.site.annotation.LoginRequired;
-import com.mooctest.crowd.site.configuration.OSSConfiguration;
+import com.mooctest.crowd.site.anticorruption.impl.data.UserInfo;
+import com.mooctest.crowd.site.service.CrowdProjectService;
 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.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.client.RestTemplate;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * @author: Diors.Po
@@ -25,13 +30,37 @@ import java.io.IOException;
 public class TestController {
 
     @Autowired
-    private UploadService uploadService;
+    private CrowdProjectService projectService;
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @RequestMapping(value = "/test/rest", method = RequestMethod.POST)
+    public Object restTemplateTest() throws IOException {
+        String url = "http://111.231.143.6:8081/api/user";
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
+        JSONObject params = new JSONObject();
+        params.put("name", "xxb");
+        params.put("mobile", "32112321331");
+        params.put("email", "name@q.com");
+        params.put("password", "111111");
+        params.put("createTime", System.currentTimeMillis());
+
+        HttpEntity<String> entity = new HttpEntity<>(params.toString() , httpHeaders);
+        return restTemplate.exchange(url, HttpMethod.POST,entity, UserInfo.class).getBody();
+    }
 
     @RequestMapping(value = "/test", method = RequestMethod.POST)
     public Object exceptionTest(MultipartFile file) throws IOException {
         return FileUtil.checkFile(file.getInputStream());
     }
 
+    @RequestMapping(value = "/test/excel", method = RequestMethod.POST)
+    public Object excelTest(MultipartFile file) throws IOException {
+        return projectService.importMultiProjectsByExcel(file);
+    }
+
     @RequestMapping(value = "/session/put", method = RequestMethod.GET)
     public Object sessionTest(HttpServletRequest request) {
         request.getSession().setAttribute("test", 456);
@@ -41,9 +70,11 @@ public class TestController {
     @LoginRequired
     @RequestMapping(value = "/session/get", method = RequestMethod.GET)
     public Object sessionTest1(HttpServletRequest request) {
-        System.out.println(request.getSession().getAttribute("userId"));
-        return "sessionId: "+request.getSession().getId()+"  userId: "+request.getSession().getAttribute("userId");
+        Long userId = Long.parseLong((String)request.getSession().getAttribute("userId"));
+        System.out.println(userId);
+        return "sessionId: "+request.getSession().getId()+"  userId: "+userId;
     }
 
 
+
 }

+ 18 - 6
site/src/main/java/com/mooctest/crowd/site/controller/advice/ExceptionAdvice.java

@@ -5,10 +5,8 @@ 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.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.ResponseStatus;
-import org.springframework.web.bind.annotation.RestControllerAdvice;
+import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author: Diors.Po
@@ -46,11 +44,25 @@ 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();
+    }
+
+    @ExceptionHandler(Excel2ProjectException.class)
+    @ResponseStatus(HttpStatus.BAD_REQUEST)
+    public String handleExcel2ProjectException(Excel2ProjectException e){
+        log.error("Excel表中存在错误:"+e.getErrorLogs());
+        return e.getErrorLogs();
     }
 }

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

@@ -25,6 +25,8 @@ public class AuthCheckInterceptor extends HandlerInterceptorAdapter {
             log.info("需要认证的接口访问行为");
             if (request.getSession().getAttribute("userId") == null)
                 throw new UnauthorizedException();
+            else
+                log.info("用户已登录, userId:"+request.getSession().getAttribute("userId"));
         }else
             log.info("无需认证的接口访问");
         return true;

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

@@ -1,5 +1,6 @@
 package com.mooctest.crowd.site.data.dto;
 
+import com.mooctest.crowd.site.data.vo.AgencyVO;
 import com.mooctest.crowd.site.data.vo.CrowdProjectVO;
 import com.mooctest.crowd.site.data.vo.UserVO;
 import com.mooctest.crowd.domain.domainobject.Permission;
@@ -18,6 +19,7 @@ import java.util.List;
 @AllArgsConstructor
 public class UserDTO {
     private UserVO userVO;
+    private AgencyVO agencyVO;
     private List<Permission> permissions;
     private List<CrowdProjectVO> crowdProjectVOS;
 

+ 27 - 0
site/src/main/java/com/mooctest/crowd/site/data/vo/AgencyVO.java

@@ -0,0 +1,27 @@
+package com.mooctest.crowd.site.data.vo;
+
+import com.mooctest.crowd.domain.domainobject.EvaluationAgency;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.beans.BeanUtils;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 02:59
+ */
+@Data
+@NoArgsConstructor
+public class AgencyVO {
+    private Long userId;
+    private String evaluationAgencyName;
+    private String bankAccount;
+    private String address;
+    private String abilities;
+    private String resources;
+    private String agencyPhoto;
+
+    public AgencyVO(EvaluationAgency agency){
+        BeanUtils.copyProperties(agency, this);
+    }
+}

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

@@ -20,6 +20,7 @@ public class UserVO {
     private String userName;
     private String gender;
     private String mobileNum;
+    private String password;
     private String province;
     private String city;
     private String photoUrl;

+ 8 - 10
site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java

@@ -1,10 +1,7 @@
 package com.mooctest.crowd.site.mediator.impl;
 
 import com.mooctest.crowd.domain.dao.EvaluationAgencyDao;
-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.User;
+import com.mooctest.crowd.domain.domainobject.*;
 import com.mooctest.crowd.domain.exception.AccountNotExistException;
 import com.mooctest.crowd.domain.repository.CrowdTestProjectRepo;
 import com.mooctest.crowd.domain.repository.UserRepo;
@@ -17,6 +14,7 @@ import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.Iterator;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -152,14 +150,14 @@ public class WebMediatorImpl implements ViewMediator {
         List<CrowdTaskVO> taskVOList = project.getCrowdTestTaskList().stream().map(crowdTestTask -> {
             return new CrowdTaskVO(crowdTestTask);
         }).collect(Collectors.toList());
-//        List<CrowdReportVO> reportVOList = project.getCrowdTestReportListByProjectId(projectId, taskVOList.get(0).getId())
-//                .stream()
-//                .map(crowdTestReport -> {
-//            return new CrowdReportVO(crowdTestReport);
-//        }).collect(Collectors.toList());
+        List<CrowdReportVO> reportVOList = null;
+        if (project.getCrowdTestReportForProject() != null) {
+            reportVOList = new ArrayList<>();
+            reportVOList.add(new CrowdReportVO(project.getCrowdTestReportForProject()));
+        }
         projectDetailsDTO.setProjectDetails(new CrowdProjectVO(project));
         projectDetailsDTO.setTaskList(taskVOList);
-//        projectDetailsDTO.setCrowdReportVOList(reportVOList);
+        projectDetailsDTO.setReportList(reportVOList);
         return projectDetailsDTO;
     }
 

+ 15 - 0
site/src/main/java/com/mooctest/crowd/site/service/AgencyService.java

@@ -0,0 +1,15 @@
+package com.mooctest.crowd.site.service;
+
+import com.mooctest.crowd.site.command.ApplyAgencyAuthCommand;
+import com.mooctest.crowd.site.data.dto.UserDTO;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 01:18
+ */
+public interface AgencyService {
+    UserDTO applyAgency(Long userId, ApplyAgencyAuthCommand command);
+
+    UserDTO generateAgency(ApplyAgencyAuthCommand command);
+}

+ 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);
 }

+ 60 - 0
site/src/main/java/com/mooctest/crowd/site/service/impl/AgencyServiceImpl.java

@@ -0,0 +1,60 @@
+package com.mooctest.crowd.site.service.impl;
+
+import com.fasterxml.jackson.databind.ser.Serializers;
+import com.mooctest.crowd.domain.domainobject.EvaluationAgency;
+import com.mooctest.crowd.domain.domainobject.Role;
+import com.mooctest.crowd.domain.domainobject.User;
+import com.mooctest.crowd.domain.exception.BaseException;
+import com.mooctest.crowd.domain.factory.UserFactory;
+import com.mooctest.crowd.domain.repository.UserRepo;
+import com.mooctest.crowd.site.anticorruption.UserAntiCorruption;
+import com.mooctest.crowd.site.command.ApplyAgencyAuthCommand;
+import com.mooctest.crowd.site.data.dto.UserDTO;
+import com.mooctest.crowd.site.data.vo.AgencyVO;
+import com.mooctest.crowd.site.data.vo.UserVO;
+import com.mooctest.crowd.site.service.AgencyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 01:20
+ */
+@Service
+public class AgencyServiceImpl implements AgencyService {
+
+    @Autowired
+    private UserAntiCorruption userAnti;
+
+    @Autowired
+    private UserRepo userRepo;
+
+    @Override
+    public UserDTO applyAgency(Long userId, ApplyAgencyAuthCommand command) {
+        return null;
+    }
+
+    @Override
+    public UserDTO generateAgency(ApplyAgencyAuthCommand command) {
+        if (userRepo.getByMobileNum(command.getMobile()) != null)
+            throw new BaseException("该电话已存在");
+        User user = userAnti.register(command.getEvaluationAgencyName(), command.getMobile(), command.getMobile());
+        EvaluationAgency agency = command.toAgency();
+        List<Role> roles = new ArrayList<>();
+        roles.add(userRepo.getRole("evaluationAgency"));
+        roles.add(userRepo.getRole("generalUser"));
+        user.setRoleList(roles);
+        agency.setUserId(user.getId());
+        user.setEvaluationAgency(agency);
+        user = userRepo.saveUser(user);
+        UserDTO userDTO = new UserDTO();
+        userDTO.setUserVO(new UserVO(userRepo.getByID(user.getId())));
+        userDTO.setAgencyVO(new AgencyVO(userRepo.getByID(user.getId()).getEvaluationAgency()));
+        userDTO.getUserVO().setPassword(command.getMobile());
+        return userDTO;
+    }
+}

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

@@ -1,10 +1,17 @@
 package com.mooctest.crowd.site.service.impl;
 
+import com.alibaba.fastjson.JSONArray;
 import com.mooctest.crowd.domain.domainobject.CrowdTestProject;
 import com.mooctest.crowd.domain.domainobject.CrowdTestProjectStatus;
+import com.mooctest.crowd.domain.domainobject.CrowdTestReport;
+import com.mooctest.crowd.domain.domainobject.CrowdTestTask;
+import com.mooctest.crowd.domain.exception.BadRequestException;
 import com.mooctest.crowd.domain.exception.BaseException;
+import com.mooctest.crowd.domain.exception.Excel2ProjectException;
+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;
@@ -13,8 +20,19 @@ import com.mooctest.crowd.site.mediator.ViewMediator;
 import com.mooctest.crowd.site.service.CrowdProjectService;
 import com.mooctest.crowd.site.util.GenerateFlowCodeUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.sql.Timestamp;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
 
 /**
  * @author: Diors.Po
@@ -34,8 +52,6 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
     @Autowired
     private OperationMediator operationMediator;
 
-    @Autowired
-    private GenerateFlowCodeUtil codeUtil;
 
     @Override
     public ProjectDetailsDTO getProjectDetails(String projectCode) {
@@ -47,7 +63,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 +90,224 @@ 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);
+        });
+
+        CrowdTestReport report = command.getReport();
+        report.setDependencyCode(project.getCode());
+        report.setCode(GenerateFlowCodeUtil.generateReportCode());
+        project.setCrowdTestReportForProject(report);
+        project.setCrowdTestTaskList(tasks);
+        projectRepo.saveCrowdTestProject(project);
+        log.info(project.toString());
+        return getProjectDetails(project.getCode());
+    }
+
+    @Override
+    public List<ProjectDetailsDTO> importMultiProjectsByExcel(MultipartFile file) {
+        List<ProjectDetailsDTO> dtos = new ArrayList<>();
+        List<CrowdTestProject> projects = transferExcel2Projects(file);
+        projects.forEach(project -> {
+            project.setCode(GenerateFlowCodeUtil.generateProjCode());
+            List<CrowdTestTask> tasks = new ArrayList<>();
+            CrowdTestTask task = CrowdTestProjectFactory.defaultFinishedCrowdTask();
+            task.setType(((List<Integer>) JSONArray.parse(project.getType())).get(0));
+            task.setCode(GenerateFlowCodeUtil.generateTaskCode(ProjectType.getCode(task.getType())));
+            task.setCrowdTestProjectCode(project.getCode());
+            task.setEndTime(project.getEndTime());
+            task.setDeadTime(project.getDeadTime());
+            task.setRequirementFile(project.getRequirementFile());
+            task.setName(project.getName()+"-"+ProjectType.getName(task.getType()));
+            task.setQuotedPrice(project.getQuotedPrice());
+            task.setFixedPrice(project.getFixedPrice());
+            tasks.add(task);
+            project.setCrowdTestTaskList(tasks);
+            projectRepo.saveCrowdTestProject(project);
+            dtos.add(getProjectDetails(project.getCode()));
+        });
+        return dtos;
+    }
+
+    private List<CrowdTestProject> transferExcel2Projects(MultipartFile file){
+        List<String> logList = new ArrayList<>();
+        List<CrowdTestProject> projects = new ArrayList<>();
+        Workbook workbook = null;
+        try {
+            if (file.getOriginalFilename().endsWith("xlsx"))
+                workbook = new XSSFWorkbook(file.getInputStream());
+            else if (file.getOriginalFilename().endsWith("xls"))
+                workbook = new HSSFWorkbook(file.getInputStream());
+            else
+                throw new BadRequestException("不是合法的Excel文件");
+        } catch (IOException e) {
+            throw new BaseException("Excel读取出错,无法生成workbook");
+        }
+        Sheet sheet = workbook.getSheetAt(0);
+        if (sheet == null)
+            throw new BadRequestException("找不到标签页");
+        if (sheet.getPhysicalNumberOfRows() < 2)
+            throw new BadRequestException("数据内容为空,请重新编辑");
+
+        Row keyRow = sheet.getRow(0);
+        int cellCount = keyRow.getPhysicalNumberOfCells();
+        log.info("CellCount: "+cellCount);
+        log.info("Rows: " + sheet.getPhysicalNumberOfRows());
+        for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++ ){
+            CrowdTestProject project = CrowdTestProjectFactory.defaulstCrowdTestProject();
+            Row row = sheet.getRow(i);
+            if (row == null){
+                logList.add("表中存在错误的单元格,请把与内容无关的单元格置空");
+                break;
+            }
+            for (int j = 0; j < cellCount; j++){
+                Cell cell = row.getCell(j);
+                if (cell == null ) {
+                    logList.add("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "单元格为空");
+                    log.error("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "单元格为空");
+                    continue;
+                }
+                cell.setCellType(CellType.STRING);
+                log.info("ROW: "+i+", COL: "+j +", DATA: "+ cell.getStringCellValue());
+                if (cell.getStringCellValue().trim().equals("")){
+                    logList.add("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "单元格为空");
+                    continue;
+                }
+                switch (j){
+                    case 0:
+                        project.setName(cell.getStringCellValue().trim());
+                        break;
+                    case 1:
+                        if(!isPlatform(cell.getStringCellValue())){
+                            logList.add("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "测试平台数据不合法:"+cell.getStringCellValue());
+                            break;
+                        }
+                        project.setPlatform("["+cell.getStringCellValue().trim()+"]");
+                        break;
+                    case 2:
+                        project.setLinkMan(cell.getStringCellValue().trim());
+                        break;
+                    case 3:
+                        if (!isRightPhone(cell.getStringCellValue().trim())){
+                            logList.add("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "不合法的手机号码:"+cell.getStringCellValue());
+                            break;
+                        }
+                        project.setLinkManMobile(cell.getStringCellValue().trim());
+                        break;
+                    case 4:
+                        if (!isType(cell.getStringCellValue().trim())){
+                            logList.add("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "错误的测试服务类型:"+cell.getStringCellValue());
+                            break;
+                        }
+                        project.setType("["+cell.getStringCellValue().trim()+"]");
+                        break;
+                    case 5:
+                        project.setDescription(cell.getStringCellValue().trim());
+                        break;
+                    case 6:
+                        project.setFixedPrice(Double.parseDouble(cell.getStringCellValue().trim()));
+                        break;
+                }
+            }
+            project.setQuotedPrice(project.getFixedPrice());
+            projects.add(project);
+        }
+        projects.forEach(project -> {
+            log.info(project.toString());
+        });
+        if (logList.size()>0)
+            throw new Excel2ProjectException(logList);
+        return projects;
+    }
+
+    /**
+     * 匹配平台类型 0,1,2 任意  ^[0-2](([,][0-2])?([,][0-2])?)$
+     */
+    private boolean isPlatform(String str)throws PatternSyntaxException {
+        String regExp = "^[0-2](([,][0-2])?([,][0-2])?)$";
+        Pattern p = Pattern.compile(regExp);
+        Matcher m = p.matcher(str);
+        return m.matches();
+    }
+
+    /**
+     * 匹配项目类型 0,1,2,3,4,5,6 任意  ^[0-6](([,][0-6])?([,][0-6])?([,][0-6])?([,][0-6])?([,][0-6])?([,][0-6])?)$
+     */
+    private boolean isType(String str)throws PatternSyntaxException {
+        String regExp = "^[0-6](([,][0-6])?([,][0-6])?([,][0-6])?([,][0-6])?([,][0-6])?([,][0-6])?)$";
+        Pattern p = Pattern.compile(regExp);
+        Matcher m = p.matcher(str);
+        return m.matches();
+    }
+
+    /**
+     * 判断手机号或者座机是正确
+     * @param phone
+     * @return
+     */
+    private boolean isRightPhone(String phone){
+        if(phone.startsWith("0")){
+            if(!isTel(phone)){
+                return false;
+            }
+        }else{
+            if(!(isChinaPhoneLegal(phone) || isHKPhoneLegal(phone))){
+                return false;
+            }
+        }
+        return true;
+    }
+    /**
+     * 大陆手机号码11位数,匹配格式:前三位固定格式+后8位任意数
+     * 此方法中前三位格式有:
+     * 13+任意数
+     * 15+除4的任意数
+     * 18+除1和4的任意数
+     * 17+除9的任意数
+     * 147
+     */
+    private boolean isChinaPhoneLegal(String str) throws PatternSyntaxException {
+        String regExp = "^((13[0-9])|(15[^4])|(18[0,2,3,5-9])|(17[0-8])|(147))\\d{8}$";
+        Pattern p = Pattern.compile(regExp);
+        Matcher m = p.matcher(str);
+        return m.matches();
+    }
+
+    /**
+     * 香港手机号码8位数,5|6|8|9开头+7位任意数
+     */
+    private boolean isHKPhoneLegal(String str)throws PatternSyntaxException {
+        String regExp = "^(5|6|8|9)\\d{7}$";
+        Pattern p = Pattern.compile(regExp);
+        Matcher m = p.matcher(str);
+        return m.matches();
+    }
+
+    /**
+     * 座机号
+     */
+    private boolean isTel(String str)throws PatternSyntaxException {
+        String regExp = "^0[1-9](\\d{1,2}\\-?)\\d{7,8}";
+        Pattern p = Pattern.compile(regExp);
+        Matcher m = p.matcher(str);
+        return m.matches();
+    }
+
+
 }

+ 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);

+ 147 - 0
site/src/main/java/com/mooctest/crowd/site/util/EncryptionUtil.java

@@ -0,0 +1,147 @@
+package com.mooctest.crowd.site.util;
+
+import lombok.extern.slf4j.Slf4j;
+import sun.misc.BASE64Decoder;
+import sun.misc.BASE64Encoder;
+
+import javax.crypto.Cipher;
+import javax.crypto.SecretKey;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.DESKeySpec;
+import java.io.IOException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+
+/**
+ * @author: Diors.Po
+ * @Email: 171256175@qq.com
+ * @date 2019-08-12 01:32
+ */
+@Slf4j
+public class EncryptionUtil {
+    // 定义 加密算法,可用 DES,DESede,Blowfish
+    private static String Algorithm = "DES";
+    private static String defaultKey = "witest.net";
+
+
+    public static String encryptMD5(String str) {
+        String s = str;
+        if (s == null) {
+            return "";
+        } else {
+            String value = null;
+            MessageDigest md5 = null;
+            try {
+                md5 = MessageDigest.getInstance("MD5");
+            } catch (NoSuchAlgorithmException ex) {
+                log.error("", ex);
+            }
+            sun.misc.BASE64Encoder baseEncoder = new sun.misc.BASE64Encoder();
+            try {
+                value = baseEncoder.encode(md5.digest(s.getBytes("utf-8")));
+            } catch (Exception ex) {
+            }
+            return value;
+        }
+    }
+
+    public static String encryptDES(String content) throws Exception {
+        return encryptDES(content, defaultKey);
+    }
+
+    public static String decryptDES(String content) throws Exception {
+        return decryptDES(content, defaultKey);
+    }
+
+
+    /**
+     * Description 根据键值进行加密
+     *
+     * @param data
+     * @param key  加密键byte数组
+     * @return
+     * @throws Exception
+     */
+    public static String encryptDES(String data, String key) throws Exception {
+        byte[] bt = encryptDES(data.getBytes(), key.getBytes());
+        String strs = new BASE64Encoder().encode(bt);
+        return strs;
+    }
+
+    /**
+     * Description 根据键值进行解密
+     *
+     * @param data
+     * @param key  加密键byte数组
+     * @return
+     * @throws IOException
+     * @throws Exception
+     */
+    public static String decryptDES(String data, String key) throws IOException,
+            Exception {
+        if (data == null)
+            return null;
+        BASE64Decoder decoder = new BASE64Decoder();
+        byte[] buf = decoder.decodeBuffer(data);
+        byte[] bt = decryptDES(buf, key.getBytes());
+        return new String(bt);
+    }
+
+    /**
+     * Description 根据键值进行加密
+     *
+     * @param data
+     * @param key  加密键byte数组
+     * @return
+     * @throws Exception
+     */
+    private static byte[] encryptDES(byte[] data, byte[] key) throws Exception {
+        // 生成一个可信任的随机数源
+        SecureRandom sr = new SecureRandom();
+
+        // 从原始密钥数据创建DESKeySpec对象
+        DESKeySpec dks = new DESKeySpec(key);
+
+        // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Algorithm);
+        SecretKey securekey = keyFactory.generateSecret(dks);
+
+        // Cipher对象实际完成加密操作
+        Cipher cipher = Cipher.getInstance(Algorithm);
+
+        // 用密钥初始化Cipher对象
+        cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
+
+        return cipher.doFinal(data);
+    }
+
+
+    /**
+     * Description 根据键值进行解密
+     *
+     * @param data
+     * @param key  加密键byte数组
+     * @return
+     * @throws Exception
+     */
+    private static byte[] decryptDES(byte[] data, byte[] key) throws Exception {
+        // 生成一个可信任的随机数源
+        SecureRandom sr = new SecureRandom();
+
+        // 从原始密钥数据创建DESKeySpec对象
+        DESKeySpec dks = new DESKeySpec(key);
+
+        // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
+        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(Algorithm);
+        SecretKey securekey = keyFactory.generateSecret(dks);
+
+        // Cipher对象实际完成解密操作
+        Cipher cipher = Cipher.getInstance(Algorithm);
+
+        // 用密钥初始化Cipher对象
+        cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
+
+        return cipher.doFinal(data);
+    }
+}

+ 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;

+ 3 - 0
site/src/main/resources/application.yml

@@ -46,3 +46,6 @@ oss:
   accessKeySecret: dYml7rvT8stQkoSjMYlfRTxNj9dEsI
   endPoint: oss-cn-hangzhou.aliyuncs.com
   bucketName: mooctest-crowd-service
+user:
+  service:
+    baseUrl: http://111.231.143.6:8081