package com.tcm.training.admin.app.points.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.tcm.training.admin.app.auth.service.AppAuthSessionService; import com.tcm.training.admin.app.points.vo.AppPointsOverviewVO; import com.tcm.training.admin.live.entity.Clinic; import com.tcm.training.admin.live.mapper.ClinicMapper; import com.tcm.training.admin.member.entity.AppUser; import com.tcm.training.admin.member.mapper.UserMapper; import com.tcm.training.admin.points.entity.PointsConfig; import com.tcm.training.admin.points.entity.UserPointsAccount; import com.tcm.training.admin.points.mapper.UserPointsAccountMapper; import com.tcm.training.admin.points.service.PointsSettingsAppService; import com.tcm.training.admin.points.vo.PointsConfigVO; import org.springframework.stereotype.Service; /** * APP 我的积分页面聚合服务。 */ @Service public class AppPointsOverviewService { private static final int USER_STATUS_ENABLED = 1; private final AppAuthSessionService appAuthSessionService; private final UserMapper userMapper; private final UserPointsAccountMapper userPointsAccountMapper; private final ClinicMapper clinicMapper; private final PointsSettingsAppService pointsSettingsAppService; /** * 注入 APP 我的积分页面所需依赖。 */ public AppPointsOverviewService(AppAuthSessionService appAuthSessionService, UserMapper userMapper, UserPointsAccountMapper userPointsAccountMapper, ClinicMapper clinicMapper, PointsSettingsAppService pointsSettingsAppService) { this.appAuthSessionService = appAuthSessionService; this.userMapper = userMapper; this.userPointsAccountMapper = userPointsAccountMapper; this.clinicMapper = clinicMapper; this.pointsSettingsAppService = pointsSettingsAppService; } /** * 获取当前登录用户的积分页面聚合数据。 */ public AppPointsOverviewVO getCurrentOverview() { Long userId = appAuthSessionService.requireLoginUserId(); AppUser user = requireEnabledUser(userId); PointsConfigVO config = pointsSettingsAppService.current(); int pointsBalance = resolvePointsBalance(userId); int requiredPoints = config == null || config.getRequiredPoints() == null ? 0 : Math.max(config.getRequiredPoints().intValue(), 0); AppPointsOverviewVO result = new AppPointsOverviewVO(); result.setPointsBalance(Integer.valueOf(pointsBalance)); result.setRequiredPoints(Integer.valueOf(requiredPoints)); result.setProgressPercent(Integer.valueOf(calculateProgressPercent(pointsBalance, requiredPoints))); result.setPointsShortfall(Integer.valueOf(Math.max(requiredPoints - pointsBalance, 0))); result.setActivityStartAt(config == null ? null : config.getActivityStartAt()); result.setActivityEndAt(config == null ? null : config.getActivityEndAt()); result.setGiftCover(trimToEmpty(config == null ? null : config.getGiftCover())); result.setGiftName(trimToEmpty(config == null ? null : config.getGiftName())); Clinic clinic = resolveBoundClinic(user); result.setClinicName(trimToEmpty(clinic == null ? null : clinic.getName())); result.setClinicAddress(trimToEmpty(clinic == null ? null : clinic.getAddress())); return result; } /** * 校验当前登录用户存在且可用。 */ private AppUser requireEnabledUser(Long userId) { AppUser user = userMapper.selectById(userId); if (user == null || user.getDeleted() == null || user.getDeleted().intValue() != 0) { throw new IllegalArgumentException("用户不存在"); } if (user.getStatus() == null || user.getStatus().intValue() != USER_STATUS_ENABLED) { throw new IllegalArgumentException("用户已禁用"); } return user; } /** * 读取当前用户积分余额,没有积分账户时按0返回。 */ private int resolvePointsBalance(Long userId) { UserPointsAccount account = userPointsAccountMapper.selectOne(new LambdaQueryWrapper() .eq(UserPointsAccount::getAppUserId, userId) .eq(UserPointsAccount::getDeleted, 0) .orderByDesc(UserPointsAccount::getId) .last("LIMIT 1")); if (account == null || account.getPointsBalance() == null) { return 0; } return Math.max(account.getPointsBalance().intValue(), 0); } /** * 读取当前用户绑定诊所,不存在时返回空。 */ private Clinic resolveBoundClinic(AppUser user) { if (user == null || user.getClinicId() == null) { return null; } Clinic clinic = clinicMapper.selectById(user.getClinicId()); if (clinic == null || clinic.getDeleted() == null || clinic.getDeleted().intValue() != 0) { return null; } return clinic; } /** * 计算积分进度百分比,避免返回非法值。 */ private int calculateProgressPercent(int current, int total) { if (total <= 0 || current <= 0) { return 0; } if (current >= total) { return 100; } return Math.max(Math.min((int) Math.round((current * 100.0D) / total), 100), 0); } /** * 将可空文本归一化为空字符串。 */ private String trimToEmpty(String value) { if (value == null) { return ""; } return value.trim(); } }