|
@@ -0,0 +1,204 @@
|
|
|
+package com.sqx.modules.orders.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.sqx.common.utils.DateUtils;
|
|
|
+import com.sqx.modules.orders.dao.OrderStatisticsDao;
|
|
|
+import com.sqx.modules.orders.dao.OrdersDao;
|
|
|
+import com.sqx.modules.orders.entity.Orders;
|
|
|
+import com.sqx.modules.orders.service.OrderStatisticsService;
|
|
|
+import com.sqx.modules.orders.vo.OrderStatisticsVo;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.ibatis.annotations.Param;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import javax.annotation.Resource;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class OrderStatisticsServiceImpl extends ServiceImpl<OrdersDao, Orders> implements OrderStatisticsService {
|
|
|
+ @Resource
|
|
|
+ private OrderStatisticsDao orderStatisticsDao;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public OrderStatisticsVo getStatistics(Long driverUserId,String startTime, String endTime){
|
|
|
+ //getDate == 0 今天数据 getDate == 1 昨天数据 getDate == 2 根据时间范围查询
|
|
|
+ //**Symbol 0-升高 1-下降 2-没变
|
|
|
+ if (null == startTime || startTime == ""){
|
|
|
+ OrderStatisticsVo today = orderStatisticsDao.getStatistics(driverUserId,null,null, 0);
|
|
|
+ OrderStatisticsVo yesterday = orderStatisticsDao.getStatistics(driverUserId,null,null, 1);
|
|
|
+ if (today.getTotal() == 0 && yesterday.getTotal() != 0){
|
|
|
+ today.setTotalChange(100d);
|
|
|
+ today.setTotalChangeSymbol(1);
|
|
|
+ today.setMoney(0d);
|
|
|
+ today.setMoneyChange(100d);
|
|
|
+ today.setMoneyChangeSymbol(1);
|
|
|
+ today.setCompletionRate(0d);
|
|
|
+ today.setCompletionRateChange(0.0);
|
|
|
+ today.setCompletionRateChangeSymbol(1);
|
|
|
+ today.setAvg(0d);
|
|
|
+ today.setAvgChange(5d);
|
|
|
+ today.setAvgChangeSymbol(1);
|
|
|
+ return today;
|
|
|
+ }else if (today.getTotal() == 0 && yesterday.getTotal() == 0){
|
|
|
+ today.setTotalChange(0d);
|
|
|
+ today.setTotalChangeSymbol(2);
|
|
|
+ today.setMoney(0d);
|
|
|
+ today.setMoneyChange(0d);
|
|
|
+ today.setMoneyChangeSymbol(2);
|
|
|
+ today.setCompletionRate(0d);
|
|
|
+ today.setCompletionRateChange(0d);
|
|
|
+ today.setCompletionRateChangeSymbol(2);
|
|
|
+ today.setAvg(0d);
|
|
|
+ today.setAvgChange(0d);
|
|
|
+ today.setAvgChangeSymbol(2);
|
|
|
+ return today;
|
|
|
+ }else if (today.getTotal() != 0 && yesterday.getTotal() == 0){
|
|
|
+ today.setTotalChange(100d);
|
|
|
+ today.setTotalChangeSymbol(1);
|
|
|
+ today.setMoneyChange(today.getMoney());
|
|
|
+ today.setMoneyChangeSymbol(1);
|
|
|
+ today.setCompletionRateChange(today.getCompletionRate());
|
|
|
+ today.setCompletionRateChangeSymbol(1);
|
|
|
+ today.setAvgChange(today.getAvg());
|
|
|
+ today.setAvgChangeSymbol(1);
|
|
|
+ return today;
|
|
|
+ }else {
|
|
|
+ double totalChange = (today.getTotal() - yesterday.getTotal()) * 100 / yesterday.getTotal();
|
|
|
+ today.setTotalChange(Math.abs(totalChange));
|
|
|
+ today.setTotalChangeSymbol(totalChange > 0 ? 1 : (totalChange == 0 ? 2 : 0));
|
|
|
+ double moneyChange = (today.getMoney() - yesterday.getMoney()) * 100 / yesterday.getMoney();
|
|
|
+ today.setMoneyChange(Math.abs(moneyChange));
|
|
|
+ today.setMoneyChangeSymbol(moneyChange > 0 ? 1 : (moneyChange == 0 ? 2 : 0));
|
|
|
+ double completionRateChange = (today.getCompletionRate() - yesterday.getCompletionRate()) * 100 / yesterday.getCompletionRate();
|
|
|
+ today.setCompletionRateChange(Math.abs(completionRateChange));
|
|
|
+ today.setCompletionRateChangeSymbol(completionRateChange > 0 ? 1 : (completionRateChange == 0 ? 2 : 0));
|
|
|
+ double avg = today.getAvg() - yesterday.getAvg();
|
|
|
+ today.setAvgChange(Math.abs(avg));
|
|
|
+ today.setAvgChangeSymbol(avg > 0 ? 1 : (avg == 0 ? 2 : 0));
|
|
|
+ return today;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ OrderStatisticsVo statistics = orderStatisticsDao.getStatistics(driverUserId, startTime, endTime, 2);
|
|
|
+ return statistics;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<OrderStatisticsVo> getTrend(@Param("driverUserId") Long driverUserId,String choose){
|
|
|
+ if (choose.equals("day")){
|
|
|
+ List<OrderStatisticsVo> trendDay = orderStatisticsDao.getTrendDay(driverUserId);
|
|
|
+ Map<String, OrderStatisticsVo> dataMap = trendDay.stream()
|
|
|
+ .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
|
|
|
+
|
|
|
+ List<OrderStatisticsVo> fullDay = new ArrayList<>();
|
|
|
+ for (int i = 0; i < 24; i++) {
|
|
|
+ String label = String.format("%02d:00", i);
|
|
|
+ OrderStatisticsVo stat = dataMap.getOrDefault(label, new OrderStatisticsVo());
|
|
|
+ stat.setDay(label);
|
|
|
+ stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
|
|
|
+ stat.setMoney((null == stat.getMoney() || stat.getMoney() == 0 )? 0.0 : stat.getMoney());
|
|
|
+ fullDay.add(stat);
|
|
|
+ }
|
|
|
+ return fullDay;
|
|
|
+ }else if (choose.equals("week")){
|
|
|
+ List<OrderStatisticsVo> trendWeek = orderStatisticsDao.getTrendWeek(driverUserId);
|
|
|
+ String[] weekNames = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
|
|
|
+ Map<String, OrderStatisticsVo> dataMap = trendWeek.stream()
|
|
|
+ .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
|
|
|
+
|
|
|
+ List<OrderStatisticsVo> fullWeek = new ArrayList<>();
|
|
|
+ for (int i = 0; i < 7; i++) {
|
|
|
+ String dayName = weekNames[i];
|
|
|
+ OrderStatisticsVo stat = dataMap.getOrDefault(dayName, new OrderStatisticsVo());
|
|
|
+ stat.setDay(dayName);
|
|
|
+ stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
|
|
|
+ stat.setMoney((null == stat.getMoney() || stat.getMoney() == 0 )? 0.0 : stat.getMoney());
|
|
|
+ fullWeek.add(stat);
|
|
|
+ }
|
|
|
+ return fullWeek;
|
|
|
+ }else {
|
|
|
+ LocalDate start = LocalDate.now().withDayOfMonth(1);
|
|
|
+ LocalDate end = LocalDate.now(); // 或改为月末:withDayOfMonth(lengthOfMonth)
|
|
|
+
|
|
|
+ List<OrderStatisticsVo> trendMonth = orderStatisticsDao.getTrendMonth(driverUserId);
|
|
|
+
|
|
|
+ Map<String, OrderStatisticsVo> dataMap = trendMonth.stream()
|
|
|
+ .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
|
|
|
+
|
|
|
+ List<OrderStatisticsVo> result = new ArrayList<>();
|
|
|
+ for (LocalDate date = start; !date.isAfter(end); date = date.plusDays(1)) {
|
|
|
+ OrderStatisticsVo stat = dataMap.getOrDefault(date.format(DateTimeFormatter.ofPattern("YYYY-MM-dd")), new OrderStatisticsVo());
|
|
|
+ stat.setDay(date.format(DateTimeFormatter.ofPattern("YYYY-MM-dd")));
|
|
|
+ stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
|
|
|
+ stat.setMoney((null == stat.getMoney() || stat.getMoney() == 0 )? 0.0 : stat.getMoney());
|
|
|
+ result.add(stat);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public List<OrderStatisticsVo> getYoYandQoQ(Long driverUserId,String choose){
|
|
|
+ //本周
|
|
|
+ List<String> thisWeek = DateUtils.getWeekDays(0);
|
|
|
+ List<OrderStatisticsVo> thisWeekOrders = orderStatisticsDao.getOrders(driverUserId, thisWeek.get(0), thisWeek.get(6));
|
|
|
+
|
|
|
+ if (choose.equals("t")){ //同比
|
|
|
+ //去年本周
|
|
|
+ List<String> lastYearWeekDays = DateUtils.getLastYearWeekDays();
|
|
|
+ List<OrderStatisticsVo> lastYearWeekOrders = orderStatisticsDao.getOrders(driverUserId, lastYearWeekDays.get(0), lastYearWeekDays.get(6));
|
|
|
+
|
|
|
+ String[] weekNames = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
|
|
|
+ Map<String, OrderStatisticsVo> dataMap = thisWeekOrders.stream()
|
|
|
+ .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
|
|
|
+ Map<String, OrderStatisticsVo> lastYearDataMap = lastYearWeekOrders.stream()
|
|
|
+ .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
|
|
|
+ List<OrderStatisticsVo> tongWeek = new ArrayList<>();
|
|
|
+
|
|
|
+ for (int i = 0; i < 7; i++) {
|
|
|
+ String dayName = weekNames[i];
|
|
|
+ OrderStatisticsVo lastStat = lastYearDataMap.getOrDefault(lastYearWeekDays.get(i), new OrderStatisticsVo());
|
|
|
+ lastStat.setDay(dayName);
|
|
|
+ lastStat.setTotal((null == lastStat.getTotal() || lastStat.getTotal() == 0) ? 0 : lastStat.getTotal());
|
|
|
+
|
|
|
+ OrderStatisticsVo stat = dataMap.getOrDefault(thisWeek.get(i), new OrderStatisticsVo());
|
|
|
+ stat.setDay(dayName);
|
|
|
+ stat.setLastTotal(lastStat.getTotal());
|
|
|
+ stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
|
|
|
+
|
|
|
+ tongWeek.add(stat);
|
|
|
+ }
|
|
|
+ return tongWeek;
|
|
|
+ }else if (choose.equals("h")){ //环比
|
|
|
+ //上周
|
|
|
+ List<String> lastWeek = DateUtils.getWeekDays(-1);
|
|
|
+ List<OrderStatisticsVo> lastWeekOrders = orderStatisticsDao.getOrders(driverUserId, lastWeek.get(0), lastWeek.get(6));
|
|
|
+
|
|
|
+ //环比 本周与上周比
|
|
|
+ String[] weekNames = {"周一", "周二", "周三", "周四", "周五", "周六", "周日"};
|
|
|
+ Map<String, OrderStatisticsVo> dataMap = thisWeekOrders.stream()
|
|
|
+ .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
|
|
|
+ Map<String, OrderStatisticsVo> lastDataMap = lastWeekOrders.stream()
|
|
|
+ .collect(Collectors.toMap(OrderStatisticsVo::getDay, stat -> stat));
|
|
|
+ List<OrderStatisticsVo> huanWeek = new ArrayList<>();
|
|
|
+ for (int i = 0; i < 7; i++) {
|
|
|
+ String dayName = weekNames[i];
|
|
|
+ OrderStatisticsVo lastStat = lastDataMap.getOrDefault(lastWeek.get(i), new OrderStatisticsVo());
|
|
|
+ lastStat.setDay(dayName);
|
|
|
+ lastStat.setTotal((null == lastStat.getTotal() || lastStat.getTotal() == 0) ? 0 : lastStat.getTotal());
|
|
|
+
|
|
|
+ OrderStatisticsVo stat = dataMap.getOrDefault(thisWeek.get(i), new OrderStatisticsVo());
|
|
|
+ stat.setDay(dayName);
|
|
|
+ stat.setLastTotal(lastStat.getTotal());
|
|
|
+ stat.setTotal((null == stat.getTotal() || stat.getTotal() == 0) ? 0 : stat.getTotal());
|
|
|
+
|
|
|
+ huanWeek.add(stat);
|
|
|
+ }
|
|
|
+ return huanWeek;
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+}
|