【功能修改】 整合流程详情接口

This commit is contained in:
jason 2024-10-16 22:26:14 +08:00
parent 1c4bb2c80d
commit 1d815c2c22
9 changed files with 54 additions and 49 deletions

View File

@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.*;
import cn.iocoder.yudao.module.bpm.convert.task.BpmProcessInstanceConvert;
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.framework.flowable.core.util.BpmnModelUtils;
import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
import cn.iocoder.yudao.module.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
@ -128,15 +127,13 @@ public class BpmProcessInstanceController {
processInstance.getProcessDefinitionId());
BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
processInstance.getProcessDefinitionId());
String bpmnXml = BpmnModelUtils.getBpmnXml(
processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()));
AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
DeptRespDTO dept = null;
if (startUser != null && startUser.getDeptId() != null) {
dept = deptApi.getDept(startUser.getDeptId());
}
return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance,
processDefinition, processDefinitionInfo, bpmnXml, startUser, dept));
processDefinition, processDefinitionInfo, startUser, dept));
}
@DeleteMapping("/cancel-by-start-user")
@ -157,14 +154,6 @@ public class BpmProcessInstanceController {
return success(true);
}
@GetMapping("/get-form-fields-permission")
@Operation(summary = "获得表单字段权限")
@PreAuthorize("@ss.hasPermission('bpm:process-instance:query')")
public CommonResult<Map<String, String>> getFormFieldsPermission(
@Valid BpmFormFieldsPermissionReqVO reqVO) {
return success(processInstanceService.getFormFieldsPermission(reqVO));
}
@GetMapping("/get-approval-detail")
@Operation(summary = "获得审批详情")
@Parameter(name = "id", description = "流程实例的编号", required = true)

View File

