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 | 10 | import cn.iocoder.yudao.module.mes.controller.admin.wm.warehouse.vo.location.MesWmWarehouseLocationSaveReqVO; |
| 11 | 11 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseLocationDO; |
| 12 | 12 | import cn.iocoder.yudao.module.mes.dal.dataobject.wm.warehouse.MesWmWarehouseDO; |
| 13 | +import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseAreaService; | |
| 13 | 14 | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseLocationService; |
| 14 | 15 | import cn.iocoder.yudao.module.mes.service.wm.warehouse.MesWmWarehouseService; |
| 15 | 16 | import io.swagger.v3.oas.annotations.Operation; |
| ... | ... | @@ -36,9 +37,10 @@ public class MesWmWarehouseLocationController { |
| 36 | 37 | |
| 37 | 38 | @Resource |
| 38 | 39 | private MesWmWarehouseLocationService locationService; |
| 39 | - | |
| 40 | 40 | @Resource |
| 41 | 41 | private MesWmWarehouseService warehouseService; |
| 42 | + @Resource | |
| 43 | + private MesWmWarehouseAreaService areaService; | |
| 42 | 44 | |
| 43 | 45 | @PostMapping("/create") |
| 44 | 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 | 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 | 41 | default MesWmWarehouseAreaDO selectByName(Long locationId, String name) { |
| 36 | 42 | return selectOne(new LambdaQueryWrapperX<MesWmWarehouseAreaDO>() |
| 37 | 43 | .eq(MesWmWarehouseAreaDO::getLocationId, locationId) |
| ... | ... | @@ -52,4 +58,22 @@ public interface MesWmWarehouseAreaMapper extends BaseMapperX<MesWmWarehouseArea |
| 52 | 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 | 335 | ErrorCode WM_WAREHOUSE_HAS_LOCATION = new ErrorCode(1_040_700_003, "仓库下存在库区,无法删除"); |
| 336 | 336 | ErrorCode WM_WAREHOUSE_HAS_WORKSTATION = new ErrorCode(1_040_700_004, "仓库已被工作站引用,无法删除"); |
| 337 | 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 | 340 | // ========== MES 仓库管理-库区(1-040-701-000) ========== |
| 340 | 341 | ErrorCode WM_WAREHOUSE_LOCATION_NOT_EXISTS = new ErrorCode(1_040_701_000, "库区不存在"); |
| ... | ... | @@ -345,6 +346,7 @@ public interface ErrorCodeConstants { |
| 345 | 346 | ErrorCode WM_WAREHOUSE_REQUIRED = new ErrorCode(1_040_701_005, "选择库区时,仓库不能为空"); |
| 346 | 347 | ErrorCode WM_WAREHOUSE_LOCATION_RELATION_INVALID = new ErrorCode(1_040_701_006, "库区不属于所选仓库"); |
| 347 | 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 | 351 | // ========== MES 仓库管理-库位(1-040-702-000) ========== |
| 350 | 352 | ErrorCode WM_WAREHOUSE_AREA_NOT_EXISTS = new ErrorCode(1_040_702_000, "库位不存在"); |
| ... | ... | @@ -355,6 +357,7 @@ public interface ErrorCodeConstants { |
| 355 | 357 | ErrorCode WM_WAREHOUSE_AREA_RELATION_INVALID = new ErrorCode(1_040_702_005, "库位不属于所选库区"); |
| 356 | 358 | ErrorCode WM_WAREHOUSE_AREA_HAS_MATERIAL_STOCK = new ErrorCode(1_040_702_006, "库位下有库存记录,无法删除"); |
| 357 | 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 | 362 | // ========== MES 仓库管理-库存(1-040-703-000) ========== |
| 360 | 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 | 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 | 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 | 87 | @Override |
| 88 | 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 | 96 | if (workstationService.getWorkstationCountByAreaId(id) > 0) { |
| 93 | 97 | throw exception(WM_WAREHOUSE_AREA_HAS_WORKSTATION); |
| ... | ... | @@ -111,7 +115,7 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService |
| 111 | 115 | } |
| 112 | 116 | |
| 113 | 117 | private void validateWarehouseAreaCodeUnique(Long id, Long locationId, String code) { |
| 114 | - MesWmWarehouseAreaDO area = areaMapper.selectByCode(code); | |
| 118 | + MesWmWarehouseAreaDO area = areaMapper.selectByCode(locationId, code); | |
| 115 | 119 | if (area == null) { |
| 116 | 120 | return; |
| 117 | 121 | } |
| ... | ... | @@ -183,6 +187,16 @@ public class MesWmWarehouseAreaServiceImpl implements MesWmWarehouseAreaService |
| 183 | 187 | } |
| 184 | 188 | |
| 185 | 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 | 200 | public MesWmWarehouseAreaDO getWarehouseAreaByCode(String code) { |
| 187 | 201 | // 1. 查询库位,存在则直接返回 |
| 188 | 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 | 86 | @Override |
| 87 | 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 | 95 | if (areaService.getWarehouseAreaCountByLocationId(id) > 0) { |
| 92 | 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 | 78 | @Override |
| 79 | 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 | 87 | if (locationService.getWarehouseLocationCountByWarehouseId(id) > 0) { |
| 84 | 88 | throw exception(WM_WAREHOUSE_HAS_LOCATION); | ... | ... |