标签:
Activiti中流程的历史信息保存在ACT_HI_ACTINST表中,我们可以通过API或者直接写SQL进行查询,但是这里面并没有流程发起人的信息,流程发起人信息有的时候还是非常必要的,比如查询某人发起的流程或者做相关的统计等。
鉴于ACT_HI_ACTINST中保存了流程历史信息,我们还是想在这个表上做文章,但是这个表中并没有发起人等相关的字段,这时候,我们发现,当一个流程刚发起时,ACT_TYPE_为startEvent,这时ASSIGNEE_为空,如果我们能借用这个字段,保存申请人,查询起来代码还是比较优雅的,虽然这个字段本身的含义不是申请人。
下一步,就是研究Activiti的代码了,看看能不能找到相应的扩展点,解决这个问题。
经过研究,找到了扩展点,开发起来还是比较方便的,下面进行详细描述,注意,本文的开发基于Activiti5.15.1版本,大体扫了下代码,更新的5.17版本应该也兼容,但未经过测试。
对于流程发起时保存ACT_HI_ACTINST表的代码,在DefaultHistoryManager类的recordProcessInstanceStart方法中,所以我们只要想办法继承这个类,然后覆写这个方法即可,而DefaultHistoryManager的创建,是在DefaultHistoryManagerSessionFactory中,而DefaultHistoryManagerSessionFactory的初始化,是在ProcessEngineConfigurationImpl中的initSessionFactories方法,找到这里,思路已经非常清晰了,需要写的代码没有多少。
一、扩展ProcessEngineConfigurationImpl,如果使用Spring集成的话,继承SpringProcessEngineConfiguration类,覆写initSessionFactories方法,在该方法中调用addSessionFactory方法添加新的自定义DefaultHistoryManagerSessionFactory;
二、扩展DefaultHistoryManagerSessionFactory,覆写openSession方法,在该方法中创建新的DefaultHistoryManager;
三、扩展DefaultHistoryManager,覆写recordProcessInstanceStart方法,在该方法中为assign字段赋值即可,至于当前的流程发起人获取方法,各位就得自己想办法了,我们的方案是通过流程上下文获取;
具体代码如下所示:
import org.activiti.spring.SpringProcessEngineConfiguration; public class ProcessEngineConfiguration extends SpringProcessEngineConfiguration { @Override protected void initSessionFactories() { super.initSessionFactories(); super.addSessionFactory(new ProcessHistoryManagerSessionFactory()); } }
import org.activiti.engine.impl.interceptor.Session; import org.activiti.engine.impl.persistence.DefaultHistoryManagerSessionFactory; public class ProcessHistoryManagerSessionFactory extends DefaultHistoryManagerSessionFactory { @Override public Session openSession() { return new ProcessHistoryManager(); } }
public class ProcessHistoryManager extends DefaultHistoryManager { @Override public void recordProcessInstanceStart(ExecutionEntity processInstance) { if(isHistoryLevelAtLeast(HistoryLevel.ACTIVITY)) { HistoricProcessInstanceEntity historicProcessInstance = new HistoricProcessInstanceEntity(processInstance); getDbSqlSession().insert(historicProcessInstance); IdGenerator idGenerator = Context.getProcessEngineConfiguration().getIdGenerator(); String processDefinitionId = processInstance.getProcessDefinitionId(); String processInstanceId = processInstance.getProcessInstanceId(); String executionId = processInstance.getId(); HistoricActivityInstanceEntity historicActivityInstance = new HistoricActivityInstanceEntity(); historicActivityInstance.setId(idGenerator.getNextId()); historicActivityInstance.setProcessDefinitionId(processDefinitionId); historicActivityInstance.setProcessInstanceId(processInstanceId); historicActivityInstance.setExecutionId(executionId); historicActivityInstance.setActivityId(processInstance.getActivityId()); historicActivityInstance.setActivityName((String) processInstance.getActivity().getProperty("name")); historicActivityInstance.setActivityType((String) processInstance.getActivity().getProperty("type")); Date now = Context.getProcessEngineConfiguration().getClock().getCurrentTime(); historicActivityInstance.setStartTime(now); if (processInstance.getTenantId() != null) { historicActivityInstance.setTenantId(processInstance.getTenantId()); } CoreContext cc = CoreContextContainer.getContext(); if (cc != null && cc.getSysUser()!=null){ historicActivityInstance.setAssignee(cc.getSysUser().getUserId()); } getDbSqlSession().insert(historicActivityInstance); } } }
标签:
原文地址:http://my.oschina.net/liyuj/blog/380777