|
|
@@ -149,9 +149,21 @@ public class MaterialIoServiceImpl implements MaterialIoService {
|
|
|
|
|
|
// 4.2 查询原入库批次
|
|
|
MaterialInboundOrderItemDO inboundItem = getInboundItemOrThrow(itemVO.getInboundItemId());
|
|
|
- MaterialOutboundOrderItemDO materialOutboundOrderItemDO = outboundOrderItemMapper.selectById(itemVO.getOutboundItemId());
|
|
|
- materialOutboundOrderItemDO.setQuantity(itemVO.getQuantity());
|
|
|
- outboundOrderItemMapper.updateById(materialOutboundOrderItemDO);
|
|
|
+
|
|
|
+ // 校验退回数量不能超过该明细已出库数量(避免回扣后出现负数)
|
|
|
+ MaterialOutboundOrderItemDO outboundItem = outboundOrderItemMapper.selectById(itemVO.getOutboundItemId());
|
|
|
+ if (outboundItem == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_NOT_FOUND, "原出库明细不存在");
|
|
|
+ }
|
|
|
+ int originalOutQty = outboundItem.getQuantity() == null ? 0 : outboundItem.getQuantity();
|
|
|
+ if (originalOutQty < itemVO.getQuantity()) {
|
|
|
+ throw exceptionCustomMsg(COMMON_NOT_FOUND, "退回数量不能大于原出库数量");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 出库退回应当对出库数量进行回扣:减少出库明细数量
|
|
|
+ outboundItem.setQuantity(originalOutQty - itemVO.getQuantity());
|
|
|
+ outboundOrderItemMapper.updateById(outboundItem);
|
|
|
+
|
|
|
// 4.3 更新批次信息(回补)
|
|
|
applyOutboundReturnToBatch(inboundItem, itemVO.getQuantity());
|
|
|
|
|
|
@@ -588,7 +600,7 @@ public class MaterialIoServiceImpl implements MaterialIoService {
|
|
|
throw exception(COMMON_NOT_FOUND, "出库退回单不存在");
|
|
|
}
|
|
|
|
|
|
- // 2. 回滚旧明细对库存和批次的影响
|
|
|
+ // 2. 回滚旧明细对库存、批次和出库明细的影响
|
|
|
List<MaterialOutboundReturnOrderItemDO> oldItems = outboundReturnOrderItemMapper.selectList(
|
|
|
new LambdaQueryWrapper<MaterialOutboundReturnOrderItemDO>().eq(MaterialOutboundReturnOrderItemDO::getReturnOrderId, order.getId()));
|
|
|
for (MaterialOutboundReturnOrderItemDO oldItem : oldItems) {
|
|
|
@@ -599,6 +611,14 @@ public class MaterialIoServiceImpl implements MaterialIoService {
|
|
|
}
|
|
|
// 回滚库存:出库退回是增加,回滚就是减少
|
|
|
updateMaterialStock(oldItem.getMaterialId(), -oldItem.getQuantity());
|
|
|
+
|
|
|
+ // 回滚出库明细:把之前扣掉的出库数量加回来
|
|
|
+ MaterialOutboundOrderItemDO outboundItem = outboundOrderItemMapper.selectById(oldItem.getOutboundItemId());
|
|
|
+ if (outboundItem != null) {
|
|
|
+ int currentQty = outboundItem.getQuantity() == null ? 0 : outboundItem.getQuantity();
|
|
|
+ outboundItem.setQuantity(currentQty + oldItem.getQuantity());
|
|
|
+ outboundOrderItemMapper.updateById(outboundItem);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// 3. 删除旧明细
|
|
|
@@ -609,10 +629,24 @@ public class MaterialIoServiceImpl implements MaterialIoService {
|
|
|
MaterialOutboundReturnOrderDO updateObj = BeanUtils.toBean(updateReqVO, MaterialOutboundReturnOrderDO.class);
|
|
|
outboundReturnOrderMapper.updateById(updateObj);
|
|
|
|
|
|
- // 5. 插入新明细并重新计算库存和批次
|
|
|
+ // 5. 插入新明细并重新计算库存、批次、出库明细
|
|
|
for (MaterialIoOrderItemSaveReqVO itemVO : updateReqVO.getItems()) {
|
|
|
MaterialInboundOrderItemDO inboundItem = getInboundItemOrThrow(itemVO.getInboundItemId());
|
|
|
|
|
|
+ // 校验退回数量不能超过该出库明细当前数量(避免回扣后出现负数)
|
|
|
+ MaterialOutboundOrderItemDO outboundItem = outboundOrderItemMapper.selectById(itemVO.getOutboundItemId());
|
|
|
+ if (outboundItem == null) {
|
|
|
+ throw exceptionCustomMsg(COMMON_NOT_FOUND, "原出库明细不存在");
|
|
|
+ }
|
|
|
+ int currentOutQty = outboundItem.getQuantity() == null ? 0 : outboundItem.getQuantity();
|
|
|
+ if (currentOutQty < itemVO.getQuantity()) {
|
|
|
+ throw exceptionCustomMsg(COMMON_NOT_FOUND, "退回数量不能大于原出库数量");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 回扣出库明细数量
|
|
|
+ outboundItem.setQuantity(currentOutQty - itemVO.getQuantity());
|
|
|
+ outboundOrderItemMapper.updateById(outboundItem);
|
|
|
+
|
|
|
// 更新批次(增加)
|
|
|
applyOutboundReturnToBatch(inboundItem, itemVO.getQuantity());
|
|
|
|
|
|
@@ -623,6 +657,7 @@ public class MaterialIoServiceImpl implements MaterialIoService {
|
|
|
MaterialOutboundReturnOrderItemDO newItem = BeanUtils.toBean(itemVO, MaterialOutboundReturnOrderItemDO.class);
|
|
|
newItem.setReturnOrderId(order.getId());
|
|
|
newItem.setInboundItemId(itemVO.getInboundItemId());
|
|
|
+ newItem.setOutboundItemId(itemVO.getOutboundItemId());
|
|
|
newItem.setTenantId(updateObj.getTenantId());
|
|
|
outboundReturnOrderItemMapper.insert(newItem);
|
|
|
}
|
|
|
@@ -2239,7 +2274,13 @@ public class MaterialIoServiceImpl implements MaterialIoService {
|
|
|
private void applyOutboundReturnToBatch(MaterialInboundOrderItemDO inboundItem, int returnQty) {
|
|
|
int outQty = inboundItem.getOutQty() == null ? 0 : inboundItem.getOutQty();
|
|
|
int availableQty = inboundItem.getAvailableQty() == null ? 0 : inboundItem.getAvailableQty();
|
|
|
- inboundItem.setOutQty(outQty - returnQty);
|
|
|
+
|
|
|
+ int newOutQty = outQty - returnQty;
|
|
|
+ if (newOutQty < 0) {
|
|
|
+ throw exceptionCustomMsg(COMMON_NOT_FOUND, "退回数量不能大于该批次已出库数量");
|
|
|
+ }
|
|
|
+
|
|
|
+ inboundItem.setOutQty(newOutQty);
|
|
|
inboundItem.setAvailableQty(availableQty + returnQty);
|
|
|
inboundOrderItemMapper.updateById(inboundItem);
|
|
|
}
|