Procházet zdrojové kódy

2024年5月10日17:30:54

纪新园 před 1 rokem
rodič
revize
585b5db36b
32 změnil soubory, kde provedl 3826 přidání a 79 odebrání
  1. 34 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/dto/OrderRecordDTO.java
  2. 12 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/dto/SaleDetail.java
  3. 12 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/dto/SaleDetailDto.java
  4. 110 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/OrderRecord.java
  5. 50 3
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrder.java
  6. 18 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/entity/PjOrderItems.java
  7. 6 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/enums/OrderTypeEnum.java
  8. 36 0
      blade-service-api/blade-sales-part-api/src/main/java/org/springblade/salesPart/vo/OrderRecordVO.java
  9. 3 4
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/check/controller/AuditProecessController.java
  10. 3 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/check/service/impl/AuditProecessServiceImpl.java
  11. 3 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/corps/controller/CorpsDescController.java
  12. 2 2
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/corps/service/impl/CorpsDescServiceImpl.java
  13. 3 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/controller/GoodsDescController.java
  14. 21 8
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderController.java
  15. 1 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderItemsController.java
  16. 126 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderRecordController.java
  17. 416 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/ReturnsController.java
  18. 143 17
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderItemsMapper.xml
  19. 42 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderRecordMapper.java
  20. 25 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/mapper/OrderRecordMapper.xml
  21. 41 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderRecordService.java
  22. 22 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/IOrderService.java
  23. 41 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderRecordServiceImpl.java
  24. 1006 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/service/impl/OrderServiceImpl.java
  25. 1 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipItemsController.java
  26. 302 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipReturnsController.java
  27. 14 3
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/mapper/ShipMapper.xml
  28. 16 0
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/IShipService.java
  29. 1271 20
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipServiceImpl.java
  30. 5 1
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/shoppingCart/service/impl/ShoppingCartServiceImpl.java
  31. 39 16
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/statistics/service/impl/StatisticsServiceImpl.java
  32. 2 2
      blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/stock/controller/StockDescController.java

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

@@ -0,0 +1,34 @@
+/*
+ *      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.dto;
+
+import org.springblade.salesPart.entity.OrderRecord;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 交易记录表数据传输对象实体类
+ *
+ * @author BladeX
+ * @since 2024-05-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class OrderRecordDTO extends OrderRecord {
+	private static final long serialVersionUID = 1L;
+
+}

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

@@ -64,5 +64,17 @@ public class SaleDetail {
 	@ExcelIgnore
 	private String salesCompanyId;
 
+	/**
+	 * 业务类型
+	 */
+	@ExcelIgnore
+	private String bsType;
+
+	/**
+	 * 只查看退单数据
+	 */
+	@ExcelIgnore
+	private String chargeback;
+
 
 }

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

