Browse Source

2024年6月4日17:38:57

纪新园 1 year ago
parent
commit
5967676c55
29 changed files with 1118 additions and 94 deletions
  1. 11 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/dto/SaleDetail.java
  2. 62 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/dto/SalespersonCustomer.java
  3. 13 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrder.java
  4. 7 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjProductLaunch.java
  5. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/GoodsDescExportExcel.java
  6. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelCG.java
  7. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelXS.java
  8. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/ProductLaunchExportExcel.java
  9. 35 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/ShipItemImportXSCodeExcel.java
  10. 35 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/ShipItemImportXSExcel.java
  11. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/StockExportExcel.java
  12. 7 0
      blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/impl/FinVouchersServiceImpl.java
  13. 66 6
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java
  14. 7 7
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/ReturnsController.java
  15. 24 4
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderItemsMapper.xml
  16. 7 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.java
  17. 122 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.xml
  18. 25 5
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderService.java
  19. 130 6
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java
  20. 18 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/controller/ProductLaunchController.java
  21. 3 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/mapper/ProductLaunchMapper.java
  22. 71 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/mapper/ProductLaunchMapper.xml
  23. 3 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/service/IProductLaunchService.java
  24. 6 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/service/impl/ProductLaunchServiceImpl.java
  25. 20 25
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java
  26. 26 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/controller/StatisticsController.java
  27. 7 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/IStatisticsService.java
  28. 346 4
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java
  29. 37 37
      blade-service/blade-sales-part/src/main/resources/log/logback-dev.xml

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

@@ -94,5 +94,16 @@ public class SaleDetail {
 	@ExcelIgnore
 	private String brandName;
 
+	/**
+	 * 入出库开日期止
+	 */
+	@ExcelIgnore
+	private String dateStart;
+	/**
+	 * 入出库日期止
+	 */
+	@ExcelIgnore
+	private String dateEnd;
+
 
 }

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

@@ -0,0 +1,62 @@
+package org.springblade.salesPart.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author :jixinyuan
+ * @date : 2024/3/12
+ */
+@Data
+public class SalespersonCustomer {
+
+
+	/**
+	 * 分析对象
+	 */
+	@ExcelProperty(value = "分析对象")
+	private String customerName;
+	/**
+	 * 销售数量
+	 */
+	@ExcelProperty(value = "销售数量")
+	private BigDecimal salesQuantity;
+	/**
+	 * 退货数量
+	 */
+	@ExcelProperty(value = "退货数量")
+	private BigDecimal returnQuantity;
+	/**
+	 * 销售金额
+	 */
+	@ExcelProperty(value = "销售金额")
+	private BigDecimal salesAmount;
+	/**
+	 * 退货金额
+	 */
+	@ExcelProperty(value = "退货金额")
+	private BigDecimal returnAmount;
+
+	/**
+	 * 销售利润
+	 */
+	@ExcelProperty(value = "销售利润")
+	private BigDecimal salesProfit;
+
+	/**
+	 * 运费
+	 */
+	@ExcelProperty(value = "运费")
+	private BigDecimal freight;
+
+	/**
+	 * 销售利润
+	 */
+	@ExcelIgnore
+	private Long id;
+
+
+}

+ 13 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrder.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.salesPart.entity;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
@@ -568,4 +569,16 @@ public class PjOrder implements Serializable {
 	@TableField(exist = false)
 	private String notComplete;
 
+	/**
+	 * 商品IDS
+	 */
+	@TableField(exist = false)
+	private String goodsIds;
+
+	/**
+	 * 余额
+	 */
+	@TableField(exist = false)
+	private BigDecimal balanceAmount;
+
 }

+ 7 - 0
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjProductLaunch.java

@@ -16,6 +16,7 @@
  */
 package org.springblade.salesPart.entity;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableLogic;
@@ -324,4 +325,10 @@ public class PjProductLaunch implements Serializable {
 	 */
 	@TableField(exist = false)
 	private String code;
+
+	/**
+	 * 商品IDS
+	 */
+	@TableField(exist = false)
+	private String goodsIds;
 }

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

@@ -67,5 +67,11 @@ public class GoodsDescExportExcel implements Serializable {
 	@ExcelProperty(value = "商品描述")
 	private String goodsDescription;
 
+	/**
+	 * 商品IDS
+	 */
+	@ExcelProperty(value = "商品IDS")
+	private Long id;
+
 
 }

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

@@ -122,4 +122,10 @@ public class PjOrderExportExcelCG implements Serializable {
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	private Date updateTime;
 
+	/**
+	 * 商品IDS
+	 */
+	@ExcelProperty(value = "商品IDS")
+	private String goodsIds;
+
 }

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

@@ -186,4 +186,10 @@ public class PjOrderExportExcelXS implements Serializable {
 	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 	private Date updateTime;
 
+	/**
+	 * 商品IDS
+	 */
+	@ExcelProperty(value = "商品IDS")
+	private String goodsIds;
+
 }

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

@@ -114,4 +114,10 @@ public class ProductLaunchExportExcel implements Serializable {
 	@ExcelProperty(value = "自修补")
 	private String selfRecovery;
 
+	/**
+	 * 商品IDS
+	 */
+	@ExcelProperty(value = "商品IDS")
+	private String goodsIds;
+
 }

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

@@ -0,0 +1,35 @@
+package org.springblade.salesPart.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 入库明细导入模板实体类
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ShipItemImportXSCodeExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 商品编码
+	 */
+	@ExcelProperty(value = "商品编码(必填)")
+	private String code;
+
+	/**
+	 * 数量
+	 */
+	@ExcelProperty(value = "数量(必填)")
+	private BigDecimal goodsNum;
+
+}

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

@@ -0,0 +1,35 @@
+package org.springblade.salesPart.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 入库明细导入模板实体类
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class ShipItemImportXSExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 商品名称
+	 */
+	@ExcelProperty(value = "商品名称(必填)")
+	private String goodsName;
+
+	/**
+	 * 数量
+	 */
+	@ExcelProperty(value = "数量(必填)")
+	private BigDecimal goodsNum;
+
+}

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

@@ -101,4 +101,10 @@ public class StockExportExcel implements Serializable {
 	 */
 	@ExcelProperty(value = "盘点库存")
 	private BigDecimal profitLossNum;
+
+	/**
+	 * 商品IDS
+	 */
+	@ExcelProperty(value = "商品IDS")
+	private Long goodsId;
 }

+ 7 - 0
blade-service/blade-los/src/main/java/org/springblade/los/finance/vouchers/service/impl/FinVouchersServiceImpl.java

@@ -220,6 +220,10 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 				item.setAccountYear(finVouchers.getAccountYear());
 				item.setAccountMonth(finVouchers.getAccountMonth());
 				item.setAccountDay(finVouchers.getAccountDay());
