From ee65aa4472baee240808689a866866abb2e44608 Mon Sep 17 00:00:00 2001
From: 이민희 <mhlee@maprex.co.kr>
Date: 화, 16 11월 2021 10:09:17 +0900
Subject: [PATCH] 담당자 -> 담당부서 변경 및 추가 기능 완료 * db날리고 실행

---
 src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java           |  100 +++++--
 src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java                  |   18 -
 src/main/java/kr/wisestone/owl/domain/Department.java                       |   12 
 src/main/java/kr/wisestone/owl/service/IssueDepartmentService.java          |   21 +
 src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java          |    2 
 src/main/resources/mybatis/query-template/issue-template.xml                |   39 +++
 src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java                  |    8 
 src/main/java/kr/wisestone/owl/mapper/IssueMapper.java                      |    2 
 src/main/java/kr/wisestone/owl/service/impl/IssueUserServiceImpl.java       |   79 ------
 src/main/java/kr/wisestone/owl/service/IssueUserService.java                |    7 
 src/main/resources/migration/V1_1__Initial_Setup.sql                        |   43 ++
 src/main/java/kr/wisestone/owl/domain/Issue.java                            |   12 
 src/main/java/kr/wisestone/owl/domain/ProjectRoleDepartment.java            |   56 ++++
 src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java    |    2 
 src/main/java/kr/wisestone/owl/mapper/IssueDepartmentMapper.java            |   23 +
 src/main/java/kr/wisestone/owl/domain/User.java                             |    4 
 src/main/java/kr/wisestone/owl/repository/IssueDepartmentRepository.java    |   11 
 src/main/resources/mybatis/query-template/issueDepartment-template.xml      |   42 +++
 src/main/java/kr/wisestone/owl/domain/IssueUser.java                        |   11 
 src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java |    4 
 src/main/java/kr/wisestone/owl/domain/IssueDepartment.java                  |   65 +++++
 src/main/java/kr/wisestone/owl/service/impl/IssueDepartmentServiceImpl.java |  128 +++++++++
 src/main/resources/mybatis/query-template/issueUser-template.xml            |   31 --
 src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java    |    2 
 24 files changed, 519 insertions(+), 203 deletions(-)

diff --git a/src/main/java/kr/wisestone/owl/domain/Department.java b/src/main/java/kr/wisestone/owl/domain/Department.java
index 4a09dbf..aaf363e 100644
--- a/src/main/java/kr/wisestone/owl/domain/Department.java
+++ b/src/main/java/kr/wisestone/owl/domain/Department.java
@@ -17,7 +17,7 @@
     private String departmentDescription;
 
     @OneToMany(mappedBy = "department", cascade = {CascadeType.ALL}, orphanRemoval = true)
-    private Set<ProjectRoleUser> projectRoleDepartments = new HashSet<>();
+    private Set<ProjectRoleDepartment> projectRoleDepartments = new HashSet<ProjectRoleDepartment>();
 
     public Department() {
     }
@@ -46,12 +46,12 @@
         this.departmentDescription = departmentDescription;
     }
 
-    /*public void addProjectRole(ProjectRole projectRole) {
+    public void addProjectRole(ProjectRole projectRole) {
         if (this.projectRoleDepartments == null) {
-            this.projectRoleDepartments = new HashSet<>();
+            this.projectRoleDepartments = new HashSet<ProjectRoleDepartment>();
         }
-        ProjectRoleUser projectRoleUser = new ProjectRoleUser(projectRole, this);
+        ProjectRoleDepartment projectRoleDepartment = new ProjectRoleDepartment(projectRole, this);
 
-        this.projectRoleDepartments.add(projectRoleUser);
-    }*/
+        this.projectRoleDepartments.add(projectRoleDepartment);
+    }
 }
diff --git a/src/main/java/kr/wisestone/owl/domain/Issue.java b/src/main/java/kr/wisestone/owl/domain/Issue.java
index 6061a8a..38564bb 100644
--- a/src/main/java/kr/wisestone/owl/domain/Issue.java
+++ b/src/main/java/kr/wisestone/owl/domain/Issue.java
@@ -54,6 +54,10 @@
     private Set<IssueUser> issueUsers = new HashSet<>();
 
     @OrderBy(value="id DESC")
+    @OneToMany(mappedBy = "issue", cascade = { CascadeType.ALL }, orphanRemoval = true)
+    private Set<IssueDepartment> issueDepartments = new HashSet<>();
+
+    @OrderBy(value="id DESC")
     @OneToMany(mappedBy="issue", cascade={CascadeType.ALL}, orphanRemoval = true)
     private Set<AttachedFile> attachedFiles = new HashSet<>();
 
@@ -181,6 +185,14 @@
         this.issueUsers = issueUsers;
     }
 
+    public Set<IssueDepartment> getIssueDepartments() {
+        return issueDepartments;
+    }
+
+    public void setIssueDepartments(Set<IssueDepartment> issueDepartments) {
+        this.issueDepartments = issueDepartments;
+    }
+
     public Set<AttachedFile> getAttachedFiles() {
         return attachedFiles;
     }
