activity工作流应用在springboot中的实战操作流程

activity整合springboot以及怎么创建bpmn与画实例流程图就不说了,网上有很多教程,这里具体说一下有了流程之后的具体处理业务的操作。

1.在某条需要审核的数据后面加上审核的按钮,点击按钮时携带本条数据的id(方便后面查询数据)如

todo(id) {
			
				this.$http({
					url: '/fhc/plan/fhcSinglePlan/audit',
					method : 'get',
					params: {
						'id': id
					}
				}).then(({data}) => {
					if( data.success){
						this.taskStart(data.businessId)
					}
				})
					
			},

利用本条数据id在后台查询出这条数据。进行一系列设置,同时将这条数据的状态修改为待审核,同时也复制一份本条数据存储到审核表,如

@RequiresPermissions("fhc:plan:fhcSinglePlan:audit")
	@GetMapping("audit")
	public AjaxJson audit(String id){
//查具体要操作的数据
		FhcSinglePlan fhcSinglePlan = get(id);
		// 设置审核状态
		fhcSinglePlanService.updateAuditStatus("2",fhcSinglePlan.getId());
		materialMapper.updateApprovalStatus(fhcSinglePlan.getId(),"1",new Date());
//同步至该业务的审核表
		FhcSinglePlanAudit fhcSinglePlanAudit = new FhcSinglePlanAudit();
		BeanUtils.copyProperties(fhcSinglePlan,fhcSinglePlanAudit);
		fhcSinglePlanAudit.setType("1");
		fhcSinglePlanAudit.setSinglePlanId(fhcSinglePlan.getId());
		fhcSinglePlanAudit.setId("");

		//新增或编辑保存
		fhcSinglePlanAuditService.save(fhcSinglePlanAudit);//保存

		return AjaxJson.success("保存单次计划审核成功").put("businessTable", "fhc_single_plan_audit").put("businessId", fhcSinglePlanAudit.getId());
	}

最后保存后返回两个参数(这两个 参数在启动工作流实例的时候会用到,一般businessTable为表名,businessId为操作的本条数据的id)。

2.启动这个流程实例。

taskStart(businessId){
				this.$http({
					url: '/flowable/task/start',
					method: 'POST',
					params: {
						procDefKey: 'single_plan_audit',
						businessTable: 'fhc_single_plan_audit',
						businessId: businessId,
						title: '单次计划审批',
						assignee: ''
					}
				}).then(({data}) => {
					if (data.success) {
						this.$message.success(data.msg)
						this.refreshList()
						this.loading = false
						
					}
				})
			},

这个方法是上面js成功后调用的。方法中的参数有两个是上一步后台带过来的,其中“procDefKey”为流程定义的表示,可以自由起名(最好见名知意)。请求后台方法进行启动流程

@PostMapping("start")
    public AjaxJson start(Flow flow) throws Exception {
        //启动
        String procInsId = flowTaskService.startProcess(flow.getProcDefKey(), flow.getBusinessTable(), flow.getBusinessId(), flow.getTitle());

        //指定下一步处理人
        if(StringUtils.isNotBlank(flow.getAssignee ())){
            Task task = taskService.createTaskQuery().processInstanceId(procInsId).active().singleResult();
            if(task != null){
                taskService.setAssignee(task.getId(), flow.getAssignee ());
            }
        }
        return AjaxJson.success("启动成功!").put("procInsId", procInsId);
    }



//这是启动时调用的方法
@Transactional(readOnly = false)
    public String startProcess(String procDefKey, String businessTable, String businessId, String title, Map<String, Object> vars) {
        //String userId = UserUtils.getUser().getLoginName();//ObjectUtils.toString(UserUtils.getUser().getId())
        // 设置流程变量
        if (vars == null) {
            vars = Maps.newHashMap ();
        }

//vars为流程中的变量,通过map的key获取流程发起人(FlowableConstant.INITIATOR调用的是常量:applyUserId,取出map中的相应值获取value,如果没有该值则直接获取登录用户)
        String userId = (String) vars.get (FlowableConstant.INITIATOR);
        if (userId == null) {
            userId = UserUtils.getUser ().getId ();
        }
        String userName = UserUtils.get (userId).getName ();
        vars.put (FlowableConstant.USERNAME, userName);

        // 用来设置启动流程的人员ID,引擎会自动把用户ID保存到activiti:initiator中
        identityService.setAuthenticatedUserId (userId);

        // 设置流程标题
        if (StringUtils.isNotBlank (title)) {
            vars.put (FlowableConstant.TITLE, title);
        }

        // 启动流程
        ProcessInstance procIns = runtimeService.startProcessInstanceByKey (procDefKey, businessTable + ":" + businessId, vars);

        // 更新业务表流程实例ID
        Flow act = new Flow ();
        act.setBusinessTable (businessTable);// 业务表名
        act.setBusinessId (businessId);  // 业务表ID
//启动流程后获取这个流程的实例id,后续处理业务都需要用到
        act.setProcInsId (procIns.getId ());
        act.setVars (vars);
        flowMapper.updateProcInsIdByBusinessId (act);
//返回这个实例id后,继续上一个代码段中的指定处理人
        return act.getProcInsId ();
    }

