From dc873bdc1e57945d6cb6eadd41ef38cc2a4b35d3 Mon Sep 17 00:00:00 2001 From: 이민희 <mhlee@maprex.co.kr> Date: 월, 15 11월 2021 17:21:18 +0900 Subject: [PATCH] 담당자 -> 담당부서 변경 * db날리고 실행 --- src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java | 195 +++++++++++++++++------ src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java | 18 ++ src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java | 13 + src/main/java/kr/wisestone/owl/domain/Department.java | 19 + src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java | 4 src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java | 14 + src/main/java/kr/wisestone/owl/service/impl/IssueUserServiceImpl.java | 77 +++++++++ src/main/java/kr/wisestone/owl/service/IssueUserService.java | 9 + src/main/resources/migration/V1_1__Initial_Setup.sql | 6 src/main/java/kr/wisestone/owl/web/controller/IssueUserController.java | 3 src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java | 2 src/main/java/kr/wisestone/owl/service/IssueService.java | 4 src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java | 17 ++ src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java | 7 src/main/java/kr/wisestone/owl/web/form/IssueForm.java | 14 + src/main/resources/mybatis/query-template/issueUser-template.xml | 36 +++ src/main/webapp/WEB-INF/i18n/code_ko_KR.properties | 1 17 files changed, 368 insertions(+), 71 deletions(-) diff --git a/src/main/java/kr/wisestone/owl/domain/Department.java b/src/main/java/kr/wisestone/owl/domain/Department.java index 8537951..4a09dbf 100644 --- a/src/main/java/kr/wisestone/owl/domain/Department.java +++ b/src/main/java/kr/wisestone/owl/domain/Department.java @@ -1,10 +1,9 @@ package kr.wisestone.owl.domain; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; +import javax.persistence.*; import java.io.Serializable; +import java.util.HashSet; +import java.util.Set; @Entity public class Department extends BaseEntity implements Serializable { @@ -16,6 +15,9 @@ private Long id; private String departmentName; private String departmentDescription; + + @OneToMany(mappedBy = "department", cascade = {CascadeType.ALL}, orphanRemoval = true) + private Set<ProjectRoleUser> projectRoleDepartments = new HashSet<>(); public Department() { } @@ -43,4 +45,13 @@ public void setDepartmentDescription(String departmentDescription) { this.departmentDescription = departmentDescription; } + + /*public void addProjectRole(ProjectRole projectRole) { + if (this.projectRoleDepartments == null) { + this.projectRoleDepartments = new HashSet<>(); + } + ProjectRoleUser projectRoleUser = new ProjectRoleUser(projectRole, this); + + this.projectRoleDepartments.add(projectRoleUser); + }*/ } diff --git a/src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java b/src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java index ab69468..a6035d3 100644 --- a/src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java +++ b/src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java @@ -22,6 +22,10 @@ @JoinColumn(name="user_id") private User user; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="department_id") + private Department department; + public ProjectRoleUser() { } @@ -29,6 +33,12 @@ this.projectRole = projectRole; this.user = user; } + + //遺��꽌濡� 蹂�寃� + /*public ProjectRoleUser(ProjectRole projectRole, Department department) { + this.projectRole = projectRole; + this.department = department; + }*/ public Long getId() { return id; @@ -53,4 +63,12 @@ public void setUser(User user) { this.user = user; } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } } diff --git a/src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java b/src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java index 59b0066..703c1dd 100644 --- a/src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java +++ b/src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java @@ -10,12 +10,22 @@ */ @Repository public interface IssueUserMapper { + void insertIssueUser(List<Map<String, Long>> issueRoleUserMaps); - + + //�떞�떦�옄 void deleteIssueUserByIssueIdAndMultiUserId(Map<String, Object> removeIssueAssigneeMap); void deleteIssueUserByUserIdAndMultiIssueId(Map<String, Object> removeIssueAssigneeMap); - + List<Map<String, Object>> findByUserIdAndProjectId(Map<String, Object> issueUserMap); + //�떞�떦遺��꽌 + void deleteIssueUserByIssueIdAndMultiDepartmentId(Map<String, Object> removeIssueAssigneeMap); + + void deleteIssueUserByDepartmentIdAndMultiIssueId(Map<String, Object> removeIssueAssigneeMap); + + List<Map<String, Object>> findByDepartmentIdAndProjectId(Map<String, Object> issueUserMap); + + } diff --git a/src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java b/src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java index 661e098..acec2ae 100644 --- a/src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java +++ b/src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java @@ -11,4 +11,6 @@ ProjectRoleUser findByProjectRoleIdAndUserId(@Param("projectRoleId") Long projectRoleId, @Param("userId") Long userId); + ProjectRoleUser findByProjectRoleIdAndDepartmentId(@Param("projectRoleId") Long projectRoleId, @Param("departmentId") Long departmentId); + } diff --git a/src/main/java/kr/wisestone/owl/service/IssueService.java b/src/main/java/kr/wisestone/owl/service/IssueService.java index 59e6ba4..bbccd25 100644 --- a/src/main/java/kr/wisestone/owl/service/IssueService.java +++ b/src/main/java/kr/wisestone/owl/service/IssueService.java @@ -51,7 +51,9 @@ void modifyMultiIssueStatus(IssueForm issueForm); - void modifyIssueUser(IssueForm issueForm); + //void modifyIssueUser(IssueForm issueForm); + + void modifyIssueDepartment(IssueForm issueForm); ModelAndView downloadExcelTemplate(HttpServletRequest request, Model model); diff --git a/src/main/java/kr/wisestone/owl/service/IssueUserService.java b/src/main/java/kr/wisestone/owl/service/IssueUserService.java index ea6f8d0..7e671e0 100644 --- a/src/main/java/kr/wisestone/owl/service/IssueUserService.java +++ b/src/main/java/kr/wisestone/owl/service/IssueUserService.java @@ -10,11 +10,20 @@ import java.util.Map; public interface IssueUserService extends AbstractService<IssueUser, Long, JpaRepository<IssueUser, Long>>{ + + //�떞�떦�옄 void modifyIssueUser(Issue issue, Workspace workspace, List<Long> userIds); void insertIssueUser(List<Map<String, Long>> issueAssigneeMaps); void removeIssueUser(Long projectId, List<Long> excludeUserIds); + //�떞�떦遺��꽌 + void modifyIssueDepartment(Issue issue, Workspace workspace, List<Long> departmentIds); + + void insertIssueDepartment(List<Map<String, Long>> issueAssigneeMaps); + + void removeIssueDepartment(Long projectId, List<Long> excludeUserIds); + List<IssueUser> find(Issue issue); } diff --git a/src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java b/src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java index 7c58a23..521b8e3 100644 --- a/src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java +++ b/src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java @@ -12,7 +12,9 @@ public interface ProjectRoleUserService extends AbstractService<ProjectRoleUser, Long, JpaRepository<ProjectRoleUser, Long>>{ List<ProjectRoleUser> findByProjectRoleId(Long projectRoleId); - ProjectRoleUser findByProjectRoleIdAndUserId(Long projectRoleId, Long userId); + ProjectRoleUser findByProjectRoleIdAndUserId(Long projectRoleId, Long userId); //�떞�떦�옄 + + ProjectRoleUser findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId); //�떞�떦遺��꽌 void withDrawWorkspaceManagerModifyProjectRole(Workspace workspace, User user); diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java index 797434f..9b1895f 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java @@ -187,7 +187,9 @@ issue.setReverseIndex(issue.getId() * -1); // 荑쇰━ �냽�룄 媛쒖꽑�쓣 �쐞�빐 由щ쾭�뒪 �씤�뜳�뒪 �깮�꽦 // �떞�떦�옄 吏��젙 - this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds()); + //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds()); + // �떞�떦遺��꽌 吏��젙 + this.issueUserService.modifyIssueDepartment(issue, project.getWorkspace(), issueForm.getDepartmentIds()); // multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎. List<Map<String, Object>> convertFileMaps = this.convertMultipartFileToFile(multipartFiles); @@ -242,13 +244,14 @@ issueMap.put("issueTypeName", issue.getIssueType().getName()); issueMap.put("issueStatusName", issue.getIssueStatus().getName()); - // �떞�떦�옄 + // �떞�떦遺��꽌 StringBuilder assigneeBuilder = new StringBuilder(); for (IssueUser issueUser : issue.getIssueUsers()) { - assigneeBuilder.append(issueUser.getUser().getName()); - assigneeBuilder.append("("); + //assigneeBuilder.append(issueUser.getUser().getName()); + assigneeBuilder.append(issueUser.getDepartment().getDepartmentName()); + /*assigneeBuilder.append("("); assigneeBuilder.append(CommonUtil.decryptAES128(issueUser.getUser().getAccount())); - assigneeBuilder.append(")"); + assigneeBuilder.append(")");*/ assigneeBuilder.append("\n"); } @@ -514,7 +517,8 @@ } // �씠�뒋 �궗�슜�옄 �젙蹂� 異붽� - this.setIssueUserList(issueVos, issueCondition); + //this.setIssueUserList(issueVos, issueCondition); + this.setIssueDepartmentList(issueVos, issueCondition); // �벑濡앹옄 �젙蹂� 異붽� this.setRegister(issueVos); // �떞�떦�옄 �젙蹂� �뀑�똿 @@ -656,8 +660,8 @@ return true; } - // �씠�뒋 �떞�떦�옄 �젙蹂대�� �뀑�똿�븳�떎. - private void setIssueUserList(List<IssueVo> issueVos, IssueCondition issueCondition) { + // �씠�뒋 �떞�떦�옄 �젙蹂대�� �뀑�똿�븳�떎. => �떞�떦遺��꽌 + private void setIssueDepartmentList(List<IssueVo> issueVos, IssueCondition issueCondition) { if (issueVos.size() < 1) { return; } @@ -665,26 +669,30 @@ List<Map<String, Object>> issueUsers = this.issueMapper.findIssueUser(issueCondition); Map<String, Object> issueConverterUsers = new HashMap<>(); - // �씠�뒋�뿉 �빐�떦�븯�뒗 �씠�뒋 �떞�떦�옄 �젙蹂� �뀑�똿 + // �씠�뒋�뿉 �빐�떦�븯�뒗 �씠�뒋 �떞�떦遺��꽌 �젙蹂� �뀑�똿 for (Map<String, Object> issueUser : issueUsers) { String issueId = MapUtil.getString(issueUser, "issueId"); if (MapUtil.getObject(issueConverterUsers, issueId) != null) { - List<UserVo> users = (List) MapUtil.getObject(issueConverterUsers, issueId); - users.add(new UserVo(MapUtil.getLong(issueUser, "id"), MapUtil.getString(issueUser, "name"), CommonUtil.decryptAES128(MapUtil.getString(issueUser, "account")), MapUtil.getString(issueUser, "profile"))); + List<DepartmentVo> departments = (List) MapUtil.getObject(issueConverterUsers, issueId); + departments.add(new DepartmentVo(MapUtil.getLong(issueUser, "id"), MapUtil.getString(issueUser, "departmentName"), MapUtil.getString(issueUser, "departmentDescription"))); + //List<UserVo> users = (List) MapUtil.getObject(issueConverterUsers, issueId); + //users.add(new UserVo(MapUtil.getLong(issueUser, "id"), MapUtil.getString(issueUser, "name"), CommonUtil.decryptAES128(MapUtil.getString(issueUser, "account")), MapUtil.getString(issueUser, "profile"))); } else { - List<UserVo> users = Lists.newArrayList(new UserVo(MapUtil.getLong(issueUser, "id"), MapUtil.getString(issueUser, "name"), CommonUtil.decryptAES128(MapUtil.getString(issueUser, "account")), + List<DepartmentVo> departments = Lists.newArrayList(new DepartmentVo(MapUtil.getLong(issueUser, "id"), MapUtil.getString(issueUser, "departmentName"), MapUtil.getString(issueUser, "departmentDescription"))); + issueConverterUsers.put(issueId, departments); + /*List<UserVo> users = Lists.newArrayList(new UserVo(MapUtil.getLong(issueUser, "id"), MapUtil.getString(issueUser, "name"), CommonUtil.decryptAES128(MapUtil.getString(issueUser, "account")), MapUtil.getString(issueUser, "profile"))); - issueConverterUsers.put(issueId, users); + issueConverterUsers.put(issueId, users);*/ } } - // �씠�뒋Vo�뿉 �떞�떦�옄 �젙蹂대�� �뀑�똿 + // �씠�뒋Vo�뿉 �떞�떦遺��꽌 �젙蹂대�� �뀑�똿 for (IssueVo issueVo : issueVos) { if (MapUtil.getObject(issueConverterUsers, String.valueOf(issueVo.getId())) != null) { - List<UserVo> userVos = (List) MapUtil.getObject(issueConverterUsers, String.valueOf(issueVo.getId())); + List<DepartmentVo> departmentVos = (List) MapUtil.getObject(issueConverterUsers, String.valueOf(issueVo.getId())); - issueVo.setUserVos(userVos); + issueVo.setDepartmentVos(departmentVos); } // �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤 @@ -705,7 +713,7 @@ issueVo = ConvertUtil.copyProperties(issue, IssueVo.class); switch (issueCondition.getDeep()) { - case "01": // �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭, �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� �뀑�똿�븳�떎. + case "01": // �봽濡쒖젥�듃, �씠�뒋 �쑀�삎, �씠�뒋 �긽�깭, �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦遺��꽌, 泥⑤��뙆�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� �뀑�똿�븳�떎. issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class)); issueVo.setIssueTypeVo(ConvertUtil.copyProperties(issue.getIssueType(), IssueTypeVo.class)); issueVo.setIssueStatusVo(ConvertUtil.copyProperties(issue.getIssueStatus(), IssueStatusVo.class)); @@ -713,7 +721,8 @@ issueVo.setSeverityVo(ConvertUtil.copyProperties(issue.getSeverity(), SeverityVo.class)); this.setRegister(issue, issueVo); // �벑濡앹옄 �젙蹂� �뀑�똿 - this.setIssueUser(issue, issueVo); // �떞�떦�옄 �젙蹂� �뀑�똿 + //this.setIssueUser(issue, issueVo); // �떞�떦�옄 �젙蹂� �뀑�똿 + this.setIssueDepartment(issue, issueVo); // �떞�떦遺��꽌 �젙蹂� �뀑�똿 this.setAttachedFiles(issue, issueVo); // 泥⑤� �뙆�씪 �젙蹂� �뀑�똿 this.setIssueCustomFields(issue, issueVo); // �궗�슜�옄 �젙�쓽 �븘�뱶 媛� �젙蹂� �뀑�똿 this.setRelationIssue(issue, issueVo); //�뿰愿� �씪媛� �뀑�똿 @@ -743,7 +752,7 @@ issueVo.setPriorityVo(ConvertUtil.copyProperties(issue.getPriority(), PriorityVo.class)); issueVo.setSeverityVo(ConvertUtil.copyProperties(issue.getSeverity(), SeverityVo.class)); this.setRegister(issue, issueVo); // �벑濡앹옄 �젙蹂� �뀑�똿 - this.setIssueUser(issue, issueVo); // �떞�떦�옄 �젙蹂� �뀑�똿 + //this.setIssueUser(issue, issueVo); // �떞�떦�옄 �젙蹂� �뀑�똿 this.setIssueDepartment(issue, issueVo); // �떞�떦遺��꽌 �젙蹂� �뀑�똿 this.setAttachedFiles(issue, issueVo); // 泥⑤� �뙆�씪 �젙蹂� �뀑�똿 this.setIssueCustomFields(issue, issueVo); // �궗�슜�옄 �젙�쓽 �븘�뱶 媛� �젙蹂� �뀑�똿 @@ -796,7 +805,7 @@ } // �씠�뒋 �떞�떦�옄 �젙蹂대�� �뀑�똿�븳�떎. - private void setIssueUser(Issue issue, IssueVo issueVo) { + /*private void setIssueUser(Issue issue, IssueVo issueVo) { List<UserVo> userVos = Lists.newArrayList(); for (IssueUser issueUser : issue.getIssueUsers()) { @@ -829,7 +838,7 @@ } issueVo.setUserVos(userVos); - } + }*/ // �씠�뒋 �떞�떦遺��꽌 �젙蹂대�� �뀑�똿�븳�떎. private void setIssueDepartment(Issue issue, IssueVo issueVo) { @@ -888,7 +897,7 @@ // �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎. this.workspaceService.checkUseWorkspace(); // �씠�뒋 �닔�젙 沅뚰븳 泥댄겕 - this.verifyIssueModifyPermission(issueForm.getId()); + //this.verifyIssueModifyPermission(issueForm.getId()); // �봽濡쒖젥�듃 �쑀�슚�꽦 泥댄겕 Project project = this.projectService.getProject(issueForm.getProjectId()); // �씠�뒋 �긽�깭 �쑀�슚�꽦 泥댄겕 @@ -904,7 +913,7 @@ // �궇吏� �쑀�슚�꽦 泥댄겕 this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate()); - // �떞�떦�옄 �쑀�슚�꽦 泥댄겕 + // �떞�떦�옄 �쑀�슚�꽦 泥댄겕 => �떞�떦遺��꽌濡� 蹂�寃� this.verifyIssueAssignee(project, issueForm); Issue issue = this.getIssue(issueForm.getId()); @@ -933,8 +942,9 @@ issue.setCompleteDate(issueForm.getCompleteDate()); this.issueRepository.saveAndFlush(issue); - // �떞�떦�옄 吏��젙 - this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds()); + // �떞�떦遺��꽌 吏��젙 + //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds()); + this.issueUserService.modifyIssueDepartment(issue, project.getWorkspace(), issueForm.getDepartmentIds()); // multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎. List<Map<String, Object>> convertFileMaps = this.convertMultipartFileToFile(multipartFiles); @@ -1007,7 +1017,36 @@ return false; } - // �씠�뒋 �떞�떦�옄濡� 吏��젙�맆 �궗�슜�옄媛� �빐�떦 �봽濡쒖젥�듃�뿉 李몄뿬 �븯怨� �엳�뒗 �궗�슜�옄 �씤吏� �솗�씤 + // �씠�뒋 �떞�떦遺��꽌濡� 吏��젙�맆 遺��꽌媛� �빐�떦 �봽濡쒖젥�듃�뿉 李몄뿬 �븯怨� �엳�뒗 遺��꽌�씤吏� �솗�씤 + private void verifyIssueAssignee(Project project, IssueForm issueForm) { + if (issueForm.getDepartmentIds().size() > 0) { + List<Long> trustDepartmentIds = Lists.newArrayList(); // 李몄뿬 �솗�씤�맂 遺��꽌 + + for (Long departmentId : issueForm.getDepartmentIds()) { + boolean includeProject = false; + + for (ProjectRole projectRole : project.getProjectRoles()) { + ProjectRoleUser projectRoleUser = this.projectRoleUserService.findByProjectRoleIdAndDepartmentId(projectRole.getId(), departmentId); + + if (projectRoleUser != null) { + includeProject = true; + trustDepartmentIds.add(departmentId); + break; + } + } + + // �뜲�씠�꽣 蹂댁젙 �옉�뾽 - �봽濡쒖젥�듃�뿉�꽌 �젣�쇅�맂 �궗�슜�옄�뒗 �떞�떦�옄�뿉�꽌 �젣�쇅 �맆 �닔 �엳�룄濡� 泥섎━ + /*if (!includeProject) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.PROJECT_NOT_INCLUDE_USER)); + }*/ + } + // 李몄뿬 �솗�씤�맂 遺��꽌濡� �떞�떦遺��꽌 蹂�寃� + issueForm.setDepartmentIds(trustDepartmentIds); + } + } + + /*// �씠�뒋 �떞�떦�옄濡� 吏��젙�맆 �궗�슜�옄媛� �빐�떦 �봽濡쒖젥�듃�뿉 李몄뿬 �븯怨� �엳�뒗 �궗�슜�옄 �씤吏� �솗�씤 private void verifyIssueAssignee(Project project, IssueForm issueForm) { if (issueForm.getUserIds().size() > 0) { List<Long> trustUserIds = Lists.newArrayList(); // 李몄뿬 �솗�씤�맂 �궗�슜�옄 @@ -1026,17 +1065,17 @@ } // �뜲�씠�꽣 蹂댁젙 �옉�뾽 - �봽濡쒖젥�듃�뿉�꽌 �젣�쇅�맂 �궗�슜�옄�뒗 �떞�떦�옄�뿉�꽌 �젣�쇅 �맆 �닔 �엳�룄濡� 泥섎━ - /*if (!includeProject) { + *//*if (!includeProject) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.PROJECT_NOT_INCLUDE_USER)); - }*/ + }*//* } // 李몄뿬 �솗�씤�맂 �궗�슜�옄濡� �떞�떦�옄 蹂�寃� issueForm.setUserIds(trustUserIds); } - } + }*/ - // �씠�뒋 �닔�젙 沅뚰븳 泥댄겕 + /*// �씠�뒋 �닔�젙 沅뚰븳 泥댄겕 private void verifyIssueModifyPermission(Long issueId) { Issue issue = this.getIssue(issueId); @@ -1057,7 +1096,7 @@ } return userVos; - } + }*/ // �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤 private boolean checkHasPermission(IssueVo issueVo, List<UserVo> issueUserVos) { @@ -1069,8 +1108,8 @@ hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.PROJECT_MANAGER, issueVo, null); // �씠�뒋 �벑濡앹옄�씪 寃쎌슦 �닔�젙 沅뚰븳�쓣 媛뽯뒗�떎. hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.REGISTER, issueVo, null); - // �씠�뒋 �떞�떦�옄�씪 寃쎌슦 �닔�젙 沅뚰븳�쓣 媛뽯뒗�떎. - hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ASSIGNEE, issueVo, issueUserVos); + // �씠�뒋 �떞�떦�옄�씪 寃쎌슦 �닔�젙 沅뚰븳�쓣 媛뽯뒗�떎. => �떞�떦遺��꽌濡� �닔�젙 - 泥댄겕 + //hasPermission = this.checkIssueModifyPermission(hasPermission, Issue.ASSIGNEE, issueVo, issueUserVos); // �떞�떦�옄媛� �뾾�쑝硫� 紐⑤뱺 �궗�슜�옄媛� �닔�젙 沅뚰븳�쓣 媛뽯뒗�떎. return hasPermission; @@ -1102,13 +1141,13 @@ break; } - // �씠�뒋 �떞�떦�옄 �뿬遺� �솗�씤 - for (UserVo issueUserVo : issueUserVos) { + // �씠�뒋 �떞�떦�옄 �뿬遺� �솗�씤 => �떞�떦遺��꽌濡� �닔�젙 - 泥댄겕 + /*for (UserVo issueUserVo : issueUserVos) { if (issueUserVo.getId().equals(this.webAppUtil.getLoginId())) { hasPermission = true; break; } - } + }*/ break; } @@ -1126,7 +1165,7 @@ // 蹂�寃� �씠�젰 �젙蹂� 異붿텧 StringBuilder detectIssueChange = new StringBuilder(); // �씠�뒋 �닔�젙 沅뚰븳 泥댄겕 - this.verifyIssueModifyPermission(issueForm.getId()); + //this.verifyIssueModifyPermission(issueForm.getId()); Issue issue = this.getIssue(issueForm.getId()); IssueStatus issueStatus = this.issueStatusService.getIssueStatus(issueForm.getIssueStatusId()); @@ -1164,7 +1203,7 @@ } // �씠�뒋 �떞�떦�옄 蹂�寃� - @Override + /*@Override @Transactional public void modifyIssueUser(IssueForm issueForm) { // �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎. @@ -1179,7 +1218,43 @@ // 蹂�寃� �씠�젰 �젙蹂� 異붿텧 this.issueHistoryService.detectIssueManager(issue, issueForm, detectIssueChange); - this.issueUserService.modifyIssueUser(issue, issue.getProject().getWorkspace(), issueForm.getUserIds()); + this.issueUserService.modifyIssueUser(issue, issue.getProject().getWorkspace(), issueForm.getDepartmentIds()); //getUserIds -> getDepartmentIds + this.issueRepository.saveAndFlush(issue); + + // �씠�뒋 �씠�젰 �벑濡� + if (!StringUtils.isEmpty(detectIssueChange.toString())) { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("<ul class=\"activity-list\">"); + stringBuilder.append(detectIssueChange.toString()); + stringBuilder.append("</ul>"); + + this.issueHistoryService.addIssueHistory(issue, IssueHistoryType.MODIFY, stringBuilder.toString()); + } + + // �씠�뒋 踰꾩쟾 �깮�꽦 + this.issueVersionService.addIssueVersion(issue); + + // �궗�슜�옄 �떆�뒪�뀥 湲곕뒫 �궗�슜 �젙蹂� �닔吏� + log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_USER_CHANGE)); + }*/ + + @Override + @Transactional + public void modifyIssueDepartment(IssueForm issueForm) { + // �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎. + this.workspaceService.checkUseWorkspace(); + // 蹂�寃� �씠�젰 �젙蹂� 異붿텧 + StringBuilder detectIssueChange = new StringBuilder(); + // �씠�뒋 �닔�젙 沅뚰븳 泥댄겕 + //this.verifyIssueModifyPermission(issueForm.getId()); + Issue issue = this.getIssue(issueForm.getId()); + issue.setProject(this.projectService.getProject(issueForm.getProjectId())); + + // 蹂�寃� �씠�젰 �젙蹂� 異붿텧 + this.issueHistoryService.detectIssueManager(issue, issueForm, detectIssueChange); + + //this.issueUserService.modifyIssueUser(issue, issue.getProject().getWorkspace(), issueForm.getUserIds()); + this.issueUserService.modifyIssueDepartment(issue, issue.getProject().getWorkspace(), issueForm.getDepartmentIds()); this.issueRepository.saveAndFlush(issue); // �씠�뒋 �씠�젰 �벑濡� @@ -1229,7 +1304,7 @@ private Issue issueRemoves(Long issueId) { Issue issue = this.getIssue(issueId); // �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤 - this.verifyIssueModifyPermission(issueId); + //this.verifyIssueModifyPermission(issueId); // �씠�뒋 泥⑤� �뙆�씪�쓣 �궘�젣�븳�떎. if (issue.getAttachedFiles().size() > 0) { @@ -1366,7 +1441,7 @@ excelInfo.addAttrInfos(new ExportExcelAttrVo("title", this.messageAccessor.message("common.issueTitle"), 40, ExportExcelAttrVo.ALIGN_LEFT)); // �씠�뒋 �젣紐� excelInfo.addAttrInfos(new ExportExcelAttrVo("description", this.messageAccessor.message("common.content"), 60, ExportExcelAttrVo.ALIGN_LEFT)); // �궡�슜 excelInfo.addAttrInfos(new ExportExcelAttrVo("issueTypeName", this.messageAccessor.message("common.issueType"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �씠�뒋 ���엯 - excelInfo.addAttrInfos(new ExportExcelAttrVo("assignees", this.messageAccessor.message("common.assignee"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �떞�떦�옄 + excelInfo.addAttrInfos(new ExportExcelAttrVo("department", this.messageAccessor.message("common.department"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �떞�떦遺��꽌 excelInfo.addAttrInfos(new ExportExcelAttrVo("priorityName", this.messageAccessor.message("common.priority"), 6, ExportExcelAttrVo.ALIGN_CENTER)); // �슦�꽑�닚�쐞 excelInfo.addAttrInfos(new ExportExcelAttrVo("severityName", this.messageAccessor.message("common.importance"), 6, ExportExcelAttrVo.ALIGN_CENTER)); // 以묒슂�룄 excelInfo.addAttrInfos(new ExportExcelAttrVo("register", this.messageAccessor.message("common.register"), 20, ExportExcelAttrVo.ALIGN_CENTER)); // �벑濡앹옄 @@ -1542,7 +1617,7 @@ excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.issueType"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �씠�뒋 ���엯 excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.priority"), 5, ExportExcelAttrVo.ALIGN_CENTER)); // �슦�꽑�닚�쐞 excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.importance"), 5, ExportExcelAttrVo.ALIGN_CENTER)); // 以묒슂�룄 - excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.assignee"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �떞�떦�옄 + excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.department"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �떞�떦遺��꽌 excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.startDate"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // �떆�옉�씪 excelInfo.addAttrInfos(new ExportExcelAttrVo("id", this.messageAccessor.message("common.endDate"), 10, ExportExcelAttrVo.ALIGN_CENTER)); // 醫낅즺�씪 // �봽濡쒖젥�듃�뿉 �뿰寃곕맂 �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� 異붿텧�븯�뿬 �뿊�� download �뀥�뵆由우쓣 留뚮뱺�떎. @@ -1714,10 +1789,11 @@ List<Map<String, Long>> issueAssigneeMaps = Lists.newArrayList(); for (IssueForm issueForm : issueForms) { - for (Long userId : issueForm.getUserIds()) { + for (Long departmentId : issueForm.getDepartmentIds()) { Map<String, Long> issueAssigneeMap = new HashMap<>(); issueAssigneeMap.put("issueId", issueForm.getId()); - issueAssigneeMap.put("userId", userId); + //issueAssigneeMap.put("userId", userId); + issueAssigneeMap.put("departmentId", departmentId); issueAssigneeMap.put("workspaceId", workspace.getId()); issueAssigneeMap.put("registerId", this.webAppUtil.getLoginId()); issueAssigneeMaps.add(issueAssigneeMap); @@ -1880,7 +1956,7 @@ this.setIssueFormSeverity(cell, severityMaps, issueForm, rowIndex); break; case 6: - // �떞�떦�옄瑜� IssueForm �뿉 ���옣�븳�떎. + // �떞�떦遺��꽌瑜� IssueForm �뿉 ���옣�븳�떎. this.setIssueFormAssignee(cell, userMaps, issueForm, project); break; case 7: @@ -2021,21 +2097,21 @@ issueForm.setSeverityId(severity.getId()); } - // �떞�떦�옄瑜� IssueForm �뿉 ���옣�븳�떎. + // �떞�떦遺��꽌瑜� IssueForm �뿉 ���옣�븳�떎. private void setIssueFormAssignee(Cell cell, Map<String, Object> userMaps, IssueForm issueForm, Project project) { if (cell != null) { String[] splitAssignee = CommonUtil.convertExcelStringToCell(cell).split("#"); Map<String, Object> userMap = (Map<String, Object>) MapUtil.getObject(userMaps, project.getProjectKey()); - List<Long> userIds = Lists.newArrayList(); + List<Long> departmentIds = Lists.newArrayList(); for (String account : splitAssignee) { if (MapUtil.getLong(userMap, account) != null) { - userIds.add(MapUtil.getLong(userMap, account)); + departmentIds.add(MapUtil.getLong(userMap, account)); } } - issueForm.setUserIds(userIds); + issueForm.setDepartmentIds(departmentIds); } } @@ -2298,17 +2374,24 @@ taskUserSave.put(taskId.toString(), Lists.newArrayList()); } - List<Map<String, Object>> taskUsers = Lists.newArrayList(); + List<Map<String, Object>> taskDepartments = Lists.newArrayList(); // task 媛� �븯�굹�룄 �뾾�쓣 寃쎌슦�뿉�뒗 議고쉶瑜� �븯吏� �븡�뒗�떎. if (!taskCondition.getIssueIds().isEmpty()) { - taskUsers = this.issueMapper.getAllTaskUser(taskCondition); + //taskUsers = this.issueMapper.getAllTaskUser(taskCondition); + taskDepartments = this.issueMapper.getAllTaskUser(taskCondition); } // task_id �뿉 留ㅼ묶�릺�뒗 �떞�떦�옄 �젙蹂대�� 以�鍮꾪븳�떎. - for (Map<String, Object> taskUser : taskUsers) { + /*for (Map<String, Object> taskUser : taskUsers) { Long taskId = MapUtil.getLong(taskUser, "taskId"); List<UserVo> userVos = (List<UserVo>)taskUserSave.get(taskId.toString()); userVos.add(ConvertUtil.convertMapToClass(taskUser, UserVo.class)); + }*/ + + for (Map<String, Object> taskDepartment : taskDepartments) { + Long taskId = MapUtil.getLong(taskDepartment, "taskId"); + List<DepartmentVo> departmentVos = (List<DepartmentVo>)taskUserSave.get(taskId.toString()); + departmentVos.add(ConvertUtil.convertMapToClass(taskDepartment, DepartmentVo.class)); } for (Map<String, Object> result : results) { @@ -2333,8 +2416,12 @@ } // �떞�떦�옄 �뀑�똿 - List<UserVo> userVos = (List<UserVo>)taskUserSave.get(taskVo.getId().toString()); - taskVo.setUserVos(userVos); + //List<UserVo> userVos = (List<UserVo>)taskUserSave.get(taskVo.getId().toString()); + //taskVo.setUserVos(userVos); + + // �떞�떦遺��꽌 �꽭�똿 + List<DepartmentVo> departmentVos = (List<DepartmentVo>)taskUserSave.get(taskVo.getId().toString()); + taskVo.setDepartmentVos(departmentVos); List<IssueVo> taskVos = (List<IssueVo>)tasks.get(MapUtil.getString(result, "workflowStatusId")); taskVos.add(taskVo); diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueUserServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueUserServiceImpl.java index 13dfa3f..f202174 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IssueUserServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IssueUserServiceImpl.java @@ -75,7 +75,84 @@ } } + // �씠�뒋 �떞�떦遺��꽌瑜� 蹂�寃쏀븳�떎. + @Override + @Transactional + public void modifyIssueDepartment(Issue issue, Workspace workspace, List<Long> departmentIds) { + List<Long> oldDepartmentIds = Lists.newArrayList(); + // �씠�쟾 �떞�떦 遺��꽌 + for (IssueUser issueUser : issue.getIssueUsers()) { + oldDepartmentIds.add(issueUser.getDepartment().getId()); + } + + List<Long> newDepartmentIds = CommonUtil.searchChangeList(oldDepartmentIds, departmentIds); // 異붽��빐�빞�븷 遺��꽌瑜� 李얜뒗�떎. + List<Long> removeDepartmentIds = CommonUtil.searchChangeList(departmentIds, oldDepartmentIds); // �궘�젣�빐�빞�븷 遺��꽌瑜� 李얜뒗�떎. + + if (removeDepartmentIds.size() > 0) { + Map<String, Object> removeIssueAssigneeMap = new HashMap<>(); + removeIssueAssigneeMap.put("issueId", issue.getId()); + removeIssueAssigneeMap.put("departmentIds", removeDepartmentIds); + + // �떞�떦遺��꽌 �궘�젣 + this.issueUserMapper.deleteIssueUserByIssueIdAndMultiDepartmentId(removeIssueAssigneeMap); + } + + if (newDepartmentIds.size() > 0) { + List<Map<String, Long>> addIssueAssigneeMaps = Lists.newArrayList(); + + for (Long departmentId : newDepartmentIds) { + Map<String, Long> issueAssigneeMap = new HashMap<>(); + issueAssigneeMap.put("departmentId", departmentId); //�떞�떦遺��꽌 + issueAssigneeMap.put("issueId", issue.getId()); + issueAssigneeMap.put("workspaceId", workspace.getId()); + issueAssigneeMap.put("registerId", this.webAppUtil.getLoginId()); + addIssueAssigneeMaps.add(issueAssigneeMap); + } + + // �떞�떦遺��꽌 異붽� + this.issueUserMapper.insertIssueUser(addIssueAssigneeMaps); + } + } + + @Override + @Transactional + public void insertIssueDepartment(List<Map<String, Long>> issueAssigneeMaps) { + // �씠�뒋 �떞�떦遺��꽌 踰뚰겕 �벑濡� + this.issueUserMapper.insertIssueUser(issueAssigneeMaps); + } + + // �씠�뒋 �떞�떦遺��꽌�뿉�꽌 �젣�쇅�븳�떎. + @Override + @Transactional + public void removeIssueDepartment(Long projectId, List<Long> excludeDepartmentIds) { + for (Long departmentId : excludeDepartmentIds) { + Map<String, Object> issueUserMap = new HashMap<>(); + issueUserMap.put("departmentId", departmentId); + issueUserMap.put("projectId", projectId); + + List<Map<String, Object>> results = this.issueUserMapper.findByDepartmentIdAndProjectId(issueUserMap); + + if (results.size() > 0) { + List<Long> issueIds = Lists.newArrayList(); + + for (Map<String, Object> result : results) { + Long id = MapUtil.getLong(result, "id"); + + if (id != null) { + issueIds.add(id); + } + } + + if (issueIds.size() > 0) { + Map<String, Object> removeIssueAssigneeMap = new HashMap<>(); + removeIssueAssigneeMap.put("departmentId", departmentId); + removeIssueAssigneeMap.put("issueIds", issueIds); + this.issueUserMapper.deleteIssueUserByDepartmentIdAndMultiIssueId(removeIssueAssigneeMap); + } + } + } + } // �씠�뒋 �떞�떦�옄 李얘린 @Override diff --git a/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java index 2795517..e9a70b6 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleServiceImpl.java @@ -64,6 +64,23 @@ } } + /*// �봽濡쒖젥�듃 �뿭�븷怨� 遺��꽌 �뿰寃� + private void projectRoleAssociatedDepartment(List<Department> departments, ProjectRole projectRole) { + for (Department department : departments) { + this.addDefaultProjectRoleAssociatedDepartment(projectRole, department); + } + } + + // �빐�떦 �뿭�븷怨� 遺��꽌瑜� �뿰寃곗떆�궓�떎. + private void addDefaultProjectRoleAssociatedDepartment(ProjectRole projectRole, Department department) { + ProjectRoleUser projectRoleDepartment = this.projectRoleUserService.findByProjectRoleIdAndDepartmentId(projectRole.getId(), department.getId()); + + if (projectRoleDepartment == null) { + // �봽濡쒖젥�듃 愿�由ъ옄 - 湲곕낯 �봽濡쒖젥�듃 �뿭�븷�뿉 異붽�. + department.addProjectRole(projectRole); + } + }*/ + // �봽濡쒖젥�듃 �뿭�븷�쓣 �깮�꽦�븳�떎. private ProjectRole addProjectRole(Project project, String projectRoleName, String projectRoleType, String permissionType) { ProjectRole projectRole = new ProjectRole(project, projectRoleName, projectRoleType); diff --git a/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java index f158fe0..18f226c 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java @@ -54,6 +54,13 @@ return this.projectRoleUserRepository.findByProjectRoleIdAndUserId(projectRoleId, userId); } + // �빐�떦 遺��꽌媛� �듅�젙 �뿭�븷�뿉 �냼�냽�릺�뼱 �엳�뒗吏� �솗�씤�븳�떎. + @Override + @Transactional(readOnly = true) + public ProjectRoleUser findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId) { + return this.projectRoleUserRepository.findByProjectRoleIdAndDepartmentId(projectRoleId, departmentId); + } + // �뾽臾� 怨듦컙�쓣 �깉�눜�븳 �궗�슜�옄媛� �떎瑜� �뾽臾� 怨듦컙�쓽 �봽濡쒖젥�듃 愿�由ъ옄, �씪諛� �궗�슜�옄濡� �엳�쓣 寃쎌슦 �젣嫄고븳�떎. @Override @Transactional diff --git a/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java b/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java index c462a95..9c40ce3 100644 --- a/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java +++ b/src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java @@ -39,6 +39,7 @@ private List<Long> priorityIds = Lists.newArrayList(); private List<Long> severityIds = Lists.newArrayList(); private List<Long> userIds = Lists.newArrayList(); + private List<Long> departmentIds = Lists.newArrayList(); private List<Long> registerIds = Lists.newArrayList(); private List<String> issueIds = Lists.newArrayList(); // �씠�뒋 紐⑸줉 寃��깋�뿉�꽌 �궗�슜�옄 �젙�쓽 �븘�뱶濡� 1李� 寃��깋�븳 寃곌낵瑜� �떞�쓣�븣 �궗�슜 private List<Map<String, Object>> issueCustomFields = Lists.newArrayList(); @@ -136,6 +137,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")); } if (MapUtil.getLongs(conditions, "registerIds") != null) { @@ -317,6 +322,14 @@ this.userIds = userIds; } + public List<Long> getDepartmentIds() { + return departmentIds; + } + + public void setDepartmentIds(List<Long> departmentIds) { + this.departmentIds = departmentIds; + } + public List<Long> getRegisterIds() { return registerIds; } diff --git a/src/main/java/kr/wisestone/owl/web/controller/IssueUserController.java b/src/main/java/kr/wisestone/owl/web/controller/IssueUserController.java index 34ea0fc..d3b7c9c 100644 --- a/src/main/java/kr/wisestone/owl/web/controller/IssueUserController.java +++ b/src/main/java/kr/wisestone/owl/web/controller/IssueUserController.java @@ -32,7 +32,8 @@ IssueForm issueForm = IssueForm.make(params.get(Constants.REQ_KEY_CONTENT)); if (issueForm != null) { - this.issueService.modifyIssueUser(issueForm); + //this.issueService.modifyIssueUser(issueForm); + this.issueService.modifyIssueDepartment(issueForm); } return this.setSuccessMessage(resJsonData); diff --git a/src/main/java/kr/wisestone/owl/web/form/IssueForm.java b/src/main/java/kr/wisestone/owl/web/form/IssueForm.java index e36cf92..ebd2662 100644 --- a/src/main/java/kr/wisestone/owl/web/form/IssueForm.java +++ b/src/main/java/kr/wisestone/owl/web/form/IssueForm.java @@ -28,6 +28,7 @@ private Long issueNumber; private Long registerId; // �벑濡앹옄 �븘�씠�뵒 - issue insert batch �뿉�꽌 �궗�슜 private List<Long> userIds = Lists.newArrayList(); + private List<Long> departmentIds = Lists.newArrayList(); // �떞�떦 遺��꽌 private List<String> sendEmails = Lists.newArrayList(); // �씠硫붿씪 諛쒖넚 ���긽�옄 private List<Long> attachedFileIds = Lists.newArrayList(); private Long relationIssue; // �뿰愿� �씪媛� @@ -55,6 +56,11 @@ // �떞�떦�옄 �젙蹂� if (MapUtil.getLongs(params, "userIds") != null) { form.setUserIds(MapUtil.getLongs(params, "userIds")); + } + + // �떞�떦遺��꽌 �젙蹂� + if (MapUtil.getLongs(params, "departmentIds") != null) { + form.setDepartmentIds(MapUtil.getLongs(params, "departmentIds")); } // 硫붿씪 諛쒖넚�옄 �젙蹂� @@ -182,6 +188,14 @@ this.userIds = userIds; } + public List<Long> getDepartmentIds() { + return departmentIds; + } + + public void setDepartmentIds(List<Long> departmentIds) { + this.departmentIds = departmentIds; + } + public List<Long> getRemoveFiles() { return removeFiles; } diff --git a/src/main/resources/migration/V1_1__Initial_Setup.sql b/src/main/resources/migration/V1_1__Initial_Setup.sql index 91a8e2d..b9d36b4 100644 --- a/src/main/resources/migration/V1_1__Initial_Setup.sql +++ b/src/main/resources/migration/V1_1__Initial_Setup.sql @@ -512,7 +512,8 @@ CREATE TABLE IF NOT EXISTS `project_role_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `project_role_id` bigint(20) NOT NULL, - `user_id` bigint(20) NOT NULL, + `user_id` bigint(20) NULL, + `department_id` bigint(20) NULL, `register_id` bigint(20) NOT NULL, `register_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `modify_id` bigint(20) NOT NULL, @@ -520,7 +521,8 @@ PRIMARY KEY (`id`), KEY `projectRoleIdAndUserIdIndex` (`project_role_id`,`user_id`), KEY `userIdIndex` (`user_id`), - KEY `projectRoleIdIndex` (`project_role_id`) + KEY `projectRoleIdIndex` (`project_role_id`), + KEY `departmentIdIndex` (`department_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; -- �뀒�씠釉� �뜲�씠�꽣 owl_en_1.5.project_role_user:~0 rows (���왂�쟻) �궡蹂대궡湲� diff --git a/src/main/resources/mybatis/query-template/issueUser-template.xml b/src/main/resources/mybatis/query-template/issueUser-template.xml index 9db501f..92796b4 100644 --- a/src/main/resources/mybatis/query-template/issueUser-template.xml +++ b/src/main/resources/mybatis/query-template/issueUser-template.xml @@ -6,13 +6,41 @@ <!-- �씠�뒋 �떞�떦�옄 bulk insert, import, modify, add �뿉�꽌 �궗�슜 --> <insert id="insertIssueUser" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="java.util.HashMap"> - INSERT INTO issue_user(user_id, issue_id, workspace_id, register_id, modify_id, register_date, modify_date) + INSERT INTO issue_user(department_id, user_id, issue_id, workspace_id, register_id, modify_id, register_date, modify_date) VALUES <foreach collection="list" item="map" index="index" separator="," open="" close=""> - (#{map.userId}, #{map.issueId}, #{map.workspaceId}, #{map.registerId}, #{map.registerId}, NOW(), NOW()) + (#{map.departmentId},#{map.userId}, #{map.issueId}, #{map.workspaceId}, #{map.registerId}, #{map.registerId}, NOW(), NOW()) </foreach> </insert> + <!--�떞�떦遺��꽌--> + <!-- �씠�뒋 �떞�떦遺��꽌 bulk �궘�젣 - modify, add �뿉�꽌 �궗�슜 --> + <delete id="deleteIssueUserByIssueIdAndMultiDepartmentId" parameterType="java.util.HashMap"> + DELETE FROM issue_user WHERE issue_id = #{issueId} AND department_id IN ( + <foreach collection="map.departmentIds" item="item" index="index" separator="," open="" close=""> + #{item} + </foreach> + ) + </delete> + + <delete id="deleteIssueUserByDepartmentIdAndMultiIssueId" parameterType="java.util.HashMap"> + DELETE FROM issue_user WHERE department_id = #{departmentId} AND issue_id IN ( + <foreach collection="issueIds" item="item" index="index" separator="," open="" close=""> + #{item} + </foreach> + ) + </delete> + + <!-- �씠�뒋 �떞�떦遺��꽌瑜� 議고쉶�븳�떎 --> + <select id="findByDepartmentIdAndProjectId" resultType="java.util.HashMap" parameterType="java.util.HashMap"> + SELECT DISTINCT(i.id) FROM issue i + INNER JOIN issue_user iu ON iu.issue_id = i.id + INNER JOIN department d ON d.id = iu.department_id + WHERE i.project_id = #{projectId} AND d.id = #{departmentId} + </select> + + + <!--�떞�떦�옄--> <!-- �씠�뒋 �떞�떦�옄 bulk �궘�젣 - modify, add �뿉�꽌 �궗�슜 --> <delete id="deleteIssueUserByIssueIdAndMultiUserId" parameterType="java.util.HashMap"> DELETE FROM issue_user WHERE issue_id = #{issueId} AND user_id IN ( @@ -30,9 +58,6 @@ ) </delete> - - - <!-- �씠�뒋 �떞�떦�옄瑜� 議고쉶�븳�떎 --> <select id="findByUserIdAndProjectId" resultType="java.util.HashMap" parameterType="java.util.HashMap"> SELECT DISTINCT(i.id) FROM issue i @@ -40,6 +65,5 @@ INNER JOIN user u ON u.id = iu.user_id WHERE i.project_id = #{projectId} AND u.id = #{userId} </select> - </mapper> diff --git a/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties b/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties index 31fa61b..fed6e33 100644 --- a/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties +++ b/src/main/webapp/WEB-INF/i18n/code_ko_KR.properties @@ -17,6 +17,7 @@ common.priority=\uC6B0\uC120\uC21C\uC704 common.importance=\uC911\uC694\uB3C4 common.assignee=\uB2F4\uB2F9\uC790 +common.department=\uB2F4\uB2F9\uBD80\uC11C common.period=\uAE30\uAC04 common.register=\uB4F1\uB85D\uC790 common.modifyDate=\uCD5C\uC885 \uBCC0\uACBD\uC77C -- Gitblit v1.8.0