Explorar el Código

feat:增加首页图表统计数据(根据年份查询店铺订单总金额)

huangjinliang hace 1 semana
padre
commit
29256ce0e1

+ 22 - 0
fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ext/EchartsBarResponse.java

@@ -0,0 +1,22 @@
+package com.fuint.common.dto.ext;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.util.List;
+
+// ECharts 响应格式 DTO
+@Data
+public class EchartsBarResponse {
+    private List<String> years;        // xAxis.data: ['2012', '2013', ...]
+    private List<SeriesData> series;   // 各店铺数据系列
+
+    public EchartsBarResponse(List<String> dates, List<SeriesData> series) {
+        this.years = dates;
+        this.series = series;
+    }
+
+    public EchartsBarResponse() {
+
+    }
+}

+ 16 - 0
fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ext/SeriesData.java

@@ -0,0 +1,16 @@
+package com.fuint.common.dto.ext;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+// 系列数据
+@Data
+@AllArgsConstructor
+public class SeriesData {
+    private String name;     // 店铺名称(如Forest)
+    private String type;     // 图表类型(如bar)
+    private List<BigDecimal> data;  // 各年度数据
+}

+ 14 - 0
fuintBackend/fuint-application/src/main/java/com/fuint/common/dto/ext/YearlyRevenueDTO.java

@@ -0,0 +1,14 @@
+package com.fuint.common.dto.ext;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+// 年度店铺营收 DTO
+@Data
+public class YearlyRevenueDTO {
+    private String storeName;
+    private LocalDate date;  // 使用 LocalDate 存储日期
+    private BigDecimal totalAmount;
+}

+ 5 - 0
fuintBackend/fuint-application/src/main/java/com/fuint/common/service/OrderService.java

@@ -3,6 +3,7 @@ package com.fuint.common.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fuint.common.dto.UserOrderDto;
 import com.fuint.common.dto.OrderDto;
+import com.fuint.common.dto.ext.EchartsBarResponse;
 import com.fuint.common.param.OrderListParam;
 import com.fuint.common.param.SettlementParam;
 import com.fuint.framework.exception.BusinessCheckException;
@@ -248,4 +249,8 @@ public interface OrderService extends IService<MtOrder> {
      * @return
      * */
     List<MtOrder> getTobeCommissionOrderList(String dateTime) throws BusinessCheckException;
+
+
+
+    EchartsBarResponse getYearlyRevenue(Integer startYear, Integer endYear);
 }

+ 58 - 1
fuintBackend/fuint-application/src/main/java/com/fuint/common/service/impl/OrderServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fuint.common.Constants;
 import com.fuint.common.dto.*;
+import com.fuint.common.dto.ext.*;
 import com.fuint.common.enums.*;
 import com.fuint.common.param.OrderListParam;
 import com.fuint.common.param.SettlementParam;
@@ -15,6 +16,7 @@ import com.fuint.framework.annoation.OperationServiceLog;
 import com.fuint.framework.exception.BusinessCheckException;
 import com.fuint.framework.pagination.PaginationResponse;
 import com.fuint.framework.web.ResponseObject;
+import com.fuint.repository.bean.RevenueResult;
 import com.fuint.repository.mapper.*;
 import com.fuint.repository.model.*;
 import com.fuint.utils.PropertiesUtil;
@@ -35,8 +37,10 @@ import weixin.popular.util.JsonUtil;
 
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
+import java.time.LocalDate;
 import java.util.*;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * 订单接口实现类
@@ -2321,4 +2325,57 @@ public class OrderServiceImpl extends ServiceImpl<MtOrderMapper, MtOrder> implem
     public List<MtOrder> getTobeCommissionOrderList(String dateTime) {
         return mtOrderMapper.getTobeCommissionOrderList(dateTime);
     }
