xiaoyong931011
2022-09-24 48bb23486bc018d13014d8acde4fb51ec3a78a36
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
package cc.mrbird.febs.mall.quartz;
 
import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
import cc.mrbird.febs.common.utils.MallUtils;
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 cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
/**
 * @author wzy
 * @date 2022-06-15
 **/
@Slf4j
@Component
@ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true")
public class OrderSettlementJob {
 
    @Autowired
    private MallOrderInfoMapper mallOrderInfoMapper;
 
    @Autowired
    private MallOrderItemMapper mallOrderItemMapper;
 
    @Autowired
    private IApiMallMemberWalletService memberWalletService;
 
    @Autowired
    private IMallMoneyFlowService mallMoneyFlowService;
 
    @Autowired
    private MallMemberMapper mallMemberMapper;
 
    @Autowired
    private MallGoodsSkuMapper mallGoodsSkuMapper;
 
    @Autowired
    private MallLeaderAchieveMapper mallLeaderAchieveMapper;
 
    @Autowired
    private MallTeamLeaderMapper mallTeamLeaderMapper;
 
    @Autowired
    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
 
    @Autowired
    private IMemberProfitService memberProfitService;
 
    @Autowired
    private IMallAchieveService mallAchieveService;
 
    /**
     * 普通商品结算
     */
    @Scheduled(cron = "0 0 0 * * ?")
    public void normalGoodsSettlementJob() {
        log.info("普通商品结算");
        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderInfoWithNormalGoods(DateUtil.offsetDay(new Date(), -10));
        if (CollUtil.isEmpty(orderInfos)) {
            return;
        }
 
        for (MallOrderInfo orderInfo : orderInfos) {
            MallMember member = mallMemberMapper.selectById(orderInfo.getMemberId());
            if (AgentLevelEnum.ZERO_LEVEL.name().equals(member.getLevel())) {
                continue;
            }
 
            for (MallOrderItem item : orderInfo.getItems()) {
                MallGoodsSku sku = mallGoodsSkuMapper.selectById(item.getSkuId());
                BigDecimal score = sku.getPresentPrice();
 
                memberWalletService.add(score, member.getId(), "score");
                mallMoneyFlowService.addMoneyFlow(member.getId(), score, MoneyFlowTypeEnum.STATIC_BONUS.getValue(), orderInfo.getOrderNo(), FlowTypeEnum.SCORE.getValue());
 
                mallAchieveService.add(item.getId());
            }
 
            // 普通商品动态分红结算
            memberProfitService.dynamicProfit(orderInfo.getId(), 1);
        }
    }
 
    /**
     * 自动确认收货
     */
//    @Scheduled(cron = "0 0 0 * * ?")
 
