Przeglądaj źródła

中台bug修复
商家端代码提交

wuchen 2 miesięcy temu
rodzic
commit
951c33364c

+ 0 - 11
alien-store/src/main/java/shop/alien/store/controller/StoreUserController.java

@@ -281,17 +281,6 @@ public class StoreUserController {
         return R.success("初始化成功");
     }
 
-    /**
-     * web端删除商家端用户
-     */
-    @ApiOperation("web端删除商家端用户")
-    @ApiOperationSupport(order = 7)
-    @DeleteMapping("/deleteStoreUser")
-    public R<StoreUserVo> deleteStoreUser(@RequestParam(value = "id") String id) {
-        log.info("StoreUserController.deleteStoreUser?id={}", id);
-        return storeUserService.deleteStoreUser(id);
-    }
-
 
 
     /**

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

@@ -117,12 +117,7 @@ public interface StoreUserService extends IService<StoreUser> {
      */
     void resetStoreUserPassword(StoreUser storeUser);
 
-    /**
-     * web端编辑用户列表
-     *
-     * @return boolean
-     */
-    R<StoreUserVo> deleteStoreUser(String id);
+
 
     /**
      * web端切换商家端用户状态

+ 119 - 55
alien-store/src/main/java/shop/alien/store/service/impl/StoreUserServiceImpl.java

@@ -252,12 +252,10 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
     public Map<String, String> changePhoneVerification(String phone, String oldPassword, String verificationCode) {
         Map<String, String> changePhoneMap = new HashMap<>();
         if (oldPassword != null && !oldPassword.equals("")) {
-            LambdaQueryWrapper<StoreUser> userLambdaQueryWrapper = new LambdaQueryWrapper<>();
-            userLambdaQueryWrapper.eq(StoreUser::getPhone, phone);
-            StoreUser storeUser = this.getOne(userLambdaQueryWrapper);
-            // 由于password字段使用了EncryptTypeHandler,查询时密码会被自动解密
-            // 所以这里直接比较解密后的密码和用户输入的明文密码
-            if (storeUser != null && storeUser.getPassword() != null && storeUser.getPassword().equals(oldPassword)) {
+            LambdaUpdateWrapper<StoreUser> userLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+            userLambdaUpdateWrapper.eq(StoreUser::getPhone, phone);
+            StoreUser storeUser = this.getOne(userLambdaUpdateWrapper);
+            if (storeUser.getPassword().equals(oldPassword)) {
                 changePhoneMap.put("passwordStatus", "1");
                 return changePhoneMap;
             } else {
@@ -562,7 +560,6 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         return list == null ? Collections.emptyList() : list.stream().map(StorePlatformUserRole::getUserId).distinct().collect(Collectors.toList());
     }
 
-
     @Override
     public R<StoreUserVo> editStoreUser(StoreUser storeUser) {
         storeUserMapper.updateById(storeUser);
@@ -580,40 +577,6 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         storeUserMapper.updateById(storeUserById);
     }
 
-    @Override
-    public R<StoreUserVo> deleteStoreUser(String id) {
-        StoreUser storeUser = storeUserMapper.selectById(id);
-        String phone = storeUser.getPhone();
-        Integer storeId = storeUser.getStoreId();
-
-        // 判断该账号是否关联店铺
-        if (ObjectUtils.isNotEmpty(storeId)) {
-            List<StoreInfo> storeInfos = storeInfoMapper.selectList(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId, storeId).eq(StoreInfo::getDeleteFlag, 0).eq(StoreInfo::getLogoutFlag, 0));
-            if (ObjectUtils.isNotEmpty(storeInfos)) {
-                return R.fail("请删除店铺后再删除账号");
-            }
-        }
-
-        storeUserMapper.deleteById(id);
-        //删除用户redis中的token
-        baseRedisService.delete("store_" + storeUser.getPhone());
-        //删除该账号的店铺
-        storeInfoMapper.delete(new LambdaQueryWrapper<StoreInfo>().eq(StoreInfo::getId, storeId));
-        //删除该账号的动态
-        lifeUserDynamicsMapper.delete(new LambdaQueryWrapper<LifeUserDynamics>().eq(LifeUserDynamics::getPhoneId, "store_" + phone));
-        //删除该账号关注的信息
-        lifeFansMapper.delete(new LambdaQueryWrapper<LifeFans>().eq(LifeFans::getFansId, "store_" + phone));
-        //删除关注该账号的信息
-        lifeFansMapper.delete(new LambdaQueryWrapper<LifeFans>().eq(LifeFans::getFollowedId, "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));
-
-        return R.success("删除成功");
-    }
 
 
     /**
@@ -638,8 +601,22 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
             // 禁用时删除 token
             baseRedisService.delete("store_" + storeUser.getPhone());
         }
-        // 根据当前状态切另一个状态
+        // 根据当前状态切另一个状态(0 启用,1 禁用)
         int newStatus = storeUser.getStatus() == 0 ? 1 : 0;
+        if(storeUser.getAccountType() != null && storeUser.getAccountType() == 1){
+            LambdaUpdateWrapper<StoreUser> queryWrapper = new LambdaUpdateWrapper<>();
+            queryWrapper.eq(StoreUser::getId, storeUser.getId())
+                    .set(StoreUser::getStatus, newStatus);
+            int updateCount = storeUserMapper.update(null, queryWrapper);
+            if (updateCount <= 0) {
+                throw new RuntimeException("更新失败");
+            }
+            StoreUserVo vo = new StoreUserVo();
+            vo.setId(storeUser.getId());
+            vo.setStatus(newStatus);
+            vo.setSwitchStatus(newStatus == 0);
+            return R.data(vo);
+        }
         LambdaUpdateWrapper<StoreUser> queryWrapper = new LambdaUpdateWrapper<>();
         queryWrapper.eq(StoreUser::getId, storeUser.getId())
                 .set(StoreUser::getStatus, newStatus);
@@ -647,6 +624,15 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         if (updateCount <= 0) {
             throw new RuntimeException("更新失败");
         }
+//        StoreUserVo vo = new StoreUserVo();
+//        vo.setId(storeUser.getId());
+//        vo.setStatus(newStatus);
+//        vo.setSwitchStatus(newStatus == 0);
+        // 子账号启用/禁用时同步更新 store_platform_user_role 的 status(0 启用,1 禁用)
+        LambdaUpdateWrapper<StorePlatformUserRole> roleUpdateWrapper = new LambdaUpdateWrapper<>();
+        roleUpdateWrapper.eq(StorePlatformUserRole::getUserId, storeUser.getId())
+                .set(StorePlatformUserRole::getStatus, newStatus);
+        storePlatformUserRoleMapper.update(null, roleUpdateWrapper);
         // 返回更新后的状态,供前端及时展示
         StoreUserVo vo = new StoreUserVo();
         vo.setId(storeUser.getId());
@@ -655,6 +641,16 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         return R.data(vo);
     }
 
+    /**
+     *  分页查询
+     * @param
+     * @param
+     * @param id
+     * @param phone
+     * @param status
+     * @param accountType
+     * @return
+     */
     @Override
     public String exportExcel(String id, String phone, String status, Integer accountType) throws IOException {
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -733,7 +729,6 @@ 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");
-
     }
 
 
