package kr.wisestone.owl.service.impl; import com.google.common.collect.Lists; import kr.wisestone.owl.constant.Constants; import kr.wisestone.owl.constant.MsgConstants; import kr.wisestone.owl.domain.Project; import kr.wisestone.owl.domain.WorkflowStatus; import kr.wisestone.owl.domain.enumType.ProjectType; import kr.wisestone.owl.exception.OwlRuntimeException; import kr.wisestone.owl.repository.WorkflowStatusRepository; import kr.wisestone.owl.service.IssueService; import kr.wisestone.owl.service.ProjectService; import kr.wisestone.owl.service.WorkflowStatusService; import kr.wisestone.owl.util.ConvertUtil; import kr.wisestone.owl.vo.IssueVo; import kr.wisestone.owl.vo.UserVo; import kr.wisestone.owl.vo.WorkflowStatusVo; import kr.wisestone.owl.web.condition.IssueCondition; import kr.wisestone.owl.web.condition.WorkflowStatusCondition; //import kr.wisestone.owl.web.form.WorkflowStatusForm; 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 org.springframework.util.StringUtils; import java.util.List; import java.util.Map; /** * Created by wisestone on 2018-01-03. */ @Service public class WorkflowStatusServiceImpl extends AbstractServiceImpl> implements WorkflowStatusService { private static final Logger log = LoggerFactory.getLogger(WorkflowStatusServiceImpl.class); @Autowired private WorkflowStatusRepository workflowStatusRepository; @Autowired private IssueService taskService; @Autowired private ProjectService projectService; @Override protected JpaRepository getRepository() { return this.workflowStatusRepository; } @Override @Transactional public List addDefaultWorkflowStatus(Project project, ProjectType projectType) { List workflowStatuses = Lists.newArrayList(); switch(projectType) { case RMS_PROJECT: workflowStatuses.add(new WorkflowStatus(project, "할 일", Boolean.TRUE, Boolean.FALSE, "#047bf8", 0L, 0L)); workflowStatuses.add(new WorkflowStatus(project, "진행 중", Boolean.FALSE, Boolean.FALSE, "#e65252", 50L, 1L)); workflowStatuses.add(new WorkflowStatus(project, "완료", Boolean.FALSE, Boolean.TRUE, "#5bc0de", 100L, 2L)); workflowStatuses.add(new WorkflowStatus(project, "보류", Boolean.FALSE, Boolean.FALSE, "#5eb314", 0L, 3L)); workflowStatuses.add(new WorkflowStatus(project, "취소", Boolean.FALSE, Boolean.FALSE, "#b17247", 0L, 4L)); break; case BTS_PROJECT: workflowStatuses.add(new WorkflowStatus(project, "오픈", Boolean.TRUE, Boolean.FALSE, "#047bf8", 0L, 0L)); workflowStatuses.add(new WorkflowStatus(project, "할당", Boolean.FALSE, Boolean.FALSE, "#e65252", 20L, 1L)); workflowStatuses.add(new WorkflowStatus(project, "해결", Boolean.FALSE, Boolean.FALSE, "#5bc0de", 50L, 2L)); workflowStatuses.add(new WorkflowStatus(project, "확인", Boolean.FALSE, Boolean.FALSE, "#5eb314", 70L, 3L)); workflowStatuses.add(new WorkflowStatus(project, "종료", Boolean.FALSE, Boolean.TRUE, "#b17247", 100L, 4L)); break; case TCM_PROJECT : workflowStatuses.add(new WorkflowStatus(project, "대기", Boolean.TRUE, Boolean.FALSE, "#047bf8", 0L, 0L)); workflowStatuses.add(new WorkflowStatus(project, "진행 중", Boolean.FALSE, Boolean.FALSE, "#e65252", 20L, 1L)); workflowStatuses.add(new WorkflowStatus(project, "검수", Boolean.FALSE, Boolean.FALSE, "#5bc0de", 50L, 2L)); workflowStatuses.add(new WorkflowStatus(project, "완료", Boolean.FALSE, Boolean.TRUE, "#b17247", 100L, 4L)); workflowStatuses.add(new WorkflowStatus(project, "취소", Boolean.FALSE, Boolean.FALSE, "#6156c5", 0L, 5L)); break; } return this.workflowStatusRepository.saveAll(workflowStatuses); } // 워크플로우 현재 상태 찾기 @Override @Transactional(readOnly = true) public List findWorkflowStatus(Map resJsonData, WorkflowStatusCondition condition) { List workflowStatuses = this.workflowStatusRepository.findByProjectId(condition.getProjectId()); List workflowStatusVos = Lists.newArrayList(); IssueCondition taskCondition = new IssueCondition(); for (WorkflowStatus workflowStatus : workflowStatuses) { taskCondition.addStatusId(workflowStatus.getId()); } Map tasks = this.taskService.findTask(taskCondition); for (WorkflowStatus workflowStatus : workflowStatuses) { WorkflowStatusVo workflowStatusVo = ConvertUtil.copyProperties(workflowStatus, WorkflowStatusVo.class); List taskVos = (List)tasks.get(workflowStatus.getId().toString()); workflowStatusVo.setTaskVos(taskVos); workflowStatusVos.add(workflowStatusVo); } resJsonData.put(Constants.RES_KEY_CONTENTS, workflowStatusVos); return workflowStatusVos; } // @Override // @Transactional // public WorkflowStatus addWorkflowStatus(WorkflowStatusForm workflowStatusForm) { // WorkflowStatus workflowStatus = ConvertUtil.copyProperties(workflowStatusForm, WorkflowStatus.class); // Project project = this.projectService.getProject(workflowStatusForm.getProjectId()); // // // 이름 유효성 검사 // this.verifyName(project.getId(), null, workflowStatus.getName()); // // TODO - 진행률 (대시보드 사용하게 될 때 필요) // workflowStatus.setProgress(0L); // workflowStatus.setProject(project); // // this.workflowStatusRepository.saveAndFlush(workflowStatus); // // 위치 정의 // this.positionRegulate(project, workflowStatus); // // return workflowStatus; // } // // // 이름 유효성 검사 // private void verifyName(Long projectId, Long id, String name) { // if (StringUtils.isEmpty(name)) { // throw new OwlRuntimeException( // this.messageAccessor.getMessage(MsgConstants.WORKFLOW_STATUS_NOT_NAME)); // } // // WorkflowStatus workflowStatus; // // if (id != null) { // workflowStatus = this.workflowStatusRepository.findByIdNotAndNameAndProjectId(id, name, projectId); // } // else { // workflowStatus = this.workflowStatusRepository.findByNameAndProjectId(name, projectId); // } // // if (workflowStatus != null) { // throw new OwlRuntimeException(this.messageAccessor.getMessage(MsgConstants.WORKFLOW_STATUS_USED_NAME)); // } // } // // // 위치 정의 // private void positionRegulate(Project project, WorkflowStatus workflowStatus) { // Long maxPosition = this.workflowStatusRepository.findMaxPosition(project.getId()); // maxPosition = maxPosition + 1; // workflowStatus.setPosition(maxPosition); // // this.workflowStatusRepository.saveAndFlush(workflowStatus); // } // // // 워크플로우 상태 상세 조회 // @Override // @Transactional // public WorkflowStatusVo detailWorkflowStatus(Map resJsonData, WorkflowStatusForm workflowStatusForm) { // WorkflowStatusVo workflowStatusVo; // // if (workflowStatusForm.getId() != null) { // workflowStatusVo = ConvertUtil.copyProperties(this.workflowStatusRepository.findOne(workflowStatusForm.getId()), WorkflowStatusVo.class); // } // else { // workflowStatusVo = new WorkflowStatusVo(); // } // // resJsonData.put(Constants.RES_KEY_CONTENTS, workflowStatusVo); // // return workflowStatusVo; // } // // // 워크플로우 상태 정보를 수정한다. // @Override // @Transactional // public WorkflowStatus modifyWorkflowStatus(WorkflowStatusForm workflowStatusForm) { // WorkflowStatus workflowStatus = this.workflowStatusRepository.findOne(workflowStatusForm.getId()); // // // 이름 유효성 체크 // this.verifyName(workflowStatus.getProject().getId(), workflowStatusForm.getId(), workflowStatusForm.getName()); // // 색상 체크 // this.verifyColor(workflowStatusForm.getColor()); // // ConvertUtil.copyProperties(workflowStatusForm, workflowStatus, "id"); // // return this.workflowStatusRepository.saveAndFlush(workflowStatus); // } // // // 색상 체크 // private void verifyColor(String color) { // if (org.apache.commons.lang.StringUtils.isEmpty(color)) { // throw new OwlRuntimeException( // this.messageAccessor.getMessage(MsgConstants.WORKFLOW_STATUS_NOT_COLOR)); // } // } }