Commit 34c1199b762e36afd7b628cf8cebf6677f4ee2bb
1 parent
caf4c2ff
✨ feat(mes): 添加数量校验逻辑,更新入库明细处理
新增对上架数量和入库数量的校验逻辑,确保入库明细的总数量不超过行入库数量。优化了入库单和入库明细的创建与更新流程,提升数据一致性和准确性。
Showing
9 changed files
with
108 additions
and
55 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptRespVO.java
| @@ -38,10 +38,6 @@ public class MesWmItemReceiptRespVO { | @@ -38,10 +38,6 @@ public class MesWmItemReceiptRespVO { | ||
| 38 | @ExcelProperty("到货通知单") | 38 | @ExcelProperty("到货通知单") |
| 39 | private String noticeCode; | 39 | private String noticeCode; |
| 40 | 40 | ||
| 41 | - @Schema(description = "采购订单编号", example = "PO20260101") | ||
| 42 | - @ExcelProperty("采购订单编号") | ||
| 43 | - private String purchaseOrderCode; | ||
| 44 | - | ||
| 45 | @Schema(description = "供应商编号", example = "1") | 41 | @Schema(description = "供应商编号", example = "1") |
| 46 | private Long vendorId; | 42 | private Long vendorId; |
| 47 | 43 | ||
| @@ -49,27 +45,6 @@ public class MesWmItemReceiptRespVO { | @@ -49,27 +45,6 @@ public class MesWmItemReceiptRespVO { | ||
| 49 | @ExcelProperty("供应商") | 45 | @ExcelProperty("供应商") |
| 50 | private String vendorName; | 46 | private String vendorName; |
| 51 | 47 | ||
| 52 | - @Schema(description = "仓库编号", example = "1") | ||
| 53 | - private Long warehouseId; | ||
| 54 | - | ||
| 55 | - @Schema(description = "仓库名称", example = "原料仓") | ||
| 56 | - @ExcelProperty("仓库") | ||
| 57 | - private String warehouseName; | ||
| 58 | - | ||
| 59 | - @Schema(description = "库区编号", example = "1") | ||
| 60 | - private Long locationId; | ||
| 61 | - | ||
| 62 | - @Schema(description = "库区名称", example = "A 区") | ||
| 63 | - @ExcelProperty("库区") | ||
| 64 | - private String locationName; | ||
| 65 | - | ||
| 66 | - @Schema(description = "库位编号", example = "1") | ||
| 67 | - private Long areaId; | ||
| 68 | - | ||
| 69 | - @Schema(description = "库位名称", example = "A-01") | ||
| 70 | - @ExcelProperty("库位") | ||
| 71 | - private String areaName; | ||
| 72 | - | ||
| 73 | @Schema(description = "入库日期") | 48 | @Schema(description = "入库日期") |
| 74 | @ExcelProperty("入库日期") | 49 | @ExcelProperty("入库日期") |
| 75 | private LocalDateTime receiptDate; | 50 | private LocalDateTime receiptDate; |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailSaveReqVO.java
| 1 | package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail; | 1 | package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail; |
| 2 | 2 | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | +import jakarta.validation.constraints.DecimalMin; | ||
| 4 | import jakarta.validation.constraints.NotNull; | 5 | import jakarta.validation.constraints.NotNull; |
| 5 | import lombok.Data; | 6 | import lombok.Data; |
| 6 | 7 | ||
| @@ -27,6 +28,7 @@ public class MesWmItemReceiptDetailSaveReqVO { | @@ -27,6 +28,7 @@ public class MesWmItemReceiptDetailSaveReqVO { | ||
| 27 | 28 | ||
| 28 | @Schema(description = "上架数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") | 29 | @Schema(description = "上架数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") |
| 29 | @NotNull(message = "上架数量不能为空") | 30 | @NotNull(message = "上架数量不能为空") |
| 31 | + @DecimalMin(value = "0", inclusive = false, message = "上架数量必须大于 0") | ||
| 30 | private BigDecimal quantity; | 32 | private BigDecimal quantity; |
| 31 | 33 | ||
| 32 | @Schema(description = "批次编号", example = "1") | 34 | @Schema(description = "批次编号", example = "1") |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineSaveReqVO.java
| 1 | package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line; | 1 | package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line; |
| 2 | 2 | ||
| 3 | import io.swagger.v3.oas.annotations.media.Schema; | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 4 | +import jakarta.validation.constraints.DecimalMin; | ||
| 4 | import jakarta.validation.constraints.NotNull; | 5 | import jakarta.validation.constraints.NotNull; |
| 5 | import lombok.Data; | 6 | import lombok.Data; |
| 6 | 7 | ||
| @@ -27,6 +28,7 @@ public class MesWmItemReceiptLineSaveReqVO { | @@ -27,6 +28,7 @@ public class MesWmItemReceiptLineSaveReqVO { | ||
| 27 | 28 | ||
| 28 | @Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "500.00") | 29 | @Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "500.00") |
| 29 | @NotNull(message = "入库数量不能为空") | 30 | @NotNull(message = "入库数量不能为空") |
| 31 | + @DecimalMin(value = "0", inclusive = false, message = "入库数量必须大于 0") | ||
| 30 | private BigDecimal receivedQuantity; | 32 | private BigDecimal receivedQuantity; |
| 31 | 33 | ||
| 32 | // TODO DONE @芋艿:已添加 batchCode 字段,前端可以使用 batchCode 输入批次编码 | 34 | // TODO DONE @芋艿:已添加 batchCode 字段,前端可以使用 batchCode 输入批次编码 |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
| @@ -397,6 +397,7 @@ public interface ErrorCodeConstants { | @@ -397,6 +397,7 @@ public interface ErrorCodeConstants { | ||
| 397 | ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_NOT_ALLOWED = new ErrorCode(1_040_705_102, | 397 | ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_NOT_ALLOWED = new ErrorCode(1_040_705_102, |
| 398 | "入库单未关联到货通知单,不能选择到货通知单行"); | 398 | "入库单未关联到货通知单,不能选择到货通知单行"); |
| 399 | ErrorCode WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_705_200, "采购入库明细不存在"); | 399 | ErrorCode WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_705_200, "采购入库明细不存在"); |
| 400 | + ErrorCode WM_ITEM_RECEIPT_DETAIL_QUANTITY_EXCEED = new ErrorCode(1_040_705_202, "上架明细总数量不能超过行入库数量"); | ||
| 400 | 401 | ||
| 401 | // ========== MES 仓库管理-领料申请单(1-040-706-000) ========== | 402 | // ========== MES 仓库管理-领料申请单(1-040-706-000) ========== |
| 402 | ErrorCode WM_MATERIAL_REQUEST_NOT_EXISTS = new ErrorCode(1_040_706_000, "领料申请单不存在"); | 403 | ErrorCode WM_MATERIAL_REQUEST_NOT_EXISTS = new ErrorCode(1_040_706_000, "领料申请单不存在"); |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java
| @@ -93,6 +93,14 @@ public interface MesWmArrivalNoticeService { | @@ -93,6 +93,14 @@ public interface MesWmArrivalNoticeService { | ||
| 93 | } | 93 | } |
| 94 | 94 | ||
| 95 | /** | 95 | /** |
| 96 | + * 校验到货通知单存在 | ||
| 97 | + * | ||
| 98 | + * @param id 编号 | ||
| 99 | + * @return 到货通知单 | ||
| 100 | + */ | ||
| 101 | + MesWmArrivalNoticeDO validateArrivalNoticeExists(Long id); | ||
| 102 | + | ||
| 103 | + /** | ||
| 96 | * 校验到货通知单和行存在,且行属于该通知单 | 104 | * 校验到货通知单和行存在,且行属于该通知单 |
| 97 | * | 105 | * |
| 98 | * @param noticeId 到货通知单 ID | 106 | * @param noticeId 到货通知单 ID |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java
| @@ -184,7 +184,8 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService | @@ -184,7 +184,8 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService | ||
| 184 | } | 184 | } |
| 185 | } | 185 | } |
| 186 | 186 | ||
| 187 | - private MesWmArrivalNoticeDO validateArrivalNoticeExists(Long id) { | 187 | + @Override |
| 188 | + public MesWmArrivalNoticeDO validateArrivalNoticeExists(Long id) { | ||
| 188 | MesWmArrivalNoticeDO notice = arrivalNoticeMapper.selectById(id); | 189 | MesWmArrivalNoticeDO notice = arrivalNoticeMapper.selectById(id); |
| 189 | if (notice == null) { | 190 | if (notice == null) { |
| 190 | throw exception(WM_ARRIVAL_NOTICE_NOT_EXISTS); | 191 | throw exception(WM_ARRIVAL_NOTICE_NOT_EXISTS); |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java
| 1 | package cn.iocoder.yudao.module.mes.service.wm.itemreceipt; | 1 | package cn.iocoder.yudao.module.mes.service.wm.itemreceipt; |
| 2 | 2 | ||
| 3 | +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 3 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 4 | import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO; | 5 | import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO; |
| 5 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; | 6 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; |
| 7 | +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; | ||
| 6 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper; | 8 | import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper; |
| 9 | +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; | ||
| 7 | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; | 10 | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; |
| 8 | import jakarta.annotation.Resource; | 11 | import jakarta.annotation.Resource; |
| 9 | import org.springframework.context.annotation.Lazy; | 12 | import org.springframework.context.annotation.Lazy; |
| 10 | import org.springframework.stereotype.Service; | 13 | import org.springframework.stereotype.Service; |
| 11 | import org.springframework.validation.annotation.Validated; | 14 | import org.springframework.validation.annotation.Validated; |
| 12 | 15 | ||
| 16 | +import java.math.BigDecimal; | ||
| 13 | import java.util.List; | 17 | import java.util.List; |
| 14 | 18 | ||
| 15 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 19 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| @@ -30,40 +34,53 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail | @@ -30,40 +34,53 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail | ||
| 30 | private MesWmItemReceiptService itemReceiptService; | 34 | private MesWmItemReceiptService itemReceiptService; |
| 31 | 35 | ||
| 32 | @Resource | 36 | @Resource |
| 37 | + @Lazy | ||
| 38 | + private MesWmItemReceiptLineService itemReceiptLineService; | ||
| 39 | + | ||
| 40 | + @Resource | ||
| 33 | private MesWmWarehouseAreaService warehouseAreaService; | 41 | private MesWmWarehouseAreaService warehouseAreaService; |
| 42 | + @Resource | ||
| 43 | + @Lazy | ||
| 44 | + private MesWmMaterialStockService materialStockService; | ||
| 34 | 45 | ||
| 35 | @Override | 46 | @Override |
| 36 | public Long createItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO createReqVO) { | 47 | public Long createItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO createReqVO) { |
| 37 | - // 校验父单据存在且为可编辑状态 | 48 | + // 1. 校验数据 |
| 38 | itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); | 49 | itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); |
| 39 | - // 校验库区关系 | ||
| 40 | - warehouseAreaService.validateWarehouseAreaExists( | ||
| 41 | - createReqVO.getWarehouseId(), createReqVO.getLocationId(), createReqVO.getAreaId()); | ||
| 42 | - // TODO @芋艿:【后续搞】超过数量验证; | ||
| 43 | - | ||
| 44 | - // TODO @芋艿:【后续搞】不允许物资混放 | 50 | + validateItemReceiptDetailSaveData(createReqVO); |
| 45 | 51 | ||
| 52 | + // 2. 插入 | ||
| 46 | MesWmItemReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmItemReceiptDetailDO.class); | 53 | MesWmItemReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmItemReceiptDetailDO.class); |
| 47 | itemReceiptDetailMapper.insert(detail); | 54 | itemReceiptDetailMapper.insert(detail); |
| 55 | + | ||
| 56 | + // 3. 插入后校验数量是否超出 | ||
| 57 | + validateDetailQuantityNotExceed(createReqVO.getLineId()); | ||
| 48 | return detail.getId(); | 58 | return detail.getId(); |
| 49 | } | 59 | } |
| 50 | 60 | ||
| 51 | @Override | 61 | @Override |
| 52 | public void updateItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO updateReqVO) { | 62 | public void updateItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO updateReqVO) { |
| 53 | - // 校验存在 | 63 | + // 1.1 校验存在 |
| 54 | MesWmItemReceiptDetailDO detail = validateItemReceiptDetailExists(updateReqVO.getId()); | 64 | MesWmItemReceiptDetailDO detail = validateItemReceiptDetailExists(updateReqVO.getId()); |
| 55 | - // 校验父单据存在且为可编辑状态 | ||
| 56 | - itemReceiptService.validateItemReceiptEditable(detail.getReceiptId()); | ||
| 57 | - // 校验库区关系 | ||
| 58 | - warehouseAreaService.validateWarehouseAreaExists( | ||
| 59 | - updateReqVO.getWarehouseId(), updateReqVO.getLocationId(), updateReqVO.getAreaId()); | ||
| 60 | - // TODO @芋艿:【后续搞】超过数量验证; | ||
| 61 | - | ||
| 62 | - // TODO @芋艿:【后续搞】不允许物资混放 | 65 | + // 1.2 校验数据 |
| 66 | + updateReqVO.setReceiptId(detail.getReceiptId()); | ||
| 67 | + validateItemReceiptDetailSaveData(updateReqVO); | ||
| 63 | 68 | ||
| 64 | - // 更新 | 69 | + // 2. 更新 |
| 65 | MesWmItemReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptDetailDO.class); | 70 | MesWmItemReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptDetailDO.class); |
| 66 | itemReceiptDetailMapper.updateById(updateObj); | 71 | itemReceiptDetailMapper.updateById(updateObj); |
| 72 | + | ||
| 73 | + // 3. 更新后校验数量是否超出 | ||
| 74 | + validateDetailQuantityNotExceed(detail.getLineId()); | ||
| 75 | + } | ||
| 76 | + | ||
| 77 | + private void validateItemReceiptDetailSaveData(MesWmItemReceiptDetailSaveReqVO reqVO) { | ||
| 78 | + // 校验父单据存在且为可编辑状态 | ||
| 79 | + itemReceiptService.validateItemReceiptEditable(reqVO.getReceiptId()); | ||
| 80 | + // 校验库区关系 | ||
| 81 | + warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(), reqVO.getLocationId(), reqVO.getAreaId()); | ||
| 82 | + // 校验库位物料/批次混放规则 | ||
| 83 | + materialStockService.checkAreaMixingRule(reqVO.getAreaId(), reqVO.getItemId(), reqVO.getBatchId()); | ||
| 67 | } | 84 | } |
| 68 | 85 | ||
| 69 | @Override | 86 | @Override |
| @@ -107,4 +124,22 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail | @@ -107,4 +124,22 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail | ||
| 107 | return detail; | 124 | return detail; |
| 108 | } | 125 | } |
| 109 | 126 | ||
| 127 | + /** | ||
| 128 | + * 校验行下所有明细的数量之和不超过行的入库数量 | ||
| 129 | + * | ||
| 130 | + * @param lineId 行编号 | ||
| 131 | + */ | ||
| 132 | + private void validateDetailQuantityNotExceed(Long lineId) { | ||
| 133 | + MesWmItemReceiptLineDO line = itemReceiptLineService.getItemReceiptLine(lineId); | ||
| 134 | + if (line == null || line.getReceivedQuantity() == null) { | ||
| 135 | + return; | ||
| 136 | + } | ||
| 137 | + List<MesWmItemReceiptDetailDO> details = itemReceiptDetailMapper.selectListByLineId(lineId); | ||
| 138 | + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, | ||
| 139 | + MesWmItemReceiptDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); | ||
| 140 | + if (totalDetailQty.compareTo(line.getReceivedQuantity()) > 0) { | ||
| 141 | + throw exception(WM_ITEM_RECEIPT_DETAIL_QUANTITY_EXCEED); | ||
| 142 | + } | ||
| 143 | + } | ||
| 144 | + | ||
| 110 | } | 145 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java
| @@ -52,20 +52,20 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ | @@ -52,20 +52,20 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ | ||
| 52 | 52 | ||
| 53 | @Override | 53 | @Override |
| 54 | public Long createItemReceiptLine(MesWmItemReceiptLineSaveReqVO createReqVO) { | 54 | public Long createItemReceiptLine(MesWmItemReceiptLineSaveReqVO createReqVO) { |
| 55 | - // 1.1 校验父单据存在且为可编辑状态 | 55 | + // 1. 校验父单据存在且为可编辑状态 |
| 56 | MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); | 56 | MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); |
| 57 | - // 1.2 校验关联到货通知单行存在 | ||
| 58 | - validateArrivalNoticeLine(receipt, createReqVO.getArrivalNoticeLineId()); | 57 | + // 2. 校验数据 |
| 58 | + validateItemReceiptLineSaveData(receipt, createReqVO); | ||
| 59 | 59 | ||
| 60 | - // 2.1 创建入库单行 | 60 | + // 3.1 创建入库单行 |
| 61 | MesWmItemReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmItemReceiptLineDO.class); | 61 | MesWmItemReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmItemReceiptLineDO.class); |
| 62 | - // 2.2 生成或获取批次 | 62 | + // 3.2 生成或获取批次 |
| 63 | MesWmBatchDO batch = generateOrGetBatch(receipt, createReqVO); | 63 | MesWmBatchDO batch = generateOrGetBatch(receipt, createReqVO); |
| 64 | if (batch != null) { | 64 | if (batch != null) { |
| 65 | line.setBatchId(batch.getId()); | 65 | line.setBatchId(batch.getId()); |
| 66 | line.setBatchCode(batch.getCode()); | 66 | line.setBatchCode(batch.getCode()); |
| 67 | } | 67 | } |
| 68 | - // 2.3 插入数据库 | 68 | + // 3.3 插入数据库 |
| 69 | itemReceiptLineMapper.insert(line); | 69 | itemReceiptLineMapper.insert(line); |
| 70 | return line.getId(); | 70 | return line.getId(); |
| 71 | } | 71 | } |
| @@ -76,8 +76,8 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ | @@ -76,8 +76,8 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ | ||
| 76 | MesWmItemReceiptLineDO line = validateItemReceiptLineExists(updateReqVO.getId()); | 76 | MesWmItemReceiptLineDO line = validateItemReceiptLineExists(updateReqVO.getId()); |
| 77 | // 1.2 校验父单据存在且为可编辑状态 | 77 | // 1.2 校验父单据存在且为可编辑状态 |
| 78 | MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(line.getReceiptId()); | 78 | MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(line.getReceiptId()); |
| 79 | - // 1.3 校验关联到货通知单行存在 | ||
| 80 | - validateArrivalNoticeLine(receipt, updateReqVO.getArrivalNoticeLineId()); | 79 | + // 1.3 校验数据 |
| 80 | + validateItemReceiptLineSaveData(receipt, updateReqVO); | ||
| 81 | 81 | ||
| 82 | // 2.1 更新 | 82 | // 2.1 更新 |
| 83 | MesWmItemReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptLineDO.class); | 83 | MesWmItemReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptLineDO.class); |
| @@ -90,6 +90,11 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ | @@ -90,6 +90,11 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ | ||
| 90 | itemReceiptLineMapper.updateById(updateObj); | 90 | itemReceiptLineMapper.updateById(updateObj); |
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | + private void validateItemReceiptLineSaveData(MesWmItemReceiptDO receipt, MesWmItemReceiptLineSaveReqVO reqVO) { | ||
| 94 | + // 校验关联到货通知单行 | ||
| 95 | + validateArrivalNoticeLine(receipt, reqVO.getArrivalNoticeLineId()); | ||
| 96 | + } | ||
| 97 | + | ||
| 93 | @Override | 98 | @Override |
| 94 | @Transactional(rollbackFor = Exception.class) | 99 | @Transactional(rollbackFor = Exception.class) |
| 95 | public void deleteItemReceiptLine(Long id) { | 100 | public void deleteItemReceiptLine(Long id) { |
| @@ -162,6 +167,8 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ | @@ -162,6 +167,8 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ | ||
| 162 | return line; | 167 | return line; |
| 163 | } | 168 | } |
| 164 | 169 | ||
| 170 | + | ||
| 171 | + | ||
| 165 | /** | 172 | /** |
| 166 | * 生成或获取批次 | 173 | * 生成或获取批次 |
| 167 | * | 174 | * |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java
| @@ -15,6 +15,8 @@ import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapp | @@ -15,6 +15,8 @@ import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapp | ||
| 15 | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; | 15 | import cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants; |
| 16 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; | 16 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; |
| 17 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; | 17 | import cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum; |
| 18 | +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; | ||
| 19 | +import cn.iocoder.yudao.module.mes.service.qc.iqc.MesQcIqcService; | ||
| 18 | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; | 20 | import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; |
| 19 | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; | 21 | import cn.iocoder.yudao.module.mes.service.wm.transaction.MesWmTransactionService; |
| 20 | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; | 22 | import cn.iocoder.yudao.module.mes.service.wm.transaction.dto.MesWmTransactionSaveReqDTO; |
| @@ -48,14 +50,19 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { | @@ -48,14 +50,19 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { | ||
| 48 | @Resource | 50 | @Resource |
| 49 | @Lazy | 51 | @Lazy |
| 50 | private MesWmArrivalNoticeService arrivalNoticeService; | 52 | private MesWmArrivalNoticeService arrivalNoticeService; |
| 53 | + @Resource | ||
| 54 | + private MesMdVendorService vendorService; | ||
| 55 | + @Resource | ||
| 56 | + @Lazy | ||
| 57 | + private MesQcIqcService iqcService; | ||
| 51 | 58 | ||
| 52 | @Resource | 59 | @Resource |
| 53 | private MesWmTransactionService wmTransactionService; | 60 | private MesWmTransactionService wmTransactionService; |
| 54 | 61 | ||
| 55 | @Override | 62 | @Override |
| 56 | public Long createItemReceipt(MesWmItemReceiptSaveReqVO createReqVO) { | 63 | public Long createItemReceipt(MesWmItemReceiptSaveReqVO createReqVO) { |
| 57 | - // 校验编码唯一 | ||
| 58 | - validateCodeUnique(null, createReqVO.getCode()); | 64 | + // 校验数据 |
| 65 | + validateItemReceiptSaveData(createReqVO); | ||
| 59 | 66 | ||
| 60 | // 插入 | 67 | // 插入 |
| 61 | MesWmItemReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmItemReceiptDO.class); | 68 | MesWmItemReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmItemReceiptDO.class); |
| @@ -68,14 +75,29 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { | @@ -68,14 +75,29 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { | ||
| 68 | public void updateItemReceipt(MesWmItemReceiptSaveReqVO updateReqVO) { | 75 | public void updateItemReceipt(MesWmItemReceiptSaveReqVO updateReqVO) { |
| 69 | // 校验存在 + 草稿状态 | 76 | // 校验存在 + 草稿状态 |
| 70 | validateItemReceiptExistsAndDraft(updateReqVO.getId()); | 77 | validateItemReceiptExistsAndDraft(updateReqVO.getId()); |
| 71 | - // 校验编码唯一 | ||
| 72 | - validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); | 78 | + // 校验数据 |
| 79 | + validateItemReceiptSaveData(updateReqVO); | ||
| 73 | 80 | ||
| 74 | // 更新 | 81 | // 更新 |
| 75 | MesWmItemReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptDO.class); | 82 | MesWmItemReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptDO.class); |
| 76 | itemReceiptMapper.updateById(updateObj); | 83 | itemReceiptMapper.updateById(updateObj); |
| 77 | } | 84 | } |
| 78 | 85 | ||
| 86 | + private void validateItemReceiptSaveData(MesWmItemReceiptSaveReqVO reqVO) { | ||
| 87 | + // 校验编码唯一 | ||
| 88 | + validateCodeUnique(reqVO.getId(), reqVO.getCode()); | ||
| 89 | + // 校验供应商存在 | ||
| 90 | + vendorService.validateVendorExists(reqVO.getVendorId()); | ||
| 91 | + // 校验到货通知单存在 | ||
| 92 | + if (reqVO.getNoticeId() != null) { | ||
| 93 | + arrivalNoticeService.validateArrivalNoticeExists(reqVO.getNoticeId()); | ||
| 94 | + } | ||
| 95 | + // 校验来料检验单存在 | ||
| 96 | + if (reqVO.getIqcId() != null) { | ||
| 97 | + iqcService.validateIqcExists(reqVO.getIqcId()); | ||
| 98 | + } | ||
| 99 | + } | ||
| 100 | + | ||
| 79 | @Override | 101 | @Override |
| 80 | @Transactional(rollbackFor = Exception.class) | 102 | @Transactional(rollbackFor = Exception.class) |
| 81 | public void deleteItemReceipt(Long id) { | 103 | public void deleteItemReceipt(Long id) { |