AccountServiceImpl.java 20.4 KB
Newer Older
licc's avatar
licc committed
1 2
package cn.wisenergy.service.app.impl;

licc's avatar
licc committed
3
import cn.wisenergy.common.utils.DateUtil;
licc's avatar
licc committed
4
import cn.wisenergy.common.utils.R;
licc's avatar
licc committed
5
import cn.wisenergy.mapper.*;
licc's avatar
licc committed
6
import cn.wisenergy.model.app.*;
licc's avatar
licc committed
7

licc's avatar
licc committed
8
import cn.wisenergy.model.enums.MemberPercentEnum;
licc's avatar
licc committed
9
import cn.wisenergy.model.enums.RebateStatusEnum;
licc's avatar
licc committed
10
import cn.wisenergy.model.enums.TradeRecordEnum;
11
import cn.wisenergy.model.enums.TradeStatusEnum;
licc's avatar
licc committed
12
import cn.wisenergy.model.vo.TeamPerformanceSortVo;
licc's avatar
licc committed
13
import cn.wisenergy.service.Manager.PublicManager;
licc's avatar
licc committed
14
import cn.wisenergy.service.app.AccountService;
licc's avatar
licc committed
15
import cn.wisenergy.service.Manager.AccountManager;
licc's avatar
licc committed
16
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
licc's avatar
licc committed
17
import com.xxl.job.core.handler.annotation.XxlJob;
licc's avatar
licc committed
18 19
import lombok.extern.slf4j.Slf4j;

licc's avatar
licc committed
20
import org.apache.commons.lang3.StringUtils;
licc's avatar
licc committed
21
import org.springframework.beans.factory.annotation.Autowired;
licc's avatar
licc committed
22
import org.springframework.stereotype.Service;
licc's avatar
licc committed
23
import org.springframework.util.CollectionUtils;
licc's avatar
licc committed
24

licc's avatar
licc committed
25
import java.math.BigDecimal;
licc's avatar
licc committed
26
import java.util.*;
licc's avatar
licc committed
27
import java.util.stream.Collectors;
licc's avatar
licc committed
28 29


licc's avatar
licc committed
30 31 32
/**
 * @author 86187
 */
licc's avatar
licc committed
33 34
@Slf4j
@Service
licc's avatar
licc committed
35
public class AccountServiceImpl extends ServiceImpl<AccountMapper, AccountInfo> implements AccountService {
licc's avatar
licc committed
36

licc's avatar
licc committed
37 38
    @Autowired
    private UsersMapper usersMapper;
licc's avatar
licc committed
39

licc's avatar
licc committed
40 41 42 43
    @Autowired
    private AccountMapper accountMapper;

    @Autowired
licc's avatar
licc committed
44
    private MemberPercentMapper memberPercentMapper;
licc's avatar
licc committed
45 46 47

