Browse Source

2024年5月11日17:49:38

纪新园 1 year ago
parent
commit
90358a1b40
15 changed files with 651 additions and 158 deletions
  1. 13 1
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjSettlementItems.java
  2. 175 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelReturnsCG.java
  3. 175 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/excel/PjOrderExportExcelReturnsXS.java
  4. 1 1
      blade-service/blade-data/src/main/java/org/springblade/data/michelinApi/Utils/HttpsUtils.java
  5. 1 0
      blade-service/blade-data/src/main/java/org/springblade/data/michelinApi/Utils/MichelinValues.java
  6. 2 2
      blade-service/blade-data/src/main/java/org/springblade/data/michelinApi/service/impl/MichelinServiceImpl.java
  7. 1 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/check/controller/AuditProecessController.java
  8. 18 5
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java
  9. 28 16
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/ReturnsController.java
  10. 30 6
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java
  11. 52 40
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/settlement/service/impl/SettlementServiceImpl.java
  12. 93 38
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java
  13. 24 11
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java
  14. 1 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/stock/mapper/StockDescMapper.xml
  15. 37 37
      blade-service/blade-sales-part/src/main/resources/log/logback-dev.xml

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

@@ -16,7 +16,6 @@
  */
 package org.springblade.salesPart.entity;
 
-import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -149,4 +148,17 @@ public class PjSettlementItems implements Serializable {
 	@ApiModelProperty(value = "业务日期")
 	private Date businesDate;
 
+	/**
+	 * 本次退款金额
+	 */
+	@ApiModelProperty(value = "本次退款金额")
+	private BigDecimal thisRefundAmount;
+
+	/**
+	 * 业务类型
+	 */
+	@ApiModelProperty(value = "业务类型")
+	private String businesType;
+
+
 }

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