这样一个实例就已经启动了。

接下来就获取审批列表信息了,发起审批后每条数据状态就为待办任务

/**
     * 获取待办任务列表
     *
     * @return
     */
    public Page<ProcessVo> todoList(Page<ProcessVo> page, Flow flow) {
        List<HashMap<String, String>> result = new ArrayList<HashMap<String, String>> ();
        String userId = UserUtils.getUser ().getId ();//ObjectUtils.toString(UserUtils.getUser().getId());
        // =============== 已经签收或者等待签收的任务  ===============
        TaskQuery todoTaskQuery = taskService.createTaskQuery ().taskCandidateOrAssigned (userId).active ()
                .includeProcessVariables ().orderByTaskCreateTime ().desc ();

        // 设置查询过滤条件
        if (StringUtils.isNotBlank (flow.getProcDefKey ())) {
            todoTaskQuery.processDefinitionKey (flow.getProcDefKey ());
        }
        if (flow.getBeginDate () != null) {
            todoTaskQuery.taskCreatedAfter (flow.getBeginDate ());
        }
        if (flow.getEndDate () != null) {
            todoTaskQuery.taskCreatedBefore (flow.getEndDate ());
        }
        if (StringUtils.isNotBlank (flow.getTitle ())) {
            todoTaskQuery.processVariableValueLike (FlowableConstant.TITLE, "%" + flow.getTitle () + "%");
        }




        long total = todoTaskQuery.count ();
        page.setCount (total);


        int start = page.getFirstResult ();
        List<Task> todoList = Lists.newArrayList ();
        // 查询列表
        if (page.getPageSize () == -1) {//不分页
            todoList = todoTaskQuery.list ();
        } else {

            todoList = todoTaskQuery.listPage (start, page.getMaxResults ());
        }


//循环任务后只将有用的数据字段返回到前台(自定义一个新的vo对象)
        for (Task task : todoList) {
            Process process = SpringContextHolder.getBean (RepositoryService.class).getBpmnModel (task.getProcessDefinitionId ()).getMainProcess ();
            ProcessVo processVo = new ProcessVo ();
            TaskVo taskVo = new TaskVo (task);
            taskVo.setProcessDefKey (process.getId ());
            processVo.setTask (taskVo);
            processVo.setVars (task.getProcessVariables ());
            processVo.setProcessDefinitionName ( ProcessDefCache.get (task.getProcessDefinitionId ()).getName ());
            processVo.setVersion (ProcessDefCache.get (task.getProcessDefinitionId ()).getVersion ());
            processVo.setStatus ("todo");
            page.getList ().add (processVo);
        }

这样列表中就能展示当前待审批的任务。

3.当点击某一条待审批的数据后,将这条数据中的字段信息一并给后台接口,方便下一步设置

(需要回显信息的可以通过流程实例的id进行查询,唯一的字段信息)


@PostMapping("audit")
    public AjaxJson auditTask(HttpServletRequest request, Flow flow) {
        Map<String, Object> vars = Maps.newHashMap();
        Map<String, String[]> map = request.getParameterMap();
        for (Map.Entry<String, String[]> entry : map.entrySet()) {
            if(entry.getKey().startsWith("vars.")){
                String key = entry.getKey().substring(5);
                String value = entry.getValue()[0];
                if("true".equals(value) || "false".equals(value)){
                    vars.put(key, Boolean.valueOf(value).booleanValue());
                }else{
                    vars.put(key, value);
                }
            }
        }

        flowTaskService.auditSave(flow, vars);
        //指定下一步处理人
        if(StringUtils.isNotBlank(flow.getAssignee ())){
           Task task = taskService.createTaskQuery().processInstanceId(flow.getProcInsId()).active().singleResult();
           if(task != null){
               taskService.setAssignee(task.getId(), flow.getAssignee ());
           }
        }
        if(Constants.CONTRACT_AUDIT.equals(flow.getProcDefKey())){
            //更新合同审核状态
            //流程实例ID 获取合同审核信息
            String contractId = fhcContractAuditService.getContractId(flow.getProcInsId());
            //合同id更新合同状态
            if(Constants.CONTRACT_FIRST_TRIAL.equals(flow.getTaskDefKey())){
                //合同初审
                fhcContractService.updateStatus("3",contractId);
            }else if(Constants.CONTRACT_FINAL_TRIAL.equals(flow.getTaskDefKey())){
                //合同终审
                fhcContractService.updateStatus("0",contractId);
            }
        }
        // 总计划审核
        if(Constants.MASTER_PLAN_AUDIT.equals(flow.getProcDefKey())){
            fhcMasterPlanAuditService.taskAudit(flow.getProcInsId(),flow.getTaskDefKey(),flow.getComment().getType());
        }
}

参数flow是刚刚点击审核时后台带过来的,经过指定下一个处理人之后,就用自己业务的service去修改数据的状态即可,,,我的就是合同与总计划的service去调用方法修改业务状态。

这样一个简单的实例流程处理审批就走完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值