KKSU
2024-12-16 b71d11796454bb3d844be6e00cfb4c877519870d
feat(mall): 添加 VIP购买相关接口和功能

- 新增 ApiRunVipController 控制器,提供 VIP 购买相关接口
- 添加 ApiRunVipVo 数据传输对象,用于 VIP 信息展示
- 实现 IRunVipService 接口和 RunVipServiceImpl 实现类,处理 VIP 信息逻辑
- 创建 RunVipConversion 类,用于 RunVip 实体和 ApiRunVipVo 之间的转换
- 新增 YesOrNoEnum 枚举,用于表示是否状态
6 files added
169 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/enumerates/YesOrNoEnum.java 23 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java 37 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/conversion/RunVipConversion.java 15 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java 44 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java 39 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/YesOrNoEnum.java
New file
@@ -0,0 +1,23 @@
package cc.mrbird.febs.common.enumerates;
import lombok.Getter;
@Getter
public enum YesOrNoEnum {
    /**
     *  是否,同意拒绝,上线下线
     */
    YES(1, "是"),
    NO(0, "否");
    private final int value;
    private final String desc;
    YesOrNoEnum(int value, String desc) {
        this.value = value;
        this.desc = desc;
    }
}
src/main/java/cc/mrbird/febs/mall/controller/ApiRunVipController.java
New file
@@ -0,0 +1,37 @@
package cc.mrbird.febs.mall.controller;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.mall.service.IRunVipService;
import cc.mrbird.febs.mall.vo.ApiRunVipVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@RestController
@CrossOrigin("*")
@RequiredArgsConstructor
@RequestMapping(value = "/api/runVip")
@Api(value = "ApiRunVipController", tags = "碳积分接口")
public class ApiRunVipController {
    private final IRunVipService iRunVipService;
    @ApiOperation(value = "会员中心-购买VIP", notes = "会员中心-购买VIP")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiRunVipVo.class)
    })
    @GetMapping(value = "/vipInfo")
    public FebsResponse vipInfo() {
        return new FebsResponse().success().data(iRunVipService.vipInfo());
    }
}
src/main/java/cc/mrbird/febs/mall/conversion/RunVipConversion.java
New file
@@ -0,0 +1,15 @@
package cc.mrbird.febs.mall.conversion;
import cc.mrbird.febs.mall.entity.RunVip;
import cc.mrbird.febs.mall.vo.ApiRunVipVo;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public abstract class RunVipConversion {
    public static final RunVipConversion INSTANCE = Mappers.getMapper(RunVipConversion.class);
    public abstract List<ApiRunVipVo> entityToVos(List<RunVip> runVips);
}
src/main/java/cc/mrbird/febs/mall/service/IRunVipService.java
New file
@@ -0,0 +1,11 @@
package cc.mrbird.febs.mall.service;
import cc.mrbird.febs.mall.entity.RunVip;
import cc.mrbird.febs.mall.vo.ApiRunVipVo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
public interface IRunVipService extends IService<RunVip> {
    List<ApiRunVipVo> vipInfo();
}
src/main/java/cc/mrbird/febs/mall/service/impl/RunVipServiceImpl.java
New file
@@ -0,0 +1,44 @@
package cc.mrbird.febs.mall.service.impl;
import cc.mrbird.febs.common.enumerates.YesOrNoEnum;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.mall.conversion.RunVipConversion;
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.RunVip;
import cc.mrbird.febs.mall.mapper.RunVipMapper;
import cc.mrbird.febs.mall.service.IRunVipService;
import cc.mrbird.febs.mall.vo.ApiRunVipVo;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
@RequiredArgsConstructor
public class RunVipServiceImpl extends ServiceImpl<RunVipMapper, RunVip> implements IRunVipService {
    @Override
    public List<ApiRunVipVo> vipInfo() {
        MallMember member = LoginUserUtil.getLoginUser();
        List<ApiRunVipVo> apiRunVipVos = new ArrayList<>();
        if (StrUtil.isEmpty(member.getLevel())) {
            return apiRunVipVos;
        }
        String level = member.getLevel();
        //获取当前用户的VIP等级
        RunVip runVip = this.baseMapper.selectOne(new LambdaQueryWrapper<RunVip>().eq(RunVip::getVipCode, level));
        //获取大于当前用户等级序号的所有的VIP等级
        LambdaQueryWrapper<RunVip> runVipLambdaQueryWrapper = new LambdaQueryWrapper<>();
        runVipLambdaQueryWrapper.eq(RunVip::getState, YesOrNoEnum.YES.getValue());
        runVipLambdaQueryWrapper.gt(RunVip::getOrderNumber, runVip.getOrderNumber());
        List<RunVip> runVips = this.baseMapper.selectList(runVipLambdaQueryWrapper);
        apiRunVipVos = RunVipConversion.INSTANCE.entityToVos(runVips);
        return apiRunVipVos;
    }
}
src/main/java/cc/mrbird/febs/mall/vo/ApiRunVipVo.java
New file
@@ -0,0 +1,39 @@
package cc.mrbird.febs.mall.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "ApiRunVipVo", description = "VIP信息")
public class ApiRunVipVo {
    @ApiModelProperty(value = "ID")
    private Long id;
    @ApiModelProperty(value = "序号")
    private Integer orderNumber;//序号
    @ApiModelProperty(value = "vip编码")
    private String vipCode;//vip编码
    @ApiModelProperty(value = "vip名称")
    private String vipName;//vip名称
    @ApiModelProperty(value = "vip图标")
    private String vipPng;//vip图标
    @ApiModelProperty(value = "原价")
    private BigDecimal originalPrice;//原价
    @ApiModelProperty(value = "现价")
    private BigDecimal presentPrice;//现价
    @ApiModelProperty(value = "是否上架 1是0否")
    private Integer state;//是否上架 1是0否
    @ApiModelProperty(value = "是否允许碳积分兑换碳币 1是0否")
    private Integer changeState;//是否允许碳积分兑换碳币 1是0否
    @ApiModelProperty(value = "是否允许碳币提现 1是0否")
    private Integer withdrawState;//是否允许碳币提现 1是0否
    @ApiModelProperty(value = "每日碳积分增长倍数")
    private BigDecimal growthValue;//每日碳积分增长倍数
    @ApiModelProperty(value = "每日获取碳积分最大值")
    private Integer growthCnt;//每日获取碳积分最大值
    @ApiModelProperty(value = "购买会员返利金额比例(实际支付金额 * rebatePercent = 返利金额)")
    private BigDecimal rebatePercent;//购买会员返利金额比例(实际支付金额 * rebatePercent = 返利金额)
}