From e3155bdcb11ca4e22d2bc9e54f96a1aa00c7ad4a Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Tue, 26 Mar 2024 12:28:45 +0800
Subject: [PATCH] 抽奖
---
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 331 +++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 309 insertions(+), 22 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
index 68303f5..eddabbb 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java
@@ -59,6 +59,14 @@
private final MallScoreRecordMapper mallScoreRecordMapper;
private final MallScoreAchieveReleaseMapper mallScoreAchieveReleaseMapper;
private final MallScoreVoucherMapper mallScoreVoucherMapper;
+ private final CommonService commonService;
+ private final MallProductBuyRecordMapper mallProductBuyRecordMapper;
+ private final MallProductBuyMapper mallProductBuyMapper;
+ private final MallProductSellMapper mallProductSellMapper;
+ private final MallProductSellRecordMapper mallProductSellRecordMapper;
+ private final MallMemberAmountMapper mallMemberAmountMapper;
+ private final IMallMoneyFlowService iMallMoneyFlowService;
+ private final MallProductNftMapper mallProductNftMapper;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -771,22 +779,28 @@
* 每次拿重试次数大于零
* 按ID asc排序的十条数据
*/
- List<MallMqRecord> mallMqRecords = mallMqRecordMapper.selectByStateLimitTen(2);
- if(CollUtil.isEmpty(mallMqRecords)){
- return;
- }
- for(MallMqRecord mallMqRecord : mallMqRecords){
- Integer retryTimes = mallMqRecord.getRetryTimes();
- if(retryTimes <= 0){
- continue;
- }
- retryTimes = retryTimes - 1;
- mallMqRecord.setRetryTimes(retryTimes);
- mallMqRecordMapper.updateById(mallMqRecord);
-
- Long orderId = mallMqRecord.getOrderId();
- agentProducer.sendPerkMoneyMsg(orderId);
- }
+// List<MallMqRecord> mallMqRecords = mallMqRecordMapper.selectByStateLimitTen(2);
+// if(CollUtil.isEmpty(mallMqRecords)){
+// return;
+// }
+// DateTime dateTime = DateUtil.offsetMinute(new Date(), -5);
+// for(MallMqRecord mallMqRecord : mallMqRecords){
+// if(DateUtil.compare(dateTime,mallMqRecord.getCreateTime()) <= 0){
+// continue;
+// }
+// Integer retryTimes = mallMqRecord.getRetryTimes();
+// if(retryTimes <= 0){
+// continue;
+// }
+// retryTimes = retryTimes - 1;
+// mallMqRecord.setRetryTimes(retryTimes);
+// mallMqRecordMapper.updateById(mallMqRecord);
+//
+// Long orderId = mallMqRecord.getOrderId();
+// if(mallMqRecord.getState() == 2){
+// agentProducer.sendPerkMoneyMsg(orderId);
+// }
+// }
}
@Override
@@ -813,7 +827,8 @@
for(MallScoreRecord mallScoreRecord : mallScoreRecords){
Long memberId = mallScoreRecord.getMemberId();
//每日释放的绿色凭证数量 = 总数 * 释放比例
- BigDecimal scoreCnt = mallScoreRecord.getScoreCnt();
+// BigDecimal scoreCnt = mallScoreRecord.getScoreCnt();
+ BigDecimal scoreCnt = mallScoreRecord.getSurplusCnt();
BigDecimal scoreReleaseCnt = scoreCnt.multiply(roleReleasePercent).setScale(2,BigDecimal.ROUND_DOWN);
BigDecimal surplusCnt = mallScoreRecord.getSurplusCnt();
@@ -893,8 +908,8 @@
/**
* 20%给合伙人、联创
- * 5% 给联创
- * 15% 给合伙人
+ * 5% 给联创 10%
+ * 15% 给合伙人 10%
*/
DataDictionaryCustom roleAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getType(),
@@ -908,7 +923,8 @@
List<MallMember> roleAchieveReleaseMembers = mallMemberMapper.selectByRole(3,1);
if(CollUtil.isNotEmpty(roleAchieveReleaseMembers)){
//联创拿走0.25
- BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.25));
+// BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.25));
+ BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.5));
BigDecimal memberAchieveRelease = multiply.divide(new BigDecimal(roleAchieveReleaseMembers.size()), 2, BigDecimal.ROUND_DOWN);
if(memberAchieveRelease.compareTo(BigDecimal.ZERO) > 0){
for(MallMember mallMember : roleAchieveReleaseMembers){
@@ -924,7 +940,8 @@
List<MallMember> roleAchieveReleaseHHR = mallMemberMapper.selectByRole(4,1);
if(CollUtil.isNotEmpty(roleAchieveReleaseHHR)){
//合伙人拿走0.75
- BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.75));
+// BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.75));
+ BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.5));
BigDecimal memberAchieveReleaseHHR = multiply.divide(new BigDecimal(roleAchieveReleaseHHR.size()), 2, BigDecimal.ROUND_DOWN);
if(memberAchieveReleaseHHR.compareTo(BigDecimal.ZERO) > 0){
for(MallMember mallMember : roleAchieveReleaseHHR){
@@ -1080,7 +1097,7 @@
voucherAmountAdd,
MoneyFlowTypeEnum.VOUCHER_SALE.getValue(),
voucherNo,
- FlowTypeEnum.VOUCHER_AMOUNT.getValue());
+ FlowTypeEnum.BALANCE.getValue());
}
//增加积分凭证池的凭证数量
@@ -1097,6 +1114,276 @@
}
}
+ @Override
+ public void fcmNFTExchangeMsg(String cnt) {
+ /**
+ * 销毁数量 按照比例销毁或者返利给节点
+ */
+ BigDecimal destoryCntTotal = new BigDecimal(cnt);
+
+ DataDictionaryCustom totalPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.FCM_DESTORY_TOTAL_PERCENT.getType(),
+ DataDictionaryEnum.FCM_DESTORY_TOTAL_PERCENT.getCode()
+ );
+ BigDecimal totalPercent = new BigDecimal(totalPercentDic.getValue()).multiply(AppContants.BASIC_PERCENT);
+ //销毁数量
+ BigDecimal destoryCnt = destoryCntTotal.multiply(totalPercent).setScale(2,BigDecimal.ROUND_DOWN);
+
+ DataDictionaryCustom pointPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.FCM_DESTORY_POINT_PERCENT.getType(),
+ DataDictionaryEnum.FCM_DESTORY_POINT_PERCENT.getCode()
+ );
+ BigDecimal pointPercent = new BigDecimal(pointPercentDic.getValue()).multiply(AppContants.BASIC_PERCENT);
+
+ //节点评分总数量
+ BigDecimal pointCnt = destoryCntTotal.multiply(pointPercent).setScale(2,BigDecimal.ROUND_DOWN);
+ //给每个节点平分pointCnt。
+ QueryWrapper<MallMember> queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("partner",1);
+ List<MallMember> mallMembers = mallMemberMapper.selectList(queryWrapper);
+ if(CollUtil.isNotEmpty(mallMembers)){
+ BigDecimal dividePointCnt = pointCnt.divide(new BigDecimal(mallMembers.size()), 2, BigDecimal.ROUND_DOWN);
+ for(MallMember mallMember : mallMembers){
+ Long memberId = mallMember.getId();
+ MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(memberId);
+ mallMemberAmount.setFcmCntAva(mallMemberAmount.getFcmCntAva().add(dividePointCnt));
+ mallMemberAmountMapper.updateFcmCntAvaById(mallMemberAmount);
+ String orderNo = MallUtils.getOrderNum("JD");
+ iMallMoneyFlowService.addMoneyFlow(
+ memberId,
+ dividePointCnt,
+ MoneyFlowTypeNewEnum.PERK_POINT.getValue(),
+ orderNo,
+ mallMember.getId(),
+ FlowTypeNewEnum.FCM_COIN.getValue(),
+ MoneyFlowTypeNewEnum.PERK_POINT.getDescrition());
+ }
+ }
+
+ //更新总销毁数量
+ DataDictionaryCustom fcmDestoryTotalDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.FCM_DESTORY_TOTAL.getType(),
+ DataDictionaryEnum.FCM_DESTORY_TOTAL.getCode()
+ );
+ BigDecimal fcmDestoryTotal = new BigDecimal(fcmDestoryTotalDic.getValue());
+ fcmDestoryTotal = fcmDestoryTotal.add(destoryCnt);
+ commonService.updateDataDic(
+ DataDictionaryEnum.FCM_DESTORY_TOTAL.getType(),
+ DataDictionaryEnum.FCM_DESTORY_TOTAL.getCode(),
+ fcmDestoryTotal.toString());
+
+ DataDictionaryCustom fcmDestoryCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.FCM_DESTORY_CNT.getType(),
+ DataDictionaryEnum.FCM_DESTORY_CNT.getCode()
+ );
+ BigDecimal fcmDestoryCnt = new BigDecimal(fcmDestoryCntDic.getValue());
+
+ BigDecimal fcmDestoryCntAdd = fcmDestoryCnt.add(destoryCnt);
+ /**
+ * 每次销毁10000个,价格增加0.1
+ * 满足的次数 divide
+ */
+ BigDecimal divide = fcmDestoryCntAdd.divide(AppContants.FCM_BASIC, 0, BigDecimal.ROUND_DOWN);
+ if(BigDecimal.ZERO.compareTo(divide) == 0){
+ commonService.updateDataDic(
+ DataDictionaryEnum.FCM_DESTORY_CNT.getType(),
+ DataDictionaryEnum.FCM_DESTORY_CNT.getCode(),
+ fcmDestoryCntAdd.toString());
+ }
+
+ if(BigDecimal.ZERO.compareTo(divide) < 0){
+ //例:累计15000 去掉10000,累计只剩5000
+ BigDecimal fcmDestoryCntReal = fcmDestoryCntAdd.subtract(divide.multiply(AppContants.FCM_BASIC));
+ commonService.updateDataDic(
+ DataDictionaryEnum.FCM_DESTORY_CNT.getType(),
+ DataDictionaryEnum.FCM_DESTORY_CNT.getCode(),
+ fcmDestoryCntReal.toString());
+ //更新价格
+ DataDictionaryCustom fcmPriceDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.FCM_PRICE.getType(),
+ DataDictionaryEnum.FCM_PRICE.getCode()
+ );
+ BigDecimal fcmPrice = new BigDecimal(fcmPriceDic.getValue());
+ fcmPrice = fcmPrice.add(AppContants.FCM_BASIC_ADD_PRICE.multiply(divide));
+ commonService.updateDataDic(
+ DataDictionaryEnum.FCM_PRICE.getType(),
+ DataDictionaryEnum.FCM_PRICE.getCode(),
+ fcmPrice.toString());
+ }
+ }
+
+ @Override
+ public void fcmOrderSellInsureMsg(Long sellRecordId) {
+ /**
+ * 买单确认
+ * 判断买单是否存在、是否已支付
+ * 判断买单是否存在、是否已支付
+ * 更新卖单状态
+ * 更新买单状态
+ */
+ MallProductSellRecord mallProductSellRecord = mallProductSellRecordMapper.selectById(sellRecordId);
+ if(ObjectUtil.isEmpty(mallProductSellRecord)){
+ return;
+ }
+ Integer state = mallProductSellRecord.getState();
+ if(ProductEnum.PRODUCT_MATE_STATE_CONFIRM.getValue() != state){
+ return;
+ }
+ MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(mallProductSellRecord.getBuyRecordId());
+ if(ObjectUtil.isEmpty(mallProductBuyRecord)){
+ return;
+ }
+ Integer stateBuy = mallProductBuyRecord.getState();
+ if(ProductEnum.PRODUCT_MATE_STATE_CONFIRM.getValue() != stateBuy){
+ return;
+ }
+ mallProductSellRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FINISH.getValue());
+ mallProductSellRecordMapper.updateById(mallProductSellRecord);
+ mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FINISH.getValue());
+ mallProductBuyRecordMapper.updateById(mallProductBuyRecord);
+ Long sellId = mallProductSellRecord.getSellId();
+
+ //已完成的买单
+ List<MallProductSellRecord> mallProductSellRecords = mallProductSellRecordMapper.selectListBySellId(sellId,ProductEnum.PRODUCT_MATE_STATE_FINISH.getValue());
+ if(CollUtil.isNotEmpty(mallProductSellRecords)){
+ //实际支付总数
+ BigDecimal nftCntTotal = mallProductSellRecords.stream().map(MallProductSellRecord::getNftCnt).reduce(BigDecimal.ZERO, BigDecimal::add);
+ MallProductSell mallProductSell = mallProductSellMapper.selectById(sellId);
+ if(nftCntTotal.compareTo(mallProductSell.getNftCnt()) >= 0){
+ mallProductSell.setState(ProductEnum.PRODUCT_SELL_SUCCESS.getValue());
+ mallProductSellMapper.updateById(mallProductSell);
+ }
+ }
+
+
+ Long buyId = mallProductBuyRecord.getBuyId();
+ List<MallProductBuyRecord> mallProductBuyRecords = mallProductBuyRecordMapper.selectListByBuyId(buyId,ProductEnum.PRODUCT_MATE_STATE_FINISH.getValue());
+ if(CollUtil.isNotEmpty(mallProductBuyRecords)){
+ //实际支付总数
+ BigDecimal nftCntTotalBuy = mallProductBuyRecords.stream().map(MallProductBuyRecord::getPickNftCnt).reduce(BigDecimal.ZERO, BigDecimal::add);
+ MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(buyId);
+ if(nftCntTotalBuy.compareTo(mallProductBuy.getNftTotal()) >= 0){
+
+ Long productNftId = mallProductBuy.getProductNftId();
+ MallProductNft mallProductNft = mallProductNftMapper.selectById(productNftId);
+ BigDecimal perkTime = mallProductNft.getPerkTime();
+ BigDecimal totalPerk = perkTime.multiply(mallProductBuy.getNftTotal()).setScale(2, BigDecimal.ROUND_DOWN);
+
+ mallProductBuy.setTotalPerk(totalPerk);
+ mallProductBuy.setState(ProductEnum.PRODUCT_BUY_SUCCESS.getValue());
+ mallProductBuy.setPayTime(DateUtil.date());
+ mallProductBuyMapper.updateById(mallProductBuy);
+
+ MallMemberAmount mallMemberAmount = mallMemberAmountMapper.selectByMemberId(mallProductBuy.getMemberId());
+ mallMemberAmount.setTotalPerk(mallMemberAmount.getTotalPerk().add(totalPerk));
+ mallMemberAmountMapper.updateTotalPerkById(mallMemberAmount);
+
+ /**
+ * 更新用户上级收益,冻结7天,7天时间到期自动释放到动态钱包
+ */
+ Long memberId = mallProductBuy.getMemberId();
+ MallMember mallMember = mallMemberMapper.selectById(memberId);
+ if(ObjectUtil.isNotEmpty(mallMember)){
+ //直推
+ String referrerId = mallMember.getReferrerId();
+ MallMember directMember = mallMemberMapper.selectInfoByInviteId(referrerId);
+ if(ObjectUtil.isNotEmpty(directMember)){
+ BigDecimal basicPerkDirectPercent = new BigDecimal(dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ DataDictionaryEnum.BASIC_PERK_DIRECT.getType(),
+ DataDictionaryEnum.BASIC_PERK_DIRECT.getCode()
+ ).getValue()).multiply(new BigDecimal("0.01"));
+
+ BigDecimal nftTotal = mallProductBuy.getNftTotal();
+ BigDecimal basicPerkDirect = nftTotal.multiply(basicPerkDirectPercent).setScale(2, BigDecimal.ROUND_DOWN);
+ /**
+ * 如果用户是冻结,则直接销毁
+ */
+ Integer isFrozen = directMember.getIsFrozen();
+ if(ProductEnum.MEMBER_FROZEN.getValue() == isFrozen){
+
+ MallMemberAmount mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(directMember.getId());
+ if(BigDecimal.ZERO.compareTo(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect)) >= 0){
+ return;
+ }
+ mallMemberAmountMine.setTotalPerk(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect));
+ mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmountMine);
+ //插入一条流水记录
+ String orderNo = MallUtils.getOrderNum("FNFTW");
+ mallMoneyFlowService.addMoneyFlow(
+ memberId,
+ basicPerkDirect.negate(),
+ MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getValue(),
+ orderNo,
+ null,
+ FlowTypeNewEnum.NFT.getValue(),
+ MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_WRONG.getDescrition(),
+ AppContants.MEMBER_FLOW_ING);
+
+ }else {
+
+ MallMemberAmount mallMemberAmountMine = mallMemberAmountMapper.selectByMemberId(directMember.getId());
+ if(BigDecimal.ZERO.compareTo(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect)) >= 0){
+ return;
+ }
+ mallMemberAmountMine.setTotalPerk(mallMemberAmountMine.getTotalPerk().subtract(basicPerkDirect));
+ mallMemberAmountMapper.updateTrendsNftAndFrozenNftById(mallMemberAmountMine);
+
+ MallMemberAmount mallMemberAmountNft = mallMemberAmountMapper.selectByMemberId(directMember.getId());
+ mallMemberAmountNft.setTrendsNft(mallMemberAmountNft.getTrendsNft().add(basicPerkDirect));
+ mallMemberAmountMapper.updateTrendsNftById(mallMemberAmountNft);
+
+ //插入一条流水记录
+ String orderNo = MallUtils.getOrderNum("NFT");
+ mallMoneyFlowService.addMoneyFlow(
+ memberId,
+ basicPerkDirect,
+ MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_DONE.getValue(),
+ orderNo,
+ null,
+ FlowTypeNewEnum.NFT.getValue(),
+ MoneyFlowTypeNewEnum.BASIC_PERK_DIRECT_DONE.getDescrition(),
+ AppContants.MEMBER_FLOW_DONE);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Override
+ public void fcmOrderBuyCancelMsg(Long buyRecordId) {
+ MallProductBuyRecord mallProductBuyRecord = mallProductBuyRecordMapper.selectById(buyRecordId);
+ if(ProductEnum.PRODUCT_MATE_STATE_WAIT_PAY.getValue() != mallProductBuyRecord.getState()){
+ return;
+ }
+ Long sellRecordId = mallProductBuyRecord.getSellRecordId();
+ //更新买单子表的数据
+ mallProductBuyRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue());
+ mallProductBuyRecordMapper.updateById(mallProductBuyRecord);
+ //更新买单主表
+ MallProductBuy mallProductBuy = mallProductBuyMapper.selectById(mallProductBuyRecord.getBuyId());
+ mallProductBuy.setNftAva(mallProductBuy.getNftAva().add(mallProductBuyRecord.getPickNftCnt()));
+ mallProductBuyMapper.updateById(mallProductBuy);
+ Long memberId = mallProductBuy.getMemberId();
+ MallMember mallMember = mallMemberMapper.selectById(memberId);
+ mallMember.setIsFrozen(ProductEnum.MEMBER_FROZEN.getValue());
+ mallMemberMapper.updateById(mallMember);
+ //更新卖单子表的数据
+ MallProductSellRecord mallProductSellRecord = mallProductSellRecordMapper.selectById(sellRecordId);
+ mallProductSellRecord.setState(ProductEnum.PRODUCT_MATE_STATE_FAIL.getValue());
+ mallProductSellRecordMapper.updateById(mallProductSellRecord);
+ //更新卖单主表
+ Long sellId = mallProductSellRecord.getSellId();
+ MallProductSell mallProductSell = mallProductSellMapper.selectById(sellId);
+ mallProductSell.setNftCntAva(mallProductSell.getNftCntAva().add(mallProductSellRecord.getNftCnt()));
+ mallProductSellMapper.updateById(mallProductSell);
+ }
+
+ public static void main(String[] args) {
+ BigDecimal divide = new BigDecimal(12000).divide(new BigDecimal(10000), 0, BigDecimal.ROUND_DOWN);
+ System.out.println(divide);
+ }
+
/**
* 给用户的增加凭证数据,并且增加流水
* @param memberAchieveRelease 释放数量
--
Gitblit v1.9.1