OWL ITS + 탐지시스템(인터넷 진흥원)
jhjang
2021-12-06 f90e288fdd0e4d4a58b72a445fcbac135351d458
- API 중복 처리 오류 수정
7개 파일 변경됨
209 ■■■■■ 파일 변경됨
src/main/java/kr/wisestone/owl/constant/MsgConstants.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/data/CheckIssueData.java 41 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java 138 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/vo/IssueVo.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java 4 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/resources/mybatis/query-template/issue-template.xml 16 ●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/webapp/scripts/app/issue/issueList.controller.js 2 ●●●●● 패치 | 보기 | raw | blame | 히스토리
src/main/java/kr/wisestone/owl/constant/MsgConstants.java
@@ -177,6 +177,8 @@
    public static final String EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY = "EXCEL_CUSTOM_FIELD_VALUE_NOT_VALIDITY"; //  다음 엑셀 라인에서 입력한 사용자 정의 필드 값이 유효하지 않습니다.
    public static final String EXCEL_IMPORT_HEADER_CUSTOM_FIELD_NOT_EXIST = "EXCEL_IMPORT_HEADER_CUSTOM_FIELD_NOT_EXIST";   //  등록하려는 사용자 정의 필드를 찾을 수 없습니다. 해당 사용자 정의필드의 이름이 변경되었거나 삭제되었습니다.
    public static final String DOWN_ISSUE_NOT_EXIST = "DOWN_ISSUE_NOT_EXIST";   //  하위 이슈 찾을수 없음
    public static final String NOTICE_NOT_EXIST = "NOTICE_NOT_EXIST";   //  공지사항이 존재하지 않습니다.
    public static final String NOTICE_EMPTY_CONTENT = "NOTICE_EMPTY_CONTENT";   //  공지사항 제목 및 내용 중 입력 값이 없는 필드가 있습니다.
@@ -235,4 +237,6 @@
    public static final String API_PARAMETER_PROJECT_ERROR = "API_PARAMETER_PROJECT_ERROR";     // api 파라미터 오류(프로젝트)
    public static final String API_PARAMETER_ERROR = "API_PARAMETER_ERROR";     // api 파라미터 오류
    public static final String API_USER_ERROR = "API_USER_ERROR";     // api 사용자 오류
    public static final String API_OVERLAP_ERROR = "API_OVERLAP_ERROR";     // API 중복된 상위 이슈가 여러개일 경우
    public static final String API_ISSUE_NOT_EXIST = "API_ISSUE_NOT_EXIST";     // 수정할 이슈를 찾을수 없습니다.
}
src/main/java/kr/wisestone/owl/data/CheckIssueData.java
@@ -18,8 +18,49 @@
    Priority priority;
    Severity severity;
    @Autowired
    private IssueService issueService;
    @Autowired
    private WorkspaceService workspaceService;
    @Autowired
    private ProjectService projectService;
    @Autowired
    private IssueStatusService issueStatusService;
    @Autowired
    private IssueTypeService issueTypeService;
    @Autowired
    private PriorityService priorityService;
    @Autowired
    private SeverityService severityService;
    public CheckIssueData() {}
    public boolean CheckData(User user, IssueForm issueForm) {
        //  사용하고 있는 업무 공간이 활성 상태인지 확인한다. 사용 공간에서 로그인한 사용자가 비활성인지 확인한다.
        this.workspaceService.checkUseWorkspace(user, user.getLastWorkspaceId());
        Issue issue = this.issueService.getIssue(issueForm.getId());
        IssueStatus oldIssueStatus = issue.getIssueStatus();
        //  프로젝트 유효성 체크
        Project project = this.projectService.getProject(issueForm.getProjectId());
        //  이슈 상태 유효성 체크
        IssueStatus issueStatus = this.issueStatusService.getIssueStatus(issueForm.getIssueStatusId());
        //  이슈 유형 유효성 체크
        IssueType issueType = this.issueTypeService.getIssueType(issueForm.getIssueTypeId());
        //  우선순위 유효성 체크
        Priority priority = this.priorityService.getPriority(issueForm.getPriorityId());
        //  중요도 유효성 체크
        Severity severity = this.severityService.getSeverity(issueForm.getSeverityId());
        return true;
    }
    public Issue getIssue() {
        return issue;
    }
