wuchen 2 месяцев назад
Родитель
Сommit
838fc03999

+ 1 - 1
alien-store/src/main/java/shop/alien/store/service/StoreUserService.java

@@ -175,7 +175,7 @@ public interface StoreUserService extends IService<StoreUser> {
     /**
      * 手动删除商家账号及店铺 进行校验
      */
-    void deleteStoreAccountInfo(StoreUserVo storeUserVo);
+    boolean deleteStoreAccountInfo(StoreUserVo storeUserVo);
 
     /**
      * 获取主键集合

+ 76 - 60
alien-store/src/main/java/shop/alien/store/service/impl/StoreUserServiceImpl.java

@@ -453,6 +453,18 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
                 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
             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);
@@ -711,6 +723,17 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             String filePath = ExcelGenerator.generateExcel(excelPath + excelGeneratePath + fileName + ".xlsx", new ArrayList<StoreSubExcelVo>(), StoreSubExcelVo.class);
             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<StoreUser> subAccountList = distinctUserIds.isEmpty() ? Collections.emptyList() : storeUserMapper.selectBatchIds(distinctUserIds);
         Integer statusInt = null;
@@ -1014,7 +1037,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
      */
 
     @Override
-    public void deleteStoreAccountInfo(StoreUserVo storeUserVo) {
+    public boolean deleteStoreAccountInfo(StoreUserVo storeUserVo) {
         LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(StoreUser::getId, storeUserVo.getId());
         queryWrapper.eq(StoreUser::getDeleteFlag, 0);
@@ -1030,7 +1053,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             }
         }
         if (storeUser == null) {
-            return;
+            return false;
         }
         Integer userId = storeUser.getId();
         String phone = storeUser.getPhone();
@@ -1042,69 +1065,62 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         long subAccountCount = storePlatformUserRoleMapper.selectCount(countWrapper);
         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)
                         .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 {
-            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