Commit 8221ee3aae485bacd5e5248006f170ead27f64ab

Authored by YunaiV
1 parent b9ea7937

✨ feat(mes): 添加虚拟仓库和库区删除校验,优化物料混放规则更新

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&lt;MesWmWarehouseArea @@ -52,4 +58,22 @@ public interface MesWmWarehouseAreaMapper extends BaseMapperX&lt;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);