OWL ITS + 탐지시스템(인터넷 진흥원)
- 이슈유형 설정에 상위 이슈 업체/ISP/호스팅 상속 기능
- 워크플로우에 속해있는 부서 삭제 시 팝업 메시지 수정
1개 파일 추가됨
11개 파일 변경됨
88 ■■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/constant/MsgConstants.java 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/IssueService.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 22 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java 8 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueVo.java 9 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/controller/IssueController.java 6 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/migration/V1_7__alter_data.sql 3 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties 2 ●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/i18n/ko/global.json 3 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueAddDown.controller.js 15 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueList.controller.js 1 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueModify.controller.js 13 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -253,7 +253,7 @@
    public static final String DEPARTMENT_NOT_EXIST = "DEPARTMENT_NOT_EXIST";   // 부서가 존재하지 않습니다.
    public static final String DEPARTMENT_ALREADY_IN_USE = "DEPARTMENT_ALREADY_IN_USE";   // 선택한 부서는 이미 사용하고 있습니다.
    public static final String DEPARTMENT_ALREADY_IN_USE_IN_WORKFLOW = "DEPARTMENT_ALREADY_IN_USE_IN_WORKFLOW";   // 선택한 부서는 이미 워크플로우의 담당부서에 속해 있습니다.
    public static final String DEPARTMENT_ALREADY_IN_USE_IN_WORKFLOW = "DEPARTMENT_ALREADY_IN_USE_IN_WORKFLOW";   // 선택한 부서는 워크플로우의 담당부서에 속해 있습니다.
    public static final String DEPARTMENT_ALREADY_IN_USE_IN_PROJECT = "DEPARTMENT_ALREADY_IN_USE_IN_PROJECT";   // 선택한 부서는 프로젝트의 담당부서에 속해 있습니다.
    public static final String DEPARTMENT_ALREADY_IN_USE_IN_ISSUE = "DEPARTMENT_ALREADY_IN_USE_IN_ISSUE";   // 선택한 부서는 이슈의 담당부서에 속해 있습니다.
    public static final String DEPARTMENT_REMOVE_NOT_SELECT = "DEPARTMENT_REMOVE_NOT_SELECT";   // 삭제할 부서가 선택되지 않았습니다.
