- 프로젝트내 이슈유형에 설정된 사용자 정의 필드가 없을 경우 오류 예외 처리(api 입력 안되는 원인이었음)
| | |
| | | public static final String WORKFLOW_DEPARTMENT_NOT_EXIST = "WORKFLOW_DEPARTMENT_NOT_EXIST"; // 워크플로우 부서가 존재하지 않습니다. |
| | | |
| | | public static final String CUSTOM_FIELD_NOT_EXIST = "CUSTOM_FIELD_NOT_EXIST"; // 사용자 정의 필드가 존재하지 않습니다. |
| | | public static final String ISSUE_TYPE_CUSTOM_FIELD_NOT_EXIST = "ISSUE_TYPE_CUSTOM_FIELD_NOT_EXIST"; // 프로젝트 내 이슈유형에 설정된 사용자 정의 필드가 존재하지 않습니다. |
| | | public static final String CUSTOM_FIELD_NOT_NAME = "CUSTOM_FIELD_NOT_NAME"; // 사용자 정의 필드명이 입력되지 않았습니다. |
| | | public static final String CUSTOM_FIELD_NAME_MAX_LENGTH_OUT = "CUSTOM_FIELD_NAME_MAX_LENGTH_OUT"; // 사용자 정의 필드명은 최대 50글자까지 입력할 수 있습니다. |
| | | public static final String CUSTOM_FIELD_USED_NAME = "CUSTOM_FIELD_USED_NAME"; // 사용자 정의 필드 명이 이미 사용되고 있습니다. |
| | |
| | | public interface IssueCustomFieldValueService extends AbstractService<IssueCustomFieldValue, Long, JpaRepository<IssueCustomFieldValue, Long>>{ |
| | | void modifyIssueCustomFieldValue(Issue issue, List<Map<String, Object>> issueCustomFields); |
| | | |
| | | void getCustomFieldAndIssueTypeCustomField(Map<String, Object> map, Issue issue, Map<String, Object> result); |
| | | boolean getCustomFieldAndIssueTypeCustomField(Map<String, Object> map, Issue issue, Map<String, Object> result); |
| | | |
| | | List<IssueCustomFieldValueVo> findByIssueId(Long issueId); |
| | | |
| | |
| | | for (Map<String, Object> map : issueCustomFields) { |
| | | Map<String, Object> result = new HashMap<>(); |
| | | // customFieldVo 에서 사용자 정의 필드와 이슈 유형에 연결된 사용자 정의 필드 정보를 가져온다. |
| | | this.getCustomFieldAndIssueTypeCustomField(map, issue, result); |
| | | boolean useCustomField = this.getCustomFieldAndIssueTypeCustomField(map, issue, result); |
| | | if (useCustomField) { |
| | | List<String> useValues = MapUtil.getStrings(map, "useValues"); |
| | | |
| | | if (useValues != null) { |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | if (issueCustomFieldValues.size() > 0) { |
| | | try { |
| | | this.issueCustomFieldValueRepository.saveAll(issueCustomFieldValues); |
| | | } catch (Exception ex) { |
| | | throw new OwlRuntimeException( |
| | | this.messageAccessor.getMessage(MsgConstants.CUSTOM_FIELD_NOT_EXIST)); |
| | | } |
| | | } |
| | | } |
| | | |
| | | // customFieldVo 에서 사용자 정의 필드와 이슈 유형에 연결된 사용자 정의 필드 정보를 가져온다. |
| | | @Override |
| | | public void getCustomFieldAndIssueTypeCustomField(Map<String, Object> map, Issue issue, Map<String, Object> result) { |
| | | public boolean getCustomFieldAndIssueTypeCustomField(Map<String, Object> map, Issue issue, Map<String, Object> result) { |
| | | Map<String, Object> customFieldMap = (Map<String, Object>) MapUtil.getObject(map, "customFieldVo"); |
| | | CustomField customField = this.customFieldService.getCustomField(MapUtil.getLong(customFieldMap, "id")); |
| | | IssueTypeCustomField issueTypeCustomField = this.issueTypeCustomFieldService.findByProjectIdAndIssueTypeIdAndCustomFieldId(issue.getProject().getId(), issue.getIssueType().getId(), customField.getId()); |
| | | if (issueTypeCustomField == null) { |
| | | // 설정된 사용자 정의 필드가 없을때 |
| | | return false; |
| | | } |
| | | |
| | | result.put("customField", customField); |
| | | result.put("issueTypeCustomField", issueTypeCustomField); |
| | | |
| | | return true; |
| | | } |
| | | |
| | | // 이슈에 연결된 사용자 정의 필드 값을 조회한다. |
| | |
| | | IssueForm issueForm = this.convertToIssueForm(issueApiForm, user); |
| | | |
| | | List<Issue> issues = Lists.newArrayList(); |
| | | if (issueForm.getParentIssueId() != null) { |
| | | if (issueForm.getParentIssueId() != null // 기존 추가된 상위 일감이 없거나 설정된 중복 이슈 id가 없을때 |
| | | || issueApiForm.getUseIssueCustomFieldIds().size() == 0) { |
| | | issues.add(addIssue(user, issueForm, issueApiForm.getMultipartFiles())); |
| | | } else { |
| | | // 상위 이슈 추가 |
| | | // 가상 상위 이슈 추가 |
| | | IssueForm parentIssueForm = issueForm.clone(); |
| | | parentIssueForm.setUseIssueCustomFields(issueApiForm.getUseIssueCustomFieldIds()); |
| | | Issue issue = addIssue(user, parentIssueForm, null); |
| | |
| | | return "ResMessage [message=" + this.message + ", code=" + this.code |
| | | + ", status=" + this.status + "]"; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | <link type="text/css" rel="stylesheet" href="custom_components/js-autocomplete-single/js-autocomplete-single.css"> |
| | | <link type="text/css" rel="stylesheet" href="custom_components/js-autocomplete-multi/js-autocomplete-multi.css"> |
| | | <link type="text/css" rel="stylesheet" href="custom_components/js-html-diff/js-html-diff.css"> |
| | | <link type="text/css" rel="stylesheet" href="assets/styles/main.css?version=0.9.2"> |
| | | <link type="text/css" rel="stylesheet" href="assets/styles/main.css?version=0.9.4"> |
| | | <link type="text/css" rel="stylesheet" href="https://fonts.googleapis.com/css?family=Rubik:300,400,500"> |
| | | |
| | | <!-- google font --> |