fourcal/src/main/java/cn/palmte/work/service/ProjectInstanceService.java

182 lines
7.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package cn.palmte.work.service;
import cn.palmte.work.bean.ApproveStatusEnum;
import cn.palmte.work.bean.StatusEnum;
import cn.palmte.work.config.activiti.ActConstant;
import cn.palmte.work.model.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import top.jfunc.common.utils.CollectionUtil;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author xiongshiyan at 2021/10/29 , contact me with email yanshixiong@126.com or phone 15208384257
*/
@Service
public class ProjectInstanceService {
private static final Logger logger = LoggerFactory.getLogger(ActProcInsService.class);
@Autowired
private ProjectRepository projectRepository;
@Autowired
private AdminService adminService;
@Autowired
private ActProcInsService actProcInsService;
@Autowired
private ProjectInstanceRelationRepository projectInstanceRelationRepository;
/**
* 开启一个概算流程实例
*/
public void startEstimateProcessInstance(Project project, Admin admin) throws Exception {
startProcess(project, admin, ActConstant.PROCESS_DEFKEY_ESTIMATE);
}
/**
* 返回概算的所有的实例id没有则空集合
*/
public List<String> getEstimateProcessInsIds(Project project){
return getApproveInstanceIds(project, ActConstant.PROCESS_DEFKEY_ESTIMATE);
}
/**
* 开启一个预算流程实例
*/
public void startBudgetProcessInstance(Project project, Admin admin) throws Exception {
startProcess(project, admin, ActConstant.PROCESS_DEFKEY_BUDGET);
}
/**
* 返回预算的所有的实例id没有则空集合
*/
public List<String> getBudgetProcessInsIds(Project project){
return getApproveInstanceIds(project, ActConstant.PROCESS_DEFKEY_BUDGET);
}
/**
* 开启一个结算流程实例
*/
public void startSettleProcessInstance(Project project, Admin admin) throws Exception {
startProcess(project, admin, ActConstant.PROCESS_DEFKEY_SETTLE);
}
/**
* 返回结算的所有的实例id没有则空集合
*/
public List<String> getSettleProcessInsIds(Project project){
return getApproveInstanceIds(project, ActConstant.PROCESS_DEFKEY_SETTLE);
}
/**
* 开启一个决算流程实例
*/
public void startFinalProcessInstance(int projectId, Admin admin) throws Exception {
Project project = projectRepository.findOne(projectId);
startProcess(project, admin, ActConstant.PROCESS_DEFKEY_FINAL);
}
/**
* 返回决算的所有的实例id没有则空集合
*/
public List<String> getFinalProcessInsIds(Project project){
return getApproveInstanceIds(project, ActConstant.PROCESS_DEFKEY_FINAL);
}
private List<String> getApproveInstanceIds(Project project, String processDefkey) {
List<ProjectInstanceRelation> all = projectInstanceRelationRepository.findAllByProjectIdEqualsAndProcessTypeEqualsOrderByCreateTimeDesc(project.getId(), processDefkey);
if (CollectionUtil.isEmpty(all)) {
return Collections.emptyList();
}
return all.stream().map(ProjectInstanceRelation::getProcessInsId).collect(Collectors.toList());
}
private void startProcess(Project project, Admin admin, String processDefkey) throws Exception {
HashMap<String, Object> variables = new HashMap<>();
variables.put(ActConstant.KEY_PROJECT_TYPE, project.getType());
String businessKey = String.valueOf(project.getId());
logger.info("startProcess processDefkey:{}, businessKey{}", processDefkey, businessKey);
String processInstanceId = actProcInsService.startProcessInstance(processDefkey, businessKey, variables);
saveProjectInstance(project, processDefkey, processInstanceId);
}
public String startProcessBySystem(Project project, String processDefkey, ProjectTaskRecord taskRecord) throws Exception {
HashMap<String, Object> variables = new HashMap<>();
variables.put(ActConstant.KEY_PROJECT_TYPE, project.getType());
String businessKey = String.valueOf(project.getId());
logger.info("startProcessBySystem processDefkey:{}, businessKey{}", processDefkey, businessKey);
String processInstanceId = actProcInsService.startProcessInstanceBySystem(
processDefkey, businessKey, variables, taskRecord);
saveProjectInstance(project, processDefkey, processInstanceId);
return processInstanceId;
}
private void saveProjectInstance(Project project, String processDefkey, String processInstanceId) {
//保存流程实例id与项目的关联关系
ProjectInstanceRelation relation = new ProjectInstanceRelation();
relation.setProjectId(project.getId());
relation.setProcessType(processDefkey);
relation.setProcessInsId(processInstanceId);
relation.setCreateTime(new Date());
projectInstanceRelationRepository.saveAndFlush(relation);
}
/**
* 更新审批人,用于在任务监听器中更新下个审批人
* @param projectId 项目id
* @param adminId 审批人id
*/
public void updateApprover(int projectId, int adminId){
Project project = projectRepository.findOne(projectId);
if (project == null) {
return;
}
if (adminId == 0) {
project.setApproveName("");
}else {
Admin admin = adminService.getAdminById(adminId);
project.setApproveName(admin.getRealName());
}
project.setApproveId(adminId);
project.setLastUpdateTime(new Date());
projectRepository.saveAndFlush(project);
}
/**
* 更新审批状态
* @param processKey 审批类型
* @see ActConstant#PROCESS_DEFKEY_ESTIMATE
* @see ActConstant#PROCESS_DEFKEY_BUDGET
* @see ActConstant#PROCESS_DEFKEY_SETTLE
* @see ActConstant#PROCESS_DEFKEY_FINAL
*/
public void updateApproveStatus(int projectId, String processKey, ApproveStatusEnum approveStatusEnum){
Project project = projectRepository.findOne(projectId);
if(ActConstant.PROCESS_DEFKEY_ESTIMATE.equals(processKey)){
project.setApproveStatusEstimate(approveStatusEnum.getApproveStatus());
}else if(ActConstant.PROCESS_DEFKEY_BUDGET.equals(processKey)){
project.setApproveStatusBudget(approveStatusEnum.getApproveStatus());
}else if(ActConstant.PROCESS_DEFKEY_SETTLE.equals(processKey)){
project.setApproveStatusSettle(approveStatusEnum.getApproveStatus());
}else if(ActConstant.PROCESS_DEFKEY_FINAL.equals(processKey)){
project.setApproveStatusFinal(approveStatusEnum.getApproveStatus());
}
if (approveStatusEnum.getApproveStatus() == ApproveStatusEnum.APPROVAL_PASSED.getApproveStatus()) {
//审批通过设置审批人为空
project.setApproveId(0);
project.setApproveName("");
}
project.setLastUpdateTime(new Date());
projectRepository.saveAndFlush(project);
}
}