Browse Source

pc端统计销售接口优化、app端数据统计与pc端统计销售取值一致

liyuan 2 months ago
parent
commit
c8fb5f9aa0

+ 28 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/enums/OrderStatusEnum.java

@@ -0,0 +1,28 @@
+package org.springblade.salesPart.enums;
+
+/**
+ * @author Rain
+ */
+
+public enum OrderStatusEnum {
+
+
+	/**
+	 * 已取消状态
+	 */
+	CANCELLED("已取消"),
+
+	/**
+	 * 已完成
+	 */
+	COMPLETED("已完成");
+
+
+	public final String value;
+
+	OrderStatusEnum(String value) {
+		this.value = value;
+	}
+
+
+}

+ 61 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/vo/AppStatisticsVo.java

@@ -0,0 +1,61 @@
+package org.springblade.salesPart.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Rain
+ */
+@Data
+public class AppStatisticsVo {
+
+	/**
+	 * 经营收入
+	 */
+	private BigDecimal income;
+
+	/**
+	 * 采购支出
+	 */
+	private BigDecimal expenditure;
+
+	/**
+	 * 经营利润
+	 */
+	private BigDecimal profit;
+
+	/**
+	 * 经营成本
+	 */
+	private BigDecimal cost;
+
+	/**
+	 * 	退货成本
+	 */
+	private BigDecimal returnsCost;
+
+	/**
+	 * 平均客单价
+	 */
+	private BigDecimal averageAmount;
+
+	/**
+	 * 运费金额
+	 */
+	private BigDecimal freightAmount;
+
+
+
+
+	public void valueIsZero() {
+		this.income = BigDecimal.ZERO;
+		this.expenditure = BigDecimal.ZERO;
+		this.cost = BigDecimal.ZERO;
+		this.profit = BigDecimal.ZERO;
+		this.averageAmount = BigDecimal.ZERO;
+		this.returnsCost = BigDecimal.ZERO;
+		this.freightAmount = BigDecimal.ZERO;
+	}
+
+}

+ 122 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/vo/StatisticsVo.java

@@ -0,0 +1,122 @@
+package org.springblade.salesPart.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Rain
+ */
+@Data
+public class StatisticsVo {
+
+
+	/**
+	 * 商品总数量 - 实际销售或采购的商品数量
+	 * 对于销售(XS)和采购(CG)业务类型,表示实际数量
+	 * 对于退货(TKXS)和退货采购(TKCG)业务类型,值为0
+	 */
+	private BigDecimal goodsSum;
+
+	/**
+	 * 总金额 - 销售或采购的总金额
+	 * 包含商品金额但不一定包含运费等其他费用
+	 */
+	private BigDecimal amount;
+
+	/**
+	 * 成本价格 - 商品的总成本金额
+	 * 用于计算毛利润的基础数据
+	 */
+	private BigDecimal costPrice;
+
+	/**
+	 * 利润金额 - 销售业务产生的利润
+	 * 计算公式:金额 - 成本
+	 */
+	private BigDecimal profit;
+
+	/**
+	 * 运费金额 - 订单的运费费用
+	 * 使用绝对值保证金额为正数
+	 */
+	private BigDecimal freight;
+
+	/**
+	 * 取消订单运费 - 取消订单和退货产生的运费总和
+	 * 包括取消运费和退货运费
+	 */
+	private BigDecimal freightCancellation;
+
+	/**
+	 * 取消订单商品数量 - 取消订单和退货的商品数量总和
+	 */
+	private BigDecimal goodsSumCancellation;
+
+	/**
+	 * 取消订单金额 - 取消订单和退货的金额总和
+	 */
+	private BigDecimal amountCancellation;
+
+	/**
+	 * 取消订单成本 - 取消订单和退货的成本总和
+	 */
+	private BigDecimal costPriceCancellation;
+
+	/**
+	 * 取消订单利润 - 取消订单和退货的利润总和
+	 */
+	private BigDecimal profitCancellation;
+
+	/**
+	 * 出库商品总发货数量 - 实际出库的发货数量统计
+	 */
+	private BigDecimal outGoodsTotalShipNum;
+
+	/**
+	 * 出库商品总发货金额 - 实际出库的发货金额统计
+	 */
+	private BigDecimal outGoodsTotalShipAmount;
+
+	/**
+	 * 主要商品总数量 - 主要商品的数量统计
+	 */
+	private BigDecimal primaryGoodsTotalNum;
+
+	/**
+	 * 主要商品总金额 - 主要商品的金额统计
+	 */
+	private BigDecimal primaryGoodsTotalMoney;
+
+	/**
+	 * 剩余数量 - 库存或未处理商品的剩余数量
+	 */
+	private BigDecimal surplusNum;
+
+	/**
+	 * 剩余金额 - 库存或未处理商品的剩余金额
+	 */
+	private BigDecimal surplusAmount;
+
+
+
+	public void valueIsZero() {
+		this.goodsSum = BigDecimal.ZERO;
+		this.amount = BigDecimal.ZERO;
+		this.costPrice = BigDecimal.ZERO;
+		this.profit = BigDecimal.ZERO;
+		this.freight = BigDecimal.ZERO;
+		this.freightCancellation = BigDecimal.ZERO;
+		this.goodsSumCancellation = BigDecimal.ZERO;
+		this.amountCancellation = BigDecimal.ZERO;
+		this.costPriceCancellation = BigDecimal.ZERO;
+		this.profitCancellation = BigDecimal.ZERO;
+		this.outGoodsTotalShipNum = BigDecimal.ZERO;
+		this.outGoodsTotalShipAmount = BigDecimal.ZERO;
+		this.primaryGoodsTotalNum = BigDecimal.ZERO;
+		this.primaryGoodsTotalMoney = BigDecimal.ZERO;
+		this.surplusNum = BigDecimal.ZERO;
+		this.surplusAmount = BigDecimal.ZERO;
+	}
+
+}

