feat(iwork): 合并流程创建日志和回调日志(iwork统一用印内容)
- 将原 iwork_workflow_log.sql 重命名为 iwork_workflow_log_20260130.sql - 在数据库表中新增回调状态、重试次数、错误信息等字段 - 更新表注释为 iWork 流程日志,表明合并了创建日志和回调日志 - 修改 requestId 字段长度从 64 扩展到 128 - 新增回调相关索引配置 - 删除 IWorkCallbackLogService 相关接口及实现类 - 将 IWorkBizCallbackListener 中的日志服务替换为工作流日志服务 - 在控制器层将回调日志查询统一到工作流日志服务 - 合并 IWorkIntegrationServiceImpl 中的流程日志处理逻辑 - 移除独立的用印流程回调日志实体类 IWorkSealLogDO - 在 IWorkWorkflowLogDO 中增加回调相关字段定义 - 完善工作流日志服务接口和实现类,支持回调状态管理 - 更新流程回调处理逻辑,统一使用工作流日志表进行状态跟踪
This commit is contained in:
@@ -3,10 +3,11 @@ package com.zt.plat.module.system.controller.admin.integration.iwork;
|
||||
import com.zt.plat.framework.common.pojo.CommonResult;
|
||||
import com.zt.plat.framework.tenant.core.aop.TenantIgnore;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.*;
|
||||
import com.zt.plat.module.system.service.integration.iwork.IWorkCallbackLogService;
|
||||
import com.zt.plat.module.system.service.integration.iwork.IWorkIntegrationService;
|
||||
import com.zt.plat.module.system.service.integration.iwork.IWorkOrgRestService;
|
||||
import com.zt.plat.module.system.service.integration.iwork.IWorkSyncService;
|
||||
import com.zt.plat.module.system.service.integration.iwork.IWorkWorkflowLogService;
|
||||
import com.zt.plat.module.system.dal.dataobject.iwork.IWorkWorkflowLogDO;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -37,7 +38,7 @@ public class IWorkIntegrationController {
|
||||
private final IWorkIntegrationService integrationService;
|
||||
private final IWorkOrgRestService orgRestService;
|
||||
private final IWorkSyncService syncService;
|
||||
private final IWorkCallbackLogService callbackLogService;
|
||||
private final IWorkWorkflowLogService workflowLogService;
|
||||
|
||||
@PostMapping("/auth/register")
|
||||
@Operation(summary = "注册 iWork 凭证,获取服务端公钥与 secret")
|
||||
@@ -99,17 +100,17 @@ public class IWorkIntegrationController {
|
||||
|
||||
@PreAuthorize("@ss.hasPermission('system:iwork:log:query')")
|
||||
@PostMapping("/log/page")
|
||||
@Operation(summary = "iWork 回调日志分页查询")
|
||||
@Operation(summary = "iWork 流程日志分页查询")
|
||||
public CommonResult<com.zt.plat.framework.common.pojo.PageResult<IWorkCallbackLogRespVO>> pageLogs(@Valid @RequestBody IWorkCallbackLogPageReqVO reqVO) {
|
||||
com.zt.plat.framework.common.pojo.PageResult<com.zt.plat.module.system.dal.dataobject.iwork.IWorkSealLogDO> page = callbackLogService.page(reqVO);
|
||||
com.zt.plat.framework.common.pojo.PageResult<IWorkWorkflowLogDO> page = workflowLogService.page(reqVO);
|
||||
java.util.List<IWorkCallbackLogRespVO> mapped = new java.util.ArrayList<>();
|
||||
for (com.zt.plat.module.system.dal.dataobject.iwork.IWorkSealLogDO log : page.getList()) {
|
||||
for (IWorkWorkflowLogDO log : page.getList()) {
|
||||
IWorkCallbackLogRespVO vo = new IWorkCallbackLogRespVO();
|
||||
vo.setId(log.getId());
|
||||
vo.setRequestId(log.getRequestId());
|
||||
vo.setBusinessCode(log.getBusinessCode());
|
||||
vo.setBizCallbackKey(log.getBizCallbackKey());
|
||||
vo.setStatus(log.getStatus());
|
||||
vo.setStatus(log.getCallbackStatus());
|
||||
vo.setRetryCount(log.getRetryCount());
|
||||
vo.setMaxRetry(log.getMaxRetry());
|
||||
vo.setLastErrorMessage(log.getLastErrorMessage());
|
||||
@@ -126,7 +127,7 @@ public class IWorkIntegrationController {
|
||||
@PostMapping("/log/retry")
|
||||
@Operation(summary = "iWork 回调手工重试")
|
||||
public CommonResult<Boolean> retry(@Valid @RequestBody IWorkWorkflowVoidReqVO reqVO) {
|
||||
callbackLogService.resetAndDispatch(reqVO.getRequestId());
|
||||
workflowLogService.resetAndDispatch(reqVO.getRequestId());
|
||||
return success(true);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
package com.zt.plat.module.system.controller.admin.integration.iwork.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import lombok.Data;
|
||||
|
||||
@Schema(description = "iWork 流程回调请求")
|
||||
@Data
|
||||
public class IWorkWorkflowCallbackReqVO {
|
||||
|
||||
@Schema(description = "iWork requestId,唯一标识", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||
@NotBlank(message = "requestId 不能为空")
|
||||
private String requestId;
|
||||
|
||||
@Schema(description = "业务单号 (ywxtdjbh)")
|
||||
private String businessCode;
|
||||
|
||||
@Schema(description = "业务回调标识 bizCallbackKey")
|
||||
private String bizCallbackKey;
|
||||
|
||||
@Schema(description = "回调状态/结果码")
|
||||
private String status;
|
||||
|
||||
@Schema(description = "原始回调文本(可截断存储)")
|
||||
private String rawBody;
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
package com.zt.plat.module.system.dal.dataobject.iwork;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.IdType;
|
||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||
import com.baomidou.mybatisplus.annotation.TableId;
|
||||
import com.baomidou.mybatisplus.annotation.TableName;
|
||||
import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* iWork 用印流程回调日志。
|
||||
*/
|
||||
@TableName("system_iwork_seal_log")
|
||||
@KeySequence("system_iwork_seal_log_seq")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class IWorkSealLogDO extends BaseDO {
|
||||
|
||||
@TableId(type = IdType.ASSIGN_ID)
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* iWork 返回的请求编号,唯一业务标识。
|
||||
*/
|
||||
private String requestId;
|
||||
|
||||
/**
|
||||
* 业务单号(ywxtdjbh)。
|
||||
*/
|
||||
private String businessCode;
|
||||
|
||||
/**
|
||||
* 业务回调标识。
|
||||
*/
|
||||
private String bizCallbackKey;
|
||||
|
||||
/**
|
||||
* 状态枚举,参考 IWorkCallbackStatusEnum。
|
||||
*/
|
||||
private Integer status;
|
||||
|
||||
/**
|
||||
* 已执行的自动/手工重试次数。
|
||||
*/
|
||||
private Integer retryCount;
|
||||
|
||||
/**
|
||||
* 最大重试次数(快照)。
|
||||
*/
|
||||
private Integer maxRetry;
|
||||
|
||||
/**
|
||||
* 最后一次错误信息。
|
||||
*/
|
||||
private String lastErrorMessage;
|
||||
|
||||
/**
|
||||
* 回调原始负载(截断)。
|
||||
*/
|
||||
private String rawCallback;
|
||||
|
||||
/**
|
||||
* 最近一次回调时间。
|
||||
*/
|
||||
private LocalDateTime lastCallbackTime;
|
||||
|
||||
}
|
||||
@@ -9,9 +9,11 @@ import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
import lombok.ToString;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* iWork 流程创建日志。
|
||||
* 用于记录流程创建时的关键信息,供回调时查询使用。
|
||||
* iWork 流程日志。
|
||||
* 合并了流程创建日志和回调日志,记录完整的流程生命周期。
|
||||
*/
|
||||
@TableName("system_iwork_workflow_log")
|
||||
@KeySequence("system_iwork_workflow_log_seq")
|
||||
@@ -24,27 +26,27 @@ public class IWorkWorkflowLogDO extends BaseDO {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* iWork 返回的请求编号,唯一业务标识。
|
||||
* iWork 请求编号,唯一业务标识
|
||||
*/
|
||||
private String requestId;
|
||||
|
||||
/**
|
||||
* 流程模板 ID。
|
||||
* 流程模板 ID
|
||||
*/
|
||||
private Long workflowId;
|
||||
|
||||
/**
|
||||
* 业务编码(用于关联业务数据)。
|
||||
* 业务编码(用于关联业务数据)
|
||||
*/
|
||||
private String businessCode;
|
||||
|
||||
/**
|
||||
* 业务回调标识(用于 MQ 消息路由)。
|
||||
* 业务回调标识(用于 MQ 消息路由)
|
||||
*/
|
||||
private String bizCallbackKey;
|
||||
|
||||
/**
|
||||
* 创建请求的原始参数(JSON 格式,截断存储)。
|
||||
* 创建请求的原始参数(JSON 格式,截断存储)
|
||||
*/
|
||||
private String rawRequest;
|
||||
|
||||
@@ -52,4 +54,36 @@ public class IWorkWorkflowLogDO extends BaseDO {
|
||||
* 流程状态:CREATED-已创建, CALLBACK_RECEIVED-已收到回调, COMPLETED-已完成
|
||||
*/
|
||||
private String status;
|
||||
|
||||
// ========== 回调相关字段 ==========
|
||||
|
||||
/**
|
||||
* 回调处理状态:1-待处理, 2-处理中, 3-成功, 4-重试中, 5-失败
|
||||
*/
|
||||
private Integer callbackStatus;
|
||||
|
||||
/**
|
||||
* 已重试次数
|
||||
*/
|
||||
private Integer retryCount;
|
||||
|
||||
/**
|
||||
* 最大重试次数
|
||||
*/
|
||||
private Integer maxRetry;
|
||||
|
||||
/**
|
||||
* 最后错误信息
|
||||
*/
|
||||
private String lastErrorMessage;
|
||||
|
||||
/**
|
||||
* 回调原文(JSON 格式,截断存储)
|
||||
*/
|
||||
private String rawCallback;
|
||||
|
||||
/**
|
||||
* 最近回调时间
|
||||
*/
|
||||
private LocalDateTime lastCallbackTime;
|
||||
}
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
package com.zt.plat.module.system.dal.mysql.iwork;
|
||||
|
||||
import com.zt.plat.framework.common.pojo.PageResult;
|
||||
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkCallbackLogPageReqVO;
|
||||
import com.zt.plat.module.system.dal.dataobject.iwork.IWorkSealLogDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface IWorkSealLogMapper extends BaseMapperX<IWorkSealLogDO> {
|
||||
|
||||
default IWorkSealLogDO selectByRequestId(String requestId) {
|
||||
return selectOne(IWorkSealLogDO::getRequestId, requestId);
|
||||
}
|
||||
|
||||
default PageResult<IWorkSealLogDO> selectPage(IWorkCallbackLogPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<IWorkSealLogDO>()
|
||||
.eqIfPresent(IWorkSealLogDO::getRequestId, reqVO.getRequestId())
|
||||
.eqIfPresent(IWorkSealLogDO::getBusinessCode, reqVO.getBusinessCode())
|
||||
.eqIfPresent(IWorkSealLogDO::getBizCallbackKey, reqVO.getBizCallbackKey())
|
||||
.eqIfPresent(IWorkSealLogDO::getStatus, reqVO.getStatus())
|
||||
.betweenIfPresent(IWorkSealLogDO::getCreateTime, reqVO.getCreateTime())
|
||||
.betweenIfPresent(IWorkSealLogDO::getLastCallbackTime, reqVO.getLastCallbackTime())
|
||||
.orderByDesc(IWorkSealLogDO::getId));
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,9 @@
|
||||
package com.zt.plat.module.system.dal.mysql.iwork;
|
||||
|
||||
import com.zt.plat.framework.common.pojo.PageResult;
|
||||
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkCallbackLogPageReqVO;
|
||||
import com.zt.plat.module.system.dal.dataobject.iwork.IWorkWorkflowLogDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@@ -10,4 +13,15 @@ public interface IWorkWorkflowLogMapper extends BaseMapperX<IWorkWorkflowLogDO>
|
||||
default IWorkWorkflowLogDO selectByRequestId(String requestId) {
|
||||
return selectOne(IWorkWorkflowLogDO::getRequestId, requestId);
|
||||
}
|
||||
|
||||
default PageResult<IWorkWorkflowLogDO> selectPage(IWorkCallbackLogPageReqVO reqVO) {
|
||||
return selectPage(reqVO, new LambdaQueryWrapperX<IWorkWorkflowLogDO>()
|
||||
.eqIfPresent(IWorkWorkflowLogDO::getRequestId, reqVO.getRequestId())
|
||||
.eqIfPresent(IWorkWorkflowLogDO::getBusinessCode, reqVO.getBusinessCode())
|
||||
.eqIfPresent(IWorkWorkflowLogDO::getBizCallbackKey, reqVO.getBizCallbackKey())
|
||||
.eqIfPresent(IWorkWorkflowLogDO::getCallbackStatus, reqVO.getStatus())
|
||||
.betweenIfPresent(IWorkWorkflowLogDO::getCreateTime, reqVO.getCreateTime())
|
||||
.betweenIfPresent(IWorkWorkflowLogDO::getLastCallbackTime, reqVO.getLastCallbackTime())
|
||||
.orderByDesc(IWorkWorkflowLogDO::getId));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
package com.zt.plat.module.system.mq.iwork;
|
||||
|
||||
import com.zt.plat.module.system.framework.integration.iwork.config.IWorkProperties;
|
||||
import com.zt.plat.module.system.service.integration.iwork.IWorkCallbackLogService;
|
||||
import com.zt.plat.module.system.mq.iwork.IWorkBizCallbackMessage;
|
||||
import com.zt.plat.module.system.mq.iwork.IWorkBizCallbackResultMessage;
|
||||
import com.zt.plat.module.system.service.integration.iwork.IWorkWorkflowLogService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||
@@ -24,7 +22,7 @@ import java.util.concurrent.TimeUnit;
|
||||
@RocketMQMessageListener(topic = IWorkBizCallbackResultMessage.TOPIC, consumerGroup = IWorkBizCallbackResultMessage.TOPIC + "_CONSUMER")
|
||||
public class IWorkBizCallbackListener implements RocketMQListener<IWorkBizCallbackResultMessage>, InitializingBean {
|
||||
|
||||
private final IWorkCallbackLogService logService;
|
||||
private final IWorkWorkflowLogService workflowLogService;
|
||||
private final IWorkProperties properties;
|
||||
private final IWorkBizCallbackProducer producer;
|
||||
private ScheduledExecutorService scheduler;
|
||||
@@ -38,16 +36,16 @@ public class IWorkBizCallbackListener implements RocketMQListener<IWorkBizCallba
|
||||
public void onMessage(IWorkBizCallbackResultMessage message) {
|
||||
String key = message.getBizCallbackKey();
|
||||
if (message.isSuccess()) {
|
||||
logService.markSuccess(message.getRequestId());
|
||||
workflowLogService.markCallbackSuccess(message.getRequestId());
|
||||
return;
|
||||
}
|
||||
|
||||
int attempt = message.getAttempt() + 1;
|
||||
logService.incrementRetry(message.getRequestId());
|
||||
workflowLogService.incrementRetry(message.getRequestId());
|
||||
int maxAttempts = message.getMaxAttempts() > 0 ? message.getMaxAttempts() : properties.getCallback().getRetry().getMaxAttempts();
|
||||
|
||||
if (attempt < maxAttempts) {
|
||||
logService.markFailure(message.getRequestId(), message.getErrorMessage(), true, maxAttempts);
|
||||
workflowLogService.markCallbackFailure(message.getRequestId(), message.getErrorMessage(), true, maxAttempts);
|
||||
|
||||
IWorkBizCallbackMessage next = IWorkBizCallbackMessage.builder()
|
||||
.requestId(message.getRequestId())
|
||||
@@ -60,7 +58,7 @@ public class IWorkBizCallbackListener implements RocketMQListener<IWorkBizCallba
|
||||
int delay = properties.getCallback().getRetry().getDelaySeconds();
|
||||
scheduler.schedule(() -> producer.send(next), delay, TimeUnit.SECONDS);
|
||||
} else {
|
||||
logService.markFailure(message.getRequestId(), message.getErrorMessage(), false, maxAttempts);
|
||||
workflowLogService.markCallbackFailure(message.getRequestId(), message.getErrorMessage(), false, maxAttempts);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
package com.zt.plat.module.system.service.integration.iwork;
|
||||
|
||||
import com.zt.plat.framework.common.pojo.PageResult;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkCallbackLogPageReqVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkWorkflowCallbackReqVO;
|
||||
import com.zt.plat.module.system.dal.dataobject.iwork.IWorkSealLogDO;
|
||||
|
||||
public interface IWorkCallbackLogService {
|
||||
|
||||
IWorkSealLogDO upsertOnCallback(IWorkWorkflowCallbackReqVO reqVO, int maxRetry, String rawBody);
|
||||
|
||||
void markSuccess(String requestId);
|
||||
|
||||
void markFailure(String requestId, String error, boolean retrying, int maxRetry);
|
||||
|
||||
void incrementRetry(String requestId);
|
||||
|
||||
PageResult<IWorkSealLogDO> page(IWorkCallbackLogPageReqVO reqVO);
|
||||
|
||||
void resetAndDispatch(String requestId);
|
||||
}
|
||||
@@ -1,9 +1,11 @@
|
||||
package com.zt.plat.module.system.service.integration.iwork;
|
||||
|
||||
import com.zt.plat.framework.common.pojo.PageResult;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkCallbackLogPageReqVO;
|
||||
import com.zt.plat.module.system.dal.dataobject.iwork.IWorkWorkflowLogDO;
|
||||
|
||||
/**
|
||||
* iWork 流程创建日志 Service
|
||||
* iWork 流程日志 Service
|
||||
*/
|
||||
public interface IWorkWorkflowLogService {
|
||||
|
||||
@@ -13,7 +15,7 @@ public interface IWorkWorkflowLogService {
|
||||
void saveWorkflowLog(IWorkWorkflowLogDO logDO);
|
||||
|
||||
/**
|
||||
* 根据 requestId 查询流程创建日志
|
||||
* 根据 requestId 查询流程日志
|
||||
*/
|
||||
IWorkWorkflowLogDO getByRequestId(String requestId);
|
||||
|
||||
@@ -21,4 +23,36 @@ public interface IWorkWorkflowLogService {
|
||||
* 更新流程状态
|
||||
*/
|
||||
void updateStatus(String requestId, String status);
|
||||
|
||||
// ========== 回调相关方法 ==========
|
||||
|
||||
/**
|
||||
* 更新回调信息(收到回调时调用)
|
||||
*/
|
||||
void updateCallback(String requestId, String rawCallback, int maxRetry);
|
||||
|
||||
/**
|
||||
* 标记回调成功
|
||||
*/
|
||||
void markCallbackSuccess(String requestId);
|
||||
|
||||
/**
|
||||
* 标记回调失败
|
||||
*/
|
||||
void markCallbackFailure(String requestId, String errorMessage, boolean retrying, int maxRetry);
|
||||
|
||||
/**
|
||||
* 增加重试次数
|
||||
*/
|
||||
void incrementRetry(String requestId);
|
||||
|
||||
/**
|
||||
* 分页查询流程日志
|
||||
*/
|
||||
PageResult<IWorkWorkflowLogDO> page(IWorkCallbackLogPageReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 重置并重新派发回调
|
||||
*/
|
||||
void resetAndDispatch(String requestId);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user