From 4ec13fac38725dd2993439d220365f4ed0ee5345 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 3 Mar 2026 19:11:48 +0800 Subject: [PATCH] ✨ feat(mes): 更新杂项类型为整数并添加明细服务 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssuePageReqVO.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java | 9 ++++----- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java | 6 +++--- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java | 1 + yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java | 4 ++-- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDetailDO.java | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java | 2 +- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscissue/MesWmMiscIssueDetailMapper.java | 31 +++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscIssueTypeEnum.java | 24 ++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java | 15 +++++---------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailService.java | 46 ++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailServiceImpl.java | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineService.java | 7 +++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineServiceImpl.java | 54 ++++++++++++++++++++++++++++++++++++++++-------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java | 3 --- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java | 5 +++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java | 20 ++++---------------- yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailService.java | 35 +++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java | 36 ++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineService.java | 27 +++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java | 33 +++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java | 263 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 26 files changed, 816 insertions(+), 62 deletions(-) create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDetailDO.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscissue/MesWmMiscIssueDetailMapper.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscIssueTypeEnum.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java create mode 100644 yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssuePageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssuePageReqVO.java index ef9ecfc..5c5eb4e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssuePageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssuePageReqVO.java @@ -21,8 +21,8 @@ public class MesWmMiscIssuePageReqVO extends PageParam { @Schema(description = "出库单名称", example = "库存调整出库") private String name; - @Schema(description = "杂项类型", example = "STOCK_ADJUSTMENT") - private String type; + @Schema(description = "杂项类型", example = "1") + private Integer type; @Schema(description = "状态", example = "0") private Integer status; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java index 3b3e6a8..cbab924 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueRespVO.java @@ -18,8 +18,8 @@ public class MesWmMiscIssueRespVO { @Schema(description = "出库单名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "库存调整出库") private String name; - @Schema(description = "杂项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "STOCK_ADJUSTMENT") - private String type; + @Schema(description = "杂项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Integer type; @Schema(description = "来源单据ID", example = "1") private Long sourceDocId; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java index 53fc1af..562988f 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscissue/vo/MesWmMiscIssueSaveReqVO.java @@ -22,9 +22,9 @@ public class MesWmMiscIssueSaveReqVO { @NotBlank(message = "出库单名称不能为空") private String name; - @Schema(description = "杂项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "STOCK_ADJUSTMENT") - @NotBlank(message = "杂项类型不能为空") - private String type; + @Schema(description = "杂项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "杂项类型不能为空") + private Integer type; @Schema(description = "来源单据ID", example = "1") private Long sourceDocId; @@ -35,8 +35,7 @@ public class MesWmMiscIssueSaveReqVO { @Schema(description = "来源单据类型", example = "PURCHASE_ORDER") private String sourceDocType; - @Schema(description = "出库日期", requiredMode = Schema.RequiredMode.REQUIRED) - @NotNull(message = "出库日期不能为空") + @Schema(description = "出库日期") private LocalDateTime issueDate; @Schema(description = "备注", example = "备注") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java index 38af9b1..9869f10 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptPageReqVO.java @@ -23,8 +23,8 @@ public class MesWmMiscReceiptPageReqVO extends PageParam { @Schema(description = "入库单名称", example = "退料入库单") private String name; - @Schema(description = "杂项类型", example = "RETURN") - private String type; + @Schema(description = "杂项类型", example = "1") + private Integer type; @Schema(description = "状态", example = "0") private Integer status; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java index 8a8960b..e29fc87 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptRespVO.java @@ -18,8 +18,8 @@ public class MesWmMiscReceiptRespVO { @Schema(description = "入库单名称", example = "退料入库单") private String name; - @Schema(description = "杂项类型", example = "RETURN") - private String type; + @Schema(description = "杂项类型", example = "1") + private Integer type; @Schema(description = "来源单据 ID", example = "1") private Long sourceDocId; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java index 94d184c..e917cb2 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/MesWmMiscReceiptSaveReqVO.java @@ -23,9 +23,9 @@ public class MesWmMiscReceiptSaveReqVO { @NotEmpty(message = "入库单名称不能为空") private String name; - @Schema(description = "杂项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "RETURN") - @NotEmpty(message = "杂项类型不能为空") - private String type; + @Schema(description = "杂项类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @NotNull(message = "杂项类型不能为空") + private Integer type; @Schema(description = "来源单据 ID", example = "1") private Long sourceDocId; diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java index 2348be4..3af716b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/miscreceipt/vo/line/MesWmMiscReceiptLineSaveReqVO.java @@ -24,6 +24,7 @@ public class MesWmMiscReceiptLineSaveReqVO { @Schema(description = "入库数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100.00") @NotNull(message = "入库数量不能为空") + // TODO @AI:最小是 0.01 private BigDecimal quantity; @Schema(description = "批次号", example = "BATCH20260301") diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java index 9d777b1..cd722a0 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDO.java @@ -38,9 +38,9 @@ public class MesWmMiscIssueDO extends BaseDO { /** * 杂项类型 * - * 枚举 {@link cn.iocoder.yudao.module.mes.enums.DictTypeConstants#MES_WM_MISC_ISSUE_TYPE} + * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmMiscIssueTypeEnum} */ - private String type; + private Integer type; // TODO @芋艿:这里还没定,关联哪些; /** * 来源单据ID diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDetailDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDetailDO.java new file mode 100644 index 0000000..1126acd --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscissue/MesWmMiscIssueDetailDO.java @@ -0,0 +1,93 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue; + +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.materialstock.MesWmMaterialStockDO; +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; +import lombok.*; + +import java.math.BigDecimal; + +/** + * MES 杂项出库明细 DO + */ +@TableName("mes_wm_misc_issue_detail") +@KeySequence("mes_wm_misc_issue_detail_seq") +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesWmMiscIssueDetailDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 出库单ID + * + * 关联 {@link MesWmMiscIssueDO#getId()} + */ + private Long issueId; + /** + * 行ID + * + * 关联 {@link MesWmMiscIssueLineDO#getId()} + */ + private Long lineId; + /** + * 库存记录ID + * + * 关联 {@link MesWmMaterialStockDO#getId()} + */ + private Long materialStockId; + /** + * 物料ID + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 出库数量 + */ + private BigDecimal quantity; + /** + * 批次ID + */ + private Long batchId; + /** + * 批次号 + */ + private String batchCode; + /** + * 仓库ID + * + * 关联 {@link MesWmWarehouseDO#getId()} + */ + private Long warehouseId; + /** + * 库区ID + * + * 关联 {@link MesWmWarehouseLocationDO#getId()} + */ + private Long locationId; + /** + * 库位ID + * + * 关联 {@link MesWmWarehouseAreaDO#getId()} + */ + private Long areaId; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java index 44ade8d..670eac9 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/wm/miscreceipt/MesWmMiscReceiptDO.java @@ -43,7 +43,7 @@ public class MesWmMiscReceiptDO extends BaseDO { * * 枚举 {@link MesWmMiscReceiptTypeEnum} */ - private String type; + private Integer type; // TODO @芋艿:后续看看怎么跟进; /** * 来源单据 ID diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscissue/MesWmMiscIssueDetailMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscissue/MesWmMiscIssueDetailMapper.java new file mode 100644 index 0000000..68ad929 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/miscissue/MesWmMiscIssueDetailMapper.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.wm.miscissue; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue.MesWmMiscIssueDetailDO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * MES 杂项出库明细 Mapper + */ +@Mapper +public interface MesWmMiscIssueDetailMapper extends BaseMapperX { + + default List selectListByLineId(Long lineId) { + return selectList(MesWmMiscIssueDetailDO::getLineId, lineId); + } + + default List selectListByIssueId(Long issueId) { + return selectList(MesWmMiscIssueDetailDO::getIssueId, issueId); + } + + default void deleteByIssueId(Long issueId) { + delete(MesWmMiscIssueDetailDO::getIssueId, issueId); + } + + default void deleteByLineId(Long lineId) { + delete(MesWmMiscIssueDetailDO::getLineId, lineId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscIssueTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscIssueTypeEnum.java new file mode 100644 index 0000000..5162329 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscIssueTypeEnum.java @@ -0,0 +1,24 @@ +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; + +@Getter +@AllArgsConstructor +public enum MesWmMiscIssueTypeEnum implements ArrayValuable { + + ADJUST(1, "库存调整"), + SCRAP(2, "报废出库"); + + private final Integer type; + private final String name; + + @Override + public Integer[] array() { + return Arrays.stream(values()).map(MesWmMiscIssueTypeEnum::getType).toArray(Integer[]::new); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java index 17f55c2..072637e 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/wm/MesWmMiscReceiptTypeEnum.java @@ -8,31 +8,26 @@ import java.util.Arrays; /** * MES 杂项入库类型枚举 - * - * @author 芋道源码 */ @Getter @AllArgsConstructor -public enum MesWmMiscReceiptTypeEnum implements ArrayValuable { +public enum MesWmMiscReceiptTypeEnum implements ArrayValuable { - RETURN("RETURN", "退料入库"), - ADJUST("ADJUST", "调整入库"), - TRANSFER("TRANSFER", "调拨入库"), - OTHER("OTHER", "其他入库"); + ADJUST(1, "库存调整"); - public static final String[] ARRAYS = Arrays.stream(values()).map(MesWmMiscReceiptTypeEnum::getType).toArray(String[]::new); + public static final Integer[] ARRAYS = Arrays.stream(values()).map(MesWmMiscReceiptTypeEnum::getType).toArray(Integer[]::new); /** * 类型值 */ - private final String type; + private final Integer type; /** * 类型名 */ private final String name; @Override - public String[] array() { + public Integer[] array() { return ARRAYS; } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailService.java new file mode 100644 index 0000000..9f9b0e1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailService.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.service.wm.miscissue; + +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMiscIssueLineSaveReqVO; + +/** + * MES 杂项出库明细 Service 接口 + */ +public interface MesWmMiscIssueDetailService { + + /** + * 创建杂项出库明细 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createMiscIssueDetail(MesWmMiscIssueLineSaveReqVO createReqVO); + + /** + * 更新杂项出库明细 + * + * @param updateReqVO 更新信息 + */ + void updateMiscIssueDetail(MesWmMiscIssueLineSaveReqVO updateReqVO); + + /** + * 删除杂项出库明细(根据出库单ID) + * + * @param issueId 出库单ID + */ + void deleteMiscIssueDetailByIssueId(Long issueId); + + /** + * 删除杂项出库明细(根据行ID) + * + * @param lineId 行ID + */ + void deleteMiscIssueDetailByLineId(Long lineId); + + /** + * 校验杂项出库明细是否存在 + * + * @param id 编号 + */ + void validateMiscIssueDetailExists(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailServiceImpl.java new file mode 100644 index 0000000..58d132f --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueDetailServiceImpl.java @@ -0,0 +1,68 @@ +package cn.iocoder.yudao.module.mes.service.wm.miscissue; + +import cn.hutool.core.collection.CollUtil; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.miscissue.vo.line.MesWmMiscIssueLineSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.miscissue.MesWmMiscIssueDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.miscissue.MesWmMiscIssueDetailMapper; +import jakarta.annotation.Resource; +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_MISC_ISSUE_DETAIL_NOT_EXISTS; + +/** + * MES 杂项出库明细 Service 实现类 + */ +@Service +@Validated +public class MesWmMiscIssueDetailServiceImpl implements MesWmMiscIssueDetailService { + + @Resource + private MesWmMiscIssueDetailMapper issueDetailMapper; + + @Override + public Long createMiscIssueDetail(MesWmMiscIssueLineSaveReqVO createReqVO) { + MesWmMiscIssueDetailDO detail = BeanUtils.toBean(createReqVO, MesWmMiscIssueDetailDO.class); + detail.setId(null); // 清空 id,让数据库自动生成 + detail.setLineId(createReqVO.getId()); // VO 的 id 就是 lineId + issueDetailMapper.insert(detail); + return detail.getId(); + } + + @Override + public void updateMiscIssueDetail(MesWmMiscIssueLineSaveReqVO updateReqVO) { + // 基于 lineId 查询唯一的 detail 记录(VO 的 id 字段是 lineId) + List details = issueDetailMapper.selectListByLineId(updateReqVO.getId()); + if (CollUtil.isEmpty(details)) { + return; + } + + // 更新 detail(应该只有一条记录) + MesWmMiscIssueDetailDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMiscIssueDetailDO.class); + updateObj.setId(details.get(0).getId()); // 使用查询到的 detail id + updateObj.setLineId(updateReqVO.getId()); // VO 的 id 就是 lineId + issueDetailMapper.updateById(updateObj); + } + + @Override + public void deleteMiscIssueDetailByIssueId(Long issueId) { + issueDetailMapper.deleteByIssueId(issueId); + } + + @Override + public void deleteMiscIssueDetailByLineId(Long lineId) { + issueDetailMapper.deleteByLineId(lineId); + } + + @Override + public void validateMiscIssueDetailExists(Long id) { + if (issueDetailMapper.selectById(id) == null) { + throw exception(WM_MISC_ISSUE_DETAIL_NOT_EXISTS); + } + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineService.java index 8bd7cfb..d05e328 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineService.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueLineService.java @@ -66,4 +66,11 @@ public interface MesWmMiscIssueLineService { */ void deleteMiscIssueLineByIssueId(Long issueId); + /** + * 校验杂项出库单行是否存在 + * + * @param id 编号 + */ + void validateMiscIssueLineExists(Long id); + } 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 f66a0f4..cd01cab 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 @@ -17,7 +17,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.*; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.WM_MISC_ISSUE_LINE_NOT_EXISTS; /** * MES 杂项出库单行 Service 实现类 @@ -34,52 +34,67 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService private MesWmMiscIssueService miscIssueService; @Resource + @Lazy + private MesWmMiscIssueDetailService miscIssueDetailService; + + @Resource private MesMdItemService itemService; @Resource private MesWmWarehouseAreaService warehouseAreaService; @Override + @Transactional(rollbackFor = Exception.class) public Long createMiscIssueLine(MesWmMiscIssueLineSaveReqVO createReqVO) { - // 校验父单据存在且为可编辑状态 + // 1.1 校验父单据存在且为可编辑状态 miscIssueService.validateMiscIssueEditable(createReqVO.getIssueId()); - // 校验物料存在 + // 1.2 校验物料存在 itemService.validateItemExists(createReqVO.getItemId()); - // 校验仓库、库区、库位的父子关系 + // 1.3 校验仓库、库区、库位的父子关系 warehouseAreaService.validateWarehouseAreaExists(createReqVO.getWarehouseId(), createReqVO.getLocationId(), createReqVO.getAreaId()); - // 新增 + // 2. 新增行 MesWmMiscIssueLineDO line = BeanUtils.toBean(createReqVO, MesWmMiscIssueLineDO.class); miscIssueLineMapper.insert(line); + + // 3.自动创建明细 + createReqVO.setId(line.getId()); + miscIssueDetailService.createMiscIssueDetail(createReqVO); return line.getId(); } @Override + @Transactional(rollbackFor = Exception.class) public void updateMiscIssueLine(MesWmMiscIssueLineSaveReqVO updateReqVO) { - // 校验存在 - MesWmMiscIssueLineDO line = validateMiscIssueLineExists(updateReqVO.getId()); - // 校验父单据存在且为可编辑状态 + // 1.1 校验存在 + MesWmMiscIssueLineDO line = validateAndGetMiscIssueLine(updateReqVO.getId()); + // 1.2 校验父单据存在且为可编辑状态 miscIssueService.validateMiscIssueEditable(line.getIssueId()); - // 校验物料存在 + // 1.3 校验物料存在 itemService.validateItemExists(updateReqVO.getItemId()); - // 校验仓库、库区、库位的父子关系 + // 1.4 校验仓库、库区、库位的父子关系 warehouseAreaService.validateWarehouseAreaExists(updateReqVO.getWarehouseId(), updateReqVO.getLocationId(), updateReqVO.getAreaId()); - // 更新 + // 2. 更新行 MesWmMiscIssueLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMiscIssueLineDO.class); miscIssueLineMapper.updateById(updateObj); + + // 3. 更新明细(基于行信息) + miscIssueDetailService.updateMiscIssueDetail(updateReqVO); } @Override @Transactional(rollbackFor = Exception.class) public void deleteMiscIssueLine(Long id) { // 校验存在 - validateMiscIssueLineExists(id); + validateAndGetMiscIssueLine(id); - // 删除 + // 删除行 miscIssueLineMapper.deleteById(id); + // 删除明细 + miscIssueDetailService.deleteMiscIssueDetailByLineId(id); } @Override @@ -98,11 +113,22 @@ public class MesWmMiscIssueLineServiceImpl implements MesWmMiscIssueLineService } @Override + @Transactional(rollbackFor = Exception.class) public void deleteMiscIssueLineByIssueId(Long issueId) { + // 删除明细 + miscIssueDetailService.deleteMiscIssueDetailByIssueId(issueId); + // 删除行 miscIssueLineMapper.deleteByIssueId(issueId); } - private MesWmMiscIssueLineDO validateMiscIssueLineExists(Long id) { + @Override + public void validateMiscIssueLineExists(Long id) { + if (miscIssueLineMapper.selectById(id) == null) { + throw exception(WM_MISC_ISSUE_LINE_NOT_EXISTS); + } + } + + private MesWmMiscIssueLineDO validateAndGetMiscIssueLine(Long id) { MesWmMiscIssueLineDO line = miscIssueLineMapper.selectById(id); if (line == null) { throw exception(WM_MISC_ISSUE_LINE_NOT_EXISTS); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java index 08eced1..a2592a1 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscissue/MesWmMiscIssueServiceImpl.java @@ -39,9 +39,6 @@ public class MesWmMiscIssueServiceImpl implements MesWmMiscIssueService { @Resource private MesWmMiscIssueLineService miscIssueLineService; - @Resource - private MesWmMaterialStockService materialStockService; - @Override public Long createMiscIssue(MesWmMiscIssueSaveReqVO createReqVO) { // 校验编码唯一 diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java index 73e8d59..1f9850c 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptLineServiceImpl.java @@ -25,9 +25,12 @@ public class MesWmMiscReceiptLineServiceImpl implements MesWmMiscReceiptLineServ @Override public Long createMiscReceiptLine(MesWmMiscReceiptLineSaveReqVO createReqVO) { + // TODO @AI:物料存在;lineId 可编辑; + // 插入 MesWmMiscReceiptLineDO line = BeanUtils.toBean(createReqVO, MesWmMiscReceiptLineDO.class); miscReceiptLineMapper.insert(line); + // TODO @AI:还是需要新增一个 detail 表;类似别的 line + detail 的设计;1)create 时,新增;2)update 时,更新;3)delete 时,删除; return line.getId(); } @@ -35,6 +38,7 @@ public class MesWmMiscReceiptLineServiceImpl implements MesWmMiscReceiptLineServ public void updateMiscReceiptLine(MesWmMiscReceiptLineSaveReqVO updateReqVO) { // 校验存在 validateMiscReceiptLineExists(updateReqVO.getId()); + // TODO @AI:物料存在;lineId 可编辑; // 更新 MesWmMiscReceiptLineDO updateObj = BeanUtils.toBean(updateReqVO, MesWmMiscReceiptLineDO.class); @@ -43,6 +47,7 @@ public class MesWmMiscReceiptLineServiceImpl implements MesWmMiscReceiptLineServ @Override public void deleteMiscReceiptLine(Long id) { + // TODO @AI:lineId 存在 + 可编辑; // 校验存在 validateMiscReceiptLineExists(id); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java index eebd264..bf4fcd0 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/miscreceipt/MesWmMiscReceiptServiceImpl.java @@ -18,7 +18,6 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; -import java.math.BigDecimal; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -98,17 +97,6 @@ public class MesWmMiscReceiptServiceImpl implements MesWmMiscReceiptService { throw exception(WM_MISC_RECEIPT_NO_LINE); } - // 校验行数据完整性 - // TODO @AI:不用做这块的校验; - for (MesWmMiscReceiptLineDO line : lines) { - if (line.getWarehouseId() == null) { - throw exception(WM_MISC_RECEIPT_WAREHOUSE_REQUIRED); - } - if (line.getQuantity() == null || line.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { - throw exception(WM_MISC_RECEIPT_QUANTITY_INVALID); - } - } - // 提交审批(草稿 → 已审批) miscReceiptMapper.updateById(new MesWmMiscReceiptDO() .setId(id).setStatus(MesWmMiscReceiptStatusEnum.APPROVED.getStatus())); @@ -124,8 +112,6 @@ public class MesWmMiscReceiptServiceImpl implements MesWmMiscReceiptService { } // 遍历所有行,更新库存台账 - // TODO @芋艿:后续对齐下; - // TODO @AI:这里有编译报错; List lines = miscReceiptLineMapper.selectListByReceiptId(id); for (MesWmMiscReceiptLineDO line : lines) { materialStockService.increaseStock( @@ -133,9 +119,11 @@ public class MesWmMiscReceiptServiceImpl implements MesWmMiscReceiptService { line.getWarehouseId(), line.getLocationId(), line.getAreaId(), - line.getBatchCode(), + null, // batchId 传 null(杂项入库使用 batchCode) + line.getQuantity(), null, // vendorId 传 null(杂项入库无供应商) - line.getQuantity() + line.getProductionDate(), + line.getExpireDate() ); } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailService.java new file mode 100644 index 0000000..0ad4be1 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailService.java @@ -0,0 +1,35 @@ +package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; + +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDetailDO; + +import java.util.List; + +/** + * MES 委外收货明细 Service 接口 + */ +public interface MesWmOutsourceReceiptDetailService { + + /** + * 获得委外收货明细列表(根据收货单编号) + * + * @param receiptId 收货单编号 + * @return 委外收货明细列表 + */ + List getOutsourceReceiptDetailListByReceiptId(Long receiptId); + + /** + * 获得委外收货明细列表(根据行编号) + * + * @param lineId 行编号 + * @return 委外收货明细列表 + */ + List getOutsourceReceiptDetailListByLineId(Long lineId); + + /** + * 删除委外收货明细(根据收货单编号) + * + * @param receiptId 收货单编号 + */ + void deleteOutsourceReceiptDetailByReceiptId(Long receiptId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java new file mode 100644 index 0000000..53ba675 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptDetailServiceImpl.java @@ -0,0 +1,36 @@ +package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; + +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDetailDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptDetailMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +/** + * MES 委外收货明细 Service 实现类 + */ +@Service +@Validated +public class MesWmOutsourceReceiptDetailServiceImpl implements MesWmOutsourceReceiptDetailService { + + @Resource + private MesWmOutsourceReceiptDetailMapper detailMapper; + + @Override + public List getOutsourceReceiptDetailListByReceiptId(Long receiptId) { + return detailMapper.selectListByReceiptId(receiptId); + } + + @Override + public List getOutsourceReceiptDetailListByLineId(Long lineId) { + return detailMapper.selectListByLineId(lineId); + } + + @Override + public void deleteOutsourceReceiptDetailByReceiptId(Long receiptId) { + detailMapper.deleteByReceiptId(receiptId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineService.java new file mode 100644 index 0000000..65a4d33 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineService.java @@ -0,0 +1,27 @@ +package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; + +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; + +import java.util.List; + +/** + * MES 委外收货单行 Service 接口 + */ +public interface MesWmOutsourceReceiptLineService { + + /** + * 获得委外收货单行列表 + * + * @param receiptId 收货单编号 + * @return 委外收货单行列表 + */ + List getOutsourceReceiptLineListByReceiptId(Long receiptId); + + /** + * 删除委外收货单行(根据收货单编号) + * + * @param receiptId 收货单编号 + */ + void deleteOutsourceReceiptLineByReceiptId(Long receiptId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java new file mode 100644 index 0000000..265d1ca --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptLineServiceImpl.java @@ -0,0 +1,33 @@ +package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; + +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptLineMapper; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import java.util.List; + +/** + * MES 委外收货单行 Service 实现类 + */ +@Service +@Validated +public class MesWmOutsourceReceiptLineServiceImpl implements MesWmOutsourceReceiptLineService { + + @Resource + private MesWmOutsourceReceiptLineMapper lineMapper; + + // TODO @AI:新增、修改缺少; + + @Override + public List getOutsourceReceiptLineListByReceiptId(Long receiptId) { + return lineMapper.selectListByReceiptId(receiptId); + } + + @Override + public void deleteOutsourceReceiptLineByReceiptId(Long receiptId) { + lineMapper.deleteByReceiptId(receiptId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java new file mode 100644 index 0000000..6c19274 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptService.java @@ -0,0 +1,80 @@ +package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDO; +import jakarta.validation.Valid; + +/** + * MES 外协入库单 Service 接口 + */ +public interface MesWmOutsourceReceiptService { + + /** + * 创建外协入库单 + * + * @param createReqVO 创建信息 + * @return 编号 + */ + Long createOutsourceReceipt(@Valid MesWmOutsourceReceiptSaveReqVO createReqVO); + + /** + * 修改外协入库单 + * + * @param updateReqVO 修改信息 + */ + void updateOutsourceReceipt(@Valid MesWmOutsourceReceiptSaveReqVO updateReqVO); + + /** + * 删除外协入库单(级联删除行+明细) + * + * @param id 编号 + */ + void deleteOutsourceReceipt(Long id); + + /** + * 获得外协入库单 + * + * @param id 编号 + * @return 外协入库单 + */ + MesWmOutsourceReceiptDO getOutsourceReceipt(Long id); + + /** + * 获得外协入库单分页 + * + * @param pageReqVO 分页参数 + * @return 外协入库单分页 + */ + PageResult getOutsourceReceiptPage(MesWmOutsourceReceiptPageReqVO pageReqVO); + + /** + * 提交外协入库单(草稿 → 审批中) + * + * @param id 编号 + */ + void submitOutsourceReceipt(Long id); + + /** + * 执行上架(审批中 → 已审批) + * + * @param id 编号 + */ + void stockOutsourceReceipt(Long id); + + /** + * 完成入库(已审批 → 已完成),更新库存台账 + * + * @param id 编号 + */ + void finishOutsourceReceipt(Long id); + + /** + * 取消外协入库单(任意非已完成/已取消状态 → 已取消) + * + * @param id 编号 + */ + void cancelOutsourceReceipt(Long id); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java new file mode 100644 index 0000000..1730069 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/outsourcereceipt/MesWmOutsourceReceiptServiceImpl.java @@ -0,0 +1,263 @@ +package cn.iocoder.yudao.module.mes.service.wm.outsourcereceipt; + +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.framework.common.util.object.ObjectUtils; +import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptPageReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.wm.outsourcereceipt.vo.MesWmOutsourceReceiptSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptDetailDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.wm.outsourcereceipt.MesWmOutsourceReceiptLineDO; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptDetailMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptLineMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.wm.outsourcereceipt.MesWmOutsourceReceiptMapper; +import cn.iocoder.yudao.module.mes.enums.wm.MesWmOutsourceReceiptStatusEnum; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemService; +import cn.iocoder.yudao.module.mes.service.md.vendor.MesMdVendorService; +import cn.iocoder.yudao.module.mes.service.wm.materialstock.MesWmMaterialStockService; +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 jakarta.annotation.Resource; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; + +import java.math.BigDecimal; +import java.util.List; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; + +/** + * MES 外协入库单 Service 实现类 + */ +@Service +@Validated +public class MesWmOutsourceReceiptServiceImpl implements MesWmOutsourceReceiptService { + + @Resource + private MesWmOutsourceReceiptMapper outsourceReceiptMapper; + + @Resource + private MesWmOutsourceReceiptLineMapper outsourceReceiptLineMapper; + + @Resource + private MesWmOutsourceReceiptDetailMapper outsourceReceiptDetailMapper; + + @Resource + private MesWmMaterialStockService materialStockService; + + @Resource + private MesMdVendorService vendorService; + + @Resource + private MesMdItemService itemService; + + @Resource + private MesWmWarehouseService warehouseService; + + @Resource + private MesWmWarehouseLocationService warehouseLocationService; + + @Resource + private MesWmWarehouseAreaService warehouseAreaService; + + @Override + public Long createOutsourceReceipt(MesWmOutsourceReceiptSaveReqVO createReqVO) { + // 校验编码唯一 + validateCodeUnique(null, createReqVO.getCode()); + // 校验供应商存在 + vendorService.validateVendorExists(createReqVO.getVendorId()); + + // 插入 + MesWmOutsourceReceiptDO receipt = BeanUtils.toBean(createReqVO, MesWmOutsourceReceiptDO.class); + receipt.setStatus(MesWmOutsourceReceiptStatusEnum.PREPARE.getStatus()); + outsourceReceiptMapper.insert(receipt); + return receipt.getId(); + } + + @Override + public void updateOutsourceReceipt(MesWmOutsourceReceiptSaveReqVO updateReqVO) { + // 校验存在 + 草稿状态 + validateOutsourceReceiptExistsAndDraft(updateReqVO.getId()); + // 校验编码唯一 + validateCodeUnique(updateReqVO.getId(), updateReqVO.getCode()); + // 校验供应商存在 + vendorService.validateVendorExists(updateReqVO.getVendorId()); + + // 更新 + MesWmOutsourceReceiptDO updateObj = BeanUtils.toBean(updateReqVO, MesWmOutsourceReceiptDO.class); + outsourceReceiptMapper.updateById(updateObj); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void deleteOutsourceReceipt(Long id) { + // 校验存在 + 草稿状态 + validateOutsourceReceiptExistsAndDraft(id); + + // 级联删除明细和行 + outsourceReceiptDetailMapper.deleteByReceiptId(id); + outsourceReceiptLineMapper.deleteByReceiptId(id); + // 删除 + outsourceReceiptMapper.deleteById(id); + } + + @Override + public MesWmOutsourceReceiptDO getOutsourceReceipt(Long id) { + return outsourceReceiptMapper.selectById(id); + } + + @Override + public PageResult getOutsourceReceiptPage(MesWmOutsourceReceiptPageReqVO pageReqVO) { + return outsourceReceiptMapper.selectPage(pageReqVO); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void submitOutsourceReceipt(Long id) { + // 校验存在 + 草稿状态 + validateOutsourceReceiptExistsAndDraft(id); + // 校验至少有一条行 + List lines = outsourceReceiptLineMapper.selectListByReceiptId(id); + if (CollUtil.isEmpty(lines)) { + throw exception(WM_OUTSOURCE_RECEIPT_NO_LINE); + } + // 校验物料存在 + for (MesWmOutsourceReceiptLineDO line : lines) { + itemService.validateItemExists(line.getItemId()); + } + + // 提交(草稿 → 审批中) + outsourceReceiptMapper.updateById(new MesWmOutsourceReceiptDO() + .setId(id).setStatus(MesWmOutsourceReceiptStatusEnum.APPROVING.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void stockOutsourceReceipt(Long id) { + // 校验存在 + MesWmOutsourceReceiptDO receipt = validateOutsourceReceiptExists(id); + if (ObjUtil.notEqual(MesWmOutsourceReceiptStatusEnum.APPROVING.getStatus(), receipt.getStatus())) { + throw exception(WM_OUTSOURCE_RECEIPT_STATUS_ERROR); + } + // 校验每行明细数量之和是否等于行入库数量 + // TODO @AI:这个校验,不需要了; + List lines = outsourceReceiptLineMapper.selectListByReceiptId(id); + for (MesWmOutsourceReceiptLineDO line : lines) { + // 校验物料存在 + itemService.validateItemExists(line.getItemId()); + + List details = outsourceReceiptDetailMapper.selectListByLineId(line.getId()); + BigDecimal totalDetailQty = CollectionUtils.getSumValue(details, + MesWmOutsourceReceiptDetailDO::getQuantity, BigDecimal::add, BigDecimal.ZERO); + if (line.getQuantity() != null && totalDetailQty.compareTo(line.getQuantity()) != 0) { + throw exception(WM_OUTSOURCE_RECEIPT_DETAIL_QUANTITY_MISMATCH); + } + + // 校验明细中的仓库、库区、库位存在 + for (MesWmOutsourceReceiptDetailDO detail : details) { + itemService.validateItemExists(detail.getItemId()); + if (detail.getWarehouseId() != null) { + warehouseService.validateWarehouseExists(detail.getWarehouseId()); + } + if (detail.getLocationId() != null) { + warehouseLocationService.validateWarehouseLocationExists(detail.getLocationId()); + } + if (detail.getAreaId() != null) { + warehouseAreaService.validateWarehouseAreaExists(detail.getAreaId()); + } + } + } + + // 审批(审批中 → 已审批) + outsourceReceiptMapper.updateById(new MesWmOutsourceReceiptDO() + .setId(id).setStatus(MesWmOutsourceReceiptStatusEnum.APPROVED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void finishOutsourceReceipt(Long id) { + // 校验存在 + MesWmOutsourceReceiptDO receipt = validateOutsourceReceiptExists(id); + if (ObjUtil.notEqual(MesWmOutsourceReceiptStatusEnum.APPROVED.getStatus(), receipt.getStatus())) { + throw exception(WM_OUTSOURCE_RECEIPT_STATUS_ERROR); + } + + // 遍历所有明细,校验并更新库存台账 + // TODO @AI:芋艿【暂时不处理】;后续在观察; + List details = outsourceReceiptDetailMapper.selectListByReceiptId(id); + for (MesWmOutsourceReceiptDetailDO detail : details) { + // 校验物料、仓库、库区、库位存在 + // TODO @AI:warehouseAreaService 有个公用的校验; + itemService.validateItemExists(detail.getItemId()); + if (detail.getWarehouseId() != null) { + warehouseService.validateWarehouseExists(detail.getWarehouseId()); + } + if (detail.getLocationId() != null) { + warehouseLocationService.validateWarehouseLocationExists(detail.getLocationId()); + } + if (detail.getAreaId() != null) { + warehouseAreaService.validateWarehouseAreaExists(detail.getAreaId()); + } + + materialStockService.increaseStock( + detail.getItemId(), detail.getWarehouseId(), detail.getLocationId(), detail.getAreaId(), + detail.getBatchId(), detail.getQuantity(), receipt.getVendorId(), null, null); + } + + // 更新入库单状态 + outsourceReceiptMapper.updateById(new MesWmOutsourceReceiptDO() + .setId(id).setStatus(MesWmOutsourceReceiptStatusEnum.FINISHED.getStatus())); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void cancelOutsourceReceipt(Long id) { + // 校验存在 + MesWmOutsourceReceiptDO receipt = validateOutsourceReceiptExists(id); + // 已完成和已取消不允许取消 + if (ObjectUtils.equalsAny(receipt.getStatus(), + MesWmOutsourceReceiptStatusEnum.FINISHED.getStatus(), + MesWmOutsourceReceiptStatusEnum.CANCELED.getStatus())) { + throw exception(WM_OUTSOURCE_RECEIPT_CANCEL_NOT_ALLOWED); + } + // 取消 + outsourceReceiptMapper.updateById(new MesWmOutsourceReceiptDO() + .setId(id).setStatus(MesWmOutsourceReceiptStatusEnum.CANCELED.getStatus())); + } + + private MesWmOutsourceReceiptDO validateOutsourceReceiptExists(Long id) { + MesWmOutsourceReceiptDO receipt = outsourceReceiptMapper.selectById(id); + if (receipt == null) { + throw exception(WM_OUTSOURCE_RECEIPT_NOT_EXISTS); + } + return receipt; + } + + /** + * 校验外协入库单存在且为草稿状态 + */ + private MesWmOutsourceReceiptDO validateOutsourceReceiptExistsAndDraft(Long id) { + MesWmOutsourceReceiptDO receipt = validateOutsourceReceiptExists(id); + if (ObjUtil.notEqual(MesWmOutsourceReceiptStatusEnum.PREPARE.getStatus(), receipt.getStatus())) { + throw exception(WM_OUTSOURCE_RECEIPT_STATUS_NOT_PREPARE); + } + return receipt; + } + + private void validateCodeUnique(Long id, String code) { + MesWmOutsourceReceiptDO receipt = outsourceReceiptMapper.selectByCode(code); + if (receipt == null) { + return; + } + if (ObjUtil.notEqual(id, receipt.getId())) { + throw exception(WM_OUTSOURCE_RECEIPT_CODE_DUPLICATE); + } + } + +} -- libgit2 0.21.4