+ 6 - 8
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java

@@ -33,10 +33,7 @@ import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.order.service.IOrderService;
 import org.springblade.salesPart.ship.service.IShipService;
 import org.springblade.salesPart.util.UserUtils;
-import org.springblade.salesPart.vo.GoodsImgVo;
-import org.springblade.salesPart.vo.OrderStatistics;
-import org.springblade.salesPart.vo.OrderVO;
-import org.springblade.salesPart.vo.PjOrderStatisticsWeb;
+import org.springblade.salesPart.vo.*;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.*;
@@ -976,9 +973,10 @@ public class OrderController extends BladeController {
 	 */
 	@GetMapping("/turnoverAnalysis")
 	@ApiOperation(value = "app营业分析", notes = "传入参数")
-	public R<Map<String, Object>> turnoverAnalysis(@RequestParam(value = "statusDate", required = false) String statusDate,
-												   @RequestParam(value = "endDate", required = false) String endDate) {
-		Map<String, Object> map = new HashMap<>();
+	public R<AppStatisticsVo> turnoverAnalysis(@RequestParam(value = "statusDate", required = false) String statusDate,
+											   @RequestParam(value = "endDate", required = false) String endDate) {
+		return orderService.turnoverAnalysis(statusDate, endDate);
+/*		Map<String, Object> map = new HashMap<>();
 		LambdaQueryWrapper<PjOrder> lambdaQueryWrapperXS = new LambdaQueryWrapper<PjOrder>().eq(PjOrder::getIsDeleted, 0)
 			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())
@@ -1045,7 +1043,7 @@ public class OrderController extends BladeController {
 		map.put("profit", profit);
 		map.put("cost", cost);
 		map.put("averageAmount", averageAmount);
-		return R.data(map);
+		return R.data(map);*/
 	}
 
 

+ 9 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderItemsMapper.java

@@ -84,4 +84,13 @@ public interface OrderItemsMapper extends BaseMapper<PjOrderItems> {
 	 */
 	@TenantIgnore
 	List<PjOrderItems> selectOrderItemsListBySaleSizeDetail(@Param("tenantId") String tenantId);
+
+
+	/**
+	 * app端 数据统计
+	 *
+	 * @param saleDetail 查询条件
+	 * @return 结果
+	 */
+	List<Long> getAppSaleDetailList(SaleDetail saleDetail);
 }

+ 23 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderItemsMapper.xml

@@ -861,6 +861,29 @@
 
 
     </select>
+    <select id="getAppSaleDetailList" parameterType="org.springblade.salesPart.dto.SaleDetail" resultType="Long">
+        SELECT
+        po.id
+        FROM
+         pjpf_order po
+        WHERE
+        po.is_deleted = '0'
+        AND po.tenant_id = #{tenantId}
+        and (( po.bs_type in  ('XS','CG','RZCG') and po.status in ('待确认','待发货','已发货','退款请核','已取消','已退款','售后中','已收货','待收货'))
+        or ( po.bs_type in  ('TKXS','TKCG') and po.status = '已完成') )
+        <if test="salesCompanyId !=null and salesCompanyId != ''">
+            and find_in_set(po.sales_company_id,#{salesCompanyId})
+        </if>
+        <if test="dateStart !=null and dateStart !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;=  DATE_FORMAT(#{dateStart},'%Y-%m-%d')
+        </if>
+        <if test="dateEnd !=null and dateEnd !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;=  DATE_FORMAT(#{dateEnd},'%Y-%m-%d')
+        </if>
+        <if test="salerName !=null and salerName != ''">
+            and po.saler_id  = #{salerName}
+        </if>
+    </select>
 
 
 </mapper>

+ 8 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderItemsService.java

@@ -76,4 +76,12 @@ public interface IOrderItemsService extends IService<PjOrderItems> {
 	 * @return 结果
 	 */
 	List<PjOrderItems> selectOrderItemsListBySaleSizeDetail(String tenantId);
+
+	/**
+	 * app端 数据统计
+	 *
+	 * @param saleDetail 查询条件
+	 * @return 结果
+	 */
+	List<Long> getAppSaleDetailList(SaleDetail saleDetail);
 }

+ 10 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderService.java

@@ -27,6 +27,7 @@ import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.entity.PjProductLaunch;
 import org.springblade.salesPart.excel.*;
+import org.springblade.salesPart.vo.AppStatisticsVo;
 import org.springblade.salesPart.vo.OrderStatistics;
 import org.springblade.salesPart.vo.OrderVO;
 import org.springblade.salesPart.vo.PjOrderStatisticsWeb;
@@ -291,4 +292,13 @@ public interface IOrderService extends IService<PjOrder> {
 	 * @return 结果
 	 */
 	R<String> closeOrder(PjOrder order);
+
+	/**
+	 * app 数据统计分析
+	 *
+	 * @param startDate  开始时间
+	 * @param endDate   结束时间
+	 * @return 结果
+	 */
+	R<AppStatisticsVo> turnoverAnalysis(String startDate, String endDate);
 }

+ 5 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderItemsServiceImpl.java

@@ -141,5 +141,10 @@ public class OrderItemsServiceImpl extends ServiceImpl<OrderItemsMapper, PjOrder
 		return baseMapper.selectOrderItemsListBySaleSizeDetail(tenantId);
 	}
 
+	@Override
+	public List<Long> getAppSaleDetailList(SaleDetail saleDetail) {
+		return baseMapper.getAppSaleDetailList(saleDetail);
+	}
+
 
 }

+ 69 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java

@@ -49,8 +49,10 @@ import org.springblade.salesPart.check.service.IAuditProecessService;
 import org.springblade.salesPart.corps.mapper.CorpsDescMapper;
 import org.springblade.salesPart.dto.FinancingProcurement;
 import org.springblade.salesPart.dto.SaleDetail;
+import org.springblade.salesPart.dto.SaleDetailDto;
 import org.springblade.salesPart.dto.SalespersonCustomer;
 import org.springblade.salesPart.entity.*;
+import org.springblade.salesPart.enums.OrderStatusEnum;
 import org.springblade.salesPart.enums.OrderTypeEnum;
 import org.springblade.salesPart.excel.*;
 import org.springblade.salesPart.funding.dto.FinancingShipItemDto;
@@ -4782,6 +4784,73 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		return updateCount > 0 ? R.success("订单已关闭") : R.fail("订单关闭失败");
 	}
 
