OWL ITS + 탐지시스템(인터넷 진흥원)
- 이슈관리 업체,ISP,호스팅 추가 완료
- 프로젝트 부서담당자 백엔드 추가
* db날리고 실행
5개 파일 추가됨
7개 파일 변경됨
349 ■■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/domain/Issue.java 36 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/mapper/ProjectRoleDepartmentMapper.java 19 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/repository/ProjectRoleDepartmentRepository.java 17 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/ProjectRoleDepartmentService.java 15 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/ProjectRoleUserService.java 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 79 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/ProjectRoleDepartmentServiceImpl.java 66 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/ProjectRoleUserServiceImpl.java 7 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/form/IssueForm.java 41 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_1__Initial_Setup.sql 15 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/projectRoleDepartment-template.xml 43 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/project/projectAdd.controller.js 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
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;
                        })()
                    };