src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -223,4 +223,5 @@ public static final String ISP_NOT_EXIST = "ISP_NOT_EXIST"; // ISP가 존재하지 않습니다. public static final String ISP_REMOVE_NOT_SELECT = "ISP_REMOVE_NOT_SELECT"; // 삭제할 ISP가 선택되지 않았습니다. public static final String PROJECT_NOT_INCLUDE_DEPARTMENT = "PROJECT_NOT_INCLUDE_DEPARTMENT"; // 선택한 부서 중 프로젝트에 참여하고 있지 않은 부서가 있습니다. } src/main/java/kr/wisestone/owl/domain/Department.java
@@ -48,7 +48,7 @@ public void addProjectRole(ProjectRole projectRole) { if (this.projectRoleDepartments == null) { this.projectRoleDepartments = new HashSet<ProjectRoleDepartment>(); this.projectRoleDepartments = new HashSet<>(); } ProjectRoleDepartment projectRoleDepartment = new ProjectRoleDepartment(projectRole, this); src/main/java/kr/wisestone/owl/domain/ProjectRole.java
@@ -30,6 +30,9 @@ private Set<ProjectRoleUser> projectRoleUsers = new HashSet<>(); @OneToMany(mappedBy="projectRole", cascade={CascadeType.ALL}, orphanRemoval=true) private Set<ProjectRoleDepartment> projectRoleDepartments = new HashSet<>(); @OneToMany(mappedBy="projectRole", cascade={CascadeType.ALL}, orphanRemoval=true) private Set<ProjectRolePermission> projectRolePermissions = new HashSet<>(); public ProjectRole(){} @@ -80,6 +83,14 @@ this.projectRoleUsers = projectRoleUsers; } public Set<ProjectRoleDepartment> getProjectRoleDepartments() { return projectRoleDepartments; } public void setProjectRoleDepartments(Set<ProjectRoleDepartment> projectRoleDepartments) { this.projectRoleDepartments = projectRoleDepartments; } public Set<ProjectRolePermission> getProjectRolePermissions() { return projectRolePermissions; } @@ -97,6 +108,15 @@ this.projectRoleUsers.add(projectRoleUser); } public void addDepartment(Department department) { if (this.projectRoleDepartments == null) { this.projectRoleDepartments = new HashSet<>(); } ProjectRoleDepartment projectRoleDepartment = new ProjectRoleDepartment(this, department); this.projectRoleDepartments.add(projectRoleDepartment); } public void removeProjectRole(User user) { Iterator<ProjectRoleUser> iterator = this.projectRoleUsers.iterator(); src/main/java/kr/wisestone/owl/repository/ProjectRoleDepartmentRepository.java
@@ -11,7 +11,4 @@ List<ProjectRoleDepartment> findByProjectRoleId(@Param("projectRoleId") Long projectRoleId); ProjectRoleDepartment findByProjectRoleIdAndDepartmentId(@Param("projectRoleId") Long projectRoleId, @Param("departmentId") Long departmentId); //ProjectRoleUser findByProjectRoleIdAndDepartmentId(@Param("projectRoleId") Long projectRoleId, @Param("departmentId") Long departmentId); } src/main/java/kr/wisestone/owl/service/ProjectRoleService.java
@@ -1,5 +1,6 @@ package kr.wisestone.owl.service; import kr.wisestone.owl.domain.Department; import kr.wisestone.owl.domain.Project; import kr.wisestone.owl.domain.ProjectRole; import kr.wisestone.owl.domain.User; @@ -9,7 +10,8 @@ public interface ProjectRoleService extends AbstractService<ProjectRole, Long, JpaRepository<ProjectRole, Long>>{ void addDefaultProjectRole(Project project, List<User> managers, List<User> users); //void addDefaultProjectRole(Project project, List<User> managers, List<User> users); void addDefaultProjectRole(Project project, List<User> managers, List<Department> departments); ProjectRole findByProjectIdAndRoleType(Long projectId, String roleType); } src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -1142,7 +1142,7 @@ // 데이터 보정 작업 - 프로젝트에서 제외된 사용자는 담당자에서 제외 될 수 있도록 처리 if (!includeProject) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.PROJECT_NOT_INCLUDE_USER)); this.messageAccessor.getMessage(MsgConstants.PROJECT_NOT_INCLUDE_DEPARTMENT)); } } // 참여 확인된 부서로 담당부서 변경 src/main/java/kr/wisestone/owl/service/impl/ProjectRoleDepartmentServiceImpl.java
@@ -57,7 +57,7 @@ return this.projectRoleDepartmentRepository.findByProjectRoleIdAndDepartmentId(projectRoleId, departmentId); } // 프로젝트에 참여하는 사용자, 프로젝트 관리자를 파라미터에 따라 조회한다. // 프로젝트에 참여하는 부서를 파라미터에 따라 조회한다. @Override @Transactional(readOnly = true) public List<Map<String, Object>> findProjectRoleDepartment(Map<String, Object> projectRoleDepartmentMap) { src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java
@@ -26,6 +26,9 @@ private ProjectRoleUserService projectRoleUserService; @Autowired private ProjectRoleDepartmentService projectRoleDepartmentService; @Autowired private ProjectRolePermissionService projectRolePermissionService; @Override @@ -34,7 +37,7 @@ } // 기본, 관리자 프로젝트 역할을 생성한다. @Override /*@Override @Transactional public void addDefaultProjectRole(Project project, List<User> managers, List<User> users) { ProjectRole projectRole = this.addProjectRole(project, "기본 프로젝트 역할", ProjectRole.TYPE_DEFAULT, Permission.ROLE_TYPE_PROJECT_JOIN); @@ -42,7 +45,23 @@ // 프로젝트 관리자 저장 this.projectRoleAssociatedUser(managers, managerProjectRole); // 프로젝트 일반 사용자 저장 this.projectRoleAssociatedUser(users, projectRole); //this.projectRoleAssociatedUser(users, projectRole); this.projectRoleRepository.flush(); }*/ // 프로젝트 역할 생성(관리자, 담당부서) @Override @Transactional public void addDefaultProjectRole(Project project, List<User> managers, List<Department> departments) { ProjectRole projectRole = this.addProjectRole(project, "기본 프로젝트 역할", ProjectRole.TYPE_DEFAULT, Permission.ROLE_TYPE_PROJECT_JOIN); ProjectRole managerProjectRole = this.addProjectRole(project, "프로젝트 관리자 역할", ProjectRole.TYPE_MANAGER, Permission.ROLE_TYPE_PROJECT_MANAGER); // 프로젝트 관리자 저장 this.projectRoleAssociatedUser(managers, managerProjectRole); // 프로젝트 일반 사용자 저장 //this.projectRoleAssociatedUser(users, projectRole); // 프로젝트 담당 부서 저장 this.projectRoleAssociatedDepartment(departments, projectRole); this.projectRoleRepository.flush(); } @@ -64,7 +83,7 @@ } } /*// 프로젝트 역할과 부서 연결 // 프로젝트 역할과 부서 연결 private void projectRoleAssociatedDepartment(List<Department> departments, ProjectRole projectRole) { for (Department department : departments) { this.addDefaultProjectRoleAssociatedDepartment(projectRole, department); @@ -73,13 +92,13 @@ // 해당 역할과 부서를 연결시킨다. private void addDefaultProjectRoleAssociatedDepartment(ProjectRole projectRole, Department department) { ProjectRoleUser projectRoleDepartment = this.projectRoleUserService.findByProjectRoleIdAndDepartmentId(projectRole.getId(), department.getId()); ProjectRoleDepartment projectRoleDepartment = this.projectRoleDepartmentService.findByProjectRoleIdAndDepartmentId(projectRole.getId(), department.getId()); if (projectRoleDepartment == null) { // 프로젝트 관리자 - 기본 프로젝트 역할에 추가. department.addProjectRole(projectRole); } }*/ } // 프로젝트 역할을 생성한다. private ProjectRole addProjectRole(Project project, String projectRoleName, String projectRoleType, String permissionType) { src/main/java/kr/wisestone/owl/service/impl/ProjectServiceImpl.java
@@ -46,6 +46,9 @@ private UserService userService; @Autowired private DepartmentService departmentService; @Autowired private ProjectRoleService projectRoleService; @Autowired @@ -64,6 +67,9 @@ private ProjectRoleUserService projectRoleUserService; @Autowired private ProjectRoleDepartmentService projectRoleDepartmentService; @Autowired private AttachedFileService attachedFileService; @Autowired @@ -71,6 +77,9 @@ @Autowired private IssueUserService issueUserService; @Autowired private IssueDepartmentService issueDepartmentService; @Autowired private IssueNumberGeneratorService issueNumberGeneratorService; @@ -148,7 +157,8 @@ // 각 프로젝트의 이슈 번호를 자동으로 생성한다. this.issueNumberGeneratorService.generateIssueNumber(project); // 일반 사용자 및 관리자를 등록하고 사용자들에게 해당 역할을 배정한다. this.registerManagerAndUser(projectForm, project); //this.registerManagerAndUser(projectForm, project); this.registerManagerAndDepartment(projectForm, project); // 프로젝트 유형에 따른 워크플로우 생성 this.workflowStatusService.addDefaultWorkflowStatus(project, ProjectType.valueOf(projectForm.getProjectType())); @@ -174,8 +184,16 @@ sendEmails.add(user.getAccount()); } List<Department> departments = Lists.newArrayList(); // 부서 등록 for (Long departmentId : projectForm.getDepartmentIds()) { Department department = this.departmentService.getDepartment(departmentId); departments.add(department); } // 기본, 관리자 프로젝트 역할을 생성하고 사용자를 해당 역할에 배정한다. this.projectRoleService.addDefaultProjectRole(project, managers, users); //this.projectRoleService.addDefaultProjectRole(project, managers, users); this.projectRoleService.addDefaultProjectRole(project, managers, departments); // 프로젝트 참여자들에게 이메일 발송을 예약한다. Map<String, Object> projectMap = new HashMap<>(); @@ -192,6 +210,40 @@ projectMap.put("projectManagerName", stringBuilder.toString()); // 프로젝트 일반 참여 메일 발송 예약 this.systemEmailService.reservationEmail(sendEmails.toArray(new String[sendEmails.size()]), EmailType.PROJECT_DEFAULT_INCLUDE, projectMap); } private void registerManagerAndDepartment(ProjectForm projectForm, Project project) { List<User> managers = Lists.newArrayList(); // 관리자 등록 for (Long managerId : projectForm.getManagerIds()) { User user = this.userService.getUser(managerId); managers.add(user); } List<Department> departments = Lists.newArrayList(); // 부서 등록 for (Long departmentId : projectForm.getDepartmentIds()) { Department department = this.departmentService.getDepartment(departmentId); departments.add(department); } // 기본, 관리자 프로젝트 역할을 생성하고 사용자를 해당 역할에 배정한다. //this.projectRoleService.addDefaultProjectRole(project, managers, users); this.projectRoleService.addDefaultProjectRole(project, managers, departments); // 프로젝트 참여자들에게 이메일 발송을 예약한다. Map<String, Object> projectMap = new HashMap<>(); projectMap.put("workspaceName", project.getWorkspace().getName()); projectMap.put("projectName", project.getName()); projectMap.put("registerDate", DateUtil.convertDateToStr(new Date())); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(managers.get(0).getName()); stringBuilder.append("("); stringBuilder.append(CommonUtil.decryptAES128(managers.get(0).getAccount())); stringBuilder.append(")"); projectMap.put("projectManagerName", stringBuilder.toString()); } @@ -353,6 +405,10 @@ // 프로젝트에 참여하는 사용자를 셋팅한다. - 관리자 / 일반 사용자 this.setProjectUser(projectVo, true); this.setProjectUser(projectVo, false); // 프로젝트에 참여하는 부서 세팅 //this.setProjectDepartment(projectVo); // 업무공간 담당자는 모든 프로젝트를 수정/삭제할 수 있어야 한다. if (this.userWorkspaceService.checkWorkspaceManager()) { projectVo.setModifyPermissionCheck(true); @@ -401,6 +457,26 @@ } } // 담당부서를 조건에 따라 찾아준다. private void setProjectDepartment(ProjectVo projectVo) { Map<String, Object> projectRoleDepartmentMap = new HashMap<>(); projectRoleDepartmentMap.put("id", projectVo.getId()); // 부서 정보 셋팅 List<Map<String, Object>> projectRoleDepartments = this.projectRoleDepartmentService.findProjectRoleDepartment(projectRoleDepartmentMap); if (projectRoleDepartments != null && !projectRoleDepartments.isEmpty()) { List<DepartmentVo> departmentVos = Lists.newArrayList(); for (Map<String, Object> projectRoleDepartment : projectRoleDepartments) { DepartmentVo departmentVo = ConvertUtil.convertMapToClass(projectRoleDepartment, DepartmentVo.class); departmentVo.setByName(departmentVo.getDepartmentName()); departmentVos.add(departmentVo); } projectVo.setProjectDepartmentVos(departmentVos); } } // 프로젝트 상세 정보를 조회한다. @Override @@ -424,6 +500,7 @@ case "01": // 프로젝트에 참여하는 사용자, 관리자 정보를 셋팅한다. this.setProjectUser(projectVo, true); this.setProjectUser(projectVo, false); //this.setProjectDepartment(projectVo); //부서 정보 세팅 break; } } @@ -449,6 +526,8 @@ Project project = this.getProject(projectForm.getId()); // 프로젝트 참여 사용자 List<Long> existUserIds = this.getIncludeProjectUser(project); // 프로젝트 참여 부서 List<Long> existDepartmentIds = this.getIncludeProjectDepartment(project); // 워크스페이스에서 기본으로 제공되는 프로젝트에 대한 체크 this.checkDefaultProject(project, projectForm); @@ -469,9 +548,11 @@ // 해당 프로젝트에 참여하는 모든 사용자 조회 // 빠진 사람이 관리하는 이슈 전체 조회 후 데이터 삭제 List<Long> changeUserIds = this.getIncludeProjectUser(project); List<Long> changeDepartmentIds = this.getIncludeProjectDepartment(project); // 참여에서 제외된 사용자를 찾고 담당하고 있던 이슈에서 제외한다. this.checkExcludeUserAndRemoveIssueAssignee(project, existUserIds, changeUserIds); this.checkExcludeDepartmentAndRemoveIssueDepartment(project, existDepartmentIds, changeDepartmentIds); // 관리자/일반 사용자 변경 내역을 통지한다. this.notificationProjectRoleUser(changeProjectManagerNotifications, changeProjectUserNotifications, project); @@ -512,6 +593,20 @@ return Lists.newArrayList(includeUserIds); } // 프로젝트 참여 부서 private List<Long> getIncludeProjectDepartment(Project project) { Set<Long> includeDepartmentIds = new HashSet<>(); for (ProjectRole projectRole : project.getProjectRoles()) { List<ProjectRoleDepartment> projectRoleDepartments = this.projectRoleDepartmentService.findByProjectRoleId(projectRole.getId()); for (ProjectRoleDepartment projectRoleDepartment : projectRoleDepartments) { includeDepartmentIds.add(projectRoleDepartment.getDepartment().getId()); } } return Lists.newArrayList(includeDepartmentIds); } // 참여에서 제외된 사용자를 찾고 담당하고 있던 이슈에서 제외한다. private void checkExcludeUserAndRemoveIssueAssignee(Project project, List<Long> existUserIds, List<Long> changeUserIds) { List<Long> excludeUserIds = CommonUtil.searchChangeList(changeUserIds, existUserIds); @@ -521,7 +616,14 @@ } } // 참여에서 제외된 부서를 찾고 담당하고 있던 이슈에서 제외한다. private void checkExcludeDepartmentAndRemoveIssueDepartment(Project project, List<Long> existDepartmentIds, List<Long> changeDepartmentIds) { List<Long> excludeDepartmentIds = CommonUtil.searchChangeList(changeDepartmentIds, existDepartmentIds); if (excludeDepartmentIds.size() > 0) { this.issueDepartmentService.removeIssueDepartment(project.getId(), excludeDepartmentIds); } } // 기본 제공되는 프로젝트의 관리자는 워크스페이스 관리자가 포함되어 있어야 한다. private void checkDefaultProject(Project project, ProjectForm projectForm) { src/main/java/kr/wisestone/owl/vo/ProjectVo.java
@@ -1,6 +1,7 @@ package kr.wisestone.owl.vo; import com.google.common.collect.Lists; import kr.wisestone.owl.domain.Department; import kr.wisestone.owl.domain.Project; import java.util.ArrayList; @@ -25,6 +26,7 @@ private List<UserVo> projectUserVos = Lists.newArrayList(); private List<UserVo> projectManagerVos = Lists.newArrayList(); private List<ProjectVo> childProjects = Lists.newArrayList(); private List<DepartmentVo> projectDepartmentVos = Lists.newArrayList(); public ProjectVo(){} @@ -147,4 +149,12 @@ public void setDefaultYn(Boolean defaultYn) { this.defaultYn = defaultYn; } public List<DepartmentVo> getProjectDepartmentVos() { return projectDepartmentVos; } public void setProjectDepartmentVos(List<DepartmentVo> projectDepartmentVos) { this.projectDepartmentVos = projectDepartmentVos; } } src/main/java/kr/wisestone/owl/web/condition/ProjectCondition.java
@@ -25,6 +25,7 @@ private List<String> roleTypes = Lists.newArrayList(); // 프로젝트 관리자, 일반 참여자를 구분해서 가져온다. private List<Long> excludeIds = Lists.newArrayList(); private List<Long> userIds = Lists.newArrayList(); private List<Long> departmentIds = Lists.newArrayList(); public ProjectCondition(){} @@ -49,6 +50,10 @@ if (MapUtil.getLongs(conditions, "userIds") != null) { condition.setUserIds(MapUtil.getLongs(conditions, "userIds")); } if (MapUtil.getLongs(conditions, "departmentIds") != null) { condition.setDepartmentIds(MapUtil.getLongs(conditions, "departmentIds")); } return condition; @@ -165,4 +170,12 @@ public void setWorkspaceManager(Boolean workspaceManager) { this.workspaceManager = workspaceManager; } public List<Long> getDepartmentIds() { return departmentIds; } public void setDepartmentIds(List<Long> departmentIds) { this.departmentIds = departmentIds; } } src/main/java/kr/wisestone/owl/web/form/ProjectForm.java
@@ -21,6 +21,7 @@ private List<Long> managerIds = Lists.newArrayList(); private List<Long> removeIds = Lists.newArrayList(); private List<Long> userIds = Lists.newArrayList(); private List<Long> departmentIds = Lists.newArrayList(); public ProjectForm() { } @@ -34,6 +35,10 @@ if (MapUtil.getLongs(params, "userIds") != null) { form.setUserIds(MapUtil.getLongs(params, "userIds")); } if (MapUtil.getLongs(params, "departmentIds") != null) { form.setDepartmentIds(MapUtil.getLongs(params, "departmentIds")); } if (MapUtil.getLongs(params, "removeIds") != null) { @@ -154,4 +159,12 @@ public void addRemoveIds(Long removeId) { this.removeIds.add(removeId); } public List<Long> getDepartmentIds() { return departmentIds; } public void setDepartmentIds(List<Long> departmentIds) { this.departmentIds = departmentIds; } } src/main/resources/mybatis/query-template/projectRoleDepartment-template.xml
@@ -27,16 +27,7 @@ INNER JOIN project_role pr on p.id = pr.project_id INNER JOIN project_role_department prd on prd.project_role_id = pr.id INNER JOIN department d on d.id = prd.department_id WHERE 1=1 <choose> <when test="statuses.size != 0"> AND pr.role_type IN <foreach collection="statuses" item="item" index="index" separator="," open="(" close=")"> #{item} </foreach> </when> </choose> AND p.id = #{id} WHERE p.id = #{id} </select> src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
@@ -23,6 +23,7 @@ DEFAULT_PROJECT_NOT_REMOVE = \uAE30\uBCF8\uC73C\uB85C \uC81C\uACF5\uB418\uB294 \uD504\uB85C\uC81D\uD2B8\uB294 \uC0AD\uC81C\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. PROJECT_REMOVE_NOT_SELECT = \uC0AD\uC81C\uD560 \uD504\uB85C\uC81D\uD2B8\uAC00 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. PROJECT_NOT_INCLUDE_USER = \uC120\uD0DD\uD55C \uB2F4\uB2F9\uC790 \uC911 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uCC38\uC5EC\uD558\uACE0 \uC788\uC9C0 \uC54A\uC740 \uC0AC\uC6A9\uC790\uAC00 \uC788\uC2B5\uB2C8\uB2E4. PROJECT_NOT_INCLUDE_DEPARTMENT = \uC120\uD0DD\uD55C \uBD80\uC11C \uC911 \uD504\uB85C\uC81D\uD2B8\uC5D0 \uCC38\uC5EC\uD558\uACE0 \uC788\uC9C0 \uC54A\uC740 \uBD80\uC11C\uAC00 \uC788\uC2B5\uB2C8\uB2E4. PROJECT_USED_PROJECT_KEY = \uD504\uB85C\uC81D\uD2B8 \uD0A4\uAC00 \uC774\uBBF8 \uC0AC\uC6A9\uB418\uACE0 \uC788\uC2B5\uB2C8\uB2E4. PAYMENT_TYPE_NOT_EXIST = \uACB0\uC81C \uBC29\uC2DD\uC774 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4. src/main/webapp/scripts/app/project/projectAdd.controller.js
@@ -33,6 +33,7 @@ id : $rootScope.user.id }], // 관리자 users : [], // 일반 사용자 departments : [] }, userName : "", // 일반 사용자 이름 검색 projectName : "", // 상위 프로젝트 이름 검색