flowable查询完成的流程_Flowable笔记简单的通⽤流程简介
通⽤流程可以⽤于⼀些基本的申请,例如请假、加班。
⼤致过程是:
⽐较简单,唯⼀的难点就是动态设置审批⼈或者审批组,下⾯开始代码部分。
bpmn20⽂件
...id="standardRequest" name="标准申请流程" isExecutable="true">
id="startEvent" name="创建申请"/>
sourceRef="startEvent" targetRef="assignToAuditor"/>
id="assignToAuditor" name="分配审批⼈" flowable:class="me.xwbz.flowable.delegate.AssignToAuditorDelegate"/>
sourceRef="assignToAuditor" targetRef="auditorExist"/>
id="auditorExist" name="审批⼈是否存在" default="auditorNotExistFlow"/>
sourceRef="auditorExist" targetRef="approveTask">
xsi:type="tFormalExpression">
${istAuditor(execution)}
]]>
id="auditorNotExistFlow" sourceRef="auditorExist" targetRef="agreeDelegate" />
id="approveTask" name="等待审批"
flowable:candidateGroups="${CandidateGroups(execution)}"
flowable:candidateUsers="${CandidateUsers(execution)}"/>
sourceRef="approveTask" targetRef="decision"/>
id="decision" default="rejectFlow"/>
sourceRef="decision" targetRef="assignToAuditor">
xsi:type="tFormalExpression">
${auditMethod.isApproved(execution)}
]]>
id="rejectFlow" sourceRef="decision" targetRef="rejectDelegate" />
id="agreeDelegate" name="数据存储"
flowable:class="me.xwbz.flowable.delegate.StandardRequestAgreeDelegate"/>
sourceRef="agreeDelegate" targetRef="approveEnd"/>
id="rejectDelegate" name="回复拒绝消息"
flowable:class="me.xwbz.flowable.delegate.BaseRejectDelegate"/>
sourceRef="rejectDelegate" targetRef="rejectEnd"/>
id="approveEnd" name="已同意"/>
id="rejectEnd" name="已驳回"/>
...
常量部分
这次没有另外存储数据,所以变量都是直接存储到flowable⾃带的变量表⾥强烈建议⼤家另外存储,⾃带的查询起来⾮常⿇烦!
审批⼈列表:
AUDITOR_LIST_KEY = "AUDITOR_LIST";
当前审批⼈:
AUDITOR_KEY = "AUDITOR";
当前审批⼈下标:
AUDITOR_IDX_KEY = "AUDITOR_IDX";
是否已审批:
APPROVED_KEY = "AUDIT_APPROVED";申请类型:
AUDIT_TYPE_KEY = "AUDIT_TYPE";
申请状态:
AUDIT_STATUS_KEY = "AUDIT_STATUS";其他参数:
AUDIT_PARAMS_KEY = "AUDIT_PARAMS";申请状态
申请⼈类型
审批使⽤的⽅法定义
⼀个普通的Java类
package me.hod;import com.alibaba.fastjson.JSONObject;import ine.delegate.DelegateExecution;/**
* 审批相关的⽅法
*
* ⽤于flowable流程使⽤
*/public class AuditMethod {/**
* 是否存在审批者
*
*
*                      *                    ${istAuditor(execution)}
*                ]]>
*
*
*/public boolean existAuditor(DelegateExecution execution){return execution.hasVariable(AUDITOR_KEY);
}/**
* 获取当前审批者
*/public JSONObject getCurrentAuditor(DelegateExecution execution){return JSONObject.parseObject((Variable(AUDITOR_KEY));
}/**
* 获取当前候选组
*/public String getCandidateGroups(DelegateExecution execution){
JSONObject candidate = getCurrentAuditor(execution);IntValue("type") == dinal()) {String("id")        }return null;
}public String getCandidateUsers(DelegateExecution execution){
JSONObject candidate = getCurrentAuditor(execution);IntValue("type") == dinal()) {String("id");        }return null;
}/**
* 获取当前审批者id
*
*/public String getCurrentAuditorId(DelegateExecution execution){
JSONObject auditor = getCurrentAuditor(execution);JavaObject(auditor, User.class).getId();
}/**
* 是否同意申请
variable怎么记*/public boolean isApproved(DelegateExecution execution){
Boolean approved = Variable(APPROVED_KEY, Boolean.class);return approved != null && approved;
}
}
流程结束处理
下⾯是同意处理,主要是更改状态。“拒绝处理”同理
可以根据业务增加消息通知,保存数据等。
package me.xwbz.flowable.delegate;slf4j.Slf4j;import ine.delegate.DelegateExecution;import ine.delegate.J        log.info("{}已被同意", Variables());
execution.setVariable(AUDIT_STATUS_KEY, AuditStatus.String());
}
}
flowable结合Spring可以直接使⽤Spring⾥的bean。
像下⾯这样定义,然后直接${auditMethod.isApproved(execution)}就可以调⽤auditMethod⾥的isApproved⽅法。
import me.hod.AuditMethod;import t.annotation.Bean;import t.annotation.Configuration public class FlowableConfig {@Bean(name = "auditMethod")
public AuditMethod auditMethod(){return new AuditMethod();
}
}
动态设置审批⼈
这个是配置在serviceTask⾥的,所以需要实现JavaDelegate接⼝
package me.xwbz.flowable.delegate;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;im
* delegate - 分配审批⼈
*/public class AssignToAuditorDelegate implements JavaDelegate {
@Overridepublic void execute(DelegateExecution execution) {// 初始化变量,清空临时变量
execution.setVariable(AUDIT_STATUS_KEY, AuditStatus.String());// 拿到审批⼈列表JSONArray auditorList = JSON.            auditorIdx = 0;
} else if (auditorIdx + 1 >= auditorList.size()) {//  所有审批⼈审批完成,结束分配return;
} else {// 下⼀个
auditorIdx++;
}JSONObject auditor = JSONObject(auditorIdx);
execution.setVariable(AUDITOR_KEY, JSONString());
execution.setVariable(AUDITOR_IDX_KEY, auditorIdx);
}
}
开始流程
使⽤runtimeService#startProcessInstanceByKey开始这个流程,记得开始之前要使⽤identityService#setAuthenticatedUserId设置当前⽤户
编号,这个是绑定到线程的,单线程环境下设置⼀次就⾏了。
Map vars = new HashMap<>();// 放⼊申请类型
vars.put(AUDIT_TYPE_KEY, Type());// 放⼊审批⼈⼈列表
vars.put(AUDITOR_LIST_KEY, Auditors()));// 放⼊其他参数
vars.put(AUDIT_PARAMS_KEY, Params());// 放⼊审批状态
vars.put(AUDIT_STATUS_KEY, AuditStatus.String());
logger.debug("当前⽤户id: {} ", AuthenticatedUserId());// 设置发起⼈// identityService.Id()); ProcessInstance pro = runtimeService.startProcessInstanceByKey("standardRequest", ⽣成的编号, vars);// ⽂件材料if (Files() != null && !Files    Files().forEach(file ->
}
查看待我审批的任务
要是想既能查询到正在进⾏的,也要结束的可以使⽤下⾯的语句:
TaskInfoQueryWrapper taskInfoQueryWrapper = runtime ? new ateTaskQuery()) : new TaskInfoQueryWrapper(his
也就是说你要先确定是要那种。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。