Commit 3330a43c57ac8cd1faf50b09d06b84db3245f901

Authored by 易文鹏
1 parent abbe2e07

feat:优化呆滞库存查询效率

src/main/java/com/huaheng/pc/config/material/service/MaterialService.java
... ... @@ -8,8 +8,10 @@ import com.baomidou.mybatisplus.extension.service.IService;
8 8 import com.huaheng.pc.config.material.domain.bo.MaterialComputeVariableBO;
9 9 import com.huaheng.pc.inventory.inventoryTransaction.domain.InventoryTransaction;
10 10  
  11 +import java.util.Collection;
11 12 import java.util.List;
12 13 import java.util.Map;
  14 +import java.util.Set;
13 15  
14 16 public interface MaterialService extends IService<Material> {
15 17  
... ...
src/main/java/com/huaheng/pc/inventory/inventoryDetail/service/InventoryDetailServiceImpl.java
... ... @@ -34,11 +34,14 @@ import org.springframework.stereotype.Service;
34 34 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
35 35 import com.huaheng.pc.inventory.inventoryDetail.mapper.InventoryDetailMapper;
36 36 import org.springframework.transaction.annotation.Transactional;
  37 +import org.springframework.util.CollectionUtils;
37 38  
38 39 import javax.annotation.Resource;
39 40 import java.lang.reflect.InvocationTargetException;
40 41 import java.math.BigDecimal;
41 42 import java.util.*;
  43 +import java.util.function.Function;
  44 +import java.util.stream.Collectors;
42 45  
43 46 @Service
44 47 public class InventoryDetailServiceImpl extends ServiceImpl<InventoryDetailMapper, InventoryDetail> implements InventoryDetailService {
... ... @@ -279,59 +282,66 @@ public class InventoryDetailServiceImpl extends ServiceImpl&lt;InventoryDetailMappe
279 282 public List<InventoryDetail> expiringInventoryHandle(List<InventoryDetail> inventoryDetails, String expiring) {
280 283 // 获取库存呆滞时间配置
281 284 int days = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME));
282   - int days_batch = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME_BATCH));
283   - int days_flammable = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME_FLAMMABLE));
  285 + int daysBatch = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME_BATCH));
  286 + int daysFlammable = Integer.parseInt(configService.getKey(QuantityConstant.DEAD_TIME_FLAMMABLE));
  287 +
284 288 // 如果 inventoryDetails 为空,直接返回空列表
285   - if (inventoryDetails == null || inventoryDetails.isEmpty()) {
  289 + if (CollectionUtils.isEmpty(inventoryDetails)) {
286 290 return Collections.emptyList();
287 291 }
288   - // 初始化返回的库存列表
289   - List<InventoryDetail> returnInventory = new ArrayList<>();
290   - // 初始化呆滞库存和非呆滞库存列表
291   - List<InventoryDetail> expiringInventory = new ArrayList<>();
292   - List<InventoryDetail> noExpiringInventory = new ArrayList<>();
293   -
294   - // 遍历库存明细
295   - for (InventoryDetail inventoryDetail : inventoryDetails) {
  292 +
  293 + // 获取所有物料编码
  294 + Set<String> materialCodes = inventoryDetails.stream()
  295 + .map(InventoryDetail::getMaterialCode)
  296 + .collect(Collectors.toSet());
  297 +
  298 + // 批量查询物料信息
  299 + List<Material> materials = getMaterialsByCodes(materialCodes);
  300 +
  301 + // 创建物料编码和物料对象的映射关系
  302 + Map<String, Material> materialMap = new HashMap<>();
  303 + for (Material material : materials) {
  304 + materialMap.put(material.getCode(), material);
  305 + }
  306 +
  307 + return inventoryDetails.stream().collect(Collectors.partitioningBy(inventoryDetail -> {
296 308 // 计算库存的更新时间和当前时间之间的差距
297 309 long difference = DateUtils.difference(DateUtils.getNowDate(), inventoryDetail.getLastUpdated());
298   - Material material = materialService.getMaterialByCode(inventoryDetail.getMaterialCode());
  310 +
  311 + // 从 Map 中获取物料信息
  312 + Material material = materialMap.get(inventoryDetail.getMaterialCode());
  313 + if (material == null) {
  314 + return false;
  315 + }
299 316  
300 317 int materialDays = days;
301   - if (StringUtils.isNotEmpty(material.getIsFlammable()) && material.getIsFlammable().equals("是")) {
302   - materialDays = Math.min(materialDays, days_flammable);
303   - } else if (StringUtils.isNotEmpty(material.getIsBatch()) && material.getIsBatch().equals("是")) {
304   - materialDays = Math.min(materialDays, days_batch);
  318 + if (Objects.equals(material.getIsFlammable(), "是")) {
  319 + materialDays = Math.min(materialDays, daysFlammable);
  320 + } else if (Objects.equals(material.getIsBatch(), "是")) {
  321 + materialDays = Math.min(materialDays, daysBatch);
305 322 }
  323 +
306 324 // 计算呆滞时长
307 325 int differenceDay = DateUtils.secondToDays(difference);
308 326 int num = differenceDay - materialDays;
309   - // 根据呆滞时长将库存明细添加到相应列表
  327 +
  328 + // 判断是否为呆滞库存
310 329 if (num > 0) {
311 330 inventoryDetail.setDeadTime(num + "天");
312   - expiringInventory.add(inventoryDetail);
313   - } else {
314   - noExpiringInventory.add(inventoryDetail);
  331 + return true;
315 332 }
316   - }
317   -
  333 + return false;
  334 + })).getOrDefault(expiring.equals("1"), Collections.emptyList());
  335 + }
318 336  
319   - switch (expiring) {
320   - //呆滞库存
321   - case "1":
322   - returnInventory.addAll(expiringInventory);
323   - break;
324   - case "2":
325   - //未呆滞库存
326   - returnInventory.addAll(noExpiringInventory);
327   - break;
328   - default:
329   - //全部库存
330   - returnInventory.addAll(expiringInventory);
331   - returnInventory.addAll(noExpiringInventory);
332   - break;
  337 + public List<Material> getMaterialsByCodes(Set<String> materialCodes) {
  338 + if (CollectionUtils.isEmpty(materialCodes)) {
  339 + return Collections.emptyList();
333 340 }
334   - return returnInventory;
  341 + //in 方法进行批量查询
  342 + LambdaQueryWrapper<Material> queryWrapper = new LambdaQueryWrapper<>();
  343 + queryWrapper.in(Material::getCode, materialCodes);
  344 + return materialService.list(queryWrapper);
335 345 }
336 346  
337 347 @Override
... ...