Merge branch 'dev' into 'test'

Dev

See merge request jygk/dsc!24
This commit is contained in:
朝锦 杨
2026-01-29 00:47:19 +00:00
43 changed files with 1523 additions and 88 deletions

View File

@@ -3,6 +3,7 @@ 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;
@@ -19,6 +20,8 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.security.access.prepost.PreAuthorize;
import static com.zt.plat.framework.common.pojo.CommonResult.success;
/**
* 提供统一 iWork 流程能力的管理端接口。
@@ -34,6 +37,7 @@ public class IWorkIntegrationController {
private final IWorkIntegrationService integrationService;
private final IWorkOrgRestService orgRestService;
private final IWorkSyncService syncService;
private final IWorkCallbackLogService callbackLogService;
@PostMapping("/auth/register")
@Operation(summary = "注册 iWork 凭证,获取服务端公钥与 secret")
@@ -87,6 +91,39 @@ public class IWorkIntegrationController {
return success(integrationService.voidWorkflow(reqVO));
}
@PreAuthorize("@ss.hasPermission('system:iwork:log:query')")
@PostMapping("/log/page")
@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);
java.util.List<IWorkCallbackLogRespVO> mapped = new java.util.ArrayList<>();
for (com.zt.plat.module.system.dal.dataobject.iwork.IWorkSealLogDO 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.setRetryCount(log.getRetryCount());
vo.setMaxRetry(log.getMaxRetry());
vo.setLastErrorMessage(log.getLastErrorMessage());
vo.setRawCallback(log.getRawCallback());
vo.setLastCallbackTime(log.getLastCallbackTime());
vo.setCreateTime(log.getCreateTime());
vo.setUpdateTime(log.getUpdateTime());
mapped.add(vo);
}
return success(new com.zt.plat.framework.common.pojo.PageResult<>(mapped, page.getTotal(), page.getSummary()));
}
@PreAuthorize("@ss.hasPermission('system:iwork:log:retry')")
@PostMapping("/log/retry")
@Operation(summary = "iWork 回调手工重试")
public CommonResult<Boolean> retry(@Valid @RequestBody IWorkWorkflowVoidReqVO reqVO) {
callbackLogService.resetAndDispatch(reqVO.getRequestId());
return success(true);
}
// ----------------- 人力组织接口 -----------------
@PostMapping("/hr/subcompany/page")

View File

@@ -0,0 +1,39 @@
package com.zt.plat.module.system.controller.admin.integration.iwork.vo;
import com.zt.plat.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - iWork 用印回调日志分页查询")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class IWorkCallbackLogPageReqVO extends PageParam {
@Schema(description = "requestId")
private String requestId;
@Schema(description = "业务单号")
private String businessCode;
@Schema(description = "业务回调标识")
private String bizCallbackKey;
@Schema(description = "状态")
private Integer status;
@Schema(description = "创建时间范围")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "最后回调时间范围")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] lastCallbackTime;
}

View File

@@ -0,0 +1,24 @@
package com.zt.plat.module.system.controller.admin.integration.iwork.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "iWork 用印回调日志响应 VO")
@Data
public class IWorkCallbackLogRespVO {
private Long id;
private String requestId;
private String businessCode;
private String bizCallbackKey;
private Integer status;
private Integer retryCount;
private Integer maxRetry;
private String lastErrorMessage;
private String rawCallback;
private LocalDateTime lastCallbackTime;
private LocalDateTime createTime;
private LocalDateTime updateTime;
}

View File

@@ -2,12 +2,21 @@ 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 jakarta.validation.constraints.Size;
import lombok.Data;
@Schema(name = "IWorkFileCallbackReqVO", description = "iWork 文件回调请求 VO")
@Data
public class IWorkFileCallbackReqVO {
@Schema(description = "iWork requestId唯一标识", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "requestId 不能为空")
private String requestId;
@Schema(description = "业务回调标识 bizCallbackKey≤255 字符", example = "seal-flow-callback")
@Size(max = 255, message = "bizCallbackKey 长度不能超过 255 字符")
private String bizCallbackKey;
@Schema(description = "文件下载 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://example.com/file.pdf")
@NotBlank(message = "文件 URL 不能为空")
private String fileUrl;
@@ -19,6 +28,9 @@ public class IWorkFileCallbackReqVO {
@Schema(description = "文件名称,可选", example = "合同附件.pdf")
private String fileName;
@Schema(description = "OA 单点下载使用的 ssoToken可选", example = "6102A7C13F09DD6B1AF06CDA0E479AC8...")
private String ssoToken;
@Schema(description = "业务回调状态/结果码,可选")
private String status;
@Schema(description = "原始回调文本(可选,若不传则使用 payload 或请求体序列化)")
private String rawBody;
}

View File

@@ -14,6 +14,6 @@ public class IWorkOaTokenReqVO {
@NotBlank(message = "loginId 不能为空")
private String loginId;
@Schema(description = "应用 appid未填则使用配置默认", example = "a17ca6ca-88b0-463e-bffa-7995086bf225")
@Schema(description = "应用 appid已固定使用配置值,无需传递", example = "")
private String appId;
}

View File

@@ -0,0 +1,26 @@
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

@@ -34,9 +34,9 @@ public class IWorkWorkflowCreateReqVO extends IWorkBaseReqVO {
@Schema(description = "用印材料附件 URL必填")
private String xyywjUrl;
@Schema(description = "用印材料附件文件名(必填")
private String xyywjFileName;
@Schema(description = "业务回调标识回调分发使用≤255 字符")
private String bizCallbackKey;
@Schema(description = "用印事项")
private String yysx;

View File

@@ -0,0 +1,72 @@
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

@@ -0,0 +1,27 @@
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

@@ -42,6 +42,7 @@ public class IWorkProperties {
private final Client client = new Client();
private final OrgRest org = new OrgRest();
private final Workflow workflow = new Workflow();
private final Callback callback = new Callback();
private final Oa oa = new Oa();
@Data
@@ -127,6 +128,26 @@ public class IWorkProperties {
private String sealWorkflowId;
}
@Data
public static class Callback {
/**
* 业务回调重试配置。
*/
private final Retry retry = new Retry();
}
@Data
public static class Retry {
/**
* 最大重试次数,默认 3。
*/
private int maxAttempts = 3;
/**
* 重试延迟(秒),默认 5。
*/
private int delaySeconds = 5;
}
@Data
public static class Oa {
/**

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