From 53393c1f82b75ab722a11925619a5da0bfc4a6d7 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 5 Dec 2025 09:31:08 +0800 Subject: [PATCH] =?UTF-8?q?feat(warehouse):=20=E6=96=B0=E5=A2=9E=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E7=94=9F=E6=88=90=E5=BA=93=E4=BD=8D=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增WmsActualWarehouseBatchGenerateBo类作为参数封装 - 在IWmsActualWarehouseService接口中定义batchGenerateLocations方法 - 在WmsActualWarehouseServiceImpl实现批量生成库位的逻辑 - 预生成候选编码,并过滤已存在的编码避免重复 - 支持根据行、列、层和前缀参数自动生成库位编码 - 在WmsActualWarehouseController中新增接口generateLocations - 接口添加日志记录和防重提交校验 --- .../WmsActualWarehouseController.java | 12 ++++ .../bo/WmsActualWarehouseBatchGenerateBo.java | 37 +++++++++++ .../service/IWmsActualWarehouseService.java | 7 +++ .../impl/WmsActualWarehouseServiceImpl.java | 61 +++++++++++++++++++ 4 files changed, 117 insertions(+) create mode 100644 klp-wms/src/main/java/com/klp/domain/bo/WmsActualWarehouseBatchGenerateBo.java diff --git a/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java b/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java index 91b67094..7c22564b 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java @@ -26,6 +26,7 @@ import com.klp.domain.vo.WmsActualWarehouseTreeVo; import com.klp.domain.vo.WmsActualWarehouseImportVo; import com.klp.domain.bo.WmsActualWarehouseBo; import com.klp.domain.bo.WmsActualWarehouseHierarchyBo; +import com.klp.domain.bo.WmsActualWarehouseBatchGenerateBo; import com.klp.service.IWmsActualWarehouseService; /** @@ -126,6 +127,17 @@ public class WmsActualWarehouseController extends BaseController { return R.ok(iWmsActualWarehouseService.createHierarchy(bo)); } + /** + * 批量生成库位 + */ + @Log(title = "实际库区/库位自关联-批量生成库位", businessType = BusinessType.INSERT) + @RepeatSubmit() + @PostMapping("/generateLocations") + public R generateLocations(@Validated @RequestBody WmsActualWarehouseBatchGenerateBo bo) { + int created = iWmsActualWarehouseService.batchGenerateLocations(bo); + return R.ok(created); + } + /** * 修改实际库区/库位自关联 */ diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsActualWarehouseBatchGenerateBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsActualWarehouseBatchGenerateBo.java new file mode 100644 index 00000000..853839b0 --- /dev/null +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsActualWarehouseBatchGenerateBo.java @@ -0,0 +1,37 @@ +package com.klp.domain.bo; + +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 批量生成库位请求参数 + */ +@Data +public class WmsActualWarehouseBatchGenerateBo { + + /** 列数 */ + @NotNull + @Min(1) + private Integer columnCount; + + /** 行数 */ + @NotNull + @Min(1) + private Integer rowCount; + + /** 层数 */ + @NotNull + @Min(1) + private Integer layerCount; + + /** 前缀 */ + @NotBlank + private String prefix; + + /** 父节点ID */ + @NotNull + private Long parentId; +} diff --git a/klp-wms/src/main/java/com/klp/service/IWmsActualWarehouseService.java b/klp-wms/src/main/java/com/klp/service/IWmsActualWarehouseService.java index 6414939b..f8a52f1a 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsActualWarehouseService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsActualWarehouseService.java @@ -5,6 +5,7 @@ import com.klp.domain.vo.WmsActualWarehouseTreeVo; import com.klp.domain.vo.WmsActualWarehouseImportVo; import com.klp.domain.bo.WmsActualWarehouseBo; import com.klp.domain.bo.WmsActualWarehouseHierarchyBo; +import com.klp.domain.bo.WmsActualWarehouseBatchGenerateBo; import java.util.Collection; import java.util.List; @@ -59,4 +60,10 @@ public interface IWmsActualWarehouseService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); List queryTreeExcludeLevelThree(WmsActualWarehouseBo bo); + + /** + * 批量生成库位 + * @return 成功创建数量 + */ + int batchGenerateLocations(WmsActualWarehouseBatchGenerateBo bo); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java index f3998a63..2297754c 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsActualWarehouseServiceImpl.java @@ -11,6 +11,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.klp.domain.bo.WmsActualWarehouseBo; import com.klp.domain.bo.WmsActualWarehouseHierarchyBo; +import com.klp.domain.bo.WmsActualWarehouseBatchGenerateBo; import com.klp.domain.vo.WmsActualWarehouseTreeVo; import com.klp.domain.vo.WmsActualWarehouseImportVo; import com.klp.domain.vo.WmsActualWarehouseVo; @@ -41,6 +42,66 @@ public class WmsActualWarehouseServiceImpl implements IWmsActualWarehouseService return baseMapper.selectVoById(actualWarehouseId); } + @Override + @Transactional(rollbackFor = Exception.class) + public int batchGenerateLocations(WmsActualWarehouseBatchGenerateBo bo) { + if (bo == null) { + throw new ServiceException("参数不能为空"); + } + Integer rows = bo.getRowCount(); + Integer cols = bo.getColumnCount(); + Integer layers = bo.getLayerCount(); + String prefix = bo.getPrefix(); + Long parentId = bo.getParentId(); + if (rows == null || cols == null || layers == null || rows < 1 || cols < 1 || layers < 1) { + throw new ServiceException("行/列/层必须为正整数"); + } + if (StringUtils.isBlank(prefix)) { + throw new ServiceException("前缀不能为空"); + } + + // 预生成候选编码 + List codes = new ArrayList<>(rows * cols * layers); + for (int c = 1; c <= cols; c++) { + for (int r = 1; r <= rows; r++) { + String rStr = r < 10 ? ("0" + r) : String.valueOf(r); + for (int l = 1; l <= layers; l++) { + String code = prefix + c + rStr + '-' + l; + codes.add(code); + } + } + } + + // 去重:过滤同父级下已存在的编码 + List exists = baseMapper.selectList(Wrappers.lambdaQuery() + .eq(WmsActualWarehouse::getParentId, parentId) + .in(!codes.isEmpty(), WmsActualWarehouse::getActualWarehouseCode, codes)); + Set existCodes = exists.stream().map(WmsActualWarehouse::getActualWarehouseCode).collect(Collectors.toSet()); + + List toInsert = new ArrayList<>(); + for (String code : codes) { + if (existCodes.contains(code)) { + continue; + } + WmsActualWarehouse e = new WmsActualWarehouse(); + e.setParentId(parentId); + e.setActualWarehouseType(2L); + e.setActualWarehouseCode(code); + e.setActualWarehouseName(code); + e.setSortNo(0L); + e.setIsEnabled(1); + toInsert.add(e); + } + if (toInsert.isEmpty()) { + return 0; + } + boolean ok = baseMapper.insertBatch(toInsert); + if (!ok) { + throw new ServiceException("批量生成失败"); + } + return toInsert.size(); + } + /** * 查询实际库区/库位自关联列表