+	@Override
+	public R<AppStatisticsVo> turnoverAnalysis(String startDate, String endDate) {
+		AppStatisticsVo appStatisticsVo = new AppStatisticsVo();
+		BladeUser user = AuthUtil.getUser();
+		SaleDetail saleDetail = new SaleDetail();
+		saleDetail.setTenantId(user.getTenantId());
+		saleDetail.setSalesCompanyId(user.getDeptId());
+		saleDetail.setDateStart(startDate);
+		saleDetail.setDateEnd(endDate);
+		String userRoles = AuthUtil.getUserRole();
+		if (!userRoles.contains("admin") && !userRoles.contains("老板") && userRoles.contains("业务员")) {
+			saleDetail.setSalerName(String.valueOf(user.getUserId()));
+		}
+		appStatisticsVo.valueIsZero();
+		List<Long> orderIds = orderItemsService.getAppSaleDetailList(saleDetail);
+		if (org.springframework.util.CollectionUtils.isEmpty(orderIds)) {
+			return R.data(appStatisticsVo);
+		}
+		List<PjOrder> pjOrderList = orderMapper.selectList(new LambdaQueryWrapper<PjOrder>()
+			.eq(PjOrder::getTenantId, user.getTenantId())
+			.eq(PjOrder::getIsDeleted, 0)
+			.in(PjOrder::getId, orderIds)
+		);
+		if (org.springframework.util.CollectionUtils.isEmpty(pjOrderList)) {
+			return R.data(appStatisticsVo);
+		}
+		List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+			.eq(PjOrderItems::getIsDeleted, 0)
+			.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+			.in(PjOrderItems::getPid, orderIds));
+		if (org.springframework.util.CollectionUtils.isEmpty(pjOrderItemsList)) {
+			return R.data(appStatisticsVo);
+		}
+		List<String> purchaseList = Arrays.asList(BsTypeEnum.PROCUREMENT.info, BsTypeEnum.FINANCING_PROCUREMENT.info, BsTypeEnum.REFUND_PROCUREMENT.info);
+		List<Long> saleOrderIds = pjOrderList.stream().filter(e -> e.getBsType().equals(BsTypeEnum.SALE.info)).map(PjOrder::getId).collect(Collectors.toList());
+		List<Long> purchaseOrderIds = pjOrderList.stream().filter(e -> purchaseList.contains(e.getBsType()) && !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+		// 销售金额
+		BigDecimal income = pjOrderItemsList.stream().filter(e -> saleOrderIds.contains(e.getPid())).map(p -> p.getGoodsNum().multiply(p.getPrice())).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal freightAmount = pjOrderList.stream().filter(e -> e.getBsType().equals(BsTypeEnum.SALE.info)).map(PjOrder::getFreight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+		// 支出-采购金额 primary_goods_total_amount
+		BigDecimal expenditure = pjOrderItemsList.stream().filter(e -> purchaseOrderIds.contains(e.getPid())).map(PjOrderItems::getPrimaryGoodsTotalAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+		//成本
+		BigDecimal cost = pjOrderItemsList.stream().filter(e -> saleOrderIds.contains(e.getPid())).map(p -> p.getGoodsNum().multiply(p.getCostpriePrice())).reduce(BigDecimal.ZERO, BigDecimal::add);
+		// 退货成本
+		BigDecimal returnsCost = pjOrderItemsList.stream().filter(e -> saleOrderIds.contains(e.getPid()) && Objects.nonNull(e.getReturnsNumber())
+			&& BigDecimal.ZERO.compareTo(e.getReturnsNumber()) != 0).map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+		cost = cost.subtract(returnsCost);
+		// 	退货金额
+		BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> saleOrderIds.contains(e.getPid())).map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+		income = income.add(freightAmount).subtract(returnsAmount);
+		//利润
+		BigDecimal profit = income.subtract(cost);
+
+		//平均客单价
+		BigDecimal averageAmount = income.divide(new BigDecimal(saleOrderIds.size()), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP);
+
+		appStatisticsVo.setIncome(income);
+		appStatisticsVo.setProfit(profit);
+		appStatisticsVo.setCost(cost);
+		appStatisticsVo.setReturnsCost(returnsCost);
+		appStatisticsVo.setAverageAmount(averageAmount);
+		appStatisticsVo.setExpenditure(expenditure);
+		appStatisticsVo.setFreightAmount(freightAmount);
+		return R.data(appStatisticsVo);
+	}
+
 	/**
 	 * 保存订单信息
 	 */

+ 223 - 288
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java

@@ -21,6 +21,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import lombok.AllArgsConstructor;
+import org.springblade.common.enums.BsTypeEnum;
+import org.springblade.common.enums.CommonEnum;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
@@ -31,6 +33,8 @@ import org.springblade.salesPart.entity.PjCorpsDesc;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.entity.PjShip;
+import org.springblade.salesPart.enums.FinalMap;
+import org.springblade.salesPart.enums.OrderStatusEnum;
 import org.springblade.salesPart.funding.entity.PjpfBalanceReset;
 import org.springblade.salesPart.funding.entity.PjpfFunding;
 import org.springblade.salesPart.funding.service.IPjpfBalanceResetService;
@@ -41,7 +45,9 @@ import org.springblade.salesPart.ship.service.IShipItemsService;
 import org.springblade.salesPart.ship.service.IShipService;
 import org.springblade.salesPart.statistics.service.IStatisticsService;
 import org.springblade.salesPart.tireMallStatistics.service.ITireMallStatisticsService;
+import org.springblade.salesPart.vo.StatisticsVo;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.MathContext;
@@ -717,19 +723,19 @@ public class StatisticsServiceImpl implements IStatisticsService {
 							items.setBalanceAmount(new BigDecimal("0.00"));
 						} else {
 							if ("TKXS".equals(item.getBsType()) || "TKCG".equals(item.getBsType())) {
-								items.setGoodsNum(new BigDecimal("0.00").subtract(items.getReturnsNumber()));
-								items.setSubTotalMoney(new BigDecimal("0.00").subtract(items.getReturnsAmount()).subtract(item.getFreight()));
-								items.setFreight(new BigDecimal("0.00").subtract(items.getFreight()));
+								items.setGoodsNum(FinalMap.ZERO_POINT_ZERO.subtract(items.getReturnsNumber()));
+								items.setSubTotalMoney(FinalMap.ZERO_POINT_ZERO.subtract(items.getReturnsAmount()).subtract(item.getFreight()));
+								items.setFreight(FinalMap.ZERO_POINT_ZERO.subtract(items.getFreight()));
 								BigDecimal costprie = items.getReturnsNumber().multiply(items.getCostpriePrice());
 								BigDecimal profit = items.getSubTotalMoney().abs().subtract(costprie);
-								items.setProfit(new BigDecimal("0.00").subtract(profit));
-								items.setCostprie(new BigDecimal("0.00").subtract(costprie));
+								items.setProfit(FinalMap.ZERO_POINT_ZERO.subtract(profit));
+								items.setCostprie(FinalMap.ZERO_POINT_ZERO.subtract(costprie));
 								if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
-									items.setBalanceAmount(new BigDecimal("0.00"));
+									items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO);
 									amount = amount.subtract(items.getSubTotalMoney().abs());
 								} else {
-									items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
-									amount = new BigDecimal("0.00");
+									items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO.subtract(items.getSubTotalMoney().abs().subtract(amount)));
+									amount = FinalMap.ZERO_POINT_ZERO;
 								}
 							} else {
 								if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
@@ -737,7 +743,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 									amount = amount.subtract(items.getSubTotalMoney());
 								} else {
 									items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
-									amount = new BigDecimal("0.00");
+									amount = FinalMap.ZERO_POINT_ZERO;
 								}
 							}
 						}
