Просмотр исходного кода

1.增加调拨明细统计列表,合计,导出接口
2.撤销赎回接口增加判断库存是否充足
3.撤销到货增加判断,已赎回不允许撤销
4.确认盘点库存数量不对bug修改
5.确认调拨,撤销调拨增加是否存在盘点中单据判断

纪新园 4 дней назад
Родитель
Сommit
a60df13493

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

@@ -0,0 +1,154 @@
+package org.springblade.salesPart.dto;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author :jixinyuan
+ * @date : 2026/2/4
+ */
+@Data
+public class TransferDto {
+
+	/**
+	 * 调拨单号
+	 */
+	@ExcelProperty(value = "调拨单号")
+	private String billno;
+	/**
+	 * 商品编码
+	 */
+	@ExcelProperty(value = "商品编码")
+	private String code;
+	/**
+	 * 商品名称
+	 */
+	@ExcelProperty(value = "商品名称")
+	private String goodsName;
+	/**
+	 * 调出仓库
+	 */
+	@ExcelProperty(value = "调出仓库")
+	private String storageName;
+	/**
+	 * 调入仓库
+	 */
+	@ExcelProperty(value = "调入仓库")
+	private String callInStorageName;
+	/**
+	 * 批次号
+	 */
+	@ExcelProperty(value = "批次号")
+	private String dot;
+	/**
+	 * 调拨数量(总)
+	 */
+	@ExcelProperty(value = "调拨数量(总)")
+	private BigDecimal sendNum;
+	/**
+	 * 调拨数量(融资)
+	 */
+	@ExcelProperty(value = "调拨数量(融资)")
+	private BigDecimal sendNumFinancing;
+	/**
+	 * 调拨数量(自有)
+	 */
+	@ExcelProperty(value = "调拨数量(自有)")
+	private BigDecimal sendNumHave;
+	/**
+	 * 调拨日期
+	 */
+	@ExcelProperty(value = "调拨日期")
+	private Date businesDate;
+	/**
+	 * 品牌
+	 */
+	@ExcelProperty(value = "品牌")
+	private String brandName;
+
+	/**
+	 * 规格型号
+	 */
+	@ExcelProperty(value = "规格型号")
+	private String propertyName;
+	/**
+	 * 花纹
+	 */
+	@ExcelProperty(value = "花纹")
+	private String pattern;
+	/**
+	 * 状态
+	 */
+	@ExcelProperty(value = "状态")
+	private String statusName;
+	/**
+	 * 备注
+	 */
+	@ExcelProperty(value = "备注")
+	private String remarks;
+
+	/**
+	 * 调拨日期检索字段
+	 */
+	@ExcelIgnore
+	private List<String> businesDateList;
+
+	/**
+	 * 调出仓库id
+	 */
+	@ExcelIgnore
+	private Long storageId;
+
+	/**
+	 * 调入仓库id
+	 */
+	@ExcelIgnore
+	private Long callInStorageId;
+
+	/**
+	 * 库管员id
+	 */
+	@ExcelIgnore
+	private Long stockClerkId;
+
+	/**
+	 * 库管员id
+	 */
+	@ExcelIgnore
+	private String stockClerkName;
+
+	/**
+	 * 单据id
+	 */
+	@ExcelIgnore
+	private Long pid;
+
+	/**
+	 * 明细id
+	 */
+	@ExcelIgnore
+	private Long itemId;
+
+	/**
+	 * 租户
+	 */
+	@ExcelIgnore
+	private String tenantId;
+	/**
+	 * 所属公司
+	 */
+	@ExcelIgnore
+	private String salesCompanyId;
+	/**
+	 * 仓库权限
+	 */
+	@ExcelIgnore
+	private String storageIds;
+
+
+}

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

@@ -1092,6 +1092,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 				}
 				item.setTotalAmount(totalAmount);
 				if (item.getId() == null) {
+					item.setStatus("录入");
 					item.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
 					item.setCreateTime(new Date());
 					item.setCreateUser(AuthUtil.getUserId());
@@ -1264,7 +1265,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 					}
 
 					stockOne.setBalanceQuantity(item.getSendNum());