@@ -46,6 +46,12 @@ public class SaleDetailDto {
 	@ExcelProperty(value = "业务日期")
 	private String businesDate;
 	/**
+	 * 完成日期
+	 */
+	@ExcelProperty(value = "完成日期")
+	private String deliveryBusinesDate;
+
+	/**
 	 * 结算状态
 	 */
 	@ExcelProperty(value = "结算状态")
@@ -143,5 +149,11 @@ public class SaleDetailDto {
 	@ExcelProperty(value = "商品名称Id")
 	private String goodsId;
 
+	/**
+	 * 业务类型
+	 */
+	@ExcelIgnore
+	private String bsType;
+
 
 }

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

@@ -0,0 +1,110 @@
+/*
+ *      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.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springblade.core.secure.utils.AuthUtil;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 交易记录表实体类
+ *
+ * @author BladeX
+ * @since 2024-05-06
+ */
+@Data
+@TableName("pjpf_order_record")
+@ApiModel(value = "OrderRecord对象", description = "交易记录表")
+public class OrderRecord implements Serializable {
+
+	private static final long serialVersionUID = 1L;
+
+	private Long id;
+	/**
+	 * 主表id
+	 */
+	@ApiModelProperty(value = "主表id")
+	private Long pid;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private Long createUser;
+	/**
+	 * 创建人
+	 */
+	@ApiModelProperty(value = "创建人")
+	private String createUserName;
+	/**
+	 * 创建部门
+	 */
+	@ApiModelProperty(value = "创建部门")
+	private Long createDept;
+	/**
+	 * 创建时间
+	 */
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**
+	 * 修改人
+	 */
+	@ApiModelProperty(value = "修改人")
+	private Long updateUser;
+	/**
+	 * 修改时间
+	 */
+	@ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+	/**
+	 * 是否已删除(0 否 1是)
+	 */
+	@ApiModelProperty(value = "是否已删除(0 否 1是)")
+	private Integer isDeleted;
+	/**
+	 * 备注
+	 */
+	@ApiModelProperty(value = "备注")
+	private String remarks;
+	/**
+	 * 订单状态
+	 */
+	@ApiModelProperty(value = "订单状态")
+	private String status;
+	/**
+	 * 单据号
+	 */
+	@ApiModelProperty(value = "单据号")
+	private String srcNo;
+	/**
+	 * 业务类型
+	 */
+	@ApiModelProperty(value = "业务类型")
+	private String bsType;
+
+	/**
+	 * 租户id
+	 */
+	@ApiModelProperty(value = "租户id")
+	private String tenantId = AuthUtil.getTenantId();
+
+
+}

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

@@ -16,8 +16,8 @@
  */
 package org.springblade.salesPart.entity;
 
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.annotations.ApiModel;
@@ -55,7 +55,7 @@ public class PjOrder implements Serializable {
 	 */
 	@ApiModelProperty(value = "租户id")
 	private String tenantId = AuthUtil.getTenantId();
-	;
+
 	/**
 	 * 订单编号
 	 */
@@ -251,7 +251,14 @@ public class PjOrder implements Serializable {
 	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
 	@DateTimeFormat(pattern = "yyyy-MM-dd")
 	private Date businesDate;
-
+	/**
+	 * 收发日期
+	 */
+	@ApiModelProperty(value = "收发日期")
+	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd")
+	@DateTimeFormat(pattern = "yyyy-MM-dd")
+	@TableField(updateStrategy = FieldStrategy.IGNORED)
+	private Date deliveryBusinesDate;
 	/**
 	 * 业务日期
 	 */
@@ -335,6 +342,11 @@ public class PjOrder implements Serializable {
 	 */
 	@TableField(exist = false)
 	private List<PjShip> outboundRecordsList;
+	/**
+	 * 交易记录集合
+	 */
+	@TableField(exist = false)
+	private List<OrderRecord> orderRecordList;
 
 	/**
 	 * 商品名称拼接
@@ -521,4 +533,39 @@ public class PjOrder implements Serializable {
 	 */
 	@TableField(exist = false)
 	private List<String> paymentDateList;
+
+	/**
+	 * 退货数量
+	 */
+	@ApiModelProperty(value = "退货数量")
+	private BigDecimal returnsNumber;
+
+	/**
+	 * 退货金额
+	 */
+	@ApiModelProperty(value = "退货金额")
+	private BigDecimal returnsAmount;
+
+	/**
+	 * 来源单号
+	 */
+	@ApiModelProperty(value = "来源单号")
+	private String srcNo;
+	/**
+	 * 退货状态
+	 */
+	@ApiModelProperty(value = "退货状态")
+	private String returnsStatus;
+	/**
+	 * 原业务日期
+	 */
+	@ApiModelProperty(value = "原业务日期")
+	private Date oldBusinesDate;
+
+	/**
+	 * 默认不显示已完成
+	 */
+	@TableField(exist = false)
+	private String notComplete;
+
 }

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

@@ -278,4 +278,22 @@ public class PjOrderItems implements Serializable {
 	private String billKey;
 
 
+	/**
+	 * 退货数量
+	 */
+	@ApiModelProperty(value = "退货数量")
+	private BigDecimal returnsNumber;
+
+	/**
+	 * 退货金额
+	 */
+	@ApiModelProperty(value = "退货金额")
+	private BigDecimal returnsAmount;
+
+
+	/**
+	 * 来源明细id
+	 */
+	@ApiModelProperty(value = "来源明细id")
+	private Long srcItemId;
 }

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

@@ -17,11 +17,13 @@ public enum OrderTypeEnum {
 	 * 采购类型
 	 */
 	PURCHASE("CG"),
+	TKPURCHASE("TKCG"),
 
 	/**
 	 * 销售类型
 	 */
 	SALES("XS"),
+	TKSALES("TKXS"),
 
 	/**
 	 * 销售录入状态
@@ -51,16 +53,19 @@ public enum OrderTypeEnum {
 	 * 发货任务
 	 */
 	FHRW("FHRW"),
+	TKFHRW("TKFHRW"),
 
 	/**
 	 * 发货工单
 	 */
 	FHGD("FHGD"),
+	TKFHGD("TKFHGD"),
 
 	/**
 	 * 收货任务
 	 */
 	SHRW("SHRW"),
+	THSHRW("THSHRW"),
 
 	/**
 	 * 收货工单
@@ -71,6 +76,7 @@ public enum OrderTypeEnum {
 	 * 退款收货工单
 	 */
 	TKSHGD("TKSHGD"),
+	THSHGD("THSHGD"),
 
 	/**
 	 * 出库任务状态待处理

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

@@ -0,0 +1,36 @@
+/*
+ *      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.vo;
+
+import org.springblade.salesPart.entity.OrderRecord;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import io.swagger.annotations.ApiModel;
+
+/**
+ * 交易记录表视图实体类
+ *
+ * @author BladeX
+ * @since 2024-05-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "OrderRecordVO对象", description = "交易记录表")
+public class OrderRecordVO extends OrderRecord {
+	private static final long serialVersionUID = 1L;
+
+}

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

@@ -41,7 +41,6 @@ import org.springblade.salesPart.check.dto.PjAuditProecessDTO;
 import org.springblade.salesPart.check.entity.PjAuditProecess;
 import org.springblade.salesPart.check.service.IAuditProecessService;
 import org.springblade.salesPart.check.vo.PjAuditOrderVO;
-import org.springblade.salesPart.entity.PjBrandDesc;
 import org.springblade.salesPart.entity.PjCorpsDesc;
 import org.springblade.salesPart.feign.IPJCorpClient;
 import org.springblade.system.user.entity.User;
@@ -222,10 +221,10 @@ public class AuditProecessController extends BladeController {
 		if (StringUtils.isBlank(proecess.getCheckType())) {
 			throw new SecurityException("审核失败,未填写审批类型");
 		}
-		if ("PJTK".equals(proecess.getCheckType())) {
-			auditProecessService.pjOrderCheck(auditProecess);
-		} else if ("PJCG".equals(proecess.getCheckType())) {
+		if ("PJTK".equals(proecess.getCheckType()) || "PJCG".equals(proecess.getCheckType()) || "PJCGTK".equals(proecess.getCheckType())) {
 			auditProecessService.pjOrderCheck(auditProecess);
+		} else {
+			throw new RuntimeException("数据错误,请联系管理员");
 		}
 		return R.data(auditProecess);
 	}

+ 3 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/check/service/impl/AuditProecessServiceImpl.java

@@ -365,11 +365,13 @@ public class AuditProecessServiceImpl extends ServiceImpl<AuditProecessMapper, P
 			if (operate == 1) {
 				//todo 调用feign直接通过
 				auditProecess.setAuditStatus("A");
+				if (order == null) {
+					throw new SecurityException("审批通过失败");
+				}
 				R r = ipjOrderClient.orderPassCheck(auditProecess.getSrcBillId());
 				if (!r.isSuccess()) {
 					throw new SecurityException("修改订单数据失败");
 				}
-
 				sendMessage.setMessageBody("您的审核已通过" + ",订单号:" + proecessTemp.getBillNo() + ",请继续操作");
 				R save = messageClient.save(sendMessage);
 				if (!save.isSuccess()) {

+ 3 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/corps/controller/CorpsDescController.java

@@ -220,6 +220,9 @@ public class CorpsDescController extends BladeController {
 	@ApiOperationSupport(order = 7)
 	@ApiOperation(value = "删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("基础资料")) {
+			throw new RuntimeException("暂无权限,删除失败");
+		}
 		List<Long> list = Func.toLongList(ids);
 		if (!list.isEmpty()) {
 			if (orderService.count(new LambdaQueryWrapper<PjOrder>()

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

@@ -897,7 +897,7 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, PjCorpsDe
 
 			//保存客户联系人信息
 			PjCorpsAttn corpsAttn = new PjCorpsAttn();
-			/*if (ObjectUtils.isNotNull(user)) {
+			if (ObjectUtils.isNotNull(user)) {
 				long count = corpsAttnService.count(new LambdaQueryWrapper<PjCorpsAttn>()
 					.eq(PjCorpsAttn::getUserId, user.getId())
 					.eq(PjCorpsAttn::getTel, corpsDesc.getTel())
@@ -907,7 +907,7 @@ public class CorpsDescServiceImpl extends ServiceImpl<CorpsDescMapper, PjCorpsDe
 					throw new RuntimeException("手机号已存在,提交失败");
 				}
 				corpsAttn.setUserId(user.getId());
-			}*/
+			}
 			List<PjCorpsAttn> corpsAttnList = corpsAttnService.list(new LambdaQueryWrapper<PjCorpsAttn>()
 				.eq(PjCorpsAttn::getTel,corpsDesc.getTel())
 				.eq(PjCorpsAttn::getTenantId,AuthUtil.getTenantId())

+ 3 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/goods/controller/GoodsDescController.java

@@ -406,6 +406,7 @@ public class GoodsDescController extends BladeController {
 			.eq(ObjectUtils.isNotNull(goods.getExplosionProof()), PjGoodsDesc::getExplosionProof, goods.getExplosionProof())
 			.eq(ObjectUtils.isNotNull(goods.getOriginalFactory()), PjGoodsDesc::getOriginalFactory, goods.getOriginalFactory())
 			.eq(ObjectUtils.isNotNull(goods.getSelfRecovery()), PjGoodsDesc::getSelfRecovery, goods.getSelfRecovery())
+			.like(ObjectUtils.isNotNull(goods.getCode()), PjGoodsDesc::getCode, goods.getCode())
 			.eq(ObjectUtils.isNotNull(goods.getEnableOrNot()), PjGoodsDesc::getEnableOrNot, goods.getEnableOrNot());//状态;
 		if (ObjectUtil.isNotEmpty(goods.getCname())) {//商品名称
 			lambdaQueryWrapper.and(i -> i.like(PjGoodsDesc::getCname, goods.getCname()).or().like(PjGoodsDesc::getCnameInt, goods.getCname()));
@@ -453,6 +454,7 @@ public class GoodsDescController extends BladeController {
 			.eq(ObjectUtils.isNotNull(goods.getExplosionProof()), PjGoodsDesc::getExplosionProof, goods.getExplosionProof())
 			.eq(ObjectUtils.isNotNull(goods.getOriginalFactory()), PjGoodsDesc::getOriginalFactory, goods.getOriginalFactory())
 			.eq(ObjectUtils.isNotNull(goods.getSelfRecovery()), PjGoodsDesc::getSelfRecovery, goods.getSelfRecovery())
+			.like(ObjectUtils.isNotNull(goods.getCode()), PjGoodsDesc::getCode, goods.getCode())
 		;
 		if (ObjectUtil.isNotEmpty(goods.getCname())) {//商品名称
 			lambdaQueryWrapper.and(i -> i.like(PjGoodsDesc::getCname, goods.getCname()).or().like(PjGoodsDesc::getCnameInt, goods.getCname()));
@@ -555,6 +557,7 @@ public class GoodsDescController extends BladeController {
 			.eq(ObjectUtils.isNotNull(goods.getExplosionProof()), PjGoodsDesc::getExplosionProof, goods.getExplosionProof())
 			.eq(ObjectUtils.isNotNull(goods.getOriginalFactory()), PjGoodsDesc::getOriginalFactory, goods.getOriginalFactory())
 			.eq(ObjectUtils.isNotNull(goods.getSelfRecovery()), PjGoodsDesc::getSelfRecovery, goods.getSelfRecovery())
+			.like(ObjectUtils.isNotNull(goods.getCode()), PjGoodsDesc::getCode, goods.getCode())
 		;
 		if (ObjectUtil.isNotEmpty(goods.getCname())) {//商品名称
 			lambdaQueryWrapper.and(i -> i.like(PjGoodsDesc::getCname, goods.getCname()).or().like(PjGoodsDesc::getCnameInt, goods.getCname()));

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

@@ -108,6 +108,7 @@ public class OrderController extends BladeController {
 			.eq(PjOrder::getBsType, order.getBsType())
 			.eq(PjOrder::getSalesCompanyId, AuthUtil.getDeptId())//公司
 			.eq(ObjectUtils.isNotEmpty(order.getStorageId()), PjOrder::getStorageId, order.getStorageId())//仓库
+			.eq(ObjectUtils.isNotEmpty(order.getReturnsStatus()), PjOrder::getReturnsStatus, order.getReturnsStatus())//退货状态
 			.like(ObjectUtils.isNotEmpty(order.getStorageName()), PjOrder::getStorageName, order.getStorageName())
 			.eq(ObjectUtils.isNotEmpty(order.getCustomerId()), PjOrder::getCustomerId, order.getCustomerId())//客户
 			.eq(ObjectUtils.isNotEmpty(order.getGenerateTask()), PjOrder::getGenerateTask, order.getGenerateTask())//客户
@@ -115,8 +116,7 @@ public class OrderController extends BladeController {
 			.like(ObjectUtils.isNotEmpty(order.getCustomerName()), PjOrder::getCustomerName, order.getCustomerName())
 			.like(ObjectUtils.isNotEmpty(order.getSrcOrdNo()), PjOrder::getSrcOrdNo, order.getSrcOrdNo())//来源单号
 			.like(ObjectUtils.isNotEmpty(order.getOrdNo()), PjOrder::getOrdNo, order.getOrdNo())//来源单号
-			.like(ObjectUtils.isNotEmpty(order.getBusinessSource()), PjOrder::getBusinessSource, order.getBusinessSource())//来源
-			.apply(ObjectUtils.isNotEmpty(order.getStatus()), "find_in_set(status,'" + order.getStatus() + "')");
+			.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));
@@ -134,6 +134,11 @@ public class OrderController extends BladeController {
 		} 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' )))");
@@ -184,6 +189,7 @@ public class OrderController extends BladeController {
 				if (!pjOrderItemsList.isEmpty()) {
 					long count = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count();
 					item.setItem(count + "");
+					item.setNumberRows((int) count);
 				}
 			});
 		}
@@ -699,7 +705,6 @@ public class OrderController extends BladeController {
 		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.getStorageId()), PjOrder::getStorageId, order.getStorageId())//仓库
 			.like(ObjectUtils.isNotEmpty(order.getStorageName()), PjOrder::getStorageName, order.getStorageName())
@@ -709,7 +714,9 @@ public class OrderController extends BladeController {
 			.like(ObjectUtils.isNotEmpty(order.getCustomerName()), PjOrder::getCustomerName, order.getCustomerName())
 			.like(ObjectUtils.isNotEmpty(order.getSrcOrdNo()), PjOrder::getSrcOrdNo, order.getSrcOrdNo())//来源单号
 			.like(ObjectUtils.isNotEmpty(order.getOrdNo()), PjOrder::getOrdNo, order.getOrdNo())//来源单号
-			.like(ObjectUtils.isNotEmpty(order.getBusinessSource()), PjOrder::getBusinessSource, order.getBusinessSource());
+			.like(ObjectUtils.isNotEmpty(order.getBusinessSource()), PjOrder::getBusinessSource, order.getBusinessSource())
+			.apply("find_in_set(bs_type,'" + order.getBsType() + "')")
+		;
 		if (order.getDueDateList() != null && order.getDueDateList().size() > 1) {//创建日期
 			lambdaQueryWrapper.ge(PjOrder::getDueDate, order.getDueDateList().get(0));
 			lambdaQueryWrapper.le(PjOrder::getDueDate, order.getDueDateList().get(1));
@@ -719,11 +726,17 @@ public class OrderController extends BladeController {
 			lambdaQueryWrapper.le(PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
 		}
 		if ("d".equals(order.getSettlementType())) {
-			lambdaQueryWrapper.eq(PjOrder::getGenerateTask, "已生成")
-				.apply("find_in_set(actual_payment_status,'1,3')");
+//		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.eq(PjOrder::getGenerateTask, "已生成")
+				.apply("find_in_set(actual_payment_status,'1,3')");*/
 		} else if ("c".equals(order.getSettlementType())) {
-			lambdaQueryWrapper.eq(PjOrder::getCheckStatus, "审核完成")
-				.apply("find_in_set(actual_payment_status,'1,3')");
+//		} 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.eq(PjOrder::getCheckStatus, "审核完成")
+				.apply("find_in_set(actual_payment_status,'1,3')");*/
 		}
 		lambdaQueryWrapper.orderByDesc(PjOrder::getCreateTime);
 		IPage<PjOrder> pages = orderService.page(Condition.getPage(query), lambdaQueryWrapper);

+ 1 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderItemsController.java

@@ -139,6 +139,7 @@ public class OrderItemsController extends BladeController {
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+
 		return R.status(orderItemsService.removeByIds(Func.toLongList(ids)));
 	}
 

+ 126 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/order/controller/OrderRecordController.java

@@ -0,0 +1,126 @@
+/*
+ *      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.order.controller;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import lombok.AllArgsConstructor;
+import javax.validation.Valid;
+
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.salesPart.entity.OrderRecord;
+import org.springblade.salesPart.vo.OrderRecordVO;
+import org.springblade.salesPart.order.service.IOrderRecordService;
+import org.springblade.core.boot.ctrl.BladeController;
+
+/**
+ * 交易记录表 控制器
+ *
+ * @author BladeX
+ * @since 2024-05-06
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/orderRecord")
+@Api(value = "交易记录表", tags = "交易记录表接口")
+public class OrderRecordController extends BladeController {
+
+	private final IOrderRecordService orderRecordService;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入orderRecord")
+	public R<OrderRecord> detail(OrderRecord orderRecord) {
+		OrderRecord detail = orderRecordService.getOne(Condition.getQueryWrapper(orderRecord));
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 交易记录表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入orderRecord")
+	public R<IPage<OrderRecord>> list(OrderRecord orderRecord, Query query) {
+		IPage<OrderRecord> pages = orderRecordService.page(Condition.getPage(query), Condition.getQueryWrapper(orderRecord));
+		return R.data(pages);
+	}
+
+	/**
+	 * 自定义分页 交易记录表
+	 */
+	@GetMapping("/page")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入orderRecord")
+	public R<IPage<OrderRecordVO>> page(OrderRecordVO orderRecord, Query query) {
+		IPage<OrderRecordVO> pages = orderRecordService.selectOrderRecordPage(Condition.getPage(query), orderRecord);
+		return R.data(pages);
+	}
+
+	/**
+	 * 新增 交易记录表
+	 */
+	@PostMapping("/save")
+	@ApiOperationSupport(order = 4)
+	@ApiOperation(value = "新增", notes = "传入orderRecord")
+	public R save(@Valid @RequestBody OrderRecord orderRecord) {
+		return R.status(orderRecordService.save(orderRecord));
+	}
+
+	/**
+	 * 修改 交易记录表
+	 */
+	@PostMapping("/update")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入orderRecord")
+	public R update(@Valid @RequestBody OrderRecord orderRecord) {
+		return R.status(orderRecordService.updateById(orderRecord));
+	}
+
+	/**
+	 * 新增或修改 交易记录表
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入orderRecord")
+	public R submit(@Valid @RequestBody OrderRecord orderRecord) {
+		return R.status(orderRecordService.saveOrUpdate(orderRecord));
+	}
+
+
+	/**
+	 * 删除 交易记录表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(orderRecordService.removeByIds(Func.toLongList(ids)));
+	}
+
+
+}

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

@@ -0,0 +1,416 @@
+package org.springblade.salesPart.order.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+import org.springblade.common.annotation.RepeatSubmit;
+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.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.PjOrderExportExcelXS;
+import org.springblade.salesPart.order.service.IOrderItemsService;
+import org.springblade.salesPart.order.service.IOrderService;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author :jixinyuan
+ * @date : 2024年5月6日09:11:09
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/returns")
+public class ReturnsController {
+
+	private final IOrderService orderService;
+	private final IOrderItemsService orderItemsService;
+	private final IUserClient iUserClient;
+
+
+	/**
+	 * 销售,采购退货详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入order")
+	public R<PjOrder> detail(PjOrder order) {
+		order.setTenantId(AuthUtil.getTenantId());
+		PjOrder detail = orderService.getDetailById(order);
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 配件销售,采购退货
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public R<IPage<PjOrder>> list(PjOrder order, Query query) {
+		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.getStorageId()), PjOrder::getStorageId, order.getStorageId())//仓库
+			.like(ObjectUtils.isNotEmpty(order.getStorageName()), PjOrder::getStorageName, order.getStorageName())
+			.eq(ObjectUtils.isNotEmpty(order.getCustomerId()), PjOrder::getCustomerId, order.getCustomerId())//客户
+			.eq(ObjectUtils.isNotEmpty(order.getGenerateTask()), PjOrder::getGenerateTask, order.getGenerateTask())//客户
+			.eq(ObjectUtils.isNotEmpty(order.getSalerId()), PjOrder::getSalerId, order.getSalerId())//业务员
+			.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.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) {//业务日期
+			lambdaQueryWrapper.ge(PjOrder::getBusinesDate, order.getBusinesDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getBusinesDate, order.getBusinesDateList().get(1));
+		}
+		if (order.getPaymentDateList() != null && order.getPaymentDateList().size() > 1) {//支付时间
+			lambdaQueryWrapper.ge(PjOrder::getPaymentDate, order.getPaymentDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getPaymentDate, order.getPaymentDateList().get(1));
+		}
+		if (ObjectUtils.isNotNull(order.getActualPaymentType())) {
+			lambdaQueryWrapper.eq(PjOrder::getActualPaymentStatus, order.getActualPaymentType());
+		} 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' )))");
+		lambdaQueryWrapper.orderByDesc(PjOrder::getCreateTime);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
+			if (AuthUtil.getUserRole().contains("业务员")) {
+				lambdaQueryWrapper.eq(PjOrder::getSalerId, AuthUtil.getUserId());
+			} else if (AuthUtil.getUserRole().contains("客户")) {
+				lambdaQueryWrapper.eq(PjOrder::getCreateUser, AuthUtil.getUserId());
+			}
+		}
+		IPage<PjOrder> pages = orderService.page(Condition.getPage(query), lambdaQueryWrapper);
+
+		StringBuilder updateUserIds = new StringBuilder();//修改人id拼接
+		StringBuilder createUserIds = new StringBuilder();//创建人id拼接
+		for (PjOrder items : pages.getRecords()) {
+			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.getRecords())) {
+			List<Long> ids = pages.getRecords().stream().map(PjOrder::getId).collect(Collectors.toList());
+			List<PjOrderItems> pjOrderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>().eq(PjOrderItems::getIsDeleted, 0)
+				.in(PjOrderItems::getPid, ids));
+			pages.getRecords().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) {
+						item.setUpdateUserName(user.getName());
+					}
+				}
+
+				if (ObjectUtil.isNotEmpty(createUserList)) {
+					User user = createUserList.stream().anyMatch(e -> e.getId().equals(item.getCreateUser())) ? createUserList.stream().filter(e -> e.getId().equals(item.getCreateUser())).findFirst().get() : null;
+					if (user != null) {
+						item.setCreateUserName(user.getName());
+					}
+				}
+				if (!pjOrderItemsList.isEmpty()) {
+					long count = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count();
+					item.setItem(count + "");
+				}
+			});
+		}
+
+		return R.data(pages);
+	}
+
+	/**
+	 * 订单(导出)
+	 */
+	@GetMapping("/listExport")
+	@ApiOperationSupport(order = 3)
+	@ApiOperation(value = "分页", notes = "传入order")
+	public void listExport(PjOrder order, HttpServletResponse response) {
+		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.getStorageId()), PjOrder::getStorageId, order.getStorageId())//仓库
+			.like(ObjectUtils.isNotEmpty(order.getStorageName()), PjOrder::getStorageName, order.getStorageName())
+			.eq(ObjectUtils.isNotEmpty(order.getCustomerId()), PjOrder::getCustomerId, order.getCustomerId())//客户
+			.eq(ObjectUtils.isNotEmpty(order.getGenerateTask()), PjOrder::getGenerateTask, order.getGenerateTask())//客户
+			.eq(ObjectUtils.isNotEmpty(order.getSalerId()), PjOrder::getSalerId, order.getSalerId())//业务员
+			.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) {//创建日期
+			lambdaQueryWrapper.ge(PjOrder::getDueDate, order.getDueDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getDueDate, order.getDueDateList().get(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));
+		}
+		if (order.getPaymentDateList() != null && order.getPaymentDateList().size() > 1) {//支付时间
+			lambdaQueryWrapper.ge(PjOrder::getPaymentDate, order.getPaymentDateList().get(0));
+			lambdaQueryWrapper.le(PjOrder::getPaymentDate, order.getPaymentDateList().get(1));
+		}
+		if (ObjectUtils.isNotNull(order.getActualPaymentType())) {
+			lambdaQueryWrapper.eq(PjOrder::getActualPaymentStatus, order.getActualPaymentType());
+		} else {
+			lambdaQueryWrapper.ne(ObjectUtils.isNotEmpty(order.getActualPaymentStatus()), PjOrder::getActualPaymentStatus, order.getActualPaymentStatus());//来源单号
+		}
+		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.orderByDesc(PjOrder::getCreateTime);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
+			if (AuthUtil.getUserRole().contains("业务员")) {
+				lambdaQueryWrapper.eq(PjOrder::getSalerId, AuthUtil.getUserId());
+			} else if (AuthUtil.getUserRole().contains("客户")) {
+				lambdaQueryWrapper.eq(PjOrder::getCreateUser, AuthUtil.getUserId());
+			}
+		}
+		List<PjOrder> pages = orderService.list(lambdaQueryWrapper);
+
+		StringBuilder updateUserIds = new StringBuilder();//修改人id拼接
+		StringBuilder createUserIds = new StringBuilder();//创建人id拼接
+		for (PjOrder items : pages) {
+			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 (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) {
+						item.setUpdateUserName(user.getName());
+					}
+				}
+
+				if (ObjectUtil.isNotEmpty(createUserList)) {
+					User user = createUserList.stream().anyMatch(e -> e.getId().equals(item.getCreateUser())) ? createUserList.stream().filter(e -> e.getId().equals(item.getCreateUser())).findFirst().get() : null;
+					if (user != null) {
+						item.setCreateUserName(user.getName());
+					}
+				}
+				/*item.setItem(orderItemsService.count(new LambdaQueryWrapper<PjOrderItems>().eq(PjOrderItems::getIsDeleted, 0)
+					.eq(PjOrderItems::getPid, item.getId())) + "");*/
+			});
+		}
+		List<PjOrderExportExcelXS> list = BeanUtil.copy(pages, PjOrderExportExcelXS.class);
+		for (PjOrderExportExcelXS item : list) {
+			if (1 == item.getActualPaymentStatus()) {
+				item.setPaymentStatus("待付款");
+			} else if (2 == item.getActualPaymentStatus()) {
+				item.setPaymentStatus("已付款");
+			} else if (3 == item.getActualPaymentStatus()) {
+				item.setPaymentStatus("尾款");
+			} else if (4 == item.getActualPaymentStatus()) {
+				item.setPaymentStatus("已退款");
+			} else {
+				item.setPaymentStatus("-");
+			}
+		}
+		if ("XS".equals(order.getBsType())) {
+			ExcelUtil.export(response, "销售订单", "订单数据", list, PjOrderExportExcelXS.class);
+		} else {
+			ExcelUtil.export(response, "采购订单", "订单数据", BeanUtil.copy(pages, PjOrderExportExcelCG.class), PjOrderExportExcelCG.class);
+		}
+
+	}
+
+	/**
+	 * 生成销售,采购退货单据
+	 */
+	@GetMapping("/generateReturns")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "生成入库任务", notes = "传入order")
+	@RepeatSubmit
+	public R generateReturns( PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return orderService.generateReturns(order);
+	}
+
+	/**
+	 * 配件销售,采购退货新增或修改
+	 */
+	@PostMapping("/submit")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入order")
+	@RepeatSubmit
+	public R submit(@Valid @RequestBody PjOrder order) {
+		if (StringUtils.isBlank(order.getBsType())) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		return orderService.submitReturns(order);
+	}
+
+
+	/**
+	 * 删除 配件销售,采购退货采购表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 7)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(orderService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 生成出库任务
+	 */
+	@PostMapping("/generateShipTaskReturns")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "生成出库任务", notes = "传入order")
+	@RepeatSubmit
+	public R generateShipTaskReturns(@Valid @RequestBody PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return orderService.generateShipTaskReturns(order);
+	}
+
+	/**
+	 * 撤销出库任务
+	 */
+	@PostMapping("/revokeGenerateShipTaskReturns")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "生成出库任务", notes = "传入order")
+	@RepeatSubmit
+	public R revokeGenerateShipTaskReturns(@Valid @RequestBody PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return orderService.revokeGenerateShipTaskReturns(order);
+	}
+
+	/**
+	 * 生成入库任务
+	 */
+	@PostMapping("/inboundTaskReturns")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "生成入库任务", notes = "传入order")
+	@RepeatSubmit
+	public R inboundTaskReturns(@Valid @RequestBody PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return orderService.inboundTaskReturns(order);
+	}
+
+	/**
+	 * 撤销入库任务
+	 */
+	@PostMapping("/revokeInboundTaskReturns")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "生成入库任务", notes = "传入order")
+	@RepeatSubmit
+	public R revokeInboundTaskReturns(@Valid @RequestBody PjOrder order) {
+		if (order.getId() == null) {
+			throw new RuntimeException("来源信息错误");
+		}
+		return orderService.revokeInboundTaskReturns(order);
+	}
+
+
+	/**
+	 * 销售退货请核
+	 */
+	@PostMapping("/checkOrderReturns")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "请核", notes = "传入order")
+	@RepeatSubmit
+	public R checkOrderReturns(@RequestBody PjOrder order) {
+		PjOrder declare = orderService.checkOrderReturns(order);
+		return R.data(declare);
+	}
+
+	/**
+	 * 销售退货撤销请核
+	 */
+	@PostMapping("/revokeCheckOrderReturns")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "撤销请核", notes = "传入order")
+	@RepeatSubmit
+	public R revokeCheckOrderReturns(@RequestBody PjOrder order) {
+		PjOrder declare = orderService.revokeCheckOrderReturns(order);
+		return R.data(declare);
+	}
+
+	/**
+	 * 采购退货请核
+	 */
+	@PostMapping("/checkOrderCGReturns")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "请核", notes = "传入order")
+	@RepeatSubmit
+	public R checkOrderCgReturns(@RequestBody PjOrder order) {
+		PjOrder declare = orderService.checkOrderCGReturns(order);
+		return R.data(declare);
+	}
+
+	/**
+	 * 采购退货撤销请核
+	 */
+	@PostMapping("/revokeCheckOrderCGReturns")
+	@ApiOperationSupport(order = 13)
+	@ApiOperation(value = "撤销请核", notes = "传入order")
+	@RepeatSubmit
+	public R revokeCheckOrderCgReturns(@RequestBody PjOrder order) {
+		PjOrder declare = orderService.revokeCheckOrderCGReturns(order);
+		return R.data(declare);
+	}
+
+}

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