@@ -754,295 +760,224 @@ public class StatisticsServiceImpl implements IStatisticsService {
 	public R saleDetailSum(SaleDetail saleDetailDto) {
 		saleDetailDto.setTenantId(AuthUtil.getTenantId());
 		saleDetailDto.setSalesCompanyId(AuthUtil.getDeptId());
-		Map<String, Object> map = new HashMap<>();
+		StatisticsVo statisticsVo = new StatisticsVo();
+		statisticsVo.valueIsZero();
 		List<SaleDetailDto> saleDetailDtoList = orderItemsService.saleDetailList(saleDetailDto);
-		if (!saleDetailDtoList.isEmpty()) {
-			String billNo = saleDetailDtoList.stream().map(SaleDetailDto::getOrdNo).distinct().collect(Collectors.joining(","));
-			List<PjOrder> pjOrderList = orderService.list(new LambdaQueryWrapper<PjOrder>()
-				.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
-				.eq(PjOrder::getIsDeleted, 0)
-				.apply("find_in_set(ord_no,'" + billNo + "')")
-				.ge(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateStart()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateStart())
-				.le(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateEnd()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateEnd())
-				.ge(ObjectUtils.isNotNull(saleDetailDto.getDateStart()), PjOrder::getDeliveryBusinesDate, saleDetailDto.getDateStart())
-				.le(ObjectUtils.isNotNull(saleDetailDto.getDateEnd()), PjOrder::getDeliveryBusinesDate, saleDetailDto.getDateEnd())
-			);
-			List<Long> pids = pjOrderList.stream().map(PjOrder::getId).collect(Collectors.toList());
-			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
-			if (!pids.isEmpty()) {
-				pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
-					.eq(PjOrderItems::getIsDeleted, 0)
-					.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
-					.in(PjOrderItems::getPid, pids));
+		if (CollectionUtils.isEmpty(saleDetailDtoList)) {
+			return R.data(statisticsVo);
+		}
+		List<String> billNoList = saleDetailDtoList.stream().map(SaleDetailDto::getOrdNo).distinct().collect(Collectors.toList());
+		List<PjOrder> pjOrderList = orderService.list(new LambdaQueryWrapper<PjOrder>()
+			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrder::getIsDeleted, 0)
+			.in(PjOrder::getOrdNo, billNoList)
+			.ge(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateStart()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateStart())
+			.le(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateEnd()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateEnd())
+			.ge(ObjectUtils.isNotNull(saleDetailDto.getDateStart()), PjOrder::getDeliveryBusinesDate, saleDetailDto.getDateStart())
+			.le(ObjectUtils.isNotNull(saleDetailDto.getDateEnd()), PjOrder::getDeliveryBusinesDate, saleDetailDto.getDateEnd())
+		);
+		List<Long> pidList = pjOrderList.stream().map(PjOrder::getId).collect(Collectors.toList());
+		List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+		if (!CollectionUtils.isEmpty(pidList)) {
+			pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.in(PjOrderItems::getPid, pidList));
+		}
+		for (PjOrder item : pjOrderList) {
+			List<SaleDetailDto> saleDetailDtoList1 = saleDetailDtoList.stream().filter(e -> e.getOrdNo().equals(item.getOrdNo())).collect(Collectors.toList());
+			if (CollectionUtils.isEmpty(saleDetailDtoList1)) {
+				continue;
 			}
-			/*for (PjOrder item : pjOrderList) {
-				List<SaleDetailDto> saleDetailDtoList1 = saleDetailDtoList.stream()
-					.filter(e -> e.getOrdNo().equals(item.getOrdNo())).collect(Collectors.toList());
-				if (!saleDetailDtoList1.isEmpty()) {
-					BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).map(PjOrderItems::getReturnsAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
-					BigDecimal amount = item.getPaymentAmountTl().subtract(returnsAmount);
-					amount = amount.abs();
-					for (SaleDetailDto items : saleDetailDtoList1) {
-						if (!pjOrderItemsList.isEmpty()) {
-							PjOrderItems orderItems = pjOrderItemsList.stream().filter(e -> e.getId().equals(items.getItemId())).findFirst().orElse(null);
-							if (orderItems != null) {
-								items.setGoodsNum(orderItems.getGoodsNum());
-								items.setPrice(orderItems.getPrice());
-								items.setSubTotalMoney(orderItems.getGoodsNum().multiply(orderItems.getPrice()));
-								items.setSubTotalMoney(items.getSubTotalMoney().add(item.getFreight()));
-								if ("1".equals(saleDetailDto.getWhetherRebate())) {
-									items.setCostprie(orderItems.getGoodsNum().multiply(orderItems.getRebatePrice()));
-								} else {
-									items.setCostprie(orderItems.getGoodsNum().multiply(orderItems.getCostpriePrice()));
-								}
-								items.setProfit(items.getSubTotalMoney().subtract(items.getCostprie()));
-								items.setReturnsNumber(orderItems.getReturnsNumber());
-								items.setReturnsAmount(orderItems.getReturnsAmount());
-								items.setOutGoodsTotalShipNum(orderItems.getOutGoodsTotalShipNum());
-								items.setOutGoodsTotalShipAmount(orderItems.getOutGoodsTotalShipAmount());
-								items.setPrimaryGoodsTotalNum(orderItems.getPrimaryGoodsTotalNum());
-								items.setPrimaryGoodsTotalMoney(orderItems.getPrimaryGoodsTotalAmount());
-							}
-						}
-						if ("已取消".equals(items.getStatus())) {
-							items.setBalanceAmount(new BigDecimal("0.00"));
-						} else {
-							if ("TKXS".equals(item.getBsType()) || "TKCG".equals(item.getBsType())) {
-								items.setGoodsNum(new BigDecimal("0.00").subtract(items.getReturnsNumber()));
-								items.setSubTotalMoney(new BigDecimal("0.00").subtract(items.getReturnsAmount()).subtract(item.getFreight()));
-//								items.setFreight(new BigDecimal("0.00").subtract(items.getFreight()));
-								if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
-									items.setBalanceAmount(new BigDecimal("0.00"));
-									amount = amount.subtract(items.getSubTotalMoney().abs());
-								} else {
-									items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
-									amount = new BigDecimal("0.00");
-								}
-							} else {
-								if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
-									items.setBalanceAmount(new BigDecimal("0.00"));
-									amount = amount.subtract(items.getSubTotalMoney());
-								} else {
-									items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
-									amount = new BigDecimal("0.00");
-								}
-							}
-						}
-						items.setSurplusNum(items.getGoodsNum().subtract(items.getOutGoodsTotalShipNum()));
-						items.setSurplusAmount(items.getSubTotalMoney().subtract(items.getOutGoodsTotalShipAmount()));
+			BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())
+					&& !"线下退款".equals(e.getRefundType())).map(PjOrderItems::getReturnsAmount)
+				.reduce(BigDecimal.ZERO, BigDecimal::add);
+			BigDecimal amount = item.getPaymentAmountTl().subtract(returnsAmount);
+			amount = amount.abs();
+			for (SaleDetailDto items : saleDetailDtoList1) {
+				PjOrderItems orderItems = pjOrderItemsList.stream().filter(e -> e.getId().equals(items.getItemId())).findFirst().orElse(null);
+				if (orderItems != null) {
+					items.setItemRemarks(orderItems.getRemarks());
+					items.setGoodsNum(orderItems.getGoodsNum());
+					items.setPrice(orderItems.getPrice());
+					items.setSubTotalMoney(orderItems.getGoodsNum().multiply(orderItems.getPrice()));
+					items.setSubTotalMoney(items.getSubTotalMoney().add(item.getFreight()));
+					if (CommonEnum.ONE.info.equals(saleDetailDto.getWhetherRebate())) {
+						items.setCostprie(orderItems.getGoodsNum().multiply(orderItems.getRebatePrice()));
+					} else {
+						items.setCostprie(orderItems.getGoodsNum().multiply(orderItems.getCostpriePrice()));
 					}
+					items.setProfit(items.getSubTotalMoney().subtract(items.getCostprie()));
+					items.setReturnsNumber(orderItems.getReturnsNumber());
+					items.setReturnsAmount(orderItems.getReturnsAmount());
+					items.setOutGoodsTotalShipNum(orderItems.getOutGoodsTotalShipNum());
+					items.setOutGoodsTotalShipAmount(orderItems.getOutGoodsTotalShipAmount());
+					items.setPrimaryGoodsTotalNum(orderItems.getPrimaryGoodsTotalNum());
+					items.setPrimaryGoodsTotalMoney(orderItems.getPrimaryGoodsTotalAmount());
+					items.setCostpriePrice(orderItems.getCostpriePrice());
 				}
-			}*/
-			for (PjOrder item : pjOrderList) {
-				List<SaleDetailDto> saleDetailDtoList1 = saleDetailDtoList.stream()
-					.filter(e -> e.getOrdNo().equals(item.getOrdNo())).collect(Collectors.toList());
-				if (!saleDetailDtoList1.isEmpty()) {
-					BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())
-							&& !"线下退款".equals(e.getRefundType())).map(PjOrderItems::getReturnsAmount)
-						.reduce(BigDecimal.ZERO, BigDecimal::add);
-					BigDecimal amount = item.getPaymentAmountTl().subtract(returnsAmount);
-					amount = amount.abs();
-					for (SaleDetailDto items : saleDetailDtoList1) {
-						items.setRemarks(item.getRemarks());
-						if (!pjOrderItemsList.isEmpty()) {
-							PjOrderItems orderItems = pjOrderItemsList.stream().filter(e -> e.getId().equals(items.getItemId())).findFirst().orElse(null);
-							if (orderItems != null) {
-								items.setItemRemarks(orderItems.getRemarks());
-								items.setGoodsNum(orderItems.getGoodsNum());
-								items.setPrice(orderItems.getPrice());
-								items.setSubTotalMoney(orderItems.getGoodsNum().multiply(orderItems.getPrice()));
-								items.setSubTotalMoney(items.getSubTotalMoney().add(item.getFreight()));
-								if ("1".equals(saleDetailDto.getWhetherRebate())) {
-									items.setCostprie(orderItems.getGoodsNum().multiply(orderItems.getRebatePrice()));
-								} else {
-									items.setCostprie(orderItems.getGoodsNum().multiply(orderItems.getCostpriePrice()));
-								}
-								items.setProfit(items.getSubTotalMoney().subtract(items.getCostprie()));
-								items.setReturnsNumber(orderItems.getReturnsNumber());
-								items.setReturnsAmount(orderItems.getReturnsAmount());
-								items.setOutGoodsTotalShipNum(orderItems.getOutGoodsTotalShipNum());
-								items.setOutGoodsTotalShipAmount(orderItems.getOutGoodsTotalShipAmount());
-								items.setPrimaryGoodsTotalNum(orderItems.getPrimaryGoodsTotalNum());
-								items.setPrimaryGoodsTotalMoney(orderItems.getPrimaryGoodsTotalAmount());
-								items.setCostpriePrice(orderItems.getCostpriePrice());
-							}
-						}
-						if ("已取消".equals(items.getStatus())) {
-							items.setBalanceAmount(new BigDecimal("0.00"));
-//							items.setGoodsNum(new BigDecimal("0.00"));
-//							items.setProfit(new BigDecimal("0.00"));
-//							items.setSubTotalMoney(new BigDecimal("0.00"));
-//							items.setFreight(new BigDecimal("0.00"));
-//							items.setCostprie(new BigDecimal("0.00"));
-						} else {
-							if ("TKXS".equals(item.getBsType()) || "TKCG".equals(item.getBsType())) {
-								if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
-									items.setBalanceAmount(new BigDecimal("0.00"));
-									amount = amount.subtract(items.getSubTotalMoney().abs());
-								} else {
-									items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
-									amount = new BigDecimal("0.00");
-								}
-								items.setGoodsNum(new BigDecimal("0.00").subtract(items.getReturnsNumber()));
-								items.setSubTotalMoney(new BigDecimal("0.00").subtract(items.getReturnsAmount()).subtract(item.getFreight()));
-								items.setFreight(new BigDecimal("0.00").subtract(items.getFreight()));
-								BigDecimal costprie = items.getReturnsNumber().multiply(items.getCostpriePrice());
-								BigDecimal profit = items.getSubTotalMoney().abs().subtract(costprie);
-								items.setProfit(new BigDecimal("0.00").subtract(profit));
-								items.setCostprie(new BigDecimal("0.00").subtract(costprie));
-							} else {
-								if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
-									items.setBalanceAmount(new BigDecimal("0.00"));
-									amount = amount.subtract(items.getSubTotalMoney());
-								} else {
-									items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
-									amount = new BigDecimal("0.00");
-								}
-							}
-						}
-						items.setSurplusNum(items.getGoodsNum().subtract(items.getOutGoodsTotalShipNum()));
-						items.setSurplusAmount(items.getSubTotalMoney().subtract(items.getOutGoodsTotalShipAmount()));
+				if (OrderStatusEnum.CANCELLED.value.equals(items.getStatus())) {
+					// 已取消的
+					items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO);
+					items.setSurplusNum(items.getGoodsNum().subtract(items.getOutGoodsTotalShipNum()));
+					items.setSurplusAmount(items.getSubTotalMoney().subtract(items.getOutGoodsTotalShipAmount()));
+					continue;
+				}
+				if (BsTypeEnum.REFUND_SALE.info.equals(item.getBsType()) || BsTypeEnum.REFUND_PROCUREMENT.info.equals(item.getBsType())) {
+					if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
+						items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO);
+						amount = amount.subtract(items.getSubTotalMoney().abs());
+					} else {
+						items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO.subtract(items.getSubTotalMoney().abs().subtract(amount)));
+						amount = FinalMap.ZERO_POINT_ZERO;
 					}