+				item.setBillNo(finVouchers.getBillNo());
+				item.setVoucherNo(finVouchers.getVoucherNo());
+				item.setVoucherSource(finVouchers.getVoucherSource());
+				item.setVoucherType(finVouchers.getVoucherType());
 				if (item.getId() == null) {
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
@@ -1313,8 +1317,11 @@ public class FinVouchersServiceImpl extends ServiceImpl<FinVouchersMapper, FinVo
 			List<FinGenlegCalc> finGenlegCalcListNew = new ArrayList<>();
 			for (FinVouchersItems item : finVouchers.getFinVouchersItemsList()) {
 				item.setPid(finVouchers.getId());
+				item.setVoucherNo(finVouchers.getVoucherNo());
+				item.setBillNo(finVouchers.getBillNo());
 				Accounts accounts = accountsList.stream().filter(e -> e.getId().equals(item.getAccountId())).findFirst().orElse(null);
 				if (accounts != null) {
+					item.setAccountFullName(accounts.getFullName());
 					FinGenleg finGenleg = finGenlegList.stream().filter(e -> e.getAccId().equals(item.getAccountId()) &&
 						e.getAccyear().equals(item.getAccountYear()) && e.getAccmonth().equals(item.getAccountMonth())).findFirst().orElse(null);
 					FinGenlegCalc finGenlegCalc;

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

@@ -51,15 +51,13 @@ import org.springblade.salesPart.vo.PjOrderStatisticsWeb;
 import org.springblade.system.user.entity.User;
 import org.springblade.system.user.feign.IUserClient;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.math.BigDecimal;
 import java.math.MathContext;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -116,6 +114,7 @@ public class OrderController extends BladeController {
 			.like(ObjectUtils.isNotEmpty(order.getCustomerName()), PjOrder::getCustomerName, order.getCustomerName())
 			.like(ObjectUtils.isNotEmpty(order.getSrcOrdNo()), PjOrder::getSrcOrdNo, order.getSrcOrdNo())//来源单号
 			.like(ObjectUtils.isNotEmpty(order.getOrdNo()), PjOrder::getOrdNo, order.getOrdNo())//来源单号
+			.like(ObjectUtils.isNotEmpty(order.getGoodsNameJoin()), PjOrder::getGoodsNameJoin, order.getGoodsNameJoin())//来源单号
 			.like(ObjectUtils.isNotEmpty(order.getBusinessSource()), PjOrder::getBusinessSource, order.getBusinessSource());//来源
 		if (order.getDueDateList() != null && order.getDueDateList().size() > 1) {//应结日期
 			lambdaQueryWrapper.ge(PjOrder::getDueDate, order.getDueDateList().get(0));
@@ -271,7 +270,10 @@ public class OrderController extends BladeController {
 		List<User> updateUserList = iUserClient.selectUserIds(updateUserIds.toString());
 		//获得创建人信息
 		List<User> createUserList = iUserClient.selectUserIds(createUserIds.toString());
-
+		List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+			.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrderItems::getIsDeleted, 0)
+			.eq(PjOrderItems::getPid, pages.stream().map(PjOrder::getId).distinct().collect(Collectors.toList())));
 		if (CollectionUtils.isNotEmpty(pages)) {
 			pages.forEach(item -> {
 				if (ObjectUtil.isNotEmpty(updateUserList)) {
@@ -280,6 +282,9 @@ public class OrderController extends BladeController {
 						item.setUpdateUserName(user.getName());
 					}
 				}
+				List<Long> pjOrderItems = pjOrderItemsList.stream().filter(e-> e.getPid().equals(item.getId()))
+					.map(PjOrderItems::getGoodsId).filter(Objects::nonNull).collect(Collectors.toList());
+				item.setGoodsIds(pjOrderItems.stream().map(Object::toString).collect(Collectors.joining(",")));
 				if (item.getGoodsTotalNum().compareTo(item.getReturnsNumber()) == 0) {
 					item.setReturnsStatus("全退");
 				} else if (item.getGoodsTotalNum().compareTo(item.getReturnsNumber()) > 0 && new BigDecimal("0.00").compareTo(item.getReturnsNumber()) != 0) {
@@ -757,9 +762,11 @@ public class OrderController extends BladeController {
 			if ("TKXS".equals(item.getBsType()) || "TKCG".equals(item.getBsType())) {
 				item.setGoodsTotalNum(new BigDecimal("0"));
 				item.setTotalMoney(new BigDecimal("0.00"));
-			}else{
+				item.setBalanceAmount(item.getReturnsAmount().subtract(item.getPaymentAmountTl()));
+			} else {
 				item.setReturnsAmount(new BigDecimal("0.00"));
 				item.setReturnsNumber(new BigDecimal("0"));
+				item.setBalanceAmount(item.getTotalMoney().subtract(item.getPaymentAmountTl()));
 			}
 		}
 		return R.data(pages);
@@ -960,4 +967,57 @@ public class OrderController extends BladeController {
 		return orderService.shortcutWarehousing(order);
 	}
 
+	/**
+	 * 入库明细导入
+	 */
+	@PostMapping("/import-item-name")
+	@ApiOperationSupport(order = 13)
+	public R<List<PjOrderItems>> importItemName(@RequestParam("file") MultipartFile file) {
+		//导入数据
+		List<ShipItemImportXSExcel> excelList = ExcelUtil.read(file, ShipItemImportXSExcel.class);
+		if (CollectionUtils.isEmpty(excelList)) {
+			throw new SecurityException("数据不能为空");
+		}
+
+		return orderService.importItemName(excelList);
+	}
+
+	/**
+	 * 入库明细导入
+	 */
+	@PostMapping("/import-item-code")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "入库明细导入", notes = "传入excel")
+	public R<List<PjOrderItems>> importItemCode(@RequestParam("file") MultipartFile file) {
+		//导入数据
+		List<ShipItemImportXSCodeExcel> excelList = ExcelUtil.read(file, ShipItemImportXSCodeExcel.class);
+		if (CollectionUtils.isEmpty(excelList)) {
+			throw new SecurityException("数据不能为空");
+		}
+
+		return orderService.importItemCode(excelList);
+	}
+
+	/**
+	 * 导出模板
+	 */
+	@GetMapping("/export-item-name")
+	@ApiOperationSupport(order = 14)
+	@ApiOperation(value = "导出模板")
+	public void exportItemName(HttpServletResponse response) {
+		List<ShipItemImportXSExcel> list = new ArrayList<>();
+		ExcelUtil.export(response, "导入模板-明细信息", "导入模板-明细信息", list, ShipItemImportXSExcel.class);
+	}
+
+	/**
+	 * 导出模板
+	 */
+	@GetMapping("/export-item-code")
+	@ApiOperationSupport(order = 14)
+	@ApiOperation(value = "导出模板")
+	public void exportItemCode(HttpServletResponse response) {
+		List<ShipItemImportXSCodeExcel> list = new ArrayList<>();
+		ExcelUtil.export(response, "导入模板-明细信息(code)", "导入模板-明细信息(code)", list, ShipItemImportXSCodeExcel.class);
+	}
+
 }

+ 7 - 7
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/ReturnsController.java

@@ -33,6 +33,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -81,6 +82,7 @@ public class ReturnsController {
 			.like(ObjectUtils.isNotEmpty(order.getCustomerName()), PjOrder::getCustomerName, order.getCustomerName())
 			.like(ObjectUtils.isNotEmpty(order.getSrcOrdNo()), PjOrder::getSrcOrdNo, order.getSrcOrdNo())//来源单号
 			.like(ObjectUtils.isNotEmpty(order.getOrdNo()), PjOrder::getOrdNo, order.getOrdNo())//来源单号
+			.like(ObjectUtils.isNotEmpty(order.getGoodsNameJoin()), PjOrder::getGoodsNameJoin, order.getGoodsNameJoin())//来源单号
 			.like(ObjectUtils.isNotEmpty(order.getSrcNo()), PjOrder::getSrcNo, order.getSrcNo())
 			.like(ObjectUtils.isNotEmpty(order.getBusinessSource()), PjOrder::getBusinessSource, order.getBusinessSource());
 		if (order.getDueDateList() != null && order.getDueDateList().size() > 1) {//应结日期
@@ -101,7 +103,7 @@ public class ReturnsController {
 			lambdaQueryWrapper.ne(ObjectUtils.isNotEmpty(order.getActualPaymentStatus()), PjOrder::getActualPaymentStatus, order.getActualPaymentStatus());//来源单号
 		}
 		if (ObjectUtils.isNull(order.getNotComplete())) {
-			lambdaQueryWrapper.apply("not find_in_set(status,'已发货,已收货')");
+			lambdaQueryWrapper.apply("not find_in_set(status,'已发货,已收货,已完成')");
 		} else {
 			lambdaQueryWrapper.apply(ObjectUtils.isNotEmpty(order.getStatus()), "find_in_set(status,'" + order.getStatus() + "')");
 		}
@@ -154,7 +156,7 @@ public class ReturnsController {
 				}
 				if (!pjOrderItemsList.isEmpty()) {
 					long count = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count();
-					item.setItem(count + "");
+					item.setNumberRows(Integer.parseInt(count + ""));
 				}
 			});
 		}
@@ -246,17 +248,15 @@ public class ReturnsController {
 						item.setUpdateUserName(user.getName());
 					}
 				}
-
+				List<Long> pjOrderItems = pjOrderItemsList.stream().filter(e-> e.getPid().equals(item.getId()))
+					.map(PjOrderItems::getGoodsId).filter(Objects::nonNull).collect(Collectors.toList());
+				item.setGoodsIds(pjOrderItems.stream().map(Object::toString).collect(Collectors.joining(",")));
 				if (ObjectUtil.isNotEmpty(createUserList)) {
 					User user = createUserList.stream().anyMatch(e -> e.getId().equals(item.getCreateUser())) ? createUserList.stream().filter(e -> e.getId().equals(item.getCreateUser())).findFirst().get() : null;
 					if (user != null) {
 						item.setCreateUserName(user.getName());
 					}
 				}
-				if (!pjOrderItemsList.isEmpty()) {
-					long count = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count();
-					item.setItem(count + "");
-				}
 			});
 		}
 		List<PjOrderExportExcelReturnsXS> list1 = BeanUtil.copy(list, PjOrderExportExcelReturnsXS.class);

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

@@ -196,11 +196,21 @@
         <if test="saleDetailDto.businesDateEnd !=null and saleDetailDto.businesDateEnd !=''">
             and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;= #{saleDetailDto.businesDateEnd}
         </if>
-        <if test="saleDetailDto.isContain !=null and saleDetailDto.isContain !=''">
+        <if test="saleDetailDto.dateStart !=null and saleDetailDto.dateStart !=''">
+            and DATE_FORMAT(po.delivery_busines_date,'%Y-%m-%d') &gt;= #{saleDetailDto.dateStart}
+        </if>
+        <if test="saleDetailDto.dateEnd !=null and saleDetailDto.dateEnd !=''">
+            and DATE_FORMAT(po.delivery_busines_date,'%Y-%m-%d') &lt;= #{saleDetailDto.dateEnd}
+        </if>
+        <if test='saleDetailDto.isContain !=null and saleDetailDto.isContain !="" and saleDetailDto.isContain == "1"'>
             and ( (FIND_IN_SET(po.bs_type,'XS,CG') and FIND_IN_SET(po.`status`,'待确认,待发货,已发货,退款请核,已取消,已退款,售后中,已收货'))
             or (FIND_IN_SET(po.bs_type,'TKXS,TKCG') and FIND_IN_SET(po.`status`,'已完成')) )
         </if>
-        <if test="saleDetailDto.isContain ==null or saleDetailDto.isContain ==''">
+        <if test='saleDetailDto.isContain !=null and saleDetailDto.isContain !="" and saleDetailDto.isContain == "0"'>
+            and ( (FIND_IN_SET(po.bs_type,'XS,CG') and FIND_IN_SET(po.`status`,'已发货,退款请核,已取消,已退款,售后中,已收货'))
+            or (FIND_IN_SET(po.bs_type,'TKXS,TKCG') and FIND_IN_SET(po.`status`,'已完成')) )
+        </if>
+        <if test='saleDetailDto.isContain ==null or saleDetailDto.isContain ==""'>
             and ( (FIND_IN_SET(po.bs_type,'XS,CG') and FIND_IN_SET(po.`status`,'已发货,退款请核,已取消,已退款,售后中,已收货'))
             or (FIND_IN_SET(po.bs_type,'TKXS,TKCG') and FIND_IN_SET(po.`status`,'已完成')) )
         </if>
@@ -364,11 +374,21 @@
         <if test="businesDateEnd !=null and businesDateEnd !=''">
             and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;= #{businesDateEnd}
         </if>
-        <if test="isContain !=null and isContain !=''">
+        <if test="dateStart !=null and dateStart !=''">
+            and DATE_FORMAT(po.delivery_busines_date,'%Y-%m-%d') &gt;= #{dateStart}
+        </if>
+        <if test="dateEnd !=null and dateEnd !=''">
+            and DATE_FORMAT(po.delivery_busines_date,'%Y-%m-%d') &lt;= #{dateEnd}
+        </if>
+        <if test='isContain !=null and isContain !="" and isContain == "1"'>
           and ( (FIND_IN_SET(po.bs_type,'XS,CG') and FIND_IN_SET(po.`status`,'待确认,待发货,已发货,退款请核,已取消,已退款,售后中,已收货'))
               or (FIND_IN_SET(po.bs_type,'TKXS,TKCG') and FIND_IN_SET(po.`status`,'已完成')) )
         </if>
-        <if test="isContain ==null or isContain ==''">
+        <if test='isContain !=null and isContain !="" and isContain == "0"'>
+            and ( (FIND_IN_SET(po.bs_type,'XS,CG') and FIND_IN_SET(po.`status`,'已发货,退款请核,已取消,已退款,售后中,已收货'))
+            or (FIND_IN_SET(po.bs_type,'TKXS,TKCG') and FIND_IN_SET(po.`status`,'已完成')) )
+        </if>
+        <if test='isContain ==null or isContain ==""'>
             and ( (FIND_IN_SET(po.bs_type,'XS,CG') and FIND_IN_SET(po.`status`,'已发货,退款请核,已取消,已退款,售后中,已收货'))
             or (FIND_IN_SET(po.bs_type,'TKXS,TKCG') and FIND_IN_SET(po.`status`,'已完成')) )
         </if>

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

@@ -19,6 +19,9 @@ package org.springblade.salesPart.order.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
+import org.springblade.salesPart.dto.SaleDetail;
+import org.springblade.salesPart.dto.SaleDetailDto;
+import org.springblade.salesPart.dto.SalespersonCustomer;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.excel.PjOrderStatisticsExcel;
 import org.springblade.salesPart.excel.PjShipStockDetails;
@@ -86,4 +89,8 @@ public interface OrderMapper extends BaseMapper<PjOrder> {
 														@Param("goodsSize") String goodsSize);
 
 	int coreCorp(@Param("tenantId")String tenantId, @Param("bsType")String bsType, @Param("deptId")String deptId);
+
+    List<SalespersonCustomer> salespersonCustomerDetail(@Param("page")IPage<SalespersonCustomer> page, @Param("sale")SaleDetail saleDetailDto);
+
+	List<SalespersonCustomer> salespersonCustomerSum(@Param("sale")SaleDetail saleDetailDto);
 }

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

