From 2fbbf9b0bb4fad5be534b050d11afdc0439093ef Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Mon, 21 Sep 2026 16:21:15 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=84=E7=BB=87=E5=90=8C=E6=AD=A5=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OASyncServiceImpl.java | 97 ++++++++++++------- 1 file changed, 64 insertions(+), 33 deletions(-) diff --git a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java index 5c2e883..0d2a3aa 100644 --- a/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java +++ b/blade-service/blade-system/src/main/java/org/springblade/system/service/impl/OASyncServiceImpl.java @@ -200,7 +200,7 @@ public class OASyncServiceImpl implements IOASyncService { return new ServiceException("调用OA接口查询公司信息失败"); }, 10000, ComposeLogUtil.getLastLog()::info).accept(list -> { // 处理数据 - OrgSyncCount syncCount = handleCompany(list); + OrgSyncCount syncCount = handleCompany(list, false); notHandleList.addAll(syncCount.getNotHandledList()); }); // 3. 未处理的数据 @@ -217,7 +217,7 @@ public class OASyncServiceImpl implements IOASyncService { * @param startTime 查询开始时间 */ private void syncDept(Date startTime) { - String subCompanyIds = getSubCompanyIds(); + String subCompanyIds = getOaSubCompanyIds(false); if (StringUtils.isEmpty(subCompanyIds)) { ComposeLogUtil.getLastLog().warn("未查询到子公司查询参数"); return; @@ -232,7 +232,7 @@ public class OASyncServiceImpl implements IOASyncService { return new ServiceException("调用OA接口查询部门信息失败"); }, 10000, ComposeLogUtil.getLastLog()::info).accept(list -> { // 处理数据 - OrgSyncCount syncCount = handleDept(list); + OrgSyncCount syncCount = handleDept(list, false); notHandleList.addAll(syncCount.getNotHandledList()); }); // 3. 未处理的数据 @@ -338,7 +338,7 @@ public class OASyncServiceImpl implements IOASyncService { List oaCompanies = responseData.getDataList() == null ? Collections.emptyList() : responseData.getDataList(); long totalSize = responseData.getTotalSize() == null ? 0L : responseData.getTotalSize(); - OrgSyncCount syncCount = handleCompany(oaCompanies); + OrgSyncCount syncCount = handleCompany(oaCompanies, true); if (CollectionUtil.isNotEmpty(syncCount.getNotHandledList())) { ComposeLogUtil.getLastLog().warn("同步公司,本页未处理数据:{}", JSON.toJSONString(syncCount.getNotHandledList())); } @@ -363,9 +363,9 @@ public class OASyncServiceImpl implements IOASyncService { private OaOrgSyncPageVO syncDepartmentFromOaPage(int current, int size) { int pageNo = current < 1 ? 1 : current; int pageSize = size < 1 ? 20 : Math.min(size, 200); - String subCompanyIds = getSubCompanyIds(); + String subCompanyIds = getOaSubCompanyIds(true); if (StringUtils.isEmpty(subCompanyIds)) { - ComposeLogUtil.getLastLog().warn("未查询到子公司查询参数,跳过部门同步"); + ComposeLogUtil.getLastLog().warn("未查询到已同步的OA公司,跳过部门同步"); OaOrgSyncPageVO emptyPageVO = buildOrgSyncPageVO("department", pageNo, pageSize, 0L, 0, OrgSyncCount.empty()); emptyPageVO.setFinished(true); return emptyPageVO; @@ -382,7 +382,7 @@ public class OASyncServiceImpl implements IOASyncService { List oaDepartments = responseData.getDataList() == null ? Collections.emptyList() : responseData.getDataList(); long totalSize = responseData.getTotalSize() == null ? 0L : responseData.getTotalSize(); - OrgSyncCount syncCount = handleDept(oaDepartments); + OrgSyncCount syncCount = handleDept(oaDepartments, true); if (CollectionUtil.isNotEmpty(syncCount.getNotHandledList())) { ComposeLogUtil.getLastLog().warn("同步部门,本页未处理数据:{}", JSON.toJSONString(syncCount.getNotHandledList())); } @@ -477,19 +477,20 @@ public class OASyncServiceImpl implements IOASyncService { /** * 处理oa公司 - * @param oaCompanies + * @param oaCompanies OA公司列表 + * @param syncAll true=自动同步时不过滤字典白名单;false=仅同步配置的公司名称 * @return 同步统计 */ - private OrgSyncCount handleCompany(List oaCompanies) { + private OrgSyncCount handleCompany(List oaCompanies, boolean syncAll) { if (CollectionUtil.isEmpty(oaCompanies)) { return OrgSyncCount.empty(); } // 获取需要的公司名称 - Set companyNames = getCompanyNames(); + Set companyNames = syncAll ? Collections.emptySet() : getCompanyNames(); // 转换数据 List allParam = oaCompanies.stream() - // 筛选只要需要的公司 - .filter(company -> companyNames.contains(company.getSubcompanyname())) + // 非全量同步时,筛选只要配置的公司 + .filter(company -> syncAll || companyNames.contains(company.getSubcompanyname())) .map(deptConvert::company2dept) .toList(); int filteredSkipCount = oaCompanies.size() - allParam.size(); @@ -509,10 +510,11 @@ public class OASyncServiceImpl implements IOASyncService { /** * 处理oa部门 - * @param oaDepts + * @param oaDepts OA部门列表 + * @param syncAll true=自动同步时不过滤根公司部门白名单;false=沿用原过滤规则 * @return 同步统计 */ - private OrgSyncCount handleDept(List oaDepts) { + private OrgSyncCount handleDept(List oaDepts, boolean syncAll) { if (CollectionUtil.isEmpty(oaDepts)) { return OrgSyncCount.empty(); } @@ -520,15 +522,18 @@ public class OASyncServiceImpl implements IOASyncService { Map companyDeptMap = getAllCompanyDeptMap(); // 根公司id String rootCompanyId = getRootCompanyId(); - if (rootCompanyId == null) { + if (!syncAll && rootCompanyId == null) { return new OrgSyncCount(0, oaDepts.size(), Collections.emptyList()); } // 根公司下要同步的部门名称 - Set rootCompanyDeptNames = getRootCompanyDeptNames(); + Set rootCompanyDeptNames = syncAll ? Collections.emptySet() : getRootCompanyDeptNames(); // 转换数据 List allParam = oaDepts.stream() - // 部门的公司不是根公司,或者部门名称在根公司下需要同步的部门列表中,且是根部门 - .filter(oaDept -> !rootCompanyId.equals(oaDept.getSubcompanyid1()) || (OAConstant.ROOT_COMPANY_ID.equals(oaDept.getSupdepid()) && rootCompanyDeptNames.contains(oaDept.getDepartmentname()))) + // 全量同步时不过滤;否则:部门的公司不是根公司,或者部门名称在根公司下需要同步的部门列表中,且是根部门 + .filter(oaDept -> syncAll + || rootCompanyId == null + || !rootCompanyId.equals(oaDept.getSubcompanyid1()) + || (OAConstant.ROOT_COMPANY_ID.equals(oaDept.getSupdepid()) && rootCompanyDeptNames.contains(oaDept.getDepartmentname()))) .map(dept -> deptConvert.dept2dept(dept, companyDeptMap)) .toList(); int filteredSkipCount = oaDepts.size() - allParam.size(); @@ -551,6 +556,8 @@ public class OASyncServiceImpl implements IOASyncService { ).stream() .filter(dept -> StringUtils.isNotEmpty(dept.getDeptCode())) .collect(Collectors.toMap(Dept::getDeptCode, Dept::getId, (a, b) -> b)); + // 公司编码也放入 map,根部门挂到公司时才能解析父级 + companyDeptMap.forEach(deptMap::putIfAbsent); // 处理部门 List notHandledList = this.handleDept(allParam, deptMap, DeptCategory.DEPT); int syncedCount = allParam.size() - notHandledList.size(); @@ -657,24 +664,48 @@ public class OASyncServiceImpl implements IOASyncService { } /** - * 获取oa查询参数,子公司id参数 - * @return + * 获取 OA 部门查询使用的子公司 id + * + * @param syncAll true=取已同步的全部 OA 公司;false=仅取字典配置的公司 + * @return 逗号分隔的 OA 公司 id */ - private String getSubCompanyIds() { - Set companyNames = this.getCompanyNames(); - if (companyNames.isEmpty()) { + private String getOaSubCompanyIds(boolean syncAll) { + List companyList; + if (syncAll) { + companyList = deptService.list(Wrappers.lambdaQuery() + .eq(Dept::getDeptCategory, DeptCategory.COMPANY.getCode()) + ); + } else { + Set companyNames = this.getCompanyNames(); + if (companyNames.isEmpty()) { + return null; + } + companyList = deptService.list(Wrappers.lambdaQuery() + .in(Dept::getDeptName, companyNames) + .eq(Dept::getDeptCategory, DeptCategory.COMPANY.getCode()) + ); + } + return companyList.stream() + .map(this::resolveOaCompanyId) + .filter(StringUtils::isNotBlank) + .distinct() + .collect(Collectors.joining(",")); + } + + /** + * 解析本地公司对应的 OA 公司 id + */ + private String resolveOaCompanyId(Dept dept) { + if (dept == null) { return null; } - return deptService.list(Wrappers.lambdaQuery() - // 根据名称查询公司 - .in(Dept::getDeptName, companyNames) - .eq(Dept::getDeptCategory, DeptCategory.COMPANY.getCode()) - ).stream() - // 只要部门编码不为空,且包含了oa公司前缀的 - .filter(dept -> StringUtils.isNotBlank(dept.getDeptCode()) && dept.getDeptCode().contains(OAConvertConstant.COMPANY_OA_PREFIX)) - // 去掉oa公司前缀 - .map(dept -> dept.getDeptCode().replace(OAConvertConstant.COMPANY_OA_PREFIX, "")) - .collect(Collectors.joining(",")); + if (StringUtils.isNotBlank(dept.getOaId())) { + return dept.getOaId(); + } + if (StringUtils.isNotBlank(dept.getDeptCode()) && dept.getDeptCode().startsWith(OAConvertConstant.COMPANY_OA_PREFIX)) { + return dept.getDeptCode().replace(OAConvertConstant.COMPANY_OA_PREFIX, ""); + } + return null; } /**