@ -79,8 +79,7 @@ public class BpmTaskController {
@Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
@PreAuthorize("@ss.hasPermission('bpm:task:query')")
public CommonResult<BpmTaskRespVO> getMyTodoTask(@RequestParam("processInstanceId") String processInstanceId) {
List<BpmTaskRespVO> taskList = taskService.getTodoTask(getLoginUserId(), processInstanceId);
return success(findFirst(taskList, Objects::nonNull));
return success(taskService.getTodoTask(getLoginUserId(), processInstanceId));
}
@GetMapping("done-page")

View File

@ -17,6 +17,12 @@ public class BpmApprovalDetailReqVO {
@Schema(description = "流程实例的编号", example = "1024")
private String processInstanceId;
@Schema(description = "流程活动编号", example = "StartUserNode")
private String activityId; // 对应 BPMN XML 节点 Id
@Schema(description = "流程任务编号", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b")
private String taskId; // UserTask 对应的Id
@AssertTrue(message = "流程定义的编号和流程实例的编号不能同时为空")
@JsonIgnore
public boolean isValidProcessParam() {

View File

@ -1,11 +1,14 @@
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.task.vo.task.BpmTaskRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@Schema(description = "管理后台 - 审批详情 Response VO")
@ -18,6 +21,22 @@ public class BpmApprovalDetailRespVO {
@Schema(description = "审批信息列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<ApprovalNodeInfo> approveNodes;
@Schema(description = "表单字段权限")
private Map<String, String> formFieldsPermission;
@Schema(description = "待办任务")
private BpmTaskRespVO todoTask;
/**
* 所属流程定义信息
*/
private BpmProcessDefinitionRespVO processDefinition;
/**
* 所属流程实例信息
*/
private BpmProcessInstanceRespVO processInstance;
@Schema(description = "审批节点信息")
@Data
public static class ApprovalNodeInfo {

View File

@ -75,7 +75,6 @@ public interface BpmProcessInstanceConvert {
default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
ProcessDefinition processDefinition,
BpmProcessDefinitionInfoDO processDefinitionExt,
String bpmnXml,
AdminUserRespDTO startUser,
DeptRespDTO dept) {
BpmProcessInstanceRespVO respVO = BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class);
@ -84,7 +83,6 @@ public interface BpmProcessInstanceConvert {
// definition
respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
copyTo(processDefinitionExt, respVO.getProcessDefinition());
respVO.getProcessDefinition().setBpmnXml(bpmnXml);
// user
if (startUser != null) {
respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));

View File

@ -84,14 +84,6 @@ public interface BpmProcessInstanceService {
PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId,
@Valid BpmProcessInstancePageReqVO pageReqVO);
/**
* 获得表单字段权限
*
* @param reqVO 请求消息
* @return 表单字段权限
*/
Map<String, String> getFormFieldsPermission(@Valid BpmFormFieldsPermissionReqVO reqVO);
// TODO @芋艿重点在 review
/**
* 获取审批详情

View File

@ -33,13 +33,13 @@ public interface BpmTaskService {
PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO);
/**
* 获得待办任务列表
* 获得用户的待办任务 多条待办任务按时间顺序返回第一条
*
* @param userId 用户编号
* @param processInstanceId 流程实例编号
* @return 流程任务列表
* @return 待办任务
*/
List<BpmTaskRespVO> getTodoTask(Long userId, String processInstanceId);
BpmTaskRespVO getTodoTask(Long userId, String processInstanceId);
/**
* 获得已办的流程任务分页
@ -82,7 +82,7 @@ public interface BpmTaskService {
* 获得指定流程实例的流程任务列表包括所有状态的
*
* @param processInstanceId 流程实例的编号
* @param asc 是否升序
* @param asc 是否升序
* @return 流程任务列表
*/
List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId, Boolean asc);
@ -115,8 +115,8 @@ public interface BpmTaskService {
* 根据条件查询正在进行中的任务
*
* @param processInstanceId 流程实例编号不允许为空
* @param assigned 是否分配了审批人允许空
* @param taskDefineKey 任务定义 Key允许空
* @param assigned 是否分配了审批人允许空
* @param taskDefineKey 任务定义 Key允许空
*/
List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId,
Boolean assigned,
@ -223,10 +223,10 @@ public interface BpmTaskService {
/**
* 处理 Task 创建事件目前是
*
* <p>
* 1. 更新它的状态为审批中
* 2. 处理自动通过的情况例如说1无审批人时是否自动通过不通过2人工审核是否自动通过不通过
*
* <p>
* 注意它的触发时机晚于 {@link #processTaskAssigned(Task)} 之后
*
* @param task 任务实体
@ -251,8 +251,8 @@ public interface BpmTaskService {
* 处理 Task 审批超时事件可能会处理多个当前审批中的任务
*
* @param processInstanceId 流程示例编号
* @param taskDefineKey 任务 Key
* @param handlerType 处理类型参见 {@link BpmUserTaskTimeoutHandlerTypeEnum}
* @param taskDefineKey 任务 Key
* @param handlerType 处理类型参见 {@link BpmUserTaskTimeoutHandlerTypeEnum}
*/
void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType);

View File

@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.*;
import cn.hutool.extra.spring.SpringUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@ -127,10 +126,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
// TODO 1 @jason这个赞要不要放到 BpmApprovalDetailRespVO 然后 BpmApprovalDetailRespVO 返回流程实例的信息 processInstance待审批的信息 todoTaskapproveNodes 审批信息列表以及 getFormFieldsPermission 也融合进去
// 类似我们现在新的 get-bpmn-model-view就是给 bpmn xml 高亮用的 get-approval-detail 就是给审批第一个 tab 用的基本信息 + 按钮 + 流程预测
// TODO 2是不是只返回一个 Task按道理说只会有一个审批
@Override
public List<BpmTaskRespVO> getTodoTask(Long userId, String processInstanceId) {
public BpmTaskRespVO getTodoTask(Long userId, String processInstanceId) {
// TODO 芋艿暂未 review后续再瞅瞅先沟通完整体设计
if (processInstanceId == null) {
return null;
}
TaskQuery taskQuery = taskService.createTaskQuery()
.active()
.processInstanceId(processInstanceId)
@ -153,7 +154,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
return CollectionUtils.convertList(todoList, task -> {
List<BpmTaskRespVO> taskList = convertList(todoList, task -> {
// 找到分配给当前用户或者当前用户加签的任务为了减签
if (!userId.equals(NumberUtil.parseLong(task.getAssignee(), null)) &&
(!userId.equals(NumberUtil.parseLong(task.getOwner(), null)) || BpmTaskSignTypeEnum.of(task.getScopeType()) == null)) {
@ -173,22 +174,23 @@ public class BpmTaskServiceImpl implements BpmTaskService {
List<Task> childTasks = childrenTaskMap.get(task.getId());
if (CollUtil.isNotEmpty(childTasks)) {
taskVO.setChildren(
CollectionUtils.convertList(childTasks, childTask -> {
BpmTaskRespVO childTaskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
childTaskVO.setStatus(FlowableUtils.getTaskStatus(task));
AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(childTask.getAssignee()));
if (assignUser != null) {
childTaskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
findAndThen(deptMap, assignUser.getDeptId(), dept -> childTaskVO.getAssigneeUser().setDeptName(dept.getName()));
}
return childTaskVO;
})
convertList(childTasks, childTask -> {
BpmTaskRespVO childTaskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
childTaskVO.setStatus(FlowableUtils.getTaskStatus(task));
AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(childTask.getAssignee()));
if (assignUser != null) {
childTaskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
findAndThen(deptMap, assignUser.getDeptId(), dept -> childTaskVO.getAssigneeUser().setDeptName(dept.getName()));
}
return childTaskVO;
})
);
}
}
return taskVO;
});
return findFirst(taskList, Objects::nonNull);
}
@Override