package kr.wisestone.owl.service.impl; import com.google.common.collect.Lists; import kr.wisestone.owl.domain.*; import kr.wisestone.owl.mapper.IssueDepartmentMapper; import kr.wisestone.owl.mapper.IssueUserMapper; import kr.wisestone.owl.repository.IssueDepartmentRepository; import kr.wisestone.owl.service.DepartmentService; import kr.wisestone.owl.service.IssueDepartmentService; import kr.wisestone.owl.util.CommonUtil; import kr.wisestone.owl.util.MapUtil; import kr.wisestone.owl.vo.DepartmentVo; 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> implements IssueDepartmentService { private static final Logger log = LoggerFactory.getLogger(IssueDepartmentServiceImpl.class); @Autowired private DepartmentService departmentService; @Autowired private IssueDepartmentRepository issueDepartmentRepository; @Autowired private IssueDepartmentMapper issueDepartmentMapper; @Override protected JpaRepository getRepository() { return this.issueDepartmentRepository; } /** * 이슈의 담당부서 추가 * @param departmentsIds List * @param workspace Workspace * @param issue Issue */ @Override @Transactional public void add(List departmentsIds, Workspace workspace, Issue issue) { List issueDepartments = Lists.newArrayList(); for (Long departmentId : departmentsIds) { Department department = this.departmentService.getDepartment(departmentId); issueDepartments.add(new IssueDepartment(workspace, issue, department)); } this.issueDepartmentRepository.saveAll(issueDepartments); } // 이슈 담당부서를 변경한다. @Override @Transactional public void modifyIssueDepartment(Issue issue, Workspace workspace, List departmentIds) { User user = this.webAppUtil.getLoginUserObject(); modifyIssueDepartment(issue, user, workspace, departmentIds); } // 이슈 담당부서를 변경한다. @Override @Transactional public void modifyIssueDepartment(Issue issue, User user, Workspace workspace, List departmentIds) { List oldDepartmentIds = Lists.newArrayList(); // 이전 담당 부서 for (IssueDepartment issueDepartment : issue.getIssueDepartments()) { oldDepartmentIds.add(issueDepartment.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.issueDepartmentMapper.deleteIssueDepartmentByIssueIdAndMultiDepartmentId(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", user.getId()); issueAssigneeMap.put("modifyId", user.getId()); addIssueAssigneeMaps.add(issueAssigneeMap); } // 담당부서 추가 this.issueDepartmentMapper.insertIssueDepartment(addIssueAssigneeMaps); } } // 이슈 담당부서 찾기 @Override @Transactional public List find(Issue issue) { return this.issueDepartmentRepository.findByIssueId(issue.getId()); } // 이슈 담당부서 찾기 @Override @Transactional public List findByDepartmentId(Long departmentId) { return this.issueDepartmentRepository.findByDepartmentId(departmentId); } /** * 이슈의 담당부서에 속해있는지 조회 * @param departmentId Long * @return useYn */ @Override public boolean usingDepartment(Long departmentId) { boolean useYn = false; List issueDepartments = this.issueDepartmentRepository.findByDepartmentId(departmentId); if (issueDepartments != null && issueDepartments.size() > 0) { useYn = true; } return useYn; } @Override @Transactional public void insertIssueDepartment(List> issueAssigneeMaps) { // 이슈 담당부서 벌크 등록 this.issueDepartmentMapper.insertIssueDepartment(issueAssigneeMaps); } // 이슈 담당부서에서 제외한다. @Override @Transactional public void removeIssueDepartment(Long projectId, List excludeDepartmentIds) { for (Long departmentId : excludeDepartmentIds) { Map issueDepartmentMap = new HashMap<>(); issueDepartmentMap.put("departmentId", departmentId); issueDepartmentMap.put("projectId", projectId); List> results = this.issueDepartmentMapper.findByDepartmentIdAndProjectId(issueDepartmentMap); 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.issueDepartmentMapper.deleteIssueDepartmentByDepartmentIdAndMultiIssueId(removeIssueAssigneeMap); } } } } }