/* * Copyright (c) 2018-2028, Chill Zhuang All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * Neither the name of the dreamlu.net developer nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * Author: Chill 庄骞 (smallchill@163.com) */ package org.sxkj.fw.device.service.impl; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; import org.sxkj.fw.area.service.IFwAreaDivideService; import org.sxkj.fw.cockpit.vo.AlarmStatisticsVO; import org.sxkj.fw.cockpit.vo.DeviceStatisticsVO; import org.sxkj.fw.common.GenericConverter; import org.sxkj.fw.device.dto.FwDeviceDTO; import org.sxkj.fw.device.dto.FwDevicePolygonQueryDTO; import org.sxkj.fw.device.entity.FwDeviceEntity; import org.sxkj.fw.device.excel.FwDeviceExcel; import org.sxkj.fw.device.mapper.FwDeviceMapper; import org.sxkj.fw.device.param.FwDevicePageParam; import org.sxkj.fw.device.service.IFwDeviceService; import org.sxkj.fw.device.vo.CockpitFwDeviceVO; import org.sxkj.fw.device.vo.DeviceTypeStatisticsVO; import org.sxkj.fw.device.vo.FwDeviceVO; import org.sxkj.fw.device.wrapper.FwDeviceWrapper; import org.sxkj.system.cache.RegionCache; import org.sxkj.system.cache.SysCache; import org.sxkj.system.entity.Region; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 设备表 服务实现类 * * @author aix * @since 2026-01-08 */ @Service public class FwDeviceServiceImpl extends BaseServiceImpl implements IFwDeviceService { @Resource private IFwAreaDivideService fwAreaDivideService; @Override public IPage selectFwDevicePage(IPage page, FwDeviceDTO fwDevice) { return page.setRecords(baseMapper.selectFwDevicePage(page, fwDevice)); } @Override public IPage selectFwDevicePageVo(FwDevicePageParam fwDevice, Query query) { FwDeviceDTO fwDeviceDTO = GenericConverter.convert(fwDevice, FwDeviceDTO.class); // 按当前部门及下级部门范围过滤数据 if (!AuthUtil.isAdministrator()) { List deptList = SysCache.getDeptChildIds(Long.valueOf(AuthUtil.getDeptId())); fwDeviceDTO.setDeptList(deptList); } fwDeviceDTO.setCurrentDeptId(AuthUtil.getDeptId()); // 按区域范围过滤数据 IPage pages = selectFwDevicePage(Condition.getPage(query), fwDeviceDTO); IPage result = FwDeviceWrapper.build().pageVO(pages); List records = result.getRecords(); if (records != null && !records.isEmpty()) { List deviceIds = records.stream() .map(FwDeviceVO::getId) .filter(id -> id != null) .collect(Collectors.toList()); // 批量补充设备关联场景名称 Map sceneNameMap = selectSceneNameByDeviceIds(deviceIds); for (FwDeviceVO record : records) { String sceneName = sceneNameMap.get(record.getId()); record.setSceneName(StringUtil.isBlank(sceneName) ? "/" : sceneName); } } return result; } @Override public List selectFwDeviceList(Integer isAreaSelect, Long areaId, List areaIds, Integer status, Integer isTrack) { return baseMapper.selectFwDeviceList(isAreaSelect, areaId, areaIds, status, isTrack); } @Override public List selectFwDeviceListByPolygons(FwDevicePolygonQueryDTO query) { return baseMapper.selectFwDeviceListByPolygons(query); } @Override public List exportFwDevice(Wrapper queryWrapper) { List fwDeviceList = baseMapper.exportFwDevice(queryWrapper); // fwDeviceList.forEach(fwDevice -> { // fwDevice.setTypeName(DictCache.getValue(DictEnum.YES_NO, FwDevice.getType())); //}); return fwDeviceList; } /** * 获取设备列表 * * @param page * @param fwDevice * @return */ @Override public IPage selectCockpitDevicePage(IPage page, FwDeviceDTO fwDevice) { List cockpitFwDeviceVOS = baseMapper.selectCockpitDevicePage(page, fwDevice); return page.setRecords(cockpitFwDeviceVOS); } /** * 设备类型统计 * * @return */ @Override public List statisticalDeviceType(String regionCode, String currentDeptId) { return baseMapper.statisticalDeviceType(regionCode, currentDeptId, new Date()); } /** * 设备统计 - 按类型统计 * * @return 统计数据 */ @Override public List getDeviceTypeStatistics() { // 统计范围限定在当前部门及下级部门 List deptList = new ArrayList<>(); if (!AuthUtil.isAdministrator()) { deptList = SysCache.getDeptChildIds(Long.valueOf(AuthUtil.getDeptId())); } List deviceTypeStatistics = baseMapper.getDeviceTypeStatistics(deptList, AuthUtil.getDeptId()); return deviceTypeStatistics; } @Override public List getDeviceOutStatistics(String effectiveRangeKmIsNotNull) { // 统计范围限定在当前部门及下级部门 List deptList = new ArrayList<>(); if (!AuthUtil.isAdministrator()) { deptList = SysCache.getDeptChildIds(Long.valueOf(AuthUtil.getDeptId())); } return baseMapper.getDeviceOutStatistics(effectiveRangeKmIsNotNull, deptList, AuthUtil.getDeptId()); } @Override public List getDeviceManufacturerStatistics() { // 统计范围限定在当前部门及下级部门 List deptList = new ArrayList<>(); if (!AuthUtil.isAdministrator()) { deptList = SysCache.getDeptChildIds(Long.valueOf(AuthUtil.getDeptId())); } return baseMapper.getDeviceManufacturerStatistics(deptList, AuthUtil.getDeptId()); } /** * 设备属性统计 * * @return */ @Override public AlarmStatisticsVO statisticalDeviceAtt(String regionCode, String currentDeptId) { return baseMapper.statisticalDeviceAtt(regionCode, currentDeptId, new Date()); } @Override public Map selectSceneNameByDeviceIds(List deviceIds) { return fwAreaDivideService.selectSceneNameByDeviceIds(deviceIds); } @Override public boolean existsAreaBindByDeviceId(Long deviceId) { return fwAreaDivideService.existsAreaByDeviceId(deviceId); } @Override public String selectAreaBindNameByDeviceId(Long deviceId) { return fwAreaDivideService.selectAreaNameByDeviceId(deviceId); } /** * 保存或更新设备信息 * * @param fwDeviceEntity * @return */ @Override public boolean saveOrUpdateDevice(FwDeviceEntity fwDeviceEntity) { // 无效范围时清空坐标,避免显示无意义位置 if (fwDeviceEntity.getEffectiveRangeKm() == null || fwDeviceEntity.getEffectiveRangeKm().compareTo(BigDecimal.ZERO) == 0) { fwDeviceEntity.setLatitude(""); fwDeviceEntity.setLongitude(""); } return saveOrUpdate(fwDeviceEntity); } @Override public boolean updateTrackStatusByDeviceId(Long deviceId, Integer trackStatus, String outTarget, String outTargetCode) { return baseMapper.updateTrackStatusByDeviceId(deviceId, trackStatus, outTarget, outTargetCode) > 0; } /** * 查询非本部门区域的设备 * * @param regionCode 区域编码,用于查询不在该区域内的设备 * @param deptId 机构ID,用于限定查询范围 * @return 设备列表 */ @Override public List getNonDeptAreaDevices(String regionCode, String deptId) { // 1. 根据区域编码获取区域名称 Region region = RegionCache.getByCode(regionCode); String regionName = region != null ? region.getName() : null; // 2. 查询不在这些部门区域内的设备 List deviceList = baseMapper.selectNonDeptAreaDevices(regionName, deptId); return deviceList; } @Override public List getDeviceStatistics(FwDeviceDTO fwDeviceDTO) { return baseMapper.getDeviceStatistics(fwDeviceDTO); } }