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<IssueTypeCustomField, Long, JpaRepository<IssueTypeCustomField, Long>> 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<IssueTypeCustomField, Long> getRepository() {
|
return this.issueTypeCustomFieldRepository;
|
}
|
|
// 프로젝트에서 사용하는 필드 정보를 업데이트한다.
|
@Override
|
@Transactional
|
public void modifyIssueTypeCustomFields(IssueTypeCustomFieldForm issueTypeCustomFieldForm) {
|
List<IssueTypeCustomField> issueTypeCustomFields = Lists.newArrayList();
|
Project project = this.projectService.getProject(issueTypeCustomFieldForm.getProjectId());
|
IssueType issueType = this.issueTypeService.getIssueType(issueTypeCustomFieldForm.getIssueTypeId());
|
List<IssueTypeCustomField> saveIssueTypeCustomFields = this.issueTypeCustomFieldRepository.findByProjectIdAndIssueTypeId(project.getId(), issueType.getId());
|
|
List<Long> addIssueTypeCustomFields = Lists.newArrayList();
|
List<IssueTypeCustomField> removeIssueTypeCustomFields = Lists.newArrayList();
|
|
// 저장해야할 대상 추출
|
for (Map<String, Object> 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<String, Object> 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<Map<String, Object>> relationCustomFields) {
|
|
List<IssueTypeCustomField> saveIssueTypeCustomFields = this.issueTypeCustomFieldRepository.findByProjectIdAndIssueTypeId(projectId, issueTypeId);
|
|
int count = 1;
|
|
for (Map<String, Object> 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<IssueTypeCustomFieldVo> findIssueTypeCustomField(Map<String, Object> resJsonData, IssueTypeCustomFieldCondition condition) {
|
Project project = this.projectService.getProject(condition.getProjectId());
|
IssueType issueType = this.issueTypeService.getIssueType(condition.getIssueTypeId());
|
|
List<IssueTypeCustomField> issueTypeCustomFields = this.issueTypeCustomFieldRepository.findByProjectIdAndIssueTypeIdOrderByPosition(project.getId(), issueType.getId());
|
List<IssueTypeCustomFieldVo> 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<IssueCustomFieldValue> 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<IssueTypeCustomFieldVo> findCustomFieldByIssueType(Map<String, Object> resJsonData, IssueTypeCustomFieldCondition condition) {
|
List<IssueTypeCustomFieldVo> 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> 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<IssueTypeCustomField> 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);
|
}
|
|
}
|