From 04bba509b1b557f0981ff525c35c628a23397bae Mon Sep 17 00:00:00 2001
From: Hentua <wangdoubleone@gmail.com>
Date: Wed, 21 Jun 2023 15:35:07 +0800
Subject: [PATCH] fix
---
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 1305 ++++++++++++++++-------------------------------------------
1 files changed, 353 insertions(+), 952 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 3a8ff18..f09832b 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,27 +1,17 @@
package cc.mrbird.febs.mall.service.impl;
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;
-import cc.mrbird.febs.mall.dto.ScorePoorDto;
import cc.mrbird.febs.mall.entity.*;
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;
-import cn.hutool.core.date.DateUnit;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.RandomUtil;
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 com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@@ -30,7 +20,6 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
-import java.util.stream.Collectors;
/**
* @author wzy
@@ -44,115 +33,174 @@
private final MallMemberMapper mallMemberMapper;
private final MallOrderInfoMapper mallOrderInfoMapper;
private final MallOrderItemMapper mallOrderItemMapper;
- private final MallGoodsMapper mallGoodsMapper;
private final IApiMallMemberWalletService walletService;
private final IMallMoneyFlowService moneyFlowService;
private final DataDictionaryCustomMapper dataDictionaryCustomMapper;
- private final MallMoneyFlowMapper mallMoneyFlowMapper;
- private final MallAchieveRecordMapper mallAchieveRecordMapper;
- private final RedisUtils redisUtils;
- 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;
+ private final MallSystemSettingMapper mallSystemSettingMapper;
+ private final IAdminMallMemberService adminMallMemberService;
+
+ /**
+ * 直推收益
+ *
+ * 1、直推收益 1:20;2:30;3:40 返利,隔代奖拿直推收益20%
+ * 2、若非代理推代理,只拿10%,往上找代理给15%,再往上找代理给15%,往上找连续两层。股东套餐同理
+ * 3、代理推代理按照第1点结算
+ *
+ * @param orderId
+ */
@Override
@Transactional(rollbackFor = Exception.class)
- public void staticProfit(Date profitDate) {
- log.info("#####静态分红开始运行:{}#####", new Date());
- List<MallMember> members = mallMemberMapper.selectList(null);
- if (CollUtil.isEmpty(members)) {
+ public void directProfit(Long orderId) {
+ log.info("######直推奖励, 订单ID:{}######", orderId);
+ MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
+ if (orderInfo.getOrderType() == 2) {
+ log.info("积分订单无返利");
return;
}
- /**
- *
- */
- 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);
+ MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
- if (totalIncome.compareTo(BigDecimal.ZERO) == 0) {
+ // 父级会员
+ MallMember parentMember = mallMemberMapper.selectInfoByInviteId(member.getReferrerId());
+ if (parentMember == null) {
return;
}
- DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.STATIC_BONUS.getType(), DataDictionaryEnum.STATIC_BONUS.getCode());
- BigDecimal perProfit = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP));
+ if (parentMember.getAccountLevel() == 0 || MemberLevelEnum.ZERO_LEVEL.getType().equals(parentMember.getLevel())) {
+ log.info("上级:{}未购买会员套餐,无返利", parentMember.getInviteId());
+ return;
+ }
- Map<Long, List<Map<String, Object>>> map = new HashMap<>();
- Map<Long, BigDecimal> goodsProp = new HashMap<>();
- for (MallMember member : members) {
- List<MallGoods> goodsList = mallGoodsMapper.selectOrderGoodsList(member.getId(), profitDate);
+ // 非代理推代理,非代理上级拿的收益比例
+ DataDictionaryCustom indirectPerDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.UNAGENT_TO_AGENT_PARENT.getType(), DataDictionaryEnum.UNAGENT_TO_AGENT_PARENT.getCode());
- if (CollUtil.isEmpty(goodsList)) {
+
+ // 非代理推代理,非代理上级拿的收益比例
+ DataDictionaryCustom indirectPerTwoDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.UNAGENT_TO_AGENT_PARENT_TWO.getType(), DataDictionaryEnum.UNAGENT_TO_AGENT_PARENT_TWO.getCode());
+
+
+ // 非代理推代理,非代理的直推收益比例
+ DataDictionaryCustom unAgentDirectDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.UNAGENT_TO_AGENT.getType(), DataDictionaryEnum.UNAGENT_TO_AGENT.getCode());
+
+ // 父级需要拥有 此会员 对应级别的直推数量
+ Integer directCnt = mallMemberMapper.selectOwnCntByInviteIdAndAccountLevel(parentMember.getInviteId(), member.getAccountLevel());
+ 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;
+ }
+
+ // 推荐奖比例
+ DataDictionaryCustom indrectDicPropDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RECOMMEND_BONUS.getType(), DataDictionaryEnum.RECOMMEND_BONUS.getCode());
+
+ for (MallOrderItem item : items) {
+ // 减去成本后算收益 减去积分付款
+ BigDecimal amount = item.getPrice().subtract(item.getCostPrice()).multiply(BigDecimal.valueOf(item.getCnt())).subtract(orderInfo.getScoreAmount());
+ if (amount.compareTo(BigDecimal.ZERO) < 1) {
continue;
}
- for (MallGoods goods : goodsList) {
- if (goods.getIsNormal() == 1) {
+ // ----- 直推奖 start -------
+ // 直推返利比例
+ BigDecimal profitPer = BigDecimal.ZERO;
+ int isSameLevel = 0;
+ // 普通商品 -- 直推上级可拿百分比直推奖励
+ if (item.getIsNormal() == 1) {
+ profitPer = new BigDecimal(item.getNormalPer());
+
+ // 套餐商品
+ } else {
+
+ // 判断上级是否与自己购买的套餐符合,若符合则走3级直推逻辑,若不符合则另外一个
+
+ // 非代理推代理/非股东推股东
+ if (parentMember.getAccountLevel() == 1 && item.getGoodsLevel() != 1) {
+ profitPer = new BigDecimal(unAgentDirectDic.getValue());
+ isSameLevel = 2;
+ } else {
+ for (DataDictionaryCustom dataDic : dataDices) {
+ JSONObject jsonObject = JSONObject.parseObject(dataDic.getValue());
+ if (directCnt >= jsonObject.getInteger("pushCnt")) {
+ profitPer = jsonObject.getBigDecimal("prop");
+ }
+ }
+ isSameLevel = 1;
+ }
+ }
+
+ // 直推奖
+ BigDecimal profit = amount.multiply(profitPer.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
+ log.info("直推奖励:{}", profit);
+ changeScoreAndCommission(parentMember.getId(), profit, MoneyFlowTypeEnum.DIRECT_BONUS.getValue(), orderInfo.getOrderNo());
+
+ // 非代理推代理
+ if (isSameLevel == 2) {
+ if (StrUtil.isBlank(parentMember.getReferrerIds())) {
continue;
}
- List<Map<String, Object>> list = map.get(goods.getId());
- if (CollUtil.isEmpty(list)) {
- list = new ArrayList<>();
+ List<MallMember> mallMembers = adminMallMemberService.findParentMemberList(StrUtil.split(parentMember.getReferrerIds(), ','), 2, true);
+ if (CollUtil.isEmpty(mallMembers)) {
+ continue;
}
- Map<String, Object> listItem = new HashMap<>();
- listItem.put("memberId", member.getId());
- listItem.put("orderNo", goods.getOrderNo());
- list.add(listItem);
+ int index = 1;
+ for (MallMember mallMember : mallMembers) {
+ if (mallMember.getAccountLevel() == 1) {
+ continue;
+ }
- map.put(goods.getId(), list);
- goodsProp.put(goods.getId(), goods.getStaticProp());
- }
- }
-
- if (!map.isEmpty()) {
- for (Map.Entry<Long, List<Map<String, Object>>> entry : map.entrySet()) {
- List<Map<String, Object>> list = entry.getValue();
- BigDecimal staticProfit = goodsProp.get(entry.getKey()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).multiply(perProfit);
- BigDecimal preStaticProfit = staticProfit.divide(new BigDecimal(list.size()), 2, RoundingMode.HALF_UP);
-
- for (Map<String, Object> item : list) {
-// Long memberId = (Long) item.get("memberId");
- String orderNo = (String) item.get("orderNo");
- changeAllScoreAndCommission(preStaticProfit,orderNo);
-// int reduce = walletService.reduce(preStaticProfit, memberId, "score");
-// if (reduce == 2) {
-// break;
-// }
-//
-// walletService.add(preStaticProfit, memberId, "commission");
-// moneyFlowService.addMoneyFlow(memberId, preStaticProfit, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderNo, FlowTypeEnum.COMMISSION.getValue());
-// moneyFlowService.addMoneyFlow(memberId, preStaticProfit.negate(), MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderNo, FlowTypeEnum.SCORE.getValue());
-// changeScoreAndCommission(memberId, preStaticProfit, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderNo);
+ if (index == 2) {
+ indirectPerDic = indirectPerTwoDic;
+ }
+ BigDecimal doubleParentProfit = amount.multiply(new BigDecimal(indirectPerDic.getValue()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP));
+ changeScoreAndCommission(mallMember.getId(), doubleParentProfit, MoneyFlowTypeEnum.DIRECT_BONUS.getValue(), orderInfo.getOrderNo());
+ index++;
}
}
- }
- }
+ // ----- 直推奖 end -------
- public void changeAllScoreAndCommission(BigDecimal preStaticProfit,String orderNo){
- List<MallMember> members = mallMemberMapper.selectList(null);
- for(MallMember mallMember : members){
- changeScoreAndCommission(mallMember.getId(), preStaticProfit, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderNo);
- }
- }
+ // =======隔代奖== start =====
+ if (StrUtil.isBlank(parentMember.getReferrerId())) {
+ continue;
+ }
- @Override
- public void dynamicProfit(Long orderId) {
- return;
-// dynamicProfit(orderId, 2);
+ List<String> parents = StrUtil.split(parentMember.getReferrerIds(), ',');
+ List<MallMember> members = adminMallMemberService.findParentMemberList(parents, null, true);
+ if (CollUtil.isEmpty(members)) {
+ return;
+ }
+
+ BigDecimal direct = profit;
+ for (MallMember parent : members) {
+ if (parent.getInviteId().equals(parentMember.getInviteId())) {
+ continue;
+ }
+
+ BigDecimal indrectDicProp = new BigDecimal(indrectDicPropDic.getValue());
+
+ // 隔代推荐奖 收益
+ direct = direct.multiply(indrectDicProp.divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
+
+ // direct 收益小于1,则跳出
+ if (direct.compareTo(BigDecimal.valueOf(0.01)) < 1) {
+ break;
+ }
+ int reduceResult = walletService.reduce(direct, parent.getId(), "score");
+ if (reduceResult == 2) {
+ continue;
+ }
+
+ walletService.add(direct, parent.getId(), "balance");
+ moneyFlowService.addMoneyFlow(parent.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.BALANCE.getValue());
+ moneyFlowService.addMoneyFlow(parent.getId(), direct.negate(), MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
+ }
+ // =======隔代奖== end =====
+ }
}
/**
@@ -164,7 +212,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("积分订单无返利");
@@ -215,7 +262,7 @@
// moneyFlowService.addMoneyFlow(parent.getId(), dynamicProfit, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.COMMISSION.getValue());
// moneyFlowService.addMoneyFlow(parent.getId(), dynamicProfit.negate(), MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
- dynamicProfit = changeScoreAndCommission(parent.getId(), dynamicProfit, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo());
+// dynamicProfit = changeScoreAndCommission(parent.getId(), dynamicProfit, MoneyFlowTypeEnum.DYNAMIC_ACHIEVE.getValue(), orderInfo.getOrderNo());
if (dynamicProfit.compareTo(BigDecimal.ZERO) < 1) {
continue;
}
@@ -268,7 +315,7 @@
// walletService.add(direct, parentMember.getId(), "commission");
// moneyFlowService.addMoneyFlow(parentMember.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.COMMISSION.getValue());
// moneyFlowService.addMoneyFlow(parentMember.getId(), direct.negate(), MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
- changeScoreAndCommission(parentMember.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo());
+// changeScoreAndCommission(parentMember.getId(), direct, MoneyFlowTypeEnum.RECOMMEND_BONUS.getValue(), orderInfo.getOrderNo());
}
// =======隔代奖== end =====
}
@@ -276,54 +323,55 @@
@Override
@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);
+ public void agentProfit(Integer type) {
+ log.info("#####==代理分红--{}==start==#####", type);
+ if (type == null) {
+ return;
}
- // 套餐业绩
-// 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());
- BigDecimal profit = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
-
- List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.SECOND_LEVEL.name());
- if (CollUtil.isEmpty(agentMembers)) {
+
+ MallSystemSetting systemSetting = mallSystemSettingMapper.selectById(1L);
+ if (systemSetting == null) {
+ log.info("没有系统配置");
return;
}
- List<DataDictionaryCustom> dics = dataDictionaryCustomMapper.selectDicByType(AppContants.AGENT_LEVEL_REQUIRE);
- for (DataDictionaryCustom agentDic : dics) {
- JSONObject jsonObject = JSONObject.parseObject(agentDic.getValue());
- BigDecimal profitProp = jsonObject.getBigDecimal("profitProp").divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
-
- List<MallMember> agentMemberList = mallMemberMapper.selectMemberWithLevel(agentDic.getCode());
- if (CollUtil.isEmpty(agentMemberList)) {
- continue;
- }
-
- BigDecimal income = profit.multiply(profitProp).divide(BigDecimal.valueOf(agentMemberList.size()), 2, RoundingMode.HALF_UP);
- if (income.compareTo(BigDecimal.ZERO) < 1) {
- continue;
- }
-
- for (MallMember agentMember : agentMemberList) {
-// int reduce = walletService.reduce(income, agentMember.getId(), "score");
-// if (reduce == 2) {
-// continue;
-// }
-//
-// walletService.add(income, agentMember.getId(), "commission");
-//
-// moneyFlowService.addMoneyFlow(agentMember.getId(), income, MoneyFlowTypeEnum.AGENT_BONUS.getValue(), null, FlowTypeEnum.COMMISSION.getValue());
-// moneyFlowService.addMoneyFlow(agentMember.getId(), income.negate(), MoneyFlowTypeEnum.AGENT_BONUS.getValue(), null, FlowTypeEnum.SCORE.getValue());
- changeScoreAndCommission(agentMember.getId(), income, MoneyFlowTypeEnum.AGENT_BONUS.getValue(), null);
- }
+ BigDecimal hundred = BigDecimal.valueOf(100);
+ DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS_RELEASE.getType(), DataDictionaryEnum.AGENT_BONUS_RELEASE.getCode());
+ if (dic == null || StrUtil.isBlank(dic.getValue()) || Integer.parseInt(dic.getValue()) == 0) {
+ log.info("不进行代理分红");
+ return;
}
- log.info("#####==代理分红==end==#####");
+
+ BigDecimal bonus = BigDecimal.ZERO;
+ if (AccountLevelEnums.VVIP.getLevel().equals(type)) {
+ bonus = systemSetting.getAgentBonus();
+ } else {
+ bonus = systemSetting.getPartnerBonus();
+ }
+
+ // 代理
+ BigDecimal waitToBonus = bonus.multiply(new BigDecimal(dic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
+
+ // 代理
+ List<MallMember> mallMembers = mallMemberMapper.selectAgentOrPartnetMemberList(type);
+ if (CollUtil.isEmpty(mallMembers) || waitToBonus.compareTo(BigDecimal.ZERO) < 1) {
+ log.info("待分红金额不足或会员不足");
+ return;
+ }
+
+ BigDecimal perBonus = waitToBonus.divide(new BigDecimal(mallMembers.size()), 2, RoundingMode.HALF_UP);
+ mallMembers.forEach(item -> {
+ changeScoreAndCommission(item.getId(), perBonus, type.equals(AccountLevelEnums.VVIP.getLevel()) ? MoneyFlowTypeEnum.AGENT_BONUS.getValue() : MoneyFlowTypeEnum.PARTNER_BONUS.getValue(), null);
+ });
+
+ if (type.equals(AccountLevelEnums.VVIP.getLevel())) {
+ changeSystemBonus(null, waitToBonus.negate(),null);
+ } else {
+ changeSystemBonus(null, null, waitToBonus.negate());
+ }
+
+ bonusRecord(waitToBonus, type, null, null);
+ log.info("#####==代理分红 -- {}==end==#####", type);
}
private BigDecimal changeScoreAndCommission(Long memberId, BigDecimal income, Integer type, String orderNo) {
@@ -336,842 +384,195 @@
}
income = map.get("amount");
- walletService.add(income, memberId, "commission");
- moneyFlowService.addMoneyFlow(memberId, income, type, orderNo, FlowTypeEnum.COMMISSION.getValue());
+ walletService.add(income, memberId, "balance");
+ moneyFlowService.addMoneyFlow(memberId, income, type, orderNo, FlowTypeEnum.BALANCE.getValue());
moneyFlowService.addMoneyFlow(memberId, income.negate(), type, orderNo, FlowTypeEnum.SCORE.getValue());
return income;
}
@Override
- public void rankProfit() {
- log.info("######==排名分红==####");
- Page<MallMember> page = new Page<>(1, 5);
- MallMember query = new MallMember();
- query.setQuery("2");
-
- Date profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
- query.setCreatedTime(profitDate);
- IPage<MallMember> rankListInPage = mallMemberMapper.selectRankListInPage(page, query);
-
- List<MallMember> rankList = rankListInPage.getRecords();
- if (CollUtil.isEmpty(rankList)) {
+ public void allInternetProfit() {
+ log.info("###全网分红执行--start--###");
+ MallSystemSetting systemSetting = mallSystemSettingMapper.selectById(1L);
+ if (systemSetting == null) {
+ log.info("没有系统配置");
return;
}
- // 套餐业绩
-// BigDecimal tcIncome = mallOrderInfoMapper.selectTotalAmountUnCostForDate(profitDate, null, "M", 2);
- // 普通商品业绩
-// BigDecimal normalIncome = mallOrderInfoMapper.selectTotalAmountUnCostForDate(profitDate, null, "M", 1);
- BigDecimal totalIncome = mallAchieveRecordMapper.selectAchieveTotal("M", profitDate);
-
- List<DataDictionaryCustom> rankAward = dataDictionaryCustomMapper.selectDicByType("RANK_AWARD");
- DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.RANK_BONUS.getType(), DataDictionaryEnum.RANK_BONUS.getCode());
-
-
- BigDecimal rankBonusTotal = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
- BigDecimal preBonus = rankBonusTotal.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
-
- int i = 0;
- for (MallMember member : rankList) {
- DataDictionaryCustom rank = rankAward.get(i);
- i++;
- BigDecimal bonus = preBonus.multiply(new BigDecimal(rank.getValue()));
-// int reduce = walletService.reduce(bonus, member.getId(), "score");
-// if (reduce == 2) {
-// continue;
-// }
-// walletService.add(bonus, member.getId(), "commission");
-// moneyFlowService.addMoneyFlow(member.getId(), bonus, MoneyFlowTypeEnum.RANK_BONUS.getValue(), null, FlowTypeEnum.COMMISSION.getValue());
-// moneyFlowService.addMoneyFlow(member.getId(), bonus.negate(), MoneyFlowTypeEnum.RANK_BONUS.getValue(), null, FlowTypeEnum.SCORE.getValue());
-
- changeScoreAndCommission(member.getId(), bonus, MoneyFlowTypeEnum.RANK_BONUS.getValue(), null);
- }
- }
-
- /**
- * 拿推荐人的收益(代理,直推,排名)的10%加权平分给下面直推
- */
- @Override
- public void thankfulProfit(Date date) {
- log.info("######==感恩奖==start==####");
- List<MallMember> mallMembers = mallMemberMapper.selectMemberListHasChild();
- if (CollUtil.isEmpty(mallMembers)) {
+ BigDecimal hundred = BigDecimal.valueOf(100);
+ DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.ALL_INTERNET_BONUS_RELEASE.getType(), DataDictionaryEnum.ALL_INTERNET_BONUS_RELEASE.getCode());
+ if (dic == null || StrUtil.isBlank(dic.getValue()) || Integer.parseInt(dic.getValue()) == 0) {
+ log.info("不进行全网分红");
return;
}
- if (date == null) {
- date = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
- }
- DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.THANKFUL_BONUS.getType(), DataDictionaryEnum.THANKFUL_BONUS.getCode());
- // 感恩奖比例
- BigDecimal prop = new BigDecimal(dic.getValue()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
-
- for (MallMember mallMember : mallMembers) {
- BigDecimal income = mallMoneyFlowMapper.selectThankfulCommission(date, mallMember.getId());
- List<MallMember> children = mallMemberMapper.selectMemberDirectForHasLevel(mallMember.getInviteId());
- if (CollUtil.isEmpty(children)) {
- continue;
- }
-
- BigDecimal reduceProfit = income.multiply(prop);
- if (reduceProfit.compareTo(BigDecimal.ZERO) < 1) {
- continue;
- }
-
- int reduce = walletService.reduce(reduceProfit, mallMember.getId(), "commission");
- if (reduce == 2) {
- continue;
- }
- moneyFlowService.addMoneyFlow(mallMember.getId(), reduceProfit.negate(), MoneyFlowTypeEnum.THANKFUL.getValue(), null, FlowTypeEnum.COMMISSION.getValue());
-
- for (MallMember child : children) {
- BigDecimal preProfit = income.multiply(prop).divide(BigDecimal.valueOf(children.size()), 2, RoundingMode.HALF_DOWN);
- if (preProfit.compareTo(BigDecimal.ZERO) < 1) {
- continue;
- }
-
-// int reduce1 = walletService.reduce(preProfit, child.getId(), "score");
-// if (reduce1 == 2) {
-// continue;
-// }
-// walletService.add(preProfit, child.getId(), "commission");
-// moneyFlowService.addMoneyFlow(child.getId(), preProfit, MoneyFlowTypeEnum.THANKFUL.getValue(), null, mallMember.getId(), FlowTypeEnum.COMMISSION.getValue());
-// moneyFlowService.addMoneyFlow(child.getId(), preProfit.negate(), MoneyFlowTypeEnum.THANKFUL.getValue(), null, mallMember.getId(), FlowTypeEnum.SCORE.getValue());
- changeScoreAndCommission(child.getId(), preProfit, MoneyFlowTypeEnum.THANKFUL.getValue(), null);
- }
- }
- log.info("######==感恩奖==end==####");
- }
-
- @Override
- public void storeAndDirectorProfit(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.DIRECTOR_BONUS.getType(), DataDictionaryEnum.DIRECTOR_BONUS.getCode());
- List<MallMember> directors = mallMemberMapper.selectDirectorsOrStoreMaster(1);
- if (CollUtil.isNotEmpty(directors)) {
- BigDecimal total = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
- BigDecimal pre = total.divide(new BigDecimal(directors.size()), 2, RoundingMode.HALF_UP);
-
- for (MallMember director : directors) {
- if (pre.compareTo(BigDecimal.ZERO) < 1) {
- continue;
- }
-
-// int reduce = walletService.reduce(pre, director.getId(), "score");
-// if (reduce == 2) {
-// continue;
-// }
-// walletService.add(pre, director.getId(), "commission");
-// moneyFlowService.addMoneyFlow(director.getId(), pre, MoneyFlowTypeEnum.DIRECTOR_BONUS.getValue(), null, FlowTypeEnum.COMMISSION.getValue());
-// moneyFlowService.addMoneyFlow(director.getId(), pre.negate(), MoneyFlowTypeEnum.DIRECTOR_BONUS.getValue(), null, FlowTypeEnum.SCORE.getValue());
- changeScoreAndCommission(director.getId(), pre, MoneyFlowTypeEnum.DIRECTOR_BONUS.getValue(), null);
- }
- }
-
- // 店补
- dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.COMMUNITY_BONUS.getType(), DataDictionaryEnum.COMMUNITY_BONUS.getCode());
- List<MallMember> storeMasters = mallMemberMapper.selectDirectorsOrStoreMaster(2);
- if (CollUtil.isNotEmpty(storeMasters)) {
- BigDecimal total = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
- BigDecimal pre = total.divide(new BigDecimal(storeMasters.size()), 2, RoundingMode.HALF_UP);
-
- for (MallMember storeMaster : storeMasters) {
- if (pre.compareTo(BigDecimal.ZERO) < 1) {
- continue;
- }
-
-// int reduce = walletService.reduce(pre, storeMaster.getId(), "score");
-// if (reduce == 2) {
-// continue;
-// }
-// walletService.add(pre, storeMaster.getId(), "commission");
-// moneyFlowService.addMoneyFlow(storeMaster.getId(), pre, MoneyFlowTypeEnum.COMMUNITY_BONUS.getValue(), null, FlowTypeEnum.COMMISSION.getValue());
-// moneyFlowService.addMoneyFlow(storeMaster.getId(), pre.negate(), MoneyFlowTypeEnum.COMMUNITY_BONUS.getValue(), null, FlowTypeEnum.SCORE.getValue());
- changeScoreAndCommission(storeMaster.getId(), pre, MoneyFlowTypeEnum.COMMUNITY_BONUS.getValue(), null);
- }
- }
- log.info("#####==店补/董事==end==######");
- }
-
- @Override
- public void scorePool() {
- log.info("#####==积分池==start==######");
-
- String redisKey = "scorePool";
-// List<MallOrderInfo> mallOrderInfos = mallOrderInfoMapper.selectList(new QueryWrapper<>());
-// if(CollUtil.isEmpty(mallOrderInfos)){
-// redisUtils.set(redisKey,0,0L);
-// return;
-// }
- /**
- * 后一天2点,结算前一天的所有消费
- * 积分池增加每日消费的10%
- * 每天释放1%,给全体用户
- */
- //前一天的所有消费的10%
- DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.SCORE_POOR_RADIO.getType(), DataDictionaryEnum.SCORE_POOR_RADIO.getCode());
- if(ObjectUtil.isEmpty(dic)){
+ // 全网分红
+ BigDecimal waitToBonus = systemSetting.getAllBonus().multiply(new BigDecimal(dic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
+ List<MallMember> mallMembers = mallMemberMapper.selectMemberAfterLevelList(MemberLevelEnum.FIRST_LEVEL.getType());
+ if (CollUtil.isEmpty(mallMembers) || waitToBonus.compareTo(BigDecimal.ZERO) < 1) {
+ log.info("待分红金额不足或会员不足");
return;
}
- ScorePoorDto scorePoorDto = JSONUtil.toBean(dic.getValue(), ScorePoorDto.class);
- BigDecimal everydayRatio = scorePoorDto.getEverydayRatio().multiply(new BigDecimal(0.01));
- BigDecimal dividEquallyRatio = scorePoorDto.getDividEquallyRatio().multiply(new BigDecimal(0.01));
- Date date = DateUtil.offsetDay(new Date(), -1);
- BigDecimal totalAmount = mallOrderInfoMapper.selectTotalAmountByPayDoneAndDataString(1, date);
- BigDecimal multiplyTotalAmount = totalAmount.multiply(everydayRatio);
- String scorePoolRedis = redisUtils.getString(redisKey);
- if(StrUtil.isBlank(scorePoolRedis)){
- redisUtils.set(redisKey,0,0L);
+ List<DataDictionaryCustom> dicList = dataDictionaryCustomMapper.selectDicByType(DataDictionaryEnum.INTERNET_LEVEL_BONUS.getType());
+ if (CollUtil.isEmpty(dicList)) {
+ return;
}
- BigDecimal scorePoolOld = new BigDecimal(redisUtils.getString(redisKey));
- BigDecimal scorePoolNew = scorePoolOld.add(multiplyTotalAmount);
+ Map<String, BigDecimal> levelBonusMap = new HashMap<>();
+ dicList.forEach(item -> {
+ BigDecimal levelRatio = new BigDecimal(item.getValue()).divide(hundred, 2, RoundingMode.HALF_UP);
+ levelBonusMap.put(item.getCode(), waitToBonus.multiply(levelRatio));
+ });
- //每天释放1%给全体用户
- BigDecimal scorePoolToDay = scorePoolNew.multiply(dividEquallyRatio);
+ Map<String, List<MallMember>> levelMemberMap = new HashMap<>();
+ // TODO 并发处理
+ mallMembers.forEach(item -> {
+ String level = item.getLevel();
- redisUtils.set(redisKey,scorePoolNew.subtract(scorePoolToDay).intValue(),0L);
+ // 全网分红 -- 代理和股东当作是女王殿下级别
+ if (MemberLevelEnum.getLevelCode(level) > MemberLevelEnum.FOUR_LEVEL.getCode()) {
+ level = MemberLevelEnum.FOUR_LEVEL.getType();
+ }
- QueryWrapper<MallMember> formalMember = new QueryWrapper<>();
- formalMember.ne("level", AgentLevelEnum.ZERO_LEVEL.name());
- List<MallMember> mallMembers = mallMemberMapper.selectList(formalMember);
- int cnt = 0;
- if(CollUtil.isNotEmpty(mallMembers)){
- BigDecimal income = new BigDecimal(scorePoolToDay.divide(new BigDecimal(mallMembers.size()), 2, RoundingMode.HALF_UP).intValue());
- if(income.compareTo(BigDecimal.ZERO) < 1){
+ List<MallMember> memberList = levelMemberMap.get(level);
+ if (CollUtil.isEmpty(memberList)) {
+ memberList = new ArrayList<>();
+ }
+
+ memberList.add(item);
+ levelMemberMap.put(level, memberList);
+ });
+
+ if (levelMemberMap.isEmpty()) {
+ return;
+ }
+
+ BigDecimal totalBonus = BigDecimal.ZERO;
+ for (Map.Entry<String, List<MallMember>> entry : levelMemberMap.entrySet()) {
+ BigDecimal levelBonus = levelBonusMap.get(entry.getKey());
+ List<MallMember> memberList = entry.getValue();
+
+ if (CollUtil.isEmpty(memberList) || levelBonus.compareTo(BigDecimal.ZERO) < 1) {
+ continue;
+ }
+
+ BigDecimal perBonus = levelBonus.divide(BigDecimal.valueOf(memberList.size()), 2, RoundingMode.HALF_UP);
+ memberList.forEach(item -> {
+ changeScoreAndCommission(item.getId(), perBonus, MoneyFlowTypeEnum.ALL_INTERNET_BONUS.getValue(), null);
+ });
+
+ totalBonus = totalBonus.add(levelBonus);
+ }
+
+ changeSystemBonus(totalBonus.negate(), null, null);
+
+ bonusRecord(totalBonus, 1, null, null);
+ log.info("###全网分红执行--end--###");
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void orderBonus(Long orderId) {
+ log.info("###订单分红消息开始执行###");
+ MallOrderInfo orderInfo = mallOrderInfoMapper.selectById(orderId);
+ if (orderInfo.getOrderType() == 2) {
+ log.info("积分订单无返利");
+ return;
+ }
+
+ List<MallOrderItem> items = mallOrderInfoMapper.getMallOrderItemByOrderId(orderId);
+
+ if (CollUtil.isEmpty(items)) {
+ return;
+ }
+
+
+ DataDictionaryCustom allInternetBonusDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.ALL_INTERNET_BONUS.getType(), DataDictionaryEnum.ALL_INTERNET_BONUS.getCode());
+ DataDictionaryCustom agentBonusDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_ALL_BONUS.getType(), DataDictionaryEnum.AGENT_ALL_BONUS.getCode());
+ DataDictionaryCustom partnerBonusDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.PARNER_ALL_BONUS.getType(), DataDictionaryEnum.PARNER_ALL_BONUS.getCode());
+
+ String id = RandomUtil.randomNumbers(16);
+
+ // 全网分红
+ BigDecimal totalBonus = BigDecimal.ZERO;
+
+ // 代理分红
+ BigDecimal agentTotalBonus = BigDecimal.ZERO;
+ // 股东分红
+ BigDecimal partnerTotalBonus = BigDecimal.ZERO;
+ BigDecimal hundred = new BigDecimal(100);
+ for (MallOrderItem item : items) {
+ // 减去成本后算收益
+ BigDecimal amount = item.getPrice().subtract(item.getCostPrice()).multiply(BigDecimal.valueOf(item.getCnt())).subtract(orderInfo.getScoreAmount());
+ if (amount.compareTo(BigDecimal.ZERO) < 1) {
+ continue;
+ }
+
+ if (item.getIsNormal() == 1) {
+ BigDecimal bonus = amount.multiply(BigDecimal.valueOf(item.getNormalBonus()).divide(hundred, 2, RoundingMode.HALF_UP));
+ log.info("{}-普通商品分红:{}, 明细ID:{}", id, bonus, item.getId());
+
+ bonusRecord(bonus, 1, item.getOrderId(), item.getId());
+ totalBonus = totalBonus.add(bonus);
+ } else {
+ BigDecimal bonus = amount.multiply(new BigDecimal(allInternetBonusDic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
+ bonusRecord(bonus, 1, item.getOrderId(), item.getId());
+ log.info("{}-套餐全网分红:{}, 明细ID:{}", id, bonus, item.getId());
+
+ totalBonus = totalBonus.add(bonus);
+
+ BigDecimal agentBonus = amount.multiply(new BigDecimal(agentBonusDic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
+ bonusRecord(agentBonus, 2, item.getOrderId(), item.getId());
+ log.info("{}-套餐代理分红:{}, 明细ID:{}", id, agentBonus, item.getId());
+
+ BigDecimal partnerBonus = amount.multiply(new BigDecimal(partnerBonusDic.getValue()).divide(hundred, 2, RoundingMode.HALF_UP));
+ bonusRecord(partnerBonus, 3, item.getOrderId(), item.getId());
+ log.info("{}-套餐股东分红:{}, 明细ID:{}", id, partnerBonus, item.getId());
+
+ agentTotalBonus = agentTotalBonus.add(agentBonus);
+ partnerTotalBonus = partnerTotalBonus.add(partnerBonus);
+ }
+ }
+
+ changeSystemBonus(totalBonus, agentTotalBonus, partnerTotalBonus);
+ log.info("###订单分红消息结束执行###");
+ }
+
+ private void changeSystemBonus(BigDecimal totalBonus, BigDecimal agentTotalBonus, BigDecimal partnerBonus) {
+ boolean flag = false;
+ int index = 0;
+ while (!flag) {
+ MallSystemSetting setting = mallSystemSettingMapper.selectById(1L);
+ if (setting == null) {
return;
}
- for(MallMember mallMember : mallMembers){
- /*
- 平分成佣金,一比一减少赠送积分
- 如果没有赠送积分,则平分0
- */
- BigDecimal outCome = BigDecimal.ZERO;
- MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMember.getId());
- if(mallMemberWallet.getScore().compareTo(BigDecimal.ZERO) < 1){
- continue;
- }
- if(mallMemberWallet.getScore().compareTo(income) < 0){
- outCome = new BigDecimal(mallMemberWallet.getScore().intValue());
- }else{
- outCome = income;
- }
- walletService.add(outCome, mallMember.getId(), "commission");
- walletService.reduce(outCome, mallMember.getId(), "score");
- moneyFlowService.addMoneyFlow(mallMember.getId(), outCome, MoneyFlowTypeEnum.SCORE_POOL.getValue(), null, FlowTypeEnum.COMMISSION.getValue());
- moneyFlowService.addMoneyFlow(mallMember.getId(), outCome.negate(), MoneyFlowTypeEnum.SCORE_POOL.getValue(), null, FlowTypeEnum.SCORE.getValue());
- cnt ++;
+
+ LambdaQueryWrapper<MallSystemSetting> update = new LambdaQueryWrapper<>();
+ update.eq(MallSystemSetting::getId, setting.getId())
+ .eq(MallSystemSetting::getRevision, setting.getRevision());
+
+ setting.setAllBonus(setting.getAllBonus().add(totalBonus == null ? BigDecimal.ZERO : totalBonus));
+ setting.setAgentBonus(setting.getAgentBonus().add(agentTotalBonus == null ? BigDecimal.ZERO : agentTotalBonus));
+ setting.setPartnerBonus(setting.getPartnerBonus().add(partnerBonus == null ? BigDecimal.ZERO : partnerBonus));
+ setting.setRevision(setting.getRevision() + 1);
+ int i = mallSystemSettingMapper.update(setting, update);
+ if (i > 0 || index > 2) {
+ flag = true;
}
- }
- log.info("#####==积分池==end==######;" +
- "今日新增积分:" + multiplyTotalAmount.setScale(2, RoundingMode.HALF_UP)
- +";平分积分数量:"+scorePoolToDay.setScale(2, RoundingMode.HALF_UP)
- +";人数:"+cnt);
- }
-
- @Override
- public void agentPerkJob(Date profitDate) {
- /**
- * 代理商补贴
- * 全体代理商
- * 前一天全部业绩的百分比用来平分
- */
- log.info("######==代理商补贴==start==####");
-
- List<MallMember> mallMembersAgentPerkList = mallMemberMapper.selectMemberByDirector(1);
- if (CollUtil.isEmpty(mallMembersAgentPerkList)) {
- return;
- }
- if (profitDate == null) {
- profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
- }
- //前一天的总业绩
- BigDecimal agentPerkAmountSum = mallAchieveRecordMapper.selectAchieveTotal("D", profitDate);
- //补贴百分比
- DataDictionaryCustom agentPerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
- DataDictionaryEnum.AGENT_PERK.getType(),
- DataDictionaryEnum.AGENT_PERK.getCode()
- );
- if(ObjectUtil.isEmpty(agentPerkDic)){
- return;
- }
- BigDecimal agentPerk = new BigDecimal(agentPerkDic.getValue()).multiply(new BigDecimal("0.01"));
- agentPerkAmountSum = agentPerkAmountSum.multiply(agentPerk);
-
- BigDecimal agentPerkAmount = agentPerkAmountSum.divide(new BigDecimal(mallMembersAgentPerkList.size()), BigDecimal.ROUND_DOWN).setScale(2, BigDecimal.ROUND_DOWN);
- List<Long> mallMembersAgentPerkIds = mallMembersAgentPerkList.stream().map(MallMember::getId).collect(Collectors.toList());
- List<MallMemberWallet> mallMemberWallets = mallMemberWalletMapper.selectMemberWalletsByIds(mallMembersAgentPerkIds);
- iAgentService.flowTotalScoreBalance(
- mallMemberWallets,
- agentPerkAmount,
- MoneyFlowTypeEnum.AGENT_PERK.getValue(),
- MallUtils.getOrderNum("AP"),
- 1L
- );
-
- log.info("#####==代理商补贴==end==######" +
- "今日总补贴###" + agentPerkAmountSum.setScale(2, RoundingMode.HALF_UP)
- +"###人均###"+agentPerkAmount.setScale(2, RoundingMode.HALF_UP)
- +"###人数###"+mallMemberWallets.size());
-
-
- }
-
- @Override
- public void offLinePerkJob(Date profitDate) {
- /**
- * 线下服务中心补贴
- * 全体线下服务商
- * 前一天团队业绩的百分比用来平分
- */
- log.info("######==线下服务中心补贴==start==####");
-
- List<MallMember> mallMembersOffLinePerkList = mallMemberMapper.selectMemberByStoreMaster(1);
- if (CollUtil.isEmpty(mallMembersOffLinePerkList)) {
- return;
- }
-
- //补贴百分比
- DataDictionaryCustom offLinePerkDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
- DataDictionaryEnum.OFFLINE_PERK.getType(),
- DataDictionaryEnum.OFFLINE_PERK.getCode()
- );
- if(ObjectUtil.isEmpty(offLinePerkDic)){
- return;
- }
- BigDecimal offLinePerk = new BigDecimal(offLinePerkDic.getValue()).multiply(new BigDecimal("0.01"));
-
- if (profitDate == null) {
- profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
- }
- for(MallMember mallMembersOffLinePerk : mallMembersOffLinePerkList){
- String inviteId = mallMembersOffLinePerk.getInviteId();
- //获取团队下所有成员
- List<MallMember> allMallMemberList = mallMemberMapper.selectAllChildAgentListByInviteId(inviteId);
- //子团队中是否有线下服务商
- List<MallMember> storeMasterMallMemberList = mallMemberMapper.selectAllChildAgentListByInviteIdAndStoreMaster(inviteId, 1);
- if(CollUtil.isNotEmpty(storeMasterMallMemberList)){
- //如果有,该子团队成员不算业绩
- List<MallMember> storeMasterMallMembers = new ArrayList<>();
- for(MallMember storeMasterMallMember : storeMasterMallMemberList){
- List<MallMember> storeMasterList = mallMemberMapper.selectAllChildAgentListByInviteId(storeMasterMallMember.getInviteId());
- storeMasterMallMembers.addAll(storeMasterList);
- }
- allMallMemberList.removeAll(storeMasterMallMembers);
- }
-
- //团队下所有人的业绩
- List<Long> mallMembersOffLinePerkIds = allMallMemberList.stream().map(MallMember::getId).collect(Collectors.toList());
-
- BigDecimal offLinePerkAmountSum = mallAchieveRecordMapper.selectSumAchieveByMemberIds(mallMembersOffLinePerkIds,profitDate);
- //该团队产生的业绩金额
- offLinePerkAmountSum = offLinePerkAmountSum.multiply(offLinePerk).setScale(2,BigDecimal.ROUND_DOWN);
-
- //所有合伙人补贴至消费礼包的三倍额度需要复购一次。
- MallMemberWallet mallMemberWallet = mallMemberWalletMapper.selectWalletByMemberId(mallMembersOffLinePerk.getId());
- BigDecimal totalScore = mallMemberWallet.getTotalScore();
- if(totalScore.compareTo(offLinePerkAmountSum) < 0){
- offLinePerkAmountSum = totalScore;
- }
- if(BigDecimal.ZERO.compareTo(offLinePerkAmountSum) < 0){
- //减少补贴额度
- mallMemberWalletMapper.reduceTotalScoreById(offLinePerkAmountSum, mallMemberWallet.getId());
-
- iAgentService.reduceStar(mallMemberWallet.getMemberId(),offLinePerkAmountSum);
-
- mallMemberWalletMapper.addBalanceById(offLinePerkAmountSum, mallMemberWallet.getId());
-
- mallMoneyFlowService.addMoneyFlow(
- mallMembersOffLinePerk.getId(),
- offLinePerkAmountSum,
- MoneyFlowTypeEnum.OFFLINE_PERK.getValue(),
- MallUtils.getOrderNum("OLP"),
- FlowTypeEnum.BALANCE.getValue());
- }
+ index++;
}
}
- @Override
- public void teamEqualsPerkJob(Date profitDate) {
- /**
- * 全体用户
- * 对象:产生了收益的用户的直属上级
- * 条件:等级和用户等级一样
- * 补贴:每日补贴的10%,例如用户当日的补贴总额为100,直属上级拿100*10%=10,
- * 限制:直推收益除外。
- */
- if (profitDate == null) {
- profitDate = DateUtil.offset(new Date(), DateField.DAY_OF_YEAR, -1);
- }
- //平级补贴百分比
- 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));
+ private final MallBonusRecordMapper mallBonusRecordMapper;
- //产生了收益的用户和直属上级
- List<AdminTeamEqualsPerkVo> adminTeamEqualsPerkVos = mallMoneyFlowMapper.selectTeamEqualsMemberByDate(profitDate);
- 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());
-
- 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"),
- "平级奖励补贴",
- "补贴额度:"+mallMemberWallet.getTotalScore(),
- adminTeamEqualsPerkVo.getMemberId(),
- 2,
- FlowTypeEnum.BALANCE.getValue(),
- 1);
- }
- }
- }
+ private void bonusRecord(BigDecimal amount, Integer type, Long orderId, Long orderItemId) {
+ MallBonusRecord record = new MallBonusRecord();
+ record.setAmount(amount);
+ record.setCreateTime(new Date());
+ record.setType(type);
+ record.setOrderId(orderId);
+ record.setOrderItemId(orderItemId);
+ mallBonusRecordMapper.insert(record);
}
-
-
- @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();
- 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.VOUCHER_AMOUNT.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