官网地址
图形化工具下载 camunda-modeler
camunda-modeler与Idea集成
Idea集成Camunda Modeler(引用大佬文档,侵删)
与SpringBoot集成
引入依赖
<dependency>
<groupId>org.camunda.bpm.springboot</groupId>
<artifactId>camunda-bpm-spring-boot-starter</artifactId>
<version>7.17.0-alpha1</version>
</dependency>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-engine-cdi</artifactId>
<version>7.17.0-alpha1</version>
</dependency>
在resources目录下创建.bpmn文件
图形化界面
####创建一个XXXBpmnFacade类
我们将使用Expression的方式来定义流程图
上面签收节点 也叫网关
${execution.setVariableLocal('hasAccept', CommodityBpmnFacade.handleAccept(execution))}
//是否签收
public boolean handleAccept(DelegateExecution execution){
String businessKey = execution.getProcessBusinessKey();
PaymentProcess payPrc = paymentProcessRepository.getPaymentProcessById(businessKey);
if (payPrc == null) return false;
return payPrc.getProductPrice().subtract(payPrc.getProductDiscount()).compareTo(new BigDecimal("0")) >= 0;
}
${!execution.getVariable('hasAccept')}
子流程
接受任务事件
//是否发送了公文
public void handleSendDoc(DelegateExecution execution,String docCategory){
String businessKey = execution.getProcessBusinessKey();
PaymentProcess payPrc = paymentProcessRepository.getPaymentProcessById(businessKey);
System.out.println("========>handleSendDoc方法,"+docCategory);
}
//发送公文完成消息 这才是发送完成公文之后的处理逻辑
public void sendDocFinishMsgWithProjs(DelegateExecution execution, String msgNamePrefix, String msgNameSuffix) {
String docId=execution.getBusinessKey();
Doc doc=this.docRepository.getDocById(docId);
OperateInfo operateInfo=(OperateInfo)execution.getVariable("operateInfo");
if(StringUtils.isBlank(msgNamePrefix)) msgNamePrefix="";
if(StringUtils.isBlank(msgNameSuffix)) msgNameSuffix="";
String msgName=msgNamePrefix+doc.getCreateInfo().getDocCategory()+msgNameSuffix;
String relId = (String) execution.getVariable("relId");
String eventType = null;
//处理 信访 发送公文 监听
if(doc.getBasicInfo().getValidRelateProjs().stream()
.anyMatch(r -> RelateProjConstants.PROJTYPE_CMP_PRC.equals(r.getRelateProj().getProjType()))){
eventType = "Handle_CmpSendDoc";
}
//处理 复查复核 发送公文 监听
else if(doc.getBasicInfo().getValidRelateProjs().stream()
.anyMatch(r -> RelateProjConstants.PROJTYPE_RECHECK_PRC.equals(r.getRelateProj().getProjType()))){
eventType = "Handle_RecheckSendDoc";
}
//处理 建议 发送公文 监听
else if(doc.getBasicInfo().getValidRelateProjs().stream()
.anyMatch(r -> RelateProjConstants.PROJTYPE_SUGGEST_PRC.equals(r.getRelateProj().getProjType()))){
eventType = "Handle_SuggestSendDoc";
}
//处理 视频接访 邀请通知 监听
else if(doc.getBasicInfo().getValidRelateProjs().stream()
.anyMatch(r -> RelateProjConstants.PROJTYPE_VI_RESERVATION.equals(r.getRelateProj().getProjType()))){
eventType = "Handle_InterviewSendDoc";
}
else if(doc.getBasicInfo().getValidRelateProjs().stream()
.anyMatch(r -> XysdSysConstants.DOC_CATEGORY_XF_WKFAHBTZ.getId().equals(r.getRelateProj().getProjType()))){
eventType = "Handle_FocusPersonWkfaDoc_hbtz";
}
else if(doc.getBasicInfo().getValidRelateProjs().stream()
.anyMatch(r -> RelateProjConstants.PROJTYPE_FOCUS_PERSON.equals(r.getRelateProj().getProjType()))){
eventType = "Handle_FocusPersonWkfaDoc_wkfa";
}
else if(doc.getBasicInfo().getValidRelateProjs().stream()
.anyMatch(r -> RelateProjConstants.PROJTYPE_CHECK_TASK_INNER.equals(r.getRelateProj().getProjType())) ||
doc.getBasicInfo().getValidRelateProjs().stream()
.anyMatch(r -> RelateProjConstants.PROJTYPE_CHECK_TASK_UNIT.equals(r.getRelateProj().getProjType()))){
eventType = "Handle_CheckTask_Doc";
}
//向办理记录发送消息
for (DocRelateProj relProj : doc.getBasicInfo().getValidRelateProjs()) {
String projId=relProj.getRelateProj().getProjId();
// runtimeService.createMessageCorrelationAsync(msgName)
ProcessInstance prcIns = this.runtimeService.createProcessInstanceQuery()
.active()
.leafProcessInstances()
.processInstanceBusinessKey(projId)
.singleResult();
if(prcIns == null) continue;
List<MsgSubscriber> msgSubs = this.commonService.queryMsgSubscribers(prcIns.getProcessInstanceId(), msgName,null);
if(CollectionUtils.isEmpty(msgSubs)){
msgSubs = this.commonService.queryMsgSubscribers(prcIns.getProcessInstanceId(), "prc_finish",null);
}
//改为 逐个触发 查询出的事件
Map<String,Object> processVariables=Utils.buildMap("docId", docId, "operateInfo", operateInfo);
this.commonService.msgReceived(msgSubs, processVariables);
// msgSubs.forEach(ms -> this.runtimeService.createMessageCorrelation(ms.getEventName())
// .processInstanceId(prcIns.getProcessInstanceId())
// .setVariable("docId", docId)
// .setVariable("operateInfo", operateInfo)
// .correlate());
}
if(StringUtils.isNotBlank(eventType)){
Map<String,Object> eventData= Utils.buildMap("docId", doc.getId(),"relId",relId);
DefaultDomainEvent de=new DefaultDomainEvent(null, operateInfo,
ExecutePoint.CURR_THREAD, eventData, operateInfo.getOperateTime(), eventType);
DomainEventPublisherFactory.getRegisteredPublisher().publishEvent(de);
}
}