src/main/java/kr/wisestone/owl/service/IssueService.java
@@ -34,11 +34,11 @@
    Issue addRelIssue(IssueForm issueForm, List<MultipartFile> files);
    Issue addDownIssue(IssueForm issueForm, List<MultipartFile> files);
    Issue addDownIssue(Map<String, Object> resJsonData, IssueForm issueForm, List<MultipartFile> files);
    Issue addRelIssue(User user, IssueForm issueForm, List<MultipartFile> multipartFiles);
    Issue addDownIssue(User user, IssueForm issueForm, List<MultipartFile> multipartFiles);
    Issue addDownIssue(Map<String, Object> resJsonData, User user, IssueForm issueForm, List<MultipartFile> multipartFiles);
    List<Issue> addApiIssue(IssueApiForm issueApiForm) throws CloneNotSupportedException;
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -581,15 +581,15 @@
    //  하위이슈를 생성한다.
    @Override
    @Transactional
    public Issue addDownIssue(IssueForm issueForm, List<MultipartFile> multipartFiles) {
    public Issue addDownIssue(Map<String, Object> resJsonData, IssueForm issueForm, List<MultipartFile> multipartFiles) {
        User user = this.webAppUtil.getLoginUserObject();
        return addDownIssue(user, issueForm, multipartFiles);
        return addDownIssue(resJsonData, user, issueForm, multipartFiles);
    }
    //  하위이슈를 생성한다.
    @Override
    @Transactional
    public Issue addDownIssue(User user, IssueForm issueForm, List<MultipartFile> multipartFiles) {
    public Issue addDownIssue(Map<String, Object> resJsonData, User user, IssueForm issueForm, List<MultipartFile> multipartFiles) {
        StringBuilder detectIssueChange = new StringBuilder();
        //  사용하고 있는 업무 공간이 활성 상태인지 확인한다. 사용 공간에서 로그인한 사용자가 비활성인지 확인한다.
@@ -653,6 +653,7 @@
        this.issueHistoryService.addIssueHistory(issue, user, IssueHistoryType.ADD, null);
        //  이슈 위험 관리 생성
        this.issueRiskService.addIssueRisk(issue, project.getWorkspace());
        //  영속성 컨텍스트 비우기
        this.clear();
        //  이슈 생성, 삭제시 예약 이메일에 등록해놓는다.
@@ -662,9 +663,24 @@
        UserVo userVo = ConvertUtil.copyProperties(user, UserVo.class);
        log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(userVo, ElasticSearchConstants.ISSUE_ADD));
        IssueVo issueVo = this.convertToIssueVo(issue);
        resJsonData.put(Constants.RES_KEY_CONTENTS, issueVo);
        return issue;
    }
    /**
     * Issue를 IssueVo로 변환(하위이슈의 파트너 정보 상속 시 필요)
     * @param issue Issue
     * @return IssueVo
     */
    private IssueVo convertToIssueVo(Issue issue) {
        IssueVo issueVo = ConvertUtil.copyProperties(issue, IssueVo.class);
        issueVo.setInheritPartners(issue.getIssueType().getInheritPartners());
        issueVo.setUsePartner(issue.getIssueType().getUsePartner());
        return issueVo;
    }
    //  연관이슈를 생성한다.
    @Override
    @Transactional
src/main/java/kr/wisestone/owl/service/impl/IssueTypeServiceImpl.java
@@ -98,16 +98,16 @@
            switch (projectType) {
                case BTS_PROJECT:
                    issueTypes.add(new IssueType(workspace, workflow, "악성 도메인", "", "#ff5f99", 0L, false)); // 버그
                    issueTypes.add(new IssueType(workspace, workflow, "경유지 대응", "", "#3598fe", 0L, false)); // 개선
                    issueTypes.add(new IssueType(workspace, workflow, "악성 도메인", "", "#ff5f99", 0L, true)); // 버그
                    issueTypes.add(new IssueType(workspace, workflow, "경유지 대응", "", "#3598fe", 0L, true)); // 개선
                    break;
                case RMS_PROJECT:
                    issueTypes.add(new IssueType(workspace, workflow, "유포지 대응", "", "#3bcde2", 0L, false)); // 요구 사항
                    issueTypes.add(new IssueType(workspace, workflow, "유포지 대응", "", "#3bcde2", 0L, true)); // 요구 사항
                    break;
                case TCM_PROJECT:
                    issueTypes.add(new IssueType(workspace, workflow, "분석결과 대응", "", "#008ca7", 0L, false)); // 테스트 케이스, 실행 순서, 전제 조건, 기대 결과
                    issueTypes.add(new IssueType(workspace, workflow, "분석결과 대응", "", "#008ca7", 0L, true)); // 테스트 케이스, 실행 순서, 전제 조건, 기대 결과
                    break;
            }
            this.issueTypeRepository.saveAll(issueTypes);
src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -84,6 +84,7 @@
    private Long downTotalCount = 0L;
    private Boolean inheritPartners;    // 파트너정보 상속유무 체크
    private Long usePartner;
    public IssueVo(){}
@@ -660,4 +661,12 @@
    public void setInheritPartners(Boolean inheritPartners) {
        this.inheritPartners = inheritPartners;
    }
    public Long getUsePartner() {
        return usePartner;
    }
    public void setUsePartner(Long usePartner) {
        this.usePartner = usePartner;
    }
}
src/main/java/kr/wisestone/owl/web/controller/IssueController.java
@@ -69,18 +69,16 @@
    }
    //  하위이슈 생성
    @RequestMapping(value = "/issue/downIssueAdd", method = RequestMethod.POST)
    @RequestMapping(value = "/issue/downIssueAdd", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
    public
    @ResponseBody
    Map<String, Object> downIssueAdd(MultipartHttpServletRequest request) {
        Map<String, Object> resJsonData = new HashMap<>();
        //  이슈 생성
        Issue issue = this.issueService.addDownIssue(IssueForm.make(ConvertUtil.convertJsonToMap(request.getParameter(Constants.REQ_KEY_CONTENT))), request.getFiles("file"));
        Issue issue = this.issueService.addDownIssue(resJsonData, IssueForm.make(ConvertUtil.convertJsonToMap(request.getParameter(Constants.REQ_KEY_CONTENT))), request.getFiles("file"));
        //  버전 생성
        this.issueService.addIssueVersion(issue.getId());
        resJsonData.put(Constants.RES_KEY_CONTENTS, issue.getId()); //하위이슈 ID
        resJsonData.put(Constants.REQ_KEY_CONTENT, issue.getIssueType().getInheritPartners()); //상속 여부
        return this.setSuccessMessage(resJsonData);
    }
src/main/resources/migration/V1_7__alter_data.sql
New file
@@ -0,0 +1,3 @@
/* issue_type 파트너 상속 기본값 true */
ALTER TABLE `issue_type` MODIFY COLUMN `inherit_partners` varchar(10) NULL DEFAULT true;
src/main/webapp/WEB-INF/i18n/messages_ko_KR.properties
@@ -235,7 +235,7 @@
DEPARTMENT_NOT_EXIST = \uBD80\uC11C\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.
DEPARTMENT_ALREADY_IN_USE = \uC120\uD0DD\uD55C \uBD80\uC11C\uB294 \uC774\uBBF8 \uC0AC\uC6A9\uD558\uACE0 \uC788\uC2B5\uB2C8\uB2E4.
DEPARTMENT_ALREADY_IN_USE_IN_WORKFLOW=\uC120\uD0DD\uD55C \uBD80\uC11C\uB294 \uC774\uBBF8 \uC6CC\uD06C\uD50C\uB85C\uC6B0\uC758 \uB2F4\uB2F9\uBD80\uC11C\uC5D0 \uC18D\uD574 \uC788\uC2B5\uB2C8\uB2E4.
DEPARTMENT_ALREADY_IN_USE_IN_WORKFLOW=\uC120\uD0DD\uD55C \uBD80\uC11C\uB294 \uC6CC\uD06C\uD50C\uB85C\uC6B0\uC758 \uB2F4\uB2F9\uBD80\uC11C\uC5D0 \uC18D\uD574 \uC788\uC2B5\uB2C8\uB2E4.
DEPARTMENT_ALREADY_IN_USE_IN_PROJECT=\uC120\uD0DD\uD55C \uBD80\uC11C\uB294 \uD504\uB85C\uC81D\uD2B8\uC758 \uB2F4\uB2F9\uBD80\uC11C\uC5D0 \uC18D\uD574 \uC788\uC2B5\uB2C8\uB2E4.
DEPARTMENT_ALREADY_IN_USE_IN_ISSUE=\uC120\uD0DD\uD55C \uBD80\uC11C\uB294 \uC774\uC288\uC758 \uB2F4\uB2F9\uBD80\uC11C\uC5D0 \uC18D\uD574 \uC788\uC2B5\uB2C8\uB2E4.
DEPARTMENT_REMOVE_NOT_SELECT = \uC0AD\uC81C\uD560 \uBD80\uC11C\uAC00 \uC120\uD0DD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4.
src/main/webapp/i18n/ko/global.json
@@ -370,7 +370,8 @@
        "errorSelectDownIssue" : "하위 이슈가 선택되지 않았습니다.",
        "failedToIssueTypeDefault": "이슈 유형 기본값 조회 실패",
        "inheritPartners": "업체/ISP/호스팅 정보 상속 여부",
        "wantToInheritPartnersOfParentIssue": "상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?"
        "wantToInheritPartnersOfParentIssue": "상위이슈의 파트너 정보(업체/ISP/호스팅)를 현재 이슈에 적용시키겠습니까?",
        "wantToInheritPartnersOfIssue": "현재 이슈의 파트너 정보(업체/ISP/호스팅)를 모든 하위이슈에 일괄 적용시키겠습니까?"
    },
    "project": {
        "createProject": "프로젝트 만들기",
src/main/webapp/scripts/app/issue/issueAddDown.controller.js
@@ -843,7 +843,7 @@
                    }).then(function (result) {
                        if (result.data.message.status === "success") {
                            $scope.fn.addDownIssue(result.data.data, result.data.content);
                            $scope.fn.addDownIssue(result.data.data);
                            //  이슈 상세 화면 요청
                            $rootScope.$broadcast("getIssueDetail", {
@@ -860,15 +860,18 @@
                }
                // 하위 이슈 추가
                function addDownIssue(downId, inheritYn) {
                function addDownIssue(issueVo) {
                    $rootScope.spinner = true;
                    let inheritYn = issueVo.inheritPartners;
                    let usePartner = issueVo.usePartner;
                    var ids = [];
                    if (downId != null) {
                        ids.push(downId);
                    if (issueVo.id != null) {
                        ids.push(issueVo.id);
                    }
                    if ($rootScope.isDefined(inheritYn) && inheritYn) {
                    if ($rootScope.isDefined(usePartner) && usePartner > 0
                            && $rootScope.isDefined(inheritYn) && inheritYn) {
                        SweetAlert.swal({
                            title : $filter("translate")("issue.addDownIssue"), // 하위 이슈 추가
                            text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?
@@ -923,7 +926,7 @@
                            $resourceProvider.getPageContent(0, 10))).then(function (result) {
                            if (result.data.message.status === "success") {
                                SweetAlert.close();
                                $scope.fn.cancel();
                                //  이슈 상세 화면 요청
                                $rootScope.$broadcast("getIssueDetail", {
                                    id : parameter.id
src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -860,6 +860,7 @@
                                    id : id,
                                    issueTypeId : $scope.vm.viewer.issueTypeVo.id,
                                    inheritPartners : $scope.vm.viewer.issueTypeVo.inheritPartners,
                                    usePartner : $scope.vm.viewer.usePartnerVos,
                                    downTotalCount : downTotalCount
                                };
                            }
src/main/webapp/scripts/app/issue/issueModify.controller.js
@@ -170,7 +170,8 @@
                    severities : [],    //  중요도 정보
                    fileTableConfigs : [],   //  파일 업로드 정보 테이블
                    inheritPartners : parameter.inheritPartners,
                    downTotalCount : parameter.downTotalCount
                    downTotalCount : parameter.downTotalCount,
                    usePartner : parameter.usePartner,
                };
                // 연관 일감 관련
@@ -577,7 +578,6 @@
                function formSubmit() {
                    $rootScope.spinner = true;
                    let inheritYn = false;
                    var content = {
@@ -844,10 +844,12 @@
                        })()
                    };
                    if ($scope.vm.inheritPartners && $scope.vm.downTotalCount > 0) {
                    if ($rootScope.isDefined($scope.vm.usePartner) && $scope.vm.usePartner.length > 0
                            && $rootScope.isDefined($scope.vm.inheritPartners) && $scope.vm.inheritPartners
                            && $rootScope.isDefined($scope.vm.downTotalCount) && $scope.vm.downTotalCount > 0) {
                        SweetAlert.swal({
                            title : $filter("translate")("issue.modifyDownIssue"), // 하위 이슈 변경
                            text : $filter("translate")("issue.wantToInheritPartnersOfParentIssue"), // 상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?
                            title : $filter("translate")("issue.modifyIssues"), // 이슈 변경
                            text : $filter("translate")("issue.wantToInheritPartnersOfIssue"), // 현재 이슈의 파트너 정보(업체/ISP/호스팅)를 모든 하위이슈에 일괄 적용시키겠습니까?
                            type : "warning",
                            showCancelButton : true,
                            confirmButtonColor : "#DD6B55",
@@ -859,6 +861,7 @@
                        function (isConfirm) {
                            if (isConfirm) {
                                inheritYn = true;
                                content.inheritYn = true;
                            }
                            Issue.modify({