src/main/java/kr/wisestone/owl/service/impl/IssueServiceImpl.java
@@ -1,6 +1,7 @@
package kr.wisestone.owl.service.impl;
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.config.CommonConfiguration;
import kr.wisestone.owl.constant.Constants;
@@ -239,9 +240,13 @@
            customFieldApiOverlapForm.setUserId(user.getId());
            customFieldApiOverlapForm.setIssueTypeId(issueForm.getIssueTypeId());
            IssueVo issueVo = this.findIssue(issueApiForm, user.getId());
            if (issueVo != null) {
                issueForm.setParentIssueId(issueVo.getId());
            List<IssueVo> issueVos = this.findIssue(issueApiForm, user.getId());
            int size = issueVos.size();
            if (size == 1) {
                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);
@@ -281,26 +286,43 @@
    // 중복된 상위 이슈 검색
    private IssueVo findIssue(IssueApiForm issueApiForm, Long userId) {
        IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
    private List<IssueVo> findIssue(IssueApiForm issueApiForm, Long userId) {
        List<CustomFieldApiOverlap> customFieldApiOverlaps = this.customFieldApiOverlapService.find(userId, issueApiForm.getIssueTypeId());
        List<IssueVo> resultIssueVos = new ArrayList<>();
        if (customFieldApiOverlaps != null && customFieldApiOverlaps.size() > 0) {
            for (CustomFieldApiOverlap customFieldApiOverlap : customFieldApiOverlaps) {
                for (IssueCustomFieldValueForm issueCustomFieldValue : issueApiForm.getIssueCustomFieldValues()) {
                    IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
                    if (customFieldApiOverlap.getCustomField().getId().equals(issueCustomFieldValue.getCustomFieldId())) {
                        issueCustomFieldValueCondition.addUseValues(issueCustomFieldValue.getUseValue());
                    }
                }
            }
                        issueCustomFieldValueCondition.setUseValue(issueCustomFieldValue.getUseValue());
            List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
            if (results != null && results.size() > 0) {
                IssueVo issueVo = new IssueVo();
                ConvertUtil.convertMapToObject(results.get(0), issueVo);
                return issueVo;
                            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);
            }
        }
        return null;
                            }
                        } else {
                            resultIssueVos.clear();
                            return resultIssueVos;
                        }
                    }
                }
            }
        }
        return resultIssueVos;
    }
    //  이슈를 생성한다.