+					items.setGoodsNum(FinalMap.ZERO_POINT_ZERO.subtract(items.getReturnsNumber()));
+					items.setSubTotalMoney(FinalMap.ZERO_POINT_ZERO.subtract(items.getReturnsAmount()).subtract(item.getFreight()));
+					items.setFreight(FinalMap.ZERO_POINT_ZERO.subtract(items.getFreight()));
+					BigDecimal costPrice = items.getReturnsNumber().multiply(items.getCostpriePrice());
+					BigDecimal profit = items.getSubTotalMoney().abs().subtract(costPrice);
+					items.setProfit(FinalMap.ZERO_POINT_ZERO.subtract(profit));
+					items.setCostprie(FinalMap.ZERO_POINT_ZERO.subtract(costPrice));
+					items.setSurplusNum(items.getGoodsNum().subtract(items.getOutGoodsTotalShipNum()));
+					items.setSurplusAmount(items.getSubTotalMoney().subtract(items.getOutGoodsTotalShipAmount()));
+					continue;
 				}
+				if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
+					items.setBalanceAmount(FinalMap.ZERO_POINT_ZERO);
+					amount = amount.subtract(items.getSubTotalMoney());
+				} else {
+					items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
+					amount = FinalMap.ZERO_POINT_ZERO;
+				}
+				items.setSurplusNum(items.getGoodsNum().subtract(items.getOutGoodsTotalShipNum()));
+				items.setSurplusAmount(items.getSubTotalMoney().subtract(items.getOutGoodsTotalShipAmount()));
 			}
