| | |
| | | import cn.hutool.poi.excel.ExcelReader; |
| | | import cn.hutool.poi.excel.ExcelUtil; |
| | | import cn.hutool.poi.excel.ExcelWriter; |
| | | import cn.lili.base.Result; |
| | | import cn.lili.common.enums.ClientTypeEnum; |
| | | import cn.lili.common.enums.PromotionTypeEnum; |
| | | import cn.lili.common.enums.ResultCode; |
| | |
| | | import cn.lili.modules.promotion.entity.dos.Pintuan; |
| | | import cn.lili.modules.promotion.service.CouponService; |
| | | import cn.lili.modules.promotion.service.PintuanService; |
| | | import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam; |
| | | import cn.lili.modules.store.entity.dto.StoreDeliverGoodsAddressDTO; |
| | | import cn.lili.modules.store.service.StoreDetailService; |
| | | import cn.lili.modules.system.aspect.annotation.SystemLogPoint; |
| | |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.baomidou.mybatisplus.core.metadata.IPage; |
| | | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
| | | import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import io.reactivex.rxjava3.core.Maybe; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.poi.ss.usermodel.Cell; |
| | | import org.apache.poi.ss.usermodel.Row; |
| | |
| | | import java.io.InputStream; |
| | | import java.math.BigDecimal; |
| | | import java.net.URLEncoder; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.util.*; |
| | | import java.util.concurrent.TimeUnit; |
| | | import java.util.stream.Collectors; |
| | |
| | | return order; |
| | | } |
| | | |
| | | @Override |
| | | public Result getOrderCount(StatisticsQueryParam queryParam) { |
| | | Date startTime = null; |
| | | Date endTime = new Date(); // 结束时间默认是当前时间 |
| | | List<String> dateList = new ArrayList<>(); |
| | | |
| | | Calendar calendar = Calendar.getInstance(); // 用于日期计算的日历实例 |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | int days = 0; |
| | | switch (queryParam.getSearchType()) { |
| | | case "TODAY": |
| | | // 今天:从今天0点到现在 |
| | | calendar.setTime(new Date()); // 重置为当前时间 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); // 小时设为0(24小时制) |
| | | calendar.set(Calendar.MINUTE, 0); // 分钟设为0 |
| | | calendar.set(Calendar.SECOND, 0); // 秒设为0 |
| | | calendar.set(Calendar.MILLISECOND, 0); // 毫秒设为0 |
| | | startTime = calendar.getTime(); // 得到今天0点的Date对象 |
| | | dateList.add(sdf.format(startTime)); |
| | | break; |
| | | case "YESTERDAY": |
| | | // 昨天:从昨天0点到昨天23:59:59.999 |
| | | calendar.setTime(new Date()); |
| | | calendar.add(Calendar.DATE, -1); // 日期减1天(变为昨天) |
| | | |
| | | // 设置昨天0点 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | calendar.set(Calendar.MINUTE, 0); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | calendar.set(Calendar.MILLISECOND, 0); |
| | | startTime = calendar.getTime(); |
| | | |
| | | // 设置昨天23:59:59.999 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 23); |
| | | calendar.set(Calendar.MINUTE, 59); |
| | | calendar.set(Calendar.SECOND, 59); |
| | | calendar.set(Calendar.MILLISECOND, 999); |
| | | endTime = calendar.getTime(); |
| | | |
| | | dateList.add(sdf.format(startTime)); |
| | | break; |
| | | case "LAST_SEVEN": |
| | | // 过去七天:从7天前0点到现在(含今天共7天) |
| | | calendar.setTime(new Date()); |
| | | calendar.add(Calendar.DATE, -6); // 日期减6天(7天前的今天) |
| | | |
| | | // 设置7天前0点 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | calendar.set(Calendar.MINUTE, 0); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | calendar.set(Calendar.MILLISECOND, 0); |
| | | startTime = calendar.getTime(); |
| | | |
| | | days = 7; |
| | | // 循环生成7天的日期字符串 |
| | | Calendar tempCalendar = Calendar.getInstance(); |
| | | tempCalendar.setTime(startTime); |
| | | for (int i = 0; i < days; i++) { |
| | | dateList.add(sdf.format(tempCalendar.getTime())); |
| | | tempCalendar.add(Calendar.DATE, 1); // 每天累加1天 |
| | | } |
| | | break; |
| | | case "LAST_THIRTY": |
| | | // 过去30天:从30天前0点到现在(含今天共30天) |
| | | calendar.setTime(new Date()); |
| | | calendar.add(Calendar.DATE, -29); // 日期减29天(30天前的今天) |
| | | |
| | | // 设置30天前0点 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | calendar.set(Calendar.MINUTE, 0); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | calendar.set(Calendar.MILLISECOND, 0); |
| | | startTime = calendar.getTime(); |
| | | |
| | | days = 30; |
| | | // 循环生成30天的日期字符串 |
| | | Calendar tempCalendar30 = Calendar.getInstance(); |
| | | tempCalendar30.setTime(startTime); |
| | | for (int i = 0; i < days; i++) { |
| | | dateList.add(sdf.format(tempCalendar30.getTime())); |
| | | tempCalendar30.add(Calendar.DATE, 1); // 每天累加1天 |
| | | } |
| | | break; |
| | | default: |
| | | return Result.error("不支持的时间范围类型"); |
| | | } |
| | | List<Map<String, Object>> maps = baseMapper.selectOrderCountByDay(startTime,endTime); |
| | | |
| | | Map<String, Long> dayCountMap = maps.stream() |
| | | .collect(Collectors.toMap( |
| | | map -> map.get("day").toString(), // 日期字符串(如2023-09-19) |
| | | map -> Long.valueOf(map.get("count").toString()) // 订单数量 |
| | | )); |
| | | |
| | | List<Long> orderCounts = new ArrayList<>(); |
| | | for (String date : dateList) { |
| | | // 核心:存在则取查询结果,不存在则补0 |
| | | orderCounts.add(dayCountMap.getOrDefault(date, 0L)); |
| | | } |
| | | |
| | | |
| | | return Result.ok().data(orderCounts); |
| | | } |
| | | |
| | | @Override |
| | | public Result getOrderTimePeriod(StatisticsQueryParam queryParam) { |
| | | Date startTime = null; |
| | | Date endTime = new Date(); // 结束时间默认是当前时间 |
| | | List<String> dateList = new ArrayList<>(); |
| | | |
| | | Calendar calendar = Calendar.getInstance(); // 用于日期计算的日历实例 |
| | | for (int i =0;i<=24;i++){ |
| | | dateList.add(i + "点"); |
| | | } |
| | | switch (queryParam.getSearchType()) { |
| | | case "TODAY": |
| | | // 今天:从今天0点到现在 |
| | | calendar.setTime(new Date()); // 重置为当前时间 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); // 小时设为0(24小时制) |
| | | calendar.set(Calendar.MINUTE, 0); // 分钟设为0 |
| | | calendar.set(Calendar.SECOND, 0); // 秒设为0 |
| | | calendar.set(Calendar.MILLISECOND, 0); // 毫秒设为0 |
| | | startTime = calendar.getTime(); // 得到今天0点的Date对象 |
| | | break; |
| | | case "YESTERDAY": |
| | | // 昨天:从昨天0点到昨天23:59:59.999 |
| | | calendar.setTime(new Date()); |
| | | calendar.add(Calendar.DATE, -1); // 日期减1天(变为昨天) |
| | | |
| | | // 设置昨天0点 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | calendar.set(Calendar.MINUTE, 0); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | calendar.set(Calendar.MILLISECOND, 0); |
| | | startTime = calendar.getTime(); |
| | | |
| | | // 设置昨天23:59:59.999 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 23); |
| | | calendar.set(Calendar.MINUTE, 59); |
| | | calendar.set(Calendar.SECOND, 59); |
| | | calendar.set(Calendar.MILLISECOND, 999); |
| | | endTime = calendar.getTime(); |
| | | |
| | | break; |
| | | case "LAST_SEVEN": |
| | | // 过去七天:从7天前0点到现在(含今天共7天) |
| | | calendar.setTime(new Date()); |
| | | calendar.add(Calendar.DATE, -6); // 日期减6天(7天前的今天) |
| | | |
| | | // 设置7天前0点 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | calendar.set(Calendar.MINUTE, 0); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | calendar.set(Calendar.MILLISECOND, 0); |
| | | startTime = calendar.getTime(); |
| | | |
| | | break; |
| | | case "LAST_THIRTY": |
| | | // 过去30天:从30天前0点到现在(含今天共30天) |
| | | calendar.setTime(new Date()); |
| | | calendar.add(Calendar.DATE, -29); // 日期减29天(30天前的今天) |
| | | |
| | | // 设置30天前0点 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | calendar.set(Calendar.MINUTE, 0); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | calendar.set(Calendar.MILLISECOND, 0); |
| | | startTime = calendar.getTime(); |
| | | |
| | | break; |
| | | default: |
| | | return Result.error("不支持的时间范围类型"); |
| | | } |
| | | List<Map<String, Object>> maps = baseMapper.selectOrderTimePeriod(startTime,endTime); |
| | | |
| | | Map<String, Long> dayCountMap = maps.stream() |
| | | .collect(Collectors.toMap( |
| | | map -> map.get("day").toString(), // 日期字符串(如2023-09-19) |
| | | map -> Long.valueOf(map.get("count").toString()) // 订单数量 |
| | | )); |
| | | |
| | | List<Long> orderCounts = new ArrayList<>(); |
| | | for (String date : dateList) { |
| | | // 核心:存在则取查询结果,不存在则补0 |
| | | orderCounts.add(dayCountMap.getOrDefault(date, 0L)); |
| | | } |
| | | |
| | | |
| | | return Result.ok().data(orderCounts); |
| | | } |
| | | |
| | | /** |
| | | * 虚拟成团 |
| | | * |