From 7aa3389ed873054a07a963ac010190d12e7ce89b Mon Sep 17 00:00:00 2001
From: zxl <763096477@qq.com>
Date: 星期三, 15 十月 2025 14:25:25 +0800
Subject: [PATCH] 统计

---
 framework/src/main/resources/mapper/lmk/orderMapper.xml                               |  105 +++++++++++++++++++++
 framework/src/main/java/cn/lili/modules/lmk/mapper/LmkOrderSelectMapper.java          |   24 ++++
 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 |  114 ++++++++++++++++++++++
 manager-api/src/main/java/cn/lili/controller/lmk/StatisticsController.java            |   10 ++
 framework/src/main/java/cn/lili/modules/order/order/mapper/OrderMapper.java           |   28 -----
 6 files changed, 251 insertions(+), 32 deletions(-)

diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/LmkOrderSelectMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/LmkOrderSelectMapper.java
new file mode 100644
index 0000000..4ea2434
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/LmkOrderSelectMapper.java
@@ -0,0 +1,24 @@
+package cn.lili.modules.lmk.mapper;
+
+import cn.lili.modules.order.order.entity.dos.Order;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+@Mapper
+public interface LmkOrderSelectMapper extends BaseMapper<Order> {
+
+    List<Map<String, Object>> selectOrderCountByDay(Date startTime, Date endTime);
+
+    List<Map<String, Object>>  selectOrderTimePeriod(Date startTime, Date endTime);
+
+    List<Map<String,Object>> selectViewDataCount(Date startTime, Date endTime);
+
+    List<Map<String,Object>> selectProductRepurchase(Date startTime, Date endTime,Integer currentLimit);
+
+
+}
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 238bbc7..4a4c11c 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
@@ -193,32 +193,4 @@
     @Select("select o.* " +
             " FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ")
     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 7b9fb68..e6eb89e 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
@@ -362,4 +362,6 @@
     Result getOrderCount(StatisticsQueryParam queryParam);
 
     Result getOrderTimePeriod(StatisticsQueryParam queryParam);
+
+    Result gerProductRepurchase(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 c3003e8..3dfac11 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
@@ -35,6 +35,7 @@
 import cn.lili.modules.lmk.domain.vo.OrderCountVO;
 import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
 import cn.lili.modules.lmk.enums.general.VirtualGoodsTypeEnum;
+import cn.lili.modules.lmk.mapper.LmkOrderSelectMapper;
 import cn.lili.modules.lmk.service.CouponVirtualService;
 import cn.lili.modules.member.entity.dos.Member;
 import cn.lili.modules.member.entity.dto.MemberAddressDTO;
@@ -113,6 +114,7 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.InputStream;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -227,6 +229,11 @@
 
     @Autowired
     private GoodsSkuService goodsSkuService;
+
+    @Autowired
+    private LmkOrderSelectMapper lmkOrderSelectMapper;
+
+
     private final static  String LOCK_ORDER_NO_MQ="lock_order_no_mq:";
     private final static  String LOCK_EDIT_ORDER_ADDRESS="lock_edit_order_address:";
     private final static  String LOCK_COUPON_CARD="lock_coupon_card:";
@@ -1399,7 +1406,7 @@
             }
         }
 
