Browse Source

2024年6月11日17:14:58

纪新园 1 year ago
parent
commit
b20bae9481
26 changed files with 1884 additions and 584 deletions
  1. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrderItems.java
  2. 1 1
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelPay.java
  3. 7 1
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelProfit.java
  4. 6 1
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelReceivable.java
  5. 1 1
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelReconciliation.java
  6. 26 1
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderStatisticsExcel.java
  7. 23 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/vo/PjOrderStatisticsWeb.java
  8. 135 0
      blade-service/blade-los/src/main/java/org/springblade/los/business/sea/controller/BillsController.java
  9. 361 0
      blade-service/blade-los/src/main/java/org/springblade/los/excel/BillsExcel.java
  10. 5 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/activity/controller/ActivityController.java
  11. 74 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/config/XxlJobConfig.java
  12. 46 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/handler/SynchronizeDataJobHandler.java
  13. 90 39
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java
  14. 36 12
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderMapper.xml
  15. 4 2
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderService.java
  16. 716 174
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java
  17. 1 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/mapper/ProductLaunchMapper.xml
  18. 79 112
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/productLaunch/service/impl/ProductLaunchServiceImpl.java
  19. 2 2
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipController.java
  20. 2 2
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/IShipService.java
  21. 174 217
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java
  22. 74 14
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java
  23. 1 2
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/stock/controller/StockDescController.java
  24. 12 0
      blade-service/blade-sales-part/src/main/resources/application-dev.yml
  25. 1 1
      blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java
  26. 1 1
      blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserSearchServiceImpl.java

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

@@ -296,4 +296,10 @@ public class PjOrderItems implements Serializable {
 	 */
 	@ApiModelProperty(value = "来源明细id")
 	private Long srcItemId;
+
+	/**
+	 * 去重
+	 */
+	@TableField(exist = false)
+	private String deduplication;
 }

+ 1 - 1
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelPay.java

