From 542466270adf37d10cc09771cf86b0bf1003d6ac Mon Sep 17 00:00:00 2001 From: chenbowen Date: Fri, 28 Nov 2025 11:05:09 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E5=A4=8D=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=20sql=20=E4=B8=AD=E5=A4=A7=E5=86=99=E8=A1=A8=E5=90=8D?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=8C=B9=E9=85=8D=E5=88=B0=20mybatis=20?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E7=BC=93=E5=AD=98=E8=A1=A8=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=EF=BC=8C=E5=AF=BC=E8=87=B4=E8=A1=A8=E8=A2=AB=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=E7=A7=9F=E6=88=B7=E7=9A=84=E9=97=AE=E9=A2=98=202.=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20iwork=20feign=20api=20=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/db/TenantDatabaseInterceptor.java | 13 +- .../system/api/iwork/IWorkIntegrationApi.java | 63 ++++++++++ .../iwork/dto/IWorkAuthRegisterReqDTO.java | 18 +++ .../iwork/dto/IWorkAuthRegisterRespDTO.java | 18 +++ .../api/iwork/dto/IWorkAuthTokenReqDTO.java | 15 +++ .../api/iwork/dto/IWorkAuthTokenRespDTO.java | 18 +++ .../dto/IWorkHrDepartmentPageRespDTO.java | 31 +++++ .../iwork/dto/IWorkHrJobTitlePageRespDTO.java | 31 +++++ .../dto/IWorkHrSubcompanyPageRespDTO.java | 31 +++++ .../api/iwork/dto/IWorkHrUserPageRespDTO.java | 31 +++++ .../api/iwork/dto/IWorkOperationRespDTO.java | 21 ++++ .../api/iwork/dto/IWorkOrgPageReqDTO.java | 21 ++++ .../api/iwork/dto/IWorkUserInfoReqDTO.java | 15 +++ .../api/iwork/dto/IWorkUserInfoRespDTO.java | 18 +++ .../iwork/dto/IWorkWorkflowCreateReqDTO.java | 46 ++++++++ .../iwork/dto/IWorkWorkflowVoidReqDTO.java | 21 ++++ .../api/iwork/IWorkIntegrationApiImpl.java | 111 ++++++++++++++++++ .../integration/iwork/vo/IWorkOrgRespVO.java | 15 --- .../iwork/vo/IWorkWorkflowCreateReqVO.java | 6 +- .../iwork/config/IWorkProperties.java | 16 ++- .../impl/IWorkIntegrationServiceImpl.java | 48 +++++++- .../src/main/resources/application.yaml | 3 +- 22 files changed, 580 insertions(+), 30 deletions(-) create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/IWorkIntegrationApi.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthRegisterReqDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthRegisterRespDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthTokenReqDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthTokenRespDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrDepartmentPageRespDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrJobTitlePageRespDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrSubcompanyPageRespDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrUserPageRespDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkOperationRespDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkOrgPageReqDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkUserInfoReqDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkUserInfoRespDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkWorkflowCreateReqDTO.java create mode 100644 zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkWorkflowVoidReqDTO.java create mode 100644 zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/iwork/IWorkIntegrationApiImpl.java delete mode 100644 zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/integration/iwork/vo/IWorkOrgRespVO.java diff --git a/zt-framework/zt-spring-boot-starter-biz-tenant/src/main/java/com/zt/plat/framework/tenant/core/db/TenantDatabaseInterceptor.java b/zt-framework/zt-spring-boot-starter-biz-tenant/src/main/java/com/zt/plat/framework/tenant/core/db/TenantDatabaseInterceptor.java index aeb05653..ac2760fa 100644 --- a/zt-framework/zt-spring-boot-starter-biz-tenant/src/main/java/com/zt/plat/framework/tenant/core/db/TenantDatabaseInterceptor.java +++ b/zt-framework/zt-spring-boot-starter-biz-tenant/src/main/java/com/zt/plat/framework/tenant/core/db/TenantDatabaseInterceptor.java @@ -1,12 +1,12 @@ package com.zt.plat.framework.tenant.core.db; -import com.zt.plat.framework.tenant.config.TenantProperties; -import com.zt.plat.framework.tenant.core.aop.TenantIgnore; -import com.zt.plat.framework.tenant.core.context.TenantContextHolder; import com.baomidou.mybatisplus.core.metadata.TableInfo; import com.baomidou.mybatisplus.core.metadata.TableInfoHelper; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.extension.toolkit.SqlParserUtils; +import com.zt.plat.framework.tenant.config.TenantProperties; +import com.zt.plat.framework.tenant.core.aop.TenantIgnore; +import com.zt.plat.framework.tenant.core.context.TenantContextHolder; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; @@ -69,7 +69,12 @@ public class TenantDatabaseInterceptor implements TenantLineHandler { // 找不到的表,说明不是 zt 项目里的,不进行拦截(忽略租户) TableInfo tableInfo = TableInfoHelper.getTableInfo(tableName); if (tableInfo == null) { - return true; + tableName = tableName.toLowerCase(); + tableInfo = TableInfoHelper.getTableInfo(tableName); + } + if (tableInfo == null) { + tableName = tableName.toLowerCase(); + tableInfo = TableInfoHelper.getTableInfo(tableName); } // 如果继承了 TenantBaseDO 基类,显然不忽略租户 if (TenantBaseDO.class.isAssignableFrom(tableInfo.getEntityType())) { diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/IWorkIntegrationApi.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/IWorkIntegrationApi.java new file mode 100644 index 00000000..9181a071 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/IWorkIntegrationApi.java @@ -0,0 +1,63 @@ +package com.zt.plat.module.system.api.iwork; + +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.module.system.api.iwork.dto.*; +import com.zt.plat.module.system.enums.ApiConstants; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * RPC 服务 - iWork 集成 + */ +@FeignClient(name = ApiConstants.NAME, contextId = "iWorkIntegrationApi") +@Tag(name = "RPC 服务 - iWork 集成") +public interface IWorkIntegrationApi { + + String PREFIX = ApiConstants.PREFIX + "/integration/iwork"; + + // ----------------- 认证 / 会话 ----------------- + + @PostMapping(PREFIX + "/auth/register") + @Operation(summary = "注册 iWork 凭证,获取服务端公钥与 secret") + CommonResult register(@RequestBody IWorkAuthRegisterReqDTO reqDTO); + + @PostMapping(PREFIX + "/auth/token") + @Operation(summary = "申请 iWork Token(独立接口)") + CommonResult acquireToken(@RequestBody IWorkAuthTokenReqDTO reqDTO); + + // ----------------- 流程类能力 ----------------- + + @PostMapping(PREFIX + "/user/resolve") + @Operation(summary = "根据外部标识获取 iWork 用户编号") + CommonResult resolveUser(@RequestBody IWorkUserInfoReqDTO reqDTO); + + @PostMapping(PREFIX + "/workflow/create") + @Operation(summary = "发起 iWork 流程") + CommonResult createWorkflow(@RequestBody IWorkWorkflowCreateReqDTO reqDTO); + + @PostMapping(PREFIX + "/workflow/void") + @Operation(summary = "作废 / 干预 iWork 流程") + CommonResult voidWorkflow(@RequestBody IWorkWorkflowVoidReqDTO reqDTO); + + // ----------------- 人力组织分页接口 ----------------- + + @PostMapping(PREFIX + "/hr/subcompany/page") + @Operation(summary = "获取 iWork 分部列表") + CommonResult listSubcompanies(@RequestBody IWorkOrgPageReqDTO reqDTO); + + @PostMapping(PREFIX + "/hr/department/page") + @Operation(summary = "获取 iWork 部门列表") + CommonResult listDepartments(@RequestBody IWorkOrgPageReqDTO reqDTO); + + @PostMapping(PREFIX + "/hr/job-title/page") + @Operation(summary = "获取 iWork 岗位列表") + CommonResult listJobTitles(@RequestBody IWorkOrgPageReqDTO reqDTO); + + @PostMapping(PREFIX + "/hr/user/page") + @Operation(summary = "获取 iWork 人员列表") + CommonResult listUsers(@RequestBody IWorkOrgPageReqDTO reqDTO); + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthRegisterReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthRegisterReqDTO.java new file mode 100644 index 00000000..aaedd14e --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthRegisterReqDTO.java @@ -0,0 +1,18 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * iWork 注册授权请求 DTO(供其他模块通过 Feign 调用 system-server 时使用) + */ +@Data +public class IWorkAuthRegisterReqDTO { + + @Schema(description = "iWork 应用编码", requiredMode = Schema.RequiredMode.REQUIRED) + private String appCode; + + @Schema(description = "iWork 网关地址", requiredMode = Schema.RequiredMode.NOT_REQUIRED) + private String baseUrl; + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthRegisterRespDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthRegisterRespDTO.java new file mode 100644 index 00000000..9e8ed341 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthRegisterRespDTO.java @@ -0,0 +1,18 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * iWork 注册授权响应 DTO + */ +@Data +public class IWorkAuthRegisterRespDTO { + + @Schema(description = "服务端公钥(Base64)") + private String publicKey; + + @Schema(description = "服务端下发的 secret") + private String secret; + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthTokenReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthTokenReqDTO.java new file mode 100644 index 00000000..ff0598b6 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthTokenReqDTO.java @@ -0,0 +1,15 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * iWork Token 申请请求 DTO + */ +@Data +public class IWorkAuthTokenReqDTO { + + @Schema(description = "应用编码", requiredMode = Schema.RequiredMode.REQUIRED) + private String appCode; + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthTokenRespDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthTokenRespDTO.java new file mode 100644 index 00000000..65a82f60 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkAuthTokenRespDTO.java @@ -0,0 +1,18 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * iWork Token 响应 DTO + */ +@Data +public class IWorkAuthTokenRespDTO { + + @Schema(description = "访问令牌") + private String accessToken; + + @Schema(description = "过期时间(秒)") + private Long expiresIn; + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrDepartmentPageRespDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrDepartmentPageRespDTO.java new file mode 100644 index 00000000..f714a36f --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrDepartmentPageRespDTO.java @@ -0,0 +1,31 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * iWork 部门分页响应 DTO + */ +@Data +public class IWorkHrDepartmentPageRespDTO { + + @Schema(description = "总条数") + private Long total; + + @Schema(description = "当前页数据") + private List list; + + @Data + public static class Item { + + @Schema(description = "部门编号") + private String id; + + @Schema(description = "部门名称") + private String name; + + } + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrJobTitlePageRespDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrJobTitlePageRespDTO.java new file mode 100644 index 00000000..c53f0fe9 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrJobTitlePageRespDTO.java @@ -0,0 +1,31 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * iWork 岗位分页响应 DTO + */ +@Data +public class IWorkHrJobTitlePageRespDTO { + + @Schema(description = "总条数") + private Long total; + + @Schema(description = "当前页数据") + private List list; + + @Data + public static class Item { + + @Schema(description = "岗位编号") + private String id; + + @Schema(description = "岗位名称") + private String name; + + } + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrSubcompanyPageRespDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrSubcompanyPageRespDTO.java new file mode 100644 index 00000000..a57f92ca --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrSubcompanyPageRespDTO.java @@ -0,0 +1,31 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * iWork 分部分页响应 DTO + */ +@Data +public class IWorkHrSubcompanyPageRespDTO { + + @Schema(description = "总条数") + private Long total; + + @Schema(description = "当前页数据") + private List list; + + @Data + public static class Item { + + @Schema(description = "分部编号") + private String id; + + @Schema(description = "分部名称") + private String name; + + } + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrUserPageRespDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrUserPageRespDTO.java new file mode 100644 index 00000000..39b5af0f --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkHrUserPageRespDTO.java @@ -0,0 +1,31 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; + +/** + * iWork 人员分页响应 DTO + */ +@Data +public class IWorkHrUserPageRespDTO { + + @Schema(description = "总条数") + private Long total; + + @Schema(description = "当前页数据") + private List list; + + @Data + public static class Item { + + @Schema(description = "人员编号") + private String id; + + @Schema(description = "人员名称") + private String name; + + } + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkOperationRespDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkOperationRespDTO.java new file mode 100644 index 00000000..1ebe46d5 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkOperationRespDTO.java @@ -0,0 +1,21 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * iWork 操作结果响应 DTO + */ +@Data +public class IWorkOperationRespDTO { + + @Schema(description = "是否成功") + private Boolean success; + + @Schema(description = "iWork 返回的操作编号或实例编号") + private String operationId; + + @Schema(description = "提示信息") + private String message; + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkOrgPageReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkOrgPageReqDTO.java new file mode 100644 index 00000000..60fe8231 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkOrgPageReqDTO.java @@ -0,0 +1,21 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * iWork 人力组织分页查询通用请求 DTO + */ +@Data +public class IWorkOrgPageReqDTO { + + @Schema(description = "页码", example = "1", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer pageNo; + + @Schema(description = "每页大小", example = "20", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer pageSize; + + @Schema(description = "关键字过滤") + private String keyword; + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkUserInfoReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkUserInfoReqDTO.java new file mode 100644 index 00000000..dbf8667b --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkUserInfoReqDTO.java @@ -0,0 +1,15 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 根据外部标识解析 iWork 用户请求 DTO + */ +@Data +public class IWorkUserInfoReqDTO { + + @Schema(description = "外部系统中的用户唯一标识", requiredMode = Schema.RequiredMode.REQUIRED) + private String externalUserCode; + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkUserInfoRespDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkUserInfoRespDTO.java new file mode 100644 index 00000000..f311a1f4 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkUserInfoRespDTO.java @@ -0,0 +1,18 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * iWork 用户解析响应 DTO + */ +@Data +public class IWorkUserInfoRespDTO { + + @Schema(description = "iWork 用户编号") + private String userId; + + @Schema(description = "iWork 用户名称") + private String userName; + +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkWorkflowCreateReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkWorkflowCreateReqDTO.java new file mode 100644 index 00000000..3d10a1ae --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkWorkflowCreateReqDTO.java @@ -0,0 +1,46 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 发起 iWork 流程请求 DTO + * + * 与 IWorkWorkflowCreateReqVO 字段一一对应,便于 Feign 调用。 + */ +@Data +public class IWorkWorkflowCreateReqDTO { + + @Schema(description = "用印申请人(iWork 人员 ID)", example = "1001") + private String jbr; + + @Schema(description = "用印部门 ID", example = "2001") + private String yybm; + + @Schema(description = "用印单位(分部 ID)", example = "3001") + private String fb; + + @Schema(description = "申请时间,格式 yyyy-MM-dd", example = "2025-01-01") + private String sqsj; + + @Schema(description = "用印去向") + private String yyqx; + + @Schema(description = "用印依据附件 URL") + private String yyfkUrl; + + @Schema(description = "用印事由或内容摘要") + private String yysy; + + @Schema(description = "用印材料附件 URL(必填)") + private String xyywjUrl; + + @Schema(description = "用印材料附件文件名(必填)") + private String xyywjFileName; + + @Schema(description = "用印事项") + private String yysx; + + @Schema(description = "业务系统单据编号(用于派生流程标题)", example = "DJ-2025-0001") + private String ywxtdjbh; +} diff --git a/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkWorkflowVoidReqDTO.java b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkWorkflowVoidReqDTO.java new file mode 100644 index 00000000..17ab8c34 --- /dev/null +++ b/zt-module-system/zt-module-system-api/src/main/java/com/zt/plat/module/system/api/iwork/dto/IWorkWorkflowVoidReqDTO.java @@ -0,0 +1,21 @@ +package com.zt.plat.module.system.api.iwork.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 作废 / 干预 iWork 流程请求 DTO + */ +@Data +public class IWorkWorkflowVoidReqDTO { + + @Schema(description = "iWork 实例编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String instanceId; + + @Schema(description = "操作人 iWork 用户编号", requiredMode = Schema.RequiredMode.REQUIRED) + private String operatorUserId; + + @Schema(description = "作废原因") + private String reason; + +} diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/iwork/IWorkIntegrationApiImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/iwork/IWorkIntegrationApiImpl.java new file mode 100644 index 00000000..b12f91f9 --- /dev/null +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/api/iwork/IWorkIntegrationApiImpl.java @@ -0,0 +1,111 @@ +package com.zt.plat.module.system.api.iwork; + +import com.zt.plat.framework.common.pojo.CommonResult; +import com.zt.plat.framework.common.util.object.BeanUtils; +import com.zt.plat.module.system.api.iwork.dto.*; +import com.zt.plat.module.system.controller.admin.integration.iwork.vo.*; +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 jakarta.annotation.Resource; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RestController; + +import static com.zt.plat.framework.common.pojo.CommonResult.success; + +/** + * iWork 集成 Feign API 实现类。 + *

+ * 将 system-api 模块中的 DTO 与现有 Controller VO 进行简单转换, + * 再委托给 Service 层完成实际业务逻辑,供其他模块通过 Feign 统一调用。 + */ +@RestController +@Validated +public class IWorkIntegrationApiImpl implements IWorkIntegrationApi { + + @Resource + private IWorkIntegrationService integrationService; + @Resource + private IWorkOrgRestService orgRestService; + @Resource + private IWorkSyncService syncService; + + // ----------------- 认证 / 会话 ----------------- + + @Override + public CommonResult register(IWorkAuthRegisterReqDTO reqDTO) { + IWorkAuthRegisterReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkAuthRegisterReqVO.class); + IWorkAuthRegisterRespVO respVO = integrationService.registerSession(reqVO); + IWorkAuthRegisterRespDTO respDTO = BeanUtils.toBean(respVO, IWorkAuthRegisterRespDTO.class); + return success(respDTO); + } + + @Override + public CommonResult acquireToken(IWorkAuthTokenReqDTO reqDTO) { + IWorkAuthTokenReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkAuthTokenReqVO.class); + IWorkAuthTokenRespVO respVO = integrationService.acquireToken(reqVO); + IWorkAuthTokenRespDTO respDTO = BeanUtils.toBean(respVO, IWorkAuthTokenRespDTO.class); + return success(respDTO); + } + + // ----------------- 流程类能力 ----------------- + + @Override + public CommonResult resolveUser(IWorkUserInfoReqDTO reqDTO) { + IWorkUserInfoReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkUserInfoReqVO.class); + IWorkUserInfoRespVO respVO = integrationService.resolveUserId(reqVO); + IWorkUserInfoRespDTO respDTO = BeanUtils.toBean(respVO, IWorkUserInfoRespDTO.class); + return success(respDTO); + } + + @Override + public CommonResult createWorkflow(IWorkWorkflowCreateReqDTO reqDTO) { + IWorkWorkflowCreateReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkWorkflowCreateReqVO.class); + IWorkOperationRespVO respVO = integrationService.createWorkflow(reqVO); + IWorkOperationRespDTO respDTO = BeanUtils.toBean(respVO, IWorkOperationRespDTO.class); + return success(respDTO); + } + + @Override + public CommonResult voidWorkflow(IWorkWorkflowVoidReqDTO reqDTO) { + IWorkWorkflowVoidReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkWorkflowVoidReqVO.class); + IWorkOperationRespVO respVO = integrationService.voidWorkflow(reqVO); + IWorkOperationRespDTO respDTO = BeanUtils.toBean(respVO, IWorkOperationRespDTO.class); + return success(respDTO); + } + + // ----------------- 人力组织分页接口 ----------------- + + @Override + public CommonResult listSubcompanies(IWorkOrgPageReqDTO reqDTO) { + IWorkSubcompanyQueryReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkSubcompanyQueryReqVO.class); + IWorkHrSubcompanyPageRespVO respVO = orgRestService.listSubcompanies(reqVO); + IWorkHrSubcompanyPageRespDTO respDTO = BeanUtils.toBean(respVO, IWorkHrSubcompanyPageRespDTO.class); + return success(respDTO); + } + + @Override + public CommonResult listDepartments(IWorkOrgPageReqDTO reqDTO) { + IWorkDepartmentQueryReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkDepartmentQueryReqVO.class); + IWorkHrDepartmentPageRespVO respVO = orgRestService.listDepartments(reqVO); + IWorkHrDepartmentPageRespDTO respDTO = BeanUtils.toBean(respVO, IWorkHrDepartmentPageRespDTO.class); + return success(respDTO); + } + + @Override + public CommonResult listJobTitles(IWorkOrgPageReqDTO reqDTO) { + IWorkJobTitleQueryReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkJobTitleQueryReqVO.class); + IWorkHrJobTitlePageRespVO respVO = orgRestService.listJobTitles(reqVO); + IWorkHrJobTitlePageRespDTO respDTO = BeanUtils.toBean(respVO, IWorkHrJobTitlePageRespDTO.class); + return success(respDTO); + } + + @Override + public CommonResult listUsers(IWorkOrgPageReqDTO reqDTO) { + IWorkUserQueryReqVO reqVO = BeanUtils.toBean(reqDTO, IWorkUserQueryReqVO.class); + IWorkHrUserPageRespVO respVO = orgRestService.listUsers(reqVO); + IWorkHrUserPageRespDTO respDTO = BeanUtils.toBean(respVO, IWorkHrUserPageRespDTO.class); + return success(respDTO); + } + +} diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/integration/iwork/vo/IWorkOrgRespVO.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/integration/iwork/vo/IWorkOrgRespVO.java deleted file mode 100644 index 40d6da15..00000000 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/integration/iwork/vo/IWorkOrgRespVO.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.zt.plat.module.system.controller.admin.integration.iwork.vo; - -import io.swagger.v3.oas.annotations.media.Schema; - -/** - * @deprecated 请改用强类型的 IWorkHr*RespVO,避免再引用该占位类。 - */ -@Deprecated(forRemoval = true) -@Schema(description = "已废弃,占位用") -public final class IWorkOrgRespVO { - - private IWorkOrgRespVO() { - throw new UnsupportedOperationException("Use IWorkHr*RespVO instead"); - } -} diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/integration/iwork/vo/IWorkWorkflowCreateReqVO.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/integration/iwork/vo/IWorkWorkflowCreateReqVO.java index 2b7efc6b..1b2fcc54 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/integration/iwork/vo/IWorkWorkflowCreateReqVO.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/controller/admin/integration/iwork/vo/IWorkWorkflowCreateReqVO.java @@ -34,13 +34,13 @@ public class IWorkWorkflowCreateReqVO extends IWorkBaseReqVO { @Schema(description = "用印材料附件 URL(必填)") private String xyywjUrl; + + @Schema(description = "用印材料附件文件名(必填)") + private String xyywjFileName; @Schema(description = "用印事项") private String yysx; @Schema(description = "业务系统单据编号(用于派生流程标题)", example = "DJ-2025-0001") private String ywxtdjbh; - - @Schema(description = "流程模板编号(必填)", example = "54") - private String workflowId; } diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/framework/integration/iwork/config/IWorkProperties.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/framework/integration/iwork/config/IWorkProperties.java index 92fc5b6b..cadd8b88 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/framework/integration/iwork/config/IWorkProperties.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/framework/integration/iwork/config/IWorkProperties.java @@ -34,11 +34,6 @@ public class IWorkProperties { */ private String clientPublicKey; - /** - * 当调用方未指定流程编号时使用的默认流程模板编号。 - */ - private Long workflowId; - /** * 当请求未指定操作人时使用的默认用户编号。 */ @@ -53,6 +48,8 @@ public class IWorkProperties { private final Client client = new Client(); @Valid private final OrgRest org = new OrgRest(); + @Valid + private final Workflow workflow = new Workflow(); @Data public static class Paths { @@ -142,4 +139,13 @@ public class IWorkProperties { private String syncJobTitle; private String syncUser; } + + @Data + public static class Workflow { + /** + * 用印流程对应的 iWork 模板编号。 + */ + @NotBlank(message = "iWork 用印流程模板编号不能为空") + private String sealWorkflowId; + } } diff --git a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkIntegrationServiceImpl.java b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkIntegrationServiceImpl.java index dabb6d54..9aead1e5 100644 --- a/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkIntegrationServiceImpl.java +++ b/zt-module-system/zt-module-system-server/src/main/java/com/zt/plat/module/system/service/integration/iwork/impl/IWorkIntegrationServiceImpl.java @@ -416,7 +416,8 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService { addField(main, "yyqx", fields.yyqx()); addField(main, "yyfk", fields.yyfkUrl()); addField(main, "yysy", fields.yysy()); - addField(main, "xyywj", fields.xyywjUrl()); + // xyywj 需要是一个数组结构 [{fileName,filePath}, ...] + addJsonField(main, "xyywj", buildSealAttachmentValue(fields.xyywjUrl())); addField(main, "yysx", fields.yysx()); addField(main, "lclx", SealRequestFields.DEFAULT_FLOW_TYPE); addField(main, "qsdz", SealRequestFields.DEFAULT_SIGN_ACTION); @@ -434,6 +435,49 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService { target.add(map); } + private void addJsonField(List> target, String name, Object value) { + if (value == null) { + return; + } + Map map = new HashMap<>(2); + map.put("fieldName", name); + map.put("fieldValue", value); + target.add(map); + } + + /** + * 将单个附件 URL 封装成 iWork 需要的数组结构: + * [ {"fileName": "xxx", "filePath": "url"} ] + */ + private List> buildSealAttachmentValue(String xyywjUrl) { + String url = trimToNull(xyywjUrl); + if (url == null) { + return null; + } + Map file = new LinkedHashMap<>(2); + // 这里简单从 URL 截取文件名,调用方也可以直接传入已经带文件名的 URL + String fileName = extractFileNameFromUrl(url); + file.put("fileName", fileName); + file.put("filePath", url); + List> list = new ArrayList<>(1); + list.add(file); + return list; + } + + private String extractFileNameFromUrl(String url) { + String trimmed = trimToNull(url); + if (trimmed == null) { + return null; + } + int queryIndex = trimmed.indexOf('?'); + String pathPart = queryIndex >= 0 ? trimmed.substring(0, queryIndex) : trimmed; + int slashIndex = pathPart.lastIndexOf('/'); + if (slashIndex >= 0 && slashIndex < pathPart.length() - 1) { + return pathPart.substring(slashIndex + 1); + } + return pathPart; + } + private SealRequestFields resolveSealFields(IWorkWorkflowCreateReqVO reqVO) { String jbr = requireSealField(reqVO.getJbr(), "jbr"); String yybm = requireSealField(reqVO.getYybm(), "yybm"); @@ -443,9 +487,9 @@ public class IWorkIntegrationServiceImpl implements IWorkIntegrationService { String xyywjUrl = requireSealField(reqVO.getXyywjUrl(), "xyywjUrl"); String yysx = requireSealField(reqVO.getYysx(), "yysx"); String billNo = requireSealField(reqVO.getYwxtdjbh(), "ywxtdjbh"); - String workflowId = requireSealField(reqVO.getWorkflowId(), "workflowId"); String yyfkUrl = trimToNull(reqVO.getYyfkUrl()); String yysy = trimToNull(reqVO.getYysy()); + String workflowId = requireSealField(properties.getWorkflow().getSealWorkflowId(), "workflowId"); return new SealRequestFields(jbr, yybm, fb, sqsj, yyqx, yyfkUrl, yysy, xyywjUrl, yysx, billNo, workflowId); } diff --git a/zt-module-system/zt-module-system-server/src/main/resources/application.yaml b/zt-module-system/zt-module-system-server/src/main/resources/application.yaml index b7ecf93c..0240e030 100644 --- a/zt-module-system/zt-module-system-server/src/main/resources/application.yaml +++ b/zt-module-system/zt-module-system-server/src/main/resources/application.yaml @@ -110,7 +110,6 @@ iwork: # app-id: f47ac10b-58cc-4372-a567-0e02b2c3d479 app-id: f47ac10b-58cc-4372-a567-0e02b2c3d479 user-id: 9869 - workflow-id: 1753 paths: register: /api/ec/dev/auth/regist apply-token: /api/ec/dev/auth/applytoken @@ -134,6 +133,8 @@ iwork: sync-department: /api/hrm/resful/synDepartment sync-job-title: /api/hrm/resful/synJobtitle sync-user: /api/hrm/resful/synHrmresource + workflow: + seal-workflow-id: "1753" --- #################### RPC 远程调用相关配置 ####################