src/main/java/cc/mrbird/febs/common/enumerates/AgentLevelEnum.java
@@ -9,17 +9,20 @@ @Getter public enum AgentLevelEnum { ZERO_LEVEL("非会员"), FIRST_LEVEL("普通会员"), SECOND_LEVEL("区级代理"), THIRD_LEVEL("市级代理"), FOUR_LEVEL("省级代理"), FIFTH_LEVEL("全国总代"); ZERO_LEVEL("普通会员","ZERO_LEVEL"), SECOND_LEVEL("一星合伙人","SECOND_LEVEL"), THIRD_LEVEL("二星合伙人","THIRD_LEVEL"), FOUR_LEVEL("三星合伙人","FOUR_LEVEL"), FIFTH_LEVEL("四星合伙人","FIFTH_LEVEL"), SIX_LEVEL("五星合伙人","SIX_LEVEL"), SEVEN_LEVEL("六星合伙人","SEVEN_LEVEL"); private String name; private String code; AgentLevelEnum(String name) { AgentLevelEnum(String name,String code) { this.code = code; this.name = name; } } src/main/java/cc/mrbird/febs/common/enumerates/MemberLevelEnum.java
@@ -12,7 +12,8 @@ FIFTH_LEVEL("FIFTH_LEVEL",4), FOUR_LEVEL("FOUR_LEVEL",3), THIRD_LEVEL("THIRD_LEVEL",2), SECOND_LEVEL("SECOND_LEVEL",1); SECOND_LEVEL("SECOND_LEVEL",1), ZERO_LEVEL("ZERO_LEVEL",0); private String type; @@ -42,7 +43,9 @@ return codeOne; } //比较两个级别的大小,levelOne大于levelTwo返回1,否则返回0 /** * 比较两个级别的大小,levelOne大于levelTwo返回1,否则返回0 */ public int compareLevel(String levelOne ,String levelTwo) { int codeOne = 0; int codeTwo = 0; src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java
@@ -133,7 +133,27 @@ /** * 补贴额度 */ TOTAL_SCORE(26); TOTAL_SCORE(26), /** * 团队补贴明细 */ TEAM_PERK(27), /** * 平级奖励补贴 */ TEAM_EQUALS_PERK(28), /** * 线下服务中心补贴 */ OFFLINE_PERK(29), /** * 代理商补贴 */ AGENT_PERK(30); private final int value; src/main/java/cc/mrbird/febs/mall/controller/ApiMallOrderController.java
@@ -3,6 +3,8 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.vo.ApiScoreSetVo; import cc.mrbird.febs.mall.vo.MyCommissionVo; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; import io.swagger.annotations.Api; @@ -32,6 +34,15 @@ private final IApiMallOrderInfoService mallOrderInfoService; @ApiOperation(value = "我的权益") @ApiResponses( @ApiResponse(code = 200, message = "success", response = ApiScoreSetVo.class) ) @PostMapping(value = "/myScoreSet") public FebsResponse myScoreSet() { return new FebsResponse().success().data(mallOrderInfoService.myScoreSet()); } @ApiOperation(value = "判断是否允许创建订单", notes = "判断是否允许创建订单") @PostMapping(value = "/judgeCreateOrder") public FebsResponse judgeCreateOrder(@RequestBody AddOrderDto addOrderDto) { src/main/java/cc/mrbird/febs/mall/controller/ApiScoreController.java
@@ -1,8 +1,12 @@ package cc.mrbird.febs.mall.controller; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.ApiMallScoreSignRecordDto; import cc.mrbird.febs.mall.dto.OrderListDto; import cc.mrbird.febs.mall.service.ICommonService; import cc.mrbird.febs.mall.service.IScoreService; import cc.mrbird.febs.mall.vo.ApiMallScoreSignRecordVo; import cc.mrbird.febs.mall.vo.OrderListVo; import cc.mrbird.febs.mall.vo.ScoreSignVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -44,4 +48,13 @@ scoreService.sign(); return new FebsResponse().success(); } @ApiOperation(value = "签到列表", notes = "签到列表") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiMallScoreSignRecordVo.class) }) @PostMapping(value = "/signRecordList") public FebsResponse signRecordList(@RequestBody ApiMallScoreSignRecordDto apiMallScoreSignRecordDto) { return new FebsResponse().success().data(scoreService.findMallScoreSignRecordList(apiMallScoreSignRecordDto)); } } src/main/java/cc/mrbird/febs/mall/dto/ApiMallScoreSignRecordDto.java
New file @@ -0,0 +1,18 @@ package cc.mrbird.febs.mall.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiMallScoreSignRecordDto", description = "签到记录请求类") public class ApiMallScoreSignRecordDto { @ApiModelProperty(value = "一页数量", example = "10") private Integer pageSize; @ApiModelProperty(value = "第几页", example = "1") private Integer pageNum; @ApiModelProperty(hidden = true) private Long memberId; } src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWalletMapper.java
@@ -28,9 +28,15 @@ BigDecimal selectSumCommission(); List<MallMemberWallet> selectSumStarByIds(@Param("list")List<Long> ids); List<MallMemberWallet> selectMemberWalletsByIds(@Param("list")List<Long> ids); int updateStarByList(@Param("list")List<Map<String, Object>> result); int updateTotalScoreByList(@Param("list")List<Map<String, Object>> resultReduce); void reduceTotalScoreById(@Param("totalScore")BigDecimal sharePerkAmount, @Param("id")Long id); void addBalanceById(@Param("balance")BigDecimal sharePerkAmount, @Param("id")Long id); void addStarByMemberId(@Param("star")Integer starSum, @Param("memberId")Long memberId); } src/main/java/cc/mrbird/febs/mall/mapper/MallMoneyFlowMapper.java
@@ -5,10 +5,7 @@ import cc.mrbird.febs.mall.dto.MoneyFlowListDto; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallMoneyFlow; import cc.mrbird.febs.mall.vo.AdminMallMoneyFlowVo; import cc.mrbird.febs.mall.vo.AdminMoneyChargeListVo; import cc.mrbird.febs.mall.vo.AdminMoneyFlowListVo; import cc.mrbird.febs.mall.vo.MoneyFlowVo; import cc.mrbird.febs.mall.vo.*; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -39,4 +36,6 @@ BigDecimal selectThankfulCommission(@Param("date") Date date, @Param("memberId") Long memberId); void insertMoneyFlow(MallMoneyFlow mallMoneyFlow); List<AdminTeamEqualsPerkVo> selectTeamEqualsMemberByDate(@Param("date") Date date); } src/main/java/cc/mrbird/febs/mall/mapper/MallScoreSignRecordMapper.java
@@ -1,10 +1,15 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.dto.ApiMallScoreSignRecordDto; import cc.mrbird.febs.mall.entity.MallScoreSignRecord; import cc.mrbird.febs.mall.vo.ApiMallScoreSignRecordVo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.apache.ibatis.annotations.Param; public interface MallScoreSignRecordMapper extends BaseMapper<MallScoreSignRecord> { MallScoreSignRecord selectRecentSignRecord(@Param("memberId") Long memberId); IPage<ApiMallScoreSignRecordVo> selectApiOrderListInPage(IPage<ApiMallScoreSignRecordVo> page, @Param("record") ApiMallScoreSignRecordDto apiMallScoreSignRecordDto); } src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java
@@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.vo.ApiScoreSetVo; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; import com.baomidou.mybatisplus.extension.service.IService; @@ -37,4 +38,6 @@ FebsResponse bangCardSign(BangCardSignDto bangCardSignDto); boolean judgeCreateOrder(AddOrderDto addOrderDto); ApiScoreSetVo myScoreSet(); } src/main/java/cc/mrbird/febs/mall/service/IScoreService.java
@@ -1,7 +1,11 @@ package cc.mrbird.febs.mall.service; import cc.mrbird.febs.mall.dto.ApiMallScoreSignRecordDto; import cc.mrbird.febs.mall.entity.MallScoreSignRecord; import cc.mrbird.febs.mall.vo.ApiMallScoreSignRecordVo; import cc.mrbird.febs.mall.vo.ScoreSignVo; import java.util.List; public interface IScoreService { @@ -10,4 +14,6 @@ void sign(); MallScoreSignRecord judgeScoreIsContinuity(MallScoreSignRecord mallScoreSignRecord); List<ApiMallScoreSignRecordVo> findMallScoreSignRecordList(ApiMallScoreSignRecordDto apiMallScoreSignRecordDto); } src/main/java/cc/mrbird/febs/mall/service/impl/AdminMallMemberServiceImpl.java
@@ -359,7 +359,7 @@ if(StrUtil.isEmpty(level) || !AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())){ return new FebsResponse().fail().message("该用户无法激活"); } mallMember.setLevel(AgentLevelEnum.FIRST_LEVEL.name()); mallMember.setLevel(AgentLevelEnum.SECOND_LEVEL.name()); mallMemberMapper.updateById(mallMember); return new FebsResponse().success(); } src/main/java/cc/mrbird/febs/mall/service/impl/AgentServiceImpl.java
@@ -1,15 +1,19 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.*; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.*; import cc.mrbird.febs.mall.vo.AdminMallMoneyFlowVo; import cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo; import cc.mrbird.febs.system.mapper.UserMapper; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.session.ExecutorType; @@ -21,10 +25,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; /** @@ -45,6 +46,7 @@ private final MallMemberWalletMapper mallMemberWalletMapper; private final SqlSessionTemplate sqlSessionTemplate; private final IApiMallMemberWalletService memberWalletService; private final MallMoneyFlowMapper mallMoneyFlowMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -170,6 +172,7 @@ @Override @Transactional(rollbackFor = Exception.class) public void perkMoneyConsumer(long orderId) { long start = System.currentTimeMillis(); MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId); if(ObjectUtil.isEmpty(mallOrderInfo)){ return; @@ -180,7 +183,7 @@ /** * 分享补贴 直推消费额10% */ BigDecimal amount = mallOrderInfo.getAmount(); BigDecimal amount = mallOrderInfo.getAmount().subtract(mallOrderInfo.getScoreAmount()); Long memberId = mallOrderInfo.getMemberId(); MallMember mallMember = memberMapper.selectById(memberId); @@ -194,7 +197,7 @@ String sharePerk = ObjectUtil.isEmpty(sharePerkDic.getValue()) ? "0" : sharePerkDic.getValue(); BigDecimal sharePerkPercent = new BigDecimal(sharePerk).abs().divide(new BigDecimal(100)); //分享补贴金额 BigDecimal sharePerkAmount = amount.multiply(sharePerkPercent); BigDecimal sharePerkAmount = amount.multiply(sharePerkPercent).setScale(2, BigDecimal.ROUND_DOWN);; //所有合伙人补贴至消费礼包的三倍额度需要复购一次。 MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMemberUp.getId()); @@ -204,9 +207,9 @@ } if(BigDecimal.ZERO.compareTo(sharePerkAmount) < 0){ //减少补贴额度 memberWalletService.reduce(sharePerkAmount, memberId, "totalScore"); mallMemberWalletMapper.reduceTotalScoreById(sharePerkAmount, mallMemberWallet.getId()); iApiMallMemberWalletService.addBalance(sharePerkAmount, mallMemberUp.getId()); mallMemberWalletMapper.addBalanceById(sharePerkAmount, mallMemberWallet.getId()); mallMoneyFlowService.addMoneyFlow( mallMemberUp.getId(), @@ -228,10 +231,84 @@ List<MallMember> thirdLevelRecord = getStarRecord(fourLevelRecord, MemberLevelEnum.THIRD_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_THREE.getValue()); List<MallMember> secondLevelRecord = getStarRecord(thirdLevelRecord, MemberLevelEnum.SECOND_LEVEL.name(), amount, mallOrderInfo.getOrderNo(), memberId,MoneyFlowTypeEnum.STAR_PERK_TWO.getValue()); /** * 团队补贴 */ //团队补贴百分比 DataDictionaryCustom teamPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.TEAM_PERK.getType(), DataDictionaryEnum.TEAM_PERK.getCode()); String teamPerk = ObjectUtil.isEmpty(teamPerkDic.getValue()) ? "0" : teamPerkDic.getValue(); BigDecimal teamPerkPercent = new BigDecimal(teamPerk).abs().divide(new BigDecimal(100)); //分享补贴金额 BigDecimal teamPerkAmount = amount.multiply(teamPerkPercent); //团队补贴对象 List<MallMember> mallMemberTeamPerkList = mallMemberTeamPerkListInfo(memberId); if(CollUtil.isNotEmpty(mallMemberTeamPerkList)){ List<Long> mallMemberTeamPerkIds = mallMemberTeamPerkList.stream().map(MallMember::getId).collect(Collectors.toList()); List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectMemberWalletsByIds(mallMemberTeamPerkIds); flowTotalScoreBalance( mallMemberWallets, teamPerkAmount, MoneyFlowTypeEnum.TEAM_PERK.getValue(), mallOrderInfo.getOrderNo(), memberId ); } long end = System.currentTimeMillis(); log.info("============订单:{},时间:{}===========",mallOrderInfo.getOrderNo(),(end - start)/1000); } /** * * 下单人所在团队里面的已经存在的各个等级的会员集合里面的第一个会员获取2% */ public List<MallMember> mallMemberTeamPerkListInfo(Long memberId){ List<MallMember> mallMemberTeamPerk = new ArrayList<>(); MallMember mallMember = memberMapper.selectById(memberId); List<String> ids = StrUtil.split(mallMember.getReferrerIds(), ','); if(CollUtil.isNotEmpty(ids)){ List<MallMember> mallMembers = memberMapper.selectByInviteIds(ids); /** * 根据等级分组,获取对应的<级别,会员数组>map */ Map<String, List<MallMember>> collect = mallMembers.stream().collect(Collectors.groupingBy(MallMember::getLevel)); Set<String> set = collect.keySet(); // 得到所有key的集合 for (String key : set) { List<MallMember> value = collect.get(key); mallMemberTeamPerk.add(value.get(0)); } } return mallMemberTeamPerk; } /** * 递归获取对应的团队补贴对象 * 下单 * 下单人的上级集合里面每个等级的第一个会员 * @param memberId * @param mallMemberTeamPerk * @return */ public List<MallMember> mallMemberTeamPerkList(Long memberId,List<MallMember> mallMemberTeamPerk){ MallMember mallMember = memberMapper.selectById(memberId); if(ObjectUtil.isEmpty(mallMember.getReferrerId())){ return mallMemberTeamPerk; } String referrerId = mallMember.getReferrerId(); MallMember mallMemberParent = memberMapper.selectInfoByInviteId(referrerId); if(MemberLevelEnum.SECOND_LEVEL.compareLevel(mallMemberParent.getLevel(),mallMember.getLevel()) > 0){ mallMemberTeamPerk.add(mallMemberParent); } if(!referrerId.equals(mallMember.getInviteId())){ mallMemberTeamPerkList(mallMemberParent.getId(),mallMemberTeamPerk); } return mallMemberTeamPerk; } /** * 星级奖励 * @param mallMembersOlds 高一级别的用户 * @param LevelParam 当前级别 * @param amount 补贴金额的基数 @@ -240,7 +317,7 @@ * @return */ public List<MallMember> getStarRecord(List<MallMember> mallMembersOlds,String LevelParam,BigDecimal amount,String orderNo,Long memberId,int starPerkType){ long start = System.currentTimeMillis(); //根据用户的level获取用户 List<MallMember> mallMemberStars = memberMapper.selectMemberWithLevel(LevelParam); if(CollUtil.isNotEmpty(mallMembersOlds)){ @@ -252,7 +329,7 @@ List<Long> mallMemberStarIds = mallMemberStars.stream().map(MallMember::getId).collect(Collectors.toList()); //当前等级的总贡献点 List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectSumStarByIds(mallMemberStarIds); List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectMemberWalletsByIds(mallMemberStarIds); Integer starSum = mallMemberWallets.stream().mapToInt(MallMemberWallet::getStar).sum(); //星级补贴比例 DataDictionaryCustom starPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( @@ -336,8 +413,125 @@ } } } long end = System.currentTimeMillis(); log.info("============订单:{},时间:{}===========",orderNo,(end - start)/1000); return mallMemberStars; } /** * 统一处理补贴,流水,余额 * 增加的余额是一样的 * @param mallMemberWallets * @param amount * @param flowType * @param orderNo * @param memberId */ public void flowTotalScoreBalance(List<MallMemberWallet> mallMemberWallets,BigDecimal amount,int flowType,String orderNo,Long memberId){ //给当前等级的每个用户发放星级奖励 int count = 0; List<Map<String,Object>> result = new ArrayList<>(); List<Map<String,Object>> resultReduce = new ArrayList<>(); List<MallMoneyFlow> mallMoneyFlows = new ArrayList<>(); for(MallMemberWallet mallMemberWallet : mallMemberWallets){ Map<String,Object> hashMap = new HashMap<>(); BigDecimal totalScorePerk = mallMemberWallet.getTotalScore(); if(totalScorePerk.compareTo(amount) < 0){ amount = totalScorePerk; } if(BigDecimal.ZERO.compareTo(amount) < 0){ hashMap.put("id",mallMemberWallet.getId()); hashMap.put("starPerkAmount",amount); result.add(hashMap); resultReduce.add(hashMap); //生成星级奖励的流水对象 MallMoneyFlow mallMoneyFlow = new MallMoneyFlow(); mallMoneyFlow.setMemberId(mallMemberWallet.getMemberId()); mallMoneyFlow.setAmount(amount); mallMoneyFlow.setType(flowType); mallMoneyFlow.setOrderNo(orderNo); mallMoneyFlow.setRtMemberId(memberId); mallMoneyFlow.setStatus(2); mallMoneyFlow.setFlowType(FlowTypeEnum.BALANCE.getValue()); mallMoneyFlows.add(mallMoneyFlow); } count = count + 1; if (count % 1000 == 0 || count == mallMemberWallets.size()) { if(CollUtil.isNotEmpty(result)){ int resultCount = mallMemberWalletMapper.updateStarByList(result); if(resultCount>0){ log.info("============余额新增============第{}条数据===========",resultCount); } //每更新完一批数据,在result内进行删除操作。 result.clear(); int resultReduceCount = mallMemberWalletMapper.updateTotalScoreByList(resultReduce); if(resultReduceCount>0){ log.info("============额度减少============第{}条数据===========",resultReduceCount); } //每更新完一批数据,在result内进行删除操作。 resultReduce.clear(); } } } if(CollUtil.isNotEmpty(mallMoneyFlows)){ SqlSession sqlSession = sqlSessionTemplate.getSqlSessionFactory().openSession(ExecutorType.BATCH,false); MallMoneyFlowMapper mallMoneyFlowMapper = sqlSession.getMapper(MallMoneyFlowMapper.class); for(int i = 1; i <= mallMoneyFlows.size(); i++){ mallMoneyFlowMapper.insertMoneyFlow(mallMoneyFlows.get(i-1)); if (i % 1000 == 0 || i == mallMoneyFlows.size()) { log.info("============插入流水============第{}条数据===========",mallMoneyFlows.size()); sqlSession.commit(); sqlSession.clearCache(); } } sqlSession.close(); } } /** * 平级奖励补贴 */ public void getPeerPerk(){ /** * 全体用户 * 对象:产生了收益的用户的直属上级 * 条件:等级和用户等级一样 * 补贴:每日补贴的10%,例如用户当日的补贴总额为100,直属上级拿100*10%=10, * 限制:直推收益除外。 */ //平级补贴百分比 DataDictionaryCustom teamEqualsPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.TEAM_EQUALS_PERK.getType(), DataDictionaryEnum.TEAM_EQUALS_PERK.getCode()); BigDecimal teamEqualsPerkPercent = new BigDecimal(teamEqualsPerkDic.getValue()).abs().multiply(BigDecimal.valueOf(0.01)); //产生了收益的用户和直属上级 List<AdminTeamEqualsPerkVo> adminTeamEqualsPerkVos = mallMoneyFlowMapper.selectTeamEqualsMemberByDate(new Date()); if(CollUtil.isNotEmpty(adminTeamEqualsPerkVos)){ for(AdminTeamEqualsPerkVo adminTeamEqualsPerkVo : adminTeamEqualsPerkVos){ BigDecimal sumAmount = adminTeamEqualsPerkVo.getSumAmount(); //平级补贴 BigDecimal teamEqualsPerkAmount = teamEqualsPerkPercent.multiply(sumAmount).setScale(2, BigDecimal.ROUND_DOWN); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(adminTeamEqualsPerkVo.getRtMemberId()); BigDecimal totalScore = mallMemberWallet.getTotalScore(); if(totalScore.compareTo(teamEqualsPerkAmount) < 0){ teamEqualsPerkAmount = totalScore; } if(BigDecimal.ZERO.compareTo(teamEqualsPerkAmount) < 0){ //减少补贴额度 mallMemberWalletMapper.reduceTotalScoreById(teamEqualsPerkAmount, mallMemberWallet.getId()); mallMemberWalletMapper.addBalanceById(teamEqualsPerkAmount, mallMemberWallet.getId()); mallMoneyFlowService.addMoneyFlow( adminTeamEqualsPerkVo.getRtMemberId(), teamEqualsPerkAmount, MoneyFlowTypeEnum.TEAM_EQUALS_PERK.getValue(), MallUtils.getOrderNum("TEP"), FlowTypeEnum.BALANCE.getValue()); } } } } } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -114,7 +114,7 @@ mallMember.setName(registerDto.getName()); mallMember.setAccountStatus(MallMember.ACCOUNT_STATUS_ENABLE); mallMember.setAccountType(MallMember.ACCOUNT_TYPE_NORMAL); mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.name()); mallMember.setLevel(AgentLevelEnum.ZERO_LEVEL.getCode()); mallMember.setSex("男"); mallMember.setBindPhone(registerDto.getAccount()); src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -14,10 +14,7 @@ import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.*; import cc.mrbird.febs.mall.vo.ApiShopApplyVo; import cc.mrbird.febs.mall.vo.OrderDetailVo; import cc.mrbird.febs.mall.vo.OrderListVo; import cc.mrbird.febs.mall.vo.OrderRefundVo; import cc.mrbird.febs.mall.vo.*; import cc.mrbird.febs.pay.model.AgreementPayDto; import cc.mrbird.febs.pay.model.AgreementSignDto; import cc.mrbird.febs.pay.model.UnipayDto; @@ -42,6 +39,7 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.math.BigInteger; import java.text.DecimalFormat; import java.util.*; @@ -79,6 +77,7 @@ private final MallShopApplyMapper mallShopApplyMapper; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final MallAchieveRecordMapper mallAchieveRecordMapper; private final MallMemberWalletMapper mallMemberWalletMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -349,9 +348,9 @@ orderInfo.setPayTime(new Date()); orderInfo.setPayResult("1"); changeWallet(orderInfo.getId(), member.getId()); agentProducer.sendAutoLevelUpMsg(member.getId()); changeWallet(orderInfo.getId()); //发送补贴消息 agentProducer.sendPerkMoneyMsg(orderInfo.getId()); // agentProducer.sendOrderReturn(orderInfo.getId()); break; case "4": @@ -431,10 +430,10 @@ * 增加贡献值,增加流水 * 产生一条业绩记录 * @param orderId * @param memberId */ public void changeWallet(Long orderId,Long memberId){ public void changeWallet(Long orderId){ MallOrderInfo orderInfo = this.baseMapper.selectById(orderId); Long memberId = orderInfo.getMemberId(); boolean hasTc = false; //总贡献值 BigDecimal starSum = BigDecimal.ZERO; @@ -453,7 +452,7 @@ */ if (mallGoods.getIsNormal() == 2) { hasTc = true; BigDecimal star = mallGoods.getStar(); BigDecimal star = mallGoods.getStar()==null ? BigDecimal.ZERO : mallGoods.getStar(); starSum = starSum.add(star); scoreSum = scoreSum.add( new BigDecimal(mallGoods.getPresentPrice()) @@ -466,7 +465,7 @@ * 增加贡献值,增加流水 */ if (starSum.compareTo(BigDecimal.ZERO) > 0) { memberWalletService.add(starSum, memberId, "star"); mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, @@ -834,7 +833,7 @@ BigDecimal score = ObjectUtil.isEmpty(addOrderDto.getScore()) ? BigDecimal.ZERO : addOrderDto.getScore(); if(ObjectUtil.isNotEmpty(scorePercentDic)){ //商品的现金折扣比例 BigDecimal scorePercent = new BigDecimal(scorePercentDic.getValue()).divide(new BigDecimal(100), BigDecimal.ROUND_DOWN); BigDecimal scorePercent = new BigDecimal(scorePercentDic.getValue()).multiply(BigDecimal.valueOf(0.01)); //最大折扣金额对应需要的总积分数目 BigDecimal scorePercentMaxAmount = total.multiply(scorePercent); BigDecimal scoreChange = BigDecimal.ONE; @@ -843,7 +842,9 @@ } scorePercentMaxAmount = scorePercentMaxAmount.multiply(scoreChange); if(scorePercentMaxAmount.compareTo(score) < 0){ return false; flag = false; }else{ flag = true; } }else{ flag = true; @@ -851,4 +852,20 @@ return flag; } @Override public ApiScoreSetVo myScoreSet() { ApiScoreSetVo apiScoreSetVo = new ApiScoreSetVo(); DataDictionaryCustom scorePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.SCORE_PERCENT.getType(), DataDictionaryEnum.SCORE_PERCENT.getCode() ); DataDictionaryCustom scoreChangeDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.SCORE_CHANGE.getType(), DataDictionaryEnum.SCORE_CHANGE.getCode() ); apiScoreSetVo.setScorePercent(new BigDecimal(scorePercentDic.getValue()).multiply(BigDecimal.valueOf(0.01)).setScale(2,BigDecimal.ROUND_DOWN)); apiScoreSetVo.setScoreChange(new BigDecimal(scoreChangeDic.getValue()).setScale(2,BigDecimal.ROUND_DOWN)); return apiScoreSetVo; } } src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -284,7 +284,7 @@ DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS.getType(), DataDictionaryEnum.AGENT_BONUS.getCode()); BigDecimal profit = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP)); List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.FIRST_LEVEL.name()); List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.SECOND_LEVEL.name()); if (CollUtil.isEmpty(agentMembers)) { return; } src/main/java/cc/mrbird/febs/mall/service/impl/ScoreServiceImpl.java
@@ -5,23 +5,25 @@ import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.LoginUserUtil; import cc.mrbird.febs.mall.conversion.MallOrderInfoConversion; import cc.mrbird.febs.mall.dto.ApiMallScoreSignRecordDto; import cc.mrbird.febs.mall.dto.ScoreSettingDto; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallMemberWallet; import cc.mrbird.febs.mall.entity.MallScoreSignRecord; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper; import cc.mrbird.febs.mall.mapper.MallScoreSignRecordMapper; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.mall.service.IScoreService; import cc.mrbird.febs.mall.vo.ApiMallScoreSignRecordVo; import cc.mrbird.febs.mall.vo.ScoreSignVo; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -29,6 +31,7 @@ import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * @author wzy @@ -77,6 +80,16 @@ } @Override public List<ApiMallScoreSignRecordVo> findMallScoreSignRecordList(ApiMallScoreSignRecordDto apiMallScoreSignRecordDto) { MallMember member = LoginUserUtil.getLoginUser(); IPage<ApiMallScoreSignRecordVo> page = new Page<>(apiMallScoreSignRecordDto.getPageNum(), apiMallScoreSignRecordDto.getPageSize()); apiMallScoreSignRecordDto.setMemberId(member.getId()); IPage<ApiMallScoreSignRecordVo> apiMallScoreSignRecordVos = mallScoreSignRecordMapper.selectApiOrderListInPage(page, apiMallScoreSignRecordDto); return apiMallScoreSignRecordVos.getRecords(); } @Override @Transactional(rollbackFor = Exception.class) public void sign() { MallMember member = LoginUserUtil.getLoginUser(); src/main/java/cc/mrbird/febs/mall/vo/AdminTeamEqualsPerkVo.java
New file @@ -0,0 +1,19 @@ package cc.mrbird.febs.mall.vo; import io.swagger.annotations.ApiModel; import lombok.Data; import java.math.BigDecimal; @Data @ApiModel(value = "AdminTeamEqualsPerkVo", description = "信息返回类") public class AdminTeamEqualsPerkVo { private Long memberId; private BigDecimal sumAmount; private Long rtMemberId; } src/main/java/cc/mrbird/febs/mall/vo/ApiMallScoreSignRecordVo.java
New file @@ -0,0 +1,19 @@ package cc.mrbird.febs.mall.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @Data @ApiModel(value = "ApiMallScoreSignRecordVo", description = "返回参数类") public class ApiMallScoreSignRecordVo { @ApiModelProperty(value = "获得积分") private Integer score; @ApiModelProperty(value = "签到时间") private Date signTime; } src/main/java/cc/mrbird/febs/mall/vo/ApiScoreSetVo.java
New file @@ -0,0 +1,18 @@ 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 = "ApiScoreSetVo", description = "积分使用规则") public class ApiScoreSetVo { @ApiModelProperty(value = "积分设置-积分抵扣现金比例,设置50,即商品价格1000,积分可抵扣的最大金额为500") private BigDecimal scorePercent; @ApiModelProperty(value = "积分设置-积分兑换现金比例,设置1,则1积分等于1元,设置2,则2积分等于1元") private BigDecimal scoreChange; } src/main/java/cc/mrbird/febs/mall/vo/OrderDetailVo.java
@@ -90,5 +90,11 @@ @ApiModelProperty(value = "门店信息") private ApiShopApplyVo apiShopApplyVo; @ApiModelProperty(value = "积分折扣金额") private BigDecimal scoreAmount; @ApiModelProperty(value = "积分数量") private BigDecimal scoreCnt; } src/main/java/cc/mrbird/febs/pay/controller/UnipayController.java
@@ -131,7 +131,7 @@ MallMember mallMember = memberMapper.selectById(orderInfo.getMemberId()); if (hasTc) { if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { mallMember.setLevel(AgentLevelEnum.FIRST_LEVEL.name()); mallMember.setLevel(AgentLevelEnum.SECOND_LEVEL.name()); memberMapper.updateById(mallMember); } } @@ -244,7 +244,7 @@ MallMember mallMember = memberMapper.selectById(orderInfo.getMemberId()); if (hasTc) { if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { mallMember.setLevel(AgentLevelEnum.FIRST_LEVEL.name()); mallMember.setLevel(AgentLevelEnum.SECOND_LEVEL.name()); memberMapper.updateById(mallMember); } } src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
@@ -95,7 +95,7 @@ MallMember member = memberService.getById(orderInfo.getMemberId()); if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) { member.setLevel(AgentLevelEnum.FIRST_LEVEL.name()); member.setLevel(AgentLevelEnum.SECOND_LEVEL.name()); memberService.updateById(member); } src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -76,4 +76,9 @@ log.info("发送返利消息:{}", orderId); rabbitTemplate.convertAndSend(RabbitQueueEnum.AGENT_REUTRN_MONEY.getExchange(), RabbitQueueEnum.AGENT_REUTRN_MONEY.getRoute(), orderId); } public void sendPerkMoneyMsg(Long orderId) { log.info("发送补贴消息:{}", orderId); rabbitTemplate.convertAndSend(RabbitQueueEnum.PERK_MONEY.getExchange(), RabbitQueueEnum.PERK_MONEY.getRoute(), orderId); } } src/main/resources/mapper/modules/MallMemberWalletMapper.xml
@@ -67,7 +67,7 @@ select ifnull(sum(commission),0) total from mall_member_wallet </select> <select id="selectSumStarByIds" resultType="cc.mrbird.febs.mall.entity.MallMemberWallet"> <select id="selectMemberWalletsByIds" resultType="cc.mrbird.febs.mall.entity.MallMemberWallet"> select * from mall_member_wallet where member_id IN <foreach collection = "list" item = "item" separator="," open = "(" close = ")" > @@ -95,4 +95,29 @@ </foreach> </update> <update id="reduceTotalScoreById"> update mall_member_wallet <set> total_score = total_score - #{totalScore}, </set> WHERE id = #{id} </update> <update id="addBalanceById"> update mall_member_wallet <set> balance = balance + #{balance}, </set> WHERE id = #{id} </update> <update id="addStarByMemberId"> update mall_member_wallet <set> star = star + #{star}, </set> WHERE member_id = #{memberId} </update> </mapper> src/main/resources/mapper/modules/MallMoneyFlowMapper.xml
@@ -162,4 +162,18 @@ #{flowType} ) </insert> <select id="selectTeamEqualsMemberByDate" resultType="cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo"> select a.member_id memberId, sum(a.amount) amount sumAmount, c.id rtMemberId from mall_money_flow a inner join mall_member b on b.id = a.member_id inner join mall_member c on c.invite_id = b.referrer_id and c.level = b.level where a.type in (1, 2) and date_format(a.created_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') group by a.member_id; </select> </mapper> src/main/resources/mapper/modules/MallOrderInfoMapper.xml
@@ -112,6 +112,8 @@ <result column="del_flag" property="delFlag" /> <result column="deliver_type" property="deliverType" /> <result column="shop_id" property="shopId" /> <result column="score_amount" property="scoreAmount" /> <result column="score_cnt" property="scoreCnt" /> <collection property="items" ofType="cc.mrbird.febs.mall.entity.MallOrderItem"> <id property="id" column="item_id" /> <result property="orderId" column="order_id" /> src/main/resources/mapper/modules/MallScoreSignRecordMapper.xml
@@ -10,4 +10,8 @@ where member_id=#{memberId} order by id desc limit 1 </select> <select id="selectApiOrderListInPage" resultType="cc.mrbird.febs.mall.vo.ApiMallScoreSignRecordVo"> select score,sign_time from mall_score_sign_record where member_id = #{record.memberId} </select> </mapper> src/main/resources/templates/febs/views/modules/mallMember/moneyFlowList.html
@@ -159,6 +159,30 @@ return '<span>抽奖</span>' }else if (d.type === 18) { return '<span>积分池收益</span>' }else if (d.type === 19) { return '<span>1星合伙人补贴</span>' }else if (d.type === 20) { return '<span>2星合伙人补贴</span>' }else if (d.type === 21) { return '<span>3星合伙人补贴</span>' }else if (d.type === 22) { return '<span>4星合伙人补贴</span>' }else if (d.type === 23) { return '<span>5星合伙人补贴</span>' }else if (d.type === 24) { return '<span>6星合伙人补贴</span>' }else if (d.type === 25) { return '<span>贡献点</span>' }else if (d.type === 26) { return '<span>补贴额度</span>' }else if (d.type === 27) { return '<span>团队补贴</span>' }else if (d.type === 28) { return '<span>平级奖励补贴</span>' }else if (d.type === 29) { return '<span>线下服务中心补贴</span>' }else if (d.type === 30) { return '<span>代理商补贴</span>' }else{ return '' } src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -2,7 +2,9 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallOrderItem; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.mall.mapper.MallOrderItemMapper; import cc.mrbird.febs.mall.quartz.OrderSettlementJob; @@ -13,16 +15,16 @@ import cc.mrbird.febs.pay.service.UnipayService; import cc.mrbird.febs.rabbit.consumer.AgentConsumer; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import java.math.BigDecimal; import java.text.DecimalFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; import java.util.stream.Collectors; /** * @author wzy @@ -40,9 +42,29 @@ @Autowired private IMemberProfitService memberProfitService; @Autowired private MallMemberMapper memberMapper; @Test public void dynamicProfit() { agentService.perkMoneyConsumer(Long.parseLong("571")); // agentService.perkMoneyConsumer(Long.parseLong("571")); List<MallMember> mallMemberTeamPerk = new ArrayList<>(); MallMember mallMember = memberMapper.selectById(233L); List<String> ids = StrUtil.split(mallMember.getReferrerIds(), ','); List<MallMember> mallMembers = memberMapper.selectByInviteIds(ids); Map<String, List<MallMember>> collect = mallMembers.stream().collect(Collectors.groupingBy(MallMember::getLevel)); Set<String> set = collect.keySet(); // 得到所有key的集合 for (String key : set) { List<MallMember> value = collect.get(key); System.out.println(key + " " + value); mallMemberTeamPerk.add(value.get(0)); System.out.println(value.get(0).getName()); } List<Long> mallMemberStarIds = mallMemberTeamPerk.stream().map(MallMember::getId).collect(Collectors.toList()); System.out.println(mallMemberStarIds); } @Test public void agentProfit() {