wuchen пре 2 месеци
родитељ
комит
7f0db5b878

+ 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);
 
     /**
      * 获取主键集合

+ 168 - 87
alien-store/src/main/java/shop/alien/store/service/impl/StoreUserServiceImpl.java

@@ -453,18 +453,56 @@ 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);
-            Map<Integer, StoreUser> subAccountMap = subAccountList == null ? new HashMap<>() : subAccountList.stream().filter(u -> u.getDeleteFlag() != null && u.getDeleteFlag() == 0).collect(Collectors.toMap(StoreUser::getId, u -> u, (a, b) -> a));
+            // 根据 status 参数决定子账号池:选「注销中/已注销」时只保留对应状态;否则排除注销中、已注销
+            Map<Integer, StoreUser> subAccountMap;
+            if (status != null && (status == -1 || status == 2)) {
+                final int filterStatus = status;
+                subAccountMap = subAccountList == null ? new HashMap<>() : subAccountList.stream()
+                        .filter(u -> u.getDeleteFlag() != null && u.getDeleteFlag() == 0)
+                        .filter(u -> {
+                            if (filterStatus == -1) return u.getStatus() != null && u.getStatus() == -1;
+                            return (u.getStatus() != null && u.getStatus() == 2) || (u.getLogoutFlag() != null && u.getLogoutFlag() == 1);
+                        })
+                        .collect(Collectors.toMap(StoreUser::getId, u -> u, (a, b) -> a));
+            } else {
+                subAccountMap = subAccountList == null ? new HashMap<>() : subAccountList.stream()
+                        .filter(u -> u.getDeleteFlag() != null && u.getDeleteFlag() == 0
+                                && (u.getLogoutFlag() == null || u.getLogoutFlag() == 0)
+                                && (u.getStatus() == null || (u.getStatus() != -1 && u.getStatus() != 2)))
+                        .collect(Collectors.toMap(StoreUser::getId, u -> u, (a, b) -> a));
+            }
             List<StorePlatformUserRole> filteredRoles = new ArrayList<>();
             for (StorePlatformUserRole role : userRoles) {
                 StoreUser subAccount = subAccountMap.get(role.getUserId());
                 if (subAccount == null) continue;
-                if (StringUtils.isNotEmpty(id) && (subAccount.getId() == null || !String.valueOf(subAccount.getId()).contains(id))) continue;
-                if (StringUtils.isNotEmpty(phone) && (subAccount.getPhone() == null || !subAccount.getPhone().contains(phone))) continue;
-                // 子账号行展示状态以 role.status 为准,筛选时与之一致
-                int rowStatus = role.getStatus() != null ? role.getStatus() : (subAccount.getStatus() != null ? subAccount.getStatus() : 0);
+                if (StringUtils.isNotEmpty(id) && (subAccount.getId() == null || !String.valueOf(subAccount.getId()).contains(id)))
+                    continue;
+                if (StringUtils.isNotEmpty(phone) && (subAccount.getPhone() == null || !subAccount.getPhone().contains(phone)))
+                    continue;
+                // 状态筛选:选「注销中/已注销」时以 store_user 为准(已由 subAccountMap 限定);否则以 role.status 为准
+                int rowStatus;
+                if (status != null && (status == -1 || status == 2)) {
+                    rowStatus = (subAccount.getStatus() != null && subAccount.getStatus() == -1) ? -1
+                            : ((subAccount.getStatus() != null && subAccount.getStatus() == 2) || (subAccount.getLogoutFlag() != null && subAccount.getLogoutFlag() == 1)) ? 2
+                            : (subAccount.getStatus() != null ? subAccount.getStatus() : 0);
+                } else {
+                    rowStatus = role.getStatus() != null ? role.getStatus() : (subAccount.getStatus() != null ? subAccount.getStatus() : 0);
+                }
                 if (status != null && !status.equals(rowStatus)) continue;
                 filteredRoles.add(role);
             }
@@ -498,10 +536,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
                 if (subAccount == null) continue;
                 StoreUserVo storeUserVo = new StoreUserVo();
                 BeanUtils.copyProperties(subAccount, storeUserVo);
-                // 子账号端:以 store_platform_user_role.status 为准(0 启用 1 禁用)。既是主账号也是子账号时禁用只改 role,子账号行展示禁用;纯子账号被禁用/启用后此处同步展示
-                int rowStatus = role.getStatus() != null ? role.getStatus() : (subAccount.getStatus() != null ? subAccount.getStatus() : 0);
-                storeUserVo.setStatus(rowStatus);
-                storeUserVo.setSwitchStatus(rowStatus == 0);
+                storeUserVo.setSwitchStatus(subAccount.getStatus() != null && subAccount.getStatus() == 0);
                 storeUserVo.setPhone(subAccount.getPhone());
                 StoreUser mainAccount = role.getStoreId() == null ? null : mainAccountMap.get(role.getStoreId());
                 if (mainAccount != null) {
@@ -517,13 +552,15 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             return R.data(storeUserVoIPage);
         }
 
-        // 主账号分支:直接查库返回最新 status,主账号页面展示子账号数量(按 store_platform_user_role 统计)
+        // 主账号分支:直接查库返回最新 status,主账号页面展示子账号数量(按 store_platform_user_role 统计);排除注销中、已注销
         LambdaQueryWrapper<StoreUser> storeUserLambdaQueryWrapper = new LambdaQueryWrapper<>();
         storeUserLambdaQueryWrapper.eq(StoreUser::getDeleteFlag, 0)
                 .like(StringUtils.isNotEmpty(id), StoreUser::getId, id)
                 .like(StringUtils.isNotEmpty(phone), StoreUser::getPhone, phone)
                 .eq(status != null, StoreUser::getStatus, status)
                 .eq(StoreUser::getAccountType, 1)
+                .and(w -> w.isNull(StoreUser::getLogoutFlag).or().eq(StoreUser::getLogoutFlag, 0))
+                .and(w -> w.isNull(StoreUser::getStatus).or().in(StoreUser::getStatus, 0, 1))
                 .orderByDesc(StoreUser::getCreatedTime);
 
         IPage<StoreUser> storeUsers = storeUserMapper.selectPage(page, storeUserLambdaQueryWrapper);
@@ -535,10 +572,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             BeanUtils.copyProperties(storeUser, vo);
             vo.setPassword(null);
             vo.setPayPassword(null);
-            // 主账号端:以 store_user.status 为准(0 启用 1 禁用)。既是主账号也是子账号时禁用只改 role,主账号仍启用;无子账号的主账号被禁用后此处展示禁用
-            int mainStatus = storeUser.getStatus() != null ? storeUser.getStatus() : 0;
-            vo.setStatus(mainStatus);
-            vo.setSwitchStatus(mainStatus == 0);
+            vo.setSwitchStatus(storeUser.getStatus() != null && storeUser.getStatus() == 0);
             int childCount = countSubAccountUserIdsByStoreId(storeUser.getStoreId(), storeUser.getId());
             vo.setChildAccountCount(childCount);
             List<Integer> childUserIds = getSubAccountUserIdsByStoreId(storeUser.getStoreId(), storeUser.getId());
@@ -552,13 +586,17 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         return R.data(storeUserVoIPage);
     }
 
-    /** 按 store_platform_user_role 统计该店铺下子账号数量(排除主账号自身,按 distinct user_id 计) */
+    /**
+     * 按 store_platform_user_role 统计该店铺下子账号数量(排除主账号自身,按 distinct user_id 计)
+     */
     private int countSubAccountUserIdsByStoreId(Integer storeId, Integer excludeUserId) {
         List<Integer> userIds = getSubAccountUserIdsByStoreId(storeId, excludeUserId);
         return userIds == null ? 0 : userIds.size();
     }
 
