|
|
@@ -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);
|
|
|
}
|
|
|
}
|
|
|
|