Commit 4d39d53392a5c1cef9dafc4a99b367b8cd7bad63

Authored by 芋道源码
Committed by Gitee
2 parents 976a38fe 304aa30a

!1424 feat: 代码评审修改

Merge pull request !1424 from Lesan/feature/bpm-打印
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/BpmProcessInstanceController.java
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
6 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
8 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 8 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
  9 +import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
9 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*; 10 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
10 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert; 11 import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
11 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; 12 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
@@ -26,6 +27,7 @@ import jakarta.validation.Valid; @@ -26,6 +27,7 @@ import jakarta.validation.Valid;
26 import org.flowable.engine.history.HistoricProcessInstance; 27 import org.flowable.engine.history.HistoricProcessInstance;
27 import org.flowable.engine.repository.ProcessDefinition; 28 import org.flowable.engine.repository.ProcessDefinition;
28 import org.flowable.task.api.Task; 29 import org.flowable.task.api.Task;
  30 +import org.flowable.task.api.history.HistoricTaskInstance;
29 import org.springframework.security.access.prepost.PreAuthorize; 31 import org.springframework.security.access.prepost.PreAuthorize;
30 import org.springframework.validation.annotation.Validated; 32 import org.springframework.validation.annotation.Validated;
31 import org.springframework.web.bind.annotation.*; 33 import org.springframework.web.bind.annotation.*;
@@ -34,9 +36,11 @@ import java.util.List; @@ -34,9 +36,11 @@ import java.util.List;
34 import java.util.Map; 36 import java.util.Map;
35 import java.util.Set; 37 import java.util.Set;
36 38
  39 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
37 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 40 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
38 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*; 41 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
39 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; 42 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
  43 +import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS;
40 44
41 @Tag(name = "管理后台 - 流程实例") // 流程实例,通过流程定义创建的一次“申请” 45 @Tag(name = "管理后台 - 流程实例") // 流程实例,通过流程定义创建的一次“申请”
42 @RestController 46 @RestController
@@ -203,7 +207,19 @@ public class BpmProcessInstanceController { @@ -203,7 +207,19 @@ public class BpmProcessInstanceController {
203 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')") 207 @PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
204 public CommonResult<BpmProcessPrintDataRespVO> getProcessInstancePrintData( 208 public CommonResult<BpmProcessPrintDataRespVO> getProcessInstancePrintData(
205 @RequestParam("processInstanceId") String processInstanceId) { 209 @RequestParam("processInstanceId") String processInstanceId) {
206 - return success(processInstanceService.getProcessInstancePrintData(getLoginUserId(), processInstanceId)); 210 + HistoricProcessInstance historicProcessInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
  211 + if (historicProcessInstance == null) {
  212 + throw exception(PROCESS_INSTANCE_NOT_EXISTS);
  213 + }
  214 + AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId()));
  215 + DeptRespDTO dept = deptApi.getDept(startUser.getDeptId());
  216 + List<HistoricTaskInstance> tasks = taskService.getFinishedTaskListByProcessInstanceIdWithoutCancel(processInstanceId);
  217 + Set<Long> userIds = convertSet(tasks, item -> Long.valueOf(item.getAssignee()));
  218 + Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
  219 + return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstancePrintData(historicProcessInstance,
  220 + processDefinitionService.getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId()),
  221 + tasks, userMap,
  222 + new UserSimpleBaseVO().setNickname(startUser.getNickname()).setDeptName(dept.getName())));
