登记流程
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'}