-					stockOne.setBalanceQuantityHave(item.getSendNum());
+					stockOne.setBalanceQuantityHave(item.getSendNumHave());
 					stockOne.setStoreInventory(stockOne.getBalanceQuantity());
 					stockOne.setInventoryAmount(item.getSubTotalMoney());
 					stockOne.setRebateInventoryAmount(item.getSendNum().multiply(stockOne.getRebatePrice()));
@@ -1825,7 +1826,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			.eq(PjShip::getOrdId, order.getId())
 			.eq(PjShip::getBizTypeName, "TKFHRW"));
 		if (ObjectUtils.isNotNull(pjShip) && (ObjectUtils.isNull(pjShip.getSendTotalNum()) || new BigDecimal("0.00").compareTo(pjShip.getSendTotalNum()) == 0)) {
-			shipMapper.deleteById(pjShip.getId());
+			pjShip.setIsDeleted(1);
+//			shipMapper.deleteById(pjShip.getId());
+			shipMapper.updateById(pjShip);
 			shipMapper.deleteByTaskId(pjShip.getId());
 		} else {
 			throw new RuntimeException("出库已完成,禁止撤销!");
@@ -2050,7 +2053,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			.eq(PjShip::getOrdId, order.getId())
 			.eq(PjShip::getBizTypeName, "THSHRW"));
 		if (ObjectUtils.isNotNull(pjShip) && (ObjectUtils.isNull(pjShip.getSendTotalNum()) || new BigDecimal("0.00").compareTo(pjShip.getSendTotalNum()) == 0)) {
-			shipMapper.deleteById(pjShip.getId());
+//			shipMapper.deleteById(pjShip.getId());
+			pjShip.setIsDeleted(1);
+			shipMapper.updateById(pjShip);
 			shipMapper.deleteByTaskId(pjShip.getId());
 		} else {
 			throw new RuntimeException("入库已完成,禁止撤销!");
@@ -3016,6 +3021,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 	@Transactional(rollbackFor = Exception.class)
 	public R revokeWarehouse(PjOrder detatil) {
 		PjOrder order = baseMapper.selectById(detatil.getId());
+		if ("1".equals(order.getWhetherRedeem())) {
+			throw new RuntimeException("单据已赎回,撤销失败");
+		}
 		order.setConfirmWarehouse("0");
 		order.setUpdateUserName(AuthUtil.getUserName());
 		order.setUpdateUser(AuthUtil.getUserId());
@@ -3310,6 +3318,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 							&& ObjectUtils.isNull(e.getDot())).findFirst().orElse(null);
 				}
 				if (stockOne != null) {
+					if (stockOne.getBalanceQuantityHave().compareTo(item.getRedeemNum()) < 0) {
+						throw new RuntimeException("商品:" + goodsDesc.getCname() + " 剩余自有库存" + stockOne.getBalanceQuantityHave() + "小于赎回数量" + item.getRedeemNum() + ",撤销失败");
+					}
 					stockOne.setBalanceQuantityHave(stockOne.getBalanceQuantityHave().subtract(item.getRedeemNum()));
 					stockOne.setBalanceQuantityFinancing(stockOne.getBalanceQuantityFinancing().add(item.getRedeemNum()));
 					stockOne.setVersion(stockOne.getVersion());
@@ -6278,7 +6289,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			if ("已完成".equals(pjShip.getStatusName())) {
 				throw new RuntimeException("出库已完成,禁止撤销!");
 			} else {
-				shipMapper.deleteById(pjShip.getId());
+				pjShip.setIsDeleted(1);
+				shipMapper.updateById(pjShip);
+//				shipMapper.deleteById(pjShip.getId());
 			}
 		} else {
 			throw new RuntimeException("出库已完成,禁止撤销!");
@@ -6290,7 +6303,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			if ("已出库".equals(ship.getStatusName())) {
 				throw new RuntimeException("出库已完成,禁止撤销!");
 			} else {
-				shipMapper.deleteById(ship.getId());
+//				shipMapper.deleteById(ship.getId());
+				ship.setIsDeleted(1);
+				shipMapper.updateById(ship);
 			}
 		}
 		pjOrder.setTaskWhetherAdopt("录入");
