From fddb7b7951238b5c70cee251459f6effb3b42c26 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期一, 30 三月 2026 16:06:13 +0800
Subject: [PATCH] 销售看板统计的新增客户趋势分析

---
 src/main/java/com/ruoyi/home/controller/HomeController.java    |   30 ++++++++++
 src/main/java/com/ruoyi/home/dto/SalesDeliveryDto.java         |   14 ++++
 src/main/java/com/ruoyi/home/dto/SalesTotalDto.java            |   21 +++++++
 src/main/java/com/ruoyi/home/service/HomeService.java          |   10 +++
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java |   86 ++++++++++++++++++++++++++++
 5 files changed, 161 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/home/controller/HomeController.java b/src/main/java/com/ruoyi/home/controller/HomeController.java
index bf4eb14..287194b 100644
--- a/src/main/java/com/ruoyi/home/controller/HomeController.java
+++ b/src/main/java/com/ruoyi/home/controller/HomeController.java
@@ -336,4 +336,34 @@
         return AjaxResult.success(homeService.total());
     }
 
+    @GetMapping("/salesAnalysis")
+    @ApiOperation("閿�鍞粺璁$湅鏉�---閿�閲忓垎鏋愯秼鍔垮浘")
+    public AjaxResult salesAnalysis(SalesDeliveryDto salesDeliveryDto) {
+        return AjaxResult.success(homeService.salesAnalysis(salesDeliveryDto));
+    }
+
+    @GetMapping("/salesRanking")
+    @ApiOperation("閿�鍞粺璁$湅鏉�---閿�閲忔暟鎹�-鎺掑悕鍒嗘瀽")
+    public AjaxResult salesRanking(SalesDeliveryDto salesDeliveryDto) {
+        return AjaxResult.success(homeService.salesRanking(salesDeliveryDto));
+    }
+
+    @GetMapping("/salesAmount")
+    @ApiOperation("閿�鍞粺璁$湅鏉�---閿�鍞噾棰濆垎鏋�")
+    public AjaxResult salesAmount(SalesDeliveryDto salesDeliveryDto) {
+        return AjaxResult.success(homeService.salesAmount(salesDeliveryDto));
+    }
+
+    @GetMapping("/salesDataRanking")
+    @ApiOperation("閿�鍞粺璁$湅鏉�---閿�鍞鏁版嵁-鎺掑悕鍒嗘瀽")
+    public AjaxResult salesDataRanking(SalesDeliveryDto salesDeliveryDto) {
+        return AjaxResult.success(homeService.salesDataRanking(salesDeliveryDto));
+    }
+
+    @GetMapping("/customerTrends")
+    @ApiOperation("閿�鍞粺璁$湅鏉�---鏂板瀹㈡埛瓒嬪娍鍒嗘瀽")
+    public AjaxResult customerTrends(SalesDeliveryDto salesDeliveryDto) {
+        return AjaxResult.success(homeService.customerTrends(salesDeliveryDto));
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/home/dto/SalesDeliveryDto.java b/src/main/java/com/ruoyi/home/dto/SalesDeliveryDto.java
new file mode 100644
index 0000000..4c484f8
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/SalesDeliveryDto.java
@@ -0,0 +1,14 @@
+package com.ruoyi.home.dto;
+
+import lombok.Data;
+
+@Data
+//閿�鍞粺璁$湅鏉跨殑浼犲弬
+public class SalesDeliveryDto {
+
+    //骞�/鏈�
+    private String days;
+
+    //浜у搧绫诲瀷(鐮屽潡/鏉挎潗)
+    private String type;
+}
diff --git a/src/main/java/com/ruoyi/home/dto/SalesTotalDto.java b/src/main/java/com/ruoyi/home/dto/SalesTotalDto.java
new file mode 100644
index 0000000..f6937e9
--- /dev/null
+++ b/src/main/java/com/ruoyi/home/dto/SalesTotalDto.java
@@ -0,0 +1,21 @@
+package com.ruoyi.home.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+
+//閿�鍞尯缁熻
+@Data
+public class SalesTotalDto {
+
+    //鏃堕棿鍧愭爣
+    private List<LocalDate> dates;
+
+    //瀹㈡埛鍖哄煙鍒嗘瀽
+    private List<Map<String,Long>> customerTrends;
+
+
+}
diff --git a/src/main/java/com/ruoyi/home/service/HomeService.java b/src/main/java/com/ruoyi/home/service/HomeService.java
index 0626812..82dc5a6 100644
--- a/src/main/java/com/ruoyi/home/service/HomeService.java
+++ b/src/main/java/com/ruoyi/home/service/HomeService.java
@@ -97,4 +97,14 @@
     List<processDataProductionStatisticsDto> processDataProductionStatistics(Integer type, List<Long> processIds);
 
     Map<String,Long> total();
+
+    String salesAnalysis(SalesDeliveryDto salesDeliveryDto);
+
+    String salesRanking(SalesDeliveryDto salesDeliveryDto);
+
+    String salesAmount(SalesDeliveryDto salesDeliveryDto);
+
+    String salesDataRanking(SalesDeliveryDto salesDeliveryDto);
+
+    SalesTotalDto customerTrends(SalesDeliveryDto salesDeliveryDto);
 }
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index 988804f..e496507 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -2535,4 +2535,90 @@
         map.put("customer",count);
         return map;
     }