@@ -1038,35 +1060,18 @@
    // 하위 이슈 정보를 셋팅한다
    private void setDownIssues(Issue issue, IssueVo issueVo) {
        List<Issue> downIssues = this.issueRepository.findByParentIssueId(issue.getId());
        /*if(issueVo != null && downIssues.size()>0){
            for(Issue downIssue : downIssues){
                IssueVo downIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
                IssueDownVo issueDownVo = ConvertUtil.copyProperties(downIssueVo, IssueDownVo.class);
                issueDownVo.setIssueDown(downIssueVo);
                issueDownVo.setTitle(downIssue.getTitle());
                issueDownVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
                issueDownVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
                issueDownVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
                this.setRegister(downIssue, downIssueVo); // 등록자
                this.setIssueDepartment(downIssue, downIssueVo);  //  담당부서 정보 셋팅
                this.setIssueCustomFields(downIssue, downIssueVo);   // 사용자정의필드 정보 세팅
                issueVo.addIssueDownVo(issueDownVo);
            }
        }*/
        List<IssueVo> downIssueVos = ConvertUtil.convertObjectsToClasses(downIssues, IssueVo.class);
            if(downIssues != null && downIssues.size()>0){
        List<IssueVo> resultList = new ArrayList<>();
        if(downIssueVos != null && downIssueVos.size()>0){
            for(IssueVo downIssueVo : downIssueVos){
                for(Issue downIssue : downIssues){
                    downIssueVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
                    downIssueVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
                    downIssueVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
                    this.setRegister(downIssue, downIssueVo); // 등록자
                    this.setIssueDepartment(downIssue, downIssueVo);  //  담당부서 정보 셋팅
                    this.setIssueCustomFields(downIssue, downIssueVo);   // 사용자정의필드 정보 세팅
                }
                resultList.add(downIssueVo);
                    IssueVo newIssueVo = ConvertUtil.copyProperties(downIssue, IssueVo.class);
                    newIssueVo.setIssueTypeVo(ConvertUtil.copyProperties(downIssue.getIssueType(), IssueTypeVo.class));
                    newIssueVo.setPriorityVo(ConvertUtil.copyProperties(downIssue.getPriority(), PriorityVo.class));
                    newIssueVo.setSeverityVo(ConvertUtil.copyProperties(downIssue.getSeverity(), SeverityVo.class));
                    this.setRegister(downIssue, newIssueVo); // 등록자
                    this.setIssueDepartment(downIssue, newIssueVo);  //  담당부서 정보 셋팅
                    this.setIssueCustomFields(downIssue, newIssueVo);   // 사용자정의필드 정보 세팅
                    resultList.add(newIssueVo);
            }
            issueVo.setIssueDownVos(resultList);
        }
@@ -1232,7 +1237,7 @@
    }
    //  이슈(이슈 유형)에 연결된 사용자 정의 필드 정보를 셋팅한다.
    private void setIssueCustomFields(Issue issue, IssueVo issueVo) {
    private IssueVo setIssueCustomFields(Issue issue, IssueVo issueVo) {
        //  해당 프로젝트의 이슈 유형에 연결된 사용자 정의 필드 정보를 가져온다.
        IssueTypeCustomFieldCondition issueTypeCustomFieldCondition = new IssueTypeCustomFieldCondition();
@@ -1244,6 +1249,8 @@
        //  이슈에서 사용된 사용자 정의 필드 값을 가져온다.
        List<IssueCustomFieldValueVo> issueCustomFieldValueVos = this.issueCustomFieldValueService.findByIssueId(issue.getId());
        issueVo.setIssueCustomFieldValueVos(issueCustomFieldValueVos);
        return issueVo;
    }
    //  이슈에 등록된 댓글 정보를 셋팅한다.
@@ -1261,19 +1268,48 @@
    @Transactional
    public List<IssueVo> findIssue(IssueApiForm issueApiform) {
        List<IssueCustomFieldValueForm> issueCustomFieldValueForms = issueApiform.getIssueCustomFieldValues();
        List<IssueVo> resultIssueVos = new ArrayList<>();
        IssueCustomFieldValueCondition issueCustomFieldValueCondition = new IssueCustomFieldValueCondition();
        if (issueCustomFieldValueForms != null && issueCustomFieldValueForms.size() > 0) {
        if (issueCustomFieldValueForms.size() > 0) {
            for (IssueCustomFieldValueForm issueCustomFieldValueForm : issueCustomFieldValueForms) {
                issueCustomFieldValueCondition.addUseValues(issueCustomFieldValueForm.getUseValue());
            }
        }
//                issueCustomFieldValueCondition.addUseValue(issueCustomFieldValueForm.getUseValue());
                issueCustomFieldValueCondition.setUseValue(issueCustomFieldValueForm.getUseValue());
        List<Map<String, Object>> results = this.issueMapper.findByCustomFieldValue(issueCustomFieldValueCondition);
        List<IssueVo> issueVos = Lists.newArrayList();
        if (results != null && results.size() > 0) {
            issueVos.add(ConvertUtil.convertMapToClass(results.get(0), IssueVo.class));
                    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;
                }
            }
        }
        return issueVos;
        return resultIssueVos;
    }
    // 리스트에서 해당 아이디를 가지고 있는 이슈 검색
    private IssueVo findIssueVo(List<IssueVo> list, Long id) {
        for (IssueVo issueVo : list) {
            if (id.equals(issueVo.getId())) {
                return issueVo;
            }
        }
        return null;
    }
@@ -1285,13 +1321,17 @@
        IssueForm issueForm = this.convertToIssueForm(issueApiForm, user);
        List<IssueVo> issueVos = this.findIssue(issueApiForm);
        if (issueVos != null && issueVos.size() > 0) {
        List<Issue> issue = Lists.newArrayList();
        for (IssueVo issueVo : issueVos) {
            issueForm.setId(issueVo.getId());
            issue.add(this.modifyIssueForApi(user, issueForm, files));
        }
        return issue;
        } else {
            throw new OwlRuntimeException(
                    this.messageAccessor.getMessage(MsgConstants.API_ISSUE_NOT_EXIST));
        }
    }
    //  이슈를 수정한다.
