DayStatTask.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. package com.qs.mp.quartz.task;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4. import com.qs.mp.admin.domain.TicketBox;
  5. import com.qs.mp.admin.service.ITicketBoxService;
  6. import com.qs.mp.channel.domain.Channel;
  7. import com.qs.mp.channel.domain.ChannelCommission;
  8. import com.qs.mp.channel.domain.ChannelCouponVerifyLog;
  9. import com.qs.mp.channel.domain.ChannelWithdraw;
  10. import com.qs.mp.channel.service.IChannelCommissionService;
  11. import com.qs.mp.channel.service.IChannelCouponVerifyLogService;
  12. import com.qs.mp.channel.service.IChannelService;
  13. import com.qs.mp.channel.service.IChannelWithdrawService;
  14. import com.qs.mp.common.enums.ChannelWithdrawStatusEnum;
  15. import com.qs.mp.common.enums.CoinLogTypeEnum;
  16. import com.qs.mp.common.enums.CouponDiscountTypeEnum;
  17. import com.qs.mp.common.enums.TicketBoxStatusEnum;
  18. import com.qs.mp.common.enums.TicketTypeEnum;
  19. import com.qs.mp.common.enums.UserTicketOrderStatusEnum;
  20. import com.qs.mp.common.utils.DateUtils;
  21. import com.qs.mp.common.utils.LogUtil;
  22. import com.qs.mp.common.utils.StringUtils;
  23. import com.qs.mp.common.utils.WebhookService;
  24. import com.qs.mp.system.domain.SysUser;
  25. import com.qs.mp.system.service.ISysUserService;
  26. import com.qs.mp.user.domain.UserCoinLog;
  27. import com.qs.mp.user.domain.UserExchangeOrder;
  28. import com.qs.mp.user.domain.UserTicketOrder;
  29. import com.qs.mp.user.service.IUserCoinLogService;
  30. import com.qs.mp.user.service.IUserExchangeOrderService;
  31. import com.qs.mp.user.service.IUserTicketOrderService;
  32. import java.math.BigDecimal;
  33. import java.math.RoundingMode;
  34. import java.util.Date;
  35. import java.util.List;
  36. import java.util.Map;
  37. import org.slf4j.Logger;
  38. import org.slf4j.LoggerFactory;
  39. import org.springframework.beans.factory.annotation.Autowired;
  40. import org.springframework.beans.factory.annotation.Value;
  41. import org.springframework.stereotype.Component;
  42. /**
  43. * 日统计任务
  44. *
  45. * @author zhongcp
  46. * @Date 2022/3/17
  47. */
  48. @Component("dayStatTask")
  49. public class DayStatTask {
  50. protected final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName());
  51. @Autowired
  52. private ISysUserService sysUserService;
  53. @Autowired
  54. private IChannelService channelService;
  55. @Autowired
  56. private ITicketBoxService ticketBoxService;
  57. @Autowired
  58. private IUserTicketOrderService userTicketOrderService;
  59. @Autowired
  60. private IChannelCommissionService channelCommissionService;
  61. @Autowired
  62. private IChannelWithdrawService channelWithdrawService;
  63. @Autowired
  64. private IUserExchangeOrderService userExchangeOrderService;
  65. @Autowired
  66. private IUserCoinLogService userCoinLogService;
  67. @Autowired
  68. private IChannelCouponVerifyLogService channelCouponVerifyLogService;
  69. @Value("${export.page-size}")
  70. private int pageSize;
  71. /**
  72. * 日统计任务 2022.04.02 代理:xxx 门店:xxx 用户:xxx =============== 票组名字|线上(面值),销售:¥0.00 票组名字|线上(面值),销售:¥0.00
  73. * 总销售额:¥0.00 累计分佣:¥0.00 累计提现:¥0.00 兑换订单:5689 派发盲豆:8880 兑换盲豆:6666
  74. */
  75. public void stat(String executeDay) {
  76. LogUtil.info(logger, "...日统计定时任务开始...");
  77. Date bizDay;
  78. if (StringUtils.isNotBlank(executeDay)) {
  79. bizDay = DateUtils.parseStrToDate(executeDay, DateUtils.YYYYMMDD);
  80. } else {
  81. bizDay = DateUtils.addDays(DateUtils.getToday(), -1);
  82. }
  83. StringBuilder sb = new StringBuilder();
  84. sb.append(DateUtils.dateTime(bizDay)).append("\n");
  85. int allChannelCnt = channelService.count(new LambdaQueryWrapper<Channel>().gt(Channel::getLevel, 0));
  86. int channelCnt = channelService.count(new LambdaQueryWrapper<Channel>().gt(Channel::getLevel, 0)
  87. .ge(Channel::getCreatedTime, bizDay)
  88. .lt(Channel::getCreatedTime, DateUtils.addDays(bizDay, 1)));
  89. sb.append("累计代理:").append(allChannelCnt).append(",当日新增:").append(channelCnt).append("\n");
  90. int siteCnt = channelService.count(new LambdaQueryWrapper<Channel>().eq(Channel::getLevel, 0)
  91. .ge(Channel::getCreatedTime, bizDay)
  92. .lt(Channel::getCreatedTime, DateUtils.addDays(bizDay, 1)));
  93. int allSiteCnt = channelService.count(new LambdaQueryWrapper<Channel>().eq(Channel::getLevel, 0));
  94. sb.append("累计门店:").append(allSiteCnt).append(",当日新增:").append(siteCnt).append("\n");
  95. int userCnt = sysUserService.count(new LambdaQueryWrapper<SysUser>()
  96. .ge(SysUser::getCreateTime, bizDay)
  97. .lt(SysUser::getCreateTime, DateUtils.addDays(bizDay, 1)));
  98. int allUserCnt = sysUserService.count(new LambdaQueryWrapper<SysUser>());
  99. sb.append("累计用户:").append(allUserCnt - allSiteCnt - allChannelCnt).append(",当日新增:").append(userCnt - siteCnt - channelCnt).append("\n");
  100. sb.append("===================\n");
  101. StringBuffer sbDetail = new StringBuffer("");
  102. LambdaQueryWrapper<TicketBox> queryWrapper = new LambdaQueryWrapper<TicketBox>()
  103. .nested(wrapper -> {
  104. wrapper.eq(TicketBox::getType, TicketTypeEnum.ONLINE).eq(TicketBox::getStatus,
  105. TicketBoxStatusEnum.PUT_ON).or().eq(TicketBox::getType, TicketTypeEnum.OFFLINE);
  106. })
  107. .notLike(TicketBox::getTitle, "测试票")
  108. .eq(TicketBox::getIsDeleted, 0);
  109. int totalSize = ticketBoxService.count(queryWrapper);
  110. int totalPage = 1;
  111. if (totalSize > pageSize) {
  112. totalPage = totalSize % pageSize == 0 ? totalSize / pageSize : totalSize / pageSize + 1;
  113. }
  114. BigDecimal sumSaleAmt = BigDecimal.ZERO;
  115. BigDecimal sumAllSaleAmt = BigDecimal.ZERO;
  116. for (int i = 0; i < totalPage; i++) {
  117. queryWrapper.orderByAsc(TicketBox::getBoxNo);
  118. queryWrapper.last("limit " + (i * pageSize) + ", " + pageSize);
  119. List<TicketBox> ticketBoxList = ticketBoxService.list(queryWrapper);
  120. for (TicketBox ticketBox : ticketBoxList) {
  121. Map<String, Object> orderMap = userTicketOrderService.getMap(
  122. new QueryWrapper<UserTicketOrder>()
  123. .select("IFNULL(sum(pay_amt) ,0) as orderAmt")
  124. .lambda().eq(UserTicketOrder::getBoxId, ticketBox.getBoxId())
  125. .eq(UserTicketOrder::getStatus, UserTicketOrderStatusEnum.FINISHED)
  126. .ge(UserTicketOrder::getCreatedTime, bizDay)
  127. .lt(UserTicketOrder::getCreatedTime, DateUtils.addDays(bizDay, 1)));
  128. if (null != orderMap) {
  129. BigDecimal orderAmt = new BigDecimal(
  130. Integer.valueOf(String.valueOf(orderMap.get("orderAmt")))).divide(new BigDecimal(100),
  131. 2, RoundingMode.DOWN);
  132. sumSaleAmt = sumSaleAmt.add(orderAmt);
  133. BigDecimal allOrderAmt = new BigDecimal(ticketBox.getSalePrice() * ticketBox.getSaleQty()).divide(new BigDecimal(100),
  134. 2, RoundingMode.DOWN);
  135. sumAllSaleAmt = sumAllSaleAmt.add(allOrderAmt);
  136. sbDetail.append(ticketBox.getTitle()).append("|").append(ticketBox.getType().getDesc())
  137. .append("(").append(
  138. new BigDecimal(ticketBox.getSalePrice()).divide(new BigDecimal(100), 2,
  139. RoundingMode.DOWN)).append("元),累计销售额:")
  140. .append(allOrderAmt).append("元,当日:")
  141. .append(orderAmt).append("元\n");
  142. sbDetail.append("------------------------");
  143. }
  144. }
  145. }
  146. sb.append("累计销售额:").append(sumAllSaleAmt).append("元,当日:").append(sumSaleAmt).append("元\n");
  147. Map<String, Object> commMap = channelCommissionService.getMap(
  148. new QueryWrapper<ChannelCommission>()
  149. .select("IFNULL(sum(comm_amt) ,0) as commAmt")
  150. .lambda().ge(ChannelCommission::getCreatedTime, bizDay)
  151. .lt(ChannelCommission::getCreatedTime, DateUtils.addDays(bizDay, 1)));
  152. Map<String, Object> allCommMap = channelCommissionService.getMap(
  153. new QueryWrapper<ChannelCommission>()
  154. .select("IFNULL(sum(comm_amt) ,0) as commAmt"));
  155. if (null != commMap) {
  156. sb.append("累计分佣:").append(
  157. new BigDecimal(Integer.valueOf(String.valueOf(allCommMap.get("commAmt")))).divide(
  158. new BigDecimal(100), 2, RoundingMode.DOWN))
  159. .append("元,当日:").append(
  160. new BigDecimal(Integer.valueOf(String.valueOf(commMap.get("commAmt")))).divide(
  161. new BigDecimal(100), 2, RoundingMode.DOWN)).append("元\n");
  162. }
  163. Map<String, Object> couponMap = channelCouponVerifyLogService.getMap(
  164. new QueryWrapper<ChannelCouponVerifyLog>()
  165. .select("IFNULL(sum(discount) ,0) as discount")
  166. .lambda().ge(ChannelCouponVerifyLog::getCreatedTime, bizDay)
  167. .lt(ChannelCouponVerifyLog::getCreatedTime, DateUtils.addDays(bizDay, 1))
  168. .eq(ChannelCouponVerifyLog::getDiscountType, CouponDiscountTypeEnum.MONEY_OFF));
  169. Map<String, Object> allCouponMap = channelCouponVerifyLogService.getMap(
  170. new QueryWrapper<ChannelCouponVerifyLog>()
  171. .select("IFNULL(sum(discount) ,0) as discount")
  172. .lambda().eq(ChannelCouponVerifyLog::getDiscountType, CouponDiscountTypeEnum.MONEY_OFF));
  173. if (null != commMap) {
  174. sb.append("累计核销:").append(
  175. new BigDecimal(Integer.valueOf(String.valueOf(allCouponMap.get("discount")))).divide(
  176. new BigDecimal(100), 2, RoundingMode.DOWN))
  177. .append("元,当日:").append(
  178. new BigDecimal(Integer.valueOf(String.valueOf(couponMap.get("discount")))).divide(
  179. new BigDecimal(100), 2, RoundingMode.DOWN)).append("元\n");
  180. }
  181. Map<String, Object> withdrawMap = channelWithdrawService.getMap(
  182. new QueryWrapper<ChannelWithdraw>()
  183. .select("IFNULL(sum(money) ,0) as withdrawAmt")
  184. .lambda().ge(ChannelWithdraw::getCreateTime, bizDay)
  185. .lt(ChannelWithdraw::getCreateTime, DateUtils.addDays(bizDay, 1))
  186. .eq(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.FINISHED));
  187. Map<String, Object> allWithdrawMap = channelWithdrawService.getMap(
  188. new QueryWrapper<ChannelWithdraw>()
  189. .select("IFNULL(sum(money) ,0) as withdrawAmt")
  190. .lambda().eq(ChannelWithdraw::getStatus, ChannelWithdrawStatusEnum.FINISHED));
  191. if (null != withdrawMap) {
  192. sb.append("累计提现:").append(
  193. new BigDecimal(Integer.valueOf(String.valueOf(allWithdrawMap.get("withdrawAmt")))).divide(
  194. new BigDecimal(100), 2, RoundingMode.DOWN))
  195. .append("元,当日:").append(
  196. new BigDecimal(Integer.valueOf(String.valueOf(withdrawMap.get("withdrawAmt")))).divide(
  197. new BigDecimal(100), 2, RoundingMode.DOWN)).append("元\n");
  198. }
  199. int exCnt = userExchangeOrderService.count(new LambdaQueryWrapper<UserExchangeOrder>()
  200. .ge(UserExchangeOrder::getCreatedTime, bizDay)
  201. .lt(UserExchangeOrder::getCreatedTime, DateUtils.addDays(bizDay, 1)));
  202. int allExCnt = userExchangeOrderService.count(new LambdaQueryWrapper<UserExchangeOrder>());
  203. sb.append("累计兑换订单:").append(allExCnt).append("个,当日:").append(exCnt).append("个\n");
  204. Map<String, Object> deliverMap = userCoinLogService.getMap(new QueryWrapper<UserCoinLog>()
  205. .select("IFNULL(sum(log_money) ,0) as deliverAmt")
  206. .lambda().eq(UserCoinLog::getType, CoinLogTypeEnum.PRIZE)
  207. .ge(UserCoinLog::getCreatedTime, bizDay)
  208. .lt(UserCoinLog::getCreatedTime, DateUtils.addDays(bizDay, 1)));
  209. Map<String, Object> allDeliverMap = userCoinLogService.getMap(new QueryWrapper<UserCoinLog>()
  210. .select("IFNULL(sum(log_money) ,0) as deliverAmt")
  211. .lambda().eq(UserCoinLog::getType, CoinLogTypeEnum.PRIZE));
  212. if (null != deliverMap) {
  213. sb.append("累计派发盲豆:").append(Integer.valueOf(String.valueOf(allDeliverMap.get("deliverAmt"))))
  214. .append("颗,当日:").append(Integer.valueOf(String.valueOf(deliverMap.get("deliverAmt"))))
  215. .append("颗\n");
  216. }
  217. Map<String, Object> exchangeMap = userCoinLogService.getMap(new QueryWrapper<UserCoinLog>()
  218. .select("IFNULL(sum(log_money) ,0) as exchangeAmt")
  219. .lambda().eq(UserCoinLog::getType, CoinLogTypeEnum.EXCHANGE)
  220. .ge(UserCoinLog::getCreatedTime, bizDay)
  221. .lt(UserCoinLog::getCreatedTime, DateUtils.addDays(bizDay, 1)));
  222. Map<String, Object> allExchangeMap = userCoinLogService.getMap(new QueryWrapper<UserCoinLog>()
  223. .select("IFNULL(sum(log_money) ,0) as exchangeAmt")
  224. .lambda().eq(UserCoinLog::getType, CoinLogTypeEnum.EXCHANGE));
  225. if (null != withdrawMap) {
  226. sb.append("累计兑换盲豆:").append(0 - Integer.valueOf(String.valueOf(allExchangeMap.get("exchangeAmt"))))
  227. .append("颗,当日:").append(0 - Integer.valueOf(String.valueOf(exchangeMap.get("exchangeAmt"))))
  228. .append("颗\n");
  229. }
  230. sb.append("===================\n");
  231. sb.append(sbDetail);
  232. WebhookService.sendBizData(sb.toString());
  233. LogUtil.info(logger, "...日统计任务结束..." );
  234. }
  235. }