diff --git a/src/main/java/kr/wisestone/owl/domain/IssueDepartment.java b/src/main/java/kr/wisestone/owl/domain/IssueDepartment.java
new file mode 100644
index 0000000..0503ebd
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/domain/IssueDepartment.java
@@ -0,0 +1,65 @@
+package kr.wisestone.owl.domain;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+public class IssueDepartment extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "issue_id")
+    private Issue issue;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "workspace_id")
+    private Workspace workspace;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name = "department_id")
+    private Department department;
+
+    public IssueDepartment() {
+    }
+
+    public IssueDepartment(Issue issue, Department department) {
+        this.issue = issue;
+        this.department = department;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Issue getIssue() {
+        return issue;
+    }
+
+    public void setIssue(Issue issue) {
+        this.issue = issue;
+    }
+
+    public Workspace getWorkspace() {
+        return workspace;
+    }
+
+    public void setWorkspace(Workspace workspace) {
+        this.workspace = workspace;
+    }
+
+    public Department getDepartment() {
+        return department;
+    }
+
+    public void setDepartment(Department department) {
+        this.department = department;
+    }
+}
diff --git a/src/main/java/kr/wisestone/owl/domain/IssueUser.java b/src/main/java/kr/wisestone/owl/domain/IssueUser.java
index 88ceb1d..3815310 100644
--- a/src/main/java/kr/wisestone/owl/domain/IssueUser.java
+++ b/src/main/java/kr/wisestone/owl/domain/IssueUser.java
@@ -23,10 +23,6 @@
     @JoinColumn(name = "workspace_id")
     private Workspace workspace;
 
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name = "department_id")
-    private Department department;
-
     public IssueUser() {
     }
 
@@ -67,11 +63,4 @@
         this.workspace = workspace;
     }
 
-    public Department getDepartment() {
-        return department;
-    }
-
-    public void setDepartment(Department department) {
-        this.department = department;
-    }
 }
diff --git a/src/main/java/kr/wisestone/owl/domain/ProjectRoleDepartment.java b/src/main/java/kr/wisestone/owl/domain/ProjectRoleDepartment.java
new file mode 100644
index 0000000..bdd8dcc
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/domain/ProjectRoleDepartment.java
@@ -0,0 +1,56 @@
+package kr.wisestone.owl.domain;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+/**
+ * Created by jeong on 2017-12-30.
+ */
+@Entity
+public class ProjectRoleDepartment extends BaseEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name="project_role_id")
+    private ProjectRole projectRole;
+
+    @ManyToOne(fetch = FetchType.LAZY)
+    @JoinColumn(name="department_id")
+    private Department department;
+
+    public ProjectRoleDepartment() {
+    }
+
+    public ProjectRoleDepartment(ProjectRole projectRole, Department department) {
+        this.projectRole = projectRole;
+        this.department = department;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public ProjectRole getProjectRole() {
+        return projectRole;
+    }
+
+    public void setProjectRole(ProjectRole projectRole) {
+        this.projectRole = projectRole;
+    }
+
+    public Department getDepartment() {
+        return department;
+    }
+
+    public void setDepartment(Department department) {
+        this.department = department;
+    }
+}
diff --git a/src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java b/src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java
index a6035d3..c7dab3f 100644
--- a/src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java
+++ b/src/main/java/kr/wisestone/owl/domain/ProjectRoleUser.java
@@ -22,10 +22,6 @@
     @JoinColumn(name="user_id")
     private User user;
 
-    @ManyToOne(fetch = FetchType.LAZY)
-    @JoinColumn(name="department_id")
-    private Department department;
-
     public ProjectRoleUser() {
     }
 
@@ -34,12 +30,6 @@
         this.user = user;
     }
     
-    //遺��꽌濡� 蹂�寃�
-    /*public ProjectRoleUser(ProjectRole projectRole, Department department) {
-        this.projectRole = projectRole;
-        this.department = department;
-    }*/
-
     public Long getId() {
         return id;
     }
@@ -62,13 +52,5 @@
 
     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/domain/User.java b/src/main/java/kr/wisestone/owl/domain/User.java
index f86c285..d3efd00 100644
--- a/src/main/java/kr/wisestone/owl/domain/User.java
+++ b/src/main/java/kr/wisestone/owl/domain/User.java
@@ -70,10 +70,6 @@
     @OneToMany(mappedBy = "user", cascade = {CascadeType.ALL}, orphanRemoval = true)
     private Set<ApiToken> apiTokens = new HashSet<>();
 
-//    @ManyToOne(targetEntity = Department.class, fetch = FetchType.LAZY)
-//    @JoinColumn(name="department_id")
-//    private Department department;
-
     public User() {
     }
 
