Jelajahi Sumber

Merge remote-tracking branch 'origin/dev' into dev

wfg 5 bulan lalu
induk
melakukan
d490173c6a
27 mengubah file dengan 1246 tambahan dan 369 penghapusan
  1. 1 1
      blade-gateway/src/main/java/org/springblade/gateway/filter/GlobalRequestLogFilter.java
  2. 1 1
      blade-gateway/src/main/java/org/springblade/gateway/filter/GlobalResponseLogFilter.java
  3. 4 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/dto/SaleDetailDto.java
  4. 28 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/enums/OrderStatusEnum.java
  5. 2 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderStatisticsExcel.java
  6. 20 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/vo/AppPendingPaymentParamVo.java
  7. 39 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/vo/AppPendingPaymentVo.java
  8. 61 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/vo/AppStatisticsVo.java
  9. 128 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/vo/StatisticsVo.java
  10. 6 0
      blade-service-api/tire-center-warehouse-api/src/main/java/com/ecp/tire/center/warehouse/api/stock/vo/CenterStockExportExcelVo.java
  11. 29 9
      blade-service/blade-los/src/main/java/org/springblade/los/app/service/impl/IndexServiceImpl.java
  12. 11 2
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java
  13. 12 4
      blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/impl/StatisticAnalysisServiceImpl.java
  14. 33 33
      blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/OrderController.java
  15. 1 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/corps/service/impl/CorpsDescServiceImpl.java
  16. 1 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/service/impl/GoodsDescServiceImpl.java
  17. 29 8
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java
  18. 9 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderItemsMapper.java
  19. 26 2
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderItemsMapper.xml
  20. 25 3
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.java
  21. 124 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.xml
  22. 8 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderItemsService.java
  23. 33 3
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderService.java
  24. 5 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderItemsServiceImpl.java
  25. 209 5
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java
  26. 400 295
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java
  27. 1 1
      blade-service/tire-center-warehouse/src/main/java/com/ecp/tire/center/warehouse/stock/controller/CenterStockDescController.java

+ 1 - 1
blade-gateway/src/main/java/org/springblade/gateway/filter/GlobalRequestLogFilter.java

@@ -101,7 +101,7 @@ public class GlobalRequestLogFilter implements GlobalFilter, Ordered {
 
 		beforeReqLog.append("================  Gateway Request End  =================\n");
 		// 打印执行时间
-		log.info(beforeReqLog.toString(), beforeReqArgs.toArray());
+//		log.info(beforeReqLog.toString(), beforeReqArgs.toArray());
 		return chain.filter(exchange);
 	}
 

+ 1 - 1
blade-gateway/src/main/java/org/springblade/gateway/filter/GlobalResponseLogFilter.java

@@ -87,7 +87,7 @@ public class GlobalResponseLogFilter implements GlobalFilter, Ordered {
 
 				responseLog.append("================  Gateway Response End  =================\n");
 				// 打印执行时间
-				log.info(responseLog.toString(), responseArgs.toArray());
+//				log.info(responseLog.toString(), responseArgs.toArray());
 			})
 		);
 	}

+ 4 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/dto/SaleDetailDto.java

@@ -19,6 +19,10 @@ import java.math.BigDecimal;
 @ContentRowHeight(18)
 public class SaleDetailDto {
 
+	/**
+	 * 客户Id
+	 */
+	private Long customerId;
 
 	/**
 	 * 客户名称

+ 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;
+	}
+
+
+}

+ 2 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderStatisticsExcel.java

@@ -107,5 +107,7 @@ public class PjOrderStatisticsExcel implements Serializable {
 	@ExcelProperty(value = "未收金额")
 	private BigDecimal outstandingAmount;
 
+	private BigDecimal returnAmount;
+
 
 }

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

@@ -0,0 +1,20 @@
+package org.springblade.salesPart.vo;
+
+import lombok.Data;
+
+/**
+ * @author Rain
+ */
+@Data
+public class AppPendingPaymentParamVo {
+
+
+	private String salesCompanyId;
+
+
+	private Long salesmanId;
+
+	private String tenantId;
+
+
+}

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

@@ -0,0 +1,39 @@
+package org.springblade.salesPart.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Rain
+ */
+@Data
+public class AppPendingPaymentVo {
+
+	/**
+	 * 客户ID
+	 */
+	private Long customerId;
+
+	/**
+	 * 客户名称
+	 */
+	private String customerName;
+
+	/**
+	 * 销售员
+	 */
+	private String salerName;
+
+	/**
+	 * 地区
+	 */
+	private String region;
+
+	/**
+	 * 待付款金额
+	 */
+	private BigDecimal unpaidAmount;
+
+
+}

+ 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;
+	}
+
+}

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

@@ -0,0 +1,128 @@
+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;
+
+	/**
+	 * 经营利润 = 毛利 - 已取消毛利
+	 */
+	private BigDecimal earnedProfit;
+
+
+
+	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;
+		this.earnedProfit = BigDecimal.ZERO;
+	}
+
+}

+ 6 - 0
blade-service-api/tire-center-warehouse-api/src/main/java/com/ecp/tire/center/warehouse/api/stock/vo/CenterStockExportExcelVo.java

