From 8b8dabe9413ff53593eec4484e013240c1b9a530 Mon Sep 17 00:00:00 2001 From: xiaoyong931011 <15274802129@163.com> Date: Wed, 03 Aug 2022 15:48:07 +0800 Subject: [PATCH] 20220803 积分池 --- src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java | 2 + src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java | 7 +++ src/test/java/cc/mrbird/febs/ProfitTest.java | 5 ++ src/main/java/cc/mrbird/febs/mall/service/impl/MemberProfitServiceImpl.java | 47 +++++++++++++++++++++++ src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java | 8 ++++ src/main/resources/mapper/modules/MallOrderInfoMapper.xml | 5 ++ src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java | 2 + 7 files changed, 75 insertions(+), 1 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java index 7af4142..9268dd7 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java @@ -88,7 +88,12 @@ /** * 抽奖 */ - PRIZE(17); + PRIZE(17), + + /** + * 抽奖 + */ + SCORE_POOL(18); private final int value; diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java index f511408..ee0901c 100644 --- a/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java +++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallOrderInfoMapper.java @@ -61,4 +61,6 @@ List<MallOrderInfo> selectOrderInfoWithNormalGoods(@Param("date") Date date); BigDecimal selectSumAmountByPayMethodAndStatue(@Param("payMethod")String name, @Param("statue")int value); + + BigDecimal selectTotalAmountByPayDoneAndDataString(@Param("payResult")int i, @Param("date") Date date); } diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java index be03796..33ffb60 100644 --- a/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java +++ b/src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java @@ -74,4 +74,12 @@ public void rankJob() { memberProfitService.rankProfit(); } + + /** + * 积分池,所有消费拿出10%放到积分池,然后按1%每天释放加权平分 + */ + @Scheduled(cron = "0 0 2 * * ?") + public void scorePool() { + memberProfitService.scorePool(); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java index 2d7a643..abb14d5 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IMemberProfitService.java @@ -39,4 +39,6 @@ * 店补/董事 */ void storeAndDirectorProfit(Date profitDate); + + void scorePool(); } 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 89dab43..c1ad6f2 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,6 +5,7 @@ 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.RedisUtils; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; @@ -13,10 +14,12 @@ import cc.mrbird.febs.mall.service.IMemberProfitService; 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.StrUtil; 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 lombok.RequiredArgsConstructor; @@ -477,4 +480,48 @@ } log.info("#####==店补/董事==end==######"); } + + private final RedisUtils redisUtils; + + @Override + public void scorePool() { + log.info("#####==积分池==start==######"); + /** + * 后一天2点,结算前一天的所有消费 + * 积分池增加每日消费的10% + * 每天释放1%,给全体用户 + */ + //前一天的所有消费的10% + Date date = DateUtil.offsetDay(new Date(), -1); + BigDecimal totalAmount = mallOrderInfoMapper.selectTotalAmountByPayDoneAndDataString(1, date); + BigDecimal multiplyTotalAmount = totalAmount.multiply(new BigDecimal(0.1)); + + String redisKey = "scorePool"; + String scorePoolRedis = redisUtils.getString(redisKey); + if(StrUtil.isBlank(scorePoolRedis)){ + redisUtils.set(redisKey,0,0L); + } + + BigDecimal scorePoolOld = new BigDecimal(redisUtils.getString(redisKey)); + BigDecimal scorePoolNew = scorePoolOld.add(multiplyTotalAmount); + + //每天释放1%给全体用户 + BigDecimal scorePoolToDay = scorePoolNew.multiply(new BigDecimal(0.01)); + + redisUtils.set(redisKey,scorePoolNew.subtract(scorePoolToDay).intValue(),0L); + + List<MallMember> mallMembers = mallMemberMapper.selectList(new QueryWrapper<>()); + 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){ + return; + } + for(MallMember mallMember : mallMembers){ + walletService.add(income, mallMember.getId(), "score"); + moneyFlowService.addMoneyFlow(mallMember.getId(), income, MoneyFlowTypeEnum.SCORE_POOL.getValue(), null, FlowTypeEnum.SCORE.getValue()); + } + } + log.info("#####==积分池==end==######"); + } + } diff --git a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml index 660351c..3227883 100644 --- a/src/main/resources/mapper/modules/MallOrderInfoMapper.xml +++ b/src/main/resources/mapper/modules/MallOrderInfoMapper.xml @@ -283,4 +283,9 @@ select IFNULL(sum(IFNULL(amount,0)),0) from mall_order_info where pay_method = #{payMethod} and status = #{statue} </select> + + <select id="selectTotalAmountByPayDoneAndDataString" resultType="java.math.BigDecimal"> + select IFNULL(sum(IFNULL(amount,0)),0) from mall_order_info + where pay_result = #{payResult} and date_format(pay_time, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d') + </select> </mapper> \ No newline at end of file diff --git a/src/test/java/cc/mrbird/febs/ProfitTest.java b/src/test/java/cc/mrbird/febs/ProfitTest.java index 435c997..155bb83 100644 --- a/src/test/java/cc/mrbird/febs/ProfitTest.java +++ b/src/test/java/cc/mrbird/febs/ProfitTest.java @@ -92,4 +92,9 @@ public void changeAmount(Map<String, Integer> amount) { amount.put("amount", 2); } + + @Test + public void scorePool(){ + memberProfitService.scorePool(); + } } -- Gitblit v1.9.1