activiti 笔记

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
	.addClasspathResource("org/activiti/test/VacationRequest.bpmn20.xml")
	.deploy();

Log.info("Number of process definitions: " + repositoryService.createProcessDefinitionQuery().count()); //当流程引擎重启时仍然可以获得以发布的流程



//-------------------------------启动一个流程实例----------------------------------------------------------
Map < String, Object > variables = new HashMap < String, Object > ();
variables.put("employeeName", "Kermit");
variables.put("numberOfDays", new Integer(4));
variables.put("vacationMotivation", "I'm really tired!");

RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables);

// Verify that we started a new process instance
Log.info("Number of process instances: " + runtimeService.createProcessInstanceQuery().count());
// 所有与流程运行状态相关的东西都可以通过RuntimeService获得。
// -----------------------------完成任务----------------------------------------------------------
TaskService taskService = processEngine.getTaskService();
List < Task > tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
for (Task task: tasks) {
	Log.info("Task available: " + task.getName());
}
Task task = tasks.get(0);
Map < String, Object > taskVariables = new HashMap < String, Object > ();
taskVariables.put("vacationApproved", "false");
taskVariables.put("managerMotivation", "We have a tight deadline!");
taskService.complete(task.getId(), taskVariables);
//----------------------------------------------------------------------------------------
// 当挂起流程定时时, 就不能创建新流程了(会抛出一个异常)。 可以通过RepositoryService挂起一个流程:
repositoryService.suspendProcessDefinitionByKey("vacationRequest");
try {
	runtimeService.startProcessInstanceByKey("vacationRequest");
} catch (ActivitiException e) {
	e.printStackTrace();
}

//-------------------------------------------查询篇-------------------------------------------
List < Task > tasks = taskService.createTaskQuery()
	.taskAssignee("kermit")
	.processVariableValueEquals("orderId", "0815")
	.orderByDueDate().asc()
	.list();
List < Task > tasks = taskService.createNativeTaskQuery()
	.sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T WHERE T.NAME_ = #{taskName}")
	.parameter("taskName", "gonzoTask")
	.list();

long count = taskService.createNativeTaskQuery()
	.sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T1, " + managementService.getTableName(VariableInstanceEntity.class) + " V1 WHERE V1.TASK_ID_ = T1.ID_")
	.count();


//*--------------------------------------------------------------------------------
获取流程图片
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
	.processDefinitionKey("expense")
	.singleResult();

String diagramResourceName = processDefinition.getDiagramResourceName();
InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName);

< property name = "createDiagramOnDeploy"
value = "false" / > //部署的时候,并不需要或者不必要生成流程定义图片



<!--
process元素有两个属性:

id:这个属性是必须的,
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process_id");
Activiti引擎在发布时自动生成的 id---processDefinition.getId()方法获得这个值成的 id的格式为 'key:version'最大长度限制为
64个字符
name:这个属性是可选的,对应 ProcessDefinition的 name属性。

= 注意所有与Activiti引擎的交互都是通过 services =



-->
发布一个新流程
	Deployment deployment = repositoryService.createDeployment().addClasspathResource("FinancialReportProcess.bpmn20.xml").deploy();



启动一个流程实例 <!--process id=fnancialReport-->
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");


用户登录之后获取任务
List < Task > tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list(); //可使用session中的用户ID  
//传入的用户必须是accountancy组的一个成
//获取特定组内的成员列表
TaskService taskService = processEngine.getTaskService();
List < Task > tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();

//认领这个任务 
=== === === === = 任务签收user_ID === === === =
	taskService.claim(task.getId(), "fozzie");
List < Task > tasks = taskService.createTaskQuery().taskAssignee("fozzie").list(); //个人已签收任务列表

//完成任务 
taskService.complete(task.getId());
//结束流程
HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance =
	historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult();
System.out.println("Process instance end time: " + historicProcessInstance.getEndTime());

// 定时器事件定义 
//timeDate
< timerEventDefinition > 
< timeDate > 2011 - 03 - 11T12: 13: 14 < /timeDate>
</timerEventDefinition >

	流程会启动4次,每次间隔5分钟,从2011年3月11日,12:13开始计时。
        <startEvent id="theStart">
            <timerEventDefinition>
                <timeCycle>R4/2011-03-11T12:13/PT5M</timeCycle>
            </timerEventDefinition>
        </startEvent>

// timeDuration 指定定时器之前要等待多长时间
< timerEventDefinition > < timeDuration > P10D < /timeDuration>
		</timerEventDefinition >
//timeCycle。指定重复执行的间隔 <!--每5分钟执行一次:0 0/5 * * * ? -->
< timerEventDefinition > < timeCycle > R3 / PT10H < /timeCycle>
		</timerEventDefinition >



触发信号事件

既可以通过bpmn节点由流程实例触发一个信号,也可以通过 API触发。下面的 org.activiti.engine.RuntimeService中的方法可以用来手工触发一个信号。

RuntimeService.signalEventReceived(String signalName);
RuntimeService.signalEventReceived(String signalName, String executionId);

signalEventReceived(String signalName);和
signalEventReceived(String signalName, String executionId);之间的区别是第一个方法会把信号发送给全局所有订阅的处理器(广播语义),第二个方法只把信息发送给指定的执行。



//  报表
<scriptTask id="generateDataset" name="Execute script" scriptFormat="js" activiti:autoStoreVariables="false">
          <script><![CDATA[

               importPackage(java.sql);
               importPackage(java.lang);
               importPackage(org.activiti.explorer.reporting);

               var result = ReportingUtil.executeSelectSqlQuery("SELECT PD.NAME_, PD.VERSION_ , count(*) FROM ACT_HI_PROCINST PI inner join ACT_RE_PROCDEF PD on PI.PROC_DEF_ID_ = PD.ID_ group by PROC_DEF_ID_");

               var reportData = new ReportData;
               var dataset = reportData.newDataset();
               dataset.type = "pieChart";
               dataset.description = "Process instance overview (" + new java.util.Date() + ")"


               while (result.next()) { // process results one row at a time
                 var name = result.getString(1);
                 var version = result.getLong(2);
                 var count = result.getLong(3);
                 dataset.add(name + " (v" + version + ")", count);
               }

               execution.setVariable("reportData", reportData.toBytes());

          ]]></script>
        </scriptTask>
使用工作流基本都依赖早期的数据架构,依赖实际组织结构进行查找 (组织机构与权限问题)







    
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彳卸风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值