-}
+
+    @Override
+    public EchartsBarResponse getYearlyRevenue(Integer startYear, Integer endYear) {
+        // 1. 查询数据库获取原始数据
+        List<RevenueResult> dbData = mtOrderMapper.selectYearlyRevenue(startYear, endYear);
+
+        // 2. 提取所有年份(确保连续)
+        List<String> years = IntStream.rangeClosed(startYear, endYear)
+                .mapToObj(String::valueOf)
+                .collect(Collectors.toList());
+
+        // 3. 按店铺分组并填充缺失年份数据
+        Map<String, Map<Integer, BigDecimal>> storeYearMap = new HashMap<>();
+
+        // 初始化所有店铺的年度金额为0
+        List<String> allStores = dbData.stream()
+                .map( RevenueResult::getStoreName)
+                .distinct()
+                .collect(Collectors.toList());
+        allStores.forEach(store -> {
+            Map<Integer, BigDecimal> yearAmount = new HashMap<>();
+            IntStream.rangeClosed(startYear, endYear)
+                    .forEach(year -> yearAmount.put(year, BigDecimal.ZERO));
+            storeYearMap.put(store, yearAmount);
+        });
+
+        // 填充实际数据
+        dbData.forEach(dto -> {
+            storeYearMap.get(dto.getStoreName())
+                    .put( dto.getYear(), dto.getTotalAmount());
+        });
+
+        // 4. 转换为 ECharts 系列格式
+        List<SeriesData> series = allStores.stream()
+                .map(store -> {
+                    List<BigDecimal> data = years.stream()
+                            .map(yearStr -> {
+                                int year = Integer.parseInt(yearStr);
+                                return storeYearMap.get(store).get(year);
+                            })
+                            .collect(Collectors.toList());
+                    return new SeriesData(store, "bar", data);
+                })
+                .collect(Collectors.toList());
+
+        // 5. 构建响应对象
+        EchartsBarResponse response = new EchartsBarResponse();
+        response.setYears(years);
+        response.setSeries(series);
+        return response;
+    }
+    }
+
+

+ 12 - 4
fuintBackend/fuint-application/src/main/java/com/fuint/module/backendApi/controller/BackendHomeController.java

@@ -2,6 +2,7 @@ package com.fuint.module.backendApi.controller;
 
 import com.fuint.common.dto.AccountInfo;
 import com.fuint.common.dto.UserOrderDto;
+import com.fuint.common.dto.ext.*;
 import com.fuint.common.service.AccountService;
 import com.fuint.common.service.MemberService;
 import com.fuint.common.service.OrderService;
@@ -19,10 +20,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletRequest;
 import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 
 /**
  * 首页控制器
@@ -184,4 +182,14 @@ public class BackendHomeController extends BaseController {
 
         return getSuccessResult(result);
     }
+
+
+    @GetMapping("/yearly")
+    public ResponseObject getYearlyRevenue(
+            @RequestParam Integer startYear,
+            @RequestParam Integer endYear
+    ) {
+        EchartsBarResponse data = orderService.getYearlyRevenue(startYear, endYear);
+        return getSuccessResult(data);
+    }
 }

+ 19 - 0
fuintBackend/fuint-repository/src/main/java/com/fuint/repository/bean/RevenueResult.java

@@ -0,0 +1,19 @@
+package com.fuint.repository.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@AllArgsConstructor
+public class RevenueResult {
+ /*   private String storeName;
+    private BigDecimal totalAmount;*/
+    private String storeName;
+    private Integer year;
+    private BigDecimal totalAmount;
+
+
+}

+ 17 - 0
fuintBackend/fuint-repository/src/main/java/com/fuint/repository/mapper/MtOrderMapper.java

@@ -1,11 +1,15 @@
 package com.fuint.repository.mapper;
 
+import com.fuint.repository.bean.RevenueResult;
 import com.fuint.repository.model.MtOrder;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * 订单表 Mapper 接口
@@ -45,4 +49,17 @@ public interface MtOrderMapper extends BaseMapper<MtOrder> {
 
     List<MtOrder> getTobeCommissionOrderList(@Param("dateTime") String dateTime);
 
+    @Select("SELECT " +
+            "  s.name AS storeName, " +
+            "  YEAR(o.pay_time) AS year, " +
+            "  COALESCE(SUM(o.amount), 0) AS totalAmount " +
+            "FROM mt_store s " +
+            "LEFT JOIN mt_order o ON s.id = o.store_id " +
+            "  AND YEAR(o.pay_time) BETWEEN #{startYear} AND #{endYear} " +
+            "GROUP BY s.id, YEAR(o.pay_time) " +
+                    "ORDER BY year")
+    List<RevenueResult> selectYearlyRevenue(
+            @Param("startYear") Integer startYear,
+            @Param("endYear") Integer endYear
+    );
 }