|
@@ -5,6 +5,8 @@ import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
|
import cn.newfeifan.mall.module.distri.controller.admin.integral.vo.IntegralSaveReqVO;
|
|
|
import cn.newfeifan.mall.module.distri.controller.admin.partitionbrothers.vo.PartitionBrothersSaveReqVO;
|
|
|
import cn.newfeifan.mall.module.distri.controller.admin.partitionson.vo.PartitionSonSaveReqVO;
|
|
|
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofit.vo.PtProfitSaveReqVO;
|
|
|
+import cn.newfeifan.mall.module.distri.controller.admin.ptprofitlog.vo.PtProfitLogSaveReqVO;
|
|
|
import cn.newfeifan.mall.module.distri.dal.dataobject.duser.DuserDO;
|
|
|
import cn.newfeifan.mall.module.distri.dal.dataobject.integral.IntegralDO;
|
|
|
import cn.newfeifan.mall.module.distri.dal.dataobject.ordercalc.OrderCalcDO;
|
|
@@ -18,14 +20,18 @@ import cn.newfeifan.mall.module.distri.service.partitionbrothers.PartitionBrothe
|
|
|
import cn.newfeifan.mall.module.distri.service.partitionson.PartitionSonService;
|
|
|
import cn.newfeifan.mall.module.distri.service.ptprofit.PtProfitService;
|
|
|
import cn.newfeifan.mall.module.distri.service.ptprofitlog.PtProfitLogService;
|
|
|
+import cn.newfeifan.mall.module.distri.tools.LoginMessageTool;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.context.annotation.Lazy;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
import cn.newfeifan.mall.module.distri.service.sharepath.SharePathService;
|
|
|
+
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
|
import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.LocalTime;
|
|
@@ -41,6 +47,7 @@ import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
|
|
|
import cn.newfeifan.mall.module.distri.dal.mysql.partitioncrash.PartitionCrashMapper;
|
|
|
|
|
|
import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
+import static cn.newfeifan.mall.module.distri.constant.DistriConstants.PT_ID;
|
|
|
import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
|
|
|
|
|
|
/**
|
|
@@ -50,6 +57,7 @@ import static cn.newfeifan.mall.module.distri.enums.ErrorCodeConstants.*;
|
|
|
*/
|
|
|
@Service
|
|
|
@Validated
|
|
|
+@Slf4j
|
|
|
public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
|
|
|
@Resource
|
|
@@ -133,14 +141,33 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
if (duserDOS.isEmpty()) {
|
|
|
return;
|
|
|
}
|
|
|
+ List<HashMap<Long, Integer>> afterCrashMap = new ArrayList<>();
|
|
|
// 获取当前合赢奖百分比
|
|
|
OrderPercentageDO orderPercentageDO = orderPercentageService.queryStatus();
|
|
|
- List<HashMap<Long, Integer>> afterCrashMap = duserDOS.stream().map(k -> CompletableFuture.supplyAsync(() -> {
|
|
|
|
|
|
+ // 获取用户的钱包信息
|
|
|
+ List<IntegralDO> integralDOS = integralService.selectAllUser();
|
|
|
+ Map<Long, IntegralDO> integralDOMap = integralDOS.stream().collect(Collectors.toMap(IntegralDO::getUserId, k -> k));
|
|
|
+
|
|
|
+ // 获取当前所有用户的父亲
|
|
|
+ Map<Long, Long> sonAndParent = new HashMap<>();
|
|
|
+ List<Long> userIds = duserDOS.stream().map(DuserDO::getUserId).collect(Collectors.toList());
|
|
|
+ userIds.stream().map(k -> CompletableFuture.supplyAsync(() -> {
|
|
|
+ Long parent = sharePathService.queryParentBySonUserId(k);
|
|
|
+ sonAndParent.put(k, parent);
|
|
|
+ return parent;
|
|
|
+ })).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());
|
|
|
+
|
|
|
+ List<PartitionSonSaveReqVO> partitionSonSaveReqVOS = new ArrayList<>();
|
|
|
+ List<PartitionBrothersSaveReqVO> partitionBrothersSaveReqVOS = new ArrayList<>();
|
|
|
+ List<PartitionCrashSaveReqVO> partitionCrashSaveReqVOS = new ArrayList<>();
|
|
|
+
|
|
|
+ duserDOS.forEach(k -> {
|
|
|
// 获取当前用户的钱包
|
|
|
- IntegralDO integralDO = integralService.selectByUser(k.getUserId());
|
|
|
+ IntegralDO integralDO = integralDOMap.get(k.getUserId());
|
|
|
// 获取当前父亲的钱包
|
|
|
- IntegralDO parentIntegralDo = integralService.selectUserParent(k.getUserId());
|
|
|
+ Long parent = sonAndParent.get(k.getUserId());
|
|
|
+ IntegralDO parentIntegralDo = integralDOMap.get(parent);
|
|
|
|
|
|
// 创建一个分区编号
|
|
|
String todayNo = crashTodayNo(k.getUserId());
|
|
@@ -150,11 +177,13 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
PartitionBrothersSaveReqVO.PartitionBrothersSaveReqVOBuilder brotherBuilder = PartitionBrothersSaveReqVO.builder();
|
|
|
PartitionCrashSaveReqVO.PartitionCrashSaveReqVOBuilder crashSaveReqVOBuilder = PartitionCrashSaveReqVO.builder();
|
|
|
sonBuilder.partNo(todayNo);
|
|
|
+ sonBuilder.userId(k.getUserId());
|
|
|
sonBuilder.name(k.getName());
|
|
|
sonBuilder.nickName(k.getNickName());
|
|
|
sonBuilder.hasHit(1);
|
|
|
|
|
|
brotherBuilder.partNo(todayNo);
|
|
|
+ brotherBuilder.userId(k.getUserId());
|
|
|
brotherBuilder.name(k.getName());
|
|
|
brotherBuilder.nickName(k.getNickName());
|
|
|
brotherBuilder.hasHit(1);
|
|
@@ -170,11 +199,10 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
// 插入空数据
|
|
|
sonBuilder = addSonEmpty(sonBuilder, k);
|
|
|
crashSaveReqVOBuilder.sonPrice(0);
|
|
|
- partitionSonService.createPartitionSon(sonBuilder.build());
|
|
|
}
|
|
|
// 合计儿子分支额度
|
|
|
Integer sonSumPrice = sonOrderCalcDOS.stream().mapToInt(OrderCalcDO::getGrossProfitBonusQuota).sum();
|
|
|
- crashSaveReqVOBuilder.sonPrice(sonSumPrice);
|
|
|
+ sonBuilder.price(sonSumPrice);
|
|
|
|
|
|
// 获取当前用户的兄弟分区
|
|
|
List<OrderCalcDO> brothersOrderCalcDOS = sharePathService.selectBrothers(k.getUserId(), userId);
|
|
@@ -182,21 +210,22 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
// 插入空数据
|
|
|
brotherBuilder = addBrotherEmpty(brotherBuilder, k);
|
|
|
crashSaveReqVOBuilder.brotherPrice(0);
|
|
|
- partitionBrothersService.createPartitionBrothers(brotherBuilder.build());
|
|
|
}
|
|
|
|
|
|
// 合并兄弟分支额度
|
|
|
Integer brotherSumPrice = brothersOrderCalcDOS.stream().mapToInt(OrderCalcDO::getGrossProfitBonusQuota).sum();
|
|
|
- crashSaveReqVOBuilder.brotherPrice(sonSumPrice);
|
|
|
+ brotherBuilder.price(brotherSumPrice);
|
|
|
|
|
|
|
|
|
// 判断,昨天是否有存余的分支
|
|
|
PartitionCrashDO yesterdayCrash = partitionCrashMapper.selectOne(new LambdaQueryWrapperX<PartitionCrashDO>().eqIfPresent(PartitionCrashDO::getPartNo, yesterdayNo));
|
|
|
// 如果不为空, 则判断增加到哪个分支中
|
|
|
- if (yesterdayCrash.getSonPrice() >= yesterdayCrash.getBrotherPrice()) {
|
|
|
- sonSumPrice = sonSumPrice + yesterdayCrash.getSonPrice();
|
|
|
- } else {
|
|
|
- brotherSumPrice = brotherSumPrice + yesterdayCrash.getBrotherPrice();
|
|
|
+ if (yesterdayCrash != null) {
|
|
|
+ if (yesterdayCrash.getSonPrice() >= yesterdayCrash.getBrotherPrice()) {
|
|
|
+ sonSumPrice = sonSumPrice + yesterdayCrash.getSonPrice();
|
|
|
+ } else {
|
|
|
+ brotherSumPrice = brotherSumPrice + yesterdayCrash.getBrotherPrice();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
int afterCrash = 0;
|
|
@@ -226,7 +255,7 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
Integer parentHighQuota = parentIntegralDo.getHighQuota();
|
|
|
|
|
|
BigDecimal smallBigDecimal = new BigDecimal(String.valueOf(smallQuota));
|
|
|
- BigDecimal multiply = smallBigDecimal.multiply(new BigDecimal(String.valueOf(orderPercentageDO.getDivideIntoPerc())));
|
|
|
+ BigDecimal multiply = smallBigDecimal.divide(new BigDecimal("2.0"), 4, RoundingMode.DOWN);
|
|
|
if (compare(highQuota, multiply)) {
|
|
|
Integer currentQuota = integralDO.getCurrentQuota();
|
|
|
integralDO.setCurrentQuota(currentQuota + multiply.intValue());
|
|
@@ -239,16 +268,42 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
parentIntegralDo.setCurrentQuota(currentQuota + multiply.intValue());
|
|
|
// 碰撞后的额度添加到日志中 增加日志模块
|
|
|
integralService.updateIntegral(BeanUtils.toBean(parentIntegralDo, IntegralSaveReqVO.class));
|
|
|
+ LoginMessageTool.messageSave(() -> PtProfitLogSaveReqVO.builder()
|
|
|
+ .amount(currentQuota)
|
|
|
+ .afterAmount(currentQuota + parentIntegralDo.getCurrentQuota())
|
|
|
+ .userId(parentIntegralDo.getUserId())
|
|
|
+ .percentTemplate(JsonUtils.toJsonString(orderPercentageDO))
|
|
|
+ .profitStatus(CaclEnum.SMALL_QUOTA_CRASH.getType())
|
|
|
+ .build());
|
|
|
ptProfitLogService.addMessage(parentIntegralDo.getUserId(), CaclEnum.SMALL_QUOTA_CRASH, currentQuota, parentIntegralDo.getCurrentQuota(), JsonUtils.toJsonString(orderPercentageDO));
|
|
|
}
|
|
|
|
|
|
// 获取计算后积分, Long为userId, Integer为碰撞后额度
|
|
|
HashMap<Long, Integer> map = new HashMap<>();
|
|
|
- map.put(k.getUserId(), multiply.intValue());
|
|
|
- map.put(parentIntegralDo.getUserId(), multiply.intValue());
|
|
|
- return map;
|
|
|
+ // 如果为当前用户为平台,则不需要存入这个地方
|
|
|
+ if (!k.getUserId().equals(PT_ID)){
|
|
|
+ map.put(k.getUserId(), multiply.intValue());
|
|
|
+ }
|
|
|
+ if (!parentIntegralDo.getUserId().equals(PT_ID)){
|
|
|
+ map.put(parentIntegralDo.getUserId(), multiply.intValue());
|
|
|
+ }
|
|
|
+ afterCrashMap.add(map);
|
|
|
+
|
|
|
+ log.info(k.getNickName() + "用户合赢奖已经计算: 该用户合赢奖为: \t" +
|
|
|
+ "兄弟分区为: " + brotherBuilder.build() + "\t" +
|
|
|
+ "后代分区为: " + sonBuilder.build() + "\t" +
|
|
|
+ "碰撞分区为: " + crashSaveReqVOBuilder.build() + "\t");
|
|
|
+
|
|
|
+ partitionSonSaveReqVOS.add(sonBuilder.build());
|
|
|
+ partitionBrothersSaveReqVOS.add(brotherBuilder.build());
|
|
|
+ partitionCrashSaveReqVOS.add(crashSaveReqVOBuilder.build());
|
|
|
|
|
|
- })).collect(Collectors.toList()).stream().map(CompletableFuture::join).collect(Collectors.toList());
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ partitionSonService.saveBatch(partitionSonSaveReqVOS);
|
|
|
+ partitionBrothersService.saveBatch(partitionBrothersSaveReqVOS);
|
|
|
+ saveBatch(partitionCrashSaveReqVOS);
|
|
|
|
|
|
// 计算平台积分
|
|
|
// 获取当前平台的额度
|
|
@@ -256,18 +311,27 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
// 遍历hashMap
|
|
|
for (HashMap<Long, Integer> longIntegerHashMap : afterCrashMap) {
|
|
|
for (Map.Entry<Long, Integer> entry : longIntegerHashMap.entrySet()) {
|
|
|
- if (ptProfit.getPtTotalAdd() <= 0) {
|
|
|
+ if (ptProfit.getPtGrossAdd() <= 0) {
|
|
|
break;
|
|
|
}
|
|
|
// 当前平台总积分
|
|
|
- Integer ptTotalAdd = ptProfit.getPtTotalAdd();
|
|
|
+// Integer ptTotalAdd = ptProfit.getPtTotalAdd();
|
|
|
+ // 扣除平台收益
|
|
|
+ log.info("扣除平台收益[合赢奖] " + "用户 " + entry.getKey() + "额度: " + entry.getValue());
|
|
|
+ ptProfit.setPtGrossAdd(ptProfit.getPtGrossAdd() - entry.getValue());
|
|
|
// 平台扣除积分
|
|
|
ptProfit.setPtTotalAdd(ptProfit.getPtTotalAdd() - entry.getValue());
|
|
|
// 碰撞后的额度添加到日志中 增加日志模块
|
|
|
ptProfitLogService.addMessage(entry.getKey(), CaclEnum.AFTER_CRASH_CALC_PT_TOTAL_QUOTA
|
|
|
- , ptTotalAdd, ptProfit.getPtTotalAdd() - entry.getValue(), JsonUtils.toJsonString(orderPercentageDO));
|
|
|
+ , -entry.getValue(), ptProfit.getPtTotalAdd() - entry.getValue(), JsonUtils.toJsonString(orderPercentageDO));
|
|
|
+ ptProfitLogService.addMessage(entry.getKey(), CaclEnum.AFTER_CRASH_CALC_PT_TOTAL_GROSS_QUOTA
|
|
|
+ , -entry.getValue(), ptProfit.getPtTotalAdd() - entry.getValue(), JsonUtils.toJsonString(orderPercentageDO));
|
|
|
}
|
|
|
}
|
|
|
+ ptProfitService.updatePtProfit(PtProfitSaveReqVO.builder().id(ptProfit.getId())
|
|
|
+ .ptAdd(ptProfit.getPtAdd())
|
|
|
+ .ptGrossAdd(ptProfit.getPtGrossAdd())
|
|
|
+ .ptTotalAdd(ptProfit.getPtTotalAdd()).build());
|
|
|
}
|
|
|
|
|
|
public Boolean compare(Integer highQuota, BigDecimal afterCrash) {
|
|
@@ -276,6 +340,11 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
return i >= 0;
|
|
|
}
|
|
|
|
|
|
+ public void saveBatch(List<PartitionCrashSaveReqVO> partitionCrashSaveReqVOS) {
|
|
|
+
|
|
|
+ List<PartitionCrashDO> ptProfit = BeanUtils.toBean(partitionCrashSaveReqVOS, PartitionCrashDO.class);
|
|
|
+ partitionCrashMapper.insertBatch(ptProfit);
|
|
|
+ }
|
|
|
|
|
|
private PartitionBrothersSaveReqVO.PartitionBrothersSaveReqVOBuilder addBrotherEmpty(PartitionBrothersSaveReqVO.PartitionBrothersSaveReqVOBuilder brotherBuilder, DuserDO duserDO) {
|
|
|
|
|
@@ -303,7 +372,7 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
public String crashTodayNo(Long userId) {
|
|
|
LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); // 今天的开始时间,即午夜12点
|
|
|
String todayStartString = todayStart.toString();
|
|
|
- return "CRASH:" + userId + todayStartString;
|
|
|
+ return "CRASH:" + userId + ":" + todayStartString;
|
|
|
|
|
|
}
|
|
|
|
|
@@ -312,7 +381,7 @@ public class PartitionCrashServiceImpl implements PartitionCrashService {
|
|
|
LocalDateTime todayStart = LocalDateTime.of(LocalDate.now(), LocalTime.MIDNIGHT); // 今天的开始时间,即午夜12点
|
|
|
LocalDateTime localDateTime = todayStart.minusDays(1);
|
|
|
String yesterdayString = localDateTime.toString();
|
|
|
- return "CRASH:" + userId + yesterdayString;
|
|
|
+ return "CRASH:" + userId + ":" + yesterdayString;
|
|
|
|
|
|
}
|
|
|
|