@@ -50,6 +50,7 @@
         po.ord_no AS ordNo,
         po.freight AS freight,
         DATE_FORMAT(po.busines_date,'%Y-%m-%d') AS businesDate,
+        DATE_FORMAT(po.delivery_busines_date,'%Y-%m-%d') AS deliveryBusinesDate,
         CASE
         po.actual_payment_status
         WHEN '1' THEN
@@ -65,18 +66,80 @@
         poi.goods_name AS goodsName,
         poi.property_name AS propertyName,
         poi.pattern AS pattern,
+        CASE
+        po.bs_type
+        WHEN 'XS' THEN
+        IF
+        ( poi.goods_num, poi.goods_num, 0 )
+        WHEN 'CG' THEN
         IF
-        ( poi.goods_num, poi.goods_num, 0 )AS goodsNum,
+        ( poi.goods_num, poi.goods_num, 0 )
+        WHEN 'TKXS' THEN
+        0 -IF
+        ( poi.returns_number, poi.returns_number, 0 )
+        WHEN 'TKCG' THEN
+        0 -IF
+        ( poi.returns_number, poi.returns_number, 0 ) ELSE 0
+        END AS goodsNum,
         IF
         ( poi.price, poi.price, 0 ) AS price,
+        CASE
+        po.bs_type
+        WHEN 'XS' THEN
+        IF
+        ( poi.sub_total_money, poi.sub_total_money, 0 )
+        WHEN 'CG' THEN
+        IF
+        ( poi.sub_total_money, poi.sub_total_money, 0 )
+        WHEN 'TKXS' THEN
+        0 - IF
+        ( poi.returns_amount, poi.returns_amount, 0 )
+        WHEN 'TKCG' THEN
+        0 - IF
+        ( poi.returns_amount, poi.returns_amount, 0 ) ELSE 0
+        END AS subTotalMoney,
+        CASE
+        po.bs_type
+        WHEN 'XS' THEN
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'CG' THEN
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'TKXS' THEN
+        0 -
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'TKCG' THEN
+        0 -
+        IF
+        ( poi.costprie, poi.costprie, 0 ) ELSE 0
+        END AS costprie,
+        CASE
+        po.bs_type
+        WHEN 'XS' THEN
+        IF
+        ( poi.sub_total_money, poi.sub_total_money, 0 ) -
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'CG' THEN
+        IF
+        ( poi.sub_total_money, poi.sub_total_money, 0 ) -
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'TKXS' THEN
+        0 - (
         IF
-        ( poi.sub_total_money, poi.sub_total_money, 0 ) AS subTotalMoney,
+        ( poi.sub_total_money, poi.sub_total_money, 0 ) -
         IF
-        ( poi.costprie, poi.costprie, 0 ) AS costprie,
+        ( poi.costprie, poi.costprie, 0 ))
+        WHEN 'TKCG' THEN
+        0 - (
         IF
-        ( poi.sub_total_money, poi.sub_total_money, 0 )-
+        ( poi.sub_total_money, poi.sub_total_money, 0 ) -
         IF
-        ( poi.costprie, poi.costprie, 0 ) AS profit,
+        ( poi.costprie, poi.costprie, 0 )) ELSE 0
+        END AS profit,
         po.`status` AS status
         FROM
         `pjpf_order_items` poi
@@ -86,10 +149,10 @@
         WHERE
         poi.is_deleted = '0'
         AND po.is_deleted = '0'
