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>