package cn.iocoder.yudao.module.mes.service.wm.transaction.dto; import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.experimental.Accessors; import java.math.BigDecimal; import java.time.LocalDateTime; /** * MES 库存事务 创建 Request DTO */ @Data @Accessors(chain = true) public class MesWmTransactionSaveReqDTO { // ===== 事务核心 ===== /** * 事务类型 * * 枚举 {@link cn.iocoder.yudao.module.mes.enums.wm.MesWmTransactionTypeEnum} */ @NotNull(message = "事务类型不能为空") private Integer type; // ===== 业务来源 ===== /** * 业务类型 * * 对应 {@link cn.iocoder.yudao.module.mes.enums.MesBizTypeConstants} */ @NotNull(message = "业务类型不能为空") private Integer bizType; /** * 业务主单 ID */ @NotNull(message = "业务主单 ID 不能为空") private Long bizId; /** * 业务单号 */ @NotNull(message = "业务单号不能为空") private String bizCode; /** * 业务行 ID */ @NotNull(message = "业务行 ID 不能为空") private Long bizLineId; // ===== 物料维度 ===== /** * 物料 ID */ @NotNull(message = "物料 ID 不能为空") private Long itemId; /** * 变动数量(入库为正数,出库为负数) */ @NotNull(message = "变动数量不能为空") private BigDecimal quantity; /** * 批次 ID */ private Long batchId; /** * 批次号 */ private String batchCode; // ===== 库存位置 ===== /** * 仓库 ID */ @NotNull(message = "仓库 ID 不能为空") private Long warehouseId; /** * 库区 ID */ @NotNull(message = "库区 ID 不能为空") private Long locationId; /** * 库位 ID */ @NotNull(message = "库位 ID 不能为空") private Long areaId; // ===== 台账补充字段(入库时用于初始化 MesWmMaterialStockDO) ===== /** * 供应商 ID(采购入库场景) */ private Long vendorId; /** * 入库时间(为空默认当前时间) */ private LocalDateTime receiptTime; // ===== 关联 ===== /** * 指定库存记录 ID(出库场景优先使用,避免重新匹配库存记录) */ private Long materialStockId; /** * 关联事务 ID */ private Long relatedTransactionId; /** * 是否强制创建新库存记录(仅入库事务有效) * * 为 true 时,入库事务始终创建新的库存记录,不查找已有记录 * 用于退料等场景,需要为每次退料创建独立的库存记录 */ private Boolean forceCreateNewStock; /** * 是否校验库存充足(仅出库事务有效) * * 为 true(默认)时,出库数量不能超过现有库存 * 为 false 时,允许负库存(如虚拟线边库场景) */ private Boolean checkFlag; }