-        AND po.bs_type = 'XS'
+        AND find_in_set(po.bs_type,#{saleDetailDto.bsType})
         AND poi.tenant_id = #{saleDetailDto.tenantId}
         AND po.tenant_id = #{saleDetailDto.tenantId}
-        <if test="saleDetailDto.salesCompanyId !=null and saleDetailDto.salesCompanyId != ''">
+          <if test="saleDetailDto.salesCompanyId !=null and saleDetailDto.salesCompanyId != ''">
             and find_in_set(po.sales_company_id,#{saleDetailDto.salesCompanyId})
         </if>
         <if test="saleDetailDto.customerName !=null and saleDetailDto.customerName != ''">
@@ -114,10 +177,10 @@
             and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;= #{saleDetailDto.businesDateEnd}
         </if>
         <if test="saleDetailDto.isContain !=null and saleDetailDto.isContain !=''">
-            and FIND_IN_SET(po.`status`,'待确认,待发货,已发货,退款请核,已取消,已退款,售后中,已收货')
+            and FIND_IN_SET(po.`status`,'待确认,待发货,已发货,退款请核,已取消,已退款,售后中,已收货,已完成')
         </if>
         <if test="saleDetailDto.isContain ==null or saleDetailDto.isContain ==''">
-            and FIND_IN_SET(po.`status`,'已发货,退款请核,已取消,已退款,售后中,已收货')
+            and FIND_IN_SET(po.`status`,'已发货,退款请核,已取消,已退款,售后中,已收货,已完成')
         </if>
         ORDER BY
         po.busines_date desc,
@@ -132,6 +195,7 @@
         po.ord_no AS ordNo,
         po.freight AS freight,
         DATE_FORMAT(po.busines_date,'%Y-%m-%d') AS businesDate,
+        DATE_FORMAT(po.delivery_busines_date,'%Y-%m-%d') AS deliveryBusinesDate,
         CASE
         po.actual_payment_status
         WHEN '1' THEN
@@ -148,18 +212,80 @@
         poi.goods_id AS goodsId,
         poi.property_name AS propertyName,
         poi.pattern AS pattern,
+        CASE
+        po.bs_type
+        WHEN 'XS' THEN
+        IF
+        ( poi.goods_num, poi.goods_num, 0 )
+        WHEN 'CG' THEN
         IF
-        ( poi.goods_num, poi.goods_num, 0 )AS goodsNum,
+        ( poi.goods_num, poi.goods_num, 0 )
+        WHEN 'TKXS' THEN
+        0 -IF
+        ( poi.returns_number, poi.returns_number, 0 )
+        WHEN 'TKCG' THEN
+        0 -IF
+        ( poi.returns_number, poi.returns_number, 0 ) ELSE 0
+        END AS goodsNum,
         IF
         ( poi.price, poi.price, 0 ) AS price,
+        CASE
+        po.bs_type
+        WHEN 'XS' THEN
+        IF
+        ( poi.sub_total_money, poi.sub_total_money, 0 )
+        WHEN 'CG' THEN
+        IF
+        ( poi.sub_total_money, poi.sub_total_money, 0 )
+        WHEN 'TKXS' THEN
+        0 - IF
+        ( poi.returns_amount, poi.returns_amount, 0 )
+        WHEN 'TKCG' THEN
+        0 - IF
+        ( poi.returns_amount, poi.returns_amount, 0 ) ELSE 0
+        END AS subTotalMoney,
+        CASE
+        po.bs_type
+        WHEN 'XS' THEN
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'CG' THEN
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'TKXS' THEN
+        0 -
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'TKCG' THEN
+        0 -
+        IF
+        ( poi.costprie, poi.costprie, 0 ) ELSE 0
+        END AS costprie,
+        CASE
+        po.bs_type
+        WHEN 'XS' THEN
+        IF
+        ( poi.sub_total_money, poi.sub_total_money, 0 ) -
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'CG' THEN
+        IF
+        ( poi.sub_total_money, poi.sub_total_money, 0 ) -
+        IF
+        ( poi.costprie, poi.costprie, 0 )
+        WHEN 'TKXS' THEN
+        0 - (
         IF
-        ( poi.sub_total_money, poi.sub_total_money, 0 ) AS subTotalMoney,
+        ( poi.sub_total_money, poi.sub_total_money, 0 ) -
         IF
-        ( poi.costprie, poi.costprie, 0 ) AS costprie,
+        ( poi.costprie, poi.costprie, 0 ))
+        WHEN 'TKCG' THEN
+        0 - (
         IF
-        ( poi.sub_total_money, poi.sub_total_money, 0 )-
+        ( poi.sub_total_money, poi.sub_total_money, 0 ) -
         IF
-        ( poi.costprie, poi.costprie, 0 ) AS profit,
+        ( poi.costprie, poi.costprie, 0 )) ELSE 0
+        END AS profit,
         po.`status` AS status
         FROM
         `pjpf_order_items` poi
@@ -169,7 +295,7 @@
         WHERE
         poi.is_deleted = '0'
         AND po.is_deleted = '0'
-        AND po.bs_type = 'XS'
+        AND find_in_set(po.bs_type,#{bsType})
         AND poi.tenant_id = #{tenantId}
         AND po.tenant_id = #{tenantId}
         <if test="salesCompanyId !=null and salesCompanyId != ''">
@@ -197,10 +323,10 @@
             and DATE_FORMAT(po.busines_date,'%Y-%m-%d') &lt;= #{businesDateEnd}
         </if>
         <if test="isContain !=null and isContain !=''">
-            and FIND_IN_SET(po.`status`,'待确认,待发货,已发货,退款请核,已取消,已退款,售后中,已收货')
+            and FIND_IN_SET(po.`status`,'待确认,待发货,已发货,退款请核,已取消,已退款,售后中,已收货,已完成')
         </if>
         <if test="isContain ==null or isContain ==''">
-            and FIND_IN_SET(po.`status`,'已发货,退款请核,已取消,已退款,售后中,已收货')
+            and FIND_IN_SET(po.`status`,'已发货,退款请核,已取消,已退款,售后中,已收货,已完成')
         </if>
         ORDER BY
         po.busines_date

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

@@ -0,0 +1,42 @@
+/*
+ *      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.order.mapper;
+
+import org.springblade.salesPart.entity.OrderRecord;
+import org.springblade.salesPart.vo.OrderRecordVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import java.util.List;
+
+/**
+ * 交易记录表 Mapper 接口
+ *
+ * @author BladeX
+ * @since 2024-05-06
+ */
+public interface OrderRecordMapper extends BaseMapper<OrderRecord> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param orderRecord
+	 * @return
+	 */
+	List<OrderRecordVO> selectOrderRecordPage(IPage page, OrderRecordVO orderRecord);
+
+}

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

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.springblade.salesPart.order.mapper.OrderRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="orderRecordResultMap" type="org.springblade.salesPart.entity.OrderRecord">
+        <id column="id" property="id"/>
+        <result column="pid" property="pid"/>
+        <result column="create_user" property="createUser"/>
+        <result column="create_dept" property="createDept"/>
+        <result column="create_time" property="createTime"/>
+        <result column="update_user" property="updateUser"/>
+        <result column="update_time" property="updateTime"/>
+        <result column="is_deleted" property="isDeleted"/>
+        <result column="remarks" property="remarks"/>
+        <result column="status" property="status"/>
+        <result column="bs_type" property="bsType"/>
+    </resultMap>
+
+
+    <select id="selectOrderRecordPage" resultMap="orderRecordResultMap">
+        select * from pjpf_order_record where is_deleted = 0
+    </select>
+
+</mapper>

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

@@ -0,0 +1,41 @@
+/*
+ *      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.order.service;
+
+import org.springblade.salesPart.entity.OrderRecord;
+import org.springblade.salesPart.vo.OrderRecordVO;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 交易记录表 服务类
+ *
+ * @author BladeX
+ * @since 2024-05-06
+ */
+public interface IOrderRecordService extends IService<OrderRecord> {
+
+	/**
+	 * 自定义分页
+	 *
+	 * @param page
+	 * @param orderRecord
+	 * @return
+	 */
+	IPage<OrderRecordVO> selectOrderRecordPage(IPage<OrderRecordVO> page, OrderRecordVO orderRecord);
+
+}

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

@@ -191,4 +191,26 @@ public interface IOrderService extends IService<PjOrder> {
 	Map<String, Object> sizeSalesVolumeProportionGetOne(String statusDate, String endDate, String deptId, String tenantId, String goodsSize);
 
 	int coreCorp(String tenantId, String bsType, String deptId);
+
+	PjOrder getDetailById(PjOrder order);
+
+	R submitReturns(PjOrder order);
+
+	R generateShipTaskReturns(PjOrder order);
+
+	R revokeGenerateShipTaskReturns(PjOrder order);
+
+	R inboundTaskReturns(PjOrder order);
+
+	R revokeInboundTaskReturns(PjOrder order);
+
+	PjOrder checkOrderReturns(PjOrder order);
+
+	PjOrder revokeCheckOrderReturns(PjOrder order);
+
+	PjOrder checkOrderCGReturns(PjOrder order);
+
+	PjOrder revokeCheckOrderCGReturns(PjOrder order);
+
+	R generateReturns(PjOrder order);
 }

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

@@ -0,0 +1,41 @@
+/*
+ *      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.order.service.impl;
+
+import org.springblade.salesPart.entity.OrderRecord;
+import org.springblade.salesPart.vo.OrderRecordVO;
+import org.springblade.salesPart.order.mapper.OrderRecordMapper;
+import org.springblade.salesPart.order.service.IOrderRecordService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+/**
+ * 交易记录表 服务实现类
+ *
+ * @author BladeX
+ * @since 2024-05-06
+ */
+@Service
+public class OrderRecordServiceImpl extends ServiceImpl<OrderRecordMapper, OrderRecord> implements IOrderRecordService {
+
+	@Override
+	public IPage<OrderRecordVO> selectOrderRecordPage(IPage<OrderRecordVO> page, OrderRecordVO orderRecord) {
+		return page.setRecords(baseMapper.selectOrderRecordPage(page, orderRecord));
+	}
+
+}

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1006 - 1
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/ship/controller/ShipItemsController.java

@@ -117,7 +117,7 @@ public class ShipItemsController extends BladeController {
 	/**
 	 * 删除
 	 */
-	@PostMapping("/remove")
+	@GetMapping("/remove")
 	@ApiOperationSupport(order = 8)
 	@ApiOperation(value = "删除", notes = "传入ids")
 	public R remove(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {

+ 302 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/controller/ShipReturnsController.java

@@ -0,0 +1,302 @@
+/*
+ *      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.ship.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiParam;
+import lombok.AllArgsConstructor;
+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.Func;
+import org.springblade.core.tool.utils.ObjectUtil;
+import org.springblade.salesPart.entity.PjOrderItems;
+import org.springblade.salesPart.entity.PjShip;
+import org.springblade.salesPart.entity.PjShipItems;
+import org.springblade.salesPart.enums.OrderTypeEnum;
+import org.springblade.salesPart.excel.PjShipStockDetails;
+import org.springblade.salesPart.excel.ShipItemImportCodeExcel;
+import org.springblade.salesPart.excel.ShipItemImportExcel;
+import org.springblade.salesPart.ship.service.IShipItemsService;
+import org.springblade.salesPart.ship.service.IShipService;
+import org.springblade.salesPart.vo.ShipVO;
+import org.springblade.system.user.entity.User;
+import org.springblade.system.user.feign.IUserClient;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 配件收发货表 控制器
+ *
+ * @author BladeX
+ * @since 2023-04-21
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/shipReturns")
+@Api(value = "配件收发货表", tags = "配件收发货表接口")
+public class ShipReturnsController extends BladeController {
+
+	private final IShipService shipService;
+	private final IShipItemsService shipItemsService;
+	private final IUserClient userClient;
+
+	/**
+	 * 详情
+	 */
+	@GetMapping("/detail")
+	@ApiOperationSupport(order = 1)
+	@ApiOperation(value = "详情", notes = "传入ship")
+	public R<PjShip> detailReturns(PjShip ship) {
+		ship.setTenantId(AuthUtil.getTenantId());
+		PjShip detail = shipService.getMessageById(ship);
+		return R.data(detail);
+	}
+
+	/**
+	 * 分页 配件收发货表
+	 */
+	@GetMapping("/list")
+	@ApiOperationSupport(order = 2)
+	@ApiOperation(value = "分页", notes = "传入ship")
+	public R<IPage<PjShip>> list(PjShip ship, Query query) {
+		if (ObjectUtil.isEmpty(ship.getBizTypeName())) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		LambdaQueryWrapper<PjShip> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		lambdaQueryWrapper.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShip::getIsDeleted, 0)
+			.eq(PjShip::getSalesCompanyId, AuthUtil.getDeptId())//公司
+			.like(ObjectUtil.isNotEmpty(ship.getOrdNo()), PjShip::getOrdNo, ship.getOrdNo())//销售订单
+			.like(ObjectUtil.isNotEmpty(ship.getBillno()), PjShip::getBillno, ship.getBillno())//销售订单
+			.like(ObjectUtil.isNotEmpty(ship.getSrcOrdNo()), PjShip::getSrcOrdNo, ship.getSrcOrdNo())//销售订单
+			.eq(ObjectUtil.isNotEmpty(ship.getStorageId()), PjShip::getStorageId, ship.getStorageId())//仓库
+			.like(ObjectUtil.isNotEmpty(ship.getStorageName()), PjShip::getStorageName, ship.getStorageName())
+			.eq(ObjectUtil.isNotEmpty(ship.getCustomerId()), PjShip::getCustomerId, ship.getCustomerId())//客户
+			.eq(ObjectUtil.isNotEmpty(ship.getSourceCompanyId()), PjShip::getSourceCompanyId, ship.getSourceCompanyId())//来源公司
+			.eq(ObjectUtil.isNotEmpty(ship.getStatusName()), PjShip::getStatusName, ship.getStatusName())//状态
+			.eq(ObjectUtil.isNotEmpty(ship.getStockClerkName()), PjShip::getStockClerkName, ship.getStockClerkName())//库管
+			.eq(ObjectUtil.isNotEmpty(ship.getStockClerkId()), PjShip::getStockClerkId, ship.getStockClerkId())//库管
+			.eq(ObjectUtil.isNotEmpty(ship.getBsType()), PjShip::getBsType, ship.getBsType())//库管
+			.like(ObjectUtil.isNotEmpty(ship.getCustomerName()), PjShip::getCustomerName, ship.getCustomerName())
+			//单据类型
+			.apply(ObjectUtil.isNotEmpty(ship.getBizTypeName()), "find_in_set(biz_type_name,'" + ship.getBizTypeName() + "')");
+
+		if (ship.getBusinesDateList() != null && ship.getBusinesDateList().size() > 1) {//业务日期
+			lambdaQueryWrapper.ge(PjShip::getBusinesDate, ship.getBusinesDateList().get(0));
+			lambdaQueryWrapper.le(PjShip::getBusinesDate, ship.getBusinesDateList().get(1));
+		}
+		lambdaQueryWrapper.orderByDesc(PjShip::getCreateTime);
+		if (!AuthUtil.getUserRole().contains("admin") && !AuthUtil.getUserRole().contains("老板")) {
+			if (AuthUtil.getUserRole().contains("库管")) {
+				lambdaQueryWrapper.and(i -> i.eq(PjShip::getStockClerkId, AuthUtil.getUserId()).or().isNull(PjShip::getStockClerkId));
+			} else if (AuthUtil.getUserRole().contains("客户")) {
+				lambdaQueryWrapper.eq(PjShip::getCustomerId, AuthUtil.getUserId());
+			}
+		}
+		IPage<PjShip> pages = shipService.page(Condition.getPage(query), lambdaQueryWrapper);
+
+		StringBuilder updateUserIds = new StringBuilder();//修改人id拼接
+		StringBuilder createUserIds = new StringBuilder();//创建人id拼接
+		for (PjShip items : pages.getRecords()) {
+			if (ObjectUtil.isNotEmpty(items.getUpdateUser())) {
+				updateUserIds.append(items.getUpdateUser()).append(",");
+			}
+			if (ObjectUtil.isNotEmpty(items.getCreateUser())) {
+				createUserIds.append(items.getCreateUser()).append(",");
+			}
+		}
+
+		//获得修改人信息
+		List<User> updateUserList = userClient.selectUserIds(updateUserIds.toString());
+		//获得创建人信息
+		List<User> createUserList = userClient.selectUserIds(createUserIds.toString());
+
+		if (CollectionUtils.isNotEmpty(pages.getRecords())) {
+			List<Long> ids = pages.getRecords().stream().map(PjShip::getId).collect(Collectors.toList());
+			List<PjShipItems> pjOrderItemsList = shipItemsService.list(new LambdaQueryWrapper<PjShipItems>().eq(PjShipItems::getIsDeleted, 0)
+				.in(PjShipItems::getPid, ids));
+			pages.getRecords().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) {
+						item.setUpdateUserName(user.getName());
+					}
+				}
+
+				if (ObjectUtil.isNotEmpty(createUserList)) {
+					User user = createUserList.stream().anyMatch(e -> e.getId().equals(item.getCreateUser())) ? createUserList.stream().filter(e -> e.getId().equals(item.getCreateUser())).findFirst().get() : null;
+					if (user != null) {
+						item.setCreateUserName(user.getName());
+					}
+				}
+				if (!pjOrderItemsList.isEmpty()) {
+					item.setItem(pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getId())).count() + "");
+				}
+			});
+		}
+
+		return R.data(pages);
+	}
+
+	/**
+	 * 修改 配件收发货表
+	 */
+	@PostMapping("/updateReturns")
+	@ApiOperationSupport(order = 5)
+	@ApiOperation(value = "修改", notes = "传入ship")
+	public R updateReturns(@RequestBody PjShip ship) {
+		PjShip pjShip = shipService.getById(ship.getId());
+
+		//发货任务删除判断
+		if (pjShip.getBizTypeName().equals(OrderTypeEnum.TKFHRW.getType())) {
+			if (OrderTypeEnum.DISPATCHED.getType().equals(pjShip.getStatusName())) {
+				throw new RuntimeException("出库任务已生成工单无法删除");
+			}
+		}
+
+		//入库任务删除判断
+		if (pjShip.getBizTypeName().equals(OrderTypeEnum.THSHRW.getType())) {
+			if (OrderTypeEnum.DISPATCHED.getType().equals(pjShip.getStatusName())) {
+				throw new RuntimeException("出库任务已生成工单无法删除");
+			}
+		}
+
+		pjShip.setIsDeleted(1);
+		shipService.updateById(pjShip);
+		return R.success("操作成功");
+	}
+
+	/**
+	 * 新增或修改 配件收发货表
+	 */
+	@PostMapping("/submitReturns")
+	@ApiOperationSupport(order = 6)
+	@ApiOperation(value = "新增或修改", notes = "传入ship")
+	public R submitReturns(@Valid @RequestBody PjShip ship) {
+		if (ObjectUtil.isEmpty(ship.getBizTypeName())) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		return shipService.submitReturns(ship);
+	}
+
+	/**
+	 * 删除 配件收发货表
+	 */
+	@PostMapping("/remove")
+	@ApiOperationSupport(order = 8)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R removeReturns(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		return R.status(shipService.removeByIds(Func.toLongList(ids)));
+	}
+
+	/**
+	 * 生成出库工单
+	 */
+	@PostMapping("/outboundWorkOrderReturns")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R outboundWorkOrderReturns(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		if (ObjectUtil.isEmpty(ids)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		return shipService.outboundWorkOrderReturns(ids);
+	}
+
+	/**
+	 * 出库完成
+	 */
+	@PostMapping("/outboundCompletedReturns")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "出库完成", notes = "传入ship")
+	public R outboundCompletedReturns(@Valid @RequestBody PjShip ship) {
+		return shipService.outboundCompletedReturns(ship);
+	}
+
+	/**
+	 * 撤销出库
+	 */
+	@PostMapping("/revokeOutboundCompletedReturns")
+	@ApiOperationSupport(order = 10)
+	@ApiOperation(value = "出库完成", notes = "传入ship")
+	public R revokeOutboundCompletedReturns(@Valid @RequestBody PjShip ship) {
+		return shipService.revokeOutboundCompletedReturns(ship);
+	}
+
+	/**
+	 * 生成入库工单
+	 */
+	@PostMapping("/generateWarehousingReturns")
+	@ApiOperationSupport(order = 11)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R generateWarehousingReturns(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		if (ObjectUtil.isEmpty(ids)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		return shipService.generateWarehousingReturns(ids);
+	}
+
+	/**
+	 * 入库完成
+	 */
+	@PostMapping("/warehousingCompleteReturns")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "入库完成", notes = "传入ship")
+	public R warehousingCompleteReturns(@Valid @RequestBody PjShip ship) {
+		return shipService.warehousingCompleteReturns(ship);
+	}
+
+	/**
+	 * 撤销入库
+	 */
+	@PostMapping("/revokeWarehousingReturns")
+	@ApiOperationSupport(order = 12)
+	@ApiOperation(value = "撤销入库", notes = "传入ship")
+	public R revokeWarehousingReturns(@Valid @RequestBody PjShip ship) {
+		return shipService.revokeWarehousingReturns(ship);
+	}
+
+	/**
+	 * 撤销入出库工单
+	 */
+	@PostMapping("/revokeWorkOrderReturns")
+	@ApiOperationSupport(order = 9)
+	@ApiOperation(value = "删除", notes = "传入ids")
+	public R revokeWorkOrderReturns(@ApiParam(value = "主键集合", required = true) @RequestParam String ids) {
+		if (ObjectUtil.isEmpty(ids)) {
+			throw new RuntimeException("缺少必要参数");
+		}
+		return shipService.revokeWorkOrderReturns(ids);
+	}
+
+}

