专项优化设备绑定页面查询
This commit is contained in:
parent
f30ffda889
commit
20a148a04e
@ -75,6 +75,13 @@ public class PlatformDeviceMappingController extends BaseController {
|
|||||||
|
|
||||||
// ==================== 子映射管理 ====================
|
// ==================== 子映射管理 ====================
|
||||||
|
|
||||||
|
@PreAuthorize("@ss.hasAnyPermi('platform:deviceMapping:query,platform:deviceMapping:list')")
|
||||||
|
@GetMapping("/sub-mappings/batch")
|
||||||
|
@ApiOperation("批量查询多个设备绑定的子设备映射(列表页展开行一次拉取,避免 N 次请求)")
|
||||||
|
public AjaxResult listSubMappingsBatch(@RequestParam List<Long> parentIds) {
|
||||||
|
return success(subMappingService.selectByParentIds(parentIds));
|
||||||
|
}
|
||||||
|
|
||||||
@PreAuthorize("@ss.hasAnyPermi('platform:deviceMapping:query,platform:deviceMapping:list')")
|
@PreAuthorize("@ss.hasAnyPermi('platform:deviceMapping:query,platform:deviceMapping:list')")
|
||||||
@GetMapping("/{id}/sub-mappings")
|
@GetMapping("/{id}/sub-mappings")
|
||||||
@ApiOperation("查询子设备映射列表")
|
@ApiOperation("查询子设备映射列表")
|
||||||
|
|||||||
@ -10,6 +10,9 @@ public interface PlatformDeviceSubMappingMapper extends BaseMapperX<PlatformDevi
|
|||||||
|
|
||||||
List<PlatformDeviceSubMapping> selectByParentId(@Param("parentMappingId") Long parentMappingId);
|
List<PlatformDeviceSubMapping> selectByParentId(@Param("parentMappingId") Long parentMappingId);
|
||||||
|
|
||||||
|
/** 批量查询多个父映射下的所有子映射(IN 查询,列表页展开行使用) */
|
||||||
|
List<PlatformDeviceSubMapping> selectByParentIds(@Param("parentIds") List<Long> parentIds);
|
||||||
|
|
||||||
PlatformDeviceSubMapping selectByParentAndSerial(@Param("parentMappingId") Long parentMappingId,
|
PlatformDeviceSubMapping selectByParentAndSerial(@Param("parentMappingId") Long parentMappingId,
|
||||||
@Param("subSerialNumber") String subSerialNumber);
|
@Param("subSerialNumber") String subSerialNumber);
|
||||||
|
|
||||||
|
|||||||
@ -4,12 +4,16 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||||||
import com.fastbee.iot.platform.domain.PlatformDeviceSubMapping;
|
import com.fastbee.iot.platform.domain.PlatformDeviceSubMapping;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface IPlatformDeviceSubMappingService extends IService<PlatformDeviceSubMapping> {
|
public interface IPlatformDeviceSubMappingService extends IService<PlatformDeviceSubMapping> {
|
||||||
|
|
||||||
/** 查询父映射下的所有子映射 */
|
/** 查询父映射下的所有子映射 */
|
||||||
List<PlatformDeviceSubMapping> selectByParentId(Long parentMappingId);
|
List<PlatformDeviceSubMapping> selectByParentId(Long parentMappingId);
|
||||||
|
|
||||||
|
/** 批量查询多个父映射下的子映射,按 parentMappingId 分组返回(列表页展开行一次拉取,避免 N 次请求) */
|
||||||
|
Map<Long, List<PlatformDeviceSubMapping>> selectByParentIds(List<Long> parentIds);
|
||||||
|
|
||||||
/** 根据子设备序列号查找子映射(推送时使用) */
|
/** 根据子设备序列号查找子映射(推送时使用) */
|
||||||
List<PlatformDeviceSubMapping> selectBySubSerialNumber(String subSerialNumber);
|
List<PlatformDeviceSubMapping> selectBySubSerialNumber(String subSerialNumber);
|
||||||
|
|
||||||
|
|||||||
@ -3,6 +3,8 @@ package com.fastbee.iot.platform.service.impl;
|
|||||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
|
import com.fastbee.iot.domain.Device;
|
||||||
|
import com.fastbee.iot.mapper.DeviceMapper;
|
||||||
import com.fastbee.iot.platform.domain.*;
|
import com.fastbee.iot.platform.domain.*;
|
||||||
import com.fastbee.iot.platform.flow.FlowContext;
|
import com.fastbee.iot.platform.flow.FlowContext;
|
||||||
import com.fastbee.iot.platform.flow.PlatformFlowExecutor;
|
import com.fastbee.iot.platform.flow.PlatformFlowExecutor;
|
||||||
@ -21,6 +23,7 @@ import org.springframework.util.StringUtils;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -41,6 +44,8 @@ public class PlatformDeviceMappingServiceImpl extends ServiceImpl<PlatformDevice
|
|||||||
private IPlatformDeviceSubMappingService subMappingService;
|
private IPlatformDeviceSubMappingService subMappingService;
|
||||||
@Autowired
|
@Autowired
|
||||||
private PlatformUserAuthMapper platformUserAuthMapper;
|
private PlatformUserAuthMapper platformUserAuthMapper;
|
||||||
|
@Autowired
|
||||||
|
private DeviceMapper deviceMapper;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PlatformDeviceMapping> selectList(PlatformDeviceMapping query) {
|
public List<PlatformDeviceMapping> selectList(PlatformDeviceMapping query) {
|
||||||
@ -58,7 +63,25 @@ public class PlatformDeviceMappingServiceImpl extends ServiceImpl<PlatformDevice
|
|||||||
.eq(query.getNetStatus() != null, PlatformDeviceMapping::getNetStatus, query.getNetStatus())
|
.eq(query.getNetStatus() != null, PlatformDeviceMapping::getNetStatus, query.getNetStatus())
|
||||||
.eq(StringUtils.hasText(query.getEnable()), PlatformDeviceMapping::getEnable, query.getEnable())
|
.eq(StringUtils.hasText(query.getEnable()), PlatformDeviceMapping::getEnable, query.getEnable())
|
||||||
.orderByDesc(PlatformDeviceMapping::getCreateTime);
|
.orderByDesc(PlatformDeviceMapping::getCreateTime);
|
||||||
return this.list(wrapper);
|
List<PlatformDeviceMapping> rows = this.list(wrapper);
|
||||||
|
// 批量补全设备名称:device_name 为冗余字段,旧数据可能为空,按 deviceId 一次 IN 查询回填,避免前端逐个查询
|
||||||
|
List<Long> deviceIds = rows.stream()
|
||||||
|
.filter(m -> m.getDeviceId() != null && !StringUtils.hasText(m.getDeviceName()))
|
||||||
|
.map(PlatformDeviceMapping::getDeviceId)
|
||||||
|
.distinct()
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (!deviceIds.isEmpty()) {
|
||||||
|
List<Device> devices = deviceMapper.selectList(Wrappers.<Device>lambdaQuery()
|
||||||
|
.in(Device::getDeviceId, deviceIds));
|
||||||
|
Map<Long, String> nameMap = devices.stream()
|
||||||
|
.collect(Collectors.toMap(Device::getDeviceId, Device::getDeviceName, (a, b) -> a));
|
||||||
|
rows.forEach(m -> {
|
||||||
|
if (m.getDeviceId() != null && !StringUtils.hasText(m.getDeviceName())) {
|
||||||
|
m.setDeviceName(nameMap.get(m.getDeviceId()));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@ -8,7 +8,11 @@ import org.springframework.beans.factory.annotation.Autowired;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@ -24,6 +28,25 @@ public class PlatformDeviceSubMappingServiceImpl extends ServiceImpl<PlatformDev
|
|||||||
return subMappingMapper.selectByParentId(parentMappingId);
|
return subMappingMapper.selectByParentId(parentMappingId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<Long, List<PlatformDeviceSubMapping>> selectByParentIds(List<Long> parentIds) {
|
||||||
|
if (parentIds == null || parentIds.isEmpty()) {
|
||||||
|
return Collections.emptyMap();
|
||||||
|
}
|
||||||
|
List<PlatformDeviceSubMapping> all = subMappingMapper.selectByParentIds(parentIds);
|
||||||
|
Map<Long, List<PlatformDeviceSubMapping>> grouped = new HashMap<>();
|
||||||
|
for (PlatformDeviceSubMapping sub : all) {
|
||||||
|
Long pid = sub.getParentMappingId();
|
||||||
|
if (pid == null) continue;
|
||||||
|
grouped.computeIfAbsent(pid, k -> new ArrayList<>()).add(sub);
|
||||||
|
}
|
||||||
|
// 保证请求的每个 parentId 都有 key,即便没有子映射也返回空列表,避免前端取到 undefined
|
||||||
|
for (Long pid : parentIds) {
|
||||||
|
grouped.putIfAbsent(pid, new ArrayList<>());
|
||||||
|
}
|
||||||
|
return grouped;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PlatformDeviceSubMapping> selectBySubSerialNumber(String subSerialNumber) {
|
public List<PlatformDeviceSubMapping> selectBySubSerialNumber(String subSerialNumber) {
|
||||||
return subMappingMapper.selectBySubSerialNumber(subSerialNumber);
|
return subMappingMapper.selectBySubSerialNumber(subSerialNumber);
|
||||||
|
|||||||
@ -20,4 +20,14 @@
|
|||||||
WHERE sub_serial_number = #{subSerialNumber}
|
WHERE sub_serial_number = #{subSerialNumber}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<!-- 批量查询多个父映射下的子映射,按 parent_mapping_id 分组,前端列表展开行一次拉取 -->
|
||||||
|
<select id="selectByParentIds" resultType="com.fastbee.iot.platform.domain.PlatformDeviceSubMapping">
|
||||||
|
SELECT * FROM platform_device_sub_mapping
|
||||||
|
WHERE parent_mapping_id IN
|
||||||
|
<foreach collection="parentIds" item="pid" open="(" separator="," close=")">
|
||||||
|
#{pid}
|
||||||
|
</foreach>
|
||||||
|
ORDER BY parent_mapping_id ASC, id ASC
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@ -28,6 +28,11 @@ export function listSubMappings(parentId) {
|
|||||||
return request({ url: `/platform/device-mapping/${parentId}/sub-mappings`, method: 'get' })
|
return request({ url: `/platform/device-mapping/${parentId}/sub-mappings`, method: 'get' })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 批量查询多个设备绑定的子设备映射,列表页展开行一次拉取,避免 N 次请求
|
||||||
|
export function listSubMappingsBatch(parentIds) {
|
||||||
|
return request({ url: '/platform/device-mapping/sub-mappings/batch', method: 'get', params: { parentIds: parentIds.join(',') } })
|
||||||
|
}
|
||||||
|
|
||||||
export function syncSubMappings(parentId, data) {
|
export function syncSubMappings(parentId, data) {
|
||||||
return request({ url: `/platform/device-mapping/${parentId}/sub-mappings`, method: 'post', data })
|
return request({ url: `/platform/device-mapping/${parentId}/sub-mappings`, method: 'post', data })
|
||||||
}
|
}
|
||||||
|
|||||||
@ -335,7 +335,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { listPlatformDeviceMapping, addPlatformDeviceMapping, updatePlatformDeviceMapping, delPlatformDeviceMapping, onboardDevice, listSubMappings, syncSubMappings } from '@/api/platform/deviceMapping'
|
import { listPlatformDeviceMapping, addPlatformDeviceMapping, updatePlatformDeviceMapping, delPlatformDeviceMapping, onboardDevice, listSubMappings, listSubMappingsBatch, syncSubMappings } from '@/api/platform/deviceMapping'
|
||||||
import { listPlatformInstance } from '@/api/platform/instance'
|
import { listPlatformInstance } from '@/api/platform/instance'
|
||||||
import { getInitializedUsers, getProjectsByUserAuthId } from '@/api/platform/userAuth'
|
import { getInitializedUsers, getProjectsByUserAuthId } from '@/api/platform/userAuth'
|
||||||
import { listPlatformInterface } from '@/api/platform/interface'
|
import { listPlatformInterface } from '@/api/platform/interface'
|
||||||
@ -425,25 +425,15 @@ export default {
|
|||||||
this.loading = true
|
this.loading = true
|
||||||
listPlatformDeviceMapping(this.queryParams).then(res => {
|
listPlatformDeviceMapping(this.queryParams).then(res => {
|
||||||
this.list = res.rows; this.total = res.total; this.loading = false
|
this.list = res.rows; this.total = res.total; this.loading = false
|
||||||
// 加载设备名称映射
|
// deviceName 由后端列表查询批量补全,前端无需再逐个 getDevice(N→0)
|
||||||
const ids = [...new Set(res.rows.map(r => r.deviceId).filter(Boolean))]
|
// 预加载网关设备的子映射(批量一次拉取,避免 N 次请求)
|
||||||
if (ids.length) {
|
this.subMappingCache = {}
|
||||||
Promise.all(ids.map(id => getDevice(id).catch(() => null))).then(results => {
|
const gatewayIds = res.rows.filter(r => r.deviceType === 1).map(r => r.id).filter(Boolean)
|
||||||
const map = {}
|
if (gatewayIds.length) {
|
||||||
results.forEach(res => {
|
listSubMappingsBatch(gatewayIds).then(subRes => {
|
||||||
const d = res && (res.data || res)
|
this.subMappingCache = subRes.data || {}
|
||||||
if (d && d.deviceId) map[d.deviceId] = d.deviceName
|
|
||||||
})
|
|
||||||
this.deviceMap = map
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
// 预加载网关设备的子映射
|
|
||||||
this.subMappingCache = {}
|
|
||||||
res.rows.filter(r => r.deviceType === 1).forEach(row => {
|
|
||||||
listSubMappings(row.id).then(subRes => {
|
|
||||||
this.$set(this.subMappingCache, row.id, subRes.data || [])
|
|
||||||
})
|
|
||||||
})
|
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
platformName(id) { const p = this.platformList.find(x => x.id === id); return p ? p.name : id },
|
platformName(id) { const p = this.platformList.find(x => x.id === id); return p ? p.name : id },
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user