mitao
2024-04-30 ab4ea7b8f10c9b66aed9c2ea161a08b25c3851a7
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
package com.sinata.rest.modular.mall.job;
 
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sinata.common.enums.EnumIsDelete;
import com.sinata.common.enums.EnumMemberGrade;
import com.sinata.common.enums.EnumSystemSetKey;
import com.sinata.common.enums.mall.EnumMallOrderState;
import com.sinata.common.user.VoUserGradeParent;
import com.sinata.rest.modular.mall.service.IMallOrderService;
import com.sinata.rest.modular.member.model.MemUser;
import com.sinata.rest.modular.member.service.IMemUserRelationService;
import com.sinata.rest.modular.member.service.IMemUserService;
import com.sinata.rest.modular.system.service.ISystemSetService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
 
/**
 * 定时任务-等级晋升维持
 */
@Slf4j
@Component
@EnableScheduling
@Api(tags = "API通用接口")
public class UserV4UpDownWork {
 
    @Autowired
    private ISystemSetService setService;
 
    @Autowired
    private IMemUserService memUserService;
 
    @Autowired
    private IMemUserRelationService memUserRelationService;
 
    @Autowired
    private IMallOrderService mallOrderService;
 
    /**
     * 每天执行1次
     */
    @Scheduled(cron = "0 2 0 */1 * *")
    public void run() {
        // 【职级晋升维持】城市合伙人-晋升:可于{1次日/2次月/3次季度}晋升为市场总监
        Integer set_325 = setService.getIntegerById(EnumSystemSetKey.SET_325.index);
        if (set_325 == 1) {
            v4Up();
        } if (set_325 == 2 && DateUtil.thisDayOfMonth() == 1) {
            v4Up();
        } if (set_325 == 3 && DateUtil.isSameDay(DateUtil.date(), DateUtil.beginOfQuarter(DateUtil.date()))) {
            v4Up();
        }
 
        // 季度第一天考核
        if (DateUtil.isSameDay(DateUtil.date(), DateUtil.beginOfQuarter(DateUtil.date()))) {
            // 城市合伙人-维持
            v4Down();
        }
    }
 
    public void v4Up() {
        // 滚动半年开始结束时间
        String beginTime = DateUtil.offsetMonth(DateUtil.date(), -6).toString();
        String endTime = DateUtil.date().toString();
 
        // 城市合伙人列表
        List<MemUser> v4UserList = memUserService.list(
                Wrappers.<MemUser>query().lambda()
                        .select(MemUser::getId, MemUser::getRealName, MemUser::getCreditScore, MemUser::getMemberGradeId, MemUser::getMemberGradeTime)
                        .eq(MemUser::getIsDelete, EnumIsDelete.EXISTED.index) // 非注销
                        .eq(MemUser::getIsLeaveOffice, 0) // 非离职
                        .eq(MemUser::getMemberGradeId, EnumMemberGrade.G_4.index)
                        .ge(MemUser::getCreditScore, setService.getIntegerById(EnumSystemSetKey.SET_324.index))
        );
 
        for (MemUser user : v4UserList) {
            Integer set_321 = setService.getIntegerById(EnumSystemSetKey.SET_321.index);
            // 直接推荐{}个黄金营销员
            Integer shareV3Count = memUserRelationService.directTeamCount(
                    user.getId(),
                    Arrays.asList(EnumMemberGrade.G_3.index),
                    beginTime,
                    endTime
            );
            if (shareV3Count < set_321) {
                continue;
            }
 
            // 直接下级(购买升级)城市合伙人数量
            int directUserV4BuyCount = 0;
            List<VoUserGradeParent> directUserV4GradeParentList = memUserRelationService.getDirectUserGradeParentList(
                    user.getId(),
                    Arrays.asList(EnumMemberGrade.G_4.index),
                    EnumMemberGrade.G_4.index
            );
            if (directUserV4GradeParentList != null) {
                directUserV4BuyCount = directUserV4GradeParentList.size();
            }
 
            Integer set_322 = setService.getIntegerById(EnumSystemSetKey.SET_322.index);
            // 且育成{}城市合伙
            Integer upV4Count = memUserRelationService.directTeamCount(
                    user.getId(),
                    Arrays.asList(EnumMemberGrade.G_4.index),
                    beginTime,
                    endTime
            );
            // (购买升级)城市合伙人,3个算1个
            if (getV4Size(upV4Count, directUserV4BuyCount) < set_322) {
                continue;
            }
 
            Integer set_323 = setService.getIntegerById(EnumSystemSetKey.SET_323.index);
            // 直属团队达成{}万元业绩
            BigDecimal v3DirectTeamMoney = mallOrderService.getV3DirectTeamSumMoney(
                    user.getId(),
                    Arrays.asList(EnumMallOrderState.SUCCESS.index),
                    beginTime,
                    endTime
            );
            if (v3DirectTeamMoney.compareTo(BigDecimal.valueOf(set_323 * 10000)) == -1) {
                continue;
            }
 
            log.info("【城市合伙人晋升为市场总监】用户:{} / {},直推黄金营销员:{}个,且育成{}城市合伙人,直属团队达成{}元业绩,品行分:{}",
                    user.getId(), user.getRealName(), shareV3Count, upV4Count, v3DirectTeamMoney, user.getCreditScore()
            );
            // 晋升为-市场总监
            user.setMemberGradeId(EnumMemberGrade.G_5.index);
            user.setMemberGradeTime(DateUtil.date());
            user.setCreditScore(BigDecimal.valueOf(100));
            user.updateById();
        }
    }
 