    @Autowired
    private AccountManager accountManager;
licc's avatar
licc committed
48

licc's avatar
licc committed
49 50 51
    @Autowired
    private PublicManager publicManager;

licc's avatar
licc committed
52 53 54
    @Autowired
    private TradeRecordMapper tradeRecordMapper;

licc's avatar
licc committed
55 56 57
    @Autowired
    private TeamPerformanceMapper teamPerformanceMapper;

licc's avatar
licc committed
58 59 60
    @Autowired
    private ProgressPrizeMapper progressPrizeMapper;

licc's avatar
licc committed
61
    @Autowired
licc's avatar
licc committed
62
    private OrderMapper orderMapper;
licc's avatar
licc committed
63

licc's avatar
licc committed
64
    @Autowired
licc's avatar
licc committed
65
    private MonthManureMapper monthManureMapper;
licc's avatar
licc committed
66

licc's avatar
licc committed
67
    private static final String PATTERN = "yyyy-MM";
licc's avatar
licc committed
68

licc's avatar
licc committed
69 70
    private static final Integer TWENTY = 20;

licc's avatar
licc committed
71
    @XxlJob(value = "orderRebateDayTask")
licc's avatar
licc committed
72
    @Override
licc's avatar
licc committed
73
    public R<Boolean> orderRebate() {
licc's avatar
licc committed
74 75
        log.info("订单返佣接口定时-日任务");
        //        //获取返佣订单
licc's avatar
licc committed
76
        List<OrderInfo> list = orderMapper.getListBySuccessTime(new Date());
licc's avatar
licc committed
77 78 79 80 81
        log.info("shop-mall[]AccountServiceImpl[]orderRebate[]input.param.list:{}", list.size());
        if (CollectionUtils.isEmpty(list)) {
            return R.ok(0, true);
        }

licc's avatar
licc committed
82
        //1、遍历订单,订单状态是未返佣,完成时间小于当前时间 --返佣
licc's avatar
licc committed
83 84 85
        for (OrderInfo orderInfo : list) {
            long successTime = orderInfo.getSuccessTime().getTime();
            long time = System.currentTimeMillis();
licc's avatar
licc committed
86
            if (RebateStatusEnum.NO_REBATE.getCode().equals(orderInfo.getRebateStatus()) && successTime <= time) {
licc's avatar
licc committed
87
                //获取用户信息
licc's avatar
licc committed
88
                User user = usersMapper.getByUserId(orderInfo.getBuyerId());
licc's avatar
licc committed
89 90 91 92 93 94 95 96 97 98 99
                if (null == user) {
                    continue;
                }

                //获取账户信息
                AccountInfo accountInfo = accountMapper.getByUserId(user.getUserId());
                if (null == accountInfo) {
                    continue;
                }

                //获取返佣比例
licc's avatar
licc committed
100
                MemberPercent memberpercent = memberPercentMapper.getByLevelAndType(user.getUserLevel(), MemberPercentEnum.REBATE.getCode());
licc's avatar
licc committed
101
                if (null == memberpercent) {
licc's avatar
licc committed
102 103 104 105
                    continue;
                }

                //修改订单状态为已返佣,账户可用金额增加
licc's avatar
licc committed
106
                accountManager.updateOrderAddMoney(orderInfo, accountInfo, memberpercent);
licc's avatar
licc committed
107 108 109
            }
        }
        return R.ok(0, true);
licc's avatar
licc committed
110
    }
licc's avatar
licc committed
111 112

