diff --git a/src/main/java/com/huaheng/pc/config/location/controller/LocationController.java b/src/main/java/com/huaheng/pc/config/location/controller/LocationController.java
index 3f037cc..5b77fe3 100644
--- a/src/main/java/com/huaheng/pc/config/location/controller/LocationController.java
+++ b/src/main/java/com/huaheng/pc/config/location/controller/LocationController.java
@@ -45,327 +45,328 @@ import java.util.stream.Collectors;
 @RequestMapping("/config/location")
 public class LocationController extends BaseController {
 
-    private String prefix = "config/location";
-
-    @Resource
-    private ContainerService containerService;
-    @Resource
-    private LocationService locationService;
-    @Resource
-    private InventoryDetailService inventoryDetailService;
-    @Resource
-    private MaterialService materialService;
-    @Resource
-    private DataSource dataSource;
-    @Resource
-    private Print print;
-
-    @RequiresPermissions("config:location:view")
-    @GetMapping()
-    public String location() {
-        return prefix + "/location";
+  private String prefix = "config/location";
+
+  @Resource
+  private ContainerService containerService;
+  @Resource
+  private LocationService locationService;
+  @Resource
+  private InventoryDetailService inventoryDetailService;
+  @Resource
+  private MaterialService materialService;
+  @Resource
+  private DataSource dataSource;
+  @Resource
+  private Print print;
+
+  @RequiresPermissions("config:location:view")
+  @GetMapping()
+  public String location () {
+    return prefix + "/location";
+  }
+
+  /**
+   * 查询库位列表
+   */
+  @ApiOperation(value = "查看库位列表",
+          notes = "根据行、列、层、格、库位类型、库区、库位状态、容器编码、库位名称、库位编码、创建时间获取库位的详细信息",
+          httpMethod = "POST")
+  @RequiresPermissions("config:location:list")
+  @Log(title = "配置-库存资料-库位管理", operating = "查看库位列表", action = BusinessType.GRANT)
+  @PostMapping("/list")
+  @ResponseBody
+  public TableDataInfo list (
+          @ApiParam(name = "location", value = "行、列、层、格、库位类型、库区、库位状态、容器编码、库位名称、库位编码") Location location,
+          @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin,
+          @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd) {
+    LambdaQueryWrapper<Location> lambdaQueryWrapper = Wrappers.lambdaQuery();
+    PageDomain pageDomain = TableSupport.buildPageRequest();
+    Integer pageNum = pageDomain.getPageNum();
+    Integer pageSize = pageDomain.getPageSize();
+    lambdaQueryWrapper.gt(StringUtils.isNotEmpty(createdBegin), Location::getCreated, createdBegin)
+            .lt(StringUtils.isNotEmpty(createdEnd), Location::getCreated, createdEnd)
+            .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+            .eq(StringUtils.isNotEmpty(location.getCode()), Location::getCode, location.getCode())
+            .eq(StringUtils.isNotEmpty(location.getName()), Location::getName, location.getName())
+            .eq(StringUtils.isNotEmpty(location.getContainerCode()), Location::getContainerCode, location.getContainerCode())
+            .eq(StringUtils.isNotNull(location.getSystemCreated()), Location::getStatus, location.getStatus())
+            .eq(StringUtils.isNotEmpty(location.getZoneCode()), Location::getZoneCode, location.getZoneCode())
+            .eq(StringUtils.isNotNull(location.getIRow()), Location::getIRow, location.getIRow())
+            .eq(StringUtils.isNotNull(location.getIColumn()), Location::getIColumn, location.getIColumn())
+            .eq(StringUtils.isNotNull(location.getIGrid()), Location::getIGrid, location.getIGrid())
+            .eq(StringUtils.isNotNull(location.getILayer()), Location::getILayer, location.getILayer())
+            .eq(StringUtils.isNotEmpty(location.getStatus()), Location::getStatus, location.getStatus())
+            .eq(StringUtils.isNotEmpty(location.getLocationType()), Location::getLocationType, location.getLocationType())
+            .eq(Location::getDeleted, false)
+            .orderByDesc(Location::getId);
+
+    if(StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
+      /*使用分页查询*/
+      Page<Location> page = new Page<>(pageNum, pageSize);
+      IPage<Location> iPage = locationService.page(page, lambdaQueryWrapper);
+      return getMpDataTable(iPage.getRecords(), iPage.getTotal());
+    } else {
+      List<Location> list = locationService.list(lambdaQueryWrapper);
+      return getDataTable(list);
     }
-
-    /**
-     * 查询库位列表
-     */
-    @ApiOperation(value = "查看库位列表",
-            notes = "根据行、列、层、格、库位类型、库区、库位状态、容器编码、库位名称、库位编码、创建时间获取库位的详细信息",
-            httpMethod = "POST")
-    @RequiresPermissions("config:location:list")
-    @Log(title = "配置-库存资料-库位管理", operating = "查看库位列表", action = BusinessType.GRANT)
-    @PostMapping("/list")
-    @ResponseBody
-    public TableDataInfo list(
-            @ApiParam(name = "location", value = "行、列、层、格、库位类型、库区、库位状态、容器编码、库位名称、库位编码") Location location,
-            @ApiParam(name = "createdBegin", value = "起止时间") String createdBegin,
-            @ApiParam(name = "createdEnd", value = "结束时间") String createdEnd) {
-        LambdaQueryWrapper<Location> lambdaQueryWrapper = Wrappers.lambdaQuery();
-        PageDomain pageDomain = TableSupport.buildPageRequest();
-        Integer pageNum = pageDomain.getPageNum();
-        Integer pageSize = pageDomain.getPageSize();
-        lambdaQueryWrapper.gt(StringUtils.isNotEmpty(createdBegin), Location::getCreated, createdBegin)
-                .lt(StringUtils.isNotEmpty(createdEnd), Location::getCreated, createdEnd)
-                .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
-                .eq(StringUtils.isNotEmpty(location.getCode()), Location::getCode, location.getCode())
-                .eq(StringUtils.isNotEmpty(location.getName()), Location::getName, location.getName())
-                .eq(StringUtils.isNotEmpty(location.getContainerCode()), Location::getContainerCode, location.getContainerCode())
-                .eq(StringUtils.isNotNull(location.getSystemCreated()), Location::getStatus, location.getStatus())
-                .eq(StringUtils.isNotEmpty(location.getZoneCode()), Location::getZoneCode, location.getZoneCode())
-                .eq(StringUtils.isNotNull(location.getIRow()), Location::getIRow, location.getIRow())
-                .eq(StringUtils.isNotNull(location.getIColumn()), Location::getIColumn, location.getIColumn())
-                .eq(StringUtils.isNotNull(location.getIGrid()), Location::getIGrid, location.getIGrid())
-                .eq(StringUtils.isNotNull(location.getILayer()), Location::getILayer, location.getILayer())
-                .eq(StringUtils.isNotEmpty(location.getStatus()), Location::getStatus, location.getStatus())
-                .eq(StringUtils.isNotEmpty(location.getLocationType()), Location::getLocationType, location.getLocationType())
-                .eq(Location::getDeleted, false);
-
-        if (StringUtils.isNotEmpty(location.getUserDef2())) {
-            if ("有容器".equals(location.getUserDef2())) {
-                lambdaQueryWrapper.apply("containerCode!='' and containerCode IS NOT null");
-            } else {
-                lambdaQueryWrapper.apply("code in ( select CODE from location where containerCode='' or containerCode IS null) ");
-            }
-            lambdaQueryWrapper.orderByDesc(Location::getId);
-        }
-        if (StringUtils.isNotNull(pageNum) && StringUtils.isNotNull(pageSize)) {
-            /*使用分页查询*/
-            Page<Location> page = new Page<>(pageNum, pageSize);
-            IPage<Location> iPage = locationService.page(page, lambdaQueryWrapper);
-            return getMpDataTable(iPage.getRecords(), iPage.getTotal());
-        } else {
-            List<Location> list = locationService.list(lambdaQueryWrapper);
-            return getDataTable(list);
-        }
-    }
-
-    /**
-     * 查询库位列表
-     */
-    @Log(title = "配置-库存资料-库位管理", operating = "查看库位列表", action = BusinessType.GRANT)
-    @PostMapping("/getAllLocation")
-    @ResponseBody
-    public AjaxResult getAllLocation(String type) {
-        if (StringUtils.isEmpty(type)) {
-            return AjaxResult.error("type不能为空");
-        }
-
-        return AjaxResult.success(locationService.getAllLocation(type));
+  }
+
+  /**
+   * 查询库位列表
+   */
+  @Log(title = "配置-库存资料-库位管理", operating = "查看库位列表", action = BusinessType.GRANT)
+  @PostMapping("/getAllLocation")
+  @ResponseBody
+  public AjaxResult getAllLocation (String type) {
+    if(StringUtils.isEmpty(type)) {
+      return AjaxResult.error("type不能为空");
     }
 
-
-    /**
-     * 新增库位
-     */
-    @GetMapping("/add")
-    public String add() {
-        return prefix + "/add";
-    }
-
-    /**
-     * 新增保存库位
-     */
-    @ApiOperation(value = "新增库位", notes = "新增单个库位", httpMethod = "POST")
-    @RequiresPermissions("config:location:add")
-    @Log(title = "配置-库存资料-库位管理", operating = "新增库位", action = BusinessType.INSERT)
-    @PostMapping("/add")
-    @ResponseBody
-    public AjaxResult addSave(Location location) {
-        AjaxResult result = locationService.addsave(location);
-        return result;
-    }
-
-
-    /**
-     * 批量新增库位
-     */
-
-    @GetMapping("/addBatch")
-    public String addBatch() {
-        return prefix + "/addBatch";
+    return AjaxResult.success(locationService.getAllLocation(type));
+  }
+
+
+  /**
+   * 新增库位
+   */
+  @GetMapping("/add")
+  public String add () {
+    return prefix + "/add";
+  }
+
+  /**
+   * 新增保存库位
+   */
+  @ApiOperation(value = "新增库位", notes = "新增单个库位", httpMethod = "POST")
+  @RequiresPermissions("config:location:add")
+  @Log(title = "配置-库存资料-库位管理", operating = "新增库位", action = BusinessType.INSERT)
+  @PostMapping("/add")
+  @ResponseBody
+  public AjaxResult addSave (Location location) {
+    AjaxResult result = locationService.addsave(location);
+    return result;
+  }
+
+
+  /**
+   * 批量新增库位
+   */
+
+  @GetMapping("/addBatch")
+  public String addBatch () {
+    return prefix + "/addBatch";
+  }
+
+
+  /**
+   * 批量新增保存库位
+   */
+  @RequiresPermissions("config:location:add")
+  @ApiOperation(value = "新增库位", notes = "批量新增库位", httpMethod = "POST")
+  @Log(title = "配置-库存资料-库位管理", operating = "新增库位", action = BusinessType.INSERT)
+  @PostMapping("/addBatchSave")
+  @ResponseBody
+  public AjaxResult addBatchSave (String prefix, String firstRow, String lastRow, String firstColumn, String lastColumn, String firstLayer, String lastLayer,
+                                  String firstGrid, String lastGrid, String roadway, String status, String zoneCode, String locationType, String high) {
+
+    return toAjax(locationService.addBatchSave(prefix, Integer.parseInt(firstRow), Integer.parseInt(lastRow),
+            Integer.parseInt(firstColumn), Integer.parseInt(lastColumn), Integer.parseInt(firstLayer), Integer.parseInt(lastLayer),
+            Integer.parseInt(firstGrid), Integer.parseInt(lastGrid), roadway, status, zoneCode, locationType, high));
+  }
+
+  /**
+   * 修改库位
+   */
+  @GetMapping("/edit/{id}")
+  public String edit (@PathVariable("id") Integer id, ModelMap mmap) {
+    Location location = locationService.getById(id);
+    mmap.put("location", location);
+    return prefix + "/edit";
+  }
+
+  /**
+   * 修改物料
+   */
+  @GetMapping("/editBatch/{ids}")
+  public String editBatch (@PathVariable("ids") String ids, ModelMap mmap) {
+    mmap.put("ids", ids);
+    return prefix + "/editBatch";
+  }
+
+  /**
+   * 修改保存库位
+   */
+  @RequiresPermissions("config:location:edit")
+  @ApiOperation(value = "修改库位", notes = "批量修改库位", httpMethod = "POST")
+  @Log(title = "配置-库存资料-库位管理", operating = "修改库位", action = BusinessType.UPDATE)
+  @PostMapping("/edit")
+  @ResponseBody
+  public AjaxResult editSave (Location location) {
+    String containerCode = location.getContainerCode();
+    if (StringUtils.isNotEmpty(containerCode)) {
+      Container container =  containerService.getContainerByCode(containerCode);
+      if (container == null) {
+        return AjaxResult.error("容器编码输入错误");
+      }
     }
-
-
-    /**
-     * 批量新增保存库位
-     */
-    @RequiresPermissions("config:location:add")
-    @ApiOperation(value = "新增库位", notes = "批量新增库位", httpMethod = "POST")
-    @Log(title = "配置-库存资料-库位管理", operating = "新增库位", action = BusinessType.INSERT)
-    @PostMapping("/addBatchSave")
-    @ResponseBody
-    public AjaxResult addBatchSave(String prefix, String firstRow, String lastRow, String firstColumn, String lastColumn, String firstLayer, String lastLayer,
-                                   String firstGrid, String lastGrid, String roadway, String status, String zoneCode, String locationType, String high) {
-
-        return toAjax(locationService.addBatchSave(prefix, Integer.parseInt(firstRow), Integer.parseInt(lastRow),
-                Integer.parseInt(firstColumn), Integer.parseInt(lastColumn), Integer.parseInt(firstLayer), Integer.parseInt(lastLayer),
-                Integer.parseInt(firstGrid), Integer.parseInt(lastGrid), roadway, status, zoneCode, locationType, high));
+    location.setLastUpdatedBy(ShiroUtils.getName());
+    return toAjax(locationService.updateById(location));
+  }
+
+  /**
+   * 修改保存物料
+   */
+  @ApiOperation(value = "批量修改库位", notes = "批量修改库位", httpMethod = "POST")
+  @RequiresPermissions("config:location:edit")
+  @Log(title = "通用-库位管理", operating = "批量修改库位", action = BusinessType.UPDATE)
+  @PostMapping("/editBatchSave")
+  @ResponseBody
+  public AjaxResult editBatchSave (String ids, String materialAreaCode, Integer high, String status) {
+    String[] idArray = Convert.toStrArray(ids);
+    LambdaUpdateWrapper<Location> wrapper = Wrappers.lambdaUpdate();
+    wrapper.in(Location::getId, idArray)
+            .set(Location::getMaterialAreaCode, materialAreaCode)
+            .set(Location::getHigh, high)
+            .set(Location::getStatus, status);
+    return toAjax(locationService.update(wrapper));
+  }
+
+  /**
+   * 删除库位
+   */
+  @RequiresPermissions("config:location:remove")
+  @Log(title = "配置库存资料-库位管理", operating = "删除库位", action = BusinessType.DELETE)
+  @ApiOperation(value = "删除库位", notes = "批量删除库位", httpMethod = "POST")
+  @PostMapping("/remove")
+  @ResponseBody
+  public AjaxResult remove (String ids) {
+    if(StringUtils.isEmpty(ids)) {
+      return AjaxResult.error("id不能为空");
     }
-
-    /**
-     * 修改库位
-     */
-    @GetMapping("/edit/{id}")
-    public String edit(@PathVariable("id") Integer id, ModelMap mmap) {
-        Location location = locationService.getById(id);
-        mmap.put("location", location);
-        return prefix + "/edit";
+    for (Integer id : Convert.toIntArray(ids)) {
+      Location location = locationService.getById(id);
+      if(StringUtils.isEmpty(location.getContainerCode())) {
+        locationService.removeById(locationService.getById(id));
+      } else {
+        return AjaxResult.error("库位(" + location.getCode() + ")不是空,或者有容器,不能删除成功!");
+      }
     }
-
-    /**
-     * 修改物料
-     */
-    @GetMapping("/editBatch/{ids}")
-    public String editBatch(@PathVariable("ids") String ids, ModelMap mmap) {
-        mmap.put("ids", ids);
-        return prefix + "/editBatch";
+    return AjaxResult.success("删除成功!");
+  }
+
+  /**
+   * 查询库位列表
+   */
+  @Log(title = "配置-库存资料-库位管理", operating = "查看库位列表", action = BusinessType.GRANT)
+  @PostMapping("/getLocationInfo")
+  @ResponseBody
+  public AjaxResult getLocationInfo (String type, String row, String line, String layer, String grid) {
+    if(StringUtils.isEmpty(type)) {
+      return AjaxResult.error("type不能为空");
     }
 
-    /**
-     * 修改保存库位
-     */
-    @RequiresPermissions("config:location:edit")
-    @ApiOperation(value = "修改库位", notes = "批量修改库位", httpMethod = "POST")
-    @Log(title = "配置-库存资料-库位管理", operating = "修改库位", action = BusinessType.UPDATE)
-    @PostMapping("/edit")
-    @ResponseBody
-    public AjaxResult editSave(Location location) {
-        String containerCode = location.getContainerCode();
-        if (StringUtils.isNotEmpty(containerCode)) {
-            Container container = containerService.getContainerByCode(containerCode);
-            if (container == null) {
-                return AjaxResult.error("容器编码输入错误");
-            }
+    /* 查询库位信息*/
+    LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
+    locationLambdaQueryWrapper.eq(StringUtils.isNotEmpty(row), Location::getIRow, row)
+            .eq(StringUtils.isNotEmpty(line), Location::getIColumn, line)
+            .eq(StringUtils.isNotEmpty(layer), Location::getILayer, layer)
+            .eq(Location::getIGrid, 1) //
+            .eq(StringUtils.isNotEmpty(type), Location::getLocationType, type)
+            .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
+            .eq(StringUtils.isNotEmpty(type), Location::getZoneCode, type);
+    List<Location> locations = locationService.list(locationLambdaQueryWrapper);
+    List<Location> locationList = new ArrayList<>();
+
+    /* 查询库存明细*/
+    LambdaQueryWrapper<InventoryDetail> inventoryDetailLambda = Wrappers.lambdaQuery();
+    inventoryDetailLambda.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
+    List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambda);
+
+    for (Location location1 : locations) {
+      InventoryDetail inventoryDetail = null;
+      String materialName = null;
+      for (InventoryDetail inventoryDetail2 : inventoryDetailList) {
+        if(location1.getCode().equals(inventoryDetail2.getLocationCode())) {
+          inventoryDetail = inventoryDetail2;
         }
-        location.setLastUpdatedBy(ShiroUtils.getName());
-        return toAjax(locationService.updateById(location));
-    }
-
-    /**
-     * 修改保存物料
-     */
-    @ApiOperation(value = "批量修改库位", notes = "批量修改库位", httpMethod = "POST")
-    @RequiresPermissions("config:location:edit")
-    @Log(title = "通用-库位管理", operating = "批量修改库位", action = BusinessType.UPDATE)
-    @PostMapping("/editBatchSave")
-    @ResponseBody
-    public AjaxResult editBatchSave(String ids, String materialAreaCode, Integer high, String status) {
-        String[] idArray = Convert.toStrArray(ids);
-        LambdaUpdateWrapper<Location> wrapper = Wrappers.lambdaUpdate();
-        wrapper.in(Location::getId, idArray)
-                .set(Location::getMaterialAreaCode, materialAreaCode)
-                .set(Location::getHigh, high)
-                .set(Location::getStatus, status);
-        return toAjax(locationService.update(wrapper));
-    }
-
-    /**
-     * 删除库位
-     */
-    @RequiresPermissions("config:location:remove")
-    @Log(title = "配置库存资料-库位管理", operating = "删除库位", action = BusinessType.DELETE)
-    @ApiOperation(value = "删除库位", notes = "批量删除库位", httpMethod = "POST")
-    @PostMapping("/remove")
-    @ResponseBody
-    public AjaxResult remove(String ids) {
-        if (StringUtils.isEmpty(ids)) {
-            return AjaxResult.error("id不能为空");
+      }
+      List<InventoryDetail> inventoryDetails = inventoryDetailList.stream().filter(inventoryDetail1 ->
+              inventoryDetail1.getLocationCode().equals(location1.getCode())).collect(Collectors.toList());
+
+      int userDef3 = 0;
+      String status = location1.getStatus();
+      String containerCode = location1.getContainerCode();
+      List<String> materialNameList = inventoryDetails.stream().map(InventoryDetail::getMaterialName).collect(Collectors.toList());
+      List<String> batchList = inventoryDetails.stream().map(InventoryDetail::getBatch).collect(Collectors.toList());
+      List<String> materialCodeList = inventoryDetails.stream().map(InventoryDetail::getMaterialCode).collect(Collectors.toList());
+      List<BigDecimal> qtyList = inventoryDetails.stream().map(InventoryDetail::getQty).collect(Collectors.toList());
+      if(QuantityConstant.STATUS_LOCATION_EMPTY.equals(status)) {
+        if(StringUtils.isEmpty(containerCode)) {
+          userDef3 = LocationStatus.IDLE_EMPTY_LOCATION;
+        } else {
+          if(inventoryDetail == null) {
+            userDef3 = LocationStatus.IDLE_EMPTY_CONTAINER;
+          } else {
+            location1.setMaterialName(materialNameList);
+            location1.setMaterialCode(materialCodeList);
+            location1.setBatch(batchList);
+            location1.setQty(qtyList);
+            userDef3 = LocationStatus.IDLE_FULL_CONTAINER;
+          }
         }
-        for (Integer id : Convert.toIntArray(ids)) {
-            Location location = locationService.getById(id);
-            if (StringUtils.isEmpty(location.getContainerCode())) {
-                locationService.removeById(locationService.getById(id));
-            } else {
-                return AjaxResult.error("库位(" + location.getCode() + ")不是空,或者有容器,不能删除成功!");
-            }
+      } else if(QuantityConstant.STATUS_LOCATION_LOCK.equals(status)) {
+        if(StringUtils.isEmpty(containerCode)) {
+          userDef3 = LocationStatus.LOCK_EMPTY_LOCATION;
+        } else {
+          if(inventoryDetail == null) {
+            userDef3 = LocationStatus.LOCK_EMPTY_CONTAINER;
+          } else {
+            location1.setMaterialName(materialNameList);
+            location1.setMaterialCode(materialCodeList);
+            location1.setBatch(batchList);
+            location1.setQty(qtyList);
+            userDef3 = LocationStatus.LOCK_FULL_CONTAINER;
+          }
         }
-        return AjaxResult.success("删除成功!");
-    }
+      }
 
-    /**
-     * 查询库位列表
-     */
-    @Log(title = "配置-库存资料-库位管理", operating = "查看库位列表", action = BusinessType.GRANT)
-    @PostMapping("/getLocationInfo")
-    @ResponseBody
-    public AjaxResult getLocationInfo(String type, String row, String line, String layer, String grid) {
-        if (StringUtils.isEmpty(type)) {
-            return AjaxResult.error("type不能为空");
+      if(location1.getDeleted()) {
+        if(StringUtils.isEmpty(containerCode)) {
+          userDef3 = LocationStatus.DISABLE_EMPTY_LOCATION;
+        } else {
+          if(inventoryDetail == null) {
+            userDef3 = LocationStatus.DISABLE_EMPTY_CONTAINER;
+          } else {
+            location1.setMaterialName(materialNameList);
+            location1.setMaterialCode(materialCodeList);
+            location1.setBatch(batchList);
+            location1.setQty(qtyList);
+            userDef3 = LocationStatus.DISABLE_FULL_CONTAINER;
+          }
         }
+      }
 
-        /* 查询库位信息*/
-        LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery();
-        locationLambdaQueryWrapper.eq(StringUtils.isNotEmpty(row), Location::getIRow, row)
-                .eq(StringUtils.isNotEmpty(line), Location::getIColumn, line)
-                .eq(StringUtils.isNotEmpty(layer), Location::getILayer, layer)
-                .eq(Location::getIGrid, 1) //
-                .eq(StringUtils.isNotEmpty(type), Location::getLocationType, type)
-                .eq(Location::getWarehouseCode, ShiroUtils.getWarehouseCode())
-                .eq(StringUtils.isNotEmpty(type), Location::getZoneCode, type);
-        List<Location> locations = locationService.list(locationLambdaQueryWrapper);
-        List<Location> locationList = new ArrayList<>();
-
-        /* 查询库存明细*/
-        LambdaQueryWrapper<InventoryDetail> inventoryDetailLambda = Wrappers.lambdaQuery();
-        inventoryDetailLambda.eq(InventoryDetail::getWarehouseCode, ShiroUtils.getWarehouseCode());
-        List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambda);
-
-        for (Location location1 : locations) {
-            InventoryDetail inventoryDetail = null;
-            String materialName = null;
-            for (InventoryDetail inventoryDetail2 : inventoryDetailList) {
-                if (location1.getCode().equals(inventoryDetail2.getLocationCode())) {
-                    inventoryDetail = inventoryDetail2;
-                }
-            }
-            List<InventoryDetail> inventoryDetails = inventoryDetailList.stream().filter(inventoryDetail1 ->
-                    inventoryDetail1.getLocationCode().equals(location1.getCode())).collect(Collectors.toList());
-
-            int userDef3 = 0;
-            String status = location1.getStatus();
-            String containerCode = location1.getContainerCode();
-            List<String> materialNameList = inventoryDetails.stream().map(InventoryDetail::getMaterialName).collect(Collectors.toList());
-            List<String> batchList = inventoryDetails.stream().map(InventoryDetail::getBatch).collect(Collectors.toList());
-            List<String> materialCodeList = inventoryDetails.stream().map(InventoryDetail::getMaterialCode).collect(Collectors.toList());
-            List<BigDecimal> qtyList = inventoryDetails.stream().map(InventoryDetail::getQty).collect(Collectors.toList());
-            if (QuantityConstant.STATUS_LOCATION_EMPTY.equals(status)) {
-                if (StringUtils.isEmpty(containerCode)) {
-                    userDef3 = LocationStatus.IDLE_EMPTY_LOCATION;
-                } else {
-                    if (inventoryDetail == null) {
-                        userDef3 = LocationStatus.IDLE_EMPTY_CONTAINER;
-                    } else {
-                        location1.setMaterialName(materialNameList);
-                        location1.setMaterialCode(materialCodeList);
-                        location1.setBatch(batchList);
-                        location1.setQty(qtyList);
-                        userDef3 = LocationStatus.IDLE_FULL_CONTAINER;
-                    }
-                }
-            } else if (QuantityConstant.STATUS_LOCATION_LOCK.equals(status)) {
-                if (StringUtils.isEmpty(containerCode)) {
-                    userDef3 = LocationStatus.LOCK_EMPTY_LOCATION;
-                } else {
-                    if (inventoryDetail == null) {
-                        userDef3 = LocationStatus.LOCK_EMPTY_CONTAINER;
-                    } else {
-                        location1.setMaterialName(materialNameList);
-                        location1.setMaterialCode(materialCodeList);
-                        location1.setBatch(batchList);
-                        location1.setQty(qtyList);
-                        userDef3 = LocationStatus.LOCK_FULL_CONTAINER;
-                    }
-                }
-            }
-
-            if (location1.getDeleted()) {
-                if (StringUtils.isEmpty(containerCode)) {
-                    userDef3 = LocationStatus.DISABLE_EMPTY_LOCATION;
-                } else {
-                    if (inventoryDetail == null) {
-                        userDef3 = LocationStatus.DISABLE_EMPTY_CONTAINER;
-                    } else {
-                        location1.setMaterialName(materialNameList);
-                        location1.setMaterialCode(materialCodeList);
-                        location1.setBatch(batchList);
-                        location1.setQty(qtyList);
-                        userDef3 = LocationStatus.DISABLE_FULL_CONTAINER;
-                    }
-                }
-            }
-
-            location1.setUserDef3(String.valueOf(userDef3));
-            locationList.add(location1);
-        }
-        return AjaxResult.success(locations);
+      location1.setUserDef3(String.valueOf(userDef3));
+      locationList.add(location1);
     }
+    return AjaxResult.success(locations);
+  }
+
 
+  @Log(title = "配置-库存资料-库位条码", operating = "库位条码打印", action = BusinessType.OTHER)
+  //  @ResponseBody // 错误1ajax是json数据而没有添加该注解返回值不为json所以不能够返回common.ajaxSetup.textStatus= "parsererror"报错
+  @GetMapping("/print/{ids}")
+  public void print (@PathVariable("ids") Integer[] ids, ModelMap mmap)  // arg1:物料id arg2:会话对象不需要直接返回
+  {
+    print.jasperPrint(ids, prefix);// 不用返回json打印
+  }
 
-    @Log(title = "配置-库存资料-库位条码", operating = "库位条码打印", action = BusinessType.OTHER)
-    //  @ResponseBody // 错误1ajax是json数据而没有添加该注解返回值不为json所以不能够返回common.ajaxSetup.textStatus= "parsererror"报错
-    @GetMapping("/print/{ids}")
-    public void print(@PathVariable("ids") Integer[] ids, ModelMap mmap)  // arg1:物料id arg2:会话对象不需要直接返回
-    {
-        print.jasperPrint(ids, prefix);// 不用返回json打印
+
+    @Log(title = "监控-库位空闲监控-库位管理", operating = "查看库位空闲结果", action = BusinessType.GRANT)
+    @PostMapping("/getIdleLocation")
+    @ResponseBody
+    public AjaxResult<?> getIdleLocation() {
+      return AjaxResult.success(locationService.getIdleLocation());
     }
 }
diff --git a/src/main/java/com/huaheng/pc/config/location/domain/bo/LocationIdleBO.java b/src/main/java/com/huaheng/pc/config/location/domain/bo/LocationIdleBO.java
new file mode 100644
index 0000000..acbc7dd
--- /dev/null
+++ b/src/main/java/com/huaheng/pc/config/location/domain/bo/LocationIdleBO.java
@@ -0,0 +1,25 @@
+package com.huaheng.pc.config.location.domain.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author puff
+ * @date 2023-06-21
+ */
+@Data
+@Builder
+public class LocationIdleBO implements Serializable {
+
+    @ApiModelProperty(value = "层级")
+    private String ilayer;
+    @ApiModelProperty(value = "巷道")
+    private String roadway;
+    @ApiModelProperty(value = "行数")
+    private Integer irow;
+    @ApiModelProperty(value = "空闲数")
+    private Integer idleCount;
+}
diff --git a/src/main/java/com/huaheng/pc/config/location/domain/vo/LocationIdleVO.java b/src/main/java/com/huaheng/pc/config/location/domain/vo/LocationIdleVO.java
new file mode 100644
index 0000000..265a3ac
--- /dev/null
+++ b/src/main/java/com/huaheng/pc/config/location/domain/vo/LocationIdleVO.java
@@ -0,0 +1,22 @@
+package com.huaheng.pc.config.location.domain.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author puff
+ * @date 2023-06-21
+ */
+@Data
+public class LocationIdleVO implements Serializable {
+
+    @ApiModelProperty(value = "巷道")
+    private String roadway;
+    @ApiModelProperty(value = "行数")
+    private Integer irow;
+    @ApiModelProperty(value = "空闲数")
+    private Integer idleCount;
+}
diff --git a/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java b/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java
index c51b54b..6f0b2ab 100644
--- a/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java
+++ b/src/main/java/com/huaheng/pc/config/location/mapper/LocationMapper.java
@@ -2,6 +2,7 @@ package com.huaheng.pc.config.location.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.huaheng.pc.config.location.domain.Location;
+import com.huaheng.pc.config.location.domain.bo.LocationIdleBO;
 import org.apache.ibatis.annotations.Param;
 
 import java.util.LinkedHashMap;
@@ -33,4 +34,6 @@ public interface LocationMapper extends BaseMapper<Location> {
     int getLastRowOfZone(@Param("warehouseCode") String warehouseCode, @Param("locationType") String locationType);
 
     int updateStatusNew(@Param("code") String code, @Param("warehouseCode") String warehouseCode,@Param("status") String status, @Param("oldStatus") String oldStatus);
+
+    List<LocationIdleBO> getIdleLocation();
 }
diff --git a/src/main/java/com/huaheng/pc/config/location/service/LocationService.java b/src/main/java/com/huaheng/pc/config/location/service/LocationService.java
index 3a16daa..aec0de2 100644
--- a/src/main/java/com/huaheng/pc/config/location/service/LocationService.java
+++ b/src/main/java/com/huaheng/pc/config/location/service/LocationService.java
@@ -4,6 +4,7 @@ import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.pc.config.location.domain.Location;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.huaheng.pc.config.location.domain.LocationInfo;
+import com.huaheng.pc.config.location.domain.vo.LocationIdleVO;
 
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -118,4 +119,11 @@ public interface LocationService extends IService<Location>{
     void upstatus(String code);
 
     int updateStatusNew(String locationCode, String warehouseCode, String status, String oldStatus);
+
+    /**
+     * 查询空闲库位数量
+     * @return
+     */
+    List<LocationIdleVO> getIdleLocation();
+
 }
diff --git a/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java b/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java
index d136764..c42f641 100644
--- a/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java
+++ b/src/main/java/com/huaheng/pc/config/location/service/LocationServiceImpl.java
@@ -12,17 +12,21 @@ import com.huaheng.common.utils.security.ShiroUtils;
 import com.huaheng.framework.web.domain.AjaxResult;
 import com.huaheng.pc.config.location.domain.Location;
 import com.huaheng.pc.config.location.domain.LocationInfo;
+import com.huaheng.pc.config.location.domain.bo.LocationIdleBO;
+import com.huaheng.pc.config.location.domain.vo.LocationIdleVO;
 import com.huaheng.pc.config.location.mapper.LocationMapper;
 import com.huaheng.pc.config.locationType.domain.LocationType;
 import com.huaheng.pc.config.locationType.service.LocationTypeService;
 import com.huaheng.pc.config.zone.domain.Zone;
 import com.huaheng.pc.config.zone.service.ZoneService;
 import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
+import io.swagger.models.auth.In;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.text.MessageFormat;
 import java.util.*;
+import java.util.stream.Collectors;
 
 @Service("LocationService")
 public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> implements LocationService {
@@ -361,7 +365,7 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
     }
 
     @Override
-  	public void updateContainerCodeAndStatus(String locationCode, String containerCode,
+    public void updateContainerCodeAndStatus(String locationCode, String containerCode,
                                              String status, String warehouseCode) {
         if (StringUtils.isNotEmpty(locationCode) || StringUtils.isNotEmpty(containerCode)) {
             LambdaUpdateWrapper<Location> updateWrapper = Wrappers.lambdaUpdate();
@@ -371,7 +375,10 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
                     .eq(Location::getCode, locationCode);
             this.update(updateWrapper);
         }
-    }    public LocationInfo getAllLocation(String type) {
+    }
+
+    @Override
+    public LocationInfo getAllLocation(String type) {
         if (StringUtils.isNotEmpty(type)) {
             Location location = locationMapper.getAllLocation(ShiroUtils.getWarehouseCode(), type);
             LocationInfo locationInfo = new LocationInfo();
@@ -667,4 +674,26 @@ public class LocationServiceImpl extends ServiceImpl<LocationMapper, Location> i
         }
         return 0;
     }
+
+    @Override
+    public List<LocationIdleVO> getIdleLocation() {
+        List<LocationIdleBO> idleBOList = locationMapper.getIdleLocation();
+        return idleBOList.stream()
+                .collect(Collectors.groupingBy(LocationIdleBO::getRoadway)) // 以巷道分组
+                .entrySet().stream()
+                .flatMap(entry -> entry.getValue().stream()
+                        .collect(Collectors.groupingBy(LocationIdleBO::getIrow)) // 获取当前巷道分组下的行级别数据
+                        .entrySet().stream()
+                        .map(rowEntry -> {
+                            Integer idleCount = rowEntry.getValue().stream()
+                                    .mapToInt(LocationIdleBO::getIdleCount)
+                                    .sum(); // 计算空闲库位数量
+                            LocationIdleVO idleInfo = new LocationIdleVO();
+                            idleInfo.setRoadway(entry.getKey());
+                            idleInfo.setIrow(rowEntry.getKey());
+                            idleInfo.setIdleCount(idleCount);
+                            return idleInfo;
+                        }))
+                .collect(Collectors.toList());
+    }
 }
diff --git a/src/main/resources/mybatis/config/LocationMapper.xml b/src/main/resources/mybatis/config/LocationMapper.xml
index d43c89b..31b5bf4 100644
--- a/src/main/resources/mybatis/config/LocationMapper.xml
+++ b/src/main/resources/mybatis/config/LocationMapper.xml
@@ -32,6 +32,14 @@
     <result column="systemCreated" jdbcType="INTEGER" property="systemCreated" />
       <result column="deleted" jdbcType="BIT" property="deleted" />
   </resultMap>
+
+    <resultMap id="BaseResultLocationIdleBOMap" type="com.huaheng.pc.config.location.domain.bo.LocationIdleBO">
+        <result column="ilayer" jdbcType="VARCHAR" property="ilayer" />
+        <result column="roadway" jdbcType="VARCHAR" property="roadway" />
+        <result column="irow" jdbcType="INTEGER" property="irow" />
+        <result column="count" jdbcType="INTEGER" property="idleCount" />
+    </resultMap>
+
   <sql id="Base_Column_List">
     <!--@mbg.generated-->
     id, code, warehouseCode, zoneCode, locationType, containerCode, iRow, iColumn, iLayer,
@@ -47,6 +55,20 @@
     select code from location where #{locatingRule}
   </select>
 
+    <select id="getIdleLocation" resultMap="BaseResultLocationIdleBOMap">
+        select ilayer ,roadway, irow, COUNT(*) AS idleCount
+        FROM location
+        WHERE area = '1' -- 区域
+          AND warehouseCode = 'CS0001' -- 仓库
+          AND roadway IN ('1', '2', '3', '4') -- 巷道
+          AND status = 'empty' -- 状态:锁定、禁用,空闲
+          AND high IN (0, 1) -- 0 是低库位,1 是高库位
+          AND locationType IN ('L') -- 货位类型
+          AND containerCode = '' -- 容器编码
+        GROUP BY ilayer, irow
+        ORDER BY ilayer, irow;
+    </select>
+
   <insert id="addList" parameterType="com.huaheng.pc.config.location.domain.Location" keyProperty="id" useGeneratedKeys="true" >
     INSERT INTO location(
     code,