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(); + } + /** * 查询实际库区/库位自关联列表