Files
klp-oa/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java
Joshi bfba3ce49a feat(warehouse): 添加库位排序号修正功能并优化钢卷查询排序
- 在 IWmsActualWarehouseService 中新增 fixSortNoByParentId 方法用于修正库位排序号
- 在 WmsActualWarehouseController 中新增 /fixSortNo/{parentId} 接口
- 实现 WmsActualWarehouseServiceImpl 中的 fixSortNoByParentId 业务逻辑
- 添加正则表达式处理库位编码的排序键解析
- 新增 WmsMaterialCoilMapper 的 selectVoPagePlusOrderBy 查询方法
- 重构 WmsMaterialCoilMapper.xml 中的排序辅助字段查询逻辑
- 修改 WmsMaterialCoilServiceImpl 中的分页查询逻辑以支持排序功能
2026-03-12 17:05:22 +08:00

241 lines
9.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.klp.controller;
import java.util.List;
import java.util.Arrays;
import java.util.ArrayList;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.klp.common.core.domain.AjaxResult;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.http.MediaType;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.excel.ExcelResult;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.domain.vo.WmsActualWarehouseVo;
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.domain.bo.WmsActualWarehouseSplitBo;
import com.klp.service.IWmsActualWarehouseService;
/**
* 实际库区/库位自关联
*
* @author klp
* @date 2025-11-24
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/wms/actualWarehouse")
public class WmsActualWarehouseController extends BaseController {
private final IWmsActualWarehouseService iWmsActualWarehouseService;
/**
* 查询实际库区/库位自关联列表
*/
@GetMapping("/list")
public R<List<WmsActualWarehouseVo>> list(WmsActualWarehouseBo bo) {
List<WmsActualWarehouseVo> list = iWmsActualWarehouseService.queryList(bo);
return R.ok(list);
}
/**
* 获取完整三级目录树
*/
@GetMapping("/tree")
public R<List<WmsActualWarehouseTreeVo>> tree(WmsActualWarehouseBo bo) {
return R.ok(iWmsActualWarehouseService.queryTree(bo));
}
/**
* 获取仅到二级的目录树(不包含三级节点)
*/
@GetMapping("/levelTwo")
public R<List<WmsActualWarehouseTreeVo>> treeExcludeLevelThree(WmsActualWarehouseBo bo) {
return R.ok(iWmsActualWarehouseService.queryTreeExcludeLevelThree(bo));
}
/**
* 导入实际库区/库位数据
*/
@Log(title = "实际库区/库位自关联", businessType = BusinessType.IMPORT)
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file) throws Exception {
ExcelResult<WmsActualWarehouseImportVo> result = ExcelUtil.importExcel(file.getInputStream(), WmsActualWarehouseImportVo.class, true);
iWmsActualWarehouseService.importHierarchy(result.getList());
return R.ok(result.getAnalysis());
}
/**
* 下载导入模板
*/
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
List<WmsActualWarehouseImportVo> template = buildTemplateData();
ExcelUtil.exportExcel(template, "实际库区导入模板", WmsActualWarehouseImportVo.class, response);
}
/**
* 导出实际库区/库位自关联列表
*/
@Log(title = "实际库区/库位自关联", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(WmsActualWarehouseBo bo, HttpServletResponse response) {
List<WmsActualWarehouseVo> list = iWmsActualWarehouseService.queryList(bo);
ExcelUtil.exportExcel(list, "实际库区/库位自关联", WmsActualWarehouseVo.class, response);
}
/**
* 获取实际库区/库位自关联详细信息
*
* @param actualWarehouseId 主键
*/
@GetMapping("/{actualWarehouseId}")
public R<WmsActualWarehouseVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long actualWarehouseId) {
return R.ok(iWmsActualWarehouseService.queryById(actualWarehouseId));
}
/**
* 新增实际库区/库位自关联
*/
@Log(title = "实际库区/库位自关联", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody WmsActualWarehouseBo bo) {
return toAjax(iWmsActualWarehouseService.insertByBo(bo));
}
/**
* 批量新增或复用层级目录
*/
@Log(title = "实际库区/库位自关联-批量新增", businessType = BusinessType.INSERT)
@PostMapping("/hierarchy")
public R<List<Long>> addHierarchy(@Validated @RequestBody WmsActualWarehouseHierarchyBo bo) {
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);
}
/**
* 拆分指定库位(将某列/选中/全部的三级库位拆成2个小库位
*/
@Log(title = "实际库区/库位-拆分", businessType = BusinessType.UPDATE)
@PostMapping("/split")
public R<Void> split(@Validated @RequestBody WmsActualWarehouseSplitBo bo) {
iWmsActualWarehouseService.splitLocations(bo);
return R.ok();
}
/**
* 合并指定库位(将已拆分的小库位还原为大库位)
*/
@Log(title = "实际库区/库位-合并", businessType = BusinessType.UPDATE)
@PostMapping("/merge")
public R<Void> merge(@Validated @RequestBody WmsActualWarehouseSplitBo bo) {
iWmsActualWarehouseService.mergeLocations(bo);
return R.ok();
}
/**
* 修改实际库区/库位自关联
*/
@Log(title = "实际库区/库位自关联", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody WmsActualWarehouseBo bo) {
return toAjax(iWmsActualWarehouseService.updateByBo(bo));
}
/**
* 删除实际库区/库位自关联
*
* @param actualWarehouseIds 主键串
*/
@Log(title = "实际库区/库位自关联", businessType = BusinessType.DELETE)
@DeleteMapping("/{actualWarehouseIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] actualWarehouseIds) {
return toAjax(iWmsActualWarehouseService.deleteWithValidByIds(Arrays.asList(actualWarehouseIds), true));
}
private List<WmsActualWarehouseImportVo> buildTemplateData() {
List<WmsActualWarehouseImportVo> list = new ArrayList<>();
list.add(buildRow("L1-001", "一号库区", 10L, "L1-001-A", "A通道", 10L, "L1-001-A-01", "A-01货位", 10L));
list.add(buildRow("L1-001", "一号库区", 10L, "L1-001-A", "A通道", 10L, "L1-001-A-02", "A-02货位", 20L));
list.add(buildRow("L1-001", "一号库区", 10L, "L1-001-B", "B通道", 20L, "L1-001-B-01", "B-01货位", 10L));
list.add(buildRow("L1-002", "二号库区", 20L, "L1-002-A", "冷藏区", 10L, null, null, null));
list.add(buildRow("L1-002", "二号库区", 20L, "L1-002-B", "常温区", 20L, "L1-002-B-01", "常温-01", 10L));
return list;
}
private WmsActualWarehouseImportVo buildRow(String l1Code, String l1Name, Long l1Sort,
String l2Code, String l2Name, Long l2Sort,
String l3Code, String l3Name, Long l3Sort) {
WmsActualWarehouseImportVo vo = new WmsActualWarehouseImportVo();
vo.setLevelOneCode(l1Code);
vo.setLevelOneName(l1Name);
vo.setLevelOneSort(l1Sort);
vo.setLevelTwoCode(l2Code);
vo.setLevelTwoName(l2Name);
vo.setLevelTwoSort(l2Sort);
vo.setLevelThreeCode(l3Code);
vo.setLevelThreeName(l3Name);
vo.setLevelThreeSort(l3Sort);
return vo;
}
/**
* 释放实际库区/库位
*
* @param actualWarehouseId 库区ID
*/
@Log(title = "释放实际库区/库位", businessType = BusinessType.UPDATE)
@PutMapping("/release/{actualWarehouseId}")
public AjaxResult release(@PathVariable Long actualWarehouseId) {
try {
iWmsActualWarehouseService.releaseActualWarehouse(actualWarehouseId);
return AjaxResult.success("库区释放成功");
} catch (Exception e) {
return AjaxResult.error("库区释放失败: " + e.getMessage());
}
}
/**
* 修正已生成库位的排序号(交错排序)
*
* @param parentId 父库位ID
*/
@Log(title = "修正库位排序号", businessType = BusinessType.UPDATE)
@PutMapping("/fixSortNo/{parentId}")
public R<Integer> fixSortNo(@PathVariable Long parentId) {
int count = iWmsActualWarehouseService.fixSortNoByParentId(parentId);
return R.ok(count);
}
}