diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemBatchConfigController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemBatchConfigController.java new file mode 100644 index 0000000..2e8586b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemBatchConfigController.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.item; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig.MesMdItemBatchConfigRespVO; +import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig.MesMdItemBatchConfigSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; +import cn.iocoder.yudao.module.mes.service.md.item.MesMdItemBatchConfigService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.annotation.Resource; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +@Tag(name = "管理后台 - MES 物料批次属性配置") +@RestController +@RequestMapping("/mes/md/item-batch-config") +@Validated +public class MesMdItemBatchConfigController { + + @Resource + private MesMdItemBatchConfigService itemBatchConfigService; + + @GetMapping("/get-by-item-id") + @Operation(summary = "根据物料编号获取批次属性配置") + @Parameter(name = "itemId", description = "物料编号", required = true, example = "69") + @PreAuthorize("@ss.hasPermission('mes:md-item:query')") + public CommonResult getItemBatchConfigByItemId( + @RequestParam("itemId") Long itemId) { + MesMdItemBatchConfigDO config = itemBatchConfigService.getItemBatchConfigByItemId(itemId); + return success(BeanUtils.toBean(config, MesMdItemBatchConfigRespVO.class)); + } + + @PostMapping("/save") + @Operation(summary = "保存批次属性配置(新增或更新)") + @PreAuthorize("@ss.hasPermission('mes:md-item:update')") + public CommonResult saveItemBatchConfig(@Valid @RequestBody MesMdItemBatchConfigSaveReqVO saveReqVO) { + return success(itemBatchConfigService.saveItemBatchConfig(saveReqVO)); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java index 2cbf2f8..3f5312b 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/MesMdItemTypeController.java @@ -78,7 +78,8 @@ public class MesMdItemTypeController { List list = itemTypeService.getItemTypeList( new MesMdItemTypeListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus())); return success(convertList(list, itemType -> new MesMdItemTypeRespVO() - .setId(itemType.getId()).setName(itemType.getName()).setParentId(itemType.getParentId()))); + .setId(itemType.getId()).setName(itemType.getName()).setParentId(itemType.getParentId()) + .setItemOrProduct(itemType.getItemOrProduct()))); } } diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/batchconfig/MesMdItemBatchConfigRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/batchconfig/MesMdItemBatchConfigRespVO.java new file mode 100644 index 0000000..a9ea46e --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/batchconfig/MesMdItemBatchConfigRespVO.java @@ -0,0 +1,63 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - MES 物料批次属性配置 Response VO") +@Data +public class MesMdItemBatchConfigRespVO { + + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") + private Long id; + + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "69") + private Long itemId; + + @Schema(description = "批次属性-生产日期", example = "true") + private Boolean produceDateFlag; + + @Schema(description = "批次属性-有效期", example = "true") + private Boolean expireDateFlag; + + @Schema(description = "批次属性-入库日期", example = "false") + private Boolean receiptDateFlag; + + @Schema(description = "批次属性-供应商", example = "false") + private Boolean vendorFlag; + + @Schema(description = "批次属性-客户", example = "false") + private Boolean clientFlag; + + @Schema(description = "批次属性-销售订单编号", example = "false") + private Boolean salesOrderCodeFlag; + + @Schema(description = "批次属性-采购订单编号", example = "false") + private Boolean purchaseOrderCodeFlag; + + @Schema(description = "批次属性-生产工单", example = "false") + private Boolean workorderFlag; + + @Schema(description = "批次属性-生产任务", example = "false") + private Boolean taskFlag; + + @Schema(description = "批次属性-工位", example = "false") + private Boolean workstationFlag; + + @Schema(description = "批次属性-工具", example = "false") + private Boolean toolFlag; + + @Schema(description = "批次属性-模具", example = "false") + private Boolean moldFlag; + + @Schema(description = "批次属性-生产批号", example = "true") + private Boolean lotNumberFlag; + + @Schema(description = "批次属性-质量状态", example = "false") + private Boolean qualityStatusFlag; + + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime createTime; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/batchconfig/MesMdItemBatchConfigSaveReqVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/batchconfig/MesMdItemBatchConfigSaveReqVO.java new file mode 100644 index 0000000..e5c620b --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/md/item/vo/batchconfig/MesMdItemBatchConfigSaveReqVO.java @@ -0,0 +1,60 @@ +package cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Schema(description = "管理后台 - MES 物料批次属性配置新增/修改 Request VO") +@Data +public class MesMdItemBatchConfigSaveReqVO { + + @Schema(description = "编号", example = "1024") + private Long id; + + @Schema(description = "物料编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "69") + @NotNull(message = "物料编号不能为空") + private Long itemId; + + @Schema(description = "批次属性-生产日期", example = "true") + private Boolean produceDateFlag; + + @Schema(description = "批次属性-有效期", example = "true") + private Boolean expireDateFlag; + + @Schema(description = "批次属性-入库日期", example = "false") + private Boolean receiptDateFlag; + + @Schema(description = "批次属性-供应商", example = "false") + private Boolean vendorFlag; + + @Schema(description = "批次属性-客户", example = "false") + private Boolean clientFlag; + + @Schema(description = "批次属性-销售订单编号", example = "false") + private Boolean salesOrderCodeFlag; + + @Schema(description = "批次属性-采购订单编号", example = "false") + private Boolean purchaseOrderCodeFlag; + + @Schema(description = "批次属性-生产工单", example = "false") + private Boolean workorderFlag; + + @Schema(description = "批次属性-生产任务", example = "false") + private Boolean taskFlag; + + @Schema(description = "批次属性-工位", example = "false") + private Boolean workstationFlag; + + @Schema(description = "批次属性-工具", example = "false") + private Boolean toolFlag; + + @Schema(description = "批次属性-模具", example = "false") + private Boolean moldFlag; + + @Schema(description = "批次属性-生产批号", example = "true") + private Boolean lotNumberFlag; + + @Schema(description = "批次属性-质量状态", example = "false") + private Boolean qualityStatusFlag; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemBatchConfigDO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemBatchConfigDO.java new file mode 100644 index 0000000..95d6074 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/dataobject/md/item/MesMdItemBatchConfigDO.java @@ -0,0 +1,92 @@ +package cn.iocoder.yudao.module.mes.dal.dataobject.md.item; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; + +/** + * MES 物料批次属性配置 DO + * + * @author 芋道源码 + */ +@TableName("mes_md_item_batch_config") +@KeySequence("mes_md_item_batch_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class MesMdItemBatchConfigDO extends BaseDO { + + /** + * 编号 + */ + @TableId + private Long id; + /** + * 物料编号 + * + * 关联 {@link MesMdItemDO#getId()} + */ + private Long itemId; + /** + * 批次属性-生产日期 + */ + private Boolean produceDateFlag; + /** + * 批次属性-有效期 + */ + private Boolean expireDateFlag; + /** + * 批次属性-入库日期 + */ + private Boolean receiptDateFlag; + /** + * 批次属性-供应商 + */ + private Boolean vendorFlag; + /** + * 批次属性-客户 + */ + private Boolean clientFlag; + /** + * 批次属性-销售订单编号 + */ + private Boolean salesOrderCodeFlag; + /** + * 批次属性-采购订单编号 + */ + private Boolean purchaseOrderCodeFlag; + /** + * 批次属性-生产工单 + */ + private Boolean workorderFlag; + /** + * 批次属性-生产任务 + */ + private Boolean taskFlag; + /** + * 批次属性-工位 + */ + private Boolean workstationFlag; + /** + * 批次属性-工具 + */ + private Boolean toolFlag; + /** + * 批次属性-模具 + */ + private Boolean moldFlag; + /** + * 批次属性-生产批号 + */ + private Boolean lotNumberFlag; + /** + * 批次属性-质量状态 + */ + private Boolean qualityStatusFlag; + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemBatchConfigMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemBatchConfigMapper.java new file mode 100644 index 0000000..e6ad43c --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/md/item/MesMdItemBatchConfigMapper.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.mes.dal.mysql.md.item; + +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MesMdItemBatchConfigMapper extends BaseMapperX { + + default MesMdItemBatchConfigDO selectByItemId(Long itemId) { + return selectOne(MesMdItemBatchConfigDO::getItemId, itemId); + } + + default int deleteByItemId(Long itemId) { + return delete(MesMdItemBatchConfigDO::getItemId, itemId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java index 4a9fa60..44bf369 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java @@ -30,6 +30,10 @@ public interface ErrorCodeConstants { ErrorCode MD_ITEM_NAME_DUPLICATE = new ErrorCode(1_040_102_002, "物料名称已存在"); ErrorCode MD_ITEM_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_040_102_003, "导入物料数据不能为空"); + // ========== MES 基础数据-物料批次属性配置(1-040-102-100) ========== + ErrorCode MD_ITEM_BATCH_CONFIG_NOT_EXISTS = new ErrorCode(1_040_102_100, "物料批次属性配置不存在"); + ErrorCode MD_ITEM_BATCH_CONFIG_AT_LEAST_ONE_FLAG = new ErrorCode(1_040_102_101, "批次管理已启用,至少需要配置一个批次属性"); + // ========== MES 基础数据-客户(1-040-103-000) ========== ErrorCode MD_CLIENT_NOT_EXISTS = new ErrorCode(1_040_103_000, "客户不存在"); ErrorCode MD_CLIENT_CODE_DUPLICATE = new ErrorCode(1_040_103_001, "客户编码已存在"); @@ -46,9 +50,23 @@ public interface ErrorCodeConstants { // ========== MES 基础数据-车间(1-040-105-000) ========== ErrorCode MD_WORKSHOP_NOT_EXISTS = new ErrorCode(1_040_105_000, "车间不存在"); + ErrorCode MD_WORKSHOP_CODE_DUPLICATE = new ErrorCode(1_040_105_001, "车间编码已存在"); + ErrorCode MD_WORKSHOP_NAME_DUPLICATE = new ErrorCode(1_040_105_002, "车间名称已存在"); + ErrorCode MD_WORKSHOP_HAS_WORKSTATION = new ErrorCode(1_040_105_003, "车间下存在工位,无法删除"); // ========== MES 基础数据-工位(1-040-106-000) ========== ErrorCode MD_WORKSTATION_NOT_EXISTS = new ErrorCode(1_040_106_000, "工位不存在"); + ErrorCode MD_WORKSTATION_CODE_DUPLICATE = new ErrorCode(1_040_106_001, "工位编码已存在"); + ErrorCode MD_WORKSTATION_NAME_DUPLICATE = new ErrorCode(1_040_106_002, "工位名称已存在"); + // ========== MES 基础数据-工位设备(1-040-106-100) ========== + ErrorCode MD_WORKSTATION_MACHINE_NOT_EXISTS = new ErrorCode(1_040_106_100, "工位设备记录不存在"); + ErrorCode MD_WORKSTATION_MACHINE_EXISTS = new ErrorCode(1_040_106_101, "该设备已分配到其他工位"); + // ========== MES 基础数据-工位工具(1-040-106-200) ========== + ErrorCode MD_WORKSTATION_TOOL_NOT_EXISTS = new ErrorCode(1_040_106_200, "工位工具记录不存在"); + ErrorCode MD_WORKSTATION_TOOL_TYPE_EXISTS = new ErrorCode(1_040_106_201, "该工具类型已在此工位中存在"); + // ========== MES 基础数据-工位人员(1-040-106-300) ========== + ErrorCode MD_WORKSTATION_WORKER_NOT_EXISTS = new ErrorCode(1_040_106_300, "工位人员记录不存在"); + ErrorCode MD_WORKSTATION_WORKER_POST_EXISTS = new ErrorCode(1_040_106_301, "该岗位已在此工位中存在"); // ========== MES 基础数据-产品BOM(1-040-107-000) ========== ErrorCode MD_PRODUCT_BOM_NOT_EXISTS = new ErrorCode(1_040_107_000, "产品BOM不存在"); diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemBatchConfigService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemBatchConfigService.java new file mode 100644 index 0000000..bf64742 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemBatchConfigService.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.module.mes.service.md.item; + +import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig.MesMdItemBatchConfigSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; +import jakarta.validation.Valid; + +/** + * MES 物料批次属性配置 Service 接口 + * + * @author 芋道源码 + */ +public interface MesMdItemBatchConfigService { + + /** + * 根据物料编号获取批次属性配置 + * + * @param itemId 物料编号 + * @return 批次属性配置,不存在则返回 null + */ + MesMdItemBatchConfigDO getItemBatchConfigByItemId(Long itemId); + + /** + * 保存批次属性配置(新增或更新) + * + * @param saveReqVO 保存信息 + * @return 配置编号 + */ + Long saveItemBatchConfig(@Valid MesMdItemBatchConfigSaveReqVO saveReqVO); + + /** + * 根据物料编号删除批次属性配置 + * + * @param itemId 物料编号 + */ + void deleteItemBatchConfigByItemId(Long itemId); + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemBatchConfigServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemBatchConfigServiceImpl.java new file mode 100644 index 0000000..e01d162 --- /dev/null +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemBatchConfigServiceImpl.java @@ -0,0 +1,64 @@ +package cn.iocoder.yudao.module.mes.service.md.item; + +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.batchconfig.MesMdItemBatchConfigSaveReqVO; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; +import cn.iocoder.yudao.module.mes.dal.mysql.md.item.MesMdItemBatchConfigMapper; +import jakarta.annotation.Resource; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.MD_ITEM_NOT_EXISTS; + +/** + * MES 物料批次属性配置 Service 实现类 + * + * @author 芋道源码 + */ +@Service +@Validated +public class MesMdItemBatchConfigServiceImpl implements MesMdItemBatchConfigService { + + @Resource + private MesMdItemBatchConfigMapper itemBatchConfigMapper; + + @Resource + @Lazy // 避免循环依赖(MesMdItemServiceImpl 也会注入本 Service) + private MesMdItemService itemService; + + @Override + public MesMdItemBatchConfigDO getItemBatchConfigByItemId(Long itemId) { + return itemBatchConfigMapper.selectByItemId(itemId); + } + + @Override + public Long saveItemBatchConfig(MesMdItemBatchConfigSaveReqVO saveReqVO) { + // 1. 校验物料存在 + if (itemService.getItem(saveReqVO.getItemId()) == null) { + throw exception(MD_ITEM_NOT_EXISTS); + } + + // 2. 查询已有配置,决定新增还是更新 + MesMdItemBatchConfigDO existing = itemBatchConfigMapper.selectByItemId(saveReqVO.getItemId()); + if (existing != null) { + // 更新 + MesMdItemBatchConfigDO updateObj = BeanUtils.toBean(saveReqVO, MesMdItemBatchConfigDO.class); + updateObj.setId(existing.getId()); + itemBatchConfigMapper.updateById(updateObj); + return existing.getId(); + } + + // 新增 + MesMdItemBatchConfigDO insertObj = BeanUtils.toBean(saveReqVO, MesMdItemBatchConfigDO.class); + itemBatchConfigMapper.insert(insertObj); + return insertObj.getId(); + } + + @Override + public void deleteItemBatchConfigByItemId(Long itemId) { + itemBatchConfigMapper.deleteByItemId(itemId); + } + +} diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java index 86a794a..7de8665 100644 --- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java +++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/md/item/MesMdItemServiceImpl.java @@ -9,6 +9,8 @@ import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportEx import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemImportRespVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.md.item.vo.MesMdItemSaveReqVO; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemBatchConfigDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.item.MesMdItemTypeDO; import cn.iocoder.yudao.module.mes.dal.dataobject.md.unitmeasure.MesMdUnitMeasureDO; @@ -45,6 +47,9 @@ public class MesMdItemServiceImpl implements MesMdItemService { @Resource private MesMdUnitMeasureService unitMeasureService; + @Resource + private MesMdItemBatchConfigService itemBatchConfigService; + @Override public Long createItem(MesMdItemSaveReqVO createReqVO) { // 校验物料编码的唯一性 @@ -76,6 +81,9 @@ public class MesMdItemServiceImpl implements MesMdItemService { // 校验计量单位存在 validateUnitMeasureExists(updateReqVO.getUnitMeasureId()); + // 如果启用了批次管理且状态为开启,校验批次属性配置 + validateBatchConfigIfNeeded(updateReqVO); + // 更新 MesMdItemDO updateObj = BeanUtils.toBean(updateReqVO, MesMdItemDO.class); clearStockIfNotSafe(updateObj); // 如果未启用安全库存,清零库存上下限 @@ -86,6 +94,8 @@ public class MesMdItemServiceImpl implements MesMdItemService { public void deleteItem(Long id) { // 校验存在 validateItemExists(id); + // 级联删除批次属性配置 + itemBatchConfigService.deleteItemBatchConfigByItemId(id); // 删除 itemMapper.deleteById(id); } @@ -144,6 +154,39 @@ public class MesMdItemServiceImpl implements MesMdItemService { item.setMinStock(BigDecimal.ZERO).setMaxStock(BigDecimal.ZERO); } + /** + * 如果启用了批次管理且状态为开启,校验批次属性配置是否存在且至少一个属性为 true + */ + private void validateBatchConfigIfNeeded(MesMdItemSaveReqVO reqVO) { + if (!Boolean.TRUE.equals(reqVO.getBatchFlag())) { + return; + } + if (!CommonStatusEnum.ENABLE.getStatus().equals(reqVO.getStatus())) { + return; + } + MesMdItemBatchConfigDO config = itemBatchConfigService.getItemBatchConfigByItemId(reqVO.getId()); + if (config == null) { + throw exception(MD_ITEM_BATCH_CONFIG_NOT_EXISTS); + } + boolean hasAnyFlag = Boolean.TRUE.equals(config.getProduceDateFlag()) + || Boolean.TRUE.equals(config.getExpireDateFlag()) + || Boolean.TRUE.equals(config.getReceiptDateFlag()) + || Boolean.TRUE.equals(config.getVendorFlag()) + || Boolean.TRUE.equals(config.getClientFlag()) + || Boolean.TRUE.equals(config.getSalesOrderCodeFlag()) + || Boolean.TRUE.equals(config.getPurchaseOrderCodeFlag()) + || Boolean.TRUE.equals(config.getWorkorderFlag()) + || Boolean.TRUE.equals(config.getTaskFlag()) + || Boolean.TRUE.equals(config.getWorkstationFlag()) + || Boolean.TRUE.equals(config.getToolFlag()) + || Boolean.TRUE.equals(config.getMoldFlag()) + || Boolean.TRUE.equals(config.getLotNumberFlag()) + || Boolean.TRUE.equals(config.getQualityStatusFlag()); + if (!hasAnyFlag) { + throw exception(MD_ITEM_BATCH_CONFIG_AT_LEAST_ONE_FLAG); + } + } + @Override public MesMdItemDO getItem(Long id) { return itemMapper.selectById(id);