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<UserPointsAccount>()
|
.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();
|
}
|
}
|