package com.mossle.bpm.support;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import com.mossle.api.form.FormConnector;
import com.mossle.api.form.FormDTO;
import com.mossle.api.process.ProcessConnector;
import com.mossle.api.process.ProcessDTO;
import com.mossle.api.user.UserConnector;
import com.mossle.bpm.cmd.FindFirstTaskFormCmd;
import com.mossle.bpm.persistence.domain.BpmConfForm;
import com.mossle.bpm.persistence.domain.BpmProcess;
import com.mossle.bpm.persistence.manager.BpmConfFormManager;
import com.mossle.bpm.persistence.manager.BpmProcessManager;
import com.mossle.core.page.Page;
import com.mossle.spi.humantask.TaskDefinitionConnector;
import com.mossle.spi.humantask.TaskUserDTO;
import com.mossle.spi.process.FirstTaskForm;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.Job;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.DelegationState;
import org.activiti.engine.task.Task;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ProcessConnectorImpl implements ProcessConnector {
private Logger logger = LoggerFactory.getLogger(ProcessConnectorImpl.class);
private ProcessEngine processEngine;
private BpmConfFormManager bpmConfFormManager;
private BpmProcessManager bpmProcessManager;
private UserConnector userConnector;
private FormConnector formConnector;
private TaskDefinitionConnector taskDefinitionConnector;
public String startProcess(String userId, String businessKey,
String processDefinitionId, Map<String, Object> processParameters) {
// 先设置登录用户
IdentityService identityService = processEngine.getIdentityService();
identityService.setAuthenticatedUserId(userId);
ProcessInstance processInstance = processEngine.getRuntimeService()
.startProcessInstanceById(processDefinitionId, businessKey,
processParameters);
/*
* // {流程标题:title}-{发起人:startUser}-{发起时间:startTime} String processDefinitionName =
* processEngine.getRepositoryService() .createProcessDefinitionQuery()
* .processDefinitionId(processDefinitionId).singleResult() .getName(); String processInstanceName =
* processDefinitionName + "-" + userConnector.findById(userId).getDisplayName() + "-" + new
* SimpleDateFormat("yyyy-MM-dd HH:mm").format(new Date());
* processEngine.getRuntimeService().setProcessInstanceName( processInstance.getId(), processInstanceName);
*/
return processInstance.getId();
}
public ProcessDTO findProcess(String processId) {
if (processId == null) {
logger.info("processId is null");
return null;
}
ProcessDTO processDto = new ProcessDTO();
BpmProcess bpmProcess = bpmProcessManager
.get(Long.parseLong(processId));
String processDefinitionId = bpmProcess.getBpmConfBase()
.getProcessDefinitionId();
String processDefinitionName = bpmProcess.getName();
processDto.setProcessDefinitionId(processDefinitionId);
processDto.setProcessDefinitionName(processDefinitionName);
processDto.setConfigTask(Integer.valueOf(1).equals(
bpmProcess.getUseTaskConf()));
return processDto;
}
/**
* 获得启动表单.
*/
public FormDTO findStartForm(String processDefinitionId) {
ProcessDefinition processDefinition = processEngine
.getRepositoryService().createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId).singleResult();
FirstTaskForm firstTaskForm = processEngine.getManagementService()
.executeCommand(new FindFirstTaskFormCmd(processDefinitionId));
if ((!firstTaskForm.isExists())
&& (firstTaskForm.getActivityId() != null)) {
// 再从数据库里找一遍配置
com.mossle.spi.humantask.FormDTO humantaskFormDto = taskDefinitionConnector
.findForm(firstTaskForm.getActivityId(),
processDefinitionId);
if (humantaskFormDto != null) {
firstTaskForm.setFormKey(humantaskFormDto.getKey());
}
}
if (!firstTaskForm.isExists()) {
logger.info("cannot find startForm : {}", processDefinitionId);
return new FormDTO();
}
if (!firstTaskForm.isTaskForm()) {
logger.info("find startEventForm : {}", processDefinitionId);
return this.findStartEventForm(firstTaskForm);
}
List<TaskUserDTO> taskUserDtos = taskDefinitionConnector.findTaskUsers(
firstTaskForm.getActivityId(),
firstTaskForm.getProcessDefinitionId());
String assignee = firstTaskForm.getAssignee();
logger.debug("assignee : {}", assignee);
for (TaskUserDTO taskUserDto : taskUserDtos) {
logger.debug("catalog : {}, user : {}", taskUserDto.getCatalog(),
taskUserDto.getValue());
if ("assignee".equals(taskUserDto.getCatalog())) {
assignee = taskUserDto.getValue();
break;
}
}
logger.debug("assignee : {}", assignee);
boolean exists = assignee != null;
if ((("${" + firstTaskForm.getInitiatorName() + "}").equals(assignee))
|| "常用语:流程发起人".equals(assignee)
|| ((assignee != null) && assignee.equals(Authentication
.getAuthenticatedUserId()))) {
exists = true;
} else {
exists = false;
}
if (!exists) {
logger.info("cannot find taskForm : {}, {}", processDefinitionId,
firstTaskForm.getActivityId());
return new FormDTO();
}
com.mossle.spi.humantask.FormDTO taskFormDto = taskDefinitionConnector
.findForm(firstTaskForm.getActivityId(),
firstTaskForm.getProcessDefinitionId());
List<BpmConfForm> bpmConfForms = bpmConfFormManager
.find("from BpmConfForm where bpmConfNode.bpmConfBase.processDefinitionId=? and bpmConfNode.code=?",
firstTaskForm.getProcessDefinitionId(),
firstTaskForm.getActivityId());
if (taskFormDto == null) {
logger.info("cannot find bpmConfForm : {}, {}",
processDefinitionId, firstTaskForm.getActivityId());
return new FormDTO();
}
FormDTO formDto = new FormDTO();
formDto.setProcessDefinitionId(firstTaskForm.getProcessDefinitionId());
formDto.setActivityId(firstTaskForm.getActivityId());
FormDTO contentFormDto = formConnector.findForm(taskFormDto.getKey(),
processDefinition.getTenantId());
if (contentFormDto == null) {
logger.error("cannot find form : {}", formDto.getCode());
return formDto;
}
formDto.setCode(taskFormDto.getKey());
formDto.setRedirect(contentFormDto.isRedirect());
formDto.setUrl(contentFormDto.getUrl());
formDto.setContent(contentFormDto.getContent());
return formDto;
}
public FormDTO findStartEventForm(FirstTaskForm firstTaskForm) {
ProcessDefinition processDefinition = processEngine
.getRepositoryService().createProcessDefinitionQuery()
.processDefinitionId(firstTaskForm.getProcessDefinitionId())
.singleResult();
List<BpmConfForm> bpmConfForms = bpmConfFormManager
.find("from BpmConfForm where bpmConfNode.bpmConfBase.processDefinitionId=? and bpmConfNode.code=?",
firstTaskForm.getProcessDefinitionId(),
firstTaskForm.getActivityId());
FormDTO formDto = new FormDTO();
formDto.setProcessDefinitionId(firstTaskForm.getProcessDefinitionId());
formDto.setActivityId(firstTaskForm.getActivityId());
formDto.setCode(firstTaskForm.getFormKey());
if (!bpmConfForms.isEmpty()) {
BpmConfForm bpmConfForm = bpmConfForms.get(0);
if (!Integer.valueOf(2).equals(bpmConfForm.getStatus())) {
if (Integer.valueOf(1).equals(bpmConfForm.getType())) {
formDto.setRedirect(true);
formDto.setUrl(bpmConfForm.getValue());
} else {
formDto.setCode(bpmConfForm.getValue());
}
}
} else {
logger.info("cannot find bpmConfForm : {}, {}",
firstTaskForm.getProcessDefinitionId(),
formDto.getActivityId());
}
FormDTO contentFormDto = formConnector.findForm(formDto.getCode(),
processDefinition.getTenantId());
if (contentFormDto == null) {
logger.error("cannot find form : {}", formDto.getCode());
return formDto;
}
formDto.setRedirect(contentFormDto.isRedirect());
formDto.setUrl(contentFormDto.getUrl());
formDto.setContent(contentFormDto.getContent());
return formDto;
}
/**
* 未结流程.
*/
public Page findRunningProcessInstances(String userId, String tenantId,
Page page) {
HistoryService historyService = processEngine.getHistoryService();
// TODO: 改成通过runtime表搜索,提高效率
long count = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId).startedBy(userId)
.unfinished().count();
HistoricProcessInstanceQuery query = historyService
.createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId).startedBy(userId)
.unfinished();
if (page.getOrderBy() != null) {
String orderBy = page.getOrderBy();
if ("processInstanceStartTime".equals(orderBy)) {
query.orderByProcessInstanceStartTime();
}
if (page.isAsc()) {
query.asc();
} else {
query.desc();
}
}
List<HistoricProcessInstance> historicProcessInstances = query
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(historicProcessInstances);
page.setTotalCount(count);
return page;
}
/**
* 已结流程.
*/
public Page findCompletedProcessInstances(String userId, String tenantId,
Page page) {
HistoryService historyService = processEngine.getHistoryService();
long count = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId).startedBy(userId).finished()
.count();
List<HistoricProcessInstance> historicProcessInstances = historyService
.createHistoricProcessInstanceQuery().startedBy(userId)
.processInstanceTenantId(tenantId).finished()
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(historicProcessInstances);
page.setTotalCount(count);
return page;
}
/**
* 参与流程.
*/
public Page findInvolvedProcessInstances(String userId, String tenantId,
Page page) {
HistoryService historyService = processEngine.getHistoryService();
// TODO: finished(), unfinished()
long count = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId).involvedUser(userId).count();
List<HistoricProcessInstance> historicProcessInstances = historyService
.createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId).involvedUser(userId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(historicProcessInstances);
page.setTotalCount(count);
return page;
}
/**
* 待办任务(个人任务).
*/
public Page findPersonalTasks(String userId, String tenantId, Page page) {
TaskService taskService = processEngine.getTaskService();
long count = taskService.createTaskQuery().taskTenantId(tenantId)
.taskAssignee(userId).active().count();
List<Task> tasks = taskService.createTaskQuery().taskTenantId(tenantId)
.taskAssignee(userId).active()
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(tasks);
page.setTotalCount(count);
return page;
}
/**
* 代领任务(组任务).
*/
public Page findGroupTasks(String userId, String tenantId, Page page) {
TaskService taskService = processEngine.getTaskService();
long count = taskService.createTaskQuery().taskTenantId(tenantId)
.taskCandidateUser(userId).active().count();
List<Task> tasks = taskService.createTaskQuery().taskTenantId(tenantId)
.taskCandidateUser(userId).active()
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(tasks);
page.setTotalCount(count);
return page;
}
/**
* 已办任务(历史任务).
*/
public Page findHistoryTasks(String userId, String tenantId, Page page) {
HistoryService historyService = processEngine.getHistoryService();
long count = historyService.createHistoricTaskInstanceQuery()
.taskTenantId(tenantId).taskAssignee(userId).finished().count();
List<HistoricTaskInstance> historicTaskInstances = historyService
.createHistoricTaskInstanceQuery().taskTenantId(tenantId)
.taskAssignee(userId).finished()
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(historicTaskInstances);
page.setTotalCount(count);
return page;
}
/**
* 代理中的任务(代理人还未完成该任务).
*/
public Page findDelegatedTasks(String userId, String tenantId, Page page) {
TaskService taskService = processEngine.getTaskService();
long count = taskService.createTaskQuery().taskTenantId(tenantId)
.taskOwner(userId).taskDelegationState(DelegationState.PENDING)
.count();
List<Task> tasks = taskService.createTaskQuery().taskTenantId(tenantId)
.taskOwner(userId).taskDelegationState(DelegationState.PENDING)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(tasks);
page.setTotalCount(count);
return page;
}
/**
* 同时返回已领取和未领取的任务.
*/
public Page findCandidateOrAssignedTasks(String userId, String tenantId,
Page page) {
TaskService taskService = processEngine.getTaskService();
long count = taskService.createTaskQuery().taskTenantId(tenantId)
.taskCandidateOrAssigned(userId).count();
List<Task> tasks = taskService.createTaskQuery().taskTenantId(tenantId)
.taskCandidateOrAssigned(userId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(tasks);
page.setTotalCount(count);
return page;
}
/**
* 流程定义.
*/
public Page findProcessDefinitions(String tenantId, Page page) {
RepositoryService repositoryService = processEngine
.getRepositoryService();
long count = repositoryService.createProcessDefinitionQuery()
.processDefinitionTenantId(tenantId).count();
List<ProcessDefinition> processDefinitions = repositoryService
.createProcessDefinitionQuery()
.processDefinitionTenantId(tenantId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(processDefinitions);
page.setTotalCount(count);
return page;
}
/**
* 流程实例.
*/
public Page findProcessInstances(String tenantId, Page page) {
RuntimeService runtimeService = processEngine.getRuntimeService();
long count = runtimeService.createProcessInstanceQuery()
.processInstanceTenantId(tenantId).count();
List<ProcessInstance> processInstances = runtimeService
.createProcessInstanceQuery().processInstanceTenantId(tenantId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(processInstances);
page.setTotalCount(count);
return page;
}
/**
* 任务.
*/
public Page findTasks(String tenantId, Page page) {
TaskService taskService = processEngine.getTaskService();
long count = taskService.createTaskQuery().taskTenantId(tenantId)
.count();
List<Task> tasks = taskService.createTaskQuery().taskTenantId(tenantId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(tasks);
page.setTotalCount(count);
return page;
}
/**
* 部署.
*/
public Page findDeployments(String tenantId, Page page) {
RepositoryService repositoryService = processEngine
.getRepositoryService();
long count = repositoryService.createDeploymentQuery()
.deploymentTenantId(tenantId).count();
List<Deployment> deployments = repositoryService
.createDeploymentQuery().deploymentTenantId(tenantId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(deployments);
page.setTotalCount(count);
return page;
}
/**
* 历史流程实例.
*/
public Page findHistoricProcessInstances(String tenantId, Page page) {
HistoryService historyService = processEngine.getHistoryService();
long count = historyService.createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId).count();
List<HistoricProcessInstance> historicProcessInstances = historyService
.createHistoricProcessInstanceQuery()
.processInstanceTenantId(tenantId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(historicProcessInstances);
page.setTotalCount(count);
return page;
}
/**
* 历史节点.
*/
public Page findHistoricActivityInstances(String tenantId, Page page) {
HistoryService historyService = processEngine.getHistoryService();
long count = historyService.createHistoricActivityInstanceQuery()
.activityTenantId(tenantId).count();
List<HistoricActivityInstance> historicActivityInstances = historyService
.createHistoricActivityInstanceQuery()
.activityTenantId(tenantId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(historicActivityInstances);
page.setTotalCount(count);
return page;
}
/**
* 历史任务.
*/
public Page findHistoricTaskInstances(String tenantId, Page page) {
HistoryService historyService = processEngine.getHistoryService();
long count = historyService.createHistoricTaskInstanceQuery()
.taskTenantId(tenantId).count();
List<HistoricTaskInstance> historicTaskInstances = historyService
.createHistoricTaskInstanceQuery().taskTenantId(tenantId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(historicTaskInstances);
page.setTotalCount(count);
return page;
}
/**
* 作业.
*/
public Page findJobs(String tenantId, Page page) {
ManagementService managementService = processEngine
.getManagementService();
long count = managementService.createJobQuery().jobTenantId(tenantId)
.count();
List<Job> jobs = managementService.createJobQuery()
.jobTenantId(tenantId)
.listPage((int) page.getStart(), page.getPageSize());
page.setResult(jobs);
page.setTotalCount(count);
return page;
}
@Resource
public void setProcessEngine(ProcessEngine processEngine) {
this.processEngine = processEngine;
}
@Resource
public void setBpmConfFormManager(BpmConfFormManager bpmConfFormManager) {
this.bpmConfFormManager = bpmConfFormManager;
}
@Resource
public void setBpmProcessManager(BpmProcessManager bpmProcessManager) {
this.bpmProcessManager = bpmProcessManager;
}
@Resource
public void setUserConnector(UserConnector userConnector) {
this.userConnector = userConnector;
}
@Resource
public void setFormConnector(FormConnector formConnector) {
this.formConnector = formConnector;
}
@Resource
public void setTaskDefinitionConnector(
TaskDefinitionConnector taskDefinitionConnector) {
this.taskDefinitionConnector = taskDefinitionConnector;
}
}