207 } 223 }
208 224
209 } 225 }
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/controller/admin/task/vo/instance/BpmProcessPrintDataRespVO.java
@@ -11,43 +11,28 @@ import java.util.Map; @@ -11,43 +11,28 @@ import java.util.Map;
11 @Data 11 @Data
12 public class BpmProcessPrintDataRespVO { 12 public class BpmProcessPrintDataRespVO {
13 13
14 - private Boolean printTemplateEnable;  
15 -  
16 - // TODO @lesan:要不 processStatus、processInstanceId、processBusinessKey、processBusinessKey、startUser、endTime、processVariables 使用 BpmProcessInstanceRespVO ?虽然这个 VO 大了点,但是收一收字段。嘿嘿;进而只有 processInstance、tasks、formFields、printTemplateHtml 这些字段;  
17 - private Integer processStatus;  
18 -  
19 - private String processInstanceId;  
20 -  
21 - private String processBusinessKey;  
22 -  
23 - private String processName;  
24 -  
25 - private UserSimpleBaseVO startUser; 14 + @Schema(description = "流程实例数据")
  15 + private BpmProcessInstanceRespVO processInstance;
26 16
27 - private String startTime;  
28 -  
29 - private String endTime;  
30 -  
31 - // TODO @lesan:变量要不改成 tasks;  
32 - private List<ApproveNode> approveNodes;  
33 -  
34 - private List<String> formFields; 17 + @Schema(description = "是否开启自定义打印模板")
  18 + private Boolean printTemplateEnable;
35 19
  20 + @Schema(description = "自定义打印模板HTML")
36 private String printTemplateHtml; 21 private String printTemplateHtml;
37 22
38 - private Map<String, Object> processVariables; 23 + @Schema(description = "审批任务列表")
  24 + private List<ApproveTask> tasks;
39 25
40 - // TODO @lesan:类名要不要改成 tasks ?然后 id、name、signUrl、description;感觉理解成本低点;  
41 @Data 26 @Data
42 - public static class ApproveNode { 27 + public static class ApproveTask {
43 28
44 - private String nodeName; 29 + private String id;
45 30
46 - private String nodeDesc; 31 + private String name;
47 32
48 - private String signUrl; 33 + private String description;
49 34
50 - private String nodeId; 35 + private String signUrl;
51 36
52 } 37 }
53 38
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/convert/task/BpmProcessInstanceConvert.java
1 package cn.iocoder.yudao.module.bpm.convert.task; 1 package cn.iocoder.yudao.module.bpm.convert.task;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.date.DateUtil;
4 import cn.hutool.core.util.StrUtil; 5 import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.common.pojo.PageResult; 6 import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 import cn.iocoder.yudao.framework.common.util.collection.MapUtils; 7 import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
7 import cn.iocoder.yudao.framework.common.util.collection.SetUtils; 8 import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
  9 +import cn.iocoder.yudao.framework.common.util.date.DateUtils;
8 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 10 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
9 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 11 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
10 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO; 12 import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
  13 +import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO;
11 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO; 14 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.simple.BpmSimpleModelNodeVO;
12 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO; 15 import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
13 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO; 16 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO;
14 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO; 17 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO;
15 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; 18 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
  19 +import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessPrintDataRespVO;
16 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; 20 import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
17 import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert; 21 import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
18 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; 22 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
19 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO; 23 import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
20 import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent; 24 import cn.iocoder.yudao.module.bpm.api.event.BpmProcessInstanceStatusEvent;
  25 +import cn.iocoder.yudao.module.bpm.enums.task.BpmTaskStatusEnum;
  26 +import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants;
21 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; 27 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
22 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; 28 import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
23 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO; 29 import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
@@ -35,10 +41,7 @@ import org.mapstruct.Mapping; @@ -35,10 +41,7 @@ import org.mapstruct.Mapping;
35 import org.mapstruct.MappingTarget; 41 import org.mapstruct.MappingTarget;
36 import org.mapstruct.factory.Mappers; 42 import org.mapstruct.factory.Mappers;
37 43
38 -import java.util.HashSet;  
39 -import java.util.List;  
40 -import java.util.Map;  
41 -import java.util.Set; 44 +import java.util.*;
42 45
43 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; 46 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
44 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet; 47 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@@ -292,4 +295,49 @@ public interface BpmProcessInstanceConvert { @@ -292,4 +295,49 @@ public interface BpmProcessInstanceConvert {
292 .setActivityNodes(activityNodes); 295 .setActivityNodes(activityNodes);
293 } 296 }
294 297
  298 + default BpmProcessPrintDataRespVO buildProcessInstancePrintData(HistoricProcessInstance historicProcessInstance,
  299 + BpmProcessDefinitionInfoDO processDefinitionInfo,
  300 + List<HistoricTaskInstance> tasks,
  301 + Map<Long, AdminUserRespDTO> userMap,
  302 + UserSimpleBaseVO startUser) {
  303 + BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting();
  304 + BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO();
  305 + // 打印模板是否开启
  306 + printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable()));
  307 + // 流程相关数据
  308 + BpmProcessInstanceRespVO processInstance = new BpmProcessInstanceRespVO();
  309 + processInstance.setStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance));
  310 + processInstance.setId(historicProcessInstance.getId());
  311 + processInstance.setName(historicProcessInstance.getName());
  312 + processInstance.setBusinessKey(historicProcessInstance.getBusinessKey());
  313 + processInstance.setStartTime(DateUtils.of(historicProcessInstance.getStartTime()));
  314 + processInstance.setEndTime(DateUtils.of(historicProcessInstance.getEndTime()));
  315 + processInstance.setFormVariables(historicProcessInstance.getProcessVariables());
  316 + processInstance.setStartUser(startUser);
  317 + processInstance.setProcessDefinition(BeanUtils.toBean(processDefinitionInfo, BpmProcessDefinitionRespVO.class));
  318 + printData.setProcessInstance(processInstance);
  319 + // 审批历史
  320 + List<BpmProcessPrintDataRespVO.ApproveTask> approveTasks = new ArrayList<>(tasks.size());
  321 + tasks.forEach(item -> {
  322 + Map<String, Object> taskLocalVariables = item.getTaskLocalVariables();
  323 + BpmProcessPrintDataRespVO.ApproveTask approveTask = new BpmProcessPrintDataRespVO.ApproveTask();
  324 + approveTask.setName(item.getName());
  325 + approveTask.setId(item.getId());
  326 + approveTask.setSignUrl((String) taskLocalVariables.getOrDefault(BpmnVariableConstants.TASK_SIGN_PIC_URL, ""));
  327 + approveTask.setDescription(StrUtil.format("{} / {} / {} / {} / {}",
  328 + userMap.get(Long.valueOf(item.getAssignee())).getNickname(),
  329 + item.getName(),
  330 + DateUtil.formatDateTime(item.getEndTime()),
  331 + BpmTaskStatusEnum.valueOf((Integer) taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_STATUS)).getName(),
  332 + taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_REASON)));
  333 + approveTasks.add(approveTask);
  334 + });
  335 + printData.setTasks(approveTasks);
  336 + // 自定义模板
  337 + if (printData.getPrintTemplateEnable() && printTemplateSetting != null) {
  338 + printData.setPrintTemplateHtml(printTemplateSetting.getTemplate());
  339 + }
  340 + return printData;
  341 + }
  342 +