@@ -524,5 +524,127 @@
                 OR (business_source = '额度支付' AND FIND_IN_SET( actual_payment_status, '0,1,2,3' )))
             AND busines_date >= date_sub(CURDATE(), INTERVAL 6 MONTH)
     </select>
+    <select id="salespersonCustomerDetail" resultType="org.springblade.salesPart.dto.SalespersonCustomer">
+        SELECT
+        <if test='sale.bsType!=null and sale.bsType != "" and sale.bsType == "1"'>
+            po.customer_name AS customerName,
+            po.customer_id as id,
+        </if>
+        <if test='sale.bsType!=null and sale.bsType != "" and sale.bsType == "2"'>
+            bu.real_name AS customerName,
+            bu.id as id,
+        </if>
+        <if test='sale.bsType ==null or sale.bsType == ""'>
+            po.customer_name AS customerName,
+            po.customer_id as id,
+        </if>
+        sum(if(po.freight,po.freight,0)) as freight,
+        SUM( if(poi.goods_num,poi.goods_num,0) ) AS salesQuantity,
+        SUM( if(poi.returns_number,poi.returns_number,0) ) AS returnQuantity,
+        SUM( if(poi.sub_total_money,poi.sub_total_money,0.00) ) AS salesAmount,
+        SUM( if(poi.returns_amount,poi.returns_amount,0.00) ) AS returnAmount,
+        SUM(if(poi.sub_total_money,poi.sub_total_money,0.00)-if(poi.costprie,poi.costprie,0.00)) AS salesProfit
+        FROM
+        pjpf_order po
+        LEFT JOIN pjpf_order_items poi ON po.id = poi.pid
+        LEFT JOIN blade_user bu ON po.saler_id = bu.id
+        WHERE
+        po.is_deleted = '0'
+        AND poi.is_deleted = '0'
+        AND poi.tenant_id = #{sale.tenantId}
+        AND po.tenant_id = #{sale.tenantId}
+        AND po.bs_type = 'XS'
+        <if test="sale.salesCompanyId !=null and sale.salesCompanyId != ''">
+            and find_in_set(po.sales_company_id,#{sale.salesCompanyId})
+        </if>
+        <if test="sale.storageId !=null and sale.storageId != ''">
+            and po.storage_id=#{sale.storageId}
+        </if>
+        <if test="sale.customerName !=null and sale.customerName != ''">
+            and po.customer_name like concat('%', #{sale.customerName}, '%')
+        </if>
+        <if test="sale.salerName !=null and sale.salerName != ''">
+            and po.saler_name like concat('%', #{sale.salerName}, '%')
+        </if>
+        <if test="sale.businesDateStart !=null and sale.businesDateStart !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;= #{sale.businesDateStart}
+        </if>
+        <if test="sale.businesDateEnd !=null and sale.businesDateEnd !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;= #{sale.businesDateEnd}
+        </if>
+        <if test='sale.bsType!=null and sale.bsType != "" and sale.bsType == "1"'>
+            GROUP BY
+            po.customer_id
+        </if>
+        <if test='sale.bsType!=null and sale.bsType != "" and sale.bsType == "2"'>
+            GROUP BY
+            po.saler_id
+        </if>
+        <if test='sale.bsType ==null or sale.bsType == ""'>
+            GROUP BY
+            po.customer_id
+        </if>
+    </select>
+    <select id="salespersonCustomerSum" resultType="org.springblade.salesPart.dto.SalespersonCustomer">
+        SELECT
+        <if test='sale.bsType!=null and sale.bsType != "" and sale.bsType == "1"'>
+            po.customer_name AS customerName,
+            po.customer_id as id,
+        </if>
+        <if test='sale.bsType!=null and sale.bsType != "" and sale.bsType == "2"'>
+            bu.real_name AS customerName,
+            bu.id as id,
+        </if>
+        <if test='sale.bsType ==null or sale.bsType == ""'>
+            po.customer_name AS customerName,
+            po.customer_id as id,
+        </if>
+        sum(if(po.freight,po.freight,0)) as freight,
+        SUM( if(poi.goods_num,poi.goods_num,0) ) AS salesQuantity,
+        SUM( if(poi.returns_number,poi.returns_number,0) ) AS returnQuantity,
+        SUM( if(poi.sub_total_money,poi.sub_total_money,0.00) ) AS salesAmount,
+        SUM( if(poi.returns_amount,poi.returns_amount,0.00) ) AS returnAmount,
+        SUM(if(poi.sub_total_money,poi.sub_total_money,0.00)-if(poi.costprie,poi.costprie,0.00)) AS salesProfit
+        FROM
+        pjpf_order po
+        LEFT JOIN pjpf_order_items poi ON po.id = poi.pid
+        LEFT JOIN blade_user bu ON po.saler_id = bu.id
+        WHERE
+        po.is_deleted = '0'
+        AND poi.is_deleted = '0'
+        AND poi.tenant_id = #{sale.tenantId}
+        AND po.tenant_id = #{sale.tenantId}
+        AND po.bs_type = 'XS'
+        <if test="sale.salesCompanyId !=null and sale.salesCompanyId != ''">
+            and find_in_set(po.sales_company_id,#{sale.salesCompanyId})
+        </if>
+        <if test="sale.storageId !=null and sale.storageId != ''">
+            and po.storage_id=#{sale.storageId}
+        </if>
+        <if test="sale.customerName !=null and sale.customerName != ''">
+            and po.customer_name like concat('%', #{sale.customerName}, '%')
+        </if>
+        <if test="sale.salerName !=null and sale.salerName != ''">
+            and po.saler_name like concat('%', #{sale.salerName}, '%')
+        </if>
+        <if test="sale.businesDateStart !=null and sale.businesDateStart !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &gt;= #{sale.businesDateStart}
+        </if>
+        <if test="sale.businesDateEnd !=null and sale.businesDateEnd !=''">
+            and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;= #{sale.businesDateEnd}
+        </if>
+        <if test='sale.bsType!=null and sale.bsType != "" and sale.bsType == "1"'>
+            GROUP BY
+            po.customer_id
+        </if>
+        <if test='sale.bsType!=null and sale.bsType != "" and sale.bsType == "2"'>
+            GROUP BY
+            po.saler_id
+        </if>
+        <if test='sale.bsType ==null or sale.bsType == ""'>
+            GROUP BY
+            po.customer_id
+        </if>
+    </select>
 
 </mapper>

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

@@ -16,13 +16,19 @@
  */
 package org.springblade.salesPart.order.service;
 
-import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import feign.Param;
 import org.springblade.core.tool.api.R;
+import org.springblade.salesPart.dto.SaleDetail;
+import org.springblade.salesPart.dto.SaleDetailDto;
+import org.springblade.salesPart.dto.SalespersonCustomer;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.entity.PjProductLaunch;
 import org.springblade.salesPart.excel.PjOrderStatisticsExcel;
+import org.springblade.salesPart.excel.ShipItemImportXSCodeExcel;
+import org.springblade.salesPart.excel.ShipItemImportXSExcel;
 import org.springblade.salesPart.excel.StockExportExcel;
 import org.springblade.salesPart.vo.OrderStatistics;
 import org.springblade.salesPart.vo.OrderVO;
@@ -107,23 +113,27 @@ public interface IOrderService extends IService<PjOrder> {
 
 	/**
 	 * 退款审批通过
+	 *
 	 * @param id
 	 */
 	R passCheck(Long id);
 
 	/**
 	 * 退款审核中
+	 *
 	 * @param id
 	 */
 	R underReview(Long id);
 
 	/**
 	 * 审核不通过
+	 *
 	 * @param id
 	 */
 	R passCancel(Long id);
 
 	R getWeChatPayment(String srcOrderNo);
+
 	/**
 	 * 销售确认退款
 	 */
@@ -158,12 +168,13 @@ public interface IOrderService extends IService<PjOrder> {
 
 	R todayIncome(PjOrder order);
 
-    int corpAnalysis(PjOrder order);
+	int corpAnalysis(PjOrder order);
 
-    void appUpdate(PjOrder order);
+	void appUpdate(PjOrder order);
 
 	/**
 	 * 小程序积分兑换
+	 *
 	 * @param order
 	 * @return
 	 */
@@ -171,12 +182,13 @@ public interface IOrderService extends IService<PjOrder> {
 
 	/**
 	 * 一键采购入库
+	 *
 	 * @param order
 	 * @return
 	 */
-    R shortcutWarehousing(PjOrder order);
+	R shortcutWarehousing(PjOrder order);
 
-    R submitInventory(PjOrder order);
+	R submitInventory(PjOrder order);
 
 	R confirmInventory(PjOrder order);
 
@@ -213,4 +225,12 @@ public interface IOrderService extends IService<PjOrder> {
 	PjOrder revokeCheckOrderCGReturns(PjOrder order);
 
 	R generateReturns(PjOrder order);
+
+	IPage<SalespersonCustomer> salespersonCustomerDetail(SaleDetail saleDetailDto, IPage<SalespersonCustomer> page);
+
+	List<SalespersonCustomer> salespersonCustomerSum(SaleDetail saleDetailDto);
+
+	R<List<PjOrderItems>> importItemName(List<ShipItemImportXSExcel> excelList);
+
+	R<List<PjOrderItems>> importItemCode(List<ShipItemImportXSCodeExcel> excelList);
 }

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

@@ -47,9 +47,13 @@ import org.springblade.salesPart.check.service.IAuditPathsLevelsService;
 import org.springblade.salesPart.check.service.IAuditProecessService;
 import org.springblade.salesPart.corps.mapper.CorpsAttnMapper;
 import org.springblade.salesPart.corps.mapper.CorpsDescMapper;
+import org.springblade.salesPart.dto.SaleDetail;
+import org.springblade.salesPart.dto.SalespersonCustomer;
 import org.springblade.salesPart.entity.*;
 import org.springblade.salesPart.enums.OrderTypeEnum;
 import org.springblade.salesPart.excel.PjOrderStatisticsExcel;
+import org.springblade.salesPart.excel.ShipItemImportXSCodeExcel;
+import org.springblade.salesPart.excel.ShipItemImportXSExcel;
 import org.springblade.salesPart.excel.StockExportExcel;
 import org.springblade.salesPart.goods.mapper.GoodsDescMapper;
 import org.springblade.salesPart.goods.mapper.GoodsTypeMapper;
@@ -1319,8 +1323,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 					}
 					goodsName.append(goodsDesc.getCname()).append(",");
 					retrieval.append(goodsDesc.getCnameInt()).append(",");
-					BigDecimal costprie = item.getCostprie().divide(item.getGoodsNum(), 2, RoundingMode.HALF_UP);
-					item.setCostprie(item.getReturnsNumber().multiply(costprie));
+					item.setCostprie(item.getReturnsNumber().multiply(item.getPrice()));
 					item.setGrossProfit(item.getReturnsAmount().subtract(item.getCostprie()));
 					item.setBrandName(goodsDesc.getBrandName());
 				});
@@ -2122,6 +2125,122 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 		return R.data(details);
 	}
 
+	@Override
+	public IPage<SalespersonCustomer> salespersonCustomerDetail(SaleDetail saleDetailDto, IPage<SalespersonCustomer> page) {
+		return page.setRecords(baseMapper.salespersonCustomerDetail(page, saleDetailDto));
+	}
+
+	@Override
+	public List<SalespersonCustomer> salespersonCustomerSum(SaleDetail saleDetailDto) {
+		return baseMapper.salespersonCustomerSum(saleDetailDto);
+	}
+
+	@Override
+	public R<List<PjOrderItems>> importItemName(List<ShipItemImportXSExcel> excelList) {
+		if (CollectionUtils.isEmpty(excelList)) {
+			throw new SecurityException("导入数据不能为空");
+		}
+		List<PjOrderItems> list = new ArrayList<>();
+		List<String> codesList = excelList.stream().map(ShipItemImportXSExcel::getGoodsName).distinct()
+			.filter(Objects::nonNull).collect(Collectors.toList());
+		if (excelList.size() != codesList.size()) {
+			throw new RuntimeException("导入数据存在重复商品名称,请处理后再导入");
+		}
+		String codes = String.join(",", codesList);
+		LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+			.eq(PjProductLaunch::getIsDeleted, 0)
+			.apply("find_in_set(cname,'" + codes + "')");
+		List<PjProductLaunch> pjProductLaunchList = productLaunchService.list(lambdaQueryWrapper);
+		StringBuilder text = new StringBuilder("导入失败:");
+		for (int i = 0; i < excelList.size(); i++) {
+			//判断必填项是否为空
+			ShipItemImportXSExcel itemExcel = excelList.get(i);
+			if (ObjectUtil.isEmpty(itemExcel.getGoodsName())) {
+				text.append("第").append(i + 2).append("行,名称为空").append("\n");
+			}
+			if (ObjectUtil.isEmpty(itemExcel.getGoodsNum())) {
+				text.append("第").append(i + 2).append("行,数量为空").append("\n");
+			}
+			PjOrderItems item = new PjOrderItems();
+			BeanUtil.copy(itemExcel, item);
+			//查询商品信息
+			PjProductLaunch productLaunch = pjProductLaunchList.stream().filter(e -> e.getCname().equals(itemExcel.getGoodsName())).findFirst().orElse(null);
+			if (productLaunch != null) {
+				item.setGoodsId(productLaunch.getGoodsId());
+				item.setGoodsName(productLaunch.getCname());
+				item.setGoodsNo(productLaunch.getCode());
+				item.setBrandId(productLaunch.getBrandId());
+				item.setBrandName(productLaunch.getBrandName());
+				item.setPropertyName(productLaunch.getSpecificationAndModel());
+				item.setPrice(productLaunch.getPriceOne());
+				item.setPattern(productLaunch.getBrandItem());
+				item.setSendNum(new BigDecimal("0"));
+			} else {
+				text.append("第").append(i + 2).append("行,商品名称未上架").append("\n");
+			}
+			list.add(item);
+		}
+		if (text.length() == 0) {
+			return R.data(list);
+		} else {
+			return R.data(list, text.toString());
+		}
+	}
+
+	@Override
+	public R<List<PjOrderItems>> importItemCode(List<ShipItemImportXSCodeExcel> excelList) {
+		if (CollectionUtils.isEmpty(excelList)) {
+			throw new SecurityException("导入数据不能为空");
+		}
+		List<PjOrderItems> list = new ArrayList<>();
+		List<String> codesList = excelList.stream().map(ShipItemImportXSCodeExcel::getCode).distinct()
+			.filter(Objects::nonNull).collect(Collectors.toList());
+		if (excelList.size() != codesList.size()) {
+			throw new RuntimeException("导入数据存在重复商品编码,请处理后再导入");
+		}
+		String codes = String.join(",", codesList);
+		LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+			.eq(PjProductLaunch::getIsDeleted, 0)
+			.apply("find_in_set(code,'" + codes + "')");
+		List<PjProductLaunch> pjProductLaunchList = productLaunchService.list(lambdaQueryWrapper);
+		StringBuilder text = new StringBuilder("导入失败:");
+		for (int i = 0; i < excelList.size(); i++) {
+			//判断必填项是否为空
+			ShipItemImportXSCodeExcel itemExcel = excelList.get(i);
+			if (ObjectUtil.isEmpty(itemExcel.getCode())) {
+				text.append("第").append(i + 2).append("行,编码为空").append("\n");
+			}
+			if (ObjectUtil.isEmpty(itemExcel.getGoodsNum())) {
+				text.append("第").append(i + 2).append("行,数量为空").append("\n");
+			}
+			PjOrderItems item = new PjOrderItems();
+			BeanUtil.copy(itemExcel, item);
+			//查询商品信息
+			PjProductLaunch productLaunch = pjProductLaunchList.stream().filter(e -> e.getCode().equals(itemExcel.getCode())).findFirst().orElse(null);
+			if (productLaunch != null) {
+				item.setGoodsId(productLaunch.getGoodsId());
+				item.setGoodsName(productLaunch.getCname());
+				item.setGoodsNo(productLaunch.getCode());
+				item.setBrandId(productLaunch.getBrandId());
+				item.setBrandName(productLaunch.getBrandName());
+				item.setPropertyName(productLaunch.getSpecificationAndModel());
+				item.setPrice(productLaunch.getPriceOne());
+				item.setPattern(productLaunch.getBrandItem());
+				item.setSendNum(new BigDecimal("0"));
+			} else {
+				text.append("第").append(i + 2).append("行,商品编码未上架").append("\n");
+			}
+			list.add(item);
+		}
+		if (text.length() == 0) {
+			return R.data(list);
+		} else {
+			return R.data(list, text.toString());
+		}
+	}
+
 	/**
 	 * 保存订单信息
 	 */
@@ -2269,8 +2388,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 					item.setBrandName(goodsDesc.getBrandName());
 					//计算成本
 					if (ObjectUtils.isNotNull(order.getBillType()) && 1 != order.getBillType()) {//本地取库存账成本价
-						goodsName = goodsName.append(goodsDesc.getCname()).append(",");
-						retrieval = retrieval.append(goodsDesc.getCnameInt()).append(",");
+						goodsName.append(goodsDesc.getCname()).append(",");
+						retrieval.append(goodsDesc.getCnameInt()).append(",");
 						item.setCostprie(item.getGoodsNum().multiply(inventoryCostPrice));
 					} else {//共享仓取共享上架的共享成本
 						LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -2358,9 +2477,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 
 			// 保存订单明细
 			if (CollectionUtils.isNotEmpty(order.getOrderItemsList())) {
-				order.getOrderItemsList().forEach(item -> {
+				StringBuilder goodsName = new StringBuilder();
+				for(PjOrderItems item :order.getOrderItemsList()) {
 					item.setBizType(order.getBsType());
 					item.setBillNo(order.getOrdNo());
+					goodsName.append(item.getGoodsName()).append(",");
 					//计算小计
 					item.setSubTotalMoney(item.getGoodsNum().multiply(item.getPrice()));
 					if (item.getId() == null) {
@@ -2376,7 +2497,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 						item.setPid(order.getId());
 						orderItemsService.updateById(item);
 					}
-				});
+				};
 
 				BigDecimal totalMoney = BigDecimal.ZERO;
 				order.setNumberRows(order.getOrderItemsList().size());//行数
@@ -2389,6 +2510,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 
 				order.setSalesAmount(totalMoney);
 				order.setTotalMoney(totalMoney);
+				if (goodsName.length() > 0) {
+					order.setGoodsNameJoin(goodsName.substring(0, goodsName.length() - 1));
+				}
 			} else {
 				order.setNumberRows(0);//行数
 				//总数量

+ 18 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/controller/ProductLaunchController.java

@@ -42,6 +42,7 @@ import org.springblade.salesPart.brand.service.IBrandFilesService;
 import org.springblade.salesPart.corps.service.ICorpsAttnService;
 import org.springblade.salesPart.corps.service.ICorpsDescService;
 import org.springblade.salesPart.entity.*;
+import org.springblade.salesPart.excel.PjShipStockDetails;
 import org.springblade.salesPart.excel.ProductLaunchExportExcel;
 import org.springblade.salesPart.excel.ProductLaunchImportCodeExcel;
 import org.springblade.salesPart.excel.ProductLaunchImportExcel;
@@ -56,7 +57,9 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -449,6 +452,7 @@ public class ProductLaunchController extends BladeController {
 			if (pjGoodsDesc != null){
 				item.setCode(pjGoodsDesc.getCode());
 			}
+			item.setGoodsIds(item.getGoodsIds());
 			if (ObjectUtils.isNotNull(deptList.getData()) && !deptList.getData().isEmpty()) {
 				String deptName = deptList.getData().stream()
 					.filter(e -> ObjectUtils.isNotNull(item.getSharedCompany()) && item.getSharedCompany().contains(e.getId() + ""))
@@ -766,4 +770,18 @@ public class ProductLaunchController extends BladeController {
 		return R.data(productLaunch);
 	}
 
+
+	/**
+	 * 库存账明细
+	 */
+	@GetMapping("/productLaunchDetails")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public R<List<PjShipStockDetails>> productLaunchDetails(PjShipStockDetails pjShipStockDetails) {
+		pjShipStockDetails.setSalesCompanyId(AuthUtil.getDeptId());
+		pjShipStockDetails.setTenantId(AuthUtil.getTenantId());
+		List<PjShipStockDetails> list = productLaunchService.productLaunchDetails(pjShipStockDetails);
+		return R.data(list);
+	}
+
 }

+ 3 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/mapper/ProductLaunchMapper.java

@@ -19,7 +19,9 @@ package org.springblade.salesPart.productLaunch.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
 import org.springblade.salesPart.entity.PjProductLaunch;
+import org.springblade.salesPart.excel.PjShipStockDetails;
 import org.springblade.salesPart.vo.ProductLaunchVO;
 
 import java.util.List;
@@ -41,4 +43,5 @@ public interface ProductLaunchMapper extends BaseMapper<PjProductLaunch> {
 	 */
 	List<ProductLaunchVO> selectProductLaunchPage(IPage page, ProductLaunchVO productLaunch);
 
+    List<PjShipStockDetails> productLaunchDetails(@Param("order") PjShipStockDetails pjShipStockDetails);
 }

+ 71 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/mapper/ProductLaunchMapper.xml

@@ -31,5 +31,76 @@
         select * from pjpf_product_launch
         where is_deleted = 0
     </select>
+    <select id="productLaunchDetails" resultType="org.springblade.salesPart.excel.PjShipStockDetails">
+        SELECT
+            ps.id AS id,
+            ps.storage_name AS stockId,
+            ps.ord_no AS billno,
+            ps.STATUS AS statusName,
+            ps.create_time AS updateTime,
+            pgd.brand_item AS brandItem,
+            pgd.cname AS goodsName,
+            CASE
+                ps.bs_type
+                WHEN 'XS' THEN
+                    '销售'
+                WHEN 'CG' THEN
+                    '采购'
+                WHEN 'TKXS' THEN
+                    '销售售后'
+                WHEN 'TKCG' THEN
+                    '采购售后'
+                WHEN 'PD' THEN
+                    '盘点'
+                END AS bizTypeName,
+            CASE
+                ps.bs_type
+                WHEN 'XS' THEN
+                    IF
+                    ( SUM( psi.goods_num ), SUM( psi.goods_num ), 0 )
+                WHEN 'TKCG' THEN
+                    IF
+                    ( SUM( psi.goods_num ), SUM( psi.goods_num ), 0 ) ELSE 0
+                END AS SubSendTotalNum,
+            CASE
+                ps.bs_type
+                WHEN 'CG' THEN
+                    IF
+                    ( SUM( psi.goods_num ), SUM( psi.goods_num ), 0 )
+                WHEN 'TKXS' THEN
+                    IF
+                    ( SUM( psi.goods_num ), SUM( psi.goods_num ), 0 ) ELSE 0
+                END AS addSendTotalNum,
+            pgd.specification_and_model AS specificationAndModel,
+            sum( psi.inventory ) AS totalNum,
+            CASE
+                ps.bs_type
+                WHEN 'PD' THEN
+                    IF
+                    ( SUM( psi.profit_loss_num ), SUM( psi.profit_loss_num ), 0 ) ELSE 0
+                END AS profitLossNum
+        FROM
+            pjpf_order_items psi
+                LEFT JOIN pjpf_order ps ON ps.id = psi.pid
+                LEFT JOIN pjpf_goods_desc pgd ON pgd.id = psi.goods_id
+        WHERE
+            ps.is_deleted = '0'
+          AND psi.is_deleted = '0'
+          AND FIND_IN_SET( ps.bs_type, 'XS,CG,TKXS,TKCG,PD' )
+          AND ps.tenant_id = #{order.tenantId}
+        and (( ps.business_source = '外部销售' AND FIND_IN_SET( ps.status, '待确认,待发货,已发货,已收货' ) )
+        OR (ps.business_source = '内部销售' AND FIND_IN_SET( ps.status, ',待发货,已发货,已收货' ))
+        OR (ps.business_source = '额度支付' AND FIND_IN_SET( ps.status, '待确认,待发货,已发货,已收货' )))
+        <if test="order.goodsId!=null">
+            and psi.goods_id = #{order.goodsId}
+        </if>
+        <if test="order.salesCompanyId!=null and order.salesCompanyId!=''">
+            and ps.sales_company_id = #{order.salesCompanyId}
+        </if>
+        GROUP BY
+            ps.ord_no
+        ORDER BY
+            ps.busines_date ASC
+    </select>
 
 </mapper>

+ 3 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/service/IProductLaunchService.java

@@ -21,6 +21,7 @@ import org.springblade.salesPart.entity.PjBrandDesc;
 import org.springblade.salesPart.entity.PjProductLaunch;
 import org.springblade.salesPart.entity.PjShoppingCart;
 import org.springblade.salesPart.excel.GoodsExcel;
+import org.springblade.salesPart.excel.PjShipStockDetails;
 import org.springblade.salesPart.excel.ProductLaunchImportCodeExcel;
 import org.springblade.salesPart.excel.ProductLaunchImportExcel;
 import org.springblade.salesPart.vo.ProductLaunchVO;
@@ -109,4 +110,6 @@ public interface IProductLaunchService extends IService<PjProductLaunch> {
     R updateBatchById(List<PjProductLaunch> productLaunch);
 
 	R importProductLaunchCode(List<ProductLaunchImportCodeExcel> excelList, boolean b);
+
+    List<PjShipStockDetails> productLaunchDetails(PjShipStockDetails pjShipStockDetails);
 }

+ 6 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/service/impl/ProductLaunchServiceImpl.java

@@ -35,6 +35,7 @@ import org.springblade.salesPart.brand.service.IBrandFilesService;
 import org.springblade.salesPart.corps.service.ICorpsAttnService;
 import org.springblade.salesPart.corps.service.ICorpsDescService;
 import org.springblade.salesPart.entity.*;
+import org.springblade.salesPart.excel.PjShipStockDetails;
 import org.springblade.salesPart.excel.ProductLaunchImportCodeExcel;
 import org.springblade.salesPart.excel.ProductLaunchImportExcel;
 import org.springblade.salesPart.goods.mapper.GoodsDescMapper;
@@ -1184,4 +1185,9 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 		return R.success("ok");
 	}
 
+	@Override
+	public List<PjShipStockDetails> productLaunchDetails(PjShipStockDetails pjShipStockDetails) {
+		return baseMapper.productLaunchDetails(pjShipStockDetails);
+	}
+
 }

+ 20 - 25
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java

@@ -1309,25 +1309,20 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			.eq(PjGoodsDesc::getIsDeleted, 0)
 			.apply("find_in_set(cname,'" + goodsNames + "')");
 		List<PjGoodsDesc> goodsDescList = goodsDescMapper.selectList(lambdaQueryWrapper);
+		StringBuilder text = new StringBuilder();
 		for (int i = 0; i < excelList.size(); i++) {
 			//判断必填项是否为空
 			ShipItemImportExcel itemExcel = excelList.get(i);
 			if (ObjectUtil.isEmpty(itemExcel.getGoodsName())) {
-				throw new SecurityException("第" + (i + 2) + "行,商品名称为空");
-			}
-			if (ObjectUtil.isEmpty(itemExcel.getPrice())) {
-				throw new SecurityException("第" + (i + 2) + "行,价格为空");
+				text.append("第").append(i + 2).append("行,商品名称为空").append("\n");
 			}
 			if (ObjectUtil.isEmpty(itemExcel.getGoodsNum())) {
-				throw new SecurityException("第" + (i + 2) + "行,数量为空");
+				text.append("第").append(i + 2).append("行,数量为空").append("\n");
 			}
-
 			PjOrderItems item = new PjOrderItems();
 			BeanUtil.copy(itemExcel, item);
-
 			//查询商品信息
 			PjGoodsDesc goodsDesc = goodsDescList.stream().filter(e -> e.getCname().equals(itemExcel.getGoodsName())).findFirst().orElse(null);
-
 			if (goodsDesc != null) {
 				item.setGoodsId(goodsDesc.getId());
 				item.setGoodsName(goodsDesc.getCname());
@@ -1337,26 +1332,27 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				item.setPropertyName(goodsDesc.getSpecificationAndModel());
 				item.setPattern(goodsDesc.getBrandItem());
 				item.setGoodsDescription(goodsDesc.getGoodsDescription());
-
 				if ("0".equals(goodsDesc.getWhether())) {//未开启管理批次号
 					if (ObjectUtil.isNotEmpty(itemExcel.getDot())) {
 						item.setDot(null);
 					}
 				} else {//已开启批次号管理
 					if (ObjectUtil.isEmpty(itemExcel.getDot())) {
-						throw new RuntimeException("第" + (i + 2) + "行,商品已开启管理批次号,请填写批次号");
+						text.append("第").append(i + 2).append("行,商品已开启管理批次号,请填写批次号").append("\n");
 					}
 				}
-
 				item.setUnits(goodsDesc.getUnit());
 				item.setSendNum(new BigDecimal("0"));
 			} else {
-				throw new RuntimeException("第" + (i + 2) + "行,商品名称不存在");
+				text.append("第").append(i + 2).append("行,商品名称不存在").append("\n");
 			}
-
 			list.add(item);
 		}
-		return R.data(list);
+		if (text.length() == 0) {
+			return R.data(list);
+		} else {
+			return R.data(list, text.toString());
+		}
 	}
 
 	/**
@@ -1978,22 +1974,20 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			.eq(PjGoodsDesc::getIsDeleted, 0)
 			.apply("find_in_set(code,'" + codes + "')");
 		List<PjGoodsDesc> goodsDescList = goodsDescMapper.selectList(lambdaQueryWrapper);
+		StringBuilder text = new StringBuilder();
 		for (int i = 0; i < excelList.size(); i++) {
 			//判断必填项是否为空
 			ShipItemImportCodeExcel itemExcel = excelList.get(i);
 			if (ObjectUtil.isEmpty(itemExcel.getPrice())) {
-				throw new SecurityException("第" + (i + 2) + "行,价格为空");
+				text.append("第").append(i + 2).append("行,价格为空").append("\n");
 			}
 			if (ObjectUtil.isEmpty(itemExcel.getGoodsNum())) {
-				throw new SecurityException("第" + (i + 2) + "行,数量为空");
+				text.append("第").append(i + 2).append("行,数量为空").append("\n");
 			}
-
 			PjOrderItems item = new PjOrderItems();
 			BeanUtil.copy(itemExcel, item);
-
 			//查询商品信息
 			PjGoodsDesc goodsDesc = goodsDescList.stream().filter(e -> e.getCode().equals(itemExcel.getCode())).findFirst().orElse(null);
-
 			if (goodsDesc != null) {
 				item.setGoodsId(goodsDesc.getId());
 				item.setGoodsName(goodsDesc.getCname());
@@ -2003,26 +1997,27 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				item.setPropertyName(goodsDesc.getSpecificationAndModel());
 				item.setPattern(goodsDesc.getBrandItem());
 				item.setGoodsDescription(goodsDesc.getGoodsDescription());
-
 				if ("0".equals(goodsDesc.getWhether())) {//未开启管理批次号
 					if (ObjectUtil.isNotEmpty(itemExcel.getDot())) {
 						item.setDot(null);
 					}
 				} else {//已开启批次号管理
 					if (ObjectUtil.isEmpty(itemExcel.getDot())) {
-						throw new RuntimeException("第" + (i + 2) + "行,商品已开启管理批次号,请填写批次号");
+						text.append("第").append(i + 2).append("行,商品已开启管理批次号,请填写批次号").append("\n");
 					}
 				}
-
 				item.setUnits(goodsDesc.getUnit());
 				item.setSendNum(new BigDecimal("0"));
 			} else {
-				throw new RuntimeException("第" + (i + 2) + "行,商品编码不存在");
+				text.append("第").append(i + 2).append("行,商品名称不存在").append("\n");
 			}
-
 			list.add(item);
 		}
-		return R.data(list);
+		if (text.length() == 0) {
+			return R.data(list);
+		} else {
+			return R.data(list, text.toString());
+		}
 	}
 
 	@Override

+ 26 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/controller/StatisticsController.java

@@ -9,6 +9,7 @@ import org.springblade.core.mp.support.Query;
 import org.springblade.core.tool.api.R;
 import org.springblade.salesPart.dto.SaleDetail;
 import org.springblade.salesPart.dto.SaleDetailDto;
+import org.springblade.salesPart.dto.SalespersonCustomer;
 import org.springblade.salesPart.dto.StayDoOrder;
 import org.springblade.salesPart.statistics.service.IStatisticsService;
 import org.springframework.web.bind.annotation.*;
@@ -120,4 +121,29 @@ public class StatisticsController {
 		}
 	}
 
+	/**
+	 * 统计销售明细业务员、客户
+	 */
+	@GetMapping("/salespersonCustomerDetail")
+	public R<IPage<SalespersonCustomer>> salespersonCustomerDetail(SaleDetail saleDetailDto, Query query) {
+		return statisticsService.salespersonCustomerDetail(saleDetailDto, Condition.getPage(query));
+	}
+
+	/**
+	 * 统计销售明细业务员、客户合计
+	 */
+	@GetMapping("/salespersonCustomerSum")
+	public R salespersonCustomerSum(SaleDetail saleDetailDto) {
+		return statisticsService.salespersonCustomerSum(saleDetailDto);
+	}
+
+	/**
+	 * 统计销售明细业务员、客户导出
+	 */
+	@GetMapping("/salespersonCustomerExport")
+	public void salespersonCustomerExport(SaleDetail saleDetailDto, HttpServletResponse response) {
+		List<SalespersonCustomer> saleDetailDtoList = statisticsService.salespersonCustomerExport(saleDetailDto);
+			ExcelUtil.export(response, "销售分析明细", "销售分析明细", saleDetailDtoList, SalespersonCustomer.class);
+	}
+
 }

+ 7 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/IStatisticsService.java

@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.springblade.core.tool.api.R;
 import org.springblade.salesPart.dto.SaleDetail;
 import org.springblade.salesPart.dto.SaleDetailDto;
+import org.springblade.salesPart.dto.SalespersonCustomer;
 import org.springblade.salesPart.dto.StayDoOrder;
 
 import java.util.List;
@@ -92,4 +93,10 @@ public interface IStatisticsService {
 	 * 统计销售明细导出
 	 */
 	List<SaleDetailDto> saleDetailExport(SaleDetail saleDetailDto);
+
+	R<IPage<SalespersonCustomer>> salespersonCustomerDetail(SaleDetail saleDetailDto, IPage<SalespersonCustomer> page);
+
+	R salespersonCustomerSum(SaleDetail saleDetailDto);
+
+	List<SalespersonCustomer> salespersonCustomerExport(SaleDetail saleDetailDto);
 }

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

@@ -24,6 +24,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.salesPart.dto.SaleDetail;
 import org.springblade.salesPart.dto.SaleDetailDto;
+import org.springblade.salesPart.dto.SalespersonCustomer;
 import org.springblade.salesPart.dto.StayDoOrder;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
@@ -523,7 +524,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 									amount = new BigDecimal("0.00");
 								}
 							} else {
-								if ("XS".equals(item.getBsType())){
+								if ("XS".equals(item.getBsType())) {
 									if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
 										items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("5.00")));
 									}
@@ -587,7 +588,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 			BigDecimal profitReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getProfit).reduce(BigDecimal.ZERO, BigDecimal::add)
 				.setScale(0, RoundingMode.HALF_UP);
-			if ("TKXS".equals(saleDetailDto.getBsType()) || "TKGS".equals(saleDetailDto.getBsType())){
+			if ("TKXS".equals(saleDetailDto.getBsType()) || "TKGS".equals(saleDetailDto.getBsType())) {
 				map.put("goodsSum", new BigDecimal("0"));
 				map.put("amount", new BigDecimal("0"));
 				map.put("costprie", new BigDecimal("0"));
@@ -596,7 +597,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 				map.put("amountCancellation", subTotalMoneyCancel.subtract(subTotalMoneyReturns));
 				map.put("costprieCancellation", costprieCancel.subtract(costprieReturns));
 				map.put("profitCancellation", profitCancel.subtract(profitReturns));
-			}else{
+			} else {
 				map.put("goodsSum", goodsNumActual.add(goodsNumReturns));
 				map.put("amount", subTotalMoneyActual.add(subTotalMoneyReturns));
 				map.put("costprie", costprieActual.add(costprieReturns));
@@ -657,7 +658,7 @@ public class StatisticsServiceImpl implements IStatisticsService {
 									amount = new BigDecimal("0.00");
 								}
 							} else {
-								if ("XS".equals(item.getBsType())){
+								if ("XS".equals(item.getBsType())) {
 									if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
 										items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("5.00")));
 									}
@@ -677,4 +678,345 @@ public class StatisticsServiceImpl implements IStatisticsService {
 		}
 		return saleDetailDtoIPage;
 	}
+
+	@Override
+	public R<IPage<SalespersonCustomer>> salespersonCustomerDetail(SaleDetail saleDetailDto, IPage<SalespersonCustomer> page) {
+		saleDetailDto.setTenantId(AuthUtil.getTenantId());
+		saleDetailDto.setSalesCompanyId(AuthUtil.getDeptId());
+		IPage<SalespersonCustomer> customerIPage = orderService.salespersonCustomerDetail(saleDetailDto, page);
+		if (!customerIPage.getRecords().isEmpty()) {
+			List<Long> ids = customerIPage.getRecords().stream().map(SalespersonCustomer::getId).distinct().collect(Collectors.toList());
+			LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<PjOrder>()
+				.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrder::getIsDeleted, 0)
+				.eq(PjOrder::getBsType, "XS")
+				.apply("find_in_set(status,'已发货,已收货,已取消,已退款,售后中,退款请核')")
+				.ge(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateStart()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateStart())
+				.le(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateEnd()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateEnd())
+				.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId());
+			if ("1".equals(saleDetailDto.getBsType())) {
+				lambdaQueryWrapper.in(PjOrder::getCustomerId, ids);
+			} else {
+				lambdaQueryWrapper.in(PjOrder::getSalerId, ids);
+			}
+			List<PjOrder> orderList = orderService.list(lambdaQueryWrapper);
+			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+			if (!orderList.isEmpty()) {
+				List<Long> pids = orderList.stream().map(PjOrder::getId).collect(Collectors.toList());
+				pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+					.eq(PjOrderItems::getIsDeleted, 0)
+					.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+					.in(PjOrderItems::getPid, pids));
+			} else {
+				return R.data(customerIPage);
+			}
+			if (pjOrderItemsList.isEmpty()) {
+				return R.data(customerIPage);
+			}
+			for (SalespersonCustomer item : customerIPage.getRecords()) {
+				item.setReturnAmount(new BigDecimal("0.00"));
+				item.setReturnQuantity(new BigDecimal("0"));
+				item.setSalesAmount(new BigDecimal("0.00"));
+				item.setSalesQuantity(new BigDecimal("0"));
+				item.setSalesProfit(new BigDecimal("0.00"));
+				if ("1".equals(saleDetailDto.getBsType())) {
+					List<Long> ordersCorpR = orderList.stream().filter(e -> e.getCustomerId().equals(item.getId())
+						&& "已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					List<Long> ordersCorpS = orderList.stream().filter(e -> e.getCustomerId().equals(item.getId())
+						&& !"已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					if (!ordersCorpR.isEmpty()) {
+						item.setReturnAmount(new BigDecimal("0.00").subtract(pjOrderItemsList.stream().filter(e -> ordersCorpR.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)));
+						item.setReturnQuantity(new BigDecimal("0").subtract(pjOrderItemsList.stream().filter(e -> ordersCorpR.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(0, RoundingMode.HALF_UP)));
+					}
+					if (!ordersCorpS.isEmpty()) {
+						BigDecimal subTotalMoney = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal goodsNum = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsNumber = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setReturnAmount(item.getReturnAmount().add(new BigDecimal("0.00").subtract(returnsAmount)));
+						item.setReturnQuantity(item.getReturnQuantity().add(new BigDecimal("0").subtract(returnsNumber)));
+						item.setSalesAmount(subTotalMoney.subtract(returnsAmount));
+						item.setSalesQuantity(goodsNum.subtract(returnsNumber));
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()) &&
+								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
+					}
+				} else {
+					List<Long> ordersSalerR = orderList.stream().filter(e -> e.getSalerId().equals(item.getId())
+						&& "已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					List<Long> ordersSalerS = orderList.stream().filter(e -> e.getSalerId().equals(item.getId())
+						&& !"已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					if (!ordersSalerR.isEmpty()) {
+						item.setReturnAmount(new BigDecimal("0.00").subtract(pjOrderItemsList.stream().filter(e -> ordersSalerR.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)));
+						item.setReturnQuantity(new BigDecimal("0").subtract(pjOrderItemsList.stream().filter(e -> ordersSalerR.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull)
+							.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(0, RoundingMode.HALF_UP)));
+					}
+					if (!ordersSalerS.isEmpty()) {
+						BigDecimal subTotalMoney = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal goodsNum = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsNumber = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setReturnAmount(item.getReturnAmount().add(new BigDecimal("0.00").subtract(returnsAmount)));
+						item.setReturnQuantity(item.getReturnQuantity().add(new BigDecimal("0").subtract(returnsNumber)));
+						item.setSalesAmount(subTotalMoney.subtract(returnsAmount));
+						item.setSalesQuantity(goodsNum.subtract(returnsNumber));
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()) &&
+								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
+					}
+				}
+			}
+		}
+		return R.data(customerIPage);
+	}
+
+	@Override
+	public R salespersonCustomerSum(SaleDetail saleDetailDto) {
+		Map<String, BigDecimal> map = new HashMap<>();
+		saleDetailDto.setTenantId(AuthUtil.getTenantId());
+		saleDetailDto.setSalesCompanyId(AuthUtil.getDeptId());
+		List<SalespersonCustomer> customerIPage = orderService.salespersonCustomerSum(saleDetailDto);
+		if (!customerIPage.isEmpty()) {
+			List<Long> ids = customerIPage.stream().map(SalespersonCustomer::getId).distinct().collect(Collectors.toList());
+			LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<PjOrder>()
+				.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrder::getIsDeleted, 0)
+				.eq(PjOrder::getBsType, "XS")
+				.apply("find_in_set(status,'已发货,已收货,已取消,已退款,售后中,退款请核')")
+				.ge(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateStart()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateStart())
+				.le(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateEnd()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateEnd())
+				.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId());
+			if ("1".equals(saleDetailDto.getBsType())) {
+				lambdaQueryWrapper.in(PjOrder::getCustomerId, ids);
+			} else {
+				lambdaQueryWrapper.in(PjOrder::getSalerId, ids);
+			}
+			List<PjOrder> orderList = orderService.list(lambdaQueryWrapper);
+			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+			if (!orderList.isEmpty()) {
+				List<Long> pids = orderList.stream().map(PjOrder::getId).collect(Collectors.toList());
+				pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+					.eq(PjOrderItems::getIsDeleted, 0)
+					.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+					.in(PjOrderItems::getPid, pids));
+			} else {
+				map.put("salesAmount", new BigDecimal("0.00"));
+				map.put("salesQuantity", new BigDecimal("0"));
+				map.put("returnAmount", new BigDecimal("0.00"));
+				map.put("returnQuantity", new BigDecimal("0"));
+				map.put("salesProfit", new BigDecimal("0.00"));
+				return R.data(map);
+			}
+			if (pjOrderItemsList.isEmpty()) {
+				map.put("salesAmount", new BigDecimal("0.00"));
+				map.put("salesQuantity", new BigDecimal("0"));
+				map.put("returnAmount", new BigDecimal("0.00"));
+				map.put("returnQuantity", new BigDecimal("0"));
+				map.put("salesProfit", new BigDecimal("0.00"));
+				return R.data(map);
+			}
+			for (SalespersonCustomer item : customerIPage) {
+				item.setReturnAmount(new BigDecimal("0.00"));
+				item.setReturnQuantity(new BigDecimal("0"));
+				item.setSalesAmount(new BigDecimal("0.00"));
+				item.setSalesQuantity(new BigDecimal("0"));
+				item.setSalesProfit(new BigDecimal("0.00"));
+				if ("1".equals(saleDetailDto.getBsType())) {
+					List<Long> ordersCorpR = orderList.stream().filter(e -> e.getCustomerId().equals(item.getId())
+						&& "已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					List<Long> ordersCorpS = orderList.stream().filter(e -> e.getCustomerId().equals(item.getId())
+						&& !"已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					if (!ordersCorpR.isEmpty()) {
+						item.setReturnAmount(new BigDecimal("0.00").subtract(pjOrderItemsList.stream().filter(e -> ordersCorpR.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)));
+						item.setReturnQuantity(new BigDecimal("0").subtract(pjOrderItemsList.stream().filter(e -> ordersCorpR.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull)
+							.reduce(BigDecimal.ZERO, BigDecimal::add)));
+					}
+					if (!ordersCorpS.isEmpty()) {
+						BigDecimal subTotalMoney = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal goodsNum = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsNumber = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setReturnAmount(item.getReturnAmount().add(new BigDecimal("0.00").subtract(returnsAmount)));
+						item.setReturnQuantity(item.getReturnQuantity().add(new BigDecimal("0").subtract(returnsNumber)));
+						item.setSalesAmount(subTotalMoney.subtract(returnsAmount));
+						item.setSalesQuantity(goodsNum.subtract(returnsNumber));
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()) &&
+								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
+					}
+				} else {
+					List<Long> ordersSalerR = orderList.stream().filter(e -> e.getSalerId().equals(item.getId())
+						&& "已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					List<Long> ordersSalerS = orderList.stream().filter(e -> e.getSalerId().equals(item.getId())
+						&& !"已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					if (!ordersSalerR.isEmpty()) {
+						item.setReturnAmount(new BigDecimal("0.00").subtract(pjOrderItemsList.stream().filter(e -> ordersSalerR.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)));
+						item.setReturnQuantity(new BigDecimal("0").subtract(pjOrderItemsList.stream().filter(e -> ordersSalerR.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull)
+							.reduce(BigDecimal.ZERO, BigDecimal::add)));
+					}
+					if (!ordersSalerS.isEmpty()) {
+						BigDecimal subTotalMoney = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal goodsNum = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsNumber = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setReturnAmount(item.getReturnAmount().add(new BigDecimal("0.00").subtract(returnsAmount)));
+						item.setReturnQuantity(item.getReturnQuantity().add(new BigDecimal("0").subtract(returnsNumber)));
+						item.setSalesAmount(subTotalMoney.subtract(returnsAmount));
+						item.setSalesQuantity(goodsNum.subtract(returnsNumber));
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()) &&
+								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
+					}
+				}
+			}
+		}
+		if (!customerIPage.isEmpty()) {
+			map.put("salesAmount", customerIPage.stream().filter(Objects::nonNull).map(SalespersonCustomer::getSalesAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
+			map.put("salesQuantity", customerIPage.stream().filter(Objects::nonNull).map(SalespersonCustomer::getSalesQuantity).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(0, RoundingMode.HALF_UP));
+			map.put("returnAmount", customerIPage.stream().filter(Objects::nonNull).map(SalespersonCustomer::getReturnAmount).reduce(BigDecimal.ZERO, BigDecimal::add));
+			map.put("returnQuantity", customerIPage.stream().filter(Objects::nonNull).map(SalespersonCustomer::getReturnQuantity).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(0, RoundingMode.HALF_UP));
+			map.put("salesProfit", customerIPage.stream().filter(Objects::nonNull).map(SalespersonCustomer::getSalesProfit).reduce(BigDecimal.ZERO, BigDecimal::add));
+		} else {
+			map.put("salesAmount", new BigDecimal("0.00"));
+			map.put("salesQuantity", new BigDecimal("0"));
+			map.put("returnAmount", new BigDecimal("0.00"));
+			map.put("returnQuantity", new BigDecimal("0"));
+			map.put("salesProfit", new BigDecimal("0.00"));
+		}
+		return R.data(map);
+	}
+
+	@Override
+	public List<SalespersonCustomer> salespersonCustomerExport(SaleDetail saleDetailDto) {
+		saleDetailDto.setTenantId(AuthUtil.getTenantId());
+		saleDetailDto.setSalesCompanyId(AuthUtil.getDeptId());
+		List<SalespersonCustomer> customerIPage = orderService.salespersonCustomerSum(saleDetailDto);
+		if (!customerIPage.isEmpty()) {
+			List<Long> ids = customerIPage.stream().map(SalespersonCustomer::getId).distinct().collect(Collectors.toList());
+			LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<PjOrder>()
+				.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrder::getIsDeleted, 0)
+				.eq(PjOrder::getBsType, "XS")
+				.apply("find_in_set(status,'已发货,已收货,已取消,已退款,售后中,退款请核')")
+				.ge(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateStart()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateStart())
+				.le(ObjectUtils.isNotNull(saleDetailDto.getBusinesDateEnd()), PjOrder::getBusinesDate, saleDetailDto.getBusinesDateEnd())
+				.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId());
+			if ("1".equals(saleDetailDto.getBsType())) {
+				lambdaQueryWrapper.in(PjOrder::getCustomerId, ids);
+			} else {
+				lambdaQueryWrapper.in(PjOrder::getSalerId, ids);
+			}
+			List<PjOrder> orderList = orderService.list(lambdaQueryWrapper);
+			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+			if (!orderList.isEmpty()) {
+				List<Long> pids = orderList.stream().map(PjOrder::getId).collect(Collectors.toList());
+				pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+					.eq(PjOrderItems::getIsDeleted, 0)
+					.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+					.in(PjOrderItems::getPid, pids));
+			} else {
+				return customerIPage;
+			}
+			if (pjOrderItemsList.isEmpty()) {
+				return customerIPage;
+			}
+			for (SalespersonCustomer item : customerIPage) {
+				item.setReturnAmount(new BigDecimal("0.00"));
+				item.setReturnQuantity(new BigDecimal("0"));
+				item.setSalesAmount(new BigDecimal("0.00"));
+				item.setSalesQuantity(new BigDecimal("0"));
+				item.setSalesProfit(new BigDecimal("0.00"));
+				if ("1".equals(saleDetailDto.getBsType())) {
+					List<Long> ordersCorpR = orderList.stream().filter(e -> e.getCustomerId().equals(item.getId())
+						&& "已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					List<Long> ordersCorpS = orderList.stream().filter(e -> e.getCustomerId().equals(item.getId())
+						&& !"已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					if (!ordersCorpR.isEmpty()) {
+						item.setReturnAmount(new BigDecimal("0.00").subtract(pjOrderItemsList.stream().filter(e -> ordersCorpR.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)));
+						item.setReturnQuantity(new BigDecimal("0").subtract(pjOrderItemsList.stream().filter(e -> ordersCorpR.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull)
+							.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(0, RoundingMode.HALF_UP)));
+					}
+					if (!ordersCorpS.isEmpty()) {
+						BigDecimal subTotalMoney = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal goodsNum = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsNumber = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setReturnAmount(item.getReturnAmount().add(new BigDecimal("0.00").subtract(returnsAmount)));
+						item.setReturnQuantity(item.getReturnQuantity().add(new BigDecimal("0").subtract(returnsNumber)));
+						item.setSalesAmount(subTotalMoney.subtract(returnsAmount));
+						item.setSalesQuantity(goodsNum.subtract(returnsNumber));
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> ordersCorpS.contains(e.getPid()) &&
+								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
+					}
+				} else {
+					List<Long> ordersSalerR = orderList.stream().filter(e -> e.getSalerId().equals(item.getId())
+						&& "已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					List<Long> ordersSalerS = orderList.stream().filter(e -> e.getSalerId().equals(item.getId())
+						&& !"已取消,已退款,售后中,退款请核".contains(e.getStatus())).map(PjOrder::getId).collect(Collectors.toList());
+					if (!ordersSalerR.isEmpty()) {
+						item.setReturnAmount(new BigDecimal("0.00").subtract(pjOrderItemsList.stream().filter(e -> ordersSalerR.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add)));
+						item.setReturnQuantity(new BigDecimal("0").subtract(pjOrderItemsList.stream().filter(e -> ordersSalerR.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull)
+							.reduce(BigDecimal.ZERO, BigDecimal::add).setScale(0, RoundingMode.HALF_UP)));
+					}
+					if (!ordersSalerS.isEmpty()) {
+						BigDecimal subTotalMoney = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getSubTotalMoney).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal goodsNum = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsNumber = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						BigDecimal returnsAmount = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setReturnAmount(item.getReturnAmount().add(new BigDecimal("0.00").subtract(returnsAmount)));
+						item.setReturnQuantity(item.getReturnQuantity().add(new BigDecimal("0").subtract(returnsNumber)));
+						item.setSalesAmount(subTotalMoney.subtract(returnsAmount));
+						item.setSalesQuantity(goodsNum.subtract(returnsNumber));
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> ordersSalerS.contains(e.getPid()) &&
+								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
+					}
+				}
+			}
+		}
+		return customerIPage;
+	}
 }