+
+    @Override
+    public String salesAnalysis(SalesDeliveryDto salesDeliveryDto) {
+        List<LocalDate> dates = convertDateList(salesDeliveryDto.getDays());
+        return null;
+    }
+
+    @Override
+    public String salesRanking(SalesDeliveryDto salesDeliveryDto) {
+        List<LocalDate> dates = convertDateList(salesDeliveryDto.getDays());
+        return null;
+    }
+
+    @Override
+    public String salesAmount(SalesDeliveryDto salesDeliveryDto) {
+        List<LocalDate> dates = convertDateList(salesDeliveryDto.getDays());
+        return null;
+    }
+
+    @Override
+    public String salesDataRanking(SalesDeliveryDto salesDeliveryDto) {
+        List<LocalDate> dates = convertDateList(salesDeliveryDto.getDays());
+        return null;
+    }
+
+    @Override
+    public SalesTotalDto customerTrends(SalesDeliveryDto salesDeliveryDto) {
+        SalesTotalDto salesTotalDto = new SalesTotalDto();
+        List<LocalDate> dates = convertDateList(salesDeliveryDto.getDays());
+        List<Map<String, Long>> maps = new ArrayList<>();
+        for (LocalDate date : dates) {
+            LocalDate firstDay = date.with(TemporalAdjusters.firstDayOfMonth());
+            LocalDate lastDay = date.with(TemporalAdjusters.lastDayOfMonth());
+            Date startDate = Date.from(firstDay.atStartOfDay(ZoneId.systemDefault()).toInstant());
+            Date endDate = Date.from(lastDay.atTime(23, 59, 59).atZone(ZoneId.systemDefault()).toInstant());
+            List<Customer> customers = customerMapper.selectList(Wrappers.<Customer>lambdaQuery()
+                    .between(Customer::getMaintenanceTime, startDate, endDate));
+            Map<String, Long> regionCountMap = Arrays.stream(AddressRegionEnum.values())
+                    .filter(addressRegionEnum -> addressRegionEnum.getRegionName().equals("SELF_PICKUP"))
+                    .collect(Collectors.toMap(
+                            AddressRegionEnum::getRegionName, // 鍖哄煙鍚嶄綔涓簁ey
+                            enumItem -> 0L                    // 鍒濆鍊煎叏閮ㄤ负0
+                    ));
+            if (!CollectionUtils.isEmpty(customers)) {
+                regionCountMap = customers.stream()
+                        // 璋冪敤鏂规硶灏嗗師濮嬪湴鍧�杞崲涓虹洰鏍囧尯鍩�
+                        .map(customer -> AddressRegionEnum.matchRegion(customer.getCompanyAddress()).getRegionName())
+                        // 杩囨护鎺夎浆鎹㈠け璐�/绌虹殑鍖哄煙锛堝彲閫夛紝鏍规嵁涓氬姟闇�姹傦級
+                        .filter(region -> region != null && !region.isEmpty())
+                        // 鎸夊尯鍩熷垎缁勶紝缁熻姣忎釜鍖哄煙鐨勬暟閲�
+                        .collect(Collectors.groupingBy(
+                                region -> region,       // 鍒嗙粍渚濇嵁锛氳浆鎹㈠悗鐨勫尯鍩�
+                                Collectors.counting()   // 璁℃暟
+                        ));
+            }
+            regionCountMap.put("ALLIN",customers.stream().count());
+            maps.add(regionCountMap);
+        }
+        salesTotalDto.setDates(dates);
+        salesTotalDto.setCustomerTrends(maps);
+        return salesTotalDto;
+    }
+
+    /**
+     * 鏍规嵁鍓嶇浼犲弬 骞�/鏈� 杞崲涓哄搴擫ocalDate鍒楄〃
+     * @param days 鍓嶇鍙傛暟锛�"骞�" / "鏈�"
+     * @return List<LocalDate>
+     */
+    public static List<LocalDate> convertDateList(String days) {
+        List<LocalDate> resultList = new ArrayList<>();
+        LocalDate now = LocalDate.now();
+        int currentYear = now.getYear();
+
+        if ("骞�".equals(days)) {
+            // 闇�姹傦細杩�5骞� 鈫� 姣忓勾鐨� 1鏈�1鏃�
+            for (int i = 0; i < 5; i++) {
+                resultList.add(LocalDate.of(currentYear - i, 1, 1));
+            }
+        } else if ("鏈�".equals(days)) {
+            // 闇�姹傦細褰撳勾12涓湀 鈫� 姣忔湀1鏃�
+            for (int month = 1; month <= 12; month++) {
+                resultList.add(LocalDate.of(currentYear, month, 1));
+            }
+        }
+        return resultList;
+    }
 }

--
Gitblit v1.9.3