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