补充自动同步的手机号码
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user