@@ -66,7 +66,7 @@ public class PjOrderExportExcelPay implements Serializable {
 	 * 应付金额
 	 */
 	@ExcelProperty(value = "应付金额")
-	private BigDecimal totalMoney;
+	private BigDecimal salesAmount;
 
 	/**
 	 * 实付金额

+ 7 - 1
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelProfit.java

@@ -79,7 +79,13 @@ public class PjOrderExportExcelProfit implements Serializable {
 	 * 收入
 	 */
 	@ExcelProperty(value = "收入")
-	private BigDecimal totalMoney;
+	private BigDecimal salesAmount;
+
+	/**
+	 * 运费
+	 */
+	@ExcelProperty(value = "运费")
+	private BigDecimal freight;
 
 	/**
 	 * 实收

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

@@ -66,7 +66,12 @@ public class PjOrderExportExcelReceivable implements Serializable {
 	 * 应收金额
 	 */
 	@ExcelProperty(value = "应收金额")
-	private BigDecimal totalMoney;
+	private BigDecimal salesAmount;
+	/**
+	 * 运费
+	 */
+	@ExcelProperty(value = "运费")
+	private BigDecimal freight;
 
 	/**
 	 * 实收金额

+ 1 - 1
blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelReconciliation.java

@@ -73,7 +73,7 @@ public class PjOrderExportExcelReconciliation implements Serializable {
 	 * 收入
 	 */
 	@ExcelProperty(value = "收入")
-	private BigDecimal totalMoney;
+	private BigDecimal salesAmount;
 
 
 	/**

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

@@ -16,9 +16,11 @@
  */
 package org.springblade.salesPart.excel;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 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 io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import com.alibaba.excel.annotation.ExcelProperty;
 
@@ -47,6 +49,23 @@ public class PjOrderStatisticsExcel implements Serializable {
 	private String customerName;
 
 	/**
+	 * 客户id
+	 */
+	@ExcelIgnore
+	private Long customerId;
+
+	/**
+	 * 业务员Id
+	 */
+	@ExcelIgnore
+	private Long salerId;
+	/**
+	 * 业务员
+	 */
+	@ApiModelProperty(value = "业务员")
+	private String salerName;
+
+	/**
 	 * 业务日期
 	 */
 	@ExcelProperty(value = "业务日期")
@@ -56,7 +75,13 @@ public class PjOrderStatisticsExcel implements Serializable {
 	 * 金额
 	 */
 	@ExcelProperty(value = "金额")
-	private BigDecimal totalMoney;
+	private BigDecimal salesAmount;
+
+	/**
+	 * 运费
+	 */
+	@ExcelProperty(value = "运费")
+	private BigDecimal freight;
 
 	/**
 	 * 结算金额

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

@@ -16,6 +16,7 @@
  */
 package org.springblade.salesPart.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModelProperty;
@@ -49,6 +50,16 @@ public class PjOrderStatisticsWeb implements Serializable {
 	 */
 	@ApiModelProperty(value = "客户名称")
 	private String customerName;
+	/**
+	 * 业务员Id
+	 */
+	@ApiModelProperty(value = "业务员Id")
+	private Long salerId;
+	/**
+	 * 业务员
+	 */
+	@ApiModelProperty(value = "业务员")
+	private String salerName;
 
 	/**
 	 * 业务日期
@@ -75,6 +86,12 @@ public class PjOrderStatisticsWeb implements Serializable {
 	private BigDecimal profit;
 
 	/**
+	 * 运费
+	 */
+	@ExcelProperty(value = "运费")
+	private BigDecimal freight;
+
+	/**
 	 * 成本
 	 */
 	@ApiModelProperty(value = "成本")
@@ -110,5 +127,11 @@ public class PjOrderStatisticsWeb implements Serializable {
 	@TableField(exist = false)
 	private String tenantId;
 
+	/**
+	 * 是否显示结清
+	 */
+	@TableField(exist = false)
+	private Integer whetherSettlement;
+
 
 }

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

@@ -26,19 +26,27 @@ import io.swagger.annotations.ApiParam;
 import lombok.AllArgsConstructor;
 import org.springblade.common.annotation.RepeatSubmit;
 import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.excel.util.ExcelUtil;
 import org.springblade.core.mp.support.Condition;
 import org.springblade.core.mp.support.Query;
 import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.BeanUtil;
 import org.springblade.core.tool.utils.Func;
 import org.springblade.los.Util.IDeptUtils;
 import org.springblade.los.business.release.entity.SeaReleaseBillItems;
 import org.springblade.los.business.sea.entity.Bills;
 import org.springblade.los.business.sea.service.IBillsService;
 import org.springblade.los.business.sea.vo.BillsVO;
+import org.springblade.los.excel.BillsExcel;
+import org.springblade.system.entity.DictBiz;
+import org.springblade.system.feign.IDictBizClient;
+import org.springblade.system.feign.ISysClient;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -57,6 +65,8 @@ public class BillsController extends BladeController {
 
 	private final IDeptUtils deptUtils;
 
+	private final IDictBizClient dictBizClient;
+
 	/**
 	 * 详情
 	 */
@@ -438,5 +448,130 @@ public class BillsController extends BladeController {
 		, @RequestParam("billId") Long billId) {
 		return billsService.synchronizationExchangeRate(date, type, billId);
 	}
+
+	/**
+	 * 导出
+	 */
+	@GetMapping("/exportBills")
+	public void exportBUnits(Bills bills, HttpServletResponse response) {
+		LambdaQueryWrapper<Bills> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.select(Bills::getId, Bills::getBillNo, Bills::getBillType, Bills::getMasterBillNo,
+			Bills::getCorpCnName, Bills::getCorpId, Bills::getCorpEnName, Bills::getVesselCnName,
+			Bills::getVesselId, Bills::getVoyageNo, Bills::getMblno, Bills::getHblno, Bills::getEta, Bills::getEtd,
+			Bills::getPolEnName, Bills::getPolId, Bills::getPodEnName, Bills::getPodId, Bills::getLoadType, Bills::getPlaceReceiptName,
+			Bills::getCargoType, Bills::getMarks, Bills::getQuantity, Bills::getGrossWeight, Bills::getNetWeight,
+			Bills::getMeasurement, Bills::getQuantityV20, Bills::getQuantityV40, Bills::getQuantityV40hc, Bills::getQuantityV45,
+			Bills::getQuantityV48, Bills::getIsNeedLand, Bills::getIsNeedDeclare, Bills::getIsNeedIq, Bills::getAmountDr,
+			Bills::getAmountCr, Bills::getAmountProfit, Bills::getAmountDrUsd, Bills::getAmountCrUsd, Bills::getAmountProfitUsd,
+			Bills::getAmountDrLoc, Bills::getAmountCrLoc, Bills::getAmountProfitLoc, Bills::getCheckCrStatusDescr, Bills::getCheckDrStatusDescr,
+			Bills::getStlCrStatusDescr, Bills::getStlDrStatusDescr, Bills::getInvoiceCrStatusDescr, Bills::getInvoiceDrStatusDescr, Bills::getCreateUserName,
+			Bills::getCreateTime, Bills::getUpdateUserName, Bills::getUpdateTime, Bills::getStatus, Bills::getBillStatus,
+			Bills::getAccountStatus, Bills::getRemarks, Bills::getPackingUnit, Bills::getBillDate, Bills::getTeamName,
+			Bills::getCreateUser, Bills::getTeu, Bills::getIssueType, Bills::getBookingNo, Bills::getQuantityCntrDescr);
+		lambdaQueryWrapper.eq(Bills::getIsDeleted, 0)
+			.eq(Bills::getTenantId, AuthUtil.getTenantId())
+			.and(i -> i.isNull(Bills::getMasterId).or()
+				.eq(Bills::getMasterId, 0))
+			.like(ObjectUtils.isNotNull(bills.getBillNo()), Bills::getBillNo, bills.getBillNo())
+			.like(ObjectUtils.isNotNull(bills.getMblno()), Bills::getMblno, bills.getMblno())
+			.like(ObjectUtils.isNotNull(bills.getHblno()), Bills::getHblno, bills.getHblno())
+			.like(ObjectUtils.isNotNull(bills.getBookingNo()), Bills::getBookingNo, bills.getBookingNo())
+			.and(ObjectUtils.isNotNull(bills.getVesselCnName()), i -> i.like(Bills::getVesselCnName, bills.getVesselCnName()).or()
+				.like(Bills::getVesselEnName, bills.getVesselCnName()))
+			.like(ObjectUtils.isNotNull(bills.getVoyageNo()), Bills::getVoyageNo, bills.getVoyageNo())
+			.and(ObjectUtils.isNotNull(bills.getCorpCnName()), i -> i.like(Bills::getCorpCnName, bills.getCorpCnName()).or()
+				.like(Bills::getCorpEnName, bills.getCorpCnName()))
+			.and(ObjectUtils.isNotNull(bills.getCarrierCnName()), i -> i.like(Bills::getCarrierCnName, bills.getCarrierCnName()).or()
+				.like(Bills::getCarrierEnName, bills.getCarrierCnName()).or().like(Bills::getCarrierArgreementNo, bills.getCarrierCnName()))
+			.and(ObjectUtils.isNotNull(bills.getPodCnName()), i -> i.like(Bills::getPodCnName, bills.getPodCnName()).or()
+				.like(Bills::getPodEnName, bills.getPodCnName()).or().like(Bills::getPodCode, bills.getPodCnName()))
+			.and(ObjectUtils.isNotNull(bills.getLineCnName()), i -> i.like(Bills::getLineCnName, bills.getLineCnName()).or()
+				.like(Bills::getLineEnName, bills.getLineCnName()))
+			.and(ObjectUtils.isNotNull(bills.getCyCode()), i -> i.like(Bills::getCyCode, bills.getCyCode()).or()
+				.like(Bills::getCyCnName, bills.getCyCode()).or().like(Bills::getCyEnName, bills.getCyCode()))
+			.apply(ObjectUtils.isNotNull(bills.getCreateDeptName()), "find_in_set('" + bills.getCreateDeptName() + "',create_dept_name)");
+		if (ObjectUtils.isNotNull(bills.getEtdList()) && !bills.getEtdList().isEmpty()) {
+			lambdaQueryWrapper.ge(Bills::getEtd, bills.getEtdList().get(0));
+			lambdaQueryWrapper.le(Bills::getEtd, bills.getEtdList().get(1));
+		}
+		if (ObjectUtils.isNotNull(bills.getEtaList()) && !bills.getEtaList().isEmpty()) {
+			lambdaQueryWrapper.ge(Bills::getEta, bills.getEtaList().get(0));
+			lambdaQueryWrapper.le(Bills::getEta, bills.getEtaList().get(1));
+		}
+		if (AuthUtil.getUserRole().contains("业务员")) {
+			lambdaQueryWrapper.eq(Bills::getSrcId, AuthUtil.getUserId());
+		} else {
+			lambdaQueryWrapper.eq(ObjectUtils.isNotNull(bills.getSrcType()), Bills::getSrcType, bills.getSrcType())
+				.and(ObjectUtils.isNotNull(bills.getSrcCnName()), i -> i.like(Bills::getSrcCnName, bills.getSrcCnName()).or()
+					.like(Bills::getSrcEnName, bills.getSrcCnName()));
+		}
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("财务")) {
+			lambdaQueryWrapper.apply("find_in_set(team_id,'" + AuthUtil.getPostId() + "')");
+		}
+		if (!AuthUtil.getUserRole().contains("admin")) {
+			lambdaQueryWrapper.eq(Bills::getBranchId, deptUtils.getDeptPid());
+		}
+		lambdaQueryWrapper.and(ObjectUtils.isNotNull(bills.getBookingAgentCnName()), i -> i.like(Bills::getBookingAgentCnName, bills.getBookingAgentCnName()).or()
+				.like(Bills::getBookingAgentEnName, bills.getBookingAgentCnName()))
+			.eq(ObjectUtils.isNotNull(bills.getIssueType()), Bills::getIssueType, bills.getIssueType())
+			.and(ObjectUtils.isNotNull(bills.getHconsigneeCnName()), i -> i.like(Bills::getHconsigneeCnName, bills.getHconsigneeCnName()).or()
+				.like(Bills::getHconsigneeCode, bills.getHconsigneeCnName()).or().like(Bills::getHconsigneeEnName, bills.getHconsigneeCnName()))
+
+			.eq(ObjectUtils.isNotNull(bills.getBillType()), Bills::getBillType, bills.getBillType())
+			.eq(ObjectUtils.isNotNull(bills.getBusinessType()), Bills::getBusinessType, bills.getBusinessType())
+			.eq(ObjectUtils.isNotNull(bills.getSeaType()), Bills::getSeaType, bills.getSeaType())
+			.eq(ObjectUtils.isNotNull(bills.getBillStatus()), Bills::getBillStatus, bills.getBillStatus())
+			.eq(ObjectUtils.isNotNull(bills.getStatus()), Bills::getStatus, bills.getStatus())
+			.orderByDesc(Bills::getCreateTime);
+		List<Bills> list = billsService.list(lambdaQueryWrapper);
+		List<BillsExcel> billsExcelList = new ArrayList<>();
+		R<List<DictBiz>> res1 = dictBizClient.getList("account_status");
+		R<List<DictBiz>> res2 = dictBizClient.getList("audit_status_los");
+		R<List<DictBiz>> res3 = dictBizClient.getList("bill_status");
+		for (Bills item : list) {
+			BillsExcel billsExcel = new BillsExcel();
+			BeanUtil.copyProperties(item, billsExcel);
+			if (1 == item.getIsNeedLand()) {
+				billsExcel.setIsNeedLand("是");
+			} else {
+				billsExcel.setIsNeedLand("否");
+			}
+			if (1 == item.getIsNeedDeclare()) {
+				billsExcel.setIsNeedDeclare("是");
+			}else{
+				billsExcel.setIsNeedDeclare("否");
+			}
+			if (1 == item.getIsNeedIq()) {
+				billsExcel.setIsNeedIq("是");
+			}else{
+				billsExcel.setIsNeedIq("否");
+			}
+			if(res1.isSuccess() && !res1.getData().isEmpty()){
+				DictBiz dictBiz = res1.getData().stream().filter(e-> e.getDictKey().equals(item.getAccountStatus()+"")).findFirst().orElse(null);
+				if (dictBiz !=null){
+					billsExcel.setAccountStatus(dictBiz.getDictValue());
+				}
+			}
+			if(res2.isSuccess() && !res2.getData().isEmpty()){
+				DictBiz dictBiz = res2.getData().stream().filter(e-> e.getDictKey().equals(item.getStatus()+"")).findFirst().orElse(null);
+				if (dictBiz !=null){
+					billsExcel.setStatus(dictBiz.getDictValue());
+				}
+			}
+			if(res3.isSuccess() && !res3.getData().isEmpty()){
+				DictBiz dictBiz = res3.getData().stream().filter(e-> e.getDictKey().equals(item.getBillStatus()+"")).findFirst().orElse(null);
+				if (dictBiz !=null){
+					billsExcel.setBillStatus(dictBiz.getDictValue());
+				}
+			}
+			billsExcelList.add(billsExcel);
+		}
+		if ("SE".equals(bills.getBusinessType())) {
+			ExcelUtil.export(response, "海运出口", "海运出口", billsExcelList, BillsExcel.class);
+		} else {
+			ExcelUtil.export(response, "海运进口", "海运进口", billsExcelList, BillsExcel.class);
+		}
+
+	}
 }
 

+ 361 - 0
blade-service/blade-los/src/main/java/org/springblade/los/excel/BillsExcel.java

@@ -0,0 +1,361 @@
+/*
+ *      Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ *  Redistribution and use in source and binary forms, with or without
+ *  modification, are permitted provided that the following conditions are met:
+ *
+ *  Redistributions of source code must retain the above copyright notice,
+ *  this list of conditions and the following disclaimer.
+ *  Redistributions in binary form must reproduce the above copyright
+ *  notice, this list of conditions and the following disclaimer in the
+ *  documentation and/or other materials provided with the distribution.
+ *  Neither the name of the dreamlu.net developer nor the names of its
+ *  contributors may be used to endorse or promote products derived from
+ *  this software without specific prior written permission.
+ *  Author: Chill 庄骞 (smallchill@163.com)
+ */
+package org.springblade.los.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 com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springblade.los.utils.LosSpecialHandle;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 业务-海运进出口实体类
+ *
+ * @author BladeX
+ * @since 2024年6月11日15:29:26
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class BillsExcel implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 单据编号
+	 */
+	@ExcelProperty(value = "单据编号")
+	private String billNo;
+	/**
+	 * 客户中文名称
+	 */
+	@ExcelProperty(value = "客户名")
+	private String corpCnName;
+	/**
+	 * 客户英文名称
+	 */
+	@ExcelProperty(value = "客户英文")
+	private String corpEnName;
+	/**
+	 * 中文船名
+	 */
+	@ExcelProperty(value = "船名")
+	private String vesselCnName;
+	/**
+	 * 航次
+	 */
+	@ExcelProperty(value = "航次")
+	private String voyageNo;
+	/**
+	 * MB/L NO
+	 */
+	@ExcelProperty(value = "MB/L NO")
+	@LosSpecialHandle(massage = "", space = true, conversion = true)
+	private String mblno;
+	/**
+	 * HB/L NO
+	 */
+	@ExcelProperty(value = "HB/L NO")
+	private String hblno;
+	/**
+	 * 订舱号
+	 */
+	@ExcelProperty(value = "bookingNo")
+	private String bookingNo;
+	/**
+	 * 开船日期
+	 */
+	@ExcelProperty(value = "开船日期")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
+	private Date etd;
+	/**
+	 * 到港日期
+	 */
+	@ExcelProperty(value = "到港日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date eta;
+	/**
+	 * 船公司英文名称
+	 */
+	@ExcelProperty(value = "船公司")
+	private String carrierCnName;
+
+	/**
+	 * 装货港英文名称
+	 */
+	@ExcelProperty(value = "装货港")
+	private String polEnName;
+	/**
+	 * 卸货港英文名称
+	 */
+	@ExcelProperty(value = "目的港")
+	private String podEnName;
+
+	/**
+	 * 场站中文名称
+	 */
+	@ExcelProperty(value = "场站")
+	private String cyCnName;
+
+	/**
+	 * 集装箱箱数英文,
+	 */
+	@ExcelProperty(value = "箱型/箱量")
+	private String quantityCntrDescr;
+
+	/**
+	 * 业务来源
+	 */
+	@ExcelProperty(value = "业务来源")
+	private String srcType;
+	/**
+	 * 来源中文
+	 */
+	@ExcelProperty(value = "来源详情")
+	private String srcCnName;
+
+	/**
+	 * 装箱方式, FCL=整箱, LCL=拼箱
+	 */
+	@ExcelProperty(value = "装箱方式")
+	private String loadType;
+
+	/**
+	 * 货物类别 dry=普货 danger=危险品 reefer=冻柜
+	 */
+	@ExcelProperty(value = "货物类别")
+	private String cargoType;
+
+	/**
+	 * 创建部门
+	 */
+	@ExcelProperty(value = "创建部门")
+	private String createDeptName;
+	/**
+	 * 订舱代理中文名称
+	 */
+	@ExcelProperty(value = "订舱代理")
+	private String bookingAgentCnName;
+	/**
+	 * HB/L 收货人中文名称
+	 */
+	@ExcelProperty(value = "收货人")
+	private String hconsigneeCnName;
+	/**
+	 * 签单方式
+	 */
+	@ExcelProperty(value = "签单方式")
+	private String issueType;
+	/**
+	 * 唛头
+	 */
+	@ExcelProperty(value = "唛头")
+	private String marks;
+	/**
+	 * 件数
+	 */
+	@ExcelProperty(value = "件数")
+	private BigDecimal quantity;
+	/**
+	 * 毛重 (KGM)
+	 */
+	@ExcelProperty(value = "毛重 (KGM)")
+	private BigDecimal grossWeight;
+	/**
+	 * 净重 (KGM)
+	 */
+	@ExcelProperty(value = "净重 (KGM)")
+	private BigDecimal netWeight;
+	/**
+	 * 体积 (CBM)
+	 */
+	@ExcelProperty(value = "体积 (CBM)")
+	private BigDecimal measurement;
+
+	/**
+	 * teu箱数
+	 */
+	@ExcelProperty(value = "teu箱数")
+	private Integer teu;
+	/**
+	 * 20"集装箱箱数
+	 */
+	@ExcelProperty(value = "V20")
+	private Integer quantityV20;
+	/**
+	 * 40"集装箱箱数
+	 */
+	@ExcelProperty(value = "V40")
+	private Integer quantityV40;
+	/**
+	 * 45"集装箱箱数
+	 */
+	@ExcelProperty(value = "V45")
+	private Integer quantityV45;
+	/**
+	 * 48"集装箱箱数
+	 */
+	@ExcelProperty(value = "V48")
+	private Integer quantityV48;
+
+	/**
+	 * 需陆运(0 否 1是)
+	 */
+	@ExcelProperty(value = "需陆运")
+	private String isNeedLand;
+	/**
+	 * 需报关(0 否 1是)
+	 */
+	@ExcelProperty(value = "需报关")
+	private String isNeedDeclare;
+	/**
+	 * 需三检(检疫检验, Inspection and Quarantine)(0 否 1是)
+	 */
+	@ExcelProperty(value = "需三检")
+	private String isNeedIq;
+	/**
+	 * 本位币应收(CNY)
+	 */
+	@ExcelProperty(value = "应收(CNY)")
+	private BigDecimal amountDr;
+	/**
+	 * 本位币应付(CNY)
+	 */
+	@ExcelProperty(value = "应付(CNY)")
+	private BigDecimal amountCr;
+	/**
+	 * 本位币利润(CNY)
+	 */
+	@ExcelProperty(value = "利润(CNY)")
+	private BigDecimal amountProfit;
+	/**
+	 * 综合 USD 应收(USD) - 非 USD 外币转换为 USD
+	 */
+	@ExcelProperty(value = "应收(USD)")
+	private BigDecimal amountDrUsd;
+	/**
+	 * 综合 USD 应付(USD) - 非 USD 外币转换为 USD
+	 */
+	@ExcelProperty(value = "应付(USD)")
+	private BigDecimal amountCrUsd;
+	/**
+	 * 综合 USD 利润(USD) - 非 USD 外币转换为 USD
+	 */
+	@ExcelProperty(value = "利润(USD)")
+	private BigDecimal amountProfitUsd;
+	/**
+	 * 合计本位币应收(CNY )
+	 */
+	@ExcelProperty(value = "合计应收(CNY)")
+	private BigDecimal amountDrLoc;
+	/**
+	 * 合计本位币应付(CNY)
+	 */
+	@ExcelProperty(value = "合计应付(CNY)")
+	private BigDecimal amountCrLoc;
+	/**
+	 * 合计本位币利润(CNY)
+	 */
+	@ExcelProperty(value = "合计利润(CNY)")
+	private BigDecimal amountProfitLoc;
+
+	/**
+	 * 应收对账状态描述(0  未对账 3 部分对账 9 已对账)
+	 */
+	@ExcelProperty(value = "应收对账状态")
+	private String checkDrStatusDescr;
+	/**
+	 * 应付对账状态描述(0  未对账 3 部分对账 9 已对账)
+	 */
+	@ExcelProperty(value = "应付对账状态")
+	private String checkCrStatusDescr;
+	/**
+	 * 应收结算状态描述(0  未结 3 部分 9 结清)
+	 */
+	@ExcelProperty(value = "应收结算状态")
+	private String stlDrStatusDescr;
+	/**
+	 * 应付结算状态描述(0  未结 3 部分 9 结清)
+	 */
+	@ExcelProperty(value = "应付结算状态")
+	private String stlCrStatusDescr;
+	/**
+	 * 销项发票开具状态描述(0  未开 3 部分 9 全开)
+	 */
+	@ExcelProperty(value = "销项发票开具状态")
+	private String invoiceDrStatusDescr;
+	/**
+	 * 进项发票开具状态描述(0  未开 3 部分 9 全开)
+	 */
+	@ExcelProperty(value = "进项发票开具状态")
+	private String invoiceCrStatusDescr;
+	/**
+	 * 创建人
+	 */
+	@ExcelProperty(value = "创建人")
+	private String createUserName;
+	/**
+	 * 创建时间
+	 */
+	@ExcelProperty(value = "创建时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date createTime;
+	/**
+	 * 修改人
+	 */
+	@ExcelProperty(value = "更新人")
+	private String updateUserName;
+	/**
+	 * 修改时间
+	 */
+	@ExcelProperty(value = "更新时间")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date updateTime;
+	/**
+	 * 状态(业务参数配置)
+	 */
+	@ExcelProperty(value = "业务状态")
+	private String billStatus;
+	/**
+	 * 财务状态(业务参数配置)
+	 */
+	@ExcelProperty(value = "财务状态")
+	private String accountStatus;
+	/**
+	 * 状态 0 = 新建  1=审核提交  2=审核中  3= 审核通过  4=审核驳回
+	 */
+	@ExcelProperty(value = "审核状态")
+	private String status;
+	/**
+	 * 备注
+	 */
+	@ExcelProperty(value = "备注")
+	private String remarks;
+}

+ 5 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/activity/controller/ActivityController.java

@@ -121,6 +121,11 @@ public class ActivityController extends BladeController {
 	@ApiOperationSupport(order = 5)
 	@ApiOperation(value = "修改", notes = "传入activity")
 	public R update(@Valid @RequestBody Activity activity) {
+		if ("1".equals(activity.getStatus())){
+			activity.setReleaseDate(new Date());
+		}else{
+			activity.setReleaseDate(null);
+		}
 		return R.status(activityService.updateById(activity));
 	}
 

+ 74 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/config/XxlJobConfig.java

@@ -0,0 +1,74 @@
+package org.springblade.salesPart.config;
+
+import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * xxl-job config
+ *
+ * @author xuxueli 2017-04-28
+ */
+@Configuration
+public class XxlJobConfig {
+	private final Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
+
+	@Value("${xxl.job.admin.addresses}")
+	private String adminAddresses;
+
+	@Value("${xxl.job.executor.appname}")
+	private String appName;
+
+	@Value("${xxl.job.executor.ip}")
+	private String ip;
+
+	@Value("${xxl.job.executor.port}")
+	private int port;
+
+	@Value("${xxl.job.accessToken}")
+	private String accessToken;
+
+	@Value("${xxl.job.executor.logpath}")
+	private String logPath;
+
+	@Value("${xxl.job.executor.logretentiondays}")
+	private int logRetentionDays;
+
+
+	@Bean
+	public XxlJobSpringExecutor xxlJobExecutor() {
+		logger.info(">>>>>>>>>>> xxl-job config init.");
+		XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
+		xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
+		xxlJobSpringExecutor.setAppName(appName);
+		xxlJobSpringExecutor.setIp(ip);
+		xxlJobSpringExecutor.setPort(port);
+		xxlJobSpringExecutor.setAccessToken(accessToken);
+		xxlJobSpringExecutor.setLogPath(logPath);
+		xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
+
+		return xxlJobSpringExecutor;
+	}
+
+	/**
+	 * 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
+	 *
+	 *      1、引入依赖:
+	 *          <dependency>
+	 *             <groupId>org.springframework.cloud</groupId>
+	 *             <artifactId>spring-cloud-commons</artifactId>
+	 *             <version>${version}</version>
+	 *         </dependency>
+	 *
+	 *      2、配置文件,或者容器启动变量
+	 *          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
+	 *
+	 *      3、获取IP
+	 *          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
+	 */
+
+
+}

+ 46 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/handler/SynchronizeDataJobHandler.java

@@ -0,0 +1,46 @@
+package org.springblade.salesPart.handler;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.AllArgsConstructor;
+import org.springblade.core.secure.utils.AuthUtil;
+import org.springblade.salesPart.activity.entity.Activity;
+import org.springblade.salesPart.activity.service.IActivityService;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Component
+@AllArgsConstructor
+public class SynchronizeDataJobHandler {
+
+	private final IActivityService activityService;
+
+	/**
+	 * @throws Exception
+	 */
+	@XxlJob("updateActivityStatusJobHandler")
+	public ReturnT<String> updateActivityStatusJobHandler(String param) {
+		System.out.println("==========================请求成功================================");
+		List<Activity> activityList = activityService.list(new LambdaQueryWrapper<Activity>()
+			.eq(Activity::getTenantId, AuthUtil.getTenantId())
+			.eq(Activity::getIsDeleted, 0)
+			.eq(Activity::getStatus, 1));
+		Date date = new Date();
+		List<Activity> activities = new ArrayList<>();
+		for (Activity item : activityList) {
+			if (date.compareTo(item.getEndDate()) > 0) {
+				item.setStatus("2");
+				activities.add(item);
+			}
+		}
+		if (!activities.isEmpty()) {
+			activityService.updateBatchById(activities);
+		}
+		return ReturnT.SUCCESS;
+	}
+
+}

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

@@ -101,12 +101,12 @@ public class OrderController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入order")
 	public R<IPage<PjOrder>> list(PjOrder order, Query query) {
 		LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.select(PjOrder::getId,PjOrder::getOrdNo,PjOrder::getSrcOrdNo,PjOrder::getBusinessSource,
-				PjOrder::getSalesCompanyName,PjOrder::getCustomerName,PjOrder::getSalerName,PjOrder::getStorageName,
-				PjOrder::getNumberRows,PjOrder::getGoodsNameJoin,PjOrder::getGoodsTotalNum,PjOrder::getTotalMoney,
-				PjOrder::getPaymentAmountTl,PjOrder::getStatus,PjOrder::getActualPaymentStatus,PjOrder::getReturnsStatus,
-				PjOrder::getBusinesDate,PjOrder::getPaymentDate,PjOrder::getCreateUser,PjOrder::getCreateTime,
-				PjOrder::getUpdateUser,PjOrder::getUpdateTime,PjOrder::getReturnsNumber,PjOrder::getReturnsAmount)
+		lambdaQueryWrapper.select(PjOrder::getId, PjOrder::getOrdNo, PjOrder::getSrcOrdNo, PjOrder::getBusinessSource,
+				PjOrder::getSalesCompanyName, PjOrder::getCustomerName, PjOrder::getSalerName, PjOrder::getStorageName,
+				PjOrder::getNumberRows, PjOrder::getGoodsNameJoin, PjOrder::getGoodsTotalNum, PjOrder::getTotalMoney,
+				PjOrder::getPaymentAmountTl, PjOrder::getStatus, PjOrder::getActualPaymentStatus, PjOrder::getReturnsStatus,
+				PjOrder::getBusinesDate, PjOrder::getPaymentDate, PjOrder::getCreateUser, PjOrder::getCreateTime,
+				PjOrder::getUpdateUser, PjOrder::getUpdateTime, PjOrder::getReturnsNumber, PjOrder::getReturnsAmount)
 			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 			.eq(PjOrder::getIsDeleted, 0)
 			.eq(PjOrder::getBsType, order.getBsType())
@@ -191,7 +191,6 @@ public class OrderController extends BladeController {
 				} else {
 					item.setReturnsStatus("无");
 				}
-
 				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) {
@@ -860,11 +859,8 @@ public class OrderController extends BladeController {
 	 * web利润统计
 	 */
 	@GetMapping("/statistics")
-	@ApiOperation(value = "app营业分析", notes = "传入参数")
 	public R<IPage<PjOrderStatisticsWeb>> statistics(PjOrderStatisticsWeb order, Query query) {
-		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
-			order.setSalesCompanyId(Long.parseLong(AuthUtil.getDeptId()));
-		}
+		order.setSalesCompanyId(Long.parseLong(AuthUtil.getDeptId()));
 		order.setTenantId(AuthUtil.getTenantId());
 		IPage<PjOrderStatisticsWeb> pages = orderService.statisticsPage(Condition.getPage(query), order);
 		return R.data(pages);
@@ -873,12 +869,19 @@ public class OrderController extends BladeController {
 	/**
 	 * web利润统计
 	 */
+	@GetMapping("/statisticsSum")
+	public R statisticsSum(PjOrderStatisticsWeb order) {
+		order.setSalesCompanyId(Long.parseLong(AuthUtil.getDeptId()));
+		order.setTenantId(AuthUtil.getTenantId());
+		return orderService.statisticsSum(order);
+	}
+
+	/**
+	 * web利润统计
+	 */
 	@GetMapping("/statistics-export")
-	@ApiOperation(value = "app营业分析", notes = "传入参数")
 	public void statisticsExport(PjOrderStatisticsWeb order, HttpServletResponse response) {
-		if (!AuthUtil.getUserRole().contains("admin")) {
-			order.setSalesCompanyId(Long.parseLong(AuthUtil.getDeptId()));
-		}
+		order.setSalesCompanyId(Long.parseLong(AuthUtil.getDeptId()));
 		order.setTenantId(AuthUtil.getTenantId());
 		List<PjOrderStatisticsExcel> list = orderService.statisticsExport(order);
 		if (0 == order.getType()) {
@@ -889,6 +892,43 @@ public class OrderController extends BladeController {
 	}
 
 	/**
+	 * web利润统计明细
+	 */
+	@GetMapping("/statisticsDetails")
+	public R<List<PjOrder>> statisticsDetails(PjOrder order) {
+		LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper
+			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrder::getIsDeleted, 0)
+			.eq(PjOrder::getBsType, order.getBsType())
+			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())//公司
+			.eq(ObjectUtils.isNotEmpty(order.getCustomerId()), PjOrder::getCustomerId, order.getCustomerId())//客户
+			.eq(ObjectUtils.isNotEmpty(order.getSalerId()), PjOrder::getSalerId, order.getSalerId());//来源
+		if (order.getBusinesDateList() != null && order.getBusinesDateList().size() > 1) {//业务日期
+			lambdaQueryWrapper.ge(PjOrder::getBusinesDate, order.getBusinesDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
+		}
+		lambdaQueryWrapper.apply("find_in_set(status,'已发货,已收货')");
+		lambdaQueryWrapper.orderByDesc(PjOrder::getCreateTime);
+		List<PjOrder> list = orderService.list(lambdaQueryWrapper);
+		List<PjOrder> pjOrderList = new ArrayList<>();
+		list.forEach(item -> {
+			item.setSalesAmount(item.getSalesAmount().subtract(ObjectUtils.isNotNull(item.getReturnsAmount()) ? item.getReturnsAmount() : new BigDecimal("0.00")));
+			if (ObjectUtils.isNotNull(item.getReturnsAmount()) && new BigDecimal("0.00").compareTo(item.getReturnsAmount()) != 0) {
+				if (ObjectUtils.isNull(item.getPaymentAmountTl()) || new BigDecimal("0.00").compareTo(item.getPaymentAmountTl()) == 0) {
+					item.setPaymentAmountTl(new BigDecimal("0.00"));
+				} else {
+					item.setPaymentAmountTl(item.getPaymentAmountTl().subtract(ObjectUtils.isNotNull(item.getReturnsAmount()) ? item.getReturnsAmount() : new BigDecimal("0.00")));
+				}
+			}
+			if (item.getGoodsTotalNum().compareTo(item.getReturnsNumber()) != 0) {
+				pjOrderList.add(item);
+			}
+		});
+		return R.data(pjOrderList);
+	}
+
+	/**
 	 * 订单(导出)
 	 */
 	@GetMapping("/statistics-exportDetails")
@@ -896,35 +936,46 @@ public class OrderController extends BladeController {
 	@ApiOperation(value = "分页", notes = "传入order")
 	public void listExportDetails(PjOrder order, HttpServletResponse response) {
 		LambdaQueryWrapper<PjOrder> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-		lambdaQueryWrapper.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+		lambdaQueryWrapper
+			.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
 			.eq(PjOrder::getIsDeleted, 0)
 			.eq(PjOrder::getBsType, order.getBsType())
-			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())
-			.eq(ObjectUtils.isNotEmpty(order.getCustomerId()), PjOrder::getCustomerId, order.getCustomerId())
-			.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());
-		if (order.getBusinesDateList() != null && order.getBusinesDateList().size() > 1) {
-			lambdaQueryWrapper.ge(ObjectUtils.isNotNull(order.getBusinesDateList().get(0)), PjOrder::getBusinesDate, order.getBusinesDateList().get(0));
-			lambdaQueryWrapper.le(ObjectUtils.isNotNull(order.getBusinesDateList().get(1)), PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
+			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())//公司
+			.eq(ObjectUtils.isNotEmpty(order.getReturnsStatus()), PjOrder::getReturnsStatus, order.getReturnsStatus())//退货状态
+			.eq(ObjectUtils.isNotEmpty(order.getCustomerId()), PjOrder::getCustomerId, order.getCustomerId())//客户
+			.eq(ObjectUtils.isNotEmpty(order.getSalerId()), PjOrder::getSalerId, order.getSalerId());//来源
+		if (order.getBusinesDateList() != null && order.getBusinesDateList().size() > 1) {//业务日期
+			lambdaQueryWrapper.ge(PjOrder::getBusinesDate, order.getBusinesDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
 		}
-		lambdaQueryWrapper.apply("(( business_source = '外部销售' AND FIND_IN_SET( actual_payment_status, '2,3,4' ) ) " +
-			"OR (business_source = '内部销售' AND FIND_IN_SET( actual_payment_status, '0,1,2,3,4' ))" +
-			"OR (business_source = '额度支付' AND FIND_IN_SET( actual_payment_status, '0,1,2,3,4' )))");
+		lambdaQueryWrapper.apply("find_in_set(status,'已发货,已收货')");
 		lambdaQueryWrapper.orderByDesc(PjOrder::getCreateTime);
-		List<PjOrder> pages = orderService.list(lambdaQueryWrapper);
+		List<PjOrder> list = orderService.list(lambdaQueryWrapper);
+		List<PjOrder> pjOrderList = new ArrayList<>();
+		list.forEach(item -> {
+			item.setSalesAmount(item.getSalesAmount().subtract(ObjectUtils.isNotNull(item.getReturnsAmount()) ? item.getReturnsAmount() : new BigDecimal("0.00")));
+			if (ObjectUtils.isNotNull(item.getReturnsAmount()) && new BigDecimal("0.00").compareTo(item.getReturnsAmount()) != 0) {
+				if (ObjectUtils.isNull(item.getPaymentAmountTl()) || new BigDecimal("0.00").compareTo(item.getPaymentAmountTl()) == 0) {
+					item.setPaymentAmountTl(new BigDecimal("0.00"));
+				} else {
+					item.setPaymentAmountTl(item.getPaymentAmountTl().subtract(ObjectUtils.isNotNull(item.getReturnsAmount()) ? item.getReturnsAmount() : new BigDecimal("0.00")));
+				}
+			}
+			if (item.getGoodsTotalNum().compareTo(item.getReturnsNumber()) != 0) {
+				pjOrderList.add(item);
+			}
+		});
 		if ("1".equals(order.getExportType())) {
-			ExcelUtil.export(response, "销售对账明细", "销售对账明细", BeanUtil.copy(pages, PjOrderExportExcelReconciliation.class), PjOrderExportExcelReconciliation.class);
+			ExcelUtil.export(response, "销售对账明细", "销售对账明细", BeanUtil.copy(list, PjOrderExportExcelReconciliation.class), PjOrderExportExcelReconciliation.class);
 		} else if ("2".equals(order.getExportType())) {
-			ExcelUtil.export(response, "应收统计", "应收统计", BeanUtil.copy(pages, PjOrderExportExcelReceivable.class), PjOrderExportExcelReceivable.class);
+			ExcelUtil.export(response, "应收统计明细", "应收统计明细", BeanUtil.copy(list, PjOrderExportExcelReceivable.class), PjOrderExportExcelReceivable.class);
 		} else if ("3".equals(order.getExportType())) {
-			ExcelUtil.export(response, "应付统计", "应付统计", BeanUtil.copy(pages, PjOrderExportExcelPay.class), PjOrderExportExcelPay.class);
+			ExcelUtil.export(response, "应付统计明细", "应付统计明细", BeanUtil.copy(list, PjOrderExportExcelPay.class), PjOrderExportExcelPay.class);
 		} else if ("4".equals(order.getExportType())) {
-			ExcelUtil.export(response, "利润统计", "利润统计", BeanUtil.copy(pages, PjOrderExportExcelProfit.class), PjOrderExportExcelProfit.class);
+			ExcelUtil.export(response, "利润统计明细", "利润统计明细", BeanUtil.copy(list, PjOrderExportExcelProfit.class), PjOrderExportExcelProfit.class);
 		}
 	}
 
-
 	/**
 	 * 获得app今日收入
 	 *
@@ -992,11 +1043,11 @@ public class OrderController extends BladeController {
 	}
 
 	/**
-	 * 入库明细导入
+	 * 入库明细导入名称
 	 */
 	@PostMapping("/import-item-name")
 	@ApiOperationSupport(order = 13)
-	public R<List<PjOrderItems>> importItemName(@RequestParam("file") MultipartFile file) {
+	public R importItemName(@RequestParam("file") MultipartFile file) {
 		//导入数据
 		List<ShipItemImportXSExcel> excelList = ExcelUtil.read(file, ShipItemImportXSExcel.class);
 		if (CollectionUtils.isEmpty(excelList)) {
@@ -1007,12 +1058,12 @@ public class OrderController extends BladeController {
 	}
 
 	/**
-	 * 入库明细导入
+	 * 入库明细导入编码
 	 */
 	@PostMapping("/import-item-code")
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "入库明细导入", notes = "传入excel")
-	public R<List<PjOrderItems>> importItemCode(@RequestParam("file") MultipartFile file) {
+	public R importItemCode(@RequestParam("file") MultipartFile file) {
 		//导入数据
 		List<ShipItemImportXSCodeExcel> excelList = ExcelUtil.read(file, ShipItemImportXSCodeExcel.class);
 		if (CollectionUtils.isEmpty(excelList)) {
@@ -1023,7 +1074,7 @@ public class OrderController extends BladeController {
 	}
 
 	/**
-	 * 导出模板
+	 * 导出模板名称
 	 */
 	@GetMapping("/export-item-name")
 	@ApiOperationSupport(order = 14)
@@ -1034,7 +1085,7 @@ public class OrderController extends BladeController {
 	}
 
 	/**
-	 * 导出模板
+	 * 导出模板编码
 	 */
 	@GetMapping("/export-item-code")
 	@ApiOperationSupport(order = 14)

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

@@ -59,8 +59,9 @@
         IF(po1.addAmount,po1.addAmount,0.00 ) AS addAmount ,
         IF(po1.chargeAmount,po1.chargeAmount,0.00 ) AS chargeAmount ,
         IF(po1.addAmount - po1.chargeAmount,po1.addAmount - po1.chargeAmount,0.00 ) AS unpaidAmount ,
-        IF(IF(po2.total_money,po2.total_money,0.00 ) +IF(po1.addAmount,po1.addAmount,0.00
-        ),IF(po2.total_money,po2.total_money,0.00 ) +IF(po1.addAmount,po1.addAmount,0.00 ),0.00 ) AS closingAmount
+        IF(IF(po2.total_money,po2.total_money,0.00 ) +IF(po1.addAmount,po1.addAmount,0.00) - IF(po1.chargeAmount,po1.chargeAmount,0.00 )
+        ,IF(po2.total_money,po2.total_money,0.00 ) +IF(po1.addAmount,po1.addAmount,0.00 )-IF(po1.chargeAmount,po1.chargeAmount,0.00 )
+        ,0.00 ) AS closingAmount
         FROM
         pjpf_corps_desc pcd
         LEFT JOIN pjpf_corps_addr pca ON pcd.id = pca.pid and pca.default_addres = '1'
@@ -189,8 +190,9 @@
         IF(po1.addAmount,po1.addAmount,0.00 ) AS addAmount ,
         IF(po1.chargeAmount,po1.chargeAmount,0.00 ) AS chargeAmount ,
         IF(po1.addAmount - po1.chargeAmount,po1.addAmount - po1.chargeAmount,0.00 ) AS unpaidAmount ,
-        IF(IF(po2.total_money,po2.total_money,0.00 ) +IF(po1.addAmount,po1.addAmount,0.00
-        ),IF(po2.total_money,po2.total_money,0.00 ) +IF(po1.addAmount,po1.addAmount,0.00 ),0.00 ) AS closingAmount
+        IF(IF(po2.total_money,po2.total_money,0.00 ) +IF(po1.addAmount,po1.addAmount,0.00) -IF(po1.chargeAmount,po1.chargeAmount,0.00 )
+        ,IF(po2.total_money,po2.total_money,0.00 ) +IF(po1.addAmount,po1.addAmount,0.00 )-IF(po1.chargeAmount,po1.chargeAmount,0.00 )
+        ,0.00 ) AS closingAmount
         FROM
         pjpf_corps_desc pcd
         LEFT JOIN pjpf_corps_addr pca ON pcd.id = pca.pid and pca.default_addres = '1'
@@ -248,6 +250,8 @@
         SELECT
             o.customer_id AS customerId,
             o.customer_name AS customerName,
+            o.saler_id AS salerId,
+            o.saler_name AS salerName,
             DATE_FORMAT( o.busines_date, '%Y-%m' ) AS businesDate,
             IF
                 ( SUM( o.total_money ), SUM( o.total_money ), 0 ) AS totalMoney,
@@ -267,12 +271,16 @@
         WHERE
             o.tenant_id = #{order.tenantId}
           AND o.is_deleted = '0'
-        and (( o.business_source = '外部销售' AND FIND_IN_SET( o.actual_payment_status, '2,3' ) )
-                 OR (o.business_source = '内部销售' AND FIND_IN_SET( o.actual_payment_status, '0,1,2,3' ))
-                OR (business_source = '额度支付' AND FIND_IN_SET( actual_payment_status, '0,1,2,3' )))
+        AND FIND_IN_SET( o.status, '已发货,已收货' )
         <if test="order.customerId!=null">
             and o.customer_id = #{order.customerId}
         </if>
+        <if test="order.whetherSettlement !=null and order.whetherSettlement == 0">
+            and o.total_money != o.payment_amount_tl
+        </if>
+        <if test="order.salerId!=null">
+            and o.saler_id = #{order.salerId}
+        </if>
         <if test="order.businesDateList !=null and order.businesDateList !='' and order.businesDateList[0] != ''">
             and DATE_FORMAT(o.busines_date,'%Y-%m') &gt;= #{order.businesDateList[0]}
         </if>
@@ -289,15 +297,21 @@
             and o.bs_type = 'CG'
         </if>
         GROUP BY
-            o.customer_id,
+        o.saler_id,o.customer_name,
             DATE_FORMAT(
                 o.busines_date,
                 '%Y-%m')
+        ORDER BY o.saler_name,o.customer_name,
+        DATE_FORMAT(
+        o.busines_date,
+        '%Y-%m')
     </select>
     <select id="statisticsExport" resultType="org.springblade.salesPart.excel.PjOrderStatisticsExcel">
         SELECT
         o.customer_id AS customerId,
         o.customer_name AS customerName,
+        o.saler_id AS salerId,
+        o.saler_name AS salerName,
         DATE_FORMAT( o.busines_date, '%Y-%m' ) AS businesDate,
         IF
         ( SUM( o.total_money ), SUM( o.total_money ), 0 ) AS totalMoney,
@@ -317,12 +331,16 @@
         WHERE
         o.tenant_id = #{order.tenantId}
         AND o.is_deleted = '0'
-        and (( o.business_source = '外部销售' AND FIND_IN_SET( o.actual_payment_status, '2,3' ) )
-                 OR (o.business_source = '内部销售' AND FIND_IN_SET( o.actual_payment_status, '0,1,2,3' ))
-        OR (business_source = '额度支付' AND FIND_IN_SET( actual_payment_status, '0,1,2,3' )))
+        AND FIND_IN_SET( o.status, '已发货,已收货' )
         <if test="order.customerId!=null">
             and o.customer_id = #{order.customerId}
         </if>
+        <if test="order.whetherSettlement !=null and order.whetherSettlement == 0">
+            and o.total_money != o.payment_amount_tl
+        </if>
+        <if test="order.salerId!=null">
+            and o.saler_id = #{order.salerId}
+        </if>
         <if test="order.businesDateList !=null and order.businesDateList !='' and order.businesDateList[0] != ''">
             and DATE_FORMAT(o.busines_date,'%Y-%m') &gt;= #{order.businesDateList[0]}
         </if>
@@ -336,7 +354,11 @@
             and o.bs_type = 'CG'
         </if>
         GROUP BY
-        o.customer_id,
+        o.saler_id,o.customer_name,
+        DATE_FORMAT(
+        o.busines_date,
+        '%Y-%m')
+        ORDER BY o.saler_name,o.customer_name,
         DATE_FORMAT(
         o.busines_date,
         '%Y-%m')
@@ -424,6 +446,8 @@
           AND DATE_FORMAT(po.busines_date,'%Y-%m') &lt;= DATE_FORMAT(#{endDate},'%Y-%m')
         GROUP BY
             poi.brand_id
+        ORDER BY
+            SUM( poi.send_num ) desc
             LIMIT 10
     </select>
     <select id="corpsSalesVolume" resultType="java.util.Map">

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

@@ -230,7 +230,9 @@ public interface IOrderService extends IService<PjOrder> {
 
 	List<SalespersonCustomer> salespersonCustomerSum(SaleDetail saleDetailDto);
 
-	R<List<PjOrderItems>> importItemName(List<ShipItemImportXSExcel> excelList);
+	R importItemName(List<ShipItemImportXSExcel> excelList);
 
-	R<List<PjOrderItems>> importItemCode(List<ShipItemImportXSCodeExcel> excelList);
+	R importItemCode(List<ShipItemImportXSCodeExcel> excelList);
+
+	R statisticsSum(PjOrderStatisticsWeb order);
 }

File diff suppressed because it is too large
+ 716 - 174
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java


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

@@ -34,7 +34,7 @@
     <select id="productLaunchDetails" resultType="org.springblade.salesPart.excel.PjShipStockDetails">
         SELECT
             ps.id AS id,
-            ps.storage_name AS stockId,
+            ps.storage_name AS stockName,
             ps.ord_no AS billno,
             ps.STATUS AS statusName,
             ps.create_time AS updateTime,

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

@@ -252,7 +252,7 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 		List<PjProductLaunch> pjProductLaunchList1 = new ArrayList<>();
 		List<String> goodsNames = data.stream().map(ProductLaunchImportExcel::getCname).collect(Collectors.toList());
 		List<PjGoodsDesc> pjGoodsDescsList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
-			.eq(PjGoodsDesc::getIsDeleted,0)
+			.eq(PjGoodsDesc::getIsDeleted, 0)
 			.in(PjGoodsDesc::getCname, goodsNames));
 		List<PjGoodsFiles> pjGoodsFilesList = new ArrayList<>();
 		List<PjStockDesc> pjStockDescList = new ArrayList<>();
@@ -271,6 +271,15 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			pjStockDescList = stockDescService.list(lambdaQueryWrapper);
 		}
 		String status = iSysClient.getParamServiceNew("zero.inventory.grounding");
+		List<Dept> deptList = new ArrayList<>();
+		R<List<Dept>> resDept = iSysClient.getDeptListIByName(AuthUtil.getTenantId(), null);
+		if (resDept.isSuccess()) {
+			deptList = resDept.getData();
+		}
+		LambdaQueryWrapper<PjProductLaunch> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+			.eq(PjProductLaunch::getIsDeleted, 0);
+		List<PjProductLaunch> productLaunchList = baseMapper.selectList(queryWrapper);
 		for (ProductLaunchImportExcel e : data) {
 			PjProductLaunch productLaunch = new PjProductLaunch();
 			BeanUtils.copyProperties(e, productLaunch);
@@ -319,10 +328,11 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 
 			//获得所属公司
 			if (StringUtil.isNotBlank(e.getSalesCompanyName())) {
-				R<Dept> dept = iSysClient.getDeptIByName(AuthUtil.getTenantId(), e.getSalesCompanyName());
-				if (ObjectUtil.isNotEmpty(dept.getData())) {
-					productLaunch.setSalesCompanyId(dept.getData().getId());
-					productLaunch.setSalesCompanyName(dept.getData().getFullName());
+				Dept dept = deptList.stream().filter(item -> item.getFullName().equals(productLaunch.getSalesCompanyName()))
+					.findFirst().orElse(null);
+				if (dept != null) {
+					productLaunch.setSalesCompanyId(dept.getId());
+					productLaunch.setSalesCompanyName(dept.getFullName());
 				} else {
 					throw new SecurityException("请输入正确的所属公司");
 				}
@@ -334,14 +344,8 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			productLaunch.setPriceFour(e.getPriceFour());
 
 			// 如果名称相等 就认为重复
-			LambdaQueryWrapper<PjProductLaunch> queryWrapper = new LambdaQueryWrapper<>();
-			queryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-				.eq(PjProductLaunch::getCname, productLaunch.getCname())
-				.eq(PjProductLaunch::getSalesCompanyId, productLaunch.getSalesCompanyId())
-				.eq(PjProductLaunch::getIsDeleted, 0)
-				.eq(PjProductLaunch::getBillType, 0);
-			PjProductLaunch one = baseMapper.selectOne(queryWrapper);
-
+			PjProductLaunch one = productLaunchList.stream().filter(item -> item.getCname().equals(productLaunch.getCname())
+				&& item.getSalesCompanyId().equals(productLaunch.getSalesCompanyId()) && item.getBillType().equals(0)).findFirst().orElse(null);
 			if (one == null) {
 				productLaunch.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 				productLaunch.setCreateTime(new Date());
@@ -359,22 +363,15 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			}
 			//获得共享公司
 			if (StringUtil.isNotBlank(e.getSharedCompany())) {
-				R<List<Dept>> dept = iSysClient.getDeptListIByName(AuthUtil.getTenantId(), e.getSharedCompany());
+				List<Dept> dept = deptList.stream().filter(item -> productLaunch.getSharedCompany().contains(item.getId() + "")).collect(Collectors.toList());
 				productLaunch.setSharedCompany("");
-				for (Dept item : dept.getData()) {
+				for (Dept item : dept) {
 					productLaunch.setSharedCompany(productLaunch.getSharedCompany() + "," + item.getId());
 					PjProductLaunch launch = new PjProductLaunch();
 					BeanUtils.copyProperties(productLaunch, launch);
-
-					LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
-					lambdaQueryWrapper1.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-						.eq(PjProductLaunch::getIsDeleted, 0)
-						.eq(PjProductLaunch::getBillType, 1)
-						.eq(PjProductLaunch::getGoodsId, productLaunch.getGoodsId())
-						.eq(PjProductLaunch::getSalesCompanyId, item.getId())
-						.eq(PjProductLaunch::getSourceCompanyId, productLaunch.getSalesCompanyId());
-					PjProductLaunch selOne = baseMapper.selectOne(lambdaQueryWrapper1);
-
+					PjProductLaunch selOne = productLaunchList.stream().filter(i -> i.getBillType().equals(1) &&
+						i.getGoodsId().equals(productLaunch.getGoodsId()) && i.getSalesCompanyId().equals(item.getId()) &&
+						i.getSourceCompanyId().equals(productLaunch.getSalesCompanyId())).findFirst().orElse(null);
 					if (ObjectUtil.isEmpty(selOne)) {
 						launch.setId(null);
 						launch.setBillType(1);
@@ -415,16 +412,11 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 					}
 				}
 				if (ObjectUtils.isNotNull(productLaunch.getSharedCompany()) && productLaunch.getSharedCompany().length() > 1) {
-					productLaunch.setSharedCompany(productLaunch.getSharedCompany().substring(1, productLaunch.getSharedCompany().length()));
+					productLaunch.setSharedCompany(productLaunch.getSharedCompany().substring(1));
 				}
-				LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-				lambdaQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-					.eq(PjProductLaunch::getBillType, 1)
-					.eq(PjProductLaunch::getIsDeleted, 0)
-					.eq(PjProductLaunch::getGoodsId, productLaunch.getGoodsId())
-					.eq(PjProductLaunch::getSourceCompanyId, productLaunch.getSalesCompanyId());
-
-				List<PjProductLaunch> list = baseMapper.selectList(lambdaQueryWrapper);
+				List<PjProductLaunch> list = productLaunchList.stream().filter(item-> item.getBillType().equals(1)&&
+						item.getGoodsId().equals(productLaunch.getGoodsId())&&item.getSourceCompanyId().equals(productLaunch.getSalesCompanyId()))
+					.collect(Collectors.toList());
 				if (ObjectUtil.isNotEmpty(list)) {
 					list.forEach(i -> {
 						i.setWhetherShare(1);
@@ -745,7 +737,7 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 		List<PjProductLaunch> pjProductLaunchList1 = new ArrayList<>();
 		List<String> goodsNames = list.stream().map(PjProductLaunch::getCname).collect(Collectors.toList());
 		List<PjGoodsDesc> pjGoodsDescsList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
-					.eq(PjGoodsDesc::getIsDeleted,0)
+			.eq(PjGoodsDesc::getIsDeleted, 0)
 			.in(PjGoodsDesc::getCname, goodsNames));
 		List<PjGoodsFiles> pjGoodsFilesList = new ArrayList<>();
 		List<PjStockDesc> pjStockDescList = new ArrayList<>();
@@ -764,16 +756,19 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			pjStockDescList = stockDescService.list(lambdaQueryWrapper);
 		}
 		String status = iSysClient.getParamServiceNew("zero.inventory.grounding");
+		List<Dept> deptList = new ArrayList<>();
+		R<List<Dept>> resDept = iSysClient.getDeptListIByName(AuthUtil.getTenantId(), null);
+		if (resDept.isSuccess()) {
+			deptList = resDept.getData();
+		}
+		LambdaQueryWrapper<PjProductLaunch> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+			.eq(PjProductLaunch::getIsDeleted, 0);
+		List<PjProductLaunch> productLaunchList = baseMapper.selectList(queryWrapper);
 		for (PjProductLaunch productLaunch : list) {
-
 			//获得商品信息
 			PjGoodsDesc pjGoodsDesc = pjGoodsDescsList.stream()
 				.filter(e -> e.getCname().equals(productLaunch.getCname())).findFirst().orElse(null);
-				/*goodsDescMapper.selectOne(new LambdaQueryWrapper<PjGoodsDesc>()
-				.eq(PjGoodsDesc::getIsDeleted, 0)
-				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
-				.eq(PjGoodsDesc::getCname, productLaunch.getCname()));*/
-
 			if (pjGoodsDesc != null) {
 				//商品id
 				productLaunch.setGoodsId(pjGoodsDesc.getId());
@@ -786,7 +781,6 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 				productLaunch.setSelfRecovery(pjGoodsDesc.getSelfRecovery());
 				productLaunch.setCnameInt(pjGoodsDesc.getCnameInt());
 				productLaunch.setSpecificationAndModel(pjGoodsDesc.getSpecificationAndModel());
-
 				List<PjStockDesc> stockDescList = pjStockDescList.stream().filter(i -> i.getGoodsId().equals(pjGoodsDesc.getId())).collect(Collectors.toList());
 				if ("1".equals(status)) {
 					if (!stockDescList.isEmpty()) {
@@ -807,13 +801,13 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			} else {
 				throw new RuntimeException("商品" + productLaunch.getCname() + "名称错误或商品不存在");
 			}
-
 			//获得所属公司
 			if (StringUtil.isNotBlank(productLaunch.getSalesCompanyName())) {
-				R<Dept> dept = iSysClient.getDeptIByName(AuthUtil.getTenantId(), productLaunch.getSalesCompanyName());
-				if (ObjectUtil.isNotEmpty(dept.getData())) {
-					productLaunch.setSalesCompanyId(dept.getData().getId());
-					productLaunch.setSalesCompanyName(dept.getData().getFullName());
+				Dept dept = deptList.stream().filter(e -> e.getFullName().equals(productLaunch.getSalesCompanyName()))
+					.findFirst().orElse(null);
+				if (dept != null) {
+					productLaunch.setSalesCompanyId(dept.getId());
+					productLaunch.setSalesCompanyName(dept.getFullName());
 				} else {
 					throw new SecurityException("请输入正确的所属公司");
 				}
@@ -823,16 +817,9 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			productLaunch.setPriceTwo(productLaunch.getPriceTwo());
 			productLaunch.setPriceThree(productLaunch.getPriceThree());
 			productLaunch.setPriceFour(productLaunch.getPriceFour());
-
 			// 如果名称相等 就认为重复
-			LambdaQueryWrapper<PjProductLaunch> queryWrapper = new LambdaQueryWrapper<>();
-			queryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-				.eq(PjProductLaunch::getCname, productLaunch.getCname())
-				.eq(PjProductLaunch::getSalesCompanyId, productLaunch.getSalesCompanyId())
-				.eq(PjProductLaunch::getIsDeleted, 0)
-				.eq(PjProductLaunch::getBillType, 0);
-			PjProductLaunch one = baseMapper.selectOne(queryWrapper);
-
+			PjProductLaunch one = productLaunchList.stream().filter(e -> e.getCname().equals(productLaunch.getCname())
+				&& e.getSalesCompanyId().equals(productLaunch.getSalesCompanyId()) && e.getBillType().equals(0)).findFirst().orElse(null);
 			if (one == null) {
 				productLaunch.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 				productLaunch.setCreateTime(new Date());
@@ -847,22 +834,15 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			}
 			//获得共享公司
 			if (StringUtil.isNotBlank(productLaunch.getSharedCompany())) {
-				R<List<Dept>> dept = iSysClient.selectByDeptIds(productLaunch.getSharedCompany());
+				List<Dept> dept = deptList.stream().filter(e -> productLaunch.getSharedCompany().contains(e.getId() + "")).collect(Collectors.toList());
 				productLaunch.setSharedCompany("");
-				for (Dept item : dept.getData()) {
+				for (Dept item : dept) {
 					productLaunch.setSharedCompany(productLaunch.getSharedCompany() + "," + item.getId());
 					PjProductLaunch launch = new PjProductLaunch();
 					BeanUtils.copyProperties(productLaunch, launch);
-
-					LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
-					lambdaQueryWrapper1.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-						.eq(PjProductLaunch::getIsDeleted, 0)
-						.eq(PjProductLaunch::getBillType, 1)
-						.eq(PjProductLaunch::getGoodsId, productLaunch.getGoodsId())
-						.eq(PjProductLaunch::getSalesCompanyId, item)
-						.eq(PjProductLaunch::getSourceCompanyId, productLaunch.getSalesCompanyId());
-					PjProductLaunch selOne = baseMapper.selectOne(lambdaQueryWrapper1);
-
+					PjProductLaunch selOne = productLaunchList.stream().filter(e -> e.getBillType().equals(1) &&
+						e.getGoodsId().equals(productLaunch.getGoodsId()) && e.getSalesCompanyId().equals(item.getId()) &&
+						e.getSourceCompanyId().equals(productLaunch.getSalesCompanyId())).findFirst().orElse(null);
 					if (ObjectUtil.isEmpty(selOne)) {
 						launch.setId(null);
 						launch.setBillType(1);
@@ -899,18 +879,13 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 					}
 				}
 				if (ObjectUtils.isNotNull(productLaunch.getSharedCompany()) && productLaunch.getSharedCompany().length() > 1) {
-					productLaunch.setSharedCompany(productLaunch.getSharedCompany().substring(1, productLaunch.getSharedCompany().length()));
+					productLaunch.setSharedCompany(productLaunch.getSharedCompany().substring(1));
 				}
-				LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-				lambdaQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-					.eq(PjProductLaunch::getBillType, 1)
-					.eq(PjProductLaunch::getIsDeleted, 0)
-					.eq(PjProductLaunch::getGoodsId, productLaunch.getGoodsId())
-					.eq(PjProductLaunch::getSourceCompanyId, productLaunch.getSalesCompanyId());
-
-				List<PjProductLaunch> productLaunchList = baseMapper.selectList(lambdaQueryWrapper);
-				if (ObjectUtil.isNotEmpty(productLaunchList)) {
-					productLaunchList.forEach(i -> {
+				List<PjProductLaunch> productLaunches = productLaunchList.stream().filter(e-> e.getBillType().equals(1)&&
+					e.getGoodsId().equals(productLaunch.getGoodsId())&&e.getSourceCompanyId().equals(productLaunch.getSalesCompanyId()))
+					.collect(Collectors.toList());
+				if (ObjectUtil.isNotEmpty(productLaunches)) {
+					productLaunches.forEach(i -> {
 						i.setWhetherShare(1);
 						pjProductLaunchList1.add(i);
 					});
@@ -978,7 +953,7 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 		List<PjProductLaunch> pjProductLaunchList1 = new ArrayList<>();
 		List<String> goodsNames = data.stream().map(ProductLaunchImportCodeExcel::getCode).collect(Collectors.toList());
 		List<PjGoodsDesc> pjGoodsDescsList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
-			.eq(PjGoodsDesc::getIsDeleted,0)
+			.eq(PjGoodsDesc::getIsDeleted, 0)
 			.in(PjGoodsDesc::getCode, goodsNames));
 		List<PjGoodsFiles> pjGoodsFilesList = new ArrayList<>();
 		List<PjStockDesc> pjStockDescList = new ArrayList<>();
@@ -997,6 +972,15 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			pjStockDescList = stockDescService.list(lambdaQueryWrapper);
 		}
 		String status = iSysClient.getParamServiceNew("zero.inventory.grounding");
+		List<Dept> deptList = new ArrayList<>();
+		R<List<Dept>> resDept = iSysClient.getDeptListIByName(AuthUtil.getTenantId(), null);
+		if (resDept.isSuccess()) {
+			deptList = resDept.getData();
+		}
+		LambdaQueryWrapper<PjProductLaunch> queryWrapper = new LambdaQueryWrapper<>();
+		queryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+			.eq(PjProductLaunch::getIsDeleted, 0);
+		List<PjProductLaunch> productLaunchList = baseMapper.selectList(queryWrapper);
 		for (ProductLaunchImportCodeExcel e : data) {
 			PjProductLaunch productLaunch = new PjProductLaunch();
 			BeanUtils.copyProperties(e, productLaunch);
@@ -1045,10 +1029,11 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 
 			//获得所属公司
 			if (StringUtil.isNotBlank(e.getSalesCompanyName())) {
-				R<Dept> dept = iSysClient.getDeptIByName(AuthUtil.getTenantId(), e.getSalesCompanyName());
-				if (ObjectUtil.isNotEmpty(dept.getData())) {
-					productLaunch.setSalesCompanyId(dept.getData().getId());
-					productLaunch.setSalesCompanyName(dept.getData().getFullName());
+				Dept dept = deptList.stream().filter(item -> item.getFullName().equals(productLaunch.getSalesCompanyName()))
+					.findFirst().orElse(null);
+				if (dept != null) {
+					productLaunch.setSalesCompanyId(dept.getId());
+					productLaunch.setSalesCompanyName(dept.getFullName());
 				} else {
 					throw new SecurityException("请输入正确的所属公司");
 				}
@@ -1060,14 +1045,8 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			productLaunch.setPriceFour(e.getPriceFour());
 
 			// 如果名称相等 就认为重复
-			LambdaQueryWrapper<PjProductLaunch> queryWrapper = new LambdaQueryWrapper<>();
-			queryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-				.eq(PjProductLaunch::getCname, pjGoodsDesc.getCname())
-				.eq(PjProductLaunch::getSalesCompanyId, productLaunch.getSalesCompanyId())
-				.eq(PjProductLaunch::getIsDeleted, 0)
-				.eq(PjProductLaunch::getBillType, 0);
-			PjProductLaunch one = baseMapper.selectOne(queryWrapper);
-
+			PjProductLaunch one = productLaunchList.stream().filter(item -> item.getCname().equals(productLaunch.getCname())
+				&& item.getSalesCompanyId().equals(productLaunch.getSalesCompanyId()) && item.getBillType().equals(0)).findFirst().orElse(null);
 			if (one == null) {
 				productLaunch.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 				productLaunch.setCreateTime(new Date());
@@ -1085,22 +1064,15 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 			}
 			//获得共享公司
 			if (StringUtil.isNotBlank(e.getSharedCompany())) {
-				R<List<Dept>> dept = iSysClient.getDeptListIByName(AuthUtil.getTenantId(), e.getSharedCompany());
+				List<Dept> dept = deptList.stream().filter(item -> productLaunch.getSharedCompany().contains(item.getId() + "")).collect(Collectors.toList());
 				productLaunch.setSharedCompany("");
-				for (Dept item : dept.getData()) {
+				for (Dept item : dept) {
 					productLaunch.setSharedCompany(productLaunch.getSharedCompany() + "," + item.getId());
 					PjProductLaunch launch = new PjProductLaunch();
 					BeanUtils.copyProperties(productLaunch, launch);
-
-					LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
-					lambdaQueryWrapper1.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-						.eq(PjProductLaunch::getIsDeleted, 0)
-						.eq(PjProductLaunch::getBillType, 1)
-						.eq(PjProductLaunch::getGoodsId, productLaunch.getGoodsId())
-						.eq(PjProductLaunch::getSalesCompanyId, item.getId())
-						.eq(PjProductLaunch::getSourceCompanyId, productLaunch.getSalesCompanyId());
-					PjProductLaunch selOne = baseMapper.selectOne(lambdaQueryWrapper1);
-
+					PjProductLaunch selOne = productLaunchList.stream().filter(i -> i.getBillType().equals(1) &&
+						i.getGoodsId().equals(productLaunch.getGoodsId()) && i.getSalesCompanyId().equals(item.getId()) &&
+						i.getSourceCompanyId().equals(productLaunch.getSalesCompanyId())).findFirst().orElse(null);
 					if (ObjectUtil.isEmpty(selOne)) {
 						launch.setId(null);
 						launch.setBillType(1);
@@ -1143,14 +1115,9 @@ public class ProductLaunchServiceImpl extends ServiceImpl<ProductLaunchMapper, P
 				if (ObjectUtils.isNotNull(productLaunch.getSharedCompany()) && productLaunch.getSharedCompany().length() > 1) {
 					productLaunch.setSharedCompany(productLaunch.getSharedCompany().substring(1, productLaunch.getSharedCompany().length()));
 				}
-				LambdaQueryWrapper<PjProductLaunch> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-				lambdaQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
-					.eq(PjProductLaunch::getBillType, 1)
-					.eq(PjProductLaunch::getIsDeleted, 0)
-					.eq(PjProductLaunch::getGoodsId, productLaunch.getGoodsId())
-					.eq(PjProductLaunch::getSourceCompanyId, productLaunch.getSalesCompanyId());
-
-				List<PjProductLaunch> list = baseMapper.selectList(lambdaQueryWrapper);
+				List<PjProductLaunch> list = productLaunchList.stream().filter(item-> item.getBillType().equals(1)&&
+						item.getGoodsId().equals(productLaunch.getGoodsId())&&item.getSourceCompanyId().equals(productLaunch.getSalesCompanyId()))
+					.collect(Collectors.toList());
 				if (ObjectUtil.isNotEmpty(list)) {
 					list.forEach(i -> {
 						i.setWhetherShare(1);

+ 2 - 2
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipController.java

@@ -357,7 +357,7 @@ public class ShipController extends BladeController {
 	@PostMapping("/import-item")
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "入库明细导入", notes = "传入excel")
-	public R<List<PjOrderItems>> importItem(@RequestParam("file") MultipartFile file) {
+	public R importItem(@RequestParam("file") MultipartFile file) {
 		//导入数据
 		List<ShipItemImportExcel> excelList = ExcelUtil.read(file, ShipItemImportExcel.class);
 		if (CollectionUtils.isEmpty(excelList)) {
@@ -373,7 +373,7 @@ public class ShipController extends BladeController {
 	@PostMapping("/import-item-code")
 	@ApiOperationSupport(order = 13)
 	@ApiOperation(value = "入库明细导入", notes = "传入excel")
-	public R<List<PjOrderItems>> importItemCode(@RequestParam("file") MultipartFile file) {
+	public R importItemCode(@RequestParam("file") MultipartFile file) {
 		//导入数据
 		List<ShipItemImportCodeExcel> excelList = ExcelUtil.read(file, ShipItemImportCodeExcel.class);
 		if (CollectionUtils.isEmpty(excelList)) {

+ 2 - 2
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/IShipService.java

@@ -115,7 +115,7 @@ public interface IShipService extends IService<PjShip> {
 	/**
 	 * 入库明细导入
 	 */
-	R<List<PjOrderItems>> importItem(List<ShipItemImportExcel> excelList);
+	R importItem(List<ShipItemImportExcel> excelList);
 
 	/**
 	 * 退货入库完成
@@ -162,7 +162,7 @@ public interface IShipService extends IService<PjShip> {
 
 	List<PjShipStockDetails> stockDataDetailsOrder(PjShipStockDetails pjShipStockDetails);
 
-	R<List<PjOrderItems>> importItemCode(List<ShipItemImportCodeExcel> excelList);
+	R importItemCode(List<ShipItemImportCodeExcel> excelList);
 
 	R outboundWorkOrderReturns(String ids);
 

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

@@ -76,6 +76,8 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 
 /**
@@ -351,63 +353,122 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 
 			//生成出库工单历史记录
 			saveHistory(item.getId(), OrderTypeEnum.TOBESHIPPEDOUT.getType());
+			// 创建线程池
+			ExecutorService executor = Executors.newSingleThreadExecutor();
+			// 启动任务并提交给线程池
+			executor.submit(() -> {
+				try {
+					this.sendMessage(rwShip, item, goodsNames, 1);
+				} catch (Exception e) {
+					System.out.println("业务处理成功,发送消息异常,时间:" + new Date());
+					System.out.println(e.getMessage());
+					// 关闭线程池
+					executor.shutdown();
+				} finally {
+					// 关闭线程池
+					executor.shutdown();
+				}
+			});
+			// 关闭线程池
+			executor.shutdown();
+		}
+		this.saveOrUpdateBatch(rwShipList);
+		shipItemsService.saveOrUpdateBatch(shipItemsList);
+		return R.success("操作成功");
+	}
 
-			LocalDateTime now = LocalDateTime.now();
-			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-			String formatted = now.format(formatter);
-			//给角色为派工的人发送消息
-			if (ObjectUtils.isNotNull(rwShip.getStockClerkId())) {
-				Message sendMessage = new Message();
-				sendMessage.setParameter(item.getId() + "");
-				sendMessage.setUserName(AuthUtil.getUserName());
-				sendMessage.setUserId(null);
-				sendMessage.setToUserId(rwShip.getStockClerkId());
-				sendMessage.setToUserName(rwShip.getStockClerkName());
-				sendMessage.setMessageType(1);
-				sendMessage.setTenantId(AuthUtil.getTenantId());
-				sendMessage.setCreateUser(null);
-				sendMessage.setCreateTime(new Date());
+	private void sendMessage(PjShip rwShip, PjShip item, StringBuilder goodsNames, int type) {
+		LocalDateTime now = LocalDateTime.now();
+		DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+		String formatted = now.format(formatter);
+		//给角色为派工的人发送消息
+		if (ObjectUtils.isNotNull(rwShip.getStockClerkId())) {
+			Message sendMessage = new Message();
+			sendMessage.setParameter(item.getId() + "");
+			sendMessage.setUserName(AuthUtil.getUserName());
+			sendMessage.setUserId(null);
+			sendMessage.setToUserId(rwShip.getStockClerkId());
+			sendMessage.setToUserName(rwShip.getStockClerkName());
+			sendMessage.setMessageType(1);
+			sendMessage.setTenantId(AuthUtil.getTenantId());
+			sendMessage.setCreateUser(null);
+			sendMessage.setCreateTime(new Date());
+			if (1 == type) {
 				sendMessage.setUrl("/tirePartsMall/salesManagement/outboundWorkOrder/index");
 				sendMessage.setPageLabel("出库工单");
 				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
 				sendMessage.setMessageBody("您有新的出库工单请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-				R save = messageClient.save(sendMessage);
-				System.out.println("发送结果:" + save);
-				if (!save.isSuccess()) {
-					throw new SecurityException("发送消息失败");
-				}
-			} else {
-				//给角色为派工的人发送消息
-				R<String> clientDeptIds = sysClient.getRoleIds(AuthUtil.getTenantId(), "库管");
-				if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
-					R<List<User>> userList = userClient.listUserByRoleId(clientDeptIds.getData(), AuthUtil.getTenantId(), item.getSalesCompanyId() + "");
-					if (userList.isSuccess() && CollectionUtils.isNotEmpty(userList.getData())) {
-						for (User datum : userList.getData()) {
-							//循环发送消息
-							Message sendMessage = new Message();
-							sendMessage.setParameter(item.getId() + "");
-							sendMessage.setUserName(AuthUtil.getUserName());
-							sendMessage.setUserId(null);
-							sendMessage.setToUserId(datum.getId());
-							sendMessage.setToUserName(datum.getName());
-							sendMessage.setMessageType(1);
-							sendMessage.setTenantId(AuthUtil.getTenantId());
-							sendMessage.setCreateUser(null);
-							sendMessage.setCreateTime(new Date());
+			} else if (2 == type) {
+				sendMessage.setUrl("/tirePartsMall/purchasingManagement/warehouseEntryOrder/index");
+				sendMessage.setPageLabel("采购入库");
+				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
+				sendMessage.setMessageBody("您有新的采购入库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
+			}else if (3 == type) {
+				sendMessage.setUrl("/tirePartsMall/salesService/inStorage/index");
+				sendMessage.setPageLabel("退货入库");
+				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
+				sendMessage.setMessageBody("您有新的退货入库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
+			}else if (4 == type) {
+				sendMessage.setUrl("/tirePartsMall/purchaseService/outStorage/index");
+				sendMessage.setPageLabel("退货出库");
+				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
+				sendMessage.setMessageBody("您有新的退货出库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
+			}
+			R save = messageClient.save(sendMessage);
+			System.out.println("发送结果:" + save);
+			if (!save.isSuccess()) {
+				throw new SecurityException("发送消息失败");
+			}
+		} else {
+			//给角色为派工的人发送消息
+			R<String> clientDeptIds = sysClient.getRoleIds(AuthUtil.getTenantId(), "库管");
+			if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
+				R<List<User>> userList = userClient.listUserByRoleId(clientDeptIds.getData(), AuthUtil.getTenantId(), item.getSalesCompanyId() + "");
+				if (userList.isSuccess() && CollectionUtils.isNotEmpty(userList.getData())) {
+					for (User datum : userList.getData()) {
+						//循环发送消息
+						Message sendMessage = new Message();
+						sendMessage.setParameter(item.getId() + "");
+						sendMessage.setUserName(AuthUtil.getUserName());
+						sendMessage.setUserId(null);
+						sendMessage.setToUserId(datum.getId());
+						sendMessage.setToUserName(datum.getName());
+						sendMessage.setMessageType(1);
+						sendMessage.setTenantId(AuthUtil.getTenantId());
+						sendMessage.setCreateUser(null);
+						sendMessage.setCreateTime(new Date());
+						if (1 == type) {
 							sendMessage.setUrl("/tirePartsMall/salesManagement/outboundWorkOrder/index");
 							sendMessage.setPageLabel("出库工单");
 							sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
 							sendMessage.setMessageBody("您有新的出库工单请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-							R save = messageClient.save(sendMessage);
-							System.out.println("发送结果:" + save);
-							if (!save.isSuccess()) {
-								throw new SecurityException("发送消息失败");
-							}
+						} else if (2 == type) {
+							sendMessage.setUrl("/tirePartsMall/purchasingManagement/warehouseEntryOrder/index");
+							sendMessage.setPageLabel("采购入库");
+							sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
+							sendMessage.setMessageBody("您有新的采购入库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
+						}else if (3 == type) {
+							sendMessage.setUrl("/tirePartsMall/salesService/inStorage/index");
+							sendMessage.setPageLabel("退货入库");
+							sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
+							sendMessage.setMessageBody("您有新的退货入库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
+						}else if (4 == type) {
+							sendMessage.setUrl("/tirePartsMall/purchaseService/outStorage/index");
+							sendMessage.setPageLabel("退货出库");
+							sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
+							sendMessage.setMessageBody("您有新的退货出库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
+						}
+						R save = messageClient.save(sendMessage);
+						System.out.println("发送结果:" + save);
+						if (!save.isSuccess()) {
+							throw new SecurityException("发送消息失败");
 						}
 					}
 				}
 			}
-			//给角色为财务的人发送消息
+		}
+		//给角色为财务的人发送消息
+		if (1 == type) {
 			R<String> clientDeptIds = sysClient.getRoleIds(AuthUtil.getTenantId(), "客服");
 			StringBuilder openIds = new StringBuilder();
 			if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
@@ -472,10 +533,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				}
 			}
 		}
-		this.saveOrUpdateBatch(rwShipList);
-		shipItemsService.saveOrUpdateBatch(shipItemsList);
-
-		return R.success("操作成功");
 	}
 
 	@Override
@@ -958,62 +1015,24 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 
 			//生成入库工单历史记录
 			saveHistory(item.getId(), OrderTypeEnum.TREATWAREHOUSING.getType());
-
-			LocalDateTime now = LocalDateTime.now();
-			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-			String formatted = now.format(formatter);
-			//给角色为派工的人发送消息
-			if (ObjectUtils.isNotNull(rwShip.getStockClerkId())) {
-				Message sendMessage = new Message();
-				sendMessage.setParameter(item.getId() + "");
-				sendMessage.setUserName(AuthUtil.getUserName());
-				sendMessage.setUserId(null);
-				sendMessage.setToUserId(rwShip.getStockClerkId());
-				sendMessage.setToUserName(rwShip.getStockClerkName());
-				sendMessage.setMessageType(1);
-				sendMessage.setTenantId(AuthUtil.getTenantId());
-				sendMessage.setCreateUser(null);
-				sendMessage.setCreateTime(new Date());
-				sendMessage.setUrl("/tirePartsMall/purchasingManagement/warehouseEntryOrder/index");
-				sendMessage.setPageLabel("采购入库");
-				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-				sendMessage.setMessageBody("您有新的采购入库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-				R save = messageClient.save(sendMessage);
-				System.out.println("发送结果:" + save);
-				if (!save.isSuccess()) {
-					throw new SecurityException("发送消息失败");
+			// 创建线程池
+			ExecutorService executor = Executors.newSingleThreadExecutor();
+			// 启动任务并提交给线程池
+			executor.submit(() -> {
+				try {
+					this.sendMessage(rwShip, item, null, 2);
+				} catch (Exception e) {
+					System.out.println("业务处理成功,发送消息异常,时间:" + new Date());
+					System.out.println(e.getMessage());
+					// 关闭线程池
+					executor.shutdown();
+				} finally {
+					// 关闭线程池
+					executor.shutdown();
 				}
-			} else {
-				//给角色为派工的人发送消息
-				R<String> clientDeptIds = sysClient.getRoleIds(AuthUtil.getTenantId(), "库管");
-				if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
-					R<List<User>> userList = userClient.listUserByRoleId(clientDeptIds.getData(), AuthUtil.getTenantId(), item.getSalesCompanyId() + "");
-					if (userList.isSuccess() && CollectionUtils.isNotEmpty(userList.getData())) {
-						for (User datum : userList.getData()) {
-							//循环发送消息
-							Message sendMessage = new Message();
-							sendMessage.setParameter(item.getId() + "");
-							sendMessage.setUserName(AuthUtil.getUserName());
-							sendMessage.setUserId(null);
-							sendMessage.setToUserId(datum.getId());
-							sendMessage.setToUserName(datum.getName());
-							sendMessage.setMessageType(1);
-							sendMessage.setTenantId(AuthUtil.getTenantId());
-							sendMessage.setCreateUser(null);
-							sendMessage.setCreateTime(new Date());
-							sendMessage.setUrl("/tirePartsMall/purchasingManagement/warehouseEntryOrder/index");
-							sendMessage.setPageLabel("采购入库");
-							sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-							sendMessage.setMessageBody("您有新的采购入库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-							R save = messageClient.save(sendMessage);
-							System.out.println("发送结果:" + save);
-							if (!save.isSuccess()) {
-								throw new SecurityException("发送消息失败");
-							}
-						}
-					}
-				}
-			}
+			});
+			// 关闭线程池
+			executor.shutdown();
 		}
 		this.saveOrUpdateBatch(rwShipList);
 		shipItemsService.saveOrUpdateBatch(shipItemsList);
@@ -1293,7 +1312,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	@Override
 	@Transactional(rollbackFor = Exception.class)
 	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
-	public R<List<PjOrderItems>> importItem(List<ShipItemImportExcel> excelList) {
+	public R importItem(List<ShipItemImportExcel> excelList) {
 		if (CollectionUtils.isEmpty(excelList)) {
 			throw new SecurityException("导入数据不能为空");
 		}
@@ -1311,13 +1330,16 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		List<PjGoodsDesc> goodsDescList = goodsDescMapper.selectList(lambdaQueryWrapper);
 		StringBuilder text = new StringBuilder();
 		for (int i = 0; i < excelList.size(); i++) {
+			int count = 0;
 			//判断必填项是否为空
 			ShipItemImportExcel itemExcel = excelList.get(i);
 			if (ObjectUtil.isEmpty(itemExcel.getGoodsName())) {
 				text.append("第").append(i + 2).append("行,商品名称为空").append("\n");
+				count = 1;
 			}
 			if (ObjectUtil.isEmpty(itemExcel.getGoodsNum())) {
 				text.append("第").append(i + 2).append("行,数量为空").append("\n");
+				count = 1;
 			}
 			PjOrderItems item = new PjOrderItems();
 			BeanUtil.copy(itemExcel, item);
@@ -1339,19 +1361,22 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				} else {//已开启批次号管理
 					if (ObjectUtil.isEmpty(itemExcel.getDot())) {
 						text.append("第").append(i + 2).append("行,商品已开启管理批次号,请填写批次号").append("\n");
+						count = 1;
 					}
 				}
 				item.setUnits(goodsDesc.getUnit());
 				item.setSendNum(new BigDecimal("0"));
+				if (count == 0){
+					list.add(item);
+				}
 			} 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());
+			return R.data("导入失败:"+text);
 		}
 	}
 
@@ -1958,7 +1983,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	}
 
 	@Override
-	public R<List<PjOrderItems>> importItemCode(List<ShipItemImportCodeExcel> excelList) {
+	public R importItemCode(List<ShipItemImportCodeExcel> excelList) {
 		if (CollectionUtils.isEmpty(excelList)) {
 			throw new SecurityException("导入数据不能为空");
 		}
@@ -1976,13 +2001,16 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		List<PjGoodsDesc> goodsDescList = goodsDescMapper.selectList(lambdaQueryWrapper);
 		StringBuilder text = new StringBuilder();
 		for (int i = 0; i < excelList.size(); i++) {
+			int count = 0;
 			//判断必填项是否为空
 			ShipItemImportCodeExcel itemExcel = excelList.get(i);
 			if (ObjectUtil.isEmpty(itemExcel.getPrice())) {
 				text.append("第").append(i + 2).append("行,价格为空").append("\n");
+				count = 1;
 			}
 			if (ObjectUtil.isEmpty(itemExcel.getGoodsNum())) {
 				text.append("第").append(i + 2).append("行,数量为空").append("\n");
+				count = 1;
 			}
 			PjOrderItems item = new PjOrderItems();
 			BeanUtil.copy(itemExcel, item);
@@ -2004,19 +2032,22 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				} else {//已开启批次号管理
 					if (ObjectUtil.isEmpty(itemExcel.getDot())) {
 						text.append("第").append(i + 2).append("行,商品已开启管理批次号,请填写批次号").append("\n");
+						count = 1;
 					}
 				}
 				item.setUnits(goodsDesc.getUnit());
 				item.setSendNum(new BigDecimal("0"));
+				if (count == 0){
+					list.add(item);
+				}
 			} 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());
+			return R.data("导入失败:"+text);
 		}
 	}
 
@@ -2123,61 +2154,24 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			//生成出库工单历史记录
 			saveHistory(item.getId(), OrderTypeEnum.TREATWAREHOUSING.getType());
 
-			LocalDateTime now = LocalDateTime.now();
-			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-			String formatted = now.format(formatter);
-			//给角色为派工的人发送消息
-			if (ObjectUtils.isNotNull(rwShip.getStockClerkId())) {
-				Message sendMessage = new Message();
-				sendMessage.setParameter(item.getId() + "");
-				sendMessage.setUserName(AuthUtil.getUserName());
-				sendMessage.setUserId(null);
-				sendMessage.setToUserId(rwShip.getStockClerkId());
-				sendMessage.setToUserName(rwShip.getStockClerkName());
-				sendMessage.setMessageType(1);
-				sendMessage.setTenantId(AuthUtil.getTenantId());
-				sendMessage.setCreateUser(null);
-				sendMessage.setCreateTime(new Date());
-				sendMessage.setUrl("/tirePartsMall/salesManagement/outboundWorkOrder/index");
-				sendMessage.setPageLabel("出库工单");
-				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-				sendMessage.setMessageBody("您有新的出库工单请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-				R save = messageClient.save(sendMessage);
-				System.out.println("发送结果:" + save);
-				if (!save.isSuccess()) {
-					throw new SecurityException("发送消息失败");
+			// 创建线程池
+			ExecutorService executor = Executors.newSingleThreadExecutor();
+			// 启动任务并提交给线程池
+			executor.submit(() -> {
+				try {
+					this.sendMessage(rwShip, item, goodsNames, 3);
+				} catch (Exception e) {
+					System.out.println("业务处理成功,发送消息异常,时间:" + new Date());
+					System.out.println(e.getMessage());
+					// 关闭线程池
+					executor.shutdown();
+				} finally {
+					// 关闭线程池
+					executor.shutdown();
 				}
-			} else {
-				//给角色为派工的人发送消息
-				R<String> clientDeptIds = sysClient.getRoleIds(AuthUtil.getTenantId(), "库管");
-				if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
-					R<List<User>> userList = userClient.listUserByRoleId(clientDeptIds.getData(), AuthUtil.getTenantId(), item.getSalesCompanyId() + "");
-					if (userList.isSuccess() && CollectionUtils.isNotEmpty(userList.getData())) {
-						for (User datum : userList.getData()) {
-							//循环发送消息
-							Message sendMessage = new Message();
-							sendMessage.setParameter(item.getId() + "");
-							sendMessage.setUserName(AuthUtil.getUserName());
-							sendMessage.setUserId(null);
-							sendMessage.setToUserId(datum.getId());
-							sendMessage.setToUserName(datum.getName());
-							sendMessage.setMessageType(1);
-							sendMessage.setTenantId(AuthUtil.getTenantId());
-							sendMessage.setCreateUser(null);
-							sendMessage.setCreateTime(new Date());
-							sendMessage.setUrl("/tirePartsMall/salesManagement/outboundWorkOrder/index");
-							sendMessage.setPageLabel("出库工单");
-							sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-							sendMessage.setMessageBody("您有新的出库工单请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-							R save = messageClient.save(sendMessage);
-							System.out.println("发送结果:" + save);
-							if (!save.isSuccess()) {
-								throw new SecurityException("发送消息失败");
-							}
-						}
-					}
-				}
-			}
+			});
+			// 关闭线程池
+			executor.shutdown();
 		}
 		this.saveOrUpdateBatch(rwShipList);
 		shipItemsService.saveOrUpdateBatch(shipItemsList);
@@ -2676,61 +2670,24 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			//生成入库工单历史记录
 			saveHistory(item.getId(), OrderTypeEnum.TOBESHIPPEDOUT.getType());
 
-			LocalDateTime now = LocalDateTime.now();
-			DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
-			String formatted = now.format(formatter);
-			//给角色为派工的人发送消息
-			if (ObjectUtils.isNotNull(rwShip.getStockClerkId())) {
-				Message sendMessage = new Message();
-				sendMessage.setParameter(item.getId() + "");
-				sendMessage.setUserName(AuthUtil.getUserName());
-				sendMessage.setUserId(null);
-				sendMessage.setToUserId(rwShip.getStockClerkId());
-				sendMessage.setToUserName(rwShip.getStockClerkName());
-				sendMessage.setMessageType(1);
-				sendMessage.setTenantId(AuthUtil.getTenantId());
-				sendMessage.setCreateUser(null);
-				sendMessage.setCreateTime(new Date());
-				sendMessage.setUrl("/tirePartsMall/purchasingManagement/warehouseEntryOrder/index");
-				sendMessage.setPageLabel("采购入库");
-				sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-				sendMessage.setMessageBody("您有新的采购入库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-				R save = messageClient.save(sendMessage);
-				System.out.println("发送结果:" + save);
-				if (!save.isSuccess()) {
-					throw new SecurityException("发送消息失败");
+			// 创建线程池
+			ExecutorService executor = Executors.newSingleThreadExecutor();
+			// 启动任务并提交给线程池
+			executor.submit(() -> {
+				try {
+					this.sendMessage(rwShip, item, null, 4);
+				} catch (Exception e) {
+					System.out.println("业务处理成功,发送消息异常,时间:" + new Date());
+					System.out.println(e.getMessage());
+					// 关闭线程池
+					executor.shutdown();
+				} finally {
+					// 关闭线程池
+					executor.shutdown();
 				}
-			} else {
-				//给角色为派工的人发送消息
-				R<String> clientDeptIds = sysClient.getRoleIds(AuthUtil.getTenantId(), "库管");
-				if (clientDeptIds.isSuccess() && StringUtils.isNotBlank(clientDeptIds.getData())) {
-					R<List<User>> userList = userClient.listUserByRoleId(clientDeptIds.getData(), AuthUtil.getTenantId(), item.getSalesCompanyId() + "");
-					if (userList.isSuccess() && CollectionUtils.isNotEmpty(userList.getData())) {
-						for (User datum : userList.getData()) {
-							//循环发送消息
-							Message sendMessage = new Message();
-							sendMessage.setParameter(item.getId() + "");
-							sendMessage.setUserName(AuthUtil.getUserName());
-							sendMessage.setUserId(null);
-							sendMessage.setToUserId(datum.getId());
-							sendMessage.setToUserName(datum.getName());
-							sendMessage.setMessageType(1);
-							sendMessage.setTenantId(AuthUtil.getTenantId());
-							sendMessage.setCreateUser(null);
-							sendMessage.setCreateTime(new Date());
-							sendMessage.setUrl("/tirePartsMall/purchasingManagement/warehouseEntryOrder/index");
-							sendMessage.setPageLabel("采购入库");
-							sendMessage.setPageStatus("this.$store.getters.domSaleStatus");
-							sendMessage.setMessageBody("您有新的采购入库请及时处理!单号:" + item.getBillno() + "时间:" + formatted);
-							R save = messageClient.save(sendMessage);
-							System.out.println("发送结果:" + save);
-							if (!save.isSuccess()) {
-								throw new SecurityException("发送消息失败");
-							}
-						}
-					}
-				}
-			}
+			});
+			// 关闭线程池
+			executor.shutdown();
 		}
 		this.saveOrUpdateBatch(rwShipList);
 		shipItemsService.saveOrUpdateBatch(shipItemsList);

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

@@ -807,9 +807,19 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						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 -> finalOrdersCorpS.contains(e.getPid()) &&
-								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> finalOrdersCorpS.contains(e.getPid()))
 							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						List<PjOrderItems> orderItemsList = pjOrderItemsList.stream().filter(e -> finalOrdersCorpS.contains(e.getPid()) &&
+								(ObjectUtils.isNotNull(e.getReturnsNumber()) && new BigDecimal("0").compareTo(e.getReturnsNumber()) != 0))
+							.collect(Collectors.toList());
+						BigDecimal returnCostprie = new BigDecimal("0.00");
+						for (PjOrderItems items : orderItemsList) {
+							if (ObjectUtils.isNotNull(items.getCostprie())) {
+								BigDecimal price = items.getCostprie().divide(items.getGoodsNum(), MathContext.DECIMAL32);
+								returnCostprie = returnCostprie.add(items.getCostprie().subtract(items.getReturnsNumber().multiply(price)));
+							}
+						}
+						costprie = costprie.subtract(returnCostprie);
 						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
 					}
 				} else {
@@ -848,9 +858,19 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						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 -> finalOrdersSalerS.contains(e.getPid()) &&
-								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> finalOrdersSalerS.contains(e.getPid()))
 							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						List<PjOrderItems> orderItemsList = pjOrderItemsList.stream().filter(e -> finalOrdersSalerS.contains(e.getPid()) &&
+								(ObjectUtils.isNotNull(e.getReturnsNumber()) && new BigDecimal("0").compareTo(e.getReturnsNumber()) != 0))
+							.collect(Collectors.toList());
+						BigDecimal returnCostprie = new BigDecimal("0.00");
+						for (PjOrderItems items : orderItemsList) {
+							if (ObjectUtils.isNotNull(items.getCostprie())) {
+								BigDecimal price = items.getCostprie().divide(items.getGoodsNum(), MathContext.DECIMAL32);
+								returnCostprie = returnCostprie.add(items.getCostprie().subtract(items.getReturnsNumber().multiply(price)));
+							}
+						}
+						costprie = costprie.subtract(returnCostprie);
 						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
 					}
 				}
@@ -946,9 +966,19 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						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 -> finalOrdersCorpS.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).setScale(0, RoundingMode.HALF_UP);
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> finalOrdersCorpS.contains(e.getPid()))
+							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						List<PjOrderItems> orderItemsList = pjOrderItemsList.stream().filter(e -> finalOrdersCorpS.contains(e.getPid()) &&
+								(ObjectUtils.isNotNull(e.getReturnsNumber()) && new BigDecimal("0").compareTo(e.getReturnsNumber()) != 0))
+							.collect(Collectors.toList());
+						BigDecimal returnCostprie = new BigDecimal("0.00");
+						for (PjOrderItems items : orderItemsList) {
+							if (ObjectUtils.isNotNull(items.getCostprie())) {
+								BigDecimal price = items.getCostprie().divide(items.getGoodsNum(), MathContext.DECIMAL32);
+								returnCostprie = returnCostprie.add(items.getCostprie().subtract(items.getReturnsNumber().multiply(price)));
+							}
+						}
+						costprie = costprie.subtract(returnCostprie);
 						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
 					}
 				} else {
@@ -987,9 +1017,19 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						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 -> finalOrdersSalerS.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).setScale(0, RoundingMode.HALF_UP);
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> finalOrdersSalerS.contains(e.getPid()))
+							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						List<PjOrderItems> orderItemsList = pjOrderItemsList.stream().filter(e -> finalOrdersSalerS.contains(e.getPid()) &&
+								(ObjectUtils.isNotNull(e.getReturnsNumber()) && new BigDecimal("0").compareTo(e.getReturnsNumber()) != 0))
+							.collect(Collectors.toList());
+						BigDecimal returnCostprie = new BigDecimal("0.00");
+						for (PjOrderItems items : orderItemsList) {
+							if (ObjectUtils.isNotNull(items.getCostprie())) {
+								BigDecimal price = items.getCostprie().divide(items.getGoodsNum(), MathContext.DECIMAL32);
+								returnCostprie = returnCostprie.add(items.getCostprie().subtract(items.getReturnsNumber().multiply(price)));
+							}
+						}
+						costprie = costprie.subtract(returnCostprie);
 						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
 					}
 				}
@@ -1087,9 +1127,19 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						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 -> finalOrdersCorpS.contains(e.getPid()) &&
-								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> finalOrdersCorpS.contains(e.getPid()))
 							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						List<PjOrderItems> orderItemsList = pjOrderItemsList.stream().filter(e -> finalOrdersCorpS.contains(e.getPid()) &&
+								(ObjectUtils.isNotNull(e.getReturnsNumber()) && new BigDecimal("0").compareTo(e.getReturnsNumber()) != 0))
+							.collect(Collectors.toList());
+						BigDecimal returnCostprie = new BigDecimal("0.00");
+						for (PjOrderItems items : orderItemsList) {
+							if (ObjectUtils.isNotNull(items.getCostprie())) {
+								BigDecimal price = items.getCostprie().divide(items.getGoodsNum(), MathContext.DECIMAL32);
+								returnCostprie = returnCostprie.add(items.getCostprie().subtract(items.getReturnsNumber().multiply(price)));
+							}
+						}
+						costprie = costprie.subtract(returnCostprie);
 						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
 					}
 				} else {
@@ -1128,9 +1178,19 @@ public class StatisticsServiceImpl implements IStatisticsService {
 						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 -> finalOrdersSalerS.contains(e.getPid()) &&
-								(ObjectUtils.isNull(e.getReturnsNumber()) || new BigDecimal("0").compareTo(e.getReturnsNumber()) == 0))
+						BigDecimal costprie = pjOrderItemsList.stream().filter(e -> finalOrdersSalerS.contains(e.getPid()))
 							.map(PjOrderItems::getCostprie).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+						List<PjOrderItems> orderItemsList = pjOrderItemsList.stream().filter(e -> finalOrdersSalerS.contains(e.getPid()) &&
+								(ObjectUtils.isNotNull(e.getReturnsNumber()) && new BigDecimal("0").compareTo(e.getReturnsNumber()) != 0))
+							.collect(Collectors.toList());
+						BigDecimal returnCostprie = new BigDecimal("0.00");
+						for (PjOrderItems items : orderItemsList) {
+							if (ObjectUtils.isNotNull(items.getCostprie())) {
+								BigDecimal price = items.getCostprie().divide(items.getGoodsNum(), MathContext.DECIMAL32);
+								returnCostprie = returnCostprie.add(items.getCostprie().subtract(items.getReturnsNumber().multiply(price)));
+							}
+						}
+						costprie = costprie.subtract(returnCostprie);
 						item.setSalesProfit(item.getSalesAmount().subtract(costprie));
 					}
 				}

+ 1 - 2
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/stock/controller/StockDescController.java

@@ -546,8 +546,7 @@ public class StockDescController extends BladeController {
 			.eq(PjStockDesc::getSalesCompanyId, AuthUtil.getDeptId())//公司
 			.eq(ObjectUtils.isNotNull(stockDesc.getStorageId()), PjStockDesc::getStorageId, stockDesc.getStorageId())
 			.eq(PjStockDesc::getGoodsId, stockDesc.getGoodsId())
-			/*.ne(PjStockDesc::getDot, "")
-			.isNotNull(PjStockDesc::getDot)*/;
+			.eq(ObjectUtils.isNotNull(stockDesc.getDot()),PjStockDesc::getDot, stockDesc.getDot());
 
 		List<PjStockDesc> list = stockDescService.list(lambdaQueryWrapper);
 		return R.data(list);

+ 12 - 0
blade-service/blade-sales-part/src/main/resources/application-dev.yml

@@ -7,3 +7,15 @@ spring:
     url: ${blade.datasource.dev.url}
     username: ${blade.datasource.dev.username}
     password: ${blade.datasource.dev.password}
+
+xxl:
+  job:
+    accessToken: ''
+    admin:
+      addresses: http://127.0.0.1:10031/xxl-job-admin
+    executor:
+      appname: blade-sales-part
+      ip: 127.0.0.1
+      logpath: applogs/xxl-job/jobhandler
+      logretentiondays: -1
+      port: 10033

+ 1 - 1
blade-service/blade-system/src/main/java/org/springblade/system/service/impl/DeptServiceImpl.java

@@ -252,7 +252,7 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements ID
 			.eq(Dept::getParentId, 0)
 			.eq(Dept::getTenantId, AuthUtil.getTenantId())
 			.eq(Dept::getIsDeleted, 0)
-			.apply("find_in_set(full_name,'" + deptName + "')")
+			.apply(ObjectUtils.isNotNull(deptName), "find_in_set(full_name,'" + deptName + "')")
 		);
 		return R.data(dept);
 	}

+ 1 - 1
blade-service/blade-user/src/main/java/org/springblade/system/user/service/impl/UserSearchServiceImpl.java

@@ -65,7 +65,7 @@ public class UserSearchServiceImpl extends BaseServiceImpl<UserMapper, User> imp
 	@Override
 	public List<User> listByRole(List<Long> roleId) {
 		LambdaQueryWrapper<User> queryWrapper = Wrappers.lambdaQuery();
-		String status = sysClient.getParamService("mall.data");
+		String status = sysClient.getParamServiceNew("mall.data");
 		if (ObjectUtils.isNotNull(status) && "1".equals(status)) {
 			queryWrapper.apply("find_in_set(dept_id,'" + AuthUtil.getDeptId() + "')");
 		}

Some files were not shown because too many files changed in this diff