diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/line/MesWmMiscIssueLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/line/MesWmMiscIssueLineSaveReqVO.java index 2c5d6f6..8063cc1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/line/MesWmMiscIssueLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/line/MesWmMiscIssueLineSaveReqVO.java @@ -39,7 +39,8 @@ public class MesWmMiscIssueLineSaveReqVO { @Schema(description = "批次号", example = "BATCH20260301") private String batchCode; - @Schema(description = "仓库编号", example = "1") + @Schema(description = "仓库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "仓库不能为空") private Long warehouseId; @Schema(description = "库区编号", example = "1") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java index d1fe62a..e6196b2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/MesWmProductSalesLineController.java @@ -10,9 +10,11 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesW import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; + import cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales.MesWmProductSalesLineDO; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; import cn.iocoder.yudao.module.mes.service.md.unitmeasure.MesMdUnitMeasureService; + import cn.iocoder.yudao.module.mes.service.wm.productsales.MesWmProductSalesLineService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -45,6 +47,7 @@ public class MesWmProductSalesLineController { @Resource private MesMdUnitMeasureService unitMeasureService; + @PostMapping("/create") @Operation(summary = "创建销售出库单行") @PreAuthorize("@ss.hasPermission('mes:wm-product-sales:create')") @@ -108,6 +111,7 @@ public class MesWmProductSalesLineController { MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); + }); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineSaveReqVO.java index 800dce9..444c2b8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/productsales/vo/line/MesWmProductSalesLineSaveReqVO.java @@ -28,6 +28,12 @@ public class MesWmProductSalesLineSaveReqVO { @Schema(description = "批次ID", example = "1") private Long batchId; + @Schema(description = "批次号", example = "B20260301001") + private String batchCode; + + @Schema(description = "是否出厂检验", example = "true") + private Boolean oqcCheckFlag; + @Schema(description = "备注", example = "备注") private String remark; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java index 50c6e0f..cf390f7 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/productsales/MesWmProductSalesLineDO.java @@ -2,6 +2,10 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.productsales; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.materialstock.MesWmMaterialStockDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -46,11 +50,21 @@ public class MesWmProductSalesLineDO extends BaseDO { */ private BigDecimal quantity; /** - * 批次ID + * 批次 ID + * + * 关联 {@link MesWmBatchDO#getId()} */ private Long batchId; /** + * 批次号 + * + * 关联 {@link MesWmBatchDO#getCode()} + */ + private String batchCode; + /** * 库存记录ID + * + * 关联 {@link MesWmMaterialStockDO#getId()} */ private Long materialStockId; /** @@ -60,13 +74,13 @@ public class MesWmProductSalesLineDO extends BaseDO { /** * 出厂检验单 ID * - * 关联 {@link cn.iocoder.yudao.module.mes.dal.dataobject.qc.oqc.MesQcOqcDO#getId()} + * 关联 {@link MesQcOqcDO#getId()} */ private Long oqcId; /** * 质量状态 * - * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum} + * 枚举 {@link MesWmQualityStatusEnum} */ private Integer qualityStatus; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java index 80ac949..92936f9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java @@ -46,14 +46,8 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService @Override @Transactional(rollbackFor = Exception.class) public Long createMiscIssueLine(MesWmMiscIssueLineSaveReqVO createReqVO) { - // TODO @AI:增加 validateXXXSaveData - // 1.1 校验父单据存在且为可编辑状态 - miscIssueService.validateMiscIssueEditable(createReqVO.getIssueId()); - // 1.2 校验物料存在 - itemService.validateItemExists(createReqVO.getItemId()); - // 1.3 校验仓库、库区、库位的父子关系 - warehouseAreaService.validateWarehouseAreaExists(createReqVO.getWarehouseId(), - createReqVO.getLocationId(), createReqVO.getAreaId()); + // 1. 校验数据 + validateMiscIssueLineSaveData(createReqVO.getIssueId(), createReqVO); // 2. 新增行 MesWmMiscIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmMiscIssueLineDO.class); @@ -70,14 +64,8 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService public void updateMiscIssueLine(MesWmMiscIssueLineSaveReqVO updateReqVO) { // 1.1 校验存在 MesWmMiscIssueLineDO line = validateAndGetMiscIssueLine(updateReqVO.getId()); - // TODO @AI:增加 validateXXXSaveData - // 1.2 校验父单据存在且为可编辑状态 - miscIssueService.validateMiscIssueEditable(line.getIssueId()); - // 1.3 校验物料存在 - itemService.validateItemExists(updateReqVO.getItemId()); - // 1.4 校验仓库、库区、库位的父子关系 - warehouseAreaService.validateWarehouseAreaExists(updateReqVO.getWarehouseId(), - updateReqVO.getLocationId(), updateReqVO.getAreaId()); + // 1.2 校验数据 + validateMiscIssueLineSaveData(line.getIssueId(), updateReqVO); // 2. 更新行 MesWmMiscIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMiscIssueLineDO.class); @@ -140,4 +128,14 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService return line; } + private void validateMiscIssueLineSaveData(Long issueId, MesWmMiscIssueLineSaveReqVO reqVO) { + // 校验父单据存在且为可编辑状态 + miscIssueService.validateMiscIssueEditable(issueId); + // 校验物料存在 + itemService.validateItemExists(reqVO.getItemId()); + // 校验仓库、库区、库位的父子关系 + warehouseAreaService.validateWarehouseAreaExists(reqVO.getWarehouseId(), + reqVO.getLocationId(), reqVO.getAreaId()); + } + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java index 4e4948a..c9cff11 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/productsales/MesWmProductSalesLineServiceImpl.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.service.wm.productsales; import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.productsales.vo.line.MesWmProductSalesLineSaveReqVO; @@ -11,6 +12,8 @@ import cn.iocoder.yudao.module.mes.dal.mysql.wm.productsales.MesWmProductSalesLi import cn.iocoder.yudao.module.mes.enums.qc.MesQcCheckResultEnum; import cn.iocoder.yudao.module.mes.enums.wm.MesWmQualityStatusEnum; import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.wm.batch.MesWmBatchService; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.batch.MesWmBatchDO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Lazy; @@ -42,6 +45,8 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe @Resource private MesMdItemService itemService; @Resource + private MesWmBatchService batchService; + @Resource @Lazy private MesWmProductSalesService productSalesService; @@ -49,6 +54,8 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe public Long createProductSalesLine(MesWmProductSalesLineSaveReqVO createReqVO) { // 校验物料存在 itemService.validateItemExists(createReqVO.getItemId()); + // 根据 batchCode 解析 batchId + fillBatchId(createReqVO); // 新增 MesWmProductSalesLineDO line = BeanUtils.toBean(createReqVO, MesWmProductSalesLineDO.class); @@ -62,6 +69,8 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe validateProductSalesLineExists(updateReqVO.getId()); // 校验物料存在 itemService.validateItemExists(updateReqVO.getItemId()); + // 根据 batchCode 解析 batchId + fillBatchId(updateReqVO); // 更新 MesWmProductSalesLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmProductSalesLineDO.class); @@ -118,6 +127,18 @@ public class MesWmProductSalesLineServiceImpl implements MesWmProductSalesLineSe return line; } + /** + * 根据 batchCode 解析 batchId + */ + private void fillBatchId(MesWmProductSalesLineSaveReqVO reqVO) { + if (StrUtil.isBlank(reqVO.getBatchCode())) { + reqVO.setBatchId(null); + return; + } + MesWmBatchDO batch = batchService.getBatchByCode(reqVO.getBatchCode()); + reqVO.setBatchId(batch != null ? batch.getId() : null); + } + @Override @Transactional(rollbackFor = Exception.class) public void updateProductSalesLineWhenOqcFinish(Long id, Long oqcId, Integer checkResult) {