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.MiniUser; import com.tourguide.modules.user.mapper.MiniUserMapper; 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; import java.util.Arrays; import java.util.UUID; @Service public class MiniAccountService { private final MiniUserMapper miniUserMapper; private final TourOrderMapper tourOrderMapper; private final JwtTokenService jwtTokenService; private final TokenSessionService tokenSessionService; public MiniAccountService(MiniUserMapper miniUserMapper, TourOrderMapper tourOrderMapper, JwtTokenService jwtTokenService, TokenSessionService tokenSessionService) { this.miniUserMapper = miniUserMapper; this.tourOrderMapper = tourOrderMapper; this.jwtTokenService = jwtTokenService; this.tokenSessionService = tokenSessionService; } @Transactional public void cancel(Long userId, String token) { TokenPayload payload = jwtTokenService.parse(token); if (payload.getClientType() != ClientType.MINI || !userId.equals(payload.getUserId())) { throw new BusinessException(401, "Token用户不匹配"); } long activeOrderCount = tourOrderMapper.selectCount(new LambdaQueryWrapper() .eq(TourOrder::getVisitorId, userId) .in(TourOrder::getStatus, Arrays.asList( OrderStatus.PENDING_PAYMENT.getCode(), OrderStatus.PENDING_ACCEPT.getCode(), OrderStatus.PENDING_MEETING.getCode(), OrderStatus.IN_SERVICE.getCode()))); if (activeOrderCount > 0) { throw new BusinessException(409, "存在未完成订单,暂时无法注销账号"); } MiniUser user = miniUserMapper.selectById(userId); if (user == null) { throw new BusinessException(404, "小程序用户不存在"); } user.setUsername("deleted_" + UUID.randomUUID().toString().replace("-", "").substring(0, 24)); user.setNickname("已注销用户"); user.setMobile(null); user.setAvatar(null); user.setRealName(null); user.setIdCardNo(null); user.setOpenid(null); user.setStatus(0); miniUserMapper.updateById(user); miniUserMapper.deleteById(userId); tokenSessionService.remove(payload); } }