    @Override
licc's avatar
licc committed
113
    public R<AccountInfo> getByUserId(String userId) {
licc's avatar
licc committed
114 115 116
        AccountInfo accountInfo = accountMapper.getByUserId(userId);
        return R.ok(accountInfo);
    }
licc's avatar
licc committed
117

licc's avatar
licc committed
118
    @XxlJob(value = "monthManureDayTask")
licc's avatar
licc committed
119
    @Override
licc's avatar
licc committed
120 121
    public R<Boolean> performanceCount() {
        //获取本月订单
licc's avatar
licc committed
122
        log.info("月度肥料定时-日任务");
licc's avatar
licc committed
123
        List<OrderInfo> list = orderMapper.getByCreateTime(new Date());
licc's avatar
licc committed
124 125 126 127 128
        log.info("shop-mall[]AccountServiceImpl[]performanceCount[]input.param.list:{}", list.size());
        if (CollectionUtils.isEmpty(list)) {
            return R.ok(0, true);
        }

licc's avatar
licc committed
129 130 131
        Date date = new Date();
        String yearMonth = DateUtil.convertDateToStr(date, PATTERN);

licc's avatar
licc committed
132 133
        //计算当月所有订单成交额
        BigDecimal totalMoney = new BigDecimal(0);
licc's avatar
licc committed
134 135 136

        //统计出出每个用户当月订单成交额 key:userId  value:用户当月订单成交额
        Map<String, Double> map = new HashMap<>();
licc's avatar
licc committed
137
        for (OrderInfo orderInfo : list) {
licc's avatar
licc committed
138 139 140 141 142 143 144 145 146 147
            String userId = orderInfo.getBuyerId();
            double payMoney = orderInfo.getPayment().doubleValue();

            //key 存在  累加订单金额 到 value
            if (map.containsKey(userId)) {
                double money = payMoney + map.get(orderInfo.getBuyerId());
                map.put(orderInfo.getBuyerId(), money);
            } else {
                //key 不存在,加入集合
                map.put(userId, payMoney);
licc's avatar
licc committed
148
            }
licc's avatar
licc committed
149

licc's avatar
licc committed
150
            //累加订单成交额
licc's avatar
licc committed
151
            totalMoney = totalMoney.add(orderInfo.getPayment());
licc's avatar
licc committed
152 153
        }

licc's avatar
licc committed
154 155
        //累计用户和上级用户-团队业绩
        Map<String, Double> tempMap = new HashMap<>();
licc's avatar
licc committed
156

licc's avatar
licc committed
157 158
        //遍历订单
        for (Map.Entry<String, Double> entity : map.entrySet()) {
licc's avatar
licc committed
159 160 161 162
            String userId = entity.getKey();
            //1)、统计当前用户月度业绩
            double userCount = entity.getValue();
            tempMap.put(userId, userCount);
licc's avatar
licc committed
163

licc's avatar
licc committed
164 165
            //2)、获取当前用户的上级用户列表
            List<User> userList = getByList(userId);
licc's avatar
licc committed
166 167 168
            if (CollectionUtils.isEmpty(userList)) {
                continue;
            }
licc's avatar
licc committed
169

licc's avatar
licc committed
170
            for (User userInfo : userList) {
licc's avatar
licc committed
171 172 173 174 175 176 177 178
                //3)、统计当前用户的上级用户团队绩效
                //key 存在  当前用户团队绩效  + 上级用户团队绩效
                if (tempMap.containsKey(userInfo.getUserId())) {
                    double teamMoney = userCount + map.get(userInfo.getUserId());
                    map.put(userInfo.getUserId(), teamMoney);
                } else {
                    //key 不存在,加入集合 当前用户团队绩效
                    map.put(userInfo.getUserId(), userCount);
licc's avatar
licc committed
179 180
                }
            }
licc's avatar
licc committed
181
        }
licc's avatar
licc committed
182

licc's avatar
licc committed
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
        //3、获取用户当月绩效信息   新增 or 更新
        List<TeamPerformance> addList = new ArrayList<>();
        List<TeamPerformance> updateList = new ArrayList<>();
        for (Map.Entry<String, Double> entity : tempMap.entrySet()) {
            //获取团队业绩信息
            TeamPerformance teamPerformance = teamPerformanceMapper.getByUserIdAndTime(entity.getKey(), yearMonth);
            if (null == teamPerformance) {
                //获取用户信息
                User user = usersMapper.getByUserId(entity.getKey());

                //添加用户团队业绩信息
                TeamPerformance performance = new TeamPerformance();
                performance.setUserId(user.getUserId());
                performance.setMonthTeamPerformance(BigDecimal.valueOf(entity.getValue()));
                performance.setUserLevel(user.getUserLevel());
                performance.setYearMonth(yearMonth);
                teamPerformanceMapper.add(performance);
                addList.add(performance);
            } else {
                teamPerformance.setMonthTeamPerformance(BigDecimal.valueOf(entity.getValue()));
                updateList.add(teamPerformance);
            }
licc's avatar
licc committed
205
        }
licc's avatar
licc committed
206 207

        //4、更新账户月度绩效
licc's avatar
licc committed
208 209 210 211
        boolean updateBool = accountManager.updateAccountPerformanceMonth(addList, updateList);
        if (!updateBool) {
            return R.ok(1, false);
        }
licc's avatar
licc committed
212

licc's avatar
licc committed
213 214 215 216 217
        //5、获取所有用户,如果会员等级是黄金以上,计算月度收益
        List<User> userList = usersMapper.getAllGoldUser();
        if (CollectionUtils.isEmpty(userList)) {
            return R.ok(0, true);
        }
licc's avatar
licc committed
218 219 220 221

        boolean bool = monthlyIncome(totalMoney, userList);
        if (!bool) {
            return R.ok(1, false);
licc's avatar
licc committed
222 223
        }
        return R.ok(0, true);
licc's avatar
licc committed
224

licc's avatar
licc committed
225 226 227 228 229 230 231 232 233 234 235
    }