+ 14 - 3
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/mapper/ShipMapper.xml

@@ -64,14 +64,21 @@
         WHEN 'SHGD' THEN
         '入库'
         WHEN 'TKSHGD' THEN
-        '入库'
+        '退款入库'
         WHEN 'DBGD' THEN
         '调拨'
+        WHEN 'THSHGD' THEN
+        '退货入库'
+        WHEN 'TKFHGD' THEN
+        '退货出库'
         END AS bizTypeName,
         CASE
         ps.biz_type_name
         WHEN 'FHGD' THEN
         IF
+        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 )
+        WHEN 'TKFHGD' THEN
+        IF
         ( SUM( psi.send_num ), SUM( psi.send_num ), 0 ) ELSE 0
         END AS SubSendTotalNum,
         CASE
@@ -87,7 +94,11 @@
         ( SUM( psi.send_num ), SUM( psi.send_num ), 0 )
         WHEN 'TKSHGD' THEN
         IF
-        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 ) ELSE 0
+        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 )
+        WHEN 'THSHGD' THEN
+        IF
+        ( SUM( psi.send_num ), SUM( psi.send_num ), 0 )
+        ELSE 0
         END AS addSendTotalNum
         FROM
         pjpf_ship_items psi
@@ -96,7 +107,7 @@
         WHERE
         ps.is_deleted = '0'
         and psi.is_deleted = '0'
-        AND FIND_IN_SET( ps.biz_type_name, 'FHGD,SHGD,TKSHGD,DBGD' )
+        AND FIND_IN_SET( ps.biz_type_name, 'FHGD,SHGD,TKSHGD,DBGD,THSHGD,TKFHGD' )
         AND ps.tenant_id = #{order.tenantId}
         AND FIND_IN_SET( ps.status_name, '已入库,已出库,确认调拨' )
         <if test="order.dot!=null and order.dot!=''">

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

@@ -163,4 +163,20 @@ public interface IShipService extends IService<PjShip> {
 	List<PjShipStockDetails> stockDataDetailsOrder(PjShipStockDetails pjShipStockDetails);
 
 	R<List<PjOrderItems>> importItemCode(List<ShipItemImportCodeExcel> excelList);
+
+	R outboundWorkOrderReturns(String ids);
+
+	R outboundCompletedReturns(PjShip ship);
+
+	R revokeOutboundCompletedReturns(PjShip ship);
+
+	R generateWarehousingReturns(String ids);
+
+	R warehousingCompleteReturns(PjShip ship);
+
+	R revokeWarehousingReturns(PjShip ship);
+
+	R revokeWorkOrderReturns(String ids);
+
+	R submitReturns(PjShip ship);
 }

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

@@ -45,12 +45,14 @@ import org.springblade.salesPart.goods.mapper.GoodsTypeMapper;
 import org.springblade.salesPart.history.mapper.HistoryMapper;
 import org.springblade.salesPart.order.mapper.OrderMapper;
 import org.springblade.salesPart.order.service.IOrderItemsService;
+import org.springblade.salesPart.order.service.IOrderRecordService;
 import org.springblade.salesPart.productLaunch.service.IProductLaunchService;
 import org.springblade.salesPart.ship.mapper.ShipMapper;
 import org.springblade.salesPart.ship.service.IShipItemsService;
 import org.springblade.salesPart.ship.service.IShipService;
 import org.springblade.salesPart.stock.service.IStockDescService;
 import org.springblade.salesPart.storage.mapper.StorageDescMapper;
+import org.springblade.salesPart.vo.OrderRecordVO;
 import org.springblade.salesPart.vo.ShipVO;
 import org.springblade.system.entity.Dept;
 import org.springblade.system.feign.ISysClient;
@@ -91,6 +93,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 	 */
 	private final ISerialClient serialClient;
 	private final IOrderItemsService orderItemsService;
+	private final IOrderRecordService orderRecordService;
 	private final IShipItemsService shipItemsService;
 	private final OrderMapper orderMapper;
 	private final ISysClient sysClient;
@@ -690,6 +693,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			if (goodsNum.compareTo(sendNum) == 0) {//数量等于发货数量修改销售订单状态
 				order.setStatus(OrderTypeEnum.SHIPED.getType());
 				order.setXcxStatus(OrderTypeEnum.GOODSRECEIVED.getType());
+				order.setDeliveryBusinesDate(new Date());
 				orderMapper.updateById(order);
 			} else {
 				order.setStorageId(ship.getStorageId());
@@ -820,6 +824,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			}
 			order.setStatus(OrderTypeEnum.XSDFH.getType());
 			order.setXcxStatus(OrderTypeEnum.XSDFH.getType());
+			order.setDeliveryBusinesDate(null);
 			orderMapper.updateById(order);
 		} else {
 			throw new RuntimeException("数据异常请联系管理员");
@@ -1152,10 +1157,6 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					stockDesc.setVersion(stockOne.getVersion());
 					pjStockDescArrayListUpdate.add(stockDesc);
 				}
