Flowable钉钉对接005-完成钉钉任务

文章介绍了如何将企业内部业务系统与钉钉的移动办公平台结合,通过H5实现统一待办审批。主要涉及Flowable任务与钉钉任务的创建、更新和删除,通过全局任务完成监听和MQ消息接口确保两者同步。此外,文章还提及了消息处理和异常处理机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

企业中有自己的业务系统,审批都在业务系统中审批,如何结合移动办公的开放平台实现统一审批至关重要。

场景很简单,自己的系统中可以审批,钉钉上也可以审批,使用H5来适配,统一待办任务

目标:任务完成钉钉任务变成已完成任务

实现flowable钉钉相互之间可以创建待办,更新待办,删除待办
  • 第一 、全局任务完成监听发送完成任务消息

flowMessageService.completeTaskToMq(entity, entity.getAssignee());

  • 第二 、完成任务的消息接口

public boolean sendTaskMessage(ProcessInstance processInstance, TaskEntity entity, OperationTypeEnum operationType) {
        boolean flag = false;
        PlatformDingtalkTaskVo platformTask = new PlatformDingtalkTaskVo();
        platformTask.setOperationType(operationType.getCode());
        platformTask.setBussinessKey(processInstance.getBusinessKey());
        platformTask.setFlowableProInstId(processInstance.getProcessInstanceId());
        platformTask.setSubject(processInstance.getName());
        if (entity != null) {
            platformTask.setFlowableTaskId(entity.getId());
            ApplyerVo applyerVo = prodFlowTaskService.getApplyerVoByTaskId(entity.getId());
            if (applyerVo != null) {
                List<String> thirdUnionIds = new ArrayList<>();
                if (applyerVo.getApplyer() != null) {
                    thirdUnionIds.add(applyerVo.getApplyer().getThirdUnionId());
                    platformTask.setUnionId(applyerVo.getApplyer().getThirdUnionId());
                    platformTask.setCreatorId(applyerVo.getApplyer().getThirdUnionId());
                    platformTask.setOperatorId(applyerVo.getApplyer().getThirdUnionId());
                    platformTask.setMobile(applyerVo.getApplyer().getMobile());
                    flag = true;
                }
                if (CollectionUtils.isNotEmpty(applyerVo.getExecutors())) {
                    applyerVo.getExecutors().forEach(personal -> thirdUnionIds.add(personal.getThirdUnionId()));
                    flag = true;
                }
                platformTask.setExecutorIds(thirdUnionIds);
                platformTask.setFlowableTaskName(entity.getName());
                platformTask.setDingNotify("1");
                platformTask.setPriority(20);
                platformTask.setDueTime(DateUtil.addDate(new Date(), 1).getTime());
                platformTask.setIsOnlyShowExecutor(true);
                platformTask.setAppSn(processInstance.getTenantId());
                String url = "/process/operate?modelKey=" + processInstance.getProcessDefinitionKey()
                        + "&taskId=" + StringUtils.defaultIfEmpty(entity.getId(), "") + "&procInstId=" +
                        processInstance.getProcessInstanceId() + "&bizKey=" + processInstance.getBusinessKey();
                platformTask.setAppUrl(url);
                platformTask.setPcUrl(url);
                String json = JSON.toJSONString(platformTask);
                try {
                    if (!flag) {
                        log.error("未查询到审批的人信息,请确认!参数:" + json);
                    } else {

                        if (prodAppService.checkPlatformEnabled(processInstance.getTenantId())) {
                            this.convertAndSend(ProdflowConstant.FLOWABLE_TASK_MESSAGE_QUEUE, json);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("推送到MQ异常!原因:" + e.getMessage());
                }
            }
        }
        return flag;
    }
  • 第三 、接受mq消息处理

 HistoricTaskInstance historicTaskInstance = historyService.createHistoricTaskInstanceQuery().taskId(params.getFlowableTaskId()).singleResult();
                    List<HistoricTaskInstance> historictaskInstances = historyService.createHistoricTaskInstanceQuery().taskDefinitionKey(historicTaskInstance.getTaskDefinitionKey()).list();
                    if (CollectionUtils.isNotEmpty(historictaskInstances) && historictaskInstances.size() > 1) {
                        historictaskInstances.remove(historicTaskInstance);
                        historictaskInstances.forEach(hisTask -> {
                            if (ObjectUtil.isNotEmpty(hisTask.getEndTime())) {
                                PlatformDingtalkTask flowableTask = platformDingtalkTaskService.getByFlowableTaskId(hisTask.getId());
                                Boolean done = flowableTask.getDone();
                                if (!done) {
                                    //删除第三方的任务操作
                                    dingtalkSdkService.deleteTask(flowableTask.getUnionId(), flowableTask.getTaskId());
                                }
                            }
                        });
                    }
                    PlatformDingtalkTask updateTask = platformDingtalkTaskService.getByFlowableTaskId(params.getFlowableTaskId());
                    UpdateTodoTaskRequest updateTodoTaskRequest = this.updateDingtalkTask(params);
                    if (StringUtils.isNotBlank(updateTask.getExecutorIds())) {
                        updateTodoTaskRequest.setExecutorIds(FastJsonUtils.jsonToList(updateTask.getExecutorIds(), String.class));
                    }
                    updateTodoTaskRequest.setDone(true);
                    dingtalkSdkService.updateTask(params.getUnionId(), updateTask.getTaskId(), updateTodoTaskRequest);
                    updateTask.setDone(true);
                    platformDingtalkTaskService.updateById(updateTask);
  • 总结、这样子就能完成钉钉消息和flowable之间的任务同步了

最后给大家推荐一下滴滴bpm专家贺波历经三年结合自己10年的经验出的一本activiti的书籍,希望能帮助到大家。

深入Activiti流程引擎
在这里插入图片描述

### 如何将Flowable钉钉集成 #### 流程转换函数实现 为了使Flowable能够处理来自钉钉的设计模型并将其转化为可执行的工作流,可以采用JavaScript编写一个用于转换的前端方法。此方法接收由钉钉提供的流程模型作为输入参数,并通过调用`ddToBpmnXml`函数来获取对应的BPMN XML字符串表示形式[^2]。 ```javascript const converterBpmn = () => { const processModel = { code: pCode.value, name: pName.value, icon: {name: 'el:HomeFilled', color: '#409EFF'}, process: props.process, enable: true, version: 1, sort: 0, groupId: '', remark: '' }; ddToBpmnXml(processModel).then(res => { console.log("ddToBpmnXml res", res); processView.title = pName.value; processView.index = pCode.value; processView.xmlData = res.result; processView.open = true; }); }; ``` 上述代码片段展示了如何构建一个过程对象并将之传递给`ddToBpmnXml`异步函数以获得XML数据的结果。一旦成功解析返回的数据,则更新视图组件的状态以便显示新创建或修改后的业务流程定义。 #### 工作流管理平台的选择 对于希望简化这一集成工作的开发者来说,可以选择已经集成了Flowable并与Vue框架兼容的应用程序模板,比如RuoYi-flowable或是更为先进的KonBAI/RuoYi-Flowable-Plus版本。后者不仅提供在线表单设计功能还增强了工作流设计器的功能性,使得用户无需离开浏览器即可完成复杂的流程建模操作[^1]。 #### 开发实践指导 初次接触此类技术栈的人士建议先尝试一些基本的例子去掌握Flowable的基础特性以及它同其他前后端组件之间的交互方式;而对于那些计划针对具体应用场景做定制化开发的人来说,则应该重点研究BPMN 2.0标准及其语法结构,因为这是理解和操纵任何基于Flowable系统的基石所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小学生05101

flowable

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

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

打赏作者

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

抵扣说明:

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

余额充值