feat(iwork): 扩展iWork集成功能支持通用流程创建和回调处理
- 添加通用流程创建接口支持透传任意业务参数 - 实现流程创建日志记录功能包括requestId、workflowId等关键信息 - 增强文件回调处理记录日志并发送MQ通知业务系统 - 添加iWork业务回调消息测试消费者用于验证回调机制 - 在模板模块合同详情中增加业务附件列表展示功能 - 更新应用配置忽略缓存新增iWork印章日志表配置项
This commit is contained in:
@@ -1,10 +1,14 @@
|
||||
package com.zt.plat.module.system.mq.iwork;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class IWorkBizCallbackMessage {
|
||||
|
||||
/** 统一回调主题 */
|
||||
|
||||
@@ -229,6 +229,7 @@ zt:
|
||||
- system_seq_dtl
|
||||
- system_seq_rcd
|
||||
- system_sync_log
|
||||
- system_iwork_seal_log
|
||||
ignore-caches:
|
||||
- user_role_ids
|
||||
- permission_menu_ids
|
||||
|
||||
@@ -77,10 +77,16 @@ public class IWorkIntegrationController {
|
||||
return success(integrationService.createWorkflow(reqVO));
|
||||
}
|
||||
|
||||
@PostMapping("/workflow/create-generic")
|
||||
@Operation(summary = "通用流程创建:支持透传任意业务参数和调用不同的 workflowId")
|
||||
public CommonResult<IWorkOperationRespVO> createGenericWorkflow(@Valid @RequestBody IWorkGenericWorkflowCreateReqVO reqVO) {
|
||||
return success(integrationService.createGenericWorkflow(reqVO));
|
||||
}
|
||||
|
||||
@PermitAll
|
||||
@TenantIgnore
|
||||
@PostMapping("/callback/file")
|
||||
@Operation(summary = "iWork 文件回调:根据文件 URL 保存为附件并创建业务附件关联")
|
||||
@Operation(summary = "iWork 文件回调:根据文件 URL 保存为附件并创建业务附件关联,记录日志并发送 MQ 通知业务系统")
|
||||
public CommonResult<Long> callbackFile(@Valid @RequestBody IWorkFileCallbackReqVO reqVO) {
|
||||
return success(integrationService.handleFileCallback(reqVO));
|
||||
}
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.zt.plat.module.system.controller.admin.integration.iwork.vo;
|
||||
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
import jakarta.validation.constraints.NotNull;
|
||||
import lombok.Data;
|
||||
import lombok.EqualsAndHashCode;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 通用 iWork 流程创建请求 VO
|
||||
* <p>
|
||||
* 支持透传任意业务参数,直接将整个 payload 转发给 iWork
|
||||
*/
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Schema(description = "通用 iWork 流程创建请求")
|
||||
public class IWorkGenericWorkflowCreateReqVO extends IWorkBaseReqVO {
|
||||
|
||||
@Schema(description = "流程模板 ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "54")
|
||||
@NotNull(message = "流程模板 ID 不能为空")
|
||||
private Long workflowId;
|
||||
|
||||
@Schema(description = "透传给 iWork 的业务参数,直接作为请求体发送", requiredMode = Schema.RequiredMode.REQUIRED,
|
||||
example = "{\"requestName\":\"用印-DJ-2025-0001\",\"mainData\":[{\"fieldName\":\"jbr\",\"fieldValue\":\"1001\"}]}")
|
||||
@NotNull(message = "业务参数不能为空")
|
||||
private Map<String, Object> payload;
|
||||
|
||||
@Schema(description = "业务编码,用于回调时关联业务数据", example = "DJ-2025-0001")
|
||||
private String ywxtdjbh;
|
||||
|
||||
@Schema(description = "业务回调标识,用于 MQ 消息路由到对应业务消费者", example = "seal-callback")
|
||||
private String bizCallbackKey;
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
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;
|
||||
|
||||
/**
|
||||
* iWork 流程创建日志。
|
||||
* 用于记录流程创建时的关键信息,供回调时查询使用。
|
||||
*/
|
||||
@TableName("system_iwork_workflow_log")
|
||||
@KeySequence("system_iwork_workflow_log_seq")
|
||||
@Data
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@ToString(callSuper = true)
|
||||
public class IWorkWorkflowLogDO extends BaseDO {
|
||||
|
||||
@TableId(type = IdType.ASSIGN_ID)
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* iWork 返回的请求编号,唯一业务标识。
|
||||
*/
|
||||
private String requestId;
|
||||
|
||||
/**
|
||||
* 流程模板 ID。
|
||||
*/
|
||||
private Long workflowId;
|
||||
|
||||
/**
|
||||
* 业务编码(用于关联业务数据)。
|
||||
*/
|
||||
private String businessCode;
|
||||
|
||||
/**
|
||||
* 业务回调标识(用于 MQ 消息路由)。
|
||||
*/
|
||||
private String bizCallbackKey;
|
||||
|
||||
/**
|
||||
* 创建请求的原始参数(JSON 格式,截断存储)。
|
||||
*/
|
||||
private String rawRequest;
|
||||
|
||||
/**
|
||||
* 流程状态:CREATED-已创建, CALLBACK_RECEIVED-已收到回调, COMPLETED-已完成
|
||||
*/
|
||||
private String status;
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.zt.plat.module.system.dal.mysql.iwork;
|
||||
|
||||
import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
|
||||
import com.zt.plat.module.system.dal.dataobject.iwork.IWorkWorkflowLogDO;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
|
||||
@Mapper
|
||||
public interface IWorkWorkflowLogMapper extends BaseMapperX<IWorkWorkflowLogDO> {
|
||||
|
||||
default IWorkWorkflowLogDO selectByRequestId(String requestId) {
|
||||
return selectOne(IWorkWorkflowLogDO::getRequestId, requestId);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.zt.plat.module.system.mq.iwork;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
|
||||
import org.apache.rocketmq.spring.core.RocketMQListener;
|
||||
import org.apache.rocketmq.spring.core.RocketMQTemplate;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* iWork 业务回调消息测试消费者
|
||||
* <p>
|
||||
* 用于测试 IWorkBizCallbackMessage 消息的消费,
|
||||
* 消费成功后会发送 IWorkBizCallbackResultMessage 通知 system 模块。
|
||||
* <p>
|
||||
* 注意:这是一个测试消费者,生产环境应由具体业务模块实现自己的消费者。
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
@RocketMQMessageListener(
|
||||
topic = IWorkBizCallbackMessage.TOPIC,
|
||||
consumerGroup = IWorkBizCallbackMessage.TOPIC + "_ceshi_bz_01",
|
||||
selectorExpression = "ceshi_bz_01" // 只订阅 tag=ceshi_bz_01 的消息
|
||||
)
|
||||
public class IWorkBizCallbackTestConsumer implements RocketMQListener<IWorkBizCallbackMessage> {
|
||||
|
||||
private final RocketMQTemplate rocketMQTemplate;
|
||||
|
||||
@Override
|
||||
public void onMessage(IWorkBizCallbackMessage message) {
|
||||
log.info("[IWorkBizCallbackTestConsumer] 收到回调消息: requestId={}, bizCallbackKey={}, attempt={}/{}",
|
||||
message.getRequestId(),
|
||||
message.getBizCallbackKey(),
|
||||
message.getAttempt(),
|
||||
message.getMaxAttempts());
|
||||
log.info("[IWorkBizCallbackTestConsumer] payload={}", message.getPayload());
|
||||
|
||||
// 模拟业务处理
|
||||
boolean success = processCallback(message);
|
||||
|
||||
// 发送处理结果给 system 模块
|
||||
IWorkBizCallbackResultMessage result = IWorkBizCallbackResultMessage.builder()
|
||||
.requestId(message.getRequestId())
|
||||
.bizCallbackKey(message.getBizCallbackKey())
|
||||
.payload(message.getPayload())
|
||||
.attempt(message.getAttempt())
|
||||
.maxAttempts(message.getMaxAttempts())
|
||||
.success(success)
|
||||
.errorMessage(success ? null : "测试模拟失败")
|
||||
.build();
|
||||
|
||||
log.info("[IWorkBizCallbackTestConsumer] 准备发送结果到 topic={}", IWorkBizCallbackResultMessage.TOPIC);
|
||||
rocketMQTemplate.syncSend(IWorkBizCallbackResultMessage.TOPIC+":123", result);
|
||||
log.info("[IWorkBizCallbackTestConsumer] 已发送处理结果: success={}, requestId={}", success, message.getRequestId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 模拟业务处理逻辑
|
||||
*/
|
||||
private boolean processCallback(IWorkBizCallbackMessage message) {
|
||||
// 随机返回成功或失败,用于测试重试逻辑
|
||||
boolean success = Math.random() > 0.5;
|
||||
log.info("[IWorkBizCallbackTestConsumer] 模拟处理结果: {}", success ? "成功" : "失败");
|
||||
return success;
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkAuth
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkAuthTokenReqVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkAuthTokenRespVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkFileCallbackReqVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkGenericWorkflowCreateReqVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkOperationRespVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkOaCheckTokenReqVO;
|
||||
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkOaRawResponse;
|
||||
@@ -39,6 +40,11 @@ public interface IWorkIntegrationService {
|
||||
*/
|
||||
IWorkOperationRespVO createWorkflow(IWorkWorkflowCreateReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 通用流程创建:支持透传任意业务参数和调用不同的 workflowId
|
||||
*/
|
||||
IWorkOperationRespVO createGenericWorkflow(IWorkGenericWorkflowCreateReqVO reqVO);
|
||||
|
||||
/**
|
||||
* 在 iWork 中对已有流程执行作废或干预。
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.zt.plat.module.system.service.integration.iwork;
|
||||
|
||||
import com.zt.plat.module.system.dal.dataobject.iwork.IWorkWorkflowLogDO;
|
||||
|
||||
/**
|
||||
* iWork 流程创建日志 Service
|
||||
*/
|
||||
public interface IWorkWorkflowLogService {
|
||||
|
||||
/**
|
||||
* 保存流程创建日志
|
||||
*/
|
||||
void saveWorkflowLog(IWorkWorkflowLogDO logDO);
|
||||
|
||||
/**
|
||||
* 根据 requestId 查询流程创建日志
|
||||
*/
|
||||
IWorkWorkflowLogDO getByRequestId(String requestId);
|
||||
|
||||
/**
|
||||
* 更新流程状态
|
||||
*/
|
||||
void updateStatus(String requestId, String status);
|
||||
}
|
||||
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