package com.tourguide.modules.user.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.tourguide.common.exception.BusinessException; import com.tourguide.modules.order.domain.OrderStatus; import com.tourguide.modules.order.entity.TourOrder; import com.tourguide.modules.order.mapper.TourOrderMapper; import com.tourguide.modules.user.domain.ClientType; import com.tourguide.modules.user.entity.GuideUser; import com.tourguide.modules.user.mapper.GuideUserMapper; import com.tourguide.security.JwtTokenService; import com.tourguide.security.TokenPayload; import com.tourguide.security.TokenSessionService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service public class GuideAccountService { private final GuideUserMapper guideUserMapper; private final TourOrderMapper tourOrderMapper; private final JwtTokenService jwtTokenService; private final TokenSessionService tokenSessionService; public GuideAccountService(GuideUserMapper guideUserMapper, TourOrderMapper tourOrderMapper, JwtTokenService jwtTokenService, TokenSessionService tokenSessionService) { this.guideUserMapper = guideUserMapper; this.tourOrderMapper = tourOrderMapper; this.jwtTokenService = jwtTokenService; this.tokenSessionService = tokenSessionService; } @Transactional public void cancel(Long guideId, String token) { TokenPayload payload = jwtTokenService.parse(token); if (payload.getClientType() != ClientType.GUIDE || !guideId.equals(payload.getUserId())) { throw new BusinessException(401, "Token用户不匹配"); } long activeOrderCount = tourOrderMapper.selectCount(new LambdaQueryWrapper() .eq(TourOrder::getGuideId, guideId) .in(TourOrder::getStatus, OrderStatus.unfinishedStatusCodes())); if (activeOrderCount > 0) { throw new BusinessException(409, "存在未完成订单,暂时无法注销账号"); } GuideUser user = guideUserMapper.selectById(guideId); if (user == null) { throw new BusinessException(404, "导游用户不存在"); } user.setStatus(GuideUserService.STATUS_CANCELLED); user.setAutoDisableWhitelisted(0); user.setAutoDisabled(0); guideUserMapper.updateById(user); tokenSessionService.remove(payload); } }