-    /** 按 store_platform_user_role 查询该店铺下子账号 userId 列表(排除主账号自身) */
+    /**
+     * 按 store_platform_user_role 查询该店铺下子账号 userId 列表(排除主账号自身)
+     */
     private List<Integer> getSubAccountUserIdsByStoreId(Integer storeId, Integer excludeUserId) {
         if (storeId == null) return Collections.emptyList();
         LambdaQueryWrapper<StorePlatformUserRole> w = new LambdaQueryWrapper<>();
@@ -586,7 +624,6 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
     }
 
 
-
     /**
      * web端切换商家端用户状态(主账号底下有子账号时禁止禁用;子账号无限制)。
      * 若同一账号既是主账号又是子账号:禁用时只禁用子账号角色,主账号保持启用。
@@ -641,7 +678,8 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
     }
 
     /**
-     *  分页查询
+     * 分页查询
+     *
      * @param
      * @param
      * @param id
@@ -653,7 +691,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
     @Override
     public String exportExcel(String id, String phone, String status, Integer accountType) throws IOException {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-        // 主账号导出:与 getStoreUserList 主账号分支一致,子账号数量按 store_platform_user_role 统计
+        // 主账号导出:与 getStoreUserList 主账号分支一致,子账号数量按 store_platform_user_role 统计;排除注销中、已注销
         if (accountType == 1) {
             LambdaQueryWrapper<StoreUser> wrapper = new LambdaQueryWrapper<>();
             wrapper.eq(StoreUser::getDeleteFlag, 0)
@@ -661,6 +699,8 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
                     .like(StringUtils.isNotEmpty(phone), StoreUser::getPhone, phone)
                     .eq(StringUtils.isNotEmpty(status), StoreUser::getStatus, status)
                     .eq(StoreUser::getAccountType, 1)
+                    .and(w -> w.isNull(StoreUser::getLogoutFlag).or().eq(StoreUser::getLogoutFlag, 0))
+                    .and(w -> w.isNull(StoreUser::getStatus).or().in(StoreUser::getStatus, 0, 1))
                     .orderByDesc(StoreUser::getCreatedTime);
             List<StoreUser> storeUsers = storeUserMapper.selectList(wrapper);
             List<StoreUserExcelVo> storeUserExcelVoList = new ArrayList<>();
@@ -687,16 +727,61 @@ 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);
-        Map<Integer, StoreUser> subAccountMap = subAccountList == null ? new HashMap<>() : subAccountList.stream().filter(u -> u.getDeleteFlag() != null && u.getDeleteFlag() == 0).collect(Collectors.toMap(StoreUser::getId, u -> u, (a, b) -> a));
+        Integer statusInt = null;
+        if (StringUtils.isNotEmpty(status)) {
+            try {
+                statusInt = Integer.parseInt(status.trim());
+            } catch (NumberFormatException ignored) {
+            }
+        }
+        // 与 getStoreUserList 一致:选「注销中/已注销」时只保留对应状态;否则排除注销中、已注销
+        Map<Integer, StoreUser> subAccountMap;
+        if (statusInt != null && (statusInt == -1 || statusInt == 2)) {
+            final int filterStatus = statusInt;
+            subAccountMap = subAccountList == null ? new HashMap<>() : subAccountList.stream()
+                    .filter(u -> u.getDeleteFlag() != null && u.getDeleteFlag() == 0)
+                    .filter(u -> {
+                        if (filterStatus == -1) return u.getStatus() != null && u.getStatus() == -1;
+                        return (u.getStatus() != null && u.getStatus() == 2) || (u.getLogoutFlag() != null && u.getLogoutFlag() == 1);
+                    })
+                    .collect(Collectors.toMap(StoreUser::getId, u -> u, (a, b) -> a));
+        } else {
+            subAccountMap = subAccountList == null ? new HashMap<>() : subAccountList.stream()
+                    .filter(u -> u.getDeleteFlag() != null && u.getDeleteFlag() == 0
+                            && (u.getLogoutFlag() == null || u.getLogoutFlag() == 0)
+                            && (u.getStatus() == null || (u.getStatus() != -1 && u.getStatus() != 2)))
+                    .collect(Collectors.toMap(StoreUser::getId, u -> u, (a, b) -> a));
+        }
         List<StorePlatformUserRole> filteredRoles = new ArrayList<>();
         for (StorePlatformUserRole role : userRoles) {
             StoreUser subAccount = subAccountMap.get(role.getUserId());
             if (subAccount == null) continue;
-            if (StringUtils.isNotEmpty(id) && (subAccount.getId() == null || !String.valueOf(subAccount.getId()).contains(id))) continue;
-            if (StringUtils.isNotEmpty(phone) && (subAccount.getPhone() == null || !subAccount.getPhone().contains(phone))) continue;
-            if (status != null && !status.equals(subAccount.getStatus())) continue;
+            if (StringUtils.isNotEmpty(id) && (subAccount.getId() == null || !String.valueOf(subAccount.getId()).contains(id)))
+                continue;
+            if (StringUtils.isNotEmpty(phone) && (subAccount.getPhone() == null || !subAccount.getPhone().contains(phone)))
+                continue;
+            int rowStatus;
+            if (statusInt != null && (statusInt == -1 || statusInt == 2)) {
+                rowStatus = (subAccount.getStatus() != null && subAccount.getStatus() == -1) ? -1
+                        : ((subAccount.getStatus() != null && subAccount.getStatus() == 2) || (subAccount.getLogoutFlag() != null && subAccount.getLogoutFlag() == 1)) ? 2
+                        : (subAccount.getStatus() != null ? subAccount.getStatus() : 0);
+            } else {
+                rowStatus = role.getStatus() != null ? role.getStatus() : (subAccount.getStatus() != null ? subAccount.getStatus() : 0);
+            }
+            if (statusInt != null && !statusInt.equals(rowStatus)) continue;
             filteredRoles.add(role);
         }
         filteredRoles.sort(Comparator.comparing(StorePlatformUserRole::getId, Comparator.nullsLast(Comparator.naturalOrder())));
@@ -718,7 +803,10 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             vo.setId(subAccount.getId());
             vo.setPhone(subAccount.getPhone());
             vo.setCreatedTime(subAccount.getCreatedTime() != null ? subAccount.getCreatedTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime().format(formatter) : null);
-            vo.setStatus(subAccount.getStatus() == null ? "" : (subAccount.getStatus() == 0 ? "启用" : "禁用"));
+            int rowStatus = (subAccount.getStatus() != null && subAccount.getStatus() == -1) ? -1
+                    : ((subAccount.getStatus() != null && subAccount.getStatus() == 2) || (subAccount.getLogoutFlag() != null && subAccount.getLogoutFlag() == 1)) ? 2
+                    : (role.getStatus() != null ? role.getStatus() : (subAccount.getStatus() != null ? subAccount.getStatus() : 0));
+            vo.setStatus(rowStatus == -1 ? "注销中" : rowStatus == 2 ? "已注销" : (rowStatus == 0 ? "启用" : "禁用"));
             StoreUser mainAccount = role.getStoreId() == null ? null : mainAccountMap.get(role.getStoreId());
             if (mainAccount != null) {
                 vo.setParentAccountPhone(mainAccount.getPhone());
@@ -728,6 +816,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         String fileName = UUID.randomUUID().toString().replace("-", "");
         String filePath = ExcelGenerator.generateExcel(excelPath + excelGeneratePath + fileName + ".xlsx", storeSubExcelVoList, StoreSubExcelVo.class);
         return aliOSSUtil.uploadFile(new File(filePath), "excel/" + fileName + ".xlsx");
+
     }
 
 
@@ -953,12 +1042,13 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
     }
 
     /**
-     *  删除门店
+     * 删除门店
+     *
      * @param storeUserVo
      */
 
     @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);
@@ -974,7 +1064,7 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             }
         }
         if (storeUser == null) {
-            return;
+            return false;
         }
         Integer userId = storeUser.getId();
         String phone = storeUser.getPhone();
@@ -986,69 +1076,59 @@ 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);
+        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("主账号仅1条 platform 记录,已逻辑删除 store_user: userId={}", userId);
             } else {
-                // 不是主账号,逻辑删除 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());
+                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
@@ -1134,5 +1214,6 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             log.warn("无法解析字符串为整数: {}", str);
             return null;
         }
+
     }
-}
+}