    @Scheduled(cron = "1 * * * * ?")
    public void orderAutoConfirmJob() {
        log.info("自动确认收货");
        DataDictionaryCustom dic = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.OEDER_AUTO_CONFIRM.getType(), DataDictionaryEnum.OEDER_AUTO_CONFIRM.getCode());
        Integer value = Integer.parseInt(dic.getValue());
        List<MallOrderInfo> orderInfos = mallOrderInfoMapper.selectOrderByStatusAndPayTime(3,DateUtil.offsetDay(new Date(), -value));
        if(CollUtil.isNotEmpty(orderInfos)){
            for(MallOrderInfo orderInfo : orderInfos){
                MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(orderInfo.getTakeUniqueCode());
                Integer profitSwitch = mallTeamLeader.getProfitSwitch()==null?2:mallTeamLeader.getProfitSwitch();
                if(1 == profitSwitch){
                    BigDecimal bonusPercent =new BigDecimal(mallTeamLeader.getBonusPercent()==null?"0":mallTeamLeader.getBonusPercent());
//                DataDictionaryCustom dicBonusPercent = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(DataDictionaryEnum.BONUS_PERCENT.getType(), DataDictionaryEnum.BONUS_PERCENT.getCode());
//                BigDecimal bonusPercent = new BigDecimal(dicBonusPercent.getValue()).setScale(2,BigDecimal.ROUND_DOWN);
                    //生成一条团长提成记录
                    Long id = orderInfo.getId();
                    List<MallOrderItem> mallOrderItemList = mallOrderItemMapper.selectListByOrderId(id);
                    if(CollUtil.isNotEmpty(mallOrderItemList)){
                        for(MallOrderItem mallOrderItem : mallOrderItemList){
                            Integer state = mallOrderItem.getState() == null ? 1 : mallOrderItem.getState();
                            if(1 == state){
                                MallLeaderAchieve mallLeaderAchieve = new MallLeaderAchieve();
                                mallLeaderAchieve.setMemberId(orderInfo.getMemberId());
                                mallLeaderAchieve.setOrderNo(orderInfo.getOrderNo());
                                mallLeaderAchieve.setOrderItemId(mallOrderItem.getId());
                                BigDecimal itemAmount = mallOrderItem.getAmount();
                                mallLeaderAchieve.setAmount(itemAmount);
                                BigDecimal bigDecimal = bonusPercent.multiply(itemAmount).setScale(2, BigDecimal.ROUND_DOWN);
                                mallLeaderAchieve.setProfitAmount(bigDecimal);
                                mallLeaderAchieve.setUniqueCode(orderInfo.getTakeUniqueCode());
                                mallLeaderAchieve.setState(MallLeaderAchieve.STATE_ONE);
                                mallLeaderAchieveMapper.insert(mallLeaderAchieve);
                            }
                        }
                    }
                }
            }
            mallOrderInfoMapper.updateOrderConfirmStatus(DateUtil.date(),DateUtil.offsetDay(new Date(), -value));
        }
    }
    /**
     * 团长第二天才会结算前一天的所有提成
     * 从团长业绩表中查询出前一天的所有已完成订单金额*提成系数,得到今日提成
     * 修改业绩的状态
     * 并生成一条提成流水
     */
    @Scheduled(cron = "0 0 1 * * ?")
//    @Scheduled(cron = "1 * * * * ?")
    public void leaderAchieveAuto() {
        log.info("团长每日提成");
        //获取每日提成总数
        /**
         * a.unique_code uniqueCode 团长特征码
         * , IFNULL(sum(a.amount),0) amount 每日提成总金额
         */
            DateTime dateTime = DateUtil.offsetDay(new Date(), -1);
//        DateTime dateTime = DateUtil.offsetDay(new Date(), 0);
        List<Map<String, String>> allLeaderAchieve = mallLeaderAchieveMapper.selectListByStateAndCreateTimeAndUniqueCode(MallLeaderAchieve.STATE_ONE,dateTime);
        if (CollUtil.isNotEmpty(allLeaderAchieve)) {
            for (Map<String, String> map : allLeaderAchieve) {
                String uniqueCode = map.get("uniqueCode");
                Object profitAmount = map.get("profitAmount");
 
                MallTeamLeader mallTeamLeader = mallTeamLeaderMapper.selectLeaderByUniqueCode(uniqueCode);
                Integer profitSwitch = mallTeamLeader.getProfitSwitch();
                if(1 == profitSwitch){
                    //直接舍弃小数点的第三位
                    BigDecimal achieveMoney = new BigDecimal(String.valueOf(profitAmount)).setScale(2,BigDecimal.ROUND_DOWN);
                    MallMember mallMember = mallMemberMapper.selectInfoByInviteId(uniqueCode);
                    memberWalletService.addBalance(achieveMoney,mallMember.getId());
                    String achieveNo = "TC."+ MallUtils.getOrderNum();
                    mallMoneyFlowService.addMoneyFlow(
                            mallMember.getId(),
                            achieveMoney,
                            MoneyFlowTypeEnum.LEADERACHIEVE.getValue(),
                            achieveNo,
                            FlowTypeEnum.BALANCE.getValue());
 
                    //更新到已提成状态
                    mallLeaderAchieveMapper.updateByUniqueCodeStateAndTime(DateUtil.date(),uniqueCode,MallLeaderAchieve.STATE_ONE,dateTime);
                }
            }
        }
    }
 
//    public static void main(String[] args) {
//        BigDecimal bigDecimal = new BigDecimal(0.1256).setScale(2,BigDecimal.ROUND_DOWN);
//        System.out.println(bigDecimal);
//    }
}