Camunda学习使用

本文介绍了如何在CamundaModeler中下载并集成到SpringBoot项目中,包括添加依赖,创建.bpmn文件以及使用表达式定义流程图和处理业务逻辑,如签收、子流程和发送公文事件等。
摘要由CSDN通过智能技术生成

官网地址

camunda官网

图形化工具下载 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文件

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);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值