diff --git a/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/controller/BasStockController.java b/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/controller/BasStockController.java index e67ac94..7ad768c 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/controller/BasStockController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/controller/BasStockController.java @@ -96,6 +96,17 @@ public class BasStockController extends BaseController return toAjax(basStockService.deleteBasStockByStockIds(stockIds)); } + /** + * 冻结/解冻库存货位 + */ + @PreAuthorize("@ss.hasPermi('stock:management:edit')") + @Log(title = "库存信息", businessType = BusinessType.UPDATE) + @PostMapping("/freeze") + public AjaxResult freeze(@RequestBody List stockIds) + { + return toAjax(basStockService.freezeOrUnfreeze(stockIds)); + } + /** * 重置盘点记录 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/service/IBasStockService.java b/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/service/IBasStockService.java index ab5407b..99489bc 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/service/IBasStockService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/service/IBasStockService.java @@ -90,4 +90,10 @@ public interface IBasStockService AjaxResult resetPdRecord(); + /** + * 冻结/解冻库存货位 + * @param stockIds 库存ID集合 + * @return 结果 + */ + public int freezeOrUnfreeze(List stockIds); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/service/impl/BasStockServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/service/impl/BasStockServiceImpl.java index 7fdb770..68a0266 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/service/impl/BasStockServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/stock/stock/service/impl/BasStockServiceImpl.java @@ -17,8 +17,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; /** * 库存信息Service业务层处理 @@ -224,4 +227,95 @@ public class BasStockServiceImpl implements IBasStockService { return basStockMapper.insertBasStock(basStock); } + + /** + * 冻结/解冻库存货位 + * @param stockIds 库存ID集合 + * @return 结果 + */ + @Override + @Transactional + public int freezeOrUnfreeze(List stockIds) { + int count = 0; + Set processedCargoSpaceIds = new HashSet<>(); + + for (String stockId : stockIds) { + BasStock stock = basStockMapper.selectBasStockByStockId(stockId); + if (stock == null || stock.getCargoSpaceId() == null) { + continue; + } + String cargoSpaceId = stock.getCargoSpaceId(); + if (processedCargoSpaceIds.contains(cargoSpaceId)) { + continue; + } + + BasCargoSpace cargoSpace = basCargoSpaceService.selectBasCargoSpaceByCargoSpaceId(cargoSpaceId); + if (cargoSpace == null) { + continue; + } + + // 确定操作方向:基于当前货位的锁定状态 + String currentLockStatus = cargoSpace.getLocked(); + // If Y (Locked) -> N (Open), If N (Open) -> Y (Locked) + boolean isFreezing = !"Y".equals(currentLockStatus); // 如果不是Y,那就是要冻结 + String newLockStatus = isFreezing ? "Y" : "N"; + String newStockStatus = isFreezing ? "2" : "1"; // 2:冻结, 1:正常 + + // 获取所有需要处理的货位(包括联查的) + List spacesToProcess = new ArrayList<>(); + spacesToProcess.add(cargoSpace); + + String groupCodingNo = cargoSpace.getGroupCodingNo(); + if (groupCodingNo != null && !groupCodingNo.isEmpty()) { + List groupSpaces = basCargoSpaceService.selectBasCargoSpaceListByGroupCodingNo(groupCodingNo); + for (BasCargoSpace space : groupSpaces) { + if (!space.getCargoSpaceId().equals(cargoSpaceId)) { + spacesToProcess.add(space); + } + } + } + + for (BasCargoSpace space : spacesToProcess) { + if (processedCargoSpaceIds.contains(space.getCargoSpaceId())) { + continue; + } + + // 检查该货位是否有库存 + BasStock queryStock = new BasStock(); + queryStock.setCargoSpaceId(space.getCargoSpaceId()); + List stockList = basStockMapper.selectBasStockList(queryStock); + + // 如果没有库存,则不进行冻结/解冻操作(既不锁货位,也不处理库存) + if (stockList == null || stockList.isEmpty()) { + continue; + } + + // 1. 更新货位锁定状态 + space.setLocked(newLockStatus); + basCargoSpaceService.updateBasCargoSpace(space); + processedCargoSpaceIds.add(space.getCargoSpaceId()); + count++; + + // 2. 处理该货位上的库存 + for (BasStock oldStock : stockList) { + // 构造 newStock 用于传给 insertFreezeRecord + BasStock newStock = new BasStock(); + // 复制必要属性 + newStock.setStockId(oldStock.getStockId()); + newStock.setCargoSpaceId(oldStock.getCargoSpaceId()); + newStock.setTrayCode(oldStock.getTrayCode()); + newStock.setWarehouseId(oldStock.getWarehouseId()); + newStock.setProductId(oldStock.getProductId()); + newStock.setProductName(oldStock.getProductName()); + // 设置新状态 + newStock.setStockStatus(newStockStatus); + + // 调用用户提供的记录方法 (该方法会更新库存状态并插入记录) + insertFreezeRecord(oldStock, newStock); + } + } + } + return count; + } } + diff --git a/ruoyi-ui/src/api/stock/management.js b/ruoyi-ui/src/api/stock/management.js index d265873..2034144 100644 --- a/ruoyi-ui/src/api/stock/management.js +++ b/ruoyi-ui/src/api/stock/management.js @@ -52,6 +52,15 @@ export function updateManagement(data) { }) } +// 冻结/解冻库存 +export function freezeStock(stockIds) { + return request({ + url: '/stock/management/freeze', + method: 'post', + data: stockIds + }) +} + // 删除库存信息 export function delManagement(stockId) { return request({ diff --git a/ruoyi-ui/src/views/search/ViewStockDetail/index.vue b/ruoyi-ui/src/views/search/ViewStockDetail/index.vue index 390635f..9f115a1 100644 --- a/ruoyi-ui/src/views/search/ViewStockDetail/index.vue +++ b/ruoyi-ui/src/views/search/ViewStockDetail/index.vue @@ -74,9 +74,13 @@ - - - + + + + - + @@ -170,7 +178,7 @@ - + diff --git a/ruoyi-ui/src/views/stock/management/index.vue b/ruoyi-ui/src/views/stock/management/index.vue index 4fc1d05..67dfd5e 100644 --- a/ruoyi-ui/src/views/stock/management/index.vue +++ b/ruoyi-ui/src/views/stock/management/index.vue @@ -67,6 +67,17 @@ v-hasPermi="['stock:management:remove']" >删除 + + 冻结/解冻 + - + + + @@ -144,7 +159,7 @@ - + - + @@ -291,7 +306,7 @@