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

BUGFIX
1、出库退回,没有对出库单进行回退

liangwenxuan 3 месяцев назад
Родитель
Сommit
811a7a3f45

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/biz/MaterialIoController.java

@@ -85,7 +85,7 @@ public class MaterialIoController {
     }
 
     @PutMapping("/update")
-    @Operation(summary = "编辑单据(不冲销库存)")
+    @Operation(summary = "编辑单据")
     @TenantIgnore
     public CommonResult<Boolean> update(@Valid @RequestBody MaterialIoOrderSaveReqVO reqVO) {
         materialIoService.update(reqVO);

+ 47 - 6
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/biz/MaterialIoServiceImpl.java

@@ -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);
     }