Merge branch 'feature/REQ-4586' into dev

This commit is contained in:
wangli 2025-07-08 10:31:44 +08:00
commit 8f451a5a2a
9 changed files with 165 additions and 5 deletions

View File

@ -5,6 +5,7 @@ import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.model.dto.SignFileDTO;
import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
@ -27,6 +28,7 @@ import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAd
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
import cn.axzo.workflow.common.model.response.bpmn.process.doc.DocPendingVO;
@ -329,4 +331,16 @@ public interface ProcessInstanceApi {
@GetMapping("/api/process/instance/final/docs")
@InvokeMode(SYNC)
CommonResponse<List<SignFileDTO>> getProcessInstanceFinalDocs(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId);
/**
* 查询 ExtAxProcessLog 表中审批人的冗余信息
*
* @param dto
* @return
*/
@Operation(summary = "查询 ExtAxProcessLog 表中审批人的冗余信息")
@GetMapping("/api/process/instance/log/approve/ext")
@Manageable
@InvokeMode(SYNC)
CommonResponse<List<ExtProcessLogVO>> getProcessLogByInstanceIdAndPersonId(@Validated @RequestBody LogApproveSearchDTO dto);
}

View File

@ -3,6 +3,7 @@ package cn.axzo.workflow.client.feign.bpmn;
import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient;
import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnNodeBackSystemOperateDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnOptionalNodeDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.BpmnRobotTaskCompleteDTO;
@ -108,6 +109,7 @@ public interface ProcessTaskApi {
/**
* 用于系统内部操作跳转到指定节点
*
* @param dto 请求参数
* @return 是否成功
*/
@ -177,7 +179,7 @@ public interface ProcessTaskApi {
@PostMapping("/api/process/task/countersign")
CommonResponse<Boolean> countersignTask(@Validated @RequestBody BpmnTaskCountersignDTO dto);
/**
/**
* 重置节点审批人提级审批
*
* @param dto

View File

@ -32,6 +32,7 @@ public enum BpmnInstanceRespCode implements IModuleRespCode {
PROCESS_DOC_ID_NOT_IN_MODEL("017", "当前流程中,不存在指定文档"),
PROCESS_SIGN_DATA_NOT_EXISTS("018", "签署业务审批未获取到初始模板复制数据"),
PROCESS_INSTANCE_CANT_REMIND("019", "流程实例【{}】不存在, 不能评论"),
PROCESS_EXT_LOG_PARAM_ERROR("020", "查询流程日志的审批人PersonId参数不合法"),
;
private final String code;
private final String message;

View File

@ -7,7 +7,6 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.List;
/**
* 审批人员的组织架构信息
@ -29,12 +28,12 @@ public class OrgStructureSnapshotInfo implements Serializable {
private String personName;
/**
* 头像
* 头像(仅为审批任务被接受那一刻的电话不可作为对外展示数据)
*/
private String avatarUrl;
/**
* 手机号
* 手机号(仅为审批任务被接受那一刻的电话不可作为对外展示数据)
*/
private String phone;
@ -49,7 +48,7 @@ public class OrgStructureSnapshotInfo implements Serializable {
private int workspaceType;
/**
* 项目快照信息
* 组织快照信息
*/
private OrgSnapshotInfo snapshotInfo;

View File

@ -0,0 +1,36 @@
package cn.axzo.workflow.common.model.request.bpmn.log;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
/**
* 用于查询审批日志的人的模型
*
* @author wangli
* @since 2025-07-07 19:40
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LogApproveSearchDTO {
@NotBlank(message = "流程实例 ID 不能为空")
private String processInstanceId;
@NotBlank(message = "审批人 personId 不能为空")
private String personId;
@NotBlank(message = "审批人 tenantId 不能为空")
private String tenantId;
@NotBlank(message = "审批人 ouId 不能为空")
private String ouId;
@ApiModelProperty("指定状态,如果为空,默认指定审批中状态的数据")
private BpmnProcessInstanceResultEnum status;
}

View File

@ -0,0 +1,53 @@
package cn.axzo.workflow.common.model.response.bpmn.process;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.model.dto.OrgStructureSnapshotInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 审批扩展日志表的响应模型
*
* @author wangli
* @since 2025-07-08 10:09
*/
@ApiModel("流程实例日志表响应模型")
@Data
public class ExtProcessLogVO {
@ApiModelProperty("日志表主键 ID")
private Long id;
@ApiModelProperty("流程实例 ID")
private String processInstanceId;
@ApiModelProperty("流程归属的租户 ID工作台 ID")
private String processTenantId;
@ApiModelProperty("审批节点 ID")
private String activityId;
@ApiModelProperty("审批节点名称")
private String activityName;
@ApiModelProperty("审批任务 ID")
private String taskId;
@ApiModelProperty("审批人自然人 ID")
private String assigneePersonId;
@ApiModelProperty("审批人租户 ID工作台 ID")
private String assigneeTenantId;
@ApiModelProperty("审批人姓名")
private String assigneeName;
@ApiModelProperty("审批人单位 ID")
private String assigneeOuId;
@ApiModelProperty("日志的处理状态")
private BpmnProcessInstanceResultEnum status;
@ApiModelProperty("审批人在接受到审批任务时的组织快照信息")
private OrgStructureSnapshotInfo orgStructureSnapshotInfo;
}

View File

@ -114,6 +114,10 @@ public class ExtAxProcessLogServiceImpl implements ExtAxProcessLogService {
.eq(StringUtils.hasText(log.getActivityName()), ExtAxProcessLog::getActivityName, log.getActivityName())
.eq(StringUtils.hasText(log.getTaskId()), ExtAxProcessLog::getTaskId, log.getTaskId())
.eq(StringUtils.hasText(log.getTenantId()), ExtAxProcessLog::getTenantId, log.getTenantId())
.eq(StringUtils.hasText(log.getStatus()), ExtAxProcessLog::getStatus, log.getStatus())
.eq(Objects.nonNull(log.getAssigneeId()), ExtAxProcessLog::getAssigneeId, log.getAssigneeId())
.eq(StringUtils.hasText(log.getAssigneeTenantId()), ExtAxProcessLog::getAssigneeTenantId, log.getAssigneeTenantId())
.eq(StringUtils.hasText(log.getAssigneeOuId()), ExtAxProcessLog::getAssigneeOuId, log.getAssigneeOuId())
.eq(ExtAxProcessLog::getIsDelete, log.getIsDelete());
}
}

View File

@ -5,9 +5,11 @@ import cn.axzo.oss.http.api.ServerFileServiceApi;
import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
import cn.axzo.oss.http.model.ApiSignUrlDownloadResponse;
import cn.axzo.workflow.client.feign.bpmn.ProcessInstanceApi;
import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum;
import cn.axzo.workflow.common.exception.WorkflowEngineException;
import cn.axzo.workflow.common.model.dto.SignFileDTO;
import cn.axzo.workflow.common.model.dto.SimpleDocDTO;
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BeforeProcessInstanceCreateDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO;
import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAdminPageReqVO;
@ -33,6 +35,7 @@ import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceAd
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstancePageItemVO;
import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ExtProcessLogVO;
import cn.axzo.workflow.common.model.response.bpmn.process.HistoricProcessInstanceVO;
import cn.axzo.workflow.common.model.response.bpmn.process.NodesByModelVO;
import cn.axzo.workflow.common.model.response.bpmn.process.ProcessNodeDetailVO;
@ -41,9 +44,11 @@ import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskButtonVo;
import cn.axzo.workflow.common.model.response.bpmn.task.BpmnTaskInstanceLogVO;
import cn.axzo.workflow.common.valid.group.ValidGroup;
import cn.axzo.workflow.core.engine.cmd.CustomGetModelDocsCmd;
import cn.axzo.workflow.core.repository.entity.ExtAxProcessLog;
import cn.axzo.workflow.core.repository.mapper.ExtAxModelDocMapper;
import cn.axzo.workflow.core.service.BpmnProcessInstanceService;
import cn.axzo.workflow.core.service.BpmnProcessTaskService;
import cn.axzo.workflow.core.service.ExtAxProcessLogService;
import cn.axzo.workflow.core.service.ExtAxProcessSignService;
import cn.axzo.workflow.core.service.ExtAxReModelService;
import cn.axzo.workflow.core.service.ExtAxReadRecordService;
@ -52,6 +57,7 @@ import cn.axzo.workflow.server.common.annotation.RepeatSubmit;
import cn.axzo.workflow.server.common.util.RpcExternalUtil;
import cn.axzo.workflow.server.controller.web.BasicPopulateAvatarController;
import cn.azxo.framework.common.model.CommonResponse;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.databind.node.ObjectNode;
import io.swagger.v3.oas.annotations.Operation;
@ -86,6 +92,7 @@ import java.util.stream.Stream;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_DOC_ID_NOT_IN_MODEL;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_DOC_READ_PARAM_ERROR;
import static cn.axzo.workflow.common.code.BpmnInstanceRespCode.PROCESS_EXT_LOG_PARAM_ERROR;
import static cn.azxo.framework.common.model.CommonResponse.success;
/**
@ -116,6 +123,8 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
private ExtAxProcessSignService extAxProcessSignService;
@Resource
private ExtAxReModelService extAxReModelService;
@Resource
private ExtAxProcessLogService extAxProcessLogService;
/**
* 超管查询所有流程实例
@ -527,4 +536,42 @@ public class BpmnProcessInstanceController extends BasicPopulateAvatarController
public CommonResponse<List<SignFileDTO>> getProcessInstanceFinalDocs(@NotBlank(message = "流程实例 ID 不能为空") @RequestParam(required = false) String processInstanceId) {
return success(extAxProcessSignService.findByProcessInstanceId(processInstanceId).getFileArchive());
}
/**
* 查询 ExtAxProcessLog 表中审批人的冗余信息
*
* @param dto
* @return
*/
@Operation(summary = "查询 ExtAxProcessLog 表中审批人的冗余信息")
@GetMapping("/log/approve/ext")
@Override
public CommonResponse<List<ExtProcessLogVO>> getProcessLogByInstanceIdAndPersonId(@Validated @RequestBody LogApproveSearchDTO dto) {
if (NumberUtil.isLong(dto.getPersonId())) {
throw new WorkflowEngineException(PROCESS_EXT_LOG_PARAM_ERROR);
}
ExtAxProcessLog query = new ExtAxProcessLog();
query.setProcessInstanceId(dto.getProcessInstanceId());
query.setAssigneeId(Long.valueOf(dto.getPersonId()));
query.setAssigneeTenantId(dto.getTenantId());
query.setAssigneeOuId(dto.getOuId());
query.setStatus(BpmnProcessInstanceResultEnum.PROCESSING.getStatus());
List<ExtAxProcessLog> extAxProcessLogs = extAxProcessLogService.genericQuery(query);
return success(ListUtils.emptyIfNull(extAxProcessLogs).stream().map(i -> {
ExtProcessLogVO logVO = new ExtProcessLogVO();
logVO.setId(i.getId());
logVO.setProcessInstanceId(i.getProcessInstanceId());
logVO.setProcessTenantId(i.getTenantId());
logVO.setActivityId(i.getActivityId());
logVO.setActivityName(i.getActivityName());
logVO.setTaskId(i.getTaskId());
logVO.setAssigneePersonId(String.valueOf(i.getAssigneeId()));
logVO.setAssigneeTenantId(i.getAssigneeTenantId());
logVO.setAssigneeName(i.getAssigneeName());
logVO.setAssigneeOuId(i.getAssigneeOuId());
logVO.setStatus(BpmnProcessInstanceResultEnum.valueOfStatus(i.getStatus()));
logVO.setOrgStructureSnapshotInfo(i.getExtra());
return logVO;
}).collect(Collectors.toList()));
}
}

View File

@ -1,7 +1,10 @@
package cn.axzo.workflow.server.controller.web.bpmn;
import cn.axzo.workflow.client.feign.bpmn.ProcessTaskApi;
import cn.axzo.workflow.common.annotation.InvokeMode;
import cn.axzo.workflow.common.annotation.Manageable;
import cn.axzo.workflow.common.enums.AttachmentTypeEnum;
import cn.axzo.workflow.common.model.request.bpmn.log.LogApproveSearchDTO;
import cn.axzo.workflow.common.model.request.bpmn.task.*;
import cn.axzo.workflow.common.model.response.BpmPageResult;
import cn.axzo.workflow.common.model.response.bpmn.BatchOperationResultVO;
@ -30,6 +33,7 @@ import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC;
import static cn.azxo.framework.common.model.CommonResponse.success;
/**