diff --git a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java index 4ae100ad6..7007b79f1 100644 --- a/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java +++ b/yudao-module-erp/yudao-module-erp-api/src/main/java/cn/iocoder/yudao/module/erp/enums/ErrorCodeConstants.java @@ -104,6 +104,10 @@ public interface ErrorCodeConstants { ErrorCode PALLET_NOT_EXISTS = new ErrorCode(1_030_400_008, "托盘不存在"); ErrorCode PALLET_CODE_EXISTS = new ErrorCode(1_030_400_009, "托盘编码已存在"); ErrorCode PALLET_CODE_EMPTY = new ErrorCode(1_030_400_010, "托盘编码不能为空"); + ErrorCode WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK = new ErrorCode(1_030_400_011, "仓库库区删除失败,该库区存在库存"); + ErrorCode WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK_IN_ITEM = new ErrorCode(1_030_400_012, "仓库库区删除失败,该库区已被入库单明细引用"); + ErrorCode WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK_OUT_ITEM = new ErrorCode(1_030_400_013, "仓库库区删除失败,该库区已被出库单明细引用"); + ErrorCode WAREHOUSE_AREA_DELETE_FAIL_EXISTS_OCCUPIED_PALLET = new ErrorCode(1_030_400_014, "仓库库区删除失败,该库区存在占用托盘"); // ========== ERP 其它入库单 1-030-401-000 ========== ErrorCode STOCK_IN_NOT_EXISTS = new ErrorCode(1_030_401_000, "其它入库单不存在"); diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java index 7f6719120..b007479f2 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/stock/ErpStockInServiceImpl.java @@ -463,6 +463,9 @@ public class ErpStockInServiceImpl implements ErpStockInService { } } else { ErpProductRespVO productDO = productService.getProduct(stockInItem.getProductId()); + if (productDO == null ){ + throw exception(PRODUCT_NOT_EXISTS); + } Integer recordBizType = resolveRecordBizType(stockIn.getInType(), approve, bizType); stockRecordService.createStockRecord(new ErpStockRecordCreateReqBO( stockInItem.getProductId(), productDO.getCategoryId(), productDO.getCategoryType(), stockInItem.getWarehouseId(), diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java index ed31a7305..4f56cc605 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/service/warehousearea/WarehouseAreaServiceImpl.java @@ -6,11 +6,21 @@ import cn.iocoder.yudao.module.common.enums.CodeTypeEnum; import cn.iocoder.yudao.module.common.enums.QrcodeBizTypeEnum; import cn.iocoder.yudao.module.common.service.qrcordrecord.QrcodeRecordService; import cn.iocoder.yudao.module.erp.controller.admin.autocode.util.AutoCodeUtil; +import cn.iocoder.yudao.module.erp.controller.admin.pallet.enums.ErpPalletStatusEnum; import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.WarehouseAreaPageReqVO; import cn.iocoder.yudao.module.erp.controller.admin.warehousearea.vo.WarehouseAreaSaveReqVO; +import cn.iocoder.yudao.module.erp.dal.dataobject.pallet.ErpPalletDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockInItemDO; +import cn.iocoder.yudao.module.erp.dal.dataobject.stock.ErpStockOutItemDO; import cn.iocoder.yudao.module.erp.dal.dataobject.warehousearea.WarehouseAreaDO; +import cn.iocoder.yudao.module.erp.dal.mysql.pallet.ErpPalletMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockInItemMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockMapper; +import cn.iocoder.yudao.module.erp.dal.mysql.stock.ErpStockOutItemMapper; import cn.iocoder.yudao.module.erp.dal.mysql.warehousearea.WarehouseAreaMapper; import cn.iocoder.yudao.module.erp.dal.mysql.warehouselocation.WarehouseLocationMapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -19,6 +29,7 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.io.UnsupportedEncodingException; +import java.math.BigDecimal; import java.util.Collection; import java.util.ArrayList; import java.util.List; @@ -26,6 +37,10 @@ import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_CODE_EXISTS; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_DELETE_FAIL_EXISTS_LOCATION; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_DELETE_FAIL_EXISTS_OCCUPIED_PALLET; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK_IN_ITEM; +import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK_OUT_ITEM; import static cn.iocoder.yudao.module.erp.enums.ErrorCodeConstants.WAREHOUSE_AREA_NOT_EXISTS; @Service @@ -41,6 +56,18 @@ public class WarehouseAreaServiceImpl implements WarehouseAreaService { @Resource private WarehouseLocationMapper warehouseLocationMapper; + @Resource + private ErpStockMapper stockMapper; + + @Resource + private ErpStockInItemMapper stockInItemMapper; + + @Resource + private ErpStockOutItemMapper stockOutItemMapper; + + @Resource + private ErpPalletMapper palletMapper; + @Resource private AutoCodeUtil autoCodeUtil; @@ -80,10 +107,34 @@ public class WarehouseAreaServiceImpl implements WarehouseAreaService { @Override public void deleteWarehouseArea(Long id) { validateWarehouseAreaExists(id); + validateWarehouseAreaDeletable(id); + warehouseAreaMapper.deleteById(id); + } + + private void validateWarehouseAreaDeletable(Long id) { if (!warehouseLocationMapper.selectListByAreaId(id).isEmpty()) { throw exception(WAREHOUSE_AREA_DELETE_FAIL_EXISTS_LOCATION); } - warehouseAreaMapper.deleteById(id); + if (stockMapper.selectCount(Wrappers.lambdaQuery() + .eq(ErpStockDO::getAreaId, id) + .gt(ErpStockDO::getCount, BigDecimal.ZERO)) > 0) { + throw exception(WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK); + } + if (stockInItemMapper.selectCount(Wrappers.lambdaQuery() + .eq(ErpStockInItemDO::getAreaId, id)) > 0) { + throw exception(WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK_IN_ITEM); + } + if (stockOutItemMapper.selectCount(Wrappers.lambdaQuery() + .eq(ErpStockOutItemDO::getAreaId, id)) > 0) { + throw exception(WAREHOUSE_AREA_DELETE_FAIL_EXISTS_STOCK_OUT_ITEM); + } + if (palletMapper.selectCount(Wrappers.lambdaQuery() + .eq(ErpPalletDO::getAreaId, id) + .and(wrapper -> wrapper.eq(ErpPalletDO::getStatus, ErpPalletStatusEnum.OCCUPIED.getStatus()) + .or() + .gt(ErpPalletDO::getProductCount, BigDecimal.ZERO))) > 0) { + throw exception(WAREHOUSE_AREA_DELETE_FAIL_EXISTS_OCCUPIED_PALLET); + } } private void validateWarehouseAreaExists(Long id) {