From 916a3cbabe4e50062fce61ff6f2f5d46c05dfbd1 Mon Sep 17 00:00:00 2001 From: 이민희 <mhlee@maprex.co.kr> Date: 목, 17 3월 2022 17:47:45 +0900 Subject: [PATCH] - api로 이슈 추가 시 url/ip로 업체 찾는 코드 수정 --- src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java | 1064 +++++++++++++++++++++++++++++++++++++++-------------------- 1 files changed, 702 insertions(+), 362 deletions(-) diff --git a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java index 8d3e1be..fc676ec 100644 --- a/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java +++ b/src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java @@ -7,7 +7,6 @@ import kr.wisestone.owl.constant.*; import kr.wisestone.owl.data.CheckIssueData; import kr.wisestone.owl.domain.*; -import kr.wisestone.owl.domain.enumType.CustomFieldType; import kr.wisestone.owl.domain.enumType.EmailType; import kr.wisestone.owl.domain.enumType.IssueHistoryType; import kr.wisestone.owl.domain.enumType.IssueStatusType; @@ -46,11 +45,11 @@ import javax.servlet.http.HttpServletRequest; import java.io.IOException; -import java.text.SimpleDateFormat; +import java.text.ParseException; import java.util.*; -import static kr.wisestone.owl.domain.enumType.CustomFieldType.DATETIME; -import static kr.wisestone.owl.domain.enumType.CustomFieldType.INPUT; +import static kr.wisestone.owl.domain.enumType.CustomFieldType.*; +import static kr.wisestone.owl.web.condition.CompanyFieldCondition.IP_DEFAULT; @Service public class IssueServiceImpl extends AbstractServiceImpl<Issue, Long, JpaRepository<Issue, Long>> implements IssueService { @@ -253,7 +252,7 @@ IssueForm issueForm = ConvertUtil.copyProperties(issueApiForm, IssueForm.class); // issueForm.setFiles(issueApiForm.getFiles()); IssueType issueType = this.issueTypeService.getIssueType(issueApiForm.getIssueTypeId()); - if (issueType == null){ + if (issueType == null) { throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_ISSUE_TYPE_ERROR)); } @@ -267,7 +266,7 @@ issueForm.addDepartmentId(departmentId); } } - } else if (issueApiForm.getIssueStatusId() == null){ + } else if (issueApiForm.getIssueStatusId() == null) { throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_ISSUE_STATUS_NOT_EXIST)); } else if (!this.workflowTransitionService.contains(issueApiForm.getIssueStatusId(), workflow.getId())) { //�씠�뒋 �긽�깭 �쑀�슚�꽦 �솗�씤 @@ -276,7 +275,7 @@ // �봽濡쒖젥�듃 �엯�젰 Project project = issueType.getProject(); - if (project == null){ + if (project == null) { throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_PROJECT_ERROR)); } issueForm.setProjectId(project.getId()); @@ -310,8 +309,8 @@ issueApiForm.addUseIssueCustomFieldId(customFieldApiOverlap.getCustomField().getId()); } - // 醫낅즺�긽�깭媛� �븘�땶 以묐났�맂 �긽�쐞 �씠�뒋寃��깋 - List<Issue> issues = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId()); + // 以묐났�맂 �긽�쐞 �씠�뒋寃��깋 + List<Issue> issues = this.findIssue(issueApiForm, issueForm, customFieldApiOverlaps); int size = issues.size(); if (size > 0) { Issue targetIssue = issues.get(0); @@ -328,7 +327,6 @@ // �궗�슜�옄 �젙�쓽 �븘�뱶 �꽕�젙 issueForm.setIssueCustomFields(issueApiForm.getCustomFieldValues()); // 媛숈� �룄硫붿씤 �뾽泥� 李얘린 - this.findCompanyField(issueForm); // api �엯�젰媛� �쟻�슜 ConvertUtil.copyProperties(issueApiForm, issueForm); @@ -340,10 +338,16 @@ } } + /** + * �룄硫붿씤�씠 �룞�씪�븳 �뾽泥� 李얘린 + * + * @param issueForm IssueForm + * @return IssueForm + */ private IssueForm findCompanyField(IssueForm issueForm) { - if(issueForm.getIssueCustomFields() != null && issueForm.getIssueCustomFields().size() > 0) { + if (issueForm.getIssueCustomFields() != null && issueForm.getIssueCustomFields().size() > 0) { CompanyFieldCondition condition = new CompanyFieldCondition(); - List<Map<String, Object>> companyFields = this.companyFieldService.find(condition); + List<Map<String, Object>> companyFields = Lists.newArrayList(); List<Map<String, Object>> issueCompanyFields = Lists.newArrayList(); List<Map<String, Object>> issueIspFields = Lists.newArrayList(); List<Map<String, Object>> issueHostingFields = Lists.newArrayList(); @@ -351,27 +355,36 @@ for (Map<String, Object> issueCustomField : issueForm.getIssueCustomFields()) { Long customFieldId = MapUtil.getLong(issueCustomField, "customFieldId"); CustomField customField = this.customFieldService.getCustomField(customFieldId); - if(customField != null && customField.getCustomFieldType().toString().equals("SITE") && customField.getName().equals("�룄硫붿씤")) { + if (customField != null && customField.getCustomFieldType().equals(SITE) && customField.getName().equals("�룄硫붿씤")) { String useValue = issueCustomField.get("useValue").toString(); - if(companyFields != null && companyFields.size() > 0) { + String[] urlArr = null; + List<String> urls = Lists.newArrayList(); + if (useValue.contains(",")) { + urlArr = useValue.split(","); + urls.addAll(Arrays.asList(urlArr)); + } else { + urls.add(useValue); + } + condition.setUrls(urls); + companyFields = this.companyFieldService.find(condition); + + if (companyFields != null && companyFields.size() > 0) { for (Map<String, Object> companyField : companyFields) { CompanyFieldVo companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class); - if(companyFieldVo.getUrl() != null && useValue.equals(companyFieldVo.getUrl())) { - companyField.put("companyId", companyField.get("id")); - issueCompanyFields.add(companyField); - if(companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) { - Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId()); - if (ispField != null) { - ispField.put("ispId", ispField.get("id")); - issueIspFields.add(ispField); - } + companyField.put("companyId", companyField.get("id")); + issueCompanyFields.add(companyField); + if (companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) { + Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId()); + if (ispField != null) { + ispField.put("ispId", ispField.get("id")); + issueIspFields.add(ispField); } - if(companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) { - Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId()); - if (hostingField != null) { - hostingField.put("hostingId", hostingField.get("id")); - issueHostingFields.add(hostingField); - } + } + if (companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) { + Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId()); + if (hostingField != null) { + hostingField.put("hostingId", hostingField.get("id")); + issueHostingFields.add(hostingField); } } } @@ -384,6 +397,96 @@ } return issueForm; + } + + /** + * �엯�젰�븳 ip媛� 湲곗〈 �뾽泥� 以묒뿉 �냽�빐�엳�뒗吏� 泥댄겕 + * + * @param ip IP + * @param startIps �뾽泥� �뀒�씠釉붿뿉 議댁옱�븯�뒗 start_ip(�젙�닔濡� 蹂��솚�븳 媛�) + * @param endIps �뾽泥� �뀒�씠釉붿뿉 議댁옱�븯�뒗 end_ip(�젙�닔濡� 蹂��솚�븳 媛�) + * @return IP媛� �냽�빐 �엳�뒗吏� 寃곌낵 媛� + */ + boolean containsIP(Long ip, List<Long> startIps, List<Long> endIps) { + if (startIps != null && startIps.size() > 0 && endIps != null && endIps.size() > 0) { + for (int i = 0; i < startIps.size(); i++) { + if (startIps.get(i) <= ip && endIps.get(i) >= ip) { + return true; + } + } + } + return false; + } + + + /** + * 議곌굔�뿉 留욌뒗 �뙆�듃�꼫 �젙蹂� 李얘린 + * + * @param condition CompanyFieldCondition + * @param issueCompanyFields List<Map<String, Object>> + * @param issueIspFields List<Map<String, Object>> + * @param issueHostingFields List<Map<String, Object>> + */ + private CompanyFieldVo findPartner(CompanyFieldCondition condition, List<Map<String, Object>> issueCompanyFields + , List<Map<String, Object>> issueIspFields, List<Map<String, Object>> issueHostingFields) { + + Long ip = condition.getIp(); + List<Map<String, Object>> companyFieldList = Lists.newArrayList(); + + if (ip > IP_DEFAULT) { + List<CompanyField> companyFields = this.companyFieldService.findAll(); + if (companyFields != null && companyFields.size() > 0) { + for (CompanyField companyField : companyFields) { + if (companyField.getIpStart() != null && companyField.getIpEnd() != null) { + List<Long> startIps = ConvertUtil.ipToLongs(companyField.getIpStart()); + List<Long> endIps = ConvertUtil.ipToLongs(companyField.getIpEnd()); + + if (containsIP(ip, startIps, endIps)) { + companyFieldList.add(ConvertUtil.convertObjectToMap(companyField)); + break; + } + } + } + // api �궗�슜�옄�젙�쓽�븘�뱶 媛믪뿉 IP,URL �몮 �떎 �엯�젰 �뻽�쓣 寃쎌슦 + if (!StringUtils.isEmpty(condition.getUrl()) && companyFieldList.size() > 0) { + for (Map<String, Object> companyFieldMap : companyFieldList) { + CompanyField companyField = ConvertUtil.convertMapToClass(companyFieldMap, CompanyField.class); + if (companyField != null && !StringUtils.isEmpty(companyField.getUrl())) { + if (!companyField.getUrl().contains(condition.getUrl())) { + companyFieldList.clear(); + } + break; + } + } + } + } + } else { + companyFieldList = this.companyFieldService.find(condition); + } + + CompanyFieldVo companyFieldVo = null; + if (companyFieldList != null && companyFieldList.size() > 0) { + for (Map<String, Object> companyField : companyFieldList) { + companyFieldVo = ConvertUtil.convertMapToClass(companyField, CompanyFieldVo.class); + companyField.put("companyId", companyField.get("id")); + issueCompanyFields.add(companyField); + if (companyFieldVo.getIspId() != null && companyFieldVo.getIspId() != -1) { + Map<String, Object> ispField = this.ispFieldService.find(companyFieldVo.getIspId()); + if (ispField != null) { + ispField.put("ispId", ispField.get("id")); + issueIspFields.add(ispField); + } + } + if (companyFieldVo.getHostingId() != null && companyFieldVo.getHostingId() != -1) { + Map<String, Object> hostingField = this.hostingFieldService.find(companyFieldVo.getHostingId()); + if (hostingField != null) { + hostingField.put("hostingId", hostingField.get("id")); + issueHostingFields.add(hostingField); + } + } + } + } + return companyFieldVo; } private User convertToUser(String token) { @@ -412,10 +515,12 @@ // 媛��긽 �긽�쐞 �씠�뒋 異붽� 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); @@ -436,39 +541,106 @@ return null; } - // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋 - private List<Issue> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) { - List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues(); - List<Issue> resultIssueVos = Lists.newArrayList(); - String comma = ","; + /** + * �궗�슜�옄�젙�쓽 �븘�뱶 寃��궗 + * �룄硫붿씤 or IP �씪 寃쎌슦留� 泥섎━�븯湲� �쐞�븿 + * + * @param issueCustomFieldValueForms �궗�슜�옄 �젙�쓽 �븘�뱶 媛� 諛곗뿴 + * @return �뾽泥� 寃��깋 議곌굔 + */ + private CompanyFieldCondition validIssueCustomFieldValue(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) { + CompanyFieldCondition condition = new CompanyFieldCondition(); if (issueCustomFieldValueForms.size() > 0) { - String concatUseValue = ""; - int useIdx = 0; - IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator(); Collections.sort(issueCustomFieldValueForms, comp); - List<String> userValues = Lists.newArrayList(); for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { - userValues.add(issueCustomFieldValueForm.getUseValue()); - for(CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) { + + for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) { if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) { - if (useIdx > 0) { - concatUseValue = concatUseValue.concat(comma); + String useValue = issueCustomFieldValueForm.getUseValue(); + if (CommonUtil.verifyIp(useValue)) { + long ip = ConvertUtil.ipToLong(useValue); + if (condition.getIp() <= IP_DEFAULT) { + condition.setIp(ip); + } else { + throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_IP_ERROR)); + } + } else if (CommonUtil.verifyUrl(useValue)) { + if (StringUtils.isEmpty(condition.getUrl())) { + condition.setUrl(useValue); + } else { + throw new ApiParameterException(this.messageAccessor.getMessage(MsgConstants.API_PARAMETER_URL_ERROR)); + } } - concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue()); - useIdx++; } } } + } + return condition; + } + + String ConvertToString(List<IssueCustomFieldValueForm> issueCustomFieldValueForms, List<CustomFieldApiOverlap> customFieldApiOverlaps) { + String concatUseValue = ""; + int useIdx = 0; + + for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { + + for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) { + if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) { + + if (useIdx > 0) { + concatUseValue = concatUseValue.concat(CommonUtil.COMMA); + } + concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue()); + useIdx++; + } + } + } + + return concatUseValue; + } + + List<String> GetOverlapUseValues(List<IssueCustomFieldValueForm> issueCustomFieldValueForms) { + List<String> resultValues = Lists.newArrayList(); + for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { + resultValues.add(issueCustomFieldValueForm.getUseValue()); + } + return resultValues; + } + + // 以묐났�맂 �긽�쐞 �씠�뒋 寃��깋 + private List<Issue> findIssue(IssueApiForm issueApiform, IssueForm issueForm, List<CustomFieldApiOverlap> customFieldApiOverlaps) { + List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues(); + List<Issue> resultIssueVos = Lists.newArrayList(); + CompanyFieldVo companyFieldVo = null; + + CompanyFieldCondition condition = validIssueCustomFieldValue(issueCustomFieldValueForms, customFieldApiOverlaps); + if (condition.getIp() != null || !StringUtils.isEmpty(condition.getUrl())) { + // 異붽� �븷 url or ip�뿉 �룷�븿�릺�뼱�엳�뒗 �뙆�듃�꼫 李얘린 + companyFieldVo = this.findPartner(condition, issueForm.getIssueCompanyFields(), issueForm.getIssueIspFields(), issueForm.getIssueHostingFields()); + } + + if (issueCustomFieldValueForms.size() > 0) { + String concatUseValue = ConvertToString(issueCustomFieldValueForms, customFieldApiOverlaps); + List<String> useValues = GetOverlapUseValues(issueCustomFieldValueForms); IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition(); issueCustomFieldValueCondition.setUseValue(concatUseValue); - issueCustomFieldValueCondition.setUseValues(userValues); + issueCustomFieldValueCondition.setUseValues(useValues); issueCustomFieldValueCondition.setIssueTypeId(issueApiform.getIssueTypeId()); - issueCustomFieldValueCondition.setIssueStatusType("CLOSE"); - List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition); +// issueCustomFieldValueCondition.setIssueStatusType("CLOSE"); + List<Map<String, Object>> results = Lists.newArrayList(); + + if (companyFieldVo != null) { + // url or ip瑜� �넻�빐 �뾽泥대�� 李얠븯�쓣 寃쎌슦 + issueCustomFieldValueCondition.setUseValue(companyFieldVo.getUrl()); + results = this.issueMapper.findByCustomFieldValueBySite(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"))); @@ -519,9 +691,15 @@ issue.setIssueType(issueType); issue.setPriority(priority); issue.setSeverity(severity); - if (issueForm.getParentIssueId() != null){ + if (issueForm.getParentIssueId() != null) { Issue parentIssue = this.getIssue(issueForm.getParentIssueId()); issue.setParentIssue(parentIssue); + + // �긽�쐞 �씠�뒋媛� 醫낅즺�씪寃쎌슦 ��湲곕줈 蹂�寃� + IssueStatus parentIssueStatus = parentIssue.getIssueStatus(); + if (parentIssueStatus.getIssueStatusType().equals(IssueStatusType.CLOSE)) { + parentIssue.setIssueStatus(issueStatus); + } } issue.setIssueNumber(this.issueNumberGeneratorService.generateIssueNumber(project)); // 媛� �봽濡쒖젥�듃�쓽 怨좎쑀 �씠�뒋 踰덊샇 �깮�꽦 @@ -529,6 +707,16 @@ issue = this.issueRepository.saveAndFlush(issue); issue.setReverseIndex(issue.getId() * -1); // 荑쇰━ �냽�룄 媛쒖꽑�쓣 �쐞�빐 由щ쾭�뒪 �씤�뜳�뒪 �깮�꽦 + + if (issueForm.getParentIssueId() != null) { + Issue parentIssue = this.getIssue(issueForm.getParentIssueId()); + if (issueForm.getIsApi().equals(Issue.IS_API_YES) + || (issueForm.getInheritYn() != null && issueForm.getInheritYn())) { + // �븯�쐞�씠�뒋�뿉 �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �쟻�슜 + this.inheritPartners(issue, parentIssue); + } + } + // �떞�떦�옄 吏��젙 //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds()); // �떞�떦遺��꽌 吏��젙 @@ -576,15 +764,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(); // �궗�슜�븯怨� �엳�뒗 �뾽臾� 怨듦컙�씠 �솢�꽦 �긽�깭�씤吏� �솗�씤�븳�떎. �궗�슜 怨듦컙�뿉�꽌 濡쒓렇�씤�븳 �궗�슜�옄媛� 鍮꾪솢�꽦�씤吏� �솗�씤�븳�떎. @@ -614,7 +802,7 @@ issue.setIssueType(issueType); issue.setPriority(priority); issue.setSeverity(severity); - if (issueForm.getParentIssueId() != null){ + if (issueForm.getParentIssueId() != null) { Issue parentIssue = this.getIssue(issueForm.getParentIssueId()); issue.setParentIssue(parentIssue); } @@ -648,6 +836,7 @@ this.issueHistoryService.addIssueHistory(issue, user, IssueHistoryType.ADD, null); // �씠�뒋 �쐞�뿕 愿�由� �깮�꽦 this.issueRiskService.addIssueRisk(issue, project.getWorkspace()); + // �쁺�냽�꽦 而⑦뀓�뒪�듃 鍮꾩슦湲� this.clear(); // �씠�뒋 �깮�꽦, �궘�젣�떆 �삁�빟 �씠硫붿씪�뿉 �벑濡앺빐�넃�뒗�떎. @@ -657,7 +846,23 @@ 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; } // �뿰愿��씠�뒋瑜� �깮�꽦�븳�떎. @@ -692,7 +897,7 @@ issue.setIssueType(issueType); issue.setPriority(priority); issue.setSeverity(severity); - if (issueForm.getParentIssueId() != null){ + if (issueForm.getParentIssueId() != null) { Issue parentIssue = this.getIssue(issueForm.getParentIssueId()); issue.setParentIssue(parentIssue); } @@ -867,15 +1072,30 @@ } } - // �궇吏� �쑀�슚�꽦 泥댄겕 + /** + * �궇吏� �쑀�슚�꽦 泥댄겕 + * + * @param startDate �떆�옉 �씪�옄(臾몄옄) + * @param completeDate 醫낅즺 �씪�옄(臾몄옄) + */ private void checkStartCompleteDate(String startDate, String completeDate) { if (!StringUtils.isEmpty(startDate) && !StringUtils.isEmpty(completeDate)) { Date start = DateUtil.convertStrToDate(startDate, "yy-MM-dd"); Date end = DateUtil.convertStrToDate(completeDate, "yy-MM-dd"); - if (start.getTime() > end.getTime()) { - throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.DATE_PICKER_NOT_AVAILABLE)); - } + checkStartCompleteDate(start, end); + } + } + + /** + * �궇吏� �쑀�슚�꽦 泥댄겕 + * + * @param start �떆�옉 �씪�옄 + * @param end 醫낅즺 �씪�옄 + */ + private void checkStartCompleteDate(Date start, Date end) { + if (start.getTime() > end.getTime()) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.DATE_PICKER_NOT_AVAILABLE)); } } @@ -886,13 +1106,13 @@ } } - void SetMyDepartmentId(IssueCondition issueCondition){ + void SetMyDepartmentId(IssueCondition issueCondition) { Long loginId = issueCondition.getLoginUserId(); List<Long> myDepartmentIds = Lists.newArrayList(); List<UserDepartment> myDepartments = this.userDepartmentRepository.findByUserId(loginId); - if(myDepartments != null && myDepartments.size() > 0){ - for(UserDepartment myDepartment : myDepartments){ + if (myDepartments != null && myDepartments.size() > 0) { + for (UserDepartment myDepartment : myDepartments) { myDepartmentIds.add(myDepartment.getDepartmentId()); } } else { @@ -901,31 +1121,31 @@ issueCondition.setMyDepartmentIds(myDepartmentIds); } - void SetAllDepartmentId(IssueCondition issueCondition){ + void SetAllDepartmentId(IssueCondition issueCondition) { List<Long> departmentIds = Lists.newArrayList(); List<Map<String, Object>> departmentList = this.departmentMapper.find(null); - if(departmentList != null && departmentList.size() > 0){ - for(Map<String, Object> department : departmentList){ + if (departmentList != null && departmentList.size() > 0) { + for (Map<String, Object> department : departmentList) { departmentIds.add((Long) department.get("id")); } } issueCondition.setMyDepartmentIds(departmentIds); } - void SetWorkflowDepartment(List<IssueVo> issueVos){ - for(IssueVo issueVo : issueVos){ + void SetWorkflowDepartment(List<IssueVo> issueVos) { + for (IssueVo issueVo : issueVos) { Long issueTypeId = issueVo.getIssueTypeId(); IssueType issueType = this.issueTypeService.getIssueType(issueTypeId); Long workflowId = issueType.getWorkflow().getId(); List<WorkflowDepartment> workflowDepartmentList = this.workflowDepartmentRepository.findByWorkflowId(workflowId); List<Long> workflowDepartmentIds = Lists.newArrayList(); - if(workflowDepartmentList != null && workflowDepartmentList.size()>0){ - for(WorkflowDepartment workflowDepartment : workflowDepartmentList){ + if (workflowDepartmentList != null && workflowDepartmentList.size() > 0) { + for (WorkflowDepartment workflowDepartment : workflowDepartmentList) { workflowDepartmentIds.add(workflowDepartment.getDepartment().getId()); } } - if(issueVo.getIssueTypeId().equals(issueTypeId)){ + if (issueVo.getIssueTypeId().equals(issueTypeId)) { issueVo.setWorkflowDepartmentIds(workflowDepartmentIds); } } @@ -1016,13 +1236,13 @@ // �븯�쐞 �씠�뒋 �꽭�똿(�옱洹�) private void setDownIssues(User user, List<IssueVo> issueVos) { - for(IssueVo issueVo : issueVos) { + for (IssueVo issueVo : issueVos) { List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueVo.getId()); List<IssueVo> downIssueVos = Lists.newArrayList(); IssueCondition issueCondition = new IssueCondition(); issueCondition.addIssueIds(String.valueOf(issueVo.getId())); - for(Issue downIssue : downIssues){ + for (Issue downIssue : downIssues) { IssueVo addIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class); addIssueVo.setIssueTypeId(downIssue.getIssueType().getId()); downIssueVos.add(addIssueVo); @@ -1047,9 +1267,9 @@ // �뿰愿� �씠�뒋 �꽭�똿 private void setRelationIssues(List<IssueVo> issueVos) { - for(IssueVo issueVo : issueVos) { + for (IssueVo issueVo : issueVos) { List<IssueVo> relationIssues = this.issueRelationService.findRelationIssue(issueVo.getId()); - for(IssueVo relationIssue : relationIssues){ + for (IssueVo relationIssue : relationIssues) { issueVo.addRelationIssueVo(ConvertUtil.copyProperties(relationIssue, IssueVo.class)); } } @@ -1057,11 +1277,11 @@ // �긽�쐞 �씠�뒋 泥댄겕 private void setParentIssue(List<IssueVo> issueVos) { - for(IssueVo issueVo : issueVos) { - if(issueVo.getParentIssueId() != null) { + for (IssueVo issueVo : issueVos) { + if (issueVo.getParentIssueId() != null) { Issue parentIssue = this.getIssue(issueVo.getParentIssueId()); //issueVo.setParentIssueVo(ConvertUtil.copyProperties(parentIssue, IssueVo.class)); - if(parentIssue.getIssueCustomFieldValues() == null || parentIssue.getIssueCustomFieldValues().size() == 0){ + if (parentIssue.getIssueCustomFieldValues() == null || parentIssue.getIssueCustomFieldValues().size() == 0) { issueVo.setIssueCustomFieldValueVos(null); } ConvertUtil.copyProperties(parentIssue, issueVo); @@ -1072,13 +1292,13 @@ @Override @Transactional(readOnly = true) public void setCountDownIssues(List<IssueVo> issueVos) { - for (IssueVo issueVo : issueVos){ + for (IssueVo issueVo : issueVos) { List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueVo.getId()); //�븯�쐞�씠�뒋 媛��졇�삤湲� - if(downIssues != null && downIssues.size() > 0){ //�긽�쐞�씠�뒋 媛�吏�怨� �엳�뒗 �븷�뱾�씠 �엳�쑝硫� + if (downIssues != null && downIssues.size() > 0) { //�긽�쐞�씠�뒋 媛�吏�怨� �엳�뒗 �븷�뱾�씠 �엳�쑝硫� int downIssueAllCount = 0;// �븯�쐞�씠�뒋 �쟾泥� 移댁슫�듃 int downIssueCount = 0;// �븯�쐞�씠�뒋 誘몄셿猷� 移댁슫�듃 - for(Issue downIssue : downIssues){ - downIssueAllCount ++; + for (Issue downIssue : downIssues) { + downIssueAllCount++; Long parentIssueId = downIssue.getParentIssue().getId(); Issue parentIssue = this.getIssue(parentIssueId); IssueVo parentIssueVo = ConvertUtil.copyProperties(parentIssue, IssueVo.class); @@ -1088,8 +1308,8 @@ IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class); downIssueVo.setIssueStatusType(downIssueStatus.getIssueStatusType().toString()); - if(!downIssueVo.getIssueStatusType().equals("CLOSE")){ //誘몄셿猷� �븯�쐞�씠�뒋 泥댄겕 - downIssueCount ++; + if (!downIssueVo.getIssueStatusType().equals("CLOSE")) { //誘몄셿猷� �븯�쐞�씠�뒋 泥댄겕 + downIssueCount++; } issueVo.setDownIssueCount(downIssueCount); @@ -1159,7 +1379,7 @@ IssueCondition issueCondition, Pageable pageable) { // 寃��깋 議곌굔�쓣 留뚮뱺�떎 - if (!this.makeIssueSearchCondition(issueCondition,Lists.newArrayList("01", "02", "03"), pageable)) { + if (!this.makeIssueSearchCondition(issueCondition, Lists.newArrayList("01", "02", "03"), pageable)) { // �씠�뒋 紐⑸줉�쓣 李얠� 紐삵븷 寃쎌슦 湲곕낯 �젙蹂대줈 由ы꽩�븳�떎. this.notFoundIssueList(resJsonData, pageable); return Lists.newArrayList(); @@ -1256,6 +1476,9 @@ private void setMapToIssueVo(List<Map<String, Object>> results, List<IssueVo> issueVos, IssueCondition issueCondition, User user) { for (Map<String, Object> result : results) { IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class); + if (MapUtil.getString(result, "inheritPartners") != null && MapUtil.getString(result, "inheritPartners").equals("1")) { + issueVo.setInheritPartners(true); + } issueVos.add(issueVo); issueCondition.addIssueIds(String.valueOf(issueVo.getId())); } @@ -1291,12 +1514,11 @@ // �봽濡쒖젥�듃瑜� �꽑�깮�븯吏� �븡�븯�쑝硫� �빐�떦 �뾽臾� 怨듦컙�뿉�꽌 李몄뿬�븯怨� �엳�뒗 �봽濡쒖젥�듃瑜� 李얜뒗�떎. if (condition.getProjectIds().size() < 1) { List<Map<String, Object>> projects = Lists.newArrayList(); - if (this.userWorkspaceService.checkWorkspaceManager(user) || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_PROJECT)){ + if (this.userWorkspaceService.checkWorkspaceManager(user) || MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_PROJECT)) { return true; }/*else if (MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE)){ projects = this.projectService.findByWorkspaceIdAndIncludeProjectAll(projectStatues, condition.getProjectType()); - }*/ - else { + }*/ else { projects = this.projectService.findByWorkspaceIdAndIncludeProject(projectStatues, condition.getProjectType()); } @@ -1343,7 +1565,7 @@ || (MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_PROJECT) && MngPermission.checkMngPermission(userLevel.getPermission(), MngPermission.USER_PERMISSION_MNG_ISSUE))) { projects = this.projectMapper.findByWorkspaceManagerAll(projectCondition); - } else { + } else { projects = this.projectService.findByWorkspaceIdAndIncludeProjectAll(projectCondition); } List<Long> projectIds = Lists.newArrayList(); @@ -1531,11 +1753,14 @@ 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; @@ -1569,24 +1794,30 @@ // �븯�쐞 �씠�뒋 �젙蹂대�� �뀑�똿�븳�떎 - 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()); - if(downIssueList != null && downIssueList.size() > 0) { + if (downIssueList != null && downIssueList.size() > 0) { int startPage = 0; if (issueVo.getDownPage() != 0) { - startPage = (int) Math.floor(issueVo.getDownPage()/issueVo.getDownPageSize()); + 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){ + if (downIssues != null) { issueVo.setDownTotalPage(downIssues.getTotalPages()); issueVo.setDownTotalCount(downIssues.getTotalElements()); List<IssueVo> resultList = new ArrayList<>(); - for(Issue downIssue : downIssues){ + for (Issue downIssue : downIssues) { IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class); downIssueVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class)); downIssueVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class)); @@ -1617,6 +1848,12 @@ @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); @@ -1635,7 +1872,7 @@ 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); // �씠�뒋 湲곕줉 �젙蹂� �뀑�똿 @@ -1656,12 +1893,12 @@ this.setIssueCompanyField(issue, issueVo); //�뾽泥� �젙蹂� �꽭�똿 this.setIssueIspField(issue, issueVo); //ISP �젙蹂� �꽭�똿 this.setIssueHostingField(issue, issueVo); //HOSTING �젙蹂� �꽭�똿 - this.setParentIssue(issue,issueVo); //�긽�쐞 �씠�뒋 �젙蹂� �꽭�똿 + this.setParentIssue(issue, issueVo); //�긽�쐞 �씠�뒋 �젙蹂� �꽭�똿 } // �긽�쐞�씪媛� �젙蹂� 異붽� private void setParentIssue(Issue issue, IssueVo issueVo) { - if(issue.getParentIssue() != null){ + if (issue.getParentIssue() != null) { issueVo.setParentIssueVo(ConvertUtil.copyProperties(issue.getParentIssue(), IssueVo.class)); } } @@ -1794,7 +2031,7 @@ List<UserDepartment> userDepartments = this.userDepartmentRepository.findByDepartmentId(departmentVo.getId()); if (userDepartments != null && userDepartments.size() > 0) { for (UserDepartment userDepartment : userDepartments) { - if (userDepartment.getUserId().equals(this.webAppUtil.getLoginId())){ + if (userDepartment.getUserId().equals(this.webAppUtil.getLoginId())) { issueVo.setModifyPermissionCheck(Boolean.TRUE); } } @@ -1988,7 +2225,7 @@ checkIssueData.setPriority(priority); checkIssueData.setSeverity(severity); - return checkIssueData; + return checkIssueData; } // �씠�뒋 �닔�젙(API�슜) @@ -2037,7 +2274,6 @@ } - private Issue saveIssue(IssueForm issueForm, CheckIssueData checkIssueData) { Issue issue = checkIssueData.getIssue(); ConvertUtil.copyProperties(issueForm, issue, "id"); @@ -2081,7 +2317,7 @@ issue = this.saveIssue(issueForm, checkIssueData); //this.issueUserService.modifyIssueUser(issue, project.getWorkspace(), issueForm.getUserIds()); // �떞�떦遺��꽌 吏��젙 - if(issueForm.getDepartmentIds().size()>0){ + if (issueForm.getDepartmentIds().size() > 0) { this.issueDepartmentService.modifyIssueDepartment(issue, user, project.getWorkspace(), issueForm.getDepartmentIds()); } @@ -2106,6 +2342,15 @@ this.issueIspService.modifyIssueIspField(issue, issueForm, detectIssueChange); // HOSTING �젙蹂� ���옣 this.issueHostingService.modifyIssueHostingField(issue, issueForm, detectIssueChange); + + // �뙆�듃�꼫�젙蹂� �븯�쐞�씠�뒋 �긽�냽 + List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId()); + if (issueForm.getInheritYn() != null && issueForm.getInheritYn() + && downIssues != null && downIssues.size() > 0) { + for (Issue downIssue : downIssues) { + this.inheritPartners(downIssue, issue); + } + } // �씠�뒋 �씠�젰 �벑濡� if (!StringUtils.isEmpty(detectIssueChange.toString())) { @@ -2343,9 +2588,9 @@ // �씠�뒋 �떞�떦遺��꽌 �뿬遺� �솗�씤 for (DepartmentVo departmentVo : departmentVos) { List<UserDepartment> userDepartments = this.userDepartmentService.findByDepartmentId(departmentVo.getId()); - if(userDepartments != null && userDepartments.size() > 0) { + if (userDepartments != null && userDepartments.size() > 0) { for (UserDepartment userDepartment : userDepartments) { - if (userDepartment.getUserId().equals(user.getId())){ + if (userDepartment.getUserId().equals(user.getId())) { hasPermission = true; break; } @@ -2513,9 +2758,9 @@ for (Long issueId : issueForm.getRemoveIds()) { //�븯�쐞�씠�뒋 泥댄겕 List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); - if(downIssues != null && downIssues.size() > 0){ - for(Issue downIssue : downIssues){ - if(downIssue.getParentIssue() != null){ + if (downIssues != null && downIssues.size() > 0) { + for (Issue downIssue : downIssues) { + if (downIssue.getParentIssue() != null) { downIssue.setParentIssue(null); } } @@ -2546,21 +2791,24 @@ 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){ + 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)); } @@ -2583,8 +2831,8 @@ for (Long issueId : issueForm.getRemoveIds()) { //�궘�젣 �븷 �씠�뒋�쓽 �븯�쐞�씠�뒋 泥댄겕 List<Issue> downIssues = this.issueRepository.findByParentIssueId(issueId); - if(downIssues != null && downIssues.size() > 0){ - for(Issue downIssue : downIssues){ + if (downIssues != null && downIssues.size() > 0) { + for (Issue downIssue : downIssues) { downIssueId = downIssue.getId(); } } @@ -2597,7 +2845,7 @@ private Issue issueRemoves(Long issueId, User user) { Issue issue = null; - if(issueId != null){ + if (issueId != null) { issue = this.getIssue(issueId); } // �씠�뒋 �닔�젙 沅뚰븳�쓣 媛뽮퀬 �엳�뒗吏� �솗�씤 @@ -2617,7 +2865,7 @@ // 吏��슱 �씠�뒋媛� �뿰愿��씠�뒋�씤吏� 泥댄겕 �썑 �뿰愿��씠�뒋 �뀒�씠釉붿뿉�꽌�룄 �궘�젣�븳�떎. List<IssueRelation> issueRelationList = this.issueRelationRepository.findByRelationIssueId(issueId); if (issueRelationList != null && issueRelationList.size() > 0) { - for(IssueRelation issueRelation : issueRelationList){ + for (IssueRelation issueRelation : issueRelationList) { StringBuilder sb = new StringBuilder(); issueHistoryService.detectRelationIssue(IssueHistoryType.DELETE, issueRelation, sb); issueHistoryService.addIssueHistory(issueRelation.getIssue(), IssueHistoryType.MODIFY, sb.toString()); @@ -2818,8 +3066,16 @@ for (IssueVo issueVo : issueVos) { for (Map<String, Object> issueCustomFieldValue : issueCustomFieldValues) { + int count = 0; + Map<String, Object> useValues = new HashMap<>(); + if (issueVo.getId().equals(MapUtil.getLong(issueCustomFieldValue, "issueId"))) { IssueCustomFieldValueVo issueCustomFieldValueVo = new IssueCustomFieldValueVo(); + + useValues.put("useValue" + count, MapUtil.getString(issueCustomFieldValue, "useValue")); + useValues.put("customFieldId", MapUtil.getLong(issueCustomFieldValue, "customFieldId")); + issueCustomFieldValueVo.setUseValues(useValues); + issueCustomFieldValueVo.setUseValue(MapUtil.getString(issueCustomFieldValue, "useValue")); CustomFieldVo customFieldVo = new CustomFieldVo(); @@ -2835,7 +3091,7 @@ private void setIssueCompanyField(Issue issue, IssueVo issueVo) { List<IssueCompanyVo> issueCompanyVos = Lists.newArrayList(); - for(IssueCompany issueCompany : issue.getIssueCompanies()){ + for (IssueCompany issueCompany : issue.getIssueCompanies()) { IssueCompanyVo issueCompanyVo = ConvertUtil.copyProperties(issueCompany, IssueCompanyVo.class); issueCompanyVo.setId(issueCompany.getId()); CompanyField companyField = issueCompany.getCompanyField(); @@ -2875,7 +3131,7 @@ private void setIssueIspField(Issue issue, IssueVo issueVo) { List<IssueIspVo> issueIspVos = Lists.newArrayList(); - for(IssueIsp issueIsp : issue.getIssueIspFields()){ + for (IssueIsp issueIsp : issue.getIssueIspFields()) { IssueIspVo issueIspVo = ConvertUtil.copyProperties(issueIsp, IssueIspVo.class); issueIspVo.setId(issueIsp.getId()); IspField ispField = issueIsp.getIspField(); @@ -2891,7 +3147,7 @@ private void setIssueHostingField(Issue issue, IssueVo issueVo) { List<IssueHostingVo> issueHostingVos = Lists.newArrayList(); - for(IssueHosting issueHosting : issue.getIssueHostingFields()){ + for (IssueHosting issueHosting : issue.getIssueHostingFields()) { IssueHostingVo issueHostingVo = ConvertUtil.copyProperties(issueHosting, IssueHostingVo.class); issueHostingVo.setId(issueHosting.getId()); HostingField hostingField = issueHosting.getHostingField(); @@ -3071,6 +3327,9 @@ Workbook workbook; + IssueType issueType = new IssueType(); + Workflow workflow = new Workflow(); + workbook = WorkbookFactory.create(multipartFile.getInputStream()); Sheet sheet = workbook.getSheetAt(0); int lastRowNum = sheet.getLastRowNum() + 1; @@ -3106,10 +3365,19 @@ // 1踰� �뿤�뜑遺��꽣 �뜲�씠�꽣 �쁺�뿭 if (rowIndex > 1) { // �씠�뒋濡� �벑濡앺븯湲� �쐞�빐 IssueForm �뿉 �뜲�씠�꽣瑜� �뀑�똿�븳�떎. - IssueForm newIssueForm = this.setIssueFormToExcelField(row, (rowIndex + 1), priorityMaps, severityMaps, departmentMaps, customFieldMaps, + IssueForm newIssueForm = this.setIssueFormToExcelField(row, (rowIndex + 1), priorityMaps, severityMaps, customFieldMaps, companyFieldMaps, ispFieldMaps, hostingFieldMaps, headers); ConvertUtil.copyProperties(issueForm, newIssueForm); + Project project = this.projectService.getProject(newIssueForm.getProjectId()); + Long issueNumber = this.issueNumberGeneratorService.generateIssueNumber(project); + newIssueForm.setIssueNumber(issueNumber); + + issueType = this.issueTypeService.getIssueType(newIssueForm.getIssueTypeId()); + workflow = issueType.getWorkflow(); + IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(workflow); + + newIssueForm.setIssueStatusId(issueStatus.getId()); issueForms.add(newIssueForm); } } @@ -3119,53 +3387,28 @@ } // 1.176 - // �씠�뒋 �벑濡� -// this.issueMapper.insertBatch(issueForms); + this.issueMapper.insertBatch(issueForms); for (IssueForm saveIssueForm : issueForms) { Issue issue = new Issue(); ConvertUtil.copyProperties(saveIssueForm, issue); - IssueType issueType = this.issueTypeService.getIssueType(saveIssueForm.getIssueTypeId()); - Workflow workflow = issueType.getWorkflow(); - - Project project = this.projectService.getProject(saveIssueForm.getProjectId()); - Long issueNumber = this.issueNumberGeneratorService.generateIssueNumber(project); - - IssueStatus issueStatus = this.issueStatusService.findByIssueStatusTypeIsReady(workflow); - - issue.setPriority(this.priorityService.getPriority(saveIssueForm.getPriorityId())); - issue.setSeverity(this.severityService.getSeverity(saveIssueForm.getSeverityId())); - issue.setIssueStatus(issueStatus); - issue.setIssueType(issueType); - issue.setProject(project); - issue.setIssueNumber(issueNumber); - if (saveIssueForm.getParentIssueId() != null && saveIssueForm.getParentIssueId() > -1) { - issue.setParentIssue(this.getIssue(saveIssueForm.getParentIssueId())); + if (issueForm.getInheritYn() != null && issueForm.getInheritYn() && issueForm.getParentIssueId() != null) { + Issue parentIssue = this.getIssue(issueForm.getParentIssueId()); + // �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽 + this.inheritPartners(issue, parentIssue); } - - issue = this.issueRepository.saveAndFlush(issue); saveIssueForm.setId(issue.getId()); - IssueDepartment issueDepartment = new IssueDepartment(); - issueDepartment.setIssue(issue); - issueDepartment.setWorkspace(workspace); - + // �썙�겕�뵆濡쒖슦 ��湲� �긽�깭�쓽 遺��꽌 異붽� List<Long> departmentsIds = this.workflowDepartmentService.findFirstDepartmentIds(workflow); if (departmentsIds != null && departmentsIds.size() > 0) { - for (Long departmentId : departmentsIds) { - issueDepartment.setDepartment(this.departmentService.getDepartment(departmentId)); - } - issue.addIssueDepartment(issueDepartment); + this.issueDepartmentService.add(departmentsIds, workspace, issue); } - - saveIssueForm.setIssueStatusId(issueStatus.getId()); - this.setIssuePartners(saveIssueForm, issue); } - // 0.416 - 0.439 @@ -3177,7 +3420,7 @@ // �씠�뒋 �떞�떦�옄 踰뚰겕 �벑濡� this.bulkInsertIssueAssignee(issueForms, workspace); // 0.361 - 0.705 - + // 1.816 /*StopWatch serviceStart = new StopWatch(); serviceStart.start();*/ @@ -3201,27 +3444,25 @@ /** * �뿊��濡� �엯�젰�븳 �뙆�듃�꼫 �젙蹂� ���옣 + * * @param issueForm IssueForm */ private void setIssuePartners(IssueForm issueForm, Issue issue) { - IssueCompany issueCompany = new IssueCompany(); - IssueIsp issueIsp = new IssueIsp(); - IssueHosting issueHosting = new IssueHosting(); //issueCompany �벑濡� if (issueForm.getIssueCompanyFields() != null && issueForm.getIssueCompanyFields().size() > 0) { for (Map<String, Object> issueCompanyMap : issueForm.getIssueCompanyFields()) { - CompanyField companyField = ConvertUtil.convertMapToClass(issueCompanyMap, CompanyField.class); - issueCompany = ConvertUtil.convertMapToClass(issueCompanyMap, IssueCompany.class, "id"); + CompanyField companyField = ConvertUtil.convertMapToClass(issueCompanyMap, CompanyField.class); + IssueCompany issueCompany = ConvertUtil.convertMapToClass(issueCompanyMap, IssueCompany.class, "id", "registerDate", "modifyDate"); issueCompany.setCompanyField(companyField); issueCompany.setIssue(issue); this.issueCompanyRepository.saveAndFlush(issueCompany); - - // �궗�슜�옄媛� ISP瑜� 吏곸젒 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 �뾽泥댁뿉 �벑濡앸릺�뼱�엳�뒗 ISP �꽕�젙 + + // �궗�슜�옄媛� ISP瑜� 吏곸젒 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 �뾽泥댁뿉 �벑濡앸릺�뼱�엳�뒗 ISP �꽕�젙 if (issueForm.getIssueIspFields() == null || issueForm.getIssueIspFields().size() < 1) { // �뾽泥댁쓽 ISP媛� �엳�뒗 寃쎌슦 issueISP �벑濡� if (companyField.getIspId() != null && companyField.getIspId() != -1) { IspField ispField = this.ispFieldService.getIsp(companyField.getIspId()); - issueIsp = ConvertUtil.copyProperties(ispField, IssueIsp.class, "id"); + IssueIsp issueIsp = ConvertUtil.copyProperties(ispField, IssueIsp.class, "id", "registerDate", "modifyDate"); issueIsp.setIspField(ispField); issueIsp.setIssue(issue); this.issueIspRepository.saveAndFlush(issueIsp); @@ -3232,7 +3473,7 @@ // �뾽泥댁쓽 �샇�뒪�똿�씠 �엳�뒗 寃쎌슦 issueHosting �벑濡� if (companyField.getHostingId() != null && companyField.getHostingId() != -1) { HostingField hostingField = this.hostingFieldService.getHosting(companyField.getHostingId()); - issueHosting = ConvertUtil.copyProperties(hostingField, IssueHosting.class, "id"); + IssueHosting issueHosting = ConvertUtil.copyProperties(hostingField, IssueHosting.class, "id", "registerDate", "modifyDate"); issueHosting.setHostingField(hostingField); issueHosting.setIssue(issue); this.issueHostingRepository.saveAndFlush(issueHosting); @@ -3243,7 +3484,7 @@ //issueIsp �벑濡� if (issueForm.getIssueIspFields() != null && issueForm.getIssueIspFields().size() > 0) { for (Map<String, Object> issueIspMap : issueForm.getIssueIspFields()) { - issueIsp = ConvertUtil.convertMapToClass(issueIspMap, IssueIsp.class, "id"); + IssueIsp issueIsp = ConvertUtil.convertMapToClass(issueIspMap, IssueIsp.class, "id", "registerDate", "modifyDate"); IspField ispField = ConvertUtil.convertMapToClass(issueIspMap, IspField.class); issueIsp.setIspField(ispField); issueIsp.setIssue(issue); @@ -3253,7 +3494,7 @@ //issueHosting �벑濡� if (issueForm.getIssueHostingFields() != null && issueForm.getIssueHostingFields().size() > 0) { for (Map<String, Object> issueHostingMap : issueForm.getIssueHostingFields()) { - issueHosting = ConvertUtil.convertMapToClass(issueHostingMap, IssueHosting.class, "id"); + IssueHosting issueHosting = ConvertUtil.convertMapToClass(issueHostingMap, IssueHosting.class, "id", "registerDate", "modifyDate"); HostingField hostingField = ConvertUtil.convertMapToClass(issueHostingMap, HostingField.class); issueHosting.setHostingField(hostingField); issueHosting.setIssue(issue); @@ -3359,41 +3600,9 @@ issueCustomField.put("registerId", this.webAppUtil.getLoginId()); issueCustomFieldValueMaps.add(issueCustomField); } - - // �뿊���뿉 �뾽泥대챸�쓣 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 媛숈� �룄硫붿씤 �뾽泥� 李얘린 - if (issueForm.getIssueCompanyFields() == null || issueForm.getIssueCompanyFields().size() < 1) { - // 媛숈� �룄硫붿씤 �뾽泥� 李얘린 - IssueForm partners = this.findCompanyField(issueForm); - Issue issue = this.findOne(issueForm.getId()); - if (partners.getIssueCompanyFields() != null && partners.getIssueCompanyFields().size() > 0) { - for (Map<String, Object> company : partners.getIssueCompanyFields()) { - IssueCompany issueCompany = ConvertUtil.convertMapToClass(company, IssueCompany.class); - CompanyField companyField = ConvertUtil.convertMapToClass(company, CompanyField.class); - issueCompany.setCompanyField(companyField); - issueCompany.setIssue(issue); - this.issueCompanyRepository.saveAndFlush(issueCompany); - } - } - if (partners.getIssueIspFields() != null && partners.getIssueIspFields().size() > 0) { - for (Map<String, Object> isp : partners.getIssueIspFields()) { - IssueIsp issueIsp = ConvertUtil.convertMapToClass(isp, IssueIsp.class); - IspField ispField = ConvertUtil.convertMapToClass(isp, IspField.class); - issueIsp.setIspField(ispField); - issueIsp.setIssue(issue); - this.issueIspRepository.saveAndFlush(issueIsp); - } - } - if (partners.getIssueHostingFields() != null && partners.getIssueHostingFields().size() > 0) { - for (Map<String, Object> hosting : partners.getIssueHostingFields()) { - IssueHosting issueHosting = ConvertUtil.convertMapToClass(hosting, IssueHosting.class); - HostingField hostingField = ConvertUtil.convertMapToClass(hosting, HostingField.class); - issueHosting.setHostingField(hostingField); - issueHosting.setIssue(issue); - this.issueHostingRepository.saveAndFlush(issueHosting); - } - } - } + // �뿊���뿉 �뾽泥대챸�쓣 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 媛숈� �룄硫붿씤 �뾽泥� 李얘린 + this.findPartnerByDomain(issueForm); } if (issueCustomFieldValueMaps.size() > 0) { @@ -3401,9 +3610,50 @@ } } + /** + * �뿊���뿉 �뾽泥대챸�쓣 �엯�젰�븯吏� �븡�븯�쓣 寃쎌슦 媛숈� �룄硫붿씤 �뾽泥� 李얘린 + * + * @param issueForm IssueForm + */ + private void findPartnerByDomain(IssueForm issueForm) { + if (issueForm.getIssueCompanyFields() == null || issueForm.getIssueCompanyFields().size() < 1) { + // 媛숈� �룄硫붿씤 �뾽泥� 李얘린 + IssueForm partners = this.findCompanyField(issueForm); + Issue issue = this.findOne(issueForm.getId()); + if (partners.getIssueCompanyFields() != null && partners.getIssueCompanyFields().size() > 0) { + for (Map<String, Object> company : partners.getIssueCompanyFields()) { + IssueCompany issueCompany = ConvertUtil.convertMapToClass(company, IssueCompany.class); + CompanyField companyField = ConvertUtil.convertMapToClass(company, CompanyField.class); + issueCompany.setCompanyField(companyField); + issueCompany.setIssue(issue); + + this.issueCompanyRepository.saveAndFlush(issueCompany); + } + } + if (partners.getIssueIspFields() != null && partners.getIssueIspFields().size() > 0) { + for (Map<String, Object> isp : partners.getIssueIspFields()) { + IssueIsp issueIsp = ConvertUtil.convertMapToClass(isp, IssueIsp.class); + IspField ispField = ConvertUtil.convertMapToClass(isp, IspField.class); + issueIsp.setIspField(ispField); + issueIsp.setIssue(issue); + this.issueIspRepository.saveAndFlush(issueIsp); + } + } + if (partners.getIssueHostingFields() != null && partners.getIssueHostingFields().size() > 0) { + for (Map<String, Object> hosting : partners.getIssueHostingFields()) { + IssueHosting issueHosting = ConvertUtil.convertMapToClass(hosting, IssueHosting.class); + HostingField hostingField = ConvertUtil.convertMapToClass(hosting, HostingField.class); + issueHosting.setHostingField(hostingField); + issueHosting.setIssue(issue); + this.issueHostingRepository.saveAndFlush(issueHosting); + } + } + } + } + // �씠�뒋�쓽 二쇱슂 �냽�꽦�쓣 map �뿉 ���옣�븯�뿬 �뿊�� import �뿉�꽌 吏��젙�븳 ���긽(�씠�뒋 �냽�꽦)�쓣 鍮좊Ⅴ寃� 李얠쓣 �닔 �엳寃� �븳�떎. private void IssueAttributeMapToList(IssueForm issueForm, Map<String, Priority> priorityMaps, Map<String, Severity> severityMaps, - Map<String, DepartmentVo> departmentMaps, Map<String, CustomField> customFieldMaps,Map<String, Long> issueTypeCustomFieldMaps, + Map<String, DepartmentVo> departmentMaps, Map<String, CustomField> customFieldMaps, Map<String, Long> issueTypeCustomFieldMaps, Map<String, CompanyField> companyFieldMaps, Map<String, IspField> ispFieldMaps, Map<String, HostingField> hostingFieldMaps) { Project project = this.projectService.getProject(issueForm.getProjectId()); @@ -3450,51 +3700,95 @@ } /** + * cell String�쑝濡� 蹂��솚 �븿�닔 + * + * @param cell Cell + * @param isNull boolean + * @return String + */ + private String stringToCell(Cell cell, boolean isNull) { + String cellStr = ""; + if (!isNull) { + cellStr = CommonUtil.convertExcelStringToCell(cell); + // 怨듬갚 �젣嫄� + cell.setCellValue(cellStr.trim()); + } else { + cell.setCellValue(cellStr); + } + return cellStr; + } + + /** * cell NULL 泥댄겕 �븿�닔 + * 鍮� 媛믪씠 �븘�땶 cell 泥댄겕 + * * @param cell Cell * @return boolean */ - private Boolean cellNullCheck (Cell cell) { - return cell != null && cell.getStringCellValue() != null && !cell.getStringCellValue().equals("") && cell.getCellType() != Cell.CELL_TYPE_BLANK; + private Boolean cellNullCheck(Cell cell) { + int cellType = cell.getCellType(); + if (cellType < Cell.CELL_TYPE_BLANK) { + if (cellType == Cell.CELL_TYPE_STRING) { + if (cell.getStringCellValue() != null && !cell.getStringCellValue().equals("")) { + return false; + } + } else { + return false; + } + } + return true; } // �뿊�� �븘�뱶�뿉 �엳�뒗 �젙蹂대�� �씠�뒋 form �쑝濡� �삷湲대떎. private IssueForm setIssueFormToExcelField(Row row, int rowIndex, Map<String, Priority> priorityMaps, - Map<String, Severity> severityMaps, Map<String, DepartmentVo> departmentMaps, - Map<String, CustomField> customFieldMaps, Map<String, CompanyField> companyFieldMaps, - Map<String, IspField> ispFieldMaps, Map<String, HostingField> hostingFieldMaps, - List<String> headers) { + Map<String, Severity> severityMaps, Map<String, CustomField> customFieldMaps, + Map<String, CompanyField> companyFieldMaps, Map<String, IspField> ispFieldMaps, Map<String, HostingField> hostingFieldMaps, + List<String> headers) throws ParseException { IssueForm issueForm = new IssueForm(); issueForm.setRegisterId(this.webAppUtil.getLoginId()); - Project project = null; // �젣紐�, �궡�슜, �봽濡쒖젥�듃 �궎, �씠�뒋 ���엯, �슦�꽑�닚�쐞, 以묒슂�룄, �떞�떦�옄, �떆�옉�씪, 醫낅즺�씪, �궗�슜�옄 �젙�쓽 �븘�뱶 for (int cellIndex = 0; cellIndex < headers.size(); cellIndex++) { Cell cell = row.getCell(cellIndex); + + String cellStr = ""; + boolean isNull = true; + + if (cell != null) { + isNull = cellNullCheck(cell); + cellStr = stringToCell(cell, isNull); //cell�쓣 String�쑝濡� 蹂��솚 + } + switch (cellIndex) { case 0: // �씠�뒋 �젣紐⑹쓣 IssueForm �뿉 ���옣�븳�떎. - this.setIssueFormTitle(cell, issueForm, rowIndex); + if (isNull) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISSUE_TITLE_IS_NULL, rowIndex)); + } + this.setIssueFormTitle(cellStr, issueForm, rowIndex); break; case 1: // �궡�슜 - if (cellNullCheck(cell)) { - issueForm.setDescription(CommonUtil.convertExcelStringToCell(cell)); - } else { - // null �엯�젰 諛⑹� - issueForm.setDescription(""); - } - + issueForm.setDescription(cellStr); break; case 2: // �슦�꽑�닚�쐞瑜� IssueForm �뿉 ���옣�븳�떎. - this.setIssueFormPriority(cell, priorityMaps, issueForm, rowIndex); + if (isNull) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PRIORITY_IS_NULL, rowIndex)); + } + this.setIssueFormPriority(cellStr, priorityMaps, issueForm, rowIndex); break; case 3: // 以묒슂�룄瑜� IssueForm �뿉 ���옣�븳�떎. - this.setIssueFormSeverity(cell, severityMaps, issueForm, rowIndex); + if (isNull) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_SEVERITY_IS_NULL, rowIndex)); + } + this.setIssueFormSeverity(cellStr, severityMaps, issueForm, rowIndex); break; /*case 6: // �떞�떦�옄瑜� IssueForm �뿉 ���옣�븳�떎. @@ -3502,47 +3796,37 @@ break;*/ case 4: // �떆�옉�씪�쓣 IssueForm �뿉 ���옣�븳�떎. - if (cellNullCheck(cell)) { - this.setIssueFormPeriod(cell, issueForm, true, rowIndex); - } + this.setIssueFormPeriod(cellStr, issueForm, true, rowIndex, isNull); break; case 5: // 醫낅즺�씪�쓣 IssueForm �뿉 ���옣�븳�떎. - if (cellNullCheck(cell)) { - this.setIssueFormPeriod(cell, issueForm, false, rowIndex); - } + this.setIssueFormPeriod(cellStr, issueForm, false, rowIndex, isNull); break; case 6: // �뾽泥대�� IssueForm �뿉 ���옣�븳�떎. - if (cellNullCheck(cell)) { - this.setIssueFormCompanyField(cell, companyFieldMaps, issueForm, rowIndex); - } + this.setIssueFormCompanyField(cellStr, companyFieldMaps, issueForm, rowIndex); break; case 7: // ISP瑜� IssueForm �뿉 ���옣�븳�떎. - if (cellNullCheck(cell)) { - this.setIssueFormIspField(cell, ispFieldMaps, issueForm, rowIndex); - } + this.setIssueFormIspField(cellStr, ispFieldMaps, issueForm, rowIndex); break; case 8: // �샇�뒪�똿�쓣 IssueForm �뿉 ���옣�븳�떎. - if (cellNullCheck(cell)) { - this.setIssueFormHostingField(cell, hostingFieldMaps, issueForm, rowIndex); - } + this.setIssueFormHostingField(cellStr, hostingFieldMaps, issueForm, rowIndex); break; default: // 9踰� 遺��꽣�뒗 �궗�슜�옄 �젙�쓽 �븘�뱶. �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� IssueForm �뿉 ���옣�븳�떎. - this.setIssueFormCustomFieldValue(cell, customFieldMaps, issueForm, headers.get(cellIndex), rowIndex); + this.setIssueFormCustomFieldValue(cellStr, customFieldMaps, issueForm, headers.get(cellIndex), rowIndex); } } return issueForm; } - private void setIssueFormHostingField(Cell cell, Map<String, HostingField> hostingFieldMaps, IssueForm issueForm, int rowIndex) { - if (cell != null) { + private void setIssueFormHostingField(String cell, Map<String, HostingField> hostingFieldMaps, IssueForm issueForm, int rowIndex) { + if (cell.length() > 0) { Map<String, Object> issueHostingFields = new HashMap<>(); - HostingField hostingFieldMap = hostingFieldMaps.get(CommonUtil.convertExcelStringToCell(cell)); + HostingField hostingFieldMap = hostingFieldMaps.get(cell); if (hostingFieldMap == null) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_HOSTING_NOT_EXIST, rowIndex)); @@ -3552,10 +3836,10 @@ } } - private void setIssueFormIspField(Cell cell, Map<String, IspField> ispFieldMaps, IssueForm issueForm, int rowIndex) { - if (cell != null) { + private void setIssueFormIspField(String cell, Map<String, IspField> ispFieldMaps, IssueForm issueForm, int rowIndex) { + if (cell.length() > 0) { Map<String, Object> issueIspFields = new HashMap<>(); - IspField ispFieldMap = ispFieldMaps.get(CommonUtil.convertExcelStringToCell(cell)); + IspField ispFieldMap = ispFieldMaps.get(cell); if (ispFieldMap == null) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISP_NOT_EXIST, rowIndex)); @@ -3565,10 +3849,10 @@ } } - private void setIssueFormCompanyField(Cell cell, Map<String, CompanyField> companyFieldMaps, IssueForm issueForm, int rowIndex) { - if (cell != null) { + private void setIssueFormCompanyField(String cell, Map<String, CompanyField> companyFieldMaps, IssueForm issueForm, int rowIndex) { + if (cell.length() > 0) { Map<String, Object> issueCompanyFields = new HashMap<>(); - CompanyField companyFieldMap = companyFieldMaps.get(CommonUtil.convertExcelStringToCell(cell)); + CompanyField companyFieldMap = companyFieldMaps.get(cell); if (companyFieldMap == null) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_COMPANY_NOT_EXIST, rowIndex)); @@ -3579,14 +3863,7 @@ } // �씠�뒋 �젣紐⑹쓣 IssueForm �뿉 ���옣�븳�떎. - private void setIssueFormTitle(Cell cell, IssueForm issueForm, int rowIndex) { - if (cell == null) { - throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_ISSUE_TITLE_IS_NULL, rowIndex)); - } - - String title = CommonUtil.convertExcelStringToCell(cell); - + private void setIssueFormTitle(String title, IssueForm issueForm, int rowIndex) { // �젣紐� �쑀�슚�꽦 泥댄겕 this.verifyTitle(title); issueForm.setTitle(title); @@ -3627,13 +3904,8 @@ // �슦�꽑�닚�쐞瑜� IssueForm �뿉 ���옣�븳�떎. - private void setIssueFormPriority(Cell cell, Map<String, Priority> priorityMaps, IssueForm issueForm, int rowIndex) { - if (cell == null) { - throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PRIORITY_IS_NULL, rowIndex)); - } - - Priority priority = priorityMaps.get(CommonUtil.convertExcelStringToCell(cell)); + private void setIssueFormPriority(String priorityStr, Map<String, Priority> priorityMaps, IssueForm issueForm, int rowIndex) { + Priority priority = priorityMaps.get(priorityStr); if (priority == null) { throw new OwlRuntimeException( @@ -3644,13 +3916,8 @@ } // 以묒슂�룄瑜� IssueForm �뿉 ���옣�븳�떎. - private void setIssueFormSeverity(Cell cell, Map<String, Severity> severityMaps, IssueForm issueForm, int rowIndex) { - if (cell == null) { - throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_SEVERITY_IS_NULL, rowIndex)); - } - - Severity severity = severityMaps.get(CommonUtil.convertExcelStringToCell(cell)); + private void setIssueFormSeverity(String strSeverity, Map<String, Severity> severityMaps, IssueForm issueForm, int rowIndex) { + Severity severity = severityMaps.get(strSeverity); if (severity == null) { throw new OwlRuntimeException( @@ -3675,21 +3942,13 @@ issueForm.setUserIds(userIds); } } + // �떆�옉�씪, 醫낅즺�씪�쓣 IssueForm �뿉 ���옣�븳�떎. - private void setIssueFormPeriod(Cell cell, IssueForm issueForm, Boolean checkStartDate, int rowIndex) { - if (cell != null && !cell.toString().equals("")) { + private void setIssueFormPeriod(String periodDate, IssueForm issueForm, Boolean checkStartDate, int rowIndex, boolean isNull) throws ParseException { + if (!isNull) { - // 媛믪씠 怨듬갚�씠硫� 以묒� - String cellValue = CommonUtil.convertExcelStringToCell(cell); - if (StringUtils.isEmpty(cellValue) || !cell.toString().equals("null")) { - return; - } - - Date startDate; - - try { - startDate = cell.getDateCellValue(); - } catch (Exception e) { + Date startDate = DateUtil.convertStrToDateOnly(periodDate); + if (startDate == null) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_VALIDITY_EMPTY, rowIndex)); } @@ -3699,101 +3958,121 @@ } else { issueForm.setCompleteDate(DateUtil.convertDateToStr(startDate, "yyyy-MM-dd")); + // 醫낅즺�씪留� �엯�젰 �뻽�쓣 寃쎌슦 + if (issueForm.getCompleteDate() != null && issueForm.getStartDate() == null) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_VALIDITY_EMPTY_START, rowIndex)); + } + try { // �궇吏� �쑀�슚�꽦 泥댄겕 this.checkStartCompleteDate(issueForm.getStartDate(), issueForm.getCompleteDate()); } catch (OwlRuntimeException e) { throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_VALIDITY, rowIndex)); + this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_PERIOD_NOT_VALID, rowIndex)); } } } } // �궗�슜�옄 �젙�쓽 �븘�뱶 �젙蹂대�� IssueForm �뿉 ���옣�븳�떎.- - private void setIssueFormCustomFieldValue(Cell cell, Map<String, CustomField> customFieldMaps, IssueForm issueForm, String customFieldName, int rowIndex) { - if (cell != null) { - String cellValue = CommonUtil.convertExcelStringToCell(cell); - Map<String, Object> issueCustomFieldMap = new HashMap<>(); - CustomField customField = customFieldMaps.get(customFieldName); + private void setIssueFormCustomFieldValue(String cellValue, Map<String, CustomField> customFieldMaps, IssueForm issueForm, String customFieldName, int rowIndex) { + Map<String, Object> issueCustomFieldMap = new HashMap<>(); + CustomField customField = customFieldMaps.get(customFieldName); - if (customField == null) { - throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_HEADER_CUSTOM_FIELD_NOT_EXIST, rowIndex)); - } - // �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 怨듬갚�씠硫� 以묒� - if (StringUtils.isEmpty(cellValue)) { - return; - } + if (customField == null) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_HEADER_CUSTOM_FIELD_NOT_EXIST, rowIndex)); + } + // �궗�슜�옄 �젙�쓽 �븘�뱶 媛믪씠 怨듬갚�씠硫� 以묒� + if (StringUtils.isEmpty(cellValue)) { + return; + } - boolean validity = false; + boolean validity = false; - switch (customField.getCustomFieldType()) { - case INPUT: - case NUMBER: - case DATETIME: - case IP_ADDRESS: - case EMAIL: - case SITE: - case TEL: - if (customField.getCustomFieldType() != INPUT && cellValue.length() > 100) { //INPUT ���엯�� 100�옄 �젣�븳 �뾾�쓬 + switch (customField.getCustomFieldType()) { + case INPUT: + case NUMBER: + case DATETIME: + case IP_ADDRESS: + case EMAIL: + case SITE: + case TEL: + if (customField.getCustomFieldType() != INPUT && cellValue.length() > 100) { //INPUT ���엯�� 100�옄 �젣�븳 �뾾�쓬 + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.CUSTOM_FIELD_TEXT_TYPE_MAX_LENGTH_OUT)); + } + + //DATETIME�씪 寃쎌슦 format 蹂�寃� + if (customField.getCustomFieldType() == DATETIME) { + Date date = DateUtil.convertStrToDate(cellValue); + if (date == null) { throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.CUSTOM_FIELD_TEXT_TYPE_MAX_LENGTH_OUT)); + this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_DATETIME_NOT_DASH, rowIndex)); } + } - if (customField.getCustomFieldType() == DATETIME) { //DATETIME�씪 寃쎌슦 format 蹂�寃� - Date date = cell.getDateCellValue(); - cellValue = new SimpleDateFormat("yyyy-MM-dd H:mm:ss").format(date); + //IP_ADDRESS�씪 寃쎌슦 �젙洹쒗몴�쁽�떇 泥댄겕 + if (customField.getCustomFieldType() == IP_ADDRESS) { + String regExp = "^(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]?)$"; + + if (!cellValue.matches(regExp)) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.EXCEL_IMPORT_IP_ADDRESS_NOT_VALIDITY, rowIndex)); } + } - issueCustomFieldMap.put("customFieldId", customField.getId()); - issueCustomFieldMap.put("useValue", cellValue); - issueForm.addIssueCustomFields(issueCustomFieldMap); - break; - case SINGLE_SELECT: - // 媛� �쑀�슚�꽦 泥댄겕 + issueCustomFieldMap.put("customFieldId", customField.getId()); + issueCustomFieldMap.put("useValue", cellValue); + issueForm.addIssueCustomFields(issueCustomFieldMap); + break; + case SINGLE_SELECT: + // 媛� �쑀�슚�꽦 泥댄겕 + for (CustomFieldValue customFieldValue : customField.getCustomFieldValues()) { + if (customFieldValue.getValue().equals(cellValue)) { + validity = true; + break; + } + } + + if (!validity) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY, rowIndex)); + } + + issueCustomFieldMap.put("customFieldId", customField.getId()); + issueCustomFieldMap.put("useValue", cellValue); + issueForm.addIssueCustomFields(issueCustomFieldMap); + + break; + case MULTI_SELECT: + // 媛� �쑀�슚�꽦 泥댄겕 + String[] useValues = cellValue.split("#"); + // �빐, �떖 + for (String useValue : useValues) { for (CustomFieldValue customFieldValue : customField.getCustomFieldValues()) { - if (customFieldValue.getValue().equals(cellValue)) { + + if (customFieldValue.getValue().equals(useValue)) { validity = true; - break; + Map<String, Object> multiValueMap = new HashMap<>(); + multiValueMap.put("customFieldId", customField.getId()); + multiValueMap.put("useValue", useValue); + issueForm.addIssueCustomFields(multiValueMap); } + } + } - if (!validity) { - throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY, rowIndex)); - } + if (!validity) { + throw new OwlRuntimeException( + this.messageAccessor.getMessage(MsgConstants.EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY, rowIndex)); + } - issueCustomFieldMap.put("customFieldId", customField.getId()); - issueCustomFieldMap.put("useValue", cellValue); - issueForm.addIssueCustomFields(issueCustomFieldMap); - - break; - case MULTI_SELECT: - // 媛� �쑀�슚�꽦 泥댄겕 - String[] useValues = cellValue.split("#"); - // �빐, �떖 - for (String useValue : useValues) { - for (CustomFieldValue customFieldValue : customField.getCustomFieldValues()) { - - if (customFieldValue.getValue().equals(useValue)) { - validity = true; - Map<String, Object> multiValueMap = new HashMap<>(); - multiValueMap.put("customFieldId", customField.getId()); - multiValueMap.put("useValue", useValue); - issueForm.addIssueCustomFields(multiValueMap); - } - - } - } - - if (!validity) { - throw new OwlRuntimeException( - this.messageAccessor.getMessage(MsgConstants.EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY, rowIndex)); - } - - break; - } + break; } } @@ -3821,7 +4100,7 @@ if (issueForm.getSendEmails().size() < 1) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SEND_USER)); - }else if (issueForm.getTemplate() != null){ + } else if (issueForm.getTemplate() != null) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SELECT_TEMPLATE)); } @@ -3855,7 +4134,7 @@ if (emailTemplateForm.getSendEmails().size() < 1) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SEND_USER)); - }else if (emailTemplateForm.getTemplate() == null){ + } else if (emailTemplateForm.getTemplate() == null) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.ISSUE_NOT_SELECT_TEMPLATE)); } else if (emailTemplateForm.getIssueId() == null) { @@ -3875,7 +4154,7 @@ Locale locale = CommonUtil.getUserLanguage(user.getLanguage()); String[] sendMails = ConvertUtil.ToArray(emailTemplateForm.getSendEmails()); - for(int i=0; i < sendMails.length; i++) { + for (int i = 0; i < sendMails.length; i++) { sendMails[i] = CommonUtil.decryptAES128(sendMails[i]); } this.systemEmailService.sendEmail(emailTemplateForm.getTitle(), emailTemplateForm.getTemplate(), sendMails, null, multipartFiles); @@ -3892,7 +4171,7 @@ } Issue issue = null; - if(emailCommonForm.getIssueId() != null) { + if (emailCommonForm.getIssueId() != null) { issue = this.getIssue(emailCommonForm.getIssueId()); } @@ -3906,7 +4185,7 @@ Locale locale = CommonUtil.getUserLanguage(user.getLanguage()); String[] sendMails = ConvertUtil.ToArray(emailCommonForm.getSendEmails()); - for(int i=0; i < sendMails.length; i++) { + for (int i = 0; i < sendMails.length; i++) { sendMails[i] = CommonUtil.decryptAES128(sendMails[i]); } this.systemEmailService.sendEmail(emailCommonForm.getTitle(), emailCommonForm.getDescription(), sendMails, null, multipartFiles); @@ -4038,7 +4317,7 @@ for (Map<String, Object> taskDepartment : taskDepartments) { Long taskId = MapUtil.getLong(taskDepartment, "taskId"); - List<DepartmentVo> departmentVos = (List<DepartmentVo>)taskUserSave.get(taskId.toString()); + List<DepartmentVo> departmentVos = (List<DepartmentVo>) taskUserSave.get(taskId.toString()); departmentVos.add(ConvertUtil.convertMapToClass(taskDepartment, DepartmentVo.class)); } @@ -4068,10 +4347,10 @@ //taskVo.setUserVos(userVos); // �떞�떦遺��꽌 �꽭�똿 - List<DepartmentVo> departmentVos = (List<DepartmentVo>)taskUserSave.get(taskVo.getId().toString()); + List<DepartmentVo> departmentVos = (List<DepartmentVo>) taskUserSave.get(taskVo.getId().toString()); taskVo.setDepartmentVos(departmentVos); - List<IssueVo> taskVos = (List<IssueVo>)tasks.get(MapUtil.getString(result, "workflowStatusId")); + List<IssueVo> taskVos = (List<IssueVo>) tasks.get(MapUtil.getString(result, "workflowStatusId")); taskVos.add(taskVo); tasks.put(MapUtil.getString(result, "workflowStatusId"), taskVos); } @@ -4093,7 +4372,7 @@ Issue issue = this.getIssue(downId); Issue parentIssue = issue.getParentIssue(); //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋 - if(parentIssue != null && parentIssue.getId().equals(newParentIssueId)){ //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋媛� 議댁옱 �븷 寃쎌슦 + if (parentIssue != null && parentIssue.getId().equals(newParentIssueId)) { //蹂�寃� �쟾 �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋媛� 議댁옱 �븷 寃쎌슦 this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb); this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); } @@ -4102,16 +4381,77 @@ parentIssue = this.getIssue(newParentIssueId); //�긽�쐞�씠�뒋(myIssue) issue.setParentIssue(parentIssue); //myIssue瑜� �븯�쐞�씠�뒋�쓽 �긽�쐞�씠�뒋濡� set this.issueHistoryService.detectDownIssues(IssueHistoryType.ADD, issue, sb); //issue = �븯�쐞�씠�뒋 - } else{ + } else { // �궘�젣 �븷 寃쎌슦 this.issueHistoryService.detectDownIssues(IssueHistoryType.DELETE, issue, sb); issue.setParentIssue(null); } + + if (issueDownForm.getInheritYn() != null && issueDownForm.getInheritYn() && issue.getParentIssue() != null) { + // �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽諛쏄린 + issue = this.inheritPartners(issue, parentIssue); + } + this.issueHistoryService.addIssueHistory(parentIssue, IssueHistoryType.MODIFY, sb.toString()); //parentIssue = myIssue(湲곕줉�� �쁽�옱 �긽�꽭�럹�씠吏��뿉 �빐�빞�븯�땲源�) this.issueRepository.saveAndFlush(issue); } } + /** + * �긽�쐞�씠�뒋�쓽 �뙆�듃�꼫 �젙蹂� �긽�냽諛쏄린 + * + * @param issue Issue + * @param parentIssue Issue + * @return Issue + */ + private Issue inheritPartners(Issue issue, Issue parentIssue) { + if (parentIssue != null) { + if (parentIssue.getIssueType().getInheritPartners()) { + IssueCompany issueCompany = new IssueCompany(); + IssueIsp issueIsp = new IssueIsp(); + IssueHosting issueHosting = new IssueHosting(); + + if (parentIssue.getIssueCompanies() != null && parentIssue.getIssueCompanies().size() > 0) { + issue.getIssueCompanies().clear(); + issue.getIssueCompanies().addAll(parentIssue.getIssueCompanies()); + Iterator<IssueCompany> itrCompany = issue.getIssueCompanies().iterator(); + ConvertUtil.copyProperties(itrCompany.next(), issueCompany, "id"); + issueCompany.setIssue(issue); + issueCompany.setCompanyField(parentIssue.getIssueCompanies().iterator().next().getCompanyField()); + this.issueCompanyRepository.saveAndFlush(issueCompany); + } else { + this.issueCompanyRepository.deleteByIssueId(issue.getId()); + this.issueCompanyRepository.flush(); + } + if (parentIssue.getIssueIspFields() != null && parentIssue.getIssueIspFields().size() > 0) { + issue.getIssueIspFields().clear(); + issue.getIssueIspFields().addAll(parentIssue.getIssueIspFields()); + Iterator<IssueIsp> itrIsp = issue.getIssueIspFields().iterator(); + ConvertUtil.copyProperties(itrIsp.next(), issueIsp, "id"); + issueIsp.setIssue(issue); + issueIsp.setIspField(parentIssue.getIssueIspFields().iterator().next().getIspField()); + this.issueIspRepository.saveAndFlush(issueIsp); + } else { + this.issueIspRepository.deleteByIssueId(issue.getId()); + this.issueIspRepository.flush(); + } + if (parentIssue.getIssueHostingFields() != null && parentIssue.getIssueHostingFields().size() > 0) { + issue.getIssueHostingFields().clear(); + issue.getIssueHostingFields().addAll(parentIssue.getIssueHostingFields()); + Iterator<IssueHosting> itrHosting = issue.getIssueHostingFields().iterator(); + ConvertUtil.copyProperties(itrHosting.next(), issueHosting, "id"); + issueHosting.setIssue(issue); + issueHosting.setHostingField(parentIssue.getIssueHostingFields().iterator().next().getHostingField()); + this.issueHostingRepository.saveAndFlush(issueHosting); + } else { + this.issueHostingRepository.deleteByIssueId(issue.getId()); + this.issueHostingRepository.flush(); + } + } + } + return issue; + } + @Override public void findPartner(Map<String, Object> resJsonData, Map<String, Object> params) { Long issueTypeId = MapUtil.getLong(params, "issueTypeId"); -- Gitblit v1.8.0