+ 37 - 37
blade-service/blade-sales-part/src/main/resources/log/logback-dev.xml

@@ -58,56 +58,56 @@
     </if>
 
     <!-- 日志输出级别 -->
-    <root level="ERROR">
+    <root level="info">
         <appender-ref ref="STDOUT"/>
         <appender-ref ref="${STDOUT_APPENDER}"/>
     </root>
 
-    <logger name="net.sf.ehcache" level="ERROR"/>
-    <logger name="druid.sql" level="ERROR"/>
+    <logger name="net.sf.ehcache" level="info"/>
+    <logger name="druid.sql" level="info"/>
 
 
     <!-- MyBatis log configure -->
-    <logger name="com.apache.ibatis" level="ERROR"/>
-    <logger name="org.mybatis.spring" level="ERROR"/>
-    <logger name="java.sql.Connection" level="ERROR"/>
-    <logger name="java.sql.Statement" level="ERROR"/>
-    <logger name="java.sql.PreparedStatement" level="ERROR"/>
+    <logger name="com.apache.ibatis" level="info"/>
+    <logger name="org.mybatis.spring" level="info"/>
+    <logger name="java.sql.Connection" level="info"/>
+    <logger name="java.sql.Statement" level="info"/>
+    <logger name="java.sql.PreparedStatement" level="info"/>
 
     <!-- 减少部分debug日志 -->
