1. 修复自定义 sql 中大写表名无法匹配到 mybatis 中的缓存表信息,导致表被忽略租户的问题
2. 新增 iwork feign api 调用
This commit is contained in:
@@ -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())) {
|
||||
|
||||
@@ -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<IWorkAuthRegisterRespDTO> register(@RequestBody IWorkAuthRegisterReqDTO reqDTO);
|
||||
|
||||
@PostMapping(PREFIX + "/auth/token")
|
||||
@Operation(summary = "申请 iWork Token(独立接口)")
|
||||
CommonResult<IWorkAuthTokenRespDTO> acquireToken(@RequestBody IWorkAuthTokenReqDTO reqDTO);
|
||||
|
||||
// ----------------- 流程类能力 -----------------
|
||||
|
||||
@PostMapping(PREFIX + "/user/resolve")
|
||||
@Operation(summary = "根据外部标识获取 iWork 用户编号")
|
||||
CommonResult<IWorkUserInfoRespDTO> resolveUser(@RequestBody IWorkUserInfoReqDTO reqDTO);
|
||||
|
||||
@PostMapping(PREFIX + "/workflow/create")
|
||||
@Operation(summary = "发起 iWork 流程")
|
||||
CommonResult<IWorkOperationRespDTO> createWorkflow(@RequestBody IWorkWorkflowCreateReqDTO reqDTO);
|
||||
|
||||
@PostMapping(PREFIX + "/workflow/void")
|
||||
@Operation(summary = "作废 / 干预 iWork 流程")
|
||||
CommonResult<IWorkOperationRespDTO> voidWorkflow(@RequestBody IWorkWorkflowVoidReqDTO reqDTO);
|
||||
|
||||
// ----------------- 人力组织分页接口 -----------------
|
||||
|
||||
@PostMapping(PREFIX + "/hr/subcompany/page")
|
||||
@Operation(summary = "获取 iWork 分部列表")
|
||||
CommonResult<IWorkHrSubcompanyPageRespDTO> listSubcompanies(@RequestBody IWorkOrgPageReqDTO reqDTO);
|
||||
|
||||
@PostMapping(PREFIX + "/hr/department/page")
|
||||
@Operation(summary = "获取 iWork 部门列表")
|
||||
CommonResult<IWorkHrDepartmentPageRespDTO> listDepartments(@RequestBody IWorkOrgPageReqDTO reqDTO);
|
||||
|
||||
@PostMapping(PREFIX + "/hr/job-title/page")
|
||||
@Operation(summary = "获取 iWork 岗位列表")
|
||||
CommonResult<IWorkHrJobTitlePageRespDTO> listJobTitles(@RequestBody IWorkOrgPageReqDTO reqDTO);
|
||||
|
||||
@PostMapping(PREFIX + "/hr/user/page")
|
||||
@Operation(summary = "获取 iWork 人员列表")
|
||||
CommonResult<IWorkHrUserPageRespDTO> listUsers(@RequestBody IWorkOrgPageReqDTO reqDTO);
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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<Item> list;
|
||||
|
||||
@Data
|
||||
public static class Item {
|
||||
|
||||
@Schema(description = "部门编号")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "部门名称")
|
||||
private String name;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Item> list;
|
||||
|
||||
@Data
|
||||
public static class Item {
|
||||
|
||||
@Schema(description = "岗位编号")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "岗位名称")
|
||||
private String name;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Item> list;
|
||||
|
||||
@Data
|
||||
public static class Item {
|
||||
|
||||
@Schema(description = "分部编号")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "分部名称")
|
||||
private String name;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<Item> list;
|
||||
|
||||
@Data
|
||||
public static class Item {
|
||||
|
||||
@Schema(description = "人员编号")
|
||||
private String id;
|
||||
|
||||
@Schema(description = "人员名称")
|
||||
private String name;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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 实现类。
|
||||
* <p>
|
||||
* 将 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<IWorkAuthRegisterRespDTO> 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<IWorkAuthTokenRespDTO> 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<IWorkUserInfoRespDTO> 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<IWorkOperationRespDTO> 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<IWorkOperationRespDTO> 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<IWorkHrSubcompanyPageRespDTO> 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<IWorkHrDepartmentPageRespDTO> 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<IWorkHrJobTitlePageRespDTO> 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<IWorkHrUserPageRespDTO> 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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Map<String, Object>> target, String name, Object value) {
|
||||
if (value == null) {
|
||||
return;
|
||||
}
|
||||
Map<String, Object> map = new HashMap<>(2);
|
||||
map.put("fieldName", name);
|
||||
map.put("fieldValue", value);
|
||||
target.add(map);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将单个附件 URL 封装成 iWork 需要的数组结构:
|
||||
* [ {"fileName": "xxx", "filePath": "url"} ]
|
||||
*/
|
||||
private List<Map<String, Object>> buildSealAttachmentValue(String xyywjUrl) {
|
||||
String url = trimToNull(xyywjUrl);
|
||||
if (url == null) {
|
||||
return null;
|
||||
}
|
||||
Map<String, Object> file = new LinkedHashMap<>(2);
|
||||
// 这里简单从 URL 截取文件名,调用方也可以直接传入已经带文件名的 URL
|
||||
String fileName = extractFileNameFromUrl(url);
|
||||
file.put("fileName", fileName);
|
||||
file.put("filePath", url);
|
||||
List<Map<String, Object>> 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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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 远程调用相关配置 ####################
|
||||
|
||||
|
||||
Reference in New Issue
Block a user