feat(warehouse): 新增批量生成库位功能
- 新增WmsActualWarehouseBatchGenerateBo类作为参数封装 - 在IWmsActualWarehouseService接口中定义batchGenerateLocations方法 - 在WmsActualWarehouseServiceImpl实现批量生成库位的逻辑 - 预生成候选编码,并过滤已存在的编码避免重复 - 支持根据行、列、层和前缀参数自动生成库位编码 - 在WmsActualWarehouseController中新增接口generateLocations - 接口添加日志记录和防重提交校验
This commit is contained in:
@@ -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<Integer> generateLocations(@Validated @RequestBody WmsActualWarehouseBatchGenerateBo bo) {
|
||||
int created = iWmsActualWarehouseService.batchGenerateLocations(bo);
|
||||
return R.ok(created);
|
||||
}
|
||||
|
||||
/**
|
||||
* 修改实际库区/库位自关联
|
||||
*/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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<Long> ids, Boolean isValid);
|
||||
|
||||
List<WmsActualWarehouseTreeVo> queryTreeExcludeLevelThree(WmsActualWarehouseBo bo);
|
||||
|
||||
/**
|
||||
* 批量生成库位
|
||||
* @return 成功创建数量
|
||||
*/
|
||||
int batchGenerateLocations(WmsActualWarehouseBatchGenerateBo bo);
|
||||
}
|
||||
|
||||
@@ -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<String> 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<WmsActualWarehouse> exists = baseMapper.selectList(Wrappers.<WmsActualWarehouse>lambdaQuery()
|
||||
.eq(WmsActualWarehouse::getParentId, parentId)
|
||||
.in(!codes.isEmpty(), WmsActualWarehouse::getActualWarehouseCode, codes));
|
||||
Set<String> existCodes = exists.stream().map(WmsActualWarehouse::getActualWarehouseCode).collect(Collectors.toSet());
|
||||
|
||||
List<WmsActualWarehouse> 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();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 查询实际库区/库位自关联列表
|
||||
|
||||
Reference in New Issue
Block a user