Merge remote-tracking branch 'ztcloud/test' into dev
# Conflicts: # zt-framework/zt-spring-boot-starter-biz-data-permission/src/main/java/com/zt/plat/framework/datapermission/core/rule/dept/DeptDataPermissionRule.java
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ public class DataPermissionConfiguration {
|
||||
rule.addDeptColumn(DeptDO.class, "id");
|
||||
// user
|
||||
rule.addUserColumn(AdminUserDO.class, "id");
|
||||
rule.addUserColumn("system_users_work_code", "workcode");
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user