|
@@ -453,6 +453,18 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
|
|
|
return R.data(storeUserVoIPage);
|
|
return R.data(storeUserVoIPage);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // 按 (userId, role_id) 去重,同一用户同一角色只保留一条(保留 id 最小的一条)
|
|
|
|
|
+ userRoles = userRoles.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(StorePlatformUserRole::getId, Comparator.nullsLast(Comparator.naturalOrder())))
|
|
|
|
|
+ .collect(Collectors.toMap(
|
|
|
|
|
+ r -> (r.getUserId() != null ? r.getUserId() : 0) + "_" + (r.getRoleId() != null ? r.getRoleId() : ""),
|
|
|
|
|
+ r -> r,
|
|
|
|
|
+ (a, b) -> a
|
|
|
|
|
+ ))
|
|
|
|
|
+ .values().stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(StorePlatformUserRole::getId, Comparator.nullsLast(Comparator.naturalOrder())))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
|
+
|
|
|
// 按子账号 id/phone/status 过滤:批量查 store_user,只保留对应子账号满足条件的 role
|
|
// 按子账号 id/phone/status 过滤:批量查 store_user,只保留对应子账号满足条件的 role
|
|
|
List<Integer> distinctUserIds = userRoles.stream().map(StorePlatformUserRole::getUserId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
|
List<Integer> distinctUserIds = userRoles.stream().map(StorePlatformUserRole::getUserId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
|
|
List<StoreUser> subAccountList = distinctUserIds.isEmpty() ? Collections.emptyList() : storeUserMapper.selectBatchIds(distinctUserIds);
|
|
List<StoreUser> subAccountList = distinctUserIds.isEmpty() ? Collections.emptyList() : storeUserMapper.selectBatchIds(distinctUserIds);
|
|
@@ -711,6 +723,17 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
|
|
|
String filePath = ExcelGenerator.generateExcel(excelPath + excelGeneratePath + fileName + ".xlsx", new ArrayList<StoreSubExcelVo>(), StoreSubExcelVo.class);
|
|
String filePath = ExcelGenerator.generateExcel(excelPath + excelGeneratePath + fileName + ".xlsx", new ArrayList<StoreSubExcelVo>(), StoreSubExcelVo.class);
|
|
|
return aliOSSUtil.uploadFile(new File(filePath), "excel/" + fileName + ".xlsx");
|
|
return aliOSSUtil.uploadFile(new File(filePath), "excel/" + fileName + ".xlsx");
|
|
|
}
|
|
}
|
|
|
|
|
+ // 按 (userId, role_id) 去重,与 getStoreUserList 子账号分页一致
|
|
|
|
|
+ userRoles = userRoles.stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(StorePlatformUserRole::getId, Comparator.nullsLast(Comparator.naturalOrder())))
|
|
|
|
|
+ .collect(Collectors.toMap(
|
|
|
|
|
+ r -> (r.getUserId() != null ? r.getUserId() : 0) + "_" + (r.getRoleId() != null ? r.getRoleId() : ""),
|
|
|
|
|
+ r -> r,
|
|
|
|
|
+ (a, b) -> a
|
|
|
|
|
+ ))
|
|
|
|
|
+ .values().stream()
|
|
|
|
|
+ .sorted(Comparator.comparing(StorePlatformUserRole::getId, Comparator.nullsLast(Comparator.naturalOrder())))
|
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
List<Integer> distinctUserIds = userRoles.stream().map(StorePlatformUserRole::getUserId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
|
List<Integer> distinctUserIds = userRoles.stream().map(StorePlatformUserRole::getUserId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
|
|
List<StoreUser> subAccountList = distinctUserIds.isEmpty() ? Collections.emptyList() : storeUserMapper.selectBatchIds(distinctUserIds);
|
|
List<StoreUser> subAccountList = distinctUserIds.isEmpty() ? Collections.emptyList() : storeUserMapper.selectBatchIds(distinctUserIds);
|
|
|
Integer statusInt = null;
|
|
Integer statusInt = null;
|
|
@@ -1014,7 +1037,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public void deleteStoreAccountInfo(StoreUserVo storeUserVo) {
|
|
|
|
|
|
|
+ public boolean deleteStoreAccountInfo(StoreUserVo storeUserVo) {
|
|
|
LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
|
|
LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
queryWrapper.eq(StoreUser::getId, storeUserVo.getId());
|
|
queryWrapper.eq(StoreUser::getId, storeUserVo.getId());
|
|
|
queryWrapper.eq(StoreUser::getDeleteFlag, 0);
|
|
queryWrapper.eq(StoreUser::getDeleteFlag, 0);
|
|
@@ -1030,7 +1053,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (storeUser == null) {
|
|
if (storeUser == null) {
|
|
|
- return;
|
|
|
|
|
|
|
+ return false;
|
|
|
}
|
|
}
|
|
|
Integer userId = storeUser.getId();
|
|
Integer userId = storeUser.getId();
|
|
|
String phone = storeUser.getPhone();
|
|
String phone = storeUser.getPhone();
|
|
@@ -1042,69 +1065,62 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
|
|
|
long subAccountCount = storePlatformUserRoleMapper.selectCount(countWrapper);
|
|
long subAccountCount = storePlatformUserRoleMapper.selectCount(countWrapper);
|
|
|
log.info("用户在所有店铺下的子账号数量: userId={}, count={}", userId, subAccountCount);
|
|
log.info("用户在所有店铺下的子账号数量: userId={}, count={}", userId, subAccountCount);
|
|
|
|
|
|
|
|
- // 2. 逻辑删除 store_platform_user_role 表的记录
|
|
|
|
|
- LambdaUpdateWrapper<StorePlatformUserRole> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
- updateWrapper.eq(StorePlatformUserRole::getUserId, userId)
|
|
|
|
|
- .eq(StorePlatformUserRole::getDeleteFlag, 0)
|
|
|
|
|
- .set(StorePlatformUserRole::getDeleteFlag, 1);
|
|
|
|
|
- storePlatformUserRoleMapper.update(null, updateWrapper);
|
|
|
|
|
-
|
|
|
|
|
- // 删除 token
|
|
|
|
|
- String tokenKey = "store_" + phone;
|
|
|
|
|
- baseRedisService.delete(tokenKey);
|
|
|
|
|
-
|
|
|
|
|
- // 3. 如果只是一个账号的子账号(删除前只有1个),则需要进一步判断是否为主账号,再决定是否同时逻辑删除 store_user 表
|
|
|
|
|
- if (subAccountCount == 1) {
|
|
|
|
|
- boolean isMainAccount = storeUser.getStoreId() != null && storeUser.getStoreId() > 0
|
|
|
|
|
- || (storeUser.getAccountType() != null && storeUser.getAccountType() == 1);
|
|
|
|
|
- if (isMainAccount) {
|
|
|
|
|
- // 主账号:物理删除 store_user 及关联数据(主账号校验已通过,无店铺无子账号)
|
|
|
|
|
- nearMeService.removeGeolocation(Boolean.TRUE, userId.toString());
|
|
|
|
|
- storeUserMapper.deleteById(userId);
|
|
|
|
|
- LambdaQueryWrapper<LifeFans> lifeFansWrapper = new LambdaQueryWrapper<LifeFans>()
|
|
|
|
|
- .eq(LifeFans::getFollowedId, "store_" + phone)
|
|
|
|
|
- .or().eq(LifeFans::getFansId, "store_" + phone);
|
|
|
|
|
- lifeFansMapper.delete(lifeFansWrapper);
|
|
|
|
|
- if (storeUser.getStoreId() != null) {
|
|
|
|
|
- storeInfoMapper.deleteById(storeUser.getStoreId());
|
|
|
|
|
- }
|
|
|
|
|
- lifeUserDynamicsMapper.delete(new LambdaQueryWrapper<LifeUserDynamics>().eq(LifeUserDynamics::getPhoneId, "store_" + phone));
|
|
|
|
|
- lifeNoticeMapper.delete(new LambdaQueryWrapper<LifeNotice>().eq(LifeNotice::getReceiverId, "store_" + phone));
|
|
|
|
|
- lifeMessageMapper.delete(new LambdaQueryWrapper<LifeMessage>().eq(LifeMessage::getSenderId, "store_" + phone));
|
|
|
|
|
- lifeMessageMapper.delete(new LambdaQueryWrapper<LifeMessage>().eq(LifeMessage::getReceiverId, "store_" + phone));
|
|
|
|
|
- log.info("主账号仅1条 platform 记录,已物理删除 store_user 及关联数据: userId={}", userId);
|
|
|
|
|
- } else {
|
|
|
|
|
- // 不是主账号,逻辑删除 store_user
|
|
|
|
|
- LambdaUpdateWrapper<StoreUser> userUpdateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
- userUpdateWrapper.eq(StoreUser::getId, userId)
|
|
|
|
|
|
|
+ long roleCount = storePlatformUserRoleMapper.selectCount(new LambdaQueryWrapper<StorePlatformUserRole>().eq(StorePlatformUserRole::getUserId, storeUser.getId()));
|
|
|
|
|
+ if (roleCount != 0||subAccountCount>1){
|
|
|
|
|
+ // 2. 逻辑删除 store_platform_user_role 表的记录
|
|
|
|
|
+ LambdaUpdateWrapper<StorePlatformUserRole> wrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
+ wrapper.eq(StorePlatformUserRole::getUserId, userId)
|
|
|
|
|
+ .eq(StorePlatformUserRole::getDeleteFlag, 0)
|
|
|
|
|
+ .set(StorePlatformUserRole::getDeleteFlag, 1);
|
|
|
|
|
+ storePlatformUserRoleMapper.update(null,wrapper);
|
|
|
|
|
+ log.info("该账号有多个子账号,不删除 store_user 记录: userId={}, count={}", userId, subAccountCount);
|
|
|
|
|
+ String tokenKey = "store_" + phone;
|
|
|
|
|
+ baseRedisService.delete(tokenKey);
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }else if (subAccountCount == 1){
|
|
|
|
|
+ // 2. 逻辑删除 store_platform_user_role 表的记录
|
|
|
|
|
+ LambdaUpdateWrapper<StorePlatformUserRole> updateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
+ updateWrapper.eq(StorePlatformUserRole::getUserId, userId)
|
|
|
|
|
+ .eq(StorePlatformUserRole::getDeleteFlag, 0)
|
|
|
|
|
+ .set(StorePlatformUserRole::getDeleteFlag, 1);
|
|
|
|
|
+ storePlatformUserRoleMapper.update(null, updateWrapper);
|
|
|
|
|
+ // 删除 token
|
|
|
|
|
+ String tokenKey = "store_" + phone;
|
|
|
|
|
+ baseRedisService.delete(tokenKey);
|
|
|
|
|
+ // 3. 如果只是一个账号的子账号(删除前只有1个),则需要进一步判断是否为主账号,再决定是否同时逻辑删除 store_user 表
|
|
|
|
|
+
|
|
|
|
|
+ // 主账号:逻辑删除 store_user 及关联数据(入口已保证无店铺、无子账号)
|
|
|
|
|
+ LambdaUpdateWrapper<StoreUser> userUpdateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
+ userUpdateWrapper.eq(StoreUser::getId, userId)
|
|
|
.eq(StoreUser::getDeleteFlag, 0)
|
|
.eq(StoreUser::getDeleteFlag, 0)
|
|
|
.set(StoreUser::getDeleteFlag, 1);
|
|
.set(StoreUser::getDeleteFlag, 1);
|
|
|
- int userUpdateResult = storeUserMapper.update(null, userUpdateWrapper);
|
|
|
|
|
- if (userUpdateResult > 0) {
|
|
|
|
|
- log.info("用户只有一个子账号且不是主账号,已同时逻辑删除 store_user 记录: userId={}", userId);
|
|
|
|
|
- } else {
|
|
|
|
|
- log.warn("逻辑删除 store_user 记录失败或记录不存在: userId={}", userId);
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- } else if (subAccountCount == 0) {
|
|
|
|
|
- // 无 platform 记录,全量物理删除
|
|
|
|
|
- nearMeService.removeGeolocation(Boolean.TRUE, userId.toString());
|
|
|
|
|
- storeUserMapper.deleteById(userId);
|
|
|
|
|
- LambdaQueryWrapper<LifeFans> lifeFansWrapper = new LambdaQueryWrapper<LifeFans>()
|
|
|
|
|
- .eq(LifeFans::getFollowedId, "store_" + phone)
|
|
|
|
|
- .or().eq(LifeFans::getFansId, "store_" + phone);
|
|
|
|
|
- lifeFansMapper.delete(lifeFansWrapper);
|
|
|
|
|
- if (storeUser.getStoreId() != null) {
|
|
|
|
|
- storeInfoMapper.deleteById(storeUser.getStoreId());
|
|
|
|
|
|
|
+ int userUpdateResult = storeUserMapper.update(null, userUpdateWrapper);
|
|
|
|
|
+ if (userUpdateResult > 0) {
|
|
|
|
|
+ log.info("主账号仅1条 platform 记录,已逻辑删除 store_user: userId={}", userId);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.warn("逻辑删除 store_user 记录失败或记录不存在: userId={}", userId);
|
|
|
}
|
|
}
|
|
|
- lifeUserDynamicsMapper.delete(new LambdaQueryWrapper<LifeUserDynamics>().eq(LifeUserDynamics::getPhoneId, "store_" + phone));
|
|
|
|
|
- lifeNoticeMapper.delete(new LambdaQueryWrapper<LifeNotice>().eq(LifeNotice::getReceiverId, "store_" + phone));
|
|
|
|
|
- lifeMessageMapper.delete(new LambdaQueryWrapper<LifeMessage>().eq(LifeMessage::getSenderId, "store_" + phone));
|
|
|
|
|
- lifeMessageMapper.delete(new LambdaQueryWrapper<LifeMessage>().eq(LifeMessage::getReceiverId, "store_" + phone));
|
|
|
|
|
- log.info("用户无 platform 记录,已物理删除 store_user 及关联数据: userId={}", userId);
|
|
|
|
|
|
|
+ return true;
|
|
|
} else {
|
|
} else {
|
|
|
- log.info("用户有多个子账号(count={}),仅删除 store_platform_user_role 记录,不删除 store_user: userId={}", subAccountCount, userId);
|
|
|
|
|
|
|
+ // 删除 token
|
|
|
|
|
+ String tokenKey = "store_" + phone;
|
|
|
|
|
+ baseRedisService.delete(tokenKey);
|
|
|
|
|
+ LambdaUpdateWrapper<StoreUser> userUpdateWrapper = new LambdaUpdateWrapper<>();
|
|
|
|
|
+ userUpdateWrapper.eq(StoreUser::getId, userId)
|
|
|
|
|
+ .eq(StoreUser::getDeleteFlag, 0)
|
|
|
|
|
+ .set(StoreUser::getDeleteFlag, 1);
|
|
|
|
|
+ int userUpdateResult = storeUserMapper.update(null, userUpdateWrapper);
|
|
|
|
|
+ if (userUpdateResult > 0) {
|
|
|
|
|
+ log.info("用户无 platform 记录且非主账号,已逻辑删除 store_user: userId={}", userId);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.warn("逻辑删除 store_user 记录失败或记录不存在: userId={}", userId);
|
|
|
|
|
+ }
|
|
|
|
|
+ return true;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|