-				/*boolean count = iStockDescService.saveOrUpdate(stockDesc);
-				if (!count) {
-					throw new RuntimeException(stockOne.getCname() + "该产品库存正在操作,请稍后刷新在进行操作!");
-				}*/
 			}
 			if (msg1.length() > 0) {
 				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
@@ -1183,29 +1184,18 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				if (ObjectUtil.isEmpty(goodsDesc)) {
 					throw new RuntimeException("商品数据异常");
 				}
-				/* ----------------------修改上架库存---------------------- */
-			/*	List<PjStockDesc> stockDescList = pjStockDescList.stream().filter(e -> e.getGoodsId().equals(goodsDesc.getId())).collect(Collectors.toList());
-
-				//库存总数量
-				BigDecimal balanceQuantity = stockDescList.stream().map(PjStockDesc::getBalanceQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
-				balanceQuantity = balanceQuantity.add(item.getSendNum());
 
-				List<PjProductLaunch> pjProductLaunches = productLaunch.stream().filter(e -> e.getGoodsId().equals(goodsDesc.getId())).collect(Collectors.toList());
-				//修改上架数量
-				if (!pjProductLaunches.isEmpty()) {
-					for (PjProductLaunch e : pjProductLaunches) {
-						e.setInventory(balanceQuantity);
-						pjProductLaunchList.add(e);
-					}
-				}*/
 				PjProductLaunch pjProductLaunches = productLaunch.stream()
 					.filter(i -> i.getGoodsId().equals(goodsDesc.getId())).findFirst().orElse(null);
 				//修改上架数量
 				if (pjProductLaunches != null) {
-					pjProductLaunches.setInventory(pjProductLaunches.getInventory().add(item.getSendNum()));
+					if (ObjectUtils.isNotNull(pjProductLaunches.getInventory())){
+						pjProductLaunches.setInventory(pjProductLaunches.getInventory().add(item.getSendNum()));
+					}else{
+						pjProductLaunches.setInventory(item.getSendNum());
+					}
 					pjProductLaunchList.add(pjProductLaunches);
 				}
-				/* ----------------------修改上架库存---------------------- */
 			}
 			R res = productLaunchService.updateBatchById(pjProductLaunchList);
 			if (!res.isSuccess()) {
@@ -1252,6 +1242,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			if (goodsNum.compareTo(sendNum) == 0) {//数量等于发货数量修改销售订单状态
 				order.setStatus(OrderTypeEnum.RECEIVEDGOODS.getType());
 				order.setXcxStatus(OrderTypeEnum.RECEIVEDGOODS.getType());
+				order.setDeliveryBusinesDate(new Date());
 				orderMapper.updateById(order);
 			} else {
 				order.setStorageId(ship.getStorageId());
@@ -1621,6 +1612,7 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		if (ObjectUtil.isNotEmpty(order)) {
 			order.setStatus(OrderTypeEnum.GOODSRECEIVED.getType());
 			order.setXcxStatus(OrderTypeEnum.GOODSRECEIVED.getType());
+			order.setDeliveryBusinesDate(null);
 			orderMapper.updateById(order);
 		} else {
 			throw new RuntimeException("数据异常请联系管理员");
@@ -1992,4 +1984,1263 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 		return R.data(list);
 	}
 
+	@Override
+	public R outboundWorkOrderReturns(String ids) {
+		List<Long> shipIds = Func.toLongList(ids);
+		List<PjShip> pjShipList = baseMapper.selectList(new LambdaQueryWrapper<PjShip>()
+			.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShip::getIsDeleted, 0)
+			.apply("find_in_set(id,'" + ids + "')"));
+		List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+		List<PjShip> pjShips = new ArrayList<>();
+		if (!pjShipList.isEmpty()) {
+			List<Long> ordIds = pjShipList.stream().map(PjShip::getOrdId).filter(Objects::nonNull).collect(Collectors.toList());
+			pjOrderItemsList = orderItemsService.list(new QueryWrapper<PjOrderItems>()
+				.in("pid", ordIds)
+				.eq("is_deleted", 0)
+				.apply("goods_num != send_num")
+				.eq("tenant_id", AuthUtil.getTenantId()));
+		}
+		List<OrderRecord> orderRecordList = new ArrayList<>();
+		for (Long id : shipIds) {
+			//获得出库任务数据
+			PjShip rwShip = pjShipList.stream().filter(e -> e.getId().equals(id)).findFirst().orElse(null);
+			if (rwShip == null) {
+				throw new RuntimeException("数据异常 请联系管理员");
+			}
+
+			//新建出库工单
+			PjShip gdShip = new PjShip();
+			// 获取系统编号
+			R billNo = serialClient.getBillNo(OrderTypeEnum.THSHGD.getType(), OrderTypeEnum.THSHGD.getType(), OrderTypeEnum.THSHGD.getType());
+			if (billNo.getCode() != 200) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				return R.fail(500, "生成系统编号失败");
+			}
+			BeanUtil.copyProperties(rwShip, gdShip);
+
+			gdShip.setId(null);
+			gdShip.setBillno((String) billNo.getData());
+			gdShip.setStatusName(OrderTypeEnum.TREATWAREHOUSING.getType());
+			gdShip.setTenantId(AuthUtil.getTenantId());
+			gdShip.setBizTypeName(OrderTypeEnum.THSHGD.getType());
+			gdShip.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			gdShip.setCreateUser(AuthUtil.getUserId());
+			gdShip.setCreateTime(new Date());
+			gdShip.setTaskId(rwShip.getId());
+			gdShip.setSendTotalNum(new BigDecimal("0.00"));
+			pjShips.add(gdShip);
+
+			OrderRecord orderRecord = new OrderRecordVO();
+			orderRecord.setCreateTime(new Date());
+			orderRecord.setCreateUser(AuthUtil.getUserId());
+			orderRecord.setCreateUserName(AuthUtil.getUserName());
+			orderRecord.setTenantId(AuthUtil.getTenantId());
+			orderRecord.setPid(rwShip.getOrdId());
+			orderRecord.setSrcNo(gdShip.getBillno());
+			orderRecord.setBsType(gdShip.getBizTypeName());
+			orderRecord.setStatus(gdShip.getStatusName());
+			orderRecordList.add(orderRecord);
+		}
+		orderRecordService.saveBatch(orderRecordList);
+		this.saveOrUpdateBatch(pjShips);
+		List<PjShipItems> shipItemsList = new ArrayList<>();
+		List<PjShip> rwShipList = new ArrayList<>();
+		for (PjShip item : pjShips) {
+			//获得出库任务数据
+			PjShip rwShip = pjShipList.stream().filter(e -> e.getId().equals(item.getTaskId())).findFirst().orElse(null);
+			if (rwShip == null) {
+				throw new RuntimeException("数据异常 请联系管理员");
+			}
+			StringBuilder goodsNames = new StringBuilder();
+
+			//根据销售id获得销售明细数据
+			List<PjOrderItems> list = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getOrdId())).collect(Collectors.toList());
+			if (ObjectUtil.isNotEmpty(list)) {
+				for (PjOrderItems e : list) {
+					goodsNames.append(e.getGoodsName()).append(",");
+					//根据销售明细创建出库工单明细
+					PjShipItems shipItems = new PjShipItems();
+					BeanUtil.copyProperties(e, shipItems);
+
+					shipItems.setId(null);
+					shipItems.setPid(item.getId());
+					shipItems.setSrcItemId(e.getId());
+					shipItems.setCreateTime(new Date());
+					shipItems.setCreateUser(AuthUtil.getUserId());
+					shipItems.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					shipItems.setSendNum(e.getReturnsNumber().subtract(e.getSendNum()));
+					if (e.getGoodsNum().compareTo(e.getSendNum()) != 0) {
+						shipItemsList.add(shipItems);
+					}
+				}
+				item.setNumberRows(list.size());
+			}
+
+			//修改出库任务状态
+			rwShip.setStatusName(OrderTypeEnum.DISPATCHED.getType());
+			rwShipList.add(rwShip);
+
+			//生成出库工单历史记录
+			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("发送消息失败");
+				}
+			} 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("发送消息失败");
+							}
+						}
+					}
+				}
+			}
+		}
+		this.saveOrUpdateBatch(rwShipList);
+		shipItemsService.saveOrUpdateBatch(shipItemsList);
+
+		return R.success("操作成功");
+	}
+
+	@Override
+	public R outboundCompletedReturns(PjShip ship) {
+		ship.setStatusName(OrderTypeEnum.OURTBOUND.getType());
+		if (ObjectUtils.isNull(ship.getStorageId())) {
+			throw new RuntimeException("请先选择仓库");
+		}
+		ship.setGoodsTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		ship.setSendTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getSendNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		if (ship.getId() == null) {
+			// 获取系统编号
+			R billNo = serialClient.getBillNo(OrderTypeEnum.TKFHGD.getType(), OrderTypeEnum.TKFHGD.getType(), OrderTypeEnum.TKFHGD.getType());
+			if (billNo.getCode() != 200) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				return R.fail(500, "生成系统编号失败");
+			}
+			ship.setBillno((String) billNo.getData());
+			ship.setCreateTime(new Date());
+			ship.setCreateUser(AuthUtil.getUserId());
+			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			ship.setTenantId(AuthUtil.getTenantId());
+			baseMapper.insert(ship);
+		} else {
+			ship.setUpdateUser(AuthUtil.getUserId());
+			ship.setUpdateTime(new Date());
+			baseMapper.updateById(ship);
+		}
+		// 保存订单明细
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			List<PjShipItems> shipItemsList = new ArrayList<>();
+			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
+			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.in(PjGoodsDesc::getId, goodIds));
+			//修改库存账
+			LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.eq(PjStockDesc::getStorageId, ship.getStorageId())
+				.in(PjStockDesc::getGoodsId, goodIds);
+			List<PjStockDesc> pjStockDescList = iStockDescService.list(lambdaQueryWrapper);
+			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())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.in(PjOrderItems::getId, srcItemIds));
+			BigDecimal number = new BigDecimal("0.00");
+			String msg = "";
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getBsType, "PD")
+				.ne(PjOrderItems::getStatus, "已确认")
+				.in(PjOrderItems::getGoodsId, goodIds)
+			);
+			StringBuilder msg1 = new StringBuilder();
+			for (PjShipItems item : ship.getShipItemsList()) {
+				number = number.add(item.getSendNum());
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+				}
+				shipItemsList.add(item);
+				//获得商品
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				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("商品数据异常");
+				}
+				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.getReturnsNumber().compareTo(orderItems.getSendNum().add(item.getSendNum())) < 0) {
+						throw new RuntimeException(orderItems.getGoodsName() + "剩余应发货数量" + orderItems.getReturnsNumber().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())) {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne != null) {
+					if (stockOne.getBalanceQuantity().compareTo(item.getSendNum()) < 0) {
+						System.err.println("商品:" + goodsDesc.getCname());
+						msg += goodsDesc.getCname() + ",";
+					}
+					stockOne.setBalanceQuantity(stockOne.getBalanceQuantity().subtract(item.getSendNum()));
+					stockOne.setStoreInventory(stockOne.getBalanceQuantity());
+					stockOne.setInventoryAmount(stockOne.getInventoryAmount().subtract(item.getSendNum().multiply(stockOne.getInventoryCostPrice())));
+					stockOne.setVersion(stockOne.getVersion());
+					/*R res = iStockDescService.updateByIdNew(stockOne);
+					if (!res.isSuccess()) {
+						throw new RuntimeException(res.getMsg());
+					}*/
+					pjStockDescArrayList.add(stockOne);
+				} else {
+					System.err.println("商品:" + goodsDesc.getCname());
+					throw new RuntimeException("商品:" + goodsDesc.getCname() + "未查到库存账");
+				}
+			}
+			if (!msg.isEmpty()) {
+				throw new RuntimeException("商品:" + msg + "库存不足,出库失败");
+			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
+			R res = iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			shipItemsService.saveOrUpdateBatch(shipItemsList);
+			orderItemsService.updateBatchById(pjOrderItemsList);
+			//查询所有上架商品
+			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
+			productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+				.eq(PjProductLaunch::getIsDeleted, 0)
+				.isNull(PjProductLaunch::getSourceId)
+				.eq(PjProductLaunch::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjProductLaunch::getGoodsId, goodIds);
+			List<PjProductLaunch> productLaunch = productLaunchService.list(productLaunchQueryWrapper);
+			for (PjShipItems item : ship.getShipItemsList()) {
+				//获得商品
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+
+				PjProductLaunch pjProductLaunches = productLaunch.stream()
+					.filter(i -> i.getGoodsId().equals(goodsDesc.getId())).findFirst().orElse(null);
+				//修改上架数量
+				if (pjProductLaunches != null) {
+					pjProductLaunches.setInventory(pjProductLaunches.getInventory().subtract(item.getSendNum()));
+					pjProductLaunchList.add(pjProductLaunches);
+				}
+			}
+			R res1 = productLaunchService.updateBatchById(pjProductLaunchList);
+			if (!res1.isSuccess()) {
+				throw new RuntimeException(res1.getMsg());
+			}
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+			//修改任务发货数量
+			PjShip rwShip = baseMapper.selectById(ship.getTaskId());
+			if (ObjectUtils.isNotNull(rwShip)) {
+				if (ObjectUtils.isNotNull(rwShip.getSendTotalNum())) {
+					rwShip.setSendTotalNum(rwShip.getSendTotalNum().add(number));
+				} else {
+					rwShip.setSendTotalNum(number);
+				}
+				if (rwShip.getSendTotalNum().compareTo(rwShip.getGoodsTotalNum()) == 0) {
+					rwShip.setStatusName("已完成");
+				} else {
+					rwShip.setStatusName("未完成");
+				}
+				rwShip.setUpdateUser(AuthUtil.getUserId());
+				rwShip.setUpdateTime(new Date());
+				baseMapper.updateById(rwShip);
+			}
+		}
+
+		//获得销售订单明细
+		LambdaQueryWrapper<PjOrderItems> itemsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		itemsLambdaQueryWrapper.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrderItems::getIsDeleted, 0)
+			.eq(PjOrderItems::getPid, ship.getOrdId());
+		List<PjOrderItems> itemsList = orderItemsService.list(itemsLambdaQueryWrapper);
+		//数量和
+		BigDecimal goodsNum = itemsList.stream().map(PjOrderItems::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+		//发货数量和
+		BigDecimal sendNum = itemsList.stream().map(PjOrderItems::getSendNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+		PjOrder order = orderMapper.selectById(ship.getOrdId());
+		if (ObjectUtil.isNotEmpty(order)) {
+			order.setShipType(ship.getShipType());
+			order.setLogisticsCorpId(ship.getLogisticsCorpId());
+			order.setLogisticsCorpName(ship.getLogisticsCorpName());
+			order.setExpressNo(ship.getExpressNo());
+			if (goodsNum.compareTo(sendNum) == 0) {//数量等于发货数量修改销售订单状态
+				order.setStatus("已完成");
+				order.setXcxStatus("已完成");
+				order.setDeliveryBusinesDate(new Date());
+				orderMapper.updateById(order);
+			} else {
+				order.setStorageId(ship.getStorageId());
+				orderMapper.updateById(order);
+			}
+			OrderRecord orderRecord = new OrderRecordVO();
+			orderRecord.setCreateTime(new Date());
+			orderRecord.setCreateUser(AuthUtil.getUserId());
+			orderRecord.setCreateUserName(AuthUtil.getUserName());
+			orderRecord.setTenantId(AuthUtil.getTenantId());
+			orderRecord.setPid(order.getId());
+			orderRecord.setSrcNo(ship.getBillno());
+			orderRecord.setBsType(ship.getBizTypeName());
+			orderRecord.setStatus(ship.getStatusName());
+			orderRecordService.save(orderRecord);
+		}
+		//生成出库工单历史记录
+		saveHistory(ship.getId(), OrderTypeEnum.OURTBOUND.getType());
+		return R.data(ship);
+	}
+
+	@Override
+	public R revokeOutboundCompletedReturns(PjShip ship) {
+		ship.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
+		ship.setUpdateUser(AuthUtil.getUserId());
+		ship.setUpdateTime(new Date());
+		baseMapper.updateById(ship);
+
+		// 保存订单明细
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			List<PjShipItems> itemsList = new ArrayList<>();
+			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
+			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.in(PjGoodsDesc::getId, goodIds));
+			//修改库存账
+			LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+			lambdaQueryWrapper.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.eq(PjStockDesc::getStorageId, ship.getStorageId())
+				.in(PjStockDesc::getGoodsId, goodIds);
+			List<PjStockDesc> pjStockDescList = iStockDescService.list(lambdaQueryWrapper);
+			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())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.in(PjOrderItems::getId, srcItemIds));
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getBsType, "PD")
+				.ne(PjOrderItems::getStatus, "已确认")
+				.in(PjOrderItems::getGoodsId, goodIds)
+			);
+			StringBuilder msg1 = new StringBuilder();
+			BigDecimal number = new BigDecimal("0.00");
+			for (PjShipItems item : ship.getShipItemsList()) {
+				number = number.add(item.getSendNum());
+				PjOrderItems orderItems = pjOrderItems.stream().filter(e -> e.getId().equals(item.getSrcItemId())).findFirst().orElse(null);
+				if (orderItems != null) {
+					orderItems.setSendNum(orderItems.getSendNum().subtract(item.getSendNum()));
+					pjOrderItemsList.add(orderItems);
+				} else {
+					throw new RuntimeException("数据异常请联系管理员");
+				}
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				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())) {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne != null) {
+					stockOne.setBalanceQuantity(stockOne.getBalanceQuantity().add(item.getSendNum()));
+					stockOne.setStoreInventory(stockOne.getBalanceQuantity());
+					stockOne.setInventoryAmount(stockOne.getInventoryAmount().add(item.getSendNum().multiply(stockOne.getInventoryCostPrice())));
+					stockOne.setVersion(stockOne.getVersion());
+					pjStockDescArrayList.add(stockOne);
+					/*R res = iStockDescService.updateByIdNew(stockOne);
+					if (!res.isSuccess()) {
+						throw new RuntimeException(res.getMsg());
+					}*/
+				} else {
+					throw new RuntimeException("未查到库存账");
+				}
+				itemsList.add(item);
+			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
+			R res = iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			shipItemsService.updateBatchById(itemsList);
+			orderItemsService.updateBatchById(pjOrderItemsList);
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+//查询所有上架商品
+			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
+			productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+				.eq(PjProductLaunch::getIsDeleted, 0)
+				.isNull(PjProductLaunch::getSourceId)
+				.eq(PjProductLaunch::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjProductLaunch::getGoodsId, goodIds);
+			List<PjProductLaunch> productLaunch = productLaunchService.list(productLaunchQueryWrapper);
+			for (PjShipItems item : ship.getShipItemsList()) {
+				//获得商品
+				PjGoodsDesc goodsDesc = pjGoodsDescList.stream().filter(e -> e.getId().equals(item.getGoodsId())).findFirst().orElse(null);
+				if (ObjectUtil.isEmpty(goodsDesc)) {
+					throw new RuntimeException("商品数据异常");
+				}
+
+				PjProductLaunch pjProductLaunches = productLaunch.stream()
+					.filter(i -> i.getGoodsId().equals(goodsDesc.getId())).findFirst().orElse(null);
+				//修改上架数量
+				if (pjProductLaunches != null) {
+					pjProductLaunches.setInventory(pjProductLaunches.getInventory().add(item.getSendNum()));
+					pjProductLaunchList.add(pjProductLaunches);
+				}
+			}
+			R res1 = productLaunchService.updateBatchById(pjProductLaunchList);
+			if (!res1.isSuccess()) {
+				throw new RuntimeException(res1.getMsg());
+			}
+			//修改任务发货数量
+			PjShip rwShip = baseMapper.selectById(ship.getTaskId());
+			if (ObjectUtils.isNotNull(rwShip)) {
+				rwShip.setSendTotalNum(rwShip.getSendTotalNum().subtract(number));
+				if (rwShip.getSendTotalNum().compareTo(rwShip.getGoodsTotalNum()) == 0) {
+					rwShip.setStatusName("已完成");
+				} else {
+					rwShip.setStatusName("未完成");
+				}
+				rwShip.setUpdateUser(AuthUtil.getUserId());
+				rwShip.setUpdateTime(new Date());
+				baseMapper.updateById(rwShip);
+			}
+		}
+		PjOrder order = orderMapper.selectById(ship.getOrdId());
+		if (ObjectUtil.isNotEmpty(order)) {
+			order.setStatus("待出库");
+			order.setXcxStatus("待出库");
+			order.setDeliveryBusinesDate(null);
+			orderMapper.updateById(order);
+			OrderRecord orderRecord = new OrderRecordVO();
+			orderRecord.setCreateTime(new Date());
+			orderRecord.setCreateUser(AuthUtil.getUserId());
+			orderRecord.setCreateUserName(AuthUtil.getUserName());
+			orderRecord.setTenantId(AuthUtil.getTenantId());
+			orderRecord.setPid(order.getId());
+			orderRecord.setSrcNo(ship.getBillno());
+			orderRecord.setBsType(ship.getBizTypeName());
+			orderRecord.setStatus(ship.getStatusName());
+			orderRecordService.save(orderRecord);
+		} else {
+			throw new RuntimeException("数据异常请联系管理员");
+		}
+
+		//生成出库工单历史记录
+		saveHistory(ship.getId(), OrderTypeEnum.TOBESHIPPEDOUT.getType());
+
+		return R.data(ship);
+	}
+
+	@Override
+	public R generateWarehousingReturns(String ids) {
+		List<Long> shipIds = Func.toLongList(ids);
+		List<PjShip> pjShipList = baseMapper.selectList(new LambdaQueryWrapper<PjShip>()
+			.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+			.eq(PjShip::getIsDeleted, 0)
+			.apply("find_in_set(id,'" + ids + "')"));
+		List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+		List<PjShip> pjShips = new ArrayList<>();
+		if (!pjShipList.isEmpty()) {
+			List<Long> ordIds = pjShipList.stream().map(PjShip::getOrdId).filter(Objects::nonNull).collect(Collectors.toList());
+			pjOrderItemsList = orderItemsService.list(new QueryWrapper<PjOrderItems>()
+				.in("pid", ordIds)
+				.eq("is_deleted", 0)
+				.apply("goods_num != send_num")
+				.eq("tenant_id", AuthUtil.getTenantId()));
+		}
+		List<OrderRecord> orderRecordList = new ArrayList<>();
+		for (Long id : shipIds) {
+			//获得出库任务数据
+			PjShip rwShip = pjShipList.stream().filter(e -> e.getId().equals(id)).findFirst().orElse(null);
+			if (ObjectUtil.isEmpty(rwShip)) {
+				throw new RuntimeException("数据异常 请联系管理员");
+			}
+
+			//新建入库工单
+			PjShip gdShip = new PjShip();
+			// 获取系统编号
+			R billNo = serialClient.getBillNo(OrderTypeEnum.TKFHGD.getType(), OrderTypeEnum.TKFHGD.getType(), OrderTypeEnum.TKFHGD.getType());
+			if (billNo.getCode() != 200) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				return R.fail(500, "生成系统编号失败");
+			}
+			BeanUtil.copyProperties(rwShip, gdShip);
+
+			gdShip.setId(null);
+			gdShip.setBillno((String) billNo.getData());
+			gdShip.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
+			gdShip.setTenantId(AuthUtil.getTenantId());
+			gdShip.setBizTypeName(OrderTypeEnum.TKFHGD.getType());
+			gdShip.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			gdShip.setCreateUser(AuthUtil.getUserId());
+			gdShip.setCreateTime(new Date());
+			gdShip.setTaskId(rwShip.getId());
+			pjShips.add(gdShip);
+			OrderRecord orderRecord = new OrderRecordVO();
+			orderRecord.setCreateTime(new Date());
+			orderRecord.setCreateUser(AuthUtil.getUserId());
+			orderRecord.setCreateUserName(AuthUtil.getUserName());
+			orderRecord.setTenantId(AuthUtil.getTenantId());
+			orderRecord.setPid(rwShip.getOrdId());
+			orderRecord.setSrcNo(gdShip.getBillno());
+			orderRecord.setBsType(gdShip.getBizTypeName());
+			orderRecord.setStatus(gdShip.getStatusName());
+			orderRecordList.add(orderRecord);
+		}
+		orderRecordService.saveBatch(orderRecordList);
+		this.saveOrUpdateBatch(pjShips);
+		List<PjShipItems> shipItemsList = new ArrayList<>();
+		List<PjShip> rwShipList = new ArrayList<>();
+		for (PjShip item : pjShips) {
+			//获得出库任务数据
+			PjShip rwShip = pjShipList.stream().filter(e -> e.getId().equals(item.getTaskId())).findFirst().orElse(null);
+			if (ObjectUtil.isEmpty(rwShip)) {
+				throw new RuntimeException("数据异常 请联系管理员");
+			}
+			//根据采购id获得采购明细数据
+			List<PjOrderItems> list = pjOrderItemsList.stream().filter(e -> e.getPid().equals(item.getOrdId())).collect(Collectors.toList());
+			if (ObjectUtil.isNotEmpty(list)) {
+				for (PjOrderItems e : list) {
+					//根据采购明细创建入库工单明细
+					PjShipItems shipItems = new PjShipItems();
+					BeanUtil.copyProperties(e, shipItems);
+
+					shipItems.setId(null);
+					shipItems.setPid(item.getId());
+					shipItems.setSrcItemId(e.getId());
+					shipItems.setCreateTime(new Date());
+					shipItems.setCreateUser(AuthUtil.getUserId());
+					shipItems.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					shipItems.setSendNum(e.getReturnsNumber().subtract(e.getSendNum()));
+					shipItemsList.add(shipItems);
+				}
+				item.setNumberRows(list.size());
+			}
+
+			//修改入库任务状态
+			rwShip.setStatusName(OrderTypeEnum.DISPATCHED.getType());
+			baseMapper.updateById(rwShip);
+
+			//生成入库工单历史记录
+			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("发送消息失败");
+				}
+			} 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("发送消息失败");
+							}
+						}
+					}
+				}
+			}
+		}
+		this.saveOrUpdateBatch(rwShipList);
+		shipItemsService.saveOrUpdateBatch(shipItemsList);
+		return R.success("操作成功");
+	}
+
+	@Override
+	public R warehousingCompleteReturns(PjShip ship) {
+		if (ship.getId() == null) {
+			// 获取系统编号
+			R billNo = serialClient.getBillNo(OrderTypeEnum.THSHGD.getType(), OrderTypeEnum.THSHGD.getType(), OrderTypeEnum.THSHGD.getType());
+			if (billNo.getCode() != 200) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				return R.fail(500, "生成系统编号失败");
+			}
+			ship.setBillno((String) billNo.getData());
+			ship.setCreateTime(new Date());
+			ship.setCreateUser(AuthUtil.getUserId());
+			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			ship.setTenantId(AuthUtil.getTenantId());
+			baseMapper.insert(ship);
+		} else {
+			ship.setUpdateUser(AuthUtil.getUserId());
+			ship.setUpdateTime(new Date());
+			baseMapper.updateById(ship);
+		}
+		BigDecimal number = new BigDecimal("0.00");
+		// 保存订单明细
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			List<PjShipItems> shipItemsList = new ArrayList<>();
+			List<PjStockDesc> pjStockDescArrayListSave = new ArrayList<>();
+			List<PjStockDesc> pjStockDescArrayListUpdate = new ArrayList<>();
+			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
+			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.in(PjGoodsDesc::getId, goodIds));
+			//修改库存账
+			List<PjStockDesc> pjStockDescList = iStockDescService.list(new LambdaQueryWrapper<PjStockDesc>().eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjStockDesc::getGoodsId, goodIds));
+			List<PjGoodsType> pjGoodsTypeList = goodsTypeMapper.selectList(new LambdaQueryWrapper<PjGoodsType>()
+				.eq(PjGoodsType::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsType::getIsDeleted, 0)
+				.in(PjGoodsType::getId, goodIds)
+			);
+			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())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.in(PjOrderItems::getId, srcItemIds));
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getBsType, "PD")
+				.ne(PjOrderItems::getStatus, "已确认")
+				.in(PjOrderItems::getGoodsId, goodIds)
+			);
+			StringBuilder msg1 = new StringBuilder();
+			//获得仓库
+			PjStorageDesc storageDesc = storageDescMapper.selectById(ship.getStorageId());
+			for (PjShipItems item : ship.getShipItemsList()) {
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+				}
+				shipItemsList.add(item);
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				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("商品数据异常");
+				}
+
+				PjOrderItems orderItems = pjOrderItems.stream().filter(e -> e.getId().equals(item.getSrcItemId())).findFirst().orElse(null);
+				if (orderItems != null) {
+					if (ship.getBillno().contains("TK")) {
+						orderItems.setSendNum(orderItems.getSendNum().subtract(item.getSendNum()));
+					} else {
+						orderItems.setSendNum(orderItems.getSendNum().add(item.getSendNum()));
+					}
+					pjOrderItemsList.add(orderItems);
+				} else {
+					throw new RuntimeException("数据异常请联系管理员");
+				}
+				//生成库存账
+				PjStockDesc stockDesc = new PjStockDesc();
+				stockDesc.setSalesCompanyId(ship.getSalesCompanyId());
+				stockDesc.setSalesCompanyName(ship.getSalesCompanyName());
+				stockDesc.setGoodsTypeId(goodsDesc.getGoodsTypeId());
+				if (ObjectUtils.isNotNull(goodsDesc.getGoodsTypeId())) {
+
+					PjGoodsType goodsType = pjGoodsTypeList.stream().filter(e -> (e.getId() + "").equals(goodsDesc.getGoodsTypeId())).findFirst().orElse(null);
+					if (goodsType != null) {
+						stockDesc.setGoodsTypeName(goodsType.getCname());
+					}
+				}
+				stockDesc.setGoodsId(goodsDesc.getId());
+				stockDesc.setCode(item.getGoodsNo());
+				stockDesc.setCname(goodsDesc.getCname());
+				stockDesc.setInventoryAlert(goodsDesc.getInventoryAlert());
+				stockDesc.setBrandId(item.getBrandId());
+				stockDesc.setBrandName(item.getBrandName());
+				stockDesc.setTypeno(item.getPropertyName());
+				stockDesc.setBrandItem(item.getPattern());
+				stockDesc.setProductDescription(item.getGoodsDescription());
+				stockDesc.setDot(item.getDot());
+				stockDesc.setTenantId(AuthUtil.getTenantId());
+
+				//管理批次号
+				PjStockDesc stockOne;
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getStorageId().equals(ship.getStorageId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getStorageId().equals(ship.getStorageId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne == null) {
+					if (ObjectUtil.isNotEmpty(storageDesc)) {
+						stockDesc.setStorageId(storageDesc.getId());
+						stockDesc.setStorageName(storageDesc.getCname());
+					} else {
+						throw new RuntimeException("仓库数据异常");
+					}
+					stockDesc.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					stockDesc.setCreateTime(new Date());
+					stockDesc.setCreateUser(AuthUtil.getUserId());
+					stockDesc.setBalanceQuantity(item.getSendNum());
+					stockDesc.setStoreInventory(item.getSendNum());
+					stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
+					if (stockDesc.getBalanceQuantity().compareTo(new BigDecimal("0")) != 0) {
+						stockDesc.setInventoryCostPrice(stockDesc.getInventoryAmount().divide(stockDesc.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+					} else {
+						stockDesc.setInventoryCostPrice(item.getPrice());
+					}
+					pjStockDescArrayListSave.add(stockDesc);
+				} else {
+					stockDesc.setId(stockOne.getId());
+					stockDesc.setUpdateTime(new Date());
+					stockDesc.setUpdateUser(AuthUtil.getUserId());
+					stockDesc.setBalanceQuantity(stockOne.getBalanceQuantity().add(item.getSendNum()));
+					stockDesc.setStoreInventory(stockDesc.getBalanceQuantity());
+					stockDesc.setInventoryAmount(item.getSendNum().multiply(item.getPrice()));
+					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));
+					}
+					stockDesc.setVersion(stockOne.getVersion());
+					pjStockDescArrayListUpdate.add(stockDesc);
+				}
+			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
+			shipItemsService.saveOrUpdateBatch(shipItemsList);
+			if (!pjStockDescArrayListSave.isEmpty()) {
+				iStockDescService.saveBatch(pjStockDescArrayListSave);
+			}
+			if (!pjStockDescArrayListUpdate.isEmpty()) {
+				iStockDescService.updateBatchById(pjStockDescArrayListUpdate);
+			}
+			orderItemsService.updateBatchById(pjOrderItemsList);
+			//查询所有上架商品
+			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
+			productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+				.eq(PjProductLaunch::getIsDeleted, 0)
+				.isNull(PjProductLaunch::getSourceId)
+				.eq(PjProductLaunch::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjProductLaunch::getGoodsId, goodIds);
+			List<PjProductLaunch> productLaunch = productLaunchService.list(productLaunchQueryWrapper);
+			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("商品数据异常");
+				}
+				PjProductLaunch pjProductLaunches = productLaunch.stream()
+					.filter(i -> i.getGoodsId().equals(goodsDesc.getId())).findFirst().orElse(null);
+				//修改上架数量
+				if (pjProductLaunches != null) {
+					pjProductLaunches.setInventory(pjProductLaunches.getInventory().add(item.getSendNum()));
+					pjProductLaunchList.add(pjProductLaunches);
+				}
+			}
+			R res = productLaunchService.updateBatchById(pjProductLaunchList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+			ship.setGoodsTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			ship.setSendTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getSendNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		}
+
+		//生成出库工单历史记录
+		saveHistory(ship.getId(), OrderTypeEnum.RECEIVED.getType());
+
+		ship.setStatusName(OrderTypeEnum.RECEIVED.getType());
+		baseMapper.updateById(ship);
+		//修改任务发货数量
+		PjShip rwShip = baseMapper.selectById(ship.getTaskId());
+		if (ObjectUtils.isNotNull(rwShip)) {
+			if (ObjectUtils.isNotNull(rwShip.getSendTotalNum())) {
+				rwShip.setSendTotalNum(rwShip.getSendTotalNum().add(number));
+			} else {
+				rwShip.setSendTotalNum(number);
+			}
+			if (rwShip.getSendTotalNum().compareTo(rwShip.getGoodsTotalNum()) == 0) {
+				rwShip.setStatusName("已完成");
+			} else {
+				rwShip.setStatusName("未完成");
+			}
+			rwShip.setUpdateUser(AuthUtil.getUserId());
+			rwShip.setUpdateTime(new Date());
+			baseMapper.updateById(rwShip);
+		}
+		//获得销售订单明细
+		LambdaQueryWrapper<PjOrderItems> itemsLambdaQueryWrapper = new LambdaQueryWrapper<>();
+		itemsLambdaQueryWrapper.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+			.eq(PjOrderItems::getIsDeleted, 0)
+			.eq(PjOrderItems::getPid, ship.getOrdId());
+		List<PjOrderItems> itemsList = orderItemsService.list(itemsLambdaQueryWrapper);
+		//数量和
+		BigDecimal goodsNum = itemsList.stream().map(PjOrderItems::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+		//发货数量和
+		BigDecimal sendNum = itemsList.stream().map(PjOrderItems::getSendNum).reduce(BigDecimal.ZERO, BigDecimal::add);
+		PjOrder order = orderMapper.selectById(ship.getOrdId());
+		if (ObjectUtil.isNotEmpty(order)) {
+			if (goodsNum.compareTo(sendNum) == 0) {//数量等于发货数量修改销售订单状态
+				order.setStatus("已完成");
+				order.setXcxStatus("已完成");
+				order.setDeliveryBusinesDate(new Date());
+				orderMapper.updateById(order);
+			} else {
+				order.setStorageId(ship.getStorageId());
+				orderMapper.updateById(order);
+			}
+			OrderRecord orderRecord = new OrderRecordVO();
+			orderRecord.setCreateTime(new Date());
+			orderRecord.setCreateUser(AuthUtil.getUserId());
+			orderRecord.setCreateUserName(AuthUtil.getUserName());
+			orderRecord.setTenantId(AuthUtil.getTenantId());
+			orderRecord.setPid(order.getId());
+			orderRecord.setSrcNo(ship.getBillno());
+			orderRecord.setBsType(ship.getBizTypeName());
+			orderRecord.setStatus(ship.getStatusName());
+			orderRecordService.save(orderRecord);
+		}
+
+		return R.data(ship);
+	}
+
+	@Override
+	public R revokeWarehousingReturns(PjShip ship) {
+		// 保存订单明细
+		BigDecimal number = new BigDecimal("0.00");
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			List<Long> goodIds = ship.getShipItemsList().stream().map(PjShipItems::getGoodsId).distinct().collect(Collectors.toList());
+			List<PjGoodsDesc> pjGoodsDescList = goodsDescMapper.selectList(new LambdaQueryWrapper<PjGoodsDesc>()
+				.eq(PjGoodsDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjGoodsDesc::getIsDeleted, 0)
+				.in(PjGoodsDesc::getId, goodIds));
+			//修改库存账
+			List<PjStockDesc> pjStockDescList = iStockDescService.list(new LambdaQueryWrapper<PjStockDesc>().eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
+				.eq(PjStockDesc::getIsDeleted, 0)
+				.eq(PjStockDesc::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjStockDesc::getGoodsId, goodIds));
+			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())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.in(PjOrderItems::getId, srcItemIds));
+			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
+			List<PjOrderItems> orderItemsList = orderItemsService.list(new LambdaQueryWrapper<PjOrderItems>()
+				.eq(PjOrderItems::getTenantId, AuthUtil.getTenantId())
+				.eq(PjOrderItems::getIsDeleted, 0)
+				.eq(PjOrderItems::getBsType, "PD")
+				.ne(PjOrderItems::getStatus, "已确认")
+				.in(PjOrderItems::getGoodsId, goodIds)
+			);
+			StringBuilder msg1 = new StringBuilder();
+			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("商品数据异常");
+				}
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				if (!pjOrderItemsList1.isEmpty()) {
+					msg1.append(item.getGoodsName()).append(",");
+				}
+				//管理批次号
+				PjStockDesc stockOne;
+				if (ObjectUtil.isNotEmpty(goodsDesc.getWhether()) && "1".equals(goodsDesc.getWhether())) {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getStorageId().equals(ship.getStorageId())
+							&& e.getDot().equals(item.getDot())).findFirst().orElse(null);
+				} else {
+					stockOne = pjStockDescList.stream()
+						.filter(e -> e.getGoodsId().equals(item.getGoodsId())
+							&& e.getStorageId().equals(ship.getStorageId())
+							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
+				}
+				if (stockOne != null) {
+					if (stockOne.getBalanceQuantity().compareTo(item.getSendNum()) < 0) {
+						throw new RuntimeException(goodsDesc.getCname() + "库存不足,禁止撤销");
+					}
+					stockOne.setUpdateTime(new Date());
+					stockOne.setUpdateUser(AuthUtil.getUserId());
+					stockOne.setBalanceQuantity(stockOne.getBalanceQuantity().subtract(item.getSendNum()));
+					stockOne.setStoreInventory(stockOne.getBalanceQuantity());
+					stockOne.setInventoryAmount(stockOne.getInventoryAmount().subtract(item.getSendNum().multiply(item.getPrice())));
+					if (new BigDecimal("0.00").compareTo(stockOne.getInventoryAmount()) == 0 && new BigDecimal("0.00").compareTo(stockOne.getBalanceQuantity()) == 0) {
+						stockOne.setInventoryCostPrice(new BigDecimal("0.00"));
+					} else {
+						stockOne.setInventoryCostPrice(stockOne.getInventoryAmount().divide(stockOne.getBalanceQuantity(), MathContext.DECIMAL32).setScale(2, RoundingMode.HALF_UP));
+					}
+					stockOne.setVersion(stockOne.getVersion());
+					/*R res = iStockDescService.updateByIdNew(stockOne);
+					if (!res.isSuccess()) {
+						throw new RuntimeException(res.getMsg());
+					}*/
+					pjStockDescArrayList.add(stockOne);
+				} else {
+					throw new RuntimeException("未查到库存数据");
+				}
+			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
+			iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
+			List<PjProductLaunch> pjProductLaunchList = new ArrayList<>();
+			List<PjOrderItems> pjOrderItemsList = new ArrayList<>();
+			//查询所有上架商品
+			LambdaQueryWrapper<PjProductLaunch> productLaunchQueryWrapper = new LambdaQueryWrapper<>();
+			productLaunchQueryWrapper.eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId())
+				.eq(PjProductLaunch::getIsDeleted, 0)
+				.isNull(PjProductLaunch::getSourceId)
+				.eq(PjProductLaunch::getSalesCompanyId, ship.getSalesCompanyId())
+				.in(PjProductLaunch::getGoodsId, goodIds);
+			List<PjProductLaunch> productLaunch = productLaunchService.list(productLaunchQueryWrapper);
+
+			for (PjShipItems item : ship.getShipItemsList()) {
+				/* ----------------------修改上架库存---------------------- */
+//				List<PjStockDesc> stockDescList = pjStockDescList.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				PjOrderItems orderItems = pjOrderItems.stream().filter(e -> e.getId().equals(item.getSrcItemId())).findFirst().orElse(null);
+				if (orderItems != null) {
+					orderItems.setSendNum(orderItems.getSendNum().subtract(item.getSendNum()));
+					pjOrderItemsList.add(orderItems);
+				} else {
+					throw new RuntimeException("数据异常请联系管理员");
+				}
+
+				/*//库存总数量
+				BigDecimal balanceQuantity = stockDescList.stream().map(PjStockDesc::getBalanceQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+				List<PjProductLaunch> pjProductLaunches = productLaunch.stream().filter(e -> e.getGoodsId().equals(item.getGoodsId())).collect(Collectors.toList());
+				//修改上架数量
+				if (!pjProductLaunches.isEmpty()) {
+					for (PjProductLaunch e : pjProductLaunches) {
+						e.setInventory(balanceQuantity);
+						pjProductLaunchList.add(e);
+					}
+				}*/
+				PjProductLaunch pjProductLaunches = productLaunch.stream()
+					.filter(i -> i.getGoodsId().equals(item.getGoodsId())).findFirst().orElse(null);
+				//修改上架数量
+				if (pjProductLaunches != null) {
+					pjProductLaunches.setInventory(pjProductLaunches.getInventory().subtract(item.getSendNum()));
+					pjProductLaunchList.add(pjProductLaunches);
+				}
+				/* ----------------------修改上架库存---------------------- */
+			}
+			orderItemsService.updateBatchById(pjOrderItemsList);
+			R res = productLaunchService.updateBatchById(pjProductLaunchList);
+			if (!res.isSuccess()) {
+				throw new RuntimeException(res.getMsg());
+			}
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+		}
+		//生成出库工单历史记录
+		saveHistory(ship.getId(), OrderTypeEnum.TREATWAREHOUSING.getType());
+
+		ship.setStatusName(OrderTypeEnum.TREATWAREHOUSING.getType());
+		baseMapper.updateById(ship);
+		//修改任务发货数量
+		PjShip rwShip = baseMapper.selectById(ship.getTaskId());
+		if (ObjectUtils.isNotNull(rwShip)) {
+			rwShip.setSendTotalNum(rwShip.getSendTotalNum().subtract(number));
+			if (rwShip.getSendTotalNum().compareTo(rwShip.getGoodsTotalNum()) == 0) {
+				rwShip.setStatusName("已完成");
+			} else {
+				rwShip.setStatusName("未完成");
+			}
+			rwShip.setUpdateUser(AuthUtil.getUserId());
+			rwShip.setUpdateTime(new Date());
+			baseMapper.updateById(rwShip);
+		}
+		PjOrder order = orderMapper.selectById(ship.getOrdId());
+		if (ObjectUtil.isNotEmpty(order)) {
+			order.setStatus("待入库");
+			order.setXcxStatus("待入库");
+			order.setDeliveryBusinesDate(null);
+			orderMapper.updateById(order);
+			OrderRecord orderRecord = new OrderRecordVO();
+			orderRecord.setCreateTime(new Date());
+			orderRecord.setCreateUser(AuthUtil.getUserId());
+			orderRecord.setCreateUserName(AuthUtil.getUserName());
+			orderRecord.setTenantId(AuthUtil.getTenantId());
+			orderRecord.setPid(order.getId());
+			orderRecord.setSrcNo(ship.getBillno());
+			orderRecord.setBsType(ship.getBizTypeName());
+			orderRecord.setStatus(ship.getStatusName());
+			orderRecordService.save(orderRecord);
+		} else {
+			throw new RuntimeException("数据异常请联系管理员");
+		}
+		return R.data(ship);
+	}
+
+	@Override
+	public R revokeWorkOrderReturns(String ids) {
+		List<Long> shipIds = Func.toLongList(ids);
+		for (Long id : shipIds) {
+			//获得出库任务数据
+			List<PjShip> pjShipList = baseMapper.selectList(new LambdaQueryWrapper<PjShip>()
+				.eq(PjShip::getTenantId, AuthUtil.getTenantId())
+				.eq(PjShip::getIsDeleted, 0)
+				.eq(PjShip::getTaskId, id)
+				.and(i -> i.eq(PjShip::getStatusName, OrderTypeEnum.TOBESHIPPEDOUT.getType())
+					.or().eq(PjShip::getStatusName, OrderTypeEnum.TREATWAREHOUSING.getType())));
+			if (ObjectUtil.isEmpty(pjShipList)) {
+				throw new RuntimeException("数据异常 请联系管理员");
+			}
+			List<Long> itemId = pjShipList.stream().map(PjShip::getId).collect(Collectors.toList());
+			baseMapper.deleteBatchIds(itemId);
+			PjShip rwShip = new PjShip();
+			//修改出库任务状态
+			rwShip.setStatusName("未完成");
+			rwShip.setId(id);
+			baseMapper.updateById(rwShip);
+		}
+		return R.success("操作成功");
+	}
+
+	@Override
+	public R submitReturns(PjShip ship) {
+		//获得所属公司
+		R<Dept> dept = sysClient.getDept(Long.valueOf(AuthUtil.getDeptId()));
+		if (ObjectUtil.isNotEmpty(dept)) {
+			ship.setSalesCompanyId(dept.getData().getId());
+			ship.setSalesCompanyName(dept.getData().getFullName());
+		} else {
+			throw new SecurityException("请选择所属公司");
+		}
+
+		//库管员名称
+		if (ObjectUtils.isNotNull(ship.getStockClerkId())) {
+			ship.setStockClerkName(userClient.userInfoById(ship.getStockClerkId()).getData().getRealName());
+		}
+		ship.setStorageName(storageDescMapper.selectById(ship.getStorageId()).getCname());
+
+		if (ship.getId() == null) {
+			// 获取系统编号
+			R billNo = serialClient.getBillNo(ship.getBizTypeName(), ship.getBizTypeName(), ship.getBizTypeName());
+			if (billNo.getCode() != 200) {
+				TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+				return R.fail(500, "生成系统编号失败");
+			}
+			if (ship.getBizTypeName().equals(OrderTypeEnum.SHGD.getType())) {
+				ship.setStatusName(OrderTypeEnum.TREATWAREHOUSING.getType());
+			} else {
+				ship.setStatusName(OrderTypeEnum.TOBESHIPPEDOUT.getType());
+			}
+			ship.setBillno((String) billNo.getData());
+			ship.setOrdNo((String) billNo.getData());
+			ship.setCreateTime(new Date());
+			ship.setCreateUser(AuthUtil.getUserId());
+			ship.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+			ship.setTenantId(AuthUtil.getTenantId());
+			baseMapper.insert(ship);
+		} else {
+			ship.setUpdateUser(AuthUtil.getUserId());
+			ship.setUpdateTime(new Date());
+			baseMapper.updateById(ship);
+		}
+
+		// 保存订单明细
+		if (CollectionUtils.isNotEmpty(ship.getShipItemsList())) {
+			List<PjShipItems> shipItemsList = new ArrayList<>();
+			ship.getShipItemsList().forEach(item -> {
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+					item.setTenantId(AuthUtil.getTenantId());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+				}
+				shipItemsList.add(item);
+			});
+			shipItemsService.saveOrUpdateBatch(shipItemsList);
+			ship.setShipItemsList(ship.getShipItemsList());
+			ship.setNumberRows(ship.getShipItemsList().size());
+			ship.setGoodsTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getGoodsNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+			ship.setSendTotalNum(ship.getShipItemsList().stream().map(PjShipItems::getSendNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add));
+		}
+		baseMapper.updateById(ship);
+
+		// 保存附件
+		if (CollectionUtils.isNotEmpty(ship.getFilesList())) {
+			List<PjpfFiles> filesList = new ArrayList<>();
+			ship.getFilesList().forEach(item -> {
+				if (item.getId() == null) {
+					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
+					item.setCreateTime(new Date());
+					item.setCreateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+					item.setTenantId(AuthUtil.getTenantId());
+					item.setType(ship.getBsType());
+				} else {
+					item.setUpdateTime(new Date());
+					item.setUpdateUser(AuthUtil.getUserId());
+					item.setPid(ship.getId());
+				}
+				filesList.add(item);
+			});
+			pjpfFilesService.saveOrUpdateBatch(filesList);
+		}
+
+		return R.data(ship);
+	}
+
 }

