[+]增加IWork根据ID同步接口
This commit is contained in:
@@ -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, "请求参数不能为空");
|
||||||
|
|
||||||
// ========== 服务端错误段 ==========
|
// ========== 服务端错误段 ==========
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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 响应为空");
|
||||||
|
|||||||
@@ -56,4 +56,8 @@ public class IWorkFullSyncReqVO {
|
|||||||
}
|
}
|
||||||
return resolved;
|
return resolved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
Reference in New Issue
Block a user