From 29742cb7326dab29c871c21a612921a317194d52 Mon Sep 17 00:00:00 2001 From: zyh <50652658+zyh530@users.noreply.github.com> Date: Fri, 3 Oct 2025 11:04:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=9C=A8AccountService=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=A8=E6=88=B7=E5=88=A0=E9=99=A4=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E7=9A=84=E8=AF=A6=E7=BB=86=E6=A3=80=E6=9F=A5=EF=BC=8C?= =?UTF-8?q?=E5=8C=85=E6=8B=AC=E5=85=B3=E8=81=94=E6=95=B0=E6=8D=AE=E7=9A=84?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E5=92=8C=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=BC=BA=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=9A=84=E5=AE=89=E5=85=A8=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/account/AccountService.java | 77 +++++++++++++++++-- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gameplatform/server/service/account/AccountService.java b/src/main/java/com/gameplatform/server/service/account/AccountService.java index 38d7abc..c74c1a6 100644 --- a/src/main/java/com/gameplatform/server/service/account/AccountService.java +++ b/src/main/java/com/gameplatform/server/service/account/AccountService.java @@ -1,29 +1,47 @@ package com.gameplatform.server.service.account; import com.gameplatform.server.mapper.account.UserAccountMapper; +import com.gameplatform.server.mapper.agent.AgentPointsTxMapper; +import com.gameplatform.server.mapper.agent.LinkBatchMapper; +import com.gameplatform.server.mapper.agent.LinkTaskMapper; import com.gameplatform.server.model.dto.account.AccountCreateRequest; import com.gameplatform.server.model.dto.account.AccountResponse; import com.gameplatform.server.model.dto.account.AccountUpdateRequest; import com.gameplatform.server.model.dto.account.PointsBalanceResponse; import com.gameplatform.server.model.dto.common.PageResult; import com.gameplatform.server.model.entity.account.UserAccount; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Service public class AccountService { + private static final Logger log = LoggerFactory.getLogger(AccountService.class); + private final UserAccountMapper mapper; private final PasswordEncoder passwordEncoder; + private final LinkTaskMapper linkTaskMapper; + private final LinkBatchMapper linkBatchMapper; + private final AgentPointsTxMapper agentPointsTxMapper; - public AccountService(UserAccountMapper mapper, PasswordEncoder passwordEncoder) { + public AccountService(UserAccountMapper mapper, + PasswordEncoder passwordEncoder, + LinkTaskMapper linkTaskMapper, + LinkBatchMapper linkBatchMapper, + AgentPointsTxMapper agentPointsTxMapper) { this.mapper = mapper; this.passwordEncoder = passwordEncoder; + this.linkTaskMapper = linkTaskMapper; + this.linkBatchMapper = linkBatchMapper; + this.agentPointsTxMapper = agentPointsTxMapper; } public Mono> list(String userType, String status, String keyword, @@ -166,27 +184,74 @@ public class AccountService { @Transactional public Mono delete(Long id, Long currentUserId) { return Mono.fromCallable(() -> { - // 检查用户是否存在 + log.info("开始删除用户账户: id={}, 操作者={}", id, currentUserId); + + // 1. 检查用户是否存在 UserAccount user = mapper.selectById(id); if (user == null) { + log.warn("用户不存在: id={}", id); throw new IllegalArgumentException("用户不存在"); } - // 不能删除自己 + log.info("准备删除用户: username={}, userType={}", user.getUsername(), user.getUserType()); + + // 2. 不能删除自己 if (id.equals(currentUserId)) { + log.warn("尝试删除自己: userId={}", id); throw new IllegalArgumentException("不能删除当前登录的用户"); } - // 如果要删除的是管理员,检查是否是最后一个管理员 + // 3. 如果要删除的是管理员,检查是否是最后一个管理员 if ("ADMIN".equals(user.getUserType())) { long adminCount = mapper.countByFilter("ADMIN", "ENABLED", null); if (adminCount <= 1) { + log.warn("尝试删除最后一个管理员: userId={}", id); throw new IllegalArgumentException("不能删除最后一个管理员账户"); } } - // 执行删除 - return mapper.deleteById(id) > 0; + // 4. 检查是否有关联数据(对所有用户类型都检查) + List blockReasons = new ArrayList<>(); + + // 检查链接任务 + long linkTaskCount = linkTaskMapper.countByAgentId(id); + if (linkTaskCount > 0) { + blockReasons.add(String.format("该用户还有 %d 个链接任务", linkTaskCount)); + log.info("用户 {} 有 {} 个链接任务", id, linkTaskCount); + } + + // 检查批次记录 + long batchCount = linkBatchMapper.countByAgentId(id); + if (batchCount > 0) { + blockReasons.add(String.format("该用户还有 %d 个批次记录", batchCount)); + log.info("用户 {} 有 {} 个批次记录", id, batchCount); + } + + // 检查积分交易记录 + long pointsTxCount = agentPointsTxMapper.countByAccountId(id); + if (pointsTxCount > 0) { + blockReasons.add(String.format("该用户还有 %d 条积分交易记录", pointsTxCount)); + log.info("用户 {} 有 {} 条积分交易记录", id, pointsTxCount); + } + + // 如果有阻止删除的原因,抛出友好的错误提示 + if (!blockReasons.isEmpty()) { + String errorMessage = String.format("无法删除用户 '%s':%s。请先清理这些数据后再删除。", + user.getUsername(), + String.join(";", blockReasons)); + log.warn("删除用户被阻止: userId={}, 原因: {}", id, errorMessage); + throw new IllegalArgumentException(errorMessage); + } + + // 5. 执行删除 + boolean deleted = mapper.deleteById(id) > 0; + if (deleted) { + log.info("用户删除成功: id={}, username={}", id, user.getUsername()); + } else { + log.warn("用户删除失败: id={}", id); + } + + return deleted; }) .subscribeOn(Schedulers.boundedElastic()); }