diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryDetailQueryDTO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryDetailQueryDTO.java index 69945db3f..a83e2d516 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryDetailQueryDTO.java +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/dto/inventoryrecords/InventoryDetailQueryDTO.java @@ -34,4 +34,10 @@ public class InventoryDetailQueryDTO { */ @Schema(description="订单类型:1=入库,2=出库") private Integer orderType; + + /** + * 单据类型:1=采购申请,2=采购订单,3=采购入库,4=采购退货,5=零售出库,6=零售退货,7=库存盘点 + */ + @Schema(description="单据类型:3=采购入库,6=零售退货") + private String inventoryType; } diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryInOutReportVO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryInOutReportVO.java new file mode 100644 index 000000000..9b26c7c90 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryInOutReportVO.java @@ -0,0 +1,50 @@ +package com.bsd.pjcloud.supermarket.vo.report; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "进销存报表返回数据(按商品汇总)") +public class InventoryInOutReportVO { + + @Schema(description = "商品ID") + private Long productId; + + @Schema(description = "商品编码") + private String productCode; + + @Schema(description = "商品名称") + private String productName; + + @Schema(description = "分类ID") + private Long categoryId; + + @Schema(description = "分类名称") + private String categoryName; + + @Schema(description = "单位(基础单位)") + private String unit; + + @Schema(description = "期初数量(基础单位)") + private Double openingQty; + + @Schema(description = "入库数量(基础单位)") + private Double inQty; + + @Schema(description = "出库数量(基础单位)") + private Double outQty; + + @Schema(description = "期末数量(基础单位)") + private Double closingQty; + + @Schema(description = "入库金额(元)") + private BigDecimal inAmount; + + @Schema(description = "出库金额(元)") + private BigDecimal outAmount; +} + + + diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryInOutSummaryVO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryInOutSummaryVO.java new file mode 100644 index 000000000..68b791752 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryInOutSummaryVO.java @@ -0,0 +1,51 @@ +package com.bsd.pjcloud.supermarket.vo.report; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 进销存报表汇总数据 + * + * @author pjcloud + * @date 2024-10-15 + */ +@Data +@Schema(description = "进销存报表汇总数据") +public class InventoryInOutSummaryVO { + + @Schema(description = "统计商品总数") + private Integer totalProducts; + + @Schema(description = "有发生额的商品数量") + private Integer changedProducts; + + @Schema(description = "总期初库存数量") + private Double totalOpeningQty; + + @Schema(description = "总入库数量") + private Double totalInQty; + + @Schema(description = "总出库数量") + private Double totalOutQty; + + @Schema(description = "总期末库存数量") + private Double totalClosingQty; + + @Schema(description = "总入库金额(元)") + private BigDecimal totalInAmount; + + @Schema(description = "总出库金额(元)") + private BigDecimal totalOutAmount; + + @Schema(description = "库存周转率(出库数量/平均库存)") + private BigDecimal turnoverRate; + + @Schema(description = "平均单价(总金额/总数量)") + private BigDecimal avgPrice; +} + + + + diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryReportVO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryReportVO.java new file mode 100644 index 000000000..f78d66e89 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryReportVO.java @@ -0,0 +1,100 @@ +package com.bsd.pjcloud.supermarket.vo.report; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * 进销存报表VO + * + * @author pjcloud + * @date 2025-10-16 + */ +@Data +@Schema(description = "进销存报表VO") +public class InventoryReportVO { + + @Schema(description = "商品ID") + private Long productId; + + @Schema(description = "商品编码") + private String productCode; + + @Schema(description = "商品名称") + private String productName; + + @Schema(description = "分类名称") + private String categoryName; + + @Schema(description = "规格") + private String spec; + + @Schema(description = "单位") + private String unit; + + @Schema(description = "装数") + private Integer packageNum; + + @Schema(description = "参考进价(元)") + private BigDecimal purchasePrice; + + @Schema(description = "零售价(元)") + private BigDecimal retailPrice; + + @Schema(description = "期初库存") + private Double openingQty; + + @Schema(description = "期初金额(元)") + private BigDecimal openingAmount; + + @Schema(description = "采购入库数量") + private Double purchaseInQty; + + @Schema(description = "采购入库金额(元)") + private BigDecimal purchaseInAmount; + + @Schema(description = "采购退货数量") + private Double purchaseReturnQty; + + @Schema(description = "采购退货金额(元)") + private BigDecimal purchaseReturnAmount; + + @Schema(description = "销售数量") + private Double salesQty; + + @Schema(description = "销售金额(元)") + private BigDecimal salesAmount; + + @Schema(description = "销售退货数量") + private Double salesReturnQty; + + @Schema(description = "销售退货金额(元)") + private BigDecimal salesReturnAmount; + + @Schema(description = "实际销售数量") + private Double actualSalesQty; + + @Schema(description = "实际销售金额(元)") + private BigDecimal actualSalesAmount; + + @Schema(description = "销售成本(元)") + private BigDecimal salesCost; + + @Schema(description = "期末数量") + private Double closingQty; + + @Schema(description = "期末库存金额(元)") + private BigDecimal closingAmount; + + @Schema(description = "期末库存售额(元)") + private BigDecimal closingRetailAmount; + + @Schema(description = "销售毛利(元)") + private BigDecimal grossProfit; + + @Schema(description = "首次进货日") + private LocalDate firstPurchaseDate; +} + diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryStocktakeReportVO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryStocktakeReportVO.java new file mode 100644 index 000000000..e45bf9ae3 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/InventoryStocktakeReportVO.java @@ -0,0 +1,44 @@ +package com.bsd.pjcloud.supermarket.vo.report; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +@Data +@Schema(description = "盘存报表返回数据(按商品汇总)") +public class InventoryStocktakeReportVO { + + @Schema(description = "商品ID") + private Long productId; + + @Schema(description = "商品编码") + private String productCode; + + @Schema(description = "商品名称") + private String productName; + + @Schema(description = "分类ID") + private Long categoryId; + + @Schema(description = "分类名称") + private String categoryName; + + @Schema(description = "单位(基础单位)") + private String unit; + + @Schema(description = "账面数量(基础单位)") + private Double bookQty; + + @Schema(description = "实盘数量(基础单位)") + private Double physicalQty; + + @Schema(description = "差异数量(基础单位,实盘-账面)") + private Double diffQty; + + @Schema(description = "差异金额(元)") + private BigDecimal diffAmount; +} + + + diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/ProfitReportVO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/ProfitReportVO.java new file mode 100644 index 000000000..e08a88105 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/ProfitReportVO.java @@ -0,0 +1,60 @@ +package com.bsd.pjcloud.supermarket.vo.report; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 毛利报表VO + * + * @author pjcloud + * @date 2025-10-16 + */ +@Data +@Schema(description = "毛利报表VO") +public class ProfitReportVO { + + @Schema(description = "商品ID") + private Long productId; + + @Schema(description = "商品编码") + private String productCode; + + @Schema(description = "商品名称") + private String productName; + + @Schema(description = "分类名称") + private String categoryName; + + @Schema(description = "规格") + private String spec; + + @Schema(description = "单位") + private String unit; + + @Schema(description = "销售数量") + private Double salesQty; + + @Schema(description = "销售金额(元)") + private BigDecimal salesAmount; + + @Schema(description = "销售单价(元)") + private BigDecimal salesPrice; + + @Schema(description = "成本单价(元)") + private BigDecimal costPrice; + + @Schema(description = "销售成本(元)") + private BigDecimal salesCost; + + @Schema(description = "销售毛利(元)") + private BigDecimal grossProfit; + + @Schema(description = "毛利率(%)") + private BigDecimal profitMargin; + + @Schema(description = "销售笔数") + private Integer salesCount; +} + diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/SalesReportVO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/SalesReportVO.java new file mode 100644 index 000000000..478209b64 --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/SalesReportVO.java @@ -0,0 +1,60 @@ +package com.bsd.pjcloud.supermarket.vo.report; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 销售报表VO + * + * @author pjcloud + * @date 2025-10-16 + */ +@Data +@Schema(description = "销售报表VO") +public class SalesReportVO { + + @Schema(description = "商品ID") + private Long productId; + + @Schema(description = "商品编码") + private String productCode; + + @Schema(description = "商品名称") + private String productName; + + @Schema(description = "分类名称") + private String categoryName; + + @Schema(description = "规格") + private String spec; + + @Schema(description = "单位") + private String unit; + + @Schema(description = "销售数量") + private Double salesQty; + + @Schema(description = "销售金额(元)") + private BigDecimal salesAmount; + + @Schema(description = "销售单价(元)") + private BigDecimal salesPrice; + + @Schema(description = "销售笔数") + private Integer salesCount; + + @Schema(description = "退货数量") + private Double returnQty; + + @Schema(description = "退货金额(元)") + private BigDecimal returnAmount; + + @Schema(description = "实际销售数量") + private Double actualSalesQty; + + @Schema(description = "实际销售金额(元)") + private BigDecimal actualSalesAmount; +} + diff --git a/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/StocktakeReportVO.java b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/StocktakeReportVO.java new file mode 100644 index 000000000..308a4e5ef --- /dev/null +++ b/pjcloud-supermarket/pjcloud-supermarket-api/src/main/java/com/bsd/pjcloud/supermarket/vo/report/StocktakeReportVO.java @@ -0,0 +1,58 @@ +package com.bsd.pjcloud.supermarket.vo.report; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +/** + * 盘存报表VO + * + * @author pjcloud + * @date 2025-10-16 + */ +@Data +@Schema(description = "盘存报表VO") +public class StocktakeReportVO { + + @Schema(description = "盘点单号") + private String stocktakeCode; + + @Schema(description = "盘点日期") + private LocalDate stocktakeDate; + + @Schema(description = "商品ID") + private Long productId; + + @Schema(description = "商品编码") + private String productCode; + + @Schema(description = "商品名称") + private String productName; + + @Schema(description = "分类名称") + private String categoryName; + + @Schema(description = "规格") + private String spec; + + @Schema(description = "单位") + private String unit; + + @Schema(description = "账面数量") + private Double bookQty; + + @Schema(description = "实盘数量") + private Double physicalQty; + + @Schema(description = "差异数量(实盘-账面)") + private Double diffQty; + + @Schema(description = "差异金额(元)") + private BigDecimal diffAmount; + + @Schema(description = "备注") + private String remark; +} + diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/RealtimeSalesReportController.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/RealtimeSalesReportController.java index 5c9d52e37..8897bddbc 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/RealtimeSalesReportController.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/controller/RealtimeSalesReportController.java @@ -11,6 +11,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -21,6 +22,7 @@ import org.springframework.web.bind.annotation.*; * @author pjcloud * @date 2025-01-27 10:00:00 */ +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/realtimeSalesReport") diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java index 884c7f513..5d3dfbc96 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/java/com/bsd/pjcloud/supermarket/service/impl/SmErpInventoryRecordsServiceImpl.java @@ -1287,36 +1287,39 @@ public class SmErpInventoryRecordsServiceImpl extends ServiceImpl exportInventoryDetail(InventoryDetailQueryDTO inventoryDetailQueryDTO) { - // 查询明细数据(不分页) - Page page = new Page<>(1, 10000); + // 查询出入库明细数据 + Page page = new Page<>(1, 100000); // 设置一个较大的分页值以获取所有数据 Page pageData = baseMapper.getInventoryDetailPageByScope(page, inventoryDetailQueryDTO, DataScope.of()); List records = pageData.getRecords(); - // 转换为导出DTO - return records.stream().map(vo -> { - InventoryDetailExcelDTO dto = new InventoryDetailExcelDTO(); - dto.setInventoryCode(vo.getInventoryCode()); - dto.setInventoryDate(vo.getInventoryDate()); - dto.setProductName(vo.getProductName()); - dto.setSpec(vo.getSpec()); - dto.setUnit(vo.getUnit()); - dto.setPackageNum(vo.getPackageNum()); - dto.setQuantity(vo.getQuantity()); + // 转换为Excel DTO + List excelList = new ArrayList<>(); + for (InventoryRecordPageVo record : records) { + InventoryDetailExcelDTO excelDTO = new InventoryDetailExcelDTO(); + excelDTO.setInventoryCode(record.getInventoryCode()); + excelDTO.setInventoryDate(record.getInventoryDate()); + excelDTO.setProductName(record.getProductName()); + excelDTO.setSpec(record.getSpec()); + excelDTO.setUnit(record.getUnit()); + excelDTO.setPackageNum(record.getPackageNum()); + excelDTO.setQuantity(record.getQuantity()); - // 金额从分转换为元 - if (vo.getUnitPrice() != null) { - dto.setUnitPrice(BigDecimal.valueOf(vo.getUnitPrice()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); + // 类型转换:Integer(分) → BigDecimal(元) + if (record.getUnitPrice() != null) { + excelDTO.setUnitPrice(new BigDecimal(record.getUnitPrice()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP)); } - if (vo.getTotalAmount() != null) { - dto.setTotalAmount(BigDecimal.valueOf(vo.getTotalAmount()).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); + if (record.getTotalAmount() != null) { + excelDTO.setTotalAmount(new BigDecimal(record.getTotalAmount()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP)); } - dto.setSupplierName(vo.getSupplierName()); - dto.setRemark(vo.getRemark()); + excelDTO.setSupplierName(record.getSupplierName()); + excelDTO.setRemark(record.getRemark()); - return dto; - }).collect(Collectors.toList()); + excelList.add(excelDTO); + } + + return excelList; } } \ No newline at end of file diff --git a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsMapper.xml b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsMapper.xml index e54875ef6..3dbb29c6b 100644 --- a/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsMapper.xml +++ b/pjcloud-supermarket/pjcloud-supermarket-biz/src/main/resources/mapper/SmErpInventoryRecordsMapper.xml @@ -63,6 +63,9 @@ and r.order_type = #{inventoryDetailQueryDTO.orderType} + + and r.inventory_type = #{inventoryDetailQueryDTO.inventoryType} + and r.inventory_date >= #{inventoryDetailQueryDTO.startDate}