更多ruoyi-nbcio功能請看演示系統(tǒng)
gitee源代碼地址
前后端代碼: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后臺管理系統(tǒng)
更多nbcio-boot功能請看演示系統(tǒng)
gitee源代碼地址
后端代碼: https://gitee.com/nbacheng/nbcio-boot
前端代碼:https://gitee.com/nbacheng/nbcio-vue.git
在線演示(包括H5) : http://122.227.135.243:9888
?
? ? ? ?撤回功能主要是針對我審批完后的一種操作方式,只能我自己審批完到下一節(jié)點的時候才能做撤回操作,比如我審批通過了,我可以進行撤回,但一旦下一個節(jié)點也被人審批了,那我就不能撤回了。
? ? ?具體的代碼如下,主要是修復(fù)對自定義業(yè)務(wù)關(guān)聯(lián)表的數(shù)據(jù)更新:文章來源:http://www.zghlxwxcb.cn/news/detail-802553.html
@Override
@Transactional(rollbackFor = Exception.class)
public void revokeProcess(WfTaskBo taskBo) {
String procInsId = taskBo.getProcInsId();
String taskId = taskBo.getTaskId();
// 校驗流程是否結(jié)束
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(procInsId)
.active()
.singleResult();
if(ObjectUtil.isNull(processInstance)) {
throw new RuntimeException("流程已結(jié)束或已掛起,無法執(zhí)行撤回操作");
}
// 獲取待撤回任務(wù)實例
HistoricTaskInstance currTaskIns = historyService.createHistoricTaskInstanceQuery()
.taskId(taskId)
.taskAssignee(TaskUtils.getUserName())
.singleResult();
if (ObjectUtil.isNull(currTaskIns)) {
throw new RuntimeException("當(dāng)前任務(wù)不存在,無法執(zhí)行撤回操作");
}
// 獲取 bpmn 模型
BpmnModel bpmnModel = repositoryService.getBpmnModel(currTaskIns.getProcessDefinitionId());
UserTask currUserTask = ModelUtils.getUserTaskByKey(bpmnModel, currTaskIns.getTaskDefinitionKey());
// 查找下一級用戶任務(wù)列表
List<UserTask> nextUserTaskList = ModelUtils.findNextUserTasks(currUserTask);
List<String> nextUserTaskKeys = nextUserTaskList.stream().map(UserTask::getId).collect(Collectors.toList());
// 獲取當(dāng)前節(jié)點之后已完成的流程歷史節(jié)點
List<HistoricTaskInstance> finishedTaskInsList = historyService.createHistoricTaskInstanceQuery()
.processInstanceId(procInsId)
.taskCreatedAfter(currTaskIns.getEndTime())
.finished()
.list();
for (HistoricTaskInstance finishedTaskInstance : finishedTaskInsList) {
// 檢查已完成流程歷史節(jié)點是否存在下一級中
if (CollUtil.contains(nextUserTaskKeys, finishedTaskInstance.getTaskDefinitionKey())) {
throw new RuntimeException("下一流程已處理,無法執(zhí)行撤回操作");
}
}
// 獲取所有激活的任務(wù)節(jié)點,找到需要撤回的任務(wù)
List<Task> activateTaskList = taskService.createTaskQuery().processInstanceId(procInsId).list();
List<String> revokeExecutionIds = new ArrayList<>();
for (Task task : activateTaskList) {
// 檢查激活的任務(wù)節(jié)點是否存在下一級中,如果存在,則加入到需要撤回的節(jié)點
if (CollUtil.contains(nextUserTaskKeys, task.getTaskDefinitionKey())) {
// 添加撤回審批信息
taskService.setAssignee(task.getId(), TaskUtils.getUserName());
taskService.addComment(task.getId(), task.getProcessInstanceId(), FlowComment.REVOKE.getType(), LoginHelper.getNickName() + "撤回流程審批");
revokeExecutionIds.add(task.getExecutionId());
}
}
try {
runtimeService.createChangeActivityStateBuilder()
.processInstanceId(procInsId)
.moveExecutionsToSingleActivityId(revokeExecutionIds, currTaskIns.getTaskDefinitionKey()).changeState();
String dataId = taskBo.getDataId();
if(StringUtils.isNotEmpty(dataId)) {
//當(dāng)前任務(wù)信息
List<Task> listtask = taskService.createTaskQuery().processInstanceId(procInsId).taskAssignee(TaskUtils.getUserName()).list();
WfMyBusiness business = wfMyBusinessService.getByDataId(dataId);
//更新自定義業(yè)務(wù)任務(wù)關(guān)聯(lián)表與流程歷史表,以便可以重新發(fā)起流程。
if (business != null) {
if (listtask != null && listtask.size()>0) {
business.setActStatus(ActStatus.revoke);
business.setTodoUsers(listtask.get(0).getAssignee());
}
else {
business.setActStatus(ActStatus.revoke);
business.setTodoUsers("");
business.setDoneUsers("");
business.setProposer("");
business.setTaskName("");
business.setTaskId("");
business.setTaskNameId("");
}
wfMyBusinessService.updateById(business);
}
}
} catch (FlowableObjectNotFoundException e) {
throw new RuntimeException("未找到流程實例,流程可能已發(fā)生變化");
} catch (FlowableException e) {
throw new RuntimeException("執(zhí)行撤回操作失敗");
}
}
? ? ?文章來源地址http://www.zghlxwxcb.cn/news/detail-802553.html
到了這里,關(guān)于基于若依的ruoyi-nbcio流程管理系統(tǒng)自定義業(yè)務(wù)撤回功能的修復(fù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!