+ 5 - 1
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/shoppingCart/service/impl/ShoppingCartServiceImpl.java

@@ -222,6 +222,10 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 							order.setSalerName(res.getData().get(0).getAccount());
 						}
 					}
+					if (ObjectUtils.isNotNull(finalCorpsDesc.getDeliveryWarehouseId())) {
+						order.setStorageId(finalCorpsDesc.getDeliveryWarehouseId());
+						order.setStorageName(finalCorpsDesc.getDeliveryWarehouseName());
+					}
 					order.setSalesCompanyId(deptId);
 					order.setSalesCompanyName(sysClient.getDeptName(deptId).getData());
 					order.setRecAddress(address);
@@ -704,7 +708,7 @@ public class ShoppingCartServiceImpl extends ServiceImpl<ShoppingCartMapper, PjS
 				//给角色为财务的人发送消息
 				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()+"");
+					R<List<User>> userList = userClient.listUserByRoleId(clientDeptIds.getData(), AuthUtil.getTenantId(), item.getSalesCompanyId() + "");
 					if (userList.isSuccess() && CollectionUtils.isNotEmpty(userList.getData())) {
 						for (User datum : userList.getData()) {
 							//循环发送消息

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

@@ -514,6 +514,9 @@ public class StatisticsServiceImpl implements IStatisticsService {
 							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()));
+						}
 					}
 				}
 			}
