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<MemberPriceConfig>()
|
.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<MemberPriceConfig>()
|
.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<MemberIntroConfig>()
|
.eq(MemberIntroConfig::getDeleted, 0)
|
.orderByDesc(MemberIntroConfig::getId)
|
.last("limit 1"));
|
if (config == null) {
|
return null;
|
}
|
List<MemberIntroItem> items = memberIntroItemMapper.selectList(new LambdaQueryWrapper<MemberIntroItem>()
|
.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<MemberIntroConfig>()
|
.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<MemberIntroItem>()
|
.set(MemberIntroItem::getDeleted, 1)
|
.eq(MemberIntroItem::getConfigId, config.getId())
|
.eq(MemberIntroItem::getDeleted, 0));
|
}
|
|
List<MemberIntroItem> items = new ArrayList<MemberIntroItem>();
|
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<MemberIntroItem> items) {
|
MemberIntroSettingsVO vo = new MemberIntroSettingsVO();
|
vo.setId(config.getId());
|
vo.setModuleCount(config.getModuleCount());
|
vo.setDescription(config.getDescription());
|
List<MemberIntroModuleVO> modules = new ArrayList<MemberIntroModuleVO>();
|
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;
|
}
|
}
|