[+]增加IWork根据ID同步接口

This commit is contained in:
maimaishu
2026-01-05 11:33:11 +08:00
parent 2e761d1867
commit 88b280a33f
11 changed files with 405 additions and 25 deletions

View File

@@ -25,6 +25,7 @@ public interface GlobalErrorCodeConstants {
ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确"); ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许 ErrorCode LOCKED = new ErrorCode(423, "请求失败,请稍后重试"); // 并发请求,不允许
ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试"); ErrorCode TOO_MANY_REQUESTS = new ErrorCode(429, "请求过于频繁,请稍后重试");
ErrorCode NOT_NULL_REQUEST_ERROR = new ErrorCode(430, "请求参数不能为空");
// ========== 服务端错误段 ========== // ========== 服务端错误段 ==========

View File

@@ -1,6 +1,8 @@
package com.zt.plat.module.system.api.esp; package com.zt.plat.module.system.api.esp;
import com.zt.plat.framework.common.exception.enums.GlobalErrorCodeConstants;
import com.zt.plat.framework.common.pojo.CommonResult; import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.util.object.ObjectUtils;
import com.zt.plat.module.system.api.dept.dto.DeptSaveReqDTO; import com.zt.plat.module.system.api.dept.dto.DeptSaveReqDTO;
import com.zt.plat.module.system.api.esp.dto.EspDto; import com.zt.plat.module.system.api.esp.dto.EspDto;
import com.zt.plat.module.system.service.dept.IEspService; import com.zt.plat.module.system.service.dept.IEspService;
@@ -8,6 +10,7 @@ import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List; import java.util.List;
import java.util.Objects;
@RestController @RestController
@Validated @Validated
@@ -19,6 +22,11 @@ public class EspApiImpl implements EspApi {
@Override @Override
public CommonResult<List<EspDto>> pushMsg(DeptSaveReqDTO syncReqDTO) public CommonResult<List<EspDto>> pushMsg(DeptSaveReqDTO syncReqDTO)
{ {
if(Objects.isNull(syncReqDTO) || null == syncReqDTO.getId())
{
return CommonResult.error(GlobalErrorCodeConstants.BAD_REQUEST.getCode(),
"ID不能为空");
}
return CommonResult.success(deptService.pushMsg(syncReqDTO)); return CommonResult.success(deptService.pushMsg(syncReqDTO));
} }

View File

@@ -14,6 +14,7 @@ import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -94,13 +95,13 @@ public class EspController
private void fillDeptInfo(List<EspSaveRespVo> list) { private void fillDeptInfo(List<EspSaveRespVo> list) {
if (list == null || list.isEmpty()) { if (CollectionUtils.isEmpty(list)) {
return; return;
} }
Set<Long> deptIds = list.stream() Set<Long> deptIds = list.stream()
.map(EspSaveRespVo::getDeptId) .map(EspSaveRespVo::getDeptId)
.collect(Collectors.toCollection(HashSet::new)); .collect(Collectors.toCollection(HashSet::new));
if (deptIds == null || deptIds.isEmpty()) { if (CollectionUtils.isEmpty(deptIds)) {
return; return;
} }
Map<Long, DeptDO> deptMap = deptService.getDeptList(deptIds).stream() Map<Long, DeptDO> deptMap = deptService.getDeptList(deptIds).stream()

View File

@@ -6,6 +6,7 @@ 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.IWorkIntegrationService;
import com.zt.plat.module.system.service.integration.iwork.IWorkOrgRestService; 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.IWorkSyncService;
import lombok.extern.slf4j.Slf4j;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.security.PermitAll; import jakarta.annotation.security.PermitAll;
@@ -18,9 +19,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import static com.zt.plat.framework.common.pojo.CommonResult.success; import static com.zt.plat.framework.common.pojo.CommonResult.success;
/** /**
* 提供统一 iWork 流程能力的管理端接口。 * 提供统一 iWork 流程能力的管理端接口。
*/ */
@@ -29,6 +28,7 @@ import static com.zt.plat.framework.common.pojo.CommonResult.success;
@RequestMapping("/system/integration/iwork") @RequestMapping("/system/integration/iwork")
@RequiredArgsConstructor @RequiredArgsConstructor
@Validated @Validated
@Slf4j
public class IWorkIntegrationController { public class IWorkIntegrationController {
private final IWorkIntegrationService integrationService; private final IWorkIntegrationService integrationService;
@@ -139,6 +139,17 @@ public class IWorkIntegrationController {
return success(syncService.fullSyncUsers(reqVO)); return success(syncService.fullSyncUsers(reqVO));
} }
// ----------------- 根据ID同步到本地 -----------------
@PostMapping("/syncById")
@Operation(summary = "根据ID触发 iWork 同步公司")
public CommonResult<IWorkFullSyncRespVO> syncById(@Valid @RequestBody IWorkSyncByIdReqVO reqVO) {
log.error("IWork集成后端手动录入syncById{}",reqVO);
return success(syncService.manuallySyncData(reqVO));
}
private ResponseEntity<String> buildOaResponse(IWorkOaRawResponse resp) { private ResponseEntity<String> buildOaResponse(IWorkOaRawResponse resp) {
if (resp == null) { if (resp == null) {
return ResponseEntity.internalServerError().body("OA 响应为空"); return ResponseEntity.internalServerError().body("OA 响应为空");

View File

@@ -56,4 +56,8 @@ public class IWorkFullSyncReqVO {
} }
return resolved; return resolved;
} }
} }

View File

@@ -0,0 +1,99 @@
package com.zt.plat.module.system.controller.admin.integration.iwork.vo;
import com.zt.plat.module.system.enums.integration.IWorkSyncEntityTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.EnumSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* iWork 手动同步请求
*/
@Data
public class IWorkSyncByIdReqVO {
@Schema(description = "起始页码,从 1 开始", example = "1")
@Min(1)
private Integer startPage = 1;
@Schema(description = "最大处理页数null 表示处理至 iWork 返回的末页", example = "10")
@Min(1)
private Integer maxPages;
@Schema(description = "每次分页从 iWork 拉取的记录数", example = "100")
@Min(1)
@Max(500)
private Integer pageSize = 100;
@Schema(description = "同步范围列表默认同步全部。可选subcompany、department、jobTitle、user")
private List<String> scopes;
@Schema(description = "是否包含已失效canceled=1的记录", example = "false")
private Boolean includeCanceled = Boolean.FALSE;
@Schema(description = "是否允许更新已存在的本地实体", example = "false")
private Boolean allowUpdate = Boolean.FALSE;
@Schema(description = "指定同步记录的 iWork ID。传入后仅同步对应记录", example = "12345")
@NotBlank(message = "ID不能为空")
private String id;
@Schema(description = "部门编码", example = "ZT001")
private String code;
@Schema(description = "部门名称", example = "ZT")
private String name;
@Schema(description = "部门简称", example = "技术")
private String shortName;
@Schema(description = "父部门 ID", example = "1024")
private String parentId;
@Schema(description = "负责人的用户编号", example = "2048")
private String leaderUserId;
@Schema(description = "联系电话", example = "15601691000")
private String phone;
@Schema(description = "邮箱", example = "zt@iocoder.cn")
private String email;
@Schema(description = "状态,见 CommonStatusEnum 枚举0 开启 1 关闭", example = "0")
private Integer status;
private Long tenantId;
@Schema(description = "是否公司", example = "false")
private boolean isCompany;
@Schema(description = "是否集团", example = "false")
private boolean isGroup;
private boolean hasChildren;
public Set<IWorkSyncEntityTypeEnum> resolveScopes() {
EnumSet<IWorkSyncEntityTypeEnum> defaults = EnumSet.allOf(IWorkSyncEntityTypeEnum.class);
if (scopes == null || scopes.isEmpty()) {
return defaults;
}
Set<IWorkSyncEntityTypeEnum> resolved = scopes.stream()
.map(IWorkSyncEntityTypeEnum::fromCode)
.filter(java.util.Objects::nonNull)
.collect(Collectors.toCollection(() -> EnumSet.noneOf(IWorkSyncEntityTypeEnum.class)));
if (resolved.isEmpty()) {
return defaults;
}
return resolved;
}
}

View File

@@ -56,10 +56,10 @@ public interface EspMapper extends BaseMapperX<DeptPushMsgDO> {
return selectList(DeptPushMsgDO::getSystemCode, systemCode); return selectList(DeptPushMsgDO::getSystemCode, systemCode);
} }
@Select("SELECT ID,DEPT_ID, SYSTEM_CODE,EXTERNAL_DEPT_CODE,EXTERNAL_DEPT_NAME,STATUS,REMARK,TENANT_ID,CREATOR,CREATE_TIME,UPDATER,UPDATE_TIME\n" + @Select("SELECT ID,DEPT_ID, SYSTEM_CODE,EXTERNAL_DEPT_CODE,EXTERNAL_DEPT_NAME,STATUS,REMARK,TENANT_ID,CREATOR,CREATE_TIME,UPDATER,UPDATE_TIME" +
"FROM \n" + "FROM" +
"\t\tSYSTEM_DEPT_PUSH_MSG\n" + "SYSTEM_DEPT_PUSH_MSG" +
"WHERE\n" + "WHERE" +
" IS_SEND_MSG = '0' AND DELETED = '0' ") " ID = #{id} AND IS_SEND_MSG = '0' AND DELETED = '0' ")
List<DeptPushMsgDO> selectpushMsg(@Param("syncReqDTO") DeptSaveReqDTO syncReqDTO); List<DeptPushMsgDO> selectpushMsg(@Param("syncReqDTO") DeptSaveReqDTO syncReqDTO);
} }

View File

@@ -19,19 +19,19 @@ public interface IWorkSyncProcessor {
BatchResult syncSubcompanies(List<IWorkHrSubcompanyPageRespVO.Subcompany> data, BatchResult syncSubcompanies(List<IWorkHrSubcompanyPageRespVO.Subcompany> data,
SyncOptions options); SyncOptions options);
// 同步子公司
BatchResult syncSubcompanies(List<IWorkHrSubcompanyPageRespVO.Subcompany> data, BatchResult syncSubcompanies(List<IWorkHrSubcompanyPageRespVO.Subcompany> data,
SyncOptions options, SyncOptions options,
DeptSyncContext context); DeptSyncContext context);
BatchResult syncDepartments(List<IWorkHrDepartmentPageRespVO.Department> data, SyncOptions options); BatchResult syncDepartments(List<IWorkHrDepartmentPageRespVO.Department> data, SyncOptions options);
// 同步部门
BatchResult syncDepartments(List<IWorkHrDepartmentPageRespVO.Department> data, BatchResult syncDepartments(List<IWorkHrDepartmentPageRespVO.Department> data,
SyncOptions options, SyncOptions options,
DeptSyncContext context); DeptSyncContext context);
// 同步岗位
BatchResult syncJobTitles(List<IWorkHrJobTitlePageRespVO.JobTitle> data, SyncOptions options); BatchResult syncJobTitles(List<IWorkHrJobTitlePageRespVO.JobTitle> data, SyncOptions options);
// 同步用户
BatchResult syncUsers(List<IWorkHrUserPageRespVO.User> data, SyncOptions options); BatchResult syncUsers(List<IWorkHrUserPageRespVO.User> data, SyncOptions options);
/** /**

View File

@@ -2,6 +2,9 @@ package com.zt.plat.module.system.service.integration.iwork;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkFullSyncReqVO; import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkFullSyncReqVO;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkFullSyncRespVO; import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkFullSyncRespVO;
import com.zt.plat.module.system.controller.admin.integration.iwork.vo.IWorkSyncByIdReqVO;
import jakarta.validation.Valid;
import java.util.List;
/** /**
* iWork 组织/人员同步服务 * iWork 组织/人员同步服务
@@ -28,4 +31,8 @@ public interface IWorkSyncService {
*/ */
IWorkFullSyncRespVO fullSyncUsers(IWorkFullSyncReqVO reqVO); IWorkFullSyncRespVO fullSyncUsers(IWorkFullSyncReqVO reqVO);
/**
* 手动同步
*/
IWorkFullSyncRespVO manuallySyncData(@Valid IWorkSyncByIdReqVO list);
} }

