xiaoyong931011
2022-12-23 0e7f25ad6e903c569fa7364e729ddfca6547a279
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
package cc.mrbird.febs.mall.quartz;
 
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;
 
/**
 * @author wzy
 * @date 2021-09-25
 **/
@Slf4j
@Component
public class OrderOvertimeJob {
 
    @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() {
        log.info("订单超时任务执行");
        List<MallOrderInfo> orderList = orderInfoMapper.selectOrderInfoByStatus(OrderStatusEnum.WAIT_PAY.getValue());
        if (CollUtil.isNotEmpty(orderList)) {
            for (MallOrderInfo orderInfo : orderList) {
                long subTime = DateUtil.between(orderInfo.getOrderTime(), new Date(), DateUnit.MINUTE, false);
 
                if (subTime > 15) {
                    orderInfo.setStatus(OrderStatusEnum.CANCEL.getValue());
                    orderInfo.setCancelType(MallOrderInfo.CANCEL_OVERTIME_NO_PAY);
                    orderInfoMapper.updateById(orderInfo);
                }
            }
        }
 
    }
 
    @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)).setScale(2,BigDecimal.ROUND_DOWN);
            //本次返还金额
            BigDecimal returnAmount = amount.multiply(returnPercent).setScale(2,BigDecimal.ROUND_DOWN);
            /**
             * 如果本次返还金额大于剩余返还总金额
             */
            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);
 
                    //如果代理等级为手动设置,则跳过该会员
                    int levelStatus = ObjectUtil.isEmpty(mallMember.getLevelStatus()) ? 0 : 1;
                    if(1 == levelStatus){
                        continue;
                    }
                    mallMemberMapper.updateLevelById(MemberAgentLevelEnum.AGENT.getName(),mallMember.getId());
                }
            }
        }
    }
 
    @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());
                }
            }
        }
    }
}