-    <logger name="druid.sql" level="ERROR"/>
-    <logger name="org.apache.shiro" level="ERROR"/>
-    <logger name="org.mybatis.spring" level="ERROR"/>
-    <logger name="org.springframework" level="ERROR"/>
-    <logger name="org.springframework.context" level="ERROR"/>
-    <logger name="org.springframework.beans" level="ERROR"/>
-    <logger name="com.baomidou.mybatisplus" level="ERROR"/>
-    <logger name="org.apache.ibatis.io" level="ERROR"/>
-    <logger name="org.apache.velocity" level="ERROR"/>
-    <logger name="org.eclipse.jetty" level="ERROR"/>
-    <logger name="io.undertow" level="ERROR"/>
-    <logger name="org.xnio.nio" level="ERROR"/>
-    <logger name="org.thymeleaf" level="ERROR"/>
-    <logger name="springfox.documentation" level="ERROR"/>
-    <logger name="org.hibernate.validator" level="ERROR"/>
-    <logger name="com.netflix.loadbalancer" level="ERROR"/>
-    <logger name="com.netflix.hystrix" level="ERROR"/>
-    <logger name="com.netflix.zuul" level="ERROR"/>
-    <logger name="de.codecentric" level="ERROR"/>
-    <!-- cache ERROR -->
-    <logger name="net.sf.ehcache" level="ERROR"/>
-    <logger name="org.springframework.cache" level="ERROR"/>
+    <logger name="druid.sql" level="info"/>
+    <logger name="org.apache.shiro" level="info"/>
+    <logger name="org.mybatis.spring" level="info"/>
+    <logger name="org.springframework" level="info"/>
+    <logger name="org.springframework.context" level="info"/>
+    <logger name="org.springframework.beans" level="info"/>
+    <logger name="com.baomidou.mybatisplus" level="info"/>
+    <logger name="org.apache.ibatis.io" level="info"/>
+    <logger name="org.apache.velocity" level="info"/>
+    <logger name="org.eclipse.jetty" level="info"/>
+    <logger name="io.undertow" level="info"/>
+    <logger name="org.xnio.nio" level="info"/>
+    <logger name="org.thymeleaf" level="info"/>
+    <logger name="springfox.documentation" level="info"/>
+    <logger name="org.hibernate.validator" level="info"/>
+    <logger name="com.netflix.loadbalancer" level="info"/>
+    <logger name="com.netflix.hystrix" level="info"/>
+    <logger name="com.netflix.zuul" level="info"/>
+    <logger name="de.codecentric" level="info"/>
+    <!-- cache info -->
+    <logger name="net.sf.ehcache" level="info"/>
+    <logger name="org.springframework.cache" level="info"/>
     <!-- cloud -->
-    <logger name="org.apache.http" level="ERROR"/>
-    <logger name="com.netflix.discovery" level="ERROR"/>
-    <logger name="com.netflix.eureka" level="ERROR"/>
+    <logger name="org.apache.http" level="info"/>
+    <logger name="com.netflix.discovery" level="info"/>
+    <logger name="com.netflix.eureka" level="info"/>
     <!-- 业务日志 -->
-    <Logger name="org.springblade" level="ERROR"/>
-    <Logger name="org.springblade.core.tenant" level="ERROR"/>
-    <Logger name="org.springblade.core.version" level="ERROR"/>
+    <Logger name="org.springblade" level="info"/>
+    <Logger name="org.springblade.core.tenant" level="info"/>
+    <Logger name="org.springblade.core.version" level="info"/>
 
     <!-- 减少nacos日志 -->
-    <logger name="com.alibaba.nacos" level="ERROR"/>
+    <logger name="com.alibaba.nacos" level="info"/>
 
 
 </configuration>