package kr.wisestone.owl.service.impl; import com.google.common.collect.Lists; import kr.wisestone.owl.domain.*; import kr.wisestone.owl.mapper.IssueUserMapper; import kr.wisestone.owl.repository.IssueUserRepository; import kr.wisestone.owl.service.IssueUserService; import kr.wisestone.owl.service.ProjectService; import kr.wisestone.owl.util.CommonUtil; import kr.wisestone.owl.util.MapUtil; import kr.wisestone.owl.web.form.IssueForm; 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 IssueUserServiceImpl extends AbstractServiceImpl> implements IssueUserService { private static final Logger log = LoggerFactory.getLogger(IssueUserServiceImpl.class); @Autowired private IssueUserRepository issueUserRepository; @Autowired private IssueUserMapper issueUserMapper; @Override protected JpaRepository getRepository() { return this.issueUserRepository; } // 이슈 담당자를 변경한다. @Override @Transactional public void modifyIssueUser(Issue issue, Workspace workspace, List userIds) { List oldUserIds = Lists.newArrayList(); // 이전 담당자 for (IssueUser issueUser : issue.getIssueUsers()) { oldUserIds.add(issueUser.getUser().getId()); } List newUserIds = CommonUtil.searchChangeList(oldUserIds, userIds); // 추가해야할 사용자를 찾는다. List removeUserIds = CommonUtil.searchChangeList(userIds, oldUserIds); // 삭제해야할 사용자를 찾는다. if (removeUserIds.size() > 0) { Map removeIssueAssigneeMap = new HashMap<>(); removeIssueAssigneeMap.put("issueId", issue.getId()); removeIssueAssigneeMap.put("userIds", removeUserIds); // 담당자 삭제 this.issueUserMapper.deleteIssueUserByIssueIdAndMultiUserId(removeIssueAssigneeMap); } if (newUserIds.size() > 0) { List> addIssueAssigneeMaps = Lists.newArrayList(); for (Long userId : newUserIds) { Map issueAssigneeMap = new HashMap<>(); issueAssigneeMap.put("userId", userId); 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 modifyIssueDepartment(Issue issue, Workspace workspace, List departmentIds) { List oldDepartmentIds = Lists.newArrayList(); // 이전 담당 부서 for (IssueUser issueUser : issue.getIssueUsers()) { oldDepartmentIds.add(issueUser.getDepartment().getId()); } List newDepartmentIds = CommonUtil.searchChangeList(oldDepartmentIds, departmentIds); // 추가해야할 부서를 찾는다. List removeDepartmentIds = CommonUtil.searchChangeList(departmentIds, oldDepartmentIds); // 삭제해야할 부서를 찾는다. if (removeDepartmentIds.size() > 0) { Map removeIssueAssigneeMap = new HashMap<>(); removeIssueAssigneeMap.put("issueId", issue.getId()); removeIssueAssigneeMap.put("departmentIds", removeDepartmentIds); // 담당부서 삭제 this.issueUserMapper.deleteIssueUserByIssueIdAndMultiDepartmentId(removeIssueAssigneeMap); } if (newDepartmentIds.size() > 0) { List> addIssueAssigneeMaps = Lists.newArrayList(); for (Long departmentId : newDepartmentIds) { Map 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> issueAssigneeMaps) { // 이슈 담당부서 벌크 등록 this.issueUserMapper.insertIssueUser(issueAssigneeMaps); } // 이슈 담당부서에서 제외한다. @Override @Transactional public void removeIssueDepartment(Long projectId, List excludeDepartmentIds) { for (Long departmentId : excludeDepartmentIds) { Map issueUserMap = new HashMap<>(); issueUserMap.put("departmentId", departmentId); issueUserMap.put("projectId", projectId); List> results = this.issueUserMapper.findByDepartmentIdAndProjectId(issueUserMap); if (results.size() > 0) { List issueIds = Lists.newArrayList(); for (Map result : results) { Long id = MapUtil.getLong(result, "id"); if (id != null) { issueIds.add(id); } } if (issueIds.size() > 0) { Map removeIssueAssigneeMap = new HashMap<>(); removeIssueAssigneeMap.put("departmentId", departmentId); removeIssueAssigneeMap.put("issueIds", issueIds); this.issueUserMapper.deleteIssueUserByDepartmentIdAndMultiIssueId(removeIssueAssigneeMap); } } } } // 이슈 담당자 찾기 @Override @Transactional public List find(Issue issue) { return this.issueUserRepository.findByIssueId(issue.getId()); } // 이슈 담당자 벌크 등록 @Override @Transactional public void insertIssueUser(List> issueAssigneeMaps) { // 이슈 담당자 벌크 등록 this.issueUserMapper.insertIssueUser(issueAssigneeMaps); } // 이슈 담당자에서 제외한다. @Override @Transactional public void removeIssueUser(Long projectId, List excludeUserIds) { for (Long userId : excludeUserIds) { Map issueUserMap = new HashMap<>(); issueUserMap.put("userId", userId); issueUserMap.put("projectId", projectId); List> results = this.issueUserMapper.findByUserIdAndProjectId(issueUserMap); if (results.size() > 0) { List issueIds = Lists.newArrayList(); for (Map result : results) { Long id = MapUtil.getLong(result, "id"); if (id != null) { issueIds.add(id); } } if (issueIds.size() > 0) { Map removeIssueAssigneeMap = new HashMap<>(); removeIssueAssigneeMap.put("userId", userId); removeIssueAssigneeMap.put("issueIds", issueIds); this.issueUserMapper.deleteIssueUserByUserIdAndMultiIssueId(removeIssueAssigneeMap); } } } } }