    public int getV4Size(int total, int directUserV4BuyCount) {
        // (购买升级)城市合伙人,3个算1个
        int size = (total - directUserV4BuyCount) + directUserV4BuyCount / 3;
        return size < 0 ? 0 : size;
    }
 
    public void v4Down() {
        if (DateUtil.isSameDay(DateUtil.date(), DateUtil.beginOfQuarter(DateUtil.date()))) {
            v4Up();
        }
 
        // 上一自然季度开始结束时间
        String beginTime = DateUtil.beginOfQuarter(DateUtil.offsetMonth(DateUtil.date(), -3)).toString();
        String endTime = DateUtil.endOfQuarter(DateUtil.offsetMonth(DateUtil.date(), -3)).toString();
 
        // 城市合伙人列表(上上季度成为合伙人的才进行考核)
        List<MemUser> v4UserList = memUserService.list(
                Wrappers.<MemUser>query().lambda()
                        .select(MemUser::getId, MemUser::getRealName, MemUser::getCreditScore, MemUser::getMemberGradeId, MemUser::getMemberGradeTime)
                        .eq(MemUser::getIsDelete, EnumIsDelete.EXISTED.index) // 非注销
                        .eq(MemUser::getIsLeaveOffice, 0) // 非离职
                        .eq(MemUser::getMemberGradeId, EnumMemberGrade.G_4.index)
                        .lt(MemUser::getMemberGradeTime, beginTime)
 
        );
 
        for (MemUser user : v4UserList) {
            boolean isDown = false;
            Integer set_326 = setService.getIntegerById(EnumSystemSetKey.SET_326.index);
            // 直属团队自然季度累计业绩需达成{}万
            BigDecimal v3DirectTeamMoney = mallOrderService.getV3DirectTeamSumMoney(
                    user.getId(),
                    Arrays.asList(EnumMallOrderState.SUCCESS.index),
                    beginTime,
                    endTime
            );
            if (v3DirectTeamMoney.compareTo(BigDecimal.valueOf(set_326 * 10000)) == -1) {
                isDown = true;
            }
 
            Integer set_327 = setService.getIntegerById(EnumSystemSetKey.SET_327.index);
            // 直属团队人数不少于{}人
            Integer shareV3Count = memUserRelationService.directTeamCount(
                    user.getId(),
                    Arrays.asList(EnumMemberGrade.G_3.index),
                    beginTime,
                    endTime
            );
            if (shareV3Count < set_327) {
                isDown = true;
            }
 
            if (isDown) {
                log.info("【城市合伙人降级为黄金营销员】用户:{} / {},直属团队自然季度累计业绩{}万,直属团队人数{}人",
                        user.getId(), user.getRealName(), v3DirectTeamMoney, shareV3Count
                );
                // 降级为-黄金营销员
                user.setMemberGradeId(EnumMemberGrade.G_3.index);
                user.setMemberGradeTime(DateUtil.date());
                user.setCreditScore(BigDecimal.valueOf(100));
                user.updateById();
            }
        }
    }
 
}