package org.springblade.mdm.flow.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.api.R; import org.springblade.core.tool.support.Kv; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.mdm.flow.constants.FlowContants; import org.springblade.mdm.flow.entity.ApproveRecord; import org.springblade.mdm.flow.excution.StartDispatcher; import org.springblade.mdm.flow.service.ApproveRecordService; import org.springblade.mdm.flow.service.FlowCommonService; import org.springblade.mdm.flow.service.FlowProgramFileService; import org.springblade.mdm.flow.service.execute.AbstractFlowCompleteService; import org.springblade.mdm.flow.service.execute.DefaultFlowCompleteService; import org.springblade.mdm.flow.service.execute.TryFlowCompleteService; import org.springblade.mdm.flow.vo.TaskAssignVO; import org.springblade.mdm.program.entity.ProcessProgRef; import org.springblade.mdm.program.service.NcNodeAutoCreateService; import org.springblade.mdm.program.service.ProcessProgRefService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; import java.util.Map; @Slf4j @RestController @AllArgsConstructor @RequestMapping("/flow/dispatch") @Tag(name = "派工流程", description = "派工流程") public class DispatchController { private final StartDispatcher dispatcher; private final TaskService taskService; private final RuntimeService runtimeService; private final ProcessProgRefService processProgRefService; private final ApproveRecordService approveRecordService; private final FlowProgramFileService flowProgramFileService; private final TryFlowCompleteService tryFlowCompleteService; private final DefaultFlowCompleteService defaultFlowCompleteService; /** * 发起派工流程 */ @PostMapping("/start") @Operation(summary = "任务计划(派工流程)", description = "启动派工流程") public R start(@RequestBody TaskAssignVO startVO) { dispatcher.start(startVO); return R.status(true); } AbstractFlowCompleteService getActualService(String processInstanceId){ ProcessInstance inst = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult(); if(inst.getProcessDefinitionKey().equals(FlowContants.TRY_PROCESS_KEY) || inst.getProcessDefinitionKey().equals(FlowContants.CURE_PROCESS_KEY)){ return tryFlowCompleteService; }else{ return defaultFlowCompleteService; } } @Operation(summary = "完成任务", description = "流向下一个节点") @PostMapping("completeTask") public R completeTask(String taskId, String processInstanceId, String comment,@Parameter(name = "variables", description = "任务变量") @RequestBody Map variables) { try { AbstractFlowCompleteService completeService = getActualService(processInstanceId); completeService.completeTask(taskId, processInstanceId, comment, variables); return R.success("流程提交成功"); }catch(Exception e){ return R.fail(e.getMessage()); } /* Task task = taskService.createTaskQuery() .taskId(taskId) .singleResult(); String operateResult = variables.get("approve")+""; if(task.getTaskDefinitionKey().equals("programmingTask")) {//编制节点 flowProgramFileService.checkProgramFiles(processInstanceId,"Y".equals(operateResult)); } // 增加评论 if (StringUtil.isNoneBlank(processInstanceId, comment)) { taskService.addComment(taskId, processInstanceId, comment); } // 非空判断 if (Func.isEmpty(variables)) { variables = Kv.create(); } //加入审批用户 variables.put(FlowContants.LAST_STEP_USER_NICKNAME,AuthUtil.getNickName()); if(variables.containsKey("assignee")){ addApproveRecord(taskId,comment,variables); //在编制任务时,创建节点(没有节点则创建,有就直接使用 if(task.getTaskDefinitionKey().equals("programmingTask") && "Y".equals(operateResult)) { ncNodeAutoCreateService.createNodeTreeWithProgram(flowCommonService.getProgramProperties(processInstanceId)); } if(!"confirmIsUseableTask".equals(task.getTaskDefinitionKey())){ variables.remove(FlowContants.PROCESS_EDITION);//TODO 临时错误是,组长提交的时候会提交一个空串,清空了内部数据 }else{ //升版 } //指定了下一步执行人 taskService.complete(taskId, variables); return R.success("流程提交成功"); }else { // 完成任务,给默认用户 return R.fail("请指定流程下一步处理人"); }*/ } void addApproveRecord(String taskId,String comment,Map variables){ String operateResult = variables.get("approve")+""; Task task = taskService.createTaskQuery() .taskId(taskId) .singleResult(); approveRecordService.saveApproveRecords(task,operateResult,comment); } }