View File

@@ -52,7 +52,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
public BatchResult syncSubcompanies(List<IWorkHrSubcompanyPageRespVO.Subcompany> data, SyncOptions options) { public BatchResult syncSubcompanies(List<IWorkHrSubcompanyPageRespVO.Subcompany> data, SyncOptions options) {
return syncSubcompanies(data, options, null); return syncSubcompanies(data, options, null);
} }
//1、同步子公司
@Override @Override
public BatchResult syncSubcompanies(List<IWorkHrSubcompanyPageRespVO.Subcompany> data, public BatchResult syncSubcompanies(List<IWorkHrSubcompanyPageRespVO.Subcompany> data,
SyncOptions options, SyncOptions options,
@@ -154,7 +154,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
return result; return result;
} }
//2、同步部门
@Override @Override
public BatchResult syncDepartments(List<IWorkHrDepartmentPageRespVO.Department> data, SyncOptions options) { public BatchResult syncDepartments(List<IWorkHrDepartmentPageRespVO.Department> data, SyncOptions options) {
return syncDepartments(data, options, null); return syncDepartments(data, options, null);
@@ -272,7 +272,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
result.merge(syncDepartmentsInternal(Collections.emptyList(), options, context, true)); result.merge(syncDepartmentsInternal(Collections.emptyList(), options, context, true));
return result; return result;
} }
//TODO 3、同步岗位
@Override @Override
public BatchResult syncJobTitles(List<IWorkHrJobTitlePageRespVO.JobTitle> data, SyncOptions options) { public BatchResult syncJobTitles(List<IWorkHrJobTitlePageRespVO.JobTitle> data, SyncOptions options) {
List<IWorkHrJobTitlePageRespVO.JobTitle> records = CollUtil.emptyIfNull(data); List<IWorkHrJobTitlePageRespVO.JobTitle> records = CollUtil.emptyIfNull(data);
@@ -310,7 +310,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
return result; return result;
} }
//TODO 4、同步用户
@Override @Override
public BatchResult syncUsers(List<IWorkHrUserPageRespVO.User> data, SyncOptions options) { public BatchResult syncUsers(List<IWorkHrUserPageRespVO.User> data, SyncOptions options) {
List<IWorkHrUserPageRespVO.User> records = CollUtil.emptyIfNull(data); List<IWorkHrUserPageRespVO.User> records = CollUtil.emptyIfNull(data);
@@ -377,7 +377,7 @@ public class IWorkSyncProcessorImpl implements IWorkSyncProcessor {
} }
return result; return result;
} }
//TODO
private DeptSyncOutcome upsertDept(Long deptId, private DeptSyncOutcome upsertDept(Long deptId,
DeptSaveReqVO desired, DeptSaveReqVO desired,
boolean disabled, boolean disabled,

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