@@ -0,0 +1,175 @@
+/*
+ *      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.salesPart.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+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.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 配件销售采购表实体类
+ *
+ * @author BladeX
+ * @since 2023-04-21
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class PjOrderExportExcelReturnsCG implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 业务单号
+	 */
+	@ExcelProperty(value = "业务单号")
+	private String ordNo;
+	/**
+	 * 订单编号
+	 */
+	@ExcelProperty(value = "采购单号")
+	private String srcNo;
+
+	/**
+	 * 业务来源
+	 */
+	@ExcelProperty(value = "业务来源")
+	private String businessSource;
+
+	/**
+	 * 所属公司名称
+	 */
+	@ExcelProperty(value = "所属公司")
+	private String salesCompanyName;
+
+	/**
+	 * 客户名称
+	 */
+	@ExcelProperty(value = "业务对象")
+	private String customerName;
+
+	/**
+	 * 业务员名称
+	 */
+	@ExcelProperty(value = "业务员")
+	private String salerName;
+
+	/**
+	 * 发货仓库名称
+	 */
+	@ExcelProperty(value = "仓库")
+	private String storageName;
+
+	/**
+	 * 行数
+	 */
+	@ExcelProperty(value = "行数")
+	private Integer numberRows;
+	/**
+	 * 退货数量
+	 */
+	@ExcelProperty(value = "采购退货数量")
+	private BigDecimal returnsNumber;
+
+	/**
+	 * 退货金额
+	 */
+	@ExcelProperty(value = "采购退货金额")
+	private BigDecimal returnsAmount;
+	/**
+	 * 总利润
+	 */
+	@ExcelProperty(value = "采购退货利润")
+	private BigDecimal totalProfit;
+	/**
+	 * 运费
+	 */
+	@ExcelProperty(value = "采购退货运费")
+	private BigDecimal freight;
+
+	/**
+	 * 成本
+	 */
+	@ExcelProperty(value = "采购退货成本")
+	private BigDecimal cost;
+	/**
+	 * 毛利
+	 */
+	@ExcelProperty(value = "采购退货毛利")
+	private BigDecimal grossProfit;
+
+	/**
+	 * 订单状态
+	 */
+	@ExcelProperty(value = "状态")
+	private String status;
+
+	/**
+	 * 实际支付状态
+	 */
+	@ApiModelProperty(value = "支付状态")
+	private String paymentStatus;
+
+	@ExcelIgnore
+	private Integer actualPaymentStatus;
+	/**
+	 * 业务日期
+	 */
+	@ExcelProperty(value = "业务日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date businesDate;
+
+	/**
+	 * 创建人名称
+	 */
+	@ExcelProperty(value = "制单人")
+	private String createUserName;
+	/**
+	 * 创建时间
+	 */
+	@ExcelProperty(value = "制单日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+
+	/**
+	 * 修改人名称
+	 */
+	@ExcelProperty(value = "更新人")
+	private String updateUserName;
+
+	/**
+	 * 修改时间
+	 */
+	@ExcelProperty(value = "更新日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+
+}

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

@@ -0,0 +1,175 @@
+/*
+ *      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.salesPart.excel;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+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.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 配件销售采购表实体类
+ *
+ * @author BladeX
+ * @since 2023-04-21
+ */
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class PjOrderExportExcelReturnsXS implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * 业务单号
+	 */
+	@ExcelProperty(value = "业务单号")
+	private String ordNo;
+	/**
+	 * 订单编号
+	 */
+	@ExcelProperty(value = "销售单号")
+	private String srcNo;
+
+	/**
+	 * 业务来源
+	 */
+	@ExcelProperty(value = "业务来源")
+	private String businessSource;
+
+	/**
+	 * 所属公司名称
+	 */
+	@ExcelProperty(value = "所属公司")
+	private String salesCompanyName;
+
+	/**
+	 * 客户名称
+	 */
+	@ExcelProperty(value = "业务对象")
+	private String customerName;
+
+	/**
+	 * 业务员名称
+	 */
+	@ExcelProperty(value = "业务员")
+	private String salerName;
+
+	/**
+	 * 发货仓库名称
+	 */
+	@ExcelProperty(value = "仓库")
+	private String storageName;
+
+	/**
+	 * 行数
+	 */
+	@ExcelProperty(value = "行数")
+	private Integer numberRows;
+	/**
+	 * 退货数量
+	 */
+	@ExcelProperty(value = "销售退货数量")
+	private BigDecimal returnsNumber;
+
+	/**
+	 * 退货金额
+	 */
+	@ExcelProperty(value = "销售退货金额")
+	private BigDecimal returnsAmount;
+	/**
+	 * 总利润
+	 */
+	@ExcelProperty(value = "销售退货利润")
+	private BigDecimal totalProfit;
+	/**
+	 * 运费
+	 */
+	@ExcelProperty(value = "销售退货运费")
+	private BigDecimal freight;
+
+	/**
+	 * 成本
+	 */
+	@ExcelProperty(value = "销售退货成本")
+	private BigDecimal cost;
+	/**
+	 * 毛利
+	 */
+	@ExcelProperty(value = "销售退货毛利")
+	private BigDecimal grossProfit;
+
+	/**
+	 * 订单状态
+	 */
+	@ExcelProperty(value = "状态")
+	private String status;
+
+	/**
+	 * 实际支付状态
+	 */
+	@ApiModelProperty(value = "支付状态")
+	private String paymentStatus;
+
+	@ExcelIgnore
+	private Integer actualPaymentStatus;
+	/**
+	 * 业务日期
+	 */
+	@ExcelProperty(value = "业务日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	private Date businesDate;
+
+	/**
+	 * 创建人名称
+	 */
+	@ExcelProperty(value = "制单人")
+	private String createUserName;
+	/**
+	 * 创建时间
+	 */
+	@ExcelProperty(value = "制单日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date createTime;
+
+	/**
+	 * 修改人名称
+	 */
+	@ExcelProperty(value = "更新人")
+	private String updateUserName;
+
+	/**
+	 * 修改时间
+	 */
+	@ExcelProperty(value = "更新日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	private Date updateTime;
+
+}

+ 1 - 1
blade-service/blade-data/src/main/java/org/springblade/data/michelinApi/Utils/HttpsUtils.java

@@ -68,7 +68,7 @@ public class HttpsUtils {
 		connection.setUseCaches(false);
 		// 添加自定义的Header信息
 		connection.addRequestProperty("Content-type", MichelinValues.CONTENT_TYPE);
-		connection.addRequestProperty("Ocp-Apim-Subscription-Key", "03732707a76b48168e628e2abdb5529e");
+		connection.addRequestProperty("Ocp-Apim-Subscription-Key", "4596b9c19aa444429c438bba84aa8a6b");
 		//必须设置false,否则会自动redirect到重定向后的地址
 		connection.setInstanceFollowRedirects(false);
 		connection.connect();// 连接会话

+ 1 - 0
blade-service/blade-data/src/main/java/org/springblade/data/michelinApi/Utils/MichelinValues.java

@@ -8,6 +8,7 @@ public class MichelinValues {
 
 	public static final String BASE_URL = "https://host:port/AgentAPIs";
 	public static final String BASE_URL_TEXT = "https://apimint-uat.michelin.com.cn/AgentAPIs";
+	public static final String BASE_URL_DEV = "https://apim.michelin.com.cn/AgentAPIs";
 	public static final String CONTENT_TYPE = "application/json";
 	public static final String OK = "200";
 	public static final String BAD_REQUEST = "400";

+ 2 - 2
blade-service/blade-data/src/main/java/org/springblade/data/michelinApi/service/impl/MichelinServiceImpl.java

@@ -37,7 +37,7 @@ public class MichelinServiceImpl implements IMichelinService {
 	@Override
 	public R<String> getSalesOrder(String agentId) throws Exception {
 		System.out.println("==========================请求成功==============第" + count + "次");
-		String geturl = MichelinValues.BASE_URL_TEXT + "/GetSalesOrder";
+		String geturl = MichelinValues.BASE_URL_DEV + "/GetSalesOrder";
 		//设置请求体
 		Map<String, String> map = new HashMap<>();
 		//key-value的形式设置请求参数
@@ -78,7 +78,7 @@ public class MichelinServiceImpl implements IMichelinService {
 					//key-value的形式设置请求参数
 					map1.put("agentId", agentId);
 					map1.put("msgId", salesOrderR.getMsgId());
-					String geturl1 = MichelinValues.BASE_URL_TEXT + "/AckSalesOrder";
+					String geturl1 = MichelinValues.BASE_URL_DEV + "/AckSalesOrder";
 					if (res) {
 						map1.put("code", "001");
 						map1.put("result", "success");

+ 1 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/check/controller/AuditProecessController.java

@@ -105,7 +105,7 @@ public class AuditProecessController extends BladeController {
 			auditProecessList.forEach(e -> {
 				PjAuditOrderVO auditOrderVO = new PjAuditOrderVO();
 				BeanUtil.copyProperties(e, auditOrderVO);
-				if ("PJTK".equals(e.getCheckType()) || "PJCG".equals(e.getCheckType())) {
+				if ("PJTK".equals(e.getCheckType()) || "PJCG".equals(e.getCheckType()) || "PJCGTK".equals(e.getCheckType())) {
 					if (ObjectUtils.isNotNull(e.getCorpId())) {
 						PjCorpsDesc corpsDesc = ipjCorpClient.getByCorp(e.getCorpId());
 						if (ObjectUtils.isNotNull(corpsDesc)) {

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

@@ -179,6 +179,13 @@ public class OrderController extends BladeController {
 						item.setUpdateUserName(user.getName());
 					}
 				}
+				if (item.getGoodsTotalNum().compareTo(item.getReturnsNumber()) == 0){
+					item.setReturnsStatus("全退");
+				}else if (item.getGoodsTotalNum().compareTo(item.getReturnsNumber()) > 0){
+					item.setReturnsStatus("部分");
+				}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;
@@ -273,7 +280,13 @@ public class OrderController extends BladeController {
 						item.setUpdateUserName(user.getName());
 					}
 				}
-
+				if (item.getGoodsTotalNum().compareTo(item.getReturnsNumber()) == 0){
+					item.setReturnsStatus("全退");
+				}else if (item.getGoodsTotalNum().compareTo(item.getReturnsNumber()) > 0){
+					item.setReturnsStatus("部分");
+				}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) {
@@ -727,14 +740,14 @@ public class OrderController extends BladeController {
 		}
 		if ("d".equals(order.getSettlementType())) {
 //		if ("XS,TKXS".equals(order.getBsType())) {
-			lambdaQueryWrapper.apply("(( bs_type = 'XS' AND FIND_IN_SET( actual_payment_status, '1,3' ) AND generate_task = '已生成')" +
-				" OR ( bs_type = 'TKXS' AND FIND_IN_SET( actual_payment_status, '1,3' ) AND generate_task = '已生成'))");
+			lambdaQueryWrapper.apply("(( bs_type = 'XS' AND FIND_IN_SET( actual_payment_status, '1,3' ) AND generate_task = '已生成' AND total_money != payment_amount_tl)" +
+				" OR ( bs_type = 'TKXS' AND FIND_IN_SET( actual_payment_status, '1,3' ) AND generate_task = '已生成' AND total_money != payment_amount_tl))");
 			/*lambdaQueryWrapper.eq(PjOrder::getGenerateTask, "已生成")
 				.apply("find_in_set(actual_payment_status,'1,3')");*/
 		} else if ("c".equals(order.getSettlementType())) {
 //		} else if ("CG,TKCG".equals(order.getBsType())) {
-			lambdaQueryWrapper.apply("(( bs_type = 'CG' AND FIND_IN_SET( actual_payment_status, '1,3' ) AND generate_task = '审核完成')" +
-				" OR ( bs_type = 'TKCG' AND FIND_IN_SET( actual_payment_status, '1,3' ) AND generate_task = '已生成'))");
+			lambdaQueryWrapper.apply("(( bs_type = 'CG' AND FIND_IN_SET( actual_payment_status, '1,3' ) AND check_status = '审核完成' AND total_money != payment_amount_tl)" +
+				" OR ( bs_type = 'TKCG' AND FIND_IN_SET( actual_payment_status, '1,3' ) AND generate_task = '已生成' AND total_money != payment_amount_tl))");
 			/*lambdaQueryWrapper.eq(PjOrder::getCheckStatus, "审核完成")
 				.apply("find_in_set(actual_payment_status,'1,3')");*/
 		}

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

@@ -21,6 +21,8 @@ import org.springblade.core.tool.utils.ObjectUtil;
 import org.springblade.salesPart.entity.PjOrder;
 import org.springblade.salesPart.entity.PjOrderItems;
 import org.springblade.salesPart.excel.PjOrderExportExcelCG;
+import org.springblade.salesPart.excel.PjOrderExportExcelReturnsCG;
+import org.springblade.salesPart.excel.PjOrderExportExcelReturnsXS;
 import org.springblade.salesPart.excel.PjOrderExportExcelXS;
 import org.springblade.salesPart.order.service.IOrderItemsService;
 import org.springblade.salesPart.order.service.IOrderService;
@@ -180,13 +182,13 @@ public class ReturnsController {
 			.like(ObjectUtils.isNotEmpty(order.getCustomerName()), PjOrder::getCustomerName, order.getCustomerName())
 			.like(ObjectUtils.isNotEmpty(order.getSrcOrdNo()), PjOrder::getSrcOrdNo, order.getSrcOrdNo())//来源单号
 			.like(ObjectUtils.isNotEmpty(order.getOrdNo()), PjOrder::getOrdNo, order.getOrdNo())//来源单号
-			.like(ObjectUtils.isNotEmpty(order.getBusinessSource()), PjOrder::getBusinessSource, order.getBusinessSource())//来源
-			.apply(ObjectUtils.isNotEmpty(order.getStatus()), "find_in_set(status,'" + order.getStatus() + "')");
-		if (order.getDueDateList() != null && order.getDueDateList().size() > 1) {//创建日期
+			.like(ObjectUtils.isNotEmpty(order.getSrcNo()), PjOrder::getSrcNo, order.getSrcNo())
+			.like(ObjectUtils.isNotEmpty(order.getBusinessSource()), PjOrder::getBusinessSource, order.getBusinessSource());
+		if (order.getDueDateList() != null && order.getDueDateList().size() > 1) {//应结日期
 			lambdaQueryWrapper.ge(PjOrder::getDueDate, order.getDueDateList().get(0));
 			lambdaQueryWrapper.le(PjOrder::getDueDate, order.getDueDateList().get(1));
 		}
-		if (order.getBusinesDateList() != null && order.getBusinesDateList().size() > 1) {//创建日期
+		if (order.getBusinesDateList() != null && order.getBusinesDateList().size() > 1) {//业务日期
 			lambdaQueryWrapper.ge(PjOrder::getBusinesDate, order.getBusinesDateList().get(0));
 			lambdaQueryWrapper.le(PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
 		}
@@ -199,6 +201,11 @@ public class ReturnsController {
 		} else {
 			lambdaQueryWrapper.ne(ObjectUtils.isNotEmpty(order.getActualPaymentStatus()), PjOrder::getActualPaymentStatus, order.getActualPaymentStatus());//来源单号
 		}
+		if (ObjectUtils.isNull(order.getNotComplete())) {
+			lambdaQueryWrapper.apply("not find_in_set(status,'已发货,已收货')");
+		} else {
+			lambdaQueryWrapper.apply(ObjectUtils.isNotEmpty(order.getStatus()), "find_in_set(status,'" + order.getStatus() + "')");
+		}
 		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' )))");
@@ -210,26 +217,29 @@ public class ReturnsController {
 				lambdaQueryWrapper.eq(PjOrder::getCreateUser, AuthUtil.getUserId());
 			}
 		}
-		List<PjOrder> pages = orderService.list(lambdaQueryWrapper);
+		List<PjOrder> list = orderService.list( lambdaQueryWrapper);
 
 		StringBuilder updateUserIds = new StringBuilder();//修改人id拼接
 		StringBuilder createUserIds = new StringBuilder();//创建人id拼接
-		for (PjOrder items : pages) {
+		for (PjOrder items : list) {
 			if (ObjectUtil.isNotEmpty(items.getUpdateUser())) {
+
 				updateUserIds.append(items.getUpdateUser()).append(",");
 			}
 			if (ObjectUtil.isNotEmpty(items.getCreateUser())) {
 				createUserIds.append(items.getCreateUser()).append(",");
 			}
 		}
-
 		//获得修改人信息
 		List<User> updateUserList = iUserClient.selectUserIds(updateUserIds.toString());
 		//获得创建人信息
 		List<User> createUserList = iUserClient.selectUserIds(createUserIds.toString());
 
-		if (CollectionUtils.isNotEmpty(pages)) {
-			pages.forEach(item -> {
+		if (CollectionUtils.isNotEmpty(list)) {
+			List<Long> ids = list.stream().map(PjOrder::getId).collect(Collectors.toList());
+			List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>().eq(PjOrderItems::getIsDeleted, 0)
+				.in(PjOrderItems::getPid, ids));
+			list.forEach(item -> {
 				if (ObjectUtil.isNotEmpty(updateUserList)) {
 					User user = updateUserList.stream().anyMatch(e -> e.getId().equals(item.getUpdateUser())) ? updateUserList.stream().filter(e -> e.getId().equals(item.getUpdateUser())).findFirst().get() : null;
 					if (user != null) {
@@ -243,12 +253,14 @@ public class ReturnsController {
 						item.setCreateUserName(user.getName());
 					}
 				}
-				/*item.setItem(orderItemsService.count(new LambdaQueryWrapper<PjOrderItems>().eq(PjOrderItems::getIsDeleted, 0)
-					.eq(PjOrderItems::getPid, item.getId())) + "");*/
+				if (!pjOrderItemsList.isEmpty()) {
+					long count = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count();
+					item.setItem(count + "");
+				}
 			});
 		}
-		List<PjOrderExportExcelXS> list = BeanUtil.copy(pages, PjOrderExportExcelXS.class);
-		for (PjOrderExportExcelXS item : list) {
+		List<PjOrderExportExcelReturnsXS> list1 = BeanUtil.copy(list, PjOrderExportExcelReturnsXS.class);
+		for (PjOrderExportExcelReturnsXS item : list1) {
 			if (1 == item.getActualPaymentStatus()) {
 				item.setPaymentStatus("待付款");
 			} else if (2 == item.getActualPaymentStatus()) {
@@ -261,10 +273,10 @@ public class ReturnsController {
 				item.setPaymentStatus("-");
 			}
 		}
-		if ("XS".equals(order.getBsType())) {
-			ExcelUtil.export(response, "销售订单", "订单数据", list, PjOrderExportExcelXS.class);
+		if ("TKXS".equals(order.getBsType())) {
+			ExcelUtil.export(response, "销售退货单", "销售退货单数据", list1, PjOrderExportExcelReturnsXS.class);
 		} else {
-			ExcelUtil.export(response, "采购订单", "订单数据", BeanUtil.copy(pages, PjOrderExportExcelCG.class), PjOrderExportExcelCG.class);
+			ExcelUtil.export(response, "采购退货单", "采购退货单数据", BeanUtil.copy(list1, PjOrderExportExcelReturnsCG.class), PjOrderExportExcelReturnsCG.class);
 		}
 
 	}

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

@@ -1112,6 +1112,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R submitReturns(PjOrder order) {
 		//客户名称
 		PjCorpsDesc corpsDesc = corpsDescMapper.selectById(order.getCustomerId());
@@ -1227,6 +1229,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 					if (ObjectUtil.isEmpty(goodsDesc)) {
 						throw new RuntimeException("商品数据异常");
 					}
+					goodsName.append(goodsDesc.getCname()).append(",");
+					retrieval.append(goodsDesc.getCnameInt()).append(",");
 					item.setBrandName(goodsDesc.getBrandName());
 					orderItemsService.saveOrUpdate(item);
 				}
@@ -1242,7 +1246,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 				//总退货数量
 				order.setReturnsNumber(order.getOrderItemsList().stream().map(PjOrderItems::getReturnsNumber).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
 				if (order.getGoodsTotalNum().compareTo(new BigDecimal(1)) == 0) {//只有一条轮胎加5元运费
-					order.setTotalMoney(order.getTotalMoney().add(new BigDecimal(5)));
+					order.setTotalMoney(order.getReturnsAmount().add(new BigDecimal(5)));
 					order.setFreight(new BigDecimal(5));
 				}
 			} else {
@@ -1278,11 +1282,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			}
 			// 保存订单明细
 			if (CollectionUtils.isNotEmpty(order.getOrderItemsList())) {
+				StringBuilder goodsName = new StringBuilder();
+				StringBuilder retrieval = new StringBuilder();
 				order.getOrderItemsList().forEach(item -> {
 					item.setBizType(order.getBsType());
 					item.setBillNo(order.getOrdNo());
 					//计算小计
 					item.setReturnsAmount(item.getReturnsNumber().multiply(item.getPrice()));
+					if (ObjectUtils.isNull(item.getInventory())){
+						item.setInventory(item.getGoodsNum());
+					}
 					if (item.getId() == null) {
 						item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 						item.setCreateTime(new Date());
@@ -1296,7 +1305,21 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 						item.setPid(order.getId());
 						orderItemsService.updateById(item);
 					}
+					//获得商品
+					PjGoodsDesc goodsDesc = goodsDescMapper.selectById(item.getGoodsId());
+					if (ObjectUtil.isEmpty(goodsDesc)) {
+						throw new RuntimeException("商品数据异常");
+					}
+					goodsName.append(goodsDesc.getCname()).append(",");
+					retrieval.append(goodsDesc.getCnameInt()).append(",");
+					item.setBrandName(goodsDesc.getBrandName());
 				});
+				if (goodsName.length() > 0) {
+					order.setGoodsNameJoin(goodsName.substring(0, goodsName.length() - 1));
+				}
+				if (retrieval.length() > 0) {
+					order.setShortcutJoin(retrieval.substring(0, retrieval.length() - 1));
+				}
 				order.setNumberRows(order.getOrderItemsList().size());//行数
 				//总退货金额
 				order.setReturnsAmount(order.getOrderItemsList().stream().map(PjOrderItems::getReturnsAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
@@ -1821,8 +1844,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 				throw new SecurityException("开启审批失败:未查询到审批信息");
 			}
 
-			auditProecessDTO.setOrderQuantity(declare.getGoodsTotalNum());
-			auditProecessDTO.setAmount(declare.getTotalMoney());
+			auditProecessDTO.setOrderQuantity(declare.getReturnsNumber());
+			auditProecessDTO.setAmount(declare.getReturnsAmount());
 			// 绑定审核类型
 			auditProecessDTO.setCheckType("PJTK");//代理订单
 			// 追加跳转路由url
@@ -1938,9 +1961,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			if (CollectionUtils.isEmpty(auditPathsLevels)) {
 				throw new SecurityException("开启审批失败:未查询到审批信息");
 			}
-
-			auditProecessDTO.setOrderQuantity(declare.getGoodsTotalNum());
-			auditProecessDTO.setAmount(declare.getTotalMoney());
 			// 绑定审核类型
 			auditProecessDTO.setCheckType("PJCGTK");//代理订单
 			// 追加跳转路由url
@@ -1961,6 +1981,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			auditProecessDTO.setCorpId(declare.getCustomerId());
 			auditProecessDTO.setSalesCompanyId(Long.parseLong(AuthUtil.getDeptId()));
 			auditProecessDTO.setSalesCompanyName(declare.getSalesCompanyName());
+			auditProecessDTO.setOrderQuantity(declare.getReturnsNumber());
+			auditProecessDTO.setAmount(declare.getReturnsAmount());
 			R financeProcess = auditProecessService.createFinanceProcess(auditProecessDTO);
 			if (!financeProcess.isSuccess()) {
 				throw new SecurityException("操作失败,请联系管理员");
@@ -2010,6 +2032,8 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R generateReturns(PjOrder order) {
 		PjOrder details = new PjOrder();
 		PjOrder detail = baseMapper.selectById(order.getId());

+ 52 - 40
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/settlement/service/impl/SettlementServiceImpl.java

@@ -43,6 +43,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -103,6 +104,9 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, PjSettl
 		this.saveOrUpdate(settlement);
 		StringBuilder stringBuilder = new StringBuilder();
 		if (ObjectUtils.isNotNull(settlement.getSettlementItemsList())) {
+			BigDecimal thisAmount = settlement.getSettlementItemsList().stream().map(PjSettlementItems::getThisAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+			BigDecimal thisRefundAmount = settlement.getSettlementItemsList().stream().map(PjSettlementItems::getThisRefundAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+			settlement.setAmount(thisAmount.subtract(thisRefundAmount));
 			for (PjSettlementItems item : settlement.getSettlementItemsList()) {
 				stringBuilder.append(item.getSrcBillNo()).append(",");
 				if (item.getId() == null) {
@@ -168,27 +172,22 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, PjSettl
 			List<PjOrder> orderArrayList = new ArrayList<>();
 			BigDecimal thisAmount = new BigDecimal("0.00");
 			for (PjSettlementItems item : settlement.getSettlementItemsList()) {
-				if (item.getAccountsAmount().compareTo(item.getThisAmount()) < 0) {
-					throw new RuntimeException("结算金额大于合同金额,结算失败");
-				}
 				item.setUpdateTime(new Date());
 				item.setUpdateUser(AuthUtil.getUserId());
-				item.setSettlmentAmount(item.getThisAmount());
+//				item.setSettlmentAmount(item.getThisAmount());
 				PjOrder pjOrder = pjOrderList.stream().filter(e -> e.getId().equals(item.getSrcParentId())).findFirst().orElse(null);
 				if (pjOrder == null) {
 					continue;
 				}
-				/*if ("挂账".equals(pjOrder.getReceivableType())) {
-					PjCorpsDesc pjCorpsDesc = corpsDescService.getById(pjOrder.getCustomerId());
-					if (ObjectUtils.isNotNull(pjCorpsDesc)) {
-						if (ObjectUtils.isNotNull(pjCorpsDesc.getUseCreditLimit())) {
-							pjCorpsDesc.setUseCreditLimit(pjCorpsDesc.getUseCreditLimit().subtract(pjOrder.getTotalMoney()));
-						} else {
-							pjCorpsDesc.setUseCreditLimit(new BigDecimal("0.00"));
-						}
+				if ("XS".equals(item.getBusinesType()) || "CG".equals(item.getBusinesType())) {
+					if (item.getAccountsAmount().compareTo(item.getThisAmount()) < 0) {
+						throw new RuntimeException("结算金额大于合同金额,结算失败");
+					}
+				} else if ("TKXS".equals(item.getBusinesType()) || "TKCG".equals(item.getBusinesType())) {
+					if (item.getAccountsAmount().compareTo(item.getThisRefundAmount()) < 0) {
+						throw new RuntimeException("结算金额大于合同金额,结算失败");
 					}
-					corpsDescService.updateById(pjCorpsDesc);
-				}*/
+				}
 				if ("额度支付".equals(pjOrder.getBusinessSource())) {
 					PjCorpsDesc pjCorpsDesc = pjCorpsDescList.stream().filter(e -> e.getId().equals(pjOrder.getCustomerId()))
 						.findFirst().orElse(null);
@@ -202,16 +201,32 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, PjSettl
 					pjCorpsDescs.add(pjCorpsDesc);
 					pjOrder.setActualPaymentStatus(2);
 				} else {
-					if (ObjectUtils.isNotNull(pjOrder.getPaymentAmountTl())) {
-						if (pjOrder.getPaymentAmountTl().add(item.getThisAmount()).compareTo(pjOrder.getTotalMoney()) > 0) {
-							throw new RuntimeException("当前结算金额大于订单金额");
+					if ("XS".equals(item.getBusinesType()) || "CG".equals(item.getBusinesType())) {
+						if (ObjectUtils.isNotNull(pjOrder.getPaymentAmountTl())) {
+							if (pjOrder.getPaymentAmountTl().add(item.getThisAmount()).compareTo(pjOrder.getTotalMoney()) > 0) {
+								throw new RuntimeException("当前结算金额大于订单金额");
+							}
+							pjOrder.setPaymentAmountTl(pjOrder.getPaymentAmountTl().add(item.getThisAmount()));
+						} else {
+							if (item.getThisAmount().compareTo(pjOrder.getTotalMoney()) > 0) {
+								throw new RuntimeException("当前结算金额大于订单金额");
+							}
+							pjOrder.setPaymentAmountTl(item.getThisAmount());
 						}
-						pjOrder.setPaymentAmountTl(pjOrder.getPaymentAmountTl().add(item.getThisAmount()));
-					} else {
-						if (item.getThisAmount().compareTo(pjOrder.getTotalMoney()) > 0) {
-							throw new RuntimeException("当前结算金额大于订单金额");
+						thisAmount = thisAmount.add(item.getThisAmount());
+					} else if ("TKXS".equals(item.getBusinesType()) || "TKCG".equals(item.getBusinesType())) {
+						if (ObjectUtils.isNotNull(pjOrder.getPaymentAmountTl())) {
+							if (pjOrder.getPaymentAmountTl().add(item.getThisRefundAmount()).compareTo(pjOrder.getTotalMoney()) > 0) {
+								throw new RuntimeException("当前结算金额大于订单金额");
+							}
+							pjOrder.setPaymentAmountTl(pjOrder.getPaymentAmountTl().add(item.getThisRefundAmount()));
+						} else {
+							if (item.getThisRefundAmount().compareTo(pjOrder.getTotalMoney()) > 0) {
+								throw new RuntimeException("当前结算金额大于订单金额");
+							}
+							pjOrder.setPaymentAmountTl(item.getThisRefundAmount());
 						}
-						pjOrder.setPaymentAmountTl(item.getThisAmount());
+						thisAmount = thisAmount.subtract(item.getThisRefundAmount());
 					}
 					if (pjOrder.getPaymentAmountTl().equals(pjOrder.getTotalMoney())) {
 						pjOrder.setActualPaymentStatus(2);
@@ -222,7 +237,6 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, PjSettl
 				pjOrder.setUpdateTime(new Date());
 				pjOrder.setUpdateUser(AuthUtil.getUserId());
 				orderArrayList.add(pjOrder);
-				thisAmount = thisAmount.add(item.getThisAmount());
 			}
 			corpsDescService.updateBatchById(pjCorpsDescs);
 			settlementItemsService.saveOrUpdateBatch(settlement.getSettlementItemsList());
@@ -284,22 +298,11 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, PjSettl
 			for (PjSettlementItems item : settlement.getSettlementItemsList()) {
 				item.setUpdateTime(new Date());
 				item.setUpdateUser(AuthUtil.getUserId());
-				item.setSettlmentAmount(new BigDecimal("0.00"));
+//				item.setSettlmentAmount(new BigDecimal("0.00"));
 				PjOrder pjOrder = pjOrderList.stream().filter(e -> e.getId().equals(item.getSrcParentId())).findFirst().orElse(null);
 				if (pjOrder == null) {
 					continue;
 				}
-				/*if ("挂账".equals(pjOrder.getReceivableType())) {
-					PjCorpsDesc pjCorpsDesc = corpsDescService.getById(pjOrder.getCustomerId());
-					if (ObjectUtils.isNotNull(pjCorpsDesc)) {
-						if (ObjectUtils.isNotNull(pjCorpsDesc.getUseCreditLimit())) {
-							pjCorpsDesc.setUseCreditLimit(pjCorpsDesc.getUseCreditLimit().add(pjOrder.getTotalMoney()));
-						} else {
-							pjCorpsDesc.setUseCreditLimit(pjOrder.getTotalMoney());
-						}
-					}
-					corpsDescService.updateById(pjCorpsDesc);
-				}*/
 				if ("额度支付".equals(pjOrder.getBusinessSource())) {
 					PjCorpsDesc pjCorpsDesc = pjCorpsDescList.stream().filter(e -> e.getId().equals(pjOrder.getCustomerId()))
 						.findFirst().orElse(null);
@@ -313,10 +316,20 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, PjSettl
 					pjCorpsDescs.add(pjCorpsDesc);
 					pjOrder.setActualPaymentStatus(1);
 				} else {
-					if (ObjectUtils.isNotNull(pjOrder.getPaymentAmountTl())) {
-						pjOrder.setPaymentAmountTl(pjOrder.getPaymentAmountTl().subtract(item.getThisAmount()));
-					} else {
-						pjOrder.setPaymentAmountTl(new BigDecimal("0.00"));
+					if ("XS".equals(item.getBusinesType()) || "CG".equals(item.getBusinesType())) {
+						if (ObjectUtils.isNotNull(pjOrder.getPaymentAmountTl())) {
+							pjOrder.setPaymentAmountTl(pjOrder.getPaymentAmountTl().subtract(item.getThisAmount()));
+						} else {
+							pjOrder.setPaymentAmountTl(new BigDecimal("0.00"));
+						}
+						thisAmount = thisAmount.add(item.getThisAmount());
+					} else if ("TKXS".equals(item.getBusinesType()) || "TKCG".equals(item.getBusinesType())) {
+						if (ObjectUtils.isNotNull(pjOrder.getPaymentAmountTl())) {
+							pjOrder.setPaymentAmountTl(pjOrder.getPaymentAmountTl().subtract(item.getThisRefundAmount()));
+						} else {
+							pjOrder.setPaymentAmountTl(new BigDecimal("0.00"));
+						}
+						thisAmount = thisAmount.subtract(item.getThisRefundAmount());
 					}
 					if (pjOrder.getPaymentAmountTl().equals(new BigDecimal("0.00"))) {
 						pjOrder.setActualPaymentStatus(1);
@@ -327,7 +340,6 @@ public class SettlementServiceImpl extends ServiceImpl<SettlementMapper, PjSettl
 				pjOrder.setUpdateTime(new Date());
 				pjOrder.setUpdateUser(AuthUtil.getUserId());
 				orderArrayList.add(pjOrder);
-				thisAmount = thisAmount.add(item.getThisAmount());
 			}
 			corpsDescService.updateBatchById(pjCorpsDescs);
 			settlementItemsService.saveOrUpdateBatch(settlement.getSettlementItemsList());

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

@@ -596,18 +596,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				if ("1".equals(goodsDesc.getWhether()) && ObjectUtils.isNull(item.getDot())) {
 					throw new RuntimeException("商品:" + goodsDesc.getCname() + ",请求选择批次号");
 				}
-
-				PjOrderItems orderItems = pjOrderItems.stream().filter(e -> e.getId().equals(item.getSrcItemId())).findFirst().orElse(null);
-				if (orderItems != null) {
-					if (orderItems.getGoodsNum().compareTo(orderItems.getSendNum().add(item.getSendNum())) < 0) {
-						throw new RuntimeException(orderItems.getGoodsName() + "剩余应发货数量" + orderItems.getGoodsNum().subtract(orderItems.getSendNum()));
-					} else {
-						orderItems.setSendNum(orderItems.getSendNum().add(item.getSendNum()));
-					}
-					pjOrderItemsList.add(orderItems);
-				} else {
-					throw new RuntimeException("数据异常请联系管理员");
-				}
 				//管理批次号
 				PjStockDesc stockOne = null;
 				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
@@ -637,6 +625,21 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					System.err.println("商品:" + goodsDesc.getCname());
 					throw new RuntimeException("商品:" + goodsDesc.getCname() + "未查到库存账");
 				}
+				PjOrderItems orderItems = pjOrderItems.stream().filter(e -> e.getId().equals(item.getSrcItemId())).findFirst().orElse(null);
+				if (orderItems != null) {
+					if (ObjectUtils.isNull(orderItems.getCostprie()) || new BigDecimal("0.00").compareTo(orderItems.getCostprie()) == 0) {
+						orderItems.setCostprie(stockOne.getInventoryCostPrice().multiply(orderItems.getGoodsNum()));
+						orderItems.setGrossProfit(item.getSubTotalMoney().subtract(orderItems.getCostprie()));
+					}
+					if (orderItems.getGoodsNum().compareTo(orderItems.getSendNum().add(item.getSendNum())) < 0) {
+						throw new RuntimeException(orderItems.getGoodsName() + "剩余应发货数量" + orderItems.getGoodsNum().subtract(orderItems.getSendNum()));
+					} else {
+						orderItems.setSendNum(orderItems.getSendNum().add(item.getSendNum()));
+					}
+					pjOrderItemsList.add(orderItems);
+				} else {
+					throw new RuntimeException("数据异常请联系管理员");
+				}
 			}
 			if (!msg.isEmpty()) {
 				throw new RuntimeException("商品:" + msg + "库存不足,出库失败");
@@ -714,6 +717,25 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		ship.setUpdateUser(AuthUtil.getUserId());
 		ship.setUpdateTime(new Date());
 		baseMapper.updateById(ship);
+		PjOrder order = orderMapper.selectById(ship.getOrdId());
+		if (ObjectUtil.isNotEmpty(order)) {
+			PjOrder order1 = orderMapper.selectOne(new LambdaQueryWrapper<PjOrder>()
+				.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrder::getIsDeleted, 0)
+				.eq(PjOrder::getSrcNo, order.getOrdNo()));
+			if (order1 != null && "待入库,已完成".contains(order1.getStatus())) {
+				throw new RuntimeException("已生成销售退货单据,撤销失败");
+			}
+			if ("已收货".equals(order.getStatus()) || "退款请核".equals(order.getStatus()) || "已取消".equals(order.getStatus())) {
+				throw new RuntimeException("单据已收货或申请售后中,操作失败");
+			}
+			order.setStatus(OrderTypeEnum.XSDFH.getType());
+			order.setXcxStatus(OrderTypeEnum.XSDFH.getType());
+			order.setDeliveryBusinesDate(null);
+			orderMapper.updateById(order);
+		} else {
+			throw new RuntimeException("数据异常请联系管理员");
+		}
 
 		// 保存订单明细
 		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
@@ -733,6 +755,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				.eq(PjStockDesc::getStorageId, ship.getStorageId())
 				.in(PjStockDesc::getGoodsId, goodIds);
 			List<PjStockDesc> pjStockDescList = iStockDescService.list(lambdaQueryWrapper);
+			LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper1.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.eq(PjStockDesc::getStorageId, order.getStorageId())
+				.in(PjStockDesc::getGoodsId, goodIds);
+			List<PjStockDesc> pjStockDescList1 = iStockDescService.list(lambdaQueryWrapper1);
 			List<Long> srcItemIds = ship.getShipItemsList().stream().map(PjShipItems::getSrcItemId).distinct().collect(Collectors.toList());
 			List<PjOrderItems> pjOrderItems = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
 				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
@@ -749,8 +778,28 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			BigDecimal number = new BigDecimal("0.00");
 			for (PjShipItems item : ship.getShipItemsList()) {
 				number = number.add(item.getSendNum());
+				//获得商品
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+				//管理批次号
+				PjStockDesc stockOne1 = null;
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					stockOne1 = pjStockDescList1.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne1 = pjStockDescList1.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
 				PjOrderItems orderItems = pjOrderItems.stream().filter(e -> e.getId().equals(item.getSrcItemId())).findFirst().orElse(null);
 				if (orderItems != null) {
+					if (stockOne1 == null) {
+						orderItems.setCostprie(new BigDecimal("0.00"));
+						orderItems.setGrossProfit(new BigDecimal("0.00"));
+					}
 					orderItems.setSendNum(orderItems.getSendNum().subtract(item.getSendNum()));
 					pjOrderItemsList.add(orderItems);
 				} else {
@@ -760,11 +809,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				if (!pjOrderItemsList1.isEmpty()) {
 					msg1.append(item.getGoodsName()).append(",");
 				}
-				//获得商品
-				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
-				if (ObjectUtil.isEmpty(goodsDesc)) {
-					throw new RuntimeException("商品数据异常");
-				}
 				//管理批次号
 				PjStockDesc stockOne = null;
 				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
@@ -817,19 +861,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				baseMapper.updateById(rwShip);
 			}
 		}
-		PjOrder order = orderMapper.selectById(ship.getOrdId());
-		if (ObjectUtil.isNotEmpty(order)) {
-			if ("已收货".equals(order.getStatus()) || "退款请核".equals(order.getStatus()) || "已取消".equals(order.getStatus())) {
-				throw new RuntimeException("单据已收货或申请售后中,操作失败");
-			}
-			order.setStatus(OrderTypeEnum.XSDFH.getType());
-			order.setXcxStatus(OrderTypeEnum.XSDFH.getType());
-			order.setDeliveryBusinesDate(null);
-			orderMapper.updateById(order);
-		} else {
-			throw new RuntimeException("数据异常请联系管理员");
-		}
-
 		//生成出库工单历史记录
 		saveHistory(ship.getId(), OrderTypeEnum.TOBESHIPPEDOUT.getType());
 
@@ -1189,9 +1220,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					.filter(i -> i.getGoodsId().equals(goodsDesc.getId())).findFirst().orElse(null);
 				//修改上架数量
 				if (pjProductLaunches != null) {
-					if (ObjectUtils.isNotNull(pjProductLaunches.getInventory())){
+					if (ObjectUtils.isNotNull(pjProductLaunches.getInventory())) {
 						pjProductLaunches.setInventory(pjProductLaunches.getInventory().add(item.getSendNum()));
-					}else{
+					} else {
 						pjProductLaunches.setInventory(item.getSendNum());
 					}
 					pjProductLaunchList.add(pjProductLaunches);
@@ -1610,6 +1641,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		}
 		PjOrder order = orderMapper.selectById(ship.getOrdId());
 		if (ObjectUtil.isNotEmpty(order)) {
+			PjOrder order1 = orderMapper.selectOne(new LambdaQueryWrapper<PjOrder>()
+				.eq(PjOrder::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrder::getIsDeleted, 0)
+				.eq(PjOrder::getSrcNo, order.getOrdNo()));
+			if (order1 != null && "待出库,已完成".contains(order1.getStatus())) {
+				throw new RuntimeException("已生成采购退货单据,撤销失败");
+			}
 			order.setStatus(OrderTypeEnum.GOODSRECEIVED.getType());
 			order.setXcxStatus(OrderTypeEnum.GOODSRECEIVED.getType());
 			order.setDeliveryBusinesDate(null);
@@ -1985,6 +2023,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R outboundWorkOrderReturns(String ids) {
 		List<Long> shipIds = Func.toLongList(ids);
 		List<PjShip> pjShipList = baseMapper.selectList(new LambdaQueryWrapper<PjShip>()
@@ -1998,7 +2038,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			pjOrderItemsList = orderItemsService.list(new QueryWrapper<PjOrderItems>()
 				.in("pid", ordIds)
 				.eq("is_deleted", 0)
-				.apply("goods_num != send_num")
+				.apply("returns_number != send_num")
 				.eq("tenant_id", AuthUtil.getTenantId()));
 		}
 		List<OrderRecord> orderRecordList = new ArrayList<>();
@@ -2075,6 +2115,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					}
 				}
 				item.setNumberRows(list.size());
+				item.setSendTotalNum(list.stream().map(PjOrderItems::getReturnsNumber).reduce(BigDecimal.ZERO,BigDecimal::add));
 			}
 
 			//修改出库任务状态
@@ -2142,11 +2183,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		}
 		this.saveOrUpdateBatch(rwShipList);
 		shipItemsService.saveOrUpdateBatch(shipItemsList);
-
+		this.saveOrUpdateBatch(pjShips);
 		return R.success("操作成功");
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R outboundCompletedReturns(PjShip ship) {
 		ship.setStatusName(OrderTypeEnum.OURTBOUND.getType());
 		if (ObjectUtils.isNull(ship.getStorageId())) {
@@ -2341,7 +2384,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			.eq(PjOrderItems::getPid, ship.getOrdId());
 		List<PjOrderItems> itemsList = orderItemsService.list(itemsLambdaQueryWrapper);
 		//数量和
-		BigDecimal goodsNum = itemsList.stream().map(PjOrderItems::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal goodsNum = itemsList.stream().map(PjOrderItems::getReturnsNumber).reduce(BigDecimal.ZERO, BigDecimal::add);
 		//发货数量和
 		BigDecimal sendNum = itemsList.stream().map(PjOrderItems::getSendNum).reduce(BigDecimal.ZERO, BigDecimal::add);
 		PjOrder order = orderMapper.selectById(ship.getOrdId());
@@ -2376,6 +2419,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R revokeOutboundCompletedReturns(PjShip ship) {
 		ship.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
 		ship.setUpdateUser(AuthUtil.getUserId());
@@ -2538,6 +2583,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R generateWarehousingReturns(String ids) {
 		List<Long> shipIds = Func.toLongList(ids);
 		List<PjShip> pjShipList = baseMapper.selectList(new LambdaQueryWrapper<PjShip>()
@@ -2551,7 +2598,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			pjOrderItemsList = orderItemsService.list(new QueryWrapper<PjOrderItems>()
 				.in("pid", ordIds)
 				.eq("is_deleted", 0)
-				.apply("goods_num != send_num")
+				.apply("returns_number != send_num")
 				.eq("tenant_id", AuthUtil.getTenantId()));
 		}
 		List<OrderRecord> orderRecordList = new ArrayList<>();
@@ -2621,6 +2668,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					shipItemsList.add(shipItems);
 				}
 				item.setNumberRows(list.size());
+				item.setSendTotalNum(list.stream().map(PjOrderItems::getReturnsNumber).reduce(BigDecimal.ZERO,BigDecimal::add));
 			}
 
 			//修改入库任务状态
@@ -2688,10 +2736,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		}
 		this.saveOrUpdateBatch(rwShipList);
 		shipItemsService.saveOrUpdateBatch(shipItemsList);
+		this.saveOrUpdateBatch(pjShips);
 		return R.success("操作成功");
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R warehousingCompleteReturns(PjShip ship) {
 		if (ship.getId() == null) {
 			// 获取系统编号
@@ -2845,7 +2896,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					stockDesc.setUpdateUser(AuthUtil.getUserId());
 					stockDesc.setBalanceQuantity(stockOne.getBalanceQuantity().add(item.getSendNum()));
 					stockDesc.setStoreInventory(stockDesc.getBalanceQuantity());
-					stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
+					stockDesc.setInventoryAmount(item.getCostprie());
 					stockDesc.setInventoryAmount(stockDesc.getInventoryAmount().add(stockOne.getInventoryAmount()));
 					if (stockDesc.getBalanceQuantity().compareTo(new BigDecimal("0")) != 0) {
 						stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
@@ -2927,7 +2978,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			.eq(PjOrderItems::getPid, ship.getOrdId());
 		List<PjOrderItems> itemsList = orderItemsService.list(itemsLambdaQueryWrapper);
 		//数量和
-		BigDecimal goodsNum = itemsList.stream().map(PjOrderItems::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+		BigDecimal goodsNum = itemsList.stream().map(PjOrderItems::getReturnsNumber).reduce(BigDecimal.ZERO, BigDecimal::add);
 		//发货数量和
 		BigDecimal sendNum = itemsList.stream().map(PjOrderItems::getSendNum).reduce(BigDecimal.ZERO, BigDecimal::add);
 		PjOrder order = orderMapper.selectById(ship.getOrdId());
@@ -2957,6 +3008,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R revokeWarehousingReturns(PjShip ship) {
 		// 保存订单明细
 		BigDecimal number = new BigDecimal("0.00");
@@ -3128,6 +3181,8 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	}
 
 	@Override
+	@Transactional(rollbackFor = Exception.class)
+	@GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
 	public R revokeWorkOrderReturns(String ids) {
 		List<Long> shipIds = Func.toLongList(ids);
 		for (Long id : shipIds) {

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

@@ -503,19 +503,32 @@ public class StatisticsServiceImpl implements IStatisticsService {
 				if (!saleDetailDtoList.isEmpty()) {
 					BigDecimal amount = item.getPaymentAmountTl();
 					BigDecimal number = saleDetailDtoList.stream().map(SaleDetailDto::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+					number = number.abs();
+					amount = amount.abs();
 					for (SaleDetailDto items : saleDetailDtoList) {
-						if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
-							items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("5.00")));
-						}
-						if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
-							items.setBalanceAmount(amount.subtract(items.getSubTotalMoney()));
-							amount = amount.subtract(items.getSubTotalMoney());
-						} else {
-							items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
-							amount = new BigDecimal("0.00");
-						}
 						if ("TKXS".equals(item.getBsType()) || "TKCG".equals(item.getBsType())){
-							items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getBalanceAmount()));
+							items.setFreight(new BigDecimal("0.00").subtract(items.getFreight()));
+							if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
+								items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("-5.00")));
+							}
+							if (amount.compareTo(items.getSubTotalMoney().abs()) >= 0) {
+								items.setBalanceAmount(new BigDecimal("0.00"));
+								amount = amount.subtract(items.getSubTotalMoney().abs());
+							} else {
+								items.setBalanceAmount(new BigDecimal("0.00").subtract(items.getSubTotalMoney().abs().subtract(amount)));
+								amount = new BigDecimal("0.00");
+							}
+						}else{
+							if (saleDetailDtoList.size() == 1 && number.compareTo(new BigDecimal(1)) <= 0) {
+								items.setSubTotalMoney(items.getSubTotalMoney().add(new BigDecimal("5.00")));
+							}
+							if (amount.compareTo(items.getSubTotalMoney()) >= 0) {
+								items.setBalanceAmount(new BigDecimal("0.00"));
+								amount = amount.subtract(items.getSubTotalMoney());
+							} else {
+								items.setBalanceAmount(items.getSubTotalMoney().subtract(amount));
+								amount = new BigDecimal("0.00");
+							}
 						}
 					}
 				}

+ 1 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/stock/mapper/StockDescMapper.xml

@@ -177,6 +177,7 @@
         LEFT JOIN pjpf_stock_desc stock ON goods.id = stock.goods_id
         <where>
             goods.is_deleted = 0
+            AND stock.is_deleted = 0
             <if test='stockDesc.whether != null and stockDesc.whether != "" and stockDesc.whether == "0"'>
                 and stock.balance_quantity != 0
             </if>

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

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