Commit 8221ee3aae485bacd5e5248006f170ead27f64ab
1 parent
b9ea7937
✨ feat(mes): 添加虚拟仓库和库区删除校验,优化物料混放规则更新
Showing
7 changed files
with
72 additions
and
5 deletions
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/warehouse/MesWmWarehouseLocationController.java
| @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.Mes | @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.Mes | ||
| 10 | import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; | 10 | import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; |
| 11 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; | 11 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; |
| 12 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; | 12 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; |
| 13 | +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; | ||
| 13 | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; | 14 | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; |
| 14 | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; | 15 | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| 15 | import io.swagger.v3.oas.annotations.Operation; | 16 | import io.swagger.v3.oas.annotations.Operation; |
| @@ -36,9 +37,10 @@ public class MesWmWarehouseLocationController { | @@ -36,9 +37,10 @@ public class MesWmWarehouseLocationController { | ||
| 36 | 37 | ||
| 37 | @Resource | 38 | @Resource |
| 38 | private MesWmWarehouseLocationService locationService; | 39 | private MesWmWarehouseLocationService locationService; |
| 39 | - | ||
| 40 | @Resource | 40 | @Resource |
| 41 | private MesWmWarehouseService warehouseService; | 41 | private MesWmWarehouseService warehouseService; |
| 42 | + @Resource | ||
| 43 | + private MesWmWarehouseAreaService areaService; | ||
| 42 | 44 | ||
| 43 | @PostMapping("/create") | 45 | @PostMapping("/create") |
| 44 | @Operation(summary = "创建库区") | 46 | @Operation(summary = "创建库区") |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/warehouse/MesWmWarehouseAreaMapper.java
| @@ -32,6 +32,12 @@ public interface MesWmWarehouseAreaMapper extends BaseMapperX<MesWmWarehouseArea | @@ -32,6 +32,12 @@ public interface MesWmWarehouseAreaMapper extends BaseMapperX<MesWmWarehouseArea | ||
| 32 | .eq(MesWmWarehouseAreaDO::getCode, code)); | 32 | .eq(MesWmWarehouseAreaDO::getCode, code)); |
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | + default MesWmWarehouseAreaDO selectByCode(Long locationId, String code) { | ||
| 36 | + return selectOne(new LambdaQueryWrapperX<MesWmWarehouseAreaDO>() | ||
| 37 | + .eq(MesWmWarehouseAreaDO::getLocationId, locationId) | ||
| 38 | + .eq(MesWmWarehouseAreaDO::getCode, code)); | ||
| 39 | + } | ||
| 40 | + | ||
| 35 | default MesWmWarehouseAreaDO selectByName(Long locationId, String name) { | 41 | default MesWmWarehouseAreaDO selectByName(Long locationId, String name) { |
| 36 | return selectOne(new LambdaQueryWrapperX<MesWmWarehouseAreaDO>() | 42 | return selectOne(new LambdaQueryWrapperX<MesWmWarehouseAreaDO>() |
| 37 | .eq(MesWmWarehouseAreaDO::getLocationId, locationId) | 43 | .eq(MesWmWarehouseAreaDO::getLocationId, locationId) |
| @@ -52,4 +58,22 @@ public interface MesWmWarehouseAreaMapper extends BaseMapperX<MesWmWarehouseArea | @@ -52,4 +58,22 @@ public interface MesWmWarehouseAreaMapper extends BaseMapperX<MesWmWarehouseArea | ||
| 52 | return selectCount(MesWmWarehouseAreaDO::getLocationId, locationId); | 58 | return selectCount(MesWmWarehouseAreaDO::getLocationId, locationId); |
| 53 | } | 59 | } |
| 54 | 60 | ||
| 61 | + /** | ||
| 62 | + * 批量更新指定库区下所有库位的物料混放规则 | ||
| 63 | + */ | ||
| 64 | + default void updateAllowItemMixingByLocationId(Long locationId, Boolean allowItemMixing) { | ||
| 65 | + update(new MesWmWarehouseAreaDO().setAllowItemMixing(allowItemMixing), | ||
| 66 | + new LambdaQueryWrapperX<MesWmWarehouseAreaDO>() | ||
| 67 | + .eq(MesWmWarehouseAreaDO::getLocationId, locationId)); | ||
| 68 | + } | ||
| 69 | + | ||
| 70 | + /** | ||
| 71 | + * 批量更新指定库区下所有库位的批次混放规则 | ||
| 72 | + */ | ||
| 73 | + default void updateAllowBatchMixingByLocationId(Long locationId, Boolean allowBatchMixing) { | ||
| 74 | + update(new MesWmWarehouseAreaDO().setAllowBatchMixing(allowBatchMixing), | ||
| 75 | + new LambdaQueryWrapperX<MesWmWarehouseAreaDO>() | ||
| 76 | + .eq(MesWmWarehouseAreaDO::getLocationId, locationId)); | ||
| 77 | + } | ||
| 78 | + | ||
| 55 | } | 79 | } |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/enums/ErrorCodeConstants.java
| @@ -335,6 +335,7 @@ public interface ErrorCodeConstants { | @@ -335,6 +335,7 @@ public interface ErrorCodeConstants { | ||
| 335 | ErrorCode WM_WAREHOUSE_HAS_LOCATION = new ErrorCode(1_040_700_003, "仓库下存在库区,无法删除"); | 335 | ErrorCode WM_WAREHOUSE_HAS_LOCATION = new ErrorCode(1_040_700_003, "仓库下存在库区,无法删除"); |
| 336 | ErrorCode WM_WAREHOUSE_HAS_WORKSTATION = new ErrorCode(1_040_700_004, "仓库已被工作站引用,无法删除"); | 336 | ErrorCode WM_WAREHOUSE_HAS_WORKSTATION = new ErrorCode(1_040_700_004, "仓库已被工作站引用,无法删除"); |
| 337 | ErrorCode WM_WAREHOUSE_HAS_MATERIAL_STOCK = new ErrorCode(1_040_700_005, "仓库下有库存记录,无法删除"); | 337 | ErrorCode WM_WAREHOUSE_HAS_MATERIAL_STOCK = new ErrorCode(1_040_700_005, "仓库下有库存记录,无法删除"); |
| 338 | + ErrorCode WM_WAREHOUSE_IS_VIRTUAL = new ErrorCode(1_040_700_006, "虚拟仓库不允许删除"); | ||
| 338 | 339 | ||
| 339 | // ========== MES 仓库管理-库区(1-040-701-000) ========== | 340 | // ========== MES 仓库管理-库区(1-040-701-000) ========== |
| 340 | ErrorCode WM_WAREHOUSE_LOCATION_NOT_EXISTS = new ErrorCode(1_040_701_000, "库区不存在"); | 341 | ErrorCode WM_WAREHOUSE_LOCATION_NOT_EXISTS = new ErrorCode(1_040_701_000, "库区不存在"); |
| @@ -345,6 +346,7 @@ public interface ErrorCodeConstants { | @@ -345,6 +346,7 @@ public interface ErrorCodeConstants { | ||
| 345 | ErrorCode WM_WAREHOUSE_REQUIRED = new ErrorCode(1_040_701_005, "选择库区时,仓库不能为空"); | 346 | ErrorCode WM_WAREHOUSE_REQUIRED = new ErrorCode(1_040_701_005, "选择库区时,仓库不能为空"); |
| 346 | ErrorCode WM_WAREHOUSE_LOCATION_RELATION_INVALID = new ErrorCode(1_040_701_006, "库区不属于所选仓库"); | 347 | ErrorCode WM_WAREHOUSE_LOCATION_RELATION_INVALID = new ErrorCode(1_040_701_006, "库区不属于所选仓库"); |
| 347 | ErrorCode WM_WAREHOUSE_LOCATION_HAS_MATERIAL_STOCK = new ErrorCode(1_040_701_007, "库区下有库存记录,无法删除"); | 348 | ErrorCode WM_WAREHOUSE_LOCATION_HAS_MATERIAL_STOCK = new ErrorCode(1_040_701_007, "库区下有库存记录,无法删除"); |
| 349 | + ErrorCode WM_WAREHOUSE_LOCATION_IS_VIRTUAL = new ErrorCode(1_040_701_008, "虚拟库区不允许删除"); | ||
| 348 | 350 | ||
| 349 | // ========== MES 仓库管理-库位(1-040-702-000) ========== | 351 | // ========== MES 仓库管理-库位(1-040-702-000) ========== |
| 350 | ErrorCode WM_WAREHOUSE_AREA_NOT_EXISTS = new ErrorCode(1_040_702_000, "库位不存在"); | 352 | ErrorCode WM_WAREHOUSE_AREA_NOT_EXISTS = new ErrorCode(1_040_702_000, "库位不存在"); |
| @@ -355,6 +357,7 @@ public interface ErrorCodeConstants { | @@ -355,6 +357,7 @@ public interface ErrorCodeConstants { | ||
| 355 | ErrorCode WM_WAREHOUSE_AREA_RELATION_INVALID = new ErrorCode(1_040_702_005, "库位不属于所选库区"); | 357 | ErrorCode WM_WAREHOUSE_AREA_RELATION_INVALID = new ErrorCode(1_040_702_005, "库位不属于所选库区"); |
| 356 | ErrorCode WM_WAREHOUSE_AREA_HAS_MATERIAL_STOCK = new ErrorCode(1_040_702_006, "库位下有库存记录,无法删除"); | 358 | ErrorCode WM_WAREHOUSE_AREA_HAS_MATERIAL_STOCK = new ErrorCode(1_040_702_006, "库位下有库存记录,无法删除"); |
| 357 | ErrorCode WM_WAREHOUSE_AREA_WAREHOUSE_MISMATCH = new ErrorCode(1_040_702_007, "库位不属于所选仓库"); | 359 | ErrorCode WM_WAREHOUSE_AREA_WAREHOUSE_MISMATCH = new ErrorCode(1_040_702_007, "库位不属于所选仓库"); |
| 360 | + ErrorCode WM_WAREHOUSE_AREA_IS_VIRTUAL = new ErrorCode(1_040_702_008, "虚拟库位不允许删除"); | ||
| 358 | 361 | ||
| 359 | // ========== MES 仓库管理-库存(1-040-703-000) ========== | 362 | // ========== MES 仓库管理-库存(1-040-703-000) ========== |
| 360 | ErrorCode WM_MATERIAL_STOCK_NOT_EXISTS = new ErrorCode(1_040_703_000, "库存记录不存在"); | 363 | ErrorCode WM_MATERIAL_STOCK_NOT_EXISTS = new ErrorCode(1_040_703_000, "库存记录不存在"); |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaService.java
| @@ -101,6 +101,22 @@ public interface MesWmWarehouseAreaService { | @@ -101,6 +101,22 @@ public interface MesWmWarehouseAreaService { | ||
| 101 | void validateWarehouseAreaExists(Long warehouseId, Long locationId, Long areaId); | 101 | void validateWarehouseAreaExists(Long warehouseId, Long locationId, Long areaId); |
| 102 | 102 | ||
| 103 | /** | 103 | /** |
| 104 | + * 批量设置指定库区下所有库位的物料混放规则 | ||
| 105 | + * | ||
| 106 | + * @param locationId 库区编号 | ||
| 107 | + * @param allowItemMixing 是否允许物料混放 | ||
| 108 | + */ | ||
| 109 | + void updateAllowItemMixingByLocationId(Long locationId, Boolean allowItemMixing); | ||
| 110 | + | ||
| 111 | + /** | ||
| 112 | + * 批量设置指定库区下所有库位的批次混放规则 | ||
| 113 | + * | ||
| 114 | + * @param locationId 库区编号 | ||
| 115 | + * @param allowBatchMixing 是否允许批次混放 | ||
| 116 | + */ | ||
| 117 | + void updateAllowBatchMixingByLocationId(Long locationId, Boolean allowBatchMixing); | ||
| 118 | + | ||
| 119 | + /** | ||
| 104 | * 按编码获得库位(如果是虚拟线边库位编码且不存在,会自动插入) | 120 | * 按编码获得库位(如果是虚拟线边库位编码且不存在,会自动插入) |
| 105 | * | 121 | * |
| 106 | * @param code 编码 | 122 | * @param code 编码 |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseAreaServiceImpl.java
| @@ -87,7 +87,11 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService | @@ -87,7 +87,11 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService | ||
| 87 | @Override | 87 | @Override |
| 88 | public void deleteWarehouseArea(Long id) { | 88 | public void deleteWarehouseArea(Long id) { |
| 89 | // 校验存在 | 89 | // 校验存在 |
| 90 | - validateWarehouseAreaExists(id); | 90 | + MesWmWarehouseAreaDO area = validateWarehouseAreaExists(id); |
| 91 | + // 校验虚拟库位不允许删除 | ||
| 92 | + if (MesWmWarehouseAreaDO.WIP_VIRTUAL_AREA.equals(area.getCode())) { | ||
| 93 | + throw exception(WM_WAREHOUSE_AREA_IS_VIRTUAL); | ||
| 94 | + } | ||
| 91 | // 校验是否被工作站引用 | 95 | // 校验是否被工作站引用 |
| 92 | if (workstationService.getWorkstationCountByAreaId(id) > 0) { | 96 | if (workstationService.getWorkstationCountByAreaId(id) > 0) { |
| 93 | throw exception(WM_WAREHOUSE_AREA_HAS_WORKSTATION); | 97 | throw exception(WM_WAREHOUSE_AREA_HAS_WORKSTATION); |
| @@ -111,7 +115,7 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService | @@ -111,7 +115,7 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService | ||
| 111 | } | 115 | } |
| 112 | 116 | ||
| 113 | private void validateWarehouseAreaCodeUnique(Long id, Long locationId, String code) { | 117 | private void validateWarehouseAreaCodeUnique(Long id, Long locationId, String code) { |
| 114 | - MesWmWarehouseAreaDO area = areaMapper.selectByCode(code); | 118 | + MesWmWarehouseAreaDO area = areaMapper.selectByCode(locationId, code); |
| 115 | if (area == null) { | 119 | if (area == null) { |
| 116 | return; | 120 | return; |
| 117 | } | 121 | } |
| @@ -183,6 +187,16 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService | @@ -183,6 +187,16 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService | ||
| 183 | } | 187 | } |
| 184 | 188 | ||
| 185 | @Override | 189 | @Override |
| 190 | + public void updateAllowItemMixingByLocationId(Long locationId, Boolean allowItemMixing) { | ||
| 191 | + areaMapper.updateAllowItemMixingByLocationId(locationId, allowItemMixing); | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + @Override | ||
| 195 | + public void updateAllowBatchMixingByLocationId(Long locationId, Boolean allowBatchMixing) { | ||
| 196 | + areaMapper.updateAllowBatchMixingByLocationId(locationId, allowBatchMixing); | ||
| 197 | + } | ||
| 198 | + | ||
| 199 | + @Override | ||
| 186 | public MesWmWarehouseAreaDO getWarehouseAreaByCode(String code) { | 200 | public MesWmWarehouseAreaDO getWarehouseAreaByCode(String code) { |
| 187 | // 1. 查询库位,存在则直接返回 | 201 | // 1. 查询库位,存在则直接返回 |
| 188 | MesWmWarehouseAreaDO area = areaMapper.selectByCode(code); | 202 | MesWmWarehouseAreaDO area = areaMapper.selectByCode(code); |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseLocationServiceImpl.java
| @@ -86,7 +86,11 @@ public class MesWmWarehouseLocationServiceImpl implements MesWmWarehouseLocation | @@ -86,7 +86,11 @@ public class MesWmWarehouseLocationServiceImpl implements MesWmWarehouseLocation | ||
| 86 | @Override | 86 | @Override |
| 87 | public void deleteWarehouseLocation(Long id) { | 87 | public void deleteWarehouseLocation(Long id) { |
| 88 | // 校验存在 | 88 | // 校验存在 |
| 89 | - validateWarehouseLocationExists(id); | 89 | + MesWmWarehouseLocationDO location = validateWarehouseLocationExists(id); |
| 90 | + // 校验虚拟库区不允许删除 | ||
| 91 | + if (MesWmWarehouseLocationDO.WIP_VIRTUAL_LOCATION.equals(location.getCode())) { | ||
| 92 | + throw exception(WM_WAREHOUSE_LOCATION_IS_VIRTUAL); | ||
| 93 | + } | ||
| 90 | // 校验是否有库位 | 94 | // 校验是否有库位 |
| 91 | if (areaService.getWarehouseAreaCountByLocationId(id) > 0) { | 95 | if (areaService.getWarehouseAreaCountByLocationId(id) > 0) { |
| 92 | throw exception(WM_WAREHOUSE_LOCATION_HAS_AREA); | 96 | throw exception(WM_WAREHOUSE_LOCATION_HAS_AREA); |
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/warehouse/MesWmWarehouseServiceImpl.java
| @@ -78,7 +78,11 @@ public class MesWmWarehouseServiceImpl implements MesWmWarehouseService { | @@ -78,7 +78,11 @@ public class MesWmWarehouseServiceImpl implements MesWmWarehouseService { | ||
| 78 | @Override | 78 | @Override |
| 79 | public void deleteWarehouse(Long id) { | 79 | public void deleteWarehouse(Long id) { |
| 80 | // 校验存在 | 80 | // 校验存在 |
| 81 | - validateWarehouseExists(id); | 81 | + MesWmWarehouseDO warehouse = validateWarehouseExists(id); |
| 82 | + // 校验虚拟仓库不允许删除 | ||
| 83 | + if (MesWmWarehouseDO.WIP_VIRTUAL_WAREHOUSE.equals(warehouse.getCode())) { | ||
| 84 | + throw exception(WM_WAREHOUSE_IS_VIRTUAL); | ||
| 85 | + } | ||
| 82 | // 校验是否有库区 | 86 | // 校验是否有库区 |
| 83 | if (locationService.getWarehouseLocationCountByWarehouseId(id) > 0) { | 87 | if (locationService.getWarehouseLocationCountByWarehouseId(id) > 0) { |
| 84 | throw exception(WM_WAREHOUSE_HAS_LOCATION); | 88 | throw exception(WM_WAREHOUSE_HAS_LOCATION); |