补充自动同步的手机号码

This commit is contained in:
2026-04-29 23:12:18 +08:00
parent a8338f3bcf
commit 97e90e2742

View File

@@ -27,6 +27,8 @@ import java.util.UUID;
public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMapper, LbDepartmentUser> public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMapper, LbDepartmentUser>
implements ILbDepartmentUserService { implements ILbDepartmentUserService {
private static final int PURCHASE_APPLY_BATCH_SIZE = 200;
@Autowired @Autowired
private LbDailyUserTradeMapper lbDailyUserTradeMapper; private LbDailyUserTradeMapper lbDailyUserTradeMapper;
@Autowired @Autowired
@@ -259,6 +261,8 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
.ge(LbDailyUserTrade::getReportDate, startDate) .ge(LbDailyUserTrade::getReportDate, startDate)
.le(LbDailyUserTrade::getReportDate, endDate) .le(LbDailyUserTrade::getReportDate, endDate)
.isNotNull(LbDailyUserTrade::getNickname) .isNotNull(LbDailyUserTrade::getNickname)
.orderByDesc(LbDailyUserTrade::getUpdatedAt)
.orderByDesc(LbDailyUserTrade::getCreatedAt)
); );
if (tradeList == null || tradeList.isEmpty()) { if (tradeList == null || tradeList.isEmpty()) {
result.put("success", true); result.put("success", true);
@@ -271,51 +275,74 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
return result; return result;
} }
List<LbDepartmentUser> existedUsers = this.list( List<LbDepartmentUser> existedUsers = this.list();
new LambdaQueryWrapper<LbDepartmentUser>() Map<String, LbDepartmentUser> existingUserMap = new HashMap<>();
.select(LbDepartmentUser::getName)
);
Set<String> existingNameSet = new HashSet<>();
for (LbDepartmentUser user : existedUsers) { for (LbDepartmentUser user : existedUsers) {
if (user.getName() != null && !user.getName().trim().isEmpty()) { if (user.getName() != null && !user.getName().trim().isEmpty()) {
existingNameSet.add(user.getName().trim()); existingUserMap.put(user.getName().trim(), user);
} }
} }
Map<String, LbDailyUserTrade> latestTradeByNickname = new HashMap<>();
List<LbDepartmentUser> toInsert = new ArrayList<>(); List<LbDepartmentUser> toInsert = new ArrayList<>();
List<LbDepartmentUser> toUpdate = new ArrayList<>();
int skippedCount = 0; int skippedCount = 0;
LocalDateTime now = LocalDateTime.now(); LocalDateTime now = LocalDateTime.now();
Set<String> candidateNicknameSet = new HashSet<>();
for (LbDailyUserTrade trade : tradeList) { for (LbDailyUserTrade trade : tradeList) {
String nickname = trade.getNickname() == null ? null : trade.getNickname().trim(); String nickname = trade.getNickname() == null ? null : trade.getNickname().trim();
if (nickname == null || nickname.isEmpty()) { if (nickname == null || nickname.isEmpty()) {
skippedCount++; skippedCount++;
continue; continue;
} }
if (existingNameSet.contains(nickname)) { candidateNicknameSet.add(nickname);
skippedCount++; // tradeList 已按更新时间倒序,首次写入即最新数据
continue; latestTradeByNickname.putIfAbsent(nickname, trade);
} }
LbDepartmentUser entity = new LbDepartmentUser(); Map<String, LbPurchaseApply> phoneMap = buildPurchaseApplyPhoneMap(candidateNicknameSet);
entity.setId(UUID.randomUUID().toString()); for (Map.Entry<String, LbDailyUserTrade> entry : latestTradeByNickname.entrySet()) {
String nickname = entry.getKey();
LbDailyUserTrade trade = entry.getValue();
LbDepartmentUser entity = existingUserMap.get(nickname);
boolean isInsert = false;
if (entity == null) {
entity = new LbDepartmentUser();
entity.setId(UUID.randomUUID().toString());
entity.setCreateTime(now);
isInsert = true;
}
entity.setTenantId(trade.getTenantId()); entity.setTenantId(trade.getTenantId());
entity.setUserId(trade.getUserId()); entity.setUserId(trade.getUserId());
entity.setName(nickname); entity.setName(nickname);
// 若手机号为空,则尝试从进货申请表补齐 entity.setParentId(trade.getPromoterId());
entity.setPhone(findPhoneFromPurchaseApply(trade.getTenantId(), nickname)); entity.setParentName(trade.getPromoterName());
entity.setCreateTime(now);
LbPurchaseApply purchaseApply = phoneMap.get(buildPhoneKey(trade.getTenantId(), nickname));
if (purchaseApply != null && purchaseApply.getApplyPhone() != null) {
String phone = purchaseApply.getApplyPhone().trim();
entity.setPhone(phone.isEmpty() ? null : phone);
entity.setJoinDate(purchaseApply.getApplyDate());
}
entity.setUpdateTime(now); entity.setUpdateTime(now);
toInsert.add(entity); if (isInsert) {
existingNameSet.add(nickname); toInsert.add(entity);
} else {
toUpdate.add(entity);
}
} }
if (!toInsert.isEmpty()) { if (!toInsert.isEmpty()) {
this.saveBatch(toInsert); this.saveBatch(toInsert);
} }
if (!toUpdate.isEmpty()) {
this.updateBatchById(toUpdate);
}
result.put("success", true); result.put("success", true);
result.put("message", "同步完成"); result.put("message", "同步完成");
result.put("insertedCount", toInsert.size()); result.put("insertedCount", toInsert.size());
result.put("updatedCount", toUpdate.size());
result.put("skippedCount", skippedCount); result.put("skippedCount", skippedCount);
result.put("sourceCount", tradeList.size()); result.put("sourceCount", tradeList.size());
result.put("startDate", startDate); result.put("startDate", startDate);
@@ -328,24 +355,44 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl<LbDepartmentUserMap
} }
} }
private String findPhoneFromPurchaseApply(String tenantId, String applyUser) { private Map<String, LbPurchaseApply> buildPurchaseApplyPhoneMap(Set<String> applyUserSet) {
if (applyUser == null || applyUser.trim().isEmpty()) { Map<String, LbPurchaseApply> phoneMap = new HashMap<>();
return null; if (applyUserSet == null || applyUserSet.isEmpty()) {
return phoneMap;
} }
LambdaQueryWrapper<LbPurchaseApply> queryWrapper = new LambdaQueryWrapper<>();
if (tenantId != null && !tenantId.trim().isEmpty()) { List<String> applyUserList = new ArrayList<>(applyUserSet);
queryWrapper.eq(LbPurchaseApply::getTenantId, tenantId.trim()); for (int i = 0; i < applyUserList.size(); i += PURCHASE_APPLY_BATCH_SIZE) {
int end = Math.min(i + PURCHASE_APPLY_BATCH_SIZE, applyUserList.size());
List<String> batchUsers = applyUserList.subList(i, end);
List<LbPurchaseApply> purchaseApplyList = lbPurchaseApplyMapper.selectList(
new LambdaQueryWrapper<LbPurchaseApply>()
.in(LbPurchaseApply::getApplyUser, batchUsers)
.isNotNull(LbPurchaseApply::getApplyPhone)
.orderByDesc(LbPurchaseApply::getUpdateTime)
.orderByDesc(LbPurchaseApply::getCreateTime)
);
for (LbPurchaseApply item : purchaseApplyList) {
if (item.getApplyUser() == null || item.getApplyPhone() == null) {
continue;
}
String applyUser = item.getApplyUser().trim();
String phone = item.getApplyPhone().trim();
if (applyUser.isEmpty() || phone.isEmpty()) {
continue;
}
String key = buildPhoneKey(item.getTenantId(), applyUser);
// 已按更新时间倒序,首次写入即最新手机号
phoneMap.putIfAbsent(key, item);
}
} }
queryWrapper.eq(LbPurchaseApply::getApplyUser, applyUser.trim()) return phoneMap;
.isNotNull(LbPurchaseApply::getApplyPhone) }
.orderByDesc(LbPurchaseApply::getUpdateTime)
.orderByDesc(LbPurchaseApply::getCreateTime) private String buildPhoneKey(String tenantId, String applyUser) {
.last("limit 1"); String tenantPart = tenantId == null ? "" : tenantId.trim();
LbPurchaseApply purchaseApply = lbPurchaseApplyMapper.selectOne(queryWrapper); String userPart = applyUser == null ? "" : applyUser.trim();
if (purchaseApply == null || purchaseApply.getApplyPhone() == null) { return tenantPart + "#" + userPart;
return null;
}
String phone = purchaseApply.getApplyPhone().trim();
return phone.isEmpty() ? null : phone;
} }
} }