diff --git a/src/main/java/kr/wisestone/owl/mapper/IssueDepartmentMapper.java b/src/main/java/kr/wisestone/owl/mapper/IssueDepartmentMapper.java
new file mode 100644
index 0000000..07529d7
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/mapper/IssueDepartmentMapper.java
@@ -0,0 +1,23 @@
+package kr.wisestone.owl.mapper;
+
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by wisestone on 2018-11-27.
+ */
+@Repository
+public interface IssueDepartmentMapper {
+    
+    void insertIssueDepartment(List<Map<String, Long>> issueRoleUserMaps);
+    
+    void deleteIssueDepartmentByIssueIdAndMultiDepartmentId(Map<String, Object> removeIssueAssigneeMap);
+
+    void deleteIssueDepartmentByDepartmentIdAndMultiIssueId(Map<String, Object> removeIssueAssigneeMap);
+
+    List<Map<String, Object>> findByDepartmentIdAndProjectId(Map<String, Object> issueUserMap);
+
+
+}
diff --git a/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java b/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
index 060e7dd..5f3fd0f 100644
--- a/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
+++ b/src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
@@ -29,6 +29,8 @@
 
     List<Map<String, Object>> findIssueUser(IssueCondition issueCondition);
 
+    List<Map<String, Object>> findIssueDepartment(IssueCondition issueCondition);
+
     Long countByIssueTypeId(Long issueTypeId);
 
     Long countByIssueStatusId(Long issueStatusId);
diff --git a/src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java b/src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java
index 703c1dd..4b80d6f 100644
--- a/src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java
+++ b/src/main/java/kr/wisestone/owl/mapper/IssueUserMapper.java
@@ -20,12 +20,4 @@
     
     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/IssueDepartmentRepository.java b/src/main/java/kr/wisestone/owl/repository/IssueDepartmentRepository.java
new file mode 100644
index 0000000..da29e2c
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/repository/IssueDepartmentRepository.java
@@ -0,0 +1,11 @@
+package kr.wisestone.owl.repository;
+
+import kr.wisestone.owl.domain.IssueDepartment;
+import kr.wisestone.owl.domain.IssueUser;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+public interface IssueDepartmentRepository extends JpaRepository<IssueDepartment, Long> {
+    List<IssueDepartment> findByIssueId(Long issueId);
+}
diff --git a/src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java b/src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java
index acec2ae..0835a56 100644
--- a/src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java
+++ b/src/main/java/kr/wisestone/owl/repository/ProjectRoleUserRepository.java
@@ -11,6 +11,6 @@
 
     ProjectRoleUser findByProjectRoleIdAndUserId(@Param("projectRoleId") Long projectRoleId, @Param("userId") Long userId);
 
-    ProjectRoleUser findByProjectRoleIdAndDepartmentId(@Param("projectRoleId") Long projectRoleId, @Param("departmentId") Long departmentId);
+    //ProjectRoleUser findByProjectRoleIdAndDepartmentId(@Param("projectRoleId") Long projectRoleId, @Param("departmentId") Long departmentId);
 
 }
diff --git a/src/main/java/kr/wisestone/owl/service/IssueDepartmentService.java b/src/main/java/kr/wisestone/owl/service/IssueDepartmentService.java
new file mode 100644
index 0000000..aaf4f7e
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/service/IssueDepartmentService.java
@@ -0,0 +1,21 @@
+package kr.wisestone.owl.service;
+
+import kr.wisestone.owl.domain.Issue;
+import kr.wisestone.owl.domain.IssueDepartment;
+import kr.wisestone.owl.domain.Workspace;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IssueDepartmentService extends AbstractService<IssueDepartment, Long, JpaRepository<IssueDepartment, Long>>{
+
+    //�떞�떦遺��꽌
+    void modifyIssueDepartment(Issue issue, Workspace workspace, List<Long> departmentIds);
+
+    void insertIssueDepartment(List<Map<String, Long>> issueAssigneeMaps);
+
+    void removeIssueDepartment(Long projectId, List<Long> excludeUserIds);
+
+    List<IssueDepartment> find(Issue issue);
+}
diff --git a/src/main/java/kr/wisestone/owl/service/IssueUserService.java b/src/main/java/kr/wisestone/owl/service/IssueUserService.java
index 7e671e0..ae2c662 100644
--- a/src/main/java/kr/wisestone/owl/service/IssueUserService.java
+++ b/src/main/java/kr/wisestone/owl/service/IssueUserService.java
@@ -18,12 +18,5 @@
 
     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 521b8e3..8cd03ea 100644
--- a/src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java
+++ b/src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java
@@ -14,7 +14,7 @@
 
     ProjectRoleUser findByProjectRoleIdAndUserId(Long projectRoleId, Long userId); //�떞�떦�옄
 
