修复超市报表quantity负数导致的统计问题

This commit is contained in:
zjf committed 2025-10-24 17:25:13 +08:00
1 parent d53cfaadab
commit ca6378961d
6 files changed
+98 -83

No files matched your search

@@ -44,3 +44,4 @@ public class StockWarnQueryDTO {
private Long categoryId;
}
@@ -70,3 +70,4 @@ public class MallProductSkuAppVo {
private String status;
}
@@ -29,8 +29,21 @@ public class SalesReportServiceImpl implements SalesReportService {
@Override
public Page<SalesReportVO> 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<SalesReportVO> result = salesReportMapper.selectSalesReportPage(page, queryDTO, DataScope.of());
log.info("查询结果数量: {} / 总数: {}", result.getRecords().size(), result.getTotal());
log.info("======================================");
return result;
}
@Override
@@ -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,
@@ -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
@@ -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,