xiaoyong931011
2022-12-20 e90dc8cdf7d4ce7d08e1ab51fcde3c28fd2995a0
20221220
1、星级市场
11 files modified
5 files added
257 ■■■■■ changed files
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MallMoneyFlowTypeEnum.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/enumerates/MemberAgentLevelEnum.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java 16 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/dto/ApiBuyMemberStarDto.java 21 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/entity/MallMemberStarBuy.java 31 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java 2 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberStarBuyMapper.java 7 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java 9 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java 113 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/ApiMallMemberStarVo.java 25 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java 5 ●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberMapper.xml 8 ●●●●● patch | view | raw | blame | history
src/main/resources/mapper/modules/MallMemberStarBuyMapper.xml 5 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -28,6 +28,8 @@
        registration.excludePathPatterns("/api/unipay/unipayCallBack");
        registration.excludePathPatterns("/api/unipay/agreeMentPayCallBack");
        registration.excludePathPatterns("/api/unipay/singlePayCallBack");
        //星级市场
        registration.excludePathPatterns("/api/member/memberStarMarket");
    }
    @Override
src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -7,6 +7,15 @@
public enum DataDictionaryEnum {
    /**
     * 会员星级市场
     *  value:升级成为对应的星级需要的价格
     *  description:升级成为对应的星级名称
     */
    ONE_STAR("SYSTEM_STAR","ONE_STAR"),
    TWO_STAR("SYSTEM_STAR","TWO_STAR"),
    THREE_STAR("SYSTEM_STAR","THREE_STAR"),
    /**
     * 代理等级
     *  value : {"levelSelf":"一星","directLevelCnt":"3","teamLevelCnt":"5","minTeamLevelCnt":"2","ManageSubsidyPercent":"2"}
     *  levelSelf:自身星级
src/main/java/cc/mrbird/febs/common/enumerates/MallMoneyFlowTypeEnum.java
@@ -5,6 +5,7 @@
@Getter
public enum MallMoneyFlowTypeEnum {
    BUY_MARKET_STAR("购买星级",7),
    TEAM_REWARD("团队管理补贴",6),
    PAY("支付",5),
    SHARE_REWARD_TWO("第二代分享奖励",4),
src/main/java/cc/mrbird/febs/common/enumerates/MemberAgentLevelEnum.java
@@ -9,7 +9,7 @@
    AGENT_THREE("市代","AGENT_THREE",3),//市代
    AGENT_TWO("县代","AGENT_TWO",2),//县代
    AGENT_ONE("区代","AGENT_ONE",1),//区代
    AGENT("会员","AGENT",0);//会员
    AGENT("代理","AGENT",0);//会员
    private String name;
    private String code;
src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java
@@ -215,4 +215,20 @@
        return memberService.delMemberBank(id);
    }
    @ApiOperation(value = "星级市场", notes = "星级市场")
    @ApiResponses({
            @ApiResponse(code = 200, message = "success", response = ApiMallMemberStarVo.class)
    })
    @GetMapping(value = "/memberStarMarket")
    public FebsResponse memberStarMarket() {
        return new FebsResponse().success().data(memberService.getMemberStarMarketList());
    }
    @ApiOperation(value = "购买星级")
    @PostMapping(value = "/buyMemberStar")
    public FebsResponse buyMemberStar(@RequestBody @Validated ApiBuyMemberStarDto apiBuyMemberStarDto) {
        return memberService.buyMemberStar(apiBuyMemberStarDto);
    }
}
src/main/java/cc/mrbird/febs/mall/dto/ApiBuyMemberStarDto.java
New file
@@ -0,0 +1,21 @@
package cc.mrbird.febs.mall.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
@ApiModel(value = "ApiBuyMemberStarDto", description = "参数接收类")
public class ApiBuyMemberStarDto {
    @NotBlank(message = "请选择想要购买的星级")
    @ApiModelProperty(value = "编码")
    private String code;
    @NotBlank(message = "请输入资金密码")
    @ApiModelProperty(value = "资金密码")
    private String tradePassword;
}
src/main/java/cc/mrbird/febs/mall/entity/MallMemberStarBuy.java
New file
@@ -0,0 +1,31 @@
package cc.mrbird.febs.mall.entity;
import cc.mrbird.febs.common.entity.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.math.BigDecimal;
/**
 * 用户升级会员等级表
 */
@Data
@TableName("mall_member_star_buy")
public class MallMemberStarBuy extends BaseEntity {
    //会员ID
    private Long memberId;
    //编码
    private String buyCode;
    //购买金额
    private BigDecimal amount;
    //购买的等级名称
    private String starName;
    //购买金额
    private String starCode;
    //剩余金额
    private BigDecimal avaAmount;
    //状态 1-生效中 2-已结束
    private Integer status;
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberMapper.java
@@ -95,4 +95,6 @@
    void updateLevelById(@Param("level")String name, @Param("id")Long id);
    Integer selectByReferersIdAndLevel(@Param("inviteId")String inviteId, @Param("level")String minLevel);
    void updateAccountLevelById(@Param("accountLevel")String accountLevel, @Param("id")Long id);
}
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberStarBuyMapper.java
New file
@@ -0,0 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallMemberStarBuy;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface MallMemberStarBuyMapper extends BaseMapper<MallMemberStarBuy> {
}
src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java
@@ -5,10 +5,7 @@
import cc.mrbird.febs.mall.entity.MallMember;
import cc.mrbird.febs.mall.entity.MallMemberPayment;
import cc.mrbird.febs.mall.entity.MallShopApply;
import cc.mrbird.febs.mall.vo.CashOutSettingVo;
import cc.mrbird.febs.mall.vo.MyCommissionVo;
import cc.mrbird.febs.mall.vo.MyTeamVo;
import cc.mrbird.febs.mall.vo.ShopListVo;
import cc.mrbird.febs.mall.vo.*;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
@@ -74,4 +71,8 @@
    FebsResponse updateMemberBank(UpdateMemberBankDto updateMemberBankDto);
    FebsResponse delMemberBank(Long id);
    List<ApiMallMemberStarVo> getMemberStarMarketList();
    FebsResponse buyMemberStar(ApiBuyMemberStarDto apiBuyMemberStarDto);
}
src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -160,6 +160,7 @@
    }
    @Override
    @Transactional
    public void directReward(Long directRewardId) {
        log.info("消费补贴奖励、直推返利、分享奖励直推上级、分享奖励直推上级的直推、团队管理补贴消息,ID:{}", directRewardId);
        //获取订单信息
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -14,6 +14,7 @@
import cc.mrbird.febs.mall.service.IApiMallMemberService;
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
import cc.mrbird.febs.mall.service.ICommonService;
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
import cc.mrbird.febs.mall.vo.*;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
@@ -23,6 +24,7 @@
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -58,6 +60,9 @@
    private final MallShopApplyMapper mallShopApplyMapper;
    private final MallRegisterAppealMapper mallRegisterAppealMapper;
    private final MallMemberBankMapper mallMemberBankMapper;
    private final IApiMallMemberWalletService memberWalletService;
    private final MallMemberStarBuyMapper mallMemberStarBuyMapper;
    private final IMallMoneyFlowService mallMoneyFlowService;
    @Value("${spring.profiles.active}")
@@ -111,7 +116,9 @@
        mallMember.setName(registerDto.getName());
        mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE);
        mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL);
        //会员等级
        mallMember.setAccountLevel(MemberAccountLevelEnum.NORMAL.getName());
        //代理等级
        mallMember.setLevel(MemberAgentLevelEnum.AGENT.getName());
        mallMember.setSex("男");
        mallMember.setBindPhone(registerDto.getAccount());
