From ca6378961df6d8723d40868917f9e97bcb80b76a Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Fri, 24 Oct 2025 17:25:13 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B6=85=E5=B8=82?= =?UTF-8?q?=E6=8A=A5=E8=A1=A8quantity=E8=B4=9F=E6=95=B0=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E7=9A=84=E7=BB=9F=E8=AE=A1=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supermarket/dto/StockWarnQueryDTO.java | 1 + .../vo/mall/MallProductSkuAppVo.java | 1 + .../service/impl/SalesReportServiceImpl.java | 17 ++++- .../mapper/InventoryReportMapper.xml | 56 +++++++-------- .../resources/mapper/ProfitReportMapper.xml | 72 +++++++++---------- .../resources/mapper/SalesReportMapper.xml | 34 ++++----- 6 files changed, 98 insertions(+), 83 deletions(-) diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/StockWarnQueryDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/StockWarnQueryDTO.java index 3821e52d7..91a321431 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/StockWarnQueryDTO.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/StockWarnQueryDTO.java @@ -44,3 +44,4 @@ public class StockWarnQueryDTO { private Long categoryId; } + diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/mall/MallProductSkuAppVo.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/mall/MallProductSkuAppVo.java index 43c8b20e7..06f83f888 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/mall/MallProductSkuAppVo.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/mall/MallProductSkuAppVo.java @@ -70,3 +70,4 @@ public class MallProductSkuAppVo { private String status; } + diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SalesReportServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SalesReportServiceImpl.java index b4f5946b5..dea5be535 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SalesReportServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SalesReportServiceImpl.java @@ -29,8 +29,21 @@ public class SalesReportServiceImpl implements SalesReportService { @Override public Page page(Page page, SalesReportQueryDTO queryDTO) { - log.info("分页查询销售报表,查询条件:{}", queryDTO); - return salesReportMapper.selectSalesReportPage(page, queryDTO, DataScope.of()); + log.info("========== 销售报表查询参数 =========="); + log.info("分页参数 - current: {}, size: {}", page.getCurrent(), page.getSize()); + log.info("查询条件 - productName: {}", queryDTO != null ? queryDTO.getProductName() : null); + log.info("查询条件 - productCode: {}", queryDTO != null ? queryDTO.getProductCode() : null); + log.info("查询条件 - categoryId: {}", queryDTO != null ? queryDTO.getCategoryId() : null); + log.info("查询条件 - startDate: {}", queryDTO != null ? queryDTO.getStartDate() : null); + log.info("查询条件 - endDate: {}", queryDTO != null ? queryDTO.getEndDate() : null); + log.info("查询条件 - sortBy: {}", queryDTO != null ? queryDTO.getSortBy() : null); + + Page result = salesReportMapper.selectSalesReportPage(page, queryDTO, DataScope.of()); + + log.info("查询结果数量: {} / 总数: {}", result.getRecords().size(), result.getTotal()); + log.info("======================================"); + + return result; } @Override diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/InventoryReportMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/InventoryReportMapper.xml index 71de46520..20133f11b 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/InventoryReportMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/InventoryReportMapper.xml @@ -57,82 +57,82 @@ base.purchase_price / 100.0 AS purchase_price, base.retail_price / 100.0 AS retail_price, COALESCE(SUM(CASE WHEN r.inventory_type = '3' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS purchase_in_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '3' THEN item.total_amount END), 0) / 100.0 AS purchase_in_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '3' THEN item.total_amount END), 0)) / 100.0 AS purchase_in_amount, COALESCE(SUM(CASE WHEN r.inventory_type = '4' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS purchase_return_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '4' THEN item.total_amount END), 0) / 100.0 AS purchase_return_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '4' THEN item.total_amount END), 0)) / 100.0 AS purchase_return_amount, COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS sales_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 AS sales_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 AS sales_amount, COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS sales_return_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS sales_return_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS sales_return_amount, COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS actual_sales_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS actual_sales_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS actual_sales_amount, (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0)) * COALESCE(base.purchase_price / 100.0, 0) AS sales_cost, COALESCE(stock.current_stock, 0) AS closing_qty, COALESCE(stock.current_stock, 0) * COALESCE(base.purchase_price / 100.0, 0) AS closing_amount, COALESCE(stock.current_stock, 0) * COALESCE(base.retail_price / 100.0, 0) AS closing_retail_amount, - (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0) + (ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0) - ((COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0)) * COALESCE(base.purchase_price / 100.0, 0)) AS gross_profit, MIN(CASE WHEN r.inventory_type = '3' THEN r.inventory_date END) AS first_purchase_date, COALESCE(stock.base_stock, 0) AS opening_qty, diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ProfitReportMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ProfitReportMapper.xml index 21a4609ea..6cd106768 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ProfitReportMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/ProfitReportMapper.xml @@ -39,98 +39,98 @@ base.spec AS spec, base.unit AS unit, COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS sales_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS sales_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS sales_amount, COALESCE(base.purchase_price / 100.0, 0) AS cost_price, CASE WHEN (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0)) > 0 - THEN (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0) + THEN (ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0) / (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0)) ELSE 0 END AS sales_price, (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0)) * COALESCE(base.purchase_price / 100.0, 0) AS sales_cost, - (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0) + (ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0) - ((COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0)) * COALESCE(base.purchase_price / 100.0, 0)) AS gross_profit, - CASE WHEN (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0) > 0 - THEN ((COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0) + CASE WHEN (ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0) > 0 + THEN ((ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0) - ((COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0)) * COALESCE(base.purchase_price / 100.0, 0))) - / (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0) * 100 + / (ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0) * 100 ELSE 0 END AS profit_margin, COUNT(DISTINCT CASE WHEN r.inventory_type IN ('5', '6') THEN r.id END) AS sales_count diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SalesReportMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SalesReportMapper.xml index f5698c744..3928d33e2 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SalesReportMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SalesReportMapper.xml @@ -36,50 +36,50 @@ base.spec AS spec, base.unit AS unit, COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS sales_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 AS sales_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 AS sales_amount, COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS return_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS return_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS return_amount, COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) AS actual_sales_qty, - COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 - - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS actual_sales_amount, + ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 + - ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS actual_sales_amount, CASE WHEN COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) > 0 - THEN COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 + THEN ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 / COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN - CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id + ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id AND u.package_num IS NOT NULL AND u.package_num > 0 THEN item.quantity * u.package_num ELSE item.quantity - END + END) END), 0) ELSE 0 END AS sales_price, From 9d02420a5158d097ab2bb80017738e4a45e5d1f9 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Sun, 26 Oct 2025 22:02:28 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E9=A2=84=E8=AD=A6dto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../supermarket/dto/StockWarnQueryDTO.java | 47 ------------------- .../controller/SmErpSpuController.java | 3 +- .../supermarket/mapper/SmErpStockMapper.java | 2 +- .../service/SmErpStockService.java | 2 +- .../service/impl/SmErpStockServiceImpl.java | 3 +- 5 files changed, 5 insertions(+), 52 deletions(-) delete mode 100644 pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/StockWarnQueryDTO.java diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/StockWarnQueryDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/StockWarnQueryDTO.java deleted file mode 100644 index 91a321431..000000000 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/StockWarnQueryDTO.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.bsd.pjcloud.supermarket.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -/** - * 库存预警查询DTO - * - * @author zjf - * @date 2025-01-27 - */ -@Data -@Schema(description = "库存预警查询DTO") -public class StockWarnQueryDTO { - - /** - * 商品货号 - */ - @Schema(description = "商品货号") - private String productCode; - - /** - * 商品条码 - */ - @Schema(description = "商品条码") - private String barcode; - - /** - * 商品名称 - */ - @Schema(description = "商品名称") - private String productName; - - /** - * 预警类型:1=库存不足 2=库存超额 - */ - @Schema(description = "预警类型:1=库存不足 2=库存超额") - private String warnType; - - /** - * 分类ID - */ - @Schema(description = "分类ID") - private Long categoryId; -} - - diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java index c7ac48451..923d6f28f 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/SmErpSpuController.java @@ -12,7 +12,7 @@ import com.bsd.pjcloud.common.excel.annotation.RequestExcel; import com.bsd.pjcloud.common.idempotent.annotation.Idempotent; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.util.SecurityUtils; -import com.bsd.pjcloud.supermarket.dto.StockWarnQueryDTO; + import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuQueryDTO; import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockByCodeReqDTO; @@ -22,6 +22,7 @@ import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuImportPDNewDto; import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuPageDto; import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuImportNewDto; import com.bsd.pjcloud.supermarket.dto.inventoryrecords.*; +import com.bsd.pjcloud.supermarket.dto.stockwarn.StockWarnQueryDTO; import com.bsd.pjcloud.supermarket.entity.*; import com.bsd.pjcloud.supermarket.service.*; import com.bsd.pjcloud.supermarket.vo.ad.SmErpSpuDetailsVo; diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpStockMapper.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpStockMapper.java index 118b0e07c..0147ed8fd 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpStockMapper.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/mapper/SmErpStockMapper.java @@ -3,7 +3,7 @@ package com.bsd.pjcloud.supermarket.mapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; -import com.bsd.pjcloud.supermarket.dto.StockWarnQueryDTO; +import com.bsd.pjcloud.supermarket.dto.stockwarn.StockWarnQueryDTO; import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity; import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO; import org.apache.ibatis.annotations.Param; diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpStockService.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpStockService.java index 5a28226da..d678ccc24 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpStockService.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/SmErpStockService.java @@ -3,8 +3,8 @@ package com.bsd.pjcloud.supermarket.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; -import com.bsd.pjcloud.supermarket.dto.StockWarnQueryDTO; import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO; +import com.bsd.pjcloud.supermarket.dto.stockwarn.StockWarnQueryDTO; import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity; import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO; import com.github.houbb.heaven.annotation.reflect.Param; diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpStockServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpStockServiceImpl.java index fe329b3d4..fc13e9d2f 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpStockServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpStockServiceImpl.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.bsd.pjcloud.supermarket.dto.StockWarnQueryDTO; import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveItemDTO; import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO; import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity; @@ -18,7 +17,7 @@ import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; - +import com.bsd.pjcloud.supermarket.dto.stockwarn.StockWarnQueryDTO; import java.util.List; /** From 9154a813df564a4634f312198e3c23b4707477a4 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Sun, 26 Oct 2025 22:02:40 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BA=93=E5=AD=98?= =?UTF-8?q?=E9=A2=84=E8=AD=A6dto?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/stockwarn/StockWarnQueryDTO.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/stockwarn/StockWarnQueryDTO.java diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/stockwarn/StockWarnQueryDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/stockwarn/StockWarnQueryDTO.java new file mode 100644 index 000000000..c785dd3cd --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/stockwarn/StockWarnQueryDTO.java @@ -0,0 +1,46 @@ +package com.bsd.pjcloud.supermarket.dto.stockwarn; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 库存预警查询DTO + * + * @author pjcloud + * @date 2025-10-26 + */ +@Data +@Schema(description = "库存预警查询DTO") +public class StockWarnQueryDTO { + + /** + * 预警类型:1-库存不足,2-库存超额 + */ + @Schema(description = "预警类型:1-库存不足,2-库存超额") + private String warnType; + + /** + * 条码 + */ + @Schema(description = "条码") + private String barcode; + + /** + * 商品编码 + */ + @Schema(description = "商品编码") + private String productCode; + + /** + * 商品名称 + */ + @Schema(description = "商品名称") + private String productName; + + /** + * 分类ID + */ + @Schema(description = "分类ID") + private Long categoryId; +} + From f868d94b085f8bb9be0cf32862b924242d97e285 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Sun, 26 Oct 2025 22:16:22 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=B0=8F=E6=95=B0=E7=82=B9=E4=BF=9D?= =?UTF-8?q?=E7=95=99=E4=B8=A4=E4=BD=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/ProfitReportServiceImpl.java | 44 ++++++++++++++- .../service/impl/SalesReportServiceImpl.java | 55 ++++++++++++++++++- 2 files changed, 96 insertions(+), 3 deletions(-) diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ProfitReportServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ProfitReportServiceImpl.java index 6c81aa49d..d1fbe73bf 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ProfitReportServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/ProfitReportServiceImpl.java @@ -12,6 +12,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; /** @@ -30,23 +32,61 @@ public class ProfitReportServiceImpl implements ProfitReportService { @Override public Page page(Page page, ProfitReportQueryDTO queryDTO) { log.info("分页查询毛利报表,查询条件:{}", queryDTO); - return profitReportMapper.selectProfitReportPage(page, queryDTO, DataScope.of()); + Page result = profitReportMapper.selectProfitReportPage(page, queryDTO, DataScope.of()); + + // 确保所有 BigDecimal 字段保留两位小数 + result.getRecords().forEach(this::formatProfitReportVO); + + return result; } @Override public List list(ProfitReportQueryDTO queryDTO) { log.info("列表查询毛利报表,查询条件:{}", queryDTO); - return profitReportMapper.selectProfitReportList(queryDTO, DataScope.of()); + List result = profitReportMapper.selectProfitReportList(queryDTO, DataScope.of()); + + // 确保所有 BigDecimal 字段保留两位小数 + result.forEach(this::formatProfitReportVO); + + return result; } @Override public List exportExcel(ProfitReportQueryDTO queryDTO) { log.info("导出毛利报表,查询条件:{}", queryDTO); List list = profitReportMapper.selectProfitReportList(queryDTO, DataScope.of()); + + // 确保所有 BigDecimal 字段保留两位小数 + list.forEach(this::formatProfitReportVO); + List excelList = BeanUtils.toBean(list, ProfitReportExcelDTO.class); log.info("导出毛利报表成功,导出记录数:{}", excelList.size()); return excelList; } + + /** + * 格式化毛利报表VO的所有BigDecimal字段,保留两位小数 + */ + private void formatProfitReportVO(ProfitReportVO vo) { + if (vo.getSalesPrice() != null) { + vo.setSalesPrice(vo.getSalesPrice().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getCostPrice() != null) { + vo.setCostPrice(vo.getCostPrice().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getSalesAmount() != null) { + vo.setSalesAmount(vo.getSalesAmount().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getSalesCost() != null) { + vo.setSalesCost(vo.getSalesCost().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getGrossProfit() != null) { + vo.setGrossProfit(vo.getGrossProfit().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getProfitMargin() != null) { + vo.setProfitMargin(vo.getProfitMargin().setScale(2, RoundingMode.HALF_UP)); + } + } } diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SalesReportServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SalesReportServiceImpl.java index dea5be535..131b2c833 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SalesReportServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SalesReportServiceImpl.java @@ -12,6 +12,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.List; /** @@ -40,6 +42,22 @@ public class SalesReportServiceImpl implements SalesReportService { Page result = salesReportMapper.selectSalesReportPage(page, queryDTO, DataScope.of()); + // 确保所有 BigDecimal 字段保留两位小数 + result.getRecords().forEach(vo -> { + if (vo.getSalesPrice() != null) { + vo.setSalesPrice(vo.getSalesPrice().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getSalesAmount() != null) { + vo.setSalesAmount(vo.getSalesAmount().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getReturnAmount() != null) { + vo.setReturnAmount(vo.getReturnAmount().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getActualSalesAmount() != null) { + vo.setActualSalesAmount(vo.getActualSalesAmount().setScale(2, RoundingMode.HALF_UP)); + } + }); + log.info("查询结果数量: {} / 总数: {}", result.getRecords().size(), result.getTotal()); log.info("======================================"); @@ -49,13 +67,48 @@ public class SalesReportServiceImpl implements SalesReportService { @Override public List list(SalesReportQueryDTO queryDTO) { log.info("列表查询销售报表,查询条件:{}", queryDTO); - return salesReportMapper.selectSalesReportList(queryDTO, DataScope.of()); + List result = salesReportMapper.selectSalesReportList(queryDTO, DataScope.of()); + + // 确保所有 BigDecimal 字段保留两位小数 + result.forEach(vo -> { + if (vo.getSalesPrice() != null) { + vo.setSalesPrice(vo.getSalesPrice().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getSalesAmount() != null) { + vo.setSalesAmount(vo.getSalesAmount().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getReturnAmount() != null) { + vo.setReturnAmount(vo.getReturnAmount().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getActualSalesAmount() != null) { + vo.setActualSalesAmount(vo.getActualSalesAmount().setScale(2, RoundingMode.HALF_UP)); + } + }); + + return result; } @Override public List exportExcel(SalesReportQueryDTO queryDTO) { log.info("导出销售报表,查询条件:{}", queryDTO); List list = salesReportMapper.selectSalesReportList(queryDTO, DataScope.of()); + + // 确保所有 BigDecimal 字段保留两位小数 + list.forEach(vo -> { + if (vo.getSalesPrice() != null) { + vo.setSalesPrice(vo.getSalesPrice().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getSalesAmount() != null) { + vo.setSalesAmount(vo.getSalesAmount().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getReturnAmount() != null) { + vo.setReturnAmount(vo.getReturnAmount().setScale(2, RoundingMode.HALF_UP)); + } + if (vo.getActualSalesAmount() != null) { + vo.setActualSalesAmount(vo.getActualSalesAmount().setScale(2, RoundingMode.HALF_UP)); + } + }); + List excelList = BeanUtils.toBean(list, SalesReportExcelDTO.class); log.info("导出销售报表成功,导出记录数:{}", excelList.size()); return excelList;