mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +08:00 
			
		
		
		
	【功能完善】工作流:审批详情 approve-nodes => activity-nodes 字段
This commit is contained in:
		@@ -9,11 +9,14 @@ public class UserSimpleBaseVO {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
					    @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
				
			||||||
    private Long id;
 | 
					    private Long id;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
 | 
					    @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
 | 
				
			||||||
    private String nickname;
 | 
					    private String nickname;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Schema(description = "用户头像", example = "https://www.iocoder.cn/1.png")
 | 
					    @Schema(description = "用户头像", example = "https://www.iocoder.cn/1.png")
 | 
				
			||||||
    private String avatar;
 | 
					    private String avatar;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
				
			||||||
 | 
					    private Long deptId;
 | 
				
			||||||
 | 
					    @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部")
 | 
				
			||||||
 | 
					    private String deptName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -8,7 +8,9 @@ Authorization: Bearer {{token}}
 | 
				
			|||||||
#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=1d5fb5a6-85f8-11ef-b717-7e93075f94e3
 | 
					#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=1d5fb5a6-85f8-11ef-b717-7e93075f94e3
 | 
				
			||||||
#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=3ee5c5ba-904a-11ef-a76e-b2ed5d6ef911
 | 
					#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=3ee5c5ba-904a-11ef-a76e-b2ed5d6ef911
 | 
				
			||||||
#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=f630dfa2-8f92-11ef-947c-ba5e239a6eb4
 | 
					#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=f630dfa2-8f92-11ef-947c-ba5e239a6eb4
 | 
				
			||||||
GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=9de8bdbf-9133-11ef-ae97-eaf49df1f932
 | 
					#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=9de8bdbf-9133-11ef-ae97-eaf49df1f932
 | 
				
			||||||
 | 
					#GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processInstanceId=dd2188eb-9394-11ef-a039-7a9ac3d9eb6b
 | 
				
			||||||
 | 
					GET {{baseUrl}}/bpm/process-instance/get-approval-detail?processDefinitionId=test-auto:1:c70a799a-9394-11ef-a039-7a9ac3d9eb6b
 | 
				
			||||||
Content-Type: application/json
 | 
					Content-Type: application/json
 | 
				
			||||||
tenant-id: 1
 | 
					tenant-id: 1
 | 
				
			||||||
Authorization: Bearer {{token}}
 | 
					Authorization: Bearer {{token}}
 | 
				
			||||||
@@ -19,8 +19,8 @@ public class BpmApprovalDetailRespVO {
 | 
				
			|||||||
    @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
					    @Schema(description = "流程实例的状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
				
			||||||
    private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
 | 
					    private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "审批信息列表", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
					    @Schema(description = "活动节点列表", requiredMode = Schema.RequiredMode.REQUIRED)
 | 
				
			||||||
    private List<NodeInfo> approveNodes;
 | 
					    private List<ActivityNode> activityNodes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "表单字段权限")
 | 
					    @Schema(description = "表单字段权限")
 | 
				
			||||||
    private Map<String, String> formFieldsPermission;
 | 
					    private Map<String, String> formFieldsPermission;
 | 
				
			||||||
@@ -38,9 +38,9 @@ public class BpmApprovalDetailRespVO {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    private BpmProcessInstanceRespVO processInstance;
 | 
					    private BpmProcessInstanceRespVO processInstance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "审批节点信息")
 | 
					    @Schema(description = "活动节点信息")
 | 
				
			||||||
    @Data
 | 
					    @Data
 | 
				
			||||||
    public static class NodeInfo {
 | 
					    public static class ActivityNode {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Schema(description = "节点编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartUserNode")
 | 
					        @Schema(description = "节点编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartUserNode")
 | 
				
			||||||
        private String id;
 | 
					        private String id;
 | 
				
			||||||
@@ -60,7 +60,7 @@ public class BpmApprovalDetailRespVO {
 | 
				
			|||||||
        private LocalDateTime endTime;
 | 
					        private LocalDateTime endTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Schema(description = "审批节点的任务信息")
 | 
					        @Schema(description = "审批节点的任务信息")
 | 
				
			||||||
        private List<ApprovalTaskInfo> tasks;
 | 
					        private List<ActivityNodeTask> tasks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Schema(description = "候选人用户 ID 列表", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1818")
 | 
					        @Schema(description = "候选人用户 ID 列表", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1818")
 | 
				
			||||||
        @JsonIgnore // 不返回,只是方便后续读取,赋值给 candidateUsers
 | 
					        @JsonIgnore // 不返回,只是方便后续读取,赋值给 candidateUsers
 | 
				
			||||||
@@ -71,9 +71,9 @@ public class BpmApprovalDetailRespVO {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "审批任务信息")
 | 
					    @Schema(description = "活动节点的任务信息")
 | 
				
			||||||
    @Data
 | 
					    @Data
 | 
				
			||||||
    public static class ApprovalTaskInfo {
 | 
					    public static class ActivityNodeTask {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
					        @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
				
			||||||
        private String id;
 | 
					        private String id;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
 | 
					package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 | 
				
			||||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
					import io.swagger.v3.oas.annotations.media.Schema;
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
@@ -44,7 +45,7 @@ public class BpmProcessInstanceRespVO {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 发起流程的用户
 | 
					     * 发起流程的用户
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private User startUser;
 | 
					    private UserSimpleBaseVO startUser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
 | 
					    @Schema(description = "流程定义的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
 | 
				
			||||||
    private String processDefinitionId;
 | 
					    private String processDefinitionId;
 | 
				
			||||||
@@ -58,24 +59,6 @@ public class BpmProcessInstanceRespVO {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    private List<Task> tasks; // 仅在流程实例分页才返回
 | 
					    private List<Task> tasks; // 仅在流程实例分页才返回
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "用户信息")
 | 
					 | 
				
			||||||
    @Data
 | 
					 | 
				
			||||||
    public static class User {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
					 | 
				
			||||||
        private Long id;
 | 
					 | 
				
			||||||
        @Schema(description = "用户昵称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
 | 
					 | 
				
			||||||
        private String nickname;
 | 
					 | 
				
			||||||
        @Schema(description = "用户头像", example = "https://www.iocoder.cn/1.png")
 | 
					 | 
				
			||||||
        private String avatar;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        @Schema(description = "部门编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
					 | 
				
			||||||
        private Long deptId;
 | 
					 | 
				
			||||||
        @Schema(description = "部门名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "研发部")
 | 
					 | 
				
			||||||
        private String deptName;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Schema(description = "流程任务")
 | 
					    @Schema(description = "流程任务")
 | 
				
			||||||
    @Data
 | 
					    @Data
 | 
				
			||||||
    public static class Task {
 | 
					    public static class Task {
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
 | 
					package cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
 | 
				
			||||||
import io.swagger.v3.oas.annotations.media.Schema;
 | 
					import io.swagger.v3.oas.annotations.media.Schema;
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -36,11 +36,11 @@ public class BpmTaskRespVO {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 负责人的用户信息
 | 
					     * 负责人的用户信息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private BpmProcessInstanceRespVO.User ownerUser;
 | 
					    private UserSimpleBaseVO ownerUser;
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 审核的用户信息
 | 
					     * 审核的用户信息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private BpmProcessInstanceRespVO.User assigneeUser;
 | 
					    private UserSimpleBaseVO assigneeUser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one")
 | 
					    @Schema(description = "任务定义的标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "Activity_one")
 | 
				
			||||||
    private String taskDefinitionKey;
 | 
					    private String taskDefinitionKey;
 | 
				
			||||||
@@ -89,7 +89,7 @@ public class BpmTaskRespVO {
 | 
				
			|||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * 发起人的用户信息
 | 
					         * 发起人的用户信息
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
        private BpmProcessInstanceRespVO.User startUser;
 | 
					        private UserSimpleBaseVO startUser;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,18 +1,22 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.bpm.convert.task;
 | 
					package cn.iocoder.yudao.module.bpm.convert.task;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import cn.hutool.core.collection.CollUtil;
 | 
				
			||||||
import cn.hutool.core.util.StrUtil;
 | 
					import cn.hutool.core.util.StrUtil;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
					import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.process.BpmProcessDefinitionRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceBpmnModelViewRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.convert.definition.BpmProcessDefinitionConvert;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 | 
					import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
 | 
					import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmProcessDefinitionInfoDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
 | 
					import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceStatusEvent;
 | 
				
			||||||
 | 
					import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.strategy.BpmTaskCandidateStartUserSelectStrategy;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 | 
					import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 | 
					import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
 | 
					import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcessInstanceApproveReqDTO;
 | 
				
			||||||
@@ -20,6 +24,7 @@ import cn.iocoder.yudao.module.bpm.service.message.dto.BpmMessageSendWhenProcess
 | 
				
			|||||||
import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 | 
					import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
 | 
				
			||||||
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 | 
					import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
 | 
				
			||||||
import org.flowable.bpmn.model.BpmnModel;
 | 
					import org.flowable.bpmn.model.BpmnModel;
 | 
				
			||||||
 | 
					import org.flowable.bpmn.model.UserTask;
 | 
				
			||||||
import org.flowable.engine.history.HistoricProcessInstance;
 | 
					import org.flowable.engine.history.HistoricProcessInstance;
 | 
				
			||||||
import org.flowable.engine.repository.ProcessDefinition;
 | 
					import org.flowable.engine.repository.ProcessDefinition;
 | 
				
			||||||
import org.flowable.engine.runtime.ProcessInstance;
 | 
					import org.flowable.engine.runtime.ProcessInstance;
 | 
				
			||||||
@@ -30,11 +35,13 @@ import org.mapstruct.Mapping;
 | 
				
			|||||||
import org.mapstruct.MappingTarget;
 | 
					import org.mapstruct.MappingTarget;
 | 
				
			||||||
import org.mapstruct.factory.Mappers;
 | 
					import org.mapstruct.factory.Mappers;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.HashSet;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
import java.util.Set;
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 | 
				
			||||||
 | 
					import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 流程实例 Convert
 | 
					 * 流程实例 Convert
 | 
				
			||||||
@@ -65,7 +72,7 @@ public interface BpmProcessInstanceConvert {
 | 
				
			|||||||
            if (userMap != null) {
 | 
					            if (userMap != null) {
 | 
				
			||||||
                AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(pageResult.getList().get(i).getStartUserId()));
 | 
					                AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(pageResult.getList().get(i).getStartUserId()));
 | 
				
			||||||
                if (startUser != null) {
 | 
					                if (startUser != null) {
 | 
				
			||||||
                    respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
 | 
					                    respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
 | 
				
			||||||
                    MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> respVO.getStartUser().setDeptName(dept.getName()));
 | 
					                    MapUtils.findAndThen(deptMap, startUser.getDeptId(), dept -> respVO.getStartUser().setDeptName(dept.getName()));
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -75,7 +82,7 @@ public interface BpmProcessInstanceConvert {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
 | 
					    default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
 | 
				
			||||||
                                                          ProcessDefinition processDefinition,
 | 
					                                                          ProcessDefinition processDefinition,
 | 
				
			||||||
                                                          BpmProcessDefinitionInfoDO processDefinitionExt,
 | 
					                                                          BpmProcessDefinitionInfoDO processDefinitionInfo,
 | 
				
			||||||
                                                          AdminUserRespDTO startUser,
 | 
					                                                          AdminUserRespDTO startUser,
 | 
				
			||||||
                                                          DeptRespDTO dept) {
 | 
					                                                          DeptRespDTO dept) {
 | 
				
			||||||
        BpmProcessInstanceRespVO respVO = BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class);
 | 
					        BpmProcessInstanceRespVO respVO = BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class);
 | 
				
			||||||
@@ -83,10 +90,10 @@ public interface BpmProcessInstanceConvert {
 | 
				
			|||||||
        respVO.setFormVariables(FlowableUtils.getProcessInstanceFormVariable(processInstance));
 | 
					        respVO.setFormVariables(FlowableUtils.getProcessInstanceFormVariable(processInstance));
 | 
				
			||||||
        // definition
 | 
					        // definition
 | 
				
			||||||
        respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
 | 
					        respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
 | 
				
			||||||
        copyTo(processDefinitionExt, respVO.getProcessDefinition());
 | 
					        copyTo(processDefinitionInfo, respVO.getProcessDefinition());
 | 
				
			||||||
        // user
 | 
					        // user
 | 
				
			||||||
        if (startUser != null) {
 | 
					        if (startUser != null) {
 | 
				
			||||||
            respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
 | 
					            respVO.setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
 | 
				
			||||||
            if (dept != null) {
 | 
					            if (dept != null) {
 | 
				
			||||||
                respVO.getStartUser().setDeptName(dept.getName());
 | 
					                respVO.getStartUser().setDeptName(dept.getName());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -144,17 +151,27 @@ public interface BpmProcessInstanceConvert {
 | 
				
			|||||||
        return respVO;
 | 
					        return respVO;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default BpmProcessInstanceRespVO.User buildUser(String userId,
 | 
					    default UserSimpleBaseVO buildUser(String userIdStr,
 | 
				
			||||||
                                                    Map<Long, AdminUserRespDTO> userMap,
 | 
					                                       Map<Long, AdminUserRespDTO> userMap,
 | 
				
			||||||
                                                    Map<Long, DeptRespDTO> deptMap) {
 | 
					                                       Map<Long, DeptRespDTO> deptMap) {
 | 
				
			||||||
        if (StrUtil.isBlank(userId)) {
 | 
					        if (StrUtil.isEmpty(userIdStr)) {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        AdminUserRespDTO user = userMap.get(NumberUtils.parseLong(userId));
 | 
					        Long userId = NumberUtils.parseLong(userIdStr);
 | 
				
			||||||
 | 
					        return buildUser(userId, userMap, deptMap);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default UserSimpleBaseVO buildUser(Long userId,
 | 
				
			||||||
 | 
					                                                    Map<Long, AdminUserRespDTO> userMap,
 | 
				
			||||||
 | 
					                                                    Map<Long, DeptRespDTO> deptMap) {
 | 
				
			||||||
 | 
					        if (userId == null) {
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        AdminUserRespDTO user = userMap.get(userId);
 | 
				
			||||||
        if (user == null) {
 | 
					        if (user == null) {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        BpmProcessInstanceRespVO.User userVO = BeanUtils.toBean(user, BpmProcessInstanceRespVO.User.class);
 | 
					        UserSimpleBaseVO userVO = BeanUtils.toBean(user, UserSimpleBaseVO.class);
 | 
				
			||||||
        DeptRespDTO dept = user.getDeptId() != null ? deptMap.get(user.getDeptId()) : null;
 | 
					        DeptRespDTO dept = user.getDeptId() != null ? deptMap.get(user.getDeptId()) : null;
 | 
				
			||||||
        if (dept != null) {
 | 
					        if (dept != null) {
 | 
				
			||||||
            userVO.setDeptName(dept.getName());
 | 
					            userVO.setDeptName(dept.getName());
 | 
				
			||||||
@@ -162,12 +179,69 @@ public interface BpmProcessInstanceConvert {
 | 
				
			|||||||
        return userVO;
 | 
					        return userVO;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    default BpmApprovalDetailRespVO.ApprovalTaskInfo buildApprovalTaskInfo(HistoricTaskInstance task) {
 | 
					    default BpmApprovalDetailRespVO.ActivityNodeTask buildApprovalTaskInfo(HistoricTaskInstance task) {
 | 
				
			||||||
        if (task == null) {
 | 
					        if (task == null) {
 | 
				
			||||||
            return null;
 | 
					            return null;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return BeanUtils.toBean(task, BpmApprovalDetailRespVO.ApprovalTaskInfo.class)
 | 
					        return BeanUtils.toBean(task, BpmApprovalDetailRespVO.ActivityNodeTask.class)
 | 
				
			||||||
                .setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task));
 | 
					                .setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default Set<Long> parseUserIds(HistoricProcessInstance processInstance,
 | 
				
			||||||
 | 
					                                   List<BpmApprovalDetailRespVO.ActivityNode> activityNodes) {
 | 
				
			||||||
 | 
					        Set<Long> userIds = new HashSet<>();
 | 
				
			||||||
 | 
					        if (processInstance != null) {
 | 
				
			||||||
 | 
					            userIds.add(NumberUtils.parseLong(processInstance.getStartUserId()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        for (BpmApprovalDetailRespVO.ActivityNode activityNode : activityNodes) {
 | 
				
			||||||
 | 
					            CollUtil.addAll(userIds, convertSet(activityNode.getTasks(), BpmApprovalDetailRespVO.ActivityNodeTask::getAssignee));
 | 
				
			||||||
 | 
					            CollUtil.addAll(userIds, convertSet(activityNode.getTasks(), BpmApprovalDetailRespVO.ActivityNodeTask::getOwner));
 | 
				
			||||||
 | 
					            CollUtil.addAll(userIds, activityNode.getCandidateUserIds());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return userIds;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    default BpmApprovalDetailRespVO buildApprovalDetail(BpmnModel bpmnModel,
 | 
				
			||||||
 | 
					                                                        ProcessDefinition processDefinition,
 | 
				
			||||||
 | 
					                                                        BpmProcessDefinitionInfoDO processDefinitionInfo,
 | 
				
			||||||
 | 
					                                                        HistoricProcessInstance processInstance,
 | 
				
			||||||
 | 
					                                                        Integer processInstanceStatus,
 | 
				
			||||||
 | 
					                                                        List<BpmApprovalDetailRespVO.ActivityNode> activityNodes,
 | 
				
			||||||
 | 
					                                                        BpmTaskRespVO todoTask,
 | 
				
			||||||
 | 
					                                                        Map<String, String> formFieldsPermission,
 | 
				
			||||||
 | 
					                                                        Map<Long, AdminUserRespDTO> userMap,
 | 
				
			||||||
 | 
					                                                        Map<Long, DeptRespDTO> deptMap) {
 | 
				
			||||||
 | 
					        // 1. 流程实例
 | 
				
			||||||
 | 
					        BpmProcessInstanceRespVO processInstanceResp = null;
 | 
				
			||||||
 | 
					        if (processInstance != null) {
 | 
				
			||||||
 | 
					            AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
 | 
				
			||||||
 | 
					            DeptRespDTO dept = startUser != null ? deptMap.get(startUser.getDeptId()) : null;
 | 
				
			||||||
 | 
					            processInstanceResp = buildProcessInstance(processInstance, null, null, startUser, dept);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 2. 流程定义
 | 
				
			||||||
 | 
					        List<UserTask> userTaskList = BpmTaskCandidateStartUserSelectStrategy.getStartUserSelectUserTaskList(bpmnModel);
 | 
				
			||||||
 | 
					        BpmProcessDefinitionRespVO definitionResp = BpmProcessDefinitionConvert.INSTANCE.buildProcessDefinition(
 | 
				
			||||||
 | 
					                processDefinition, null, processDefinitionInfo, null, null, bpmnModel, userTaskList);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 3. 流程节点
 | 
				
			||||||
 | 
					        activityNodes.forEach(approveNode -> {
 | 
				
			||||||
 | 
					            if (approveNode.getTasks() != null) {
 | 
				
			||||||
 | 
					                approveNode.getTasks().forEach(task -> {
 | 
				
			||||||
 | 
					                    task.setAssigneeUser(buildUser(task.getAssignee(), userMap, deptMap));
 | 
				
			||||||
 | 
					                    task.setOwnerUser(buildUser(task.getOwner(), userMap, deptMap));
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            approveNode.setCandidateUsers(convertList(approveNode.getCandidateUserIds(), userId -> buildUser(userId, userMap, deptMap)));
 | 
				
			||||||
 | 
					        });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 4. 拼接起来
 | 
				
			||||||
 | 
					        return new BpmApprovalDetailRespVO().setStatus(processInstanceStatus)
 | 
				
			||||||
 | 
					                .setProcessDefinition(definitionResp)
 | 
				
			||||||
 | 
					                .setProcessInstance(processInstanceResp)
 | 
				
			||||||
 | 
					                .setFormFieldsPermission(formFieldsPermission)
 | 
				
			||||||
 | 
					                .setTodoTask(todoTask)
 | 
				
			||||||
 | 
					                .setActivityNodes(activityNodes);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
				
			|||||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
 | 
				
			||||||
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 | 
					import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.base.user.UserSimpleBaseVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 | 
					import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 | 
					import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 | 
					import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
 | 
				
			||||||
@@ -51,7 +51,7 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
 | 
					            taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
 | 
				
			||||||
            AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
 | 
					            AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
 | 
				
			||||||
            taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
 | 
					            taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -65,7 +65,7 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
            // 用户信息
 | 
					            // 用户信息
 | 
				
			||||||
            AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
 | 
					            AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
 | 
				
			||||||
            if (assignUser != null) {
 | 
					            if (assignUser != null) {
 | 
				
			||||||
                taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
 | 
					                taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class));
 | 
				
			||||||
                findAndThen(deptMap, assignUser.getDeptId(), dept -> taskVO.getAssigneeUser().setDeptName(dept.getName()));
 | 
					                findAndThen(deptMap, assignUser.getDeptId(), dept -> taskVO.getAssigneeUser().setDeptName(dept.getName()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            // 流程实例
 | 
					            // 流程实例
 | 
				
			||||||
@@ -73,7 +73,7 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
            if (processInstance != null) {
 | 
					            if (processInstance != null) {
 | 
				
			||||||
                AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
 | 
					                AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
 | 
				
			||||||
                taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
 | 
					                taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
 | 
				
			||||||
                taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
 | 
					                taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            return taskVO;
 | 
					            return taskVO;
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
@@ -92,7 +92,7 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
            // 流程实例
 | 
					            // 流程实例
 | 
				
			||||||
            AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
 | 
					            AdminUserRespDTO startUser = userMap.get(NumberUtils.parseLong(processInstance.getStartUserId()));
 | 
				
			||||||
            taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
 | 
					            taskVO.setProcessInstance(BeanUtils.toBean(processInstance, BpmTaskRespVO.ProcessInstance.class));
 | 
				
			||||||
            taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
 | 
					            taskVO.getProcessInstance().setStartUser(BeanUtils.toBean(startUser, UserSimpleBaseVO.class));
 | 
				
			||||||
            // 表单信息
 | 
					            // 表单信息
 | 
				
			||||||
            BpmFormDO form = MapUtil.get(formMap, NumberUtils.parseLong(task.getFormKey()), BpmFormDO.class);
 | 
					            BpmFormDO form = MapUtil.get(formMap, NumberUtils.parseLong(task.getFormKey()), BpmFormDO.class);
 | 
				
			||||||
            if (form != null) {
 | 
					            if (form != null) {
 | 
				
			||||||
@@ -112,7 +112,7 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
        return convertList(taskList, task -> BeanUtils.toBean(task, BpmTaskRespVO.class, taskVO -> {
 | 
					        return convertList(taskList, task -> BeanUtils.toBean(task, BpmTaskRespVO.class, taskVO -> {
 | 
				
			||||||
            AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
 | 
					            AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
 | 
				
			||||||
            if (assignUser != null) {
 | 
					            if (assignUser != null) {
 | 
				
			||||||
                taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
 | 
					                taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class));
 | 
				
			||||||
                DeptRespDTO dept = deptMap.get(assignUser.getDeptId());
 | 
					                DeptRespDTO dept = deptMap.get(assignUser.getDeptId());
 | 
				
			||||||
                if (dept != null) {
 | 
					                if (dept != null) {
 | 
				
			||||||
                    taskVO.getAssigneeUser().setDeptName(dept.getName());
 | 
					                    taskVO.getAssigneeUser().setDeptName(dept.getName());
 | 
				
			||||||
@@ -120,7 +120,7 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(task.getOwner()));
 | 
					            AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(task.getOwner()));
 | 
				
			||||||
            if (ownerUser != null) {
 | 
					            if (ownerUser != null) {
 | 
				
			||||||
                taskVO.setOwnerUser(BeanUtils.toBean(ownerUser, BpmProcessInstanceRespVO.User.class));
 | 
					                taskVO.setOwnerUser(BeanUtils.toBean(ownerUser, UserSimpleBaseVO.class));
 | 
				
			||||||
                findAndThen(deptMap, ownerUser.getDeptId(), dept -> taskVO.getOwnerUser().setDeptName(dept.getName()));
 | 
					                findAndThen(deptMap, ownerUser.getDeptId(), dept -> taskVO.getOwnerUser().setDeptName(dept.getName()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }));
 | 
					        }));
 | 
				
			||||||
@@ -166,7 +166,7 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
                                Map<Long, DeptRespDTO> deptMap) {
 | 
					                                Map<Long, DeptRespDTO> deptMap) {
 | 
				
			||||||
        AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(taskOwner));
 | 
					        AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(taskOwner));
 | 
				
			||||||
        if (ownerUser != null) {
 | 
					        if (ownerUser != null) {
 | 
				
			||||||
            task.setOwnerUser(BeanUtils.toBean(ownerUser, BpmProcessInstanceRespVO.User.class));
 | 
					            task.setOwnerUser(BeanUtils.toBean(ownerUser, UserSimpleBaseVO.class));
 | 
				
			||||||
            findAndThen(deptMap, ownerUser.getDeptId(), dept -> task.getOwnerUser().setDeptName(dept.getName()));
 | 
					            findAndThen(deptMap, ownerUser.getDeptId(), dept -> task.getOwnerUser().setDeptName(dept.getName()));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -192,7 +192,7 @@ public interface BpmTaskConvert {
 | 
				
			|||||||
                                   Map<Long, DeptRespDTO> deptMap) {
 | 
					                                   Map<Long, DeptRespDTO> deptMap) {
 | 
				
			||||||
        AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(taskAssignee));
 | 
					        AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(taskAssignee));
 | 
				
			||||||
        if (assignUser != null) {
 | 
					        if (assignUser != null) {
 | 
				
			||||||
            task.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
 | 
					            task.setAssigneeUser(BeanUtils.toBean(assignUser, UserSimpleBaseVO.class));
 | 
				
			||||||
            findAndThen(deptMap, assignUser.getDeptId(), dept -> task.getAssigneeUser().setDeptName(dept.getName()));
 | 
					            findAndThen(deptMap, assignUser.getDeptId(), dept -> task.getAssigneeUser().setDeptName(dept.getName()));
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -98,6 +98,16 @@ public class FlowableUtils {
 | 
				
			|||||||
        return (Integer) processVariables.get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS);
 | 
					        return (Integer) processVariables.get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_STATUS);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获得流程实例的审批原因
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param processInstance 流程实例
 | 
				
			||||||
 | 
					     * @return 审批原因
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public static String getProcessInstanceReason(HistoricProcessInstance processInstance) {
 | 
				
			||||||
 | 
					        return (String) processInstance.getProcessVariables().get(BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_REASON);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获得流程实例的表单
 | 
					     * 获得流程实例的表单
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
 
 | 
				
			|||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user