Bläddra i källkod

add:对项目页面进行权限控制

xuexiaobo 6 år sedan
förälder
incheckning
cb06152fe5

+ 6 - 2
site/src/main/java/com/mooctest/crowd/site/controller/CrowdProjectController.java

@@ -54,9 +54,13 @@ public class CrowdProjectController {
      * @return
      */
     @RequestMapping(value = "/api/project/{projectCode}", method = RequestMethod.GET)
-    public ProjectDetailsDTO getProject(@PathVariable("projectCode") String projectCode){
+    public ProjectDetailsDTO getProject(@PathVariable("projectCode") String projectCode, HttpSession session){
         log.info("访问Project详情,projectId:"+projectCode);
-        return projectService.getProjectDetails(projectCode);
+        Object loginUser = session.getAttribute("userId");
+        Long userId = null;
+        if (loginUser!=null)
+            userId = Long.parseLong((String)loginUser);
+        return projectService.getProjectDetails(projectCode, userId);
     }
 
     @RequestMapping(value = "/api/project", method = RequestMethod.GET)

+ 10 - 0
site/src/main/java/com/mooctest/crowd/site/data/ProjectOperationControl.java

@@ -1,9 +1,19 @@
 package com.mooctest.crowd.site.data;
 
+import lombok.Data;
+
 /**
  * @author: Diors.Po
  * @Email: 171256175@qq.com
  * @date 2019-08-23 16:04
  */
+@Data
 public class ProjectOperationControl {
+    private boolean receive = false;
+    private boolean reject = false;
+    private boolean update = false;
+    private boolean uploadReport = false;
+    private boolean createTask = false;
+    private boolean finish = false;
+    private boolean confirmFinish = false;
 }

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

@@ -1,5 +1,6 @@
 package com.mooctest.crowd.site.data.dto;
 
+import com.mooctest.crowd.site.data.ProjectOperationControl;
 import com.mooctest.crowd.site.data.vo.CrowdProjectVO;
 import com.mooctest.crowd.site.data.vo.CrowdReportVO;
 import com.mooctest.crowd.site.data.vo.CrowdTaskVO;
@@ -16,4 +17,5 @@ public class ProjectDetailsDTO {
     private CrowdProjectVO projectDetails;
     private List<CrowdTaskVO> taskList;
     private List<CrowdReportVO> reportList;
+    private ProjectOperationControl projectOperationControl;
 }

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

@@ -30,7 +30,7 @@ public interface ViewMediator {
 
     TaskSquareDTO renderTaskSquare(CrowdTestTaskCommand crowdTestTaskCommand);
 
-    ProjectDetailsDTO renderProjectDetails(CrowdTestProject project);
+    ProjectDetailsDTO renderProjectDetails(CrowdTestProject project, User user);
 
     ReportDetailsDTO renderReportDetails(CrowdTestReportCommand crowdTestReportCommand);
 

+ 49 - 1
site/src/main/java/com/mooctest/crowd/site/mediator/impl/WebMediatorImpl.java

@@ -11,6 +11,7 @@ import com.mooctest.crowd.domain.repository.CrowdTestProjectRepo;
 import com.mooctest.crowd.domain.repository.EvaluationAgencyRepo;
 import com.mooctest.crowd.domain.repository.UserRepo;
 import com.mooctest.crowd.site.command.*;
+import com.mooctest.crowd.site.data.ProjectOperationControl;
 import com.mooctest.crowd.site.data.dto.*;
 import com.mooctest.crowd.site.data.enums.ProjectType;
 import com.mooctest.crowd.site.data.vo.*;
@@ -183,7 +184,7 @@ public class WebMediatorImpl implements ViewMediator {
     }
 
     @Override
-    public ProjectDetailsDTO renderProjectDetails(CrowdTestProject project) {
+    public ProjectDetailsDTO renderProjectDetails(CrowdTestProject project, User user) {
         ProjectDetailsDTO projectDetailsDTO = new ProjectDetailsDTO();
         List<CrowdTaskVO> taskVOList = project.getCrowdTestTaskList().stream().map(crowdTestTask -> {
             CrowdTaskVO crowdTaskVO = new CrowdTaskVO(crowdTestTask);
@@ -206,6 +207,7 @@ public class WebMediatorImpl implements ViewMediator {
         projectDetailsDTO.setProjectDetails(projectVO);
         projectDetailsDTO.setTaskList(taskVOList);
         projectDetailsDTO.setReportList(reportVOList);
+        projectDetailsDTO.setProjectOperationControl(initProjectPermission(project, user));
         return projectDetailsDTO;
     }
 
@@ -253,4 +255,50 @@ public class WebMediatorImpl implements ViewMediator {
         });
         return agencyList;
     }
+
+    private ProjectOperationControl initProjectPermission(CrowdTestProject project, User user){
+        ProjectOperationControl operationControl = new ProjectOperationControl();
+        if (user==null)
+            return operationControl;
+        //需求提出者和系统管理员视角
+        if (project.getUserId().equals(user.getId())||user.getRoleList().stream().anyMatch(role -> role.getName().equals("SystemAdministrator"))){
+            if (project.getStatus() < CrowdTestProjectStatus.HAS_RECEIVED){
+                operationControl.setUpdate(true);
+            } else if (project.getStatus() == CrowdTestProjectStatus.HAS_COMMITED){
+                operationControl.setConfirmFinish(true);
+            }
+        }
+        //区域管理员视角
+        if (user.getRegionalManager()!=null){
+            if ((project.getProjectDistributionTypeId() == 0 && project.getRegionalManagerId().equals(user.getId()))
+                    || (project.getProjectDistributionTypeId()>0 && project.getStatus()>=CrowdTestProjectStatus.HAS_RECEIVED && project.getRegionalManagerId().equals(user.getId()))){
+                if (project.getStatus() == CrowdTestProjectStatus.HAS_RELEASED){
+                    operationControl.setReceive(true);
+                    operationControl.setReject(true);
+                } else if (project.getStatus() == CrowdTestProjectStatus.HAS_RECEIVED){
+                    operationControl.setCreateTask(true);
+                    if (project.getCrowdTestTaskList()
+                            .stream().allMatch(task -> task.getStatus()==CrowdTestTaskStatus.HAS_REJECTED||task.getStatus()==CrowdTestTaskStatus.HAS_FINISHED)) {
+                        operationControl.setUploadReport(true);
+                    }
+                    if (project.getCrowdTestReportForProject()!=null){
+                        operationControl.setFinish(true);
+                    }
+                } else if (project.getStatus() == CrowdTestProjectStatus.HAS_COMMITED){
+                    operationControl.setCreateTask(true);
+                }
+            } //下面两种情况为非定向未被接收
+            else if (project.getProjectDistributionTypeId()==1){
+                if (project.getStatus()==CrowdTestProjectStatus.HAS_RELEASED
+                        && user.getRegionalManager().getRegionalList().stream().anyMatch(regional -> regional.getName().equals(project.getDistributionCity()))){
+                    operationControl.setReceive(true);
+                }
+            } else if (project.getProjectDistributionTypeId() == 2){
+                if (project.getStatus() == CrowdTestProjectStatus.HAS_RELEASED){
+                    operationControl.setReceive(true);
+                }
+            }
+        }
+        return operationControl;
+    }
 }

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

@@ -15,7 +15,7 @@ import java.util.List;
  * @date 2019-07-29 10:49
  */
 public interface CrowdProjectService {
-    ProjectDetailsDTO getProjectDetails(String projectCode);
+    ProjectDetailsDTO getProjectDetails(String projectCode, Long userId);
 
     ProjectDetailsDTO createCrowdProject(CrowdTestProjectCommand command);
 

+ 7 - 5
site/src/main/java/com/mooctest/crowd/site/service/impl/CrowdProjectServiceImpl.java

@@ -57,8 +57,10 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
 
 
     @Override
-    public ProjectDetailsDTO getProjectDetails(String projectCode) {
-        return viewMediator.renderProjectDetails(projectRepo.getByProjectCode(projectCode));
+    public ProjectDetailsDTO getProjectDetails(String projectCode, Long userId) {
+        if (userId==null)
+            return viewMediator.renderProjectDetails(projectRepo.getByProjectCode(projectCode), null);
+        return viewMediator.renderProjectDetails(projectRepo.getByProjectCode(projectCode), userRepo.getByID(userId));
     }
 
     @Override
@@ -83,7 +85,7 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
             throw new BaseException("UserId不一致, newUserId: "+crowdTestProjectCommand.getUserId()+", oldUserId: "+project.getUserId());
         //todo 后面需要加入是否有权限进行更新
         projectRepo.saveCrowdTestProject(operationMediator.updateProject(project, crowdTestProjectCommand));
-        return getProjectDetails(projectCode);
+        return getProjectDetails(projectCode, crowdTestProjectCommand.getUserId());
     }
 
     @Override
@@ -120,7 +122,7 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
         project.setCrowdTestTaskList(tasks);
         projectRepo.saveCrowdTestProject(project);
         log.info(project.toString());
-        return getProjectDetails(project.getCode());
+        return getProjectDetails(project.getCode(), command.getUserId());
     }
 
     @Override
@@ -128,7 +130,7 @@ public class CrowdProjectServiceImpl implements CrowdProjectService {
         List<ProjectDetailsDTO> dtos = new ArrayList<>();
         projects.forEach(project -> {
             projectRepo.saveCrowdTestProject(project);
-            dtos.add(getProjectDetails(project.getCode()));
+            dtos.add(getProjectDetails(project.getCode(), project.getUserId()));
         });
         return dtos;
     }

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

@@ -67,9 +67,9 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
             throw new CrowdTestTaskNotExistException();
         CrowdTaskVO taskVO = new CrowdTaskVO(task.get());
         if (userId == null)
-            taskDetailsDTO.setTaskOperationControl(this.initPermission(project, task.get(), null));
+            taskDetailsDTO.setTaskOperationControl(this.initTaskPermission(project, task.get(), null));
         else
-            taskDetailsDTO.setTaskOperationControl(this.initPermission(project, task.get(), userRepo.getByID(userId)));
+            taskDetailsDTO.setTaskOperationControl(this.initTaskPermission(project, task.get(), userRepo.getByID(userId)));
         EvaluationAgencyPO agencyPO = agencyDao.findByUserId(task.get().getEvaluationAgencyId());
         taskVO.setInstitution(agencyPO==null?"该机构已注销":agencyPO.getEvaluationAgencyName());
         taskDetailsDTO.setCrowdTaskVO(taskVO);
@@ -135,38 +135,37 @@ public class CrowdTaskServiceImpl implements CrowdTaskService {
         return getTaskDetails(projectCode, taskCode, userId);
     }
 
-    private TaskOperationControl initPermission(CrowdTestProject project,CrowdTestTask task, User user){
+    private TaskOperationControl initTaskPermission(CrowdTestProject project,CrowdTestTask task, User user){
         TaskOperationControl taskOperationControl = new TaskOperationControl();
-        log.info("userInfo"+user.toString());
         if (user==null)
             return taskOperationControl;
+        //区域管理员或系统管理员视角
         if (user.getRoleList().stream().anyMatch(role -> role.getName().equals("SystemAdministrator"))
-                ||(user.getRoleList().stream().anyMatch(role -> role.getName().equals("RegionalManager"))&&user.getId().equals(project.getRegionalManagerId()))){
+                ||(user.getRegionalManager()!=null&&user.getId().equals(project.getRegionalManagerId()))){
             if (task.getStatus()<CrowdTestTaskStatus.HAS_RECEIVED){
                 taskOperationControl.setUpdate(true);
             }else if (task.getStatus()==CrowdTestTaskStatus.HAS_COMMITED){
                 taskOperationControl.setConfirmFinish(true);
             }
         }
+        //评测机构视角
         if (user.getEvaluationAgency()!=null && task.getStatus()!=CrowdTestTaskStatus.HAS_REJECTED){
             if ((task.getDistributionType()==0 && task.getEvaluationAgencyId().equals(user.getId()))
-                    ||(task.getDistributionType()==2 && task.getStatus()>CrowdTestTaskStatus.HAS_RELEASED && task.getEvaluationAgencyId().equals(user.getId()))){
-                if (task.getStatus()<CrowdTestTaskStatus.HAS_RECEIVED){
+                    ||(task.getDistributionType()==2 && task.getStatus()>=CrowdTestTaskStatus.HAS_RECEIVED && task.getEvaluationAgencyId().equals(user.getId()))){
+                if (task.getStatus()==CrowdTestTaskStatus.HAS_RELEASED){
                     taskOperationControl.setReceive(true);
                     if (task.getDistributionType()==0)
                         taskOperationControl.setReject(true);
                 } else if (task.getStatus() == CrowdTestTaskStatus.HAS_RECEIVED){
                     taskOperationControl.setUploadReport(true);
-                }
-                else if (task.getCrowdTestReportList().size()>0){
-                    taskOperationControl.setFinish(true);
-                    taskOperationControl.setUploadReport(true);
-                }
-                else if (task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED){
+                    if (task.getCrowdTestReportList().size()>0){
+                        taskOperationControl.setFinish(true);
+                    }
+                } else if (task.getStatus() == CrowdTestTaskStatus.HAS_COMMITED){
                     taskOperationControl.setUploadReport(true);
                 }
             } else if (task.getDistributionType()==2){
-                if (task.getStatus()<CrowdTestTaskStatus.HAS_RECEIVED){
+                if (task.getStatus()==CrowdTestTaskStatus.HAS_RELEASED){
                     taskOperationControl.setReceive(true);
                 }
             }