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(WmsActualWarehouseBo bo) { List list = iWmsActualWarehouseService.queryList(bo); return R.ok(list); } /** * 获取完整三级目录树 */ @GetMapping("/tree") public R> tree(WmsActualWarehouseBo bo) { return R.ok(iWmsActualWarehouseService.queryTree(bo)); } /** * 获取仅到二级的目录树(不包含三级节点) */ @GetMapping("/levelTwo") public R> 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 importData(@RequestPart("file") MultipartFile file) throws Exception { ExcelResult 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 template = buildTemplateData(); ExcelUtil.exportExcel(template, "实际库区导入模板", WmsActualWarehouseImportVo.class, response); } /** * 导出实际库区/库位自关联列表 */ @Log(title = "实际库区/库位自关联", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(WmsActualWarehouseBo bo, HttpServletResponse response) { List list = iWmsActualWarehouseService.queryList(bo); ExcelUtil.exportExcel(list, "实际库区/库位自关联", WmsActualWarehouseVo.class, response); } /** * 获取实际库区/库位自关联详细信息 * * @param actualWarehouseId 主键 */ @GetMapping("/{actualWarehouseId}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long actualWarehouseId) { return R.ok(iWmsActualWarehouseService.queryById(actualWarehouseId)); } /** * 新增实际库区/库位自关联 */ @Log(title = "实际库区/库位自关联", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() public R add(@Validated(AddGroup.class) @RequestBody WmsActualWarehouseBo bo) { return toAjax(iWmsActualWarehouseService.insertByBo(bo)); } /** * 批量新增或复用层级目录 */ @Log(title = "实际库区/库位自关联-批量新增", businessType = BusinessType.INSERT) @PostMapping("/hierarchy") public R> addHierarchy(@Validated @RequestBody WmsActualWarehouseHierarchyBo bo) { 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); } /** * 拆分指定库位(将某列/选中/全部的三级库位拆成2个小库位) */ @Log(title = "实际库区/库位-拆分", businessType = BusinessType.UPDATE) @PostMapping("/split") public R split(@Validated @RequestBody WmsActualWarehouseSplitBo bo) { iWmsActualWarehouseService.splitLocations(bo); return R.ok(); } /** * 合并指定库位(将已拆分的小库位还原为大库位) */ @Log(title = "实际库区/库位-合并", businessType = BusinessType.UPDATE) @PostMapping("/merge") public R merge(@Validated @RequestBody WmsActualWarehouseSplitBo bo) { iWmsActualWarehouseService.mergeLocations(bo); return R.ok(); } /** * 修改实际库区/库位自关联 */ @Log(title = "实际库区/库位自关联", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() public R edit(@Validated(EditGroup.class) @RequestBody WmsActualWarehouseBo bo) { return toAjax(iWmsActualWarehouseService.updateByBo(bo)); } /** * 删除实际库区/库位自关联 * * @param actualWarehouseIds 主键串 */ @Log(title = "实际库区/库位自关联", businessType = BusinessType.DELETE) @DeleteMapping("/{actualWarehouseIds}") public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] actualWarehouseIds) { return toAjax(iWmsActualWarehouseService.deleteWithValidByIds(Arrays.asList(actualWarehouseIds), true)); } private List buildTemplateData() { List 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()); } } }