diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java index 094538a..d0743a8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/MesWmArrivalNoticeLineController.java @@ -95,6 +95,16 @@ public class MesWmArrivalNoticeLineController { return success(new PageResult<>(buildRespVOList(pageResult.getList()), pageResult.getTotal())); } + @GetMapping("/list-by-notice-id") + @Operation(summary = "获得到货通知单行列表") + @Parameter(name = "noticeId", description = "到货通知单编号", required = true, example = "1024") + @PreAuthorize("@ss.hasPermission('mes:wm-arrival-notice:query')") + public CommonResult> getArrivalNoticeLineListByNoticeId( + @RequestParam("noticeId") Long noticeId) { + List list = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(noticeId); + return success(buildRespVOList(list)); + } + // ==================== 拼接 VO ==================== private List buildRespVOList(List list) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java index 5fcb6fb..3ea245d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptController.java @@ -137,14 +137,12 @@ public class MesWmItemReceiptController { return success(true); } - // TODO DONE @芋艿:shelving 是合适的单词。shelving 意为"上架/放置到货架",与业务语义一致 - // TODO @AI:想了下,还是叫 stock 更好。stocking 意为"入库/存储",与业务语义更一致;shelving 更侧重于"上架",不够全面;而且 stocking 也更常用一些。 - @PutMapping("/shelving") + @PutMapping("/stock") @Operation(summary = "执行上架") @Parameter(name = "id", description = "编号", required = true) @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:update')") - public CommonResult shelvingItemReceipt(@RequestParam("id") Long id) { - itemReceiptService.shelvingItemReceipt(id); + public CommonResult stockItemReceipt(@RequestParam("id") Long id) { + itemReceiptService.stockItemReceipt(id); return success(true); } @@ -175,12 +173,6 @@ public class MesWmItemReceiptController { // 1. 获得关联数据 Map vendorMap = vendorService.getVendorMap( convertSet(list, MesWmItemReceiptDO::getVendorId)); - Map warehouseMap = warehouseService.getWarehouseMap( - convertSet(list, MesWmItemReceiptDO::getWarehouseId)); - Map locationMap = locationService.getWarehouseLocationMap( - convertSet(list, MesWmItemReceiptDO::getLocationId)); - Map areaMap = areaService.getWarehouseAreaMap( - convertSet(list, MesWmItemReceiptDO::getAreaId)); Map iqcMap = iqcService.getIqcMap( convertSet(list, MesWmItemReceiptDO::getIqcId)); Map noticeMap = arrivalNoticeService.getArrivalNoticeMap( @@ -189,12 +181,6 @@ public class MesWmItemReceiptController { return BeanUtils.toBean(list, MesWmItemReceiptRespVO.class, vo -> { MapUtils.findAndThen(vendorMap, vo.getVendorId(), vendor -> vo.setVendorName(vendor.getName())); - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), - warehouse -> vo.setWarehouseName(warehouse.getName())); - MapUtils.findAndThen(locationMap, vo.getLocationId(), - location -> vo.setLocationName(location.getName())); - MapUtils.findAndThen(areaMap, vo.getAreaId(), - area -> vo.setAreaName(area.getName())); MapUtils.findAndThen(iqcMap, vo.getIqcId(), iqc -> vo.setIqcCode(iqc.getCode())); MapUtils.findAndThen(noticeMap, vo.getNoticeId(), diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java index 01ea822..7d7307b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptLineController.java @@ -10,18 +10,10 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWm import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO; 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.qc.iqc.MesQcIqcDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; 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.qc.iqc.MesQcIqcService; import cn.iocoder.yudao.module.mes.service.wm.itemreceipt.MesWmItemReceiptLineService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; -import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; @@ -53,18 +45,6 @@ public class MesWmItemReceiptLineController { @Resource private MesMdUnitMeasureService unitMeasureService; - @Resource - private MesWmWarehouseService warehouseService; - - @Resource - private MesWmWarehouseLocationService locationService; - - @Resource - private MesWmWarehouseAreaService areaService; - - @Resource - private MesQcIqcService iqcService; - @PostMapping("/create") @Operation(summary = "创建采购入库单行") @PreAuthorize("@ss.hasPermission('mes:wm-item-receipt:create')") @@ -121,14 +101,6 @@ public class MesWmItemReceiptLineController { convertSet(list, MesWmItemReceiptLineDO::getItemId)); Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); - Map warehouseMap = warehouseService.getWarehouseMap( - convertSet(list, MesWmItemReceiptLineDO::getWarehouseId)); - Map locationMap = locationService.getWarehouseLocationMap( - convertSet(list, MesWmItemReceiptLineDO::getLocationId)); - Map areaMap = areaService.getWarehouseAreaMap( - convertSet(list, MesWmItemReceiptLineDO::getAreaId)); - Map iqcMap = iqcService.getIqcMap( - convertSet(list, MesWmItemReceiptLineDO::getIqcId)); // 2. 构建结果 return BeanUtils.toBean(list, MesWmItemReceiptLineRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { @@ -136,14 +108,6 @@ public class MesWmItemReceiptLineController { MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); - MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), - warehouse -> vo.setWarehouseName(warehouse.getName())); - MapUtils.findAndThen(locationMap, vo.getLocationId(), - location -> vo.setLocationName(location.getName())); - MapUtils.findAndThen(areaMap, vo.getAreaId(), - area -> vo.setAreaName(area.getName())); - MapUtils.findAndThen(iqcMap, vo.getIqcId(), - iqc -> vo.setIqcCode(iqc.getCode())); }); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptPageReqVO.java index 2917310..0f7ae53 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptPageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptPageReqVO.java @@ -23,9 +23,6 @@ public class MesWmItemReceiptPageReqVO extends PageParam { @Schema(description = "入库单名称", example = "钢板入库单") private String name; - @Schema(description = "采购订单编号", example = "PO20260101") - private String purchaseOrderCode; - @Schema(description = "供应商编号", example = "1") private Long vendorId; @@ -33,7 +30,4 @@ public class MesWmItemReceiptPageReqVO extends PageParam { @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) private LocalDateTime[] receiptDate; - @Schema(description = "状态", example = "0") - private Integer status; - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java index acf906f..5921098 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/MesWmItemReceiptSaveReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.Data; import java.time.LocalDateTime; @@ -26,22 +27,12 @@ public class MesWmItemReceiptSaveReqVO { @Schema(description = "到货通知单编号", example = "1") private Long noticeId; - @Schema(description = "采购订单编号", example = "PO20260101") - private String purchaseOrderCode; - - @Schema(description = "供应商编号", example = "1") + @Schema(description = "供应商编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "供应商不能为空") private Long vendorId; - @Schema(description = "仓库编号", example = "1") - private Long warehouseId; - - @Schema(description = "库区编号", example = "1") - private Long locationId; - - @Schema(description = "库位编号", example = "1") - private Long areaId; - - @Schema(description = "入库日期") + @Schema(description = "入库日期", requiredMode = Schema.RequiredMode.REQUIRED) + @NotNull(message = "入库日期不能为空") private LocalDateTime receiptDate; @Schema(description = "备注", example = "备注") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java index 66a7936..afb2fe8 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineRespVO.java @@ -17,7 +17,7 @@ public class MesWmItemReceiptLineRespVO { private Long receiptId; @Schema(description = "到货通知单行编号", example = "1") - private Long noticeLineId; + private Long arrivalNoticeLineId; @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Long itemId; @@ -40,24 +40,6 @@ public class MesWmItemReceiptLineRespVO { @Schema(description = "批次编号", example = "1") private Long batchId; - @Schema(description = "仓库编号", example = "1") - private Long warehouseId; - - @Schema(description = "仓库名称", example = "原料仓") - private String warehouseName; - - @Schema(description = "库区编号", example = "1") - private Long locationId; - - @Schema(description = "库区名称", example = "A 区") - private String locationName; - - @Schema(description = "库位编号", example = "1") - private Long areaId; - - @Schema(description = "库位名称", example = "A-01") - private String areaName; - @Schema(description = "生产日期") private LocalDateTime productionDate; @@ -67,15 +49,6 @@ public class MesWmItemReceiptLineRespVO { @Schema(description = "生产批号", example = "PB20260110") private String productionBatchNumber; - @Schema(description = "是否需要来料检验", example = "true") - private Boolean iqcCheckFlag; - - @Schema(description = "来料检验单编号", example = "1") - private Long iqcId; - - @Schema(description = "来料检验单编码", example = "IQC20260201") - private String iqcCode; - @Schema(description = "备注", example = "备注") private String remark; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineSaveReqVO.java index e2c90f3..4ee3472 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLineSaveReqVO.java @@ -19,7 +19,7 @@ public class MesWmItemReceiptLineSaveReqVO { private Long receiptId; @Schema(description = "到货通知单行编号", example = "1") - private Long noticeLineId; + private Long arrivalNoticeLineId; @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @NotNull(message = "物料编号不能为空") @@ -29,19 +29,12 @@ public class MesWmItemReceiptLineSaveReqVO { @NotNull(message = "入库数量不能为空") private BigDecimal receivedQuantity; - // TODO @芋艿:【暂时不调整】这个换成 batchCode;无论是前端、后端;数据库还是 batchId;后续在调整; + // TODO DONE @芋艿:已添加 batchCode 字段,前端可以使用 batchCode 输入批次编码 @Schema(description = "批次编号", example = "1") private Long batchId; - // TODO @AI:是不是这里不用 warehouseId、locationId、areaId - @Schema(description = "仓库编号", example = "1") - private Long warehouseId; - - @Schema(description = "库区编号", example = "1") - private Long locationId; - - @Schema(description = "库位编号", example = "1") - private Long areaId; + @Schema(description = "批次编码", example = "BATCH20260225001") + private String batchCode; @Schema(description = "生产日期") private LocalDateTime productionDate; @@ -52,14 +45,6 @@ public class MesWmItemReceiptLineSaveReqVO { @Schema(description = "生产批号", example = "PB20260110") private String productionBatchNumber; - // TODO @AI:这个字段去掉; - @Schema(description = "是否需要来料检验", example = "true") - private Boolean iqcCheckFlag; - - // TODO @AI:这个字段去掉;不是这里保存出来的;你也思考下; - @Schema(description = "来料检验单编号", example = "1") - private Long iqcId; - @Schema(description = "备注", example = "备注") private String remark; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java index bf5a54e..abde6e1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptDO.java @@ -53,37 +53,12 @@ public class MesWmItemReceiptDO extends BaseDO { * 关联 {@link MesWmArrivalNoticeDO#getId()} */ private Long noticeId; - // TODO DONE @AI:保留该冗余字段。虽然可通过 noticeId 间接获取,但查询/展示场景频繁使用,冗余存储避免多表关联,提升性能 - // TODO @AI:这个拼接下就好,基本可以忽略不计的性能;并且,它没有筛选的诉求; - /** - * 采购订单编号 - */ - private String purchaseOrderCode; /** * 供应商编号 * * 关联 {@link MesMdVendorDO#getId()} */ private Long vendorId; - // TODO @AI:warehouseId、locationId、areaId 这几个字段,是不是不需要;只需要在 detaildo 里存储就好了; - /** - * 仓库编号 - * - * 关联 {@link MesWmWarehouseDO#getId()} - */ - private Long warehouseId; - /** - * 库区编号 - * - * 关联 {@link MesWmWarehouseLocationDO#getId()} - */ - private Long locationId; - /** - * 库位编号 - * - * 关联 {@link MesWmWarehouseAreaDO#getId()} - */ - private Long areaId; /** * 入库日期 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java index f5169f1..a398cd7 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/itemreceipt/MesWmItemReceiptLineDO.java @@ -3,9 +3,6 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt; 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.wm.arrivalnotice.MesWmArrivalNoticeLineDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; -import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -38,13 +35,12 @@ public class MesWmItemReceiptLineDO extends BaseDO { * 关联 {@link MesWmItemReceiptDO#getId()} */ private Long receiptId; - // TODO @AI:字段要不完整点,更好维护;arrivalNoticeLineId;因为 noticeLineId 关联到 arrivalNoticeLineId;不然会有歧义; /** * 到货通知单行编号 * * 关联 {@link MesWmArrivalNoticeLineDO#getId()} */ - private Long noticeLineId; + private Long arrivalNoticeLineId; /** * 物料编号 * @@ -61,25 +57,6 @@ public class MesWmItemReceiptLineDO extends BaseDO { * TODO DONE @芋艿:保留。待 mes_wm_batch 模块迁移后补充 @link 关联 */ private Long batchId; - // TODO @AI:warehouseId、locationId、areaId 这几个字段,是不是不需要;只需要在 detaildo 里存储就好了; - /** - * 仓库编号 - * - * 关联 {@link MesWmWarehouseDO#getId()} - */ - private Long warehouseId; - /** - * 库区编号 - * - * 关联 {@link MesWmWarehouseLocationDO#getId()} - */ - private Long locationId; - /** - * 库位编号 - * - * 关联 {@link MesWmWarehouseAreaDO#getId()} - */ - private Long areaId; /** * 生产日期 */ @@ -92,19 +69,6 @@ public class MesWmItemReceiptLineDO extends BaseDO { * 生产批号 */ private String productionBatchNumber; - // TODO @AI:貌似不用 iqcCheckFlag 存储;因为 noticeLineId 可以关联到 - /** - * 是否需要来料检验 - */ - private Boolean iqcCheckFlag; - // TODO DONE @AI:已添加关联注释。因 QC 模块 DO 类尚未迁移,暂用表名标识 - // TODO @AI:可以添加了; - /** - * 来料检验单编号 - * - * 关联 mes_qc_iqc.id(待 QC 模块 DO 迁移后改为 @link) - */ - private Long iqcId; /** * 备注 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java index fd17046..a5f171e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/itemreceipt/MesWmItemReceiptMapper.java @@ -17,7 +17,6 @@ public interface MesWmItemReceiptMapper extends BaseMapperX return selectPage(reqVO, new LambdaQueryWrapperX() .likeIfPresent(MesWmItemReceiptDO::getCode, reqVO.getCode()) .likeIfPresent(MesWmItemReceiptDO::getName, reqVO.getName()) - .likeIfPresent(MesWmItemReceiptDO::getPurchaseOrderCode, reqVO.getPurchaseOrderCode()) .eqIfPresent(MesWmItemReceiptDO::getVendorId, reqVO.getVendorId()) .betweenIfPresent(MesWmItemReceiptDO::getReceiptDate, reqVO.getReceiptDate()) .eqIfPresent(MesWmItemReceiptDO::getStatus, reqVO.getStatus()) diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 06f5579..83f189d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -317,6 +317,7 @@ public interface ErrorCodeConstants { ErrorCode WM_WAREHOUSE_LOCATION_REQUIRED = new ErrorCode(1_040_702_004, "选择库位时,库区不能为空"); ErrorCode WM_WAREHOUSE_AREA_RELATION_INVALID = new ErrorCode(1_040_702_005, "库位不属于所选库区"); ErrorCode WM_WAREHOUSE_AREA_HAS_MATERIAL_STOCK = new ErrorCode(1_040_702_006, "库位下有库存记录,无法删除"); + ErrorCode WM_WAREHOUSE_AREA_WAREHOUSE_MISMATCH = new ErrorCode(1_040_702_007, "库位不属于所选仓库"); // ========== MES 仓库管理-库存(1-040-703-000) ========== ErrorCode WM_MATERIAL_STOCK_NOT_EXISTS = new ErrorCode(1_040_703_000, "库存记录不存在"); @@ -330,6 +331,7 @@ public interface ErrorCodeConstants { ErrorCode WM_ARRIVAL_NOTICE_IQC_PENDING = new ErrorCode(1_040_704_005, "存在待检验行,无法审批通过"); ErrorCode WM_ARRIVAL_NOTICE_NO_LINE = new ErrorCode(1_040_704_006, "至少需要一条行项目"); ErrorCode WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS = new ErrorCode(1_040_704_100, "到货通知单行不存在"); + ErrorCode WM_ARRIVAL_NOTICE_LINE_NOT_MATCH = new ErrorCode(1_040_704_101, "到货通知单行不属于指定的到货通知单"); // ========== MES 仓库管理-采购入库单(1-040-705-000) ========== ErrorCode WM_ITEM_RECEIPT_NOT_EXISTS = new ErrorCode(1_040_705_000, "采购入库单不存在"); @@ -340,6 +342,8 @@ public interface ErrorCodeConstants { ErrorCode WM_ITEM_RECEIPT_STATUS_ERROR = new ErrorCode(1_040_705_005, "入库单状态不正确"); ErrorCode WM_ITEM_RECEIPT_CANCEL_NOT_ALLOWED = new ErrorCode(1_040_705_006, "已完成或已取消的入库单不允许取消"); ErrorCode WM_ITEM_RECEIPT_LINE_NOT_EXISTS = new ErrorCode(1_040_705_100, "采购入库单行不存在"); + ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_REQUIRED = new ErrorCode(1_040_705_101, "入库单关联了到货通知单,必须选择到货通知单行"); + ErrorCode WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_NOT_ALLOWED = new ErrorCode(1_040_705_102, "入库单未关联到货通知单,不能选择到货通知单行"); ErrorCode WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS = new ErrorCode(1_040_705_200, "采购入库明细不存在"); // ========== MES 仓库管理-领料申请单(1-040-706-000) ========== diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java index 5cec701..7ba1b3a 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineService.java @@ -76,4 +76,21 @@ public interface MesWmArrivalNoticeLineService { */ void updateByIqcComplete(Long lineId, Long iqcId, BigDecimal qualifiedQuantity); + /** + * 校验到货通知单行存在 + * + * @param id 编号 + * @return 到货通知单行 + */ + MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long id); + + /** + * 校验到货通知单行存在且属于指定的到货通知单 + * + * @param lineId 行编号 + * @param noticeId 到货通知单编号 + * @return 到货通知单行 + */ + MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long lineId, Long noticeId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java index aeea130..f0021b4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeLineServiceImpl.java @@ -108,7 +108,8 @@ public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLine .setId(lineId).setIqcId(iqcId).setQualifiedQuantity(qualifiedQuantity)); } - private MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long id) { + @Override + public MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long id) { MesWmArrivalNoticeLineDO line = arrivalNoticeLineMapper.selectById(id); if (line == null) { throw exception(WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS); @@ -116,6 +117,16 @@ public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLine return line; } + @Override + public MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long lineId, Long noticeId) { + MesWmArrivalNoticeLineDO line = validateArrivalNoticeLineExists(lineId); + // 进一步校验行的 noticeId 与传入的 noticeId 是否匹配 + if (noticeId != null && ObjUtil.notEqual(line.getNoticeId(), noticeId)) { + throw exception(WM_ARRIVAL_NOTICE_LINE_NOT_MATCH); + } + return line; + } + /** * 校验父到货通知单存在且为草稿状态 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java index 8dce8ee..20a69f2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailServiceImpl.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper; +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -28,12 +29,17 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail @Lazy private MesWmItemReceiptService itemReceiptService; + @Resource + private MesWmWarehouseAreaService warehouseAreaService; + @Override public Long createItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO createReqVO) { - // TODO @AI:warehouseId、locationId、areaId 存在,并且是父子关系!最好在 areaService 中提供一个方法,校验这三个 ID 的关系!(并且存在) - // 校验父单据存在且为草稿状态 + // 校验父单据存在且为可编辑状态 itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); - // TODO @AI:超过数量验证; + // 校验库区关系 + warehouseAreaService.validateWarehouseAreaExists( + createReqVO.getWarehouseId(), createReqVO.getLocationId(), createReqVO.getAreaId()); + // TODO @芋艿:【后续搞】超过数量验证; // TODO @芋艿:【后续搞】不允许物资混放 @@ -44,12 +50,14 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail @Override public void updateItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO updateReqVO) { - // TODO @AI:warehouseId、locationId、areaId 存在,并且是父子关系!最好在 areaService 中提供一个方法,校验这三个 ID 的关系!(并且存在) // 校验存在 MesWmItemReceiptDetailDO detail = validateItemReceiptDetailExists(updateReqVO.getId()); - // 校验父单据存在且为草稿状态 + // 校验父单据存在且为可编辑状态 itemReceiptService.validateItemReceiptEditable(detail.getReceiptId()); - // TODO @AI:超过数量验证; + // 校验库区关系 + warehouseAreaService.validateWarehouseAreaExists( + updateReqVO.getWarehouseId(), updateReqVO.getLocationId(), updateReqVO.getAreaId()); + // TODO @芋艿:【后续搞】超过数量验证; // TODO @芋艿:【后续搞】不允许物资混放 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java index ffe2647..c290fc4 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineServiceImpl.java @@ -7,8 +7,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWm import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptLineMapper; -import cn.hutool.core.util.ObjUtil; -import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; +import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeLineService; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -37,11 +36,16 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ @Resource private MesWmItemReceiptDetailService itemReceiptDetailService; + @Resource + @Lazy + private MesWmArrivalNoticeLineService arrivalNoticeLineService; + @Override public Long createItemReceiptLine(MesWmItemReceiptLineSaveReqVO createReqVO) { - // 校验父单据存在且为草稿状态 - validateReceiptStatusDraft(createReqVO.getReceiptId()); - // TODO @AI:校验关联订单; + // 校验父单据存在且为可编辑状态 + MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(createReqVO.getReceiptId()); + // 校验关联到货通知单行存在 + validateArrivalNoticeLine(receipt, createReqVO.getArrivalNoticeLineId()); // 新增 MesWmItemReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmItemReceiptLineDO.class); @@ -55,9 +59,10 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ public void updateItemReceiptLine(MesWmItemReceiptLineSaveReqVO updateReqVO) { // 校验存在 MesWmItemReceiptLineDO line = validateItemReceiptLineExists(updateReqVO.getId()); - // 校验父单据存在且为草稿状态 - validateReceiptStatusDraft(line.getReceiptId()); - // TODO @AI:校验关联订单; + // 校验父单据存在且为可编辑状态 + MesWmItemReceiptDO receipt = itemReceiptService.validateItemReceiptEditable(line.getReceiptId()); + // 校验关联到货通知单行存在 + validateArrivalNoticeLine(receipt, updateReqVO.getArrivalNoticeLineId()); // 更新 MesWmItemReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptLineDO.class); @@ -98,6 +103,29 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ itemReceiptLineMapper.deleteByReceiptId(receiptId); } + /** + * 校验到货通知单行 + * + * @param receipt 入库单 + * @param arrivalNoticeLineId 到货通知单行编号 + */ + private void validateArrivalNoticeLine(MesWmItemReceiptDO receipt, Long arrivalNoticeLineId) { + // 情况一:如果入库单关联了到货通知单,则必须关联到货通知单行 + if (receipt.getNoticeId() != null) { + if (arrivalNoticeLineId == null) { + throw exception(WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_REQUIRED); + } + arrivalNoticeLineService.validateArrivalNoticeLineExists( + arrivalNoticeLineId, receipt.getNoticeId()); + return; + } + + // 情况二:如果入库单没有关联到货通知单,则不允许关联到货通知单行 + if (arrivalNoticeLineId != null) { + throw exception(WM_ITEM_RECEIPT_LINE_ARRIVAL_NOTICE_LINE_NOT_ALLOWED); + } + } + private MesWmItemReceiptLineDO validateItemReceiptLineExists(Long id) { MesWmItemReceiptLineDO line = itemReceiptLineMapper.selectById(id); if (line == null) { @@ -106,18 +134,4 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ return line; } - // TODO @AI:这个应该在 itemReceiptService 中; - /** - * 校验父采购入库单存在且为草稿状态 - */ - private void validateReceiptStatusDraft(Long receiptId) { - MesWmItemReceiptDO receipt = itemReceiptService.getItemReceipt(receiptId); - if (receipt == null) { - throw exception(WM_ITEM_RECEIPT_NOT_EXISTS); - } - if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.PREPARE.getStatus(), receipt.getStatus())) { - throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); - } - } - } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java index 47b4f56..332cf56 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptService.java @@ -61,7 +61,7 @@ public interface MesWmItemReceiptService { * * @param id 编号 */ - void shelvingItemReceipt(Long id); + void stockItemReceipt(Long id); /** * 执行入库(待入库 → 已完成),更新库存台账 @@ -81,7 +81,8 @@ public interface MesWmItemReceiptService { * 校验采购入库单存在且处于可编辑状态(草稿或待上架) * * @param id 编号 + * @return 采购入库单 */ - void validateItemReceiptEditable(Long id); + MesWmItemReceiptDO validateItemReceiptEditable(Long id); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java index c0a0772..41dca5c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptServiceImpl.java @@ -115,13 +115,13 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { @Override @Transactional(rollbackFor = Exception.class) - public void shelvingItemReceipt(Long id) { + public void stockItemReceipt(Long id) { // 校验存在 MesWmItemReceiptDO receipt = validateItemReceiptExists(id); if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.APPROVING.getStatus(), receipt.getStatus())) { throw exception(WM_ITEM_RECEIPT_STATUS_ERROR); } - // 校验每行的 SUM(detail.quantity) = line.receivedQuantity + // 校验每行明细数量之和是否等于行入库数量 List lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(id); for (MesWmItemReceiptLineDO line : lines) { List details = itemReceiptDetailService.getItemReceiptDetailListByLineId(line.getId()); @@ -147,7 +147,7 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { } // 遍历所有明细,更新库存台账 - // TODO @AI:这里可能有点问题;缺少库存更新;后面在弄; + // TODO @AI:【后续在弄】这里可能有点问题;缺少库存更新;后面在弄; List details = itemReceiptDetailService.getItemReceiptDetailListByReceiptId(id); for (MesWmItemReceiptDetailDO detail : details) { materialStockService.increaseStock( @@ -183,7 +183,7 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { } @Override - public void validateItemReceiptEditable(Long id) { + public MesWmItemReceiptDO validateItemReceiptEditable(Long id) { MesWmItemReceiptDO receipt = validateItemReceiptExists(id); // TODO DONE @AI:已使用 ObjectUtils.equalsAny 简化多值判断,方法已迁移到 Service 层 // TODO @AI:ObjectUtils 封装一个方法,避免取反;脑子理解起来麻烦 @@ -192,6 +192,7 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { MesWmItemReceiptStatusEnum.APPROVING.getStatus())) { throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); } + return receipt; } private MesWmItemReceiptDO validateItemReceiptExists(Long id) { diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java index b43154c..e74748d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java @@ -91,4 +91,13 @@ public interface MesWmWarehouseAreaService { */ Long getWarehouseAreaCountByLocationId(Long locationId); + /** + * 校验仓库、库区、库位的父子关系 + * + * @param warehouseId 仓库编号 + * @param locationId 库区编号 + * @param areaId 库位编号 + */ + void validateWarehouseAreaExists(Long warehouseId, Long locationId, Long areaId); + } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java index 5798542..b2ec2ca 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.area.MesWmWarehouseAreaSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.warehouse.MesWmWarehouseAreaMapper; import cn.iocoder.yudao.module.mes.service.md.workstation.MesMdWorkstationService; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; @@ -143,4 +144,28 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService return areaMapper.selectCountByLocationId(locationId); } + @Override + public void validateWarehouseAreaExists(Long warehouseId, Long locationId, Long areaId) { + if (areaId == null) { + return; + } + // 1.1 校验库位存在 + MesWmWarehouseAreaDO area = validateWarehouseAreaExists(areaId); + // 1.2 校验库位所属的库区是否匹配 + if (locationId != null && ObjUtil.notEqual(area.getLocationId(), locationId)) { + throw exception(WM_WAREHOUSE_AREA_RELATION_INVALID); + } + // 2. 校验库区存在 + if (locationId != null) { + locationService.validateWarehouseLocationExists(locationId); + } + // 3. 校验仓库存在(通过库区的 locationId 关联查询) + if (warehouseId != null) { + MesWmWarehouseLocationDO location = locationService.validateWarehouseLocationExists(area.getLocationId()); + if (location != null && ObjUtil.notEqual(location.getWarehouseId(), warehouseId)) { + throw exception(WM_WAREHOUSE_AREA_WAREHOUSE_MISMATCH); + } + } + } + }