@@ -528,30 +531,50 @@ public class StatisticsServiceImpl implements IStatisticsService {
 		Map<String, Object> map = new HashMap<>();
 		List<SaleDetailDto> saleDetailDtoList = orderItemsService.saleDetailList(saleDetailDto);
 		if (!saleDetailDtoList.isEmpty()) {
-			map.put("goodsSum", saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()))
+			BigDecimal goodsNumCancel = saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
+				.map(SaleDetailDto::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add)
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal subTotalMoneyCancel = saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
+				.map(SaleDetailDto::getSubTotalMoney).reduce(BigDecimal.ZERO, BigDecimal::add)
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal costprieCancel = saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
+				.map(SaleDetailDto::getCostprie).reduce(BigDecimal.ZERO, BigDecimal::add)
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal profitCancel = saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
+				.map(SaleDetailDto::getProfit).reduce(BigDecimal.ZERO, BigDecimal::add)
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal goodsNumActual = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP));
-			map.put("amount", saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()))
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal subTotalMoneyActual = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getSubTotalMoney).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(2, RoundingMode.HALF_UP));
-			map.put("costprie", saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()))
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal costprieActual = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getCostprie).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(2, RoundingMode.HALF_UP));
-			map.put("profit", saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()))
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal profitActual = saleDetailDtoList.stream().filter(e -> !"已取消".equals(e.getStatus()) && !"已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getProfit).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(2, RoundingMode.HALF_UP));
-			map.put("goodsSumCancellation", saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal goodsNumReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getGoodsNum).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(0, RoundingMode.HALF_UP));
-			map.put("amountCancellation", saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal subTotalMoneyReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getSubTotalMoney).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(2, RoundingMode.HALF_UP));
-			map.put("costprieCancellation", saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal costprieReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getCostprie).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(2, RoundingMode.HALF_UP));
-			map.put("profitCancellation", saleDetailDtoList.stream().filter(e -> "已取消".equals(e.getStatus()))
+				.setScale(0, RoundingMode.HALF_UP);
+			BigDecimal profitReturns = saleDetailDtoList.stream().filter(e -> "已完成".equals(e.getStatus()))
 				.map(SaleDetailDto::getProfit).reduce(BigDecimal.ZERO, BigDecimal::add)
-				.setScale(2, RoundingMode.HALF_UP));
+				.setScale(0, RoundingMode.HALF_UP);
+			map.put("goodsSum", goodsNumActual.add(goodsNumReturns));
+			map.put("amount",subTotalMoneyActual.add(subTotalMoneyReturns) );
+			map.put("costprie",costprieActual.add(costprieReturns) );
+			map.put("profit", profitActual.add(profitReturns));
+			map.put("goodsSumCancellation", goodsNumCancel.subtract(goodsNumReturns));
+			map.put("amountCancellation", subTotalMoneyCancel.subtract(subTotalMoneyReturns));
+			map.put("costprieCancellation", costprieCancel.subtract(costprieReturns));
+			map.put("profitCancellation", profitCancel.subtract(profitReturns));
 		} else {
 			map.put("goodsSum", "0");
 			map.put("amount", "0.00");

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

@@ -540,8 +540,8 @@ 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);
+			/*.ne(PjStockDesc::getDot, "")
+			.isNotNull(PjStockDesc::getDot)*/;
 
 		List<PjStockDesc> list = stockDescService.list(lambdaQueryWrapper);
 		return R.data(list);

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů