From 1fc5510367dcf321ac85e50e31c9dcdaaf5cd09e Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Wed, 21 Dec 2022 11:56:27 +0800
Subject: [PATCH] 20221221

---
 src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java |  209 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 207 insertions(+), 2 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
index c9ca6a6..cb00b93 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/OrderOvertimeJob.java
@@ -1,16 +1,25 @@
 package cc.mrbird.febs.mall.quartz;
 
-import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
-import cc.mrbird.febs.mall.entity.MallOrderInfo;
+import cc.mrbird.febs.common.enumerates.*;
+import cc.mrbird.febs.mall.entity.*;
+import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
+import cc.mrbird.febs.mall.mapper.MallMemberMapper;
+import cc.mrbird.febs.mall.mapper.MallMemberStarBuyMapper;
 import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
+import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
+import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUnit;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -24,6 +33,21 @@
 
     @Autowired
     private MallOrderInfoMapper orderInfoMapper;
+
+    @Autowired
+    private MallMemberMapper mallMemberMapper;
+
+    @Autowired
+    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
+
+    @Autowired
+    private MallMemberStarBuyMapper mallMemberStarBuyMapper;
+
+    @Autowired
+    private IApiMallMemberWalletService memberWalletService;
+
+    @Autowired
+    private IMallMoneyFlowService mallMoneyFlowService;
 
     @Scheduled(cron = "0 0/5 * * * ? ")
     public void overtimeJob() {
@@ -42,4 +66,185 @@
         }
 
     }
