src/main/java/kr/wisestone/owl/common/IssueCustomFieldValueFormComparator.java | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/java/kr/wisestone/owl/mapper/IssueMapper.java | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/resources/mybatis/query-template/issue-template.xml | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/webapp/i18n/ko/global.json | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/webapp/views/api/apiSetting.html | ●●●●● 패치 | 보기 | raw | blame | 히스토리 | |
src/main/webapp/views/api/apiSettingSpec.html | ●●●●● 패치 | 보기 | raw | blame | 히스토리 |
src/main/java/kr/wisestone/owl/common/IssueCustomFieldValueFormComparator.java
New file @@ -0,0 +1,20 @@ package kr.wisestone.owl.common; import kr.wisestone.owl.web.form.IssueApiForm; import kr.wisestone.owl.web.form.IssueCustomFieldValueForm; import java.util.Comparator; public class IssueCustomFieldValueFormComparator implements Comparator<IssueCustomFieldValueForm> { @Override public int compare(IssueCustomFieldValueForm o1, IssueCustomFieldValueForm o2) { if (o1.getCustomFieldId() > o2.getCustomFieldId()) { return 1; } else if (o1.getCustomFieldId() < o2.getCustomFieldId()) { return -1; } else { return 0; } } } src/main/java/kr/wisestone/owl/mapper/IssueMapper.java
@@ -51,6 +51,6 @@ Long countByDepartment(IssueCondition issueCondition); List<Map<String, Object>> findNotCompleteByParentIssueId(Long parentIssueId); List<Map<String, Object>> findNotCompleteByParentIssueId(IssueCondition issueCondition); } src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -3,6 +3,7 @@ import com.google.common.collect.Lists; import com.sun.org.apache.bcel.internal.generic.NEW; import kr.wisestone.owl.common.ExcelConditionCheck; import kr.wisestone.owl.common.IssueCustomFieldValueFormComparator; import kr.wisestone.owl.config.CommonConfiguration; import kr.wisestone.owl.constant.Constants; import kr.wisestone.owl.constant.ElasticSearchConstants; @@ -263,11 +264,8 @@ List<IssueVo> issueVos = this.findIssue(issueApiForm, customFieldApiOverlaps, user.getId()); int size = issueVos.size(); if (size == 1) { if (size > 0) { issueForm.setParentIssueId(issueVos.get(0).getId()); } else if (size > 1) { throw new OwlRuntimeException( this.messageAccessor.getMessage(MsgConstants.API_OVERLAP_ERROR)); } issueForm.setIsApi(Issue.IS_API_YES); @@ -328,39 +326,36 @@ } // 중복된 상위 이슈 검색 private List<IssueVo> findIssue(IssueApiForm issueApiForm, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) { private List<IssueVo> findIssue(IssueApiForm issueApiform, List<CustomFieldApiOverlap> customFieldApiOverlaps, Long userId) { List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues(); List<IssueVo> resultIssueVos = Lists.newArrayList(); String comma = ","; List<IssueVo> resultIssueVos = new ArrayList<>(); if (issueCustomFieldValueForms.size() > 0) { String concatUseValue = ""; int useIdx = 0; if (customFieldApiOverlaps != null && customFieldApiOverlaps.size() > 0) { IssueCustomFieldValueFormComparator comp = new IssueCustomFieldValueFormComparator(); Collections.sort(issueCustomFieldValueForms, comp); for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) { for (IssueCustomFieldValueForm issueCustomFieldValue : issueApiForm.getIssueCustomFieldValues()) { IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition(); issueCustomFieldValueCondition.setUseParentIssueId(true); if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValue.getCustomFieldId())) { issueCustomFieldValueCondition.setUseValue(issueCustomFieldValue.getUseValue()); if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValueForm.getCustomFieldId())) { if (useIdx > 0) { concatUseValue = concatUseValue.concat(comma); } concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue()); useIdx++; } } } IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition(); issueCustomFieldValueCondition.setUseValue(concatUseValue); List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition); if (results != null && results.size() > 0) { List<IssueVo> findIssueVos = new ArrayList<>(); Collections.copy(resultIssueVos, findIssueVos); resultIssueVos.clear(); for (Map<String, Object> result : results) { IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class); if (findIssueVos.size() == 0) { resultIssueVos.add(issueVo); } else { IssueVo findIssueVo = findIssueVo(findIssueVos, issueVo.getId()); if (findIssueVo != null) { resultIssueVos.add(findIssueVo); } } } } else { resultIssueVos.clear(); return resultIssueVos; } } resultIssueVos.add(ConvertUtil.convertMapToClass(result, IssueVo.class)); } } } @@ -1483,42 +1478,25 @@ public List<IssueVo> findIssue(IssueApiForm issueApiform) { List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues(); List<IssueVo> resultIssueVos = new ArrayList<>(); List<IssueVo> resultIssueVos = Lists.newArrayList(); String comma = ","; if (issueCustomFieldValueForms.size() > 0) { String concatUseValue = ""; for (int i = 0; i < issueCustomFieldValueForms.size(); i++) { IssueCustomFieldValueForm issueCustomFieldValueForm = issueCustomFieldValueForms.get(i); if (i > 0) { concatUseValue = concatUseValue.concat(comma); } concatUseValue = concatUseValue.concat(issueCustomFieldValueForm.getUseValue()); } IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition(); issueCustomFieldValueCondition.setUseParentIssueId(false); if (issueCustomFieldValueForms.size() > 0) { for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) { CustomField customField = this.customFieldService.getCustomField(issueCustomFieldValueForm.getCustomFieldId()); CustomFieldType customFieldType = CustomFieldType.DATETIME; if (customFieldType.equals(customField.getCustomFieldType())) { continue; } // issueCustomFieldValueCondition.addUseValue(issueCustomFieldValueForm.getUseValue()); issueCustomFieldValueCondition.setUseValue(issueCustomFieldValueForm.getUseValue()); issueCustomFieldValueCondition.setUseValue(concatUseValue); List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition); if (results != null && results.size() > 0) { List<IssueVo> findIssueVos = new ArrayList<>(); Collections.copy(resultIssueVos, findIssueVos); resultIssueVos.clear(); for (Map<String, Object> result : results) { IssueVo issueVo = ConvertUtil.convertMapToClass(result, IssueVo.class); issueVo.setParentIssueVo(this.getParentIssueVo(MapUtil.getLong(result, "parentIssueId"))); if (findIssueVos.size() == 0) { resultIssueVos.add(issueVo); } else { IssueVo findIssueVo = findIssueVo(findIssueVos, issueVo.getId()); if (findIssueVo != null) { resultIssueVos.add(findIssueVo); } } } } else { resultIssueVos.clear(); return resultIssueVos; resultIssueVos.add(ConvertUtil.convertMapToClass(result, IssueVo.class)); } } } @@ -1534,15 +1512,6 @@ } } return null; } // 하위 이슈가 모두 종료 처리 되었을 경우 상위이슈도 완료 처리 private void setParentIssueComplete(Issue parentIssue) { if (parentIssue != null) { this.issueMapper.findNotCompleteByParentIssueId(parentIssue.getId()); } } @@ -1570,10 +1539,12 @@ } if (parentIssue != null) { List<Map<String, Object>> results = this.issueMapper.findNotCompleteByParentIssueId(parentIssue.getId()); IssueCondition issueCondition = new IssueCondition(issueVo.getId(), parentIssue.getId()); List<Map<String, Object>> results = this.issueMapper.findNotCompleteByParentIssueId(issueCondition); // 하위 일감이 모두 종료 상태일때 상위 일감도 종료 처리 if (results == null || results.size() == 0) { parentIssue.setIssueStatus(issueType.getIssueStatus()); this.issueRepository.saveAndFlush(parentIssue); } } @@ -1660,6 +1631,7 @@ this.issueHistoryService.detectIssueStatus(issue, issueForm, detectIssueChange, oldIssueStatus, issueStatus); } // db에 저장 issue = this.saveIssue(issueForm, checkIssueData); // 이슈 이력 등록 src/main/java/kr/wisestone/owl/web/condition/IssueCondition.java
@@ -54,6 +54,11 @@ private List<Long> myDepartmentIds; // 내가 속해있는 부서 ID public IssueCondition(){} public IssueCondition(Long issueId, Long parentIssueId){ this.id = issueId; this.parentIssueId = parentIssueId; } // 대시보드 위기관리 위젯에서 사용 public IssueCondition(List<String> issueIds){ this.issueIds = issueIds; src/main/resources/mybatis/query-template/issue-template.xml
@@ -953,8 +953,6 @@ AND is_api = #{isApi}; </select> <!-- 이슈 상태를 사용하는 이슈 갯수를 조회한다. --> <select id="countByIssueStatusId" resultType="java.lang.Long" parameterType="java.lang.Long"> SELECT COUNT(DISTINCT id) FROM @@ -965,29 +963,32 @@ <!-- 특정 사용자 정의 필드 값이 같은 이슈를 조회 --> <select id="findByCustomFieldValue" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition"> SELECT issue_custom.issue_id as id, iss.parent_issue_id as parentIssueId issue.id as id, issue.title as title, customFieldValue.customFieldType AS customFieldType, GROUP_CONCAT(customFieldValue.useValue) AS concatUseValue FROM issue issue FORCE INDEX(reverseIndex) INNER JOIN issue_status as issStatus ON issue.issue_status_id = issStatus.id LEFT OUTER JOIN ( SELECT cf.id AS customFieldId, cf.custom_field_type AS customFieldType, issue_custom.use_value AS useValue, issue_custom.issue_id AS issueId FROM issue_custom_field_value issue_custom INNER JOIN issue iss ON iss.id = issue_custom.issue_id WHERE 1=1 AND issue_custom.use_value = #{useValue} <choose> <when test="useParentIssueId.equals(true)"> AND iss.parent_issue_id IS NULL </when> <otherwise> AND iss.parent_issue_id IS NOT NULL </otherwise> </choose> INNER JOIN custom_field cf ON cf.id = issue_custom.custom_field_id ORDER BY issue_custom.id ASC) customFieldValue ON customFieldValue.issueId = issue.id WHERE issStatus.issue_status_type != 'CLOSE' GROUP BY issue.id HAVING concatUseValue LIKE CONCAT('%', #{useValue}, '%') </select> <!-- 종료 안된 하위 이슈 가져오기 --> <select id="findNotCompleteByParentIssueId" resultType="java.util.HashMap" parameterType="java.lang.Long"> <select id="findNotCompleteByParentIssueId" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCondition"> SELECT iss.id as id iss.id as id, iss.title as title FROM issue iss INNER JOIN issue_status issueStatus on iss.issue_status_id = issueStatus.id WHERE iss.parent_issue_id = #{parentIssueId} AND iss.id != #{id} AND issueStatus.issue_status_type != 'CLOSE' </select> </mapper> src/main/webapp/i18n/ko/global.json
@@ -885,12 +885,13 @@ "failedToApiMonitor": "API 기록 조회 실패", "requestSample": "API 요청 샘플", "requestSampleAdd": "이슈 추가", "requestSampleModify": "이슈 수정", "requestSampleModify": "이슈 상태 수정", "downIssueOverlapSetting" : "하위 이슈 처리 기준 항목", "upIssueCompleteIssueStatus" : "상위 이슈 자동종료 이슈 상태 설정", "autoCompleteIssueStatus" : "자동 종료 설정할 이슈 상태", "successToApiAutoCompleteIssueStatus" : "자동 종료 이슈 상태 설정 완료", "failedToApiAutoCompleteIssueStatus" : "자동 종료 이슈 상태 설정 실패" "failedToApiAutoCompleteIssueStatus" : "자동 종료 이슈 상태 설정 실패", "requestSampleModifyDesc" : "(수정시 customField 항목은 검색 용도로 사용됨)" }, "companyField" : { "info": "업체정보", src/main/webapp/views/api/apiSetting.html
@@ -1,13 +1,6 @@ <div class="row"> <div class="col-sm-12"> <div class="element-wrapper"> <div class="element-actions"> <button ng-click="fn.add()" class="btn btn-xlg btn-danger"><i class="os-icon os-icon-plus"></i> <span translate="api.addOverlapField">필드 만들기</span> </button> </div> <div class="element-actions" ng-if="$root.checkMngPermission('USER_PERMISSION_MNG_ISSUE_STATUS')"> </div> <h6 class="element-header" translate="api.setting"> src/main/webapp/views/api/apiSettingSpec.html
@@ -99,7 +99,7 @@ <div class="element-box"> <div class="row"> <div class="col-md-1"> <label for="issue-detectingInfo" class="issue-label"> <label class="issue-label"> <span translate="api.requestSampleAdd">이슈 추가</span> </label> </div> @@ -108,12 +108,17 @@ </div> <div class="col-md-1"></div> <div class="col-md-1"> <label for="issue-detectingInfo" class="issue-label"> <label class="issue-label"> <span translate="api.requestSampleModify">이슈 수정</span> </label> <label class="text-info"> <span translate="api.requestSampleModifyDesc">수정시</span> </label> </div> <div class="col-md-2"> <div> <pre>{{vm.sampleJsonModify}}</pre> </div> </div> </div> </div>