二、项目中Camunda的使用

文章详细描述了一个IT系统中的流程管理过程,涉及CmpRecord的保存、创建办理记录流程、签收操作的逻辑、流程实例跟踪以及办理方式的选择。主要内容包括CmpRecord的更新与保存,签收流程的验证和处理,以及流程流转中的变量管理和任务完成。
摘要由CSDN通过智能技术生成

登记流程

public void saveCmpRecord(OperateInfo operateInfo, CmpRecordExDTO dto) {
        //1.如果id不为null 则获取CmpRecord,如果cmpRecord==null 则抛出异常
        //2.将CmpRecordExDTO对象转化为CmpRecord对象(DTO转为实体模型)
        //3.如果是视频接访登记的件,则要拿到信访人信息
        //4.如果是新增,则创建对象,如果是更新操作,则更新对象基本信息
            //新增
            //4.1 保存基本基本信息之后,如果是来信,来访,网信,则需要同步互联网
            //4.2 创建办理记录 ,同时也要创建办理记录流程实例
            //4.3 处理纳入满意度评价
            //4.4 生成编号
            //4.5 处理附件及信访人附件
            //4.6 发送各种监听事件(全文检索,办理日志,关联事项等等)
        //5.处理特殊操作
        //6.封装返回数据
        return null;
}

public CmpRecordProcess createByCmp(OperateInfo operateInfo, CmpRecord cmp, List<SysDataSimpleValObj> hotProblems) {
  		//创建办理记录
        //创建办理记录流程实例,开启流程
        this.startProcess(operateInfo, prc);
        return prc;
}

启动流程实例

//启动办理记录流程
    public ProcessInstance startProcess(OperateInfo operateInfo, CmpRecordProcess prc) {
        ProcessInstance instance = getPrcInsByPrcId(prc.getId());
        if(instance != null) return instance;
        //第一个参数 流程实例key,
        //第二个参数 业务唯一标识
        //流程变量 这里传递的是当前登录用户信息
        return this.runtimeService.startProcessInstanceByKey("xf_main_xf", prc.getId(), Utils.buildMap("operateInfo",operateInfo));
    }

数据库表中数据

--ACT_RU_EXECUTION 流程实例
select id_,root_proc_inst_id_,proc_inst_id_,business_key_,parent_id_,proc_def_id_,act_inst_id_
from act_ru_execution
where business_key_ in ('38039decaeba4f3db8b99bdf56ec785a');

流程实例数据

-- act_ru_variable 存储变量
select id_,type_,name_,execution_id_,proc_inst_id_,proc_def_id_,text_,text2_
from act_ru_variable
where proc_inst_id_ in ('9ecbe7bc-dad0-11ee-8012-525400011421');

流程实例中的变量

签收流程

