From 8a0a6bb05752d08153ac9cffb09a5760ca1c10b6 Mon Sep 17 00:00:00 2001
From: Hentua <wangdoubleone@gmail.com>
Date: Fri, 21 Apr 2023 01:33:37 +0800
Subject: [PATCH] 分红设置
---
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 559 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 544 insertions(+), 15 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 7411b14..df1062a 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
@@ -1,9 +1,6 @@
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.enumerates.*;
import cc.mrbird.febs.common.utils.AppContants;
import cc.mrbird.febs.common.utils.MallUtils;
import cc.mrbird.febs.common.utils.RedisUtils;
@@ -12,6 +9,7 @@
import cc.mrbird.febs.mall.mapper.*;
import cc.mrbird.febs.mall.service.*;
import cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo;
+import cc.mrbird.febs.rabbit.producter.AgentProducer;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
@@ -24,6 +22,7 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.models.auth.In;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -56,6 +55,11 @@
private final MallMemberWalletMapper mallMemberWalletMapper;
private final IAgentService iAgentService;
private final IMallMoneyFlowService mallMoneyFlowService;
+ private final MallMqRecordMapper mallMqRecordMapper;
+ private final AgentProducer agentProducer;
+ private final MallScoreRecordMapper mallScoreRecordMapper;
+ private final MallScoreAchieveReleaseMapper mallScoreAchieveReleaseMapper;
+ private final MallScoreVoucherMapper mallScoreVoucherMapper;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -148,8 +152,112 @@
@Override
public void dynamicProfit(Long orderId) {
- return;
-// dynamicProfit(orderId, 2);
+// return;
+ dynamicProfit(orderId, 2);
+ }
+
+ /**
+ * 直推收益
+ *
+ * 1、直推收益 1:20;2:30;3:40 返利,隔代奖拿直推收益20%
+ * 2、若非代理推代理,只拿10%,往上找代理给15%,再往上找代理给15%,往上找连续两层。股东套餐同理
+ * 3、代理推代理按照第1点结算
+ *
+ * @param orderId
+ */
+ @Override
+ public void directProfit(Long orderId) {
+ log.info("######直推奖励, 订单ID:{}######", orderId);
+ MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
+ if (orderInfo.getOrderType() == 2) {
+ log.info("积分订单无返利");
+ return;
+ }
+ BigDecimal indirectPer = BigDecimal.valueOf(0.2);
+ BigDecimal indirectPer2 = BigDecimal.valueOf(0.15);
+
+ MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
+
+ // 父级会员
+ MallMember parentMember = mallMemberMapper.selectInfoByInviteId(member.getReferrerId());
+
+ // 父级会员直推人数
+ Integer directCnt = mallMemberMapper.selectOwnCntByInviteId(parentMember.getInviteId());
+ List<DataDictionaryCustom> dataDices = dataDictionaryCustomMapper.selectDicByType(DataDictionaryEnum.DIRECT_BONUS_SETTING.getType());
+
+ directCnt = directCnt == null ? 0 : directCnt;
+ List<MallOrderItem> items = mallOrderInfoMapper.getMallOrderItemByOrderId(orderId);
+
+ if (CollUtil.isEmpty(items)) {
+ return;
+ }
+
+ for (MallOrderItem item : items) {
+ // 减去成本后算收益
+ BigDecimal amount = item.getPrice().subtract(item.getCostPrice()).multiply(BigDecimal.valueOf(item.getCnt()));
+ if (amount.compareTo(BigDecimal.ZERO) < 1) {
+ continue;
+ }
+
+ // 直推返利比例
+ BigDecimal profitPer = BigDecimal.ZERO;
+ int isSameLevel = 0;
+ // 普通商品 -- 直推上级可拿百分比直推奖励
+ if (item.getIsNormal() == 1) {
+ profitPer = new BigDecimal(item.getNormalPer());
+
+ // 套餐商品
+ } else {
+
+ // 判断上级是否与自己购买的套餐符合,若符合则走3级直推逻辑,若不符合则另外一个
+ if (parentMember.getAccountLevel().equals(item.getGoodsLevel()) || AccountLevelEnums.VIP.getLevel().equals(parentMember.getAccountLevel())) {
+
+ for (DataDictionaryCustom dataDic : dataDices) {
+ JSONObject jsonObject = JSONObject.parseObject(dataDic.getValue());
+ if (directCnt >= jsonObject.getInteger("pushCnt")) {
+ profitPer = jsonObject.getBigDecimal("prop");
+ }
+ }
+ isSameLevel = 1;
+ // 非代理推代理/非股东推股东
+ } else {
+ profitPer = BigDecimal.valueOf(0.1);
+ isSameLevel = 2;
+ }
+ }
+
+ // 直推奖
+ BigDecimal profit = amount.multiply(profitPer.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
+ changeScoreAndCommission(parentMember.getId(), profit, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo());
+
+ // 代理推代理
+ if (isSameLevel == 1) {
+ MallMember doubleParentMember = mallMemberMapper.selectInfoByInviteId(parentMember.getReferrerId());
+ if (doubleParentMember == null) {
+ continue;
+ }
+
+ BigDecimal doubleParentProfit = profit.multiply(indirectPer);
+ changeScoreAndCommission(doubleParentMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo());
+ }
+
+ // 非代理推代理
+ if (isSameLevel == 2) {
+ List<MallMember> mallMembers = mallMemberMapper.selectParentMemberList(StrUtil.split(parentMember.getReferrerIds(), ','), parentMember.getReferrerId(), 2);
+ if (CollUtil.isEmpty(mallMembers)) {
+ continue;
+ }
+
+ for (MallMember mallMember : mallMembers) {
+ if (!item.getGoodsLevel().equals(mallMember.getAccountLevel())) {
+ break;
+ }
+
+ BigDecimal doubleParentProfit = profit.multiply(indirectPer2);
+ changeScoreAndCommission(mallMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo());
+ }
+ }
+ }
}
/**
@@ -161,7 +269,6 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void dynamicProfit(Long orderId, Integer isNormal) {
- log.info("######直推奖励, 订单ID:{}######", orderId);
MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
if (orderInfo.getOrderType() == 2) {
log.info("积分订单无返利");
@@ -275,13 +382,7 @@
@Transactional(rollbackFor = Exception.class)
public void agentProfit(Date profitDate) {
log.info("#####==代理分红==start==#####");
- if (profitDate == null) {
- profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
- }
- // 套餐业绩
-// BigDecimal tcIncome = mallOrderInfoMapper.selectTotalAmountUnCostForDate(profitDate, null, "D", 2);
- // 普通商品业绩
-// BigDecimal normalIncome = mallOrderInfoMapper.selectTotalAmountUnCostForDate(profitDate, null, "D", 1);
+
BigDecimal totalIncome = mallAchieveRecordMapper.selectAchieveTotal("D", profitDate);
DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS.getType(), DataDictionaryEnum.AGENT_BONUS.getCode());
@@ -685,6 +786,8 @@
//减少补贴额度
mallMemberWalletMapper.reduceTotalScoreById(offLinePerkAmountSum, mallMemberWallet.getId());
+ iAgentService.reduceStar(mallMemberWallet.getMemberId(),offLinePerkAmountSum);
+
mallMemberWalletMapper.addBalanceById(offLinePerkAmountSum, mallMemberWallet.getId());
mallMoneyFlowService.addMoneyFlow(
@@ -732,17 +835,443 @@
//减少补贴额度
mallMemberWalletMapper.reduceTotalScoreById(teamEqualsPerkAmount, mallMemberWallet.getId());
+ iAgentService.reduceStar(mallMemberWallet.getMemberId(),teamEqualsPerkAmount);
+
mallMemberWalletMapper.addBalanceById(teamEqualsPerkAmount, mallMemberWallet.getId());
+//
+// mallMoneyFlowService.addMoneyFlow(
+// adminTeamEqualsPerkVo.getRtMemberId(),
+// teamEqualsPerkAmount,
+// MoneyFlowTypeEnum.TEAM_EQUALS_PERK.getValue(),
+// MallUtils.getOrderNum("TEP"),
+// FlowTypeEnum.BALANCE.getValue());
mallMoneyFlowService.addMoneyFlow(
adminTeamEqualsPerkVo.getRtMemberId(),
teamEqualsPerkAmount,
MoneyFlowTypeEnum.TEAM_EQUALS_PERK.getValue(),
MallUtils.getOrderNum("TEP"),
- FlowTypeEnum.BALANCE.getValue());
+ "平级奖励补贴",
+ "补贴额度:"+mallMemberWallet.getTotalScore(),
+ adminTeamEqualsPerkVo.getMemberId(),
+ 2,
+ FlowTypeEnum.BALANCE.getValue(),
+ 1);
}
}
}
}
+
+ @Override
+ public void mqPerkRetryJob() {
+ /**
+ * 每次拿重试次数大于零
+ * 按ID asc排序的十条数据
+ */
+// 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
+ @Transactional(rollbackFor = Exception.class)
+ public void scoreRecordReleaseJob() {
+ /**
+ * 每日按照比例释放记录的百分比到用户的绿色凭证账户
+ */
+ //获取全部剩余数量大于零的记录
+ List<MallScoreRecord> mallScoreRecords = mallScoreRecordMapper.selectList();
+ if(CollUtil.isEmpty(mallScoreRecords)){
+ return;
+ }
+
+ DataDictionaryCustom roleReleasePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.ROLE_RELEASE_PERCENT.getType(),
+ GreenScoreEnum.ROLE_RELEASE_PERCENT.getCode()
+ );
+ if(ObjectUtil.isEmpty(roleReleasePercentDic)){
+ return;
+ }
+ //释放比例
+ BigDecimal roleReleasePercent = new BigDecimal(roleReleasePercentDic.getValue()).multiply(new BigDecimal(0.001));
+ for(MallScoreRecord mallScoreRecord : mallScoreRecords){
+ Long memberId = mallScoreRecord.getMemberId();
+ //每日释放的绿色凭证数量 = 总数 * 释放比例
+ BigDecimal scoreCnt = mallScoreRecord.getScoreCnt();
+ BigDecimal scoreReleaseCnt = scoreCnt.multiply(roleReleasePercent).setScale(2,BigDecimal.ROUND_DOWN);
+
+ BigDecimal surplusCnt = mallScoreRecord.getSurplusCnt();
+ if(scoreReleaseCnt.compareTo(surplusCnt) >= 0){
+ scoreReleaseCnt = surplusCnt;
+ }
+ if(scoreReleaseCnt.compareTo(BigDecimal.ZERO) > 0){
+ releaseToMemberAndAddFlow(scoreReleaseCnt,memberId,
+ MoneyFlowTypeEnum.ROLE_RELEASE_SCORE.getValue(),mallScoreRecord.getScoreNo());
+
+ //更新凭证记录的剩余数量
+ surplusCnt = surplusCnt.subtract(scoreReleaseCnt);
+ mallScoreRecord.setSurplusCnt(surplusCnt);
+ mallScoreRecordMapper.updateById(mallScoreRecord);
+ }
+ }
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void achieveReleaseJob() {
+ /**
+ * 业绩产生凭证
+ * 获取每日最大产生的凭证数量
+ * 获取每日总业绩
+ * 获取业绩产生凭证的最大值和最小值
+ * 每条业绩记录占
+ */
+
+ //获取每日总业绩
+ Date profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
+ BigDecimal achieveTotal = mallAchieveRecordMapper.selectAchieveTotal("D", profitDate);
+
+ DataDictionaryCustom achieveMinDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.ACHIEVE_MIN.getType(),
+ GreenScoreEnum.ACHIEVE_MIN.getCode()
+ );
+ //业绩的最小值
+ BigDecimal achieveMin = new BigDecimal(achieveMinDic.getValue() == null ? "0" : achieveMinDic.getValue());
+ if(achieveTotal.compareTo(achieveMin) < 0){
+ return;
+ }
+
+ DataDictionaryCustom achieveMaxDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.ACHIEVE_MAX.getType(),
+ GreenScoreEnum.ACHIEVE_MAX.getCode()
+ );
+ //业绩的最大值
+ BigDecimal achieveMax = new BigDecimal(achieveMaxDic.getValue() == null ? "0" : achieveMaxDic.getValue());
+
+ /**
+ * 获取每日最大产生的凭证数量
+ * 改成每日产出固定值
+ */
+// BigDecimal achieveDailyRelease = getAchieveDailyRelease();
+ DataDictionaryCustom achieveReleaseDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.ACHIEVE_RELEASE.getType(),
+ GreenScoreEnum.ACHIEVE_RELEASE.getCode()
+ );
+ BigDecimal achieveDailyRelease = new BigDecimal(achieveReleaseDic.getValue() == null ? "0" : achieveReleaseDic.getValue());
+ if(achieveDailyRelease.compareTo(BigDecimal.ZERO) <= 0){
+ return;
+ }
+
+ if(achieveTotal.compareTo(achieveMax) < 0){
+ BigDecimal divide = achieveTotal.divide(achieveMax, 2, BigDecimal.ROUND_DOWN);
+ achieveDailyRelease = achieveDailyRelease.multiply(divide).setScale(2,BigDecimal.ROUND_DOWN);
+ }
+ /**
+ * 实际每日最大产生的凭证数量
+ */
+ BigDecimal achieveDailyReleaseReal = BigDecimal.ZERO;
+ /**
+ * 业务编号
+ */
+ String scoreNo = MallUtils.getOrderNum("ARSX");
+
+ /**
+ * 20%给合伙人、联创
+ * 5% 给联创
+ * 15% 给合伙人
+ */
+ DataDictionaryCustom roleAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getType(),
+ GreenScoreEnum.ROLE_ACHIEVE_PERCENT.getCode()
+ );
+ //业绩产生凭证给创世的比例
+ BigDecimal roleAchievePercent = new BigDecimal(roleAchievePercentDic.getValue() == null ? "0" : roleAchievePercentDic.getValue())
+ .multiply(new BigDecimal(0.01));
+ //创世的凭证数量
+ BigDecimal roleAchieveRelease = achieveDailyRelease.multiply(roleAchievePercent).setScale(2, BigDecimal.ROUND_DOWN);
+ List<MallMember> roleAchieveReleaseMembers = mallMemberMapper.selectByRole(3,1);
+ if(CollUtil.isNotEmpty(roleAchieveReleaseMembers)){
+ //联创拿走0.25
+ BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.25));
+ BigDecimal memberAchieveRelease = multiply.divide(new BigDecimal(roleAchieveReleaseMembers.size()), 2, BigDecimal.ROUND_DOWN);
+ if(memberAchieveRelease.compareTo(BigDecimal.ZERO) > 0){
+ for(MallMember mallMember : roleAchieveReleaseMembers){
+
+ releaseToMemberAndAddFlow(memberAchieveRelease,mallMember.getId(),
+ MoneyFlowTypeEnum.ACHIEVE_RELEASE_SCORE_LC.getValue(),scoreNo);
+
+ achieveDailyReleaseReal = achieveDailyReleaseReal.add(memberAchieveRelease);
+ }
+ }
+ }
+ //合伙人拿走0.75
+ List<MallMember> roleAchieveReleaseHHR = mallMemberMapper.selectByRole(4,1);
+ if(CollUtil.isNotEmpty(roleAchieveReleaseHHR)){
+ //合伙人拿走0.75
+ BigDecimal multiply = roleAchieveRelease.multiply(new BigDecimal(0.75));
+ BigDecimal memberAchieveReleaseHHR = multiply.divide(new BigDecimal(roleAchieveReleaseHHR.size()), 2, BigDecimal.ROUND_DOWN);
+ if(memberAchieveReleaseHHR.compareTo(BigDecimal.ZERO) > 0){
+ for(MallMember mallMember : roleAchieveReleaseHHR){
+
+ releaseToMemberAndAddFlow(memberAchieveReleaseHHR,mallMember.getId(),
+ MoneyFlowTypeEnum.ACHIEVE_RELEASE_SCORE_HHR.getValue(),scoreNo);
+
+ achieveDailyReleaseReal = achieveDailyReleaseReal.add(memberAchieveReleaseHHR);
+ }
+ }
+ }
+
+ /**
+ * 30%按贡献点分配给所有人
+ */
+ DataDictionaryCustom starAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.STAR_ACHIEVE_PERCENT.getType(),
+ GreenScoreEnum.STAR_ACHIEVE_PERCENT.getCode()
+ );
+ //业绩产生凭证给贡献点分配给所有人
+ BigDecimal starAchievePercent = new BigDecimal(starAchievePercentDic.getValue() == null ? "0" : starAchievePercentDic.getValue())
+ .multiply(new BigDecimal(0.01));
+ //贡献点的凭证数量
+ BigDecimal starAchieveRelease = achieveDailyRelease.multiply(starAchievePercent).setScale(2, BigDecimal.ROUND_DOWN);
+ BigDecimal starSumCnt = mallMemberWalletMapper.selectSumStar();
+ if(starSumCnt.compareTo(BigDecimal.ZERO) > 0){
+ //每一个贡献点获取的凭证
+ BigDecimal starAchieveReleaseOne = starAchieveRelease.divide(starSumCnt, 2, BigDecimal.ROUND_DOWN);
+ List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectStar();
+ if(CollUtil.isNotEmpty(mallMemberWallets) && starAchieveReleaseOne.compareTo(BigDecimal.ZERO) > 0){
+ for(MallMemberWallet mallMemberWallet : mallMemberWallets){
+ //每个人获取的凭证 = 贡献点 * 每一个贡献点值的凭证
+ BigDecimal bigDecimal = starAchieveReleaseOne.multiply(new BigDecimal(mallMemberWallet.getStar())).setScale(2, BigDecimal.ROUND_DOWN);
+
+ releaseToMemberAndAddFlow(bigDecimal,mallMemberWallet.getMemberId(),
+ MoneyFlowTypeEnum.ACHIEVE_RELEASE_SCORE_GXD.getValue(),scoreNo);
+
+ achieveDailyReleaseReal = achieveDailyReleaseReal.add(bigDecimal);
+ }
+ }
+ }
+ /**
+ * 50%按按星级分配给所有人
+ * 二星 30%
+ * 三星 25%
+ * 四星 20%
+ * 五星 15%
+ * 六星 10%
+ */
+ DataDictionaryCustom levelAchievePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.LEVEL_ACHIEVE_PERCENT.getType(),
+ GreenScoreEnum.LEVEL_ACHIEVE_PERCENT.getCode()
+ );
+ //业绩产生凭证给星级分配给所有人
+ BigDecimal levelAchievePercent = new BigDecimal(levelAchievePercentDic.getValue() == null ? "0" : levelAchievePercentDic.getValue())
+ .multiply(new BigDecimal(0.01));
+ //业绩产生凭证给星级分配给所有人总数
+ BigDecimal levelAchieveRelease = achieveDailyRelease.multiply(levelAchievePercent).setScale(2, BigDecimal.ROUND_DOWN);
+ BigDecimal thirdRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.THIRD_LEVEL.getCode(), new BigDecimal(0.3),scoreNo);
+ achieveDailyReleaseReal = achieveDailyReleaseReal.add(thirdRelease);
+
+ BigDecimal fourRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.FOUR_LEVEL.getCode(), new BigDecimal(0.25),scoreNo);
+ achieveDailyReleaseReal = achieveDailyReleaseReal.add(fourRelease);
+
+ BigDecimal fiveRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.FIFTH_LEVEL.getCode(), new BigDecimal(0.2),scoreNo);
+ achieveDailyReleaseReal = achieveDailyReleaseReal.add(fiveRelease);
+
+ BigDecimal sixRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.SIX_LEVEL.getCode(), new BigDecimal(0.15),scoreNo);
+ achieveDailyReleaseReal = achieveDailyReleaseReal.add(sixRelease);
+
+ BigDecimal sevenRelease = releaseByLevel(levelAchieveRelease, AgentLevelEnum.SEVEN_LEVEL.getCode(), new BigDecimal(0.1),scoreNo);
+ achieveDailyReleaseReal = achieveDailyReleaseReal.add(sevenRelease);
+
+ if(achieveDailyReleaseReal.compareTo(BigDecimal.ZERO) > 0){
+ DataDictionaryCustom surplusCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.SURPLUS_CNT.getType(),
+ GreenScoreEnum.SURPLUS_CNT.getCode()
+ );
+ //绿色积分剩余数量
+ BigDecimal surplusCnt = new BigDecimal(surplusCntDic.getValue() == null ? "0" : surplusCntDic.getValue());
+ BigDecimal subtract = surplusCnt.subtract(achieveDailyReleaseReal).setScale(2,BigDecimal.ROUND_DOWN);
+ surplusCntDic.setValue(subtract.toString());
+ dataDictionaryCustomMapper.updateById(surplusCntDic);
+ }
+
+ log.info("昨日实际业绩:{},昨日凭证总共:{},实际产生凭证:{}",
+ achieveTotal,achieveDailyRelease,achieveDailyReleaseReal);
+ MallScoreAchieveRelease mallScoreAchieveRelease = new MallScoreAchieveRelease();
+ mallScoreAchieveRelease.setAchieve(achieveTotal);
+ mallScoreAchieveRelease.setReleaseNo(scoreNo);
+ mallScoreAchieveRelease.setVoucherExpect(achieveDailyRelease);
+ mallScoreAchieveRelease.setVoucherReal(achieveDailyReleaseReal);
+ mallScoreAchieveReleaseMapper.insert(mallScoreAchieveRelease);
+
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void selaHalfVoucher(String price) {
+ /**
+ * 获取所有凭证大于0的用户
+ * 当前价格卖出账户的一半凭证
+ */
+ BigDecimal scorePrice = new BigDecimal(price == null ? "0" : price);
+ if(scorePrice.compareTo(BigDecimal.ZERO) <= 0){
+ return;
+ }
+ List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectList(null);
+ if(CollUtil.isNotEmpty(mallMemberWallets)){
+ List<MallMemberWallet> wallets = mallMemberWallets
+ .stream()
+ .filter(mallMemberWallet -> mallMemberWallet.getVoucherCnt().compareTo(BigDecimal.ZERO) > 0)
+ .collect(Collectors.toList());
+ if(CollUtil.isNotEmpty(wallets)){
+ BigDecimal scorePoolCntAdd = BigDecimal.ZERO;
+ //绿色积分剩余数量
+ for(MallMemberWallet mallMemberWallet : wallets){
+ //增加账户的凭证金额,减少当前的一半的凭证数量
+ BigDecimal voucherCnt = mallMemberWallet.getVoucherCnt().divide(new BigDecimal(2), 2, BigDecimal.ROUND_DOWN)
+ .setScale(2,BigDecimal.ROUND_DOWN);
+ BigDecimal voucherAmountAdd = scorePrice.multiply(voucherCnt)
+ .setScale(2,BigDecimal.ROUND_DOWN);
+ mallMemberWalletMapper.addVorCherAmountAndCntById(voucherAmountAdd,voucherCnt,mallMemberWallet.getId());
+
+ scorePoolCntAdd = scorePoolCntAdd.add(voucherCnt);
+
+ DataDictionaryCustom surplusCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.SURPLUS_CNT.getType(),
+ GreenScoreEnum.SURPLUS_CNT.getCode()
+ );
+ //增加绿色积分剩余数量
+ BigDecimal surplusCnt = new BigDecimal(surplusCntDic.getValue() == null ? "0" : surplusCntDic.getValue());
+ BigDecimal voucherCntAdd = surplusCnt.add(voucherCnt).setScale(2,BigDecimal.ROUND_DOWN);
+ surplusCntDic.setValue(voucherCntAdd.toString());
+ dataDictionaryCustomMapper.updateById(surplusCntDic);
+
+ /**
+ * 生成一条卖出记录
+ */
+ String voucherNo = MallUtils.getOrderNum("VS");
+ MallScoreVoucher mallScoreVoucher = new MallScoreVoucher();
+ mallScoreVoucher.setVoucherNo(voucherNo);
+ mallScoreVoucher.setMemberId(mallMemberWallet.getMemberId());
+ mallScoreVoucher.setVoucherCnt(voucherCnt);
+ mallScoreVoucher.setPrice(scorePrice);
+ mallScoreVoucher.setVoucherAmount(voucherAmountAdd);
+ mallScoreVoucher.setType("S");
+ mallScoreVoucherMapper.insert(mallScoreVoucher);
+
+ //产生一条流水记录
+ mallMoneyFlowService.addMoneyFlow(
+ mallMemberWallet.getMemberId(),
+ voucherAmountAdd,
+ MoneyFlowTypeEnum.VOUCHER_SALE.getValue(),
+ voucherNo,
+ FlowTypeEnum.BALANCE.getValue());
+ }
+
+ //增加积分凭证池的凭证数量
+ DataDictionaryCustom scorePoolCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.SCORE_POOL_CNT.getType(),
+ GreenScoreEnum.SCORE_POOL_CNT.getCode()
+ );
+ //增加绿色积分剩余数量
+ BigDecimal scorePoolCnt = new BigDecimal(scorePoolCntDic.getValue() == null ? "0" : scorePoolCntDic.getValue());
+ scorePoolCnt = scorePoolCnt.add(scorePoolCntAdd);
+ scorePoolCntDic.setValue(scorePoolCnt.toString());
+ dataDictionaryCustomMapper.updateById(scorePoolCntDic);
+ }
+ }
+ }
+
+ /**
+ * 给用户的增加凭证数据,并且增加流水
+ * @param memberAchieveRelease 释放数量
+ * @param memberId 用户ID
+ * @param Type 流水类型
+ * @param flowNo 流水编号
+ */
+ private void releaseToMemberAndAddFlow(BigDecimal memberAchieveRelease,Long memberId,int Type,String flowNo){
+ //释放到用户的账户
+ mallMemberWalletMapper.addVorCherCntByMemberId(memberAchieveRelease,memberId);
+ //产生一条流水记录 TODO 需要去掉注释
+ mallMoneyFlowService.addMoneyFlow(
+ memberId,
+ memberAchieveRelease,
+ Type,
+ flowNo,
+ FlowTypeEnum.VOUCHER_CNT.getValue());
+ }
+
+ /**
+ * 根据星级等级和占比,给该星级的用户释放凭证
+ * @param levelAchieveRelease
+ * @param level
+ * @param percent
+ * @return
+ */
+ private BigDecimal releaseByLevel(BigDecimal levelAchieveRelease,String level,BigDecimal percent,String scoreNo){
+ //实际支付的凭证数量
+ BigDecimal levelReleaseReal = BigDecimal.ZERO;
+ //当前星级的人数
+ List<MallMember> levelMembers = mallMemberMapper.selectMemberWithLevel(level);
+ if(CollUtil.isNotEmpty(levelMembers)){
+ //这个星级该获得的凭证数量 = 总数 * 比例
+ BigDecimal levelReleaseCnt = levelAchieveRelease.multiply(percent).setScale(2, BigDecimal.ROUND_DOWN);
+ if(levelReleaseCnt.compareTo(BigDecimal.ZERO) > 0){
+ //每个人获得的数量
+ BigDecimal levelRelease = levelReleaseCnt.divide(new BigDecimal(levelMembers.size()), 2, BigDecimal.ROUND_DOWN);
+ if(levelRelease.compareTo(BigDecimal.ZERO) > 0){
+ for(MallMember mallMember : levelMembers){
+ releaseToMemberAndAddFlow(levelRelease,mallMember.getId(),MoneyFlowTypeEnum.ACHIEVE_RELEASE_SCORE_XJ.getValue(),scoreNo);
+ levelReleaseReal.add(levelRelease);
+ }
+ }
+ }
+ }
+ return levelReleaseReal;
+ }
+
+ /**
+ * 获取每日最大产生的凭证数量
+ * @return
+ */
+ private BigDecimal getAchieveDailyRelease(){
+ DataDictionaryCustom achieveReleasePercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.ACHIEVE_RELEASE_PERCENT.getType(),
+ GreenScoreEnum.ACHIEVE_RELEASE_PERCENT.getCode()
+ );
+ BigDecimal achieveReleasePercent = new BigDecimal(achieveReleasePercentDic.getValue() == null ? "0" : achieveReleasePercentDic.getValue())
+ .multiply(new BigDecimal(0.0001));
+
+
+ DataDictionaryCustom totalCntDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+ GreenScoreEnum.TOTAL_CNT.getType(),
+ GreenScoreEnum.TOTAL_CNT.getCode()
+ );
+ //总凭证数量
+ BigDecimal totalCnt = new BigDecimal(totalCntDic.getValue() == null ? "0" : totalCntDic.getValue()).multiply(new BigDecimal(0.9));
+
+ //获取每日最大产生的凭证数量
+ BigDecimal achieveRelease = totalCnt.multiply(achieveReleasePercent);
+ return achieveRelease;
+ }
+
}
--
Gitblit v1.9.1