src/main/java/kr/wisestone/owl/domain/Issue.java
@@ -46,6 +46,18 @@ @JoinColumn(name = "severity_id") private Severity severity; @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name = "company_id") private CompanyField companyField; @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name = "hosting_id") private HostingField hostingFieldId; @ManyToOne(fetch=FetchType.LAZY) @JoinColumn(name = "isp_id") private IspField ispFieldId; @OneToOne(mappedBy = "issue", cascade = {CascadeType.ALL}, orphanRemoval = true) private IssueRisk issueRisk; @@ -161,6 +173,30 @@ this.severity = severity; } public CompanyField getCompanyField() { return companyField; } public void setCompanyField(CompanyField companyField) { this.companyField = companyField; } public HostingField getHostingFieldId() { return hostingFieldId; } public void setHostingFieldId(HostingField hostingFieldId) { this.hostingFieldId = hostingFieldId; } public IspField getIspFieldId() { return ispFieldId; } public void setIspFieldId(IspField ispFieldId) { this.ispFieldId = ispFieldId; } public IssueRisk getIssueRisk() { return issueRisk; } src/main/java/kr/wisestone/owl/mapper/ProjectRoleDepartmentMapper.java
New file @@ -0,0 +1,19 @@ 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 ProjectRoleDepartmentMapper { //void insertProjectRoleDepartment(List<Map<String, Long>> projectRoleDepartmentMaps); //void deleteProjectRoleDepartment(Map<String, Long> projectRoleDepartmentMaps); List<Map<String, Object>> findProjectRoleDepartment(Map<String, Object> projectRoleDepartmentMap); } src/main/java/kr/wisestone/owl/repository/ProjectRoleDepartmentRepository.java
New file @@ -0,0 +1,17 @@ package kr.wisestone.owl.repository; import kr.wisestone.owl.domain.ProjectRoleDepartment; import kr.wisestone.owl.domain.ProjectRoleUser; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import java.util.List; public interface ProjectRoleDepartmentRepository extends JpaRepository<ProjectRoleDepartment, Long> { List<ProjectRoleDepartment> findByProjectRoleId(@Param("projectRoleId") Long projectRoleId); ProjectRoleDepartment findByProjectRoleIdAndDepartmentId(@Param("projectRoleId") Long projectRoleId, @Param("departmentId") Long departmentId); //ProjectRoleUser findByProjectRoleIdAndDepartmentId(@Param("projectRoleId") Long projectRoleId, @Param("departmentId") Long departmentId); } src/main/java/kr/wisestone/owl/service/ProjectRoleDepartmentService.java
New file @@ -0,0 +1,15 @@ package kr.wisestone.owl.service; import kr.wisestone.owl.domain.*; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; import java.util.Map; public interface ProjectRoleDepartmentService extends AbstractService<ProjectRoleDepartment, Long, JpaRepository<ProjectRoleDepartment, Long>>{ List<ProjectRoleDepartment> findByProjectRoleId(Long projectRoleId); ProjectRoleDepartment findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId); //담당부서 List<Map<String, Object>> findProjectRoleDepartment(Map<String, Object> projectRoleDepartmentMap); } src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java
@@ -14,8 +14,6 @@ ProjectRoleUser findByProjectRoleIdAndUserId(Long projectRoleId, Long userId); //담당자 //ProjectRoleUser findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId); //담당부서 void withDrawWorkspaceManagerModifyProjectRole(Workspace workspace, User user); List<Map<String, Object>> findProjectRoleUser(Map<String, Object> projectRoleUserMap); src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -70,6 +70,15 @@ private SeverityService severityService; @Autowired private CompanyFieldService companyFieldService; @Autowired private IspFieldService ispFieldService; @Autowired private HostingFieldService hostingFieldService; @Autowired private CommonConfiguration configuration; @Autowired @@ -104,6 +113,9 @@ @Autowired private ProjectRoleUserService projectRoleUserService; @Autowired private ProjectRoleDepartmentService projectRoleDepartmentService; @Autowired private IssueRiskService issueRiskService; @@ -184,6 +196,23 @@ issue.setIssueType(issueType); issue.setPriority(priority); issue.setSeverity(severity); // 업체 필드 유효성 체크 if(issueForm.getCompanyId() != null){ CompanyField companyField = this.companyFieldService.getCompany(issueForm.getCompanyId()); issue.setCompanyField(companyField); } // ISP 필드 유효성 체크 if(issueForm.getIspId() != null) { IspField ispField = this.ispFieldService.getIsp(issueForm.getIspId()); issue.setIspFieldId(ispField); } // HOSTING 필드 유효성 체크 if (issueForm.getHostingId() != null){ HostingField hostingField = this.hostingFieldService.getHosting(issueForm.getHostingId()); issue.setHostingFieldId(hostingField); } issue.setIssueNumber(this.issueNumberGeneratorService.generateIssueNumber(project)); // 각 프로젝트의 고유 이슈 번호 생성 this.issueRepository.saveAndFlush(issue); @@ -247,18 +276,25 @@ issueMap.put("issueTypeName", issue.getIssueType().getName()); issueMap.put("issueStatusName", issue.getIssueStatus().getName()); // 담당부서 // 담당자 StringBuilder assigneeBuilder = new StringBuilder(); for (IssueDepartment issueDepartment : issue.getIssueDepartments()) { //assigneeBuilder.append(issueUser.getUser().getName()); assigneeBuilder.append(issueDepartment.getDepartment().getDepartmentName()); /*assigneeBuilder.append("("); for (IssueUser issueUser : issue.getIssueUsers()) { assigneeBuilder.append(issueUser.getUser().getName()); assigneeBuilder.append("("); assigneeBuilder.append(CommonUtil.decryptAES128(issueUser.getUser().getAccount())); assigneeBuilder.append(")");*/ assigneeBuilder.append(")"); assigneeBuilder.append("\n"); } issueMap.put("assignees", assigneeBuilder.toString()); // 담당부서 StringBuilder departsBuilder = new StringBuilder(); for (IssueDepartment issueDepartment : issue.getIssueDepartments()) { departsBuilder.append(issueDepartment.getDepartment().getDepartmentName()); departsBuilder.append("\n"); } issueMap.put("departsBuilder", departsBuilder.toString()); // 기간 if (!StringUtils.isEmpty(issue.getStartDate())) { issueMap.put("period", issue.getStartDate() + " ~ " + issue.getCompleteDate()); @@ -763,6 +799,7 @@ this.setAttachedFiles(issue, issueVo); // 첨부 파일 정보 셋팅 this.setIssueCustomFields(issue, issueVo); // 사용자 정의 필드 값 정보 셋팅 this.setRelationIssue(issue, issueVo); //연관 일감 셋팅 break; case "02": // 프로젝트, 이슈 유형, 이슈 상태, 우선순위, 중요도, 담당자, 첨부파일, 사용자 정의 필드 정보, 댓글, 기록을 셋팅한다. @@ -934,7 +971,7 @@ // 사용하고 있는 업무 공간이 활성 상태인지 확인한다. 사용 공간에서 로그인한 사용자가 비활성인지 확인한다. this.workspaceService.checkUseWorkspace(); // 이슈 수정 권한 체크 //this.verifyIssueModifyPermission(issueForm.getId()); this.verifyIssueModifyPermission(issueForm.getId()); // 프로젝트 유효성 체크 Project project = this.projectService.getProject(issueForm.getProjectId()); // 이슈 상태 유효성 체크 @@ -950,8 +987,10 @@ // 날짜 유효성 체크 this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate()); // 담당자 유효성 체크 => 담당부서로 변경 // 담당자 유효성 체크 //this.verifyIssueAssignee(project, issueForm); // 담당부서 유효성 체크 this.verifyIssueDepartment(project, issueForm); Issue issue = this.getIssue(issueForm.getId()); @@ -1057,35 +1096,35 @@ } // 이슈 담당부서로 지정될 부서가 해당 프로젝트에 참여 하고 있는 부서인지 확인 private void verifyIssueAssignee(Project project, IssueForm issueForm) { private void verifyIssueDepartment(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); for (ProjectRole projectRole : project.getProjectRoles()) { ProjectRoleDepartment projectRoleDepartment = this.projectRoleDepartmentService.findByProjectRoleIdAndDepartmentId(projectRole.getId(), departmentId); if (projectRoleUser != null) { if (projectRoleDepartment != null) { includeProject = true; trustDepartmentIds.add(departmentId); break; } }*/ } // 데이터 보정 작업 - 프로젝트에서 제외된 사용자는 담당자에서 제외 될 수 있도록 처리 /*if (!includeProject) { 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(); // 참여 확인된 사용자 @@ -1104,15 +1143,15 @@ } // 데이터 보정 작업 - 프로젝트에서 제외된 사용자는 담당자에서 제외 될 수 있도록 처리 *//*if (!includeProject) { if (!includeProject) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.PROJECT_NOT_INCLUDE_USER)); }*//* } } // 참여 확인된 사용자로 담당자 변경 issueForm.setUserIds(trustUserIds); } }*/ } // 이슈 수정 권한 체크 private void verifyIssueModifyPermission(Long issueId) { src/main/java/kr/wisestone/owl/service/impl/ProjectRoleDepartmentServiceImpl.java
New file @@ -0,0 +1,66 @@ package kr.wisestone.owl.service.impl; import com.google.common.collect.Lists; import kr.wisestone.owl.constant.MsgConstants; import kr.wisestone.owl.domain.*; import kr.wisestone.owl.exception.OwlRuntimeException; import kr.wisestone.owl.mapper.ProjectRoleDepartmentMapper; import kr.wisestone.owl.mapper.ProjectRoleUserMapper; import kr.wisestone.owl.repository.ProjectRoleDepartmentRepository; import kr.wisestone.owl.repository.ProjectRoleUserRepository; import kr.wisestone.owl.service.ProjectRoleDepartmentService; import kr.wisestone.owl.service.ProjectRoleService; import kr.wisestone.owl.service.UserWorkspaceService; 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 ProjectRoleDepartmentServiceImpl extends AbstractServiceImpl<ProjectRoleDepartment, Long, JpaRepository<ProjectRoleDepartment, Long>> implements ProjectRoleDepartmentService { private static final Logger log = LoggerFactory.getLogger(ProjectRoleDepartmentServiceImpl.class); @Autowired private ProjectRoleDepartmentRepository projectRoleDepartmentRepository; @Autowired private ProjectRoleService projectRoleService; @Autowired private UserWorkspaceService userWorkspaceService; @Autowired private ProjectRoleDepartmentMapper projectRoleDepartmentMapper; @Override protected JpaRepository<ProjectRoleDepartment, Long> getRepository() { return this.projectRoleDepartmentRepository; } @Override @Transactional(readOnly = true) public List<ProjectRoleDepartment> findByProjectRoleId(Long projectRoleId) { return this.projectRoleDepartmentRepository.findByProjectRoleId(projectRoleId); } // 해당 부서가 특정 역할에 소속되어 있는지 확인한다. @Override @Transactional(readOnly = true) public ProjectRoleDepartment findByProjectRoleIdAndDepartmentId(Long projectRoleId, Long departmentId) { return this.projectRoleDepartmentRepository.findByProjectRoleIdAndDepartmentId(projectRoleId, departmentId); } // 프로젝트에 참여하는 사용자, 프로젝트 관리자를 파라미터에 따라 조회한다. @Override @Transactional(readOnly = true) public List<Map<String, Object>> findProjectRoleDepartment(Map<String, Object> projectRoleDepartmentMap) { return this.projectRoleDepartmentMapper.findProjectRoleDepartment(projectRoleDepartmentMap); } } src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java
@@ -54,13 +54,6 @@ 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 src/main/java/kr/wisestone/owl/web/form/IssueForm.java
@@ -37,6 +37,9 @@ private List<Long> removeIds = Lists.newArrayList(); private List<Long> ids = Lists.newArrayList(); // 이슈 다중 상태 변경에서 사용 private String comment; // 이슈 상태 변경에서 변경 사유를 입력할 때 사용 private Long companyId; //업체필드 private Long ispId; //ISP필드 private Long hostingId; //호스팅필드 public IssueForm() { } @@ -93,6 +96,20 @@ form.setIds(MapUtil.getLongs(params, "ids")); } // 업체 필드 정보 if (MapUtil.getLongs(params, "companyFieldId") != null){ form.setCompanyId(MapUtil.getLong(params, "companyFieldId")); } // ISP 필드 정보 if (MapUtil.getLongs(params, "ispFieldId") != null){ form.setIspId(MapUtil.getLong(params, "ispFieldId")); } // HOSTING 필드 정보 if (MapUtil.getLongs(params, "hostingFieldId") != null){ form.setHostingId(MapUtil.getLong(params, "hostingFieldId")); } return form; } @@ -271,4 +288,28 @@ public void setComment(String comment) { this.comment = comment; } public Long getCompanyId() { return companyId; } public void setCompanyId(Long companyId) { this.companyId = companyId; } public Long getIspId() { return ispId; } public void setIspId(Long ispId) { this.ispId = ispId; } public Long getHostingId() { return hostingId; } public void setHostingId(Long hostingId) { this.hostingId = hostingId; } } src/main/resources/migration/V1_1__Initial_Setup.sql
@@ -545,6 +545,21 @@ 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) 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, `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_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, src/main/resources/mybatis/query-template/projectRoleDepartment-template.xml
New file @@ -0,0 +1,43 @@ <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="kr.wisestone.owl.mapper.ProjectRoleUserMapper"> <!-- 프로젝트 역할과 사용자를 연결한다. --> <insert id="insertProjectRoleDepartment" keyColumn="id" keyProperty="id" useGeneratedKeys="true" parameterType="java.util.HashMap"> INSERT INTO project_role_department(project_role_id, department_id, register_id, modify_id, register_date, modify_date) VALUES <foreach collection="list" item="map" index="index" separator="," open="" close=""> (#{map.projectRoleId}, #{map.departmentId}, #{map.registerId}, #{map.registerId}, NOW(), NOW()) </foreach> </insert> <!-- 프로젝트 역할과 사용자 연결 정보를 삭제한다. --> <delete id="deleteProjectRoleDepartment" parameterType="java.util.HashMap"> DELETE FROM project_role_department WHERE project_role_id = #{projectRoleId} AND department_id = #{departmentId} </delete> <!-- 프로젝트에 참여하는 부서를 조회한다. --> <select id="findProjectRoleDepartment" resultType="java.util.HashMap" parameterType="java.util.HashMap"> SELECT DISTINCT d.id as id, d.department_name as name FROM project p INNER JOIN project_role pr on p.id = pr.project_id INNER JOIN project_role_department prd on prd.project_role_id = pr.id INNER JOIN department d on d.id = prd.department_id WHERE 1=1 <choose> <when test="statuses.size != 0"> AND pr.role_type IN <foreach collection="statuses" item="item" index="index" separator="," open="(" close=")"> #{item} </foreach> </when> </choose> AND p.id = #{id} </select> </mapper> src/main/webapp/scripts/app/project/projectAdd.controller.js
@@ -93,12 +93,13 @@ }); return managerIds; })(), userIds : (function () { var userIds = []; //부서id 추가 필요 departmentIds : (function () { var departmentIds = []; angular.forEach($scope.vm.form.users, function (user) { userIds.push(user.id); departmentIds.push(user.id); }); return userIds; return departmentIds; })() };