295 } 343 }
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceService.java
@@ -113,14 +113,6 @@ public interface BpmProcessInstanceService { @@ -113,14 +113,6 @@ public interface BpmProcessInstanceService {
113 */ 113 */
114 BpmProcessInstanceBpmnModelViewRespVO getProcessInstanceBpmnModelView(String id); 114 BpmProcessInstanceBpmnModelViewRespVO getProcessInstanceBpmnModelView(String id);
115 115
116 - /**  
117 - * 获取流程打印所需数据  
118 - * @param loginUserId 打印人  
119 - * @param processInstanceId 流程实例id  
120 - * @return 打印所需数据  
121 - */  
122 - BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId);  
123 -  
124 // ========== Update 写入相关方法 ========== 116 // ========== Update 写入相关方法 ==========
125 117
126 /** 118 /**
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmProcessInstanceServiceImpl.java
@@ -728,69 +728,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService @@ -728,69 +728,6 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
728 userMap, deptMap); 728 userMap, deptMap);
729 } 729 }
730 730
731 - // TODO @lesan:这个可以放在 controller + convert 哇?保证 Service 只尽量处理写逻辑;  
732 - @Override  
733 - public BpmProcessPrintDataRespVO getProcessInstancePrintData(Long loginUserId, String processInstanceId) {  
734 - // 1 数据准备  
735 - HistoricProcessInstance historicProcessInstance = getHistoricProcessInstance(processInstanceId);  
736 - if (historicProcessInstance == null) {  
737 - throw exception(PROCESS_INSTANCE_NOT_EXISTS);  
738 - }  
739 - BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService  
740 - .getProcessDefinitionInfo(historicProcessInstance.getProcessDefinitionId());  
741 - BpmModelMetaInfoVO.PrintTemplateSetting printTemplateSetting = processDefinitionInfo.getPrintTemplateSetting();  
742 - // 2 获取打印所需数据  
743 - BpmProcessPrintDataRespVO printData = new BpmProcessPrintDataRespVO();  
744 - // 2.1 打印模板是否开启  
745 - printData.setPrintTemplateEnable(printTemplateSetting != null && Boolean.TRUE.equals(printTemplateSetting.getEnable()));  
746 - // 2.2 流程相关数据  
747 - printData.setProcessStatus(FlowableUtils.getProcessInstanceStatus(historicProcessInstance));  
748 - printData.setProcessInstanceId(historicProcessInstance.getId());  
749 - printData.setProcessName(historicProcessInstance.getName());  
750 - printData.setProcessBusinessKey(historicProcessInstance.getBusinessKey());  
751 - printData.setStartTime(DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getStartTime()));  
752 - printData.setEndTime(Objects.isNull(historicProcessInstance.getEndTime()) ?  
753 - "" : DatePattern.NORM_DATETIME_MINUTE_FORMAT.format(historicProcessInstance.getEndTime()));  
754 - printData.setProcessVariables(historicProcessInstance.getProcessVariables());  
755 - // 2.3 发起人  
756 - AdminUserRespDTO startUser = adminUserApi.getUser(Long.valueOf(historicProcessInstance.getStartUserId()));  
757 - DeptRespDTO dept = deptApi.getDept(startUser.getDeptId());  
758 - printData.setStartUser(new UserSimpleBaseVO().setNickname(startUser.getNickname()).setDeptName(dept.getName()));  
759 - // 2.4 审批历史  
760 - List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()  
761 - .finished()  
762 - .includeTaskLocalVariables()  
763 - .processInstanceId(processInstanceId)  
764 - .taskVariableValueNotEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS,  
765 - BpmTaskStatusEnum.CANCEL.getStatus())  
766 - .orderByHistoricTaskInstanceStartTime().asc().list();  
767 - Set<Long> userIds = convertSet(tasks, item -> Long.valueOf(item.getAssignee()));  
768 - Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);  
769 - List<BpmProcessPrintDataRespVO.ApproveNode> approveNodes = new ArrayList<>(tasks.size());  
770 - tasks.forEach(item -> {  
771 - Map<String, Object> taskLocalVariables = item.getTaskLocalVariables();  
772 - BpmProcessPrintDataRespVO.ApproveNode approveNode = new BpmProcessPrintDataRespVO.ApproveNode();  
773 - approveNode.setNodeName(item.getName());  
774 - approveNode.setNodeId(item.getId());  
775 - approveNode.setSignUrl((String) taskLocalVariables.getOrDefault(BpmnVariableConstants.TASK_SIGN_PIC_URL, ""));  
776 - approveNode.setNodeDesc(StrUtil.format("{} / {} / {} / {} / {}",  
777 - userMap.get(Long.valueOf(item.getAssignee())).getNickname(),  
778 - item.getName(),  
779 - DateUtil.formatDateTime(item.getEndTime()),  
780 - BpmTaskStatusEnum.valueOf((Integer) taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_STATUS)).getName(),  
781 - taskLocalVariables.get(BpmnVariableConstants.TASK_VARIABLE_REASON)));  
782 - approveNodes.add(approveNode);  
783 - });  
784 - printData.setApproveNodes(approveNodes);  
785 - // 2.5 表单数据  
786 - printData.setFormFields(processDefinitionInfo.getFormFields());  
787 - // 2.6 自定义模板  
788 - if (printData.getPrintTemplateEnable() && printTemplateSetting != null) {  
789 - printData.setPrintTemplateHtml(printTemplateSetting.getTemplate());  
790 - }  
791 - return printData;  
792 - }  
793 -  
794 // ========== Update 写入相关方法 ========== 731 // ========== Update 写入相关方法 ==========
795 732
796 @Override 733 @Override
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskService.java
@@ -176,6 +176,14 @@ public interface BpmTaskService { @@ -176,6 +176,14 @@ public interface BpmTaskService {
176 */ 176 */
177 List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId); 177 List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId);
178 178
  179 + /**
  180 + * 获得指定流程实例的已完成的流程任务列表,不包含取消状态
  181 + *
  182 + * @param processInstanceId 流程实例的编号
  183 + * @return 流程任务列表
  184 + */
  185 + List<HistoricTaskInstance> getFinishedTaskListByProcessInstanceIdWithoutCancel(String processInstanceId);
  186 +
