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

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


统一待办审批

  • 目标:flowable创建任务能推送到钉钉待办任务
  • 第一 、钉钉待办效果
  • 第二 、全局监听创建待办消息 这里我们使用redis的消息机制
  • 第三、接受到消息处理


目标:flowable创建任务能推送到钉钉待办任务


实现flowable钉钉相互之间可以创建待办,更新待办,删除待办


第一 、钉钉待办效果

Flowable钉钉对接004-创建钉钉任务_flowable

第二 、全局监听创建待办消息 这里我们使用redis的消息机制

@Slf4j
@Component
public class ProdGlobalTaskCreateListener extends AbstractFlowableEngineEventListener {
    @Autowired
    private ITaskListenerService taskListenerService;
    @Autowired
    protected IProcessStatusService processStatusService;
    @Autowired
    private FlowMessageService flowMessageService;

    @Override
    protected void taskCreated(FlowableEngineEntityEvent event) {
        FlowableEntityEventImpl flowableEntityEvent = (FlowableEntityEventImpl) event;
        TaskEntity entity = (TaskEntity) flowableEntityEvent.getEntity();
        flowMessageService.createTaskToMq(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());
                //TODO 组装成查看审批页面的url
                platformTask.setAppUrl("https://www.dingtalk.com");
                platformTask.setPcUrl("https://www.dingtalk.com");
                String json = JSON.toJSONString(platformTask);
                try {
                    if (!flag) {
                        log.error("未查询到审批的人信息,请确认!参数:" + json);
                    } else {
                        log.info("任务开始推送MQ......");
                        if (ProdflowConstant.pushMsgAppSns.contains(processInstance.getTenantId())) {
                            redisTemplate.convertAndSend(ProdflowConstant.FLOWABLE_TASK_MESSAGE_QUEUE, json);
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("推送到MQ异常!原因:" + e.getMessage());
                }
            }
        }
        return flag;
    }

第三、接受到消息处理

接受消息

public void onMessage(Message message, byte[] pattern) {
        RedisSerializer<String> valueSerializer = redisTemplate.getStringSerializer();
        String datas = valueSerializer.deserialize(message.getBody());
        log.info("收到的mq消息===========================================" + datas);
        String platformType = platformProperties.getPlatformType();
        if (platformProperties.getEnabled()) {
            switch (platformType) {
                case "dingtalk":
                    PlatformDingtalkTaskVo dingtalkTaskVo = FastJsonUtils.jsonToObject(datas, PlatformDingtalkTaskVo.class);
                    messageDingtalkService.sendTaskMessage(dingtalkTaskVo);
                    break;

推送钉钉待办

public void sendTaskMessage(PlatformDingtalkTaskVo params) {
        String operationType = params.getOperationType();
        switch (operationType) {
            case "create":
                CreateTodoTaskRequest taskParams = this.createDingtalkTask(params);
                CreateTodoTaskResponse taskResponse = dingtalkSdkService.createTask(params.getUnionId(), taskParams);
                PlatformDingtalkTask pdt = new PlatformDingtalkTask();
                BeanUtils.copyProperties(params, pdt);
                if (CollectionUtils.isNotEmpty(params.getExecutorIds())) {
                    pdt.setExecutorIds(FastJsonUtils.objectToJson(params.getExecutorIds()));
                }
                if (CollectionUtils.isNotEmpty(params.getParticipantIds())) {
                    pdt.setParticipantIds(FastJsonUtils.objectToJson(params.getParticipantIds()));
                }
                pdt.setTaskId(taskResponse.getBody().getId());
                pdt.setDone(false);
                pdt.setCreateTime(new Date());
                pdt.setDelFlag(1);
                platformDingtalkTaskService.save(pdt);
                break;