1.创建流程
创建流程是 增加一个applyUserId 来方便回退到申请人的身上
private void createProcess(ProcessInfo orig, ProcessIndex index) {
// 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
identityService.setAuthenticatedUserId(orig.getAcceptUser());
HashMap<String, Object> map = CollUtil.newHashMap();
// 启动时可以设置默认的参数
map.put("applyUserId",SecurityUtils.getUsername());
// 启动流程时设置业务 key
ProcessInstance instance = runtimeService.startProcessInstanceByKey(orig.getProcessKey(), orig.getId().toString(), map);
orig.setInstanceId(instance.getProcessInstanceId());
// 待办任务
List<Task> taskList = taskService.createTaskQuery().processInstanceId(instance.getProcessInstanceId()).active().list();
for (Task task : taskList) {
// 获取处理角色
Integer roleId = taskPersonMapper.selectRoleIdByTaskId(task.getId());
if (roleId == null) {
throw new CustomException("找不到流程审批角色!");
}
// 错误出现的地方 (如果是第一步 ,则只给当前人创建任务)
// SysUser user = SecurityUtils.getLoginUser().getUser();
//将发起人设置为当前审批人
taskService.setAssignee(task.getId(),user.getUserName());
ProcessInfoTodoItem item = buildTodoItem(user, orig, task);
Boolean todoRes = todoItemService.save(item);
if (!todoRes) {
throw new CustomException("保存待办人员失败!");
}
}
}
2.审批
@Transactional(rollbackFor = Exception.class)
public ProcessInfoTodoItem handle(ProcessInfoTodoItem todoItem) {
ProcessInfoTodoItem orig = this.baseMapper.selectById(todoItem.getId());
// 处理待办事项对象
handleProcessInfoTodo(todoItem, orig);
// 先更新待办表,控制乐观锁
Integer res = this.baseMapper.updateById(orig);
if (res == 0) {
throw new CustomException("此数据已被操作,请刷新后重试!");
}
// 删除其他未办理的数据,保证只有一个任务完成
this.baseMapper.deleteUndoByDone(orig);
// 流程处理
identityService.setAuthenticatedUserId(SecurityUtils.getLoginUser().getUsername());
List<Task> taskCheckList = taskService.createTaskQuery().taskId(orig.getTaskId()).active().list();
// 如果此任务是已经处理过的任务(流程task), 则不需要再处理了,且同意时才进行工作流的任务完成操作
if (CollUtil.isNotEmpty(taskCheckList) ) {
taskService.addComment(orig.getTaskId(), orig.getInstanceId(), todoItem.getRemark());
// 被委派人处理完成任务
// p.s. 被委托的流程需要先 resolved 这个任务再提交。
// 所以在 complete 之前需要先 resolved
// resolveTask() 要在 claim() 之前,不然 act_hi_taskinst 表的 assignee 字段会为 null
HashMap<String, Object> variables = CollUtil.newHashMap();
// '办理结果 1通过 0不通过'
boolean ResultStatus =new Boolean(false);
if(todoItem.getResult()==1){
ResultStatus=true;
}
variables.put("ResultStatus", ResultStatus);
variables.put("Result", todoItem.getRemark());
taskService.resolveTask(orig.getTaskId(), CollUtil.newHashMap());
// 只有签收任务,act_hi_taskinst 表的 assignee 字段才不为 null
taskService.claim(orig.getTaskId(), SecurityUtils.getLoginUser().getUsername());
taskService.complete(orig.getTaskId(), variables);
}
ProcessInfo info = processInfoService.getById(orig.getProcessId());
// 设置工作流状态 用于判断是否处理第一步
info.setFlowStatus(1);
// 根据办理结果做不同的处理
if (todoItem.getResult() == 0) {
// 拒绝 则直接设置驳回
info.setHandleStatus(-1);
info.setResult(0);
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = sf.format(new Date());
info.setRemark("[" + SecurityUtils.getLoginUser().getUser().getNickName() + "]在" + "[" + format + "]状态时[审核中]驳回。原因:" + todoItem.getRemark());
info.setUpdateBy(SecurityUtils.getUsername());
info.setUpdateTime(DateUtil.date());
List<Task> taskList = taskService.createTaskQuery().processInstanceId(orig.getInstanceId()).active().list();
for (Task task : taskList) {
String assignee = task.getAssignee();
ProcessInfoTodoItem deleteOld = new ProcessInfoTodoItem();
deleteOld.setProcessId(info.getId());
deleteOld.setTaskId(task.getId());
deleteOld.setId(todoItem.getId());
deleteOld.setInstanceId(task.getProcessInstanceId());
this.baseMapper.deleteUndoByDone(deleteOld);
SysUser sysUser = userService.selectUserByUserName(assignee);
ProcessInfoTodoItem item = processInfoService.buildTodoItem(sysUser, info, task);
this.save(item);
}
processInfoService.updateById(info);
}
if (todoItem.getResult() == 1) {
// 获取接下来有没有任务
List<Task> taskList = taskService.createTaskQuery().processInstanceId(orig.getInstanceId()).active().list();
// 如果为强制结束,则不生成下一步的任务
if (todoItem.getForceDone()) {
taskList = CollUtil.newArrayList();
}
if (CollUtil.isNotEmpty(taskList)) {
// 生成下一步待办
generateNextTask(todoItem, info, taskList);
} else {
// 如果为更正审批,且为同意 ,则不走这一步
if (orig.getCorrectApprovalId() != null) {
return orig;
}
PersonBaseInfo personBaseInfo = personBaseInfoService.selectPersonByIdCard(info.getApplyPersonIdCard());
if (personBaseInfo == null) {
PersonBaseInfo insertPerson = new PersonBaseInfo();
insertPerson.setName(info.getApplyPersonName());
insertPerson.setIdCard(info.getApplyPersonIdCard());
insertPerson.setAreaId(info.getAreaId());
insertPerson.setStreetId(info.getStreetId());
insertPerson.setHamletId(info.getHamletId());
insertPerson.setBirthday(new Date(IdcardUtil.getBirthDate(info.getApplyPersonIdCard()).getTime()));
insertPerson.setAge(IdcardUtil.getAgeByIdCard(info.getApplyPersonIdCard()));
insertPerson.setSex(String.valueOf(IdcardUtil.getGenderByIdCard(info.getApplyPersonIdCard())));
if (SecurityUtils.isLogin()) {
insertPerson.setCreateBy(SecurityUtils.getUsername());
}
insertPerson.setCreateTime(DateUtil.date());
personBaseInfoService.saveOrUpdate(insertPerson);
}
// 生成办理结果
info.setHandleStatus(6);
// 保存救助记录
// addRescueRecord(info);
info.setResult(todoItem.getResult());
info.setUpdateTime(DateUtil.date());
info.setUpdateBy(SecurityUtils.getUsername());
processInfoService.updateById(info);
}
}
return orig;
}
private void generateNextTask(ProcessInfoTodoItem todoItem, ProcessInfo info, List<Task> taskList) {
for (Task task : taskList) {
// 如果为未通过,则不生成下级任务
log.info("==== handle next task {} ====", task.getId());
// 获取处理角色
Integer roleId = taskPersonMapper.selectRoleIdByTaskId(task.getId());
if (roleId == null) {
throw new CustomException("找不到流程审批角色{}!", roleId);
}
List<ProcessInfoTodoItem> todoList = CollUtil.newArrayList();
SysUser userParam = new SysUser();
userParam.setFilterRoleId(roleId);
// 先通过事项所属区县来进行筛选待办人,如果没有,则筛选全市的人员
userParam.setBaseDeptId(info.getAreaId());
List<SysUser> userList = userService.selectUserProcessList(userParam);
// 先通过事项所属区县来进行筛选待办人,如果没有,则筛选全市的人员
if (CollUtil.isEmpty(userList)) {
userList = userService.selectUserProcessList(userParam);
if (CollUtil.isEmpty(userList)) {
throw new CustomException("找不到下一步的受理人员!角色编码{}", roleId);
}
}
// 删除旧的未办事项
ProcessInfoTodoItem deleteOld = new ProcessInfoTodoItem();
deleteOld.setProcessId(info.getId());
deleteOld.setTaskId(task.getId());
deleteOld.setId(todoItem.getId());
deleteOld.setInstanceId(task.getProcessInstanceId());
this.baseMapper.deleteUndoByDone(deleteOld);
// TODO 针对特殊事项进行过滤
userList = filterByProcess(userList, info);
for (SysUser user : userList) {
ProcessInfoTodoItem item = processInfoService.buildTodoItem(user, info, task);
todoList.add(item);
}
this.saveBatch(todoList);
//2020/10/10需求 提醒受理部门负责人员
// buildSysMessage(info, userList);
}
}
1.问题出现的地方
2.确定好每一级审批人
3.调整申请就是申请人的操作的地方
4。申请人调整申请后 应该继续选择一级审批人的roleid 进行审批
5.创建流程的时候 需要选择第一个受理人