@@ -6328,6 +6343,11 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 							productLaunchListNew.add(pjProductLaunch);
 						}
 					}
+					e.setSendNum(new BigDecimal("0.00"));
+					e.setUpdateTime(new Date());
+					e.setUpdateUser(AuthUtil.getUserId());
+					e.setSendNumHave(new BigDecimal("0.00"));
+					e.setSendNumFinancing(new BigDecimal("0.00"));
 				});
 				String stata = sysClient.paramServiceValue(AuthUtil.getTenantId(), "whether.open.share");
 				if (!productLaunchListNew.isEmpty() && "1".equals(stata)) {
@@ -7373,7 +7393,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			if ("已完成".equals(pjShip.getStatusName())) {
 				throw new RuntimeException("入库已完成,禁止撤销!");
 			} else {
-				shipMapper.deleteById(pjShip.getId());
+//				shipMapper.deleteById(pjShip.getId());
+				pjShip.setIsDeleted(1);
+				shipMapper.updateById(pjShip);
 			}
 		}
 		PjShip ship = shipMapper.selectOne(new LambdaQueryWrapper<PjShip>().eq(PjShip::getIsDeleted, 0)
@@ -7383,7 +7405,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, PjOrder> implemen
 			if ("已入库".equals(ship.getStatusName())) {
 				throw new RuntimeException("入库已完成,禁止撤销!");
 			} else {
-				shipMapper.deleteById(ship.getId());
+//				shipMapper.deleteById(ship.getId());
+				ship.setIsDeleted(1);
+				shipMapper.updateById(ship);
 			}
 		}
 		pjOrder.setVersion(pjOrder.getVersion() + 1);

+ 5 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/mapper/ShipItemsMapper.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import org.apache.ibatis.annotations.Param;
 import org.springblade.salesPart.dto.SaleFinancingDetail;
 import org.springblade.salesPart.dto.SaleFinancingDetailDto;
+import org.springblade.salesPart.dto.TransferDto;
 import org.springblade.salesPart.entity.PjShipItems;
 import org.springblade.salesPart.vo.ShipItemsVO;
 
@@ -55,4 +56,8 @@ public interface ShipItemsMapper extends BaseMapper<PjShipItems> {
 	 * @return 结果
 	 */
     List<PjShipItems> selectShipItemByGoodsIdAndTkcg(@Param("goodsIdList") List<Long> goodsId);
+
+	List<TransferDto> transferDetail(IPage<TransferDto> page, @Param("data")TransferDto transferDto);
+
+	List<TransferDto> transferDetailList(@Param("data")TransferDto transferDto);
 }

+ 140 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/mapper/ShipItemsMapper.xml

@@ -156,5 +156,145 @@
             #{item}
         </foreach>
     </select>
