src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -86,7 +86,7 @@ * 补贴消息--重试 * 一个小时运行一次 */ @Scheduled(cron = "0 /5 * * * ? ") @Scheduled(cron = "0 0/5 * * * ?") public void mqPerkRetryJob() { memberProfitService.mqPerkRetryJob(); } src/main/java/cc/mrbird/febs/mall/service/IApiMallOrderInfoService.java
@@ -41,5 +41,4 @@ ApiScoreSetVo myScoreSet(); void changeWallet(Long orderId); } src/main/java/cc/mrbird/febs/mall/service/ICommonService.java
@@ -26,4 +26,6 @@ * @param value */ void updateDataDic(String type, String code, String value); void changeWallet(Long orderId, int payType); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -64,7 +64,6 @@ private final MallOrderRefundMapper mallOrderRefundMapper; private final MallOrderRefundOperationMapper mallOrderRefundOperationMapper; private final MallShoppingCartMapper mallShoppingCartMapper; private final IApiMallMemberService memberService; private final IMallMoneyFlowService mallMoneyFlowService; private final RedisUtils redisUtils; @@ -81,6 +80,8 @@ private final MallAchieveRecordMapper mallAchieveRecordMapper; private final MallMemberWalletMapper mallMemberWalletMapper; private final MallMqRecordMapper mallMqRecordMapper; private final ICommonService commonService; @Override @Transactional(rollbackFor = Exception.class) @@ -332,7 +333,7 @@ orderInfo.setPayResult("1"); this.baseMapper.updateById(orderInfo); changeWallet(orderInfo.getId()); commonService.changeWallet(orderInfo.getId(), FlowTypeEnum.BALANCE.getValue()); /** * 插入一条待处理记录 * mq处理之后,更新状态 @@ -414,205 +415,6 @@ map.put("rcResult", rcResult); return map; } /** * 支付金额后的操作 * 减少积分,增加流水 * 购买套餐后,升级会员等级 * 增加支付金额流水 * 增加补贴额度 * 增加贡献值,增加流水 * 产生一条业绩记录 * @param orderId */ @Override public void changeWallet(Long orderId){ MallOrderInfo orderInfo = this.baseMapper.selectById(orderId); Long memberId = orderInfo.getMemberId(); boolean hasTc = false; //总贡献值 BigDecimal starSum = BigDecimal.ZERO; /** * 总补贴额度 * 所有合伙人补贴至消费礼包的三倍额度需要复购一次。 */ BigDecimal scoreSum = BigDecimal.ZERO; BigDecimal achieveSum = BigDecimal.ZERO; List<MallOrderItem> orderItems = this.baseMapper.getMallOrderItemByOrderId(orderInfo.getId()); if (CollUtil.isNotEmpty(orderItems)) { for (MallOrderItem orderItem : orderItems) { MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); /** * 购买套餐赠送贡献值 * 补贴3倍额度 */ if (mallGoods.getIsNormal() == 2) { hasTc = true; BigDecimal star = (mallGoods.getStar()==null ? BigDecimal.ZERO : mallGoods.getStar()) .multiply(new BigDecimal(orderItem.getCnt())); starSum = starSum.add(star); // scoreSum = scoreSum.add( // new BigDecimal(mallGoods.getPresentPrice()) // .multiply(new BigDecimal(3)) // .multiply(new BigDecimal(orderItem.getCnt())) // .abs() // .setScale(2,BigDecimal.ROUND_DOWN)); String goodsName = mallGoods.getGoodsName(); /** * 1-2档投资级别,2.5倍 * 3-4档投资级别,2.8倍 * 5-6档投资级别,3倍 * 目前紧急修改成按照商品名称 */ BigDecimal basePercent = new BigDecimal("3"); if(goodsName.equals("礼包一") || goodsName.equals("礼包二")){ basePercent = new BigDecimal("2.5"); } if(goodsName.equals("礼包三") || goodsName.equals("礼包四")){ basePercent = new BigDecimal("2.8"); } if(goodsName.equals("礼包五") || goodsName.equals("礼包六")){ basePercent = new BigDecimal("3"); } scoreSum = scoreSum.add( new BigDecimal(mallGoods.getPresentPrice()) .multiply(new BigDecimal(orderItem.getCnt())) .multiply(basePercent) .abs() .setScale(2,BigDecimal.ROUND_DOWN)); achieveSum = achieveSum.add( new BigDecimal(mallGoods.getPresentPrice()) .multiply(new BigDecimal(orderItem.getCnt())) .abs() .setScale(2,BigDecimal.ROUND_DOWN)); } } /** * 增加贡献值,增加流水 */ if (starSum.compareTo(BigDecimal.ZERO) > 0) { //系统设置的个人贡献点最大值 DataDictionaryCustom starGetDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.STAR_GET.getType(), DataDictionaryEnum.STAR_GET.getCode()); if(ObjectUtil.isNotEmpty(starGetDic)){ String starGetStr = StrUtil.isEmpty(starGetDic.getValue()) ? "0" : starGetDic.getValue(); BigDecimal starGet = new BigDecimal(starGetStr); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); BigDecimal star = new BigDecimal(mallMemberWallet.getStar()); if(starGet.compareTo(star.add(starSum)) < 0){ if(starGet.compareTo(BigDecimal.ZERO) == 0){ mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } if(starGet.compareTo(star) > 0){ BigDecimal subtract = starGet.subtract(star); if(subtract.compareTo(starSum) < 0){ starSum = subtract; } mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } }else{ mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } } } /** * 增加补贴额度 */ if (scoreSum.compareTo(BigDecimal.ZERO) > 0) { // MallMember mallMember = memberMapper.selectById(memberId); // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) >= 5){ // scoreSum = scoreSum.multiply(new BigDecimal(3)); // } // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) >= 3 // &&MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) < 5){ // scoreSum = scoreSum.multiply(new BigDecimal(2.8)); // } // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) < 3){ // scoreSum = scoreSum.multiply(new BigDecimal(2.5)); // } memberWalletService.add(scoreSum, memberId, "totalScore"); mallMoneyFlowService.addMoneyFlow( memberId, scoreSum, MoneyFlowTypeEnum.TOTAL_SCORE.getValue(), orderInfo.getOrderNo(), "", scoreSum.toString(), memberId, 1, FlowTypeEnum.TOTAL_SCORE.getValue(), 2); } } /** * 购买套餐后,升级会员等级 */ if (hasTc) { MallMember mallMember = memberMapper.selectById(memberId); if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { mallMember.setLevel(AgentLevelEnum.SECOND_LEVEL.name()); memberMapper.updateById(mallMember); } } /** * 增加支付金额流水 */ mallMoneyFlowService.addMoneyFlow( memberId, orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue()); /** * 减少积分,增加流水 */ int reduce = memberWalletService.reduce(orderInfo.getScoreCnt(), memberId, "prizeScore"); if (reduce == 2) { throw new FebsException("积分不足"); } mallMoneyFlowService.addMoneyFlow( memberId, orderInfo.getScoreCnt().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue()); /** * 产生一条业绩记录 */ if(achieveSum.compareTo(BigDecimal.ZERO) > 0){ MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); mallAchieveRecord.setMemberId(memberId); mallAchieveRecord.setAchieveTime(new Date()); mallAchieveRecord.setAmount(achieveSum.subtract(orderInfo.getScoreAmount())); mallAchieveRecord.setOrderId(orderId); mallAchieveRecord.setPayTime(orderInfo.getPayTime()); mallAchieveRecordMapper.insert(mallAchieveRecord); } } public static void main(String[] args) { src/main/java/cc/mrbird/febs/mall/service/impl/CommonService.java
@@ -1,18 +1,32 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.enumerates.AgentLevelEnum; import cc.mrbird.febs.common.enumerates.DataDictionaryEnum; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.common.utils.AppContants; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.entity.AppVersion; import cc.mrbird.febs.mall.entity.DataDictionaryCustom; import cc.mrbird.febs.mall.mapper.AppVersionMapper; import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.ICommonService; import cc.mrbird.febs.mall.service.IMallAchieveService; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.pay.service.IAliPayService; import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.pay.service.UnipayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** @@ -26,6 +40,15 @@ private final RedisUtils redisUtils; private final DataDictionaryCustomMapper dataDictionaryCustomMapper; private final AppVersionMapper appVersionMapper; private final MallGoodsMapper mallGoodsMapper; private final MallMemberMapper memberMapper; private final IApiMallMemberWalletService memberWalletService; private final IMallMoneyFlowService mallMoneyFlowService; private final MallAchieveRecordMapper mallAchieveRecordMapper; private final MallMemberWalletMapper mallMemberWalletMapper; private final MallOrderInfoMapper mallOrderInfoMapper; @Override public boolean verifyCode(String account, String code) { @@ -82,4 +105,205 @@ dataDictionaryCustomMapper.updateById(dic); } } /** * 支付金额后的操作 * 减少积分,增加流水 * 购买套餐后,升级会员等级 * 增加支付金额流水 * 增加补贴额度 * 增加贡献值,增加流水 * 产生一条业绩记录 * @param orderId */ @Override public void changeWallet(Long orderId, int payType) { MallOrderInfo orderInfo = this.mallOrderInfoMapper.selectById(orderId); Long memberId = orderInfo.getMemberId(); boolean hasTc = false; //总贡献值 BigDecimal starSum = BigDecimal.ZERO; /** * 总补贴额度 * 所有合伙人补贴至消费礼包的三倍额度需要复购一次。 */ BigDecimal scoreSum = BigDecimal.ZERO; BigDecimal achieveSum = BigDecimal.ZERO; List<MallOrderItem> orderItems = this.mallOrderInfoMapper.getMallOrderItemByOrderId(orderInfo.getId()); if (CollUtil.isNotEmpty(orderItems)) { for (MallOrderItem orderItem : orderItems) { MallGoods mallGoods = mallGoodsMapper.selectById(orderItem.getGoodsId()); /** * 购买套餐赠送贡献值 * 补贴3倍额度 */ if (mallGoods.getIsNormal() == 2) { hasTc = true; BigDecimal star = (mallGoods.getStar()==null ? BigDecimal.ZERO : mallGoods.getStar()) .multiply(new BigDecimal(orderItem.getCnt())); starSum = starSum.add(star); // scoreSum = scoreSum.add( // new BigDecimal(mallGoods.getPresentPrice()) // .multiply(new BigDecimal(3)) // .multiply(new BigDecimal(orderItem.getCnt())) // .abs() // .setScale(2,BigDecimal.ROUND_DOWN)); String goodsName = mallGoods.getGoodsName(); /** * 1-2档投资级别,2.5倍 * 3-4档投资级别,2.8倍 * 5-6档投资级别,3倍 * 目前紧急修改成按照商品名称 */ BigDecimal basePercent = new BigDecimal("3"); if(goodsName.equals("礼包一") || goodsName.equals("礼包二")){ basePercent = new BigDecimal("2.5"); } if(goodsName.equals("礼包三") || goodsName.equals("礼包四")){ basePercent = new BigDecimal("2.8"); } if(goodsName.equals("礼包五") || goodsName.equals("礼包六")){ basePercent = new BigDecimal("3"); } scoreSum = scoreSum.add( new BigDecimal(mallGoods.getPresentPrice()) .multiply(new BigDecimal(orderItem.getCnt())) .multiply(basePercent) .abs() .setScale(2,BigDecimal.ROUND_DOWN)); achieveSum = achieveSum.add( new BigDecimal(mallGoods.getPresentPrice()) .multiply(new BigDecimal(orderItem.getCnt())) .abs() .setScale(2,BigDecimal.ROUND_DOWN)); } } /** * 增加贡献值,增加流水 */ if (starSum.compareTo(BigDecimal.ZERO) > 0) { //系统设置的个人贡献点最大值 DataDictionaryCustom starGetDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode( DataDictionaryEnum.STAR_GET.getType(), DataDictionaryEnum.STAR_GET.getCode()); if(ObjectUtil.isNotEmpty(starGetDic)){ String starGetStr = StrUtil.isEmpty(starGetDic.getValue()) ? "0" : starGetDic.getValue(); BigDecimal starGet = new BigDecimal(starGetStr); MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(memberId); BigDecimal star = new BigDecimal(mallMemberWallet.getStar()); if(starGet.compareTo(star.add(starSum)) < 0){ if(starGet.compareTo(BigDecimal.ZERO) == 0){ mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } if(starGet.compareTo(star) > 0){ BigDecimal subtract = starGet.subtract(star); if(subtract.compareTo(starSum) < 0){ starSum = subtract; } mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } }else{ mallMemberWalletMapper.addStarByMemberId(starSum.intValue(), memberId); mallMoneyFlowService.addMoneyFlow( memberId, starSum, MoneyFlowTypeEnum.STAR.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.STAR.getValue(), 2); } } } /** * 增加补贴额度 */ if (scoreSum.compareTo(BigDecimal.ZERO) > 0) { // MallMember mallMember = memberMapper.selectById(memberId); // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) >= 5){ // scoreSum = scoreSum.multiply(new BigDecimal(3)); // } // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) >= 3 // &&MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) < 5){ // scoreSum = scoreSum.multiply(new BigDecimal(2.8)); // } // if(MemberLevelEnum.SECOND_LEVEL.getLevelCode(mallMember.getLevel()) < 3){ // scoreSum = scoreSum.multiply(new BigDecimal(2.5)); // } memberWalletService.add(scoreSum, memberId, "totalScore"); mallMoneyFlowService.addMoneyFlow( memberId, scoreSum, MoneyFlowTypeEnum.TOTAL_SCORE.getValue(), orderInfo.getOrderNo(), "", scoreSum.toString(), memberId, 1, FlowTypeEnum.TOTAL_SCORE.getValue(), 2); } } /** * 购买套餐后,升级会员等级 */ if (hasTc) { MallMember mallMember = memberMapper.selectById(memberId); if (AgentLevelEnum.ZERO_LEVEL.name().equals(mallMember.getLevel())) { mallMember.setLevel(AgentLevelEnum.SECOND_LEVEL.name()); memberMapper.updateById(mallMember); } } /** * 增加支付金额流水 */ mallMoneyFlowService.addMoneyFlow( memberId, orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), payType); /** * 减少积分,增加流水 */ if (orderInfo.getScoreCnt().compareTo(BigDecimal.ZERO) > 0) { int reduce = memberWalletService.reduce(orderInfo.getScoreCnt(), memberId, "prizeScore"); if (reduce == 2) { throw new FebsException("积分不足"); } mallMoneyFlowService.addMoneyFlow( memberId, orderInfo.getScoreCnt().negate(), MoneyFlowTypeEnum.PAY.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.PRIZE_SCORE.getValue()); } /** * 产生一条业绩记录 */ if(achieveSum.compareTo(BigDecimal.ZERO) > 0){ MallAchieveRecord mallAchieveRecord = new MallAchieveRecord(); mallAchieveRecord.setMemberId(memberId); mallAchieveRecord.setAchieveTime(new Date()); mallAchieveRecord.setAmount(achieveSum.subtract(orderInfo.getScoreAmount())); mallAchieveRecord.setOrderId(orderId); mallAchieveRecord.setPayTime(orderInfo.getPayTime()); mallAchieveRecordMapper.insert(mallAchieveRecord); } } } src/main/java/cc/mrbird/febs/pay/service/impl/WxPayServiceImpl.java
@@ -1,14 +1,20 @@ package cc.mrbird.febs.pay.service.impl; import cc.mrbird.febs.common.enumerates.AgentLevelEnum; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.OrderStatusEnum; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.mall.entity.MallMember; import cc.mrbird.febs.mall.entity.MallMqRecord; import cc.mrbird.febs.mall.entity.MallOrderInfo; import cc.mrbird.febs.mall.mapper.MallMqRecordMapper; import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.service.ICommonService; import cc.mrbird.febs.pay.properties.WxPayProperties; import cc.mrbird.febs.pay.service.IPayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.date.DateField; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUnit; @@ -25,6 +31,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.Date; @@ -40,7 +47,8 @@ public class WxPayServiceImpl implements IPayService { @Autowired private IApiMallMemberService memberService; private ICommonService commonService; @Autowired private MallOrderInfoMapper orderInfoMapper; @@ -49,6 +57,12 @@ @Autowired private WxPayProperties wxPayProperties; @Autowired private MallMqRecordMapper mallMqRecordMapper; @Autowired private AgentProducer agentProducer; @Value("${spring.profiles.active}") private String active; @@ -68,7 +82,7 @@ if ("dev".equals(active) || "test".equals(active)) { request.setTotalFee(1); } else { request.setTotalFee(orderInfo.getAmount().multiply(new BigDecimal(100)).intValue()); request.setTotalFee(orderInfo.getAmount().subtract(orderInfo.getScoreAmount()).multiply(new BigDecimal(100)).intValue()); } try { @@ -81,6 +95,7 @@ } @Override @Transactional(rollbackFor = Exception.class) public void payCallback(Map<String, String> params) { String orderNo = params.get("out_trade_no"); @@ -96,5 +111,21 @@ orderInfo.setPayTime(new Date()); orderInfo.setPayTradeNo(params.get("transaction_id")); orderInfoMapper.updateById(orderInfo); commonService.changeWallet(orderInfo.getId(), FlowTypeEnum.BALANCE.getValue()); /** * 插入一条待处理记录 * mq处理之后,更新状态 */ MallMqRecord mallMqRecord = new MallMqRecord(); mallMqRecord.setOrderId(orderInfo.getId()); mallMqRecord.setState(2); mallMqRecord.setRetryTimes(2); mallMqRecordMapper.insert(mallMqRecord); //发送补贴消息 agentProducer.sendPerkMoneyMsg(orderInfo.getId()); //发送代理自动升级消息 agentProducer.sendAutoLevelUpMsg(orderInfo.getMemberId()); } } src/test/java/cc/mrbird/febs/ProfitTest.java
@@ -82,7 +82,7 @@ } @Test public void agentProfit() { iApiMallOrderInfoService.changeWallet(665L); // iApiMallOrderInfoService.changeWallet(665L); }