package kr.wisestone.owl.service.impl; import com.google.common.collect.Lists; import kr.wisestone.owl.constant.Constants; import kr.wisestone.owl.domain.*; import kr.wisestone.owl.mapper.IssueTypeCustomFieldMapper; import kr.wisestone.owl.repository.IssueTypeCustomFieldRepository; import kr.wisestone.owl.service.*; import kr.wisestone.owl.util.ConvertUtil; import kr.wisestone.owl.util.MapUtil; import kr.wisestone.owl.vo.CustomFieldValueVo; import kr.wisestone.owl.vo.CustomFieldVo; import kr.wisestone.owl.vo.IssueTypeCustomFieldVo; import kr.wisestone.owl.web.condition.IssueTypeCustomFieldCondition; import kr.wisestone.owl.web.form.IssueTypeCustomFieldForm; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; @Service public class IssueTypeCustomFieldServiceImpl extends AbstractServiceImpl> implements IssueTypeCustomFieldService { private static final Logger log = LoggerFactory.getLogger(IssueTypeCustomFieldServiceImpl.class); @Autowired private IssueTypeCustomFieldRepository issueTypeCustomFieldRepository; @Autowired private IssueTypeCustomFieldMapper issueTypeCustomFieldMapper; @Autowired private ProjectService projectService; @Autowired private IssueTypeService issueTypeService; @Autowired private UserService userService; @Autowired private CustomFieldService customFieldService; @Autowired private IssueCustomFieldValueService issueCustomFieldValueService; @Override protected JpaRepository getRepository() { return this.issueTypeCustomFieldRepository; } // 프로젝트에서 사용하는 필드 정보를 업데이트한다. @Override @Transactional public void modifyIssueTypeCustomFields(IssueTypeCustomFieldForm issueTypeCustomFieldForm) { List issueTypeCustomFields = Lists.newArrayList(); Project project = this.projectService.getProject(issueTypeCustomFieldForm.getProjectId()); IssueType issueType = this.issueTypeService.getIssueType(issueTypeCustomFieldForm.getIssueTypeId()); List saveIssueTypeCustomFields = this.issueTypeCustomFieldRepository.findByProjectIdAndIssueTypeId(project.getId(), issueType.getId()); List addIssueTypeCustomFields = Lists.newArrayList(); List removeIssueTypeCustomFields = Lists.newArrayList(); // 저장해야할 대상 추출 for (Map map : issueTypeCustomFieldForm.getRelationCustomFields()) { Long customFieldId = MapUtil.getLong(map, "id"); boolean exist = false; for (IssueTypeCustomField issueTypeCustomField : saveIssueTypeCustomFields) { if (issueTypeCustomField.getCustomField().getId().equals(customFieldId)) { exist = true; break; } } if (!exist) { addIssueTypeCustomFields.add(customFieldId); } } // 삭제 대상 추출 for (IssueTypeCustomField issueTypeCustomField : saveIssueTypeCustomFields) { boolean exist = false; for (Map map : issueTypeCustomFieldForm.getRelationCustomFields()) { Long customFieldId = MapUtil.getLong(map, "id"); // 이미 저장되어 있는 대상은 따로 저장 if (issueTypeCustomField.getCustomField().getId().equals(customFieldId)) { exist = true; break; } } if (!exist) { removeIssueTypeCustomFields.add(issueTypeCustomField); } } // 이슈 타입 - 사용자 정의 필드 삭제 if (removeIssueTypeCustomFields.size() > 0) { for (IssueTypeCustomField issueTypeCustomField : removeIssueTypeCustomFields) { // 이슈 - 사용자 정의 필드 값 삭제 this.issueCustomFieldValueService.removeIssueCustomFieldValue(issueTypeCustomField.getId()); } this.issueTypeCustomFieldRepository.deleteAll(removeIssueTypeCustomFields); } for (Long customFieldId : addIssueTypeCustomFields) { CustomField customField = this.customFieldService.getCustomField(customFieldId); IssueTypeCustomField issueTypeCustomField = new IssueTypeCustomField(project, issueType, customField, IssueTypeCustomField.FIELD_OPTION_N); issueTypeCustomFields.add(issueTypeCustomField); } // 이슈 타입 - 사용자 정의 필드 정보 연결 if (issueTypeCustomFields.size() > 0) { this.issueTypeCustomFieldRepository.saveAll(issueTypeCustomFields); this.issueTypeCustomFieldRepository.flush(); } // 사용자 정의 필드가 이슈에서 표시되는 순서를 설정한다. this.setIssueTypeCustomFieldPosition(project.getId(), issueType.getId(), issueTypeCustomFieldForm.getRelationCustomFields()); } // 사용자 정의 필드가 이슈에서 표시되는 순서를 설정한다. private void setIssueTypeCustomFieldPosition(Long projectId, Long issueTypeId, List> relationCustomFields) { List saveIssueTypeCustomFields = this.issueTypeCustomFieldRepository.findByProjectIdAndIssueTypeId(projectId, issueTypeId); int count = 1; for (Map relationCustomField : relationCustomFields) { Long customFieldId = MapUtil.getLong(relationCustomField, "id"); if (customFieldId != null) { for (IssueTypeCustomField issueTypeCustomField : saveIssueTypeCustomFields) { if (issueTypeCustomField.getCustomField().getId().equals(customFieldId)) { issueTypeCustomField.setPosition(count); break; } } } count++; } if (saveIssueTypeCustomFields.size() > 0) { this.issueTypeCustomFieldRepository.saveAll(saveIssueTypeCustomFields); this.issueTypeCustomFieldRepository.flush(); } } // 프로젝트에서 사용하는 전체 필드 정보를 조회한다. @Override @Transactional(readOnly = true) public List findIssueTypeCustomField(Map resJsonData, IssueTypeCustomFieldCondition condition) { Project project = this.projectService.getProject(condition.getProjectId()); IssueType issueType = this.issueTypeService.getIssueType(condition.getIssueTypeId()); List issueTypeCustomFields = this.issueTypeCustomFieldRepository.findByProjectIdAndIssueTypeIdOrderByPosition(project.getId(), issueType.getId()); List issueTypeCustomFieldVos = Lists.newArrayList(); for (IssueTypeCustomField issueTypeCustomField : issueTypeCustomFields) { IssueTypeCustomFieldVo issueTypeCustomFieldVo = new IssueTypeCustomFieldVo(); CustomFieldVo customFieldVo = ConvertUtil.copyProperties(issueTypeCustomField.getCustomField(), CustomFieldVo.class); customFieldVo.setCustomFieldValueVos(ConvertUtil.convertObjectsToClasses(issueTypeCustomField.getCustomField().getCustomFieldValues(), CustomFieldValueVo.class)); customFieldVo.setCustomFieldType(issueTypeCustomField.getCustomField().getCustomFieldType().toString()); issueTypeCustomFieldVo.setCustomFieldVo(customFieldVo); issueTypeCustomFieldVo.setFieldOption(issueTypeCustomField.getFieldOption()); issueTypeCustomFieldVo.setChecked(issueTypeCustomField.getFieldOption().equals(IssueTypeCustomField.FIELD_OPTION_Y)); // 화면에서 옵션 체크되도록 checked 에 값 셋팅 List issueCustomFieldValues= this.issueCustomFieldValueService.findByCustomFieldId(issueTypeCustomField.getCustomField()); if(issueCustomFieldValues != null && issueCustomFieldValues.size()>0){ for(IssueCustomFieldValue issueCustomFieldValue : issueCustomFieldValues){ if(issueCustomFieldValue.getIssueTypeCustomField().getId().equals(issueTypeCustomField.getId())){ issueTypeCustomFieldVo.setUseValue(true); } } } issueTypeCustomFieldVos.add(issueTypeCustomFieldVo); } resJsonData.put(Constants.RES_KEY_CONTENTS, issueTypeCustomFieldVos); return issueTypeCustomFieldVos; } @Override @Transactional(readOnly = true) public List findCustomFieldByIssueType(Map resJsonData, IssueTypeCustomFieldCondition condition) { List issueTypeCustomFieldVos = Lists.newArrayList(); IssueType issueType = this.issueTypeService.getIssueType(condition.getIssueTypeId()); condition.setIssueTypeId(issueType.getId()); condition.setWorkspaceId(this.userService.getUser(this.webAppUtil.getLoginId()).getLastWorkspaceId()); List issueTypeCustomFieldVo = this.issueTypeCustomFieldMapper.findByIssueType(condition); if (issueTypeCustomFieldVo != null && issueTypeCustomFieldVo.size() > 0) { issueTypeCustomFieldVos.addAll(issueTypeCustomFieldVo); } resJsonData.put(Constants.RES_KEY_CONTENTS, issueTypeCustomFieldVos); return issueTypeCustomFieldVos; } // 이슈 excel template download 에서 사용 @Override @Transactional(readOnly = true) public List findByProjectIdAndIssueTypeId(Long projectId, Long issueTypeId) { return this.issueTypeCustomFieldRepository.findByProjectIdAndIssueTypeId(projectId, issueTypeId); } // 이슈 add / modify 에서 사용 @Override @Transactional(readOnly = true) public IssueTypeCustomField findByProjectIdAndIssueTypeIdAndCustomFieldId(Long projectId, Long issueTypeId, Long customFieldId) { return this.issueTypeCustomFieldRepository.findByProjectIdAndIssueTypeIdAndCustomFieldId(projectId, issueTypeId, customFieldId); } }