Browse Source

✨ feat(mes): 增强删除入库明细和行逻辑校验

YunaiV 6 months ago
parent
commit
bf026611e3

+ 5 - 2
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java

@@ -85,8 +85,11 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail
 
     @Override
     public void deleteItemReceiptDetail(Long id) {
-        // 校验存在
-        validateItemReceiptDetailExists(id);
+        // 1.1 校验存在
+        MesWmItemReceiptDetailDO detail = validateItemReceiptDetailExists(id);
+        // 1.2 校验父单据存在且为可编辑状态
+        itemReceiptService.validateItemReceiptEditable(detail.getReceiptId());
+
         // 删除
         itemReceiptDetailMapper.deleteById(id);
     }

+ 6 - 4
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java

@@ -98,12 +98,14 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteItemReceiptLine(Long id) {
-        // 校验存在
-        validateItemReceiptLineExists(id);
+        // 1.1 校验存在
+        MesWmItemReceiptLineDO line = validateItemReceiptLineExists(id);
+        // 1.2 校验父单据存在且为可编辑状态
+        itemReceiptService.validateItemReceiptEditable(line.getReceiptId());
 
-        // 级联删除明细
+        // 2.1 级联删除明细
         itemReceiptDetailService.deleteItemReceiptDetailByLineId(id);
-        // 删除
+        // 2.2 删除
         itemReceiptLineMapper.deleteById(id);
     }
 

+ 4 - 1
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java

@@ -147,11 +147,14 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService {
         }
         // 校验每行明细数量之和是否等于行入库数量
         List<MesWmItemReceiptLineDO> lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(id);
+        if (CollUtil.isEmpty(lines)) {
+            throw exception(WM_ITEM_RECEIPT_NO_LINE);
+        }
         for (MesWmItemReceiptLineDO line : lines) {
             List<MesWmItemReceiptDetailDO> details = itemReceiptDetailService.getItemReceiptDetailListByLineId(line.getId());
             BigDecimal totalDetailQty = CollectionUtils.getSumValue(details,
                     MesWmItemReceiptDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO);
-            if (line.getReceivedQuantity() != null && totalDetailQty.compareTo(line.getReceivedQuantity()) != 0) {
+            if (line.getReceivedQuantity() == null || totalDetailQty.compareTo(line.getReceivedQuantity()) != 0) {
                 throw exception(WM_ITEM_RECEIPT_DETAIL_QUANTITY_MISMATCH);
             }
         }