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去调用方法修改业务状态。
这样一个简单的实例流程处理审批就走完了。