package com.tcm.training.admin.app.member.service; import com.tcm.training.admin.app.member.vo.AppMemberBenefitVO; import com.tcm.training.admin.app.member.vo.AppMemberOpenPackageVO; import com.tcm.training.admin.app.member.vo.AppMemberOpenPageVO; import com.tcm.training.admin.member.service.MemberSettingsAppService; import com.tcm.training.admin.member.vo.MemberIntroModuleVO; import com.tcm.training.admin.member.vo.MemberIntroSettingsVO; import com.tcm.training.admin.member.vo.MemberPriceSettingsVO; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * APP 会员开通页聚合服务。 */ @Service public class AppMemberOpenPageService { private static final String PACKAGE_TYPE_MONTH = "MONTH"; private static final String PACKAGE_TYPE_QUARTER = "QUARTER"; private final MemberSettingsAppService memberSettingsAppService; /** * 注入会员价格配置服务。 */ public AppMemberOpenPageService(MemberSettingsAppService memberSettingsAppService) { this.memberSettingsAppService = memberSettingsAppService; } /** * 获取 APP 会员开通页所需数据。 */ public AppMemberOpenPageVO getOpenPage() { AppMemberOpenPageVO result = new AppMemberOpenPageVO(); MemberPriceSettingsVO settings = memberSettingsAppService.currentPrice(); if (settings != null) { List packages = new ArrayList(2); addEnabledPackage(packages, PACKAGE_TYPE_MONTH, "月会员", settings.getMonthCardEnabled(), settings.getMonthCardPrice(), settings.getMonthCardDays()); addEnabledPackage(packages, PACKAGE_TYPE_QUARTER, "季度会员", settings.getQuarterCardEnabled(), settings.getQuarterCardPrice(), settings.getQuarterCardDays()); result.setPackages(packages); result.setMinPrice(resolveMinPrice(packages)); } fillIntro(result, memberSettingsAppService.currentIntro()); return result; } /** * 将后台启用的会员配置转换为 APP 套餐卡片。 */ private void addEnabledPackage(List packages, String type, String title, Boolean enabled, BigDecimal price, Integer days) { if (!Boolean.TRUE.equals(enabled) || price == null || price.compareTo(BigDecimal.ZERO) <= 0 || days == null || days <= 0) { return; } AppMemberOpenPackageVO item = new AppMemberOpenPackageVO(); item.setType(type); item.setTitle(title); item.setPrice(price); item.setDays(days); packages.add(item); } /** * 计算当前已启用套餐中的最低价格,供课程详情页展示“xx起”。 */ private BigDecimal resolveMinPrice(List packages) { BigDecimal minPrice = null; for (AppMemberOpenPackageVO item : packages) { if (item.getPrice() == null) { continue; } if (minPrice == null || item.getPrice().compareTo(minPrice) < 0) { minPrice = item.getPrice(); } } return minPrice; } /** * 将后台会员介绍配置写入 APP 开通页响应。 */ private void fillIntro(AppMemberOpenPageVO result, MemberIntroSettingsVO introSettings) { if (introSettings == null) { result.setBenefits(Collections.emptyList()); result.setDescription(""); return; } result.setBenefits(toBenefits(introSettings.getBenefits())); result.setDescription(trimToEmpty(introSettings.getDescription())); } /** * 将后台权益配置转换为 APP 可直接渲染的权益网格数据。 */ private List toBenefits(List benefits) { if (benefits == null || benefits.isEmpty()) { return Collections.emptyList(); } List result = new ArrayList(benefits.size()); for (MemberIntroModuleVO item : benefits) { AppMemberBenefitVO benefitVO = new AppMemberBenefitVO(); benefitVO.setId(item.getId()); benefitVO.setIconUrl(trimToEmpty(item.getIconUrl())); benefitVO.setName(trimToEmpty(item.getName())); benefitVO.setSort(item.getSort()); result.add(benefitVO); } return result; } /** * 将可空文本转换为空字符串,便于 APP 直接展示。 */ private String trimToEmpty(String value) { if (value == null) { return ""; } String trimmed = value.trim(); return trimmed.isEmpty() ? "" : trimmed; } }