Activiti 多实例并发子流程和汇签
需求:
负责人发起预算申请,并选择需要填写的部门。
各部门主任接收到审批后,进行填写预算,并提交给部门领导审核。
所有部门填写完成和审核后才进入下一节点系统合并。
最后由各部门主任都确认后流程才结束。
以下是相关节点的配置截图
deptDtos :多个部门信息集合
budgetDeptDto:部门信息
${nrOfActiveInstances/nrOfInstances == 1} :判断必须所有子流程都执行完才进入下个节点。
1.nrOfInstances 实例总数。
2.nrOfCompletedInstances 当前还没有完成的实例 nr是number单词缩写 。
3.loopCounter 已经循环的次数。
4.nrOfActiveInstances 已经完成的实例个数。
代码如下
/**
* 系统常量
*
* @author len.sun
* @data 2018-01-14
*/
public class Constant {
public static final String ACT_FLOW_BUDGET_DEPT_DTO = "budgetDeptDto"; //多实例预算部门信息
public static final String ACT_FLOW_DEPT_DTOS = "deptDtos"; //多实例预算部门信息集合
}
/**
* 流转条件
* @Author: yll
* @Date: 2019/8/23 15:39
*/
@Data
public class FlowCondition implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 部门集合
*/
private List<BudgetDeptDto> deptDtos;
}
/**
* 新增并发起审批流程
*
* @param formData
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean insertBudget2(ApplyBudgetFormDataVO formData) {
ApplyBudgetEntity entity = ApplyBudgetConverter.INSTANCE.vo2entity(formData);
//生成id
entity.setId(IdWorker.getIdStr());
//初始状态
entity.setApplyStatus(DictEnum.APPLY_STATUS_PROCESSING.getKey());
//当前状体
entity.setResult(DictEnum.APPLY_RESULT_PROCESSING.getKey());
//保存首页显示的文稿标题(自定义全局变量)
Map<String, Object> param = Maps.newHashMap();
param.put(Constant.DISPLAY_TITLE, entity.getName());
entity.setParam(param);
//需要填写预算的部门id集合 private List<String> budgetDept;
List<BudgetDeptDto> deptDtos = deptDtos(formData.getBudgetDept());
//流转条件
FlowCondition flowCondition = new FlowCondition();
flowCondition.setDeptDtos(deptDtos);
entity.setFlowCondition(flowCondition);
// 发起审批流程
ProcessInstance processInstance = approvalService.addApproval(new ApprovalVO<ApplyBudgetEntity>(entity));
// 保存审批信息
entity.setProcessInstanceId(processInstance.getId());
entity.setProcessInstanceName(processInstance.getProcessDefinitionName());
boolean result = save(entity);
return result;
}
/**
* 发起审批流程
*
* @param approvalVO
* @return
*/
@Override
public ProcessInstance addApproval(ApprovalVO approvalVO) {
// 发起审批流程
Authentication.setAuthenticatedUserId(UserUtils.getUserId());
ProcessInstanceBuilder processInstanceBuilder = runtimeService.createProcessInstanceBuilder();
processInstanceBuilder.processDefinitionKey(approvalVO.getBaseTask().getProcessKey());
processInstanceBuilder.businessKey(approvalVO.getBusinessKey());
processInstanceBuilder.variables(approvalVO.getBaseTaskVariables());
processInstanceBuilder.tenantId(UserUtils.getTenantId());
ProcessInstance processInstance = processInstanceBuilder.start();
return processInstance;
}
/**
* @author czm
* @date 2020/10/26 15:36
*/
@Data
public class BudgetDeptDto implements Serializable {
private static final long serialVersionUID = 1L;
/**
*部门id
*/
private String deptId;
/**
*部门主任
*/
private String deptDirectorId;
/**
*部门分管领导id
*/
private String deptLeaderId;
/**
* 有预算明细条目
*/
private String hasDetail;
}
/**
* 根据部门id查询信息
*
*/
public List<BudgetDeptDto> deptDtos(List<String> depIds){
List<BudgetDeptDto> budgetDeptDtos = new ArrayList<>();
for (String id : depIds) {
List<DeptLeaderDTO> data = deptService.getDeptLeader(id).getData(); //1部门主任 2分管领导
BudgetDeptDto deptDto = new BudgetDeptDto();
deptDto.setDeptId(id);
for (int i = 0; i <data.size() ; i++) {
DeptLeaderDTO dto = data.get(i);
if(dto.getType().equals("1")){
deptDto.setDeptDirectorId(dto.getLeaderId());
}else {
deptDto.setDeptLeaderId(dto.getLeaderId());
}
}
budgetDeptDtos.add(deptDto);
}
return budgetDeptDtos;
}
欢迎大家留言交流。
记得点赞哦!