ソースを参照

fix: 库存列表/日志/上货记录三页面设备名称未显示

根因: getPage 方法只查单表 (t_device_inventory/t_inventory_log/
t_stock_record),未 join t_device,导致 deviceName 始终为空。

修复:
1. 三个实体新增 @TableField(exist=false) deviceName 字段
2. 三个 getPage 查询后批量收集 deviceId → 一次 SQL 查 t_device
   → 构建 Map → 逐条填充 deviceName
3. 每页只需额外 1 次 SQL,避免 N+1 问题

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline 1 週間 前
コミット
cffda51a33

+ 6 - 0
haha-entity/src/main/java/com/haha/entity/DeviceInventory.java

@@ -87,4 +87,10 @@ public class DeviceInventory implements Serializable {
      */
     @Version
     private Integer version;
+
+    /**
+     * 设备名称(非数据库字段,查询时填充)
+     */
+    @TableField(exist = false)
+    private String deviceName;
 }

+ 7 - 0
haha-entity/src/main/java/com/haha/entity/InventoryLog.java

@@ -1,6 +1,7 @@
 package com.haha.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -103,4 +104,10 @@ public class InventoryLog implements Serializable {
      */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private LocalDateTime createTime;
+
+    /**
+     * 设备名称(非数据库字段,查询时填充)
+     */
+    @TableField(exist = false)
+    private String deviceName;
 }

+ 7 - 0
haha-entity/src/main/java/com/haha/entity/StockRecord.java

@@ -1,6 +1,7 @@
 package com.haha.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -96,4 +97,10 @@ public class StockRecord implements Serializable {
      */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
     private LocalDateTime updateTime;
+
+    /**
+     * 设备名称(非数据库字段,查询时填充)
+     */
+    @TableField(exist = false)
+    private String deviceName;
 }

+ 25 - 1
haha-service/src/main/java/com/haha/service/impl/DeviceInventoryServiceImpl.java

@@ -5,10 +5,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.haha.common.exception.BusinessException;
+import com.haha.entity.Device;
 import com.haha.entity.DeviceInventory;
 import com.haha.entity.InventoryLog;
 import com.haha.entity.dto.InventoryQueryDTO;
 import com.haha.mapper.DeviceInventoryMapper;
+import com.haha.mapper.DeviceMapper;
 import com.haha.service.DeviceInventoryService;
 import com.haha.service.InventoryLogService;
 import lombok.RequiredArgsConstructor;
@@ -35,6 +37,8 @@ public class DeviceInventoryServiceImpl extends ServiceImpl<DeviceInventoryMappe
 
     private final InventoryLogService inventoryLogService;
 
+    private final DeviceMapper deviceMapper;
+
     @Override
     public IPage<DeviceInventory> getPage(int page, int pageSize, InventoryQueryDTO queryDTO) {
         LambdaQueryWrapper<DeviceInventory> wrapper = new LambdaQueryWrapper<>();
@@ -57,7 +61,27 @@ public class DeviceInventoryServiceImpl extends ServiceImpl<DeviceInventoryMappe
         // 按更新时间倒序
         wrapper.orderByDesc(DeviceInventory::getUpdateTime);
 
-        return page(new Page<>(page, pageSize), wrapper);
+        IPage<DeviceInventory> result = page(new Page<>(page, pageSize), wrapper);
+        fillDeviceNames(result.getRecords());
+        return result;
+    }
+
+    private void fillDeviceNames(List<DeviceInventory> records) {
+        if (records == null || records.isEmpty()) return;
+        List<String> ids = records.stream()
+                .map(DeviceInventory::getDeviceId)
+                .filter(id -> id != null && !id.isEmpty())
+                .distinct()
+                .collect(java.util.stream.Collectors.toList());
+        if (ids.isEmpty()) return;
+        List<Device> devices = deviceMapper.selectList(
+                new LambdaQueryWrapper<Device>().in(Device::getDeviceId, ids));
+        if (devices == null) return;
+        java.util.Map<String, String> nameMap = devices.stream()
+                .collect(java.util.stream.Collectors.toMap(Device::getDeviceId, d -> d.getName() != null ? d.getName() : "", (a, b) -> a));
+        for (DeviceInventory r : records) {
+            r.setDeviceName(nameMap.getOrDefault(r.getDeviceId(), ""));
+        }
     }
 
     @Override

+ 25 - 1
haha-service/src/main/java/com/haha/service/impl/InventoryLogServiceImpl.java

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.haha.entity.Device;
 import com.haha.entity.InventoryLog;
 import com.haha.entity.dto.InventoryLogQueryDTO;
