From 97e90e27422cf847c28e2bd458d00ac194323174 Mon Sep 17 00:00:00 2001 From: cst61 Date: Wed, 29 Apr 2026 23:12:18 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E8=87=AA=E5=8A=A8=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E7=9A=84=E6=89=8B=E6=9C=BA=E5=8F=B7=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/LbDepartmentUserServiceImpl.java | 115 ++++++++++++------ 1 file changed, 81 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/rj/service/impl/LbDepartmentUserServiceImpl.java b/src/main/java/com/rj/service/impl/LbDepartmentUserServiceImpl.java index 7e39e4a..1ddeea8 100644 --- a/src/main/java/com/rj/service/impl/LbDepartmentUserServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbDepartmentUserServiceImpl.java @@ -27,6 +27,8 @@ import java.util.UUID; public class LbDepartmentUserServiceImpl extends ServiceImpl implements ILbDepartmentUserService { + private static final int PURCHASE_APPLY_BATCH_SIZE = 200; + @Autowired private LbDailyUserTradeMapper lbDailyUserTradeMapper; @Autowired @@ -259,6 +261,8 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl existedUsers = this.list( - new LambdaQueryWrapper() - .select(LbDepartmentUser::getName) - ); - Set existingNameSet = new HashSet<>(); + List existedUsers = this.list(); + Map existingUserMap = new HashMap<>(); for (LbDepartmentUser user : existedUsers) { if (user.getName() != null && !user.getName().trim().isEmpty()) { - existingNameSet.add(user.getName().trim()); + existingUserMap.put(user.getName().trim(), user); } } + Map latestTradeByNickname = new HashMap<>(); List toInsert = new ArrayList<>(); + List toUpdate = new ArrayList<>(); int skippedCount = 0; LocalDateTime now = LocalDateTime.now(); + Set candidateNicknameSet = new HashSet<>(); for (LbDailyUserTrade trade : tradeList) { String nickname = trade.getNickname() == null ? null : trade.getNickname().trim(); if (nickname == null || nickname.isEmpty()) { skippedCount++; continue; } - if (existingNameSet.contains(nickname)) { - skippedCount++; - continue; - } + candidateNicknameSet.add(nickname); + // tradeList 已按更新时间倒序,首次写入即最新数据 + latestTradeByNickname.putIfAbsent(nickname, trade); + } - LbDepartmentUser entity = new LbDepartmentUser(); - entity.setId(UUID.randomUUID().toString()); + Map phoneMap = buildPurchaseApplyPhoneMap(candidateNicknameSet); + for (Map.Entry 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.setUserId(trade.getUserId()); entity.setName(nickname); - // 若手机号为空,则尝试从进货申请表补齐 - entity.setPhone(findPhoneFromPurchaseApply(trade.getTenantId(), nickname)); - entity.setCreateTime(now); + entity.setParentId(trade.getPromoterId()); + entity.setParentName(trade.getPromoterName()); + + 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); - toInsert.add(entity); - existingNameSet.add(nickname); + if (isInsert) { + toInsert.add(entity); + } else { + toUpdate.add(entity); + } } if (!toInsert.isEmpty()) { this.saveBatch(toInsert); } + if (!toUpdate.isEmpty()) { + this.updateBatchById(toUpdate); + } result.put("success", true); result.put("message", "同步完成"); result.put("insertedCount", toInsert.size()); + result.put("updatedCount", toUpdate.size()); result.put("skippedCount", skippedCount); result.put("sourceCount", tradeList.size()); result.put("startDate", startDate); @@ -328,24 +355,44 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl buildPurchaseApplyPhoneMap(Set applyUserSet) { + Map phoneMap = new HashMap<>(); + if (applyUserSet == null || applyUserSet.isEmpty()) { + return phoneMap; } - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - if (tenantId != null && !tenantId.trim().isEmpty()) { - queryWrapper.eq(LbPurchaseApply::getTenantId, tenantId.trim()); + + List applyUserList = new ArrayList<>(applyUserSet); + for (int i = 0; i < applyUserList.size(); i += PURCHASE_APPLY_BATCH_SIZE) { + int end = Math.min(i + PURCHASE_APPLY_BATCH_SIZE, applyUserList.size()); + List batchUsers = applyUserList.subList(i, end); + + List purchaseApplyList = lbPurchaseApplyMapper.selectList( + new LambdaQueryWrapper() + .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()) - .isNotNull(LbPurchaseApply::getApplyPhone) - .orderByDesc(LbPurchaseApply::getUpdateTime) - .orderByDesc(LbPurchaseApply::getCreateTime) - .last("limit 1"); - LbPurchaseApply purchaseApply = lbPurchaseApplyMapper.selectOne(queryWrapper); - if (purchaseApply == null || purchaseApply.getApplyPhone() == null) { - return null; - } - String phone = purchaseApply.getApplyPhone().trim(); - return phone.isEmpty() ? null : phone; + return phoneMap; + } + + private String buildPhoneKey(String tenantId, String applyUser) { + String tenantPart = tenantId == null ? "" : tenantId.trim(); + String userPart = applyUser == null ? "" : applyUser.trim(); + return tenantPart + "#" + userPart; } }