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 1efbc6f..bb00772 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 @@ -104,20 +104,16 @@ public class MesWmArrivalNoticeLineController { // 1. 获得关联数据 Map itemMap = itemService.getItemMap( convertSet(list, MesWmArrivalNoticeLineDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); Map iqcMap = iqcService.getIqcMap( convertSet(list, MesWmArrivalNoticeLineDO::getIqcId)); // 2. 构建结果 return BeanUtils.toBean(list, MesWmArrivalNoticeLineRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); - // 查询物料的计量单位名称 - // TODO @AI:也批量查询,避免逐个; - if (item.getUnitMeasureId() != null) { - MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(item.getUnitMeasureId()); - if (unitMeasure != null) { - vo.setUnitMeasureName(unitMeasure.getName()); - } - } + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.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/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java index 699b6f1..9c75f40 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLinePageReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -13,6 +14,7 @@ import lombok.ToString; public class MesWmArrivalNoticeLinePageReqVO extends PageParam { @Schema(description = "到货通知单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "到货通知单编号不能为空") private Long noticeId; } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java index 523bee6..cd422e2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/arrivalnotice/vo/line/MesWmArrivalNoticeLineSaveReqVO.java @@ -21,7 +21,8 @@ public class MesWmArrivalNoticeLineSaveReqVO { @NotNull(message = "物料编号不能为空") private Long itemId; - @Schema(description = "到货数量", example = "500.00") + @Schema(description = "到货数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "500.00") + @NotNull(message = "到货数量不能为空") private BigDecimal arrivalQuantity; @Schema(description = "合格数量", example = "500.00") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java index 511acf3..abd103f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/MesWmItemReceiptDetailController.java @@ -114,6 +114,8 @@ public class MesWmItemReceiptDetailController { // 1. 获得关联数据 Map itemMap = itemService.getItemMap( convertSet(list, MesWmItemReceiptDetailDO::getItemId)); + Map unitMeasureMap = unitMeasureService.getUnitMeasureMap( + convertSet(itemMap.values(), MesMdItemDO::getUnitMeasureId)); Map warehouseMap = warehouseService.getWarehouseMap( convertSet(list, MesWmItemReceiptDetailDO::getWarehouseId)); Map locationMap = locationService.getWarehouseLocationMap( @@ -124,13 +126,8 @@ public class MesWmItemReceiptDetailController { return BeanUtils.toBean(list, MesWmItemReceiptDetailRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); - // TODO @AI:批量查询,避免 N+1 查询 - if (item.getUnitMeasureId() != null) { - MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(item.getUnitMeasureId()); - if (unitMeasure != null) { - vo.setUnitMeasureName(unitMeasure.getName()); - } - } + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName())); 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 9b9846a..ea46c62 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 @@ -119,6 +119,8 @@ public class MesWmItemReceiptLineController { // 1. 获得关联数据 Map itemMap = itemService.getItemMap( 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( @@ -131,13 +133,8 @@ public class MesWmItemReceiptLineController { return BeanUtils.toBean(list, MesWmItemReceiptLineRespVO.class, vo -> { MapUtils.findAndThen(itemMap, vo.getItemId(), item -> { vo.setItemCode(item.getCode()).setItemName(item.getName()).setSpecification(item.getSpecification()); - // TODO @AI:批量查询,避免 N+1 查询 - if (item.getUnitMeasureId() != null) { - MesMdUnitMeasureDO unitMeasure = unitMeasureService.getUnitMeasure(item.getUnitMeasureId()); - if (unitMeasure != null) { - vo.setUnitMeasureName(unitMeasure.getName()); - } - } + MapUtils.findAndThen(unitMeasureMap, item.getUnitMeasureId(), + unitMeasure -> vo.setUnitMeasureName(unitMeasure.getName())); }); MapUtils.findAndThen(warehouseMap, vo.getWarehouseId(), warehouse -> vo.setWarehouseName(warehouse.getName())); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailPageReqVO.java index 2345679..360bcf9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailPageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailPageReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -12,10 +13,12 @@ import lombok.ToString; @ToString(callSuper = true) public class MesWmItemReceiptDetailPageReqVO extends PageParam { - @Schema(description = "入库单编号", example = "1") + @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "入库单编号不能为空") private Long receiptId; - @Schema(description = "入库单行编号", example = "1") + @Schema(description = "入库单行编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "入库单行编号不能为空") private Long lineId; } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailSaveReqVO.java index 8fd1c66..f8411af 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/detail/MesWmItemReceiptDetailSaveReqVO.java @@ -25,7 +25,8 @@ public class MesWmItemReceiptDetailSaveReqVO { @NotNull(message = "物料编号不能为空") private Long itemId; - @Schema(description = "上架数量", example = "300.00") + @Schema(description = "上架数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "300.00") + @NotNull(message = "上架数量不能为空") private BigDecimal quantity; @Schema(description = "批次编号", example = "1") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLinePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLinePageReqVO.java index f92373f..2841e3d 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLinePageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/itemreceipt/vo/line/MesWmItemReceiptLinePageReqVO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line; import cn.iocoder.yudao.framework.common.pojo.PageParam; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; @@ -13,6 +14,7 @@ import lombok.ToString; public class MesWmItemReceiptLinePageReqVO extends PageParam { @Schema(description = "入库单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "入库单编号不能为空") private Long receiptId; } 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 cefd7af..54d0c74 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 @@ -25,7 +25,8 @@ public class MesWmItemReceiptLineSaveReqVO { @NotNull(message = "物料编号不能为空") private Long itemId; - @Schema(description = "入库数量", example = "500.00") + @Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "500.00") + @NotNull(message = "入库数量不能为空") private BigDecimal receivedQuantity; @Schema(description = "批次编号", example = "1") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java index 9c29754..b460b3c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/arrivalnotice/MesWmArrivalNoticeDO.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -57,12 +58,10 @@ public class MesWmArrivalNoticeDO extends BaseDO { * 联系电话 */ private String contactTelephone; - // TODO @AI:枚举类;需要 @关联 - // TODO @AI:字典类;需要 @关联 /** * 状态 * - * 0=草稿 1=已提交 2=已审批 3=已完成 + * 枚举 {@link MesWmArrivalNoticeStatusEnum} */ private Integer status; /** 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 a9a4d51..30054b3 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 @@ -2,6 +2,7 @@ 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.vendor.MesMdVendorDO; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseAreaDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; @@ -84,12 +85,10 @@ public class MesWmItemReceiptDO extends BaseDO { * 入库日期 */ private LocalDateTime receiptDate; - // TODO @AI:枚举类;需要 @关联 - // TODO @AI:字典类;需要 @关联 /** * 状态 * - * 0=草稿 1=已提交 2=已审批 3=已完成 + * 枚举 {@link MesWmItemReceiptStatusEnum} */ private Integer status; /** diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmArrivalNoticeStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmArrivalNoticeStatusEnum.java new file mode 100644 index 0000000..862b7fd --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmArrivalNoticeStatusEnum.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * MES 到货通知单状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MesWmArrivalNoticeStatusEnum implements ArrayValuable { + + PREPARE(0, "草稿"), + SUBMITTED(1, "已提交"), + APPROVED(2, "已审批"), + FINISHED(3, "已完成"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmArrivalNoticeStatusEnum::getStatus).toArray(Integer[]::new); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmItemReceiptStatusEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmItemReceiptStatusEnum.java new file mode 100644 index 0000000..fc4b8b7 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmItemReceiptStatusEnum.java @@ -0,0 +1,39 @@ +package cn.iocoder.yudao.module.mes.enums.wm; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Arrays; + +/** + * MES 采购入库单状态枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum MesWmItemReceiptStatusEnum implements ArrayValuable { + + PREPARE(0, "草稿"), + SUBMITTED(1, "已提交"), + APPROVED(2, "已审批"), + FINISHED(3, "已完成"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmItemReceiptStatusEnum::getStatus).toArray(Integer[]::new); + + /** + * 状态值 + */ + private final Integer status; + /** + * 状态名 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} 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 091dac8..f26f8f7 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 @@ -51,7 +51,6 @@ public interface MesWmArrivalNoticeLineService { */ PageResult getArrivalNoticeLinePage(MesWmArrivalNoticeLinePageReqVO pageReqVO); - // TODO @AI:不用的接口,就删除掉; /** * 按通知单编号获得行列表 * @@ -60,4 +59,11 @@ public interface MesWmArrivalNoticeLineService { */ List getArrivalNoticeLineListByNoticeId(Long noticeId); + /** + * 按通知单编号批量删除行 + * + * @param noticeId 通知单编号 + */ + void deleteArrivalNoticeLineByNoticeId(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 7b0435d..bd122fc 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 @@ -1,19 +1,24 @@ package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice; +import cn.hutool.core.util.BooleanUtil; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.line.MesWmArrivalNoticeLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeLineMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum; import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 到货通知单行 Service 实现类 @@ -25,15 +30,19 @@ public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLine @Resource private MesWmArrivalNoticeLineMapper arrivalNoticeLineMapper; + @Resource + @Lazy + private MesWmArrivalNoticeService arrivalNoticeService; + @Override public Long createArrivalNoticeLine(MesWmArrivalNoticeLineSaveReqVO createReqVO) { - // TODO @AI:关联表的校验; + // 校验父单据存在且为草稿状态 + validateNoticeStatusDraft(createReqVO.getNoticeId()); // 插入 MesWmArrivalNoticeLineDO line = BeanUtils.toBean(createReqVO, MesWmArrivalNoticeLineDO.class); // 如果不需要检验,则合格品数量直接等于到货数量 - // TODO @AI:isFalase,减少反向判断; - if (!Boolean.TRUE.equals(line.getIqcCheckFlag())) { + if (BooleanUtil.isFalse(line.getIqcCheckFlag())) { line.setQualifiedQuantity(line.getArrivalQuantity()); } arrivalNoticeLineMapper.insert(line); @@ -43,14 +52,14 @@ public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLine @Override public void updateArrivalNoticeLine(MesWmArrivalNoticeLineSaveReqVO updateReqVO) { // 校验存在 - validateArrivalNoticeLineExists(updateReqVO.getId()); - // TODO @AI:关联表的校验; + MesWmArrivalNoticeLineDO line = validateArrivalNoticeLineExists(updateReqVO.getId()); + // 校验父单据存在且为草稿状态 + validateNoticeStatusDraft(line.getNoticeId()); // 更新 MesWmArrivalNoticeLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmArrivalNoticeLineDO.class); // 如果不需要检验,则合格品数量直接等于到货数量 - // TODO @AI:isFalase,减少反向判断; - if (!Boolean.TRUE.equals(updateObj.getIqcCheckFlag())) { + if (BooleanUtil.isFalse(updateObj.getIqcCheckFlag())) { updateObj.setQualifiedQuantity(updateObj.getArrivalQuantity()); } arrivalNoticeLineMapper.updateById(updateObj); @@ -79,10 +88,30 @@ public class MesWmArrivalNoticeLineServiceImpl implements MesWmArrivalNoticeLine return arrivalNoticeLineMapper.selectListByNoticeId(noticeId); } - private void validateArrivalNoticeLineExists(Long id) { - if (arrivalNoticeLineMapper.selectById(id) == null) { + @Override + public void deleteArrivalNoticeLineByNoticeId(Long noticeId) { + arrivalNoticeLineMapper.deleteByNoticeId(noticeId); + } + + private MesWmArrivalNoticeLineDO validateArrivalNoticeLineExists(Long id) { + MesWmArrivalNoticeLineDO line = arrivalNoticeLineMapper.selectById(id); + if (line == null) { throw exception(WM_ARRIVAL_NOTICE_LINE_NOT_EXISTS); } + return line; + } + + /** + * 校验父到货通知单存在且为草稿状态 + */ + private void validateNoticeStatusDraft(Long noticeId) { + MesWmArrivalNoticeDO notice = arrivalNoticeService.getArrivalNotice(noticeId); + if (notice == null) { + throw exception(WM_ARRIVAL_NOTICE_NOT_EXISTS); + } + if (ObjUtil.notEqual(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus(), notice.getStatus())) { + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); + } } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java index 2b883b8..42cb60f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeService.java @@ -55,23 +55,22 @@ public interface MesWmArrivalNoticeService { */ PageResult getArrivalNoticePage(MesWmArrivalNoticePageReqVO pageReqVO); - // TODO @AI:0-》1、1-》2 尽量写状态;不要写这种; /** - * 提交到货通知单(0→1) + * 提交到货通知单(草稿 → 已提交) * * @param id 编号 */ void submitArrivalNotice(Long id); /** - * 审批到货通知单(1→2) + * 审批到货通知单(已提交 → 已审批) * * @param id 编号 */ void approveArrivalNotice(Long id); /** - * 完成到货通知单(→3),内部调用 + * 完成到货通知单(已审批 → 已完成),内部调用 * * @param id 编号 */ diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java index 4621611..39f86a9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/arrivalnotice/MesWmArrivalNoticeServiceImpl.java @@ -1,14 +1,16 @@ package cn.iocoder.yudao.module.mes.service.wm.arrivalnotice; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.arrivalnotice.vo.MesWmArrivalNoticeSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.arrivalnotice.MesWmArrivalNoticeLineDO; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.arrivalnotice.MesWmArrivalNoticeMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmArrivalNoticeStatusEnum; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,36 +33,27 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService @Resource private MesWmArrivalNoticeMapper arrivalNoticeMapper; - // TODO @AI:不允许调用对方的,调用 service; @Resource - private MesWmArrivalNoticeLineMapper arrivalNoticeLineMapper; + private MesWmArrivalNoticeLineService arrivalNoticeLineService; @Override public Long createArrivalNotice(MesWmArrivalNoticeSaveReqVO createReqVO) { // 校验编码唯一 validateCodeUnique(null, createReqVO.getCode()); - // TODO @AI:关联数据的校验 // 插入 MesWmArrivalNoticeDO notice = BeanUtils.toBean(createReqVO, MesWmArrivalNoticeDO.class); - // TODO @AI:使用枚举类; - notice.setStatus(0); // 草稿 + notice.setStatus(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus()); arrivalNoticeMapper.insert(notice); return notice.getId(); } @Override public void updateArrivalNotice(MesWmArrivalNoticeSaveReqVO updateReqVO) { - // 校验存在 - MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(updateReqVO.getId()); - // 校验状态:只有草稿才允许修改 - // TODO @AI:使用枚举类; - if (notice.getStatus() != 0) { - throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); - } + // 校验存在 + 草稿状态 + validateArrivalNoticeExistsAndDraft(updateReqVO.getId()); // 校验编码唯一 validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); - // TODO @AI:关联数据的校验 // 更新 MesWmArrivalNoticeDO updateObj = BeanUtils.toBean(updateReqVO, MesWmArrivalNoticeDO.class); @@ -70,16 +63,11 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService @Override @Transactional(rollbackFor = Exception.class) public void deleteArrivalNotice(Long id) { - // 校验存在 - MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); - // 校验状态:只有草稿才允许删除 TODO @AI:抽个统一的校验+ 存在 “草稿”的方法,允许修改、删除 - // TODO @AI:使用枚举类; - if (notice.getStatus() != 0) { - throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); - } + // 校验存在 + 草稿状态 + validateArrivalNoticeExistsAndDraft(id); // 级联删除行 - arrivalNoticeLineMapper.deleteByNoticeId(id); + arrivalNoticeLineService.deleteArrivalNoticeLineByNoticeId(id); // 删除 arrivalNoticeMapper.deleteById(id); } @@ -95,56 +83,63 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService } @Override + @Transactional(rollbackFor = Exception.class) public void submitArrivalNotice(Long id) { - // 校验存在 - MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); - if (notice.getStatus() != 0) { // TODO @AI:抽个统一的校验+ 存在 “草稿”的方法,允许修改、删除 - throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); + // 1.1 校验存在 + 草稿状态 + validateArrivalNoticeExistsAndDraft(id); + // 1.2 检查是否有行项目 + List lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_ARRIVAL_NOTICE_NO_LINE); } - // 检查是否有行项目 - // TODO @AI:搞个 count 方法,在对方 service,传递 noticeId + 状态 - List lines = arrivalNoticeLineMapper.selectListByNoticeId(id); // 检查所有行的 iqcCheckFlag:如果没有需要检验的行,则直接审批通过 - boolean needCheck = lines.stream().anyMatch(line -> Boolean.TRUE.equals(line.getIqcCheckFlag())); - // TODO @AI:计算 status,然后去更新; + boolean needCheck = CollectionUtils.anyMatch(lines, line -> Boolean.TRUE.equals(line.getIqcCheckFlag())); if (!needCheck) { // 不需要检验,直接审批通过 - arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(id).setStatus(2)); + arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() + .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.APPROVED.getStatus())); } else { // 需要检验,提交待审批 - arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(id).setStatus(1)); + arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() + .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.SUBMITTED.getStatus())); } } @Override + @Transactional(rollbackFor = Exception.class) public void approveArrivalNotice(Long id) { // 校验存在 MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); - if (notice.getStatus() != 1) { - throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); + // 校验状态:只有已提交才允许审批 + if (ObjUtil.notEqual(MesWmArrivalNoticeStatusEnum.SUBMITTED.getStatus(), notice.getStatus())) { + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_SUBMITTED); } - // TODO @AI:校验状态 + 状态; // 校验所有 iqcCheckFlag=true 的行必须 iqcId 不为空 - // TODO @AI:对方 service ;搞个 count 方法,在对方 service,传递 noticeId + 状态;另外,看看能不能和上面的,保持 service 方法,保持统一; - List lines = arrivalNoticeLineMapper.selectListByNoticeId(id); - boolean hasUnchecked = lines.stream() - .anyMatch(line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null); + List lines = arrivalNoticeLineService.getArrivalNoticeLineListByNoticeId(id); + boolean hasUnchecked = CollectionUtils.anyMatch(lines, + line -> Boolean.TRUE.equals(line.getIqcCheckFlag()) && line.getIqcId() == null); if (hasUnchecked) { throw exception(WM_ARRIVAL_NOTICE_IQC_PENDING); } // 审批通过 - arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(id).setStatus(2)); + arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() + .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.APPROVED.getStatus())); } @Override public void finishArrivalNotice(Long id) { - validateArrivalNoticeExists(id); - // TODO @AI:校验状态 + 状态; + // 校验存在 + MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); + // 校验状态:只有已审批才允许完成 + if (ObjUtil.notEqual(MesWmArrivalNoticeStatusEnum.APPROVED.getStatus(), notice.getStatus())) { + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_APPROVED); + } // 完成 - arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO().setId(id).setStatus(3)); + arrivalNoticeMapper.updateById(new MesWmArrivalNoticeDO() + .setId(id).setStatus(MesWmArrivalNoticeStatusEnum.FINISHED.getStatus())); } @Override @@ -163,13 +158,23 @@ public class MesWmArrivalNoticeServiceImpl implements MesWmArrivalNoticeService return notice; } + /** + * 校验到货通知单存在且为草稿状态 + */ + private MesWmArrivalNoticeDO validateArrivalNoticeExistsAndDraft(Long id) { + MesWmArrivalNoticeDO notice = validateArrivalNoticeExists(id); + if (ObjUtil.notEqual(MesWmArrivalNoticeStatusEnum.PREPARE.getStatus(), notice.getStatus())) { + throw exception(WM_ARRIVAL_NOTICE_STATUS_NOT_PREPARE); + } + return notice; + } + private void validateCodeUnique(Long id, String code) { MesWmArrivalNoticeDO notice = arrivalNoticeMapper.selectByCode(code); if (notice == null) { return; } - // TODO @AI:notEquals - if (id == null || !id.equals(notice.getId())) { + if (ObjUtil.notEqual(id, notice.getId())) { throw exception(WM_ARRIVAL_NOTICE_CODE_DUPLICATE); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailService.java index 546706f..465c5b5 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptDetailService.java @@ -52,6 +52,14 @@ public interface MesWmItemReceiptDetailService { PageResult getItemReceiptDetailPage(MesWmItemReceiptDetailPageReqVO pageReqVO); /** + * 按入库单编号获得明细列表 + * + * @param receiptId 入库单编号 + * @return 明细列表 + */ + List getItemReceiptDetailListByReceiptId(Long receiptId); + + /** * 按入库单行编号获得明细列表 * * @param lineId 行编号 @@ -59,4 +67,18 @@ public interface MesWmItemReceiptDetailService { */ List getItemReceiptDetailListByLineId(Long lineId); + /** + * 按入库单行编号批量删除明细 + * + * @param lineId 行编号 + */ + void deleteItemReceiptDetailByLineId(Long lineId); + + /** + * 按入库单编号批量删除明细 + * + * @param receiptId 入库单编号 + */ + void deleteItemReceiptDetailByReceiptId(Long receiptId); + } 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 e0a3d7b..90c8622 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,16 +4,20 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.detail.MesWmItemReceiptDetailSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper; +import cn.hutool.core.util.ObjUtil; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 采购入库明细 Service 实现类 @@ -25,9 +29,15 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail @Resource private MesWmItemReceiptDetailMapper itemReceiptDetailMapper; + @Resource + @Lazy + private MesWmItemReceiptService itemReceiptService; + @Override public Long createItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO createReqVO) { - // TODO @AI:校验关联字段; + // 校验父单据存在且为草稿状态 + validateReceiptStatusDraft(createReqVO.getReceiptId()); + MesWmItemReceiptDetailDO detail = BeanUtils.toBean(createReqVO, MesWmItemReceiptDetailDO.class); itemReceiptDetailMapper.insert(detail); return detail.getId(); @@ -36,8 +46,9 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail @Override public void updateItemReceiptDetail(MesWmItemReceiptDetailSaveReqVO updateReqVO) { // 校验存在 - validateItemReceiptDetailExists(updateReqVO.getId()); - // TODO @AI:校验关联字段; + MesWmItemReceiptDetailDO detail = validateItemReceiptDetailExists(updateReqVO.getId()); + // 校验父单据存在且为草稿状态 + validateReceiptStatusDraft(detail.getReceiptId()); // 更新 MesWmItemReceiptDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptDetailDO.class); @@ -63,14 +74,44 @@ public class MesWmItemReceiptDetailServiceImpl implements MesWmItemReceiptDetail } @Override + public List getItemReceiptDetailListByReceiptId(Long receiptId) { + return itemReceiptDetailMapper.selectListByReceiptId(receiptId); + } + + @Override public List getItemReceiptDetailListByLineId(Long lineId) { return itemReceiptDetailMapper.selectListByLineId(lineId); } - private void validateItemReceiptDetailExists(Long id) { - if (itemReceiptDetailMapper.selectById(id) == null) { + @Override + public void deleteItemReceiptDetailByLineId(Long lineId) { + itemReceiptDetailMapper.deleteByLineId(lineId); + } + + @Override + public void deleteItemReceiptDetailByReceiptId(Long receiptId) { + itemReceiptDetailMapper.deleteByReceiptId(receiptId); + } + + private MesWmItemReceiptDetailDO validateItemReceiptDetailExists(Long id) { + MesWmItemReceiptDetailDO detail = itemReceiptDetailMapper.selectById(id); + if (detail == null) { throw exception(WM_ITEM_RECEIPT_DETAIL_NOT_EXISTS); } + return detail; + } + + /** + * 校验父采购入库单存在且为草稿状态 + */ + 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/MesWmItemReceiptLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineService.java index 0518363..26a790b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/itemreceipt/MesWmItemReceiptLineService.java @@ -59,4 +59,11 @@ public interface MesWmItemReceiptLineService { */ List getItemReceiptLineListByReceiptId(Long receiptId); + /** + * 按入库单编号批量删除行 + * + * @param receiptId 入库单编号 + */ + void deleteItemReceiptLineByReceiptId(Long receiptId); + } 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 83dcb37..94f5d17 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 @@ -4,10 +4,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLinePageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.line.MesWmItemReceiptLineSaveReqVO; +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.MesWmItemReceiptDetailMapper; 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 jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -15,7 +18,7 @@ import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; -import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_ITEM_RECEIPT_LINE_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; /** * MES 采购入库单行 Service 实现类 @@ -28,11 +31,16 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ private MesWmItemReceiptLineMapper itemReceiptLineMapper; @Resource - private MesWmItemReceiptDetailMapper itemReceiptDetailMapper; + @Lazy + private MesWmItemReceiptService itemReceiptService; + + @Resource + private MesWmItemReceiptDetailService itemReceiptDetailService; @Override public Long createItemReceiptLine(MesWmItemReceiptLineSaveReqVO createReqVO) { - // TODO @AI:校验关联字段; + // 校验父单据存在且为草稿状态 + validateReceiptStatusDraft(createReqVO.getReceiptId()); // 新增 MesWmItemReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmItemReceiptLineDO.class); @@ -43,8 +51,9 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ @Override public void updateItemReceiptLine(MesWmItemReceiptLineSaveReqVO updateReqVO) { // 校验存在 - validateItemReceiptLineExists(updateReqVO.getId()); - // TODO @AI:校验关联字段; + MesWmItemReceiptLineDO line = validateItemReceiptLineExists(updateReqVO.getId()); + // 校验父单据存在且为草稿状态 + validateReceiptStatusDraft(line.getReceiptId()); // 更新 MesWmItemReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmItemReceiptLineDO.class); @@ -58,7 +67,7 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ validateItemReceiptLineExists(id); // 级联删除明细 - itemReceiptDetailMapper.deleteByLineId(id); + itemReceiptDetailService.deleteItemReceiptDetailByLineId(id); // 删除 itemReceiptLineMapper.deleteById(id); } @@ -78,10 +87,30 @@ public class MesWmItemReceiptLineServiceImpl implements MesWmItemReceiptLineServ return itemReceiptLineMapper.selectListByReceiptId(receiptId); } - private void validateItemReceiptLineExists(Long id) { - if (itemReceiptLineMapper.selectById(id) == null) { + @Override + public void deleteItemReceiptLineByReceiptId(Long receiptId) { + itemReceiptLineMapper.deleteByReceiptId(receiptId); + } + + private MesWmItemReceiptLineDO validateItemReceiptLineExists(Long id) { + MesWmItemReceiptLineDO line = itemReceiptLineMapper.selectById(id); + if (line == null) { throw exception(WM_ITEM_RECEIPT_LINE_NOT_EXISTS); } + return line; + } + + /** + * 校验父采购入库单存在且为草稿状态 + */ + 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 5d01683..e8c34a2 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 @@ -49,25 +49,22 @@ public interface MesWmItemReceiptService { */ PageResult getItemReceiptPage(MesWmItemReceiptPageReqVO pageReqVO); - // TODO @AI:0-》1、1-》2 尽量写状态;不要写这种; /** - * 提交采购入库单(0→1) + * 提交采购入库单(草稿 → 已提交) * * @param id 编号 */ void submitItemReceipt(Long id); - // TODO @AI:0-》1、1-》2 尽量写状态;不要写这种; /** - * 审批采购入库单(1→2) + * 审批采购入库单(已提交 → 已审批) * * @param id 编号 */ void approveItemReceipt(Long id); - // TODO @AI:0-》1、1-》2 尽量写状态;不要写这种; /** - * 执行入库(2→3),更新库存台账 + * 执行入库(已审批 → 已完成),更新库存台账 * * @param 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 db079e2..362de2f 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 @@ -1,15 +1,17 @@ package cn.iocoder.yudao.module.mes.service.wm.itemreceipt; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.wm.itemreceipt.vo.MesWmItemReceiptSaveReqVO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptDetailDO; import cn.iocoder.yudao.module.mes.dal.dataobject.wm.itemreceipt.MesWmItemReceiptLineDO; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptDetailMapper; -import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.wm.itemreceipt.MesWmItemReceiptMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmItemReceiptStatusEnum; import cn.iocoder.yudao.module.mes.service.wm.arrivalnotice.MesWmArrivalNoticeService; import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; import jakarta.annotation.Resource; @@ -35,10 +37,10 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { private MesWmItemReceiptMapper itemReceiptMapper; @Resource - private MesWmItemReceiptLineMapper itemReceiptLineMapper; + private MesWmItemReceiptLineService itemReceiptLineService; @Resource - private MesWmItemReceiptDetailMapper itemReceiptDetailMapper; + private MesWmItemReceiptDetailService itemReceiptDetailService; @Resource @Lazy @@ -51,25 +53,18 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { public Long createItemReceipt(MesWmItemReceiptSaveReqVO createReqVO) { // 校验编码唯一 validateCodeUnique(null, createReqVO.getCode()); - // TODO @AI:校验关联字段; // 插入 MesWmItemReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmItemReceiptDO.class); - receipt.setStatus(0); // 草稿 TODO @AI:使用枚举类 + receipt.setStatus(MesWmItemReceiptStatusEnum.PREPARE.getStatus()); itemReceiptMapper.insert(receipt); return receipt.getId(); } @Override public void updateItemReceipt(MesWmItemReceiptSaveReqVO updateReqVO) { - // 校验存在 - MesWmItemReceiptDO receipt = validateItemReceiptExists(updateReqVO.getId()); - // TODO @AI:校验关联字段; - // 校验状态:只有草稿才允许修改 - // TODO @AI:校验状态,看看抽个方法,尽量几个方法复用 - if (receipt.getStatus() != 0) { - throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); - } + // 校验存在 + 草稿状态 + validateItemReceiptExistsAndDraft(updateReqVO.getId()); // 校验编码唯一 validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); @@ -81,17 +76,12 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { @Override @Transactional(rollbackFor = Exception.class) public void deleteItemReceipt(Long id) { - // 校验存在 - MesWmItemReceiptDO receipt = validateItemReceiptExists(id); - // 校验状态:只有草稿才允许删除 - // TODO @AI:校验状态,看看抽个方法,尽量几个方法复用 - if (receipt.getStatus() != 0) { - throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); - } + // 校验存在 + 草稿状态 + validateItemReceiptExistsAndDraft(id); // 级联删除明细和行 - itemReceiptDetailMapper.deleteByReceiptId(id); - itemReceiptLineMapper.deleteByReceiptId(id); + itemReceiptDetailService.deleteItemReceiptDetailByReceiptId(id); + itemReceiptLineService.deleteItemReceiptLineByReceiptId(id); // 删除 itemReceiptMapper.deleteById(id); } @@ -107,47 +97,43 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { } @Override + @Transactional(rollbackFor = Exception.class) public void submitItemReceipt(Long id) { - // 校验存在 - MesWmItemReceiptDO receipt = validateItemReceiptExists(id); - // TODO @AI:校验状态,看看抽个方法,尽量几个方法复用 - if (receipt.getStatus() != 0) { - throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); - } + // 校验存在 + 草稿状态 + validateItemReceiptExistsAndDraft(id); // 校验至少有一条行 - // TODO @AI:对方抽个计算数量的方法啊; - List lines = itemReceiptLineMapper.selectListByReceiptId(id); - if (lines.isEmpty()) { + List lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(id); + if (CollUtil.isEmpty(lines)) { throw exception(WM_ITEM_RECEIPT_NO_LINE); } // 提交 - itemReceiptMapper.updateById(new MesWmItemReceiptDO().setId(id).setStatus(1)); + itemReceiptMapper.updateById(new MesWmItemReceiptDO() + .setId(id).setStatus(MesWmItemReceiptStatusEnum.SUBMITTED.getStatus())); } @Override + @Transactional(rollbackFor = Exception.class) public void approveItemReceipt(Long id) { // 校验存在 MesWmItemReceiptDO receipt = validateItemReceiptExists(id); - // TODO @AI:抽一些校验的存在+状态方法 - if (receipt.getStatus() != 1) { + if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.SUBMITTED.getStatus(), receipt.getStatus())) { throw exception(WM_ITEM_RECEIPT_STATUS_ERROR); } // 校验每行的 SUM(detail.quantity) = line.receivedQuantity - // TODO @AI:抽个计算的 count 方法,然后在行和明细都用;不然代码里到处都是计算的逻辑; - List lines = itemReceiptLineMapper.selectListByReceiptId(id); + List lines = itemReceiptLineService.getItemReceiptLineListByReceiptId(id); for (MesWmItemReceiptLineDO line : lines) { - List details = itemReceiptDetailMapper.selectListByLineId(line.getId()); - BigDecimal totalDetailQty = details.stream() - .map(MesWmItemReceiptDetailDO::getQuantity) - .reduce(BigDecimal.ZERO, BigDecimal::add); + List 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) { throw exception(WM_ITEM_RECEIPT_DETAIL_QUANTITY_MISMATCH); } } // 审批 - itemReceiptMapper.updateById(new MesWmItemReceiptDO().setId(id).setStatus(2)); + itemReceiptMapper.updateById(new MesWmItemReceiptDO() + .setId(id).setStatus(MesWmItemReceiptStatusEnum.APPROVED.getStatus())); } @Override @@ -155,14 +141,12 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { public void executeItemReceipt(Long id) { // 校验存在 MesWmItemReceiptDO receipt = validateItemReceiptExists(id); - // TODO @AI:抽一些校验的存在+状态方法 - if (receipt.getStatus() != 2) { + if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) { throw exception(WM_ITEM_RECEIPT_STATUS_ERROR); } // 遍历所有明细,更新库存台账 - // TODO @AI:select 方法,对方搞个; - List details = itemReceiptDetailMapper.selectListByReceiptId(id); + List details = itemReceiptDetailService.getItemReceiptDetailListByReceiptId(id); for (MesWmItemReceiptDetailDO detail : details) { materialStockService.increaseStock( detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), @@ -170,8 +154,8 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { } // 更新入库单状态 - // TODO @AI:枚举类; - itemReceiptMapper.updateById(new MesWmItemReceiptDO().setId(id).setStatus(3)); + itemReceiptMapper.updateById(new MesWmItemReceiptDO() + .setId(id).setStatus(MesWmItemReceiptStatusEnum.FINISHED.getStatus())); // 更新关联的到货通知单状态 if (receipt.getNoticeId() != null) { arrivalNoticeService.finishArrivalNotice(receipt.getNoticeId()); @@ -186,13 +170,23 @@ public class MesWmItemReceiptServiceImpl implements MesWmItemReceiptService { return receipt; } + /** + * 校验采购入库单存在且为草稿状态 + */ + private MesWmItemReceiptDO validateItemReceiptExistsAndDraft(Long id) { + MesWmItemReceiptDO receipt = validateItemReceiptExists(id); + if (ObjUtil.notEqual(MesWmItemReceiptStatusEnum.PREPARE.getStatus(), receipt.getStatus())) { + throw exception(WM_ITEM_RECEIPT_STATUS_NOT_PREPARE); + } + return receipt; + } + private void validateCodeUnique(Long id, String code) { MesWmItemReceiptDO receipt = itemReceiptMapper.selectByCode(code); if (receipt == null) { return; } - // TODO @AI:ObjUtil notEquals - if (id == null || !id.equals(receipt.getId())) { + if (ObjUtil.notEqual(id, receipt.getId())) { throw exception(WM_ITEM_RECEIPT_CODE_DUPLICATE); } }