    /**
     * 获取用户的商机信息
     *
     * @param userId 用户id
     * @return
     */
    @Override
    public List<User> getByList(String userId) {
        List<User> list = new ArrayList<>();
licc's avatar
licc committed
236
        User user = usersMapper.getByUserId(userId);
licc's avatar
licc committed
237
        getUser(list, userId);
licc's avatar
licc committed
238 239
        //去除本身
        list.remove(user);
licc's avatar
licc committed
240 241 242
        return list;
    }

licc's avatar
licc committed
243
    @XxlJob(value = "growthAwardDayTask")
licc's avatar
licc committed
244 245 246
    @Override
    public R<Boolean> progressPrizeCount() {
        log.info("shop-mall[]AccountServiceImpl[]performanceCount[]input.method");
licc's avatar
licc committed
247 248
        Date date = new Date();
        String yearMonth = DateUtil.convertDateToStr(date, PATTERN);
licc's avatar
licc committed
249 250

        //1、判断当前月是否是业绩开始的第一个月
licc's avatar
licc committed
251
        List<TeamPerformance> teamPerformances = teamPerformanceMapper.getByBeforeTime(yearMonth);
licc's avatar
licc committed
252

licc's avatar
licc committed
253
        //获取当月所有人业绩总额
licc's avatar
licc committed
254
        Double totalMoney = teamPerformanceMapper.countByTime(yearMonth);
licc's avatar
licc committed
255
        double number = Math.floor(totalMoney / 3980 / 12);
licc's avatar
licc committed
256 257 258 259
        //2、集合为空 是业绩开始的第一个月
        if (CollectionUtils.isEmpty(teamPerformances)) {
            if (number != 0) {
                //获取月业绩前20用户
licc's avatar
licc committed
260
                List<TeamPerformance> list = teamPerformanceMapper.userTwenty(yearMonth);
licc's avatar
licc committed
261 262 263 264 265
                if (CollectionUtils.isEmpty(list)) {
                    return R.ok(0, true);
                }

                //获取20名进步最大的月业绩和
licc's avatar
licc committed
266
                Double twentyTotal = teamPerformanceMapper.countTwenty(yearMonth);
licc's avatar
licc committed
267 268
                List<AccountInfo> accountInfoList = new ArrayList<>();
                List<TradeRecord> tradeRecordList = new ArrayList<>();
licc's avatar
licc committed
269 270 271 272 273 274 275 276 277 278 279 280
                for (TeamPerformance user : list) {
                    //获取最大进步奖 百分比
                    MemberPercent memberPercent = memberPercentMapper.getByLevelAndType(user.getUserLevel(), 3);

                    //计算收益
                    double userTeamPerformance = user.getMonthTeamPerformance().doubleValue();
                    double percent = memberPercent.getPercent().doubleValue();

                    double income = number * 3980 * percent * userTeamPerformance / twentyTotal;

                    //获取账户信息
                    AccountInfo accountInfo = accountMapper.getByUserId(user.getUserId());
licc's avatar
licc committed
281
                    accountInfo.setEarningsMonth(new BigDecimal(income));
licc's avatar
licc committed
282
                    accountInfoList.add(accountInfo);
283 284 285 286 287 288 289

                    //添加交易流水记录
                    TradeRecord tradeRecord = new TradeRecord();
                    tradeRecord.setUserId(user.getUserId());
                    tradeRecord.setTradeType(TradeRecordEnum.PROGRESS_PRIZE.getCode());
                    tradeRecord.setTradeNo(null);
                    tradeRecord.setStatus(TradeStatusEnum.ALREADY_SETTLE_ACCOUNTS.getCode());
licc's avatar
licc committed
290 291 292 293 294 295 296
                    tradeRecordList.add(tradeRecord);
                }

                //更新账户信息,添加交易流水记录
                boolean bool = accountManager.updateAccountAddRecord(accountInfoList, tradeRecordList);
                if (!bool) {
                    return R.ok(1, false);
licc's avatar
licc committed
297 298 299 300 301 302 303 304 305 306 307 308
                }
            }
            return R.ok(0, true);
        }

        //3、集合不为空 不是业绩开始的第一个月
        //获取用户列表
        List<User> userList = usersMapper.findAll();
        if (CollectionUtils.isEmpty(userList)) {
            return R.ok(0, true);
        }

licc's avatar
licc committed
309 310
        //4计算每个用户本月的业绩增长率
        List<TeamPerformanceSortVo> listVo = progressPrizeStatistics(userList);
licc's avatar
licc committed
311

licc's avatar
licc committed
312
        //5、如果集合大于20 ,取前二十名,小于,取全部
licc's avatar
licc committed
313
        if (listVo.size() >= TWENTY) {
licc's avatar
licc committed
314
            //取排名前20的
licc's avatar
licc committed
315
            listVo.subList(0, TWENTY);
licc's avatar
licc committed
316

licc's avatar
licc committed
317 318 319
            //计算前20的总业绩
            double total = listVo.stream().mapToDouble(TeamPerformanceSortVo::getMonthPerformance).sum();
            totalPerformanceIncome(listVo, number, total);
licc's avatar
licc committed
320 321
            return R.ok(0, true);
        } else {
licc's avatar
licc committed
322 323 324
            //计算用户数少于20的总业绩
            double total = listVo.stream().mapToDouble(TeamPerformanceSortVo::getMonthPerformance).sum();
            totalPerformanceIncome(listVo, number, total);
licc's avatar
licc committed
325 326
        }
        return R.ok(0, true);
licc's avatar
licc committed
327 328
    }

licc's avatar
licc committed
329

licc's avatar
licc committed
330 331 332
    public void getUser(List<User> list, String userId) {
        User user = usersMapper.getByUserId(userId);
        list.add(user);
licc's avatar
licc committed
333
        if (null != user && !StringUtils.isBlank(user.getBeInvitedCode())) {
licc's avatar
licc committed
334
            User userInfo = usersMapper.getByBeInvitedCode(user.getBeInvitedCode());
licc's avatar
licc committed
335 336 337
            if (null != userInfo) {
                getUser(list, userInfo.getUserId());
            }
licc's avatar
licc committed
338 339
        }
    }
licc's avatar
licc committed
340

licc's avatar
licc committed
341 342 343
    /**
     * 如果会员等级是黄金以上,计算月度收益
     *
licc's avatar
licc committed
344 345
     * @param totalMoney 月金额总额
     * @param userList   用户列表
licc's avatar
licc committed
346 347
     * @return
     */
licc's avatar
licc committed
348
    private boolean monthlyIncome(BigDecimal totalMoney, List<User> userList) {
licc's avatar
licc committed
349
        double total = totalMoney.doubleValue();
licc's avatar
licc committed
350 351 352
        Date date = new Date();
        String yearMonth = DateUtil.convertDateToStr(date, PATTERN);

licc's avatar
licc committed
353 354
        //当月所有人订单成交总金额/3980/12  向下整
        double moneyMonth = Math.floor(total / 3980 / 12);
licc's avatar
licc committed
355 356
        List<AccountInfo> accountInfoList = new ArrayList<>();
        List<TradeRecord> tradeRecordList = new ArrayList<>();
licc's avatar
licc committed
357 358 359 360 361 362 363 364 365 366 367

        //获取上月未分配完的奖金
        double lastMonthAward;
        Date last = DateUtil.getLastMonth(new Date());
        String yearMonthTime = DateUtil.convertDateToStr(last, PATTERN);
        MonthManure monthManure = monthManureMapper.queryByTime(yearMonthTime);
        if (null == monthManure) {
            lastMonthAward = 0.00;
        } else {
            lastMonthAward = monthManure.getManureAward();
        }
licc's avatar
licc committed
368 369 370 371 372 373 374 375 376 377 378 379 380 381
        for (User user : userList) {
            if (moneyMonth != 0) {
                //获取等级优惠百分比
                MemberPercent memberPercent = memberPercentMapper.getByLevelAndType(user.getUserLevel(), 2);
                if (null != memberPercent) {
                    //获取本月团队总金额
                    TeamPerformance teamPerformance = teamPerformanceMapper.getByUserIdAndTime(user.getUserId(), yearMonth);

                    //获取该等级团队总金额
                    Double teamTotal = teamPerformanceMapper.countTeamMoney(user.getUserLevel(), yearMonth);
                    if (null != teamPerformance && null != teamTotal) {
                        double month = teamPerformance.getMonthTeamPerformance().doubleValue();
                        double percent = memberPercent.getPercent().doubleValue();
                        //计算收益
licc's avatar
licc committed
382
                        double income = (moneyMonth + lastMonthAward) * 3980 * percent * month / teamTotal;
licc's avatar
licc committed
383 384 385 386 387 388 389 390 391 392 393 394 395 396 397

                        //获取账户信息
                        AccountInfo accountInfo = accountMapper.getByUserId(user.getUserId());
                        BigDecimal bigDecimal = new BigDecimal(income);
                        BigDecimal performanceMonth = accountInfo.getEarningsMonth().add(bigDecimal);
                        accountInfo.setEarningsMonth(performanceMonth);

                        BigDecimal performanceTotal = accountInfo.getEarningsMonth().add(bigDecimal);
                        accountInfo.setEarningsMonth(performanceTotal);
                        accountInfoList.add(accountInfo);


                        //5、添加交易流水记录
                        TradeRecord tradeRecord = new TradeRecord();
                        tradeRecord.setUserId(user.getUserId());
licc's avatar
licc committed
398
                        tradeRecord.setTradeType(TradeRecordEnum.MONTHLY_FERTILIZER.getCode());
licc's avatar
licc committed
399 400 401
                        tradeRecord.setTradeNo(null);
                        tradeRecord.setStatus(TradeStatusEnum.NO_SETTLE_ACCOUNTS.getCode());
                        tradeRecordList.add(tradeRecord);
licc's avatar
licc committed
402
                    }
licc's avatar
licc committed
403 404 405
                }
            }
        }
licc's avatar
licc committed
406 407
        //更新账户信息,新增交易流水记录
        return accountManager.updateAccountAddRecord(accountInfoList, tradeRecordList);
licc's avatar
licc committed
408 409
    }

licc's avatar
licc committed
410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447
    /**
     * 统计每个用户本月业绩增长率
     *
     * @param userList 用户列表
     * @return 每个用户本月业绩增长率
     */
    private List<TeamPerformanceSortVo> progressPrizeStatistics(List<User> userList) {
        Date date = new Date();
        String yearMonth = DateUtil.convertDateToStr(date, PATTERN);

        //遍历 计算业绩增长率
        List<TeamPerformanceSortVo> listVo = new ArrayList<>();
        for (User user : userList) {
            TeamPerformanceSortVo teamVo = new TeamPerformanceSortVo();
            double growthRate;
            //获取当月业绩
            TeamPerformance teamPerformance = teamPerformanceMapper.getByUserIdAndTime(user.getUserId(), yearMonth);

            //获取上月业绩
            Calendar cal = Calendar.getInstance();
            cal.setTime(new Date());
            cal.add(Calendar.MONTH, -1);
            Date lastDate = cal.getTime();
            String lastMonthTime = DateUtil.convertDateToStr(lastDate, PATTERN);
            TeamPerformance lastMonth = teamPerformanceMapper.getByUserIdAndTime(user.getUserId(), lastMonthTime);
            if (null == teamPerformance || null == lastMonth) {
                growthRate = 0.00;
            } else {
                double month = teamPerformance.getMonthTeamPerformance().doubleValue();
                double last = lastMonth.getMonthTeamPerformance().doubleValue();
                if (last >= month) {
                    growthRate = 0.00;
                } else {
                    growthRate = (month - last) / month;
                }
            }
            teamVo.setGrowthRate(growthRate);
            double monthPerformance;
licc's avatar
licc committed
448
            assert teamPerformance != null;
licc's avatar
licc committed
449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
            if (null == teamPerformance.getMonthTeamPerformance()) {
                monthPerformance = 0.00;
            } else {
                monthPerformance = teamPerformance.getMonthTeamPerformance().doubleValue();
            }
            teamVo.setMonthPerformance(monthPerformance);
            teamVo.setUserId(user.getUserId());
            teamVo.setTeamPerformance(teamPerformance);
            listVo.add(teamVo);
        }

        //对集合进行排序
        listVo.sort(Comparator.comparing(TeamPerformanceSortVo::getGrowthRate).reversed());
        return listVo;
    }

