mirror of
https://gitee.com/hhyykk/ipms-sjy.git
synced 2025-02-03 12:14:57 +08:00
【功能修改】 整合流程详情接口
This commit is contained in:
parent
1c4bb2c80d
commit
1d815c2c22
@ -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.convert.task.BpmProcessInstanceConvert;
|
||||||
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.framework.flowable.core.util.BpmnModelUtils;
|
|
||||||
import cn.iocoder.yudao.module.bpm.service.definition.BpmCategoryService;
|
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.definition.BpmProcessDefinitionService;
|
||||||
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
import cn.iocoder.yudao.module.bpm.service.task.BpmProcessInstanceService;
|
||||||
@ -128,15 +127,13 @@ public class BpmProcessInstanceController {
|
|||||||
processInstance.getProcessDefinitionId());
|
processInstance.getProcessDefinitionId());
|
||||||
BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
|
BpmProcessDefinitionInfoDO processDefinitionInfo = processDefinitionService.getProcessDefinitionInfo(
|
||||||
processInstance.getProcessDefinitionId());
|
processInstance.getProcessDefinitionId());
|
||||||
String bpmnXml = BpmnModelUtils.getBpmnXml(
|
|
||||||
processDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId()));
|
|
||||||
AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
|
AdminUserRespDTO startUser = adminUserApi.getUser(NumberUtils.parseLong(processInstance.getStartUserId()));
|
||||||
DeptRespDTO dept = null;
|
DeptRespDTO dept = null;
|
||||||
if (startUser != null && startUser.getDeptId() != null) {
|
if (startUser != null && startUser.getDeptId() != null) {
|
||||||
dept = deptApi.getDept(startUser.getDeptId());
|
dept = deptApi.getDept(startUser.getDeptId());
|
||||||
}
|
}
|
||||||
return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance,
|
return success(BpmProcessInstanceConvert.INSTANCE.buildProcessInstance(processInstance,
|
||||||
processDefinition, processDefinitionInfo, bpmnXml, startUser, dept));
|
processDefinition, processDefinitionInfo, startUser, dept));
|
||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/cancel-by-start-user")
|
@DeleteMapping("/cancel-by-start-user")
|
||||||
@ -157,14 +154,6 @@ public class BpmProcessInstanceController {
|
|||||||
return success(true);
|
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")
|
@GetMapping("/get-approval-detail")
|
||||||
@Operation(summary = "获得审批详情")
|
@Operation(summary = "获得审批详情")
|
||||||
@Parameter(name = "id", description = "流程实例的编号", required = true)
|
@Parameter(name = "id", description = "流程实例的编号", required = true)
|
||||||
|
@ -79,8 +79,7 @@ public class BpmTaskController {
|
|||||||
@Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
|
@Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
|
||||||
@PreAuthorize("@ss.hasPermission('bpm:task:query')")
|
@PreAuthorize("@ss.hasPermission('bpm:task:query')")
|
||||||
public CommonResult<BpmTaskRespVO> getMyTodoTask(@RequestParam("processInstanceId") String processInstanceId) {
|
public CommonResult<BpmTaskRespVO> getMyTodoTask(@RequestParam("processInstanceId") String processInstanceId) {
|
||||||
List<BpmTaskRespVO> taskList = taskService.getTodoTask(getLoginUserId(), processInstanceId);
|
return success(taskService.getTodoTask(getLoginUserId(), processInstanceId));
|
||||||
return success(findFirst(taskList, Objects::nonNull));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("done-page")
|
@GetMapping("done-page")
|
||||||
|
@ -17,6 +17,12 @@ public class BpmApprovalDetailReqVO {
|
|||||||
@Schema(description = "流程实例的编号", example = "1024")
|
@Schema(description = "流程实例的编号", example = "1024")
|
||||||
private String processInstanceId;
|
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 = "流程定义的编号和流程实例的编号不能同时为空")
|
@AssertTrue(message = "流程定义的编号和流程实例的编号不能同时为空")
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
public boolean isValidProcessParam() {
|
public boolean isValidProcessParam() {
|
||||||
|
@ -1,11 +1,14 @@
|
|||||||
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.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 io.swagger.v3.oas.annotations.media.Schema;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
|
||||||
@Schema(description = "管理后台 - 审批详情 Response VO")
|
@Schema(description = "管理后台 - 审批详情 Response VO")
|
||||||
@ -18,6 +21,22 @@ public class BpmApprovalDetailRespVO {
|
|||||||
@Schema(description = "审批信息列表", requiredMode = Schema.RequiredMode.REQUIRED)
|
@Schema(description = "审批信息列表", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
private List<ApprovalNodeInfo> approveNodes;
|
private List<ApprovalNodeInfo> approveNodes;
|
||||||
|
|
||||||
|
@Schema(description = "表单字段权限")
|
||||||
|
private Map<String, String> formFieldsPermission;
|
||||||
|
|
||||||
|
@Schema(description = "待办任务")
|
||||||
|
private BpmTaskRespVO todoTask;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所属流程定义信息
|
||||||
|
*/
|
||||||
|
private BpmProcessDefinitionRespVO processDefinition;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 所属流程实例信息
|
||||||
|
*/
|
||||||
|
private BpmProcessInstanceRespVO processInstance;
|
||||||
|
|
||||||
@Schema(description = "审批节点信息")
|
@Schema(description = "审批节点信息")
|
||||||
@Data
|
@Data
|
||||||
public static class ApprovalNodeInfo {
|
public static class ApprovalNodeInfo {
|
||||||
|
@ -75,7 +75,6 @@ public interface BpmProcessInstanceConvert {
|
|||||||
default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
|
default BpmProcessInstanceRespVO buildProcessInstance(HistoricProcessInstance processInstance,
|
||||||
ProcessDefinition processDefinition,
|
ProcessDefinition processDefinition,
|
||||||
BpmProcessDefinitionInfoDO processDefinitionExt,
|
BpmProcessDefinitionInfoDO processDefinitionExt,
|
||||||
String bpmnXml,
|
|
||||||
AdminUserRespDTO startUser,
|
AdminUserRespDTO startUser,
|
||||||
DeptRespDTO dept) {
|
DeptRespDTO dept) {
|
||||||
BpmProcessInstanceRespVO respVO = BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class);
|
BpmProcessInstanceRespVO respVO = BeanUtils.toBean(processInstance, BpmProcessInstanceRespVO.class);
|
||||||
@ -84,7 +83,6 @@ public interface BpmProcessInstanceConvert {
|
|||||||
// definition
|
// definition
|
||||||
respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
|
respVO.setProcessDefinition(BeanUtils.toBean(processDefinition, BpmProcessDefinitionRespVO.class));
|
||||||
copyTo(processDefinitionExt, respVO.getProcessDefinition());
|
copyTo(processDefinitionExt, respVO.getProcessDefinition());
|
||||||
respVO.getProcessDefinition().setBpmnXml(bpmnXml);
|
|
||||||
// user
|
// user
|
||||||
if (startUser != null) {
|
if (startUser != null) {
|
||||||
respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
|
respVO.setStartUser(BeanUtils.toBean(startUser, BpmProcessInstanceRespVO.User.class));
|
||||||
|
@ -84,14 +84,6 @@ public interface BpmProcessInstanceService {
|
|||||||
PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId,
|
PageResult<HistoricProcessInstance> getProcessInstancePage(Long userId,
|
||||||
@Valid BpmProcessInstancePageReqVO pageReqVO);
|
@Valid BpmProcessInstancePageReqVO pageReqVO);
|
||||||
|
|
||||||
/**
|
|
||||||
* 获得表单字段权限
|
|
||||||
*
|
|
||||||
* @param reqVO 请求消息
|
|
||||||
* @return 表单字段权限
|
|
||||||
*/
|
|
||||||
Map<String, String> getFormFieldsPermission(@Valid BpmFormFieldsPermissionReqVO reqVO);
|
|
||||||
|
|
||||||
// TODO @芋艿:重点在 review 下
|
// TODO @芋艿:重点在 review 下
|
||||||
/**
|
/**
|
||||||
* 获取审批详情。
|
* 获取审批详情。
|
||||||
|
File diff suppressed because one or more lines are too long
@ -33,13 +33,13 @@ public interface BpmTaskService {
|
|||||||
PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO);
|
PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得待办任务列表
|
* 获得用户的待办任务, 多条待办任务按时间顺序返回第一条
|
||||||
*
|
*
|
||||||
* @param userId 用户编号
|
* @param userId 用户编号
|
||||||
* @param processInstanceId 流程实例编号
|
* @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 processInstanceId 流程实例的编号
|
||||||
* @param asc 是否升序
|
* @param asc 是否升序
|
||||||
* @return 流程任务列表
|
* @return 流程任务列表
|
||||||
*/
|
*/
|
||||||
List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId, Boolean asc);
|
List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId, Boolean asc);
|
||||||
@ -115,8 +115,8 @@ public interface BpmTaskService {
|
|||||||
* 根据条件查询正在进行中的任务
|
* 根据条件查询正在进行中的任务
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程实例编号,不允许为空
|
* @param processInstanceId 流程实例编号,不允许为空
|
||||||
* @param assigned 是否分配了审批人,允许空
|
* @param assigned 是否分配了审批人,允许空
|
||||||
* @param taskDefineKey 任务定义 Key,允许空
|
* @param taskDefineKey 任务定义 Key,允许空
|
||||||
*/
|
*/
|
||||||
List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId,
|
List<Task> getRunningTaskListByProcessInstanceId(String processInstanceId,
|
||||||
Boolean assigned,
|
Boolean assigned,
|
||||||
@ -223,10 +223,10 @@ public interface BpmTaskService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理 Task 创建事件,目前是
|
* 处理 Task 创建事件,目前是
|
||||||
*
|
* <p>
|
||||||
* 1. 更新它的状态为审批中
|
* 1. 更新它的状态为审批中
|
||||||
* 2. 处理自动通过的情况,例如说:1)无审批人时,是否自动通过、不通过;2)非【人工审核】时,是否自动通过、不通过
|
* 2. 处理自动通过的情况,例如说:1)无审批人时,是否自动通过、不通过;2)非【人工审核】时,是否自动通过、不通过
|
||||||
*
|
* <p>
|
||||||
* 注意:它的触发时机,晚于 {@link #processTaskAssigned(Task)} 之后
|
* 注意:它的触发时机,晚于 {@link #processTaskAssigned(Task)} 之后
|
||||||
*
|
*
|
||||||
* @param task 任务实体
|
* @param task 任务实体
|
||||||
@ -251,8 +251,8 @@ public interface BpmTaskService {
|
|||||||
* 处理 Task 审批超时事件,可能会处理多个当前审批中的任务
|
* 处理 Task 审批超时事件,可能会处理多个当前审批中的任务
|
||||||
*
|
*
|
||||||
* @param processInstanceId 流程示例编号
|
* @param processInstanceId 流程示例编号
|
||||||
* @param taskDefineKey 任务 Key
|
* @param taskDefineKey 任务 Key
|
||||||
* @param handlerType 处理类型,参见 {@link BpmUserTaskTimeoutHandlerTypeEnum}
|
* @param handlerType 处理类型,参见 {@link BpmUserTaskTimeoutHandlerTypeEnum}
|
||||||
*/
|
*/
|
||||||
void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType);
|
void processTaskTimeout(String processInstanceId, String taskDefineKey, Integer handlerType);
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@ import cn.hutool.core.lang.Assert;
|
|||||||
import cn.hutool.core.util.*;
|
import cn.hutool.core.util.*;
|
||||||
import cn.hutool.extra.spring.SpringUtil;
|
import cn.hutool.extra.spring.SpringUtil;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
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.date.DateUtils;
|
||||||
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;
|
||||||
@ -127,10 +126,12 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|||||||
// TODO 1: @jason:这个,赞要不要放到 BpmApprovalDetailRespVO 里?然后 BpmApprovalDetailRespVO 返回流程实例的信息 processInstance、待审批的信息 todoTask、approveNodes 审批信息列表、以及 getFormFieldsPermission 也融合进去;
|
// TODO 1: @jason:这个,赞要不要放到 BpmApprovalDetailRespVO 里?然后 BpmApprovalDetailRespVO 返回流程实例的信息 processInstance、待审批的信息 todoTask、approveNodes 审批信息列表、以及 getFormFieldsPermission 也融合进去;
|
||||||
// 类似我们现在新的 get-bpmn-model-view,就是给 bpmn xml 高亮用的。那 get-approval-detail 就是给审批第一个 tab 用的,基本信息 + 按钮 + 流程预测
|
// 类似我们现在新的 get-bpmn-model-view,就是给 bpmn xml 高亮用的。那 get-approval-detail 就是给审批第一个 tab 用的,基本信息 + 按钮 + 流程预测
|
||||||
|
|
||||||
// TODO 2:是不是只返回一个 Task。按道理说,只会有一个审批?
|
|
||||||
@Override
|
@Override
|
||||||
public List<BpmTaskRespVO> getTodoTask(Long userId, String processInstanceId) {
|
public BpmTaskRespVO getTodoTask(Long userId, String processInstanceId) {
|
||||||
// TODO 芋艿:暂未 review,后续再瞅瞅。先沟通完整体设计。
|
// TODO 芋艿:暂未 review,后续再瞅瞅。先沟通完整体设计。
|
||||||
|
if (processInstanceId == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
TaskQuery taskQuery = taskService.createTaskQuery()
|
TaskQuery taskQuery = taskService.createTaskQuery()
|
||||||
.active()
|
.active()
|
||||||
.processInstanceId(processInstanceId)
|
.processInstanceId(processInstanceId)
|
||||||
@ -153,7 +154,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
|
|||||||
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
|
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
|
||||||
Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
|
Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
|
||||||
convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
|
convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
|
||||||
return CollectionUtils.convertList(todoList, task -> {
|
List<BpmTaskRespVO> taskList = convertList(todoList, task -> {
|
||||||
// 找到分配给当前用户,或者当前用户加签的任务(为了减签)
|
// 找到分配给当前用户,或者当前用户加签的任务(为了减签)
|
||||||
if (!userId.equals(NumberUtil.parseLong(task.getAssignee(), null)) &&
|
if (!userId.equals(NumberUtil.parseLong(task.getAssignee(), null)) &&
|
||||||
(!userId.equals(NumberUtil.parseLong(task.getOwner(), null)) || BpmTaskSignTypeEnum.of(task.getScopeType()) == 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());
|
List<Task> childTasks = childrenTaskMap.get(task.getId());
|
||||||
if (CollUtil.isNotEmpty(childTasks)) {
|
if (CollUtil.isNotEmpty(childTasks)) {
|
||||||
taskVO.setChildren(
|
taskVO.setChildren(
|
||||||
CollectionUtils.convertList(childTasks, childTask -> {
|
convertList(childTasks, childTask -> {
|
||||||
BpmTaskRespVO childTaskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
|
BpmTaskRespVO childTaskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
|
||||||
childTaskVO.setStatus(FlowableUtils.getTaskStatus(task));
|
childTaskVO.setStatus(FlowableUtils.getTaskStatus(task));
|
||||||
AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(childTask.getAssignee()));
|
AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(childTask.getAssignee()));
|
||||||
if (assignUser != null) {
|
if (assignUser != null) {
|
||||||
childTaskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
|
childTaskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
|
||||||
findAndThen(deptMap, assignUser.getDeptId(), dept -> childTaskVO.getAssigneeUser().setDeptName(dept.getName()));
|
findAndThen(deptMap, assignUser.getDeptId(), dept -> childTaskVO.getAssigneeUser().setDeptName(dept.getName()));
|
||||||
}
|
}
|
||||||
return childTaskVO;
|
return childTaskVO;
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return taskVO;
|
return taskVO;
|
||||||
});
|
});
|
||||||
|
return findFirst(taskList, Objects::nonNull);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user