工作流activiti5.13总结

工作流本次是用在了物流管理系统中。使用Spring+struts+hibernate+shiro+activiti5开发.

主要说下activiti5。activiti5共有23张表,分别解释如下:
ACT_RE_:RE表示repository。这个前缀的表包含了流程定义和流程静态资源(图片、规则等)。
ACT_RU_
:RU表示runtime。这些运行时的表,包括流程实例、任务、变量、异步任务等运行中的数据。Activiti只在流程实例执行过程总保存这些数据,在流程结束时就会删除这些记录。这样运行时表可以一直很小速度很快。
ACT_ID_:ID表示identity。这些表包含身份信息,比如用户、组等等。
ACT_HI_
:HI表示history。这些表包括历史数据,比如历史流程实例、变量、任务等等。
ACT_GE_*:通用数据,用于不同场景下,如存放资源文件。

资源库流程规则表

  1. act_re_deployment 部署信息表
  2. act_re_model 流程设计模型部署表
  3. act_re_procdef 流程定义数据表

运行时数据库表

  1. act_ru_execution运行时流程执行实例表
  2. act_ru_identitylink运行时流程人员表,主要存储任务节点与参与者的相关信息
  3. act_ru_task运行时任务节点表
  4. act_ru_variable运行时流程变量数据表

历史数据库表

  1. act_hi_actinst 历史节点表
  2. act_hi_attachment历史附件表
  3. act_hi_comment历史意见表
  4. act_hi_identitylink历史流程人员表
  5. act_hi_detail历史详情表,提供历史变量的查询
  6. act_hi_procinst历史流程实例表
  7. act_hi_taskinst历史任务实例表
  8. act_hi_varinst历史变量表

组织机构表

  1. act_id_group用户组信息表
  2. act_id_info用户扩展信息表
  3. act_id_membership用户与用户组对应信息表
  4. act_id_user用户信息表

这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足

通用数据表

  1. act_ge_bytearray二进制数据表
  2. act_ge_property属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,

Activiti框架提供的Service对象。
1.RepositoryService 操作静态的资源(流程定义、bpmn、png).
2.RuntimeService 操作流程实例(启动流程实例、查询流程实例、结束流程实例)。
3.TaskService 操作任务(查询任务,办理任务)
4.HisrtoryService 操作历史数据。

下面讲述工作流程的启动过程:
transfer2.bpmn
1.部署流程定义
流程定义管理
发布新流程

// 注入Service
	@Autowired
	private RepositoryService repositoryService;

/**
	 * 部署流程定义
	 * @throws FileNotFoundException 
	 */
	public String deploy() throws FileNotFoundException {
		DeploymentBuilder deploymentBuilder = repositoryService
				.createDeployment();
		deploymentBuilder.addZipInputStream(new ZipInputStream(
				new FileInputStream(zipFile)));
		deploymentBuilder.deploy();
		return "toList";
	}
/**
	 * 查询最新版本流程定义列表数据
	 */
	public String list() {
		ProcessDefinitionQuery query = repositoryService
				.createProcessDefinitionQuery();
		query.latestVersion();// 查询最新版本
		query.orderByProcessDefinitionName().desc();// 排序
		List<ProcessDefinition> list = query.list();// 执行查询
		// 压栈
		ActionContext.getContext().getValueStack().set("list", list);
		return "list";
	}
/**可以在前台查看流程图
	 * 展示png图片
	 */
	public String showpng(){
		//获取png图片对应的输入流
		InputStream pngStream = repositoryService.getProcessDiagram(id);
		ActionContext.getContext().getValueStack().set("pngStream", pngStream);
		return "showpng";
	}
/**前台删除流程图。
	 * 删除流程定义
	 */
	public String delete(){
		String deltag = "0";
		//根据流程定义id查询部署id
		ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
		query.processDefinitionId(id);//根据id过滤
		ProcessDefinition processDefinition = query.singleResult();
		String deploymentId = processDefinition.getDeploymentId();
		try{
			repositoryService.deleteDeployment(deploymentId);
		}catch (Exception e) {
			//当前要删除的流程定义正在使用
			deltag = "1";
			ActionContext.getContext().getValueStack().set("deltag", deltag);
			ProcessDefinitionQuery query2 = repositoryService
					.createProcessDefinitionQuery();
			query2.latestVersion();// 查询最新版本
			query2.orderByProcessDefinitionName().desc();// 排序
			List<ProcessDefinition> list = query2.list();// 执行查询
			// 压栈
			ActionContext.getContext().getValueStack().set("list", list);
			return "list";
		}
		return "toList";
	}