@@ -239,10 +246,10 @@
            mallMemberVo.setHasPayment(1);
        }
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL, mallMember.getLevel());
        if (dic != null) {
            mallMemberVo.setLevelName(dic.getDescription());
        }
//        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(AppContants.AGENT_LEVEL, mallMember.getLevel());
//        if (dic != null) {
//            mallMemberVo.setLevelName(dic.getDescription());
//        }
        MallMemberWallet wallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberVo.getId());
        mallMemberVo.setBalance(wallet.getBalance());
        mallMemberVo.setScore(wallet.getScore());
@@ -590,4 +597,102 @@
        mallMemberBankMapper.deleteById(id);
        return new FebsResponse().success();
    }
    @Override
    public List<ApiMallMemberStarVo> getMemberStarMarketList() {
        List<ApiMallMemberStarVo> apiMallMemberStarVos = new ArrayList<>();
        List<DataDictionaryCustom> memberStarMarketDicList = dataDictionaryCustomMapper.selectDicByType(DataDictionaryEnum.ONE_STAR.getType());
        if(CollUtil.isNotEmpty(memberStarMarketDicList)){
            for(DataDictionaryCustom memberStarMarketDic : memberStarMarketDicList){
                ApiMallMemberStarVo apiMallMemberStarVo = new ApiMallMemberStarVo();
                apiMallMemberStarVo.setName(memberStarMarketDic.getDescription());
                apiMallMemberStarVo.setCode(memberStarMarketDic.getCode());
                String value = memberStarMarketDic.getValue();
                cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(value);
                String price = jsonObject.get("price").toString();
                String status = jsonObject.get("status").toString();
                apiMallMemberStarVo.setPrice(new BigDecimal(price).setScale(BigDecimal.ROUND_DOWN,2));
                apiMallMemberStarVo.setStatus(Integer.parseInt(status));
                apiMallMemberStarVos.add(apiMallMemberStarVo);
            }
        }
        return apiMallMemberStarVos;
    }
    @Override
    @Transactional
    public FebsResponse buyMemberStar(ApiBuyMemberStarDto apiBuyMemberStarDto) {
        MallMember member = LoginUserUtil.getLoginUser();
        /**
         * 判断用户当前的星级
         */
        MallMember mallMember = this.baseMapper.selectById(member.getId());
        //用户当前的星级
        String accountLevel = mallMember.getAccountLevel();
        Integer memberLevelCode = MemberAccountLevelEnum.NORMAL.getMemberLevelCode(accountLevel);
        //星级市场的星级参数
        String buyStarCode = apiBuyMemberStarDto.getCode();
        DataDictionaryCustom buyStarCodeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
                DataDictionaryEnum.ONE_STAR.getType(),
                buyStarCode
        );
        if(ObjectUtil.isEmpty(buyStarCodeDic)){
            throw new FebsException("请选择正确的星级");
        }
        String buyStarValue = buyStarCodeDic.getValue();
        cn.hutool.json.JSONObject jsonObject = JSONUtil.parseObj(buyStarValue);
        String buyStarPrice = jsonObject.get("price").toString();
        String buyStarStatus = jsonObject.get("status").toString();
        if(1 != Integer.parseInt(buyStarStatus)){
            throw new FebsException("当前未开放购买");
        }
        String buyStarDescription = buyStarCodeDic.getDescription();
        Integer buyStarLevelCode = MemberAccountLevelEnum.NORMAL.getMemberLevelCode(buyStarDescription);
        //判断用户星级和购买星级关系,无法购买当前用户已拥有及其以下的星级
        if(memberLevelCode >= buyStarLevelCode){
            throw new FebsException("请不要重复购买");
        }
        //支付
        String tradePassword = apiBuyMemberStarDto.getTradePassword();
        if (StrUtil.isBlank(tradePassword)) {
            throw new FebsException("支付密码错误");
        }
        if (StrUtil.isBlank(mallMember.getTradePassword())) {
            throw new FebsException("未设置支付密码");
        }
        if (!SecureUtil.md5(tradePassword).equals(mallMember.getTradePassword())) {
            throw new FebsException("支付密码错误");
        }
        BigDecimal buyStarPriceBigDecimal = new BigDecimal(buyStarPrice).setScale(BigDecimal.ROUND_DOWN, 2);
        int reduce = memberWalletService.reduce(buyStarPriceBigDecimal, mallMember.getId(), "balance");
        if (reduce == 2) {
            throw new FebsException("余额不足");
        }
        //产生用户升级会员等级记录
        MallMemberStarBuy mallMemberStarBuy = new MallMemberStarBuy();
        mallMemberStarBuy.setMemberId(mallMember.getId());
        mallMemberStarBuy.setBuyCode(MallUtils.getLogisticsNum("s"));
        mallMemberStarBuy.setStarName(buyStarDescription);
        mallMemberStarBuy.setStarCode(buyStarCode);
        mallMemberStarBuy.setAmount(buyStarPriceBigDecimal);
        mallMemberStarBuy.setAvaAmount(buyStarPriceBigDecimal);
        mallMemberStarBuy.setStatus(1);
        mallMemberStarBuyMapper.insert(mallMemberStarBuy);
        //产生支付流水
        Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow(
                mallMember.getId(),
                mallMemberStarBuy.getBuyCode(),
                buyStarPriceBigDecimal.negate(),
                MallMoneyFlowTypeEnum.BUY_MARKET_STAR.getCode(),
                MallMoneyFlow.STATUS_SUCCESS,
                MallMoneyFlow.IS_RETURN_Y,
                mallMember.getId(),
                FlowTypeEnum.BALANCE.getValue(),
                MallMoneyFlowTypeEnum.BUY_MARKET_STAR.getName()
        );
        //更新会员星级
        this.baseMapper.updateAccountLevelById(buyStarDescription,mallMember.getId());
        return new FebsResponse().success();
    }
}
src/main/java/cc/mrbird/febs/mall/vo/ApiMallMemberStarVo.java
New file
@@ -0,0 +1,25 @@
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 = "ApiMallMemberStarVo", description = "返回参数类")
public class ApiMallMemberStarVo {
    @ApiModelProperty(value = "名称")
    private String name;
    @ApiModelProperty(value = "编码")
    private String code;
    @ApiModelProperty(value = "价格")
    private BigDecimal price;
    @ApiModelProperty(value = "状态 1-可购买(开放) 2-未开放")
    private Integer status;
}
src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -36,12 +36,15 @@
    @ApiModelProperty(value = "余额")
    private BigDecimal balance;
    @ApiModelProperty(value = "代理等级")
    private String levelName;
    @ApiModelProperty(value = "会员星级")
    private String accountLevel;
    @ApiModelProperty(value = "推荐人昵称")
    private String referrerName;
    @ApiModelProperty(value = "代理等级")
    private String level;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
src/main/resources/mapper/modules/MallMemberMapper.xml
@@ -431,4 +431,12 @@
        where level = #{level}
          and FIND_IN_SET(#{inviteId}, referrer_ids)
    </select>
    <update id="updateAccountLevelById">
        update mall_member
        set
            account_level = #{accountLevel}
        where
            id = #{id}
    </update>
</mapper>
src/main/resources/mapper/modules/MallMemberStarBuyMapper.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cc.mrbird.febs.mall.mapper.MallMemberStarBuyMapper">
</mapper>