心跳监测内容修改,ip对应数据改为clientId对应硬件SN,监控模板,策略bug修改
This commit is contained in:
		@@ -77,6 +77,13 @@ public interface EpsServerRevenueConfigMapper
 | 
				
			|||||||
     * @return 服务器收益方式配置
 | 
					     * @return 服务器收益方式配置
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public Map getNodeMsgByIp(@Param("ipAddress") String ipAddress);
 | 
					    public Map getNodeMsgByIp(@Param("ipAddress") String ipAddress);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 根据sn查询服务器信息
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param hardwareSn 硬件SN
 | 
				
			||||||
 | 
					     * @return 服务器收益方式配置
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Map getNodeMsgBySn(@Param("hardwareSn") String hardwareSn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int updateEpsServerRevenueConfigByServerSn(EpsServerRevenueConfig epsServerRevenueConfig);
 | 
					    int updateEpsServerRevenueConfigByServerSn(EpsServerRevenueConfig epsServerRevenueConfig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -173,13 +173,8 @@ public class EpsServerRevenueConfigServiceImpl implements IEpsServerRevenueConfi
 | 
				
			|||||||
        List<EpsInitialTrafficData> dataList = epsInitialTrafficDataService.getAllTraficMsg(epsInitialTrafficData);
 | 
					        List<EpsInitialTrafficData> dataList = epsInitialTrafficDataService.getAllTraficMsg(epsInitialTrafficData);
 | 
				
			||||||
        List<EpsInitialTrafficData> batchList = new ArrayList<>();
 | 
					        List<EpsInitialTrafficData> batchList = new ArrayList<>();
 | 
				
			||||||
        for (EpsInitialTrafficData initialTrafficData : dataList) {
 | 
					        for (EpsInitialTrafficData initialTrafficData : dataList) {
 | 
				
			||||||
            // 根据ip查询节点名称
 | 
					            // 根据clientId查询节点名称
 | 
				
			||||||
            String ip = initialTrafficData.getIpV4() == null ? "" : initialTrafficData.getIpV4();
 | 
					            Map nodeMsg = epsServerRevenueConfigMapper.getNodeMsgBySn(initialTrafficData.getClientId());
 | 
				
			||||||
            String mac = initialTrafficData.getMac() == null ? "" : initialTrafficData.getMac();
 | 
					 | 
				
			||||||
            Map nodeMsg = epsServerRevenueConfigMapper.getNodeMsgByIp(ip);
 | 
					 | 
				
			||||||
            if(nodeMsg == null){
 | 
					 | 
				
			||||||
                nodeMsg = epsServerRevenueConfigMapper.getNodeMsgByIp(mac);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            // 赋值
 | 
					            // 赋值
 | 
				
			||||||
            if(nodeMsg != null){
 | 
					            if(nodeMsg != null){
 | 
				
			||||||
                initialTrafficData.setServiceSn(getNullableString(nodeMsg, "hardwareSn"));
 | 
					                initialTrafficData.setServiceSn(getNullableString(nodeMsg, "hardwareSn"));
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -134,10 +134,10 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
 | 
				
			|||||||
                details.setId(null);
 | 
					                details.setId(null);
 | 
				
			||||||
                // 根据接口名称查询交换机信息
 | 
					                // 根据接口名称查询交换机信息
 | 
				
			||||||
                String interfaceName = details.getName();
 | 
					                String interfaceName = details.getName();
 | 
				
			||||||
                String switchIp = details.getSwitchIp();
 | 
					                String switchSn = details.getSwitchSn();
 | 
				
			||||||
                RmEpsTopologyManagement rmEpsTopologyManagement = new RmEpsTopologyManagement();
 | 
					                RmEpsTopologyManagement rmEpsTopologyManagement = new RmEpsTopologyManagement();
 | 
				
			||||||
                rmEpsTopologyManagement.setInterfaceName(interfaceName);
 | 
					                rmEpsTopologyManagement.setInterfaceName(interfaceName);
 | 
				
			||||||
                rmEpsTopologyManagement.setSwitchIpAddress(switchIp);
 | 
					                rmEpsTopologyManagement.setSwitchSn(switchSn);
 | 
				
			||||||
                List<RmEpsTopologyManagement> managements = rmEpsTopologyManagementMapper.selectRmEpsTopologyManagementList(rmEpsTopologyManagement);
 | 
					                List<RmEpsTopologyManagement> managements = rmEpsTopologyManagementMapper.selectRmEpsTopologyManagementList(rmEpsTopologyManagement);
 | 
				
			||||||
                // 赋值
 | 
					                // 赋值
 | 
				
			||||||
                if(!managements.isEmpty()){
 | 
					                if(!managements.isEmpty()){
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -54,7 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="insertAllInterfaceName" parameterType="AllInterfaceName" useGeneratedKeys="true" keyProperty="id">
 | 
					    <insert id="insertAllInterfaceName" parameterType="AllInterfaceName" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        insert into all_interface_name
 | 
					        insert IGNORE into all_interface_name
 | 
				
			||||||
        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
					            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
				
			||||||
            <if test="interfaceName != null and interfaceName != ''">interface_name,</if>
 | 
					            <if test="interfaceName != null and interfaceName != ''">interface_name,</if>
 | 
				
			||||||
@@ -166,7 +166,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    <!-- 批量插入接口名称 -->
 | 
					    <!-- 批量插入接口名称 -->
 | 
				
			||||||
    <insert id="batchInsert" parameterType="java.util.List">
 | 
					    <insert id="batchInsert" parameterType="java.util.List">
 | 
				
			||||||
        INSERT INTO all_interface_name
 | 
					        INSERT IGNORE INTO all_interface_name
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
        interface_name,
 | 
					        interface_name,
 | 
				
			||||||
        client_id,
 | 
					        client_id,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -148,6 +148,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            and rrr.ip_address = #{ipAddress}
 | 
					            and rrr.ip_address = #{ipAddress}
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <select id="getNodeMsgBySn" parameterType="String" resultType="java.util.Map">
 | 
				
			||||||
 | 
					        SELECT
 | 
				
			||||||
 | 
					        rrr.hardware_sn AS hardwareSn,
 | 
				
			||||||
 | 
					        rrr.resource_name AS resourceName,
 | 
				
			||||||
 | 
					        esrc.revenue_method AS revenueMethod,
 | 
				
			||||||
 | 
					        esrc.business_code AS businessCode,
 | 
				
			||||||
 | 
					        esrc.business_name AS businessName,
 | 
				
			||||||
 | 
					        esrc.package_bandwidth AS packageBandwidth
 | 
				
			||||||
 | 
					        FROM
 | 
				
			||||||
 | 
					        rm_resource_registration rrr
 | 
				
			||||||
 | 
					        LEFT JOIN
 | 
				
			||||||
 | 
					        eps_server_revenue_config esrc
 | 
				
			||||||
 | 
					        ON
 | 
				
			||||||
 | 
					        rrr.hardware_sn = esrc.hardware_sn
 | 
				
			||||||
 | 
					        <where>
 | 
				
			||||||
 | 
					            and rrr.registration_status = '1'
 | 
				
			||||||
 | 
					            and rrr.hardware_sn = #{hardwareSn}
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <select id="countBySn" parameterType="String">
 | 
					    <select id="countBySn" parameterType="String">
 | 
				
			||||||
        <include refid="selectEpsServerRevenueConfigVo"/>
 | 
					        <include refid="selectEpsServerRevenueConfigVo"/>
 | 
				
			||||||
        where hardware_sn = #{hardwareSn}
 | 
					        where hardware_sn = #{hardwareSn}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -248,7 +248,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    <update id="updateStatusByResource" parameterType="RmResourceRegistration">
 | 
					    <update id="updateStatusByResource" parameterType="RmResourceRegistration">
 | 
				
			||||||
        update rm_resource_registration
 | 
					        update rm_resource_registration
 | 
				
			||||||
        <trim prefix="SET" suffixOverrides=",">
 | 
					        <trim prefix="SET" suffixOverrides=",">
 | 
				
			||||||
            <if test="hardwareSn != null">hardware_sn = #{hardwareSn},</if>
 | 
					 | 
				
			||||||
            <if test="resourceType != null">resource_type = #{resourceType},</if>
 | 
					            <if test="resourceType != null">resource_type = #{resourceType},</if>
 | 
				
			||||||
            <if test="resourceName != null">resource_name = #{resourceName},</if>
 | 
					            <if test="resourceName != null">resource_name = #{resourceName},</if>
 | 
				
			||||||
            <if test="ipAddress != null">ip_address = #{ipAddress},</if>
 | 
					            <if test="ipAddress != null">ip_address = #{ipAddress},</if>
 | 
				
			||||||
@@ -280,7 +279,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            <if test="updaterId != null">updater_id = #{updaterId},</if>
 | 
					            <if test="updaterId != null">updater_id = #{updaterId},</if>
 | 
				
			||||||
            <if test="updaterName != null">updater_name = #{updaterName},</if>
 | 
					            <if test="updaterName != null">updater_name = #{updaterName},</if>
 | 
				
			||||||
        </trim>
 | 
					        </trim>
 | 
				
			||||||
        where ip_address = #{ipAddress}
 | 
					        where hardware_sn = #{hardwareSn}
 | 
				
			||||||
    </update>
 | 
					    </update>
 | 
				
			||||||
    <select id="getRegistrationByIds" parameterType="String" resultMap="RmResourceRegistrationResult">
 | 
					    <select id="getRegistrationByIds" parameterType="String" resultMap="RmResourceRegistrationResult">
 | 
				
			||||||
        <include refid="selectRmResourceRegistrationVo"/>
 | 
					        <include refid="selectRmResourceRegistrationVo"/>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,42 +1,21 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.consumer;
 | 
					package com.ruoyi.rocketmq.consumer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.alibaba.fastjson.JSON;
 | 
					import com.alibaba.fastjson.JSON;
 | 
				
			||||||
import com.ruoyi.common.core.constant.SecurityConstants;
 | 
					import com.ruoyi.rocketmq.domain.DeviceMessage;
 | 
				
			||||||
import com.ruoyi.common.core.domain.R;
 | 
					 | 
				
			||||||
import com.ruoyi.common.core.utils.DateUtils;
 | 
					 | 
				
			||||||
import com.ruoyi.common.core.utils.StringUtils;
 | 
					 | 
				
			||||||
import com.ruoyi.rocketmq.domain.*;
 | 
					 | 
				
			||||||
import com.ruoyi.rocketmq.domain.vo.RspVo;
 | 
					 | 
				
			||||||
import com.ruoyi.rocketmq.enums.MessageCodeEnum;
 | 
					import com.ruoyi.rocketmq.enums.MessageCodeEnum;
 | 
				
			||||||
import com.ruoyi.rocketmq.handler.DeviceMessageHandler;
 | 
					import com.ruoyi.rocketmq.handler.DeviceMessageHandler;
 | 
				
			||||||
import com.ruoyi.rocketmq.producer.ConsumeException;
 | 
					import com.ruoyi.rocketmq.producer.ConsumeException;
 | 
				
			||||||
import com.ruoyi.rocketmq.service.*;
 | 
					 | 
				
			||||||
import com.ruoyi.rocketmq.utils.JsonDataParser;
 | 
					 | 
				
			||||||
import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
					 | 
				
			||||||
import com.ruoyi.system.api.domain.AllInterfaceNameRemote;
 | 
					 | 
				
			||||||
import com.ruoyi.system.api.domain.EpsInitialTrafficDataRemote;
 | 
					 | 
				
			||||||
import com.ruoyi.system.api.domain.InitialSwitchInfoDetailsRemote;
 | 
					 | 
				
			||||||
import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
					 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
 | 
					import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
 | 
				
			||||||
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
 | 
					import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
 | 
				
			||||||
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
 | 
					import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
 | 
				
			||||||
import org.apache.rocketmq.common.message.MessageExt;
 | 
					import org.apache.rocketmq.common.message.MessageExt;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.data.redis.core.RedisTemplate;
 | 
					 | 
				
			||||||
import org.springframework.scheduling.annotation.Scheduled;
 | 
					 | 
				
			||||||
import org.springframework.stereotype.Component;
 | 
					import org.springframework.stereotype.Component;
 | 
				
			||||||
import org.springframework.util.CollectionUtils;
 | 
					import org.springframework.util.CollectionUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.UnsupportedEncodingException;
 | 
					import java.io.UnsupportedEncodingException;
 | 
				
			||||||
import java.math.BigDecimal;
 | 
					 | 
				
			||||||
import java.math.RoundingMode;
 | 
					 | 
				
			||||||
import java.util.Date;
 | 
					 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					 | 
				
			||||||
import java.util.Set;
 | 
					 | 
				
			||||||
import java.util.function.Function;
 | 
					 | 
				
			||||||
import java.util.stream.Collectors;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 消息监听
 | 
					 * 消息监听
 | 
				
			||||||
@@ -44,44 +23,6 @@ import java.util.stream.Collectors;
 | 
				
			|||||||
@Slf4j
 | 
					@Slf4j
 | 
				
			||||||
@Component
 | 
					@Component
 | 
				
			||||||
public class RocketMsgListener implements MessageListenerConcurrently {
 | 
					public class RocketMsgListener implements MessageListenerConcurrently {
 | 
				
			||||||
    // 心跳状态
 | 
					 | 
				
			||||||
    private static final String HEARTBEAT_STATUS_PREFIX = "heartbeat:status:";
 | 
					 | 
				
			||||||
    // 心跳时间
 | 
					 | 
				
			||||||
    private static final String HEARTBEAT_TIME_PREFIX = "heartbeat:time:";
 | 
					 | 
				
			||||||
    // 心跳告警
 | 
					 | 
				
			||||||
    private static final String HEARTBEAT_ALERT_PREFIX = "heartbeat:alert:";
 | 
					 | 
				
			||||||
    String HEARTBEAT_RECOVERY_COUNT_PREFIX = "heartbeat:recovery:count:";
 | 
					 | 
				
			||||||
    private static final long HEARTBEAT_TIMEOUT = 180000; // 3分钟超时
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private RedisTemplate<String, String> redisTemplate;
 | 
					 | 
				
			||||||
    private final IInitialBandwidthTrafficService initialBandwidthTrafficService;
 | 
					 | 
				
			||||||
    private final RemoteRevenueConfigService remoteRevenueConfigService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialDockerInfoService initialDockerInfoService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialCpuInfoService initialCpuInfoService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialDiskInfoService initialDiskInfoService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialMemoryInfoService initialMemoryInfoService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialMountPointInfoService initialMountPointInfoService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialSwitchInfoService initialSwitchInfoService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialSystemInfoService initialSystemInfoService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialSwitchInfoTempService initialSwitchInfoTempService;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    private IInitialHeartbeatListenLogService initialHeartbeatListenLog;
 | 
					 | 
				
			||||||
    @Autowired
 | 
					 | 
				
			||||||
    public RocketMsgListener(IInitialBandwidthTrafficService initialBandwidthTrafficService,
 | 
					 | 
				
			||||||
                             RemoteRevenueConfigService remoteRevenueConfigService) {
 | 
					 | 
				
			||||||
        this.initialBandwidthTrafficService = initialBandwidthTrafficService;
 | 
					 | 
				
			||||||
        this.remoteRevenueConfigService = remoteRevenueConfigService;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private DeviceMessageHandler deviceMessageHandler;
 | 
					    private DeviceMessageHandler deviceMessageHandler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -122,42 +63,6 @@ public class RocketMsgListener implements MessageListenerConcurrently {
 | 
				
			|||||||
                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//业务处理成功
 | 
					                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//业务处理成功
 | 
				
			||||||
                   }
 | 
					                   }
 | 
				
			||||||
                   // 根据不同的topic处理不同的业务 这里以订单消息为例子
 | 
					                   // 根据不同的topic处理不同的业务 这里以订单消息为例子
 | 
				
			||||||
                   if (MessageCodeEnum.AGENT_MESSAGE_TOPIC.getCode().equals(topic)) {
 | 
					 | 
				
			||||||
                       // 拿到信息
 | 
					 | 
				
			||||||
                       DeviceMessage message = JSON.parseObject(body, DeviceMessage.class);
 | 
					 | 
				
			||||||
                       switch (message.getDataType()){
 | 
					 | 
				
			||||||
                           case "NET":
 | 
					 | 
				
			||||||
                               handleNetMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           case "CPU":
 | 
					 | 
				
			||||||
                               handleCpuMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           case "SYSTEM":
 | 
					 | 
				
			||||||
                               handleSystemMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           case "DISK":
 | 
					 | 
				
			||||||
                               handleDiskMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           case "POINT":
 | 
					 | 
				
			||||||
                               handleMountPointMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           case "MEMORY":
 | 
					 | 
				
			||||||
                               handleMemoryMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           case "DOCKER":
 | 
					 | 
				
			||||||
                               handleDockerMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           case "SWITCHBOARD":
 | 
					 | 
				
			||||||
                               handleSwitchMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           case "HEARTBEAT":
 | 
					 | 
				
			||||||
                               handleHeartbeatMessage(message);
 | 
					 | 
				
			||||||
                               break;
 | 
					 | 
				
			||||||
                           default:
 | 
					 | 
				
			||||||
                               log.warn("未知数据类型:{}",message.getDataType());
 | 
					 | 
				
			||||||
                       }
 | 
					 | 
				
			||||||
                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//业务处理成功
 | 
					 | 
				
			||||||
                   }
 | 
					 | 
				
			||||||
               }
 | 
					               }
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
           // 消息消费失败
 | 
					           // 消息消费失败
 | 
				
			||||||
@@ -186,417 +91,4 @@ public class RocketMsgListener implements MessageListenerConcurrently {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        return ConsumeConcurrentlyStatus.RECONSUME_LATER;
 | 
					        return ConsumeConcurrentlyStatus.RECONSUME_LATER;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 网络流量数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleNetMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialBandwidthTraffic> interfaces = JsonDataParser.parseJsonData(message.getData(), InitialBandwidthTraffic.class);
 | 
					 | 
				
			||||||
        if(!interfaces.isEmpty()){
 | 
					 | 
				
			||||||
            // 时间戳转换
 | 
					 | 
				
			||||||
            long timestamp = interfaces.get(0).getTimestamp();
 | 
					 | 
				
			||||||
            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
					 | 
				
			||||||
            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
            String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",createTime);
 | 
					 | 
				
			||||||
            InitialBandwidthTraffic data = new InitialBandwidthTraffic();
 | 
					 | 
				
			||||||
            interfaces.forEach(iface -> {
 | 
					 | 
				
			||||||
                iface.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                iface.setCreateTime(createTime);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            // 批量入库集合
 | 
					 | 
				
			||||||
            data.setList(interfaces);
 | 
					 | 
				
			||||||
            // 初始流量数据入库
 | 
					 | 
				
			||||||
            initialBandwidthTrafficService.batchInsert(data);
 | 
					 | 
				
			||||||
            EpsInitialTrafficDataRemote epsInitialTrafficDataRemote = new EpsInitialTrafficDataRemote();
 | 
					 | 
				
			||||||
            epsInitialTrafficDataRemote.setStartTime(timeStr);
 | 
					 | 
				
			||||||
            epsInitialTrafficDataRemote.setEndTime(timeStr);
 | 
					 | 
				
			||||||
            // 复制到业务初始库
 | 
					 | 
				
			||||||
            remoteRevenueConfigService.autoSaveServiceTrafficData(epsInitialTrafficDataRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("NET流量data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * docker数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleDockerMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialDockerInfo> dockers = JsonDataParser.parseJsonData(message.getData(), InitialDockerInfo.class);
 | 
					 | 
				
			||||||
        if(!dockers.isEmpty()){
 | 
					 | 
				
			||||||
            // 时间戳转换
 | 
					 | 
				
			||||||
            long timestamp = dockers.get(0).getTimestamp();
 | 
					 | 
				
			||||||
            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
					 | 
				
			||||||
            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
            dockers.forEach(iface -> {
 | 
					 | 
				
			||||||
                iface.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                iface.setCreateTime(createTime);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            // 初始容器数据入库
 | 
					 | 
				
			||||||
            initialDockerInfoService.batchInsertInitialDockerInfo(dockers);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("DOCKER容器data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * cpu数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleCpuMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialCpuInfo> cpus = JsonDataParser.parseJsonData(message.getData(),InitialCpuInfo.class);
 | 
					 | 
				
			||||||
        // 时间戳转换
 | 
					 | 
				
			||||||
        long timestamp = cpus.get(0).getTimestamp();
 | 
					 | 
				
			||||||
        long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
					 | 
				
			||||||
        Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
        if(!cpus.isEmpty()){
 | 
					 | 
				
			||||||
            cpus.forEach(iface -> {
 | 
					 | 
				
			||||||
                iface.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                iface.setCreateTime(createTime);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            // 初始CPU数据入库
 | 
					 | 
				
			||||||
            initialCpuInfoService.batchInsertInitialCpuInfo(cpus);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("CPUdata数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 磁盘数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleDiskMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialDiskInfo> disks = JsonDataParser.parseJsonData(message.getData(), InitialDiskInfo.class);
 | 
					 | 
				
			||||||
        // 时间戳转换
 | 
					 | 
				
			||||||
        long timestamp = disks.get(0).getTimestamp();
 | 
					 | 
				
			||||||
        long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
					 | 
				
			||||||
        Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
        if(!disks.isEmpty()){
 | 
					 | 
				
			||||||
            disks.forEach(iface -> {
 | 
					 | 
				
			||||||
                iface.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                iface.setCreateTime(createTime);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            // 初始磁盘数据入库
 | 
					 | 
				
			||||||
            initialDiskInfoService.batchInsertInitialDiskInfo(disks);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("磁盘data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 内存数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleMemoryMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialMemoryInfo> memorys = JsonDataParser.parseJsonData(message.getData(), InitialMemoryInfo.class);
 | 
					 | 
				
			||||||
        if(!memorys.isEmpty()){
 | 
					 | 
				
			||||||
            // 时间戳转换
 | 
					 | 
				
			||||||
            long timestamp = memorys.get(0).getTimestamp();
 | 
					 | 
				
			||||||
            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
					 | 
				
			||||||
            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
            memorys.forEach(iface -> {
 | 
					 | 
				
			||||||
                iface.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                iface.setCreateTime(createTime);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            // 初始内存数据入库
 | 
					 | 
				
			||||||
            initialMemoryInfoService.batchInsertInitialMemoryInfo(memorys);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("内存data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 挂载点数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleMountPointMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialMountPointInfo> mountPointInfos = JsonDataParser.parseJsonData(message.getData(), InitialMountPointInfo.class);
 | 
					 | 
				
			||||||
        if(!mountPointInfos.isEmpty()){
 | 
					 | 
				
			||||||
            // 时间戳转换
 | 
					 | 
				
			||||||
            long timestamp = mountPointInfos.get(0).getTimestamp();
 | 
					 | 
				
			||||||
            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
					 | 
				
			||||||
            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
            mountPointInfos.forEach(iface -> {
 | 
					 | 
				
			||||||
                iface.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                iface.setCreateTime(createTime);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            // 初始挂载点数据入库
 | 
					 | 
				
			||||||
            initialMountPointInfoService.batchInsertInitialMountPointInfo(mountPointInfos);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("挂载点data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 交换机数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleSwitchMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialSwitchInfo> switchInfos = JsonDataParser.parseJsonData(message.getData(), InitialSwitchInfo.class);
 | 
					 | 
				
			||||||
        if(!switchInfos.isEmpty()){
 | 
					 | 
				
			||||||
            // 时间戳转换
 | 
					 | 
				
			||||||
            long timestamp = switchInfos.get(0).getTimestamp();
 | 
					 | 
				
			||||||
            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
					 | 
				
			||||||
            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
            String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",createTime);
 | 
					 | 
				
			||||||
            // 查询临时表信息,计算实际流量值
 | 
					 | 
				
			||||||
            InitialSwitchInfoTemp temp = new InitialSwitchInfoTemp();
 | 
					 | 
				
			||||||
            temp.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
            List<InitialSwitchInfoTemp> tempList = initialSwitchInfoTempService.selectInitialSwitchInfoTempList(temp);
 | 
					 | 
				
			||||||
            if(!tempList.isEmpty()){
 | 
					 | 
				
			||||||
                // 1. 构建快速查找的Map
 | 
					 | 
				
			||||||
                Map<String, InitialSwitchInfoTemp> tempMap = tempList.stream()
 | 
					 | 
				
			||||||
                        .collect(Collectors.toMap(
 | 
					 | 
				
			||||||
                                InitialSwitchInfoTemp::getName,
 | 
					 | 
				
			||||||
                                Function.identity(),
 | 
					 | 
				
			||||||
                                (existing, replacement) -> existing
 | 
					 | 
				
			||||||
                        ));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 2. 预计算除数(避免重复创建对象)
 | 
					 | 
				
			||||||
                BigDecimal divisor = new BigDecimal(300);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 3. 计算速度
 | 
					 | 
				
			||||||
                switchInfos.forEach(switchInfo -> {
 | 
					 | 
				
			||||||
                    switchInfo.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                    switchInfo.setCreateTime(createTime);
 | 
					 | 
				
			||||||
                    InitialSwitchInfoTemp tempInfo = tempMap.get(switchInfo.getName());
 | 
					 | 
				
			||||||
                    if (tempInfo != null) {
 | 
					 | 
				
			||||||
                        // 计算inSpeed
 | 
					 | 
				
			||||||
                        if (switchInfo.getInBytes() != null && tempInfo.getInBytes() != null) {
 | 
					 | 
				
			||||||
                            BigDecimal inDiff = switchInfo.getInBytes().subtract(tempInfo.getInBytes());
 | 
					 | 
				
			||||||
                            switchInfo.setInSpeed(inDiff.divide(divisor, 2, RoundingMode.HALF_UP));
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        // 计算outSpeed
 | 
					 | 
				
			||||||
                        if (switchInfo.getOutBytes() != null && tempInfo.getOutBytes() != null) {
 | 
					 | 
				
			||||||
                            BigDecimal outDiff = switchInfo.getOutBytes().subtract(tempInfo.getOutBytes());
 | 
					 | 
				
			||||||
                            switchInfo.setOutSpeed(outDiff.divide(divisor, 2, RoundingMode.HALF_UP));
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            }else{
 | 
					 | 
				
			||||||
                switchInfos.forEach(switchInfo -> {
 | 
					 | 
				
			||||||
                    switchInfo.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                    switchInfo.setCreateTime(createTime);
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            // 清空临时表对应switch信息
 | 
					 | 
				
			||||||
            initialSwitchInfoTempService.truncateSwitchInfoTemp(message.getClientId());
 | 
					 | 
				
			||||||
            // 临时表 用来计算inSpeed outSeppd
 | 
					 | 
				
			||||||
            initialSwitchInfoTempService.batchInsertInitialSwitchInfoTemp(switchInfos);
 | 
					 | 
				
			||||||
            // 初始交换机数据入库
 | 
					 | 
				
			||||||
            initialSwitchInfoService.batchInsertInitialSwitchInfo(switchInfos);
 | 
					 | 
				
			||||||
            // 业务表入库
 | 
					 | 
				
			||||||
            InitialSwitchInfoDetailsRemote detailsRemote = new InitialSwitchInfoDetailsRemote();
 | 
					 | 
				
			||||||
            detailsRemote.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
            detailsRemote.setStartTime(timeStr);
 | 
					 | 
				
			||||||
            detailsRemote.setEndTime(timeStr);
 | 
					 | 
				
			||||||
            remoteRevenueConfigService.autoSaveSwitchTraffic(detailsRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("交换机data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 系统数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleSystemMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialSystemInfo> systemInfos = JsonDataParser.parseJsonData(message.getData(), InitialSystemInfo.class);
 | 
					 | 
				
			||||||
        if(!systemInfos.isEmpty()){
 | 
					 | 
				
			||||||
            // 时间戳转换
 | 
					 | 
				
			||||||
            long timestamp = systemInfos.get(0).getTimestamp();
 | 
					 | 
				
			||||||
            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
					 | 
				
			||||||
            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
            systemInfos.forEach(iface -> {
 | 
					 | 
				
			||||||
                iface.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                iface.setCreateTime(createTime);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            // 初始系统数据入库
 | 
					 | 
				
			||||||
            initialSystemInfoService.batchInsertInitialSystemInfo(systemInfos);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("系统data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 监听心跳
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleHeartbeatMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialHeartbeatListen> heartbeats = JsonDataParser.parseJsonData(message.getData(), InitialHeartbeatListen.class);
 | 
					 | 
				
			||||||
        if(!heartbeats.isEmpty()){
 | 
					 | 
				
			||||||
            InitialHeartbeatListen heartbeat = heartbeats.get(0);
 | 
					 | 
				
			||||||
            String clientId = message.getClientId();
 | 
					 | 
				
			||||||
            log.info("处理心跳消息,客户端ID: {}, 时间: {}", clientId, heartbeat.getTimestamp());
 | 
					 | 
				
			||||||
            // 使用Redis存储状态
 | 
					 | 
				
			||||||
            String statusKey = HEARTBEAT_STATUS_PREFIX + clientId;
 | 
					 | 
				
			||||||
            String timeKey = HEARTBEAT_TIME_PREFIX + clientId;
 | 
					 | 
				
			||||||
            String recoveryCountKey = HEARTBEAT_RECOVERY_COUNT_PREFIX + clientId; // 恢复次数计数器
 | 
					 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
                // 重置丢失计数为0,设置最后心跳时间
 | 
					 | 
				
			||||||
                redisTemplate.opsForValue().set(statusKey, "0");
 | 
					 | 
				
			||||||
                redisTemplate.opsForValue().set(timeKey, String.valueOf(System.currentTimeMillis()));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 检查是否之前有告警状态
 | 
					 | 
				
			||||||
                if (Boolean.TRUE.equals(redisTemplate.hasKey(HEARTBEAT_ALERT_PREFIX + clientId))) {
 | 
					 | 
				
			||||||
                    // 获取当前恢复次数
 | 
					 | 
				
			||||||
                    String recoveryCountStr = redisTemplate.opsForValue().get(recoveryCountKey);
 | 
					 | 
				
			||||||
                    int recoveryCount = (recoveryCountStr == null) ? 1 : Integer.parseInt(recoveryCountStr) + 1;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (recoveryCount == 2) {
 | 
					 | 
				
			||||||
                        // 达到2次恢复,执行状态修改
 | 
					 | 
				
			||||||
                        log.warn("客户端ID: {} 心跳恢复达到2次,修改设备状态为在线", clientId);
 | 
					 | 
				
			||||||
                        insertHeartbeatLog(clientId, "2", "心跳恢复,设备在线状态改为在线");
 | 
					 | 
				
			||||||
                        redisTemplate.delete(HEARTBEAT_ALERT_PREFIX + clientId);
 | 
					 | 
				
			||||||
                        redisTemplate.delete(recoveryCountKey); // 清除恢复计数器
 | 
					 | 
				
			||||||
                        // 修改资源状态
 | 
					 | 
				
			||||||
                        getResourceMsg(clientId, "1");
 | 
					 | 
				
			||||||
                    } else {
 | 
					 | 
				
			||||||
                        // 未达到2次,只记录恢复次数
 | 
					 | 
				
			||||||
                        log.info("客户端ID: {} 心跳恢复第{}次", clientId, recoveryCount);
 | 
					 | 
				
			||||||
                        redisTemplate.opsForValue().set(recoveryCountKey, String.valueOf(recoveryCount));
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } catch (Exception e) {
 | 
					 | 
				
			||||||
                log.error("处理心跳消息异常, clientId: {}", clientId, e);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // 添加一个定时任务方法,定期检查心跳状态
 | 
					 | 
				
			||||||
    @Scheduled(fixedRate = 60000) // 每分钟检查一次
 | 
					 | 
				
			||||||
    public void checkHeartbeatStatus() {
 | 
					 | 
				
			||||||
        long currentTime = System.currentTimeMillis();
 | 
					 | 
				
			||||||
        // 获取所有客户端时间键
 | 
					 | 
				
			||||||
        Set<String> timeKeys = redisTemplate.keys(HEARTBEAT_TIME_PREFIX + "*");
 | 
					 | 
				
			||||||
        if (timeKeys == null) return;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for (String timeKey : timeKeys) {
 | 
					 | 
				
			||||||
            String clientId = timeKey.substring(HEARTBEAT_TIME_PREFIX.length());
 | 
					 | 
				
			||||||
            String statusKey = HEARTBEAT_STATUS_PREFIX + clientId;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            try {
 | 
					 | 
				
			||||||
                String lastTimeStr = redisTemplate.opsForValue().get(timeKey);
 | 
					 | 
				
			||||||
                if (lastTimeStr == null) continue;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                long lastHeartbeatTime = Long.parseLong(lastTimeStr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (currentTime - lastHeartbeatTime > HEARTBEAT_TIMEOUT) {
 | 
					 | 
				
			||||||
                    // 心跳超时处理
 | 
					 | 
				
			||||||
                    String lostCountStr = redisTemplate.opsForValue().get(statusKey);
 | 
					 | 
				
			||||||
                    int lostCount = (lostCountStr == null ? 0 : Integer.parseInt(lostCountStr)) + 1;
 | 
					 | 
				
			||||||
                    redisTemplate.opsForValue().set(statusKey, String.valueOf(lostCount));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    log.warn("客户端ID: {} 心跳丢失,连续次数: {}", clientId, lostCount);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    if (lostCount == 3) {
 | 
					 | 
				
			||||||
                        insertHeartbeatLog(clientId, "3", "连续三次心跳丢失");
 | 
					 | 
				
			||||||
                        redisTemplate.opsForValue().set(HEARTBEAT_ALERT_PREFIX + clientId, "1");
 | 
					 | 
				
			||||||
                        // 修改资源状态
 | 
					 | 
				
			||||||
                        getResourceMsg(clientId, "0");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            } catch (Exception e) {
 | 
					 | 
				
			||||||
                log.error("检查心跳状态异常, clientId: {}", clientId, e);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 修改资源在线状态
 | 
					 | 
				
			||||||
     * @param clientId
 | 
					 | 
				
			||||||
     * @param status
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void getResourceMsg(String clientId, String status){
 | 
					 | 
				
			||||||
        String ipAddress = null;
 | 
					 | 
				
			||||||
        AllInterfaceNameRemote interfaceNameRemote = new AllInterfaceNameRemote();
 | 
					 | 
				
			||||||
        interfaceNameRemote.setClientId(clientId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // 1. 先获取交换机IP
 | 
					 | 
				
			||||||
        interfaceNameRemote.setResourceType("2");
 | 
					 | 
				
			||||||
        R<AllInterfaceNameRemote> switchResult = remoteRevenueConfigService.getMsgByClientId(
 | 
					 | 
				
			||||||
                interfaceNameRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (switchResult != null && switchResult.getData() != null &&
 | 
					 | 
				
			||||||
                StringUtils.isNotEmpty(switchResult.getData().getSwitchIp())) {
 | 
					 | 
				
			||||||
            // 更新交换机状态
 | 
					 | 
				
			||||||
            ipAddress = switchResult.getData().getSwitchIp();
 | 
					 | 
				
			||||||
            updateResourceStatus(ipAddress, status);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // 2. 再获取服务器IP
 | 
					 | 
				
			||||||
            interfaceNameRemote.setResourceType("1");
 | 
					 | 
				
			||||||
            R<AllInterfaceNameRemote> serverResult = remoteRevenueConfigService.getMsgByClientId(
 | 
					 | 
				
			||||||
                    interfaceNameRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (serverResult != null && serverResult.getData() != null &&
 | 
					 | 
				
			||||||
                    StringUtils.isNotEmpty(serverResult.getData().getServerIp())) {
 | 
					 | 
				
			||||||
                // 更新服务器状态
 | 
					 | 
				
			||||||
                updateResourceStatus(serverResult.getData().getServerIp(), status);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            // 3. 如果没有交换机IP,只获取服务器IP
 | 
					 | 
				
			||||||
            interfaceNameRemote.setResourceType("1");
 | 
					 | 
				
			||||||
            R<AllInterfaceNameRemote> serverResult = remoteRevenueConfigService.getMsgByClientId(
 | 
					 | 
				
			||||||
                    interfaceNameRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (serverResult != null && serverResult.getData() != null &&
 | 
					 | 
				
			||||||
                    StringUtils.isNotEmpty(serverResult.getData().getServerIp())) {
 | 
					 | 
				
			||||||
                // 更新服务器状态
 | 
					 | 
				
			||||||
                updateResourceStatus(serverResult.getData().getServerIp(), status);
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                log.warn("未找到客户端ID: {} 对应的IP地址", clientId);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // 更新资源状态的公共方法
 | 
					 | 
				
			||||||
    private void updateResourceStatus(String ipAddress, String status) {
 | 
					 | 
				
			||||||
        RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote();
 | 
					 | 
				
			||||||
        rmResourceRegistrationRemote.setOnlineStatus(status);
 | 
					 | 
				
			||||||
        rmResourceRegistrationRemote.setIpAddress(ipAddress);
 | 
					 | 
				
			||||||
        remoteRevenueConfigService.updateStatusByResource(rmResourceRegistrationRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // 插入心跳日志到数据库
 | 
					 | 
				
			||||||
    private void insertHeartbeatLog(String machineId, String status, String remark) {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            InitialHeartbeatListenLog listenLog = new InitialHeartbeatListenLog();
 | 
					 | 
				
			||||||
            listenLog.setClientId(machineId);
 | 
					 | 
				
			||||||
            listenLog.setStatus(status); // 0-离线 1-在线 2-恢复 3-三次丢失
 | 
					 | 
				
			||||||
            listenLog.setRemark(remark);
 | 
					 | 
				
			||||||
            listenLog.setCreateTime(new Date());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // 调用DAO或Service插入日志
 | 
					 | 
				
			||||||
            initialHeartbeatListenLog.insertInitialHeartbeatListenLog(listenLog);
 | 
					 | 
				
			||||||
            log.info("已记录心跳日志,客户端ID: {}, 状态: {}", machineId, status);
 | 
					 | 
				
			||||||
        } catch (Exception e) {
 | 
					 | 
				
			||||||
            log.error("插入心跳日志失败", e);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 应答信息
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private RspVo handleResponseMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<RspVo> rspVoList = JsonDataParser.parseJsonData(message.getData(), RspVo.class);
 | 
					 | 
				
			||||||
        if (!rspVoList.isEmpty()) {
 | 
					 | 
				
			||||||
            RspVo rsp = rspVoList.get(0);
 | 
					 | 
				
			||||||
            log.info("应答信息:{}",rsp);
 | 
					 | 
				
			||||||
            return rsp;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return null;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 注册应答处理
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
//    private void handleRegisterMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
//        RspVo rspVo = handleResponseMessage(message);
 | 
					 | 
				
			||||||
//        String clientId = message.getClientId();
 | 
					 | 
				
			||||||
//        if (rspVo != null && rspVo.getResCode() == 1) {
 | 
					 | 
				
			||||||
//            RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote();
 | 
					 | 
				
			||||||
//            rmResourceRegistrationRemote.setRegistrationStatus("1");
 | 
					 | 
				
			||||||
//            rmResourceRegistrationRemote.setHardwareSn(clientId);
 | 
					 | 
				
			||||||
//            remoteRevenueConfigService.updateStatusByResource(rmResourceRegistrationRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
//        }else{
 | 
					 | 
				
			||||||
//            if(rspVo == null){
 | 
					 | 
				
			||||||
//                log.error("注册失败:应答信息为null");
 | 
					 | 
				
			||||||
//            }else{
 | 
					 | 
				
			||||||
//                log.error("注册失败:{}",rspVo.getResMsg());
 | 
					 | 
				
			||||||
//            }
 | 
					 | 
				
			||||||
//        }
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,616 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.consumer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.alibaba.fastjson.JSON;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.constant.SecurityConstants;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.domain.R;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.utils.DateUtils;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.utils.StringUtils;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.*;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.vo.RspVo;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.enums.MessageCodeEnum;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.handler.DeviceMessageHandler;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.producer.ConsumeException;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.service.*;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.utils.JsonDataParser;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.AllInterfaceNameRemote;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.EpsInitialTrafficDataRemote;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.InitialSwitchInfoDetailsRemote;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
				
			||||||
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
 | 
				
			||||||
 | 
					import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
 | 
				
			||||||
 | 
					import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
 | 
				
			||||||
 | 
					import org.apache.rocketmq.common.message.MessageExt;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.data.redis.core.RedisTemplate;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.annotation.Scheduled;
 | 
				
			||||||
 | 
					import org.springframework.util.CollectionUtils;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.UnsupportedEncodingException;
 | 
				
			||||||
 | 
					import java.math.BigDecimal;
 | 
				
			||||||
 | 
					import java.math.RoundingMode;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.Set;
 | 
				
			||||||
 | 
					import java.util.function.Function;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 消息监听 v1.0
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
 | 
					public class RocketMsgListenerHistory implements MessageListenerConcurrently {
 | 
				
			||||||
 | 
					    // 心跳状态
 | 
				
			||||||
 | 
					    private static final String HEARTBEAT_STATUS_PREFIX = "heartbeat:status:";
 | 
				
			||||||
 | 
					    // 心跳时间
 | 
				
			||||||
 | 
					    private static final String HEARTBEAT_TIME_PREFIX = "heartbeat:time:";
 | 
				
			||||||
 | 
					    // 心跳告警
 | 
				
			||||||
 | 
					    private static final String HEARTBEAT_ALERT_PREFIX = "heartbeat:alert:";
 | 
				
			||||||
 | 
					    String HEARTBEAT_RECOVERY_COUNT_PREFIX = "heartbeat:recovery:count:";
 | 
				
			||||||
 | 
					    private static final long HEARTBEAT_TIMEOUT = 180000; // 3分钟超时
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private RedisTemplate<String, String> redisTemplate;
 | 
				
			||||||
 | 
					    private final IInitialBandwidthTrafficService initialBandwidthTrafficService;
 | 
				
			||||||
 | 
					    private final RemoteRevenueConfigService remoteRevenueConfigService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialDockerInfoService initialDockerInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialCpuInfoService initialCpuInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialDiskInfoService initialDiskInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialMemoryInfoService initialMemoryInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialMountPointInfoService initialMountPointInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchInfoService initialSwitchInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSystemInfoService initialSystemInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchInfoTempService initialSwitchInfoTempService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialHeartbeatListenLogService initialHeartbeatListenLog;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    public RocketMsgListenerHistory(IInitialBandwidthTrafficService initialBandwidthTrafficService,
 | 
				
			||||||
 | 
					                                    RemoteRevenueConfigService remoteRevenueConfigService) {
 | 
				
			||||||
 | 
					        this.initialBandwidthTrafficService = initialBandwidthTrafficService;
 | 
				
			||||||
 | 
					        this.remoteRevenueConfigService = remoteRevenueConfigService;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private DeviceMessageHandler deviceMessageHandler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 消费消息
 | 
				
			||||||
 | 
					     * @param list    msgs.size() >= 1
 | 
				
			||||||
 | 
					     *                DefaultMQPushConsumer.consumeMessageBatchMaxSize=1,you can modify here
 | 
				
			||||||
 | 
					     *                这里只设置为1,当设置为多个时,list中只要有一条消息消费失败,就会整体重试
 | 
				
			||||||
 | 
					     * @param consumeConcurrentlyContext 上下文信息
 | 
				
			||||||
 | 
					     * @return 消费状态  成功(CONSUME_SUCCESS)或者 重试 (RECONSUME_LATER)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> list, ConsumeConcurrentlyContext consumeConcurrentlyContext) {
 | 
				
			||||||
 | 
					       try{
 | 
				
			||||||
 | 
					           //消息不等于空情况
 | 
				
			||||||
 | 
					           if (!CollectionUtils.isEmpty(list)) {
 | 
				
			||||||
 | 
					               //获取topic
 | 
				
			||||||
 | 
					               for (MessageExt messageExt : list) {
 | 
				
			||||||
 | 
					                   // 解析消息内容
 | 
				
			||||||
 | 
					                   String body = new String(messageExt.getBody());
 | 
				
			||||||
 | 
					                   log.info("接受到的消息为:{}", body);
 | 
				
			||||||
 | 
					                   String tags = messageExt.getTags();
 | 
				
			||||||
 | 
					                   String topic = messageExt.getTopic();
 | 
				
			||||||
 | 
					                   String msgId = messageExt.getMsgId();
 | 
				
			||||||
 | 
					                   String keys = messageExt.getKeys();
 | 
				
			||||||
 | 
					                   int reConsume = messageExt.getReconsumeTimes();
 | 
				
			||||||
 | 
					                   // 消息已经重试了3次,如果不需要再次消费,则返回成功
 | 
				
			||||||
 | 
					                   if (reConsume == 3) {
 | 
				
			||||||
 | 
					                       // TODO 补偿信息
 | 
				
			||||||
 | 
					                       log.error("消息消费三次失败,消息内容:{}", body);
 | 
				
			||||||
 | 
					                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//根据业务返回是否正常
 | 
				
			||||||
 | 
					                   }
 | 
				
			||||||
 | 
					                   if(MessageCodeEnum.TONGRAN_AGENT_UP.getCode().equals(topic)){
 | 
				
			||||||
 | 
					                       // 拿到信息
 | 
				
			||||||
 | 
					                       DeviceMessage message = JSON.parseObject(body, DeviceMessage.class);
 | 
				
			||||||
 | 
					                       // 处理消息
 | 
				
			||||||
 | 
					                       deviceMessageHandler.handleMessage(message);
 | 
				
			||||||
 | 
					                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//业务处理成功
 | 
				
			||||||
 | 
					                   }
 | 
				
			||||||
 | 
					                   // 根据不同的topic处理不同的业务 这里以订单消息为例子
 | 
				
			||||||
 | 
					                   if (MessageCodeEnum.AGENT_MESSAGE_TOPIC.getCode().equals(topic)) {
 | 
				
			||||||
 | 
					                       // 拿到信息
 | 
				
			||||||
 | 
					                       DeviceMessage message = JSON.parseObject(body, DeviceMessage.class);
 | 
				
			||||||
 | 
					                       switch (message.getDataType()){
 | 
				
			||||||
 | 
					                           case "NET":
 | 
				
			||||||
 | 
					                               handleNetMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           case "CPU":
 | 
				
			||||||
 | 
					                               handleCpuMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           case "SYSTEM":
 | 
				
			||||||
 | 
					                               handleSystemMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           case "DISK":
 | 
				
			||||||
 | 
					                               handleDiskMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           case "POINT":
 | 
				
			||||||
 | 
					                               handleMountPointMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           case "MEMORY":
 | 
				
			||||||
 | 
					                               handleMemoryMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           case "DOCKER":
 | 
				
			||||||
 | 
					                               handleDockerMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           case "SWITCHBOARD":
 | 
				
			||||||
 | 
					                               handleSwitchMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           case "HEARTBEAT":
 | 
				
			||||||
 | 
					                               handleHeartbeatMessage(message);
 | 
				
			||||||
 | 
					                               break;
 | 
				
			||||||
 | 
					                           default:
 | 
				
			||||||
 | 
					                               log.warn("未知数据类型:{}",message.getDataType());
 | 
				
			||||||
 | 
					                       }
 | 
				
			||||||
 | 
					                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//业务处理成功
 | 
				
			||||||
 | 
					                   }
 | 
				
			||||||
 | 
					               }
 | 
				
			||||||
 | 
					           }
 | 
				
			||||||
 | 
					           // 消息消费失败
 | 
				
			||||||
 | 
					           //broker会根据设置的messageDelayLevel发起重试,默认16次
 | 
				
			||||||
 | 
					           return ConsumeConcurrentlyStatus.RECONSUME_LATER;
 | 
				
			||||||
 | 
					       } catch (Exception e) {
 | 
				
			||||||
 | 
					           // 调用 handleException 方法处理异常并返回处理结果
 | 
				
			||||||
 | 
					           return handleException(e);
 | 
				
			||||||
 | 
					       }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 异常处理
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param e 捕获的异常
 | 
				
			||||||
 | 
					     * @return 消息消费结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private static ConsumeConcurrentlyStatus handleException(final Exception e) {
 | 
				
			||||||
 | 
					        Class exceptionClass = e.getClass();
 | 
				
			||||||
 | 
					        if (exceptionClass.equals(UnsupportedEncodingException.class)) {
 | 
				
			||||||
 | 
					            log.error(e.getMessage());
 | 
				
			||||||
 | 
					        } else if (exceptionClass.equals(ConsumeException.class)) {
 | 
				
			||||||
 | 
					            log.error(e.getMessage());
 | 
				
			||||||
 | 
					        } else{
 | 
				
			||||||
 | 
					            log.error(e.getMessage());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return ConsumeConcurrentlyStatus.RECONSUME_LATER;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 网络流量数据入库
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleNetMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialBandwidthTraffic> interfaces = JsonDataParser.parseJsonData(message.getData(), InitialBandwidthTraffic.class);
 | 
				
			||||||
 | 
					        if(!interfaces.isEmpty()){
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = interfaces.get(0).getTimestamp();
 | 
				
			||||||
 | 
					            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
				
			||||||
 | 
					            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					            String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",createTime);
 | 
				
			||||||
 | 
					            InitialBandwidthTraffic data = new InitialBandwidthTraffic();
 | 
				
			||||||
 | 
					            interfaces.forEach(iface -> {
 | 
				
			||||||
 | 
					                iface.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                iface.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // 批量入库集合
 | 
				
			||||||
 | 
					            data.setList(interfaces);
 | 
				
			||||||
 | 
					            // 初始流量数据入库
 | 
				
			||||||
 | 
					            initialBandwidthTrafficService.batchInsert(data);
 | 
				
			||||||
 | 
					            EpsInitialTrafficDataRemote epsInitialTrafficDataRemote = new EpsInitialTrafficDataRemote();
 | 
				
			||||||
 | 
					            epsInitialTrafficDataRemote.setStartTime(timeStr);
 | 
				
			||||||
 | 
					            epsInitialTrafficDataRemote.setEndTime(timeStr);
 | 
				
			||||||
 | 
					            // 复制到业务初始库
 | 
				
			||||||
 | 
					            remoteRevenueConfigService.autoSaveServiceTrafficData(epsInitialTrafficDataRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("NET流量data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * docker数据入库
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleDockerMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialDockerInfo> dockers = JsonDataParser.parseJsonData(message.getData(), InitialDockerInfo.class);
 | 
				
			||||||
 | 
					        if(!dockers.isEmpty()){
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = dockers.get(0).getTimestamp();
 | 
				
			||||||
 | 
					            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
				
			||||||
 | 
					            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					            dockers.forEach(iface -> {
 | 
				
			||||||
 | 
					                iface.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                iface.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // 初始容器数据入库
 | 
				
			||||||
 | 
					            initialDockerInfoService.batchInsertInitialDockerInfo(dockers);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("DOCKER容器data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * cpu数据入库
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleCpuMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialCpuInfo> cpus = JsonDataParser.parseJsonData(message.getData(),InitialCpuInfo.class);
 | 
				
			||||||
 | 
					        // 时间戳转换
 | 
				
			||||||
 | 
					        long timestamp = cpus.get(0).getTimestamp();
 | 
				
			||||||
 | 
					        long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
				
			||||||
 | 
					        Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					        if(!cpus.isEmpty()){
 | 
				
			||||||
 | 
					            cpus.forEach(iface -> {
 | 
				
			||||||
 | 
					                iface.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                iface.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // 初始CPU数据入库
 | 
				
			||||||
 | 
					            initialCpuInfoService.batchInsertInitialCpuInfo(cpus);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("CPUdata数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 磁盘数据入库
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleDiskMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialDiskInfo> disks = JsonDataParser.parseJsonData(message.getData(), InitialDiskInfo.class);
 | 
				
			||||||
 | 
					        // 时间戳转换
 | 
				
			||||||
 | 
					        long timestamp = disks.get(0).getTimestamp();
 | 
				
			||||||
 | 
					        long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
				
			||||||
 | 
					        Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					        if(!disks.isEmpty()){
 | 
				
			||||||
 | 
					            disks.forEach(iface -> {
 | 
				
			||||||
 | 
					                iface.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                iface.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // 初始磁盘数据入库
 | 
				
			||||||
 | 
					            initialDiskInfoService.batchInsertInitialDiskInfo(disks);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("磁盘data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 内存数据入库
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleMemoryMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialMemoryInfo> memorys = JsonDataParser.parseJsonData(message.getData(), InitialMemoryInfo.class);
 | 
				
			||||||
 | 
					        if(!memorys.isEmpty()){
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = memorys.get(0).getTimestamp();
 | 
				
			||||||
 | 
					            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
				
			||||||
 | 
					            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					            memorys.forEach(iface -> {
 | 
				
			||||||
 | 
					                iface.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                iface.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // 初始内存数据入库
 | 
				
			||||||
 | 
					            initialMemoryInfoService.batchInsertInitialMemoryInfo(memorys);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("内存data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 挂载点数据入库
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleMountPointMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialMountPointInfo> mountPointInfos = JsonDataParser.parseJsonData(message.getData(), InitialMountPointInfo.class);
 | 
				
			||||||
 | 
					        if(!mountPointInfos.isEmpty()){
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = mountPointInfos.get(0).getTimestamp();
 | 
				
			||||||
 | 
					            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
				
			||||||
 | 
					            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					            mountPointInfos.forEach(iface -> {
 | 
				
			||||||
 | 
					                iface.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                iface.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // 初始挂载点数据入库
 | 
				
			||||||
 | 
					            initialMountPointInfoService.batchInsertInitialMountPointInfo(mountPointInfos);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("挂载点data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 交换机数据入库
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleSwitchMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialSwitchInfo> switchInfos = JsonDataParser.parseJsonData(message.getData(), InitialSwitchInfo.class);
 | 
				
			||||||
 | 
					        if(!switchInfos.isEmpty()){
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = switchInfos.get(0).getTimestamp();
 | 
				
			||||||
 | 
					            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
				
			||||||
 | 
					            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					            String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",createTime);
 | 
				
			||||||
 | 
					            // 查询临时表信息,计算实际流量值
 | 
				
			||||||
 | 
					            InitialSwitchInfoTemp temp = new InitialSwitchInfoTemp();
 | 
				
			||||||
 | 
					            temp.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					            List<InitialSwitchInfoTemp> tempList = initialSwitchInfoTempService.selectInitialSwitchInfoTempList(temp);
 | 
				
			||||||
 | 
					            if(!tempList.isEmpty()){
 | 
				
			||||||
 | 
					                // 1. 构建快速查找的Map
 | 
				
			||||||
 | 
					                Map<String, InitialSwitchInfoTemp> tempMap = tempList.stream()
 | 
				
			||||||
 | 
					                        .collect(Collectors.toMap(
 | 
				
			||||||
 | 
					                                InitialSwitchInfoTemp::getName,
 | 
				
			||||||
 | 
					                                Function.identity(),
 | 
				
			||||||
 | 
					                                (existing, replacement) -> existing
 | 
				
			||||||
 | 
					                        ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 2. 预计算除数(避免重复创建对象)
 | 
				
			||||||
 | 
					                BigDecimal divisor = new BigDecimal(300);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 3. 计算速度
 | 
				
			||||||
 | 
					                switchInfos.forEach(switchInfo -> {
 | 
				
			||||||
 | 
					                    switchInfo.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                    switchInfo.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                    InitialSwitchInfoTemp tempInfo = tempMap.get(switchInfo.getName());
 | 
				
			||||||
 | 
					                    if (tempInfo != null) {
 | 
				
			||||||
 | 
					                        // 计算inSpeed
 | 
				
			||||||
 | 
					                        if (switchInfo.getInBytes() != null && tempInfo.getInBytes() != null) {
 | 
				
			||||||
 | 
					                            BigDecimal inDiff = switchInfo.getInBytes().subtract(tempInfo.getInBytes());
 | 
				
			||||||
 | 
					                            switchInfo.setInSpeed(inDiff.divide(divisor, 2, RoundingMode.HALF_UP));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        // 计算outSpeed
 | 
				
			||||||
 | 
					                        if (switchInfo.getOutBytes() != null && tempInfo.getOutBytes() != null) {
 | 
				
			||||||
 | 
					                            BigDecimal outDiff = switchInfo.getOutBytes().subtract(tempInfo.getOutBytes());
 | 
				
			||||||
 | 
					                            switchInfo.setOutSpeed(outDiff.divide(divisor, 2, RoundingMode.HALF_UP));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }else{
 | 
				
			||||||
 | 
					                switchInfos.forEach(switchInfo -> {
 | 
				
			||||||
 | 
					                    switchInfo.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                    switchInfo.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // 清空临时表对应switch信息
 | 
				
			||||||
 | 
					            initialSwitchInfoTempService.truncateSwitchInfoTemp(message.getClientId());
 | 
				
			||||||
 | 
					            // 临时表 用来计算inSpeed outSeppd
 | 
				
			||||||
 | 
					            initialSwitchInfoTempService.batchInsertInitialSwitchInfoTemp(switchInfos);
 | 
				
			||||||
 | 
					            // 初始交换机数据入库
 | 
				
			||||||
 | 
					            initialSwitchInfoService.batchInsertInitialSwitchInfo(switchInfos);
 | 
				
			||||||
 | 
					            // 业务表入库
 | 
				
			||||||
 | 
					            InitialSwitchInfoDetailsRemote detailsRemote = new InitialSwitchInfoDetailsRemote();
 | 
				
			||||||
 | 
					            detailsRemote.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					            detailsRemote.setStartTime(timeStr);
 | 
				
			||||||
 | 
					            detailsRemote.setEndTime(timeStr);
 | 
				
			||||||
 | 
					            remoteRevenueConfigService.autoSaveSwitchTraffic(detailsRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("交换机data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 系统数据入库
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleSystemMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialSystemInfo> systemInfos = JsonDataParser.parseJsonData(message.getData(), InitialSystemInfo.class);
 | 
				
			||||||
 | 
					        if(!systemInfos.isEmpty()){
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = systemInfos.get(0).getTimestamp();
 | 
				
			||||||
 | 
					            long millis = timestamp < 1_000_000_000L ? timestamp * 1000 : timestamp;
 | 
				
			||||||
 | 
					            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					            systemInfos.forEach(iface -> {
 | 
				
			||||||
 | 
					                iface.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                iface.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // 初始系统数据入库
 | 
				
			||||||
 | 
					            initialSystemInfoService.batchInsertInitialSystemInfo(systemInfos);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("系统data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 监听心跳
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleHeartbeatMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<InitialHeartbeatListen> heartbeats = JsonDataParser.parseJsonData(message.getData(), InitialHeartbeatListen.class);
 | 
				
			||||||
 | 
					        if(!heartbeats.isEmpty()){
 | 
				
			||||||
 | 
					            InitialHeartbeatListen heartbeat = heartbeats.get(0);
 | 
				
			||||||
 | 
					            String clientId = message.getClientId();
 | 
				
			||||||
 | 
					            log.info("处理心跳消息,客户端ID: {}, 时间: {}", clientId, heartbeat.getTimestamp());
 | 
				
			||||||
 | 
					            // 使用Redis存储状态
 | 
				
			||||||
 | 
					            String statusKey = HEARTBEAT_STATUS_PREFIX + clientId;
 | 
				
			||||||
 | 
					            String timeKey = HEARTBEAT_TIME_PREFIX + clientId;
 | 
				
			||||||
 | 
					            String recoveryCountKey = HEARTBEAT_RECOVERY_COUNT_PREFIX + clientId; // 恢复次数计数器
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                // 重置丢失计数为0,设置最后心跳时间
 | 
				
			||||||
 | 
					                redisTemplate.opsForValue().set(statusKey, "0");
 | 
				
			||||||
 | 
					                redisTemplate.opsForValue().set(timeKey, String.valueOf(System.currentTimeMillis()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 检查是否之前有告警状态
 | 
				
			||||||
 | 
					                if (Boolean.TRUE.equals(redisTemplate.hasKey(HEARTBEAT_ALERT_PREFIX + clientId))) {
 | 
				
			||||||
 | 
					                    // 获取当前恢复次数
 | 
				
			||||||
 | 
					                    String recoveryCountStr = redisTemplate.opsForValue().get(recoveryCountKey);
 | 
				
			||||||
 | 
					                    int recoveryCount = (recoveryCountStr == null) ? 1 : Integer.parseInt(recoveryCountStr) + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (recoveryCount == 2) {
 | 
				
			||||||
 | 
					                        // 达到2次恢复,执行状态修改
 | 
				
			||||||
 | 
					                        log.warn("客户端ID: {} 心跳恢复达到2次,修改设备状态为在线", clientId);
 | 
				
			||||||
 | 
					                        insertHeartbeatLog(clientId, "2", "心跳恢复,设备在线状态改为在线");
 | 
				
			||||||
 | 
					                        redisTemplate.delete(HEARTBEAT_ALERT_PREFIX + clientId);
 | 
				
			||||||
 | 
					                        redisTemplate.delete(recoveryCountKey); // 清除恢复计数器
 | 
				
			||||||
 | 
					                        // 修改资源状态
 | 
				
			||||||
 | 
					                        getResourceMsg(clientId, "1");
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        // 未达到2次,只记录恢复次数
 | 
				
			||||||
 | 
					                        log.info("客户端ID: {} 心跳恢复第{}次", clientId, recoveryCount);
 | 
				
			||||||
 | 
					                        redisTemplate.opsForValue().set(recoveryCountKey, String.valueOf(recoveryCount));
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("处理心跳消息异常, clientId: {}", clientId, e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 添加一个定时任务方法,定期检查心跳状态
 | 
				
			||||||
 | 
					    @Scheduled(fixedRate = 60000) // 每分钟检查一次
 | 
				
			||||||
 | 
					    public void checkHeartbeatStatus() {
 | 
				
			||||||
 | 
					        long currentTime = System.currentTimeMillis();
 | 
				
			||||||
 | 
					        // 获取所有客户端时间键
 | 
				
			||||||
 | 
					        Set<String> timeKeys = redisTemplate.keys(HEARTBEAT_TIME_PREFIX + "*");
 | 
				
			||||||
 | 
					        if (timeKeys == null) return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (String timeKey : timeKeys) {
 | 
				
			||||||
 | 
					            String clientId = timeKey.substring(HEARTBEAT_TIME_PREFIX.length());
 | 
				
			||||||
 | 
					            String statusKey = HEARTBEAT_STATUS_PREFIX + clientId;
 | 
				
			||||||
 | 
					            String alertKey = HEARTBEAT_ALERT_PREFIX + clientId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                // 检查是否已经存在告警
 | 
				
			||||||
 | 
					                String existingAlert = redisTemplate.opsForValue().get(alertKey);
 | 
				
			||||||
 | 
					                if ("1".equals(existingAlert)) {
 | 
				
			||||||
 | 
					                    continue; // 如果已有告警,跳过处理
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                String lastTimeStr = redisTemplate.opsForValue().get(timeKey);
 | 
				
			||||||
 | 
					                if (lastTimeStr == null) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                long lastHeartbeatTime = Long.parseLong(lastTimeStr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (currentTime - lastHeartbeatTime > HEARTBEAT_TIMEOUT) {
 | 
				
			||||||
 | 
					                    // 心跳超时处理
 | 
				
			||||||
 | 
					                    String lostCountStr = redisTemplate.opsForValue().get(statusKey);
 | 
				
			||||||
 | 
					                    int lostCount = (lostCountStr == null ? 0 : Integer.parseInt(lostCountStr)) + 1;
 | 
				
			||||||
 | 
					                    redisTemplate.opsForValue().set(statusKey, String.valueOf(lostCount));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    log.warn("客户端ID: {} 心跳丢失,连续次数: {}", clientId, lostCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (lostCount >= 3) {
 | 
				
			||||||
 | 
					                        insertHeartbeatLog(clientId, "3", "连续三次心跳丢失");
 | 
				
			||||||
 | 
					                        redisTemplate.opsForValue().set(HEARTBEAT_ALERT_PREFIX + clientId, "1");
 | 
				
			||||||
 | 
					                        // 设置告警后删除timeKey和statusKey
 | 
				
			||||||
 | 
					                        redisTemplate.delete(timeKey);
 | 
				
			||||||
 | 
					                        redisTemplate.delete(statusKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        log.info("客户端ID: {} 已设置告警并清理心跳记录", clientId);
 | 
				
			||||||
 | 
					                        // 修改资源状态
 | 
				
			||||||
 | 
					                        getResourceMsg(clientId, "0");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }else {
 | 
				
			||||||
 | 
					                    // 如果心跳正常,重置丢失次数
 | 
				
			||||||
 | 
					                    redisTemplate.opsForValue().set(statusKey, "0");
 | 
				
			||||||
 | 
					                    log.debug("客户端ID: {} 心跳正常,重置丢失次数", clientId);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("检查心跳状态异常, clientId: {}", clientId, e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改资源在线状态
 | 
				
			||||||
 | 
					     * @param clientId
 | 
				
			||||||
 | 
					     * @param status
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void getResourceMsg(String clientId, String status){
 | 
				
			||||||
 | 
					        String ipAddress = null;
 | 
				
			||||||
 | 
					        AllInterfaceNameRemote interfaceNameRemote = new AllInterfaceNameRemote();
 | 
				
			||||||
 | 
					        interfaceNameRemote.setClientId(clientId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 1. 先获取交换机IP
 | 
				
			||||||
 | 
					        interfaceNameRemote.setResourceType("2");
 | 
				
			||||||
 | 
					        R<AllInterfaceNameRemote> switchResult = remoteRevenueConfigService.getMsgByClientId(
 | 
				
			||||||
 | 
					                interfaceNameRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (switchResult != null && switchResult.getData() != null &&
 | 
				
			||||||
 | 
					                StringUtils.isNotEmpty(switchResult.getData().getSwitchIp())) {
 | 
				
			||||||
 | 
					            // 更新交换机状态
 | 
				
			||||||
 | 
					            ipAddress = switchResult.getData().getSwitchIp();
 | 
				
			||||||
 | 
					            updateResourceStatus(ipAddress, status);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 2. 再获取服务器IP
 | 
				
			||||||
 | 
					            interfaceNameRemote.setResourceType("1");
 | 
				
			||||||
 | 
					            R<AllInterfaceNameRemote> serverResult = remoteRevenueConfigService.getMsgByClientId(
 | 
				
			||||||
 | 
					                    interfaceNameRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (serverResult != null && serverResult.getData() != null &&
 | 
				
			||||||
 | 
					                    StringUtils.isNotEmpty(serverResult.getData().getServerIp())) {
 | 
				
			||||||
 | 
					                // 更新服务器状态
 | 
				
			||||||
 | 
					                updateResourceStatus(serverResult.getData().getServerIp(), status);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // 3. 如果没有交换机IP,只获取服务器IP
 | 
				
			||||||
 | 
					            interfaceNameRemote.setResourceType("1");
 | 
				
			||||||
 | 
					            R<AllInterfaceNameRemote> serverResult = remoteRevenueConfigService.getMsgByClientId(
 | 
				
			||||||
 | 
					                    interfaceNameRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (serverResult != null && serverResult.getData() != null &&
 | 
				
			||||||
 | 
					                    StringUtils.isNotEmpty(serverResult.getData().getServerIp())) {
 | 
				
			||||||
 | 
					                // 更新服务器状态
 | 
				
			||||||
 | 
					                updateResourceStatus(serverResult.getData().getServerIp(), status);
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					                log.warn("未找到客户端ID: {} 对应的IP地址", clientId);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // 更新资源状态的公共方法
 | 
				
			||||||
 | 
					    private void updateResourceStatus(String ipAddress, String status) {
 | 
				
			||||||
 | 
					        RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote();
 | 
				
			||||||
 | 
					        rmResourceRegistrationRemote.setOnlineStatus(status);
 | 
				
			||||||
 | 
					        rmResourceRegistrationRemote.setRegistrationStatus(status);
 | 
				
			||||||
 | 
					        rmResourceRegistrationRemote.setIpAddress(ipAddress);
 | 
				
			||||||
 | 
					        remoteRevenueConfigService.updateStatusByResource(rmResourceRegistrationRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    // 插入心跳日志到数据库
 | 
				
			||||||
 | 
					    private void insertHeartbeatLog(String machineId, String status, String remark) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            InitialHeartbeatListenLog listenLog = new InitialHeartbeatListenLog();
 | 
				
			||||||
 | 
					            listenLog.setClientId(machineId);
 | 
				
			||||||
 | 
					            listenLog.setStatus(status); // 0-离线 1-在线 2-恢复 3-三次丢失
 | 
				
			||||||
 | 
					            listenLog.setRemark(remark);
 | 
				
			||||||
 | 
					            listenLog.setCreateTime(new Date());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 调用DAO或Service插入日志
 | 
				
			||||||
 | 
					            initialHeartbeatListenLog.insertInitialHeartbeatListenLog(listenLog);
 | 
				
			||||||
 | 
					            log.info("已记录心跳日志,客户端ID: {}, 状态: {}", machineId, status);
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            log.error("插入心跳日志失败", e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 应答信息
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private RspVo handleResponseMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<RspVo> rspVoList = JsonDataParser.parseJsonData(message.getData(), RspVo.class);
 | 
				
			||||||
 | 
					        if (!rspVoList.isEmpty()) {
 | 
				
			||||||
 | 
					            RspVo rsp = rspVoList.get(0);
 | 
				
			||||||
 | 
					            log.info("应答信息:{}",rsp);
 | 
				
			||||||
 | 
					            return rsp;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 注册应答处理
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					//    private void handleRegisterMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					//        RspVo rspVo = handleResponseMessage(message);
 | 
				
			||||||
 | 
					//        String clientId = message.getClientId();
 | 
				
			||||||
 | 
					//        if (rspVo != null && rspVo.getResCode() == 1) {
 | 
				
			||||||
 | 
					//            RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote();
 | 
				
			||||||
 | 
					//            rmResourceRegistrationRemote.setRegistrationStatus("1");
 | 
				
			||||||
 | 
					//            rmResourceRegistrationRemote.setHardwareSn(clientId);
 | 
				
			||||||
 | 
					//            remoteRevenueConfigService.updateStatusByResource(rmResourceRegistrationRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					//        }else{
 | 
				
			||||||
 | 
					//            if(rspVo == null){
 | 
				
			||||||
 | 
					//                log.error("注册失败:应答信息为null");
 | 
				
			||||||
 | 
					//            }else{
 | 
				
			||||||
 | 
					//                log.error("注册失败:{}",rspVo.getResMsg());
 | 
				
			||||||
 | 
					//            }
 | 
				
			||||||
 | 
					//        }
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,102 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.controller;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.utils.poi.ExcelUtil;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.web.controller.BaseController;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.web.domain.AjaxResult;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.web.page.PageDomain;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.web.page.TableDataInfo;
 | 
				
			||||||
 | 
					import com.ruoyi.common.log.annotation.Log;
 | 
				
			||||||
 | 
					import com.ruoyi.common.log.enums.BusinessType;
 | 
				
			||||||
 | 
					import com.ruoyi.common.security.annotation.RequiresPermissions;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.RmAgentManagement;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.service.IRmAgentManagementService;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.web.bind.annotation.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.servlet.http.HttpServletResponse;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Agent管理Controller
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author gyt
 | 
				
			||||||
 | 
					 * @date 2025-09-15
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@RestController
 | 
				
			||||||
 | 
					@RequestMapping("/agentManagement")
 | 
				
			||||||
 | 
					public class RmAgentManagementController extends BaseController
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IRmAgentManagementService rmAgentManagementService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询Agent管理列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:management:list")
 | 
				
			||||||
 | 
					    @GetMapping("/list")
 | 
				
			||||||
 | 
					    public TableDataInfo list(RmAgentManagement rmAgentManagement)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        PageDomain pageDomain = new PageDomain();
 | 
				
			||||||
 | 
					        pageDomain.setPageNum(rmAgentManagement.getPageNum());
 | 
				
			||||||
 | 
					        pageDomain.setPageSize(rmAgentManagement.getPageSize());
 | 
				
			||||||
 | 
					        startPage(pageDomain);
 | 
				
			||||||
 | 
					        List<RmAgentManagement> list = rmAgentManagementService.selectRmAgentManagementList(rmAgentManagement);
 | 
				
			||||||
 | 
					        return getDataTable(list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 导出Agent管理列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:management:export")
 | 
				
			||||||
 | 
					    @Log(title = "Agent管理", businessType = BusinessType.EXPORT)
 | 
				
			||||||
 | 
					    @PostMapping("/export")
 | 
				
			||||||
 | 
					    public void export(HttpServletResponse response, RmAgentManagement rmAgentManagement)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        List<RmAgentManagement> list = rmAgentManagementService.selectRmAgentManagementList(rmAgentManagement);
 | 
				
			||||||
 | 
					        ExcelUtil<RmAgentManagement> util = new ExcelUtil<RmAgentManagement>(RmAgentManagement.class);
 | 
				
			||||||
 | 
					        util.exportExcel(response, list, "Agent管理数据");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取Agent管理详细信息
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:management:query")
 | 
				
			||||||
 | 
					    @GetMapping(value = "/{id}")
 | 
				
			||||||
 | 
					    public AjaxResult getInfo(@PathVariable("id") Long id)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return success(rmAgentManagementService.selectRmAgentManagementById(id));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 新增Agent管理
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:management:add")
 | 
				
			||||||
 | 
					    @Log(title = "Agent管理", businessType = BusinessType.INSERT)
 | 
				
			||||||
 | 
					    @PostMapping
 | 
				
			||||||
 | 
					    public AjaxResult add(@RequestBody RmAgentManagement rmAgentManagement)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return toAjax(rmAgentManagementService.addRmAgentManagement(rmAgentManagement));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改Agent管理
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:management:edit")
 | 
				
			||||||
 | 
					    @Log(title = "Agent管理", businessType = BusinessType.UPDATE)
 | 
				
			||||||
 | 
					    @PutMapping
 | 
				
			||||||
 | 
					    public AjaxResult edit(@RequestBody RmAgentManagement rmAgentManagement)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return toAjax(rmAgentManagementService.updateRmAgentManagement(rmAgentManagement));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 删除Agent管理
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:management:remove")
 | 
				
			||||||
 | 
					    @Log(title = "Agent管理", businessType = BusinessType.DELETE)
 | 
				
			||||||
 | 
						@DeleteMapping("/{ids}")
 | 
				
			||||||
 | 
					    public AjaxResult remove(@PathVariable Long[] ids)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return toAjax(rmAgentManagementService.deleteRmAgentManagementByIds(ids));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -50,10 +50,11 @@ public class RmMonitorPolicyController extends BaseController
 | 
				
			|||||||
    @RequiresPermissions("rocketmq:policy:export")
 | 
					    @RequiresPermissions("rocketmq:policy:export")
 | 
				
			||||||
    @Log(title = "资源监控策略", businessType = BusinessType.EXPORT)
 | 
					    @Log(title = "资源监控策略", businessType = BusinessType.EXPORT)
 | 
				
			||||||
    @PostMapping("/export")
 | 
					    @PostMapping("/export")
 | 
				
			||||||
    public void export(HttpServletResponse response, RmMonitorPolicy rmMonitorPolicy)
 | 
					    public void export(HttpServletResponse response, @RequestBody RmMonitorPolicy rmMonitorPolicy)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        List<RmMonitorPolicy> list = rmMonitorPolicyService.selectRmMonitorPolicyList(rmMonitorPolicy);
 | 
					        List<RmMonitorPolicy> list = rmMonitorPolicyService.selectRmMonitorPolicyList(rmMonitorPolicy);
 | 
				
			||||||
        ExcelUtil<RmMonitorPolicy> util = new ExcelUtil<RmMonitorPolicy>(RmMonitorPolicy.class);
 | 
					        ExcelUtil<RmMonitorPolicy> util = new ExcelUtil<RmMonitorPolicy>(RmMonitorPolicy.class);
 | 
				
			||||||
 | 
					        util.showColumn(rmMonitorPolicy.getProperties());
 | 
				
			||||||
        util.exportExcel(response, list, "资源监控策略数据");
 | 
					        util.exportExcel(response, list, "资源监控策略数据");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -90,7 +91,11 @@ public class RmMonitorPolicyController extends BaseController
 | 
				
			|||||||
    @PutMapping
 | 
					    @PutMapping
 | 
				
			||||||
    public AjaxResult edit(@RequestBody RmMonitorPolicy rmMonitorPolicy)
 | 
					    public AjaxResult edit(@RequestBody RmMonitorPolicy rmMonitorPolicy)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        return toAjax(rmMonitorPolicyService.updateRmMonitorPolicy(rmMonitorPolicy));
 | 
					        int rows = rmMonitorPolicyService.updateRmMonitorPolicy(rmMonitorPolicy);
 | 
				
			||||||
 | 
					        if(rows == -1){
 | 
				
			||||||
 | 
					            return AjaxResult.error("资源监控策略新增失败,该资源组已绑定其他策略");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return toAjax(rows);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 资源监控策略下发
 | 
					     * 资源监控策略下发
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -52,10 +52,11 @@ public class RmMonitorTemplateController extends BaseController
 | 
				
			|||||||
    @RequiresPermissions("rocketmq:template:export")
 | 
					    @RequiresPermissions("rocketmq:template:export")
 | 
				
			||||||
    @Log(title = "监控模板", businessType = BusinessType.EXPORT)
 | 
					    @Log(title = "监控模板", businessType = BusinessType.EXPORT)
 | 
				
			||||||
    @PostMapping("/export")
 | 
					    @PostMapping("/export")
 | 
				
			||||||
    public void export(HttpServletResponse response, RmMonitorTemplate rmMonitorTemplate)
 | 
					    public void export(HttpServletResponse response, @RequestBody RmMonitorTemplate rmMonitorTemplate)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        List<RmMonitorTemplate> list = rmMonitorTemplateService.selectRmMonitorTemplateList(rmMonitorTemplate);
 | 
					        List<RmMonitorTemplate> list = rmMonitorTemplateService.selectRmMonitorTemplateList(rmMonitorTemplate);
 | 
				
			||||||
        ExcelUtil<RmMonitorTemplate> util = new ExcelUtil<RmMonitorTemplate>(RmMonitorTemplate.class);
 | 
					        ExcelUtil<RmMonitorTemplate> util = new ExcelUtil<RmMonitorTemplate>(RmMonitorTemplate.class);
 | 
				
			||||||
 | 
					        util.showColumn(rmMonitorTemplate.getProperties());
 | 
				
			||||||
        util.exportExcel(response, list, "监控模板数据");
 | 
					        util.exportExcel(response, list, "监控模板数据");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,8 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.domain;
 | 
					package com.ruoyi.rocketmq.domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import org.apache.commons.lang3.builder.ToStringBuilder;
 | 
					 | 
				
			||||||
import org.apache.commons.lang3.builder.ToStringStyle;
 | 
					 | 
				
			||||||
import com.ruoyi.common.core.annotation.Excel;
 | 
					import com.ruoyi.common.core.annotation.Excel;
 | 
				
			||||||
import com.ruoyi.common.core.web.domain.BaseEntity;
 | 
					import com.ruoyi.common.core.web.domain.BaseEntity;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 心跳信息日志对象 initial_heartbeat_listen_log
 | 
					 * 心跳信息日志对象 initial_heartbeat_listen_log
 | 
				
			||||||
@@ -11,47 +10,16 @@ import com.ruoyi.common.core.web.domain.BaseEntity;
 | 
				
			|||||||
 * @author gyt
 | 
					 * @author gyt
 | 
				
			||||||
 * @date 2025-09-08
 | 
					 * @date 2025-09-08
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
public class InitialHeartbeatListenLog extends BaseEntity
 | 
					public class InitialHeartbeatListenLog extends BaseEntity
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    private static final long serialVersionUID = 1L;
 | 
					    private static final long serialVersionUID = 1L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private Long id;
 | 
				
			||||||
    /** 客户端ID */
 | 
					    /** 客户端ID */
 | 
				
			||||||
    private String clientId;
 | 
					    private String clientId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** 状态0-正常 1-恢复 2-两次丢失 3-三次丢失 */
 | 
					    /** 状态0-正常 1-恢复 2-两次丢失 3-三次丢失 */
 | 
				
			||||||
    @Excel(name = "状态0-正常 1-恢复 2-两次丢失 3-三次丢失")
 | 
					    @Excel(name = "状态0-正常 1-恢复 2-两次丢失 3-三次丢失")
 | 
				
			||||||
    private String status;
 | 
					    private String status;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setClientId(String clientId) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.clientId = clientId;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public String getClientId() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return clientId;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setStatus(String status) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.status = status;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public String getStatus() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return status;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public String toString() {
 | 
					 | 
				
			||||||
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
 | 
					 | 
				
			||||||
            .append("clientId", getClientId())
 | 
					 | 
				
			||||||
            .append("status", getStatus())
 | 
					 | 
				
			||||||
            .append("remark", getRemark())
 | 
					 | 
				
			||||||
            .append("createTime", getCreateTime())
 | 
					 | 
				
			||||||
            .append("updateTime", getUpdateTime())
 | 
					 | 
				
			||||||
            .append("createBy", getCreateBy())
 | 
					 | 
				
			||||||
            .append("updateBy", getUpdateBy())
 | 
					 | 
				
			||||||
            .toString();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,77 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonFormat;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.annotation.Excel;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.web.domain.BaseEntity;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Agent管理对象 rm_agent_management
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author gyt
 | 
				
			||||||
 | 
					 * @date 2025-09-15
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class RmAgentManagement extends BaseEntity
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    private static final long serialVersionUID = 1L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 主键ID */
 | 
				
			||||||
 | 
					    private Long id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 硬件SN码 */
 | 
				
			||||||
 | 
					    @Excel(name = "硬件SN码")
 | 
				
			||||||
 | 
					    private String hardwareSn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 资源名称 */
 | 
				
			||||||
 | 
					    @Excel(name = "资源名称")
 | 
				
			||||||
 | 
					    private String resourceName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 内网IP地址 */
 | 
				
			||||||
 | 
					    @Excel(name = "内网IP地址")
 | 
				
			||||||
 | 
					    private String internalIp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Agent状态:0-离线,1-在线,2-异常 */
 | 
				
			||||||
 | 
					    @Excel(name = "Agent状态:0-离线,1-在线,2-异常")
 | 
				
			||||||
 | 
					    private String status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** Agent版本号 */
 | 
				
			||||||
 | 
					    @Excel(name = "Agent版本号")
 | 
				
			||||||
 | 
					    private String agentVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 执行方式 */
 | 
				
			||||||
 | 
					    @Excel(name = "执行方式")
 | 
				
			||||||
 | 
					    private Integer method;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 定时更新时间(cron表达式) */
 | 
				
			||||||
 | 
					    @Excel(name = "定时更新时间")
 | 
				
			||||||
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
				
			||||||
 | 
					    private LocalDateTime scheduledUpdateTime;
 | 
				
			||||||
 | 
					    /** 文件地址格式 */
 | 
				
			||||||
 | 
					    @Excel(name = "文件地址格式")
 | 
				
			||||||
 | 
					    private Long fileUrlType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 文件地址 */
 | 
				
			||||||
 | 
					    @Excel(name = "文件地址")
 | 
				
			||||||
 | 
					    private String fileUrl;
 | 
				
			||||||
 | 
					    /** 文件目录 */
 | 
				
			||||||
 | 
					    @Excel(name = "文件目录")
 | 
				
			||||||
 | 
					    private String fileDirectory;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 最后一次更新结果(success/failure) */
 | 
				
			||||||
 | 
					    @Excel(name = "最后一次更新结果", readConverterExp = "s=uccess/failure")
 | 
				
			||||||
 | 
					    private String lastUpdateResult;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 最后一次更新时间 */
 | 
				
			||||||
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd")
 | 
				
			||||||
 | 
					    @Excel(name = "最后一次更新时间", width = 30, dateFormat = "yyyy-MM-dd")
 | 
				
			||||||
 | 
					    private Date lastUpdateTime;
 | 
				
			||||||
 | 
					    /** 生效服务器id */
 | 
				
			||||||
 | 
					    private String includeIds;
 | 
				
			||||||
 | 
					    /** 生效服务器名称 */
 | 
				
			||||||
 | 
					    private String includeNames;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -23,17 +23,6 @@ public class RmMonitorPolicy extends BaseEntity
 | 
				
			|||||||
    /** 主键ID */
 | 
					    /** 主键ID */
 | 
				
			||||||
    private Long id;
 | 
					    private Long id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** 模板ID */
 | 
					 | 
				
			||||||
    private Long templateId;
 | 
					 | 
				
			||||||
    /** 模板名称 */
 | 
					 | 
				
			||||||
    @Excel(name = "关联监控模板")
 | 
					 | 
				
			||||||
    private String templateName;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** 资源组ID */
 | 
					 | 
				
			||||||
    @Excel(name = "资源组ID")
 | 
					 | 
				
			||||||
    private Long resourceGroupId;
 | 
					 | 
				
			||||||
    /** 资源组名称 */
 | 
					 | 
				
			||||||
    private String resourceGroupName;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** 策略名称 */
 | 
					    /** 策略名称 */
 | 
				
			||||||
    @Excel(name = "策略名称")
 | 
					    @Excel(name = "策略名称")
 | 
				
			||||||
@@ -43,17 +32,38 @@ public class RmMonitorPolicy extends BaseEntity
 | 
				
			|||||||
    @Excel(name = "描述")
 | 
					    @Excel(name = "描述")
 | 
				
			||||||
    private String description;
 | 
					    private String description;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 资源组ID */
 | 
				
			||||||
 | 
					    private Long resourceGroupId;
 | 
				
			||||||
 | 
					    /** 资源组名称 */
 | 
				
			||||||
 | 
					    @Excel(name = "关联资源组")
 | 
				
			||||||
 | 
					    private String resourceGroupName;
 | 
				
			||||||
 | 
					    /** 模板ID */
 | 
				
			||||||
 | 
					    private Long templateId;
 | 
				
			||||||
 | 
					    /** 模板名称 */
 | 
				
			||||||
 | 
					    @Excel(name = "关联监控模板")
 | 
				
			||||||
 | 
					    private String templateName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** 状态:0-待下发,1-已下发 */
 | 
					    /** 状态:0-待下发,1-已下发 */
 | 
				
			||||||
    @Excel(name = "状态:0-待下发,1-已下发")
 | 
					    @Excel(name = "策略状态", readConverterExp = "0=待下发,1=已下发")
 | 
				
			||||||
    private String status;
 | 
					    private String status;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** 下发策略时间 */
 | 
					    /** 下发策略时间 */
 | 
				
			||||||
    @JsonFormat(pattern = "yyyy-MM-dd")
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
				
			||||||
    @Excel(name = "下发策略时间", width = 30, dateFormat = "yyyy-MM-dd")
 | 
					    @Excel(name = "下发策略时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
 | 
				
			||||||
    private Date deployTime;
 | 
					    private Date deployTime;
 | 
				
			||||||
    /** 采集周期及id集合 */
 | 
					    /** 采集周期及id集合 */
 | 
				
			||||||
    private List<RmMonitorPolicyVo> collectionAndIdList;
 | 
					    private List<RmMonitorPolicyVo> collectionAndIdList;
 | 
				
			||||||
    /** 资源类型,linux switch */
 | 
					    /** 资源类型,linux switch */
 | 
				
			||||||
    private String resourceType;
 | 
					    private String resourceType;
 | 
				
			||||||
 | 
					    /** 查询条件名称 */
 | 
				
			||||||
 | 
					    private String queryName;
 | 
				
			||||||
 | 
					    /** 创建时间 */
 | 
				
			||||||
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
				
			||||||
 | 
					    @Excel(name = "创建时间")
 | 
				
			||||||
 | 
					    private Date createTime;
 | 
				
			||||||
 | 
					    /** 修改时间 */
 | 
				
			||||||
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
				
			||||||
 | 
					    @Excel(name = "修改时间")
 | 
				
			||||||
 | 
					    private Date updateTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,9 +1,12 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.domain;
 | 
					package com.ruoyi.rocketmq.domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonFormat;
 | 
				
			||||||
import com.ruoyi.common.core.annotation.Excel;
 | 
					import com.ruoyi.common.core.annotation.Excel;
 | 
				
			||||||
import com.ruoyi.common.core.web.domain.BaseEntity;
 | 
					import com.ruoyi.common.core.web.domain.BaseEntity;
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 监控模板对象 rm_monitor_template
 | 
					 * 监控模板对象 rm_monitor_template
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
@@ -23,7 +26,7 @@ public class RmMonitorTemplate extends BaseEntity
 | 
				
			|||||||
    private String templateName;
 | 
					    private String templateName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** 模板描述 */
 | 
					    /** 模板描述 */
 | 
				
			||||||
    @Excel(name = "模板描述")
 | 
					    @Excel(name = "描述")
 | 
				
			||||||
    private String description;
 | 
					    private String description;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** 监控项 */
 | 
					    /** 监控项 */
 | 
				
			||||||
@@ -35,11 +38,19 @@ public class RmMonitorTemplate extends BaseEntity
 | 
				
			|||||||
    private String discoveryRules;
 | 
					    private String discoveryRules;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /** 资源组ID */
 | 
					    /** 资源组ID */
 | 
				
			||||||
    @Excel(name = "资源组ID")
 | 
					 | 
				
			||||||
    private Long resourceGroupId;
 | 
					    private Long resourceGroupId;
 | 
				
			||||||
    /** 资源组名称 */
 | 
					    /** 资源组名称 */
 | 
				
			||||||
 | 
					    @Excel(name = "关联资源组")
 | 
				
			||||||
    private String resourceGroupName;
 | 
					    private String resourceGroupName;
 | 
				
			||||||
    /** 资源类型(linux,switch) */
 | 
					    /** 资源类型(linux,switch) */
 | 
				
			||||||
    private String resourcyType;
 | 
					    private String resourcyType;
 | 
				
			||||||
 | 
					    /** 创建时间 */
 | 
				
			||||||
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
				
			||||||
 | 
					    @Excel(name = "创建时间")
 | 
				
			||||||
 | 
					    private Date createTime;
 | 
				
			||||||
 | 
					    /** 修改时间 */
 | 
				
			||||||
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
				
			||||||
 | 
					    @Excel(name = "修改时间")
 | 
				
			||||||
 | 
					    private Date updateTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.domain.vo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonFormat;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.time.Instant;
 | 
				
			||||||
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class AgentUpdateVo {
 | 
				
			||||||
 | 
					    /**文件地址,外网HTTP(S)地址 */
 | 
				
			||||||
 | 
					    private String fileUrl;
 | 
				
			||||||
 | 
					    /** 保存文件地址 */
 | 
				
			||||||
 | 
					    private String filePath;
 | 
				
			||||||
 | 
					    /** 执行命令,List<String>格式Json字符串 */
 | 
				
			||||||
 | 
					    private String commands;
 | 
				
			||||||
 | 
					    /** 执行方式:0、立即执行;1、定时执行; */
 | 
				
			||||||
 | 
					    private Integer method;
 | 
				
			||||||
 | 
					    /** 定时时间,执行方式为1、定时执行时该字段必传 */
 | 
				
			||||||
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
 | 
				
			||||||
 | 
					    private LocalDateTime policyTime;
 | 
				
			||||||
 | 
					    /** 时间戳 */
 | 
				
			||||||
 | 
					    private long timestamp = Instant.now().getEpochSecond();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,26 +1,24 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.handler;
 | 
					package com.ruoyi.rocketmq.handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.alibaba.fastjson.JSONObject;
 | 
					 | 
				
			||||||
import com.fasterxml.jackson.databind.JsonNode;
 | 
					import com.fasterxml.jackson.databind.JsonNode;
 | 
				
			||||||
import com.fasterxml.jackson.databind.ObjectMapper;
 | 
					import com.fasterxml.jackson.databind.ObjectMapper;
 | 
				
			||||||
import com.ruoyi.common.core.constant.SecurityConstants;
 | 
					import com.ruoyi.common.core.constant.SecurityConstants;
 | 
				
			||||||
import com.ruoyi.common.core.domain.R;
 | 
					import com.ruoyi.common.core.domain.R;
 | 
				
			||||||
import com.ruoyi.common.core.enums.MsgEnum;
 | 
					import com.ruoyi.common.core.enums.MsgEnum;
 | 
				
			||||||
import com.ruoyi.common.core.utils.DateUtils;
 | 
					import com.ruoyi.common.core.utils.DateUtils;
 | 
				
			||||||
import com.ruoyi.common.core.utils.StringUtils;
 | 
					 | 
				
			||||||
import com.ruoyi.rocketmq.domain.*;
 | 
					import com.ruoyi.rocketmq.domain.*;
 | 
				
			||||||
import com.ruoyi.rocketmq.domain.vo.CollectDataVo;
 | 
					import com.ruoyi.rocketmq.domain.vo.CollectDataVo;
 | 
				
			||||||
import com.ruoyi.rocketmq.domain.vo.RspVo;
 | 
					import com.ruoyi.rocketmq.domain.vo.RspVo;
 | 
				
			||||||
import com.ruoyi.rocketmq.service.*;
 | 
					import com.ruoyi.rocketmq.service.*;
 | 
				
			||||||
import com.ruoyi.rocketmq.utils.JsonDataParser;
 | 
					import com.ruoyi.rocketmq.utils.JsonDataParser;
 | 
				
			||||||
import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
					import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
				
			||||||
import com.ruoyi.system.api.domain.AllInterfaceNameRemote;
 | 
					 | 
				
			||||||
import com.ruoyi.system.api.domain.EpsInitialTrafficDataRemote;
 | 
					import com.ruoyi.system.api.domain.EpsInitialTrafficDataRemote;
 | 
				
			||||||
import com.ruoyi.system.api.domain.InitialSwitchInfoDetailsRemote;
 | 
					import com.ruoyi.system.api.domain.InitialSwitchInfoDetailsRemote;
 | 
				
			||||||
import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
					import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.data.redis.core.RedisTemplate;
 | 
					import org.springframework.data.redis.core.RedisTemplate;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.annotation.EnableScheduling;
 | 
				
			||||||
import org.springframework.scheduling.annotation.Scheduled;
 | 
					import org.springframework.scheduling.annotation.Scheduled;
 | 
				
			||||||
import org.springframework.stereotype.Component;
 | 
					import org.springframework.stereotype.Component;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -37,6 +35,7 @@ import java.util.stream.Collectors;
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
@Slf4j
 | 
					@Slf4j
 | 
				
			||||||
@Component
 | 
					@Component
 | 
				
			||||||
 | 
					@EnableScheduling
 | 
				
			||||||
public class DeviceMessageHandler {
 | 
					public class DeviceMessageHandler {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private final Map<String, Consumer<DeviceMessage>> messageHandlers = new HashMap<>();
 | 
					    private final Map<String, Consumer<DeviceMessage>> messageHandlers = new HashMap<>();
 | 
				
			||||||
@@ -47,7 +46,7 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
    // 心跳告警
 | 
					    // 心跳告警
 | 
				
			||||||
    private static final String HEARTBEAT_ALERT_PREFIX = "heartbeat:alert:";
 | 
					    private static final String HEARTBEAT_ALERT_PREFIX = "heartbeat:alert:";
 | 
				
			||||||
    String HEARTBEAT_RECOVERY_COUNT_PREFIX = "heartbeat:recovery:count:";
 | 
					    String HEARTBEAT_RECOVERY_COUNT_PREFIX = "heartbeat:recovery:count:";
 | 
				
			||||||
    private static final long HEARTBEAT_TIMEOUT = 180000; // 3分钟超时
 | 
					    private static final long HEARTBEAT_TIMEOUT = 30000; // 3分钟超时
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
@@ -507,75 +506,6 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
            throw new RuntimeException("交换机data数据为空");
 | 
					            throw new RuntimeException("交换机data数据为空");
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 交换机数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleSwitchMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialSwitchInfo> switchInfos = JsonDataParser.parseJsonData(message.getData(), InitialSwitchInfo.class);
 | 
					 | 
				
			||||||
        if(!switchInfos.isEmpty()){
 | 
					 | 
				
			||||||
            // 时间戳转换
 | 
					 | 
				
			||||||
            long timestamp = switchInfos.get(0).getTimestamp();
 | 
					 | 
				
			||||||
            long millis = timestamp * 1000;
 | 
					 | 
				
			||||||
            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
            String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",createTime);
 | 
					 | 
				
			||||||
            // 查询临时表信息,计算实际流量值
 | 
					 | 
				
			||||||
            InitialSwitchInfoTemp temp = new InitialSwitchInfoTemp();
 | 
					 | 
				
			||||||
            temp.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
            List<InitialSwitchInfoTemp> tempList = initialSwitchInfoTempService.selectInitialSwitchInfoTempList(temp);
 | 
					 | 
				
			||||||
            if(!tempList.isEmpty()){
 | 
					 | 
				
			||||||
                // 1. 构建快速查找的Map
 | 
					 | 
				
			||||||
                Map<String, InitialSwitchInfoTemp> tempMap = tempList.stream()
 | 
					 | 
				
			||||||
                        .collect(Collectors.toMap(
 | 
					 | 
				
			||||||
                                InitialSwitchInfoTemp::getName,
 | 
					 | 
				
			||||||
                                Function.identity(),
 | 
					 | 
				
			||||||
                                (existing, replacement) -> existing
 | 
					 | 
				
			||||||
                        ));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 2. 预计算除数(避免重复创建对象)
 | 
					 | 
				
			||||||
                BigDecimal divisor = new BigDecimal(300);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                // 3. 计算速度
 | 
					 | 
				
			||||||
                switchInfos.forEach(switchInfo -> {
 | 
					 | 
				
			||||||
                    switchInfo.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                    switchInfo.setCreateTime(createTime);
 | 
					 | 
				
			||||||
                    InitialSwitchInfoTemp tempInfo = tempMap.get(switchInfo.getName());
 | 
					 | 
				
			||||||
                    if (tempInfo != null) {
 | 
					 | 
				
			||||||
                        // 计算inSpeed
 | 
					 | 
				
			||||||
                        if (switchInfo.getInBytes() != null && tempInfo.getInBytes() != null) {
 | 
					 | 
				
			||||||
                            BigDecimal inDiff = switchInfo.getInBytes().subtract(tempInfo.getInBytes());
 | 
					 | 
				
			||||||
                            switchInfo.setInSpeed(inDiff.divide(divisor, 2, RoundingMode.HALF_UP));
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                        // 计算outSpeed
 | 
					 | 
				
			||||||
                        if (switchInfo.getOutBytes() != null && tempInfo.getOutBytes() != null) {
 | 
					 | 
				
			||||||
                            BigDecimal outDiff = switchInfo.getOutBytes().subtract(tempInfo.getOutBytes());
 | 
					 | 
				
			||||||
                            switchInfo.setOutSpeed(outDiff.divide(divisor, 2, RoundingMode.HALF_UP));
 | 
					 | 
				
			||||||
                        }
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            }else{
 | 
					 | 
				
			||||||
                switchInfos.forEach(switchInfo -> {
 | 
					 | 
				
			||||||
                    switchInfo.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                    switchInfo.setCreateTime(createTime);
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            // 清空临时表对应switch信息
 | 
					 | 
				
			||||||
            initialSwitchInfoTempService.truncateSwitchInfoTemp(message.getClientId());
 | 
					 | 
				
			||||||
            // 临时表 用来计算inSpeed outSeppd
 | 
					 | 
				
			||||||
            initialSwitchInfoTempService.batchInsertInitialSwitchInfoTemp(switchInfos);
 | 
					 | 
				
			||||||
            // 初始交换机数据入库
 | 
					 | 
				
			||||||
            initialSwitchInfoService.batchInsertInitialSwitchInfo(switchInfos);
 | 
					 | 
				
			||||||
            // 业务表入库
 | 
					 | 
				
			||||||
            InitialSwitchInfoDetailsRemote detailsRemote = new InitialSwitchInfoDetailsRemote();
 | 
					 | 
				
			||||||
            detailsRemote.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
            detailsRemote.setStartTime(timeStr);
 | 
					 | 
				
			||||||
            detailsRemote.setEndTime(timeStr);
 | 
					 | 
				
			||||||
            remoteRevenueConfigService.autoSaveSwitchTraffic(detailsRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("交换机data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 系统其他信息
 | 
					     * 系统其他信息
 | 
				
			||||||
@@ -609,27 +539,6 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 系统数据入库
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void handleSystemMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
        List<InitialSystemInfo> systemInfos = JsonDataParser.parseJsonData(message.getData(), InitialSystemInfo.class);
 | 
					 | 
				
			||||||
        if(!systemInfos.isEmpty()){
 | 
					 | 
				
			||||||
            // 时间戳转换
 | 
					 | 
				
			||||||
            long timestamp = systemInfos.get(0).getTimestamp();
 | 
					 | 
				
			||||||
            long millis = timestamp * 1000;
 | 
					 | 
				
			||||||
            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
					 | 
				
			||||||
            systemInfos.forEach(iface -> {
 | 
					 | 
				
			||||||
                iface.setClientId(message.getClientId());
 | 
					 | 
				
			||||||
                iface.setCreateTime(createTime);
 | 
					 | 
				
			||||||
            });
 | 
					 | 
				
			||||||
            // 初始系统数据入库
 | 
					 | 
				
			||||||
            initialSystemInfoService.batchInsertInitialSystemInfo(systemInfos);
 | 
					 | 
				
			||||||
        }else{
 | 
					 | 
				
			||||||
            throw new RuntimeException("系统data数据为空");
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 监听心跳
 | 
					     * 监听心跳
 | 
				
			||||||
     * @param message
 | 
					     * @param message
 | 
				
			||||||
@@ -662,7 +571,7 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
                        redisTemplate.delete(HEARTBEAT_ALERT_PREFIX + clientId);
 | 
					                        redisTemplate.delete(HEARTBEAT_ALERT_PREFIX + clientId);
 | 
				
			||||||
                        redisTemplate.delete(recoveryCountKey); // 清除恢复计数器
 | 
					                        redisTemplate.delete(recoveryCountKey); // 清除恢复计数器
 | 
				
			||||||
                        // 修改资源状态
 | 
					                        // 修改资源状态
 | 
				
			||||||
                        getResourceMsg(clientId, "1");
 | 
					                        updateResourceStatus(clientId, "1");
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        // 未达到2次,只记录恢复次数
 | 
					                        // 未达到2次,只记录恢复次数
 | 
				
			||||||
                        log.info("客户端ID: {} 心跳恢复第{}次", clientId, recoveryCount);
 | 
					                        log.info("客户端ID: {} 心跳恢复第{}次", clientId, recoveryCount);
 | 
				
			||||||
@@ -676,7 +585,7 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 添加一个定时任务方法,定期检查心跳状态
 | 
					    // 添加一个定时任务方法,定期检查心跳状态
 | 
				
			||||||
    @Scheduled(fixedRate = 60000) // 每分钟检查一次
 | 
					    @Scheduled(fixedRate = 30000) // 每30s检查一次
 | 
				
			||||||
    public void checkHeartbeatStatus() {
 | 
					    public void checkHeartbeatStatus() {
 | 
				
			||||||
        long currentTime = System.currentTimeMillis();
 | 
					        long currentTime = System.currentTimeMillis();
 | 
				
			||||||
        // 获取所有客户端时间键
 | 
					        // 获取所有客户端时间键
 | 
				
			||||||
@@ -686,8 +595,14 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
        for (String timeKey : timeKeys) {
 | 
					        for (String timeKey : timeKeys) {
 | 
				
			||||||
            String clientId = timeKey.substring(HEARTBEAT_TIME_PREFIX.length());
 | 
					            String clientId = timeKey.substring(HEARTBEAT_TIME_PREFIX.length());
 | 
				
			||||||
            String statusKey = HEARTBEAT_STATUS_PREFIX + clientId;
 | 
					            String statusKey = HEARTBEAT_STATUS_PREFIX + clientId;
 | 
				
			||||||
 | 
					            String alertKey = HEARTBEAT_ALERT_PREFIX + clientId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
 | 
					                // 检查是否已经存在告警
 | 
				
			||||||
 | 
					                String existingAlert = redisTemplate.opsForValue().get(alertKey);
 | 
				
			||||||
 | 
					                if ("1".equals(existingAlert)) {
 | 
				
			||||||
 | 
					                    continue; // 如果已有告警,跳过处理
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                String lastTimeStr = redisTemplate.opsForValue().get(timeKey);
 | 
					                String lastTimeStr = redisTemplate.opsForValue().get(timeKey);
 | 
				
			||||||
                if (lastTimeStr == null) continue;
 | 
					                if (lastTimeStr == null) continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -701,12 +616,21 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                    log.warn("客户端ID: {} 心跳丢失,连续次数: {}", clientId, lostCount);
 | 
					                    log.warn("客户端ID: {} 心跳丢失,连续次数: {}", clientId, lostCount);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (lostCount == 3) {
 | 
					                    if (lostCount >= 3) {
 | 
				
			||||||
                        insertHeartbeatLog(clientId, "3", "连续三次心跳丢失");
 | 
					                        insertHeartbeatLog(clientId, "3", "连续三次心跳丢失");
 | 
				
			||||||
                        redisTemplate.opsForValue().set(HEARTBEAT_ALERT_PREFIX + clientId, "1");
 | 
					                        redisTemplate.opsForValue().set(HEARTBEAT_ALERT_PREFIX + clientId, "1");
 | 
				
			||||||
 | 
					                        // 设置告警后删除timeKey和statusKey
 | 
				
			||||||
 | 
					                        redisTemplate.delete(timeKey);
 | 
				
			||||||
 | 
					                        redisTemplate.delete(statusKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        log.info("客户端ID: {} 已设置告警并清理心跳记录", clientId);
 | 
				
			||||||
                        // 修改资源状态
 | 
					                        // 修改资源状态
 | 
				
			||||||
                        getResourceMsg(clientId, "0");
 | 
					                        updateResourceStatus(clientId, "0");
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
 | 
					                }else {
 | 
				
			||||||
 | 
					                    // 如果心跳正常,重置丢失次数
 | 
				
			||||||
 | 
					                    redisTemplate.opsForValue().set(statusKey, "0");
 | 
				
			||||||
 | 
					                    log.debug("客户端ID: {} 心跳正常,重置丢失次数", clientId);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            } catch (Exception e) {
 | 
					            } catch (Exception e) {
 | 
				
			||||||
                log.error("检查心跳状态异常, clientId: {}", clientId, e);
 | 
					                log.error("检查心跳状态异常, clientId: {}", clientId, e);
 | 
				
			||||||
@@ -714,57 +638,15 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 修改资源在线状态
 | 
					 | 
				
			||||||
     * @param clientId
 | 
					 | 
				
			||||||
     * @param status
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private void getResourceMsg(String clientId, String status){
 | 
					 | 
				
			||||||
        String ipAddress = null;
 | 
					 | 
				
			||||||
        AllInterfaceNameRemote interfaceNameRemote = new AllInterfaceNameRemote();
 | 
					 | 
				
			||||||
        interfaceNameRemote.setClientId(clientId);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // 1. 先获取交换机IP
 | 
					 | 
				
			||||||
        interfaceNameRemote.setResourceType("2");
 | 
					 | 
				
			||||||
        R<AllInterfaceNameRemote> switchResult = remoteRevenueConfigService.getMsgByClientId(
 | 
					 | 
				
			||||||
                interfaceNameRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (switchResult != null && switchResult.getData() != null &&
 | 
					 | 
				
			||||||
                StringUtils.isNotEmpty(switchResult.getData().getSwitchIp())) {
 | 
					 | 
				
			||||||
            // 更新交换机状态
 | 
					 | 
				
			||||||
            ipAddress = switchResult.getData().getSwitchIp();
 | 
					 | 
				
			||||||
            updateResourceStatus(ipAddress, status);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // 2. 再获取服务器IP
 | 
					 | 
				
			||||||
            interfaceNameRemote.setResourceType("1");
 | 
					 | 
				
			||||||
            R<AllInterfaceNameRemote> serverResult = remoteRevenueConfigService.getMsgByClientId(
 | 
					 | 
				
			||||||
                    interfaceNameRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (serverResult != null && serverResult.getData() != null &&
 | 
					 | 
				
			||||||
                    StringUtils.isNotEmpty(serverResult.getData().getServerIp())) {
 | 
					 | 
				
			||||||
                // 更新服务器状态
 | 
					 | 
				
			||||||
                updateResourceStatus(serverResult.getData().getServerIp(), status);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            // 3. 如果没有交换机IP,只获取服务器IP
 | 
					 | 
				
			||||||
            interfaceNameRemote.setResourceType("1");
 | 
					 | 
				
			||||||
            R<AllInterfaceNameRemote> serverResult = remoteRevenueConfigService.getMsgByClientId(
 | 
					 | 
				
			||||||
                    interfaceNameRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (serverResult != null && serverResult.getData() != null &&
 | 
					 | 
				
			||||||
                    StringUtils.isNotEmpty(serverResult.getData().getServerIp())) {
 | 
					 | 
				
			||||||
                // 更新服务器状态
 | 
					 | 
				
			||||||
                updateResourceStatus(serverResult.getData().getServerIp(), status);
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
                log.warn("未找到客户端ID: {} 对应的IP地址", clientId);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    // 更新资源状态的公共方法
 | 
					    // 更新资源状态的公共方法
 | 
				
			||||||
    private void updateResourceStatus(String ipAddress, String status) {
 | 
					    private void updateResourceStatus(String clientId, String status) {
 | 
				
			||||||
 | 
					        log.info("开启更新资源状态========");
 | 
				
			||||||
        RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote();
 | 
					        RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote();
 | 
				
			||||||
        rmResourceRegistrationRemote.setOnlineStatus(status);
 | 
					        rmResourceRegistrationRemote.setOnlineStatus(status);
 | 
				
			||||||
        rmResourceRegistrationRemote.setIpAddress(ipAddress);
 | 
					        if("0".equals(status)){
 | 
				
			||||||
 | 
					            rmResourceRegistrationRemote.setRegistrationStatus(status);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        rmResourceRegistrationRemote.setHardwareSn(clientId);
 | 
				
			||||||
        remoteRevenueConfigService.updateStatusByResource(rmResourceRegistrationRemote, SecurityConstants.INNER);
 | 
					        remoteRevenueConfigService.updateStatusByResource(rmResourceRegistrationRemote, SecurityConstants.INNER);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // 插入心跳日志到数据库
 | 
					    // 插入心跳日志到数据库
 | 
				
			||||||
@@ -835,24 +717,4 @@ public class DeviceMessageHandler {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 注册应答处理
 | 
					 | 
				
			||||||
     * @param message
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
//    private void handleRegisterMessage(DeviceMessage message) {
 | 
					 | 
				
			||||||
//        RspVo rspVo = handleResponseMessage(message);
 | 
					 | 
				
			||||||
//        String clientId = message.getClientId();
 | 
					 | 
				
			||||||
//        if (rspVo != null && rspVo.getResCode() == 1) {
 | 
					 | 
				
			||||||
//            RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote();
 | 
					 | 
				
			||||||
//            rmResourceRegistrationRemote.setRegistrationStatus("1");
 | 
					 | 
				
			||||||
//            rmResourceRegistrationRemote.setHardwareSn(clientId);
 | 
					 | 
				
			||||||
//            remoteRevenueConfigService.updateStatusByResource(rmResourceRegistrationRemote, SecurityConstants.INNER);
 | 
					 | 
				
			||||||
//        }else{
 | 
					 | 
				
			||||||
//            if(rspVo == null){
 | 
					 | 
				
			||||||
//                log.error("注册失败:应答信息为null");
 | 
					 | 
				
			||||||
//            }else{
 | 
					 | 
				
			||||||
//                log.error("注册失败:{}",rspVo.getResMsg());
 | 
					 | 
				
			||||||
//            }
 | 
					 | 
				
			||||||
//        }
 | 
					 | 
				
			||||||
//    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.mapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.RmAgentManagement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Agent管理Mapper接口
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author gyt
 | 
				
			||||||
 | 
					 * @date 2025-09-15
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public interface RmAgentManagementMapper 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param id Agent管理主键
 | 
				
			||||||
 | 
					     * @return Agent管理
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public RmAgentManagement selectRmAgentManagementById(Long id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询Agent管理列表
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return Agent管理集合
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public List<RmAgentManagement> selectRmAgentManagementList(RmAgentManagement rmAgentManagement);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 新增Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int insertRmAgentManagement(RmAgentManagement rmAgentManagement);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int updateRmAgentManagement(RmAgentManagement rmAgentManagement);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 删除Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param id Agent管理主键
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int deleteRmAgentManagementById(Long id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 批量删除Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param ids 需要删除的数据主键集合
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int deleteRmAgentManagementByIds(Long[] ids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    void updateRmAgentManagementBySn(RmAgentManagement rmAgentManagement);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -64,4 +64,5 @@ public interface RmTemplateLinuxMapper
 | 
				
			|||||||
    void batchInsertRmTemplateLinux(@Param("list") List<RmTemplateLinux> linuxItems);
 | 
					    void batchInsertRmTemplateLinux(@Param("list") List<RmTemplateLinux> linuxItems);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int deleteByTemplateId(Long templateId);
 | 
					    int deleteByTemplateId(Long templateId);
 | 
				
			||||||
 | 
					    int updateByTemplateId(Long templateId);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -68,4 +68,6 @@ public interface RmTemplateSwitchMapper
 | 
				
			|||||||
    void batchInsertRmTemplateSwitch(@Param("list") List<RmTemplateSwitch> switchItems);
 | 
					    void batchInsertRmTemplateSwitch(@Param("list") List<RmTemplateSwitch> switchItems);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int deleteByTemplateId(Long templateId);
 | 
					    int deleteByTemplateId(Long templateId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int updateByTemplateId(Long templateId);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,69 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.RmAgentManagement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Agent管理Service接口
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author gyt
 | 
				
			||||||
 | 
					 * @date 2025-09-15
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					public interface IRmAgentManagementService 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param id Agent管理主键
 | 
				
			||||||
 | 
					     * @return Agent管理
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public RmAgentManagement selectRmAgentManagementById(Long id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询Agent管理列表
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return Agent管理集合
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public List<RmAgentManagement> selectRmAgentManagementList(RmAgentManagement rmAgentManagement);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 新增Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int insertRmAgentManagement(RmAgentManagement rmAgentManagement);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int updateRmAgentManagement(RmAgentManagement rmAgentManagement);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 批量删除Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param ids 需要删除的Agent管理主键集合
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int deleteRmAgentManagementByIds(Long[] ids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 删除Agent管理信息
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param id Agent管理主键
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int deleteRmAgentManagementById(Long id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 配置更新策略
 | 
				
			||||||
 | 
					     * @param rmAgentManagement
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    int addRmAgentManagement(RmAgentManagement rmAgentManagement);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,177 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.service.impl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.alibaba.fastjson.JSONObject;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.constant.SecurityConstants;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.enums.MsgEnum;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.utils.DateUtils;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.DeviceMessage;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.RmAgentManagement;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.vo.AgentUpdateVo;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.mapper.RmAgentManagementMapper;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.model.ProducerMode;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.producer.MessageProducer;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.service.IRmAgentManagementService;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
				
			||||||
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Value;
 | 
				
			||||||
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.ArrayList;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Agent管理Service业务层处理
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * @author gyt
 | 
				
			||||||
 | 
					 * @date 2025-09-15
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Service
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
 | 
					public class RmAgentManagementServiceImpl implements IRmAgentManagementService 
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private RmAgentManagementMapper rmAgentManagementMapper;
 | 
				
			||||||
 | 
					    @Value("${fileDictory.filePath}")
 | 
				
			||||||
 | 
					    private String filePath;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					//    private static String COMMAND = "/usr/local/tongran/deploy.sh restart";
 | 
				
			||||||
 | 
					    private static String COMMAND = "/data/saas-income/houduan/tr-client-test/deploy.sh restart";
 | 
				
			||||||
 | 
					    private static String COMMAND2 = "cat /data/saas-income/houduan/tr-client-test/deploy.sh";
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private ProducerMode producerMode;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private RemoteRevenueConfigService remoteRevenueConfigService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param id Agent管理主键
 | 
				
			||||||
 | 
					     * @return Agent管理
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public RmAgentManagement selectRmAgentManagementById(Long id)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return rmAgentManagementMapper.selectRmAgentManagementById(id);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询Agent管理列表
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return Agent管理
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<RmAgentManagement> selectRmAgentManagementList(RmAgentManagement rmAgentManagement)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return rmAgentManagementMapper.selectRmAgentManagementList(rmAgentManagement);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 新增Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int insertRmAgentManagement(RmAgentManagement rmAgentManagement)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        rmAgentManagement.setCreateTime(DateUtils.getNowDate());
 | 
				
			||||||
 | 
					        return rmAgentManagementMapper.insertRmAgentManagement(rmAgentManagement);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param rmAgentManagement Agent管理
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int updateRmAgentManagement(RmAgentManagement rmAgentManagement)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        rmAgentManagement.setUpdateTime(DateUtils.getNowDate());
 | 
				
			||||||
 | 
					        return rmAgentManagementMapper.updateRmAgentManagement(rmAgentManagement);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 批量删除Agent管理
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param ids 需要删除的Agent管理主键
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int deleteRmAgentManagementByIds(Long[] ids)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return rmAgentManagementMapper.deleteRmAgentManagementByIds(ids);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 删除Agent管理信息
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * @param id Agent管理主键
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int deleteRmAgentManagementById(Long id)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return rmAgentManagementMapper.deleteRmAgentManagementById(id);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 配置更新策略
 | 
				
			||||||
 | 
					     * @param rmAgentManagement
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int addRmAgentManagement(RmAgentManagement rmAgentManagement) {
 | 
				
			||||||
 | 
					        // 设备
 | 
				
			||||||
 | 
					        String idStr = rmAgentManagement.getIncludeIds();
 | 
				
			||||||
 | 
					        String[] ids = idStr.split(",");
 | 
				
			||||||
 | 
					        List<RmResourceRegistrationRemote> registrationRemotes = remoteRevenueConfigService.getRegistrationByIds(ids, SecurityConstants.INNER).getData();
 | 
				
			||||||
 | 
					        for (RmResourceRegistrationRemote resourceMsg : registrationRemotes) {
 | 
				
			||||||
 | 
					            rmAgentManagement.setHardwareSn(resourceMsg.getHardwareSn());
 | 
				
			||||||
 | 
					            rmAgentManagement.setResourceName(resourceMsg.getResourceName());
 | 
				
			||||||
 | 
					            rmAgentManagement.setInternalIp(resourceMsg.getIpAddress());
 | 
				
			||||||
 | 
					            // 查询该资源是否已经配置
 | 
				
			||||||
 | 
					            RmAgentManagement agentQueryParam = new RmAgentManagement();
 | 
				
			||||||
 | 
					            agentQueryParam.setHardwareSn(resourceMsg.getHardwareSn());
 | 
				
			||||||
 | 
					            List<RmAgentManagement> agentManagements = rmAgentManagementMapper.selectRmAgentManagementList(agentQueryParam);
 | 
				
			||||||
 | 
					            if(!agentManagements.isEmpty()){
 | 
				
			||||||
 | 
					                // 如果存在,修改
 | 
				
			||||||
 | 
					                rmAgentManagementMapper.updateRmAgentManagementBySn(rmAgentManagement);
 | 
				
			||||||
 | 
					            }else{
 | 
				
			||||||
 | 
					                // 如果不存在,添加
 | 
				
			||||||
 | 
					                rmAgentManagementMapper.insertRmAgentManagement(rmAgentManagement);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // 构建更新策略
 | 
				
			||||||
 | 
					            AgentUpdateVo agentUpdateVo = new AgentUpdateVo();
 | 
				
			||||||
 | 
					            agentUpdateVo.setFileUrl(rmAgentManagement.getFileUrl());
 | 
				
			||||||
 | 
					            agentUpdateVo.setFilePath("/data/saas-income/houduan/tr-client-test/temp");
 | 
				
			||||||
 | 
					            List<String> commandList = new ArrayList<>();
 | 
				
			||||||
 | 
					            commandList.add(COMMAND);
 | 
				
			||||||
 | 
					            commandList.add(COMMAND2);
 | 
				
			||||||
 | 
					            agentUpdateVo.setCommands(JSONObject.toJSONString(commandList));
 | 
				
			||||||
 | 
					            agentUpdateVo.setMethod(rmAgentManagement.getMethod());
 | 
				
			||||||
 | 
					            if(rmAgentManagement.getMethod() == 1){
 | 
				
			||||||
 | 
					                agentUpdateVo.setPolicyTime(rmAgentManagement.getScheduledUpdateTime());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                DeviceMessage deviceMessage = new DeviceMessage();
 | 
				
			||||||
 | 
					                deviceMessage.setClientId(resourceMsg.getHardwareSn());
 | 
				
			||||||
 | 
					                deviceMessage.setDataType(MsgEnum.Agent版本更新.getValue());
 | 
				
			||||||
 | 
					                deviceMessage.setData(JSONObject.toJSONString(agentUpdateVo));
 | 
				
			||||||
 | 
					                MessageProducer messageProducer = new MessageProducer();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                messageProducer.sendAsyncProducerMessage(
 | 
				
			||||||
 | 
					                        producerMode.getAgentTopic(),
 | 
				
			||||||
 | 
					                        "",
 | 
				
			||||||
 | 
					                        "",
 | 
				
			||||||
 | 
					                        JSONObject.toJSONString(deviceMessage)
 | 
				
			||||||
 | 
					                );
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("发送设备配置失败,deviceId: {}", resourceMsg.getHardwareSn(), e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -119,9 +119,13 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
        queryParam.setResourceGroupId(resourceGroupId);
 | 
					        queryParam.setResourceGroupId(resourceGroupId);
 | 
				
			||||||
        List<RmMonitorPolicy> exits = rmMonitorPolicyMapper.selectRmMonitorPolicyList(queryParam);
 | 
					        List<RmMonitorPolicy> exits = rmMonitorPolicyMapper.selectRmMonitorPolicyList(queryParam);
 | 
				
			||||||
        if(!exits.isEmpty()){
 | 
					        if(!exits.isEmpty()){
 | 
				
			||||||
 | 
					            if(exits.get(0).getId() != rmMonitorPolicy.getId()){
 | 
				
			||||||
                return -1;
 | 
					                return -1;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        rmMonitorPolicy.setUpdateTime(DateUtils.getNowDate());
 | 
					        rmMonitorPolicy.setUpdateTime(DateUtils.getNowDate());
 | 
				
			||||||
 | 
					        // 策略状态改为待下发
 | 
				
			||||||
 | 
					        rmMonitorPolicy.setStatus("0");
 | 
				
			||||||
        rmMonitorPolicyMapper.updateRmMonitorPolicy(rmMonitorPolicy);
 | 
					        rmMonitorPolicyMapper.updateRmMonitorPolicy(rmMonitorPolicy);
 | 
				
			||||||
        // 模板绑定资源组信息
 | 
					        // 模板绑定资源组信息
 | 
				
			||||||
        RmMonitorTemplate rmMonitorTemplate = new RmMonitorTemplate();
 | 
					        RmMonitorTemplate rmMonitorTemplate = new RmMonitorTemplate();
 | 
				
			||||||
@@ -132,6 +136,8 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
        List<RmMonitorPolicyVo> collectionAndIdList = rmMonitorPolicy.getCollectionAndIdList();
 | 
					        List<RmMonitorPolicyVo> collectionAndIdList = rmMonitorPolicy.getCollectionAndIdList();
 | 
				
			||||||
        if(!collectionAndIdList.isEmpty()){
 | 
					        if(!collectionAndIdList.isEmpty()){
 | 
				
			||||||
            if("linux".equals(rmMonitorPolicy.getResourceType())){
 | 
					            if("linux".equals(rmMonitorPolicy.getResourceType())){
 | 
				
			||||||
 | 
					                // 修改之前先置空所有采集周期
 | 
				
			||||||
 | 
					                rmTemplateLinuxMapper.updateByTemplateId(rmMonitorPolicy.getTemplateId());
 | 
				
			||||||
                for (RmMonitorPolicyVo rmMonitorPolicyVo : collectionAndIdList) {
 | 
					                for (RmMonitorPolicyVo rmMonitorPolicyVo : collectionAndIdList) {
 | 
				
			||||||
                    // 添加采集周期
 | 
					                    // 添加采集周期
 | 
				
			||||||
                    RmTemplateLinux rmTemplateLinux = new RmTemplateLinux();
 | 
					                    RmTemplateLinux rmTemplateLinux = new RmTemplateLinux();
 | 
				
			||||||
@@ -140,6 +146,8 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
                    rmTemplateLinuxMapper.updateRmTemplateLinux(rmTemplateLinux);
 | 
					                    rmTemplateLinuxMapper.updateRmTemplateLinux(rmTemplateLinux);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }else if("switch".equals(rmMonitorPolicy.getResourceType())){
 | 
					            }else if("switch".equals(rmMonitorPolicy.getResourceType())){
 | 
				
			||||||
 | 
					                // 修改之前先置空所有采集周期
 | 
				
			||||||
 | 
					                rmTemplateSwitchMapper.updateByTemplateId(rmMonitorPolicy.getTemplateId());
 | 
				
			||||||
                for (RmMonitorPolicyVo rmMonitorPolicyVo : collectionAndIdList) {
 | 
					                for (RmMonitorPolicyVo rmMonitorPolicyVo : collectionAndIdList) {
 | 
				
			||||||
                    // 添加采集周期
 | 
					                    // 添加采集周期
 | 
				
			||||||
                    RmTemplateSwitch rmTemplateSwitch = new RmTemplateSwitch();
 | 
					                    RmTemplateSwitch rmTemplateSwitch = new RmTemplateSwitch();
 | 
				
			||||||
@@ -163,6 +171,14 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public int deleteRmMonitorPolicyByIds(Long[] ids)
 | 
					    public int deleteRmMonitorPolicyByIds(Long[] ids)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        for (Long id : ids) {
 | 
				
			||||||
 | 
					            // 根据id查询策略详情
 | 
				
			||||||
 | 
					            RmMonitorPolicy rmMonitorPolicy = rmMonitorPolicyMapper.selectRmMonitorPolicyById(id);
 | 
				
			||||||
 | 
					            Long templateId = rmMonitorPolicy.getTemplateId();
 | 
				
			||||||
 | 
					            // 删除策略的时候,把该模板的采集周期置空
 | 
				
			||||||
 | 
					            rmTemplateLinuxMapper.updateByTemplateId(templateId);
 | 
				
			||||||
 | 
					            rmTemplateSwitchMapper.updateByTemplateId(templateId);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        return rmMonitorPolicyMapper.deleteRmMonitorPolicyByIds(ids);
 | 
					        return rmMonitorPolicyMapper.deleteRmMonitorPolicyByIds(ids);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -5,6 +5,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
<mapper namespace="com.ruoyi.rocketmq.mapper.InitialHeartbeatListenLogMapper">
 | 
					<mapper namespace="com.ruoyi.rocketmq.mapper.InitialHeartbeatListenLogMapper">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <resultMap type="InitialHeartbeatListenLog" id="InitialHeartbeatListenLogResult">
 | 
					    <resultMap type="InitialHeartbeatListenLog" id="InitialHeartbeatListenLogResult">
 | 
				
			||||||
 | 
					        <result property="id"    column="id"    />
 | 
				
			||||||
        <result property="clientId"    column="client_id"    />
 | 
					        <result property="clientId"    column="client_id"    />
 | 
				
			||||||
        <result property="status"    column="status"    />
 | 
					        <result property="status"    column="status"    />
 | 
				
			||||||
        <result property="remark"    column="remark"    />
 | 
					        <result property="remark"    column="remark"    />
 | 
				
			||||||
@@ -15,22 +16,23 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </resultMap>
 | 
					    </resultMap>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <sql id="selectInitialHeartbeatListenLogVo">
 | 
					    <sql id="selectInitialHeartbeatListenLogVo">
 | 
				
			||||||
        select client_id, status, remark, create_time, update_time, create_by, update_by from initial_heartbeat_listen_log
 | 
					        select id, client_id, status, remark, create_time, update_time, create_by, update_by from initial_heartbeat_listen_log
 | 
				
			||||||
    </sql>
 | 
					    </sql>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <select id="selectInitialHeartbeatListenLogList" parameterType="InitialHeartbeatListenLog" resultMap="InitialHeartbeatListenLogResult">
 | 
					    <select id="selectInitialHeartbeatListenLogList" parameterType="InitialHeartbeatListenLog" resultMap="InitialHeartbeatListenLogResult">
 | 
				
			||||||
        <include refid="selectInitialHeartbeatListenLogVo"/>
 | 
					        <include refid="selectInitialHeartbeatListenLogVo"/>
 | 
				
			||||||
        <where>
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
            <if test="status != null  and status != ''"> and status = #{status}</if>
 | 
					            <if test="status != null  and status != ''"> and status = #{status}</if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <select id="selectInitialHeartbeatListenLogByClientId" parameterType="String" resultMap="InitialHeartbeatListenLogResult">
 | 
					    <select id="selectInitialHeartbeatListenLogById" parameterType="Long" resultMap="InitialHeartbeatListenLogResult">
 | 
				
			||||||
        <include refid="selectInitialHeartbeatListenLogVo"/>
 | 
					        <include refid="selectInitialHeartbeatListenLogVo"/>
 | 
				
			||||||
        where client_id = #{clientId}
 | 
					        where id = #{id}
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="insertInitialHeartbeatListenLog" parameterType="InitialHeartbeatListenLog">
 | 
					    <insert id="insertInitialHeartbeatListenLog" parameterType="InitialHeartbeatListenLog" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        insert into initial_heartbeat_listen_log
 | 
					        insert into initial_heartbeat_listen_log
 | 
				
			||||||
        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="clientId != null">client_id,</if>
 | 
					            <if test="clientId != null">client_id,</if>
 | 
				
			||||||
@@ -55,6 +57,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    <update id="updateInitialHeartbeatListenLog" parameterType="InitialHeartbeatListenLog">
 | 
					    <update id="updateInitialHeartbeatListenLog" parameterType="InitialHeartbeatListenLog">
 | 
				
			||||||
        update initial_heartbeat_listen_log
 | 
					        update initial_heartbeat_listen_log
 | 
				
			||||||
        <trim prefix="SET" suffixOverrides=",">
 | 
					        <trim prefix="SET" suffixOverrides=",">
 | 
				
			||||||
 | 
					            <if test="clientId != null">client_id = #{clientId},</if>
 | 
				
			||||||
            <if test="status != null">status = #{status},</if>
 | 
					            <if test="status != null">status = #{status},</if>
 | 
				
			||||||
            <if test="remark != null">remark = #{remark},</if>
 | 
					            <if test="remark != null">remark = #{remark},</if>
 | 
				
			||||||
            <if test="createTime != null">create_time = #{createTime},</if>
 | 
					            <if test="createTime != null">create_time = #{createTime},</if>
 | 
				
			||||||
@@ -62,17 +65,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            <if test="createBy != null">create_by = #{createBy},</if>
 | 
					            <if test="createBy != null">create_by = #{createBy},</if>
 | 
				
			||||||
            <if test="updateBy != null">update_by = #{updateBy},</if>
 | 
					            <if test="updateBy != null">update_by = #{updateBy},</if>
 | 
				
			||||||
        </trim>
 | 
					        </trim>
 | 
				
			||||||
        where client_id = #{clientId}
 | 
					        where id = #{id}
 | 
				
			||||||
    </update>
 | 
					    </update>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <delete id="deleteInitialHeartbeatListenLogByClientId" parameterType="String">
 | 
					    <delete id="deleteInitialHeartbeatListenLogById" parameterType="Long">
 | 
				
			||||||
        delete from initial_heartbeat_listen_log where client_id = #{clientId}
 | 
					        delete from initial_heartbeat_listen_log where id = #{id}
 | 
				
			||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <delete id="deleteInitialHeartbeatListenLogByClientIds" parameterType="String">
 | 
					    <delete id="deleteInitialHeartbeatListenLogByIds" parameterType="String">
 | 
				
			||||||
        delete from initial_heartbeat_listen_log where client_id in 
 | 
					        delete from initial_heartbeat_listen_log where id in
 | 
				
			||||||
        <foreach item="clientId" collection="array" open="(" separator="," close=")">
 | 
					        <foreach item="id" collection="array" open="(" separator="," close=")">
 | 
				
			||||||
            #{clientId}
 | 
					            #{id}
 | 
				
			||||||
        </foreach>
 | 
					        </foreach>
 | 
				
			||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
</mapper>
 | 
					</mapper>
 | 
				
			||||||
@@ -0,0 +1,148 @@
 | 
				
			|||||||
 | 
					<?xml version="1.0" encoding="UTF-8" ?>
 | 
				
			||||||
 | 
					<!DOCTYPE mapper
 | 
				
			||||||
 | 
					        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			||||||
 | 
					        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 | 
				
			||||||
 | 
					<mapper namespace="com.ruoyi.rocketmq.mapper.RmAgentManagementMapper">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <resultMap type="RmAgentManagement" id="RmAgentManagementResult">
 | 
				
			||||||
 | 
					        <result property="id"    column="id"    />
 | 
				
			||||||
 | 
					        <result property="hardwareSn"    column="hardware_sn"    />
 | 
				
			||||||
 | 
					        <result property="resourceName"    column="resource_name"    />
 | 
				
			||||||
 | 
					        <result property="internalIp"    column="internal_ip"    />
 | 
				
			||||||
 | 
					        <result property="status"    column="status"    />
 | 
				
			||||||
 | 
					        <result property="agentVersion"    column="agent_version"    />
 | 
				
			||||||
 | 
					        <result property="method"    column="method"    />
 | 
				
			||||||
 | 
					        <result property="scheduledUpdateTime"    column="scheduled_update_time"    />
 | 
				
			||||||
 | 
					        <result property="fileUrlType"    column="file_url_type"    />
 | 
				
			||||||
 | 
					        <result property="fileUrl"    column="file_url"    />
 | 
				
			||||||
 | 
					        <result property="fileDirectory"    column="file_directory"    />
 | 
				
			||||||
 | 
					        <result property="lastUpdateResult"    column="last_update_result"    />
 | 
				
			||||||
 | 
					        <result property="lastUpdateTime"    column="last_update_time"    />
 | 
				
			||||||
 | 
					        <result property="createTime"    column="create_time"    />
 | 
				
			||||||
 | 
					        <result property="updateTime"    column="update_time"    />
 | 
				
			||||||
 | 
					        <result property="createBy"    column="create_by"    />
 | 
				
			||||||
 | 
					        <result property="updateBy"    column="update_by"    />
 | 
				
			||||||
 | 
					    </resultMap>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <sql id="selectRmAgentManagementVo">
 | 
				
			||||||
 | 
					        select id, hardware_sn, resource_name, internal_ip, status, agent_version, method, scheduled_update_time, file_url_type, file_url, file_directory, last_update_result, last_update_time, create_time, update_time, create_by, update_by from rm_agent_management
 | 
				
			||||||
 | 
					    </sql>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <select id="selectRmAgentManagementList" parameterType="RmAgentManagement" resultMap="RmAgentManagementResult">
 | 
				
			||||||
 | 
					        <include refid="selectRmAgentManagementVo"/>
 | 
				
			||||||
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="hardwareSn != null  and hardwareSn != ''"> and hardware_sn = #{hardwareSn}</if>
 | 
				
			||||||
 | 
					            <if test="resourceName != null  and resourceName != ''"> and resource_name like concat('%', #{resourceName}, '%')</if>
 | 
				
			||||||
 | 
					            <if test="internalIp != null  and internalIp != ''"> and internal_ip = #{internalIp}</if>
 | 
				
			||||||
 | 
					            <if test="status != null  and status != ''"> and status = #{status}</if>
 | 
				
			||||||
 | 
					            <if test="agentVersion != null  and agentVersion != ''"> and agent_version = #{agentVersion}</if>
 | 
				
			||||||
 | 
					            <if test="method != null "> and method = #{method}</if>
 | 
				
			||||||
 | 
					            <if test="scheduledUpdateTime != null  and scheduledUpdateTime != ''"> and scheduled_update_time = #{scheduledUpdateTime}</if>
 | 
				
			||||||
 | 
					            <if test="fileUrlType != null "> and file_url_type = #{fileUrlType}</if>
 | 
				
			||||||
 | 
					            <if test="fileUrl != null  and fileUrl != ''"> and file_url = #{fileUrl}</if>
 | 
				
			||||||
 | 
					            <if test="fileDirectory != null  and fileDirectory != ''"> and file_directory = #{fileDirectory}</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateResult != null  and lastUpdateResult != ''"> and last_update_result = #{lastUpdateResult}</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateTime != null "> and last_update_time = #{lastUpdateTime}</if>
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <select id="selectRmAgentManagementById" parameterType="Long" resultMap="RmAgentManagementResult">
 | 
				
			||||||
 | 
					        <include refid="selectRmAgentManagementVo"/>
 | 
				
			||||||
 | 
					        where id = #{id}
 | 
				
			||||||
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <insert id="insertRmAgentManagement" parameterType="RmAgentManagement" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
 | 
					        insert into rm_agent_management
 | 
				
			||||||
 | 
					        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
				
			||||||
 | 
					            <if test="hardwareSn != null and hardwareSn != ''">hardware_sn,</if>
 | 
				
			||||||
 | 
					            <if test="resourceName != null and resourceName != ''">resource_name,</if>
 | 
				
			||||||
 | 
					            <if test="internalIp != null">internal_ip,</if>
 | 
				
			||||||
 | 
					            <if test="status != null and status != ''">status,</if>
 | 
				
			||||||
 | 
					            <if test="agentVersion != null">agent_version,</if>
 | 
				
			||||||
 | 
					            <if test="method != null">method,</if>
 | 
				
			||||||
 | 
					            <if test="scheduledUpdateTime != null">scheduled_update_time,</if>
 | 
				
			||||||
 | 
					            <if test="fileUrlType != null">file_url_type,</if>
 | 
				
			||||||
 | 
					            <if test="fileUrl != null">file_url,</if>
 | 
				
			||||||
 | 
					            <if test="fileDirectory != null">file_directory,</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateResult != null">last_update_result,</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateTime != null">last_update_time,</if>
 | 
				
			||||||
 | 
					            <if test="createTime != null">create_time,</if>
 | 
				
			||||||
 | 
					            <if test="updateTime != null">update_time,</if>
 | 
				
			||||||
 | 
					            <if test="createBy != null">create_by,</if>
 | 
				
			||||||
 | 
					            <if test="updateBy != null">update_by,</if>
 | 
				
			||||||
 | 
					        </trim>
 | 
				
			||||||
 | 
					        <trim prefix="values (" suffix=")" suffixOverrides=",">
 | 
				
			||||||
 | 
					            <if test="hardwareSn != null and hardwareSn != ''">#{hardwareSn},</if>
 | 
				
			||||||
 | 
					            <if test="resourceName != null and resourceName != ''">#{resourceName},</if>
 | 
				
			||||||
 | 
					            <if test="internalIp != null">#{internalIp},</if>
 | 
				
			||||||
 | 
					            <if test="status != null and status != ''">#{status},</if>
 | 
				
			||||||
 | 
					            <if test="agentVersion != null">#{agentVersion},</if>
 | 
				
			||||||
 | 
					            <if test="method != null">#{method},</if>
 | 
				
			||||||
 | 
					            <if test="scheduledUpdateTime != null">#{scheduledUpdateTime},</if>
 | 
				
			||||||
 | 
					            <if test="fileUrlType != null">#{fileUrlType},</if>
 | 
				
			||||||
 | 
					            <if test="fileUrl != null">#{fileUrl},</if>
 | 
				
			||||||
 | 
					            <if test="fileDirectory != null">#{fileDirectory},</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateResult != null">#{lastUpdateResult},</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateTime != null">#{lastUpdateTime},</if>
 | 
				
			||||||
 | 
					            <if test="createTime != null">#{createTime},</if>
 | 
				
			||||||
 | 
					            <if test="updateTime != null">#{updateTime},</if>
 | 
				
			||||||
 | 
					            <if test="createBy != null">#{createBy},</if>
 | 
				
			||||||
 | 
					            <if test="updateBy != null">#{updateBy},</if>
 | 
				
			||||||
 | 
					        </trim>
 | 
				
			||||||
 | 
					    </insert>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <update id="updateRmAgentManagement" parameterType="RmAgentManagement">
 | 
				
			||||||
 | 
					        update rm_agent_management
 | 
				
			||||||
 | 
					        <trim prefix="SET" suffixOverrides=",">
 | 
				
			||||||
 | 
					            <if test="hardwareSn != null and hardwareSn != ''">hardware_sn = #{hardwareSn},</if>
 | 
				
			||||||
 | 
					            <if test="resourceName != null and resourceName != ''">resource_name = #{resourceName},</if>
 | 
				
			||||||
 | 
					            <if test="internalIp != null">internal_ip = #{internalIp},</if>
 | 
				
			||||||
 | 
					            <if test="status != null and status != ''">status = #{status},</if>
 | 
				
			||||||
 | 
					            <if test="agentVersion != null">agent_version = #{agentVersion},</if>
 | 
				
			||||||
 | 
					            <if test="method != null">method = #{method},</if>
 | 
				
			||||||
 | 
					            <if test="scheduledUpdateTime != null">scheduled_update_time = #{scheduledUpdateTime},</if>
 | 
				
			||||||
 | 
					            <if test="fileUrlType != null">file_url_type = #{fileUrlType},</if>
 | 
				
			||||||
 | 
					            <if test="fileUrl != null">file_url = #{fileUrl},</if>
 | 
				
			||||||
 | 
					            <if test="fileDirectory != null">file_directory = #{fileDirectory},</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateResult != null">last_update_result = #{lastUpdateResult},</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateTime != null">last_update_time = #{lastUpdateTime},</if>
 | 
				
			||||||
 | 
					            <if test="createTime != null">create_time = #{createTime},</if>
 | 
				
			||||||
 | 
					            <if test="updateTime != null">update_time = #{updateTime},</if>
 | 
				
			||||||
 | 
					            <if test="createBy != null">create_by = #{createBy},</if>
 | 
				
			||||||
 | 
					            <if test="updateBy != null">update_by = #{updateBy},</if>
 | 
				
			||||||
 | 
					        </trim>
 | 
				
			||||||
 | 
					        where id = #{id}
 | 
				
			||||||
 | 
					    </update>
 | 
				
			||||||
 | 
					    <update id="updateRmAgentManagementBySn" parameterType="RmAgentManagement">
 | 
				
			||||||
 | 
					        update rm_agent_management
 | 
				
			||||||
 | 
					        <trim prefix="SET" suffixOverrides=",">
 | 
				
			||||||
 | 
					            <if test="resourceName != null and resourceName != ''">resource_name = #{resourceName},</if>
 | 
				
			||||||
 | 
					            <if test="internalIp != null">internal_ip = #{internalIp},</if>
 | 
				
			||||||
 | 
					            <if test="status != null and status != ''">status = #{status},</if>
 | 
				
			||||||
 | 
					            <if test="agentVersion != null">agent_version = #{agentVersion},</if>
 | 
				
			||||||
 | 
					            <if test="method != null">method = #{method},</if>
 | 
				
			||||||
 | 
					            <if test="scheduledUpdateTime != null">scheduled_update_time = #{scheduledUpdateTime},</if>
 | 
				
			||||||
 | 
					            <if test="fileUrlType != null">file_url_type = #{fileUrlType},</if>
 | 
				
			||||||
 | 
					            <if test="fileUrl != null">file_url = #{fileUrl},</if>
 | 
				
			||||||
 | 
					            <if test="fileDirectory != null">file_directory = #{fileDirectory},</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateResult != null">last_update_result = #{lastUpdateResult},</if>
 | 
				
			||||||
 | 
					            <if test="lastUpdateTime != null">last_update_time = #{lastUpdateTime},</if>
 | 
				
			||||||
 | 
					            <if test="createTime != null">create_time = #{createTime},</if>
 | 
				
			||||||
 | 
					            <if test="updateTime != null">update_time = #{updateTime},</if>
 | 
				
			||||||
 | 
					            <if test="createBy != null">create_by = #{createBy},</if>
 | 
				
			||||||
 | 
					            <if test="updateBy != null">update_by = #{updateBy},</if>
 | 
				
			||||||
 | 
					        </trim>
 | 
				
			||||||
 | 
					        where hardware_sn = #{hardwareSn}
 | 
				
			||||||
 | 
					    </update>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <delete id="deleteRmAgentManagementById" parameterType="Long">
 | 
				
			||||||
 | 
					        delete from rm_agent_management where id = #{id}
 | 
				
			||||||
 | 
					    </delete>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <delete id="deleteRmAgentManagementByIds" parameterType="String">
 | 
				
			||||||
 | 
					        delete from rm_agent_management where id in
 | 
				
			||||||
 | 
					        <foreach item="id" collection="array" open="(" separator="," close=")">
 | 
				
			||||||
 | 
					            #{id}
 | 
				
			||||||
 | 
					        </foreach>
 | 
				
			||||||
 | 
					    </delete>
 | 
				
			||||||
 | 
					</mapper>
 | 
				
			||||||
@@ -31,6 +31,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            <if test="description != null  and description != ''"> and description = #{description}</if>
 | 
					            <if test="description != null  and description != ''"> and description = #{description}</if>
 | 
				
			||||||
            <if test="status != null  and status != ''"> and status = #{status}</if>
 | 
					            <if test="status != null  and status != ''"> and status = #{status}</if>
 | 
				
			||||||
            <if test="deployTime != null "> and deploy_time = #{deployTime}</if>
 | 
					            <if test="deployTime != null "> and deploy_time = #{deployTime}</if>
 | 
				
			||||||
 | 
					            <if test="queryName != null and queryName != ''">
 | 
				
			||||||
 | 
					                and (policy_name like concat('%', #{queryName}, '%')
 | 
				
			||||||
 | 
					                or template_id in (select id from rm_monitor_template where template_name like concat('%', #{queryName}, '%'))
 | 
				
			||||||
 | 
					                or resource_group_id in (select id from rm_resource_group where group_name like concat('%', #{queryName}, '%'))
 | 
				
			||||||
 | 
					                )
 | 
				
			||||||
 | 
					            </if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -129,4 +129,9 @@
 | 
				
			|||||||
    <delete id="deleteByTemplateId" parameterType="Long">
 | 
					    <delete id="deleteByTemplateId" parameterType="Long">
 | 
				
			||||||
        delete from rm_template_linux where template_id = #{templateId}
 | 
					        delete from rm_template_linux where template_id = #{templateId}
 | 
				
			||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    <update id="updateByTemplateId" parameterType="RmTemplateLinux">
 | 
				
			||||||
 | 
					        update rm_template_linux set collection_cycle = null
 | 
				
			||||||
 | 
					        where template_id = #{templateId}
 | 
				
			||||||
 | 
					    </update>
 | 
				
			||||||
</mapper>
 | 
					</mapper>
 | 
				
			||||||
@@ -161,4 +161,8 @@
 | 
				
			|||||||
    <delete id="deleteByTemplateId" parameterType="Long">
 | 
					    <delete id="deleteByTemplateId" parameterType="Long">
 | 
				
			||||||
        delete from rm_template_switch where template_id = #{templateId}
 | 
					        delete from rm_template_switch where template_id = #{templateId}
 | 
				
			||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					    <update id="updateByTemplateId" parameterType="RmTemplateLinux">
 | 
				
			||||||
 | 
					        update rm_template_switch set collection_cycle = null
 | 
				
			||||||
 | 
					        where template_id = #{templateId}
 | 
				
			||||||
 | 
					    </update>
 | 
				
			||||||
</mapper>
 | 
					</mapper>
 | 
				
			||||||
		Reference in New Issue
	
	Block a user