From d920824c3a0c237cb6e59bb088b3ed444bacedfd Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Fri, 17 Mar 2023 14:55:06 +0800
Subject: [PATCH] 后台修改
---
src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 223 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 209 insertions(+), 14 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 525a3fc..7411b14 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
@@ -5,19 +5,21 @@
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
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.IApiMallMemberWalletService;
-import cc.mrbird.febs.mall.service.IMallAchieveService;
-import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
-import cc.mrbird.febs.mall.service.IMemberProfitService;
+import cc.mrbird.febs.mall.service.*;
+import cc.mrbird.febs.mall.vo.AdminTeamEqualsPerkVo;
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.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;
@@ -30,6 +32,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
+import java.util.stream.Collectors;
/**
* @author wzy
@@ -51,6 +54,8 @@
private final MallAchieveRecordMapper mallAchieveRecordMapper;
private final RedisUtils redisUtils;
private final MallMemberWalletMapper mallMemberWalletMapper;
+ private final IAgentService iAgentService;
+ private final IMallMoneyFlowService mallMoneyFlowService;
@Override
@Transactional(rollbackFor = Exception.class)
@@ -143,7 +148,8 @@
@Override
public void dynamicProfit(Long orderId) {
- dynamicProfit(orderId, 2);
+ return;
+// dynamicProfit(orderId, 2);
}
/**
@@ -186,9 +192,9 @@
}
// 判断套餐或者普通商品,结算对应商品的动态分红
- if (!Objects.equals(item.getIsNormal(), isNormal)) {
- continue;
- }
+// if (!Objects.equals(item.getIsNormal(), isNormal)) {
+// continue;
+// }
// =======直推返利== start =====
// 直接奖励收益
@@ -281,7 +287,7 @@
DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.AGENT_BONUS.getType(), DataDictionaryEnum.AGENT_BONUS.getCode());
BigDecimal profit = totalIncome.multiply(new BigDecimal(dic.getValue()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP));
- List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.FIRST_LEVEL.name());
+ List<MallMember> agentMembers = mallMemberMapper.selectByIdAndNoLevel(null, AgentLevelEnum.SECOND_LEVEL.name());
if (CollUtil.isEmpty(agentMembers)) {
return;
}
@@ -497,17 +503,30 @@
@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)){
+ 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(new BigDecimal(0.1));
-
- String redisKey = "scorePool";
+ BigDecimal multiplyTotalAmount = totalAmount.multiply(everydayRatio);
String scorePoolRedis = redisUtils.getString(redisKey);
if(StrUtil.isBlank(scorePoolRedis)){
redisUtils.set(redisKey,0,0L);
@@ -517,13 +536,14 @@
BigDecimal scorePoolNew = scorePoolOld.add(multiplyTotalAmount);
//每天释放1%给全体用户
- BigDecimal scorePoolToDay = scorePoolNew.multiply(new BigDecimal(0.01));
+ BigDecimal scorePoolToDay = scorePoolNew.multiply(dividEquallyRatio);
redisUtils.set(redisKey,scorePoolNew.subtract(scorePoolToDay).intValue(),0L);
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){
@@ -536,6 +556,9 @@
*/
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{
@@ -545,9 +568,181 @@
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 ++;
}
}
- log.info("#####==积分池==end==######");
+ 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());
+
+ mallMemberWalletMapper.addBalanceById(offLinePerkAmountSum, mallMemberWallet.getId());
+
+ mallMoneyFlowService.addMoneyFlow(
+ mallMembersOffLinePerk.getId(),
+ offLinePerkAmountSum,
+ MoneyFlowTypeEnum.OFFLINE_PERK.getValue(),
+ MallUtils.getOrderNum("OLP"),
+ FlowTypeEnum.BALANCE.getValue());
+ }
+ }
+ }
+
+ @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));
+
+ //产生了收益的用户和直属上级
+ 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());
+
+ mallMemberWalletMapper.addBalanceById(teamEqualsPerkAmount, mallMemberWallet.getId());
+
+ mallMoneyFlowService.addMoneyFlow(
+ adminTeamEqualsPerkVo.getRtMemberId(),
+ teamEqualsPerkAmount,
+ MoneyFlowTypeEnum.TEAM_EQUALS_PERK.getValue(),
+ MallUtils.getOrderNum("TEP"),
+ FlowTypeEnum.BALANCE.getValue());
+ }
+ }
+ }
}
}
--
Gitblit v1.9.1