648540858
2023-05-15 5d400804683866d57136331d257b6e282f280cb7
优化部分sql实现
25个文件已修改
1 文件已重命名
306 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/bean/ResourceBaseInfo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/bean/ResourceInfo.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/gb28181/bean/DeviceChannel.java
@@ -172,7 +172,7 @@
     * 遇到过NVR下的IPC下发信令可以推流, 但是 Status 响应 OFF
     */
    @Schema(description = "在线/离线, 1在线,0离线")
    private int status;
    private boolean status;
    /**
     * 经度
@@ -455,11 +455,11 @@
        this.PTZTypeText = PTZTypeText;
    }
    public int getStatus() {
    public boolean isStatus() {
        return status;
    }
    public void setStatus(int status) {
    public void setStatus(boolean status) {
        this.status = status;
    }
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
@@ -66,7 +66,7 @@
     * @param fromTag
     * @return
     */
    void deviceStatusResponse(ParentPlatform parentPlatform,String channelId, String sn, String fromTag,int status) throws SipException, InvalidArgumentException, ParseException;
    void deviceStatusResponse(ParentPlatform parentPlatform,String channelId, String sn, String fromTag,boolean status) throws SipException, InvalidArgumentException, ParseException;
    /**
     * 向上级回复移动位置订阅消息
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/impl/SIPCommanderFroPlatform.java
@@ -221,7 +221,7 @@
                if (!channel.getChannelId().equals(parentPlatform.getDeviceGBId())) {
                    catalogXml.append("<Parental>" + channel.getParental() + "</Parental>\r\n");
                    if (channel.getParental() == 0) {
                        catalogXml.append("<Status>" + (channel.getStatus() == 0 ? "OFF" : "ON") + "</Status>\r\n");
                        catalogXml.append("<Status>" + (channel.isStatus() ? "ON" : "OFF") + "</Status>\r\n");
                    }
                }
                if (channel.getParental() == 0) {
@@ -250,7 +250,7 @@
                        catalogXml.append("<Port>" + channel.getPort() + "</Port>\r\n");
                        catalogXml.append("<Password>" + channel.getPort() + "</Password>\r\n");
                        catalogXml.append("<PTZType>" + channel.getPTZType() + "</PTZType>\r\n");
                        catalogXml.append("<Status>" + (channel.getStatus() == 1?"ON":"OFF") + "</Status>\r\n");
                        catalogXml.append("<Status>" + (channel.isStatus() ? "ON":"OFF") + "</Status>\r\n");
                        catalogXml.append("<Longitude>" +
                                (channel.getLongitudeWgs84() != 0? channel.getLongitudeWgs84():channel.getLongitude())
                                + "</Longitude>\r\n");
@@ -377,11 +377,11 @@
     * @return
     */
    @Override
    public void deviceStatusResponse(ParentPlatform parentPlatform,String channelId, String sn, String fromTag,int status) throws SipException, InvalidArgumentException, ParseException {
    public void deviceStatusResponse(ParentPlatform parentPlatform,String channelId, String sn, String fromTag,boolean status) throws SipException, InvalidArgumentException, ParseException {
        if (parentPlatform == null) {
            return ;
        }
        String statusStr = (status==1)?"ONLINE":"OFFLINE";
        String statusStr = (status)?"ONLINE":"OFFLINE";
        String characterSet = parentPlatform.getCharacterSet();
        StringBuffer deviceStatusXml = new StringBuffer(600);
        deviceStatusXml.append("<?xml version=\"1.0\" encoding=\"" + characterSet + "\"?>\r\n")
@@ -542,7 +542,7 @@
                    catalogXml.append("<Manufacturer>" + channel.getManufacture() + "</Manufacturer>\r\n")
                            .append("<Secrecy>" + channel.getSecrecy() + "</Secrecy>\r\n")
                            .append("<RegisterWay>" + channel.getRegisterWay() + "</RegisterWay>\r\n")
                            .append("<Status>" + (channel.getStatus() == 0 ? "OFF" : "ON") + "</Status>\r\n");
                            .append("<Status>" + (channel.isStatus() ? "ON" : "OFF") + "</Status>\r\n");
                    if (channel.getChannelType() != 2) {  // 业务分组/虚拟组织/行政区划 不设置以下属性
                        catalogXml.append("<Model>" + channel.getModel() + "</Model>\r\n")
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/message/query/cmd/DeviceStatusQueryMessageHandler.java
@@ -77,7 +77,7 @@
            return;
        }
        try {
            cmderFroPlatform.deviceStatusResponse(parentPlatform,channelId, sn, fromHeader.getTag(),deviceChannel.getStatus());
            cmderFroPlatform.deviceStatusResponse(parentPlatform,channelId, sn, fromHeader.getTag(),deviceChannel.isStatus());
        } catch (SipException | InvalidArgumentException | ParseException e) {
            logger.error("[命令发送失败] 国标级联 DeviceStatus查询回复: {}", e.getMessage());
        }
src/main/java/com/genersoft/iot/vmp/gb28181/utils/XmlUtil.java
@@ -255,7 +255,7 @@
        }
        if (channelType.equals(ChannelType.CivilCode)) {
            // 行政区划其他字段没必要识别了,默认在线即可
            deviceChannel.setStatus(1);
            deviceChannel.setStatus(true);
            deviceChannel.setParental(1);
            deviceChannel.setCreateTime(DateUtil.getNow());
            deviceChannel.setUpdateTime(DateUtil.getNow());
@@ -309,7 +309,7 @@
        deviceChannel.setBusinessGroupId(businessGroupID);
        if (channelType.equals(ChannelType.BusinessGroup) || channelType.equals(ChannelType.VirtualOrganization)) {
            // 业务分组和虚拟组织 其他字段没必要识别了,默认在线即可
            deviceChannel.setStatus(1);
            deviceChannel.setStatus(true);
            deviceChannel.setParental(1);
            deviceChannel.setCreateTime(DateUtil.getNow());
            deviceChannel.setUpdateTime(DateUtil.getNow());
@@ -322,13 +322,13 @@
            String status = statusElement.getTextTrim().trim();
            // ONLINE OFFLINE HIKVISION DS-7716N-E4 NVR的兼容性处理
            if (status.equals("ON") || status.equals("On") || status.equals("ONLINE") || status.equals("OK")) {
                deviceChannel.setStatus(1);
                deviceChannel.setStatus(true);
            }
            if (status.equals("OFF") || status.equals("Off") || status.equals("OFFLINE")) {
                deviceChannel.setStatus(0);
                deviceChannel.setStatus(false);
            }
        }else {
            deviceChannel.setStatus(1);
            deviceChannel.setStatus(true);
        }
        // 识别自带的目录标识
        String parental = XmlUtil.getText(itemDevice, "Parental");
src/main/java/com/genersoft/iot/vmp/service/IDeviceChannelService.java
@@ -2,7 +2,7 @@
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
import java.util.List;
@@ -38,7 +38,7 @@
     * 获取统计信息
     * @return
     */
    ResourceBaceInfo getOverview();
    ResourceBaseInfo getOverview();
    /**
     * 查询所有未分配的通道
src/main/java/com/genersoft/iot/vmp/service/IDeviceService.java
@@ -5,7 +5,7 @@
import com.genersoft.iot.vmp.gb28181.bean.SipTransactionInfo;
import com.genersoft.iot.vmp.gb28181.bean.SyncStatus;
import com.genersoft.iot.vmp.vmanager.bean.BaseTree;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import java.util.List;
@@ -162,7 +162,7 @@
     * 获取统计信息
     * @return
     */
    ResourceBaceInfo getOverview();
    ResourceBaseInfo getOverview();
    /**
     * 获取所有设备
src/main/java/com/genersoft/iot/vmp/service/IStreamProxyService.java
@@ -4,7 +4,7 @@
import com.genersoft.iot.vmp.common.StreamInfo;
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import com.github.pagehelper.PageInfo;
public interface IStreamProxyService {
@@ -108,6 +108,6 @@
     * 获取统计信息
     * @return
     */
    ResourceBaceInfo getOverview();
    ResourceBaseInfo getOverview();
}
src/main/java/com/genersoft/iot/vmp/service/IStreamPushService.java
@@ -5,7 +5,7 @@
import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import com.github.pagehelper.PageInfo;
import java.util.List;
@@ -113,5 +113,5 @@
     * 获取统计信息
     * @return
     */
    ResourceBaceInfo getOverview();
    ResourceBaseInfo getOverview();
}
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceChannelServiceImpl.java
@@ -11,7 +11,7 @@
import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -175,8 +175,12 @@
    }
    @Override
    public ResourceBaceInfo getOverview() {
        return channelMapper.getOverview();
    public ResourceBaseInfo getOverview() {
        int online = channelMapper.getOnlineCount();
        int total = channelMapper.getAllChannelCount();
        return new ResourceBaseInfo(total, online);
    }
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
@@ -20,7 +20,7 @@
import com.genersoft.iot.vmp.storager.dao.PlatformChannelMapper;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.vmanager.bean.BaseTree;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -652,8 +652,10 @@
    }
    @Override
    public ResourceBaceInfo getOverview() {
        return deviceMapper.getOverview();
    public ResourceBaseInfo getOverview() {
        List<Device> onlineDevices = deviceMapper.getOnlineDevices();
        List<Device> all = deviceMapper.getAll();
        return new ResourceBaseInfo(all.size(), onlineDevices.size());
    }
    @Override
src/main/java/com/genersoft/iot/vmp/service/impl/GbStreamServiceImpl.java
@@ -110,7 +110,7 @@
        deviceChannel.setLatitude(gbStream.getLatitude());
        deviceChannel.setDeviceId(platform.getDeviceGBId());
        deviceChannel.setManufacture("wvp-pro");
        deviceChannel.setStatus(gbStream.isStatus()?1:0);
        deviceChannel.setStatus(gbStream.isStatus());
        deviceChannel.setRegisterWay(1);
        deviceChannel.setCivilCode(platform.getAdministrativeDivision());
@@ -218,7 +218,7 @@
        }else {
            status = gbStreamMapper.selectStatusForPush(gbStream.getApp(), gbStream.getStream());
        }
        deviceChannel.setStatus((status != null && status )?1:0);
        deviceChannel.setStatus(status != null && status);
        deviceChannel.setRegisterWay(1);
        deviceChannel.setCivilCode(platform.getAdministrativeDivision());