+import com.haha.mapper.DeviceMapper;
 import com.haha.mapper.InventoryLogMapper;
 import com.haha.service.InventoryLogService;
 import lombok.RequiredArgsConstructor;
@@ -28,6 +30,8 @@ public class InventoryLogServiceImpl extends ServiceImpl<InventoryLogMapper, Inv
 
     private final InventoryLogMapper inventoryLogMapper;
 
+    private final DeviceMapper deviceMapper;
+
     @Override
     public IPage<InventoryLog> getPage(int page, int pageSize, InventoryLogQueryDTO queryDTO) {
         LambdaQueryWrapper<InventoryLog> wrapper = new LambdaQueryWrapper<>();
@@ -63,7 +67,27 @@ public class InventoryLogServiceImpl extends ServiceImpl<InventoryLogMapper, Inv
         // 按创建时间倒序
         wrapper.orderByDesc(InventoryLog::getCreateTime);
 
-        return page(new Page<>(page, pageSize), wrapper);
+        IPage<InventoryLog> result = page(new Page<>(page, pageSize), wrapper);
+        fillDeviceNames(result.getRecords());
+        return result;
+    }
+
+    private void fillDeviceNames(List<InventoryLog> records) {
+        if (records == null || records.isEmpty()) return;
+        List<String> ids = records.stream()
+                .map(InventoryLog::getDeviceId)
+                .filter(id -> id != null && !id.isEmpty())
+                .distinct()
+                .collect(java.util.stream.Collectors.toList());
+        if (ids.isEmpty()) return;
+        List<Device> devices = deviceMapper.selectList(
+                new LambdaQueryWrapper<Device>().in(Device::getDeviceId, ids));
+        if (devices == null) return;
+        java.util.Map<String, String> nameMap = devices.stream()
+                .collect(java.util.stream.Collectors.toMap(Device::getDeviceId, d -> d.getName() != null ? d.getName() : "", (a, b) -> a));
+        for (InventoryLog r : records) {
+            r.setDeviceName(nameMap.getOrDefault(r.getDeviceId(), ""));
+        }
     }
 
     @Override

+ 25 - 1
haha-service/src/main/java/com/haha/service/impl/StockRecordServiceImpl.java

@@ -7,8 +7,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.haha.common.enums.StockRecordStatus;
 import com.haha.common.exception.BusinessException;
+import com.haha.entity.Device;
 import com.haha.entity.StockRecord;
 import com.haha.entity.dto.StockRecordQueryDTO;
+import com.haha.mapper.DeviceMapper;
 import com.haha.mapper.StockRecordMapper;
 import com.haha.service.StockRecordService;
 import lombok.RequiredArgsConstructor;
@@ -31,6 +33,8 @@ public class StockRecordServiceImpl extends ServiceImpl<StockRecordMapper, Stock
 
     private final StockRecordMapper stockRecordMapper;
 
+    private final DeviceMapper deviceMapper;
+
     @Override
     public IPage<StockRecord> getPage(int page, int pageSize, StockRecordQueryDTO queryDTO) {
         LambdaQueryWrapper<StockRecord> wrapper = new LambdaQueryWrapper<>();
@@ -66,7 +70,27 @@ public class StockRecordServiceImpl extends ServiceImpl<StockRecordMapper, Stock
         // 按创建时间倒序
         wrapper.orderByDesc(StockRecord::getCreateTime);
 
-        return page(new Page<>(page, pageSize), wrapper);
+        IPage<StockRecord> result = page(new Page<>(page, pageSize), wrapper);
+        fillDeviceNames(result.getRecords());
+        return result;
+    }
+
+    private void fillDeviceNames(List<StockRecord> records) {
+        if (records == null || records.isEmpty()) return;
+        List<String> ids = records.stream()
+                .map(StockRecord::getDeviceId)
+                .filter(id -> id != null && !id.isEmpty())
+                .distinct()
+                .collect(java.util.stream.Collectors.toList());
+        if (ids.isEmpty()) return;
+        List<Device> devices = deviceMapper.selectList(
+                new LambdaQueryWrapper<Device>().in(Device::getDeviceId, ids));
+        if (devices == null) return;
+        java.util.Map<String, String> nameMap = devices.stream()
+                .collect(java.util.stream.Collectors.toMap(Device::getDeviceId, d -> d.getName() != null ? d.getName() : "", (a, b) -> a));
+        for (StockRecord r : records) {
+            r.setDeviceName(nameMap.getOrDefault(r.getDeviceId(), ""));
+        }
     }
 
     @Override