2.部署流程定义后,进行工作单快速录入:
新增工作单
工作单是需要快递的商品,增加完工作单后,工作单会在启动配送流程中展示出来:
启动配送流程
点击启动按钮,代码实现如下:

/**
	 * 启动物流配送流程
	 * @return
	 */
	public String start(){
		//启动流程实例,设置流程变量,修改工作单中start为1
		
		String id = model.getId();//工作单id
		WorkordermanageService.start(id);
		return "toList";
	}
//启动流程实例,设置流程变量,修改工作单中start为1
	public void start(String id) {
		// 
		Workordermanage workordermange = workordermanageDao.findById(id);
		workordermange.setStart("1");//已启动
		String processDefinitionKey = "transfer";
		String businessKey = id;//业务主键---等于业务表(工作单)主键值
		Map<String,Object> variables = new HashMap<String,Object>();
		variables.put("业务数据", workordermange);
		runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
	}

此时流程实例已经启动,查看正在运行的流程实例:
正在运行的流程实例
点击查看流程图:
查看流程图
查看我的组任务:
查看我的组任务
代码如下:

@Autowired
	private TaskService taskService;
	
	@Autowired
	private RuntimeService runtimeService;
	
	@Autowired
	private IWorkordermanageService workordermanageService;
	/**
	 * 查询组任务
	 * @return
	 */
	public String findGroupTask(){
		
		TaskQuery query = taskService.createTaskQuery();
		String candidateUser = BOSContext.getLoginUser().getId();
		//组任务过滤
		query.taskCandidateUser(candidateUser);
		List<Task> list = query.list();
		ActionContext.getContext().getValueStack().set("list", list);
		
		return "groupTaskList";
	}
/**查看业务数据
	 * 根据任务id查询对应的流程变量数据
	 * @return
	 * @throws IOException
	 */
	public String showData() throws IOException{
		Map<String,Object> variables = taskService.getVariables(taskId);
		ServletActionContext.getResponse().setContentType("text/html;charset = utf-8");
		ServletActionContext.getResponse().getWriter().print(variables.toString());
		return NONE;
	}

点击拾取:

点击拾取

点击拾取:
public String takeTask(){
		String userId = BOSContext.getLoginUser().getId();
		taskService.claim(taskId, userId);
		
		return "togrouptasklist";
	}

办理任务:
办理任务
提交:

/**
	 * 办理流程审核工作单信息
	 */
	public String checkWorkOrderManage(){
		//跳转到一个审核工作单界面,展示当前对应的工作单信息
		//根据任务id查询任务对象
		Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
		//根据任务对象查询流程实例ID
		String processInstanceId = task.getProcessInstanceId();
		//根据流程实例id查询流程实例对象
		ProcessInstance processInstance = runtimeService
				.createProcessInstanceQuery()
				.processInstanceId(processInstanceId).singleResult();
		String workOrderManageId  = processInstance.getBusinessKey();
		Workordermanage workordermanage = workordermanageService.findById(workOrderManageId);
		if(check ==null){
			//跳转到审核界面
			
			ActionContext.getContext().getValueStack().set("map", workordermanage);
			
			return "check";
		}else{
			//办理审核工作单任务
			
			workordermanageService.checkWorkOdrManage(taskId,check,workOrderManageId);
			return "topersonaltasklist";
		}
	}
public void checkWorkOdrManage(String taskId, Integer check, String workOrderManageId) {
		//如果审核不通过,修改工作单start为0
		Workordermanage workordermanage = workordermanageDao.findById(workOrderManageId);
		//根据任务id查询任务对象
		Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
		//根据任务对象查询流程实例ID
		String processInstanceId = task.getProcessInstanceId();
		// 办理审核工作单任务
		Map<String,Object> variables  = new HashMap<String,Object>();
		variables.put("check", check);
		taskService.complete(taskId,variables);
		if(check ==0){
			//审核不通过
			workordermanage.setStart("0");
			//删除历史流程实例数据
			historyService.deleteHistoricProcessInstance(processInstanceId);
		}
		
	}
/**
	 * 办理出库任务
	 */
	public String outStore(){
		taskService.complete(taskId);
		return "topersonaltasklist";
	}
	
	/**
	 * 办理配送任务
	 */
	public String transferGoods(){
		taskService.complete(taskId);
		return "topersonaltasklist";
	}
	
	/**
	 * 办理签收任务
	 */
	public String receive(){
		taskService.complete(taskId);
		return "topersonaltasklist";
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值