feat(REQ-4418) - 调整任务相关 API,支持使用实例 ID 操作任务

This commit is contained in:
wangli 2025-08-20 18:31:20 +08:00
parent 41a72e2bc2
commit 4542e4814c
6 changed files with 99 additions and 10 deletions

View File

@ -43,6 +43,7 @@ public enum BpmnTaskRespCode implements IModuleRespCode {
TRANSFER_TO_SELF("026", "任务不能转交给自己"),
REMIND_TASK_TOO_MANY("027", "催办任务数据异常"),
PROCESS_SET_ASSIGNEE_PARAM_ERROR("028", "当前审批业务审批人模型中 NodeId 必传topNodeId/nodeId均可, 触发 ID: 【{}】"),
TASK_OPERATION_PARAM_INVALID("029", "流程实例 ID 与任务 ID 必须二选一"),
;
private final String code;

View File

@ -13,7 +13,6 @@ import lombok.NoArgsConstructor;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.util.List;
@ -30,9 +29,20 @@ import java.util.List;
@NoArgsConstructor
@Builder
public class BpmnTaskAuditDTO {
/**
* 流程实例 ID
* <p>
* 与审批任务 ID 二选一
*/
@ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
private String processInstanceId;
/**
* 审批任务 ID
* <p>
* 与流程实例 ID 二选一如果两属性都传则优先使用 taskId
*/
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
@NotEmpty(message = "任务编号不能为空")
private String taskId;
/**

View File

@ -36,10 +36,19 @@ public class BpmnTaskCountersignDTO implements Serializable {
private static final long serialVersionUID = -8106887960942113552L;
/**
* 审批任务ID
* 流程实例 ID
* <p>
* 与审批任务 ID 二选一
*/
@ApiModelProperty(value = "审批任务ID")
@NotEmpty(message = "任务ID不能为空")
@ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
private String processInstanceId;
/**
* 审批任务 ID
* <p>
* 与流程实例 ID 二选一如果两属性都传则优先使用 taskId
*/
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
private String taskId;
/**

View File

@ -32,10 +32,19 @@ public class BpmnTaskResetApproversDTO implements Serializable {
private static final long serialVersionUID = 4570922472032531513L;
/**
* 审批任务ID
* 流程实例 ID
* <p>
* 与审批任务 ID 二选一
*/
@ApiModelProperty(value = "审批任务ID")
@NotEmpty(message = "任务ID不能为空")
@ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
private String processInstanceId;
/**
* 审批任务 ID
* <p>
* 与流程实例 ID 二选一如果两属性都传则优先使用 taskId
*/
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
private String taskId;
/**

View File

@ -31,11 +31,20 @@ public class BpmnTaskTransferDTO implements Serializable {
private static final long serialVersionUID = 8142105892475867826L;
/**
* 流程实例 ID
* <p>
* 与审批任务 ID 二选一
*/
@ApiModelProperty(value = "流程实例编号", required = true, example = "1024")
private String processInstanceId;
/**
* 审批任务 ID
* <p>
* 与流程实例 ID 二选一如果两属性都传则优先使用 taskId
*/
@ApiModelProperty(value = "审批任务 ID")
@NotBlank(message = "任务 ID 不能为空")
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
private String taskId;
/**

View File

@ -1,7 +1,9 @@
package cn.axzo.workflow.server.controller.web.bpmn;
import cn.axzo.workflow.client.feign.bpmn.ProcessTaskApi;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.request.bpmn.task.AttachmentDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
@ -54,6 +56,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.axzo.workflow.common.code.BpmnTaskRespCode.TASK_OPERATION_PARAM_INVALID;
import static cn.azxo.framework.common.model.CommonResponse.success;
/**
@ -75,6 +78,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@Operation(summary = "待审核列表")
@GetMapping("/page/todo")
@Override
@Manageable
public CommonResponse<BpmPageResult<BpmnTaskTodoPageItemVO>> getTodoTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto) {
log.info("待审核列表 getTodoTaskPage===>>>参数:{}", JSON.toJSONString(dto));
return success(bpmnProcessTaskService.getTodoTaskPage(dto));
@ -86,6 +90,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@Operation(summary = "已完成的审批列表")
@GetMapping("/page/done")
@Override
@Manageable
public CommonResponse<BpmPageResult<BpmnTaskDonePageItemVO>> getDoneTaskPage(@Validated @RequestBody BpmnTaskPageSearchDTO dto) {
log.info("已完成的审批列表 getDoneTaskPage===>>>参数:{}", JSON.toJSONString(dto));
return success(bpmnProcessTaskService.getDoneTaskPage(dto));
@ -101,6 +106,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@RepeatSubmit
public CommonResponse<Boolean> approveTask(@Validated @RequestBody BpmnTaskAuditDTO dto) {
log.info("同意 approveTask===>>>参数:{}", JSON.toJSONString(dto));
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
}
if(!StringUtils.hasText(dto.getTaskId())) {
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getApprover().getPersonId()));
}
List<AttachmentDTO> tempAttachments = ListUtils.defaultIfNull(dto.getAttachmentList(), new ArrayList<>());
if (StringUtils.hasText(dto.getSignatureUrl())) {
AttachmentDTO signature = new AttachmentDTO();
@ -121,6 +132,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@RepeatSubmit
public CommonResponse<Boolean> approveTaskWithForm(@Validated @RequestBody BpmnTaskAuditWithFormDTO dto) {
log.info("同意 approveTaskWithForm===>>>参数:{}", JSON.toJSONString(dto));
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
}
if(!StringUtils.hasText(dto.getTaskId())) {
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getApprover().getPersonId()));
}
List<AttachmentDTO> tempAttachments = ListUtils.defaultIfNull(dto.getAttachmentList(), new ArrayList<>());
if (StringUtils.hasText(dto.getSignatureUrl())) {
AttachmentDTO signature = new AttachmentDTO();
@ -176,6 +193,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@Override
public CommonResponse<Boolean> backTask(@Validated @RequestBody BpmnTaskBackAuditDTO dto) {
log.info("回退 backTask===>>>参数:{}", JSON.toJSONString(dto));
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
}
if(!StringUtils.hasText(dto.getTaskId())) {
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getApprover().getPersonId()));
}
populateUsersAvatar(dto.getApprover());
bpmnProcessTaskService.backTask(dto);
return success(true);
@ -203,6 +226,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@RepeatSubmit
public CommonResponse<Boolean> rejectTask(@Validated @RequestBody BpmnTaskAuditDTO dto) {
log.info("驳回 rejectTask===>>>参数:{}", JSON.toJSONString(dto));
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
}
if(!StringUtils.hasText(dto.getTaskId())) {
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getApprover().getPersonId()));
}
populateUsersAvatar(dto.getApprover());
bpmnProcessTaskService.rejectTask(dto);
return success(true);
@ -231,6 +260,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@RepeatSubmit
public CommonResponse<Boolean> transferTask(@Validated @RequestBody BpmnTaskTransferDTO dto) {
log.info("转交任务 transferTask===>>>参数:{}", JSON.toJSONString(dto));
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
}
if(!StringUtils.hasText(dto.getTaskId())) {
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getOriginAssigner().getPersonId()));
}
// 填充头像
populateUsersAvatar(dto.getTargetAssigner());
bpmnProcessTaskService.transferTask(dto);
@ -272,6 +307,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@RepeatSubmit
public CommonResponse<Boolean> countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto) {
log.info("加签任务 countersignTask===>>>参数:{}", JSON.toJSONString(dto));
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
}
if(!StringUtils.hasText(dto.getTaskId())) {
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getOriginAssigner().getPersonId()));
}
// 填充头像
populateUsersAvatar(dto.getOriginAssigner());
populateUsersAvatar(dto.getTargetAssignerList());
@ -281,6 +322,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
/**
* 提级审批
*
* @param dto
* @return
*/
@ -289,6 +331,12 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@PostMapping("/approvers/reset")
@RepeatSubmit
public CommonResponse<Boolean> resetTaskApprovers(@Validated @RequestBody BpmnTaskResetApproversDTO dto) {
if (!StringUtils.hasText(dto.getProcessInstanceId()) && !StringUtils.hasText(dto.getTaskId())) {
throw new WorkflowEngineException(TASK_OPERATION_PARAM_INVALID);
}
if(!StringUtils.hasText(dto.getTaskId())) {
dto.setTaskId(bpmnProcessTaskService.findTaskIdByInstanceIdAndPersonId(dto.getProcessInstanceId(), dto.getOriginAssigner().getPersonId()));
}
populateUsersAvatar(dto.getOriginAssigner());
populateUsersAvatar(dto.getTargetAssignerList());
bpmnProcessTaskService.resetTaskApprovers(dto);
@ -350,6 +398,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@Operation(summary = "获取指定流程实例的审批过程信息(flat)")
@GetMapping("/list/flat")
@Override
@Manageable
public CommonResponse<List<BpmnHistoricTaskInstanceVO>> getTaskListFlatByProcessInstanceId(
@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId) {
@ -365,6 +414,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@Operation(summary = "获取指定流程实例的审批过程信息(group)")
@GetMapping("/list/group")
@Override
@Manageable
public CommonResponse<List<BpmnHistoricTaskInstanceGroupVO>> getTaskListGroupByProcessInstanceId(
@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@Nullable @RequestParam(required = false) String tenantId) {
@ -378,6 +428,7 @@ public class BpmnProcessTaskController extends BasicPopulateAvatarController imp
@Operation(summary = "获取实例正在审核的人列表")
@GetMapping("/active/list")
@Override
@Manageable
public CommonResponse<List<BpmnTaskInstanceVO>> getActiveTasksByProcessInstanceId(
@NotBlank(message = "流程实例 ID 不能为空") @RequestParam String processInstanceId,
@NotBlank(message = "租户不能为空") @RequestParam String tenantId) {