src/main/java/com/genersoft/iot/vmp/service/impl/MediaServerServiceImpl.java
@@ -685,7 +685,7 @@
            // 缓存不存在,从数据库查询,如果数据库不存在则是错误的
            mediaServerItem = getOneFromDatabase(mediaServerId);
            if (mediaServerItem == null) {
                logger.warn("[更新ZLM 保活信息]失败,未找到流媒体信息");
                logger.warn("[更新ZLM 保活信息] 流媒体{}尚未加入使用,请检查节点中是否含有此流媒体 ", mediaServerId);
                return;
            }
            // zlm连接重试
src/main/java/com/genersoft/iot/vmp/service/impl/StreamProxyServiceImpl.java
@@ -23,7 +23,7 @@
import com.genersoft.iot.vmp.storager.dao.StreamProxyMapper;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -438,7 +438,11 @@
    }
    @Override
    public ResourceBaceInfo getOverview() {
        return streamProxyMapper.getOverview();
    public ResourceBaseInfo getOverview() {
        int total = streamProxyMapper.getAllCount();
        int online = streamProxyMapper.getOnline();
        return new ResourceBaseInfo(total, online);
    }
}
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushServiceImpl.java
@@ -20,7 +20,7 @@
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.dao.*;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.slf4j.Logger;
@@ -531,7 +531,10 @@
    }
    @Override
    public ResourceBaceInfo getOverview() {
        return streamPushMapper.getOverview(userSetting.isUsePushingAsStatus());
    public ResourceBaseInfo getOverview() {
        int total = streamPushMapper.getAllCount();
        int online = streamPushMapper.getAllOnline(userSetting.isUsePushingAsStatus());
        return new ResourceBaseInfo(total, online);
    }
}
src/main/java/com/genersoft/iot/vmp/service/impl/StreamPushUploadFileHandler.java
@@ -9,7 +9,6 @@
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.util.*;
@@ -33,38 +32,43 @@
    /**
     * 用于存储不加过滤的所有数据
     */
    private List<StreamPushItem> streamPushItems = new ArrayList<>();
    private final List<StreamPushItem> streamPushItems = new ArrayList<>();
    /**
     * 用于存储更具APP+Stream过滤后的数据,可以直接存入stream_push表与gb_stream表
     */
    private Map<String,StreamPushItem> streamPushItemForSave = new HashMap<>();
    private final Map<String,StreamPushItem> streamPushItemForSave = new HashMap<>();
    /**
     * 用于存储按照APP+Stream为KEY, 平台ID+目录Id 为value的数据,用于存储到gb_stream表后获取app+Stream对应的平台与目录信息,然后存入关联表
     */
    private Map<String, List<String[]>> streamPushItemsForPlatform = new HashMap<>();
    private final Map<String, List<String[]>> streamPushItemsForPlatform = new HashMap<>();
    /**
     * 用于判断文件是否存在重复的app+Stream+平台ID
     */
    private Set<String> streamPushStreamSet = new HashSet<>();
    private final Set<String> streamPushStreamSet = new HashSet<>();
    /**
     * 用于存储APP+Stream->国标ID 的数据结构, 数据一一对应,全局判断APP+Stream->国标ID是否存在不对应
     */
    private BiMap<String,String> gBMap = HashBiMap.create();
    private final BiMap<String,String> gBMap = HashBiMap.create();
    /**
     * 用于存储APP+Stream-> 在数据库中的数据
     */
    private final BiMap<String,String> pushMapInDb = HashBiMap.create();
    /**
     * 记录错误的APP+Stream
     */
    private List<String> errorStreamList = new ArrayList<>();
    private final List<String> errorStreamList = new ArrayList<>();
    /**
     * 记录错误的国标ID
     */
    private List<String> errorGBList = new ArrayList<>();
    private final List<String> errorInfoList = new ArrayList<>();
    /**
     * 读取数量计数器
@@ -75,6 +79,13 @@
        this.pushService = pushService;
        this.defaultMediaServerId = defaultMediaServerId;
        this.errorDataHandler = errorDataHandler;
        // 获取数据库已有的数据,已经存在的则忽略
        List<String> allAppAndStreams = pushService.getAllAppAndStream();
        if (allAppAndStreams.size() > 0) {
            for (String allAppAndStream : allAppAndStreams) {
                pushMapInDb.put(allAppAndStream, allAppAndStream);
            }
        }
    }
    public interface ErrorDataHandler{
@@ -88,26 +99,30 @@
                || ObjectUtils.isEmpty(streamPushExcelDto.getGbId())) {
            return;
        }
        Integer rowIndex = analysisContext.readRowHolder().getRowIndex();
        if (gBMap.get(streamPushExcelDto.getApp() + streamPushExcelDto.getStream()) == null) {
            try {
                gBMap.put(streamPushExcelDto.getApp() + streamPushExcelDto.getStream(), streamPushExcelDto.getGbId());
            }catch (IllegalArgumentException e) {
                errorGBList.add(streamPushExcelDto.getGbId() + "(不同的app+stream使用了相同的国标ID)");
                errorInfoList.add("行:" + rowIndex + ", " + streamPushExcelDto.getGbId() + " 国标ID重复使用");
                return;
            }
        }else {
            if (!gBMap.get(streamPushExcelDto.getApp() + streamPushExcelDto.getStream()).equals(streamPushExcelDto.getGbId())) {
                errorGBList.add(streamPushExcelDto.getGbId() + "(同一组app+stream使用了不同的国标ID)");
                errorInfoList.add("行:" + rowIndex + ", " + streamPushExcelDto.getGbId() + " 同样的应用名和流ID使用了不同的国标ID");
                return;
            }
        }
        if (streamPushStreamSet.contains(streamPushExcelDto.getApp() + streamPushExcelDto.getStream() + streamPushExcelDto.getPlatformId())) {
            errorStreamList.add(streamPushExcelDto.getApp() + "/" + streamPushExcelDto.getStream()+ "/" +
                    streamPushExcelDto.getPlatformId() + "(同一组app+stream添加在了同一个平台下)");
            errorStreamList.add("行:" + rowIndex + ", " +  streamPushExcelDto.getApp() + "/" + streamPushExcelDto.getStream()+  " 平台信息重复");
            return;
        }else {
            if (pushMapInDb.get(streamPushExcelDto.getApp()+streamPushExcelDto.getStream()) != null) {
                errorStreamList.add("行:" + rowIndex + ", " +  streamPushExcelDto.getApp() + "/" + streamPushExcelDto.getStream()+  " 数据已存在");
                return;
            }
            streamPushStreamSet.add(streamPushExcelDto.getApp()+streamPushExcelDto.getStream() + streamPushExcelDto.getPlatformId());
        }
@@ -165,7 +180,7 @@
        gBMap.clear();
        streamPushStreamSet.clear();
        streamPushItemsForPlatform.clear();
        errorDataHandler.handle(errorStreamList, errorGBList);
        errorDataHandler.handle(errorStreamList, errorInfoList);
    }
    private void saveData(){
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -3,7 +3,6 @@
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannelInPlatform;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.gb28181.platform.bean.ChannelReduce;
import com.genersoft.iot.vmp.web.gb28181.dto.DeviceChannelExtend;
import org.apache.ibatis.annotations.*;
@@ -74,8 +73,8 @@
            "dc.device_id = #{deviceId} " +
" <if test='query != null'> AND (dc.channel_id LIKE concat('%',#{query},'%') OR dc.name LIKE concat('%',#{query},'%') OR dc.name LIKE concat('%',#{query},'%'))</if> " +
            " <if test='parentChannelId != null'> AND (dc.parent_id=#{parentChannelId} OR dc.civil_code = #{parentChannelId}) </if> " +
            " <if test='online == true' > AND dc.status=1</if>" +
            " <if test='online == false' > AND dc.status=0</if>" +
            " <if test='online == true' > AND dc.status= true</if>" +
            " <if test='online == false' > AND dc.status= false</if>" +
            " <if test='hasSubChannel == true' >  AND dc.sub_count > 0 </if>" +
            " <if test='hasSubChannel == false' >  AND dc.sub_count = 0 </if>" +
            "<if test='channelIds != null'> AND dc.channel_id in <foreach item='item' index='index' collection='channelIds' open='(' separator=',' close=')'>" +
@@ -97,8 +96,8 @@
            " <if test='device_id != null'> AND dc.device_id = #{deviceId} </if> " +
            " <if test='query != null'> AND (dc.channel_id LIKE '%${query}%' OR dc.name LIKE '%${query}%' OR dc.name LIKE '%${query}%')</if> " +
            " <if test='parentChannelId != null'> AND dc.parent_id=#{parentChannelId} </if> " +
            " <if test='online == true' > AND dc.status=1</if>" +
            " <if test='online == false' > AND dc.status=0</if>" +
            " <if test='online == true' > AND dc.status=true</if>" +
            " <if test='online == false' > AND dc.status=false</if>" +
            " <if test='hasSubChannel == true' >  AND dc.sub_count > 0 </if>" +
            " <if test='hasSubChannel == false' >  AND dc.sub_count = 0 </if>" +
            "<if test='channelIds != null'> AND dc.channel_id in <foreach item='item' index='index' collection='channelIds' open='(' separator=',' close=')'>" +
@@ -121,8 +120,8 @@
            " <if test='deviceId != null'> AND dc.device_id = #{deviceId} </if> " +
            " <if test='query != null'> AND (dc.channel_id LIKE '%${query}%' OR dc.name LIKE '%${query}%' OR dc.name LIKE '%${query}%')</if> " +
            " <if test='parentChannelId != null'> AND dc.parent_id=#{parentChannelId} </if> " +
            " <if test='online == true' > AND dc.status=1</if>" +
            " <if test='online == false' > AND dc.status=0</if>" +
            " <if test='online == true' > AND dc.status=true</if>" +
            " <if test='online == false' > AND dc.status=false</if>" +
            " <if test='hasSubChannel == true' >  AND dc.sub_count > 0 </if>" +
            " <if test='hasSubChannel == false' >  AND dc.sub_count = 0 </if>" +
            "<if test='channelIds != null'> AND dc.channel_id in <foreach item='item' index='index' collection='channelIds' open='(' separator=',' close=')'>" +
@@ -165,8 +164,8 @@
            " LEFT JOIN wvp_platform_gb_channel pgc on pgc.device_channel_id = dc.id " +
            " WHERE 1=1 " +
            " <if test='query != null'> AND (dc.channel_id LIKE concat('%',#{query},'%') OR dc.name LIKE concat('%',#{query},'%') OR dc.name LIKE concat('%',#{query},'%'))</if> " +
            " <if test='online == true' > AND dc.status=1</if> " +
            " <if test='online == false' > AND dc.status=0</if> " +
            " <if test='online == true' > AND dc.status=true</if> " +
            " <if test='online == false' > AND dc.status=false</if> " +
            " <if test='hasSubChannel!= null and has_sub_channel == true' >  AND dc.sub_count > 0</if> " +
            " <if test='hasSubChannel!= null and has_sub_channel == false' >  AND dc.sub_count = 0</if> " +
            " <if test='catalogId == null ' >  AND dc.id not in (select device_channel_id from wvp_platform_gb_channel where platform_id=#{platformId} ) </if> " +
@@ -191,10 +190,10 @@
    @Select("SELECT * FROM wvp_device_channel WHERE channel_id=#{channelId}")
    List<DeviceChannel> queryChannelByChannelId( String channelId);
    @Update(value = {"UPDATE wvp_device_channel SET status=0 WHERE device_id=#{deviceId} AND channel_id=#{channelId}"})
    @Update(value = {"UPDATE wvp_device_channel SET status=false WHERE device_id=#{deviceId} AND channel_id=#{channelId}"})
    void offline(String deviceId,  String channelId);
    @Update(value = {"UPDATE wvp_device_channel SET status=0 WHERE device_id=#{deviceId}"})
    @Update(value = {"UPDATE wvp_device_channel SET status=fasle WHERE device_id=#{deviceId}"})
    void offlineByDeviceId(String deviceId);
    @Insert("<script> " +
@@ -271,7 +270,7 @@
            "</script>")
    int batchAddOrUpdate(List<DeviceChannel> addChannels);
    @Update(value = {"UPDATE wvp_device_channel SET status=1 WHERE device_id=#{deviceId} AND channel_id=#{channelId}"})
    @Update(value = {"UPDATE wvp_device_channel SET status=true WHERE device_id=#{deviceId} AND channel_id=#{channelId}"})
    void online(String deviceId,  String channelId);
    @Update({"<script>" +
@@ -283,7 +282,7 @@
            "<if test='item.manufacture != null'>, manufacture=#{item.manufacture}</if>" +
            "<if test='item.model != null'>, model=#{item.model}</if>" +
            "<if test='item.owner != null'>, owner=#{item.owner}</if>" +
            "<if test='item.civil_code != null'>, civil_code=#{item.civilCode}</if>" +
            "<if test='item.civilCode != null'>, civil_code=#{item.civilCode}</if>" +
            "<if test='item.block != null'>, block=#{item.block}</if>" +
            "<if test='item.subCount != null'>, sub_count=#{item.subCount}</if>" +
            "<if test='item.address != null'>, address=#{item.address}</if>" +
@@ -317,7 +316,7 @@
    int batchUpdate(List<DeviceChannel> updateChannels);
    @Select("SELECT * FROM wvp_device_channel WHERE device_id=#{deviceId} AND status=1")
    @Select("SELECT * FROM wvp_device_channel WHERE device_id=#{deviceId} AND status=true")
    List<DeviceChannel> queryOnlineChannelsByDeviceId(String deviceId);
    @Delete(value = {" <script>" +
@@ -406,9 +405,6 @@
    List<DeviceChannel> queryAllChannels(String deviceId);
    @Select("select count(1) as total, sum(status) as online from wvp_device_channel")
    ResourceBaceInfo getOverview();
    @Select("select channelId" +
            ", device_id" +
            ", latitude" +
@@ -420,7 +416,7 @@
            "from wvp_device_channel where device_id = #{deviceId} " +
            "and latitude != 0 " +
            "and  longitude != 0 " +
            "and(latitude_gcj02=0orlatitude_wgs84=0orlongitude_wgs84= 0 or longitude_gcj02 = 0)")
            "and(latitude_gcj02=0 or latitude_wgs84=0 or longitude_wgs84= 0 or longitude_gcj02 = 0)")
    List<DeviceChannel> getChannelsWithoutTransform(String deviceId);
    @Select("select de.* from wvp_device de left join wvp_device_channel dc on de.device_id = dc.deviceId where dc.channel_id=#{channelId}")
@@ -436,15 +432,22 @@
    @Update({"<script>" +
            "<foreach collection='channels' item='item' separator=';'>" +
            "UPDATE wvp_device_channel SET status=1 WHERE device_id=#{item.deviceId} AND channel_id=#{item.channelId}" +
            "UPDATE wvp_device_channel SET status=true WHERE device_id=#{item.deviceId} AND channel_id=#{item.channelId}" +
            "</foreach>" +
            "</script>"})
    int batchOnline(List<DeviceChannel> channels);
    @Update({"<script>" +
            "<foreach collection='channels' item='item' separator=';'>" +
            "UPDATE wvp_device_channel SET status=0 WHERE device_id=#{item.deviceId} AND channel_id=#{item.channelId}" +
            "UPDATE wvp_device_channel SET status= false WHERE device_id=#{item.deviceId} AND channel_id=#{item.channelId}" +
            "</foreach>" +
            "</script>"})
    int batchOffline(List<DeviceChannel> channels);
    @Select("select count(1) from wvp_device_channel where status = true")
    int getOnlineCount();
    @Select("select count(1) from wvp_device_channel")
    int getAllChannelCount();
}
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceMapper.java
@@ -1,7 +1,6 @@
package com.genersoft.iot.vmp.storager.dao;
import com.genersoft.iot.vmp.gb28181.bean.Device;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
@@ -162,8 +161,10 @@
            "tree_type,"+
            "online,"+
            "media_server_id,"+
            "(SELECT count(0) FROM wvp_device_channel WHERE device_id=de.device_id) as channel_count  FROM wvp_device de" +
            "(SELECT count(0) FROM wvp_device_channel WHERE device_id=de.device_id) as channel_count " +
            "FROM wvp_device de" +
            "<if test=\"online != null\"> where online=${online}</if>"+
            " order by create_time desc "+
            " </script>"
    )
    List<Device> getDevices(Boolean online);
@@ -287,9 +288,6 @@
            "#{mediaServerId}" +
            ")")
    void addCustomDevice(Device device);
    @Select("select count(1) as total, sum(online) as online FROM wvp_device")
    ResourceBaceInfo getOverview();
    @Select("select * FROM wvp_device")
    List<Device> getAll();
src/main/java/com/genersoft/iot/vmp/storager/dao/GbStreamMapper.java
@@ -117,7 +117,7 @@
    void batchDelForGbStream(List<GbStream> gbStreams);
    @Insert("<script> " +
            "INSERT IGNORE into wvp_gb_stream " +
            "INSERT into wvp_gb_stream " +
            "(app, stream, gb_id, name, " +
            "longitude, latitude, stream_type,media_server_id,create_time)" +
            "values " +
@@ -127,7 +127,7 @@
            "#{item.mediaServerId}, #{item.createTime}) "+
            "</foreach> " +
            "</script>")
    @Options(useGeneratedKeys = true, keyProperty = "gbStreamId", keyColumn = "gbStreamId")
    @Options(useGeneratedKeys = true, keyProperty = "gbStreamId", keyColumn = "gb_stream_id")
    void batchAdd(List<StreamPushItem> subList);
    @Update({"<script>" +
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamProxyMapper.java
@@ -1,7 +1,7 @@
package com.genersoft.iot.vmp.storager.dao;
import com.genersoft.iot.vmp.media.zlm.dto.StreamProxyItem;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
@@ -78,5 +78,12 @@
    List<StreamProxyItem> selectAutoRemoveItemByMediaServerId(String mediaServerId);
    @Select("select count(1) as total, sum(status) as online from wvp_stream_proxy")
    ResourceBaceInfo getOverview();
    ResourceBaseInfo getOverview();
    @Select("select count(1) from wvp_stream_proxy")
    int getAllCount();
    @Select("select count(1) from wvp_stream_proxy where status = true")
    int getOnline();
}
src/main/java/com/genersoft/iot/vmp/storager/dao/StreamPushMapper.java
@@ -3,7 +3,6 @@
import com.genersoft.iot.vmp.gb28181.bean.GbStream;
import com.genersoft.iot.vmp.media.zlm.dto.StreamPushItem;
import com.genersoft.iot.vmp.service.bean.StreamPushItemFromRedis;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import org.apache.ibatis.annotations.*;
import org.springframework.stereotype.Repository;
@@ -89,7 +88,7 @@
    StreamPushItem selectOne(String app, String stream);
    @Insert("<script>"  +
            "Insert IGNORE INTO wvp_stream_push (app, stream, total_reader_count, origin_type, origin_type_str, " +
            "Insert INTO wvp_stream_push (app, stream, total_reader_count, origin_type, origin_type_str, " +
            "create_time, alive_second, media_server_id, status, push_ing) " +
            "VALUES <foreach collection='streamPushItems' item='item' index='index' separator=','>" +
            "( #{item.app}, #{item.stream}, #{item.totalReaderCount}, #{item.originType}, " +
@@ -171,9 +170,20 @@
    @Select("SELECT CONCAT(app,stream) from wvp_gb_stream")
    List<String> getAllAppAndStream();
    @Select("select count(1) from wvp_stream_push ")
    int getAllCount();
    @Select(value = {" <script>" +
            " <if test='pushIngAsOnline == true'> select count(1) as total, sum(push_ing) as online from wvp_stream_push </if>" +
            " <if test='pushIngAsOnline == false'> select count(1) as total, sum(status) as online from wvp_stream_push </if>" +
            " <if test='pushIngAsOnline == true'> select count(1) from wvp_stream_push where push_ing = true </if>" +
            " <if test='pushIngAsOnline == false'> select count(1)from wvp_stream_push where status = true  </if>" +
            " </script>"})
    ResourceBaceInfo getOverview(boolean pushIngAsOnline);
    int getAllOnline(Boolean usePushingAsStatus);
    @Select("<script> " +
            "select app, stream from wvp_stream_push where (app, stream) in " +
            "<foreach collection='streamPushItems' item='item' separator=','>" +
            "(#{item.app}, #{item.stream}) " +
            "</foreach>" +
            "</script>")
    List<StreamPushItem> getListIn(List<StreamPushItem> streamPushItems);
}
src/main/java/com/genersoft/iot/vmp/storager/impl/VideoManagerStorageImpl.java
@@ -123,6 +123,9 @@
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);
        // 数据去重
        List<DeviceChannel> channels = new ArrayList<>();
        List<DeviceChannel> updateChannels = new ArrayList<>();
        List<DeviceChannel> addChannels = new ArrayList<>();
        StringBuilder stringBuilder = new StringBuilder();
        Map<String, Integer> subContMap = new HashMap<>();
        if (deviceChannelList.size() > 0) {
@@ -131,18 +134,22 @@
            for (DeviceChannel deviceChannel : deviceChannelList) {
                if (!gbIdSet.contains(deviceChannel.getChannelId())) {
                    gbIdSet.add(deviceChannel.getChannelId());
                    deviceChannel.setUpdateTime(DateUtil.getNow());
                    if (allChannelMap.containsKey(deviceChannel.getChannelId())) {
                        deviceChannel.setStreamId(allChannelMap.get(deviceChannel.getChannelId()).getStreamId());
                        deviceChannel.setHasAudio(allChannelMap.get(deviceChannel.getChannelId()).isHasAudio());
                        if (allChannelMap.get(deviceChannel.getChannelId()).getStatus() !=deviceChannel.getStatus()){
                        if (allChannelMap.get(deviceChannel.getChannelId()).isStatus() !=deviceChannel.isStatus()){
                            List<String> strings = platformChannelMapper.queryParentPlatformByChannelId(deviceChannel.getChannelId());
                            if (!CollectionUtils.isEmpty(strings)){
                                strings.forEach(platformId->{
                                    eventPublisher.catalogEventPublish(platformId, deviceChannel, deviceChannel.getStatus()==1?CatalogEvent.ON:CatalogEvent.OFF);
                                    eventPublisher.catalogEventPublish(platformId, deviceChannel, deviceChannel.isStatus()?CatalogEvent.ON:CatalogEvent.OFF);
                                });
                            }
                        }
                        updateChannels.add(deviceChannel);
                    }else {
                        deviceChannel.setCreateTime(DateUtil.getNow());
                        addChannels.add(deviceChannel);
                    }
                    channels.add(deviceChannel);
                    if (!ObjectUtils.isEmpty(deviceChannel.getParentId())) {
@@ -175,21 +182,36 @@
        }
        try {
            int cleanChannelsResult = deviceChannelMapper.cleanChannelsNotInList(deviceId, channels);
            int limitCount = 300;
            boolean result = cleanChannelsResult < 0;
            if (!result && channels.size() > 0) {
                if (channels.size() > limitCount) {
                    for (int i = 0; i < channels.size(); i += limitCount) {
            if (!result && addChannels.size() > 0) {
                if (addChannels.size() > limitCount) {
                    for (int i = 0; i < addChannels.size(); i += limitCount) {
                        int toIndex = i + limitCount;
                        if (i + limitCount > channels.size()) {
                            toIndex = channels.size();
                        if (i + limitCount > addChannels.size()) {
                            toIndex = addChannels.size();
                        }
                        result = result || deviceChannelMapper.batchAddOrUpdate(channels.subList(i, toIndex)) < 0;
                        result = result || deviceChannelMapper.batchAdd(addChannels.subList(i, toIndex)) < 0;
                    }
                }else {
                    result = result || deviceChannelMapper.batchAddOrUpdate(channels) < 0;
                    result = result || deviceChannelMapper.batchAdd(addChannels) < 0;
                }
            }
            if (!result && updateChannels.size() > 0) {
                if (updateChannels.size() > limitCount) {
                    for (int i = 0; i < updateChannels.size(); i += limitCount) {
                        int toIndex = i + limitCount;
                        if (i + limitCount > updateChannels.size()) {
                            toIndex = updateChannels.size();
                        }
                        result = result || deviceChannelMapper.batchUpdate(updateChannels.subList(i, toIndex)) < 0;
                    }
                }else {
                    result = result || deviceChannelMapper.batchUpdate(updateChannels) < 0;
                }
            }
            if (result) {
                //事务回滚
                dataSourceTransactionManager.rollback(transactionStatus);
@@ -919,7 +941,7 @@
        deviceChannel.setLatitude(0.0);
        deviceChannel.setDeviceId(platform.getDeviceGBId());
        deviceChannel.setManufacture("wvp-pro");
        deviceChannel.setStatus(1);
        deviceChannel.setStatus(true);
        deviceChannel.setParental(1);
        deviceChannel.setRegisterWay(1);
src/main/java/com/genersoft/iot/vmp/vmanager/bean/ResourceBaseInfo.java
File was renamed from src/main/java/com/genersoft/iot/vmp/vmanager/bean/ResourceBaceInfo.java
@@ -1,9 +1,17 @@
package com.genersoft.iot.vmp.vmanager.bean;
public class ResourceBaceInfo {
public class ResourceBaseInfo {
    private int total;
    private int online;
    public ResourceBaseInfo() {
    }
    public ResourceBaseInfo(int total, int online) {
        this.total = total;
        this.online = online;
    }
    public int getTotal() {
        return total;
    }
src/main/java/com/genersoft/iot/vmp/vmanager/bean/ResourceInfo.java
@@ -2,40 +2,40 @@
public class ResourceInfo {
    private ResourceBaceInfo device;
    private ResourceBaceInfo channel;
    private ResourceBaceInfo push;
    private ResourceBaceInfo proxy;
    private ResourceBaseInfo device;
    private ResourceBaseInfo channel;
    private ResourceBaseInfo push;
    private ResourceBaseInfo proxy;
    public ResourceBaceInfo getDevice() {
    public ResourceBaseInfo getDevice() {
        return device;
    }
    public void setDevice(ResourceBaceInfo device) {
    public void setDevice(ResourceBaseInfo device) {
        this.device = device;
    }
    public ResourceBaceInfo getChannel() {
    public ResourceBaseInfo getChannel() {
        return channel;
    }
    public void setChannel(ResourceBaceInfo channel) {
    public void setChannel(ResourceBaseInfo channel) {
        this.channel = channel;
    }
    public ResourceBaceInfo getPush() {
    public ResourceBaseInfo getPush() {
        return push;
    }
    public void setPush(ResourceBaceInfo push) {
    public void setPush(ResourceBaseInfo push) {
        this.push = push;
    }
    public ResourceBaceInfo getProxy() {
    public ResourceBaseInfo getProxy() {
        return proxy;
    }
    public void setProxy(ResourceBaceInfo proxy) {
    public void setProxy(ResourceBaseInfo proxy) {
        this.proxy = proxy;
    }
}
src/main/java/com/genersoft/iot/vmp/vmanager/server/ServerController.java
@@ -15,7 +15,7 @@
import com.genersoft.iot.vmp.service.bean.MediaServerLoad;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.vmanager.bean.ErrorCode;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaceInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceBaseInfo;
import com.genersoft.iot.vmp.vmanager.bean.ResourceInfo;
import com.genersoft.iot.vmp.vmanager.bean.SystemConfigInfo;
import io.swagger.v3.oas.annotations.Operation;
@@ -251,13 +251,13 @@
    @Operation(summary = "获取负载信息")
    public ResourceInfo getResourceInfo() {
        ResourceInfo result = new ResourceInfo();
        ResourceBaceInfo deviceInfo = deviceService.getOverview();
        ResourceBaseInfo deviceInfo = deviceService.getOverview();
        result.setDevice(deviceInfo);
        ResourceBaceInfo channelInfo = channelService.getOverview();
        ResourceBaseInfo channelInfo = channelService.getOverview();
        result.setChannel(channelInfo);
        ResourceBaceInfo pushInfo = pushService.getOverview();
        ResourceBaseInfo pushInfo = pushService.getOverview();
        result.setPush(pushInfo);
        ResourceBaceInfo proxyInfo = proxyService.getOverview();
        ResourceBaseInfo proxyInfo = proxyService.getOverview();
        result.setProxy(proxyInfo);
        return result;
src/main/java/com/genersoft/iot/vmp/web/gb28181/ApiStreamController.java
@@ -113,7 +113,7 @@
            result.put("error","channel[ " + code + " ]未找到");
            resultDeferredResult.setResult(result);
            return resultDeferredResult;
        }else if (deviceChannel.getStatus() == 0) {
        }else if (!deviceChannel.isStatus()) {
            JSONObject result = new JSONObject();
            result.put("error","channel[ " + code + " ]offline");
            resultDeferredResult.setResult(result);