超市报表

This commit is contained in:
zjf committed 2025-10-20 01:50:26 +08:00
1 parent 9a4dde11a8
commit 82ba2baeb7
16 files changed
+33 -65

No files matched your search

@@ -38,6 +38,12 @@ public class InventoryDetailQueryDTO {
/**
* 单据类型:1=采购申请,2=采购订单,3=采购入库,4=采购退货,5=零售出库,6=零售退货,7=库存盘点
*/
@Schema(description="单据类型:3=采购入库,6=零售退货")
@Schema(description="单据类型:3=采购入库,4=采购退货,6=零售退货")
private String inventoryType;
/**
* 单据类型(多个):支持逗号分隔,如 "4,6"
*/
@Schema(description="单据类型(多个),逗号分隔,如:4,6")
private String inventoryTypes;
}
@@ -74,3 +74,4 @@ public class SalesReportExcelDTO {
}
@@ -71,3 +71,4 @@ public class StocktakeReportExcelDTO {
}
@@ -38,3 +38,4 @@ public class StocktakeReportQueryDTO {
}
@@ -57,3 +57,4 @@ public class StocktakeReportVO {
}
@@ -634,3 +634,4 @@ const getProfitColor = (margin) => {
| 1.0 | 2025-10-16 | 初始版本,实现所有核心报表功能 | pjcloud |
@@ -90,12 +90,12 @@ public class ReportController {
* @param inventoryDetailQueryDTO 查询条件
* @return 分页结果
*/
@Operation(summary = "分页获取退货单明细", description = "退货单明细(inventory_type=6),支持日期区间查询")
@Operation(summary = "分页获取退货单明细", description = "退货单明细(inventory_type=4采购退货,6零售退货),支持日期区间查询")
@GetMapping("/returnDetail/page")
@PreAuthorize("@pms.hasPermission('supermarket_report_view')")
public R<Object> getReturnDetailPage(@ParameterObject Page<?> page, @ParameterObject InventoryDetailQueryDTO inventoryDetailQueryDTO) {
// 固定查询退货单类型:inventory_type=6(零售退货)
inventoryDetailQueryDTO.setInventoryType("6");
// 查询退货单类型:inventory_type=4(采购退货)或 6(零售退货)
inventoryDetailQueryDTO.setInventoryTypes("4,6");
return R.ok(smErpInventoryRecordsService.getInventoryDetailPage(page, inventoryDetailQueryDTO));
}
@@ -110,8 +110,8 @@ public class ReportController {
@SysLog("导出退货单明细")
@PreAuthorize("@pms.hasPermission('supermarket_report_export')")
public List<InventoryDetailExcelDTO> exportReturnDetail(@ParameterObject InventoryDetailQueryDTO inventoryDetailQueryDTO) {
// 固定查询退货单类型:inventory_type=6(零售退货)
inventoryDetailQueryDTO.setInventoryType("6");
// 查询退货单类型:inventory_type=4(采购退货)或 6(零售退货)
inventoryDetailQueryDTO.setInventoryTypes("4,6");
return smErpInventoryRecordsService.exportInventoryDetail(inventoryDetailQueryDTO);
}
@@ -39,3 +39,4 @@ public interface SalesReportMapper {
}
@@ -39,3 +39,4 @@ public interface StocktakeReportMapper {
}
@@ -42,3 +42,4 @@ public interface SalesReportService {
}
@@ -42,3 +42,4 @@ public interface StocktakeReportService {
}
@@ -50,3 +50,4 @@ public class SalesReportServiceImpl implements SalesReportService {
}
@@ -50,3 +50,4 @@ public class StocktakeReportServiceImpl implements StocktakeReportService {
}
@@ -135,64 +135,8 @@
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.current_stock, 0)
- 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
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END), 0)
+ 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
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END), 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
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
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
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END), 0) AS opening_qty,
(COALESCE(stock.current_stock, 0)
- 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
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END), 0)
+ 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
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END), 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
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
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
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END), 0)) * COALESCE(base.purchase_price / 100.0, 0) AS opening_amount
COALESCE(stock.base_stock, 0) AS opening_qty,
COALESCE(stock.base_stock, 0) * COALESCE(base.purchase_price / 100.0, 0) AS opening_amount
FROM sm_erp_spu spu
LEFT JOIN sm_erp_stock stock ON stock.erp_spu_id = spu.id
@@ -63,7 +63,13 @@
<if test="inventoryDetailQueryDTO.orderType != null and inventoryDetailQueryDTO.orderType != ''">
and r.order_type = #{inventoryDetailQueryDTO.orderType}
</if>
<if test="inventoryDetailQueryDTO.inventoryType != null and inventoryDetailQueryDTO.inventoryType != ''">
<if test="inventoryDetailQueryDTO.inventoryTypes != null and inventoryDetailQueryDTO.inventoryTypes != ''">
and r.inventory_type IN
<foreach collection="inventoryDetailQueryDTO.inventoryTypes.split(',')" item="type" open="(" separator="," close=")">
#{type}
</foreach>
</if>
<if test="inventoryDetailQueryDTO.inventoryType != null and inventoryDetailQueryDTO.inventoryType != '' and (inventoryDetailQueryDTO.inventoryTypes == null or inventoryDetailQueryDTO.inventoryTypes == '')">
and r.inventory_type = #{inventoryDetailQueryDTO.inventoryType}
</if>
<if test="inventoryDetailQueryDTO.startDate != null">