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:
wuzongyong
2026-01-30 10:06:45 +08:00
parent 2b2460a143
commit 399875bc77
16 changed files with 243 additions and 436 deletions

View File

@@ -1,12 +1,19 @@
-- iWork 流程创建日志表(达梦数据库)
-- iWork 流程日志表(达梦数据库)
-- 合并了流程创建日志和回调日志
CREATE TABLE system_iwork_workflow_log (
id BIGINT NOT NULL,
request_id VARCHAR(64) NOT NULL,
request_id VARCHAR(128) NOT NULL,
workflow_id BIGINT,
business_code VARCHAR(128),
biz_callback_key VARCHAR(255),
raw_request VARCHAR(2000),
status VARCHAR(32),
callback_status INTEGER,
retry_count INTEGER DEFAULT 0,
max_retry INTEGER,
last_error_message VARCHAR(512),
raw_callback VARCHAR(2000),
last_callback_time TIMESTAMP,
creator VARCHAR(64) DEFAULT '',
create_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updater VARCHAR(64) DEFAULT '',
@@ -17,14 +24,20 @@ CREATE TABLE system_iwork_workflow_log (
);
-- 添加注释
COMMENT ON TABLE system_iwork_workflow_log IS 'iWork 流程创建日志';
COMMENT ON TABLE system_iwork_workflow_log IS 'iWork 流程日志';
COMMENT ON COLUMN system_iwork_workflow_log.id IS '主键';
COMMENT ON COLUMN system_iwork_workflow_log.request_id IS 'iWork 返回的请求编号';
COMMENT ON COLUMN system_iwork_workflow_log.request_id IS 'iWork 请求编号';
COMMENT ON COLUMN system_iwork_workflow_log.workflow_id IS '流程模板 ID';
COMMENT ON COLUMN system_iwork_workflow_log.business_code IS '业务编码';
COMMENT ON COLUMN system_iwork_workflow_log.biz_callback_key IS '业务回调标识';
COMMENT ON COLUMN system_iwork_workflow_log.raw_request IS '创建请求原始参数';
COMMENT ON COLUMN system_iwork_workflow_log.raw_request IS '创建请求原';
COMMENT ON COLUMN system_iwork_workflow_log.status IS '流程状态';
COMMENT ON COLUMN system_iwork_workflow_log.callback_status IS '回调处理状态';
COMMENT ON COLUMN system_iwork_workflow_log.retry_count IS '已重试次数';
COMMENT ON COLUMN system_iwork_workflow_log.max_retry IS '最大重试次数';
COMMENT ON COLUMN system_iwork_workflow_log.last_error_message IS '最后错误信息';
COMMENT ON COLUMN system_iwork_workflow_log.raw_callback IS '回调原文';
COMMENT ON COLUMN system_iwork_workflow_log.last_callback_time IS '最近回调时间';
COMMENT ON COLUMN system_iwork_workflow_log.creator IS '创建者';
COMMENT ON COLUMN system_iwork_workflow_log.create_time IS '创建时间';
COMMENT ON COLUMN system_iwork_workflow_log.updater IS '更新者';
@@ -33,6 +46,8 @@ COMMENT ON COLUMN system_iwork_workflow_log.deleted IS '是否删除';
COMMENT ON COLUMN system_iwork_workflow_log.tenant_id IS '租户编号';
-- 创建唯一索引
CREATE UNIQUE INDEX uk_request_id ON system_iwork_workflow_log(request_id);
CREATE UNIQUE INDEX uk_iwork_workflow_log_request_id ON system_iwork_workflow_log(request_id);
-- 创建普通索引
-- CREATE INDEX idx_iwork_workflow_log_business_code ON system_iwork_workflow_log(business_code);
-- CREATE INDEX idx_iwork_workflow_log_biz_callback_key ON system_iwork_workflow_log(biz_callback_key);

View File

@@ -1,43 +0,0 @@
-- iWork 用印回调日志DM8
-- 表system_iwork_seal_log
-- 序列system_iwork_seal_log_seq
-- 清理旧对象(若存在)
DROP TABLE IF EXISTS system_iwork_seal_log;
CREATE TABLE system_iwork_seal_log (
id BIGINT NOT NULL,
request_id VARCHAR(128) NOT NULL,
business_code VARCHAR(128),
biz_callback_key VARCHAR(255),
status INTEGER,
retry_count INTEGER DEFAULT 0,
max_retry INTEGER,
last_error_message VARCHAR(512),
raw_callback VARCHAR(2000),
last_callback_time DATETIME,
creator VARCHAR(64),
create_time DATETIME DEFAULT SYSDATE,
updater VARCHAR(64),
update_time DATETIME DEFAULT SYSDATE,
deleted SMALLINT DEFAULT 0 NOT NULL,
PRIMARY KEY (id),
UNIQUE (request_id)
);
COMMENT ON TABLE system_iwork_seal_log IS 'iWork 用印回调日志';
COMMENT ON COLUMN system_iwork_seal_log.id IS '主键';
COMMENT ON COLUMN system_iwork_seal_log.request_id IS 'iWork requestId 唯一标识';
COMMENT ON COLUMN system_iwork_seal_log.business_code IS '业务单号';
COMMENT ON COLUMN system_iwork_seal_log.biz_callback_key IS '业务回调标识';
COMMENT ON COLUMN system_iwork_seal_log.status IS '状态枚举';
COMMENT ON COLUMN system_iwork_seal_log.retry_count IS '已重试次数';
COMMENT ON COLUMN system_iwork_seal_log.max_retry IS '最大重试次数快照';
COMMENT ON COLUMN system_iwork_seal_log.last_error_message IS '最后错误信息';
COMMENT ON COLUMN system_iwork_seal_log.raw_callback IS '回调原文截断';
COMMENT ON COLUMN system_iwork_seal_log.last_callback_time IS '最近回调时间';
COMMENT ON COLUMN system_iwork_seal_log.creator IS '创建者';
COMMENT ON COLUMN system_iwork_seal_log.create_time IS '创建时间';
COMMENT ON COLUMN system_iwork_seal_log.updater IS '更新者';
COMMENT ON COLUMN system_iwork_seal_log.update_time IS '最后更新时间';
COMMENT ON COLUMN system_iwork_seal_log.deleted IS '是否删除';

View File

@@ -229,7 +229,6 @@ zt:
- system_seq_dtl
- system_seq_rcd
- system_sync_log
- system_iwork_seal_log
ignore-caches:
- user_role_ids
- permission_menu_ids

View File

@@ -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);
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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));
}
}

View File

@@ -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));
}
}

View File

@@ -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);
}
}
}

Some files were not shown because too many files have changed in this diff Show More