mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-02-03 04:04:58 +08:00
【功能完善】工作流:审批详情 approve-nodes => activity-nodes 字段
This commit is contained in:
parent
ab7a358888
commit
50418b2519
@ -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
Loading…
Reference in New Issue
Block a user