    /**
     * 统计用户最大进步奖收益
     *
     * @param listVo 用户增长率列表
     * @param number 个人业绩
     * @param total  总业绩
     */
    private void totalPerformanceIncome(List<TeamPerformanceSortVo> listVo, double number, double total) {
        //要更新的账户列表
        List<AccountInfo> updateAccountList = new ArrayList<>();

licc's avatar
licc committed
476 477 478 479
        BigDecimal sum = new BigDecimal(0);
        for (int i = 0; i < listVo.size(); i++) {
            String userId = listVo.get(i).getTeamPerformance().getUserId();
            Integer userLevel = listVo.get(i).getTeamPerformance().getUserLevel();
licc's avatar
licc committed
480 481 482 483
            //获取最大进步奖 百分比
            MemberPercent memberPercent = memberPercentMapper.getByLevelAndType(userLevel, 3);

            //计算收益
licc's avatar
licc committed
484
            double userTeamPerformance = listVo.get(i).getTeamPerformance().getMonthTeamPerformance().doubleValue();
licc's avatar
licc committed
485 486 487 488 489 490
            double percent = memberPercent.getPercent().doubleValue();

            double income = number * 3980 * percent * userTeamPerformance / total;

            //获取账户信息
            AccountInfo accountInfo = accountMapper.getByUserId(userId);
licc's avatar
licc committed
491 492 493 494 495 496 497
            BigDecimal bigDecimal;
            if (i == listVo.size() - 1) {
                bigDecimal = new BigDecimal(total).subtract(sum);
            } else {
                bigDecimal = accountInfo.getEarningsMonth().add(new BigDecimal(income));
                sum = sum.add(new BigDecimal(income));
            }
licc's avatar
licc committed
498 499 500 501 502 503 504 505 506
            accountInfo.setEarningsMonth(bigDecimal);
            updateAccountList.add(accountInfo);
        }

        //判断本月是否有最大进步奖数据 无,新增  有,修改或删除
        Date date = new Date();
        String yearMonth = DateUtil.convertDateToStr(date, PATTERN);
        List<ProgressPrize> prizes = progressPrizeMapper.getByYearMonth(yearMonth);

licc's avatar
licc committed
507
        //修改或保存最大进步奖信息
licc's avatar
licc committed
508
        accountManager.updateOrSavePrize(listVo, updateAccountList, prizes);
licc's avatar
licc committed
509
    }
licc's avatar
licc committed
510
}