From 672637fa4a4914ec9667cb15f70b67482b8a0e5e Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期四, 25 九月 2025 17:16:42 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/send_coupon' into user_action
---
framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoViewCompletionRateVO.java | 22 ++
framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java | 152 ++++++++++++++++
framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java | 2
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java | 208 +++++++++++++++++++----
framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java | 67 +++++++
framework/src/main/java/cn/lili/modules/statistics/entity/dto/StatisticsQueryParam.java | 6
manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java | 19 ++
framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java | 28 +++
framework/src/main/java/cn/lili/modules/member/service/FootprintService.java | 2
9 files changed, 465 insertions(+), 41 deletions(-)
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoViewCompletionRateVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoViewCompletionRateVO.java
new file mode 100644
index 0000000..6ee9b34
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/VideoViewCompletionRateVO.java
@@ -0,0 +1,22 @@
+package cn.lili.modules.lmk.domain.vo;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * lmk-shop-java
+ *
+ * @author : zxl
+ * @date : 2025-09-25 15:36
+ **/
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class VideoViewCompletionRateVO {
+ private String complete_rate;
+
+ private Long total_views;
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java b/framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java
index f1897f4..d8af27e 100644
--- a/framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java
+++ b/framework/src/main/java/cn/lili/modules/member/mapper/FootprintMapper.java
@@ -3,6 +3,12 @@
import cn.lili.modules.member.entity.dos.FootPrint;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Delete;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
/**
* 娴忚鍘嗗彶鏁版嵁澶勭悊灞�
@@ -32,4 +38,65 @@
"WHERE li_foot_print.member_id = ${memberId} AND latest_footprints.id IS NULL; ")
void deleteLastFootPrint(String memberId);
+
+ @Select("SELECT " +
+ "lfp.ref_id AS GoodsId, " +
+ "lg.goods_name AS GoodsName, "+
+ "COUNT(*) AS view_count " +
+ "FROM li_foot_print lfp " +
+ "LEFT JOIN li_goods lg ON lfp.ref_id = lg.id " +
+ "WHERE lfp.delete_flag = 0 " +
+ "AND lfp.create_time BETWEEN #{startTime} AND #{endTime} " +
+ "AND lfp.view_type = 'goods' " +
+ "AND lg.goods_name is not null " +
+ "GROUP BY lfp.ref_id " + // 鎸夊晢鍝両D鍒嗙粍
+ "ORDER BY view_count DESC " +
+ "LIMIT #{currentLimit}"
+ )
+ List<Map<String,Object>> selectViewAndCompletionRateCountByDay(Date startTime,
+ Date endTime,
+ Integer currentLimit);
+
+ /**
+ * 鎸夎棰戠淮搴︾粺璁★細姣忎釜瑙嗛鐨勬�绘祻瑙堟暟鍜屽畬鎾巼
+ * @param startTime 寮�濮嬫椂闂�
+ * @param endTime 缁撴潫鏃堕棿
+ * @return 鍖呭惈瑙嗛ID銆佸悕绉般�佹�绘祻瑙堟暟銆佸畬鎾巼鐨勫垪琛�
+ */
+ @Select({
+ "SELECT",
+ " lfp.ref_id AS video_id, " +
+ " lmk.title, " +
+ " COUNT(*) AS total_views, " +
+ " ROUND(" +
+ " IF(COUNT(*) = 0, 0," +
+ " (SUM(" +
+ " CASE WHEN ( " +
+ " CAST(lfp.play_at AS DECIMAL(10,3)) >= CAST(lmk.video_duration AS DECIMAL(10,3)) " +
+ " OR " +
+ " CAST(lfp.play_at AS DECIMAL(10,3)) / CAST(lmk.video_duration AS DECIMAL(10,3)) > 0.9 " +
+ " ) THEN 1 " +
+ " ELSE 0 " +
+ " END " +
+ " ) / COUNT(*)) * 100 " +
+ " ), 2 " +
+ " ) AS complete_rate " +
+ "FROM li_foot_print lfp" +
+ " LEFT JOIN lmk_video lmk ON lfp.ref_id = lmk.id " + // 鎸夊疄闄呭叧鑱斿瓧娈佃皟鏁�
+ "WHERE " +
+ " lfp.delete_flag = 0",
+ " AND lfp.view_type = 'video' " +// 鍙粺璁¤棰戠被鍨�
+ " AND lfp.create_time BETWEEN #{startTime} AND #{endTime} " +
+ " AND lmk.video_duration > 0 " +
+ " AND ref_id IS NOT NULL AND lmk.title IS NOT NULL "+
+ "GROUP BY lfp.ref_id "+
+ "ORDER BY total_views DESC " +
+ "LIMIT #{currentLimit}"
+ })
+ List<Map<String, Object>> selectEachVideoStats(
+ Date startTime,
+ Date endTime,
+ Integer currentLimit
+ );
+
}
\ No newline at end of file
diff --git a/framework/src/main/java/cn/lili/modules/member/service/FootprintService.java b/framework/src/main/java/cn/lili/modules/member/service/FootprintService.java
index 8dcc1f9..74673cb 100644
--- a/framework/src/main/java/cn/lili/modules/member/service/FootprintService.java
+++ b/framework/src/main/java/cn/lili/modules/member/service/FootprintService.java
@@ -8,6 +8,7 @@
import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
+import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -75,4 +76,5 @@
*/
long getFootprintNum();
+ Result getViewAndCompletionRateCount(StatisticsQueryParam queryParam);
}
diff --git a/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java b/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java
index b786b99..384a3ce 100644
--- a/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/member/serviceimpl/FootprintServiceImpl.java
@@ -2,19 +2,18 @@
import cn.lili.base.Result;
import cn.lili.common.security.context.UserContext;
+import cn.lili.common.utils.StringUtils;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.lmk.domain.query.FootPrintQuery;
-import cn.lili.modules.lmk.domain.vo.SimpleVideoTagVO;
-import cn.lili.modules.lmk.domain.vo.VideoFootInfoVo;
-import cn.lili.modules.lmk.domain.vo.VideoFootVO;
-import cn.lili.modules.lmk.domain.vo.VideoVO;
+import cn.lili.modules.lmk.domain.vo.*;
import cn.lili.modules.lmk.mapper.VideoMapper;
import cn.lili.modules.member.entity.dos.FootPrint;
import cn.lili.modules.member.entity.dto.FootPrintQueryParams;
import cn.lili.modules.member.mapper.FootprintMapper;
import cn.lili.modules.member.service.FootprintService;
import cn.lili.modules.search.entity.dos.EsGoodsIndex;
+import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
import cn.lili.mybatis.util.PageUtil;
import cn.lili.utils.COSUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -28,6 +27,7 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -168,7 +168,151 @@
return this.count(lambdaQueryWrapper);
}
+ @Override
+ public Result getViewAndCompletionRateCount(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("涓嶆敮鎸佺殑鏃堕棿鑼冨洿绫诲瀷");
+ }
+ if ("goods".equals(queryParam.getCurrentType())){
+ List<Map<String, Object>> maps = baseMapper.selectViewAndCompletionRateCountByDay(startTime, endTime,queryParam.getCurrentLimit());
+ Map<String,Long> viewPrintMap = maps.stream()
+ .collect(Collectors.toMap(
+ map -> {
+ String goodsId = Objects.toString(map.get("GoodsId"), ""); // 绌哄�煎鐞�
+ String goodsName = Objects.toString(map.get("GoodsName"), ""); // 绌哄�煎鐞�
+ return goodsName + " | " + goodsId; // 鐢▅鍒嗛殧锛屾柟渚垮悗缁媶鍒�
+ },
+ map-> Long.valueOf(map.get("view_count").toString()),
+ (existing, replacement) -> existing,
+ LinkedHashMap::new // 鎸囧畾浣跨敤 LinkedHashMap锛屼繚鐣欐彃鍏ラ『搴�
+ ));
+ List<String> yData = new ArrayList<>();
+ List<Long> xData = new ArrayList<>();
+
+ for (Map.Entry<String, Long> entry : viewPrintMap.entrySet()){
+ yData.add(entry.getKey());
+ xData.add(entry.getValue());
+ }
+ Map<String,Object> data = new HashMap<>();
+ data.put("yData", yData);
+ data.put("xData", xData);
+ return Result.ok().data(data);
+ }else{
+ List<Map<String, Object>> maps = baseMapper.selectEachVideoStats(startTime, endTime,queryParam.getCurrentLimit());
+ Map<String, VideoViewCompletionRateVO> viewPrintMap = maps.stream()
+ .collect(Collectors.toMap(
+ map -> {
+ String videoId = Objects.toString(map.get("video_id"), ""); // 绌哄�煎鐞�
+ String videoName = Objects.toString(map.get("title"), ""); // 绌哄�煎鐞�
+ return videoName + " | " + videoId; // 鐢▅鍒嗛殧锛屾柟渚垮悗缁媶鍒�
+ },
+ map-> {
+ VideoViewCompletionRateVO vo = new VideoViewCompletionRateVO();
+ vo.setTotal_views(Long.valueOf(map.get("total_views").toString()));
+ vo.setComplete_rate(map.get("complete_rate").toString());
+ return vo;
+ },
+ (existing, replacement) -> existing,
+ LinkedHashMap::new // 鎸囧畾浣跨敤 LinkedHashMap锛屼繚鐣欐彃鍏ラ『搴�
+ ));
+ List<String> yData = new ArrayList<>();
+ List<Long> xData = new ArrayList<>();
+ List<String> rateData = new ArrayList<>();
+
+ for (Map.Entry<String, VideoViewCompletionRateVO> entry : viewPrintMap.entrySet()){
+ yData.add(entry.getKey());
+ xData.add(entry.getValue().getTotal_views());
+ rateData.add(entry.getValue().getComplete_rate());
+ }
+ Map<String,Object> data = new HashMap<>();
+ data.put("yData", yData);
+ data.put("xData", xData);
+ data.put("rateData", rateData);
+ return Result.ok().data(data);
+ }
+
+ }
}
diff --git a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java
index b300072..185947a 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java
@@ -13,7 +13,9 @@
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
+import java.util.Date;
import java.util.List;
+import java.util.Map;
/**
* 璁㈠崟鏁版嵁澶勭悊灞�
@@ -192,4 +194,30 @@
List<Order> queryListByParams(@Param(Constants.WRAPPER) Wrapper<Order> queryWrapper);
+ @Select("SELECT " +
+ " DATE(create_time) AS day, " +
+ " COUNT(*) AS count " +
+ " FROM" +
+ " li_order o" +
+ " WHERE " +
+ " o.create_time BETWEEN #{startTime} AND #{endTime} " +
+ " GROUP BY" +
+ " day " +
+ " ORDER BY " +
+ " day ASC")
+ List<Map<String, Object>> selectOrderCountByDay(Date startTime, Date endTime);
+
+ @Select("SELECT " +
+ " DATE(create_time) AS day, " +
+ " HOUR(create_time) AS hour," +
+ " COUNT(*) AS count " +
+ " FROM" +
+ " li_order o" +
+ " WHERE " +
+ " o.create_time BETWEEN #{startTime} AND #{endTime} " +
+ " GROUP BY" +
+ " day " +
+ " ORDER BY " +
+ " day , hour ASC")
+ List<Map<String, Object>> selectOrderTimePeriod(Date startTime, Date endTime);
}
\ No newline at end of file
diff --git a/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java b/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java
index 5755e82..7b9fb68 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/service/OrderService.java
@@ -360,4 +360,6 @@
* @return
*/
Result getOrderCount(StatisticsQueryParam queryParam);
+
+ Result getOrderTimePeriod(StatisticsQueryParam queryParam);
}
\ No newline at end of file
diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
index 74673e8..62358bd 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -90,6 +90,7 @@
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;
@@ -112,6 +113,7 @@
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;
@@ -1275,61 +1277,193 @@
@Override
public Result getOrderCount(StatisticsQueryParam queryParam) {
- LocalDateTime startTime = null;
- LocalDateTime endTime = LocalDateTime.now(); // 缁撴潫鏃堕棿榛樿鏄綋鍓嶆椂闂�
- int days = 0;
+ 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鐐瑰埌鐜板湪
- startTime = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
- days = 1;
+ 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
- LocalDate yesterday = LocalDate.now().minusDays(1);
- startTime = LocalDateTime.of(yesterday, LocalTime.MIN);
- endTime = LocalDateTime.of(yesterday, LocalTime.MAX);
- days = 1;
+ // 鏄ㄥぉ锛氫粠鏄ㄥぉ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鐐瑰埌鐜板湪
- startTime = LocalDateTime.of(LocalDate.now().minusDays(6), LocalTime.MIN);
+ // 杩囧幓涓冨ぉ锛氫粠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鐐瑰埌鐜板湪
- startTime = LocalDateTime.of(LocalDate.now().minusDays(29), LocalTime.MIN);
+ // 杩囧幓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);
-// 2. 鏌ヨ璇ユ椂闂磋寖鍥村唴鐨勬瘡鏃ヨ鍗曟暟閲忥紙鎸夋棩鏈熷垎缁勶級
-// LambdaQueryWrapper<Order> queryWrapper = Wrappers.lambdaQuery();
-// queryWrapper.between(Order::getCreateTime, startTime, endTime);
-// // 鎸夋棩鏈熷垎缁勶紙鎻愬彇鏃ユ湡閮ㄥ垎锛�
-//
-// // 鎵ц鏌ヨ锛岃繑鍥炴棩鏈熷拰鏁伴噺鐨勬槧灏勶紙day -> count锛�
-// List<Map<String, Object>> maps = baseMapper.selectMaps(queryWrapper);
-// Map<String, Long> dayCountMap = maps.stream()
-// .collect(Collectors.toMap(
-// map -> map.get("day").toString(), // 鏃ユ湡瀛楃涓诧紙濡�2023-09-19锛�
-// map -> Long.valueOf(map.get("count").toString()) // 璁㈠崟鏁伴噺
-// ));
-//
-// // 3. 鐢熸垚瀹屾暣鐨勬棩鏈熷垪琛紙纭繚鍗充娇鏌愬ぉ娌℃湁璁㈠崟涔熶細杩斿洖0锛�
-// List<Long> orderCounts = new ArrayList<>(days);
-// for (int i = 0; i < days; i++) {
-// // 璁$畻褰撳墠寰幆瀵瑰簲鐨勬棩鏈燂紙浠巗tartTime寮�濮嬬殑绗琲澶╋級
-// LocalDate currentDate = startTime.toLocalDate().plusDays(i);
-// String dateStr = currentDate.toString(); // 杞负yyyy-MM-dd鏍煎紡
-// // 浠庢槧灏勪腑鑾峰彇鏁伴噺锛屾病鏈夊垯涓�0
-// orderCounts.add(dayCountMap.getOrDefault(dateStr, 0L));
-// }
+ Map<String, Long> dayCountMap = maps.stream()
+ .collect(Collectors.toMap(
+ map -> map.get("day").toString(), // 鏃ユ湡瀛楃涓诧紙濡�2023-09-19锛�
+ map -> Long.valueOf(map.get("count").toString()) // 璁㈠崟鏁伴噺
+ ));
- return null;
+ 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);
}
/**
diff --git a/framework/src/main/java/cn/lili/modules/statistics/entity/dto/StatisticsQueryParam.java b/framework/src/main/java/cn/lili/modules/statistics/entity/dto/StatisticsQueryParam.java
index 1afef2c..b29c4c3 100644
--- a/framework/src/main/java/cn/lili/modules/statistics/entity/dto/StatisticsQueryParam.java
+++ b/framework/src/main/java/cn/lili/modules/statistics/entity/dto/StatisticsQueryParam.java
@@ -31,4 +31,10 @@
@ApiModelProperty(value = "搴楅摵ID")
private String storeId;
+ @ApiModelProperty(value = "绫诲瀷锛氬晢鍝乬oods 銆佽棰憊ideo")
+ private String currentType;
+
+ @ApiModelProperty(value = "鏄剧ず鎺掑悕锛�10,20,30")
+ private Integer currentLimit;
+
}
diff --git a/manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java b/manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java
index 54337e4..e2984b3 100644
--- a/manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java
+++ b/manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java
@@ -6,6 +6,7 @@
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.lmk.domain.vo.PvUvVO;
import cn.lili.modules.lmk.enums.general.StatisticsSearchTypeEnum;
+import cn.lili.modules.member.service.FootprintService;
import cn.lili.modules.order.order.service.OrderService;
import cn.lili.modules.statistics.entity.dto.StatisticsQueryParam;
import cn.lili.modules.statistics.entity.vo.PlatformViewVO;
@@ -31,6 +32,8 @@
@RequestMapping("/manager/lmk/statistics")
public class StatisticsController {
private final OrderService orderService;
+
+ private final FootprintService footprintService;
@ApiOperation(value = "鑾峰彇pv銆乽v娴侀噺鏁版嵁 琛ㄥ崟鑾峰彇")
@GetMapping("/pvUv")
@@ -81,4 +84,20 @@
}
+ /**
+ * 瑙嗛/鍟嗗搧 瀹屾挱鐜囧拰娴忚閲忕粺璁�
+ * @param queryParam
+ * @return
+ */
+ @GetMapping("/viewAndCompletionRateCount")
+ public Result getViewAndCompletionRateCount(StatisticsQueryParam queryParam) {
+ return footprintService.getViewAndCompletionRateCount(queryParam);
+ }
+
+
+ @GetMapping("/orderTimePeriod")
+ public Result getOrderTimePeriod(StatisticsQueryParam queryParam) {
+ return orderService.getOrderTimePeriod(queryParam);
+
+ }
}
--
Gitblit v1.8.0