package cn.itcast.ssh.service.impl;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipInputStream;
import org.activiti.engine.FormService;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.form.TaskFormData;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.impl.identity.Authentication;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.apache.commons.lang.StringUtils;
import cn.itcast.ssh.dao.ILeaveBillDao;
import cn.itcast.ssh.domain.LeaveBill;
import cn.itcast.ssh.service.IWorkflowService;
import cn.itcast.ssh.utils.SessionContext;
import cn.itcast.ssh.web.form.WorkflowBean;
public class WorkflowServiceImpl implements IWorkflowService {
/**请假申请Dao*/
private ILeaveBillDao leaveBillDao;
private RepositoryService repositoryService;
private RuntimeService runtimeService;
private TaskService taskService;
private FormService formService;
private HistoryService historyService;
public void setLeaveBillDao(ILeaveBillDao leaveBillDao) {
this.leaveBillDao = leaveBillDao;
}
public void setHistoryService(HistoryService historyService) {
this.historyService = historyService;
}
public void setFormService(FormService formService) {
this.formService = formService;
}
public void setRuntimeService(RuntimeService runtimeService) {
this.runtimeService = runtimeService;
}
public void setTaskService(TaskService taskService) {
this.taskService = taskService;
}
public void setRepositoryService(RepositoryService repositoryService) {
this.repositoryService = repositoryService;
}
/**部署流程定义*/
@Override
public void saveNewDeploye(File file, String filename) {
try {
//2:将File类型的文件转化成ZipInputStream流
ZipInputStream zipInputStream = new ZipInputStream(new FileInputStream(file));
repositoryService.createDeployment()//创建部署对象
.name(filename)//添加部署名称
.addZipInputStream(zipInputStream)//
.deploy();//完成部署
} catch (Exception e) {
e.printStackTrace();
}
}
/**查询部署对象信息,对应表(act_re_deployment)*/
@Override
public List<Deployment> findDeploymentList() {
List<Deployment> list = repositoryService.createDeploymentQuery()//创建部署对象查询
.orderByDeploymenTime().asc()//
.list();
return list;
}
/**查询流程定义的信息,对应表(act_re_procdef)*/
@Override
public List<ProcessDefinition> findProcessDefinitionList() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()//创建流程定义查询
.orderByProcessDefinitionVersion().asc()//
.list();
return list;
}
/**使用部署对象ID和资源图片名称,获取图片的输入流*/
@Override
public InputStream findImageInputStream(String deploymentId,
String imageName) {
return repositoryService.getResourceAsStream(deploymentId, imageName);
}
/**使用部署对象ID,删除流程定义*/
@Override
public void deleteProcessDefinitionByDeploymentId(String deploymentId) {
repositoryService.deleteDeployment(deploymentId, true);
}
/**更新请假状态,启动流程实例,让启动的流程实例关联业务*/
@Override
public void saveStartProcess(WorkflowBean workflowBean) {
//1:获取请假单ID,使用请假单ID,查询请假单的对象LeaveBill
Long id = workflowBean.getId();
LeaveBill leaveBill = leaveBillDao.findLeaveBillById(id);
//2:更新请假单的请假状态从0变成1(初始录入-->审核中)
leaveBill.setState(1);
//3:使用当前对象获取到流程定义的key(对象的名称就是流程定义的key)
String key = leaveBill.getClass().getSimpleName();
/**
* 4:从Session中获取当前任务的办理人,使用流程变量设置下一个任务的办理人
* inputUser是流程变量的名称,
* 获取的办理人是流程变量的值
*/
Map<String, Object> variables = new HashMap<String,Object>();
variables.put("inputUser", SessionContext.get().getName());//表示惟一用户
/**
* 5: (1)使用流程变量设置字符串(格式:LeaveBill.id的形式),通过设置,让启动的流程(流程实例)关联业务
(2)使用正在执行对象表中的一个字段BUSINESS_KEY(Activiti提供的一个字段),让启动的流程(流程实例)关联业务
*/
//格式:LeaveBill.id的形式(使用流程变量)
String objId = key+"."+id;
variables.put("objId", objId);
//6:使用流程定义的key,启动流程实例,同时设置流程变量,同时向正在执行的执行对象表中的字段BUSINESS_KEY添加业务数据,同时让流程关联业务
runtimeService.startProcessInstanceByKey(key,objId,variables);
}
/**2:使用当前用户名查询正在执行的任务表,获取当前任务的集合List<Task>*/
@Override
public List<Task> findTaskListByName(String name) {
List<Task> list = taskService.createTaskQuery()//
.taskAssignee(name)//指定个人任务查询
.orderByTaskCreateTime().asc()//
.list();
return list;
}
/**使用任务ID,获取当前任务节点中对应的Form key中的连接的值*/
@Override
public String findTaskFormKeyByTaskId(String taskId) {
TaskFormData formData = formService.getTaskFormData(taskId);
//获取Form key的值
String url = formData.getFormKey();
return url;
}
/**一:使用任务ID,查找请假单ID,从而获取请假单信息*/
@Override
public LeaveBill findLeaveBillByTaskId(String taskId) {
//1:使用任务ID,查询任务对象Task
Task task = taskService.createTaskQuery()//
.taskId(taskId)//使用任务ID查询
.singleResult();
//2:使用任务对象Task获取流程实例ID
String processInstanceId = task.getProcessInstanceId();
//3:使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象
ProcessInstance pi = runtimeService.createProcessInstanceQuery()//
.processInstanceId(processInstanceId)//使用流程实例ID查询
.singleResult();
//4:使用流程实例对象获取BUSINESS_KEY
String buniness_key = pi.getBusinessKey();
//5:获取BUSINESS_KEY对应的主键ID,使用主键ID,查询请假单对象(LeaveBill.1)
String id = "";
if(StringUtils.isNotBlank(buniness_key)){
//截取字符串,取buniness_key小数点的第2个值
id = buniness_key.split("\\.")[1];
}
//查询请假单对象
//使用hql语句:from LeaveBill o where o.id=1
LeaveBill leaveBill = leaveBillDao.findLeaveBillById(Long.parseLong(id));
return leaveBill;
}
/**二:已知任务ID,查询ProcessDefinitionEntiy对象,从而获取当前任务完成之后的连线名称,并放置到List<String>集合中*/
@Override
public List<String> findOutComeListByTaskId(String taskId) {
//返回存放连线的名称集合
List<String> list = new ArrayList<String>();
//1:使用任务ID,查询任务对象
Task task = taskService.createTaskQuery()//
.taskId(taskId)//使用任务ID查询
.singleResult();
//2:�
评论4
最新资源