content: package com.java2nb.novel.core.schedule;
  
  
  import com.java2nb.novel.core.config.AuthorIncomeProperties;
  import com.java2nb.novel.core.utils.DateUtil;
  import com.java2nb.novel.entity.Author;
  import com.java2nb.novel.entity.AuthorIncome;
  import com.java2nb.novel.entity.Book;
  import com.java2nb.novel.service.AuthorService;
  import com.java2nb.novel.service.BookService;
  import lombok.RequiredArgsConstructor;
  import lombok.extern.slf4j.Slf4j;
  import org.springframework.scheduling.annotation.Scheduled;
  import org.springframework.stereotype.Service;
  
  import java.math.BigDecimal;
  import java.util.Date;
  import java.util.List;
  
  /**
   * 作家日收入统计任务
   *
   * @author cd
   */
  @Service
  @RequiredArgsConstructor
  @Slf4j
  public class MonthIncomeStaSchedule {
  
      private final AuthorService authorService;
  
      private final BookService bookService;
  
      private final AuthorIncomeProperties authorIncomeConfig;
  
      /**
       * 每个月1号凌晨2点统计上个月数据
       */
      @Scheduled(cron = "0 0 2 1 * ?")
      public void statistics() {
  
          //获取上个月的开始时间和结束时间
          Date startTime = DateUtil.getLastMonthStartTime();
          Date endTime = DateUtil.getLastMonthEndTime();
  
          //每次查询的作家数量
          int needAuthorNumber = 10;
          //查询出来的真实作家数量
          int realAuthorNumber;
          //每次查询最大申请时间
          Date maxAuthorCreateTime = new Date();
          do {
              //1.查询作家列表
              List<Author> authors = authorService.queryAuthorList(needAuthorNumber, maxAuthorCreateTime);
              realAuthorNumber = authors.size();
              for (Author author : authors) {
                  maxAuthorCreateTime = author.getCreateTime();
                  Long authorId = author.getId();
                  Long userId = author.getUserId();
                  //2.查询作家作品
                  List<Book> books = bookService.queryBookList(authorId);
  
                  long totalPreTaxIncome = 0L;
                  long totalAfterTaxIncome = 0L;
                  for (Book book : books) {
  
                      Long bookId = book.getId();
  
                      //3.月收入数据未统计入库,分作品统计数据入库
                      Long monthIncome = authorService.queryTotalAccount(userId, bookId, startTime, endTime);
  
                      BigDecimal monthIncomeShare = new BigDecimal(monthIncome)
                          .multiply(authorIncomeConfig.getShareProportion());
                      long preTaxIncome = monthIncomeShare
                          .multiply(authorIncomeConfig.getExchangeProportion())
                          .multiply(new BigDecimal(100))
                          .longValue();
  
                      totalPreTaxIncome += preTaxIncome;
  
                      long afterTaxIncome = monthIncomeShare
                          .multiply(authorIncomeConfig.getTaxRate())
                          .multiply(authorIncomeConfig.getExchangeProportion())
                          .multiply(new BigDecimal(100))
                          .longValue();
  
                      totalAfterTaxIncome += afterTaxIncome;
  
                      //4.查询月收入统计是否入库
                      if (monthIncome > 0 && !authorService.queryIsStatisticsMonth(bookId, endTime)) {
                          AuthorIncome authorIncome = new AuthorIncome();
                          authorIncome.setAuthorId(authorId);
                          authorIncome.setUserId(userId);
                          authorIncome.setBookId(bookId);
                          authorIncome.setPreTaxIncome(preTaxIncome);
                          authorIncome.setAfterTaxIncome(afterTaxIncome);
                          authorIncome.setIncomeMonth(endTime);
                          authorIncome.setCreateTime(new Date());
  
                          authorService.saveAuthorIncomeSta(authorIncome);
                      }
  
  
                  }
  
                  if (totalPreTaxIncome > 0 && !authorService.queryIsStatisticsMonth(authorId, 0L, endTime)) {
  
                      AuthorIncome authorIncome = new AuthorIncome();
                      authorIncome.setAuthorId(authorId);
                      authorIncome.setUserId(userId);
                      authorIncome.setBookId(0L);
                      authorIncome.setPreTaxIncome(totalPreTaxIncome);
                      authorIncome.setAfterTaxIncome(totalAfterTaxIncome);
                      authorIncome.setIncomeMonth(endTime);
                      authorIncome.setCreateTime(new Date());
  
                      authorService.saveAuthorIncomeSta(authorIncome);
                  }
  
  
              }
  
          } while (needAuthorNumber == realAuthorNumber);
  
  
      }
  
  }
  