src/main/java/kr/wisestone/owl/vo/IssueVo.java
@@ -319,6 +319,10 @@
        this.issueCustomFieldValueVos.add(issueCustomFieldValueVo);
    }
    public void addIssueCustomFieldValueVos(List<IssueCustomFieldValueVo> issueCustomFieldValueVos) {
        this.issueCustomFieldValueVos = issueCustomFieldValueVos;
    }
    public List<IssueCompanyVo> getIssueCompanyVos() {
        return issueCompanyVos;
    }
src/main/java/kr/wisestone/owl/web/condition/IssueCustomFieldValueCondition.java
@@ -50,7 +50,7 @@
                    //  공백이 아닌 문자가 들어있을 때만 useValues 값 으로 셋팅한다.
                    for (String useValue : MapUtil.getStrings(conditions, "useValues")) {
                        if (!StringUtils.isEmpty(useValue)) {
                            condition.addUseValues(useValue);
                            condition.addUseValue(useValue);
                        }
                    }
                }
@@ -84,7 +84,7 @@
        this.useValues = useValues;
    }
    public void addUseValues(String useValue) {
    public void addUseValue(String useValue) {
        this.useValues.add(useValue);
    }
src/main/resources/mybatis/query-template/issue-template.xml
@@ -511,20 +511,12 @@
    <!--    특정 사용자 정의 필드 값이 같은 이슈를 조회 -->
    <select id="findByCustomFieldValue" resultType="java.util.HashMap" parameterType="kr.wisestone.owl.web.condition.IssueCustomFieldValueCondition">
        SELECT
        iss.id as id,
        iss.title as title
        FROM issue iss
        LEFT OUTER JOIN issue_custom_field_value issue_custom FORCE INDEX(issueIdIndex) ON iss.id = issue_custom.issue_id
        issue_custom.issue_id as id
        FROM issue_custom_field_value issue_custom
        INNER JOIN issue iss ON iss.id = issue_custom.issue_id
        WHERE 1=1
        AND iss.parent_issue_id IS NULL
        <choose>
            <when test="useValues.size != 0">
                AND issue_custom.use_value IN
                <foreach collection="useValues" item="item" index="index" separator="," open="(" close=")">
                    #{item}
                </foreach>
            </when>
        </choose>
        AND issue_custom.use_value = #{useValue}
    </select>
</mapper>
src/main/webapp/scripts/app/issue/issueList.controller.js
@@ -523,6 +523,8 @@
                                if (detail) {
                                    changeDetailView(result.data.data[0].id);
                                }
                            } else {
                                $scope.vm.responseData = null;
                            }
                        }
                        else {