因为上面的登记,会自动签收,流程会自动向下流转。接下来看一下用户手动签收流程。

 public void receiveProcess(OperateInfo operateInfo, String prcId) {
        //1.根据id获取办理记录,不存在则抛出异常
        //2.校验当前办理记录是否已经被签收,有可能两个人同时点击签收按钮,如果已签收则提示请刷新页面
        //3.走签收逻辑
            //3.1 设置内容分类
            //3.2 设置是否为联通单位
            //3.3 设置签收人(经办人),将当前办理记录的状态置为已签收
            //3.4 完成签收流程 TODO
            //3.5 发送诸多监听事件
        //4.当前件如果是批量处理中的件,则需要处理
}
//完成当前承办记录的所有待办
    public void completeTaskOfPrc(CmpRecordProcess prc, String action, OperateInfo operateInfo, boolean needRestart) {		//action:doReceive
    	//根据业务id 获取流程实例
        ProcessInstance prcIns = this.getOrCreatePrcInsByPrc(operateInfo, prc);
        if (prcIns == null) return;
        String prcInsId = prcIns.getProcessInstanceId();
        //判断流程实例还没有结束
        if (!prcIns.isEnded()) {
        	//设置下一步流转环节所需的变量
        	//processMode  办理方式
        	//action:动作 doReceive
        	//operateInfo:当前登录用户
            runtimeService.setVariablesLocal(
                prcInsId, Utils.buildMap(
                    "processMode", prc.getHandleInfo().getProcessMode(),
                    "action", action,
                    "operateInfo", operateInfo
                )
            );
        }
        try {
            //TODO 省略其他逻辑
            
            //获取当前流程实例所有的等待执行的任务
             List<Task> tasks = taskService.createTaskQuery()
             						.active().processInstanceId(prcInsId).list();
             //将任务执行完毕
             tasks.forEach(t -> taskService.complete(t.getId()));
            
            //TODO 省略其他逻辑
        } catch (Exception e) {
            if (StringUtils.isEmpty(e.getMessage())) throw e;
            String[] strArr = e.getMessage().split("BusinessException: ");
            if (strArr.length > 1) {
                strArr = strArr[strArr.length - 1].split("\\|");
                throw new BusinessException(strArr[0], strArr[1]);
            }
            throw e;
        }
}
--act_ru_task 流程实例中的任务
select id_,execution_id_,proc_inst_id_,proc_def_id_,name_,task_def_key_,create_time_
from act_ru_task
where proc_inst_id_ in('9ecbe7bc-dad0-11ee-8012-525400011421')
order by create_time_ desc
;

任务实例

这里因为已经签收,所以当前这条数据已经是下一个任务节点实例了。

流程图

签收流程
流程判断
这里使用的表达式

# 返回值是boolean
${execution.setVariableLocal('prcNeedAccept', cmpBpmnFacade.getPrcNeedAccept(execution))}
//获取承办记录否需要签收
public boolean getPrcNeedAccept(DelegateExecution execution) {
    	//获取业务唯一标识
        String processId=execution.getBusinessKey();
        //根据业务标识获取办理记录
        CmpRecordProcess prc = prcRepository.findById(processId);
        //判断是否需要签收
        if(prc.getCreateInfo().isRegPrc()) return false;
        return Optional.ofNullable(prc.getHandleInfo())
                .map(h -> !h.isAccepted())
                .orElse(false);
}

需要签收
右侧的条件

# 从上下文中获取prcNeedAccept变量 为true 则需要签收,进入到用户Task中,等待用户执行签收操作
${execution.getVariable('prcNeedAccept')}
# 不需要签收 则流程还是会回到用户Task中,等待用户执行签收操作
${!execution.getVariable('prcNeedAccept')}
# 未签收  这里的判断是因为签收接口走业务逻辑了,在业务逻辑中存储了action变量,当action!='doReceive'时,用户正在执行签收操作
${execution.getVariable('action')!='doReceive'}
# 签收 这个是代表用户即将完成签收操作,可以进入下一步流程
${execution.getVariable('action')=='doReceive'}

选择办理方式

办理方式选择
是否已选办理方式

# 将当前办理记录的办理方式存在到上下文中,为后面流程流转使用
${execution.setVariableLocal('processMode', cmpBpmnFacade.getPrcProcessMode(execution))}
public String getPrcProcessMode(DelegateExecution execution) {
		//业务唯一标识
        String processId=execution.getBusinessKey();
        //获取办理记录
        CmpRecordProcess prc = prcRepository.findById(processId);
        if(Arrays.asList(XysdBusinessConstants.PROCESS_MODE_ZS.getId(),
                XysdBusinessConstants.PROCESS_MODE_JB.getId()).contains(prc.getHandleInfo().getProcessMode())
                && CollectionUtils.isEmpty(prc.obtainValidSendRels())){
            //转交办理方式 并且没有有效的转办关系则不算是已选办理方式
            return null;
        }
        return prc.getHandleInfo().getProcessMode();
    }

已选/未选

# 已选 则进入子流程,按照不同的办理方式进行处理
${not empty execution.getVariable('processMode')}
# 未选 则进入用户Task 等待用户选择
${empty execution.getVariable('processMode')}

确定办理方式

# 自办  进入自办子流程 
${execution.getVariable('processMode')=='zb'}
  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值