Activiti 流程笔记

在这里插入图片描述

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.创建流程的时候 需要选择第一个受理人

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值