-    ProjectRoleUser findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId); //�떞�떦遺��꽌
+    //ProjectRoleUser findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId); //�떞�떦遺��꽌
 
     void withDrawWorkspaceManagerModifyProjectRole(Workspace workspace, User user);
 
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueDepartmentServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueDepartmentServiceImpl.java
new file mode 100644
index 0000000..5835a65
--- /dev/null
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueDepartmentServiceImpl.java
@@ -0,0 +1,128 @@
+package kr.wisestone.owl.service.impl;
+
+import com.google.common.collect.Lists;
+import kr.wisestone.owl.domain.Issue;
+import kr.wisestone.owl.domain.IssueDepartment;
+import kr.wisestone.owl.domain.IssueUser;
+import kr.wisestone.owl.domain.Workspace;
+import kr.wisestone.owl.mapper.IssueDepartmentMapper;
+import kr.wisestone.owl.mapper.IssueUserMapper;
+import kr.wisestone.owl.repository.IssueDepartmentRepository;
+import kr.wisestone.owl.service.IssueDepartmentService;
+import kr.wisestone.owl.util.CommonUtil;
+import kr.wisestone.owl.util.MapUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class IssueDepartmentServiceImpl extends AbstractServiceImpl<IssueDepartment, Long, JpaRepository<IssueDepartment, Long>> implements IssueDepartmentService {
+
+    private static final Logger log = LoggerFactory.getLogger(IssueDepartmentServiceImpl.class);
+
+    @Autowired
+    private IssueDepartmentRepository issueDepartmentRepository;
+
+    @Autowired
+    private IssueDepartmentMapper issueDepartmentMapper;
+
+    @Override
+    protected JpaRepository<IssueDepartment, Long> getRepository() {
+        return this.issueDepartmentRepository;
+    }
+
+    //  �씠�뒋 �떞�떦遺��꽌瑜� 蹂�寃쏀븳�떎.
+    @Override
+    @Transactional
+    public void modifyIssueDepartment(Issue issue, Workspace workspace, List<Long> departmentIds) {
+        List<Long> oldDepartmentIds = Lists.newArrayList();
+
+        //  �씠�쟾 �떞�떦 遺��꽌
+        for (IssueDepartment issueDepartment : issue.getIssueDepartments()) {
+            oldDepartmentIds.add(issueDepartment.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.issueDepartmentMapper.deleteIssueDepartmentByIssueIdAndMultiDepartmentId(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());
+                issueAssigneeMap.put("modifyId", this.webAppUtil.getLoginId());
+                addIssueAssigneeMaps.add(issueAssigneeMap);
+            }
+
+            //  �떞�떦遺��꽌 異붽�
+            this.issueDepartmentMapper.insertIssueDepartment(addIssueAssigneeMaps);
+        }
+    }
+
+    //  �씠�뒋 �떞�떦遺��꽌 李얘린
+    @Override
+    @Transactional
+    public List<IssueDepartment> find(Issue issue) {
+        return this.issueDepartmentRepository.findByIssueId(issue.getId());
+    }
+
+    @Override
+    @Transactional
+    public void insertIssueDepartment(List<Map<String, Long>> issueAssigneeMaps) {
+        //  �씠�뒋 �떞�떦遺��꽌 踰뚰겕 �벑濡�
+        this.issueDepartmentMapper.insertIssueDepartment(issueAssigneeMaps);
+    }
+
+    //  �씠�뒋 �떞�떦遺��꽌�뿉�꽌 �젣�쇅�븳�떎.
+    @Override
+    @Transactional
+    public void removeIssueDepartment(Long projectId, List<Long> excludeDepartmentIds) {
+        for (Long departmentId : excludeDepartmentIds) {
+            Map<String, Object> issueDepartmentMap = new HashMap<>();
+            issueDepartmentMap.put("departmentId", departmentId);
+            issueDepartmentMap.put("projectId", projectId);
+
+            List<Map<String, Object>> results = this.issueDepartmentMapper.findByDepartmentIdAndProjectId(issueDepartmentMap);
+
+            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.issueDepartmentMapper.deleteIssueDepartmentByDepartmentIdAndMultiIssueId(removeIssueAssigneeMap);
+                }
+            }
+        }
+    }
+
+}
diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java
index ecd9ce8..c6dce73 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueHistoryServiceImpl.java
@@ -292,7 +292,7 @@
         //  �씠�뒋 湲곌컙 蹂�寃� �젙蹂대�� 湲곕줉�븳�떎.
         this.detectIssuePeriod(issue, issueForm, description);
         //  �떞�떦�옄 蹂�寃� �젙蹂대�� 湲곕줉�븳�떎.
-        this.detectIssueManager(issue, issueForm, description);
+        //this.detectIssueManager(issue, issueForm, description);
         //  �궗�슜�옄 �젙�쓽 �븘�뱶 蹂�寃� �젙蹂대�� 湲곕줉�븳�떎.
         this.detectCustomField(issue, issueForm, description);
 
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 9b1895f..c692a5e 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -85,6 +85,9 @@
     private IssueUserService issueUserService;
 
     @Autowired
+    private IssueDepartmentService issueDepartmentService;
+
+    @Autowired
     private CustomFieldService customFieldService;
 
     @Autowired
@@ -189,7 +192,7 @@
         //  �떞�떦�옄 吏��젙
         //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds());
         //  �떞�떦遺��꽌 吏��젙
-        this.issueUserService.modifyIssueDepartment(issue, project.getWorkspace(), issueForm.getDepartmentIds());
+        this.issueDepartmentService.modifyIssueDepartment(issue, project.getWorkspace(), issueForm.getDepartmentIds());
 
         //  multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎.
         List<Map<String, Object>> convertFileMaps = this.convertMultipartFileToFile(multipartFiles);
@@ -246,9 +249,9 @@
 
         //  �떞�떦遺��꽌
         StringBuilder assigneeBuilder = new StringBuilder();