+    <select id="transferDetail" resultType="org.springblade.salesPart.dto.TransferDto">
+        SELECT
+            ps.billno as billno,
+            psi.goods_no as code,
+            psi.goods_name as goodsName,
+            ps.storage_name as storageName,
+            ps.call_in_storage_name as callInStorageName,
+            psi.dot as dot,
+            psi.goods_num as sendNum,
+            psi.send_num_financing as sendNumFinancing,
+            psi.send_num_have as sendNumHave,
+            ps.busines_date as businesDate,
+            psi.brand_name as brandName,
+            psi.pattern as pattern,
+            psi.property_name as propertyName,
+            ps.status_name as statusName,
+            ps.stock_clerk_name as stockClerkName,
+            ps.remarks as remarks,
+            ps.id as id,
+            psi.id as itemId
+        FROM
+            pjpf_ship ps
+                LEFT JOIN pjpf_ship_items psi ON ps.id = psi.pid
+        WHERE
+            ps.tenant_id = #{data.tenantId}
+          AND psi.tenant_id = #{data.tenantId}
+          AND ps.is_deleted = '0'
+          AND psi.is_deleted = '0'
+          AND ps.biz_type_name = 'DBGD'
+        <if test="data.billno !=null and data.billno != ''">
+            and ps.billno like concat('%', #{data.billno}, '%')
+        </if>
+        <if test="data.goodsName !=null and data.goodsName != ''">
+            and psi.goods_name like concat('%', #{data.goodsName}, '%')
+        </if>
+        <if test="data.code !=null and data.code != ''">
+            and psi.goods_no like concat('%', #{data.code}, '%')
+        </if>
+        <if test="data.storageName !=null and data.storageName != ''">
+            and ps.storage_name like concat('%', #{data.storageName}, '%')
+        </if>
+        <if test="data.storageId !=null ">
+            and ps.storage_id = #{data.storageId}
+        </if>
+        <if test="data.storageName !=null and data.callInStorageName != ''">
+            and ps.call_in_storage_name like concat('%', #{data.callInStorageName}, '%')
+        </if>
+        <if test="data.callInStorageId !=null ">
+            and ps.call_in_storage_id = #{data.callInStorageId}
+        </if>
+        <if test="data.stockClerkName !=null and data.stockClerkName != ''">
+            and ps.stock_clerk_name like concat('%', #{data.stockClerkName}, '%')
+        </if>
+        <if test="data.stockClerkId !=null ">
+            and ps.stock_clerk_id = #{data.stockClerkId}
+        </if>
+        <if test="data.statusName !=null and data.statusName != ''">
+            and ps.status_name = #{data.statusName}
+        </if>
+        <if test="data.businesDateList !=null and data.businesDateList[0] !='' and data.businesDateList[0] != null">
+            and DATE_FORMAT(ps.busines_date,'%Y-%m-%d') &gt;= #{data.businesDateList[0]}
+        </if>
+        <if test="data.businesDateList !=null and data.businesDateList[1] !='' and data.businesDateList[1] != null">
+            and DATE_FORMAT(ps.busines_date,'%Y-%m-%d') &lt;= #{data.businesDateList[1]}
+        </if>
+        <if test="data.brandName !=null and data.brandName != ''">
+            and psi.brand_name = #{data.brandName}
+        </if>
+        ORDER BY ps.busines_date DESC,ps.billno DESC
+    </select>
+    <select id="transferDetailList" resultType="org.springblade.salesPart.dto.TransferDto">
+        SELECT
+        ps.billno as billno,
+        psi.goods_no as code,
+        psi.goods_name as goodsName,
+        ps.storage_name as storageName,
+        ps.call_in_storage_name as callInStorageName,
+        psi.dot as dot,
+        psi.goods_num as sendNum,
+        psi.send_num_financing as sendNumFinancing,
+        psi.send_num_have as sendNumHave,
+        ps.busines_date as businesDate,
+        psi.brand_name as brandName,
+        psi.pattern as pattern,
+        psi.property_name as propertyName,
+        ps.status_name as statusName,
+        ps.stock_clerk_name as stockClerkName,
+        ps.remarks as remarks,
+        ps.id as id,
+        psi.id as itemId
+        FROM
+        pjpf_ship ps
+        LEFT JOIN pjpf_ship_items psi ON ps.id = psi.pid
+        WHERE
+        ps.tenant_id = #{data.tenantId}
+        AND psi.tenant_id = #{data.tenantId}
+        AND ps.is_deleted = '0'
+        AND psi.is_deleted = '0'
+        AND ps.biz_type_name = 'DBGD'
+        <if test="data.billno !=null and data.billno != ''">
+            and ps.billno like concat('%', #{data.billno}, '%')
+        </if>
+        <if test="data.goodsName !=null and data.goodsName != ''">
+            and psi.goods_name like concat('%', #{data.goodsName}, '%')
+        </if>
+        <if test="data.code !=null and data.code != ''">
+            and psi.goods_no like concat('%', #{data.code}, '%')
+        </if>
+        <if test="data.storageName !=null and data.storageName != ''">
+            and ps.storage_name like concat('%', #{data.storageName}, '%')
+        </if>
+        <if test="data.storageId !=null ">
+            and ps.storage_id = #{data.storageId}
+        </if>
+        <if test="data.storageName !=null and data.callInStorageName != ''">
+            and ps.call_in_storage_name like concat('%', #{data.callInStorageName}, '%')
+        </if>
+        <if test="data.callInStorageId !=null ">
+            and ps.call_in_storage_id = #{data.callInStorageId}
+        </if>
+        <if test="data.stockClerkName !=null and data.stockClerkName != ''">
+            and ps.stock_clerk_name like concat('%', #{data.stockClerkName}, '%')
+        </if>
+        <if test="data.stockClerkId !=null ">
+            and ps.stock_clerk_id = #{data.stockClerkId}
+        </if>
+        <if test="data.statusName !=null and data.statusName != ''">
+            and ps.status_name = #{data.statusName}
+        </if>
+        <if test="data.businesDateList !=null and data.businesDateList[0] !='' and data.businesDateList[0] != null">
+            and DATE_FORMAT(ps.busines_date,'%Y-%m-%d') &gt;= #{data.businesDateList[0]}
+        </if>
+        <if test="data.businesDateList !=null and data.businesDateList[1] !='' and data.businesDateList[1] != null">
+            and DATE_FORMAT(ps.busines_date,'%Y-%m-%d') &lt;= #{data.businesDateList[1]}
+        </if>
+        <if test="data.brandName !=null and data.brandName != ''">
+            and psi.brand_name = #{data.brandName}
+        </if>
+        ORDER BY ps.busines_date DESC,ps.billno DESC
+    </select>
 
 </mapper>

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

@@ -19,6 +19,7 @@ package org.springblade.salesPart.ship.service;
 import org.springblade.core.tool.api.R;
 import org.springblade.salesPart.dto.SaleFinancingDetail;
 import org.springblade.salesPart.dto.SaleFinancingDetailDto;
+import org.springblade.salesPart.dto.TransferDto;
 import org.springblade.salesPart.entity.PjShipItems;
 import org.springblade.salesPart.vo.ShipItemsVO;
 import com.baomidou.mybatisplus.extension.service.IService;
@@ -58,4 +59,8 @@ public interface IShipItemsService extends IService<PjShipItems> {
     R submitList(List<PjShipItems> shipItems);
 
     R delete(List<Long> longList);
+
+    IPage<TransferDto> transferDetail(TransferDto transferDto, IPage<TransferDto> page);
+
+	List<TransferDto> transferDetailList(TransferDto transferDto);
 }

+ 11 - 0
blade-service/blade-sales-part/src/main/java/org/springblade/salesPart/ship/service/impl/ShipItemsServiceImpl.java

@@ -24,6 +24,7 @@ import org.springblade.core.secure.utils.AuthUtil;
 import org.springblade.core.tool.api.R;
 import org.springblade.salesPart.dto.SaleFinancingDetail;
 import org.springblade.salesPart.dto.SaleFinancingDetailDto;
+import org.springblade.salesPart.dto.TransferDto;
 import org.springblade.salesPart.entity.PjHistory;
 import org.springblade.salesPart.entity.PjShip;
 import org.springblade.salesPart.entity.PjShipItems;
@@ -137,4 +138,14 @@ public class ShipItemsServiceImpl extends ServiceImpl<ShipItemsMapper, PjShipIte
 		return R.data("操作成功");
 	}
 
+	@Override
+	public IPage<TransferDto> transferDetail(TransferDto transferDto, IPage<TransferDto> page) {
+		return page.setRecords(baseMapper.transferDetail(page, transferDto));
+	}
+
+	@Override
+	public List<TransferDto> transferDetailList(TransferDto transferDto) {
+		return baseMapper.transferDetailList(transferDto);
+	}
+
 }

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

@@ -3529,6 +3529,13 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					throw new RuntimeException("禁止同仓库,同库区调拨");
 				}
 			}
+			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, goodsIdList)
+			);
 			//调拨出库
 			LambdaQueryWrapper<PjStockDesc> lambdaQueryWrapperC = new LambdaQueryWrapper<>();
 			lambdaQueryWrapperC.eq(PjStockDesc::getTenantId, AuthUtil.getTenantId())
@@ -3570,7 +3577,12 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
 			List<PjStockDesc> pjStockDescList = new ArrayList<>();
 			int count = 1;
+			StringBuilder msg1 = new StringBuilder();
 			for (PjShipItems orderItems : order.getShipItemsList()) {
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(orderItems.getGoodsId())).collect(Collectors.toList());
+				if (!pjOrderItemsList1.isEmpty()) {
+					msg1.append(orderItems.getGoodsName()).append(",");
+				}
 				if (ObjectUtils.isNull(orderItems.getGoodsNum()) || new BigDecimal("0.00").compareTo(orderItems.getGoodsNum()) == 0) {
 					throw new RuntimeException("商品:" + orderItems.getGoodsName() + ",调拨数量不能为零");
 				}
@@ -3874,6 +3886,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				}
 				count++;
 			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
 			if (!detail.getStorageId().equals(detail.getCallInStorageId())) {
 				R res = iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
 				if (!res.isSuccess()) {
@@ -3972,9 +3987,17 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 					.ne(ReservoirAreaRecord::getBalanceQuantity, 0)
 					.in(ReservoirAreaRecord::getPid, stockId));
 			}
+			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, goodsIdList)
+			);
 			String status = sysClient.getParamService("whether.financing");
 			List<PjStockDesc> pjStockDescArrayList = new ArrayList<>();
 			int count = 1;
+			StringBuilder msg1 = new StringBuilder();
 			for (PjShipItems orderItems : order.getShipItemsList()) {
 				//获得商品
 				PjGoodsDesc goodsDesc = goodsDescMapper.selectById(orderItems.getGoodsId());
@@ -3984,6 +4007,10 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				if ("1".equals(goodsDesc.getWhether()) && ObjectUtils.isNull(orderItems.getDot())) {
 					throw new RuntimeException("商品:" + goodsDesc.getCname() + ",请求选择批次号");
 				}
+				List<PjOrderItems> pjOrderItemsList1 = orderItemsList.stream().filter(e -> e.getGoodsId().equals(orderItems.getGoodsId())).collect(Collectors.toList());
+				if (!pjOrderItemsList1.isEmpty()) {
+					msg1.append(orderItems.getGoodsName()).append(",");
+				}
 				//调拨出库
 				PjStockDesc stockOneC;
 				//管理批次号
@@ -4149,6 +4176,9 @@ public class ShipServiceImpl extends ServiceImpl<ShipMapper, PjShip> implements
 				}
 				count++;
 			}
+			if (msg1.length() > 0) {
+				throw new RuntimeException("商品:" + msg1 + "正在盘点中,操作失败");
+			}
 			if (!detail.getStorageId().equals(detail.getCallInStorageId())) {
 				R res = iStockDescService.updateBatchByIdNew(pjStockDescArrayList);
 				if (!res.isSuccess()) {

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

@@ -130,7 +130,7 @@ public class StatisticsController {
 				List<String> goodsIds = saleDetailDtoList.stream().map(SaleDetailDto::getGoodsId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
 				List<PjProductLaunch> productLaunchList = productLaunchService.list(new LambdaQueryWrapper<PjProductLaunch>()
 					.eq(PjProductLaunch::getIsDeleted, 0).eq(PjProductLaunch::getTenantId, AuthUtil.getTenantId()).in(PjProductLaunch::getGoodsId, goodsIds));
-				for (SaleDetailDto dto: saleDetailDtoList) {
+				for (SaleDetailDto dto : saleDetailDtoList) {
 					PjProductLaunch nowGoodsProduct = productLaunchList.stream().filter(item -> item.getGoodsId().equals(Long.valueOf(dto.getGoodsId()))).findFirst().orElse(null);
 					if (nowGoodsProduct == null) {
 						continue;
@@ -293,7 +293,7 @@ public class StatisticsController {
 	}
 
 	/**
-	 *  达沃特多多易车配 实时总览
+	 * 达沃特多多易车配 实时总览
 	 */
 	@GetMapping("/duoDuoRealTimeOverview")
 	public R<DuoDuoRealTimeOverviewVo> duoDuoRealTimeOverview(@RequestParam(value = "tenantId") String tenantId, @RequestParam("year") String year) {
@@ -315,4 +315,29 @@ public class StatisticsController {
 		return R.data(statisticsService.capitalSummary(capitalSummaryVo));
 	}
 
+	/**
+	 * 统计调拨明细
+	 */
+	@GetMapping("/transferDetail")
+	public R<IPage<TransferDto>> transferDetail(TransferDto transferDto, Query query) {
+		return statisticsService.transferDetail(transferDto, Condition.getPage(query));
+	}
+
+	/**
+	 * 统计调拨明细合计
+	 */
+	@GetMapping("/transferDetailSum")
+	public R transferDetailSum(TransferDto transferDto) {
+		return statisticsService.transferDetailSum(transferDto);
+	}
+
+	/**
+	 * 统计调拨明细导出
+	 */
+	@GetMapping("/transferDetailExport")
+	public void transferDetailExport(TransferDto transferDto, HttpServletResponse response) {
+		List<TransferDto> transferDtoList = statisticsService.transferDetailExport(transferDto);
+		ExcelUtil.export(response, "调拨明细", "调拨明细", transferDtoList, TransferDto.class);
+	}
+
 }

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

@@ -157,4 +157,10 @@ public interface IStatisticsService {
 	 * @return 结果
 	 */
 	List<CapitalSummaryDataVo> capitalSummary(CapitalSummaryVo capitalSummaryVo);
+
+	R<IPage<TransferDto>> transferDetail(TransferDto transferDto, IPage<TransferDto> page);
+
+	R transferDetailSum(TransferDto transferDto);
+
+	List<TransferDto> transferDetailExport(TransferDto transferDto);
 }

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

@@ -2210,4 +2210,47 @@ public class StatisticsServiceImpl implements IStatisticsService {
 		}
 		return capitalSummaryDataVoList.stream().sorted(Comparator.comparing(CapitalSummaryDataVo::getSales).reversed()).collect(Collectors.toList());
 	}
+
+	@Override
+	public R<IPage<TransferDto>> transferDetail(TransferDto transferDto, IPage<TransferDto> page) {
+		transferDto.setTenantId(AuthUtil.getTenantId());
+		transferDto.setSalesCompanyId(AuthUtil.getDeptId());
+		if (ObjectUtils.isNotNull(ParameterUtils.getStorageId()) && ParameterUtils.whetherDatabaseSharding()) {
+			transferDto.setStorageIds(ParameterUtils.getStorageId());
+		}
+		return R.data(shipItemsService.transferDetail(transferDto, page));
+	}
+
+	@Override
+	public R transferDetailSum(TransferDto transferDto) {
+		transferDto.setTenantId(AuthUtil.getTenantId());
+		transferDto.setSalesCompanyId(AuthUtil.getDeptId());
+		if (ObjectUtils.isNotNull(ParameterUtils.getStorageId()) && ParameterUtils.whetherDatabaseSharding()) {
+			transferDto.setStorageIds(ParameterUtils.getStorageId());
+		}
+		Map<String, Object> map = new HashMap<>();
+		BigDecimal sendNum = new BigDecimal("0");
+		BigDecimal sendNumFinancing = new BigDecimal("0");
+		BigDecimal sendNumHave = new BigDecimal("0");
+		List<TransferDto> transferDtoList = shipItemsService.transferDetailList(transferDto);
+		if (!transferDtoList.isEmpty()) {
+			sendNum = transferDtoList.stream().map(TransferDto::getSendNum).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+			sendNumFinancing = transferDtoList.stream().map(TransferDto::getSendNumFinancing).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+			sendNumHave = transferDtoList.stream().map(TransferDto::getSendNumHave).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);
+		}
+		map.put("sendNum", sendNum);
+		map.put("sendNumFinancing", sendNumFinancing);
+		map.put("sendNumHave", sendNumHave);
+		return R.data(map);
+	}
+
+	@Override
+	public List<TransferDto> transferDetailExport(TransferDto transferDto) {
+		transferDto.setTenantId(AuthUtil.getTenantId());
+		transferDto.setSalesCompanyId(AuthUtil.getDeptId());
+		if (ObjectUtils.isNotNull(ParameterUtils.getStorageId()) && ParameterUtils.whetherDatabaseSharding()) {
+			transferDto.setStorageIds(ParameterUtils.getStorageId());
+		}
+		return shipItemsService.transferDetailList(transferDto);
+	}
 }