- 이슈유형 설정에 상위 이슈 업체/ISP/호스팅 상속 기능
- 워크플로우에 속해있는 부서 삭제 시 팝업 메시지 수정
| | |
| | | |
| | | 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"; // 삭제할 부서가 선택되지 않았습니다. |
| | |
| | | |
| | | 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; |
| | | |
| | |
| | | // 하위이슈를 생성한다. |
| | | @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(); |
| | | |
| | | // 사용하고 있는 업무 공간이 활성 상태인지 확인한다. 사용 공간에서 로그인한 사용자가 비활성인지 확인한다. |
| | |
| | | this.issueHistoryService.addIssueHistory(issue, user, IssueHistoryType.ADD, null); |
| | | // 이슈 위험 관리 생성 |
| | | this.issueRiskService.addIssueRisk(issue, project.getWorkspace()); |
| | | |
| | | // 영속성 컨텍스트 비우기 |
| | | this.clear(); |
| | | // 이슈 생성, 삭제시 예약 이메일에 등록해놓는다. |
| | |
| | | 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 |
| | |
| | | |
| | | 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); |
| | |
| | | private Long downTotalCount = 0L; |
| | | |
| | | private Boolean inheritPartners; // 파트너정보 상속유무 체크 |
| | | private Long usePartner; |
| | | |
| | | public IssueVo(){} |
| | | |
| | |
| | | public void setInheritPartners(Boolean inheritPartners) { |
| | | this.inheritPartners = inheritPartners; |
| | | } |
| | | |
| | | public Long getUsePartner() { |
| | | return usePartner; |
| | | } |
| | | |
| | | public void setUsePartner(Long usePartner) { |
| | | this.usePartner = usePartner; |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | // 하위이슈 생성 |
| | | @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); |
| | | } |
| | | |
New file |
| | |
| | | |
| | | /* issue_type 파트너 상속 기본값 true */ |
| | | ALTER TABLE `issue_type` MODIFY COLUMN `inherit_partners` varchar(10) NULL DEFAULT true; |
| | |
| | | |
| | | 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. |
| | |
| | | "errorSelectDownIssue" : "하위 이슈가 선택되지 않았습니다.", |
| | | "failedToIssueTypeDefault": "이슈 유형 기본값 조회 실패", |
| | | "inheritPartners": "업체/ISP/호스팅 정보 상속 여부", |
| | | "wantToInheritPartnersOfParentIssue": "상위이슈의 파트너 정보(업체/ISP/호스팅)를 적용시키겠습니까?" |
| | | "wantToInheritPartnersOfParentIssue": "상위이슈의 파트너 정보(업체/ISP/호스팅)를 현재 이슈에 적용시키겠습니까?", |
| | | "wantToInheritPartnersOfIssue": "현재 이슈의 파트너 정보(업체/ISP/호스팅)를 모든 하위이슈에 일괄 적용시키겠습니까?" |
| | | }, |
| | | "project": { |
| | | "createProject": "프로젝트 만들기", |
| | |
| | | }).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", { |
| | |
| | | } |
| | | |
| | | // 하위 이슈 추가 |
| | | 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/호스팅)를 적용시키겠습니까? |
| | |
| | | $resourceProvider.getPageContent(0, 10))).then(function (result) { |
| | | |
| | | if (result.data.message.status === "success") { |
| | | SweetAlert.close(); |
| | | $scope.fn.cancel(); |
| | | // 이슈 상세 화면 요청 |
| | | $rootScope.$broadcast("getIssueDetail", { |
| | | id : parameter.id |
| | |
| | | id : id, |
| | | issueTypeId : $scope.vm.viewer.issueTypeVo.id, |
| | | inheritPartners : $scope.vm.viewer.issueTypeVo.inheritPartners, |
| | | usePartner : $scope.vm.viewer.usePartnerVos, |
| | | downTotalCount : downTotalCount |
| | | }; |
| | | } |
| | |
| | | severities : [], // 중요도 정보 |
| | | fileTableConfigs : [], // 파일 업로드 정보 테이블 |
| | | inheritPartners : parameter.inheritPartners, |
| | | downTotalCount : parameter.downTotalCount |
| | | downTotalCount : parameter.downTotalCount, |
| | | usePartner : parameter.usePartner, |
| | | }; |
| | | |
| | | // 연관 일감 관련 |
| | |
| | | |
| | | function formSubmit() { |
| | | $rootScope.spinner = true; |
| | | |
| | | let inheritYn = false; |
| | | |
| | | var content = { |
| | |
| | | })() |
| | | }; |
| | | |
| | | 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", |
| | |
| | | function (isConfirm) { |
| | | if (isConfirm) { |
| | | inheritYn = true; |
| | | content.inheritYn = true; |
| | | } |
| | | |
| | | Issue.modify({ |