-        for (IssueUser issueUser : issue.getIssueUsers()) {
+        for (IssueDepartment issueDepartment : issue.getIssueDepartments()) {
             //assigneeBuilder.append(issueUser.getUser().getName());
-            assigneeBuilder.append(issueUser.getDepartment().getDepartmentName());
+            assigneeBuilder.append(issueDepartment.getDepartment().getDepartmentName());
             /*assigneeBuilder.append("(");
             assigneeBuilder.append(CommonUtil.decryptAES128(issueUser.getUser().getAccount()));
             assigneeBuilder.append(")");*/
@@ -386,6 +389,7 @@
         issueCondition.setIssueIds(issueKeys);
 
         List<Map<String, Object>> results = this.issueMapper.find(issueCondition);
+
         //  �뒠�떇 �쟾 - 0.8, 0.9, 0.9, 0.9, 0.9
         StopWatch serviceStart = new StopWatch();
         serviceStart.start();
@@ -660,8 +664,8 @@
         return true;
     }
 
-    //  �씠�뒋 �떞�떦�옄 �젙蹂대�� �뀑�똿�븳�떎. => �떞�떦遺��꽌
-    private void setIssueDepartmentList(List<IssueVo> issueVos, IssueCondition issueCondition) {
+    //  �씠�뒋 �떞�떦�옄 �젙蹂대�� �뀑�똿�븳�떎.
+    private void setIssueUserList(List<IssueVo> issueVos, IssueCondition issueCondition) {
         if (issueVos.size() < 1) {
             return;
         }
@@ -669,28 +673,61 @@
         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<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")));
+                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<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")),
+                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�뿉 �떞�떦�옄 �젙蹂대�� �뀑�똿
+        for (IssueVo issueVo : issueVos) {
+            if (MapUtil.getObject(issueConverterUsers, String.valueOf(issueVo.getId())) != null) {
+                List<UserVo> userVos = (List) MapUtil.getObject(issueConverterUsers, String.valueOf(issueVo.getId()));
+
+                issueVo.setUserVos(userVos);
+            }
+
+            //  �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤
+            if (this.checkHasPermission(issueVo, issueVo.getUserVos())) {
+                issueVo.setModifyPermissionCheck(Boolean.TRUE);
+            }
+        }
+    }
+
+    //  �씠�뒋 �떞�떦遺��꽌 �젙蹂대�� �뀑�똿�븳�떎.
+    private void setIssueDepartmentList(List<IssueVo> issueVos, IssueCondition issueCondition) {
+        if (issueVos.size() < 1) {
+            return;
+        }
+
+        List<Map<String, Object>> issueDepartments = this.issueMapper.findIssueDepartment(issueCondition);
+        Map<String, Object> issueConverterDepartments = new HashMap<>();
+
+        //  �씠�뒋�뿉 �빐�떦�븯�뒗 �씠�뒋 �떞�떦遺��꽌 �젙蹂� �뀑�똿
+        for (Map<String, Object> issueDepartment : issueDepartments) {
+            String issueId = MapUtil.getString(issueDepartment, "issueId");
+
+            if (MapUtil.getObject(issueConverterDepartments, issueId) != null) {
+                List<DepartmentVo> departments = (List) MapUtil.getObject(issueConverterDepartments, issueId);
+                departments.add(new DepartmentVo(MapUtil.getLong(issueDepartment, "id"), MapUtil.getString(issueDepartment, "departmentName"), MapUtil.getString(issueDepartment, "departmentDescription")));
+            } else {
+                List<DepartmentVo> departments = Lists.newArrayList(new DepartmentVo(MapUtil.getLong(issueDepartment, "id"), MapUtil.getString(issueDepartment, "departmentName"), MapUtil.getString(issueDepartment, "departmentDescription")));
+                issueConverterDepartments.put(issueId, departments);
             }
         }
 
         //  �씠�뒋Vo�뿉 �떞�떦遺��꽌 �젙蹂대�� �뀑�똿
         for (IssueVo issueVo : issueVos) {
-            if (MapUtil.getObject(issueConverterUsers, String.valueOf(issueVo.getId())) != null) {
-                List<DepartmentVo> departmentVos = (List) MapUtil.getObject(issueConverterUsers, String.valueOf(issueVo.getId()));
+            if (MapUtil.getObject(issueConverterDepartments, String.valueOf(issueVo.getId())) != null) {
+                List<DepartmentVo> departmentVos = (List) MapUtil.getObject(issueConverterDepartments, String.valueOf(issueVo.getId()));
 
                 issueVo.setDepartmentVos(departmentVos);
             }
@@ -844,8 +881,8 @@
     private void setIssueDepartment(Issue issue, IssueVo issueVo) {
         List<DepartmentVo> departmentVos = Lists.newArrayList();
 
-        for (IssueUser issueUser : issue.getIssueUsers()) {
-            DepartmentVo departmentVo = ConvertUtil.copyProperties(issueUser.getDepartment(), DepartmentVo.class);
+        for (IssueDepartment issueDepartment : issue.getIssueDepartments()) {
+            DepartmentVo departmentVo = ConvertUtil.copyProperties(issueDepartment.getDepartment(), DepartmentVo.class);
             departmentVo.setByName(departmentVo.getByName());
             departmentVos.add(departmentVo);
         }
@@ -914,7 +951,7 @@
         this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate());
 
         //  �떞�떦�옄 �쑀�슚�꽦 泥댄겕 => �떞�떦遺��꽌濡� 蹂�寃�
-        this.verifyIssueAssignee(project, issueForm);
+        //this.verifyIssueAssignee(project, issueForm);
 
         Issue issue = this.getIssue(issueForm.getId());
 
@@ -942,9 +979,11 @@
         issue.setCompleteDate(issueForm.getCompleteDate());
 
         this.issueRepository.saveAndFlush(issue);
-        //  �떞�떦遺��꽌 吏��젙
         //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds());
-        this.issueUserService.modifyIssueDepartment(issue, project.getWorkspace(), issueForm.getDepartmentIds());
+        //  �떞�떦遺��꽌 吏��젙
+        if(issueForm.getDepartmentIds().size()>0){
+            this.issueDepartmentService.modifyIssueDepartment(issue, project.getWorkspace(), issueForm.getDepartmentIds());
+        }
 
         //  multipartFile �쓣 file Map List 媛앹껜濡� 蹂�寃쏀븳�떎.
         List<Map<String, Object>> convertFileMaps = this.convertMultipartFileToFile(multipartFiles);
@@ -1025,7 +1064,7 @@
             for (Long departmentId : issueForm.getDepartmentIds()) {
                 boolean includeProject = false;
 
-                for (ProjectRole projectRole : project.getProjectRoles()) {
+                /*for (ProjectRole projectRole : project.getProjectRoles()) {
                     ProjectRoleUser projectRoleUser = this.projectRoleUserService.findByProjectRoleIdAndDepartmentId(projectRole.getId(), departmentId);
 
                     if (projectRoleUser != null) {
@@ -1033,7 +1072,7 @@
                         trustDepartmentIds.add(departmentId);
                         break;
                     }
-                }
+                }*/
 
                 //  �뜲�씠�꽣 蹂댁젙 �옉�뾽 - �봽濡쒖젥�듃�뿉�꽌 �젣�쇅�맂 �궗�슜�옄�뒗 �떞�떦�옄�뿉�꽌 �젣�쇅 �맆 �닔 �엳�룄濡� 泥섎━
                 /*if (!includeProject) {
@@ -1075,7 +1114,7 @@
         }
     }*/
 
-    /*//  �씠�뒋 �닔�젙 沅뚰븳 泥댄겕
+    //  �씠�뒋 �닔�젙 沅뚰븳 泥댄겕
     private void verifyIssueModifyPermission(Long issueId) {
         Issue issue = this.getIssue(issueId);
 
@@ -1096,7 +1135,7 @@
         }
 
         return userVos;
-    }*/
+    }
 
     //  �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤
     private boolean checkHasPermission(IssueVo issueVo, List<UserVo> issueUserVos) {
@@ -1165,7 +1204,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());
@@ -1246,7 +1285,7 @@
         //  蹂�寃� �씠�젰 �젙蹂� 異붿텧
         StringBuilder detectIssueChange = new StringBuilder();
         //  �씠�뒋 �닔�젙 沅뚰븳 泥댄겕
-        //this.verifyIssueModifyPermission(issueForm.getId());
+        this.verifyIssueModifyPermission(issueForm.getId());
         Issue issue = this.getIssue(issueForm.getId());
         issue.setProject(this.projectService.getProject(issueForm.getProjectId()));
 
@@ -1254,7 +1293,7 @@
         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.issueDepartmentService.modifyIssueDepartment(issue, issue.getProject().getWorkspace(), issueForm.getDepartmentIds());
         this.issueRepository.saveAndFlush(issue);
 
         //  �씠�뒋 �씠�젰 �벑濡�
@@ -1304,7 +1343,7 @@
     private Issue issueRemoves(Long issueId) {
         Issue issue = this.getIssue(issueId);
         //  �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤
-        //this.verifyIssueModifyPermission(issueId);
+        this.verifyIssueModifyPermission(issueId);
 
         //  �씠�뒋 泥⑤� �뙆�씪�쓣 �궘�젣�븳�떎.
         if (issue.getAttachedFiles().size() > 0) {
@@ -1802,7 +1841,8 @@
 
         if (issueAssigneeMaps.size() > 0) {
             //  �씠�뒋 �떞�떦�옄 踰뚰겕 �벑濡�
-            this.issueUserService.insertIssueUser(issueAssigneeMaps);
+            //this.issueUserService.insertIssueUser(issueAssigneeMaps);
+            this.issueDepartmentService.insertIssueDepartment(issueAssigneeMaps);
         }
     }
 
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 f202174..5b8771c 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/IssueUserServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/IssueUserServiceImpl.java
@@ -75,85 +75,6 @@
         }
     }
 
-    //  �씠�뒋 �떞�떦遺��꽌瑜� 蹂�寃쏀븳�떎.
-    @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
     @Transactional
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 18f226c..2b581ca 100644
--- a/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java
+++ b/src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java
@@ -55,11 +55,11 @@
     }
 
     //  �빐�떦 遺��꽌媛� �듅�젙 �뿭�븷�뿉 �냼�냽�릺�뼱 �엳�뒗吏� �솗�씤�븳�떎.
-    @Override
+    /*@Override
     @Transactional(readOnly = true)
     public ProjectRoleUser findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId) {
         return this.projectRoleUserRepository.findByProjectRoleIdAndDepartmentId(projectRoleId, departmentId);
-    }
+    }*/
 
     //  �뾽臾� 怨듦컙�쓣 �깉�눜�븳 �궗�슜�옄媛� �떎瑜� �뾽臾� 怨듦컙�쓽 �봽濡쒖젥�듃 愿�由ъ옄, �씪諛� �궗�슜�옄濡� �엳�쓣 寃쎌슦 �젣嫄고븳�떎.
     @Override
diff --git a/src/main/resources/migration/V1_1__Initial_Setup.sql b/src/main/resources/migration/V1_1__Initial_Setup.sql
index b9d36b4..0ea3a43 100644
--- a/src/main/resources/migration/V1_1__Initial_Setup.sql
+++ b/src/main/resources/migration/V1_1__Initial_Setup.sql
@@ -80,6 +80,9 @@
     `project_id` bigint(20) DEFAULT NULL,
     `priority_id` bigint(20) DEFAULT NULL,
     `severity_id` bigint(20) DEFAULT NULL,
+    `company_id` bigint(20) DEFAULT NULL,
+    `hosting_id` bigint(20) DEFAULT NULL,
+    `isp_id` bigint(20) DEFAULT NULL,
     `title` varchar(300) DEFAULT NULL,
     `description` mediumtext COMMENT 'description',
     `reverse_index` bigint(20) DEFAULT NULL,
@@ -304,7 +307,6 @@
 CREATE TABLE IF NOT EXISTS `issue_user` (
     `id` bigint(20) NOT NULL AUTO_INCREMENT,
     `user_id` bigint(20) NULL,
-    `department_id` bigint(20) NOT NULL,
     `issue_id` bigint(20) NOT NULL,
     `workspace_id` bigint(20) NOT NULL,
     `register_id` bigint(20) NOT NULL,
@@ -315,7 +317,23 @@
     KEY `userIdAndIssueIdIndex` (`user_id`,`issue_id`),
     KEY `issueIdIndex` (`issue_id`),
     KEY `workspaceIdIndex` (`workspace_id`),
-    KEY `userIdIndex` (`user_id`),
+    KEY `userIdIndex` (`user_id`)
+    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- �뀒�씠釉� owl_en_1.5.issue_department 援ъ“ �궡蹂대궡湲�
+CREATE TABLE IF NOT EXISTS `issue_department` (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `department_id` bigint(20) NOT NULL,
+    `issue_id` bigint(20) NOT NULL,
+    `workspace_id` bigint(20) NOT NULL,
+    `register_id` bigint(20) NOT NULL,
+    `modify_id` bigint(20) NOT NULL,
+    `register_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
+    `modify_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+    PRIMARY KEY (`id`),
+    KEY `departmentIdAndIssueIdIndex` (`department_id`,`issue_id`),
+    KEY `issueIdIndex` (`issue_id`),
+    KEY `workspaceIdIndex` (`workspace_id`),
     KEY `departmentIdIndex` (`department_id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
@@ -512,8 +530,7 @@
 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) NULL,
-    `department_id` bigint(20) NULL,
+    `user_id` bigint(20) NOT 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,
@@ -521,8 +538,22 @@
     PRIMARY KEY (`id`),
     KEY `projectRoleIdAndUserIdIndex` (`project_role_id`,`user_id`),
     KEY `userIdIndex` (`user_id`),
-    KEY `projectRoleIdIndex` (`project_role_id`),
-    KEY `departmentIdIndex` (`department_id`)
+    KEY `projectRoleIdIndex` (`project_role_id`)
+    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
+
+-- �뀒�씠釉� owl_en_1.5.project_role_department 援ъ“ �궡蹂대궡湲�
+CREATE TABLE IF NOT EXISTS `project_role_department` (
+    `id` bigint(20) NOT NULL AUTO_INCREMENT,
+    `project_role_id` bigint(20) NOT 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,
+    `modify_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
+    PRIMARY KEY (`id`),
+    KEY `projectRoleIdAndDepartmentIdIndex` (`project_role_id`,`department_id`),
+    KEY `departmentIdIndex` (`department_id`),
+    KEY `projectRoleIdIndex` (`project_role_id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
 -- �뀒�씠釉� �뜲�씠�꽣 owl_en_1.5.project_role_user:~0 rows (���왂�쟻) �궡蹂대궡湲�
diff --git a/src/main/resources/mybatis/query-template/issue-template.xml b/src/main/resources/mybatis/query-template/issue-template.xml
index 9e7f592..969ffa6 100644
--- a/src/main/resources/mybatis/query-template/issue-template.xml
+++ b/src/main/resources/mybatis/query-template/issue-template.xml
@@ -39,6 +39,7 @@
         INNER JOIN issue_type issue_type FORCE INDEX(PRIMARY) ON issue.issue_type_id = issue_type.id
         INNER JOIN priority priority FORCE INDEX(PRIMARY) ON issue.priority_id = priority.id
         INNER JOIN severity severity FORCE INDEX(PRIMARY) ON issue.severity_id = severity.id
+        LEFT OUTER JOIN issue_department issued FORCE INDEX(issueIdIndex) ON issue.id = issued.issue_id
         LEFT OUTER JOIN issue_user issue_user FORCE INDEX(issueIdIndex) ON issue.id = issue_user.issue_id
         LEFT OUTER JOIN (SELECT issue_id, COUNT(id) as attachedFileCount FROM attached_file GROUP BY issue_id)
         temp_attached_file on (temp_attached_file.issue_id = issue.id)
@@ -131,6 +132,15 @@
             <when test="userIds.size != 0">
                 AND issue_user.user_id IN
                 <foreach collection="userIds" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </when>
+        </choose>
+
+        <choose>
+            <when test="departmentIds.size != 0">
+                AND issue_department.department_id IN
+                <foreach collection="departmentIds" item="item" index="index" separator="," open="(" close=")">
                     #{item}
                 </foreach>
             </when>
@@ -260,6 +270,15 @@
             <when test="userIds.size != 0">
                 AND issue_user.user_id IN
                 <foreach collection="userIds" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </when>
+        </choose>
+
+        <choose>
+            <when test="departmentIds.size != 0">
+                AND issue_department.department_id IN
+                <foreach collection="departmentIds" item="item" index="index" separator="," open="(" close=")">
                     #{item}
                 </foreach>
             </when>
@@ -409,6 +428,26 @@
         </choose>
     </select>
 
+    <select id="findIssueDepartment" resultType="java.util.HashMap"
+            parameterType="kr.wisestone.owl.web.condition.IssueCondition">
+        SELECT
+        i.id AS issueId,
+        d.id AS id,
+        d.department_name AS name
+        FROM issue i
+        INNER JOIN issue_department issued ON issued.issue_id = i.id
+        INNER JOIN department d ON d.id = issued.department_id
+        WHERE 1=1
+        <choose>
+            <when test="issueIds.size != 0">
+                AND i.id IN
+                <foreach collection="issueIds" item="item" index="index" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </when>
+        </choose>
+    </select>
+
     <!--    �씠�뒋 �쑀�삎�쓣 �궗�슜�븯�뒗 �씠�뒋 媛��닔瑜� 議고쉶�븳�떎 -->
     <select id="countByIssueTypeId" resultType="java.lang.Long" parameterType="java.lang.Long">
       SELECT COUNT(DISTINCT id) FROM
diff --git a/src/main/resources/mybatis/query-template/issueDepartment-template.xml b/src/main/resources/mybatis/query-template/issueDepartment-template.xml
new file mode 100644
index 0000000..2aa9432
--- /dev/null
+++ b/src/main/resources/mybatis/query-template/issueDepartment-template.xml
@@ -0,0 +1,42 @@
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="kr.wisestone.owl.mapper.IssueDepartmentMapper">
+
+    <!--    �씠�뒋 �떞�떦遺��꽌 bulk insert, import, modify, add �뿉�꽌 �궗�슜 -->
+    <insert id="insertIssueDepartment" keyColumn="id" keyProperty="id" useGeneratedKeys="true"
+            parameterType="java.util.HashMap">
+        INSERT INTO issue_department(department_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.departmentId}, #{map.issueId}, #{map.workspaceId}, #{map.registerId}, #{map.registerId}, NOW(), NOW())
+        </foreach>
+    </insert>
+
+    <!--�떞�떦遺��꽌-->
+    <!--    �씠�뒋 �떞�떦遺��꽌 bulk �궘�젣 - modify, add �뿉�꽌 �궗�슜  -->
+    <delete id="deleteIssueDepartmentByIssueIdAndMultiDepartmentId" parameterType="java.util.HashMap">
+        DELETE FROM issue_department WHERE issue_id = #{issueId} AND department_id IN (
+        <foreach collection="map.departmentIds" item="item" index="index" separator="," open="" close="">
+            #{item}
+        </foreach>
+        )
+    </delete>
+
+    <delete id="deleteIssueDepartmentByDepartmentIdAndMultiIssueId" parameterType="java.util.HashMap">
+        DELETE FROM issue_department 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_department 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>
+
+</mapper>
diff --git a/src/main/resources/mybatis/query-template/issueUser-template.xml b/src/main/resources/mybatis/query-template/issueUser-template.xml
index 92796b4..6c28297 100644
--- a/src/main/resources/mybatis/query-template/issueUser-template.xml
+++ b/src/main/resources/mybatis/query-template/issueUser-template.xml
@@ -6,39 +6,12 @@
     <!--    �씠�뒋 �떞�떦�옄 bulk insert, import, modify, add �뿉�꽌 �궗�슜 -->
     <insert id="insertIssueUser" keyColumn="id" keyProperty="id" useGeneratedKeys="true"
             parameterType="java.util.HashMap">
-        INSERT INTO issue_user(department_id, user_id, issue_id, workspace_id, register_id, modify_id, register_date, modify_date)
+        INSERT INTO issue_user(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.departmentId},#{map.userId}, #{map.issueId}, #{map.workspaceId}, #{map.registerId}, #{map.registerId}, NOW(), NOW())
+            (#{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 �뿉�꽌 �궗�슜  -->

--
Gitblit v1.8.0