179 // ========== Update 写入相关方法 ========== 187 // ========== Update 写入相关方法 ==========
180 188
181 /** 189 /**
yudao-module-bpm/src/main/java/cn/iocoder/yudao/module/bpm/service/task/BpmTaskServiceImpl.java
@@ -491,6 +491,17 @@ public class BpmTaskServiceImpl implements BpmTaskService { @@ -491,6 +491,17 @@ public class BpmTaskServiceImpl implements BpmTaskService {
491 return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list(); 491 return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list();
492 } 492 }
493 493
  494 + @Override
  495 + public List<HistoricTaskInstance> getFinishedTaskListByProcessInstanceIdWithoutCancel(String processInstanceId) {
  496 + return historyService.createHistoricTaskInstanceQuery()
  497 + .finished()
  498 + .includeTaskLocalVariables()
  499 + .processInstanceId(processInstanceId)
  500 + .taskVariableValueNotEquals(BpmnVariableConstants.TASK_VARIABLE_STATUS,
  501 + BpmTaskStatusEnum.CANCEL.getStatus())
  502 + .orderByHistoricTaskInstanceStartTime().asc().list();
  503 + }
  504 +
494 /** 505 /**
495 * 判断指定用户,是否是当前任务的审批人 506 * 判断指定用户,是否是当前任务的审批人
496 * 507 *