Files
klp-oa/klp-wms/src/main/java/com/klp/controller/WmsActualWarehouseController.java
Joshi 491a007e2e feat(warehouse): 添加实际库区/库位释放功能
- 在IWmsActualWarehouseService接口中新增releaseActualWarehouse方法
- 在WmsActualWarehouseController控制器中新增释放库区的REST接口
- 在WmsActualWarehouseServiceImpl服务实现中完成释放逻辑的具体实现
- 实现将库区设置为未被占用状态(isEnabled=1)
- 实现清空钢卷表中绑定此库区的现存记录的actual_warehouse_id字段
- 添加权限注解和异常处理机制
2026-01-13 15:02:16 +08:00

228 lines
8.8 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());
}
}
}