@@ -81,6 +81,12 @@ public class CenterStockExportExcelVo implements Serializable {
 	private String storageName;
 
 	/**
+	 * 库区名称
+	 */
+	@ExcelProperty(value = "库区")
+	private String regionName;
+
+	/**
 	 * 结余数量
 	 */
 	@ExcelProperty(value = "库存数量")

+ 29 - 9
blade-service/blade-los/src/main/java/org/springblade/los/app/service/impl/IndexServiceImpl.java

@@ -67,7 +67,9 @@ public class IndexServiceImpl implements IndexService {
 					lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -142,7 +144,9 @@ public class IndexServiceImpl implements IndexService {
 					lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -175,7 +179,9 @@ public class IndexServiceImpl implements IndexService {
 					lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -215,7 +221,9 @@ public class IndexServiceImpl implements IndexService {
 					lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -271,7 +279,9 @@ public class IndexServiceImpl implements IndexService {
 					lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 //				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -317,6 +327,8 @@ public class IndexServiceImpl implements IndexService {
 					lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
+				}else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
 				} else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
@@ -442,7 +454,9 @@ public class IndexServiceImpl implements IndexService {
 					lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -514,7 +528,9 @@ public class IndexServiceImpl implements IndexService {
 						lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 					} else if (AuthUtil.getUserRole().contains("业务员")) {
 						lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-					} else {
+					} else if (AuthUtil.getUserRole().contains("客服")) {
+						lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+					}else {
 						lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 					}
 					lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -618,7 +634,9 @@ public class IndexServiceImpl implements IndexService {
 						lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 					} else if (AuthUtil.getUserRole().contains("业务员")) {
 						lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-					} else {
+					} else if (AuthUtil.getUserRole().contains("客服")) {
+						lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+					}else {
 						lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 					}
 					lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -674,7 +692,9 @@ public class IndexServiceImpl implements IndexService {
 					lambdaQueryWrapper.like(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.like(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());

+ 11 - 2
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java

@@ -354,6 +354,9 @@ public class BillsController extends BladeController {
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.and(i -> i.eq(Bills::getSrcId, AuthUtil.getUserId()).or()
 						.eq(Bills::getCreateUser, AuthUtil.getUserId()));
+				}else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.and(i -> i.eq(Bills::getCustomerServiceId, AuthUtil.getUserId()).or()
+						.eq(Bills::getCreateUser, AuthUtil.getUserId()));
 				} else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
@@ -816,7 +819,10 @@ public class BillsController extends BladeController {
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.and(i -> i.eq(Bills::getSrcId, AuthUtil.getUserId()).or()
 						.eq(Bills::getCreateUser, AuthUtil.getUserId()));
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.and(i -> i.eq(Bills::getCustomerServiceId, AuthUtil.getUserId()).or()
+						.eq(Bills::getCreateUser, AuthUtil.getUserId()));
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -1052,7 +1058,10 @@ public class BillsController extends BladeController {
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.and(i -> i.eq(Bills::getSrcId, AuthUtil.getUserId()).or()
 						.eq(Bills::getCreateUser, AuthUtil.getUserId()));
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.and(i -> i.eq(Bills::getCustomerServiceId, AuthUtil.getUserId()).or()
+						.eq(Bills::getCreateUser, AuthUtil.getUserId()));
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());

+ 12 - 4
blade-service/blade-los/src/main/java/org/springblade/los/statisticAnalysis/service/impl/StatisticAnalysisServiceImpl.java

@@ -297,7 +297,9 @@ public class StatisticAnalysisServiceImpl extends ServiceImpl<FinanceProfitMappe
 					lambdaQueryWrapper.eq(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.eq(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -331,7 +333,9 @@ public class StatisticAnalysisServiceImpl extends ServiceImpl<FinanceProfitMappe
 					lambdaQueryWrapperSI.eq(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapperSI.eq(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapperSI.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapperSI.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -464,7 +468,9 @@ public class StatisticAnalysisServiceImpl extends ServiceImpl<FinanceProfitMappe
 					lambdaQueryWrapper.eq(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapper.eq(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapper.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
@@ -499,7 +505,9 @@ public class StatisticAnalysisServiceImpl extends ServiceImpl<FinanceProfitMappe
 					lambdaQueryWrapperSI.eq(Bills::getSrcDeptId, AuthUtil.getDeptId());
 				} else if (AuthUtil.getUserRole().contains("业务员")) {
 					lambdaQueryWrapperSI.eq(Bills::getSrcId, AuthUtil.getUserId());
-				} else {
+				} else if (AuthUtil.getUserRole().contains("客服")) {
+					lambdaQueryWrapper.like(Bills::getCustomerServiceId, AuthUtil.getUserId());
+				}else {
 					lambdaQueryWrapperSI.eq(Bills::getCreateUser, AuthUtil.getUserId());
 				}
 				lambdaQueryWrapperSI.eq(Bills::getBranchId, deptUtils.getDeptPid());

+ 33 - 33
blade-service/blade-purchase-sales/src/main/java/org/springblade/purchase/sales/controller/OrderController.java

@@ -362,31 +362,35 @@ public class OrderController extends BladeController {
 		lambdaQueryWrapper.orderByDesc(Order::getId);
 		List<Order> list = orderService.list(lambdaQueryWrapper);
 
-		String corpIds = "";//客户拼接ids
-		String belongToCorpIds = "";//销售公司ids
-		String productionPlantIds = "";//生产工厂ids
-		String createUserIds = "";//创建人id拼接
-
+		StringBuilder ids = new StringBuilder();
+		StringBuilder createUserIds = new StringBuilder();//创建人id拼接
+		List<Long> corpIdList = list.stream().map(Order::getCorpId).distinct().filter(Objects::nonNull).collect(Collectors.toList());
+		List<Long> belongToCorpIdList = list.stream().map(Order::getBelongToCorpId).distinct().filter(Objects::nonNull).collect(Collectors.toList());
+		List<Long> productionPlantIdList = list.stream().map(Order::getProductionPlant).distinct().filter(Objects::nonNull).collect(Collectors.toList());
+		List<Long> idList = new ArrayList<>();
+		if (!corpIdList.isEmpty()) {
+			idList.addAll(corpIdList);
+		}
+		if (!belongToCorpIdList.isEmpty()) {
+			idList.addAll(belongToCorpIdList);
+		}
+		if (!productionPlantIdList.isEmpty()) {
+			idList.addAll(productionPlantIdList);
+		}
+		List<Long> idsList = idList.stream().distinct().collect(Collectors.toList());
+		for (Long id : idsList) {
+			ids.append(id).append(",");
+		}
 		for (Order orders : list) {
-			if (ObjectUtil.isNotEmpty(orders.getCorpId())) {
-				corpIds = corpIds + orders.getCorpId() + ",";
-			}
-			if (ObjectUtil.isNotEmpty(orders.getCorpId())) {
-				belongToCorpIds = belongToCorpIds + orders.getBelongToCorpId() + ",";
-			}
-			if (ObjectUtil.isNotEmpty(orders.getCorpId())) {
-				productionPlantIds = productionPlantIds + orders.getProductionPlant() + ",";
-			}
 			if (ObjectUtil.isNotEmpty(orders.getCreateUser())) {
-				createUserIds = createUserIds + orders.getCreateUser() + ",";
+				createUserIds.append(orders.getCreateUser()).append(",");
 			}
 		}
-
-		List<CorpsDesc> corpsDescList = corpsDescClient.selectByCorpIds(corpIds);
-		List<CorpsDesc> belongToCorpList = corpsDescClient.selectByCorpIds(belongToCorpIds);
-		List<CorpsDesc> productionPlantList = corpsDescClient.selectByCorpIds(productionPlantIds);
+		List<CorpsDesc> corpsDescList = corpsDescClient.selectByCorpIds(ids.toString());
+//		List<CorpsDesc> belongToCorpList = corpsDescClient.selectByCorpIds(belongToCorpIds);
+//		List<CorpsDesc> productionPlantList = corpsDescClient.selectByCorpIds(productionPlantIds);
 		//获得创建人信息
-		List<User> createUserList = userClient.selectUserIds(createUserIds);
+		List<User> createUserList = userClient.selectUserIds(createUserIds.toString());
 
 		if (CollectionUtils.isNotEmpty(list)) {
 			list.forEach(item -> {
@@ -405,19 +409,15 @@ public class OrderController extends BladeController {
 				} else if (item.getSpecialCheck() == 1) {
 					item.setSpecialCheckName("是");
 				}
-				if (item.getCorpId() != null) {
-					if (ObjectUtil.isNotEmpty(corpsDescList)) {
+				if (ObjectUtil.isNotEmpty(corpsDescList)) {
+					if (item.getCorpId() != null) {
 						item.setCorpsName(corpsDescList.stream().filter(e -> e.getId().equals(item.getCorpId())).findFirst().orElse(new CorpsDesc()).getCname());
 					}
-				}
-				if (item.getBelongToCorpId() != null) {
-					if (ObjectUtil.isNotEmpty(belongToCorpList)) {
-						item.setBelongToCorpName(belongToCorpList.stream().filter(e -> e.getId().equals(item.getBelongToCorpId())).findFirst().orElse(new CorpsDesc()).getCname());
+					if (item.getBelongToCorpId() != null) {
+						item.setBelongToCorpName(corpsDescList.stream().filter(e -> e.getId().equals(item.getBelongToCorpId())).findFirst().orElse(new CorpsDesc()).getCname());
 					}
-				}
-				if (item.getProductionPlant() != null) {
-					if (ObjectUtil.isNotEmpty(productionPlantList)) {
-						item.setProductionPlantName(productionPlantList.stream().filter(e -> e.getId().equals(item.getProductionPlant())).findFirst().get().getCname());
+					if (item.getProductionPlant() != null) {
+						item.setProductionPlantName(corpsDescList.stream().filter(e -> e.getId().equals(item.getProductionPlant())).findFirst().get().getCname());
 					}
 				}
 				//制单人
@@ -1170,16 +1170,16 @@ public class OrderController extends BladeController {
 	@ApiOperation(value = "详情", notes = "传入acc")
 	public R synchronization(@RequestParam("billId") Long billId, @RequestParam("ordNo") String ordNo
 		, @RequestParam("primaryOrdNo") String primaryOrdNo) {
-		return orderService.synchronization(billId,ordNo,primaryOrdNo);
+		return orderService.synchronization(billId, ordNo, primaryOrdNo);
 	}
 
 	/**
 	 * 生成账单
 	 */
 	@GetMapping("/generateBills")
-	public R generateBills(@RequestParam("ids") String ids,@RequestParam("billId") String billId) {
+	public R generateBills(@RequestParam("ids") String ids, @RequestParam("billId") String billId) {
 
-		return orderService.generateBills(ids,billId);
+		return orderService.generateBills(ids, billId);
 	}
 
 }

+ 1 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/corps/service/impl/CorpsDescServiceImpl.java

@@ -1555,7 +1555,7 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, PjCorpsDe
 		if (CollectionUtils.isNotEmpty(corpsDesc.getCorpsAddrList())) {
 			long count = corpsDesc.getCorpsAddrList().stream().filter(e -> "1".equals(e.getDefaultAddres())).count();
 			if (count != 1) {
-				throw new RuntimeException("默认地址唯一");
+				throw new RuntimeException("请为该客户选择一个默认地址");
 			}
 			corpsDesc.getCorpsAddrList().stream().forEach(addr -> {
 				addr.setPid(pId);

+ 1 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/service/impl/GoodsDescServiceImpl.java

@@ -294,6 +294,7 @@ public class GoodsDescServiceImpl extends ServiceImpl<GoodsDescMapper, PjGoodsDe
 			e.setSpecificationAndModel(e.getSpecificationAndModel().trim());
 			e.setBrandItem(e.getBrandItem().trim());
 			e.setGoodsSize(e.getGoodsSize().trim());
+			e.setCname(e.getCname().replaceAll("  "," "));
 		}
 		String goodsTypeNames = data.stream().map(GoodsExcel::getGoodsTypeName).distinct().filter(Objects::nonNull).collect(Collectors.joining(","));
 		List<PjGoodsType> goodsTypeList = goodsTypeMapper.selectList(new LambdaQueryWrapper<PjGoodsType>()

+ 29 - 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.*;
@@ -898,6 +895,24 @@ public class OrderController extends BladeController {
 	}
 
 	/**
+	 * app待收款列表
+	 */
+	@GetMapping("/getPendingPaymentList")
+	public R<IPage<AppPendingPaymentVo>> getPendingPaymentList(Query query) {
+		IPage<AppPendingPaymentVo> pages = orderService.getPendingPaymentList(query);
+		return R.data(pages);
+	}
+
+	/**
+	 * app待收款列表
+	 */
+	@GetMapping("/getPendingPaymentSum")
+	public R getPendingPaymentSum() {
+		return R.data(orderService.getPendingPaymentSum());
+	}
+
+
+	/**
 	 * 收款统计(导出)
 	 */
 	@GetMapping("/collectionExport")
@@ -976,9 +991,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 +1061,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);*/
 	}
 
 
@@ -1471,4 +1487,9 @@ public class OrderController extends BladeController {
 		return orderService.closeOrder(order);
 	}
 
+	@PostMapping("/getExpenditurePrice")
+	public R<BigDecimal> getExpenditurePrice(PjOrder order) {
+		return orderService.getExpenditurePrice(order);
+	}
+
 }

+ 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);
 }

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

@@ -325,6 +325,7 @@
     </select>
     <select id="saleDetailList" resultType="org.springblade.salesPart.dto.SaleDetailDto">
         SELECT
+        po.customer_id AS customerId,
         po.customer_name AS customerName,
         bu.real_name AS salerName,
         poi.pid AS pid,
@@ -507,10 +508,10 @@
             and po.actual_payment_status =#{actualPaymentStatus}
         </if>
         <if test="businesDateStart !=null and businesDateStart !=''">
-            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;= #{businesDateStart}
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;=  DATE_FORMAT(#{businesDateStart},'%Y-%m-%d')
         </if>
         <if test="businesDateEnd !=null and businesDateEnd !=''">
-            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;= #{businesDateEnd}
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;=  DATE_FORMAT(#{businesDateEnd},'%Y-%m-%d')
         </if>
         <if test="dateStart !=null and dateStart !=''">
             and DATE_FORMAT(po.delivery_busines_date,'%Y-%m-%d') &gt;= #{dateStart}
@@ -861,6 +862,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>

+ 25 - 3
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.java

@@ -26,9 +26,7 @@ import org.springblade.salesPart.dto.SalespersonCustomer;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.excel.PjOrderStatisticsExcel;
 import org.springblade.salesPart.excel.PjShipStockDetails;
-import org.springblade.salesPart.vo.OrderStatistics;
-import org.springblade.salesPart.vo.OrderVO;
-import org.springblade.salesPart.vo.PjOrderStatisticsWeb;
+import org.springblade.salesPart.vo.*;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
@@ -131,4 +129,28 @@ public interface OrderMapper extends BaseMapper<PjOrder> {
 	 * @return 结果
 	 */
 	BigDecimal selectGoodsNumBySrcOrderNo(@Param("srcOrdNo") String srcOrdNo, @Param("id") Long id);
+
+	/**
+	 * 获取待付款列表
+	 *
+	 * @param paymentParamVo 参数
+	 * @return 结果
+	 */
+	List<AppPendingPaymentVo> getPendingPaymentList(AppPendingPaymentParamVo paymentParamVo);
+
+	/**
+	 * 获取待付款金额和
+	 *
+	 * @param tenantId 租户id
+	 * @return 结果
+	 */
+	BigDecimal getPendingPaymentSum(@Param("tenantId") String tenantId);
+
+	/**
+	 * 获取支出金额和
+	 *
+	 * @param saleDetailDto 参数
+	 * @return 结果
+	 */
+	BigDecimal expenditureSum(SaleDetail saleDetailDto);
 }

+ 124 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.xml

@@ -437,7 +437,7 @@
         WHERE
         o.tenant_id = #{order.tenantId}
         AND o.is_deleted = '0'
-        AND FIND_IN_SET( o.status, '已发货,已收货' )
+        AND FIND_IN_SET( o.status, '待确认,待发货,已发货,退款请核,已收货' )
         <if test="order.customerId!=null">
             and o.customer_id = #{order.customerId}
         </if>
@@ -977,4 +977,127 @@
                 INNER JOIN pjpf_order_items poi ON po.id = poi.pid and po.is_deleted = 0
         WHERE po.src_ord_no = #{srcOrdNo} and poi.is_deleted = 0 and po.id != #{id}
     </select>
+    <select id="getPendingPaymentList" resultType="org.springblade.salesPart.vo.AppPendingPaymentVo"
+            parameterType="org.springblade.salesPart.vo.AppPendingPaymentParamVo">
+        SELECT DISTINCT
+            pcd.id AS customerId,
+            pcd.cname AS customerName,
+            bu.`name` AS salerName,
+            SUBSTRING_INDEX( SUBSTRING_INDEX( pca.belongtoarea, ',', 2 ), ',', - 1 ) AS region,
+        SUM(po2.unpaidAmount) as unpaidAmount
+        FROM
+            pjpf_corps_desc pcd
+                LEFT JOIN pjpf_corps_addr pca ON pcd.id = pca.pid
+                AND pca.default_addres = '1'
+                AND pca.tenant_id = #{tenantId}
+                LEFT JOIN blade_user bu ON pcd.salesman_id = bu.id
+                inner JOIN (
+                    SELECT
+                    pos.id,
+                    pos.customerId,
+                    (
+                    SUM( poi.sub_total_money ) - SUM( poi.returns_amount ) - ( pos.paymentAmountTl - ( CASE WHEN SUM( poi.returns_amount ) = pos.returnsAmount THEN 0 ELSE pos.returnsAmount END ) ) + pos.freight
+                    ) AS unpaidAmount
+                    FROM
+                    (
+                    SELECT
+                    o.id,
+                    o.customer_id AS customerId,
+                    o.freight,
+                    IFNULL( o.total_money, 0 ) AS totalMoney,
+                    IFNULL( o.payment_amount_tl, 0 ) AS paymentAmountTl,
+                    IFNULL( o.returns_amount, 0 ) AS returnsAmount
+                    FROM
+                    pjpf_order o
+                    WHERE
+                    o.tenant_id = #{tenantId}
+                    AND o.is_deleted = '0'
+                    AND FIND_IN_SET( o.STATUS, '待确认,待发货,已发货,退款请核,已收货' )
+                    AND o.total_money != o.payment_amount_tl
+                    AND o.bs_type = 'XS'
+                    AND o.tenant_id = #{tenantId}
+                    ) pos
+                    INNER JOIN pjpf_order_items poi ON pos.id = poi.pid
+                    AND poi.tenant_id = #{tenantId}
+        WHERE
+        poi.is_deleted = 0
+        GROUP BY
+                    pos.id,
+                    pos.customerId
+            ) po2 ON pcd.id = po2.customerId
+        WHERE
+             pcd.is_deleted = '0'
+          AND pcd.tenant_id = #{tenantId}
+        <if test="salesCompanyId != null and salesCompanyId != ''">
+            and pcd.sales_company_id = #{salesCompanyId}
+        </if>
+        group by pcd.id
+        order by unpaidAmount desc
+    </select>
+    <select id="getPendingPaymentSum" resultType="java.math.BigDecimal" parameterType="java.lang.String">
+        SELECT
+            SUM(po2.unpaidAmount)
+        FROM
+            pjpf_corps_desc pcd
+                inner JOIN (
+                SELECT
+                    pos.id,
+                    pos.customerId,
+                    (
+                        SUM( poi.sub_total_money ) - SUM( poi.returns_amount ) - ( pos.paymentAmountTl - ( CASE WHEN SUM( poi.returns_amount ) = pos.returnsAmount THEN 0 ELSE pos.returnsAmount END ) ) + pos.freight
+                        ) AS unpaidAmount
+                FROM
+                    (
+                        SELECT
+                            o.id,
+                            o.customer_id AS customerId,
+                            o.freight,
+                            IFNULL( o.total_money, 0 ) AS totalMoney,
+                            IFNULL( o.payment_amount_tl, 0 ) AS paymentAmountTl,
+                            IFNULL( o.returns_amount, 0 ) AS returnsAmount
+                        FROM
+                            pjpf_order o
+                        WHERE
+                            o.tenant_id = #{tenantId}
+                          AND o.is_deleted = '0'
+                          AND FIND_IN_SET( o.STATUS, '待确认,待发货,已发货,退款请核,已收货' )
+                          AND o.total_money != o.payment_amount_tl
+                    AND o.bs_type = 'XS'
+                    AND o.tenant_id = #{tenantId}
+                    ) pos
+                        INNER JOIN pjpf_order_items poi ON pos.id = poi.pid
+                        AND poi.tenant_id = #{tenantId}
+                WHERE
+                    poi.is_deleted = 0
+                GROUP BY
+                    pos.id,
+                    pos.customerId
+            ) po2 ON pcd.id = po2.customerId
+        WHERE
+            pcd.is_deleted = '0'
+          AND pcd.tenant_id = #{tenantId}
+
+    </select>
+    <select id="expenditureSum" resultType="java.math.BigDecimal"
+            parameterType="org.springblade.salesPart.dto.SaleDetail">
+        select SUM(poi.price * poi.send_num) from pjpf_order po inner join  pjpf_order_items poi on po.id = poi.pid
+        where po.is_deleted = 0 and poi.is_deleted = 0
+        AND po.bs_type = 'CG'
+        AND poi.tenant_id = #{tenantId}
+        AND po.tenant_id = #{tenantId}
+        and poi.refund_type = '未退款'
+        and FIND_IN_SET(po.`status`,'待确认,待发货,已发货,退款请核,已取消,已退款,售后中,已收货,待收货')
+        <if test="salesCompanyId !=null and salesCompanyId != ''">
+            and find_in_set(po.sales_company_id,#{salesCompanyId})
+        </if>
+        <if test="salerName !=null and salerName != ''">
+            and po.saler_name like concat('%', #{salerName}, '%')
+        </if>
+        <if test="businesDateStart !=null and businesDateStart !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;=  DATE_FORMAT(#{businesDateStart},'%Y-%m-%d')
+        </if>
+        <if test="businesDateEnd !=null and businesDateEnd !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;=  DATE_FORMAT(#{businesDateEnd},'%Y-%m-%d')
+        </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);
 }

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

@@ -27,9 +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.OrderStatistics;
-import org.springblade.salesPart.vo.OrderVO;
-import org.springblade.salesPart.vo.PjOrderStatisticsWeb;
+import org.springblade.salesPart.vo.*;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -291,4 +289,36 @@ 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);
+
+	/**
+	 * 获取待付款列表
+	 *
+	 * @param query 分页参数
+	 * @return 结果
+	 */
+	IPage<AppPendingPaymentVo> getPendingPaymentList(Query query);
+
+	/**
+	 * 获取待付款金额
+	 *
+	 * @return 结果
+	 */
+	BigDecimal getPendingPaymentSum();
+
+	/**
+	 * 采购订单统计金额
+	 *
+	 * @param order 参数
+	 * @return 结果
+	 */
+	R<BigDecimal> getExpenditurePrice(PjOrder order);
 }

+ 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);
+	}
+
 
 }

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

@@ -49,8 +49,11 @@ 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.FinalMap;
+import org.springblade.salesPart.enums.OrderStatusEnum;
 import org.springblade.salesPart.enums.OrderTypeEnum;
 import org.springblade.salesPart.excel.*;
 import org.springblade.salesPart.funding.dto.FinancingShipItemDto;
@@ -80,7 +83,6 @@ import org.springblade.salesPart.share.service.IShareSalesItemsService;
 import org.springblade.salesPart.ship.mapper.ShipMapper;
 import org.springblade.salesPart.ship.service.IShipItemsRecordService;
 import org.springblade.salesPart.ship.service.IShipItemsService;
-import org.springblade.salesPart.shopping.mapper.ShoppingMallDetailMapper;
 import org.springblade.salesPart.stock.service.IStockDescService;
 import org.springblade.salesPart.storage.mapper.StorageDescMapper;
 import org.springblade.salesPart.util.UserUtils;
@@ -378,6 +380,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 				lambdaQueryWrapper.apply("DATE_FORMAT( busines_date, '%Y-%m' ) >= '" + order.getBusinesDateList().get(0) + "'" +
 					" AND DATE_FORMAT( busines_date, '%Y-%m' ) <= '" + order.getBusinesDateList().get(1) + "' ");
 			}
+			lambdaQueryWrapper.apply(" total_money != payment_amount_tl ");
 			List<PjOrder> pjOrderList = baseMapper.selectList(lambdaQueryWrapper);
 			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
 			if (!pjOrderList.isEmpty()) {
@@ -2462,20 +2465,21 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	public R statisticsSum(PjOrderStatisticsWeb order) {
 		List<PjOrderStatisticsExcel> list = baseMapper.statisticsExport(order);
 		if (!list.isEmpty()) {
+			List<String> orderTypeList = Arrays.asList("待确认", "待发货", "已发货", "退款请核", "已收货");
 			List<Long> ids = list.stream().map(PjOrderStatisticsExcel::getCustomerId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
 			List<Long> salerId = list.stream().map(PjOrderStatisticsExcel::getSalerId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
-//			List<String> date = list.stream().map(PjOrderStatisticsExcel::getBusinesDate).filter(Objects::nonNull).distinct().collect(Collectors.toList());
 			LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
 			lambdaQueryWrapper.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 				.eq(PjOrder::getIsDeleted, 0)
 				.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())
-				.apply("find_in_set(status,'已发货,已收货')")
+				.in(PjOrder::getStatus, orderTypeList)
 				.in(!ids.isEmpty(), PjOrder::getCustomerId, ids)
 				.in(!salerId.isEmpty(), PjOrder::getSalerId, salerId);
 			if (ObjectUtils.isNotNull(order.getBusinesDateList()) && !order.getBusinesDateList().isEmpty()) {
 				lambdaQueryWrapper.apply("DATE_FORMAT( busines_date, '%Y-%m' ) >= '" + order.getBusinesDateList().get(0) + "'" +
 					" AND DATE_FORMAT( busines_date, '%Y-%m' ) <= '" + order.getBusinesDateList().get(1) + "' ");
 			}
+			lambdaQueryWrapper.apply(" total_money != payment_amount_tl ");
 			List<PjOrder> pjOrderList = baseMapper.selectList(lambdaQueryWrapper);
 			List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
 				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
@@ -2555,7 +2559,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 							if (items.getCustomerId().equals(item.getCustomerId())
 								&& (ObjectUtils.isNotNull(items.getSalerId()) && items.getSalerId().equals(item.getSalerId()))
 								&& date.equals(item.getBusinesDate())
-								&& items.getBsType().equals("XS") && "已发货,已收货".contains(items.getStatus())) {
+								&& items.getBsType().equals("XS") && orderTypeList.contains(items.getStatus())) {
 								orderListDS.add(items.getId());
 								paymentAmountTl = paymentAmountTl.add(items.getPaymentAmountTl());
 								returnPaymentAmountTl = returnPaymentAmountTl.add(items.getReturnsAmount());
@@ -2609,6 +2613,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 						item.setPaymentAmountTl(paymentAmountTl.subtract(returnPaymentAmountTl));
 						item.setProfit(profit);
 						item.setCost(costprie);
+						item.setReturnAmount(returnAmount);
 						item.setOutstandingAmount(salesAmount.subtract(returnAmount).subtract(item.getPaymentAmountTl()).add(item.getFreight()));
 					} else if (1 == order.getType()) {
 						BigDecimal returnAmount = new BigDecimal("0.00");
@@ -4782,6 +4787,205 @@ 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();
+		String userRoles = AuthUtil.getUserRole();
+		appStatisticsVo.valueIsZero();
+		SaleDetail saleDetailDto = new SaleDetail();
+		saleDetailDto.setTenantId(user.getTenantId());
+		saleDetailDto.setSalesCompanyId(user.getDeptId());
+		saleDetailDto.setBusinesDateStart(startDate);
+		saleDetailDto.setBusinesDateEnd(endDate);
+		saleDetailDto.setIsContain("0");
+		saleDetailDto.setBsType("XS,TKXS");
+		if (!userRoles.contains("admin") && !userRoles.contains("老板") && userRoles.contains("业务员")) {
+			saleDetailDto.setSalerName(String.valueOf(user.getUserId()));
+		}
+		StatisticsVo statisticsVo = new StatisticsVo();
+		statisticsVo.valueIsZero();
+		List<SaleDetailDto> saleDetailDtoList = orderItemsService.saleDetailList(saleDetailDto);
+		if (org.springframework.util.CollectionUtils.isEmpty(saleDetailDtoList)) {
+			return R.data(appStatisticsVo);
+		}
+		List<PjOrder> pjOrderList = orderMapper.selectList(new LambdaQueryWrapper<PjOrder>()
+			.eq(PjOrder::getTenantId, user.getTenantId())
+			.eq(PjOrder::getIsDeleted, 0)
+			.in(PjOrder::getOrdNo, saleDetailDtoList.stream().map(SaleDetailDto::getOrdNo).distinct().collect(Collectors.toList()))
+		);
+		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, pjOrderList.stream().map(PjOrder::getId).collect(Collectors.toList())));
+		if (org.springframework.util.CollectionUtils.isEmpty(pjOrderItemsList)) {
+			return R.data(appStatisticsVo);
+		}
+		for (PjOrder item : pjOrderList) {
+			List<SaleDetailDto> saleDetailDtoList1 = saleDetailDtoList.stream().filter(e -> e.getOrdNo().equals(item.getOrdNo())).collect(Collectors.toList());
+			if (org.springframework.util.CollectionUtils.isEmpty(saleDetailDtoList1)) {
+				continue;
+			}
+			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()));
+					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 (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()));
+			}
+		}
+
+		// 已取消的金额 --subTotalMoneyCancel
+		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 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 expenditure = orderMapper.expenditureSum(saleDetailDto);
+		// 已取消的成本金额
+		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 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 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();
+
+
+		// long xsCount = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()) && !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && e.getBsType().equals("销售")).count();
+		long customerCount = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()) && !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && e.getBsType().equals("销售")).map(SaleDetailDto::getCustomerId).distinct().count();
+//		appStatisticsVo.setIncome(subTotalMoneyActual.abs().subtract(subTotalMoneyReturns).subtract(subTotalMoneyCancel));
+//		appStatisticsVo.setCost(costprieActual.abs().subtract(costprieReturns).subtract(costprieCancel));
+//		appStatisticsVo.setProfit(profitActual.abs().subtract(profitReturns).subtract(profitCancel));
+		appStatisticsVo.setIncome(subTotalMoneyActual.abs().subtract(subTotalMoneyReturns));
+		appStatisticsVo.setCost(costprieActual.abs().subtract(costprieReturns));
+		appStatisticsVo.setProfit(profitActual.abs().subtract(profitReturns));
+		// appStatisticsVo.setAverageAmount(appStatisticsVo.getIncome().divide(new BigDecimal(xsCount), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+		appStatisticsVo.setAverageAmount( appStatisticsVo.getIncome().divide(new BigDecimal(customerCount), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+		appStatisticsVo.setExpenditure(expenditure == null ? BigDecimal.ZERO : expenditure.setScale(0, RoundingMode.DOWN));
+		return R.data(appStatisticsVo);
+	}
+
+	@Override
+	public IPage<AppPendingPaymentVo> getPendingPaymentList(Query query) {
+		AppPendingPaymentParamVo paymentParamVo = new AppPendingPaymentParamVo();
+		BladeUser nowAppUser = AuthUtil.getUser();
+		String nowUserRoles = AuthUtil.getUserRole();
+		if (!nowUserRoles.contains("admin") && !nowUserRoles.contains("老板")) {
+			paymentParamVo.setSalesCompanyId(nowAppUser.getDeptId());
+		}
+		paymentParamVo.setTenantId(nowAppUser.getTenantId());
+		IPage<AppPendingPaymentVo> pendingPaymentVo = Condition.getPage(query);
+		pendingPaymentVo.setRecords(orderMapper.getPendingPaymentList(paymentParamVo));
+		return pendingPaymentVo;
+	}
+
+	@Override
+	public BigDecimal getPendingPaymentSum() {
+		return orderMapper.getPendingPaymentSum(AuthUtil.getTenantId());
+	}
+
+	@Override
+	public R<BigDecimal> getExpenditurePrice(PjOrder order) {
+		BladeUser bladeUser = AuthUtil.getUser();
+		SaleDetail saleDetail = new SaleDetail();
+		saleDetail.setTenantId(bladeUser.getTenantId());
+		String userRoles = AuthUtil.getUserRole();
+		saleDetail.setSalesCompanyId(bladeUser.getDeptId());
+		if (!userRoles.contains("admin") && !userRoles.contains("老板") && userRoles.contains("业务员")) {
+			saleDetail.setSalerName(String.valueOf(bladeUser.getUserId()));
+		}
+		if (!org.springframework.util.CollectionUtils.isEmpty(order.getBusinesDateList()) && order.getBusinesDateList().size() > 1) {
+			saleDetail.setBusinesDateStart(order.getBusinesDateList().get(0));
+			saleDetail.setBusinesDateEnd(order.getBusinesDateList().get(1));
+		} else {
+			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+			YearMonth currentMonth = YearMonth.now();
+			LocalDate firstDay = currentMonth.atDay(1);
+			LocalDate lastDay = currentMonth.atEndOfMonth();
+			saleDetail.setBusinesDateStart(firstDay.format(formatter));
+			saleDetail.setBusinesDateEnd(lastDay.format(formatter));
+		}
+		return R.data(orderMapper.expenditureSum(saleDetail));
+	}
+
 	/**
 	 * 保存订单信息
 	 */
@@ -5841,7 +6045,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		}
 		PjOrder pjOrder = baseMapper.selectById(order.getId());
 		if (OrderTypeEnum.NSCRW.getType().equals(pjOrder.getGenerateTask())) {
-			throw new RuntimeException("订单数据已生成出库,请刷新数据重新操作!");
+			throw new RuntimeException("订单数据已撤销出库,请刷新数据重新操作!");
 		}
 		PjShip pjShip = shipMapper.selectOne(new LambdaQueryWrapper<PjShip>().eq(PjShip::getIsDeleted, 0)
 			.eq(PjShip::getOrdId, order.getId())

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

@@ -21,27 +21,37 @@ 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.BladeUser;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
 import org.springblade.salesPart.corps.service.ICorpsDescService;
 import org.springblade.salesPart.dto.*;
 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;
 import org.springblade.salesPart.funding.service.IPjpfFundingService;
+import org.springblade.salesPart.order.mapper.OrderMapper;
 import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.order.service.IOrderService;
 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.AppStatisticsVo;
+import org.springblade.salesPart.vo.StatisticsVo;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 
 import java.math.BigDecimal;
 import java.math.MathContext;
@@ -76,7 +86,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 
 	private final IPjpfBalanceResetService pjpfBalanceResetService;
 
-	private final ITireMallStatisticsService tireMallStatisticsService;
+	private final OrderMapper orderMapper;
 
 	@Override
 	public R<Map<String, Object>> amountStatistics() {
@@ -85,7 +95,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 		saleDetailDto.setTenantId(AuthUtil.getTenantId());
 		saleDetailDto.setSalesCompanyId(AuthUtil.getDeptId());
 		saleDetailDto.setBsType("XS,TKXS");
-		saleDetailDto.setIsContain("1");
+		saleDetailDto.setIsContain("0");
 		LocalDate today = LocalDate.now();
 		// 获取当前月的第一天
 		LocalDate firstDayOfMonth = today.withDayOfMonth(1);
@@ -172,6 +182,16 @@ public class StatisticsServiceImpl implements IStatisticsService {
 			BigDecimal stlAmountReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()) &&
 					"外部销售".equals(e.getBusinessSource())).map(SaleDetailDto::getSubTotalMoney).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 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();
 			map.put("dealAmountM", subTotalMoneyActual.subtract(subTotalMoneyReturns));
 			map.put("salesNumM", goodsNumActual.subtract(goodsNumReturns));
 			map.put("stlAmountM", stlAmountActual.subtract(stlAmountReturns));
@@ -416,7 +436,28 @@ public class StatisticsServiceImpl implements IStatisticsService {
 
 	@Override
 	public R dayNumber() {
-		List<PjOrder> pjOrderList = orderService.list(new LambdaQueryWrapper<PjOrder>()
+		BladeUser bladeUser = AuthUtil.getUser();
+		Date nowDate = DateUtil.now();
+		SaleDetail saleDetailDto = new SaleDetail();
+		saleDetailDto.setTenantId(bladeUser.getTenantId());
+		saleDetailDto.setSalesCompanyId(bladeUser.getDeptId());
+		saleDetailDto.setBsType("XS,TKXS");
+		saleDetailDto.setIsContain("0");
+		String nowDateStr = DateUtil.format(nowDate, DateUtil.PATTERN_DATE);
+		saleDetailDto.setBusinesDateStart(nowDateStr);
+		saleDetailDto.setBusinesDateEnd(nowDateStr);
+		List<SaleDetailDto> saleDetailDtoList = orderItemsService.saleDetailList(saleDetailDto);
+		if (CollectionUtils.isEmpty(saleDetailDtoList)) {
+			return R.data(BigDecimal.ZERO);
+		}
+		BigDecimal goodsNumActualDay = 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).abs();
+		BigDecimal goodsNumReturnsDay = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
+			.map(SaleDetailDto::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)
+			.setScale(0, RoundingMode.HALF_UP).abs();
+		return R.data(goodsNumActualDay.subtract(goodsNumReturnsDay));
+/*		List<PjOrder> pjOrderList = orderService.list(new LambdaQueryWrapper<PjOrder>()
 			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())
 			.eq(PjOrder::getIsDeleted, 0)
@@ -442,7 +483,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 		} else {
 
 			return R.data(0);
-		}
+		}*/
 	}
 
 	@Override
@@ -600,8 +641,139 @@ public class StatisticsServiceImpl implements IStatisticsService {
 
 	@Override
 	public R salesVolumesStatistics(String statusDate, String endDate) {
-		Map<String, Object> map = new HashMap<>();
-		List<PjOrder> pjOrderList = orderService.list(new LambdaQueryWrapper<PjOrder>()
+		AppStatisticsVo appStatisticsVo = new AppStatisticsVo();
+		BladeUser user = AuthUtil.getUser();
+		String userRoles = AuthUtil.getUserRole();
+		appStatisticsVo.valueIsZero();
+		SaleDetail saleDetailDto = new SaleDetail();
+		saleDetailDto.setTenantId(user.getTenantId());
+		saleDetailDto.setSalesCompanyId(user.getDeptId());
+		saleDetailDto.setBusinesDateStart(statusDate);
+		saleDetailDto.setBusinesDateEnd(endDate);
+		saleDetailDto.setIsContain("0");
+		saleDetailDto.setBsType("XS,TKXS");
+		if (!userRoles.contains("admin") && !userRoles.contains("老板") && userRoles.contains("业务员")) {
+			saleDetailDto.setSalerName(String.valueOf(user.getUserId()));
+		}
+		StatisticsVo statisticsVo = new StatisticsVo();
+		statisticsVo.valueIsZero();
+		List<SaleDetailDto> saleDetailDtoList = orderItemsService.saleDetailList(saleDetailDto);
+		if (org.springframework.util.CollectionUtils.isEmpty(saleDetailDtoList)) {
+			return R.data(appStatisticsVo);
+		}
+		List<PjOrder> pjOrderList = orderMapper.selectList(new LambdaQueryWrapper<PjOrder>()
+			.eq(PjOrder::getTenantId, user.getTenantId())
+			.eq(PjOrder::getIsDeleted, 0)
+			.in(PjOrder::getOrdNo, saleDetailDtoList.stream().map(SaleDetailDto::getOrdNo).distinct().collect(Collectors.toList()))
+		);
+		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, pjOrderList.stream().map(PjOrder::getId).collect(Collectors.toList())));
+		if (org.springframework.util.CollectionUtils.isEmpty(pjOrderItemsList)) {
+			return R.data(appStatisticsVo);
+		}
+		for (PjOrder item : pjOrderList) {
+			List<SaleDetailDto> saleDetailDtoList1 = saleDetailDtoList.stream().filter(e -> e.getOrdNo().equals(item.getOrdNo())).collect(Collectors.toList());
+			if (org.springframework.util.CollectionUtils.isEmpty(saleDetailDtoList1)) {
+				continue;
+			}
+			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()));
+					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 (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 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 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();
+		// 已取消的金额 --subTotalMoneyCancel
+		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 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 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();
+
+		long customerCount = saleDetailDtoList.stream().filter(e -> !OrderStatusEnum.COMPLETED.value.equals(e.getStatus()) && !OrderStatusEnum.CANCELLED.value.equals(e.getStatus()) && e.getBsType().equals("销售")).map(SaleDetailDto::getCustomerId).filter(Objects::nonNull).distinct().count();
+		BigDecimal realAmount = subTotalMoneyActual.subtract(subTotalMoneyReturns).subtract(subTotalMoneyCancel);
+		Map<String, Object> map = new HashMap<>(3);
+		map.put("income", goodsNumActual.subtract(goodsNumReturns));
+		map.put("averageAmount", realAmount.divide(new BigDecimal(customerCount), 2, RoundingMode.HALF_UP));
+		map.put("corpsNumber", customerCount);
+
+
+/*		List<PjOrder> pjOrderList = orderService.list(new LambdaQueryWrapper<PjOrder>()
 			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())
 			.eq(PjOrder::getIsDeleted, 0)
@@ -651,7 +823,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 		income = income.subtract(returnsIncome);
 		map.put("income", income);
 		map.put("averageAmount", averageAmount);
-		map.put("corpsNumber", corpsNumber);
+		map.put("corpsNumber", corpsNumber);*/
 		return R.data(map);
 	}
 
@@ -717,19 +889,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 +909,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 +926,228 @@ 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 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 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 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();
 
-			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();
-
-			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.setAmount(subTotalMoneyActual.abs());
+//		statisticsVo.setCostPrice(costprieActual.abs());
+//		statisticsVo.setProfit(profitActual.abs());
+		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);
+		statisticsVo.setEarnedProfit(statisticsVo.getProfit().subtract(statisticsVo.getProfitCancellation()));
+		return R.data(statisticsVo);
 	}
 
 	@Override

+ 1 - 1
blade-service/tire-center-warehouse/src/main/java/com/ecp/tire/center/warehouse/stock/controller/CenterStockDescController.java

@@ -72,7 +72,7 @@ public class CenterStockDescController {
 			.eq(ObjectUtil.isNotEmpty(centerStockDescVo.getStorageId()), CenterStockDesc::getStorageId, centerStockDescVo.getStorageId())
 			.eq(ObjectUtil.isNotEmpty(centerStockDescVo.getBrandId()), CenterStockDesc::getBrandId, centerStockDescVo.getBrandId())
 			.eq(ObjectUtil.isNotEmpty(centerStockDescVo.getGoodsTypeId()), CenterStockDesc::getGoodsTypeId, centerStockDescVo.getGoodsTypeId())
-			.eq(ObjectUtil.isNotEmpty(centerStockDescVo.getCustomerName()), CenterStockDesc::getCustomerName, centerStockDescVo.getCustomerName())
+			.like(ObjectUtil.isNotEmpty(centerStockDescVo.getCustomerName()), CenterStockDesc::getCustomerName, centerStockDescVo.getCustomerName())
 			.like(ObjectUtil.isNotEmpty(centerStockDescVo.getDot()), CenterStockDesc::getDot, centerStockDescVo.getDot())
 			.orderByAsc(CenterStockDesc::getCreateTime);
 		if (CommonEnum.ZERO.info.equals(centerStockDescVo.getWhether())) {