master:今日统计功能完善;

pull/1121/head
liujiang 2025-11-17 17:37:19 +08:00
parent 1be5fa3631
commit fdc81c8ff3
3 changed files with 54 additions and 18 deletions

View File

@ -39,8 +39,20 @@ public class StoreTodaySaleSummaryVO {
public static class STSSProdSaleVO {
@ApiModelProperty(value = "货号")
private String prodArtNum;
@ApiModelProperty(value = "颜色")
private String colorName;
@ApiModelProperty(value = "颜色销售数量")
private Integer colorSaleQuantity;
@ApiModelProperty(value = "颜色销售金额")
private BigDecimal colorSaleAmount;
@ApiModelProperty(value = "颜色退货数量")
private Integer colorRefundQuantity;
@ApiModelProperty(value = "颜色退货金额")
private BigDecimal colorRefundAmount;
@ApiModelProperty(value = "颜色总的销售数量")
private Integer colorTotalQuantity;
@ApiModelProperty(value = "颜色总销售金额")
private BigDecimal colorTotalAmount;
@ApiModelProperty(value = "销售金额")
private BigDecimal saleAmount;
@ApiModelProperty(value = "退货金额")

View File

@ -42,8 +42,20 @@ public class StoreTodaySaleSummaryDTO {
public static class STSSProdSaleDTO {
@ApiModelProperty(value = "货号")
private String prodArtNum;
@ApiModelProperty(value = "颜色")
private String colorName;
@ApiModelProperty(value = "颜色销售数量")
private Integer colorSaleQuantity;
@ApiModelProperty(value = "颜色销售金额")
private BigDecimal colorSaleAmount;
@ApiModelProperty(value = "颜色退货数量")
private Integer colorRefundQuantity;
@ApiModelProperty(value = "颜色退货金额")
private BigDecimal colorRefundAmount;
@ApiModelProperty(value = "颜色总的销售数量")
private Integer colorTotalQuantity;
@ApiModelProperty(value = "颜色总销售金额")
private BigDecimal colorTotalAmount;
@ApiModelProperty(value = "销售金额")
private BigDecimal saleAmount;
@ApiModelProperty(value = "退货金额")

View File

@ -101,7 +101,7 @@ public class StoreSaleDetailServiceImpl implements IStoreSaleDetailService {
Integer refundQuantity = saleDetailList.stream().filter(x -> Objects.equals(x.getSaleType(), SaleType.SALE_REFUND.getValue()))
.map(x -> ObjectUtils.defaultIfNull(x.getQuantity(), 0)).reduce(0, Integer::sum);
// 退货率
String refundRate = saleQuantity > 0 ? String.format("%.2f", Math.abs(refundQuantity) * 100.0 / saleQuantity) : "0.00%";
String refundRate = saleQuantity > 0 ? String.format("%.2f%%", Math.abs(refundQuantity) * 100.0 / saleQuantity) : "0.00%";
// 采购客户数量
Long cusQuantity = saleDetailList.stream().map(x -> ObjectUtils.defaultIfNull(x.getStoreCusId(), 0)).distinct().count();
return new StoreTodaySaleSummaryDTO().setSaleAmount(saleAmount).setRefundAmount(refundAmount).setSaleQuantity(saleQuantity)
@ -140,21 +140,19 @@ public class StoreSaleDetailServiceImpl implements IStoreSaleDetailService {
return retCusSaleList;
}
/**
*
*
* @param saleDetailList
* @return List<StoreTodaySaleSummaryDTO.STSSProdSaleDTO>
*/
private List<StoreTodaySaleSummaryDTO.STSSProdSaleDTO> getProdSaleSummary(List<StoreSaleDetail> saleDetailList) {
// 货号维度 销量map
Map<String, List<StoreSaleDetail>> artNumSaleGroupMap = saleDetailList.stream().collect(Collectors.groupingBy(StoreSaleDetail::getProdArtNum));
// 货号 颜色 维度销量map
Map<String, Map<String, List<StoreSaleDetail>>> artNumColorSaleGroupMap = saleDetailList.stream().collect(Collectors
.groupingBy(StoreSaleDetail::getProdArtNum, Collectors.groupingBy(StoreSaleDetail::getColorName)));
// TODO 颜色的数据如何返回
// TODO 颜色的数据如何返回
// TODO 颜色的数据如何返回
List<StoreTodaySaleSummaryDTO.STSSProdSaleDTO> retProdSaleList = new ArrayList<>();
artNumSaleGroupMap.forEach((prodArtNum, prodArtNumSaleList) -> {
BigDecimal saleAmount = prodArtNumSaleList.stream().filter(x -> Objects.equals(x.getSaleType(), SaleType.GENERAL_SALE.getValue()))
.map(x -> ObjectUtils.defaultIfNull(x.getAmount(), BigDecimal.ZERO)).reduce(BigDecimal.ZERO, BigDecimal::add);
@ -165,12 +163,26 @@ public class StoreSaleDetailServiceImpl implements IStoreSaleDetailService {
Integer refundQuantity = prodArtNumSaleList.stream().filter(x -> Objects.equals(x.getSaleType(), SaleType.SALE_REFUND.getValue()))
.map(x -> ObjectUtils.defaultIfNull(x.getQuantity(), 0)).reduce(0, Integer::sum);
String refundRate = saleQuantity > 0 ? String.format("%.2f%%", Math.abs(refundQuantity) * 100.0 / saleQuantity) : "0.00%";
retProdSaleList.add(new StoreTodaySaleSummaryDTO.STSSProdSaleDTO().setProdArtNum(prodArtNum).setSaleAmount(saleAmount)
.setRefundAmount(refundAmount).setSaleQuantity(saleQuantity).setRefundQuantity(refundQuantity).setRefundRate(refundRate));
Map<String, List<StoreSaleDetail>> colorSaleMap = artNumColorSaleGroupMap.get(prodArtNum);
colorSaleMap.forEach((colorName, colorSaleList) -> {
BigDecimal colorSaleAmount = colorSaleList.stream().filter(x -> Objects.equals(x.getSaleType(), SaleType.GENERAL_SALE.getValue()))
.map(x -> ObjectUtils.defaultIfNull(x.getAmount(), BigDecimal.ZERO)).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal colorRefundAmount = colorSaleList.stream().filter(x -> Objects.equals(x.getSaleType(), SaleType.SALE_REFUND.getValue()))
.map(x -> ObjectUtils.defaultIfNull(x.getAmount(), BigDecimal.ZERO)).reduce(BigDecimal.ZERO, BigDecimal::add);
Integer colorSaleQuantity = colorSaleList.stream().filter(x -> Objects.equals(x.getSaleType(), SaleType.GENERAL_SALE.getValue()))
.map(x -> ObjectUtils.defaultIfNull(x.getQuantity(), 0)).reduce(0, Integer::sum);
Integer colorRefundQuantity = colorSaleList.stream().filter(x -> Objects.equals(x.getSaleType(), SaleType.SALE_REFUND.getValue()))
.map(x -> ObjectUtils.defaultIfNull(x.getQuantity(), 0)).reduce(0, Integer::sum);
retProdSaleList.add(new StoreTodaySaleSummaryDTO.STSSProdSaleDTO().setProdArtNum(prodArtNum).setColorName(colorName)
.setColorSaleAmount(colorSaleAmount).setColorRefundAmount(colorRefundAmount).setColorSaleQuantity(colorSaleQuantity)
.setColorRefundQuantity(colorRefundQuantity).setColorTotalQuantity(colorSaleQuantity + colorRefundQuantity)
.setColorTotalAmount(colorSaleAmount.add(colorRefundAmount)).setSaleAmount(saleAmount).setRefundAmount(refundAmount)
.setSaleQuantity(saleQuantity).setRefundQuantity(refundQuantity).setRefundRate(refundRate));
});
});
// 按照总的销售金额 由高到低 排
retProdSaleList.sort(Comparator.comparing(StoreTodaySaleSummaryDTO.STSSProdSaleDTO::getSaleAmount).reversed());
// 先按货号排,再按照颜色的销售金额由高到低排列
retProdSaleList.sort(Comparator.comparing(StoreTodaySaleSummaryDTO.STSSProdSaleDTO::getProdArtNum)
.thenComparing(StoreTodaySaleSummaryDTO.STSSProdSaleDTO::getColorSaleAmount).reversed());
return retProdSaleList;
}