+
+    @Scheduled(cron = "0 0 2 * * ? ")
+    public void returnBuyStarAmount(){
+        log.info("会员星级保证金返还任务执行");
+        /**
+         * 1、生效中的记录
+         * 2、判断剩余返还金额
+         * 3、生成流水记录
+         * 4、增加用户金额
+         */
+        //生效中记录
+        List<MallMemberStarBuy> mallMemberStarBuys = mallMemberStarBuyMapper.selectByStatus(1);
+        if(CollUtil.isEmpty(mallMemberStarBuys)){
+            return;
+        }
+        for(MallMemberStarBuy mallMemberStarBuy : mallMemberStarBuys){
+            Long memberId = mallMemberStarBuy.getMemberId();
+            MallMember mallMember = mallMemberMapper.selectById(memberId);
+            //用户不存在跳出本次循环
+            if(ObjectUtil.isEmpty(mallMember)){
+                continue;
+            }
+            //返还总金额
+            BigDecimal amount = mallMemberStarBuy.getAmount();
+            //剩余返还总金额不足,跳出本次循环
+            BigDecimal avaAmount = mallMemberStarBuy.getAvaAmount();
+            if(avaAmount.compareTo(BigDecimal.ZERO) <= 0){
+                continue;
+            }
+            //每次返还比例
+            DataDictionaryCustom returnPercentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                    DataDictionaryEnum.RETURN_PERCENT.getType(),
+                    DataDictionaryEnum.RETURN_PERCENT.getCode()
+            );
+            String returnPercentStr = returnPercentDic.getValue();
+            BigDecimal returnPercent = new BigDecimal(returnPercentStr).multiply(new BigDecimal(0.01));
+            //本次返还金额
+            BigDecimal returnAmount = amount.multiply(returnPercent);
+            /**
+             * 如果本次返还金额大于剩余返还总金额
+             */
+            if(returnAmount.compareTo(avaAmount) >= 0){
+                returnAmount = avaAmount;
+                avaAmount = BigDecimal.ZERO;
+            }else{
+                avaAmount = avaAmount.subtract(returnAmount).setScale(2,BigDecimal.ROUND_DOWN);
+            }
+            //增加用户金额
+            memberWalletService.addBalance(returnAmount,mallMember.getId());
+            //生成流水记录
+            Long subsidyAmountFlowId = mallMoneyFlowService.addMoneyFlow(
+                    mallMember.getId(),
+                    mallMemberStarBuy.getBuyCode(),
+                    returnAmount,
+                    MallMoneyFlowTypeEnum.RETURN_MARKET_STAR.getCode(),
+                    MallMoneyFlow.STATUS_SUCCESS,
+                    MallMoneyFlow.IS_RETURN_Y,
+                    mallMember.getId(),
+                    FlowTypeEnum.BALANCE.getValue(),
+                    MallMoneyFlowTypeEnum.RETURN_MARKET_STAR.getName()
+            );
+            //更新记录
+            mallMemberStarBuyMapper.updateAvaAmountById(avaAmount,mallMemberStarBuy.getId());
+        }
+    }
+
+    @Scheduled(cron = "0 30 2 * * ? ")
+    public void updateMemberAccountLevelAndBuyStarRecord(){
+        log.info("会员星级更新任务执行");
+        //生效中的记录
+        List<MallMemberStarBuy> mallMemberStarBuys = mallMemberStarBuyMapper.selectByStatus(1);
+        if(CollUtil.isEmpty(mallMemberStarBuys)){
+            return;
+        }
+        for(MallMemberStarBuy mallMemberStarBuy : mallMemberStarBuys){
+            Long memberId = mallMemberStarBuy.getMemberId();
+            MallMember mallMember = mallMemberMapper.selectById(memberId);
+            //用户不存在跳出本次循环
+            if(ObjectUtil.isEmpty(mallMember)){
+                continue;
+            }
+            BigDecimal avaAmount = mallMemberStarBuy.getAvaAmount();
+            /**
+             * 剩余返还总金额等于零,更新为已结束
+             * 判断用户是否还有其他的购买星级的生效记录
+             */
+            if(BigDecimal.ZERO.compareTo(avaAmount) >= 0){
+                mallMemberStarBuyMapper.updateStatusById(2,mallMemberStarBuy.getId());
+                List<MallMemberStarBuy> mallMemberStarBuysIng = mallMemberStarBuyMapper.selectByStatusAndMemberId(1,memberId);
+                //如果没有其他生效中的记录,则更新用户的星级
+                if(CollUtil.isEmpty(mallMemberStarBuysIng)){
+                    mallMemberMapper.updateAccountLevelById(MemberAccountLevelEnum.NORMAL.getName(), memberId);
+                }
+            }
+        }
+    }
+
+    @Scheduled(cron = "0 0 1 * * ? ")
+    public void updateMemberAgentLevel() {
+        log.info("会员代理等级升级任务执行");
+        /**
+         * 获取会员信息
+         *  1、已经升级成为一星
+         */
+        /**
+         * 区代
+         *  1、自身一星
+         *  2、直推三个星级
+         *  3、团队五个星级
+         */
+        updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_ONE.getType(),DataDictionaryEnum.AGENT_ONE.getCode());
+        /**
+         * 县代
+         *  1、自身2星
+         *  2、直推5个星级
+         *  3、团队50个星级
+         */
+        updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_TWO.getType(),DataDictionaryEnum.AGENT_TWO.getCode());
+        updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_THREE.getType(),DataDictionaryEnum.AGENT_THREE.getCode());
+        updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_FOUR.getType(),DataDictionaryEnum.AGENT_FOUR.getCode());
+        updateMemberAgentLevelByName(DataDictionaryEnum.AGENT_FIVE.getType(),DataDictionaryEnum.AGENT_FIVE.getCode());
+    }
+
+    private void updateMemberAgentLevelByName(String name,String code){
+        DataDictionaryCustom agentDic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                name,
+                code
+        );
+        JSONObject jsonObject = JSONUtil.parseObj(agentDic.getValue());
+        //自身星级
+        String levelSelf = jsonObject.get("levelSelf").toString();
+        //直推星级数量
+        String directLevelCnt = jsonObject.get("directLevelCnt").toString();
+        //团队星级数量
+        String teamLevelCnt = jsonObject.get("teamLevelCnt").toString();
+        //两个市场均有上一个代理等级
+        String minTeamLevelCnt = jsonObject.get("minTeamLevelCnt").toString();
+        List<MallMember> agentLevelList = mallMemberMapper.selectByAccountLevel(levelSelf);
+        if(CollUtil.isNotEmpty(agentLevelList)){
+            for(MallMember mallMember : agentLevelList){
+                //如果代理等级为手动设置,则跳过该会员
+                int levelStatus = ObjectUtil.isEmpty(mallMember.getLevelStatus()) ? 0 : 1;
+                if(1 == levelStatus){
+                    continue;
+                }
+                //有星级的直推
+                Integer directCnt = mallMemberMapper.selectByRefererIdAndAccountLevel(mallMember.getInviteId(),MemberAccountLevelEnum.NORMAL.getName());
+                //团队中星级会员数量
+                Integer teamCnt = mallMemberMapper.selectByReferersIdAndAccountLevel(mallMember.getInviteId(),MemberAccountLevelEnum.NORMAL.getName());
+                //两个市场均有上一个代理等级
+                Integer minCnt = 0;
+                if(0 < Integer.parseInt(minTeamLevelCnt)){
+                    String minLevel = MemberAgentLevelEnum.AGENT_ONE.minLevel(code);
+                    //获取所有直推用户
+                    List<MallMember> mallMembers = mallMemberMapper.selectByRefererId(mallMember.getInviteId());
+                    if(CollUtil.isNotEmpty(mallMembers) && mallMembers.size() > 2){
+                        Integer levelCnt = 0;
+                        for(MallMember directMember : mallMembers){
+                            Integer minlevelCnt = mallMemberMapper.selectByReferersIdAndLevel(directMember.getInviteId(),minLevel);
+                            if(0 < minlevelCnt){
+                                levelCnt = levelCnt + 1;
+                            }
+                            if(levelCnt >= Integer.parseInt(minTeamLevelCnt)){
+                                minCnt = 1;
+                                break;
+                            }
+                        }
+                    }
+                }else{
+                    //区代不需要判断这个市场条件
+                    minCnt = 1;
+                }
+                if(Integer.parseInt(directLevelCnt) <= directCnt
+                        && Integer.parseInt(teamLevelCnt) <= teamCnt
+                        && minCnt > 0){
+                    //更新会员代理等级
+                    mallMemberMapper.updateLevelById(MemberAgentLevelEnum.AGENT_ONE.getNameByCode(code),mallMember.getId());
+                }
+            }
+        }
+    }
 }

--
Gitblit v1.9.1