@@ -969,22 +964,91 @@ public class StoreUserServiceImpl extends ServiceImpl<StoreUserMapper, StoreUser
         queryWrapper.eq(StoreUser::getId, storeUserVo.getId());
         queryWrapper.eq(StoreUser::getDeleteFlag, 0);
         StoreUser storeUser = storeUserMapper.selectOne(queryWrapper);
-        // 删除已过注销时间的商家
-        if (storeUser != null) {
-            storeUserMapper.deleteById(storeUserVo.getId());
-            nearMeService.removeGeolocation(Boolean.TRUE, storeUser.getId().toString());
-            String storePhone = "store_" + storeUserVo.getPhone();
-            String key = baseRedisService.getString(storePhone);
-            if (key != null) {
-                //删除用户redis中的token
-                baseRedisService.delete(key);
+        // 主账号删除前校验:底下有店铺或有关联子账号则禁止删除
+        if (storeUser != null && storeUser.getAccountType() != null && storeUser.getAccountType() == 1) {
+            if (storeUser.getStoreId() != null) {
+                throw new RuntimeException("该主账号下存在店铺,禁止删除");
+            }
+            List<StoreUser> subAccounts = getSubAccountsByMainAccountId(storeUser.getId());
+            if (subAccounts != null && !subAccounts.isEmpty()) {
+                throw new RuntimeException("该主账号下存在关联子账号,禁止删除");
+            }
+        }
+        if (storeUser == null) {
+            return;
+        }
+        Integer userId = storeUser.getId();
+        String phone = storeUser.getPhone();
+
+        // 1. 先查询该用户在所有店铺下的子账号数量(未删除的)
+        LambdaQueryWrapper<StorePlatformUserRole> countWrapper = new LambdaQueryWrapper<>();
+        countWrapper.eq(StorePlatformUserRole::getUserId, userId)
+                .eq(StorePlatformUserRole::getDeleteFlag, 0);
+        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)
+                        .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);
+                }
             }
-            LambdaQueryWrapper<LifeFans> lifeFansLambdaQueryWrapper = new LambdaQueryWrapper<LifeFans>().eq(LifeFans::getFollowedId, "store_" + storeUser.getPhone())
-                    .or().eq(LifeFans::getFansId, "store_" + storeUser.getPhone());
-            lifeFansMapper.delete(lifeFansLambdaQueryWrapper);
+        } 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());
             }
+            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);
+        } else {
+            log.info("用户有多个子账号(count={}),仅删除 store_platform_user_role 记录,不删除 store_user: userId={}", subAccountCount, userId);
         }
     }