package com.tcm.training.admin.member.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.tcm.training.admin.member.dto.MemberIntroModuleSaveRequest; import com.tcm.training.admin.member.dto.MemberIntroSettingsSaveRequest; import com.tcm.training.admin.member.dto.MemberPriceSettingsSaveRequest; import com.tcm.training.admin.member.entity.MemberIntroConfig; import com.tcm.training.admin.member.entity.MemberIntroItem; import com.tcm.training.admin.member.entity.MemberPriceConfig; import com.tcm.training.admin.member.mapper.MemberIntroConfigMapper; import com.tcm.training.admin.member.mapper.MemberIntroItemMapper; import com.tcm.training.admin.member.mapper.MemberPriceConfigMapper; 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 org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; @Service public class MemberSettingsAppService { private final MemberPriceConfigMapper memberPriceConfigMapper; private final MemberIntroConfigMapper memberIntroConfigMapper; private final MemberIntroItemMapper memberIntroItemMapper; public MemberSettingsAppService(MemberPriceConfigMapper memberPriceConfigMapper, MemberIntroConfigMapper memberIntroConfigMapper, MemberIntroItemMapper memberIntroItemMapper) { this.memberPriceConfigMapper = memberPriceConfigMapper; this.memberIntroConfigMapper = memberIntroConfigMapper; this.memberIntroItemMapper = memberIntroItemMapper; } public MemberPriceSettingsVO currentPrice() { MemberPriceConfig config = memberPriceConfigMapper.selectOne(new LambdaQueryWrapper() .eq(MemberPriceConfig::getDeleted, 0) .orderByDesc(MemberPriceConfig::getId) .last("limit 1")); return toPriceVO(config); } @Transactional public MemberPriceSettingsVO saveCurrentPrice(MemberPriceSettingsSaveRequest request) { validatePriceRequest(request); MemberPriceConfig config = memberPriceConfigMapper.selectOne(new LambdaQueryWrapper() .eq(MemberPriceConfig::getDeleted, 0) .orderByDesc(MemberPriceConfig::getId) .last("limit 1")); if (config == null) { config = new MemberPriceConfig(); fillPriceConfig(config, request); memberPriceConfigMapper.insert(config); } else { fillPriceConfig(config, request); memberPriceConfigMapper.updateById(config); } return toPriceVO(config); } public MemberIntroSettingsVO currentIntro() { MemberIntroConfig config = memberIntroConfigMapper.selectOne(new LambdaQueryWrapper() .eq(MemberIntroConfig::getDeleted, 0) .orderByDesc(MemberIntroConfig::getId) .last("limit 1")); if (config == null) { return null; } List items = memberIntroItemMapper.selectList(new LambdaQueryWrapper() .eq(MemberIntroItem::getConfigId, config.getId()) .eq(MemberIntroItem::getDeleted, 0) .orderByAsc(MemberIntroItem::getSort) .orderByAsc(MemberIntroItem::getId)); return toIntroVO(config, items); } @Transactional public MemberIntroSettingsVO saveCurrentIntro(MemberIntroSettingsSaveRequest request) { validateIntroRequest(request); MemberIntroConfig config = memberIntroConfigMapper.selectOne(new LambdaQueryWrapper() .eq(MemberIntroConfig::getDeleted, 0) .orderByDesc(MemberIntroConfig::getId) .last("limit 1")); if (config == null) { config = new MemberIntroConfig(); config.setModuleCount(request.getBenefits().size()); config.setDescription(trimToNull(request.getDescription())); memberIntroConfigMapper.insert(config); } else { config.setModuleCount(request.getBenefits().size()); config.setDescription(trimToNull(request.getDescription())); memberIntroConfigMapper.updateById(config); memberIntroItemMapper.update(null, new LambdaUpdateWrapper() .set(MemberIntroItem::getDeleted, 1) .eq(MemberIntroItem::getConfigId, config.getId()) .eq(MemberIntroItem::getDeleted, 0)); } List items = new ArrayList(); for (int index = 0; index < request.getBenefits().size(); index++) { MemberIntroModuleSaveRequest module = request.getBenefits().get(index); MemberIntroItem item = new MemberIntroItem(); item.setConfigId(config.getId()); item.setIconUrl(module.getIconUrl().trim()); item.setName(module.getName().trim()); item.setSort(index + 1); memberIntroItemMapper.insert(item); items.add(item); } return toIntroVO(config, items); } private void validatePriceRequest(MemberPriceSettingsSaveRequest request) { validatePositivePrice(request.getMonthCardPrice(), "月卡会员价格"); validatePositiveDays(request.getMonthCardDays(), "月卡时长"); validateEnabled(request.getMonthCardEnabled(), "月卡"); validatePositivePrice(request.getQuarterCardPrice(), "季卡会员价格"); validatePositiveDays(request.getQuarterCardDays(), "季卡时长"); validateEnabled(request.getQuarterCardEnabled(), "季卡"); } private void validatePositivePrice(BigDecimal value, String label) { if (value == null || value.compareTo(BigDecimal.ZERO) <= 0) { throw new IllegalArgumentException(label + "必须大于0"); } } private void validatePositiveDays(Integer value, String label) { if (value == null || value <= 0) { throw new IllegalArgumentException(label + "必须大于0"); } } private void validateEnabled(Boolean value, String label) { if (value == null) { throw new IllegalArgumentException("请选择" + label + "是否启用"); } } private void validateIntroRequest(MemberIntroSettingsSaveRequest request) { if (request.getBenefits() == null || request.getBenefits().isEmpty()) { throw new IllegalArgumentException("请至少添加一个权益"); } for (int index = 0; index < request.getBenefits().size(); index++) { MemberIntroModuleSaveRequest module = request.getBenefits().get(index); if (trimToNull(module.getIconUrl()) == null) { throw new IllegalArgumentException("请上传第" + (index + 1) + "个权益图标"); } String name = trimToNull(module.getName()); if (name == null) { throw new IllegalArgumentException("请输入第" + (index + 1) + "个权益名称"); } if (name.length() > 4) { throw new IllegalArgumentException("第" + (index + 1) + "个权益名称长度不能超过4个字符"); } } } private void fillPriceConfig(MemberPriceConfig config, MemberPriceSettingsSaveRequest request) { config.setMonthCardPrice(request.getMonthCardPrice()); config.setMonthCardDays(request.getMonthCardDays()); config.setMonthCardEnabled(booleanToInteger(request.getMonthCardEnabled())); config.setQuarterCardPrice(request.getQuarterCardPrice()); config.setQuarterCardDays(request.getQuarterCardDays()); config.setQuarterCardEnabled(booleanToInteger(request.getQuarterCardEnabled())); } private MemberPriceSettingsVO toPriceVO(MemberPriceConfig config) { if (config == null) { return null; } MemberPriceSettingsVO vo = new MemberPriceSettingsVO(); vo.setId(config.getId()); vo.setMonthCardPrice(config.getMonthCardPrice()); vo.setMonthCardDays(config.getMonthCardDays()); vo.setMonthCardEnabled(integerToBoolean(config.getMonthCardEnabled())); vo.setQuarterCardPrice(config.getQuarterCardPrice()); vo.setQuarterCardDays(config.getQuarterCardDays()); vo.setQuarterCardEnabled(integerToBoolean(config.getQuarterCardEnabled())); return vo; } private MemberIntroSettingsVO toIntroVO(MemberIntroConfig config, List items) { MemberIntroSettingsVO vo = new MemberIntroSettingsVO(); vo.setId(config.getId()); vo.setModuleCount(config.getModuleCount()); vo.setDescription(config.getDescription()); List modules = new ArrayList(); for (MemberIntroItem item : items) { modules.add(new MemberIntroModuleVO(item.getId(), item.getIconUrl(), item.getName(), item.getSort())); } vo.setBenefits(modules); return vo; } private String trimToNull(String value) { if (value == null) { return null; } String trimmed = value.trim(); return trimmed.isEmpty() ? null : trimmed; } private Integer booleanToInteger(Boolean value) { return Boolean.TRUE.equals(value) ? 1 : 0; } private Boolean integerToBoolean(Integer value) { return value != null && value == 1; } }