| | |
| | | import java.io.IOException; |
| | | import java.text.ParseException; |
| | | import java.util.*; |
| | | import java.util.regex.Pattern; |
| | | |
| | | import static kr.wisestone.owl.domain.enumType.CustomFieldType.*; |
| | | |
| | |
| | | } else { |
| | | urls.add(useValue); |
| | | } |
| | | condition.setUrl(urls); |
| | | condition.setUrls(urls); |
| | | companyFields = this.companyFieldService.find(condition); |
| | | |
| | | if(companyFields != null && companyFields.size() > 0) { |
| | |
| | | // 가상 상위 이슈 추가 |
| | | parentIssueForm.setUseIssueCustomFields(issueApiForm.getUseIssueCustomFieldIds()); |
| | | // 같은 도메인 업체 찾기 |
| | | IssueForm partners = this.findCompanyField(parentIssueForm); |
| | | parentIssueForm.setIssueCompanyFields(partners.getIssueCompanyFields()); |
| | | parentIssueForm.setIssueIspFields(partners.getIssueIspFields()); |
| | | parentIssueForm.setIssueHostingFields(partners.getIssueHostingFields()); |
| | | if (parentIssueForm.getIssueCompanyFields() == null) { |
| | | IssueForm partners = this.findCompanyField(parentIssueForm); |
| | | parentIssueForm.setIssueCompanyFields(partners.getIssueCompanyFields()); |
| | | parentIssueForm.setIssueIspFields(partners.getIssueIspFields()); |
| | | parentIssueForm.setIssueHostingFields(partners.getIssueHostingFields()); |
| | | } |
| | | |
| | | Issue issue = addIssue(user, parentIssueForm, null); |
| | | issues.add(issue); |
| | |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * url 정규식 표현 |
| | | * @param url String |
| | | */ |
| | | private boolean verifyUrl(String url) { |
| | | boolean urlChk = false; |
| | | if (!StringUtils.isEmpty(url)) { |
| | | String reg = "^((http|https)://)?(www.)?([a-zA-Z0-9]+)\\.[a-z]+([a-zA-z0-9.?#]+)?"; |
| | | if(Pattern.matches(reg, url)) { |
| | | urlChk = true; |
| | | } |
| | | } |
| | | return urlChk; |
| | | } |
| | | |
| | | /** |
| | | * ip 정규식 표현 |
| | | * @param ip String |
| | | * @return boolean |
| | | */ |
| | | private boolean verifyIp(String ip) { |
| | | boolean ipChk = false; |
| | | if (!StringUtils.isEmpty(ip)) { |
| | | if (Pattern.matches("^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\" + |
| | | ".(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$", ip)) { |
| | | ipChk = true; |
| | | } |
| | | } |
| | | |
| | | return ipChk; |
| | | } |
| | | |
| | | // 중복된 상위 이슈 검색 |
| | | private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) { |
| | | List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues(); |
| | |
| | | |
| | | if (issueCustomFieldValueForms.size() > 0) { |
| | | String concatUseValue = ""; |
| | | String customFieldType = ""; |
| | | int useIdx = 0; |
| | | int cntIp = 0; |
| | | int cntSite = 0; |
| | |
| | | useValue = useValue.replace(" ",""); |
| | | } |
| | | |
| | | if (customFieldApiOverlap.getCustomField().getCustomFieldType().equals(IP_ADDRESS)) { |
| | | if (this.verifyIp(useValue)) { |
| | | long ip = ConvertUtil.ipToLong(useValue); |
| | | customFieldType = IP_ADDRESS.toString(); |
| | | if (cntIp == 0){ |
| | | condition.setIp(ip); |
| | | } |
| | | cntIp ++; |
| | | } |
| | | |
| | | if(customFieldApiOverlap.getCustomField().getCustomFieldType().equals(SITE)) { |
| | | if (this.verifyUrl(useValue)) { |
| | | customFieldType = SITE.toString(); |
| | | if (cntSite == 0) { |
| | | condition.setUrl(useValue); |
| | | } |
| | | cntSite ++; |
| | | } |
| | | |
| | | /*if (customFieldApiOverlap.getCustomField().getCustomFieldType().equals(IP_ADDRESS)) { |
| | | long ip = ConvertUtil.ipToLong(useValue); |
| | | customFieldType = IP_ADDRESS.toString(); |
| | | if (cntIp == 0){ |
| | | condition.setIp(ip); |
| | | } |
| | | cntIp ++; |
| | | }*/ |
| | | |
| | | /*if(customFieldApiOverlap.getCustomField().getCustomFieldType().equals(SITE)) { |
| | | customFieldType = SITE.toString(); |
| | | String[] urlArr = null; |
| | | List<String> urls = Lists.newArrayList(); |
| | | if (useValue.contains(",")) { |
| | |
| | | condition.setUrl(urls); |
| | | } |
| | | cntSite ++; |
| | | } |
| | | }*/ |
| | | |
| | | if (useIdx > 0) { |
| | | concatUseValue = concatUseValue.concat(comma); |
| | |
| | | } |
| | | |
| | | // 추가 할 url or ip에 포함되어있는 파트너 찾기 |
| | | this.findPartner(condition, issueCompanyFields, issueIspFields, issueHostingFields); |
| | | if ((condition.getIp() > 0) || (condition.getUrl() != null && !condition.getUrl().equals(""))) { |
| | | this.findPartner(condition, issueCompanyFields, issueIspFields, issueHostingFields); |
| | | } |
| | | |
| | | issueForm.setIssueCompanyFields(issueCompanyFields); |
| | | issueForm.setIssueIspFields(issueIspFields); |
| | |
| | | issueCustomFieldValueCondition.setUseValue(concatUseValue); |
| | | issueCustomFieldValueCondition.setUseValues(userValues); |
| | | issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId()); |
| | | issueCustomFieldValueCondition.setCustomFieldType(customFieldType); |
| | | // issueCustomFieldValueCondition.setIssueStatusType("CLOSE"); |
| | | List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition); |
| | | List<Map<String, Object>> results = Lists.newArrayList(); |
| | | if (customFieldType.equals(IP_ADDRESS.toString()) && issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) { |
| | | long ipValue = 0; |
| | | if (concatUseValue.contains(",")) { |
| | | String[] arr = concatUseValue.split(","); |
| | | for (String str : arr) { |
| | | ipValue = ConvertUtil.ipToLong(str); |
| | | } |
| | | } else { |
| | | ipValue = ConvertUtil.ipToLong(concatUseValue); |
| | | } |
| | | issueCustomFieldValueCondition.setUseValue(String.valueOf(ipValue)); |
| | | } |
| | | |
| | | if (issueCustomFieldValueCondition.getCustomFieldType() != null && !issueCustomFieldValueCondition.getCustomFieldType().equals("")) { |
| | | // 사용자정의필드 타입이 IP_ADDRESS 또는 SITE 일 경우 |
| | | results = this.issueMapper.findByCustomFieldValueByCompany(issueCustomFieldValueCondition); |
| | | } else { |
| | | results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition); |
| | | } |
| | | |
| | | if (results != null && results.size() > 0) { |
| | | for (Map<String, Object> result : results) { |
| | | resultIssueVos.add(this.getIssue(MapUtil.getLong(result, "id"))); |
| | |
| | | this.setAttachedFiles(issue, issueVo); // 첨부 파일 정보 셋팅 |
| | | this.setIssueCustomFields(issue, issueVo); // 사용자 정의 필드 값 정보 셋팅 |
| | | this.setRelationIssue(issue, issueVo); //연관 일감 셋팅 |
| | | this.setDownIssues(issue, issueVo); //하위 이슈 세팅 |
| | | this.setDownIssues(issue, issueVo, issueCondition.getHideCompleteIssue()); //하위 이슈 세팅 |
| | | break; |
| | | |
| | | case "02": // 프로젝트, 이슈 유형, 이슈 상태, 우선순위, 중요도, 담당자, 첨부파일, 사용자 정의 필드 정보, 댓글, 기록을 셋팅한다. |
| | | this.setIssueDetail(issueVo, issue, user); // 이슈 상세 정보를 셋팅한다. |
| | | if (issueCondition.getHideCompleteIssue() == null) { |
| | | issueCondition.setHideCompleteIssue(true); |
| | | } |
| | | this.setIssueDetail(issueVo, issue, user, issueCondition.getHideCompleteIssue()); // 이슈 상세 정보를 셋팅한다. |
| | | this.setIssueTableConfigs(issue, issueVo, issueCondition); |
| | | issueVo.setProjectVo(ConvertUtil.copyProperties(issue.getProject(), ProjectVo.class)); |
| | | break; |
| | |
| | | |
| | | |
| | | // 하위 이슈 정보를 셋팅한다 |
| | | private void setDownIssues(Issue issue, IssueVo issueVo) { |
| | | private void setDownIssues(Issue issue, IssueVo issueVo, boolean hideCompleteIssue) { |
| | | Page<Issue> downIssues = null; |
| | | |
| | | List<Issue> downIssueList = this.issueRepository.findByParentIssueId(issue.getId()); |
| | |
| | | startPage = (int) Math.floor(issueVo.getDownPage()/issueVo.getDownPageSize()); |
| | | } |
| | | Pageable pageable = PageRequest.of(startPage, issueVo.getDownPageSize()); |
| | | downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable); |
| | | |
| | | if(hideCompleteIssue){ |
| | | downIssues = this.issueRepository.findByParentIssueId(issue.getId(), IssueStatusType.CLOSE, pageable); |
| | | }else { |
| | | downIssues = this.issueRepository.findByParentIssueId(issue.getId(), pageable); |
| | | } |
| | | |
| | | } |
| | | if(downIssues != null){ |
| | | issueVo.setDownTotalPage(downIssues.getTotalPages()); |
| | |
| | | @Override |
| | | @Transactional(readOnly = true) |
| | | public void setIssueDetail(IssueVo issueVo, Issue issue, User user) { |
| | | setIssueDetail(issueVo, issue, user, false); |
| | | } |
| | | |
| | | @Override |
| | | @Transactional(readOnly = true) |
| | | public void setIssueDetail(IssueVo issueVo, Issue issue, User user, boolean hideCompleteIssue) { |
| | | // 이슈 수정 권한을 갖고 있는지 확인 |
| | | if (this.checkHasPermission(issueVo, issueVo.getUserVos(), user, issueVo.getDepartmentVos())) { |
| | | issueVo.setModifyPermissionCheck(Boolean.TRUE); |
| | |
| | | this.setAttachedFiles(issue, issueVo); // 첨부 파일 정보 셋팅 |
| | | this.setIssueCustomFields(issue, issueVo); // 사용자 정의 필드 값 정보 셋팅 |
| | | this.setRelationIssue(issue, issueVo); //연관 일감 셋팅 |
| | | this.setDownIssues(issue, issueVo); //하위 일감 세팅 |
| | | this.setDownIssues(issue, issueVo, hideCompleteIssue); //하위 일감 세팅 |
| | | this.setIssueComments(issue, issueVo); // 댓글 정보 셋팅 |
| | | this.setIssueHistory(issue, issueVo); // 이슈 기록 정보 셋팅 |
| | | |
| | |
| | | this.messageAccessor.getMessage(MsgConstants.ISSUE_REMOVE_NOT_SELECT)); |
| | | } |
| | | |
| | | List<Issue> removeIssues = Lists.newArrayList(); |
| | | Set<Long> removeIds = new HashSet<>(); |
| | | |
| | | for (Long issueId : issueForm.getRemoveIds()) { |
| | | removeIds.add(issueId); |
| | | //하위이슈 체크 |
| | | List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); |
| | | if(downIssues != null && downIssues.size() > 0){ |
| | | for(Issue downIssue : downIssues){ |
| | | Long downIssueId = downIssue.getId(); |
| | | downIssue = this.issueRemoves(downIssueId, user); |
| | | removeIssues.add(downIssue); |
| | | removeIds.add(downIssueId); |
| | | } |
| | | } |
| | | Issue issue = this.issueRemoves(issueId, user); |
| | | removeIssues.add(issue); |
| | | } |
| | | |
| | | for (Long removeId : removeIds) { |
| | | this.issueRemoves(removeId, user); |
| | | } |
| | | |
| | | // 사용자 시스템 기능 사용 정보 수집 |
| | | log.info(ElasticSearchUtil.makeUserActiveHistoryMessage(this.webAppUtil.getLoginUser(), ElasticSearchConstants.ISSUE_REMOVE)); |
| | | } |