-			BigDecimal goodsNumCancel = saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
-				.map(SaleDetailDto::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-			BigDecimal subTotalMoneyCancel = saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
-				.map(SaleDetailDto::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-			BigDecimal costprieCancel = saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
-				.map(SaleDetailDto::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-			BigDecimal profitCancel = saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
-				.map(SaleDetailDto::getProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-			BigDecimal freightCancel = pjOrderList.stream().filter(e -> "已取消".equals(e.getStatus()))
-				.map(PjOrder::getFreight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-
-			BigDecimal goodsNumActual = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal subTotalMoneyActual = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal costprieActual = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal profitActual = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal freight = pjOrderList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(PjOrder::getFreight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal outGoodsTotalShipNum = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getOutGoodsTotalShipNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal outGoodsTotalShipAmount = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getOutGoodsTotalShipAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal primaryGoodsTotalNum = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getPrimaryGoodsTotalNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal primaryGoodsTotalMoney = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getPrimaryGoodsTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal surplusNum = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getSurplusNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
-			BigDecimal surplusAmount = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getSurplusAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP);
+		}
+		//  已取消的数量
+		BigDecimal goodsNumCancel = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.CANCELLED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		// 已取消的金额
+		BigDecimal subTotalMoneyCancel = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.CANCELLED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		// 已取消的成本金额
+		BigDecimal costprieCancel = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.CANCELLED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		// 已取消的毛利
+		BigDecimal profitCancel = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.CANCELLED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		// 已取消的运费
+		BigDecimal freightCancel = pjOrderList.stream().filter(e -> OrderStatusEnum.CANCELLED.value.equals(e.getStatus()))
+			.map(PjOrder::getFreight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
 
-			BigDecimal freightReturns = pjOrderList.stream().filter(e -> "已完成".equals(e.getStatus()))
-				.map(PjOrder::getFreight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-			BigDecimal goodsNumReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-			BigDecimal subTotalMoneyReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-			BigDecimal costprieReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
-			BigDecimal profitReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
-				.map(SaleDetailDto::getProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP).abs();
+		// 实际数量
+		BigDecimal goodsNumActual = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 实际金额
+		BigDecimal subTotalMoneyActual = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 实际成本金额
+		BigDecimal costprieActual = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 剩余数量
+		BigDecimal profitActual = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 运费
+		BigDecimal freight = pjOrderList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(PjOrder::getFreight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 已发货数量
+		BigDecimal outGoodsTotalShipNum = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getOutGoodsTotalShipNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 已发货金额
+		BigDecimal outGoodsTotalShipAmount = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getOutGoodsTotalShipAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 订单数量
+		BigDecimal primaryGoodsTotalNum = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getPrimaryGoodsTotalNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 订单金额
+		BigDecimal primaryGoodsTotalMoney = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getPrimaryGoodsTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 剩余数量
+		BigDecimal surplusNum = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getSurplusNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 剩余金额
+		BigDecimal surplusAmount = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getSurplusAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP);
+		// 退货运费
+		BigDecimal freightReturns = pjOrderList.stream().filter(e -> OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(PjOrder::getFreight).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		// 退货数量
+		BigDecimal goodsNumReturns = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		// 退货金额
+		BigDecimal subTotalMoneyReturns = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		// 退货成本金额
+		BigDecimal costprieReturns = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		// 退货毛利金额
+		BigDecimal profitReturns = saleDetailDtoList.stream().filter(e -> OrderStatusEnum.COMPLETED.value.equals(e.getStatus()))
+			.map(SaleDetailDto::getProfit).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
 
-			if ("TKXS".equals(saleDetailDto.getBsType()) || "TKCG".equals(saleDetailDto.getBsType())) {
-				map.put("goodsSum", new BigDecimal("0"));
-				map.put("amount", new BigDecimal("0"));
-				map.put("costprie", new BigDecimal("0"));
-				map.put("profit", new BigDecimal("0"));
-				map.put("freight", new BigDecimal("0"));
-				map.put("freightCancellation", freightCancel.add(freightReturns));
-				map.put("goodsSumCancellation", goodsNumCancel.add(goodsNumReturns));
-				map.put("amountCancellation", subTotalMoneyCancel.add(subTotalMoneyReturns));
-				map.put("costprieCancellation", costprieCancel.add(costprieReturns));
-				map.put("profitCancellation", profitCancel.add(profitReturns));
-				map.put("outGoodsTotalShipNum", new BigDecimal("0"));
-				map.put("outGoodsTotalShipAmount", new BigDecimal("0"));
-				map.put("primaryGoodsTotalNum", new BigDecimal("0"));
-				map.put("primaryGoodsTotalMoney", new BigDecimal("0"));
-				map.put("surplusNum", new BigDecimal("0"));
-				map.put("surplusAmount", new BigDecimal("0"));
-			} else if ("XS".equals(saleDetailDto.getBsType()) || "CG".equals(saleDetailDto.getBsType())
-				|| "RZCG".equals(saleDetailDto.getBsType())) {
-				map.put("goodsSum", goodsNumActual);
-				map.put("amount", subTotalMoneyActual);
-				map.put("costprie", costprieActual);
-				map.put("profit", profitActual);
-				map.put("freight", freight.abs());
-				map.put("freightCancellation", "0");
-				map.put("goodsSumCancellation", "0");
-				map.put("amountCancellation", "0.00");
-				map.put("costprieCancellation", "0.00");
-				map.put("profitCancellation", "0.00");
-				map.put("outGoodsTotalShipNum", outGoodsTotalShipNum);
-				map.put("outGoodsTotalShipAmount", outGoodsTotalShipAmount);
-				map.put("primaryGoodsTotalNum", primaryGoodsTotalNum);
-				map.put("primaryGoodsTotalMoney", primaryGoodsTotalMoney);
-				map.put("surplusNum", surplusNum);
-				map.put("surplusAmount", surplusAmount);
-			} else {
-				map.put("goodsSum", goodsNumActual.abs().add(goodsNumCancel));
-				map.put("amount", subTotalMoneyActual.abs().add(subTotalMoneyCancel));
-				map.put("costprie", costprieActual.abs().add(costprieCancel));
-				map.put("profit", profitActual.abs().add(profitCancel));
-				map.put("freight", freight.abs().add(freightCancel));
-				map.put("freightCancellation", freightCancel.add(freightReturns));
-				map.put("goodsSumCancellation", goodsNumCancel.add(goodsNumReturns));
-				map.put("amountCancellation", subTotalMoneyCancel.add(subTotalMoneyReturns));
-				map.put("costprieCancellation", costprieCancel.add(costprieReturns));
-				map.put("profitCancellation", profitCancel.add(profitReturns));
-				map.put("outGoodsTotalShipNum", outGoodsTotalShipNum);
-				map.put("outGoodsTotalShipAmount", outGoodsTotalShipAmount);
-				map.put("primaryGoodsTotalNum", primaryGoodsTotalNum);
-				map.put("primaryGoodsTotalMoney", primaryGoodsTotalMoney);
-				map.put("surplusNum", surplusNum);
-				map.put("surplusAmount", surplusAmount);
-			}
-		} else {
-			map.put("goodsSum", "0");
-			map.put("amount", "0.00");
-			map.put("costprie", "0.00");
-			map.put("profit", "0.00");
-			map.put("goodsSumCancellation", "0");
-			map.put("amountCancellation", "0.00");
-			map.put("costprieCancellation", "0.00");
-			map.put("profitCancellation", "0.00");
-			map.put("freight", "0.00");
-			map.put("freightCancellation", "0.00");
-			map.put("outGoodsTotalShipNum", "0.00");
-			map.put("outGoodsTotalShipAmount", "0.00");
-			map.put("primaryGoodsTotalNum", "0.00");
-			map.put("primaryGoodsTotalMoney", "0.00");
-			map.put("surplusNum", "0.00");
-			map.put("surplusAmount", "0.00");
+		if (BsTypeEnum.REFUND_SALE.info.equals(saleDetailDto.getBsType()) || BsTypeEnum.REFUND_PROCUREMENT.info.equals(saleDetailDto.getBsType())) {
+			statisticsVo.setFreightCancellation(freightCancel.add(freightReturns));
+			statisticsVo.setGoodsSumCancellation(goodsNumCancel.add(goodsNumReturns));
+			statisticsVo.setAmountCancellation(subTotalMoneyCancel.add(subTotalMoneyReturns));
+			statisticsVo.setCostPriceCancellation(costprieCancel.add(costprieReturns));
+			statisticsVo.setProfitCancellation(profitCancel.add(profitReturns));
+			return R.data(statisticsVo);
 		}
-		return R.data(map);
+		if (BsTypeEnum.SALE.info.equals(saleDetailDto.getBsType()) || BsTypeEnum.PROCUREMENT.info.equals(saleDetailDto.getBsType()) || BsTypeEnum.FINANCING_PROCUREMENT.info.equals(saleDetailDto.getBsType())) {
+			statisticsVo.setGoodsSum(goodsNumActual);
+			statisticsVo.setAmount(subTotalMoneyActual);
+			statisticsVo.setCostPrice(costprieActual);
+			statisticsVo.setProfit(profitActual);
+			statisticsVo.setFreight(freight.abs());
+			statisticsVo.setOutGoodsTotalShipNum(outGoodsTotalShipNum);
+			statisticsVo.setOutGoodsTotalShipAmount(outGoodsTotalShipAmount);
+			statisticsVo.setPrimaryGoodsTotalNum(primaryGoodsTotalNum);
+			statisticsVo.setPrimaryGoodsTotalMoney(primaryGoodsTotalMoney);
+			statisticsVo.setSurplusNum(surplusNum);
+			statisticsVo.setSurplusAmount(surplusAmount);
+			return R.data(statisticsVo);
+		}
+		statisticsVo.setGoodsSum(goodsNumActual.abs().add(goodsNumCancel));
+		statisticsVo.setAmount(subTotalMoneyActual.abs().add(subTotalMoneyCancel));
+		statisticsVo.setCostPrice(costprieActual.abs().add(costprieCancel));
+		statisticsVo.setProfit(profitActual.abs().add(profitCancel));
+		statisticsVo.setFreight(freight.abs().add(freightCancel));
+		statisticsVo.setFreightCancellation(freightCancel.add(freightReturns));
+		statisticsVo.setGoodsSumCancellation(goodsNumCancel.add(goodsNumReturns));
+		statisticsVo.setAmountCancellation(subTotalMoneyCancel.add(subTotalMoneyReturns));
+		statisticsVo.setCostPriceCancellation(costprieCancel.add(costprieReturns));
+		statisticsVo.setProfitCancellation(profitCancel.add(profitReturns));
+		statisticsVo.setOutGoodsTotalShipNum(outGoodsTotalShipNum);
+		statisticsVo.setOutGoodsTotalShipAmount(outGoodsTotalShipAmount);
+		statisticsVo.setPrimaryGoodsTotalNum(primaryGoodsTotalNum);
+		statisticsVo.setPrimaryGoodsTotalMoney(primaryGoodsTotalMoney);
+		statisticsVo.setSurplusNum(surplusNum);
+		statisticsVo.setSurplusAmount(surplusAmount);
+		return R.data(statisticsVo);
 	}
 
 	@Override