blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
@@ -5,10 +5,10 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.mail.MessagingException; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.task.Comment; import org.flowable.task.api.history.HistoricTaskInstance; @@ -18,9 +18,9 @@ import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; import org.springblade.mdm.flow.service.ApproveRecordService; import org.springblade.mdm.flow.service.ApproveTableService; import org.springblade.mdm.flow.service.FlowBusinessService; import org.springblade.mdm.flow.service.WIthdrawService; import org.springblade.mdm.flow.vo.FlowVO; import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO; import org.springblade.mdm.flow.vo.TaskTraceVO; @@ -31,6 +31,7 @@ import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.LocalDate; @@ -51,13 +52,13 @@ @Autowired private HistoryService historyService; @Autowired private RuntimeService runtimeService; @Autowired private ApproveTableService approveTableService; @Autowired private ApproveRecordService approveRecordService; @Autowired private IUserClient userClient; @Autowired private WIthdrawService withdrawService; @GetMapping("overtime-list") @ApiOperationSupport(order = 3) @Operation(summary = "è¶ æ¶æ¥è¯¢", description = "æ¥è¯¢ææè¶ æ¶ä»»å¡") @@ -182,4 +183,16 @@ } } @GetMapping("/withdraw") @Operation(summary = "æ¤åä»»å¡", description = "ä»å ¶ä»ä»»å¡èç¹ç´æ¥æ¤åç¼ç¨åèç¹") public R<Void> withdraw(String processInstanceId) { try { withdrawService.withdraw(processInstanceId); return R.success(); }catch(Exception e) { log.error("<UNK>", e); return R.fail(e.getMessage()); } } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowableBackWithAssigneeService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,161 @@ package org.springblade.mdm.flow.service; import org.flowable.engine.HistoryService; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.history.HistoricActivityInstance; import org.flowable.engine.runtime.Execution; import org.flowable.task.api.Task; import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; @Service public class FlowableBackWithAssigneeService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private HistoryService historyService; /** * å°æµç¨éåå°æå®ä»»å¡èç¹å¹¶æå®æ°çå¤ç人 * @param currentTaskId å½åä»»å¡ID * @param targetActivityId ç®æ æ´»å¨èç¹ID * @param newAssignee æ°çå¤ç人 * @param comment éåæè§ * @param variables æµç¨åé */ @Transactional public void backToTaskWithNewAssignee(String currentTaskId, String targetActivityId, String newAssignee, String comment, Map<String, Object> variables) { // è·åå½åä»»å¡ Task currentTask = taskService.createTaskQuery() .taskId(currentTaskId) .singleResult(); if (currentTask == null) { throw new RuntimeException("å½åä»»å¡ä¸åå¨"); } String processInstanceId = currentTask.getProcessInstanceId(); // æ·»å è¯è®º if (comment != null && !comment.trim().isEmpty()) { taskService.addComment(currentTaskId, processInstanceId, comment); } // éªè¯ç®æ èç¹æ¯å¦åå¨ validateTargetActivity(processInstanceId, targetActivityId); // 使ç¨è¿è¡æ¶æå¡è·³è½¬å°ç®æ èç¹ runtimeService.createChangeActivityStateBuilder() .processInstanceId(processInstanceId) .moveActivityIdTo(currentTask.getTaskDefinitionKey(), targetActivityId) .changeState(); // è·åæ°å建çä»»å¡ï¼éåå产ççä»»å¡ï¼ Task newTask = taskService.createTaskQuery() .processInstanceId(processInstanceId) .taskDefinitionKey(targetActivityId) .singleResult(); if (newTask != null) { // 设置æ°çå¤ç人 if (newAssignee != null && !newAssignee.trim().isEmpty()) { taskService.setAssignee(newTask.getId(), newAssignee); } // 设置æµç¨åé if (variables != null && !variables.isEmpty()) { taskService.setVariables(newTask.getId(), variables); } } // å é¤å½åä»»å¡ taskService.deleteTask(currentTaskId, "éåæµç¨å¹¶æå®æ°å¤ç人: " + newAssignee); } /** * éåå¹¶ä¿çåå¤ç人信æ¯ï¼è®°å½åå²ï¼ */ @Transactional public void backToTaskWithOriginalAssignee(String currentTaskId, String targetActivityId, String comment) { Task currentTask = taskService.createTaskQuery() .taskId(currentTaskId) .singleResult(); if (currentTask == null) { throw new RuntimeException("å½åä»»å¡ä¸åå¨"); } String processInstanceId = currentTask.getProcessInstanceId(); // è·åç®æ èç¹çåå²ä»»å¡ä¿¡æ¯ HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .taskDefinitionKey(targetActivityId) .orderByHistoricTaskInstanceEndTime().desc() .list() .stream() .findFirst() .orElse(null); String originalAssignee = historicTask != null ? historicTask.getAssignee() : null; // æ§è¡éåæä½ backToTaskWithNewAssignee(currentTaskId, targetActivityId, originalAssignee, comment, null); } /** * éªè¯ç®æ æ´»å¨èç¹æ¯å¦åå¨ */ private void validateTargetActivity(String processInstanceId, String targetActivityId) { List<HistoricActivityInstance> targetActivities = historyService .createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .activityId(targetActivityId) .list(); if (targetActivities.isEmpty()) { throw new RuntimeException("ç®æ èç¹ä¸åå¨äºæµç¨å®ä¾ä¸"); } } /** * è·åå¯éåçèç¹å表ï¼ç¨æ·ä»»å¡èç¹ï¼ */ public List<HistoricActivityInstance> getBackableUserTasks(String processInstanceId) { return historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstanceId) .activityType("userTask") .orderByHistoricActivityInstanceStartTime().desc() .list(); } /** * è·åæå®èç¹çåå²å¤ç人 */ public String getHistoricAssignee(String processInstanceId, String activityId) { HistoricTaskInstance historicTask = historyService.createHistoricTaskInstanceQuery() .processInstanceId(processInstanceId) .taskDefinitionKey(activityId) .orderByHistoricTaskInstanceEndTime().desc() .list() .stream() .findFirst() .orElse(null); return historicTask != null ? historicTask.getAssignee() : null; } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/WIthdrawService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,101 @@ package org.springblade.mdm.flow.service; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; import org.flowable.engine.repository.ProcessDefinition; import org.flowable.engine.runtime.ProcessInstance; import org.flowable.task.api.Task; import org.springblade.core.secure.utils.AuthUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.flowable.engine.RepositoryService; import java.util.HashMap; import java.util.Optional; /** * æµç¨æ¤åæå¡ */ @Service public class WIthdrawService { @Autowired private WithdrawProperties withdrawProps; @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private FlowableBackWithAssigneeService backWithAssigneeService; @Autowired private RepositoryService repositoryService; /* * æ¤åå°ç¼ç¨å */ @Transactional public void withdraw(String processInstanceId) { //System.out.println(withdrawProps); String targetAssignee = ""+AuthUtil.getUserId(); String processDefKey = getProcessDefinitionKeyByProcessInstanceId(processInstanceId); String targetActivityId = this.withdrawProps.getMapping().get(processDefKey); String taskId = getCurrentTaskIdByProcessInstanceId(processInstanceId); backWithAssigneeService.backToTaskWithNewAssignee(taskId,targetActivityId,targetAssignee,"æµç¨æ¤å",new HashMap<>()); } /* String getprocessDefinitionKey(String processInstanceId){ Task task = taskService.createTaskQuery() .taskId(taskId) .singleResult(); ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(task.getProcessDefinitionId()) .singleResult(); String taskId = getCurrentTaskIdByProcessInstanceId(processInstanceId); if (processDefinition == null) { throw new RuntimeException("æµç¨å®ä¹ä¸åå¨ï¼processDefinitionId: " + task.getProcessDefinitionId()); } return processDefinition.getKey(); }*/ public String getCurrentTaskIdByProcessInstanceId(String processInstanceId) { Optional<String> optTaskId = taskService.createTaskQuery() .processInstanceId(processInstanceId) .active() .list() .stream() .map(Task::getId).findFirst(); return optTaskId.orElse(null); } public String getProcessDefinitionKeyByProcessInstanceId(String processInstanceId) { // è·åæµç¨å®ä¾ ProcessInstance processInstance = runtimeService.createProcessInstanceQuery() .processInstanceId(processInstanceId) .singleResult(); if (processInstance == null) { throw new RuntimeException("æµç¨å®ä¾ä¸åå¨: " + processInstanceId); } // è·åæµç¨å®ä¹ ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionId(processInstance.getProcessDefinitionId()) .singleResult(); if (processDefinition == null) { throw new RuntimeException("æµç¨å®ä¹ä¸åå¨: " + processInstance.getProcessDefinitionId()); } return processDefinition.getKey(); } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/WithdrawProperties.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package org.springblade.mdm.flow.service; import lombok.Getter; import lombok.Setter; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; @Configuration @ConfigurationProperties(prefix = "withdraw") @Getter @Setter public class WithdrawProperties { private Map<String, String> mapping = new HashMap<>(); } blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTest2Controller.java
@@ -42,4 +42,6 @@ return this.bizDictClient.getList(code); } } blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/MyTestController.java
@@ -8,6 +8,7 @@ import org.springblade.core.tool.api.R; import org.springblade.mdm.basesetting.machine.entity.Machine; import org.springblade.mdm.commons.service.EmailService; import org.springblade.mdm.flow.service.WIthdrawService; import org.springblade.mdm.gkw.programnode.entity.MachineFile; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.service.NcNodeService; @@ -22,7 +23,6 @@ import org.springframework.web.bind.annotation.RestController; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.List; @@ -44,6 +44,9 @@ private IDictBizClient bizDictClient; @Autowired private EmailService mailService; @Autowired private WIthdrawService withdrawService; /** * æ°å¢ */ @@ -113,4 +116,12 @@ return R.success(); } @GetMapping("/withdraw") public R<Void> withdraw(String id) throws IOException, MessagingException { withdrawService.withdraw(id); return R.success(); } }