+4
-3
@@ -148,7 +148,7 @@ public interface UserConvert {
|
|||||||
/**
|
/**
|
||||||
* oa人员转本系统用户部门
|
* oa人员转本系统用户部门
|
||||||
* @param person
|
* @param person
|
||||||
* @param userMap 所有用户手机号与id map
|
* @param userMap OA登录名与用户id
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
default UserDept person2userDept(OAPersonResponse person, Map<String, Long> userMap) {
|
default UserDept person2userDept(OAPersonResponse person, Map<String, Long> userMap) {
|
||||||
@@ -162,8 +162,9 @@ public interface UserConvert {
|
|||||||
userDept.setStatus(status);
|
userDept.setStatus(status);
|
||||||
// 排序
|
// 排序
|
||||||
userDept.setSort(OAUtils.parseInt(person.getDsporder()));
|
userDept.setSort(OAUtils.parseInt(person.getDsporder()));
|
||||||
// 用户id
|
// 用户id,按 OA 登录名关联本批已新增或更新的用户
|
||||||
userDept.setUserId(userMap.get(resolveAccount(person)));
|
String oaLoginId = person == null ? null : StringUtils.trimToNull(person.getLoginid());
|
||||||
|
userDept.setUserId(oaLoginId == null ? null : userMap.get(oaLoginId));
|
||||||
userDept.setSyncTime(new Date());
|
userDept.setSyncTime(new Date());
|
||||||
return userDept;
|
return userDept;
|
||||||
}
|
}
|
||||||
|
|||||||
+60
-69
@@ -403,70 +403,37 @@ public class OaUserListSyncHelper {
|
|||||||
Map<String, OAPersonResponse> uniquePersonMap = new LinkedHashMap<>();
|
Map<String, OAPersonResponse> uniquePersonMap = new LinkedHashMap<>();
|
||||||
int skippedCount = 0;
|
int skippedCount = 0;
|
||||||
for (OAPersonResponse oaPerson : oaPersons) {
|
for (OAPersonResponse oaPerson : oaPersons) {
|
||||||
String account = userConvert.resolveAccount(oaPerson);
|
String oaLoginId = resolveOaLoginId(oaPerson);
|
||||||
if (StringUtils.isBlank(account)) {
|
if (StringUtils.isBlank(oaLoginId)) {
|
||||||
skippedCount++;
|
skippedCount++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
uniquePersonMap.putIfAbsent(account, oaPerson);
|
uniquePersonMap.put(oaLoginId, oaPerson);
|
||||||
}
|
}
|
||||||
if (uniquePersonMap.isEmpty()) {
|
if (uniquePersonMap.isEmpty()) {
|
||||||
ComposeLogUtil.getLastLog().warn("OA人员均缺少loginid/工号/手机号,跳过人员同步");
|
ComposeLogUtil.getLastLog().warn("OA人员均缺少登录名,跳过人员同步");
|
||||||
return new PersonSyncCount(0, skippedCount);
|
return new PersonSyncCount(0, skippedCount);
|
||||||
}
|
}
|
||||||
String tenantId = resolveTenantId();
|
String tenantId = resolveTenantId();
|
||||||
String defaultPassword = DigestUtil.encrypt(ParamCache.getValue(DEFAULT_PARAM_PASSWORD));
|
String defaultPassword = DigestUtil.encrypt(ParamCache.getValue(DEFAULT_PARAM_PASSWORD));
|
||||||
List<User> users = uniquePersonMap.values().stream()
|
List<User> users = uniquePersonMap.entrySet().stream()
|
||||||
.map(person -> {
|
.map(entry -> {
|
||||||
User user = userConvert.person2user(person, defaultPassword);
|
User user = userConvert.person2user(entry.getValue(), defaultPassword);
|
||||||
user.setTenantId(tenantId);
|
user.setTenantId(tenantId);
|
||||||
|
user.setOaLoginId(entry.getKey());
|
||||||
|
user.setAccount(entry.getKey());
|
||||||
return user;
|
return user;
|
||||||
})
|
})
|
||||||
.toList();
|
.toList();
|
||||||
List<String> accounts = users.stream()
|
Map<String, User> existingByOaLoginId = this.loadUsersByOaLoginId(tenantId, uniquePersonMap.keySet());
|
||||||
.map(User::getAccount)
|
|
||||||
.filter(StringUtils::isNotBlank)
|
|
||||||
.distinct()
|
|
||||||
.toList();
|
|
||||||
List<String> phones = users.stream()
|
|
||||||
.map(User::getPhone)
|
|
||||||
.filter(StringUtils::isNotBlank)
|
|
||||||
.distinct()
|
|
||||||
.toList();
|
|
||||||
Map<String, User> existingByAccount = new HashMap<>();
|
|
||||||
Map<String, User> existingByPhone = new HashMap<>();
|
|
||||||
userService.list(Wrappers.<User>lambdaQuery()
|
|
||||||
.and(wrapper -> {
|
|
||||||
wrapper.in(User::getAccount, accounts);
|
|
||||||
if (CollectionUtil.isNotEmpty(phones)) {
|
|
||||||
wrapper.or().in(User::getPhone, phones);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
).stream()
|
|
||||||
.peek(userService::decryptPhone)
|
|
||||||
.forEach(user -> {
|
|
||||||
if (StringUtils.isNotBlank(user.getAccount())) {
|
|
||||||
existingByAccount.put(user.getAccount(), user);
|
|
||||||
}
|
|
||||||
if (StringUtils.isNotBlank(user.getPhone())) {
|
|
||||||
existingByPhone.put(user.getPhone(), user);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
Map<String, Long> userMap = new HashMap<>();
|
Map<String, Long> userMap = new HashMap<>();
|
||||||
Set<Long> existsUserIds = new HashSet<>();
|
Set<Long> existsUserIds = new HashSet<>();
|
||||||
Set<Long> unchangedUserIds = new HashSet<>();
|
|
||||||
users.forEach(user -> {
|
users.forEach(user -> {
|
||||||
User existingUser = existingByAccount.get(user.getAccount());
|
User existingUser = existingByOaLoginId.get(user.getOaLoginId());
|
||||||
if (existingUser == null && StringUtils.isNotBlank(user.getPhone())) {
|
|
||||||
existingUser = existingByPhone.get(user.getPhone());
|
|
||||||
}
|
|
||||||
if (existingUser != null) {
|
if (existingUser != null) {
|
||||||
user.setId(existingUser.getId());
|
user.setId(existingUser.getId());
|
||||||
user.setPassword(null);
|
user.setPassword(null);
|
||||||
existsUserIds.add(existingUser.getId());
|
existsUserIds.add(existingUser.getId());
|
||||||
if (shouldSkipOaUpdate(existingUser, user)) {
|
|
||||||
unchangedUserIds.add(existingUser.getId());
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
user.setId(DefaultIdentifierGenerator.getInstance().nextId(null));
|
user.setId(DefaultIdentifierGenerator.getInstance().nextId(null));
|
||||||
user.setPostId("-1");
|
user.setPostId("-1");
|
||||||
@@ -474,9 +441,9 @@ public class OaUserListSyncHelper {
|
|||||||
user.setDataScopeRange(1);
|
user.setDataScopeRange(1);
|
||||||
user.setDataLevelRange(1);
|
user.setDataLevelRange(1);
|
||||||
user.setIncludeNewCustomer(0);
|
user.setIncludeNewCustomer(0);
|
||||||
userService.encryptPhone(user);
|
|
||||||
}
|
}
|
||||||
userMap.put(user.getAccount(), user.getId());
|
userService.encryptPhone(user);
|
||||||
|
userMap.put(user.getOaLoginId(), user.getId());
|
||||||
});
|
});
|
||||||
|
|
||||||
List<User> addUsers = users.stream()
|
List<User> addUsers = users.stream()
|
||||||
@@ -488,18 +455,13 @@ public class OaUserListSyncHelper {
|
|||||||
}
|
}
|
||||||
List<User> updateUsers = users.stream()
|
List<User> updateUsers = users.stream()
|
||||||
.filter(user -> existsUserIds.contains(user.getId()))
|
.filter(user -> existsUserIds.contains(user.getId()))
|
||||||
.filter(user -> !unchangedUserIds.contains(user.getId()))
|
|
||||||
.toList();
|
.toList();
|
||||||
if (CollectionUtil.isNotEmpty(updateUsers)) {
|
if (CollectionUtil.isNotEmpty(updateUsers)) {
|
||||||
ComposeLogUtil.getLastLog().info("批量修改用户:{}", updateUsers.size());
|
ComposeLogUtil.getLastLog().info("批量修改用户:{}", updateUsers.size());
|
||||||
userService.updateBatchById(updateUsers);
|
userService.updateBatchById(updateUsers);
|
||||||
}
|
}
|
||||||
if (!unchangedUserIds.isEmpty()) {
|
ComposeLogUtil.getLastLog().info("缺少OA登录名已跳过的人员:{}", skippedCount);
|
||||||
ComposeLogUtil.getLastLog().info("跳过未变更用户:{}", unchangedUserIds.size());
|
|
||||||
}
|
|
||||||
ComposeLogUtil.getLastLog().info("缺少账号已跳过的人员:{}", skippedCount);
|
|
||||||
int syncedCount = addUsers.size() + updateUsers.size();
|
int syncedCount = addUsers.size() + updateUsers.size();
|
||||||
skippedCount += unchangedUserIds.size();
|
|
||||||
if (userMap.isEmpty()) {
|
if (userMap.isEmpty()) {
|
||||||
return new PersonSyncCount(0, skippedCount);
|
return new PersonSyncCount(0, skippedCount);
|
||||||
}
|
}
|
||||||
@@ -511,11 +473,8 @@ public class OaUserListSyncHelper {
|
|||||||
Set<Long> existsUserDeptIds = new HashSet<>(userDeptMap.values());
|
Set<Long> existsUserDeptIds = new HashSet<>(userDeptMap.values());
|
||||||
List<UserDept> userDeptList = oaPersons.stream()
|
List<UserDept> userDeptList = oaPersons.stream()
|
||||||
.filter(oaPerson -> {
|
.filter(oaPerson -> {
|
||||||
String account = userConvert.resolveAccount(oaPerson);
|
String oaLoginId = resolveOaLoginId(oaPerson);
|
||||||
if (!userMap.containsKey(account)) {
|
return StringUtils.isNotBlank(oaLoginId) && userMap.containsKey(oaLoginId);
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return !unchangedUserIds.contains(userMap.get(account));
|
|
||||||
})
|
})
|
||||||
.map(oaPerson -> this.buildUserDept(oaPerson, userMap, orgIndex))
|
.map(oaPerson -> this.buildUserDept(oaPerson, userMap, orgIndex))
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
@@ -554,7 +513,6 @@ public class OaUserListSyncHelper {
|
|||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
String defaultRoleId = getDefaultRoleId();
|
String defaultRoleId = getDefaultRoleId();
|
||||||
List<User> updateUserParams = list.stream()
|
List<User> updateUserParams = list.stream()
|
||||||
.filter(userDeptIds -> !unchangedUserIds.contains(userDeptIds.getUserId()))
|
|
||||||
.filter(userDeptIds -> {
|
.filter(userDeptIds -> {
|
||||||
if (StringUtils.isBlank(userDeptIds.getDeptIds())) {
|
if (StringUtils.isBlank(userDeptIds.getDeptIds())) {
|
||||||
return false;
|
return false;
|
||||||
@@ -586,18 +544,51 @@ public class OaUserListSyncHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* oaModified 一致则跳过更新;任一侧为空无法确认一致,执行更新以补齐字段
|
* 按 OA 登录名加载已有用户。同一登录名有多条时保留较早的一条,后续同步都更新这一条。
|
||||||
*/
|
*/
|
||||||
private boolean shouldSkipOaUpdate(User existing, User incoming) {
|
private Map<String, User> loadUsersByOaLoginId(String tenantId, Collection<String> oaLoginIds) {
|
||||||
if (existing == null) {
|
Map<String, User> existingByOaLoginId = new HashMap<>();
|
||||||
return false;
|
if (CollectionUtil.isEmpty(oaLoginIds)) {
|
||||||
|
return existingByOaLoginId;
|
||||||
}
|
}
|
||||||
String localModified = StringUtils.trimToEmpty(existing.getOaModified());
|
List<String> oaLoginIdList = oaLoginIds.stream()
|
||||||
String remoteModified = StringUtils.trimToEmpty(incoming == null ? null : incoming.getOaModified());
|
.filter(StringUtils::isNotBlank)
|
||||||
if (localModified.isEmpty() || remoteModified.isEmpty()) {
|
.distinct()
|
||||||
return false;
|
.toList();
|
||||||
|
int batchSize = 500;
|
||||||
|
for (int fromIndex = 0; fromIndex < oaLoginIdList.size(); fromIndex += batchSize) {
|
||||||
|
List<String> oaLoginIdBatch = oaLoginIdList.subList(fromIndex, Math.min(fromIndex + batchSize, oaLoginIdList.size()));
|
||||||
|
userService.list(Wrappers.<User>lambdaQuery()
|
||||||
|
.eq(User::getTenantId, tenantId)
|
||||||
|
.in(User::getOaLoginId, oaLoginIdBatch))
|
||||||
|
.forEach(user -> {
|
||||||
|
String oaLoginId = StringUtils.trimToNull(user.getOaLoginId());
|
||||||
|
if (oaLoginId == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
User previous = existingByOaLoginId.get(oaLoginId);
|
||||||
|
if (previous == null) {
|
||||||
|
existingByOaLoginId.put(oaLoginId, user);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (user.getId() != null && previous.getId() != null && user.getId() < previous.getId()) {
|
||||||
|
ComposeLogUtil.getLastLog().warn("OA登录名重复,保留较早用户 oaLoginId={} keepUserId={} dropUserId={}",
|
||||||
|
oaLoginId, user.getId(), previous.getId());
|
||||||
|
existingByOaLoginId.put(oaLoginId, user);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ComposeLogUtil.getLastLog().warn("OA登录名重复,保留较早用户 oaLoginId={} keepUserId={} dropUserId={}",
|
||||||
|
oaLoginId, previous.getId(), user.getId());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return localModified.equals(remoteModified);
|
return existingByOaLoginId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String resolveOaLoginId(OAPersonResponse oaPerson) {
|
||||||
|
if (oaPerson == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return StringUtils.trimToNull(oaPerson.getLoginid());
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isPersonBypassCode(String deptCode, DeptCategory deptCategory) {
|
private boolean isPersonBypassCode(String deptCode, DeptCategory deptCategory) {
|
||||||
@@ -638,8 +629,8 @@ public class OaUserListSyncHelper {
|
|||||||
Dept department = orgIndex.findDept(oaPerson);
|
Dept department = orgIndex.findDept(oaPerson);
|
||||||
if (department == null || department.getId() == null) {
|
if (department == null || department.getId() == null) {
|
||||||
ComposeLogUtil.getLastLog().warn(
|
ComposeLogUtil.getLastLog().warn(
|
||||||
"人员未匹配到已有部门,请先同步组织架构 account={} departmentid={} departmentname={} subcompanyid1={}",
|
"人员未匹配到已有部门,请先同步组织架构 oaLoginId={} departmentid={} departmentname={} subcompanyid1={}",
|
||||||
userConvert.resolveAccount(oaPerson), oaPerson.getDepartmentid(), oaPerson.getDepartmentname(),
|
resolveOaLoginId(oaPerson), oaPerson.getDepartmentid(), oaPerson.getDepartmentname(),
|
||||||
oaPerson.getSubcompanyid1());
|
oaPerson.getSubcompanyid1());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user