/**
* Copyright © 2015-2020 JeePlus All rights reserved.
*/
package com.jeeplus.modules.act.service;
import java.io.InputStream;
import java.util.*;
import com.jeeplus.modules.sg.managementcenter.activiti.entity.Construction;
import com.jeeplus.modules.sg.managementcenter.activiti.entity.Disclose;
import com.jeeplus.modules.sg.managementcenter.activiti.service.ConstructionService;
import com.jeeplus.modules.sg.managementcenter.activiti.service.DiscloseService;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.IdentityService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.Expression;
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.history.HistoricTaskInstanceQuery;
import org.activiti.engine.impl.RepositoryServiceImpl;
import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.javax.el.ExpressionFactory;
import org.activiti.engine.impl.javax.el.ValueExpression;
import org.activiti.engine.impl.juel.ExpressionFactoryImpl;
import org.activiti.engine.impl.juel.SimpleContext;
import org.activiti.engine.impl.persistence.entity.ExecutionEntity;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmActivity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.delegate.ActivityBehavior;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.impl.task.TaskDefinition;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.activiti.image.impl.DefaultProcessDiagramGenerator;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.apache.commons.beanutils.PropertyUtils;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.jeeplus.common.utils.StringUtils;
import com.jeeplus.core.persistence.Page;
import com.jeeplus.core.service.BaseService;
import com.jeeplus.modules.act.entity.Act;
import com.jeeplus.modules.act.mapper.ActMapper;
import com.jeeplus.modules.act.utils.ActUtils;
import com.jeeplus.modules.act.utils.ProcessDefCache;
import com.jeeplus.modules.sys.entity.User;
import com.jeeplus.modules.sys.utils.UserUtils;
/**
* 流程定义相关Service
* @author jeeplus
* @version 2016-11-03
*/
@Service
@Transactional(readOnly = true)
public class ActTaskService extends BaseService {
@Autowired
private ActMapper actMapper;
@Autowired
private ProcessEngineFactoryBean processEngine;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private FormService formService;
@Autowired
private HistoryService historyService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private IdentityService identityService;
@Autowired
private ConstructionService constructionService;
@Autowired
private DiscloseService discloseService;
/**
* 获取待办任务列表
* @return
*/
public Page> todoList(Page> page, Act act){
List> result = new ArrayList>();
String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId());
// =============== 已经签收的任务 ===============
TaskQuery todoTaskQuery = taskService.createTaskQuery().taskAssignee(userId).active()
.includeProcessVariables().orderByTaskCreateTime().desc();
// 设置查询条件
if (StringUtils.isNotBlank(act.getProcDefKey())){
todoTaskQuery.processDefinitionKey(act.getProcDefKey());
}
if (act.getBeginDate() != null){
todoTaskQuery.taskCreatedAfter(act.getBeginDate());
}
if (act.getEndDate() != null){
todoTaskQuery.taskCreatedBefore(act.getEndDate());
}
// =============== 等待签收的任务 ===============
TaskQuery toClaimQuery = taskService.createTaskQuery().taskCandidateUser(userId)
.includeProcessVariables().active().orderByTaskCreateTime().desc();
// 设置查询条件
if (StringUtils.isNotBlank(act.getProcDefKey())){
toClaimQuery.processDefinitionKey(act.getProcDefKey());
}
if (act.getBeginDate() != null){
toClaimQuery.taskCreatedAfter(act.getBeginDate());
}
if (act.getEndDate() != null){
toClaimQuery.taskCreatedBefore(act.getEndDate());
}
long taskCount = todoTaskQuery.count();
long claimCount = toClaimQuery.count();
long total = taskCount + claimCount;
page.setCount(total);
int start = page.getFirstResult();
int end = page.getFirstResult() + page.getMaxResults();
// 查询列表
List todoList = Lists.newArrayList();
// 查询列表
List toClaimList = Lists.newArrayList();
if(end == -1){//不分页
todoList = todoTaskQuery.list();
toClaimList = toClaimQuery.list();
}else{
if(end <= taskCount){
todoList = todoTaskQuery.listPage(start, page.getMaxResults());
}else if(start > historicList(Page> page, Act act){
String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId());
HistoricTaskInstanceQuery histTaskQuery = historyService.createHistoricTaskInstanceQuery().taskAssignee(userId).finished()
.includeProcessVariables().orderByHistoricTaskInstanceEndTime().desc();
// 设置查询条件
if (StringUtils.isNotBlank(act.getProcDefKey())){
histTaskQuery.processDefinitionKey(act.getProcDefKey());
}
if (act.getBeginDate() != null){
histTaskQuery.taskCompletedAfter(act.getBeginDate());
}
if (act.getEndDate() != null){
histTaskQuery.taskCompletedBefore(act.getEndDate());
}
// 查询总数
page.setCount(histTaskQuery.count());
page.initialize();
// 查询列表
List histList = Lists.newArrayList();
if(page.getMaxResults() == -1){
histList = histTaskQuery.list();
}else{
histList = histTaskQuery.listPage(page.getFirstResult(), page.getMaxResults());
}
for (HistoricTaskInstance histTask : histList) {
Act e = new Act();
e.setHistTask(histTask);
e.setVars(histTask.getProcessVariables());
// e.setTaskVars(histTask.getTaskLocalVariables());
// System.out.println(histTask.getId()+" = "+histTask.getProcessVariables() + " ========== " + histTask.getTaskLocalVariables());
e.setProcDef(ProcessDefCache.get(histTask.getProcessDefinitionId()));
// e.setProcIns(runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult());
// e.setProcExecUrl(ActUtils.getProcExeUrl(task.getProcessDefinitionId()));
e.setStatus("finish");
HashMap map = new HashMap();
map.put("task.assignee",histTask.getAssignee());
map.put("task.id", histTask.getId());
map.put("task.name", histTask.getName());
map.put("task.endTime", histTask.getEndTime());
map.put("task.executionId",histTask.getExecutionId());
map.put("task.processInstanceId", histTask.getProcessInstanceId());
map.put("task.processDefinitionId", histTask.getProcessDefinitionId());
map.put("task.taskDefinitionKey", histTask.getTaskDefinitionKey());
map.put("vars",histTask.getProcessVariables());
map.put("procDef.name", ProcessDefCache.get(histTask.getProcessDefinitionId()).getName());
map.put("procDef.version", ProcessDefCache.get(histTask.getProcessDefinitionId()).getVersion());
try {
map.put("status", queryProcessState(histTask.getProcessInstanceId()));
} catch (Exception e1) {
e1.printStackTrace();
}
page.getList().add(map);
}
return page;
}
/**
* 获取流转历史任务列表
* @param procInsId 流程实例
* @param startAct 开始活动节点名称
* @param endAct 结束活动节点名称
*/
public List histoicFlowList(String procInsId, String startAct, String endAct){
List actList = Lists.newArrayList();
List list = Lists.newArrayList();
List historicActivityInstances2 = historyService.createHistoricActivityInstanceQuery().processInstanceId(procInsId)
.orderByHistoricActivityInstanceStartTime().asc().orderByHistoricActivityInstanceEndTime().asc().list();;
for(HistoricActivityInstance historicActivityInstance:historicActivityInstances2){
if(historicActivityInstance.getEndTime() != null){
list.add(historicActivityInstance);
}
}
for(HistoricActivityInstance historicActivityInstance:historicActivityInstances2){
if(historicActivityInstance.getEndTime() == null){
list.add(historicActivityInstance);
}
}
boolean start = false;
Map actMap = Maps.newHashMap();
for (int i=0; i il = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInsId).orderByProcessInstanceStartTime().asc().list();
// List il = historyService.getHistoricIdentityLinksForProcessInstance(procInsId);
if (il.size() > 0){
if (StringUtils.isNotBlank(il.get(0).getStartUserId())){
User user = UserUtils.getByLoginName(il.get(0).getStartUserId());
if (user != null){
e.setAssignee(histIns.getAssignee());
e.setAssigneeName(user.getName());
}
}
}
}
// 获取任务执行人名称
if (StringUtils.isNotEmpty(histIns.getAssignee())){
User user = UserUtils.getByLoginName(histIns.getAssignee());
if (user != null){
e.setAssignee(histIns.getAssignee());
e.setAssigneeName(user.getName());
}
}
// 获取意见评论内容
if (StringUtils.isNotBlank(histIns.getTaskId())){
List commentList = taskService.getTaskComments(histIns.getTaskId());
if (commentList.size()>0){
e.setComment(commentList.get(0).getFullMessage());
}
}
actList.add(e);
}
// 过滤结束节点后的节点
if (StringUtils.isNotBlank(endAct) && endAct.equals(histIns.getActivityId())){
boolean bl = false;
Integer actNum = actMap.get(histIns.getActivityId());
// 该活动节点,后续节点是否在结束节点之前,在后续节点中是否存在
for (int j=i+1; j processList(Page