订单看板

This commit is contained in:
2025-07-22 15:02:01 +08:00
parent c4e0604e80
commit d2183c2da5
12 changed files with 158 additions and 1 deletions

View File

View File

@@ -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();
}
}

View File

@@ -0,0 +1,8 @@
package com.klp.domain.vo;
import lombok.Data;
@Data
public class CustomerRegionVO {
private String region;
private int customerCount;
}

View File

@@ -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<SalesManagerPieVO> salesManagerPie;
private List<ProductRankVO> productRank;
private List<OrderMaterialVO> orderMaterial;
private List<CustomerRegionVO> customerRegion;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -0,0 +1,8 @@
package com.klp.domain.vo;
import lombok.Data;
@Data
public class ProductRankVO {
private String productName;
private double totalSales;
}

View File

@@ -0,0 +1,8 @@
package com.klp.domain.vo;
import lombok.Data;
@Data
public class SalesManagerPieVO {
private String salesManager;
private double totalSales;
}

View File

@@ -0,0 +1,8 @@
package com.klp.domain.vo;
import lombok.Data;
@Data
public class SkuSalesVO {
private String skuName;
private double totalSales;
}

View File

@@ -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<WmsProductMapper, WmsProduct, WmsProductVo> {
// 订单汇总
@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<SalesManagerPieVO> 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<ProductRankVO> 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<OrderMaterialVO> 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<CustomerRegionVO> selectCustomerRegion();
}

View File

@@ -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<Long> ids, Boolean isValid);
DashboardOverviewVO getDashboardOverview();
}

View File

@@ -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;
}
}