服务器自动注册
This commit is contained in:
		@@ -98,4 +98,13 @@ public interface RemoteRevenueConfigService
 | 
				
			|||||||
    @PostMapping("/switchManagement/getSwitchNameByClientId")
 | 
					    @PostMapping("/switchManagement/getSwitchNameByClientId")
 | 
				
			||||||
    public R<List<RmSwitchManagementRemote>> getSwitchNameByClientId(@RequestBody RmSwitchManagementRemote rmSwitchManagementRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 | 
					    public R<List<RmSwitchManagementRemote>> getSwitchNameByClientId(@RequestBody RmSwitchManagementRemote rmSwitchManagementRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 自动注册
 | 
				
			||||||
 | 
					     * @param rmRegisterMsgRemote
 | 
				
			||||||
 | 
					     * @param source
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @PostMapping("/registration/innerAddRegist")
 | 
				
			||||||
 | 
					    public R<Integer> innerAddRegist(@RequestBody RmRegisterMsgRemote rmRegisterMsgRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,32 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.system.api.domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonProperty;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class NetworkInfo {
 | 
				
			||||||
 | 
					    // 运营商
 | 
				
			||||||
 | 
					    @JsonProperty("carrier")
 | 
				
			||||||
 | 
					    private String carrier;
 | 
				
			||||||
 | 
					    // 市
 | 
				
			||||||
 | 
					    @JsonProperty("city")
 | 
				
			||||||
 | 
					    private String city;
 | 
				
			||||||
 | 
					    // 网关
 | 
				
			||||||
 | 
					    @JsonProperty("gateway")
 | 
				
			||||||
 | 
					    private String gateway;
 | 
				
			||||||
 | 
					    // IPv4 地址
 | 
				
			||||||
 | 
					    @JsonProperty("ipv4")
 | 
				
			||||||
 | 
					    private String ipv4;
 | 
				
			||||||
 | 
					    // MAC 地址
 | 
				
			||||||
 | 
					    @JsonProperty("mac")
 | 
				
			||||||
 | 
					    private String mac;
 | 
				
			||||||
 | 
					    // 接口名称:eth0, enp3s0
 | 
				
			||||||
 | 
					    @JsonProperty("name")
 | 
				
			||||||
 | 
					    private String name;
 | 
				
			||||||
 | 
					    // 省
 | 
				
			||||||
 | 
					    @JsonProperty("province")
 | 
				
			||||||
 | 
					    private String province;
 | 
				
			||||||
 | 
					    // 公网 IP
 | 
				
			||||||
 | 
					    @JsonProperty("publicIp")
 | 
				
			||||||
 | 
					    private String publicIp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,21 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.system.api.domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonProperty;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class RmRegisterMsgRemote {
 | 
				
			||||||
 | 
					    @JsonProperty("clientId")
 | 
				
			||||||
 | 
					    private String clientId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("sn")
 | 
				
			||||||
 | 
					    private String sn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("networkInfo")
 | 
				
			||||||
 | 
					    private List<NetworkInfo> networkInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("timestamp")
 | 
				
			||||||
 | 
					    private long timestamp;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -127,5 +127,49 @@ public class RmResourceRegistrationRemote extends BaseEntity
 | 
				
			|||||||
    private String monitorItems;
 | 
					    private String monitorItems;
 | 
				
			||||||
    /** 自动发现项 */
 | 
					    /** 自动发现项 */
 | 
				
			||||||
    private String discoveryRules;
 | 
					    private String discoveryRules;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 客户端ID
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String clientId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 运营商
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String operator;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 省
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String province;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 公网IP
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String publicIp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 业务名称
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String businessName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 逻辑节点标识
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String logicalNodeId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 多公网IP状态
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String multiPublicIpStatus;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 心跳次数
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private Integer heartbeatCount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 心跳周期(单位:秒)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private Integer heartbeatInterval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -71,6 +71,11 @@ public class RemoteRevenueConfigFallbackFactory implements FallbackFactory<Remot
 | 
				
			|||||||
            public R<List<RmSwitchManagementRemote>> getSwitchNameByClientId(RmSwitchManagementRemote rmSwitchManagementRemote, String source) {
 | 
					            public R<List<RmSwitchManagementRemote>> getSwitchNameByClientId(RmSwitchManagementRemote rmSwitchManagementRemote, String source) {
 | 
				
			||||||
                return R.fail("根据clientId获取交换机信息失败" + throwable.getMessage());
 | 
					                return R.fail("根据clientId获取交换机信息失败" + throwable.getMessage());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public R<Integer> innerAddRegist(RmRegisterMsgRemote rmRegisterMsgRemote, String source) {
 | 
				
			||||||
 | 
					                return R.fail("自动注册失败" + throwable.getMessage());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -15,6 +15,10 @@ public enum MsgEnum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    多公网IP探测("PUBLICIPDETECT"),
 | 
					    多公网IP探测("PUBLICIPDETECT"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    获取最新策略("GET_POLICY"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    获取最新策略应答("GET_POLICY_RSP"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    注册("REGISTER"),
 | 
					    注册("REGISTER"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    注册应答("REGISTER_RSP"),
 | 
					    注册应答("REGISTER_RSP"),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -10,6 +10,7 @@ import com.ruoyi.common.log.annotation.Log;
 | 
				
			|||||||
import com.ruoyi.common.log.enums.BusinessType;
 | 
					import com.ruoyi.common.log.enums.BusinessType;
 | 
				
			||||||
import com.ruoyi.common.security.annotation.InnerAuth;
 | 
					import com.ruoyi.common.security.annotation.InnerAuth;
 | 
				
			||||||
import com.ruoyi.common.security.annotation.RequiresPermissions;
 | 
					import com.ruoyi.common.security.annotation.RequiresPermissions;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.RmRegisterMsgRemote;
 | 
				
			||||||
import com.ruoyi.system.domain.RmResourceRegistration;
 | 
					import com.ruoyi.system.domain.RmResourceRegistration;
 | 
				
			||||||
import com.ruoyi.system.service.IRmResourceRegistrationService;
 | 
					import com.ruoyi.system.service.IRmResourceRegistrationService;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
@@ -165,5 +166,28 @@ public class RmResourceRegistrationController extends BaseController
 | 
				
			|||||||
        List<RmResourceRegistration> list = rmResourceRegistrationService.selectRmResourceRegistrationList(rmResourceRegistration);
 | 
					        List<RmResourceRegistration> list = rmResourceRegistrationService.selectRmResourceRegistrationList(rmResourceRegistration);
 | 
				
			||||||
        return R.ok(list.get(0));
 | 
					        return R.ok(list.get(0));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询资源注册列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("system:registration:list")
 | 
				
			||||||
 | 
					    @PostMapping("/getRegistList")
 | 
				
			||||||
 | 
					    public AjaxResult getRegistList(@RequestBody RmResourceRegistration rmResourceRegistration)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        List<RmResourceRegistration> list = rmResourceRegistrationService.selectRmResourceRegistrationList(rmResourceRegistration);
 | 
				
			||||||
 | 
					        return success(list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 自动注册服务器
 | 
				
			||||||
 | 
					     * @param rmResourceRegistration mq接收的消息
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @PostMapping("/innerAddRegist")
 | 
				
			||||||
 | 
					    @InnerAuth
 | 
				
			||||||
 | 
					    public R<Integer> innerAddRegist(@RequestBody RmRegisterMsgRemote rmResourceRegistration)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        int rows = rmResourceRegistrationService.innerAddRegist(rmResourceRegistration);
 | 
				
			||||||
 | 
					        return R.ok(rows);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.system.domain.vo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.time.Instant;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class RspVo {
 | 
				
			||||||
 | 
					    /** 状态码,0、失败;1、成功*/
 | 
				
			||||||
 | 
					    private int resCode;
 | 
				
			||||||
 | 
					    /** 描述 */
 | 
				
			||||||
 | 
					    private String resMag;
 | 
				
			||||||
 | 
					    /** 时间戳 */
 | 
				
			||||||
 | 
					    private long timestamp = Instant.now().getEpochSecond();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -2,6 +2,7 @@ package com.ruoyi.system.service;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.ruoyi.common.core.domain.R;
 | 
					import com.ruoyi.common.core.domain.R;
 | 
				
			||||||
import com.ruoyi.common.core.web.domain.AjaxResult;
 | 
					import com.ruoyi.common.core.web.domain.AjaxResult;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.RmRegisterMsgRemote;
 | 
				
			||||||
import com.ruoyi.system.domain.RmResourceRegistration;
 | 
					import com.ruoyi.system.domain.RmResourceRegistration;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
@@ -90,4 +91,11 @@ public interface IRmResourceRegistrationService
 | 
				
			|||||||
    AjaxResult getServerOnlineRate();
 | 
					    AjaxResult getServerOnlineRate();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    List<RmResourceRegistration> getRegistrationByIds(String[] ids);
 | 
					    List<RmResourceRegistration> getRegistrationByIds(String[] ids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 自动注册
 | 
				
			||||||
 | 
					     * @param rmResourceRegistration
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    int innerAddRegist(RmRegisterMsgRemote rmResourceRegistration);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,22 +8,27 @@ import com.ruoyi.common.core.utils.DateUtils;
 | 
				
			|||||||
import com.ruoyi.common.core.web.domain.AjaxResult;
 | 
					import com.ruoyi.common.core.web.domain.AjaxResult;
 | 
				
			||||||
import com.ruoyi.common.security.utils.SecurityUtils;
 | 
					import com.ruoyi.common.security.utils.SecurityUtils;
 | 
				
			||||||
import com.ruoyi.system.api.RemoteRocketMqService;
 | 
					import com.ruoyi.system.api.RemoteRocketMqService;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.NetworkInfo;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.RmRegisterMsgRemote;
 | 
				
			||||||
import com.ruoyi.system.domain.EpsNodeBandwidth;
 | 
					import com.ruoyi.system.domain.EpsNodeBandwidth;
 | 
				
			||||||
import com.ruoyi.system.domain.EpsServerRevenueConfig;
 | 
					import com.ruoyi.system.domain.EpsServerRevenueConfig;
 | 
				
			||||||
import com.ruoyi.system.domain.RmEpsTopologyManagement;
 | 
					import com.ruoyi.system.domain.RmEpsTopologyManagement;
 | 
				
			||||||
import com.ruoyi.system.domain.RmResourceRegistration;
 | 
					import com.ruoyi.system.domain.RmResourceRegistration;
 | 
				
			||||||
import com.ruoyi.system.domain.vo.MessageVo;
 | 
					import com.ruoyi.system.domain.vo.MessageVo;
 | 
				
			||||||
import com.ruoyi.system.domain.vo.ResourceVo;
 | 
					import com.ruoyi.system.domain.vo.ResourceVo;
 | 
				
			||||||
 | 
					import com.ruoyi.system.domain.vo.RspVo;
 | 
				
			||||||
import com.ruoyi.system.mapper.EpsNodeBandwidthMapper;
 | 
					import com.ruoyi.system.mapper.EpsNodeBandwidthMapper;
 | 
				
			||||||
import com.ruoyi.system.mapper.EpsServerRevenueConfigMapper;
 | 
					import com.ruoyi.system.mapper.EpsServerRevenueConfigMapper;
 | 
				
			||||||
import com.ruoyi.system.mapper.RmEpsTopologyManagementMapper;
 | 
					import com.ruoyi.system.mapper.RmEpsTopologyManagementMapper;
 | 
				
			||||||
import com.ruoyi.system.mapper.RmResourceRegistrationMapper;
 | 
					import com.ruoyi.system.mapper.RmResourceRegistrationMapper;
 | 
				
			||||||
import com.ruoyi.system.service.IRmResourceRegistrationService;
 | 
					import com.ruoyi.system.service.IRmResourceRegistrationService;
 | 
				
			||||||
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.math.BigDecimal;
 | 
					import java.math.BigDecimal;
 | 
				
			||||||
import java.math.RoundingMode;
 | 
					import java.math.RoundingMode;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
import java.util.HashMap;
 | 
					import java.util.HashMap;
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
@@ -35,6 +40,7 @@ import java.util.Map;
 | 
				
			|||||||
 * @date 2025-08-12
 | 
					 * @date 2025-08-12
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@Service
 | 
					@Service
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
public class RmResourceRegistrationServiceImpl implements IRmResourceRegistrationService 
 | 
					public class RmResourceRegistrationServiceImpl implements IRmResourceRegistrationService 
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
@@ -350,5 +356,76 @@ public class RmResourceRegistrationServiceImpl implements IRmResourceRegistratio
 | 
				
			|||||||
        return rmResourceRegistrationMapper.getRegistrationByIds(ids);
 | 
					        return rmResourceRegistrationMapper.getRegistrationByIds(ids);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 自动注册
 | 
				
			||||||
 | 
					     * @param registerMsg
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int innerAddRegist(RmRegisterMsgRemote registerMsg) {
 | 
				
			||||||
 | 
					        // 解析mq接收的消息
 | 
				
			||||||
 | 
					        // 时间戳转换
 | 
				
			||||||
 | 
					        long timestamp = registerMsg.getTimestamp();
 | 
				
			||||||
 | 
					        long millis = timestamp * 1000;
 | 
				
			||||||
 | 
					        Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					        String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", createTime);
 | 
				
			||||||
 | 
					        List<NetworkInfo> networkInfoList = registerMsg.getNetworkInfo();
 | 
				
			||||||
 | 
					        if(!networkInfoList.isEmpty()){
 | 
				
			||||||
 | 
					            // 查询此数据是否存在
 | 
				
			||||||
 | 
					            RmResourceRegistration queryParam = new RmResourceRegistration();
 | 
				
			||||||
 | 
					            queryParam.setClientId(registerMsg.getClientId());
 | 
				
			||||||
 | 
					            RmResourceRegistration exits = rmResourceRegistrationMapper.selectRegistMsgByClientId(queryParam);
 | 
				
			||||||
 | 
					            if(exits == null){
 | 
				
			||||||
 | 
					                // 构建服务器信息
 | 
				
			||||||
 | 
					                RmResourceRegistration insertData = new RmResourceRegistration();
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    // 如果网卡信息只有1条,自动绑定多公网IP
 | 
				
			||||||
 | 
					                    if(networkInfoList.size()==1){
 | 
				
			||||||
 | 
					                        insertData.setClientId(registerMsg.getClientId());
 | 
				
			||||||
 | 
					                        insertData.setHardwareSn(registerMsg.getSn());
 | 
				
			||||||
 | 
					                        insertData.setRegistrationStatus("1");
 | 
				
			||||||
 | 
					                        insertData.setMultiPublicIpStatus("1");
 | 
				
			||||||
 | 
					                        insertData.setResourceType("1");
 | 
				
			||||||
 | 
					                        insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                        rmResourceRegistrationMapper.insertRmResourceRegistration(insertData);
 | 
				
			||||||
 | 
					                    }else{
 | 
				
			||||||
 | 
					                        insertData.setClientId(registerMsg.getClientId());
 | 
				
			||||||
 | 
					                        insertData.setHardwareSn(registerMsg.getSn());
 | 
				
			||||||
 | 
					                        insertData.setRegistrationStatus("0");
 | 
				
			||||||
 | 
					                        insertData.setMultiPublicIpStatus("0");
 | 
				
			||||||
 | 
					                        insertData.setResourceType("1");
 | 
				
			||||||
 | 
					                        insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                        rmResourceRegistrationMapper.insertRmResourceRegistration(insertData);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    // 构建注册应答信息
 | 
				
			||||||
 | 
					                    MessageVo messageVo = new MessageVo();
 | 
				
			||||||
 | 
					                    messageVo.setClientId(registerMsg.getClientId());
 | 
				
			||||||
 | 
					                    messageVo.setDataType(MsgEnum.注册应答.getValue());
 | 
				
			||||||
 | 
					                    RspVo rspVo = new RspVo();
 | 
				
			||||||
 | 
					                    rspVo.setResCode(1);
 | 
				
			||||||
 | 
					                    rspVo.setResMag("注册成功");
 | 
				
			||||||
 | 
					                    messageVo.setData(JSONObject.toJSONString(rspVo));
 | 
				
			||||||
 | 
					                    remoteRocketMqService.sendAsyncProducerMessage(
 | 
				
			||||||
 | 
					                            "tr_agent_down", "", "", JSONObject.toJSONString(messageVo), SecurityConstants.INNER
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }catch (Exception e){
 | 
				
			||||||
 | 
					                    log.error("注册服务器失败:{}",e.getMessage());
 | 
				
			||||||
 | 
					                    // 构建注册应答信息
 | 
				
			||||||
 | 
					                    MessageVo messageVo = new MessageVo();
 | 
				
			||||||
 | 
					                    messageVo.setClientId(registerMsg.getClientId());
 | 
				
			||||||
 | 
					                    messageVo.setDataType(MsgEnum.注册应答.getValue());
 | 
				
			||||||
 | 
					                    RspVo rspVo = new RspVo();
 | 
				
			||||||
 | 
					                    rspVo.setResCode(1);
 | 
				
			||||||
 | 
					                    rspVo.setResMag("平台错误信息:" + e.getMessage());
 | 
				
			||||||
 | 
					                    messageVo.setData(JSONObject.toJSONString(rspVo));
 | 
				
			||||||
 | 
					                    remoteRocketMqService.sendAsyncProducerMessage(
 | 
				
			||||||
 | 
					                            "tr_agent_down", "", "", JSONObject.toJSONString(messageVo), SecurityConstants.INNER
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return 1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -331,6 +331,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            <if test="updaterName != null">updater_name = #{updaterName},</if>
 | 
					            <if test="updaterName != null">updater_name = #{updaterName},</if>
 | 
				
			||||||
        </trim>
 | 
					        </trim>
 | 
				
			||||||
        where hardware_sn = #{hardwareSn}
 | 
					        where hardware_sn = #{hardwareSn}
 | 
				
			||||||
 | 
					        <choose>
 | 
				
			||||||
 | 
					            <when test="hardwareSn != null">
 | 
				
			||||||
 | 
					                hardware_sn = #{hardwareSn}
 | 
				
			||||||
 | 
					            </when>
 | 
				
			||||||
 | 
					            <when test="clientId != null">
 | 
				
			||||||
 | 
					                client_id = #{clientId}
 | 
				
			||||||
 | 
					            </when>
 | 
				
			||||||
 | 
					            <otherwise>
 | 
				
			||||||
 | 
					                1=0 <!-- 如果两个条件都不满足,则不更新任何记录 -->
 | 
				
			||||||
 | 
					            </otherwise>
 | 
				
			||||||
 | 
					        </choose>
 | 
				
			||||||
    </update>
 | 
					    </update>
 | 
				
			||||||
    <select id="getRegistrationByIds" parameterType="String" resultMap="RmResourceRegistrationResult">
 | 
					    <select id="getRegistrationByIds" parameterType="String" resultMap="RmResourceRegistrationResult">
 | 
				
			||||||
        <include refid="selectRmResourceRegistrationVo"/>
 | 
					        <include refid="selectRmResourceRegistrationVo"/>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 | 
				
			|||||||
import com.ruoyi.rocketmq.domain.DeviceMessage;
 | 
					import com.ruoyi.rocketmq.domain.DeviceMessage;
 | 
				
			||||||
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.handler.MessageHandler;
 | 
				
			||||||
import com.ruoyi.rocketmq.producer.ConsumeException;
 | 
					import com.ruoyi.rocketmq.producer.ConsumeException;
 | 
				
			||||||
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;
 | 
				
			||||||
@@ -25,6 +26,8 @@ import java.util.List;
 | 
				
			|||||||
public class RocketMsgListener implements MessageListenerConcurrently {
 | 
					public class RocketMsgListener implements MessageListenerConcurrently {
 | 
				
			||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private DeviceMessageHandler deviceMessageHandler;
 | 
					    private DeviceMessageHandler deviceMessageHandler;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private MessageHandler messageHandler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 消费消息
 | 
					     * 消费消息
 | 
				
			||||||
@@ -62,6 +65,13 @@ public class RocketMsgListener implements MessageListenerConcurrently {
 | 
				
			|||||||
                       deviceMessageHandler.handleMessage(message);
 | 
					                       deviceMessageHandler.handleMessage(message);
 | 
				
			||||||
                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//业务处理成功
 | 
					                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//业务处理成功
 | 
				
			||||||
                   }
 | 
					                   }
 | 
				
			||||||
 | 
					                   if(MessageCodeEnum.TR_AGENT_UP.getCode().equals(topic)){
 | 
				
			||||||
 | 
					                       // 拿到信息
 | 
				
			||||||
 | 
					                       DeviceMessage message = JSON.parseObject(body, DeviceMessage.class);
 | 
				
			||||||
 | 
					                       // 处理消息
 | 
				
			||||||
 | 
					                       messageHandler.handleMessage(message);
 | 
				
			||||||
 | 
					                       return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;//业务处理成功
 | 
				
			||||||
 | 
					                   }
 | 
				
			||||||
                   // 根据不同的topic处理不同的业务 这里以订单消息为例子
 | 
					                   // 根据不同的topic处理不同的业务 这里以订单消息为例子
 | 
				
			||||||
               }
 | 
					               }
 | 
				
			||||||
           }
 | 
					           }
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,34 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.core.JsonParser;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.core.type.TypeReference;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.DeserializationContext;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.JsonDeserializer;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.JsonNode;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.ObjectMapper;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.NetworkInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.io.IOException;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					public class NetworkInfoDeserializer extends JsonDeserializer<List<NetworkInfo>> {
 | 
				
			||||||
 | 
					    // 添加无参构造函数(Jackson 需要)
 | 
				
			||||||
 | 
					    public NetworkInfoDeserializer() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<NetworkInfo> deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
 | 
				
			||||||
 | 
					        ObjectMapper mapper = (ObjectMapper) p.getCodec();
 | 
				
			||||||
 | 
					        JsonNode node = mapper.readTree(p);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 如果 networkInfo 是字符串(如日志中的情况),先解析字符串
 | 
				
			||||||
 | 
					        if (node.isTextual()) {
 | 
				
			||||||
 | 
					            String jsonStr = node.textValue();
 | 
				
			||||||
 | 
					            return mapper.readValue(jsonStr, new TypeReference<List<NetworkInfo>>() {});
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 如果 networkInfo 是数组,直接解析
 | 
				
			||||||
 | 
					        else if (node.isArray()) {
 | 
				
			||||||
 | 
					            return mapper.readValue(node.traverse(), new TypeReference<List<NetworkInfo>>() {});
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        throw new IOException("Invalid networkInfo format");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,26 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.domain.vo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.annotation.JsonProperty;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.NetworkInfoDeserializer;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.NetworkInfo;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class RegisterMsgVo {
 | 
				
			||||||
 | 
					    @JsonProperty("clientId")
 | 
				
			||||||
 | 
					    private String clientId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("sn")
 | 
				
			||||||
 | 
					    private String sn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("networkInfo")
 | 
				
			||||||
 | 
					    @JsonDeserialize(using = NetworkInfoDeserializer.class)
 | 
				
			||||||
 | 
					    private List<NetworkInfo> networkInfo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @JsonProperty("timestamp")
 | 
				
			||||||
 | 
					    private long timestamp;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -17,6 +17,8 @@ public enum  MessageCodeEnum {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    TONGRAN_AGENT_UP("tongran_agent_up","agent数据采集的信息topic"),
 | 
					    TONGRAN_AGENT_UP("tongran_agent_up","agent数据采集的信息topic"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    TR_AGENT_UP("tr_agent_up","agent数据采集的信息topic v1.1"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 系统消息
 | 
					     * 系统消息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,7 +14,7 @@ public class MessageTopic {
 | 
				
			|||||||
        List<String> getTopicLists=new ArrayList<>();
 | 
					        List<String> getTopicLists=new ArrayList<>();
 | 
				
			||||||
        // agent采集消息
 | 
					        // agent采集消息
 | 
				
			||||||
//        getTopicLists.add("agent_up");
 | 
					//        getTopicLists.add("agent_up");
 | 
				
			||||||
        getTopicLists.add("tongran_agent_up");
 | 
					        getTopicLists.add("tr_agent_up");
 | 
				
			||||||
        return getTopicLists;
 | 
					        return getTopicLists;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,947 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.handler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.JsonNode;
 | 
				
			||||||
 | 
					import com.fasterxml.jackson.databind.ObjectMapper;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.constant.SecurityConstants;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.domain.R;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.enums.MsgEnum;
 | 
				
			||||||
 | 
					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.CollectDataVo;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.vo.RegisterMsgVo;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.vo.RspVo;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.service.*;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.utils.DataProcessUtil;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.utils.JsonDataParser;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.utils.SwitchJsonDataParser;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.*;
 | 
				
			||||||
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.springframework.beans.BeanUtils;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.dao.DataAccessException;
 | 
				
			||||||
 | 
					import org.springframework.data.redis.core.RedisOperations;
 | 
				
			||||||
 | 
					import org.springframework.data.redis.core.RedisTemplate;
 | 
				
			||||||
 | 
					import org.springframework.data.redis.core.SessionCallback;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.annotation.EnableScheduling;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.annotation.Scheduled;
 | 
				
			||||||
 | 
					import org.springframework.stereotype.Component;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.annotation.PostConstruct;
 | 
				
			||||||
 | 
					import java.math.BigDecimal;
 | 
				
			||||||
 | 
					import java.math.RoundingMode;
 | 
				
			||||||
 | 
					import java.util.*;
 | 
				
			||||||
 | 
					import java.util.function.Consumer;
 | 
				
			||||||
 | 
					import java.util.function.Function;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * 设备消息处理器
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
 | 
					@Component
 | 
				
			||||||
 | 
					@EnableScheduling
 | 
				
			||||||
 | 
					public class MessageHandler {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final Map<String, Consumer<DeviceMessage>> messageHandlers = new HashMap<>();
 | 
				
			||||||
 | 
					    // 心跳状态
 | 
				
			||||||
 | 
					    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 = 30000; // 3分钟超时
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private RedisTemplate<String, String> redisTemplate;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private  IInitialBandwidthTrafficService initialBandwidthTrafficService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private  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
 | 
				
			||||||
 | 
					    private IInitialSwitchPowerSupplyService initialSwitchPowerSupplyService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchFanInfoService initialSwitchFanInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchMpuInfoService initialSwitchMpuInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchOpticalModuleService initialSwitchOpticalModuleService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchOtherCollectDataService insertInitialSwitchOtherInfo;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSystemOtherCollectDataService iInitialSystemOtherCollectDataService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IRmResourceRemoteService rmResourceRemoteService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IRmAgentManagementService rmAgentManagementService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private DataProcessUtil dataProcessUtil;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IRmNetworkInterfaceService rmNetworkInterfaceService;
 | 
				
			||||||
 | 
					    // 在类中添加
 | 
				
			||||||
 | 
					    private static final ObjectMapper objectMapper = new ObjectMapper();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 初始化处理器映射
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @PostConstruct
 | 
				
			||||||
 | 
					    public void init() {
 | 
				
			||||||
 | 
					        // 所有应答类消息使用同一个处理器
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.注册应答.getValue(), this::handleResponseMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.断开应答.getValue(), this::handleResponseMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.开启系统采集应答.getValue(), this::handleResponseMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.关闭系统采集应答.getValue(), this::handleResponseMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.开启交换机采集应答.getValue(), this::handleResponseMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.关闭交换机采集应答.getValue(), this::handleResponseMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.告警设置应答.getValue(), this::handleResponseMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.执行脚本策略应答.getValue(), this::handleScriptRspMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.Agent版本更新应答.getValue(), this::handleAgentUpdateRspMessage);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 其他类型消息可以单独注册处理器
 | 
				
			||||||
 | 
					        registerHandler(MsgEnum.注册.getValue(), this::handleRegisterMessage);
 | 
				
			||||||
 | 
					        registerHandler(MsgEnum.获取最新策略.getValue(), this::handleNewPolicyMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.CPU上报.getValue(), this::handleCpuMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.磁盘上报.getValue(), this::handleDiskMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.容器上报.getValue(), this::handleDockerMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.内存上报.getValue(), this::handleMemoryMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.网络上报.getValue(), this::handleNetMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.挂载上报.getValue(), this::handleMountPointMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.系统其他上报.getValue(), this::handleOtherSystemMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.交换机上报.getValue(), this::handleSwitchDataMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.心跳上报.getValue(), this::handleHeartbeatMessage);
 | 
				
			||||||
 | 
					//        registerHandler(MsgEnum.多公网IP探测.getValue(), this::handlePublicIpDetectMessage);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取最新策略
 | 
				
			||||||
 | 
					     * @param deviceMessage
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleNewPolicyMessage(DeviceMessage deviceMessage) {
 | 
				
			||||||
 | 
					        List<RegisterMsgVo> interfaces = JsonDataParser.parseJsonData(deviceMessage.getData(), RegisterMsgVo.class);
 | 
				
			||||||
 | 
					        if(!interfaces.isEmpty()) {
 | 
				
			||||||
 | 
					            // 获取该服务器的策略信息
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 服务器注册
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleRegisterMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<RegisterMsgVo> interfaces = JsonDataParser.parseJsonData(message.getData(), RegisterMsgVo.class);
 | 
				
			||||||
 | 
					        if(!interfaces.isEmpty()) {
 | 
				
			||||||
 | 
					            RegisterMsgVo registerMsg = interfaces.get(0);
 | 
				
			||||||
 | 
					            // 自动注册服务器信息
 | 
				
			||||||
 | 
					            RmRegisterMsgRemote rmRegisterMsgRemote = new RmRegisterMsgRemote();
 | 
				
			||||||
 | 
					            BeanUtils.copyProperties(registerMsg, rmRegisterMsgRemote);
 | 
				
			||||||
 | 
					            remoteRevenueConfigService.innerAddRegist(rmRegisterMsgRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = registerMsg.getTimestamp();
 | 
				
			||||||
 | 
					            long millis = timestamp * 1000;
 | 
				
			||||||
 | 
					            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					            String timeStr = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", createTime);
 | 
				
			||||||
 | 
					            List<NetworkInfo> networkInfoList = registerMsg.getNetworkInfo();
 | 
				
			||||||
 | 
					            if(!networkInfoList.isEmpty()){
 | 
				
			||||||
 | 
					                if(networkInfoList.size()==1){
 | 
				
			||||||
 | 
					                    NetworkInfo networkInfo = networkInfoList.get(0);
 | 
				
			||||||
 | 
					                    // 查询该网卡信息是否存在
 | 
				
			||||||
 | 
					                    RmNetworkInterface queryParam = new RmNetworkInterface();
 | 
				
			||||||
 | 
					                    queryParam.setMacAddress(networkInfo.getMac());
 | 
				
			||||||
 | 
					                    List<RmNetworkInterface> exits = rmNetworkInterfaceService.selectRmNetworkInterfaceList(queryParam);
 | 
				
			||||||
 | 
					                    if(exits.isEmpty()){
 | 
				
			||||||
 | 
					                        // 保存网卡信息
 | 
				
			||||||
 | 
					                        RmNetworkInterface insertData = new RmNetworkInterface();
 | 
				
			||||||
 | 
					                        // 业务ip和管理网ip
 | 
				
			||||||
 | 
					                        insertData.setBindIp("3");
 | 
				
			||||||
 | 
					                        insertData.setClientId(registerMsg.getClientId());
 | 
				
			||||||
 | 
					                        insertData.setIsp(networkInfo.getCarrier());
 | 
				
			||||||
 | 
					                        insertData.setCity(networkInfo.getCity());
 | 
				
			||||||
 | 
					                        insertData.setGateway(networkInfo.getGateway());
 | 
				
			||||||
 | 
					                        insertData.setInterfaceName(networkInfo.getName());
 | 
				
			||||||
 | 
					                        insertData.setIpv4Address(networkInfo.getIpv4());
 | 
				
			||||||
 | 
					                        insertData.setMacAddress(networkInfo.getMac());
 | 
				
			||||||
 | 
					                        insertData.setProvince(networkInfo.getProvince());
 | 
				
			||||||
 | 
					                        insertData.setPublicIp(networkInfo.getPublicIp());
 | 
				
			||||||
 | 
					                        insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                        rmNetworkInterfaceService.insertRmNetworkInterface(insertData);
 | 
				
			||||||
 | 
					                    }else{
 | 
				
			||||||
 | 
					                        RmNetworkInterface oldInterfaceMsg = exits.get(0);
 | 
				
			||||||
 | 
					                        if(!StringUtils.equals(networkInfo.getPublicIp(),oldInterfaceMsg.getPublicIp())){
 | 
				
			||||||
 | 
					                            RmNetworkInterface updateData = new RmNetworkInterface();
 | 
				
			||||||
 | 
					                            updateData.setMacAddress(networkInfo.getMac());
 | 
				
			||||||
 | 
					                            updateData.setIsp(networkInfo.getCarrier());
 | 
				
			||||||
 | 
					                            updateData.setCity(networkInfo.getCity());
 | 
				
			||||||
 | 
					                            updateData.setGateway(networkInfo.getGateway());
 | 
				
			||||||
 | 
					                            updateData.setInterfaceName(networkInfo.getName());
 | 
				
			||||||
 | 
					                            updateData.setIpv4Address(networkInfo.getIpv4());
 | 
				
			||||||
 | 
					                            updateData.setMacAddress(networkInfo.getMac());
 | 
				
			||||||
 | 
					                            updateData.setProvince(networkInfo.getProvince());
 | 
				
			||||||
 | 
					                            updateData.setPublicIp(networkInfo.getPublicIp());
 | 
				
			||||||
 | 
					                            rmNetworkInterfaceService.updateRmNetworkInterfaceByMac(updateData);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }else{
 | 
				
			||||||
 | 
					                    for (NetworkInfo networkInfo : networkInfoList) {
 | 
				
			||||||
 | 
					                        // 查询该网卡信息是否存在
 | 
				
			||||||
 | 
					                        RmNetworkInterface queryParam = new RmNetworkInterface();
 | 
				
			||||||
 | 
					                        queryParam.setMacAddress(networkInfo.getMac());
 | 
				
			||||||
 | 
					                        List<RmNetworkInterface> exits = rmNetworkInterfaceService.selectRmNetworkInterfaceList(queryParam);
 | 
				
			||||||
 | 
					                        if(exits.isEmpty()){
 | 
				
			||||||
 | 
					                            // 保存网卡信息
 | 
				
			||||||
 | 
					                            RmNetworkInterface insertData = new RmNetworkInterface();
 | 
				
			||||||
 | 
					                            // 业务ip和管理网ip
 | 
				
			||||||
 | 
					                            insertData.setClientId(registerMsg.getClientId());
 | 
				
			||||||
 | 
					                            insertData.setIsp(networkInfo.getCarrier());
 | 
				
			||||||
 | 
					                            insertData.setCity(networkInfo.getCity());
 | 
				
			||||||
 | 
					                            insertData.setGateway(networkInfo.getGateway());
 | 
				
			||||||
 | 
					                            insertData.setInterfaceName(networkInfo.getName());
 | 
				
			||||||
 | 
					                            insertData.setIpv4Address(networkInfo.getIpv4());
 | 
				
			||||||
 | 
					                            insertData.setMacAddress(networkInfo.getMac());
 | 
				
			||||||
 | 
					                            insertData.setProvince(networkInfo.getProvince());
 | 
				
			||||||
 | 
					                            insertData.setPublicIp(networkInfo.getPublicIp());
 | 
				
			||||||
 | 
					                            insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                            rmNetworkInterfaceService.insertRmNetworkInterface(insertData);
 | 
				
			||||||
 | 
					                        }else{
 | 
				
			||||||
 | 
					                            RmNetworkInterface oldInterfaceMsg = exits.get(0);
 | 
				
			||||||
 | 
					                            RmNetworkInterface updateData = new RmNetworkInterface();
 | 
				
			||||||
 | 
					                            updateData.setMacAddress(networkInfo.getMac());
 | 
				
			||||||
 | 
					                            updateData.setIsp(networkInfo.getCarrier());
 | 
				
			||||||
 | 
					                            updateData.setCity(networkInfo.getCity());
 | 
				
			||||||
 | 
					                            updateData.setGateway(networkInfo.getGateway());
 | 
				
			||||||
 | 
					                            updateData.setInterfaceName(networkInfo.getName());
 | 
				
			||||||
 | 
					                            updateData.setIpv4Address(networkInfo.getIpv4());
 | 
				
			||||||
 | 
					                            updateData.setMacAddress(networkInfo.getMac());
 | 
				
			||||||
 | 
					                            updateData.setProvince(networkInfo.getProvince());
 | 
				
			||||||
 | 
					                            updateData.setPublicIp(networkInfo.getPublicIp());
 | 
				
			||||||
 | 
					                            if(!StringUtils.equals(networkInfo.getPublicIp(),oldInterfaceMsg.getPublicIp())){
 | 
				
			||||||
 | 
					                                updateData.setBindIp("0");
 | 
				
			||||||
 | 
					                                // 修改绑定公网ip状态
 | 
				
			||||||
 | 
					                                RmResourceRegistrationRemote updateParam = new RmResourceRegistrationRemote();
 | 
				
			||||||
 | 
					                                updateParam.setClientId(registerMsg.getClientId());
 | 
				
			||||||
 | 
					                                updateParam.setMultiPublicIpStatus("0");
 | 
				
			||||||
 | 
					                                remoteRevenueConfigService.updateStatusByResource(updateParam, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                            rmNetworkInterfaceService.updateRmNetworkInterfaceByMac(updateData);
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 多公网IP探测
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handlePublicIpDetectMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<RspVo> rspVoList = JsonDataParser.parseJsonData(message.getData(), RspVo.class);
 | 
				
			||||||
 | 
					        //TODO 公网信息入库
 | 
				
			||||||
 | 
					        // 查询公网信息
 | 
				
			||||||
 | 
					        // 如果公网信息有变化修改公网IP状态为需绑定
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * agent更新响应
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleAgentUpdateRspMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<RspVo> rspVoList = JsonDataParser.parseJsonData(message.getData(), RspVo.class);
 | 
				
			||||||
 | 
					        if (!rspVoList.isEmpty()) {
 | 
				
			||||||
 | 
					            RspVo rsp = rspVoList.get(0);
 | 
				
			||||||
 | 
					            if(rsp.getResCode() == 1){
 | 
				
			||||||
 | 
					                RmAgentManagement rmAgentManagement = new RmAgentManagement();
 | 
				
			||||||
 | 
					                rmAgentManagement.setHardwareSn(message.getClientId());
 | 
				
			||||||
 | 
					                rmAgentManagement.setLastUpdateResult("1");
 | 
				
			||||||
 | 
					                rmAgentManagementService.updateRmAgentManagementByHardwareSn(rmAgentManagement);
 | 
				
			||||||
 | 
					            }else{
 | 
				
			||||||
 | 
					                RmAgentManagement rmAgentManagement = new RmAgentManagement();
 | 
				
			||||||
 | 
					                rmAgentManagement.setHardwareSn(message.getClientId());
 | 
				
			||||||
 | 
					                rmAgentManagement.setLastUpdateResult("0");
 | 
				
			||||||
 | 
					                rmAgentManagementService.updateRmAgentManagementByHardwareSn(rmAgentManagement);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 注册消息处理器
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void registerHandler(String dataType, Consumer<DeviceMessage> handler) {
 | 
				
			||||||
 | 
					        messageHandlers.put(dataType, handler);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 处理设备消息(对外暴露的主方法)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void handleMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        String dataType = message.getDataType();
 | 
				
			||||||
 | 
					        Consumer<DeviceMessage> handler = messageHandlers.get(dataType);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (handler != null) {
 | 
				
			||||||
 | 
					            handler.accept(message);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            log.warn("未知数据类型:{}", dataType);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // ========== 具体的消息处理方法 ==========
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 网络流量数据入库
 | 
				
			||||||
 | 
					     * @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 * 1000;
 | 
				
			||||||
 | 
					            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);
 | 
				
			||||||
 | 
					                // 发送流量
 | 
				
			||||||
 | 
					                iface.setOutSpeed(dataProcessUtil.bytesToBits(iface.getOutSpeed()));
 | 
				
			||||||
 | 
					                // 接收流量
 | 
				
			||||||
 | 
					                iface.setInSpeed(dataProcessUtil.bytesToBits(iface.getInSpeed()));
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            // 批量入库集合
 | 
				
			||||||
 | 
					            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 * 1000;
 | 
				
			||||||
 | 
					            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 * 1000;
 | 
				
			||||||
 | 
					        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 * 1000;
 | 
				
			||||||
 | 
					        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 * 1000;
 | 
				
			||||||
 | 
					            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 * 1000;
 | 
				
			||||||
 | 
					            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 handleSwitchDataMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<CollectDataVo> switchData = JsonDataParser.parseJsonData(message.getData(), CollectDataVo.class);
 | 
				
			||||||
 | 
					        if(!switchData.isEmpty()){
 | 
				
			||||||
 | 
					            CollectDataVo switchDataVo = switchData.get(0);
 | 
				
			||||||
 | 
					            switch(switchDataVo.getType()){
 | 
				
			||||||
 | 
					                case "switchNetCollect":
 | 
				
			||||||
 | 
					                    handleSwitchNetMessage(switchDataVo, message.getClientId());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "switchPwrCollect":
 | 
				
			||||||
 | 
					                    handleSwitchPwrMessage(switchDataVo, message.getClientId());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "switchModuleCollect":
 | 
				
			||||||
 | 
					                    handleSwitchModuleMessage(switchDataVo, message.getClientId());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "switchMpuCollect":
 | 
				
			||||||
 | 
					                    handleSwitchMpuMessage(switchDataVo, message.getClientId());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "switchFanCollect":
 | 
				
			||||||
 | 
					                    handleSwitchFanMessage(switchDataVo, message.getClientId());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                default:
 | 
				
			||||||
 | 
					                    handleSwitchOtherMessage(switchDataVo, message.getClientId());
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("交换机data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 电源发现数据
 | 
				
			||||||
 | 
					     * @param switchDataVo
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleSwitchPwrMessage(CollectDataVo switchDataVo, String clientId){
 | 
				
			||||||
 | 
					        List<InitialSwitchPowerSupply> powerSupplyList = SwitchJsonDataParser.parseJsonData(switchDataVo.getValue(), InitialSwitchPowerSupply.class);
 | 
				
			||||||
 | 
					        if (!powerSupplyList.isEmpty()){
 | 
				
			||||||
 | 
					            for (InitialSwitchPowerSupply insertData : powerSupplyList) {
 | 
				
			||||||
 | 
					                // 时间戳转换
 | 
				
			||||||
 | 
					                long timestamp = switchDataVo.getTimestamp();
 | 
				
			||||||
 | 
					                long millis = timestamp * 1000;
 | 
				
			||||||
 | 
					                Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					                insertData.setClientId(clientId);
 | 
				
			||||||
 | 
					                insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            initialSwitchPowerSupplyService.insertBatchInitialSwitchPowerSupply(powerSupplyList);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 光模块发现数据
 | 
				
			||||||
 | 
					     * @param switchDataVo
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleSwitchModuleMessage(CollectDataVo switchDataVo, String clientId){
 | 
				
			||||||
 | 
					        List<InitialSwitchOpticalModule> moduleList = SwitchJsonDataParser.parseJsonData(switchDataVo.getValue(), InitialSwitchOpticalModule.class);
 | 
				
			||||||
 | 
					        if (!moduleList.isEmpty()){
 | 
				
			||||||
 | 
					            for (InitialSwitchOpticalModule insertData : moduleList) {
 | 
				
			||||||
 | 
					                // 时间戳转换
 | 
				
			||||||
 | 
					                long timestamp = switchDataVo.getTimestamp();
 | 
				
			||||||
 | 
					                long millis = timestamp * 1000;
 | 
				
			||||||
 | 
					                Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					                insertData.setClientId(clientId);
 | 
				
			||||||
 | 
					                insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            initialSwitchOpticalModuleService.batchInitialSwitchOpticalModule(moduleList);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * MPU发现数据
 | 
				
			||||||
 | 
					     * @param switchDataVo
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleSwitchMpuMessage(CollectDataVo switchDataVo, String clientId){
 | 
				
			||||||
 | 
					        List<InitialSwitchMpuInfo> mpuList = SwitchJsonDataParser.parseJsonData(switchDataVo.getValue(), InitialSwitchMpuInfo.class);
 | 
				
			||||||
 | 
					        if (!mpuList.isEmpty()){
 | 
				
			||||||
 | 
					            for (InitialSwitchMpuInfo insertData : mpuList) {
 | 
				
			||||||
 | 
					                // 时间戳转换
 | 
				
			||||||
 | 
					                long timestamp = switchDataVo.getTimestamp();
 | 
				
			||||||
 | 
					                long millis = timestamp * 1000;
 | 
				
			||||||
 | 
					                Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					                insertData.setClientId(clientId);
 | 
				
			||||||
 | 
					                insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            initialSwitchMpuInfoService.insertBatchInitialSwitchMpuInfo(mpuList);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 风扇发现数据
 | 
				
			||||||
 | 
					     * @param switchDataVo
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleSwitchFanMessage(CollectDataVo switchDataVo, String clientId){
 | 
				
			||||||
 | 
					        List<InitialSwitchFanInfo> fanList = SwitchJsonDataParser.parseJsonData(switchDataVo.getValue(), InitialSwitchFanInfo.class);
 | 
				
			||||||
 | 
					        if (!fanList.isEmpty()){
 | 
				
			||||||
 | 
					            for (InitialSwitchFanInfo insertData : fanList) {
 | 
				
			||||||
 | 
					                // 时间戳转换
 | 
				
			||||||
 | 
					                long timestamp = switchDataVo.getTimestamp();
 | 
				
			||||||
 | 
					                long millis = timestamp * 1000;
 | 
				
			||||||
 | 
					                Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					                insertData.setClientId(clientId);
 | 
				
			||||||
 | 
					                insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            initialSwitchFanInfoService.insertBatchInitialSwitchFanInfo(fanList);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 其他发现数据(默认处理)
 | 
				
			||||||
 | 
					     * @param switchDataVo
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleSwitchOtherMessage(CollectDataVo switchDataVo, String clientId) {
 | 
				
			||||||
 | 
					        if (switchDataVo != null) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                InitialSwitchOtherCollectData insertData = new InitialSwitchOtherCollectData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 设置基本信息
 | 
				
			||||||
 | 
					                long timestamp = switchDataVo.getTimestamp();
 | 
				
			||||||
 | 
					                Date createTime = new Date(timestamp * 1000 / 1000 * 1000);
 | 
				
			||||||
 | 
					                insertData.setClientId(clientId);
 | 
				
			||||||
 | 
					                insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                String value = switchDataVo.getValue();
 | 
				
			||||||
 | 
					                JsonNode jsonNode = objectMapper.readTree(value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 处理数组中的字符串JSON
 | 
				
			||||||
 | 
					                if (jsonNode.isArray() && jsonNode.size() > 0) {
 | 
				
			||||||
 | 
					                    JsonNode firstElement = jsonNode.get(0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (firstElement.isTextual()) {
 | 
				
			||||||
 | 
					                        // 二次解析JSON字符串
 | 
				
			||||||
 | 
					                        JsonNode innerJsonNode = objectMapper.readTree(firstElement.asText());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        if (innerJsonNode.isObject()) {
 | 
				
			||||||
 | 
					                            Iterator<Map.Entry<String, JsonNode>> fields = innerJsonNode.fields();
 | 
				
			||||||
 | 
					                            if (fields.hasNext()) {
 | 
				
			||||||
 | 
					                                Map.Entry<String, JsonNode> entry = fields.next();
 | 
				
			||||||
 | 
					                                String fieldName = entry.getKey();
 | 
				
			||||||
 | 
					                                String fieldValue = entry.getValue().asText();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                insertData.setCollectType(fieldName);
 | 
				
			||||||
 | 
					                                if (!"null".equals(fieldValue)) {
 | 
				
			||||||
 | 
					                                    insertData.setCollectValue(fieldValue);
 | 
				
			||||||
 | 
					                                    insertInitialSwitchOtherInfo.insertInitialSwitchOtherCollectData(insertData);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("解析JSON数据失败: {}, value: {}", e.getMessage(), switchDataVo.getValue(), e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 交换机网卡信息数据入库
 | 
				
			||||||
 | 
					     * @param switchDataVo
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleSwitchNetMessage(CollectDataVo switchDataVo, String clientId) {
 | 
				
			||||||
 | 
					        List<InitialSwitchInfo> switchInfos = SwitchJsonDataParser.parseJsonData(switchDataVo.getValue(), InitialSwitchInfo.class);
 | 
				
			||||||
 | 
					        if(!switchInfos.isEmpty()){
 | 
				
			||||||
 | 
					            // 根据clientId查询交换机ip
 | 
				
			||||||
 | 
					            RmResourceRegistrationRemote queryParam = new RmResourceRegistrationRemote();
 | 
				
			||||||
 | 
					            queryParam.setHardwareSn(clientId);
 | 
				
			||||||
 | 
					            R<RmResourceRegistrationRemote> registMsgR = remoteRevenueConfigService.getListByHardwareSn(queryParam, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					            if(registMsgR != null){
 | 
				
			||||||
 | 
					                RmResourceRegistrationRemote registMsg = registMsgR.getData();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = switchDataVo.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(clientId);
 | 
				
			||||||
 | 
					            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(clientId);
 | 
				
			||||||
 | 
					                    switchInfo.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                    if(registMsgR != null && registMsgR.getData()!=null && registMsgR.getData().getSnmpCollectAddr()!=null){
 | 
				
			||||||
 | 
					                        switchInfo.setSwitchIp(registMsgR.getData().getSnmpCollectAddr());
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    InitialSwitchInfoTemp tempInfo = tempMap.get(switchInfo.getName());
 | 
				
			||||||
 | 
					                    if (tempInfo != null) {
 | 
				
			||||||
 | 
					                        // 计算inSpeed
 | 
				
			||||||
 | 
					                        if (switchInfo.getInBytes() != null && tempInfo.getInBytes() != null) {
 | 
				
			||||||
 | 
					                            BigDecimal inDiff = switchInfo.getInBytes().subtract(tempInfo.getInBytes());
 | 
				
			||||||
 | 
					                            // 字节转为bit
 | 
				
			||||||
 | 
					                            BigDecimal inDiffBit = inDiff.multiply(new BigDecimal(8)).setScale(0, RoundingMode.HALF_UP);
 | 
				
			||||||
 | 
					                            switchInfo.setInSpeed(inDiffBit.divide(divisor, 2, RoundingMode.HALF_UP));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        // 计算outSpeed
 | 
				
			||||||
 | 
					                        if (switchInfo.getOutBytes() != null && tempInfo.getOutBytes() != null) {
 | 
				
			||||||
 | 
					                            BigDecimal outDiff = switchInfo.getOutBytes().subtract(tempInfo.getOutBytes());
 | 
				
			||||||
 | 
					                            // 字节转为bit
 | 
				
			||||||
 | 
					                            BigDecimal outDiffBit = outDiff.multiply(new BigDecimal(8)).setScale(0, RoundingMode.HALF_UP);
 | 
				
			||||||
 | 
					                            switchInfo.setOutSpeed(outDiffBit.divide(divisor, 2, RoundingMode.HALF_UP));
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }else{
 | 
				
			||||||
 | 
					                switchInfos.forEach(switchInfo -> {
 | 
				
			||||||
 | 
					                    switchInfo.setClientId(clientId);
 | 
				
			||||||
 | 
					                    switchInfo.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                    if(registMsgR != null && registMsgR.getData()!=null && registMsgR.getData().getSnmpCollectAddr()!=null){
 | 
				
			||||||
 | 
					                        switchInfo.setSwitchIp(registMsgR.getData().getSnmpCollectAddr());
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // 清空临时表对应switch信息
 | 
				
			||||||
 | 
					            initialSwitchInfoTempService.truncateSwitchInfoTemp(clientId);
 | 
				
			||||||
 | 
					            // 临时表 用来计算inSpeed outSeppd
 | 
				
			||||||
 | 
					            initialSwitchInfoTempService.batchInsertInitialSwitchInfoTemp(switchInfos);
 | 
				
			||||||
 | 
					            // 初始交换机数据入库
 | 
				
			||||||
 | 
					            initialSwitchInfoService.batchInsertInitialSwitchInfo(switchInfos);
 | 
				
			||||||
 | 
					            // 业务表入库
 | 
				
			||||||
 | 
					            InitialSwitchInfoDetailsRemote detailsRemote = new InitialSwitchInfoDetailsRemote();
 | 
				
			||||||
 | 
					            detailsRemote.setClientId(clientId);
 | 
				
			||||||
 | 
					            detailsRemote.setStartTime(timeStr);
 | 
				
			||||||
 | 
					            detailsRemote.setEndTime(timeStr);
 | 
				
			||||||
 | 
					            remoteRevenueConfigService.autoSaveSwitchTraffic(detailsRemote, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("交换机data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 系统其他信息
 | 
				
			||||||
 | 
					     * @param message
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void handleOtherSystemMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<CollectDataVo> otherData = JsonDataParser.parseJsonData(message.getData(), CollectDataVo.class);
 | 
				
			||||||
 | 
					        if(!otherData.isEmpty()){
 | 
				
			||||||
 | 
					            CollectDataVo systemDataVo = otherData.get(0);
 | 
				
			||||||
 | 
					            if (systemDataVo != null){
 | 
				
			||||||
 | 
					                try {
 | 
				
			||||||
 | 
					                    InitialSystemOtherCollectData insertData = new InitialSystemOtherCollectData();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // 时间戳转换
 | 
				
			||||||
 | 
					                    long timestamp = systemDataVo.getTimestamp();
 | 
				
			||||||
 | 
					                    long millis = timestamp * 1000;
 | 
				
			||||||
 | 
					                    Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    insertData.setClientId(message.getClientId());
 | 
				
			||||||
 | 
					                    insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                    String collectType = systemDataVo.getType();
 | 
				
			||||||
 | 
					                    String collectValue = systemDataVo.getValue();
 | 
				
			||||||
 | 
					                    insertData.setCollectType(collectType);
 | 
				
			||||||
 | 
					                    insertData.setCollectValue(collectValue);
 | 
				
			||||||
 | 
					                    iInitialSystemOtherCollectDataService.insertInitialSystemOtherCollectData(insertData);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                } catch (Exception e) {
 | 
				
			||||||
 | 
					                    log.error("解析JSON数据失败: {}, value: {}", e.getMessage(), systemDataVo.getValue());
 | 
				
			||||||
 | 
					                    // 可以选择保存原始数据或进行其他错误处理
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 监听心跳
 | 
				
			||||||
 | 
					     * @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.debug("处理心跳消息,客户端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 {
 | 
				
			||||||
 | 
					                // 记录处理前状态(调试用)
 | 
				
			||||||
 | 
					                String prevStatus = redisTemplate.opsForValue().get(statusKey);
 | 
				
			||||||
 | 
					                String prevTime = redisTemplate.opsForValue().get(timeKey);
 | 
				
			||||||
 | 
					                log.debug("客户端ID: {} 处理前状态 - status: {}, time: {}", clientId, prevStatus, prevTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 使用事务确保原子性操作
 | 
				
			||||||
 | 
					                redisTemplate.execute(new SessionCallback<Object>() {
 | 
				
			||||||
 | 
					                    @Override
 | 
				
			||||||
 | 
					                    public Object execute(RedisOperations operations) throws DataAccessException {
 | 
				
			||||||
 | 
					                        operations.multi();
 | 
				
			||||||
 | 
					                        // 重置丢失计数为0,设置最后心跳时间
 | 
				
			||||||
 | 
					                        operations.opsForValue().set(statusKey, "0");
 | 
				
			||||||
 | 
					                        operations.opsForValue().set(timeKey, String.valueOf(System.currentTimeMillis()));
 | 
				
			||||||
 | 
					                        return operations.exec();
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                log.debug("客户端ID: {} 心跳处理完成,重置状态和时间", clientId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 检查是否之前有告警状态
 | 
				
			||||||
 | 
					                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); // 清除恢复计数器
 | 
				
			||||||
 | 
					                        // 修改资源状态
 | 
				
			||||||
 | 
					                        updateResourceStatus(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) // 每60s检查一次
 | 
				
			||||||
 | 
					    public void checkHeartbeatStatus() {
 | 
				
			||||||
 | 
					        long currentTime = System.currentTimeMillis();
 | 
				
			||||||
 | 
					        log.debug("开始心跳状态检查,当前时间: {}", currentTime);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 获取所有客户端时间键
 | 
				
			||||||
 | 
					        Set<String> timeKeys = redisTemplate.keys(HEARTBEAT_TIME_PREFIX + "*");
 | 
				
			||||||
 | 
					        if (timeKeys == null) {
 | 
				
			||||||
 | 
					            log.debug("未找到任何心跳时间键");
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log.debug("找到 {} 个客户端需要检查", timeKeys.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        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)) {
 | 
				
			||||||
 | 
					                    log.debug("客户端ID: {} 已有告警,跳过检查", clientId);
 | 
				
			||||||
 | 
					                    continue; // 如果已有告警,跳过处理
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                String lastTimeStr = redisTemplate.opsForValue().get(timeKey);
 | 
				
			||||||
 | 
					                if (lastTimeStr == null) {
 | 
				
			||||||
 | 
					                    log.debug("客户端ID: {} 时间键为空,跳过", clientId);
 | 
				
			||||||
 | 
					                    continue;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                long lastHeartbeatTime = Long.parseLong(lastTimeStr);
 | 
				
			||||||
 | 
					                long timeDiff = currentTime - lastHeartbeatTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                log.debug("客户端ID: {} 最后心跳: {}, 时间差: {}ms, 超时阈值: {}ms",
 | 
				
			||||||
 | 
					                        clientId, lastHeartbeatTime, timeDiff, HEARTBEAT_TIMEOUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                if (timeDiff > HEARTBEAT_TIMEOUT) {
 | 
				
			||||||
 | 
					                    // 心跳超时处理 - 使用原子操作增加计数
 | 
				
			||||||
 | 
					                    Long lostCount = redisTemplate.opsForValue().increment(statusKey);
 | 
				
			||||||
 | 
					                    if (lostCount == 1) {
 | 
				
			||||||
 | 
					                        // 确保第一次增加时值为1
 | 
				
			||||||
 | 
					                        redisTemplate.opsForValue().set(statusKey, "1");
 | 
				
			||||||
 | 
					                        lostCount = 1L;
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    log.warn("客户端ID: {} 心跳超时,连续次数: {}, 时间差: {}ms",
 | 
				
			||||||
 | 
					                            clientId, lostCount, timeDiff);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    if (lostCount >= 3) {
 | 
				
			||||||
 | 
					                        log.warn("客户端ID: {} 连续三次心跳丢失,触发告警", clientId);
 | 
				
			||||||
 | 
					                        insertHeartbeatLog(clientId, "3", "连续三次心跳丢失");
 | 
				
			||||||
 | 
					                        redisTemplate.opsForValue().set(HEARTBEAT_ALERT_PREFIX + clientId, "1");
 | 
				
			||||||
 | 
					                        // 设置告警后删除timeKey和statusKey
 | 
				
			||||||
 | 
					                        redisTemplate.delete(timeKey);
 | 
				
			||||||
 | 
					                        redisTemplate.delete(statusKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                        log.info("客户端ID: {} 已设置告警并清理心跳记录", clientId);
 | 
				
			||||||
 | 
					                        // 修改资源状态
 | 
				
			||||||
 | 
					                        updateResourceStatus(clientId, "0");
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // 如果心跳正常,重置丢失次数
 | 
				
			||||||
 | 
					                    String currentStatus = redisTemplate.opsForValue().get(statusKey);
 | 
				
			||||||
 | 
					                    if (!"0".equals(currentStatus)) {
 | 
				
			||||||
 | 
					                        redisTemplate.opsForValue().set(statusKey, "0");
 | 
				
			||||||
 | 
					                        log.debug("客户端ID: {} 心跳正常,重置丢失次数从 {} 到 0", clientId, currentStatus);
 | 
				
			||||||
 | 
					                    } else {
 | 
				
			||||||
 | 
					                        log.debug("客户端ID: {} 心跳正常,状态已是0", clientId);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("检查心跳状态异常, clientId: {}", clientId, e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log.debug("心跳状态检查完成");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 更新资源状态的公共方法
 | 
				
			||||||
 | 
					    private void updateResourceStatus(String clientId, String status) {
 | 
				
			||||||
 | 
					        log.info("开启更新资源状态========");
 | 
				
			||||||
 | 
					        RmResourceRegistrationRemote rmResourceRegistrationRemote = new RmResourceRegistrationRemote();
 | 
				
			||||||
 | 
					        rmResourceRegistrationRemote.setOnlineStatus(status);
 | 
				
			||||||
 | 
					        rmResourceRegistrationRemote.setRegistrationStatus(status);
 | 
				
			||||||
 | 
					        rmResourceRegistrationRemote.setHardwareSn(clientId);
 | 
				
			||||||
 | 
					        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 handleScriptRspMessage(DeviceMessage message) {
 | 
				
			||||||
 | 
					        List<RspVo> rspVoList = JsonDataParser.parseJsonData(message.getData(), RspVo.class);
 | 
				
			||||||
 | 
					        if (!rspVoList.isEmpty()) {
 | 
				
			||||||
 | 
					            RspVo rsp = rspVoList.get(0);
 | 
				
			||||||
 | 
					            // 时间戳转换
 | 
				
			||||||
 | 
					            long timestamp = rsp.getTimestamp();
 | 
				
			||||||
 | 
					            long millis = timestamp * 1000;
 | 
				
			||||||
 | 
					            Date createTime = new Date(millis / 1000 * 1000); // 去除毫秒
 | 
				
			||||||
 | 
					            // 查询资源信息
 | 
				
			||||||
 | 
					            RmResourceRegistrationRemote queryParam = new RmResourceRegistrationRemote();
 | 
				
			||||||
 | 
					            queryParam.setHardwareSn(message.getClientId());
 | 
				
			||||||
 | 
					            R<RmResourceRegistrationRemote> resourceMsg = remoteRevenueConfigService.getListByHardwareSn(queryParam, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					            RmResourceRegistrationRemote resourceMsgData = resourceMsg.getData();
 | 
				
			||||||
 | 
					            if(rsp.getResCode() == 1){
 | 
				
			||||||
 | 
					                if(rsp.getResult() != null){
 | 
				
			||||||
 | 
					                    // 构建脚本执行结果实体类
 | 
				
			||||||
 | 
					                    RmResourceRemote insertData = new RmResourceRemote();
 | 
				
			||||||
 | 
					                    insertData.setHardwareSn(message.getClientId());
 | 
				
			||||||
 | 
					                    insertData.setResourceName(resourceMsgData.getResourceName());
 | 
				
			||||||
 | 
					                    insertData.setExternalIp(resourceMsgData.getIpAddress());
 | 
				
			||||||
 | 
					                    insertData.setManagementPort(22);
 | 
				
			||||||
 | 
					                    insertData.setConnectionMethod("1");
 | 
				
			||||||
 | 
					                    insertData.setResourceType(resourceMsgData.getResourceType());
 | 
				
			||||||
 | 
					                    insertData.setDescription(rsp.getResult());
 | 
				
			||||||
 | 
					                    insertData.setCreateTime(createTime);
 | 
				
			||||||
 | 
					                    // 执行插入sql
 | 
				
			||||||
 | 
					                    rmResourceRemoteService.insertRmResourceRemote(insertData);
 | 
				
			||||||
 | 
					                    log.info("脚本执行结果入库成功:{}",rsp);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }else{
 | 
				
			||||||
 | 
					                log.error("脚本执行失败:{}", rsp);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -1,8 +1,9 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.mapper;
 | 
					package com.ruoyi.rocketmq.mapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import com.ruoyi.rocketmq.domain.RmMonitorPolicy;
 | 
					import com.ruoyi.rocketmq.domain.RmMonitorPolicy;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 资源监控策略Mapper接口
 | 
					 * 资源监控策略Mapper接口
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
@@ -58,4 +59,11 @@ public interface RmMonitorPolicyMapper
 | 
				
			|||||||
     * @return 结果
 | 
					     * @return 结果
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public int deleteRmMonitorPolicyByIds(Long[] ids);
 | 
					    public int deleteRmMonitorPolicyByIds(Long[] ids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询符合条件的策略
 | 
				
			||||||
 | 
					     * @param queryParam
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    RmMonitorPolicy selectRmMonitorPolicyByClientId(RmMonitorPolicy queryParam);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,9 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.mapper;
 | 
					package com.ruoyi.rocketmq.mapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import com.ruoyi.rocketmq.domain.RmNetworkInterface;
 | 
					import com.ruoyi.rocketmq.domain.RmNetworkInterface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 客户端网络接口信息Mapper接口
 | 
					 * 客户端网络接口信息Mapper接口
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
@@ -58,4 +59,6 @@ public interface RmNetworkInterfaceMapper
 | 
				
			|||||||
     * @return 结果
 | 
					     * @return 结果
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public int deleteRmNetworkInterfaceByIds(Long[] ids);
 | 
					    public int deleteRmNetworkInterfaceByIds(Long[] ids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    int updateRmNetworkInterfaceByMac(RmNetworkInterface rmNetworkInterface);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.service;
 | 
					package com.ruoyi.rocketmq.service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.ruoyi.rocketmq.domain.RmMonitorPolicy;
 | 
					import com.ruoyi.rocketmq.domain.RmMonitorPolicy;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.vo.CollectVo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
@@ -83,4 +84,11 @@ public interface IRmMonitorPolicyService
 | 
				
			|||||||
     * @return
 | 
					     * @return
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    int updatePolicyMsgInner(RmMonitorPolicy rmMonitorPolicy);
 | 
					    int updatePolicyMsgInner(RmMonitorPolicy rmMonitorPolicy);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param clientId
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public List<CollectVo> getPolicyMsgByClientId(String clientId);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,8 +1,9 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.service;
 | 
					package com.ruoyi.rocketmq.service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import com.ruoyi.rocketmq.domain.RmNetworkInterface;
 | 
					import com.ruoyi.rocketmq.domain.RmNetworkInterface;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 客户端网络接口信息Service接口
 | 
					 * 客户端网络接口信息Service接口
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
@@ -42,6 +43,13 @@ public interface IRmNetworkInterfaceService
 | 
				
			|||||||
     * @return 结果
 | 
					     * @return 结果
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public int updateRmNetworkInterface(RmNetworkInterface rmNetworkInterface);
 | 
					    public int updateRmNetworkInterface(RmNetworkInterface rmNetworkInterface);
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 修改客户端网络接口信息
 | 
				
			||||||
 | 
					     *
 | 
				
			||||||
 | 
					     * @param rmNetworkInterface 客户端网络接口信息
 | 
				
			||||||
 | 
					     * @return 结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public int updateRmNetworkInterfaceByMac(RmNetworkInterface rmNetworkInterface);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 批量删除客户端网络接口信息
 | 
					     * 批量删除客户端网络接口信息
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -499,7 +499,37 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
            return 0;
 | 
					            return 0;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 根据clientId得到监控策略信息
 | 
				
			||||||
 | 
					     * @param clientId
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<CollectVo> getPolicyMsgByClientId(String clientId) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            // 根据clientId查询未下发的策略信息
 | 
				
			||||||
 | 
					            RmMonitorPolicy queryParam = new RmMonitorPolicy();
 | 
				
			||||||
 | 
					            queryParam.setDeployDevice(clientId);
 | 
				
			||||||
 | 
					            queryParam.setPriority("1");
 | 
				
			||||||
 | 
					            queryParam.setStatus("0");
 | 
				
			||||||
 | 
					            queryParam.setResourceType("linux");
 | 
				
			||||||
 | 
					            RmMonitorPolicy policy = rmMonitorPolicyMapper.selectRmMonitorPolicyByClientId(queryParam);
 | 
				
			||||||
 | 
					            if (policy == null) {
 | 
				
			||||||
 | 
					                log.error("无待下发策略,clientId: {}", clientId);
 | 
				
			||||||
 | 
					                return null;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 构建并发送采集配置
 | 
				
			||||||
 | 
					            Map<String, Object> policyDetails = getRmMonitorPolicyMsgById(policy.getId());
 | 
				
			||||||
 | 
					            List<CollectVo> collectVos = buildCollectConfigurations(policyDetails);
 | 
				
			||||||
 | 
					            // 去重
 | 
				
			||||||
 | 
					            List<CollectVo> uniqueList = collectVos.stream().distinct().collect(Collectors.toList());
 | 
				
			||||||
 | 
					            return collectVos;
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            log.error("下发策略失败,clientId: {}", clientId, e);
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    private SwitchOidVo buildOids(Map<String, Object> policyDetails) {
 | 
					    private SwitchOidVo buildOids(Map<String, Object> policyDetails) {
 | 
				
			||||||
        // 处理Switch配置
 | 
					        // 处理Switch配置
 | 
				
			||||||
        Map<String, List<RmTemplateSwitch>> switchConfigs = (Map<String, List<RmTemplateSwitch>>) policyDetails.get("switch");
 | 
					        Map<String, List<RmTemplateSwitch>> switchConfigs = (Map<String, List<RmTemplateSwitch>>) policyDetails.get("switch");
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,12 +1,13 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.service.impl;
 | 
					package com.ruoyi.rocketmq.service.impl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					 | 
				
			||||||
import com.ruoyi.common.core.utils.DateUtils;
 | 
					import com.ruoyi.common.core.utils.DateUtils;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.RmNetworkInterface;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.mapper.RmNetworkInterfaceMapper;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.service.IRmNetworkInterfaceService;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.stereotype.Service;
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
import com.ruoyi.rocketmq.mapper.RmNetworkInterfaceMapper;
 | 
					
 | 
				
			||||||
import com.ruoyi.rocketmq.domain.RmNetworkInterface;
 | 
					import java.util.List;
 | 
				
			||||||
import com.ruoyi.rocketmq.service.IRmNetworkInterfaceService;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 客户端网络接口信息Service业务层处理
 | 
					 * 客户端网络接口信息Service业务层处理
 | 
				
			||||||
@@ -70,6 +71,12 @@ public class RmNetworkInterfaceServiceImpl implements IRmNetworkInterfaceService
 | 
				
			|||||||
        return rmNetworkInterfaceMapper.updateRmNetworkInterface(rmNetworkInterface);
 | 
					        return rmNetworkInterfaceMapper.updateRmNetworkInterface(rmNetworkInterface);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int updateRmNetworkInterfaceByMac(RmNetworkInterface rmNetworkInterface) {
 | 
				
			||||||
 | 
					        rmNetworkInterface.setUpdateTime(DateUtils.getNowDate());
 | 
				
			||||||
 | 
					        return rmNetworkInterfaceMapper.updateRmNetworkInterfaceByMac(rmNetworkInterface);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 批量删除客户端网络接口信息
 | 
					     * 批量删除客户端网络接口信息
 | 
				
			||||||
     * 
 | 
					     * 
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -31,7 +31,6 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        <where>
 | 
					        <where>
 | 
				
			||||||
            <if test="templateId != null "> and template_id = #{templateId}</if>
 | 
					            <if test="templateId != null "> and template_id = #{templateId}</if>
 | 
				
			||||||
            <if test="resourceType != null "> and resource_type = #{resourceType}</if>
 | 
					            <if test="resourceType != null "> and resource_type = #{resourceType}</if>
 | 
				
			||||||
            <if test="resourceType != null "> and resource_type = #{resourceType}</if>
 | 
					 | 
				
			||||||
            <if test="resourceGroupId != null "> and resource_group_id = #{resourceGroupId}</if>
 | 
					            <if test="resourceGroupId != null "> and resource_group_id = #{resourceGroupId}</if>
 | 
				
			||||||
            <if test="policyName != null  and policyName != ''"> and policy_name like concat('%', #{policyName}, '%')</if>
 | 
					            <if test="policyName != null  and policyName != ''"> and policy_name like concat('%', #{policyName}, '%')</if>
 | 
				
			||||||
            <if test="description != null  and description != ''"> and description = #{description}</if>
 | 
					            <if test="description != null  and description != ''"> and description = #{description}</if>
 | 
				
			||||||
@@ -119,4 +118,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            #{id}
 | 
					            #{id}
 | 
				
			||||||
        </foreach>
 | 
					        </foreach>
 | 
				
			||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					    <select id="selectRmMonitorPolicyByClientId" parameterType="RmMonitorPolicy" resultMap="RmMonitorPolicyResult">
 | 
				
			||||||
 | 
					        <include refid="selectRmMonitorPolicyVo"/>
 | 
				
			||||||
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="resourceType != null "> and resource_type = #{resourceType}</if>
 | 
				
			||||||
 | 
					            <if test="priority != null "> and priority = #{priority}</if>
 | 
				
			||||||
 | 
					            <if test="status != null "> and status = #{status}</if>
 | 
				
			||||||
 | 
					            <if test="deployDevice != null ">
 | 
				
			||||||
 | 
					                FIND_IN_SET(#{deployDevice}, REPLACE(deploy_device, '\n', ',')) > 0
 | 
				
			||||||
 | 
					            </if>
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
 | 
					        limit 1
 | 
				
			||||||
 | 
					    </select>
 | 
				
			||||||
</mapper>
 | 
					</mapper>
 | 
				
			||||||
@@ -108,6 +108,26 @@
 | 
				
			|||||||
        </trim>
 | 
					        </trim>
 | 
				
			||||||
        where id = #{id}
 | 
					        where id = #{id}
 | 
				
			||||||
    </update>
 | 
					    </update>
 | 
				
			||||||
 | 
					    <update id="updateRmNetworkInterfaceByMac" parameterType="RmNetworkInterface">
 | 
				
			||||||
 | 
					        update rm_network_interface
 | 
				
			||||||
 | 
					        <trim prefix="SET" suffixOverrides=",">
 | 
				
			||||||
 | 
					            <if test="isp != null">isp = #{isp},</if>
 | 
				
			||||||
 | 
					            <if test="province != null">province = #{province},</if>
 | 
				
			||||||
 | 
					            <if test="city != null">city = #{city},</if>
 | 
				
			||||||
 | 
					            <if test="publicIp != null">public_ip = #{publicIp},</if>
 | 
				
			||||||
 | 
					            <if test="interfaceName != null and interfaceName != ''">interface_name = #{interfaceName},</if>
 | 
				
			||||||
 | 
					            <if test="macAddress != null">mac_address = #{macAddress},</if>
 | 
				
			||||||
 | 
					            <if test="interfaceType != null">interface_type = #{interfaceType},</if>
 | 
				
			||||||
 | 
					            <if test="ipv4Address != null">ipv4_address = #{ipv4Address},</if>
 | 
				
			||||||
 | 
					            <if test="gateway != null">gateway = #{gateway},</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>
 | 
				
			||||||
 | 
					            <if test="bindIp != null">bind_ip = #{bindIp},</if>
 | 
				
			||||||
 | 
					        </trim>
 | 
				
			||||||
 | 
					        where mac_address = #{macAddress}
 | 
				
			||||||
 | 
					    </update>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <delete id="deleteRmNetworkInterfaceById" parameterType="Long">
 | 
					    <delete id="deleteRmNetworkInterfaceById" parameterType="Long">
 | 
				
			||||||
        delete from rm_network_interface where id = #{id}
 | 
					        delete from rm_network_interface where id = #{id}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user