From d2183c2da5418a26dda0980794f89ed496c25aca Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Tue, 22 Jul 2025 15:02:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E5=8D=95=E7=9C=8B=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 0 .../klp/controller/WmsProductController.java | 6 +++ .../com/klp/domain/vo/CustomerRegionVO.java | 8 ++++ .../klp/domain/vo/DashboardOverviewVO.java | 13 ++++++ .../com/klp/domain/vo/OrderMaterialVO.java | 10 +++++ .../com/klp/domain/vo/OrderSummaryVO.java | 19 +++++++++ .../java/com/klp/domain/vo/ProductRankVO.java | 8 ++++ .../com/klp/domain/vo/SalesManagerPieVO.java | 8 ++++ .../java/com/klp/domain/vo/SkuSalesVO.java | 8 ++++ .../java/com/klp/mapper/WmsProductMapper.java | 41 ++++++++++++++++++- .../com/klp/service/IWmsProductService.java | 3 ++ .../service/impl/WmsProductServiceImpl.java | 35 ++++++++++++++++ 12 files changed, 158 insertions(+), 1 deletion(-) delete mode 100644 .vscode/settings.json create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/CustomerRegionVO.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/DashboardOverviewVO.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/OrderMaterialVO.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/OrderSummaryVO.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/ProductRankVO.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/SalesManagerPieVO.java create mode 100644 klp-wms/src/main/java/com/klp/domain/vo/SkuSalesVO.java diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index e69de29b..00000000 diff --git a/klp-wms/src/main/java/com/klp/controller/WmsProductController.java b/klp-wms/src/main/java/com/klp/controller/WmsProductController.java index 06d33c92..bf81c5f8 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsProductController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsProductController.java @@ -3,6 +3,7 @@ package com.klp.controller; import java.util.List; import java.util.Arrays; +import com.klp.domain.vo.DashboardOverviewVO; import lombok.RequiredArgsConstructor; import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.*; @@ -97,4 +98,9 @@ public class WmsProductController extends BaseController { @PathVariable Long[] productIds) { return toAjax(iWmsProductService.deleteWithValidByIds(Arrays.asList(productIds), true)); } + + @GetMapping("/dashboard/overview") + public DashboardOverviewVO getDashboardOverview() { + return iWmsProductService.getDashboardOverview(); + } } diff --git a/klp-wms/src/main/java/com/klp/domain/vo/CustomerRegionVO.java b/klp-wms/src/main/java/com/klp/domain/vo/CustomerRegionVO.java new file mode 100644 index 00000000..7517a1e1 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/CustomerRegionVO.java @@ -0,0 +1,8 @@ +package com.klp.domain.vo; + +import lombok.Data; +@Data +public class CustomerRegionVO { + private String region; + private int customerCount; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/DashboardOverviewVO.java b/klp-wms/src/main/java/com/klp/domain/vo/DashboardOverviewVO.java new file mode 100644 index 00000000..10cc8ba5 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/DashboardOverviewVO.java @@ -0,0 +1,13 @@ +package com.klp.domain.vo; + +import lombok.Data; +import java.util.List; + +@Data +public class DashboardOverviewVO { + private OrderSummaryVO orderSummary; + private List salesManagerPie; + private List productRank; + private List orderMaterial; + private List customerRegion; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/OrderMaterialVO.java b/klp-wms/src/main/java/com/klp/domain/vo/OrderMaterialVO.java new file mode 100644 index 00000000..39d6e8d2 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/OrderMaterialVO.java @@ -0,0 +1,10 @@ +package com.klp.domain.vo; + +import lombok.Data; +@Data +public class OrderMaterialVO { + private String materialName; + private double usedCount; + private double stockCount; + private double purchaseCycle; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/OrderSummaryVO.java b/klp-wms/src/main/java/com/klp/domain/vo/OrderSummaryVO.java new file mode 100644 index 00000000..c2a785ef --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/OrderSummaryVO.java @@ -0,0 +1,19 @@ +package com.klp.domain.vo; + +import lombok.Data; +@Data +public class OrderSummaryVO { + private int totalOrderCount; + private int finishedOrderCount; + private double finishedRate; + private int monthFinishedOrderCount; + private double monthFinishedRate; + private int lastMonthTotalOrderCount; + private int lastMonthFinishedOrderCount; + private double lastMonthFinishedRate; + private double totalOrderCountGrowthRate; + private double finishedOrderCountGrowthRate; + private double finishedRateGrowthRate; + private double monthFinishedOrderCountGrowthRate; + private double monthFinishedRateGrowthRate; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/ProductRankVO.java b/klp-wms/src/main/java/com/klp/domain/vo/ProductRankVO.java new file mode 100644 index 00000000..d95f30a0 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/ProductRankVO.java @@ -0,0 +1,8 @@ +package com.klp.domain.vo; + +import lombok.Data; +@Data +public class ProductRankVO { + private String productName; + private double totalSales; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/SalesManagerPieVO.java b/klp-wms/src/main/java/com/klp/domain/vo/SalesManagerPieVO.java new file mode 100644 index 00000000..5868e4ca --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/SalesManagerPieVO.java @@ -0,0 +1,8 @@ +package com.klp.domain.vo; + +import lombok.Data; +@Data +public class SalesManagerPieVO { + private String salesManager; + private double totalSales; +} diff --git a/klp-wms/src/main/java/com/klp/domain/vo/SkuSalesVO.java b/klp-wms/src/main/java/com/klp/domain/vo/SkuSalesVO.java new file mode 100644 index 00000000..f5aa6de9 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/vo/SkuSalesVO.java @@ -0,0 +1,8 @@ +package com.klp.domain.vo; + +import lombok.Data; +@Data +public class SkuSalesVO { + private String skuName; + private double totalSales; +} diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsProductMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsProductMapper.java index 2d19f5ae..2889c405 100644 --- a/klp-wms/src/main/java/com/klp/mapper/WmsProductMapper.java +++ b/klp-wms/src/main/java/com/klp/mapper/WmsProductMapper.java @@ -1,8 +1,11 @@ package com.klp.mapper; import com.klp.domain.WmsProduct; -import com.klp.domain.vo.WmsProductVo; +import com.klp.domain.vo.*; import com.klp.common.core.mapper.BaseMapperPlus; +import org.apache.ibatis.annotations.Select; + +import java.util.List; /** * 产品Mapper接口 @@ -11,5 +14,41 @@ import com.klp.common.core.mapper.BaseMapperPlus; * @date 2025-07-18 */ public interface WmsProductMapper extends BaseMapperPlus { + // 订单汇总 + @Select("SELECT " + + "COUNT(*) AS totalOrderCount, " + + "SUM(CASE WHEN order_status=2 THEN 1 ELSE 0 END) AS finishedOrderCount, " + + "ROUND(SUM(CASE WHEN order_status=2 THEN 1 ELSE 0 END)/COUNT(*), 4) AS finishedRate, " + + "SUM(CASE WHEN order_status=2 AND DATE_FORMAT(create_time, '%Y-%m')=DATE_FORMAT(NOW(), '%Y-%m') THEN 1 ELSE 0 END) AS monthFinishedOrderCount, " + + "ROUND(SUM(CASE WHEN order_status=2 AND DATE_FORMAT(create_time, '%Y-%m')=DATE_FORMAT(NOW(), '%Y-%m') THEN 1 ELSE 0 END)/COUNT(*), 4) AS monthFinishedRate, " + + "(SELECT COUNT(*) FROM wms_order WHERE del_flag=0 AND DATE_FORMAT(create_time, '%Y-%m')=DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m')) AS lastMonthTotalOrderCount, " + + "(SELECT SUM(CASE WHEN order_status=2 THEN 1 ELSE 0 END) FROM wms_order WHERE del_flag=0 AND DATE_FORMAT(create_time, '%Y-%m')=DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m')) AS lastMonthFinishedOrderCount, " + + "(SELECT ROUND(SUM(CASE WHEN order_status=2 THEN 1 ELSE 0 END)/COUNT(*), 4) FROM wms_order WHERE del_flag=0 AND DATE_FORMAT(create_time, '%Y-%m')=DATE_FORMAT(DATE_SUB(NOW(), INTERVAL 1 MONTH), '%Y-%m')) AS lastMonthFinishedRate " + + "FROM wms_order WHERE del_flag=0") + OrderSummaryVO selectOrderSummary(); + // 销售经理饼图 + @Select("SELECT sales_manager, SUM(od.quantity) AS totalSales " + + "FROM wms_order o JOIN wms_order_detail od ON o.order_id = od.order_id " + + "WHERE o.order_status = 2 AND o.del_flag=0 GROUP BY o.sales_manager") + List selectSalesManagerPie(); + + // 产品销量排行 + @Select("SELECT p.product_name, SUM(od.quantity) AS totalSales " + + "FROM wms_order_detail od JOIN wms_product p ON od.product_id = p.product_id " + + "GROUP BY p.product_name ORDER BY totalSales DESC LIMIT 10") + List selectProductRank(); + + // 订单物料分析(只分析库存量和销售销量) + @Select("SELECT p.product_name AS materialName, SUM(od.quantity) AS usedCount, " + + "(SELECT IFNULL(SUM(stock_quantity),0) FROM wms_stock s WHERE s.product_id = p.product_id) AS stockCount, " + + "0 AS purchaseCycle " + + "FROM wms_order_detail od JOIN wms_product p ON od.product_id = p.product_id " + + "GROUP BY p.product_name") + List selectOrderMaterial(); + + // 客户分布热力图 + @Select("SELECT o.customer_name AS region, COUNT(*) AS customerCount " + + "FROM wms_order o WHERE o.del_flag=0 GROUP BY o.customer_name") + List selectCustomerRegion(); } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsProductService.java b/klp-wms/src/main/java/com/klp/service/IWmsProductService.java index c60c9e16..ee6c5cff 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsProductService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsProductService.java @@ -1,6 +1,7 @@ package com.klp.service; import com.klp.domain.WmsProduct; +import com.klp.domain.vo.DashboardOverviewVO; import com.klp.domain.vo.WmsProductVo; import com.klp.domain.bo.WmsProductBo; import com.klp.common.core.page.TableDataInfo; @@ -46,4 +47,6 @@ public interface IWmsProductService { * 校验并批量删除产品信息 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + DashboardOverviewVO getDashboardOverview(); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsProductServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsProductServiceImpl.java index 619afd4a..9d276bc4 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsProductServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsProductServiceImpl.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.klp.common.utils.StringUtils; +import com.klp.domain.vo.DashboardOverviewVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.klp.domain.bo.WmsProductBo; @@ -14,6 +15,7 @@ import com.klp.domain.vo.WmsProductVo; import com.klp.domain.WmsProduct; import com.klp.mapper.WmsProductMapper; import com.klp.service.IWmsProductService; +import com.klp.domain.vo.OrderSummaryVO; import java.util.List; import java.util.Map; @@ -116,4 +118,37 @@ public class WmsProductServiceImpl implements IWmsProductService { } return baseMapper.deleteBatchIds(ids) > 0; } + + @Override + public DashboardOverviewVO getDashboardOverview() { + DashboardOverviewVO vo = new DashboardOverviewVO(); + OrderSummaryVO summary = baseMapper.selectOrderSummary(); + // 计算增长率 + summary.setTotalOrderCountGrowthRate( + summary.getLastMonthTotalOrderCount() == 0 ? 0 : + (double)(summary.getTotalOrderCount() - summary.getLastMonthTotalOrderCount()) / summary.getLastMonthTotalOrderCount() + ); + summary.setFinishedOrderCountGrowthRate( + summary.getLastMonthFinishedOrderCount() == 0 ? 0 : + (double)(summary.getFinishedOrderCount() - summary.getLastMonthFinishedOrderCount()) / summary.getLastMonthFinishedOrderCount() + ); + summary.setFinishedRateGrowthRate( + summary.getLastMonthFinishedRate() == 0 ? 0 : + (summary.getFinishedRate() - summary.getLastMonthFinishedRate()) / summary.getLastMonthFinishedRate() + ); + summary.setMonthFinishedOrderCountGrowthRate( + summary.getLastMonthFinishedOrderCount() == 0 ? 0 : + (double)(summary.getMonthFinishedOrderCount() - summary.getLastMonthFinishedOrderCount()) / summary.getLastMonthFinishedOrderCount() + ); + summary.setMonthFinishedRateGrowthRate( + summary.getLastMonthFinishedRate() == 0 ? 0 : + (summary.getMonthFinishedRate() - summary.getLastMonthFinishedRate()) / summary.getLastMonthFinishedRate() + ); + vo.setOrderSummary(summary); + vo.setSalesManagerPie(baseMapper.selectSalesManagerPie()); + vo.setProductRank(baseMapper.selectProductRank()); + vo.setOrderMaterial(baseMapper.selectOrderMaterial()); + vo.setCustomerRegion(baseMapper.selectCustomerRegion()); + return vo; + } }