StatServiceImpl.java 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package com.kym.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.kym.common.utils.CommUtil;
  5. import com.kym.entity.WashDevice;
  6. import com.kym.entity.WashOrder;
  7. import com.kym.entity.queryParams.StatQueryParam;
  8. import com.kym.entity.vo.DashboardVo;
  9. import com.kym.entity.vo.StationTrendVo;
  10. import com.kym.service.*;
  11. import com.kym.service.cache.KymCache;
  12. import org.springframework.stereotype.Service;
  13. import java.time.LocalDate;
  14. import java.time.LocalDateTime;
  15. import java.time.LocalTime;
  16. import java.time.temporal.TemporalAdjusters;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.stream.Collectors;
  20. /**
  21. * 统计
  22. */
  23. @Service
  24. public class StatServiceImpl implements StatService {
  25. private final UserService userService;
  26. private final WashOrderService washOrderService;
  27. private final WashDeviceService washDeviceService;
  28. public StatServiceImpl(UserService userService, WashOrderService washOrderService, WashDeviceService washDeviceService) {
  29. this.userService = userService;
  30. this.washOrderService = washOrderService;
  31. this.washDeviceService = washDeviceService;
  32. }
  33. @Override
  34. public Map<String, Integer> getTodayConsumption() {
  35. return washOrderService.sumAmountByDate(LocalDate.now());
  36. }
  37. @Override
  38. public Map<String, Integer> getMonthConsumption() {
  39. return washOrderService.sumMonthAmount(LocalDate.now());
  40. }
  41. @Override
  42. public Integer getTotalConsumption() {
  43. return null;
  44. }
  45. @Override
  46. public Integer getTotalRegistrations() {
  47. return (int) userService.count();
  48. }
  49. /**
  50. * 当月订单平均消费金额
  51. *
  52. * @return
  53. */
  54. @Override
  55. public Integer getAvgPrice() {
  56. // int totalAmountMap = washOrderService.sumMonthAmount(LocalDate.now());
  57. // int totalOrdersMap = washOrderService.countMonthOrdersCount(LocalDate.now());
  58. // // todo 按照站点 分组统计
  59. // return totalOrders == 0 ? 0 : totalAmount / totalOrders;
  60. return null;
  61. }
  62. /**
  63. * 平均洗车时长
  64. *
  65. * @return
  66. */
  67. @Override
  68. public Integer getAvgDuration() {
  69. var startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
  70. var endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
  71. LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
  72. wrapper.ge(WashOrder::getStartTime, startTime);
  73. wrapper.gt(WashOrder::getStartTime, endTime);
  74. var list = washOrderService.list(wrapper);
  75. if (!list.isEmpty()) {
  76. var totalSeconds = list.stream().mapToInt(WashOrder::getTotalSeconds).sum();
  77. return totalSeconds / list.size();
  78. }
  79. return null;
  80. }
  81. /**
  82. * 当月用户平均洗车频率
  83. *
  84. * @return
  85. */
  86. @Override
  87. public Double getAvgFrequency() {
  88. var startTime = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
  89. var endTime = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
  90. LambdaQueryWrapper<WashOrder> wrapper = new LambdaQueryWrapper<>();
  91. wrapper.ge(WashOrder::getStartTime, startTime);
  92. wrapper.gt(WashOrder::getStartTime, endTime);
  93. var list = washOrderService.list(wrapper);
  94. // 洗车人数
  95. var users = list.stream().distinct().map(WashOrder::getUserId).count();
  96. return users == 0 ? 0 : (double) Math.round((double) list.size() / users * 100) / 100;
  97. }
  98. /**
  99. * 今日概要
  100. *
  101. * @return
  102. */
  103. @Override
  104. public DashboardVo dashboard(String stationId) {
  105. // 截止到现在今日的所有洗车订单
  106. var todayOrders = washOrderService.lambdaQuery()
  107. .eq(WashOrder::getStationId, stationId)
  108. .ge(WashOrder::getStartTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN))
  109. .list();
  110. // 今日收入:V2结算方案从订单中计算
  111. var todayIncome = todayOrders.stream().mapToInt(WashOrder::getAmountReceived).sum();
  112. // 站点今日注册人数
  113. var todayRegistrations = userService.countDailyRegister(LocalDate.now(), stationId);
  114. // 平均洗车消费单价(分)
  115. var avgOrderPrice = todayOrders.isEmpty() ? 0 : (int)todayIncome/todayOrders.size();
  116. // 平均洗车时长(秒)
  117. var avgOrderDuration = todayOrders.isEmpty() ? 0 : (int)todayOrders.stream().mapToInt(WashOrder::getTotalSeconds).sum() / todayOrders.size();
  118. // 月度数据
  119. var monthOrders = washOrderService.lambdaQuery()
  120. .eq(WashOrder::getStationId, stationId)
  121. .ge(WashOrder::getStartTime, LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()).atTime(LocalTime.MIN))
  122. .le(WashOrder::getStartTime, LocalDate.now().with(TemporalAdjusters.lastDayOfMonth()).atTime(LocalTime.MAX))
  123. .list();
  124. var monthConsumptionAmount = monthOrders.stream().mapToInt(WashOrder::getAmount).sum();
  125. var monthIncome = monthOrders.stream().mapToInt(WashOrder::getAmountReceived).sum();
  126. var monthRegistrations = userService.countMonthRegister(LocalDate.now());
  127. var monthOrdersMap = washOrderService.countMonthOrders(LocalDate.now());
  128. // 累计数据
  129. var allOrders = washOrderService.lambdaQuery()
  130. .eq(WashOrder::getStationId, stationId)
  131. .list();
  132. var totalIncome = allOrders.stream().mapToInt(WashOrder::getAmountReceived).sum();
  133. var totalConsumptionAmount = allOrders.stream().mapToInt(WashOrder::getAmount).sum();
  134. var totalMembers = (int) userService.count();
  135. DashboardVo dashboardVo = new DashboardVo();
  136. dashboardVo.setTodayIncome(todayIncome);
  137. dashboardVo.setTodayConsumptionAmount(todayOrders.stream().mapToInt(WashOrder::getAmount).sum());
  138. dashboardVo.setTodayWashOrders(todayOrders.size());
  139. dashboardVo.setTodayRegisteredMembers(CommUtil.isEmptyOrNull(todayRegistrations) ? 0 : todayRegistrations.getOrDefault(stationId, 0));
  140. dashboardVo.setMonthIncome(monthIncome);
  141. dashboardVo.setMonthConsumptionAmount(monthConsumptionAmount);
  142. dashboardVo.setMonthRegisteredMembers(monthRegistrations.getOrDefault(stationId, 0));
  143. dashboardVo.setMonthWashOrders(monthOrdersMap.getOrDefault(stationId, 0));
  144. dashboardVo.setTotalIncome(totalIncome);
  145. dashboardVo.setTotalConsumptionAmount(totalConsumptionAmount);
  146. dashboardVo.setTotalWashOrders(allOrders.size());
  147. dashboardVo.setTotalRegisteredMembers(totalMembers);
  148. dashboardVo.setAvgOrderPrice(avgOrderPrice);
  149. dashboardVo.setAvgOrderDuration(avgOrderDuration);
  150. // 平均洗车频率(次)
  151. dashboardVo.setAvgWashFrequency(0.0); // todo
  152. return dashboardVo;
  153. }
  154. /**
  155. * 统计站点的设备状态情况
  156. *
  157. * @param stationId
  158. * @return
  159. */
  160. @Override
  161. public Map<String, Long> washDeviceStatus(String stationId) {
  162. return washDeviceService.lambdaQuery().eq(WashDevice::getStationId, stationId).list()
  163. .stream().collect((Collectors.groupingBy(WashDevice::getState, Collectors.counting())));
  164. }
  165. @Override
  166. public List<StationTrendVo> trend(StatQueryParam params) {
  167. // 判断数据权限
  168. var adminStationIds = KymCache.INSTANCE.getAdminUserStationIds(StpUtil.getLoginIdAsLong());
  169. if (CommUtil.isEmptyOrNull(params.getStationId()) && CommUtil.isNotEmptyAndNull(adminStationIds)) {
  170. params.setStationId(adminStationIds.get(0));
  171. }
  172. if (CommUtil.isNotEmptyAndNull(params.getStationId()) && CommUtil.isNotEmptyAndNull(adminStationIds) && !adminStationIds.contains(params.getStationId())) {
  173. params.setStationId(adminStationIds.get(0));
  174. }
  175. return washOrderService.stationTrend(params);
  176. }
  177. }