-        List<Map<String, Object>> maps = baseMapper.selectOrderCountByDay(startTime,endTime);
+        List<Map<String, Object>> maps = lmkOrderSelectMapper.selectOrderCountByDay(startTime,endTime);
 
         Map<String, Long> dayCountMap = maps.stream()
                 .collect(Collectors.toMap(
@@ -1494,15 +1501,17 @@
 
 
 
-        List<Map<String, Object>> maps = baseMapper.selectOrderTimePeriod(startTime,endTime);
-
+        List<Map<String, Object>> maps = lmkOrderSelectMapper.selectOrderTimePeriod(startTime,endTime);
+        List<Map<String,Object>> countMap = lmkOrderSelectMapper.selectViewDataCount(startTime,endTime);
         Map<String, Long> countByDayHour = maps.stream()
                 .collect(Collectors.toMap(
                         map -> map.get("hour").toString(),
                         map -> Long.valueOf(map.get("count").toString()),
                         Long::sum  // 濡傛灉鏈夐噸澶嶏紝绱姞count
                 ));
-
+        System.out.println("鎵撳嵃璁板綍---------------------------------------");
+        System.out.println(countMap);
+        System.out.println("---------------------------------------");
         // 閬嶅巻鏌ョ湅缁撴灉
         List<Long> countList = new ArrayList<>();
         for (int i = 0; i < 24; i++) {
@@ -1520,6 +1529,103 @@
         return Result.ok().data(map);
     }
 
+    @Override
+    public Result gerProductRepurchase(StatisticsQueryParam queryParam) {
+        Date startTime = null;
+        Date endTime = new Date(); // 缁撴潫鏃堕棿榛樿鏄綋鍓嶆椂闂�
+
+        Calendar calendar = Calendar.getInstance(); // 鐢ㄤ簬鏃ユ湡璁$畻鐨勬棩鍘嗗疄渚�
+
+        if (queryParam.getYear() != null && queryParam.getMonth() != null) {
+            Date[] dates =CommonUtil.getMonthStartAndEnd(queryParam.getYear(),queryParam.getMonth());
+            startTime = dates[0];
+            endTime = dates[1];
+        }else{
+            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 = lmkOrderSelectMapper.selectProductRepurchase(startTime,endTime,queryParam.getCurrentLimit());
+        List<String> goodsData = new ArrayList<>();
+        List<BigDecimal> rateData = new ArrayList<>();
+
+        // 閬嶅巻缁撴灉闆嗭紝鎻愬彇鏁版嵁鍒伴泦鍚�
+        for (Map<String, Object> map : maps) {
+            // 鎻愬彇鍟嗗搧鍚嶏紙娉ㄦ剰锛氶敭鏄痳esultMap涓畾涔夌殑property鍊�"goodsName"锛�
+            if (Objects.nonNull(map.get("goodsName"))) {
+                String goodsName = map.get("goodsName").toString();
+                goodsData.add(goodsName);
+            }
+
+            // 鎻愬彇澶嶈喘鐜囷紙澶嶈喘鐜囬�氬父鏄暟瀛楃被鍨嬶紝杩欓噷鐢˙igDecimal鎺ユ敹锛�
+            if (Objects.nonNull(map.get("repurchaseRate"))) {
+                // 杞崲涓築igDecimal锛堟牴鎹疄闄呯被鍨嬭皟鏁达紝涔熷彲鑳芥槸Double绛夛級
+                BigDecimal rate = new BigDecimal(map.get("repurchaseRate").toString()).setScale(2, RoundingMode.HALF_UP);
+                rateData.add(rate);
+            }
+        }
+        Map<String,Object> map = new HashMap<>();
+        map.put("goodsData",goodsData);
+        map.put("rateData",rateData);
+
+        return Result.ok().data(map);
+    }
+
     /**
      * 铏氭嫙鎴愬洟
      *
diff --git a/framework/src/main/resources/mapper/lmk/orderMapper.xml b/framework/src/main/resources/mapper/lmk/orderMapper.xml
new file mode 100644
index 0000000..690d8fe
--- /dev/null
+++ b/framework/src/main/resources/mapper/lmk/orderMapper.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.lili.modules.lmk.mapper.LmkOrderSelectMapper">
+    <resultMap id="OrderCountByDayMap" type="java.util.Map">
+        <result column="day" property="day" />
+        <result column="count" property="count"/>
+    </resultMap>
+
+    <resultMap id="orderTimePeriod" type="java.util.Map">
+        <result column="day" property="day" />
+        <result column="hour" property="hour"/>
+    </resultMap>
+
+    <resultMap id="productRepurchase" type="java.util.Map">
+        <result column="goods_name" property="goodsName"/>
+        <result column="repurchase_rate_percent" property="repurchaseRate"/>
+    </resultMap>
+
+    <resultMap id="viewDataCount" type="java.util.Map">
+        <result column="day" property="day" />
+        <result column="hour" property="hour"/>
+        <result column="count" property="count"/>
+    </resultMap>
+
+    <select id="selectOrderCountByDay"  resultMap="OrderCountByDayMap">
+        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
+    </select>
+
+    <select id="selectOrderTimePeriod" resultMap="orderTimePeriod">
+        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
+    </select>
+    <select id="selectViewDataCount" resultMap="">
+        SELECT
+            DATE(LAR.create_time) AS day,
+            HOUR(LAR.create_time) AS hour,
+            COUNT(LAR.id) AS count
+        FROM lmk_action_record LAR
+        where LAR.delete_flag = 0
+          AND LAR.page_status = 'JOIN'
+        GROUP BY day, hour
+        ORDER BY day, hour;
+    </select>
+<!--buyer_count璐拱浜烘暟  buy_times鎬昏喘涔版鏁�  repurchase_buyer_count 澶嶈喘浜烘暟-->
+    <select id="selectProductRepurchase"  resultMap="productRepurchase">
+        SELECT
+            t.goods_name,
+            t.total_users AS buyer_count,
+            t.total_buy_times AS buy_times,
+            t.repurchase_users AS repurchase_buyer_count,
+            ROUND(
+                IFNULL(t.repurchase_users / t.total_users, 0) * 100,
+                2
+            ) AS repurchase_rate_percent
+        FROM (
+                 SELECT
+                     goods_id,
+                     goods_name,
+                     COUNT(DISTINCT member_id) AS total_users,
+                     SUM(user_buy_counts.buy_count) AS total_buy_times,
+                     SUM(CASE WHEN buy_count >= 2 THEN 1 ELSE 0 END) AS repurchase_users
+                 FROM (
+                          SELECT
+                              i.goods_id,
+                              i.goods_name,
+                              o.member_id,
+                              COUNT(DISTINCT o.sn) AS buy_count
+                          FROM li_order_item i
+                              INNER JOIN li_order o ON i.order_sn = o.sn
+                          WHERE
+                              o.order_status = 'COMPLETED'
+                            AND o.delete_flag = 0
+                            AND i.delete_flag = 0
+                            AND o.member_id IS NOT NULL
+                            AND o.create_time >= #{startTime}
+                            AND o.create_time &lt;= #{endTime}
+                          GROUP BY i.goods_id, i.goods_name, o.member_id
+                      ) AS user_buy_counts
+                 GROUP BY goods_id, goods_name
+             ) AS t
+        ORDER BY repurchase_rate_percent DESC
+        LIMIT #{currentLimit};
+    </select>
+
+</mapper>
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 0de0d3e..60e84be 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
@@ -106,4 +106,14 @@
         return orderService.getOrderTimePeriod(queryParam);
 
     }
+
+    /**
+     * 鍟嗗搧澶嶈喘鐜�
+     * @param queryParam
+     * @return
+     */
+    @GetMapping("/productRepurchase")
+    public Result gerProductRepurchase(StatisticsQueryParam queryParam){
+        return orderService.gerProductRepurchase(queryParam);
+    }
 }

--
Gitblit v1.8.0