服务器注册接口、snmp采集工具优化、其他bug修复
This commit is contained in:
		@@ -89,4 +89,13 @@ public interface RemoteRevenueConfigService
 | 
				
			|||||||
    @PostMapping("/registration/getListByHardwareSn")
 | 
					    @PostMapping("/registration/getListByHardwareSn")
 | 
				
			||||||
    public R<RmResourceRegistrationRemote> getListByHardwareSn(@RequestBody RmResourceRegistrationRemote rmResourceRegistrationRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 | 
					    public R<RmResourceRegistrationRemote> getListByHardwareSn(@RequestBody RmResourceRegistrationRemote rmResourceRegistrationRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 根据clientId获取交换机名称信息
 | 
				
			||||||
 | 
					     * @param rmSwitchManagementRemote
 | 
				
			||||||
 | 
					     * @param source
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @PostMapping("/switchManagement/getSwitchNameByClientId")
 | 
				
			||||||
 | 
					    public R<List<RmSwitchManagementRemote>> getSwitchNameByClientId(@RequestBody RmSwitchManagementRemote rmSwitchManagementRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,74 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.system.api.domain;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.annotation.Excel;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
 | 
					public class RmSwitchManagementRemote {
 | 
				
			||||||
 | 
					    /** 主键ID */
 | 
				
			||||||
 | 
					    private Long id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 交换机名称 */
 | 
				
			||||||
 | 
					    @Excel(name = "交换机名称")
 | 
				
			||||||
 | 
					    private String switchName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 硬件SN序列号 */
 | 
				
			||||||
 | 
					    @Excel(name = "硬件SN序列号")
 | 
				
			||||||
 | 
					    private String hardwareSn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** SNMP采集地址 */
 | 
				
			||||||
 | 
					    @Excel(name = "SNMP采集地址")
 | 
				
			||||||
 | 
					    private String snmpAddress;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** SNMP采集端口 */
 | 
				
			||||||
 | 
					    @Excel(name = "SNMP采集端口")
 | 
				
			||||||
 | 
					    private Long snmpPort;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 在线状态(0-离线,1-在线) */
 | 
				
			||||||
 | 
					    @Excel(name = "在线状态(0-离线,1-在线)")
 | 
				
			||||||
 | 
					    private String onlineStatus;
 | 
				
			||||||
 | 
					    /** 上机时间 */
 | 
				
			||||||
 | 
					    private Date upTime;
 | 
				
			||||||
 | 
					    /** 心跳监测次数 */
 | 
				
			||||||
 | 
					    @Excel(name = "心跳监测次数")
 | 
				
			||||||
 | 
					    private String heartbeatCount;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 心跳监测周期(秒) */
 | 
				
			||||||
 | 
					    @Excel(name = "心跳监测周期(秒)")
 | 
				
			||||||
 | 
					    private String heartbeatInterval;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 心跳检测OID */
 | 
				
			||||||
 | 
					    @Excel(name = "心跳检测OID")
 | 
				
			||||||
 | 
					    private String heartbeatOid;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** SNMP版本(v1/v2c/v3) */
 | 
				
			||||||
 | 
					    @Excel(name = "SNMP版本(v1/v2c/v3)")
 | 
				
			||||||
 | 
					    private String snmpVersion;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 读写权限 */
 | 
				
			||||||
 | 
					    @Excel(name = "读写权限")
 | 
				
			||||||
 | 
					    private String readWritePermission;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 安全级别 */
 | 
				
			||||||
 | 
					    @Excel(name = "安全级别")
 | 
				
			||||||
 | 
					    private String securityLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 加密方式 */
 | 
				
			||||||
 | 
					    @Excel(name = "加密方式")
 | 
				
			||||||
 | 
					    private String encryptionMethod;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 团体名称 */
 | 
				
			||||||
 | 
					    @Excel(name = "团体名称")
 | 
				
			||||||
 | 
					    private String communityName;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 密码 */
 | 
				
			||||||
 | 
					    @Excel(name = "密码")
 | 
				
			||||||
 | 
					    private String switchPassword;
 | 
				
			||||||
 | 
					    /** 交换机类型 */
 | 
				
			||||||
 | 
					    private String switchType;
 | 
				
			||||||
 | 
					    /** 用户名 */
 | 
				
			||||||
 | 
					    private String switchUser;
 | 
				
			||||||
 | 
					    /** 自动生成客户端id(uuid) */
 | 
				
			||||||
 | 
					    private String clientId;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -66,6 +66,11 @@ public class RemoteRevenueConfigFallbackFactory implements FallbackFactory<Remot
 | 
				
			|||||||
            public R<RmResourceRegistrationRemote> getListByHardwareSn(RmResourceRegistrationRemote rmResourceRegistrationRemote, String source) {
 | 
					            public R<RmResourceRegistrationRemote> getListByHardwareSn(RmResourceRegistrationRemote rmResourceRegistrationRemote, String source) {
 | 
				
			||||||
                return R.fail("根据SN获取资源注册列表信息失败" + throwable.getMessage());
 | 
					                return R.fail("根据SN获取资源注册列表信息失败" + throwable.getMessage());
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            @Override
 | 
				
			||||||
 | 
					            public R<List<RmSwitchManagementRemote>> getSwitchNameByClientId(RmSwitchManagementRemote rmSwitchManagementRemote, String source) {
 | 
				
			||||||
 | 
					                return R.fail("根据clientId获取交换机信息失败" + throwable.getMessage());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        };
 | 
					        };
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -13,6 +13,8 @@ import lombok.NoArgsConstructor;
 | 
				
			|||||||
@NoArgsConstructor
 | 
					@NoArgsConstructor
 | 
				
			||||||
public enum MsgEnum {
 | 
					public enum MsgEnum {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    多公网IP探测("PUBLICIPDETECT"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    注册("REGISTER"),
 | 
					    注册("REGISTER"),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    注册应答("REGISTER_RSP"),
 | 
					    注册应答("REGISTER_RSP"),
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,5 +1,6 @@
 | 
				
			|||||||
package com.ruoyi.system.controller;
 | 
					package com.ruoyi.system.controller;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.domain.R;
 | 
				
			||||||
import com.ruoyi.common.core.utils.poi.ExcelUtil;
 | 
					import com.ruoyi.common.core.utils.poi.ExcelUtil;
 | 
				
			||||||
import com.ruoyi.common.core.web.controller.BaseController;
 | 
					import com.ruoyi.common.core.web.controller.BaseController;
 | 
				
			||||||
import com.ruoyi.common.core.web.domain.AjaxResult;
 | 
					import com.ruoyi.common.core.web.domain.AjaxResult;
 | 
				
			||||||
@@ -7,6 +8,7 @@ import com.ruoyi.common.core.web.page.PageDomain;
 | 
				
			|||||||
import com.ruoyi.common.core.web.page.TableDataInfo;
 | 
					import com.ruoyi.common.core.web.page.TableDataInfo;
 | 
				
			||||||
import com.ruoyi.common.log.annotation.Log;
 | 
					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.RequiresPermissions;
 | 
					import com.ruoyi.common.security.annotation.RequiresPermissions;
 | 
				
			||||||
import com.ruoyi.system.domain.RmSwitchManagement;
 | 
					import com.ruoyi.system.domain.RmSwitchManagement;
 | 
				
			||||||
import com.ruoyi.system.service.IRmSwitchManagementService;
 | 
					import com.ruoyi.system.service.IRmSwitchManagementService;
 | 
				
			||||||
@@ -110,4 +112,14 @@ public class RmSwitchManagementController extends BaseController
 | 
				
			|||||||
        List<RmSwitchManagement> list = rmSwitchManagementService.selectRmSwitchManagementList(rmSwitchManagement);
 | 
					        List<RmSwitchManagement> list = rmSwitchManagementService.selectRmSwitchManagementList(rmSwitchManagement);
 | 
				
			||||||
        return success(list);
 | 
					        return success(list);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 查询交换机管理列表
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @InnerAuth
 | 
				
			||||||
 | 
					    @PostMapping("/getSwitchNameByClientId")
 | 
				
			||||||
 | 
					    public R<List<RmSwitchManagement>> getSwitchNameByClientId(@RequestBody RmSwitchManagement rmSwitchManagement)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        List<RmSwitchManagement> list = rmSwitchManagementService.selectRmSwitchManagementList(rmSwitchManagement);
 | 
				
			||||||
 | 
					        return R.ok(list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -33,4 +33,6 @@ public class RmSwitchInterfaceInfo extends BaseEntity
 | 
				
			|||||||
    /** 接口备注 */
 | 
					    /** 接口备注 */
 | 
				
			||||||
    @Excel(name = "接口备注")
 | 
					    @Excel(name = "接口备注")
 | 
				
			||||||
    private String interfaceRemark;
 | 
					    private String interfaceRemark;
 | 
				
			||||||
 | 
					    /** 客户端id */
 | 
				
			||||||
 | 
					    private String clientId;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,5 +83,7 @@ public class RmSwitchManagement extends BaseEntity
 | 
				
			|||||||
    private String switchUser;
 | 
					    private String switchUser;
 | 
				
			||||||
    /** 端口备注列表 */
 | 
					    /** 端口备注列表 */
 | 
				
			||||||
    private List<RmSwitchInterfaceInfo> switchInterfaceInfoList;
 | 
					    private List<RmSwitchInterfaceInfo> switchInterfaceInfoList;
 | 
				
			||||||
 | 
					    /** 自动生成客户端id(uuid) */
 | 
				
			||||||
 | 
					    private String clientId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,7 @@
 | 
				
			|||||||
package com.ruoyi.system.service.impl;
 | 
					package com.ruoyi.system.service.impl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import com.ruoyi.common.core.utils.DateUtils;
 | 
					import com.ruoyi.common.core.utils.DateUtils;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.utils.uuid.IdUtils;
 | 
				
			||||||
import com.ruoyi.system.domain.RmSwitchInterfaceInfo;
 | 
					import com.ruoyi.system.domain.RmSwitchInterfaceInfo;
 | 
				
			||||||
import com.ruoyi.system.domain.RmSwitchManagement;
 | 
					import com.ruoyi.system.domain.RmSwitchManagement;
 | 
				
			||||||
import com.ruoyi.system.mapper.RmSwitchInterfaceInfoMapper;
 | 
					import com.ruoyi.system.mapper.RmSwitchInterfaceInfoMapper;
 | 
				
			||||||
@@ -35,11 +36,13 @@ public class RmSwitchManagementServiceImpl implements IRmSwitchManagementService
 | 
				
			|||||||
    public RmSwitchManagement selectRmSwitchManagementById(Long id)
 | 
					    public RmSwitchManagement selectRmSwitchManagementById(Long id)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        RmSwitchManagement rmSwitchManagement = rmSwitchManagementMapper.selectRmSwitchManagementById(id);
 | 
					        RmSwitchManagement rmSwitchManagement = rmSwitchManagementMapper.selectRmSwitchManagementById(id);
 | 
				
			||||||
 | 
					        if(rmSwitchManagement != null){
 | 
				
			||||||
            // 查询端口备注信息
 | 
					            // 查询端口备注信息
 | 
				
			||||||
            RmSwitchInterfaceInfo queryParam = new RmSwitchInterfaceInfo();
 | 
					            RmSwitchInterfaceInfo queryParam = new RmSwitchInterfaceInfo();
 | 
				
			||||||
        queryParam.setHardwareSn(rmSwitchManagement.getHardwareSn());
 | 
					            queryParam.setClientId(rmSwitchManagement.getClientId());
 | 
				
			||||||
            List<RmSwitchInterfaceInfo> interfaceInfos = rmSwitchInterfaceInfoMapper.selectRmSwitchInterfaceInfoList(queryParam);
 | 
					            List<RmSwitchInterfaceInfo> interfaceInfos = rmSwitchInterfaceInfoMapper.selectRmSwitchInterfaceInfoList(queryParam);
 | 
				
			||||||
            rmSwitchManagement.setSwitchInterfaceInfoList(interfaceInfos);
 | 
					            rmSwitchManagement.setSwitchInterfaceInfoList(interfaceInfos);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        return rmSwitchManagement;
 | 
					        return rmSwitchManagement;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -65,6 +68,7 @@ public class RmSwitchManagementServiceImpl implements IRmSwitchManagementService
 | 
				
			|||||||
    public int insertRmSwitchManagement(RmSwitchManagement rmSwitchManagement)
 | 
					    public int insertRmSwitchManagement(RmSwitchManagement rmSwitchManagement)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        rmSwitchManagement.setCreateTime(DateUtils.getNowDate());
 | 
					        rmSwitchManagement.setCreateTime(DateUtils.getNowDate());
 | 
				
			||||||
 | 
					        rmSwitchManagement.setClientId(IdUtils.simpleUUID());
 | 
				
			||||||
        return rmSwitchManagementMapper.insertRmSwitchManagement(rmSwitchManagement);
 | 
					        return rmSwitchManagementMapper.insertRmSwitchManagement(rmSwitchManagement);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -60,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        <trim prefix="SET" suffixOverrides=",">
 | 
					        <trim prefix="SET" suffixOverrides=",">
 | 
				
			||||||
            <if test="scriptName != null">script_name = #{scriptName},</if>
 | 
					            <if test="scriptName != null">script_name = #{scriptName},</if>
 | 
				
			||||||
            <if test="scriptPath != null">script_path = #{scriptPath},</if>
 | 
					            <if test="scriptPath != null">script_path = #{scriptPath},</if>
 | 
				
			||||||
            <if test="defaultParams != null">default_params = #{defaultParams},</if>
 | 
					            default_params = #{defaultParams},
 | 
				
			||||||
            <if test="createTime != null">create_time = #{createTime},</if>
 | 
					            <if test="createTime != null">create_time = #{createTime},</if>
 | 
				
			||||||
            <if test="updateTime != null">update_time = #{updateTime},</if>
 | 
					            <if test="updateTime != null">update_time = #{updateTime},</if>
 | 
				
			||||||
            <if test="createBy != null">create_by = #{createBy},</if>
 | 
					            <if test="createBy != null">create_by = #{createBy},</if>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -14,10 +14,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        <result property="updateTime"    column="update_time"    />
 | 
					        <result property="updateTime"    column="update_time"    />
 | 
				
			||||||
        <result property="createBy"    column="create_by"    />
 | 
					        <result property="createBy"    column="create_by"    />
 | 
				
			||||||
        <result property="updateBy"    column="update_by"    />
 | 
					        <result property="updateBy"    column="update_by"    />
 | 
				
			||||||
 | 
					        <result property="clientId"    column="client_id"    />
 | 
				
			||||||
    </resultMap>
 | 
					    </resultMap>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <sql id="selectRmSwitchInterfaceInfoVo">
 | 
					    <sql id="selectRmSwitchInterfaceInfoVo">
 | 
				
			||||||
        select id, hardware_sn, switch_name, interface_name, interface_remark, create_time, update_time, create_by, update_by from rm_switch_interface_info
 | 
					        select id, hardware_sn, switch_name, interface_name, interface_remark, create_time, update_time, create_by, update_by, client_id from rm_switch_interface_info
 | 
				
			||||||
    </sql>
 | 
					    </sql>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <select id="selectRmSwitchInterfaceInfoList" parameterType="RmSwitchInterfaceInfo" resultMap="RmSwitchInterfaceInfoResult">
 | 
					    <select id="selectRmSwitchInterfaceInfoList" parameterType="RmSwitchInterfaceInfo" resultMap="RmSwitchInterfaceInfoResult">
 | 
				
			||||||
@@ -27,6 +28,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            <if test="switchName != null  and switchName != ''"> and switch_name like concat('%', #{switchName}, '%')</if>
 | 
					            <if test="switchName != null  and switchName != ''"> and switch_name like concat('%', #{switchName}, '%')</if>
 | 
				
			||||||
            <if test="interfaceName != null  and interfaceName != ''"> and interface_name like concat('%', #{interfaceName}, '%')</if>
 | 
					            <if test="interfaceName != null  and interfaceName != ''"> and interface_name like concat('%', #{interfaceName}, '%')</if>
 | 
				
			||||||
            <if test="interfaceRemark != null  and interfaceRemark != ''"> and interface_remark = #{interfaceRemark}</if>
 | 
					            <if test="interfaceRemark != null  and interfaceRemark != ''"> and interface_remark = #{interfaceRemark}</if>
 | 
				
			||||||
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
@@ -46,6 +48,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            <if test="updateTime != null">update_time,</if>
 | 
					            <if test="updateTime != null">update_time,</if>
 | 
				
			||||||
            <if test="createBy != null">create_by,</if>
 | 
					            <if test="createBy != null">create_by,</if>
 | 
				
			||||||
            <if test="updateBy != null">update_by,</if>
 | 
					            <if test="updateBy != null">update_by,</if>
 | 
				
			||||||
 | 
					            <if test="clientId != null">client_id,</if>
 | 
				
			||||||
         </trim>
 | 
					         </trim>
 | 
				
			||||||
        <trim prefix="values (" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="values (" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="hardwareSn != null and hardwareSn != ''">#{hardwareSn},</if>
 | 
					            <if test="hardwareSn != null and hardwareSn != ''">#{hardwareSn},</if>
 | 
				
			||||||
@@ -56,6 +59,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
            <if test="updateTime != null">#{updateTime},</if>
 | 
					            <if test="updateTime != null">#{updateTime},</if>
 | 
				
			||||||
            <if test="createBy != null">#{createBy},</if>
 | 
					            <if test="createBy != null">#{createBy},</if>
 | 
				
			||||||
            <if test="updateBy != null">#{updateBy},</if>
 | 
					            <if test="updateBy != null">#{updateBy},</if>
 | 
				
			||||||
 | 
					            <if test="clientId != null">#{clientId},</if>
 | 
				
			||||||
         </trim>
 | 
					         </trim>
 | 
				
			||||||
    </insert>
 | 
					    </insert>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -27,10 +27,11 @@
 | 
				
			|||||||
        <result property="updateTime"    column="update_time"    />
 | 
					        <result property="updateTime"    column="update_time"    />
 | 
				
			||||||
        <result property="createBy"    column="create_by"    />
 | 
					        <result property="createBy"    column="create_by"    />
 | 
				
			||||||
        <result property="updateBy"    column="update_by"    />
 | 
					        <result property="updateBy"    column="update_by"    />
 | 
				
			||||||
 | 
					        <result property="clientId"    column="client_id"    />
 | 
				
			||||||
    </resultMap>
 | 
					    </resultMap>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <sql id="selectRmSwitchManagementVo">
 | 
					    <sql id="selectRmSwitchManagementVo">
 | 
				
			||||||
        select id, switch_type, switch_name, hardware_sn, snmp_address, snmp_port, online_status, heartbeat_count, heartbeat_interval, heartbeat_oid, snmp_version, up_time, read_write_permission, security_level, encryption_method, community_name, switch_user, switch_password, create_time, update_time, create_by, update_by from rm_switch_management
 | 
					        select id, switch_type, switch_name, hardware_sn, snmp_address, snmp_port, online_status, heartbeat_count, heartbeat_interval, heartbeat_oid, snmp_version, up_time, read_write_permission, security_level, encryption_method, community_name, switch_user, switch_password, create_time, update_time, create_by, update_by, client_id from rm_switch_management
 | 
				
			||||||
    </sql>
 | 
					    </sql>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <select id="selectRmSwitchManagementList" parameterType="RmSwitchManagement" resultMap="RmSwitchManagementResult">
 | 
					    <select id="selectRmSwitchManagementList" parameterType="RmSwitchManagement" resultMap="RmSwitchManagementResult">
 | 
				
			||||||
@@ -53,6 +54,7 @@
 | 
				
			|||||||
            <if test="communityName != null  and communityName != ''"> and community_name like concat('%', #{communityName}, '%')</if>
 | 
					            <if test="communityName != null  and communityName != ''"> and community_name like concat('%', #{communityName}, '%')</if>
 | 
				
			||||||
            <if test="switchUser != null  and switchUser != ''"> and switch_user = #{switchUser}</if>
 | 
					            <if test="switchUser != null  and switchUser != ''"> and switch_user = #{switchUser}</if>
 | 
				
			||||||
            <if test="switchPassword != null  and switchPassword != ''"> and switch_password = #{switchPassword}</if>
 | 
					            <if test="switchPassword != null  and switchPassword != ''"> and switch_password = #{switchPassword}</if>
 | 
				
			||||||
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -85,6 +87,7 @@
 | 
				
			|||||||
            <if test="updateTime != null">update_time,</if>
 | 
					            <if test="updateTime != null">update_time,</if>
 | 
				
			||||||
            <if test="createBy != null">create_by,</if>
 | 
					            <if test="createBy != null">create_by,</if>
 | 
				
			||||||
            <if test="updateBy != null">update_by,</if>
 | 
					            <if test="updateBy != null">update_by,</if>
 | 
				
			||||||
 | 
					            <if test="clientId != null">client_id,</if>
 | 
				
			||||||
        </trim>
 | 
					        </trim>
 | 
				
			||||||
        <trim prefix="values (" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="values (" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="switchType != null">#{switchType},</if>
 | 
					            <if test="switchType != null">#{switchType},</if>
 | 
				
			||||||
@@ -108,6 +111,7 @@
 | 
				
			|||||||
            <if test="updateTime != null">#{updateTime},</if>
 | 
					            <if test="updateTime != null">#{updateTime},</if>
 | 
				
			||||||
            <if test="createBy != null">#{createBy},</if>
 | 
					            <if test="createBy != null">#{createBy},</if>
 | 
				
			||||||
            <if test="updateBy != null">#{updateBy},</if>
 | 
					            <if test="updateBy != null">#{updateBy},</if>
 | 
				
			||||||
 | 
					            <if test="clientId != null">#{clientId},</if>
 | 
				
			||||||
        </trim>
 | 
					        </trim>
 | 
				
			||||||
    </insert>
 | 
					    </insert>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -87,6 +87,12 @@
 | 
				
			|||||||
            <groupId>org.springframework.boot</groupId>
 | 
					            <groupId>org.springframework.boot</groupId>
 | 
				
			||||||
            <artifactId>spring-boot-starter-web</artifactId>
 | 
					            <artifactId>spring-boot-starter-web</artifactId>
 | 
				
			||||||
        </dependency>
 | 
					        </dependency>
 | 
				
			||||||
 | 
					        <!-- SNMP4J 核心库 -->
 | 
				
			||||||
 | 
					        <dependency>
 | 
				
			||||||
 | 
					            <groupId>org.snmp4j</groupId>
 | 
				
			||||||
 | 
					            <artifactId>snmp4j</artifactId>
 | 
				
			||||||
 | 
					            <version>2.8.9</version>
 | 
				
			||||||
 | 
					        </dependency>
 | 
				
			||||||
    </dependencies>
 | 
					    </dependencies>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <build>
 | 
					    <build>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -147,4 +147,15 @@ public class InitialDiskInfoController extends BaseController
 | 
				
			|||||||
        Map<String, Object> echartsData = initialDiskInfoService.rwBytesEcharts(initialDiskInfo);
 | 
					        Map<String, Object> echartsData = initialDiskInfoService.rwBytesEcharts(initialDiskInfo);
 | 
				
			||||||
        return success(echartsData);
 | 
					        return success(echartsData);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的磁盘名称
 | 
				
			||||||
 | 
					     * @param initialDiskInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:mountPointInfo:list")
 | 
				
			||||||
 | 
					    @PostMapping("/getAllDistName")
 | 
				
			||||||
 | 
					    public AjaxResult getAllDistName(@RequestBody InitialDiskInfo initialDiskInfo){
 | 
				
			||||||
 | 
					        List<Map> list = initialDiskInfoService.getAllDistName(initialDiskInfo);
 | 
				
			||||||
 | 
					        return success(list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -146,4 +146,15 @@ public class InitialDockerInfoController extends BaseController
 | 
				
			|||||||
        Map<String, Object> echartsData = initialDockerInfoService.netSpeedEcharts(initialDockerInfo);
 | 
					        Map<String, Object> echartsData = initialDockerInfoService.netSpeedEcharts(initialDockerInfo);
 | 
				
			||||||
        return success(echartsData);
 | 
					        return success(echartsData);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的容器id
 | 
				
			||||||
 | 
					     * @param initialDockerInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:mountPointInfo:list")
 | 
				
			||||||
 | 
					    @PostMapping("/getAllDockerId")
 | 
				
			||||||
 | 
					    public AjaxResult getAllDockerId(@RequestBody InitialDockerInfo initialDockerInfo){
 | 
				
			||||||
 | 
					        List<Map> list = initialDockerInfoService.getAllDockerId(initialDockerInfo);
 | 
				
			||||||
 | 
					        return success(list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -130,5 +130,16 @@ public class InitialMountPointInfoController extends BaseController
 | 
				
			|||||||
        Map<String, Object> echartsData = initialMountPointInfoService.spaceRateEcharts(initialMountPointInfo);
 | 
					        Map<String, Object> echartsData = initialMountPointInfoService.spaceRateEcharts(initialMountPointInfo);
 | 
				
			||||||
        return success(echartsData);
 | 
					        return success(echartsData);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的挂载文件系统名
 | 
				
			||||||
 | 
					     * @param initialMountPointInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @RequiresPermissions("rocketmq:mountPointInfo:list")
 | 
				
			||||||
 | 
					    @PostMapping("/getAllMountName")
 | 
				
			||||||
 | 
					    public AjaxResult getAllMountName(@RequestBody InitialMountPointInfo initialMountPointInfo){
 | 
				
			||||||
 | 
					        List<Map> list = initialMountPointInfoService.getAllMountName(initialMountPointInfo);
 | 
				
			||||||
 | 
					        return success(list);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -107,6 +107,17 @@ public class RmMonitorPolicyController extends BaseController
 | 
				
			|||||||
    {
 | 
					    {
 | 
				
			||||||
        return toAjax(rmMonitorPolicyService.issuePolicy(id));
 | 
					        return toAjax(rmMonitorPolicyService.issuePolicy(id));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 资源监控策略下发
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					//    @RequiresPermissions("rocketmq:policy:edit")
 | 
				
			||||||
 | 
					    @Log(title = "issueSwitchPolicy", businessType = BusinessType.UPDATE)
 | 
				
			||||||
 | 
					    @GetMapping("/issueSwitchPolicy")
 | 
				
			||||||
 | 
					    public AjaxResult issueSwitchPolicy(Long id)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return toAjax(rmMonitorPolicyService.issueSwitchPolicy(id));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 删除监控模板
 | 
					     * 删除监控模板
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,5 +57,9 @@ public class InitialDiskInfo extends BaseEntity
 | 
				
			|||||||
    /** 磁盘读取总字节数 */
 | 
					    /** 磁盘读取总字节数 */
 | 
				
			||||||
    @Excel(name = "磁盘读取总字节数")
 | 
					    @Excel(name = "磁盘读取总字节数")
 | 
				
			||||||
    private Long readBytes;
 | 
					    private Long readBytes;
 | 
				
			||||||
 | 
					    /** 开始时间 */
 | 
				
			||||||
 | 
					    private String startTime;
 | 
				
			||||||
 | 
					    /** 结束时间 */
 | 
				
			||||||
 | 
					    private String endTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,4 +47,8 @@ public class InitialDockerInfo extends BaseEntity
 | 
				
			|||||||
    @Excel(name = "设备唯一标识")
 | 
					    @Excel(name = "设备唯一标识")
 | 
				
			||||||
    private String clientId;
 | 
					    private String clientId;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** 开始时间 */
 | 
				
			||||||
 | 
					    private String startTime;
 | 
				
			||||||
 | 
					    /** 结束时间 */
 | 
				
			||||||
 | 
					    private String endTime;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -47,5 +47,9 @@ public class InitialMemoryInfo extends BaseEntity
 | 
				
			|||||||
    /** 总内存(字节) */
 | 
					    /** 总内存(字节) */
 | 
				
			||||||
    @Excel(name = "总内存(字节)")
 | 
					    @Excel(name = "总内存(字节)")
 | 
				
			||||||
    private Long total;
 | 
					    private Long total;
 | 
				
			||||||
 | 
					    /** 开始时间 */
 | 
				
			||||||
 | 
					    private String startTime;
 | 
				
			||||||
 | 
					    /** 结束时间 */
 | 
				
			||||||
 | 
					    private String endTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2,8 +2,7 @@ package com.ruoyi.rocketmq.domain;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import com.ruoyi.common.core.annotation.Excel;
 | 
					import com.ruoyi.common.core.annotation.Excel;
 | 
				
			||||||
import com.ruoyi.common.core.web.domain.BaseEntity;
 | 
					import com.ruoyi.common.core.web.domain.BaseEntity;
 | 
				
			||||||
import org.apache.commons.lang3.builder.ToStringBuilder;
 | 
					import lombok.Data;
 | 
				
			||||||
import org.apache.commons.lang3.builder.ToStringStyle;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.math.BigDecimal;
 | 
					import java.math.BigDecimal;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -13,6 +12,7 @@ import java.math.BigDecimal;
 | 
				
			|||||||
 * @author gyt
 | 
					 * @author gyt
 | 
				
			||||||
 * @date 2025-08-25
 | 
					 * @date 2025-08-25
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					@Data
 | 
				
			||||||
public class InitialMountPointInfo extends BaseEntity
 | 
					public class InitialMountPointInfo extends BaseEntity
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    private static final long serialVersionUID = 1L;
 | 
					    private static final long serialVersionUID = 1L;
 | 
				
			||||||
@@ -43,91 +43,8 @@ public class InitialMountPointInfo extends BaseEntity
 | 
				
			|||||||
    /** 空间利用率(%) */
 | 
					    /** 空间利用率(%) */
 | 
				
			||||||
    @Excel(name = "空间利用率")
 | 
					    @Excel(name = "空间利用率")
 | 
				
			||||||
    private BigDecimal vfsUtil;
 | 
					    private BigDecimal vfsUtil;
 | 
				
			||||||
 | 
					    /** 开始时间 */
 | 
				
			||||||
    public void setId(Long id) 
 | 
					    private String startTime;
 | 
				
			||||||
    {
 | 
					    /** 结束时间 */
 | 
				
			||||||
        this.id = id;
 | 
					    private String endTime;
 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public Long getId() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return id;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setClientId(String clientId) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.clientId = clientId;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public String getClientId() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return clientId;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setMount(String mount) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.mount = mount;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public String getMount() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return mount;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setVfsType(String vfsType) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.vfsType = vfsType;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public String getVfsType() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return vfsType;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setVfsFree(Long vfsFree) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.vfsFree = vfsFree;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public Long getVfsFree() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return vfsFree;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setVfsTotal(Long vfsTotal) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.vfsTotal = vfsTotal;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public Long getVfsTotal() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return vfsTotal;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setVfsUtil(BigDecimal vfsUtil) 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        this.vfsUtil = vfsUtil;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public BigDecimal getVfsUtil() 
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return vfsUtil;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    @Override
 | 
					 | 
				
			||||||
    public String toString() {
 | 
					 | 
				
			||||||
        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
 | 
					 | 
				
			||||||
            .append("id", getId())
 | 
					 | 
				
			||||||
            .append("clientId", getClientId())
 | 
					 | 
				
			||||||
            .append("mount", getMount())
 | 
					 | 
				
			||||||
            .append("vfsType", getVfsType())
 | 
					 | 
				
			||||||
            .append("vfsFree", getVfsFree())
 | 
					 | 
				
			||||||
            .append("vfsTotal", getVfsTotal())
 | 
					 | 
				
			||||||
            .append("vfsUtil", getVfsUtil())
 | 
					 | 
				
			||||||
            .append("createBy", getCreateBy())
 | 
					 | 
				
			||||||
            .append("updateBy", getUpdateBy())
 | 
					 | 
				
			||||||
            .append("createTime", getCreateTime())
 | 
					 | 
				
			||||||
            .append("updateTime", getUpdateTime())
 | 
					 | 
				
			||||||
            .toString();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -62,5 +62,9 @@ public class InitialSwitchInfo extends BaseEntity
 | 
				
			|||||||
    /** 端口索引 */
 | 
					    /** 端口索引 */
 | 
				
			||||||
    private String ifIndex;
 | 
					    private String ifIndex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String startTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private String endTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,8 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.domain.vo;
 | 
					package com.ruoyi.rocketmq.domain.vo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					import org.snmp4j.mp.SnmpConstants;
 | 
				
			||||||
 | 
					import org.snmp4j.security.SecurityLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
import java.util.Map;
 | 
					import java.util.Map;
 | 
				
			||||||
@@ -21,4 +23,22 @@ public class SwitchOidVo {
 | 
				
			|||||||
    private Integer port;
 | 
					    private Integer port;
 | 
				
			||||||
    /** 过滤值 */
 | 
					    /** 过滤值 */
 | 
				
			||||||
    private Map<String, List<String>> filters;
 | 
					    private Map<String, List<String>> filters;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private int version = SnmpConstants.version2c; // 默认v2c
 | 
				
			||||||
 | 
					    private int timeout = 5000;
 | 
				
			||||||
 | 
					    private int retries = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // SNMP v3特有参数
 | 
				
			||||||
 | 
					    private String securityName;
 | 
				
			||||||
 | 
					    private String authProtocol;
 | 
				
			||||||
 | 
					    private String authPassword;
 | 
				
			||||||
 | 
					    private String privProtocol;
 | 
				
			||||||
 | 
					    private String privPassword;
 | 
				
			||||||
 | 
					    private int securityLevel = SecurityLevel.AUTH_PRIV;
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 判断是否为SNMP v3
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public boolean isV3() {
 | 
				
			||||||
 | 
					        return version == SnmpConstants.version3;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import com.ruoyi.rocketmq.domain.InitialDiskInfo;
 | 
				
			|||||||
import org.springframework.data.repository.query.Param;
 | 
					import org.springframework.data.repository.query.Param;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 磁盘监控信息Mapper接口
 | 
					 * 磁盘监控信息Mapper接口
 | 
				
			||||||
@@ -75,4 +76,11 @@ public interface InitialDiskInfoMapper
 | 
				
			|||||||
     * @return
 | 
					     * @return
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    InitialDiskInfo getDistDetailsMsgByClientId(InitialDiskInfo initialDiskInfo);
 | 
					    InitialDiskInfo getDistDetailsMsgByClientId(InitialDiskInfo initialDiskInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的磁盘名称
 | 
				
			||||||
 | 
					     * @param initialDiskInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<Map> getAllDistName(InitialDiskInfo initialDiskInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import com.ruoyi.rocketmq.domain.InitialDockerInfo;
 | 
				
			|||||||
import org.springframework.data.repository.query.Param;
 | 
					import org.springframework.data.repository.query.Param;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 容器监控信息Mapper接口
 | 
					 * 容器监控信息Mapper接口
 | 
				
			||||||
@@ -69,4 +70,11 @@ public interface InitialDockerInfoMapper
 | 
				
			|||||||
     * @return
 | 
					     * @return
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    InitialDockerInfo getDockerDetailsMsg(InitialDockerInfo initialDockerInfo);
 | 
					    InitialDockerInfo getDockerDetailsMsg(InitialDockerInfo initialDockerInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的容器id
 | 
				
			||||||
 | 
					     * @param initialDockerInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<Map> getAllDockerId(InitialDockerInfo initialDockerInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4,6 +4,7 @@ import com.ruoyi.rocketmq.domain.InitialMountPointInfo;
 | 
				
			|||||||
import org.springframework.data.repository.query.Param;
 | 
					import org.springframework.data.repository.query.Param;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.List;
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 挂载点监控信息Mapper接口
 | 
					 * 挂载点监控信息Mapper接口
 | 
				
			||||||
@@ -74,4 +75,11 @@ public interface InitialMountPointInfoMapper
 | 
				
			|||||||
     * @return
 | 
					     * @return
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    InitialMountPointInfo pointDetailsMsg(String clientId);
 | 
					    InitialMountPointInfo pointDetailsMsg(String clientId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的挂载文件系统名
 | 
				
			||||||
 | 
					     * @param initialMountPointInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<Map> getAllMountName(InitialMountPointInfo initialMountPointInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,4 +92,11 @@ public interface IInitialDiskInfoService
 | 
				
			|||||||
     * @return
 | 
					     * @return
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    Map<String, Object> rwBytesEcharts(InitialDiskInfo initialDiskInfo);
 | 
					    Map<String, Object> rwBytesEcharts(InitialDiskInfo initialDiskInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的磁盘名称
 | 
				
			||||||
 | 
					     * @param initialDiskInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<Map> getAllDistName(InitialDiskInfo initialDiskInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -94,4 +94,11 @@ public interface IInitialDockerInfoService
 | 
				
			|||||||
     * @return
 | 
					     * @return
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    Map<String, Object> netSpeedEcharts(InitialDockerInfo initialDockerInfo);
 | 
					    Map<String, Object> netSpeedEcharts(InitialDockerInfo initialDockerInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的容器id
 | 
				
			||||||
 | 
					     * @param initialDockerInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<Map> getAllDockerId(InitialDockerInfo initialDockerInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -83,4 +83,11 @@ public interface IInitialMountPointInfoService
 | 
				
			|||||||
     * @return
 | 
					     * @return
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    Map<String, Object> spaceRateEcharts(InitialMountPointInfo initialMountPointInfo);
 | 
					    Map<String, Object> spaceRateEcharts(InitialMountPointInfo initialMountPointInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的挂载文件系统名
 | 
				
			||||||
 | 
					     * @param initialMountPointInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    List<Map> getAllMountName(InitialMountPointInfo initialMountPointInfo);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -73,6 +73,7 @@ public interface IRmMonitorPolicyService
 | 
				
			|||||||
    Map<String, Object> getRmMonitorPolicyMsgById(Long id);
 | 
					    Map<String, Object> getRmMonitorPolicyMsgById(Long id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int issuePolicy(Long id);
 | 
					    int issuePolicy(Long id);
 | 
				
			||||||
 | 
					    int issueSwitchPolicy(Long id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int updateResourcePolicy(RmMonitorPolicy rmMonitorPolicy);
 | 
					    int updateResourcePolicy(RmMonitorPolicy rmMonitorPolicy);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -169,4 +169,14 @@ public class InitialDiskInfoServiceImpl implements IInitialDiskInfoService
 | 
				
			|||||||
        extractors.put("writeBytesData", info -> info.getWriteBytes());
 | 
					        extractors.put("writeBytesData", info -> info.getWriteBytes());
 | 
				
			||||||
        return EchartsDataUtils.buildEchartsData(list, InitialDiskInfo::getCreateTime, extractors);
 | 
					        return EchartsDataUtils.buildEchartsData(list, InitialDiskInfo::getCreateTime, extractors);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的磁盘名称
 | 
				
			||||||
 | 
					     * @param initialDiskInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<Map> getAllDistName(InitialDiskInfo initialDiskInfo) {
 | 
				
			||||||
 | 
					        return initialDiskInfoMapper.getAllDistName(initialDiskInfo);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -167,4 +167,14 @@ public class InitialDockerInfoServiceImpl implements IInitialDockerInfoService
 | 
				
			|||||||
        extractors.put("netOutSpeedData", info -> info.getNetOutSpeed());
 | 
					        extractors.put("netOutSpeedData", info -> info.getNetOutSpeed());
 | 
				
			||||||
        return EchartsDataUtils.buildEchartsData(list, InitialDockerInfo::getCreateTime, extractors);
 | 
					        return EchartsDataUtils.buildEchartsData(list, InitialDockerInfo::getCreateTime, extractors);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的容器id
 | 
				
			||||||
 | 
					     * @param initialDockerInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<Map> getAllDockerId(InitialDockerInfo initialDockerInfo) {
 | 
				
			||||||
 | 
					        return initialDockerInfoMapper.getAllDockerId(initialDockerInfo);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -150,4 +150,14 @@ public class InitialMountPointInfoServiceImpl implements IInitialMountPointInfoS
 | 
				
			|||||||
        extractors.put("vfsUtilData", InitialMountPointInfo::getVfsUtil);
 | 
					        extractors.put("vfsUtilData", InitialMountPointInfo::getVfsUtil);
 | 
				
			||||||
        return EchartsDataUtils.buildEchartsData(list,InitialMountPointInfo::getCreateTime, extractors);
 | 
					        return EchartsDataUtils.buildEchartsData(list,InitialMountPointInfo::getCreateTime, extractors);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取指定服务器的挂载文件系统名
 | 
				
			||||||
 | 
					     * @param initialMountPointInfo
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public List<Map> getAllMountName(InitialMountPointInfo initialMountPointInfo) {
 | 
				
			||||||
 | 
					        return initialMountPointInfoMapper.getAllMountName(initialMountPointInfo);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,6 +3,7 @@ package com.ruoyi.rocketmq.service.impl;
 | 
				
			|||||||
import com.alibaba.fastjson.JSONObject;
 | 
					import com.alibaba.fastjson.JSONObject;
 | 
				
			||||||
import com.ruoyi.common.core.enums.MsgEnum;
 | 
					import com.ruoyi.common.core.enums.MsgEnum;
 | 
				
			||||||
import com.ruoyi.common.core.utils.DateUtils;
 | 
					import com.ruoyi.common.core.utils.DateUtils;
 | 
				
			||||||
 | 
					import com.ruoyi.common.core.utils.StringUtils;
 | 
				
			||||||
import com.ruoyi.common.security.utils.SecurityUtils;
 | 
					import com.ruoyi.common.security.utils.SecurityUtils;
 | 
				
			||||||
import com.ruoyi.rocketmq.domain.*;
 | 
					import com.ruoyi.rocketmq.domain.*;
 | 
				
			||||||
import com.ruoyi.rocketmq.domain.vo.CollectVo;
 | 
					import com.ruoyi.rocketmq.domain.vo.CollectVo;
 | 
				
			||||||
@@ -13,10 +14,14 @@ import com.ruoyi.rocketmq.mapper.*;
 | 
				
			|||||||
import com.ruoyi.rocketmq.model.ProducerMode;
 | 
					import com.ruoyi.rocketmq.model.ProducerMode;
 | 
				
			||||||
import com.ruoyi.rocketmq.producer.MessageProducer;
 | 
					import com.ruoyi.rocketmq.producer.MessageProducer;
 | 
				
			||||||
import com.ruoyi.rocketmq.service.IRmMonitorPolicyService;
 | 
					import com.ruoyi.rocketmq.service.IRmMonitorPolicyService;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.snmp.scheduler.MultiSwitchCollectionScheduler;
 | 
				
			||||||
import com.ruoyi.rocketmq.utils.DataProcessUtil;
 | 
					import com.ruoyi.rocketmq.utils.DataProcessUtil;
 | 
				
			||||||
import com.ruoyi.rocketmq.utils.FieldNameConverterUtil;
 | 
					import com.ruoyi.rocketmq.utils.FieldNameConverterUtil;
 | 
				
			||||||
import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
					import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.RmSwitchManagementRemote;
 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.snmp4j.mp.SnmpConstants;
 | 
				
			||||||
 | 
					import org.snmp4j.security.SecurityLevel;
 | 
				
			||||||
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 org.springframework.util.CollectionUtils;
 | 
					import org.springframework.util.CollectionUtils;
 | 
				
			||||||
@@ -55,6 +60,11 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private DataProcessUtil dataProcessUtil;
 | 
					    private DataProcessUtil dataProcessUtil;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final MultiSwitchCollectionScheduler scheduler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public RmMonitorPolicyServiceImpl(MultiSwitchCollectionScheduler scheduler) {
 | 
				
			||||||
 | 
					        this.scheduler = scheduler;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
@@ -355,6 +365,22 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
        // 1. 获取资源监控策略基础信息
 | 
					        // 1. 获取资源监控策略基础信息
 | 
				
			||||||
        RmMonitorPolicy rmMonitorPolicy = rmMonitorPolicyMapper.selectRmMonitorPolicyById(id);
 | 
					        RmMonitorPolicy rmMonitorPolicy = rmMonitorPolicyMapper.selectRmMonitorPolicyById(id);
 | 
				
			||||||
        if(rmMonitorPolicy != null){
 | 
					        if(rmMonitorPolicy != null){
 | 
				
			||||||
 | 
					            String clientIds = rmMonitorPolicy.getDeployDevice();
 | 
				
			||||||
 | 
					            if(clientIds != null){
 | 
				
			||||||
 | 
					                String[] clientArr = clientIds.split("\n");
 | 
				
			||||||
 | 
					                if(StringUtils.equals("switch",rmMonitorPolicy.getResourceType())){
 | 
				
			||||||
 | 
					                    List<String> names = new ArrayList<>();
 | 
				
			||||||
 | 
					                    for (String clientId : clientArr) {
 | 
				
			||||||
 | 
					                        // 根据clientId查询设备名称
 | 
				
			||||||
 | 
					                        String switchName = dataProcessUtil.getDeviceNameByClientId(clientId);
 | 
				
			||||||
 | 
					                        names.add(switchName);
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    rmMonitorPolicy.setDeployDevice(String.join(",", names));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                if(StringUtils.equals("linux",rmMonitorPolicy.getResourceType())){
 | 
				
			||||||
 | 
					                    rmMonitorPolicy.setDeployDevice(String.join(",", clientArr));
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
            if(rmMonitorPolicy.getResourceGroupId()!=null){
 | 
					            if(rmMonitorPolicy.getResourceGroupId()!=null){
 | 
				
			||||||
                rmMonitorPolicy.setResourceGroupName(dataProcessUtil.getResourceGroupNameById(rmMonitorPolicy.getResourceGroupId()));
 | 
					                rmMonitorPolicy.setResourceGroupName(dataProcessUtil.getResourceGroupNameById(rmMonitorPolicy.getResourceGroupId()));
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
@@ -379,6 +405,47 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        return result;
 | 
					        return result;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 下发策略v1.1
 | 
				
			||||||
 | 
					     * @param id
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Override
 | 
				
			||||||
 | 
					    public int issueSwitchPolicy(Long id) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            // 获取策略详情和资源设备
 | 
				
			||||||
 | 
					            RmMonitorPolicy policy = rmMonitorPolicyMapper.selectRmMonitorPolicyById(id);
 | 
				
			||||||
 | 
					            if (policy == null) {
 | 
				
			||||||
 | 
					                log.error("策略不存在,id: {}", id);
 | 
				
			||||||
 | 
					                return 0;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 构建并发送采集配置
 | 
				
			||||||
 | 
					            Map<String, Object> policyDetails = getRmMonitorPolicyMsgById(id);
 | 
				
			||||||
 | 
					            boolean isSwitch = false;
 | 
				
			||||||
 | 
					            if(policyDetails.get("switch") != null){
 | 
				
			||||||
 | 
					                isSwitch = true;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            List<CollectVo> collectVos = buildCollectConfigurations(policyDetails);
 | 
				
			||||||
 | 
					            // 去重
 | 
				
			||||||
 | 
					            List<CollectVo> uniqueList = collectVos.stream().distinct().collect(Collectors.toList());
 | 
				
			||||||
 | 
					            if(isSwitch){
 | 
				
			||||||
 | 
					                SwitchOidVo switchOidVo = buildOids(policyDetails);
 | 
				
			||||||
 | 
					                startCollectSwitchMsgToDevices(policy.getDeployDevice(), uniqueList, switchOidVo);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            // 更新策略状态为已下发
 | 
				
			||||||
 | 
					//            RmMonitorPolicy policyUpdate = new RmMonitorPolicy();
 | 
				
			||||||
 | 
					//            policyUpdate.setId(id);
 | 
				
			||||||
 | 
					//            policyUpdate.setStatus("1");
 | 
				
			||||||
 | 
					//            rmMonitorPolicyMapper.updateRmMonitorPolicy(policyUpdate);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return 1;
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            log.error("下发策略失败,id: {}", id, e);
 | 
				
			||||||
 | 
					            return 0;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 下发策略
 | 
					     * 下发策略
 | 
				
			||||||
@@ -691,4 +758,137 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 开始采集交换机信息 (支持SNMP v1/v2c/v3)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void startCollectSwitchMsgToDevices(String clientIds, List<CollectVo> collectVos, SwitchOidVo switchOidVo) {
 | 
				
			||||||
 | 
					        String[] clientIdArray = clientIds.split("\n");
 | 
				
			||||||
 | 
					        List<MultiSwitchCollectionScheduler.DeviceConfig> deviceConfigs = new ArrayList<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (String clientId : clientIdArray) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                // 根据clientId 查询 交换机信息
 | 
				
			||||||
 | 
					                RmSwitchManagementRemote switchMsg = dataProcessUtil.getSwitchMsg(clientId);
 | 
				
			||||||
 | 
					                String switchIp = switchMsg.getSnmpAddress();
 | 
				
			||||||
 | 
					                String community = switchMsg.getCommunityName();
 | 
				
			||||||
 | 
					                int port = Math.toIntExact(switchMsg.getSnmpPort());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 获取SNMP版本
 | 
				
			||||||
 | 
					                String snmpVersion = switchMsg.getSnmpVersion();
 | 
				
			||||||
 | 
					                int version = parseSnmpVersion(snmpVersion);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 创建设备配置
 | 
				
			||||||
 | 
					                MultiSwitchCollectionScheduler.DeviceConfig deviceConfig =
 | 
				
			||||||
 | 
					                        new MultiSwitchCollectionScheduler.DeviceConfig();
 | 
				
			||||||
 | 
					                deviceConfig.setSwitchIp(switchIp);
 | 
				
			||||||
 | 
					                deviceConfig.setPort(port);
 | 
				
			||||||
 | 
					                deviceConfig.setClientId(clientId);
 | 
				
			||||||
 | 
					                deviceConfig.setCollectVos(new ArrayList<>(collectVos));
 | 
				
			||||||
 | 
					                deviceConfig.setSwitchOidVo(switchOidVo);
 | 
				
			||||||
 | 
					                deviceConfig.setVersion(version);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 根据SNMP版本设置不同的参数
 | 
				
			||||||
 | 
					                if (version == SnmpConstants.version3) {
 | 
				
			||||||
 | 
					                    // SNMP v3配置
 | 
				
			||||||
 | 
					                    setupV3DeviceConfig(deviceConfig, switchMsg);
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // SNMP v1/v2c配置
 | 
				
			||||||
 | 
					                    deviceConfig.setCommunity(community != null ? community : "public");
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                deviceConfigs.add(deviceConfig);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("处理设备配置失败,deviceId: {}", clientId, e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 批量启动交换机采集任务
 | 
				
			||||||
 | 
					        scheduler.batchProcessSwitchConfigurations(deviceConfigs);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 解析SNMP版本字符串为对应的常量
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private int parseSnmpVersion(String snmpVersion) {
 | 
				
			||||||
 | 
					        if (snmpVersion == null) {
 | 
				
			||||||
 | 
					            return SnmpConstants.version2c; // 默认v2c
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (snmpVersion.toLowerCase()) {
 | 
				
			||||||
 | 
					            case "0":
 | 
				
			||||||
 | 
					                return SnmpConstants.version1;
 | 
				
			||||||
 | 
					            case "1":
 | 
				
			||||||
 | 
					                return SnmpConstants.version2c;
 | 
				
			||||||
 | 
					            case "3":
 | 
				
			||||||
 | 
					                return SnmpConstants.version3;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return SnmpConstants.version2c; // 默认v2c
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 设置SNMP v3设备配置
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void setupV3DeviceConfig(MultiSwitchCollectionScheduler.DeviceConfig deviceConfig,
 | 
				
			||||||
 | 
					                                     RmSwitchManagementRemote switchMsg) {
 | 
				
			||||||
 | 
					        // 设置安全名称(用户名)
 | 
				
			||||||
 | 
					        String securityName = switchMsg.getSwitchUser();
 | 
				
			||||||
 | 
					        if (securityName == null || securityName.trim().isEmpty()) {
 | 
				
			||||||
 | 
					            securityName = switchMsg.getCommunityName(); // 如果没有用户名,使用团体名作为fallback
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        deviceConfig.setSecurityName(securityName != null ? securityName : "defaultUser");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置认证协议
 | 
				
			||||||
 | 
					        String authProtocol = parseAuthProtocol(switchMsg.getEncryptionMethod());
 | 
				
			||||||
 | 
					        deviceConfig.setAuthProtocol(authProtocol);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置认证密码
 | 
				
			||||||
 | 
					        String authPassword = switchMsg.getSwitchPassword();
 | 
				
			||||||
 | 
					        deviceConfig.setAuthPassword(authPassword != null ? authPassword : "");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置加密协议(默认使用AES128)
 | 
				
			||||||
 | 
					        deviceConfig.setPrivProtocol("AES128");
 | 
				
			||||||
 | 
					        deviceConfig.setPrivPassword(authPassword != null ? authPassword : ""); // 通常加密密码与认证密码相同
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置安全级别
 | 
				
			||||||
 | 
					        int securityLevel = parseSecurityLevel(switchMsg.getSecurityLevel());
 | 
				
			||||||
 | 
					        deviceConfig.setSecurityLevel(securityLevel);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 解析认证协议
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String parseAuthProtocol(String encryptionMethod) {
 | 
				
			||||||
 | 
					        if (encryptionMethod == null) {
 | 
				
			||||||
 | 
					            return "MD5"; // 默认MD5
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (encryptionMethod.toLowerCase()) {
 | 
				
			||||||
 | 
					            case "md5":
 | 
				
			||||||
 | 
					                return "MD5";
 | 
				
			||||||
 | 
					            case "sha":
 | 
				
			||||||
 | 
					            case "sha1":
 | 
				
			||||||
 | 
					                return "SHA";
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return "MD5"; // 默认MD5
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 解析安全级别
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private int parseSecurityLevel(String securityLevel) {
 | 
				
			||||||
 | 
					        if (securityLevel == null) {
 | 
				
			||||||
 | 
					            return SecurityLevel.AUTH_PRIV; // 默认认证+加密
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (securityLevel.toLowerCase()) {
 | 
				
			||||||
 | 
					            case "1":
 | 
				
			||||||
 | 
					                return SecurityLevel.NOAUTH_NOPRIV;
 | 
				
			||||||
 | 
					            case "2":
 | 
				
			||||||
 | 
					                return SecurityLevel.AUTH_NOPRIV;
 | 
				
			||||||
 | 
					            case "3":
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return SecurityLevel.AUTH_PRIV;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -3,14 +3,15 @@ package com.ruoyi.rocketmq.snmp;
 | 
				
			|||||||
import com.ruoyi.common.core.utils.StringUtils;
 | 
					import com.ruoyi.common.core.utils.StringUtils;
 | 
				
			||||||
import com.ruoyi.rocketmq.snmp.dto.CollectionResult;
 | 
					import com.ruoyi.rocketmq.snmp.dto.CollectionResult;
 | 
				
			||||||
import com.ruoyi.rocketmq.snmp.dto.SwitchOidDto;
 | 
					import com.ruoyi.rocketmq.snmp.dto.SwitchOidDto;
 | 
				
			||||||
import org.snmp4j.CommunityTarget;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
import org.snmp4j.PDU;
 | 
					import org.snmp4j.*;
 | 
				
			||||||
import org.snmp4j.Snmp;
 | 
					 | 
				
			||||||
import org.snmp4j.TransportMapping;
 | 
					 | 
				
			||||||
import org.snmp4j.event.ResponseEvent;
 | 
					import org.snmp4j.event.ResponseEvent;
 | 
				
			||||||
 | 
					import org.snmp4j.mp.MPv3;
 | 
				
			||||||
import org.snmp4j.mp.SnmpConstants;
 | 
					import org.snmp4j.mp.SnmpConstants;
 | 
				
			||||||
 | 
					import org.snmp4j.security.*;
 | 
				
			||||||
import org.snmp4j.smi.*;
 | 
					import org.snmp4j.smi.*;
 | 
				
			||||||
import org.snmp4j.transport.DefaultUdpTransportMapping;
 | 
					import org.snmp4j.transport.DefaultUdpTransportMapping;
 | 
				
			||||||
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.io.IOException;
 | 
					import java.io.IOException;
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.*;
 | 
				
			||||||
@@ -21,28 +22,50 @@ import java.util.concurrent.Executors;
 | 
				
			|||||||
import java.util.stream.Collectors;
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 动态OID多交换机采集管理器
 | 
					 * 动态OID多交换机采集管理器 (SNMP v3版本)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					@Service
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
public class DynamicOidCollector {
 | 
					public class DynamicOidCollector {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 全局SNMP实例
 | 
					    // 全局SNMP实例
 | 
				
			||||||
    private Snmp snmp;
 | 
					    private Snmp snmp;
 | 
				
			||||||
 | 
					    private boolean initialized = false;
 | 
				
			||||||
 | 
					    private final Object initLock = new Object();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 线程池
 | 
					    // 线程池
 | 
				
			||||||
    private final ExecutorService switchExecutor = Executors.newFixedThreadPool(10);
 | 
					    private final ExecutorService switchExecutor = Executors.newFixedThreadPool(10);
 | 
				
			||||||
    private final ExecutorService deviceTypeExecutor = Executors.newFixedThreadPool(20);
 | 
					    private final ExecutorService deviceTypeExecutor = Executors.newFixedThreadPool(20);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 初始化SNMP
 | 
					     * 初始化SNMP(线程安全)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public void init() throws IOException {
 | 
					    public void init() throws IOException {
 | 
				
			||||||
 | 
					        synchronized (initLock) {
 | 
				
			||||||
 | 
					            if (!initialized) {
 | 
				
			||||||
                TransportMapping<?> transport = new DefaultUdpTransportMapping();
 | 
					                TransportMapping<?> transport = new DefaultUdpTransportMapping();
 | 
				
			||||||
                snmp = new Snmp(transport);
 | 
					                snmp = new Snmp(transport);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 添加SNMP v3支持
 | 
				
			||||||
 | 
					                USM usm = new USM(SecurityProtocols.getInstance(),
 | 
				
			||||||
 | 
					                        new OctetString(MPv3.createLocalEngineID()), 0);
 | 
				
			||||||
 | 
					                SecurityModels.getInstance().addSecurityModel(usm);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                transport.listen();
 | 
					                transport.listen();
 | 
				
			||||||
 | 
					                initialized = true;
 | 
				
			||||||
                System.out.println("SNMP服务初始化完成");
 | 
					                System.out.println("SNMP服务初始化完成");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 确保SNMP已初始化
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void ensureInitialized() throws IOException {
 | 
				
			||||||
 | 
					        if (!initialized) {
 | 
				
			||||||
 | 
					            init();
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 关闭资源
 | 
					     * 关闭资源
 | 
				
			||||||
@@ -64,24 +87,24 @@ public class DynamicOidCollector {
 | 
				
			|||||||
     * 根据设备类型获取信息(核心方法 - 动态OID版本)
 | 
					     * 根据设备类型获取信息(核心方法 - 动态OID版本)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public CollectionResult getInterfaceInfoByType(SwitchOidDto switchVo, String deviceType) {
 | 
					    public CollectionResult getInterfaceInfoByType(SwitchOidDto switchVo, String deviceType) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            ensureInitialized();
 | 
				
			||||||
            // 获取该设备类型的OID映射
 | 
					            // 获取该设备类型的OID映射
 | 
				
			||||||
            Map<String, String> oidParams = switchVo.getOidsByType(deviceType);
 | 
					            Map<String, String> oidParams = switchVo.getOidsByType(deviceType);
 | 
				
			||||||
            if (oidParams == null || oidParams.isEmpty()) {
 | 
					            if (oidParams == null || oidParams.isEmpty()) {
 | 
				
			||||||
                return new CollectionResult(switchVo.getIp(), deviceType, "该设备类型未配置OID");
 | 
					                return new CollectionResult(switchVo.getIp(), deviceType, "该设备类型未配置OID");
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
            List<Map<String, String>> results = new ArrayList<>();
 | 
					            List<Map<String, String>> results = new ArrayList<>();
 | 
				
			||||||
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
            // 创建目标
 | 
					            // 创建目标
 | 
				
			||||||
            CommunityTarget target = createTarget(switchVo);
 | 
					            Target target = createTarget(switchVo);
 | 
				
			||||||
            // 判断是否需要索引处理
 | 
					            // 判断是否需要索引处理
 | 
				
			||||||
            boolean needIndex = needIndexProcessing(oidParams, deviceType);
 | 
					            boolean needIndex = needIndexProcessing(oidParams, deviceType);
 | 
				
			||||||
            // 获取过滤条件
 | 
					            // 获取过滤条件
 | 
				
			||||||
            List<String> filterValues = switchVo.getFilterByType(deviceType);
 | 
					            List<String> filterValues = switchVo.getFilterByType(deviceType);
 | 
				
			||||||
            System.out.printf("采集交换机 %s 的 %s 设备信息,筛选条件: %s%n",
 | 
					            log.info("采集交换机 {} 的 {} 设备信息,筛选条件: {}",
 | 
				
			||||||
                    switchVo.getIp(), deviceType, filterValues);
 | 
					                    switchVo.getIp(), deviceType, filterValues);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if(needIndex){
 | 
					            if(needIndex){
 | 
				
			||||||
                String indexOID = getIndexOidFromOidParams(oidParams);
 | 
					                String indexOID = getIndexOidFromOidParams(oidParams);
 | 
				
			||||||
                // 获取索引OID(使用第一个OID作为索引基础)
 | 
					                // 获取索引OID(使用第一个OID作为索引基础)
 | 
				
			||||||
@@ -91,7 +114,7 @@ public class DynamicOidCollector {
 | 
				
			|||||||
                // 获取索引列表
 | 
					                // 获取索引列表
 | 
				
			||||||
                List<Integer> indexes = getIndexes(target, indexOID, filterValues);
 | 
					                List<Integer> indexes = getIndexes(target, indexOID, filterValues);
 | 
				
			||||||
                if (indexes.isEmpty()) {
 | 
					                if (indexes.isEmpty()) {
 | 
				
			||||||
                    System.out.printf("交换机 %s 的 %s 设备索引为空%n", switchVo.getIp(), deviceType);
 | 
					                    log.info("交换机 {} 的 {} 设备索引为空", switchVo.getIp(), deviceType);
 | 
				
			||||||
                    return new CollectionResult(switchVo.getIp(), deviceType, results, true);
 | 
					                    return new CollectionResult(switchVo.getIp(), deviceType, results, true);
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -113,12 +136,13 @@ public class DynamicOidCollector {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
            return new CollectionResult(switchVo.getIp(), deviceType, results, true);
 | 
					            return new CollectionResult(switchVo.getIp(), deviceType, results, true);
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            String errorMsg = String.format("采集失败: %s", e.getMessage());
 | 
					            String errorMsg = String.format("采集失败: {}", e.getMessage());
 | 
				
			||||||
            System.err.printf("采集交换机 %s 的 %s 信息失败: %s%n",
 | 
					            System.err.printf("采集交换机 {} 的 {} 信息失败: {}",
 | 
				
			||||||
                    switchVo.getIp(), deviceType, errorMsg);
 | 
					                    switchVo.getIp(), deviceType, errorMsg);
 | 
				
			||||||
            return new CollectionResult(switchVo.getIp(), deviceType, errorMsg);
 | 
					            return new CollectionResult(switchVo.getIp(), deviceType, errorMsg);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 判断是否需要索引处理
 | 
					     * 判断是否需要索引处理
 | 
				
			||||||
     * 针对特定的系统信息OID,不需要索引处理
 | 
					     * 针对特定的系统信息OID,不需要索引处理
 | 
				
			||||||
@@ -162,7 +186,7 @@ public class DynamicOidCollector {
 | 
				
			|||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取设备索引列表
 | 
					     * 获取设备索引列表
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private List<Integer> getIndexes(CommunityTarget target, String indexOID, List<String> filterValues)
 | 
					    private List<Integer> getIndexes(Target target, String indexOID, List<String> filterValues)
 | 
				
			||||||
            throws IOException {
 | 
					            throws IOException {
 | 
				
			||||||
        List<Integer> indexes = new ArrayList<>();
 | 
					        List<Integer> indexes = new ArrayList<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -216,7 +240,7 @@ public class DynamicOidCollector {
 | 
				
			|||||||
     * @param oidParams OID参数映射
 | 
					     * @param oidParams OID参数映射
 | 
				
			||||||
     * @return 设备信息
 | 
					     * @return 设备信息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private Map<String, String> getDeviceInfo(CommunityTarget target, int index,
 | 
					    private Map<String, String> getDeviceInfo(Target target, int index,
 | 
				
			||||||
                                              Map<String, String> oidParams)
 | 
					                                              Map<String, String> oidParams)
 | 
				
			||||||
            throws IOException {
 | 
					            throws IOException {
 | 
				
			||||||
        Map<String, String> deviceInfo = new HashMap<>();
 | 
					        Map<String, String> deviceInfo = new HashMap<>();
 | 
				
			||||||
@@ -251,19 +275,118 @@ public class DynamicOidCollector {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 创建SNMP目标
 | 
					     * 创建SNMP目标 (支持v2c和v3)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private CommunityTarget createTarget(SwitchOidDto switchVo) {
 | 
					    private Target createTarget(SwitchOidDto switchVo) {
 | 
				
			||||||
        Address targetAddress = new UdpAddress(switchVo.getIp() + "/" + switchVo.getPort());
 | 
					        Address targetAddress = new UdpAddress(switchVo.getIp() + "/" + switchVo.getPort());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 根据版本选择创建不同的Target
 | 
				
			||||||
 | 
					        if (switchVo.isV3()) {
 | 
				
			||||||
 | 
					            return createV3Target(switchVo, targetAddress);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            return createV2cTarget(switchVo, targetAddress);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 创建SNMP v2c目标
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private CommunityTarget createV2cTarget(SwitchOidDto switchVo, Address targetAddress) {
 | 
				
			||||||
        CommunityTarget target = new CommunityTarget();
 | 
					        CommunityTarget target = new CommunityTarget();
 | 
				
			||||||
        target.setCommunity(new OctetString(switchVo.getCommunity()));
 | 
					        target.setCommunity(new OctetString(switchVo.getCommunity()));
 | 
				
			||||||
        target.setAddress(targetAddress);
 | 
					        target.setAddress(targetAddress);
 | 
				
			||||||
        target.setRetries(2);
 | 
					        target.setRetries(switchVo.getRetries());
 | 
				
			||||||
        target.setTimeout(5000);
 | 
					        target.setTimeout(switchVo.getTimeout());
 | 
				
			||||||
        target.setVersion(SnmpConstants.version2c);
 | 
					        target.setVersion(SnmpConstants.version2c);
 | 
				
			||||||
        return target;
 | 
					        return target;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 创建SNMP v3目标
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private UserTarget createV3Target(SwitchOidDto switchVo, Address targetAddress) {
 | 
				
			||||||
 | 
					        UserTarget target = new UserTarget();
 | 
				
			||||||
 | 
					        target.setAddress(targetAddress);
 | 
				
			||||||
 | 
					        target.setRetries(switchVo.getRetries());
 | 
				
			||||||
 | 
					        target.setTimeout(switchVo.getTimeout());
 | 
				
			||||||
 | 
					        target.setVersion(SnmpConstants.version3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置安全名称
 | 
				
			||||||
 | 
					        target.setSecurityName(new OctetString(switchVo.getSecurityName()));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置安全级别
 | 
				
			||||||
 | 
					        target.setSecurityLevel(switchVo.getSecurityLevel());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return target;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 添加SNMP v3用户到SNMP引擎
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void addV3User(SwitchOidDto switchVo) {
 | 
				
			||||||
 | 
					        if (!switchVo.isV3()) {
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        OctetString securityName = new OctetString(switchVo.getSecurityName());
 | 
				
			||||||
 | 
					        OID authProtocol = getAuthProtocol(switchVo.getAuthProtocol());
 | 
				
			||||||
 | 
					        OID privProtocol = getPrivProtocol(switchVo.getPrivProtocol());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        UsmUser user = new UsmUser(
 | 
				
			||||||
 | 
					                securityName,
 | 
				
			||||||
 | 
					                authProtocol,
 | 
				
			||||||
 | 
					                new OctetString(switchVo.getAuthPassword()),
 | 
				
			||||||
 | 
					                privProtocol,
 | 
				
			||||||
 | 
					                new OctetString(switchVo.getPrivPassword())
 | 
				
			||||||
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        snmp.getUSM().addUser(securityName, user);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取认证协议OID
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private OID getAuthProtocol(String authProtocol) {
 | 
				
			||||||
 | 
					        if (authProtocol == null) {
 | 
				
			||||||
 | 
					            return AuthMD5.ID;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (authProtocol.toLowerCase()) {
 | 
				
			||||||
 | 
					            case "md5":
 | 
				
			||||||
 | 
					                return AuthMD5.ID;
 | 
				
			||||||
 | 
					            case "sha":
 | 
				
			||||||
 | 
					                return AuthSHA.ID;
 | 
				
			||||||
 | 
					            case "sha1":
 | 
				
			||||||
 | 
					                return AuthSHA.ID;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return AuthMD5.ID;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取加密协议OID
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private OID getPrivProtocol(String privProtocol) {
 | 
				
			||||||
 | 
					        if (privProtocol == null) {
 | 
				
			||||||
 | 
					            return PrivDES.ID;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (privProtocol.toLowerCase()) {
 | 
				
			||||||
 | 
					            case "des":
 | 
				
			||||||
 | 
					                return PrivDES.ID;
 | 
				
			||||||
 | 
					            case "3des":
 | 
				
			||||||
 | 
					                return Priv3DES.ID;
 | 
				
			||||||
 | 
					            case "aes128":
 | 
				
			||||||
 | 
					                return PrivAES128.ID;
 | 
				
			||||||
 | 
					            case "aes192":
 | 
				
			||||||
 | 
					                return PrivAES192.ID;
 | 
				
			||||||
 | 
					            case "aes256":
 | 
				
			||||||
 | 
					                return PrivAES256.ID;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return PrivDES.ID;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 采集单个交换机的所有设备类型
 | 
					     * 采集单个交换机的所有设备类型
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -273,10 +396,15 @@ public class DynamicOidCollector {
 | 
				
			|||||||
        // 获取交换机支持的所有设备类型
 | 
					        // 获取交换机支持的所有设备类型
 | 
				
			||||||
        List<String> deviceTypes = switchVo.getSupportedDeviceTypes();
 | 
					        List<String> deviceTypes = switchVo.getSupportedDeviceTypes();
 | 
				
			||||||
        if (deviceTypes.isEmpty()) {
 | 
					        if (deviceTypes.isEmpty()) {
 | 
				
			||||||
            System.out.printf("交换机 %s 未配置任何设备类型的OID%n", switchVo.getIp());
 | 
					            log.info("交换机 {} 未配置任何设备类型的OID", switchVo.getIp());
 | 
				
			||||||
            return results;
 | 
					            return results;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 如果是v3版本,先添加用户
 | 
				
			||||||
 | 
					        if (switchVo.isV3()) {
 | 
				
			||||||
 | 
					            addV3User(switchVo);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 并发采集所有设备类型
 | 
					        // 并发采集所有设备类型
 | 
				
			||||||
        List<CompletableFuture<Void>> futures = deviceTypes.stream()
 | 
					        List<CompletableFuture<Void>> futures = deviceTypes.stream()
 | 
				
			||||||
                .map(deviceType -> CompletableFuture.runAsync(() -> {
 | 
					                .map(deviceType -> CompletableFuture.runAsync(() -> {
 | 
				
			||||||
@@ -284,10 +412,10 @@ public class DynamicOidCollector {
 | 
				
			|||||||
                    results.put(deviceType, result);
 | 
					                    results.put(deviceType, result);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    if (result.isSuccess()) {
 | 
					                    if (result.isSuccess()) {
 | 
				
			||||||
                        System.out.printf("交换机 %s 的 %s 采集完成: %d 个设备%n",
 | 
					                        log.info("交换机 {} 的 {} 采集完成: %d 个设备",
 | 
				
			||||||
                                switchVo.getIp(), deviceType, result.getData().size());
 | 
					                                switchVo.getIp(), deviceType, result.getData().size());
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        System.out.printf("交换机 %s 的 %s 采集失败: %s%n",
 | 
					                        log.info("交换机 {} 的 {} 采集失败: {}",
 | 
				
			||||||
                                switchVo.getIp(), deviceType, result.getErrorMessage());
 | 
					                                switchVo.getIp(), deviceType, result.getErrorMessage());
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }, deviceTypeExecutor))
 | 
					                }, deviceTypeExecutor))
 | 
				
			||||||
@@ -307,12 +435,12 @@ public class DynamicOidCollector {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
        List<CompletableFuture<Void>> futures = switches.stream()
 | 
					        List<CompletableFuture<Void>> futures = switches.stream()
 | 
				
			||||||
                .map(switchVo -> CompletableFuture.runAsync(() -> {
 | 
					                .map(switchVo -> CompletableFuture.runAsync(() -> {
 | 
				
			||||||
                    System.out.printf("开始采集交换机: %s%n", switchVo.getIp());
 | 
					                    log.info("开始采集交换机: {}", switchVo.getIp());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    Map<String, CollectionResult> switchResults = collectSwitch(switchVo);
 | 
					                    Map<String, CollectionResult> switchResults = collectSwitch(switchVo);
 | 
				
			||||||
                    allResults.put(switchVo.getIp(), switchResults);
 | 
					                    allResults.put(switchVo.getIp(), switchResults);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    System.out.printf("完成采集交换机: %s, 采集了 %d 种设备类型%n",
 | 
					                    log.info("完成采集交换机: {}, 采集了 %d 种设备类型",
 | 
				
			||||||
                            switchVo.getIp(), switchResults.size());
 | 
					                            switchVo.getIp(), switchResults.size());
 | 
				
			||||||
                }, switchExecutor))
 | 
					                }, switchExecutor))
 | 
				
			||||||
                .collect(Collectors.toList());
 | 
					                .collect(Collectors.toList());
 | 
				
			||||||
@@ -324,10 +452,12 @@ public class DynamicOidCollector {
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 创建示例交换机配置
 | 
					     * 创建示例交换机配置 (支持v2c和v3)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static SwitchOidDto createExampleSwitch(String ip, String community) {
 | 
					    public static SwitchOidDto createExampleSwitch(String ip, String community) {
 | 
				
			||||||
        SwitchOidDto switchVo = new SwitchOidDto(ip, community);
 | 
					        SwitchOidDto switchVo = new SwitchOidDto(ip, community);
 | 
				
			||||||
 | 
					        switchVo.setVersion(SnmpConstants.version2c); // 默认v2c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 配置系统信息OID
 | 
					        // 配置系统信息OID
 | 
				
			||||||
        Map<String, String> otherOids = new LinkedHashMap<>();
 | 
					        Map<String, String> otherOids = new LinkedHashMap<>();
 | 
				
			||||||
        otherOids.put("1.3.6.1.2.1.1.1.0", "ifDescr");
 | 
					        otherOids.put("1.3.6.1.2.1.1.1.0", "ifDescr");
 | 
				
			||||||
@@ -338,6 +468,7 @@ public class DynamicOidCollector {
 | 
				
			|||||||
        otherOids.put("1.3.6.1.2.1.1.6.0", "sysLocation");
 | 
					        otherOids.put("1.3.6.1.2.1.1.6.0", "sysLocation");
 | 
				
			||||||
        otherOids.put("1.3.6.1.4.1.2011.5.25.183.1.4.0", "hwStackSystemMac");
 | 
					        otherOids.put("1.3.6.1.4.1.2011.5.25.183.1.4.0", "hwStackSystemMac");
 | 
				
			||||||
        switchVo.setOtherOID(otherOids);
 | 
					        switchVo.setOtherOID(otherOids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 配置网络接口OID
 | 
					        // 配置网络接口OID
 | 
				
			||||||
        Map<String, String> netOids = new LinkedHashMap<>();
 | 
					        Map<String, String> netOids = new LinkedHashMap<>();
 | 
				
			||||||
        netOids.put("1.3.6.1.2.1.2.2.1.2", "ifDescr");
 | 
					        netOids.put("1.3.6.1.2.1.2.2.1.2", "ifDescr");
 | 
				
			||||||
@@ -345,25 +476,46 @@ public class DynamicOidCollector {
 | 
				
			|||||||
        netOids.put("1.3.6.1.2.1.2.2.1.8", "ifOperStatus");
 | 
					        netOids.put("1.3.6.1.2.1.2.2.1.8", "ifOperStatus");
 | 
				
			||||||
        switchVo.setNetOID(netOids);
 | 
					        switchVo.setNetOID(netOids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 配置电源OID
 | 
					        return switchVo;
 | 
				
			||||||
//        Map<String, String> pwrOids = new LinkedHashMap<>();
 | 
					    }
 | 
				
			||||||
//        pwrOids.put("1.3.6.1.2.1.47.1.1.1.1.5", "pwrEntIndex");
 | 
					 | 
				
			||||||
//        pwrOids.put("1.3.6.1.2.1.47.1.1.1.1.7", "pwrName");
 | 
					 | 
				
			||||||
//        pwrOids.put("1.3.6.1.4.1.2011.5.25.31.1.1.18.1.6", "pwrEntityPwrState");
 | 
					 | 
				
			||||||
//        pwrOids.put("1.3.6.1.4.1.2011.5.25.31.1.1.18.1.7", "pwrEntityPwrCurrent");
 | 
					 | 
				
			||||||
//        pwrOids.put("1.3.6.1.4.1.2011.5.25.31.1.1.18.1.8", "pwrEntityPwrVoltage");
 | 
					 | 
				
			||||||
//        switchVo.setPwrOID(pwrOids);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 配置过滤条件
 | 
					    /**
 | 
				
			||||||
        Map<String, List<String>> filters = new HashMap<>();
 | 
					     * 创建SNMP v3示例交换机配置
 | 
				
			||||||
//        filters.put("pwr", Arrays.asList("6"));          // 只采集正常和警告状态的电源
 | 
					     */
 | 
				
			||||||
        switchVo.setFilters(filters);
 | 
					    public static SwitchOidDto createV3ExampleSwitch(String ip, String securityName,
 | 
				
			||||||
 | 
					                                                     String authProtocol, String authPassword,
 | 
				
			||||||
 | 
					                                                     String privProtocol, String privPassword) {
 | 
				
			||||||
 | 
					        SwitchOidDto switchVo = new SwitchOidDto(ip, null);
 | 
				
			||||||
 | 
					        switchVo.setVersion(SnmpConstants.version3);
 | 
				
			||||||
 | 
					        switchVo.setSecurityName(securityName);
 | 
				
			||||||
 | 
					        switchVo.setAuthProtocol(authProtocol);
 | 
				
			||||||
 | 
					        switchVo.setAuthPassword(authPassword);
 | 
				
			||||||
 | 
					        switchVo.setPrivProtocol(privProtocol);
 | 
				
			||||||
 | 
					        switchVo.setPrivPassword(privPassword);
 | 
				
			||||||
 | 
					        switchVo.setSecurityLevel(org.snmp4j.security.SecurityLevel.AUTH_PRIV); // 认证+加密
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 配置系统信息OID
 | 
				
			||||||
 | 
					        Map<String, String> otherOids = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					        otherOids.put("1.3.6.1.2.1.1.1.0", "ifDescr");
 | 
				
			||||||
 | 
					        otherOids.put("1.3.6.1.2.1.1.2.0", "sysObjectID");
 | 
				
			||||||
 | 
					        otherOids.put("1.3.6.1.2.1.1.3.0", "sysUpTime");
 | 
				
			||||||
 | 
					        otherOids.put("1.3.6.1.2.1.1.4.0", "sysContact");
 | 
				
			||||||
 | 
					        otherOids.put("1.3.6.1.2.1.1.5.0", "sysName");
 | 
				
			||||||
 | 
					        otherOids.put("1.3.6.1.2.1.1.6.0", "sysLocation");
 | 
				
			||||||
 | 
					        switchVo.setOtherOID(otherOids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 配置网络接口OID
 | 
				
			||||||
 | 
					        Map<String, String> netOids = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					        netOids.put("1.3.6.1.2.1.2.2.1.2", "ifDescr");
 | 
				
			||||||
 | 
					        netOids.put("1.3.6.1.2.1.2.2.1.3", "ifType");
 | 
				
			||||||
 | 
					        netOids.put("1.3.6.1.2.1.2.2.1.8", "ifOperStatus");
 | 
				
			||||||
 | 
					        switchVo.setNetOID(netOids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return switchVo;
 | 
					        return switchVo;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 主程序入口
 | 
					     * 主程序入口 (支持v2c和v3测试)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static void main(String[] args) {
 | 
					    public static void main(String[] args) {
 | 
				
			||||||
        DynamicOidCollector collector = new DynamicOidCollector();
 | 
					        DynamicOidCollector collector = new DynamicOidCollector();
 | 
				
			||||||
@@ -372,10 +524,10 @@ public class DynamicOidCollector {
 | 
				
			|||||||
            // 初始化
 | 
					            // 初始化
 | 
				
			||||||
            collector.init();
 | 
					            collector.init();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // 创建动态配置的交换机列表
 | 
					            // 创建动态配置的交换机列表 (支持v2c和v3混合)
 | 
				
			||||||
            List<SwitchOidDto> switches = Arrays.asList(
 | 
					            List<SwitchOidDto> switches = Arrays.asList(
 | 
				
			||||||
                    createExampleSwitch("123.182.89.17", "chengde_200G"),
 | 
					                    createExampleSwitch("123.182.89.17", "chengde_200G"), // v2c
 | 
				
			||||||
                    createExampleSwitch("1.194.193.81", "henan_anyang_10G")
 | 
					                    createV3ExampleSwitch("1.194.193.81", "v3user", "SHA", "auth123", "AES128", "priv123") // v3
 | 
				
			||||||
            );
 | 
					            );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // 并发采集所有交换机
 | 
					            // 并发采集所有交换机
 | 
				
			||||||
@@ -399,11 +551,11 @@ public class DynamicOidCollector {
 | 
				
			|||||||
                        .sum();
 | 
					                        .sum();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                totalDevices += switchDevices;
 | 
					                totalDevices += switchDevices;
 | 
				
			||||||
                System.out.printf("交换机 %s: %d 个设备%n", ip, switchDevices);
 | 
					                log.info("交换机 {}: %d 个设备", ip, switchDevices);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            System.out.printf("总计: %d 台交换机, %d 个设备%n", results.size(), totalDevices);
 | 
					            log.info("总计: %d 台交换机, %d 个设备", results.size(), totalDevices);
 | 
				
			||||||
            System.out.printf("总采集时间: %.2f 秒%n", (endTime - startTime) / 1000.0);
 | 
					            log.info("总采集时间: %.2f 秒", (endTime - startTime) / 1000.0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        } catch (Exception e) {
 | 
					        } catch (Exception e) {
 | 
				
			||||||
            System.err.println("采集程序出错: " + e.getMessage());
 | 
					            System.err.println("采集程序出错: " + e.getMessage());
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -0,0 +1,24 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.snmp.config;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import org.springframework.context.annotation.Bean;
 | 
				
			||||||
 | 
					import org.springframework.context.annotation.Configuration;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.TaskScheduler;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.annotation.EnableScheduling;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Configuration
 | 
				
			||||||
 | 
					@EnableScheduling
 | 
				
			||||||
 | 
					public class SchedulerConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Bean
 | 
				
			||||||
 | 
					    public TaskScheduler taskScheduler() {
 | 
				
			||||||
 | 
					        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
 | 
				
			||||||
 | 
					        scheduler.setPoolSize(20); // 根据您的交换机数量调整
 | 
				
			||||||
 | 
					        scheduler.setThreadNamePrefix("switch-collector-");
 | 
				
			||||||
 | 
					        scheduler.setAwaitTerminationSeconds(60);
 | 
				
			||||||
 | 
					        scheduler.setWaitForTasksToCompleteOnShutdown(true);
 | 
				
			||||||
 | 
					        scheduler.setRemoveOnCancelPolicy(true);
 | 
				
			||||||
 | 
					        scheduler.initialize(); // 重要:必须调用initialize()
 | 
				
			||||||
 | 
					        return scheduler;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -17,6 +17,7 @@ public class CollectionResult {
 | 
				
			|||||||
    boolean success;
 | 
					    boolean success;
 | 
				
			||||||
    String errorMessage;
 | 
					    String errorMessage;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public CollectionResult(){}
 | 
				
			||||||
    public CollectionResult(String switchIp, String deviceType,
 | 
					    public CollectionResult(String switchIp, String deviceType,
 | 
				
			||||||
                            List<Map<String, String>> data, boolean success) {
 | 
					                            List<Map<String, String>> data, boolean success) {
 | 
				
			||||||
        this.switchIp = switchIp;
 | 
					        this.switchIp = switchIp;
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,56 +1,97 @@
 | 
				
			|||||||
package com.ruoyi.rocketmq.snmp.dto;
 | 
					package com.ruoyi.rocketmq.snmp.dto;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import lombok.Data;
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					import org.snmp4j.mp.SnmpConstants;
 | 
				
			||||||
 | 
					import org.snmp4j.security.SecurityLevel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.*;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 交换机OID配置实体类
 | 
					 * 交换机OID配置DTO (支持SNMP v2c和v3)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@Data
 | 
					@Data
 | 
				
			||||||
public class SwitchOidDto {
 | 
					public class SwitchOidDto {
 | 
				
			||||||
    private Map<String, String> netOID;          // 网络接口OID映射
 | 
					 | 
				
			||||||
    private Map<String, String> moduleOID;       // 模块OID映射
 | 
					 | 
				
			||||||
    private Map<String, String> mpuOID;          // MPU OID映射
 | 
					 | 
				
			||||||
    private Map<String, String> pwrOID;          // 电源OID映射
 | 
					 | 
				
			||||||
    private Map<String, String> fanOID;          // 风扇OID映射
 | 
					 | 
				
			||||||
    private Map<String, String> otherOID;        // 其他OID映射
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** 团体名 */
 | 
					 | 
				
			||||||
    private String community;
 | 
					 | 
				
			||||||
    /** IP地址 */
 | 
					 | 
				
			||||||
    private String ip;
 | 
					    private String ip;
 | 
				
			||||||
    /** 端口 */
 | 
					    private String community;
 | 
				
			||||||
    private Integer port;
 | 
					    private int port = 161;
 | 
				
			||||||
    /** 过滤值 Map<设备类型, 过滤值列表> */
 | 
					    private int version = SnmpConstants.version2c; // 默认v2c
 | 
				
			||||||
    private Map<String, List<String>> filters;
 | 
					    private int timeout = 5000;
 | 
				
			||||||
 | 
					    private int retries = 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // SNMP v3特有参数
 | 
				
			||||||
 | 
					    private String securityName;
 | 
				
			||||||
 | 
					    private String authProtocol;
 | 
				
			||||||
 | 
					    private String authPassword;
 | 
				
			||||||
 | 
					    private String privProtocol;
 | 
				
			||||||
 | 
					    private String privPassword;
 | 
				
			||||||
 | 
					    private int securityLevel = SecurityLevel.AUTH_PRIV;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // OID配置
 | 
				
			||||||
 | 
					    private Map<String, String> netOID = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					    private Map<String, String> otherOID = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					    private Map<String, String> entityOID = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					    private Map<String, String> pwrOID = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					    private Map<String, String> fanOID = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					    private Map<String, String> mpuOID = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					    private Map<String, String> moduleOID = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					    private Map<String, String> powerOID = new LinkedHashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 过滤条件
 | 
				
			||||||
 | 
					    private Map<String, List<String>> filters = new HashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public SwitchOidDto() {
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // 构造函数
 | 
					 | 
				
			||||||
    public SwitchOidDto(String ip, String community) {
 | 
					    public SwitchOidDto(String ip, String community) {
 | 
				
			||||||
        this.ip = ip;
 | 
					        this.ip = ip;
 | 
				
			||||||
        this.community = community;
 | 
					        this.community = community;
 | 
				
			||||||
        this.port = 161;
 | 
					 | 
				
			||||||
        this.filters = new HashMap<>();
 | 
					 | 
				
			||||||
        this.netOID = new LinkedHashMap<>();
 | 
					 | 
				
			||||||
        this.moduleOID = new LinkedHashMap<>();
 | 
					 | 
				
			||||||
        this.mpuOID = new LinkedHashMap<>();
 | 
					 | 
				
			||||||
        this.pwrOID = new LinkedHashMap<>();
 | 
					 | 
				
			||||||
        this.fanOID = new LinkedHashMap<>();
 | 
					 | 
				
			||||||
        this.otherOID = new LinkedHashMap<>();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public SwitchOidDto(String ip, String community, int port) {
 | 
				
			||||||
 | 
					        this.ip = ip;
 | 
				
			||||||
 | 
					        this.community = community;
 | 
				
			||||||
 | 
					        this.port = port;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取支持的所有设备类型
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public List<String> getSupportedDeviceTypes() {
 | 
				
			||||||
 | 
					        List<String> types = new ArrayList<>();
 | 
				
			||||||
 | 
					        if (!netOID.isEmpty()) types.add("net");
 | 
				
			||||||
 | 
					        if (!otherOID.isEmpty()) types.add("other");
 | 
				
			||||||
 | 
					        if (!entityOID.isEmpty()) types.add("entity");
 | 
				
			||||||
 | 
					        if (!pwrOID.isEmpty()) types.add("pwr");
 | 
				
			||||||
 | 
					        if (!fanOID.isEmpty()) types.add("fan");
 | 
				
			||||||
 | 
					        if (!mpuOID.isEmpty()) types.add("mpu");
 | 
				
			||||||
 | 
					        if (!moduleOID.isEmpty()) types.add("module");
 | 
				
			||||||
 | 
					        if (!powerOID.isEmpty()) types.add("power");
 | 
				
			||||||
 | 
					        return types;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 根据设备类型获取OID映射
 | 
					     * 根据设备类型获取OID映射
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public Map<String, String> getOidsByType(String deviceType) {
 | 
					    public Map<String, String> getOidsByType(String deviceType) {
 | 
				
			||||||
        switch (deviceType.toLowerCase()) {
 | 
					        switch (deviceType) {
 | 
				
			||||||
            case "net": return netOID;
 | 
					            case "net":
 | 
				
			||||||
            case "module": return moduleOID;
 | 
					                return netOID;
 | 
				
			||||||
            case "mpu": return mpuOID;
 | 
					            case "other":
 | 
				
			||||||
            case "pwr": return pwrOID;
 | 
					                return otherOID;
 | 
				
			||||||
            case "fan": return fanOID;
 | 
					            case "entity":
 | 
				
			||||||
            default: return otherOID;
 | 
					                return entityOID;
 | 
				
			||||||
 | 
					            case "pwr":
 | 
				
			||||||
 | 
					                return pwrOID;
 | 
				
			||||||
 | 
					            case "fan":
 | 
				
			||||||
 | 
					                return fanOID;
 | 
				
			||||||
 | 
					            case "mpu":
 | 
				
			||||||
 | 
					                return mpuOID;
 | 
				
			||||||
 | 
					            case "module":
 | 
				
			||||||
 | 
					                return moduleOID;
 | 
				
			||||||
 | 
					            case "power":
 | 
				
			||||||
 | 
					                return powerOID;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return Collections.emptyMap();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -58,20 +99,13 @@ public class SwitchOidDto {
 | 
				
			|||||||
     * 根据设备类型获取过滤条件
 | 
					     * 根据设备类型获取过滤条件
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public List<String> getFilterByType(String deviceType) {
 | 
					    public List<String> getFilterByType(String deviceType) {
 | 
				
			||||||
        return filters.getOrDefault(deviceType.toLowerCase(), Collections.emptyList());
 | 
					        return filters.get(deviceType);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 获取所有支持的设备类型
 | 
					     * 判断是否为SNMP v3
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public List<String> getSupportedDeviceTypes() {
 | 
					    public boolean isV3() {
 | 
				
			||||||
        List<String> types = new ArrayList<>();
 | 
					        return version == SnmpConstants.version3;
 | 
				
			||||||
        if (!netOID.isEmpty()) types.add("net");
 | 
					 | 
				
			||||||
        if (!moduleOID.isEmpty()) types.add("module");
 | 
					 | 
				
			||||||
        if (!mpuOID.isEmpty()) types.add("mpu");
 | 
					 | 
				
			||||||
        if (!pwrOID.isEmpty()) types.add("pwr");
 | 
					 | 
				
			||||||
        if (!fanOID.isEmpty()) types.add("fan");
 | 
					 | 
				
			||||||
        if (!otherOID.isEmpty()) types.add("other");
 | 
					 | 
				
			||||||
        return types;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,639 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.snmp.scheduler;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.vo.CollectVo;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.vo.SwitchOidVo;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.snmp.DynamicOidCollector;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.snmp.dto.CollectionResult;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.snmp.dto.SwitchOidDto;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.snmp.service.ProcessSwitchCollectDataService;
 | 
				
			||||||
 | 
					import lombok.Data;
 | 
				
			||||||
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.snmp4j.mp.SnmpConstants;
 | 
				
			||||||
 | 
					import org.snmp4j.security.SecurityLevel;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.TaskScheduler;
 | 
				
			||||||
 | 
					import org.springframework.scheduling.support.CronTrigger;
 | 
				
			||||||
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import javax.annotation.PostConstruct;
 | 
				
			||||||
 | 
					import java.time.Duration;
 | 
				
			||||||
 | 
					import java.time.Instant;
 | 
				
			||||||
 | 
					import java.time.LocalDateTime;
 | 
				
			||||||
 | 
					import java.time.ZoneId;
 | 
				
			||||||
 | 
					import java.util.*;
 | 
				
			||||||
 | 
					import java.util.concurrent.ConcurrentHashMap;
 | 
				
			||||||
 | 
					import java.util.concurrent.ScheduledFuture;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Service
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
 | 
					public class MultiSwitchCollectionScheduler {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final TaskScheduler taskScheduler;
 | 
				
			||||||
 | 
					    private final DynamicOidCollector dynamicOidCollector;
 | 
				
			||||||
 | 
					    private boolean collectorInitialized = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 存储所有交换机的任务和配置
 | 
				
			||||||
 | 
					    private final Map<String, Map<String, ScheduledFuture<?>>> allSwitchTasks = new ConcurrentHashMap<>();
 | 
				
			||||||
 | 
					    private final Map<String, SwitchOidDto> allSwitchConfigs = new ConcurrentHashMap<>();
 | 
				
			||||||
 | 
					    private final Map<String, List<CollectVo>> allSwitchCollectConfigs = new ConcurrentHashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // 使用构造器注入而不是@Autowired
 | 
				
			||||||
 | 
					    public MultiSwitchCollectionScheduler(TaskScheduler taskScheduler,
 | 
				
			||||||
 | 
					                                          DynamicOidCollector dynamicOidCollector) {
 | 
				
			||||||
 | 
					        this.taskScheduler = taskScheduler;
 | 
				
			||||||
 | 
					        this.dynamicOidCollector = dynamicOidCollector;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private ProcessSwitchCollectDataService processSwitchCollectDataService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @PostConstruct
 | 
				
			||||||
 | 
					    public void init() {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            // 初始化SNMP采集器
 | 
				
			||||||
 | 
					            dynamicOidCollector.init();
 | 
				
			||||||
 | 
					            collectorInitialized = true;
 | 
				
			||||||
 | 
					            log.info("MultiSwitchCollectionScheduler 初始化完成,SNMP服务已启动");
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            log.error("SNMP服务初始化失败", e);
 | 
				
			||||||
 | 
					            collectorInitialized = false;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 确保采集器已初始化
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private boolean ensureCollectorInitialized() {
 | 
				
			||||||
 | 
					        if (!collectorInitialized) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                dynamicOidCollector.init();
 | 
				
			||||||
 | 
					                collectorInitialized = true;
 | 
				
			||||||
 | 
					                log.info("SNMP采集器初始化成功");
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("SNMP采集器初始化失败", e);
 | 
				
			||||||
 | 
					                return false;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return true;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 根据CollectVo列表启动交换机采集任务(支持SNMP v3)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void startSwitchCollection(String switchIp, String community, int port, String clientId,
 | 
				
			||||||
 | 
					                                      List<CollectVo> collectVos, SwitchOidVo switchOidVo) {
 | 
				
			||||||
 | 
					        // 确保采集器已初始化
 | 
				
			||||||
 | 
					        if (!ensureCollectorInitialized()) {
 | 
				
			||||||
 | 
					            log.error("SNMP采集器未初始化,无法启动交换机 {} 的采集任务", switchIp);
 | 
				
			||||||
 | 
					            return;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 停止该交换机的现有任务
 | 
				
			||||||
 | 
					        stopSwitchCollection(switchIp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 创建交换机配置
 | 
				
			||||||
 | 
					        SwitchOidDto switchVo = createSwitchConfig(switchIp, community, port, collectVos, switchOidVo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 初始化存储结构
 | 
				
			||||||
 | 
					        Map<String, ScheduledFuture<?>> switchTasks = new ConcurrentHashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 根据CollectVo配置创建不同的定时任务
 | 
				
			||||||
 | 
					        for (CollectVo collectVo : collectVos) {
 | 
				
			||||||
 | 
					            if (collectVo.isCollect()) { //剔除switchVo中的其他oid
 | 
				
			||||||
 | 
					                ScheduledFuture<?> task = createCollectionTask(switchIp, clientId, switchVo, collectVo);
 | 
				
			||||||
 | 
					                if (task != null) {
 | 
				
			||||||
 | 
					                    switchTasks.put(collectVo.getType(), task);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 存储配置
 | 
				
			||||||
 | 
					        allSwitchTasks.put(switchIp, switchTasks);
 | 
				
			||||||
 | 
					        allSwitchConfigs.put(switchIp, switchVo);
 | 
				
			||||||
 | 
					        allSwitchCollectConfigs.put(switchIp, new ArrayList<>(collectVos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log.info("启动交换机 {} 的采集任务,包含 {} 个采集类型{}",
 | 
				
			||||||
 | 
					                switchIp, switchTasks.size());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 启动SNMP v3交换机采集任务
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void startV3SwitchCollection(String switchIp, int port, String clientId, String securityName,
 | 
				
			||||||
 | 
					                                        String authProtocol, String authPassword,
 | 
				
			||||||
 | 
					                                        String privProtocol, String privPassword,
 | 
				
			||||||
 | 
					                                        int securityLevel, List<CollectVo> collectVos,
 | 
				
			||||||
 | 
					                                        SwitchOidVo switchOidVo) {
 | 
				
			||||||
 | 
					        // 停止该交换机的现有任务
 | 
				
			||||||
 | 
					        stopSwitchCollection(switchIp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 创建SNMP v3交换机配置
 | 
				
			||||||
 | 
					        SwitchOidDto switchVo = createV3SwitchConfig(switchIp, port, securityName,
 | 
				
			||||||
 | 
					                authProtocol, authPassword, privProtocol, privPassword,
 | 
				
			||||||
 | 
					                securityLevel, collectVos, switchOidVo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 初始化存储结构
 | 
				
			||||||
 | 
					        Map<String, ScheduledFuture<?>> switchTasks = new ConcurrentHashMap<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 根据CollectVo配置创建不同的定时任务
 | 
				
			||||||
 | 
					        for (CollectVo collectVo : collectVos) {
 | 
				
			||||||
 | 
					            if (collectVo.isCollect()) {
 | 
				
			||||||
 | 
					                ScheduledFuture<?> task = createCollectionTask(switchIp, clientId, switchVo, collectVo);
 | 
				
			||||||
 | 
					                if (task != null) {
 | 
				
			||||||
 | 
					                    switchTasks.put(collectVo.getType(), task);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 存储配置
 | 
				
			||||||
 | 
					        allSwitchTasks.put(switchIp, switchTasks);
 | 
				
			||||||
 | 
					        allSwitchConfigs.put(switchIp, switchVo);
 | 
				
			||||||
 | 
					        allSwitchCollectConfigs.put(switchIp, new ArrayList<>(collectVos));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log.info("启动SNMP v3交换机 {} 的采集任务,包含 {} 个采集类型{}",
 | 
				
			||||||
 | 
					                switchIp, switchTasks.size());
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 根据CollectVo创建对应的采集任务
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private ScheduledFuture<?> createCollectionTask(String switchIp, String clientId, SwitchOidDto switchVo, CollectVo collectVo) {
 | 
				
			||||||
 | 
					        String type = collectVo.getType();
 | 
				
			||||||
 | 
					        long interval = collectVo.getInterval() != null ? collectVo.getInterval() : 300L;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (isTrafficCollection(type)) {
 | 
				
			||||||
 | 
					            // 流量采集:固定时间点(0,5,10,15...分钟)
 | 
				
			||||||
 | 
					            return startTrafficCollection(switchIp, clientId, switchVo, collectVo);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // 常规采集:相对间隔
 | 
				
			||||||
 | 
					            return startRegularCollection(switchIp, clientId, switchVo, collectVo);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 判断是否为流量采集
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private boolean isTrafficCollection(String type) {
 | 
				
			||||||
 | 
					        return "switchNetCollect".equals(type);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 启动流量采集任务(固定时间点)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private ScheduledFuture<?> startTrafficCollection(String switchIp, String clientId, SwitchOidDto switchVo, CollectVo collectVo) {
 | 
				
			||||||
 | 
					        // 确保采集器已初始化
 | 
				
			||||||
 | 
					        if (!ensureCollectorInitialized()) {
 | 
				
			||||||
 | 
					            log.error("SNMP采集器未初始化,无法启动交换机 {} 的采集任务", switchIp);
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // 创建Cron表达式:每5分钟的第0秒执行(0,5,10,15...)
 | 
				
			||||||
 | 
					        String cronExpression = "0 0/5 * * * ?";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Runnable trafficTask = () -> {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                // 获取当前时间作为采集时间戳(对齐到5分钟整点)
 | 
				
			||||||
 | 
					                long collectionTimestamp = getAlignedTimestamp();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                log.info("[流量采集] 开始采集交换机 {} 的网络数据, 时间: {}", switchIp, collectionTimestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                CollectionResult result = dynamicOidCollector.getInterfaceInfoByType(switchVo, "net");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 设置采集时间戳
 | 
				
			||||||
 | 
					                result.setTimestamp(collectionTimestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                // 这里可以处理采集结果,比如保存到数据库或发送到消息队列
 | 
				
			||||||
 | 
					                processCollectionResult(result, clientId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                log.info("[流量采集] 完成采集交换机 {} 的网络数据, 时间戳: {}", switchIp, collectionTimestamp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("[流量采集] 采集交换机 {} 数据失败: {}", switchIp, e.getMessage());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        CronTrigger trigger = new CronTrigger(cronExpression);
 | 
				
			||||||
 | 
					        ScheduledFuture<?> future = taskScheduler.schedule(trafficTask, trigger);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log.info("交换机 {} 流量采集任务启动,时间点: 每5分钟整点", switchIp);
 | 
				
			||||||
 | 
					        return future;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取对齐的时间戳(5分钟整点,精确到秒)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private long getAlignedTimestamp() {
 | 
				
			||||||
 | 
					        long currentTime = System.currentTimeMillis() / 1000; // 当前时间戳(秒)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 计算5分钟的秒数
 | 
				
			||||||
 | 
					        long fiveMinutes = 5 * 60;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 对齐到5分钟整点
 | 
				
			||||||
 | 
					        long alignedTimestamp = (currentTime / fiveMinutes) * fiveMinutes;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return alignedTimestamp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 处理采集结果
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private void processCollectionResult(CollectionResult result, String clientId) {
 | 
				
			||||||
 | 
					        if (result.isSuccess()) {
 | 
				
			||||||
 | 
					            log.debug("流量采集成功 - 交换机: {}, 设备类型: {}, 时间: {}, 数据量: {}",
 | 
				
			||||||
 | 
					                    result.getSwitchIp(), result.getDeviceType(),
 | 
				
			||||||
 | 
					                    result.getTimestamp(), result.getData().size());
 | 
				
			||||||
 | 
					            processSwitchCollectDataService.handleSwitchDataMessage(result, clientId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            log.warn("流量采集失败 - 交换机: {}, 设备类型: {}, 时间: {}, 错误: {}",
 | 
				
			||||||
 | 
					                    result.getSwitchIp(), result.getDeviceType(),
 | 
				
			||||||
 | 
					                    result.getTimestamp(), result.getErrorMessage());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 启动常规采集任务(相对间隔)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private ScheduledFuture<?> startRegularCollection(String switchIp, String clientId, SwitchOidDto switchVo, CollectVo collectVo) {
 | 
				
			||||||
 | 
					        // 确保采集器已初始化
 | 
				
			||||||
 | 
					        if (!ensureCollectorInitialized()) {
 | 
				
			||||||
 | 
					            log.error("SNMP采集器未初始化,无法启动交换机 {} 的采集任务", switchIp);
 | 
				
			||||||
 | 
					            return null;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        long intervalSeconds = collectVo.getInterval() != null ? collectVo.getInterval() : 300L;
 | 
				
			||||||
 | 
					        Instant startTime = calculateAlignedStartTime(intervalSeconds);
 | 
				
			||||||
 | 
					        Duration interval = Duration.ofSeconds(intervalSeconds);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Runnable regularTask = () -> {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                log.info("[{}] 开始采集交换机 {} 的数据, 时间: {}",
 | 
				
			||||||
 | 
					                        collectVo.getType(), switchIp, LocalDateTime.now());
 | 
				
			||||||
 | 
					                // 获取对齐到整分钟的时间戳
 | 
				
			||||||
 | 
					                long collectionTimestamp = getAlignedMinuteTimestamp();
 | 
				
			||||||
 | 
					                // 根据类型执行对应的采集
 | 
				
			||||||
 | 
					                CollectionResult result = executeCollectionByType(switchVo, collectVo.getType());
 | 
				
			||||||
 | 
					                // 设置采集时间戳
 | 
				
			||||||
 | 
					                result.setTimestamp(collectionTimestamp);
 | 
				
			||||||
 | 
					                // 处理采集结果
 | 
				
			||||||
 | 
					                processCollectionResult(result, clientId);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                log.info("[{}] 完成采集交换机 {} 的数据", collectVo.getType(), switchIp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("[{}] 采集交换机 {} 数据失败: {}",
 | 
				
			||||||
 | 
					                        collectVo.getType(), switchIp, e.getMessage());
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        ScheduledFuture<?> future = taskScheduler.scheduleWithFixedDelay(
 | 
				
			||||||
 | 
					                regularTask, startTime, interval);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log.info("交换机 {} [{}] 采集任务启动,间隔: {}秒, 开始时间: {}",
 | 
				
			||||||
 | 
					                switchIp, collectVo.getType(), intervalSeconds, startTime);
 | 
				
			||||||
 | 
					        return future;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取对齐到整分钟的时间戳(秒为00)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private long getAlignedMinuteTimestamp() {
 | 
				
			||||||
 | 
					        long currentTime = System.currentTimeMillis() / 1000; // 当前时间戳(秒)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 对齐到整分钟(去掉秒部分)
 | 
				
			||||||
 | 
					        long alignedTimestamp = (currentTime / 60) * 60;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return alignedTimestamp;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 根据采集类型执行对应的采集
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private CollectionResult executeCollectionByType(SwitchOidDto switchVo, String type) {
 | 
				
			||||||
 | 
					        String deviceType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switch (type) {
 | 
				
			||||||
 | 
					            case "switchSysDescrCollect":
 | 
				
			||||||
 | 
					            case "switchSysObjectIDCollect":
 | 
				
			||||||
 | 
					            case "switchSysUpTimeCollect":
 | 
				
			||||||
 | 
					            case "switchSysContactCollect":
 | 
				
			||||||
 | 
					            case "switchSysNameCollect":
 | 
				
			||||||
 | 
					            case "switchSysLocationCollect":
 | 
				
			||||||
 | 
					            case "switchHwStackSystemMacCollect":
 | 
				
			||||||
 | 
					            case "switchEntIndexCollect":
 | 
				
			||||||
 | 
					            case "switchEntPhysicalNameCollect":
 | 
				
			||||||
 | 
					            case "switchEntPhysicalSoftwareRevCollect":
 | 
				
			||||||
 | 
					            case "switchHwEntityCpuUsageCollect":
 | 
				
			||||||
 | 
					            case "switchHwEntityMemUsageCollect":
 | 
				
			||||||
 | 
					            case "switchHwAveragePowerCollect":
 | 
				
			||||||
 | 
					            case "switchHwCurrentPowerCollect":
 | 
				
			||||||
 | 
					                deviceType = "other";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "switchPwrCollect":
 | 
				
			||||||
 | 
					                deviceType = "pwr";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "switchFanCollect":
 | 
				
			||||||
 | 
					                deviceType = "fan";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "switchMpuCollect":
 | 
				
			||||||
 | 
					                deviceType = "mpu";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            case "switchModuleCollect":
 | 
				
			||||||
 | 
					                deviceType = "module";
 | 
				
			||||||
 | 
					                break;
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                // 返回错误结果
 | 
				
			||||||
 | 
					                throw new RuntimeException(switchVo.getIp() + " 未知的采集类型:" + type);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return dynamicOidCollector.getInterfaceInfoByType(switchVo, deviceType);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 计算对齐的开始时间(智能对齐到整秒,使用上海时区)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private Instant calculateAlignedStartTime(long intervalSeconds) {
 | 
				
			||||||
 | 
					        // 指定上海时区
 | 
				
			||||||
 | 
					        ZoneId shanghaiZone = ZoneId.of("Asia/Shanghai");
 | 
				
			||||||
 | 
					        LocalDateTime now = LocalDateTime.now(shanghaiZone);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LocalDateTime alignedTime;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 检查当前时间是否已经是整秒(秒为0)
 | 
				
			||||||
 | 
					        if (now.getSecond() == 0) {
 | 
				
			||||||
 | 
					            // 如果当前时间已经是整秒,立即开始(或者延迟几秒开始)
 | 
				
			||||||
 | 
					            alignedTime = now.plusSeconds(5); // 延迟5秒开始,避免立即执行可能的问题
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // 否则对齐到下一分钟的00秒
 | 
				
			||||||
 | 
					            alignedTime = now.plusMinutes(1)
 | 
				
			||||||
 | 
					                    .withSecond(0)
 | 
				
			||||||
 | 
					                    .withNano(0);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Instant instant = alignedTime.atZone(shanghaiZone).toInstant();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        log.info("任务启动时间: {} (上海时间), 间隔: {}秒", alignedTime, intervalSeconds);
 | 
				
			||||||
 | 
					        return instant;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 创建交换机配置(根据SwitchOidVo和CollectVo)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private SwitchOidDto createSwitchConfig(String ip, String community, int port,
 | 
				
			||||||
 | 
					                                            List<CollectVo> collectVos, SwitchOidVo switchOidVo) {
 | 
				
			||||||
 | 
					        SwitchOidDto switchVo = new SwitchOidDto(ip, community);
 | 
				
			||||||
 | 
					        switchVo.setPort(port);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        switchVo.setVersion(switchOidVo.getVersion());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 使用SwitchOidVo中的OID配置
 | 
				
			||||||
 | 
					        if (switchOidVo.getNetOID() != null && !switchOidVo.getNetOID().isEmpty()) {
 | 
				
			||||||
 | 
					            switchVo.setNetOID(new LinkedHashMap<>(switchOidVo.getNetOID()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (switchOidVo.getOtherOID() != null && !switchOidVo.getOtherOID().isEmpty()) {
 | 
				
			||||||
 | 
					            switchVo.setOtherOID(new LinkedHashMap<>(switchOidVo.getOtherOID()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (switchOidVo.getModuleOID() != null && !switchOidVo.getModuleOID().isEmpty()) {
 | 
				
			||||||
 | 
					            // 将moduleOID映射到对应的设备类型
 | 
				
			||||||
 | 
					            switchVo.setModuleOID(new LinkedHashMap<>(switchOidVo.getModuleOID()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置过滤条件
 | 
				
			||||||
 | 
					        if (switchOidVo.getFilters() != null && !switchOidVo.getFilters().isEmpty()) {
 | 
				
			||||||
 | 
					            switchVo.setFilters(new HashMap<>(switchOidVo.getFilters()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置超时和重试次数
 | 
				
			||||||
 | 
					        if (switchOidVo.getTimeout() > 0) {
 | 
				
			||||||
 | 
					            switchVo.setTimeout(switchOidVo.getTimeout());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (switchOidVo.getRetries() > 0) {
 | 
				
			||||||
 | 
					            switchVo.setRetries(switchOidVo.getRetries());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return switchVo;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 创建SNMP v3交换机配置
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private SwitchOidDto createV3SwitchConfig(String ip, int port, String securityName,
 | 
				
			||||||
 | 
					                                              String authProtocol, String authPassword,
 | 
				
			||||||
 | 
					                                              String privProtocol, String privPassword,
 | 
				
			||||||
 | 
					                                              int securityLevel, List<CollectVo> collectVos,
 | 
				
			||||||
 | 
					                                              SwitchOidVo switchOidVo) {
 | 
				
			||||||
 | 
					        SwitchOidDto switchVo = new SwitchOidDto(ip, null);
 | 
				
			||||||
 | 
					        switchVo.setPort(port);
 | 
				
			||||||
 | 
					        switchVo.setVersion(SnmpConstants.version3);
 | 
				
			||||||
 | 
					        switchVo.setSecurityName(securityName);
 | 
				
			||||||
 | 
					        switchVo.setAuthProtocol(authProtocol);
 | 
				
			||||||
 | 
					        switchVo.setAuthPassword(authPassword);
 | 
				
			||||||
 | 
					        switchVo.setPrivProtocol(privProtocol);
 | 
				
			||||||
 | 
					        switchVo.setPrivPassword(privPassword);
 | 
				
			||||||
 | 
					        switchVo.setSecurityLevel(securityLevel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 使用SwitchOidVo中的OID配置
 | 
				
			||||||
 | 
					        if (switchOidVo.getNetOID() != null && !switchOidVo.getNetOID().isEmpty()) {
 | 
				
			||||||
 | 
					            switchVo.setNetOID(new LinkedHashMap<>(switchOidVo.getNetOID()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (switchOidVo.getOtherOID() != null && !switchOidVo.getOtherOID().isEmpty()) {
 | 
				
			||||||
 | 
					            switchVo.setOtherOID(new LinkedHashMap<>(switchOidVo.getOtherOID()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (switchOidVo.getModuleOID() != null && !switchOidVo.getModuleOID().isEmpty()) {
 | 
				
			||||||
 | 
					            switchVo.setModuleOID(new LinkedHashMap<>(switchOidVo.getModuleOID()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置过滤条件
 | 
				
			||||||
 | 
					        if (switchOidVo.getFilters() != null && !switchOidVo.getFilters().isEmpty()) {
 | 
				
			||||||
 | 
					            switchVo.setFilters(new HashMap<>(switchOidVo.getFilters()));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 设置超时和重试次数
 | 
				
			||||||
 | 
					        if (switchOidVo.getTimeout() > 0) {
 | 
				
			||||||
 | 
					            switchVo.setTimeout(switchOidVo.getTimeout());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (switchOidVo.getRetries() > 0) {
 | 
				
			||||||
 | 
					            switchVo.setRetries(switchOidVo.getRetries());
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return switchVo;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 停止单个交换机的所有采集任务
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void stopSwitchCollection(String switchIp) {
 | 
				
			||||||
 | 
					        Map<String, ScheduledFuture<?>> tasks = allSwitchTasks.remove(switchIp);
 | 
				
			||||||
 | 
					        if (tasks != null) {
 | 
				
			||||||
 | 
					            tasks.values().forEach(future -> future.cancel(false));
 | 
				
			||||||
 | 
					            log.info("停止交换机 {} 的所有采集任务{}", switchIp);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        allSwitchConfigs.remove(switchIp);
 | 
				
			||||||
 | 
					        allSwitchCollectConfigs.remove(switchIp);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 停止所有交换机的采集任务
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void stopAllSwitchCollections() {
 | 
				
			||||||
 | 
					        allSwitchTasks.values().forEach(tasks ->
 | 
				
			||||||
 | 
					                tasks.values().forEach(future -> future.cancel(false)));
 | 
				
			||||||
 | 
					        allSwitchTasks.clear();
 | 
				
			||||||
 | 
					        allSwitchConfigs.clear();
 | 
				
			||||||
 | 
					        allSwitchCollectConfigs.clear();
 | 
				
			||||||
 | 
					        System.out.println("停止所有交换机的采集任务");
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取交换机的任务状态
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Map<String, Object> getSwitchStatus(String switchIp) {
 | 
				
			||||||
 | 
					        Map<String, Object> status = new HashMap<>();
 | 
				
			||||||
 | 
					        status.put("switchIp", switchIp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        Map<String, ScheduledFuture<?>> tasks = allSwitchTasks.get(switchIp);
 | 
				
			||||||
 | 
					        List<CollectVo> collectConfigs = allSwitchCollectConfigs.get(switchIp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if (tasks != null && collectConfigs != null) {
 | 
				
			||||||
 | 
					            status.put("isRunning", true);
 | 
				
			||||||
 | 
					            status.put("taskCount", tasks.size());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // 获取交换机配置信息
 | 
				
			||||||
 | 
					            SwitchOidDto switchConfig = allSwitchConfigs.get(switchIp);
 | 
				
			||||||
 | 
					            if (switchConfig != null) {
 | 
				
			||||||
 | 
					                status.put("snmpVersion", switchConfig.getVersion() == SnmpConstants.version3 ? "v3" : "v2c");
 | 
				
			||||||
 | 
					                status.put("securityName", switchConfig.getSecurityName());
 | 
				
			||||||
 | 
					                status.put("securityLevel", getSecurityLevelDescription(switchConfig.getSecurityLevel()));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            List<Map<String, Object>> taskStatusList = new ArrayList<>();
 | 
				
			||||||
 | 
					            for (CollectVo collectVo : collectConfigs) {
 | 
				
			||||||
 | 
					                Map<String, Object> taskStatus = new HashMap<>();
 | 
				
			||||||
 | 
					                taskStatus.put("type", collectVo.getType());
 | 
				
			||||||
 | 
					                taskStatus.put("collect", collectVo.isCollect());
 | 
				
			||||||
 | 
					                taskStatus.put("interval", collectVo.getInterval());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                ScheduledFuture<?> task = tasks.get(collectVo.getType());
 | 
				
			||||||
 | 
					                taskStatus.put("isActive", task != null && !task.isCancelled());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                taskStatusList.add(taskStatus);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            status.put("tasks", taskStatusList);
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            status.put("isRunning", false);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return status;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取安全级别描述
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String getSecurityLevelDescription(int securityLevel) {
 | 
				
			||||||
 | 
					        switch (securityLevel) {
 | 
				
			||||||
 | 
					            case SecurityLevel.NOAUTH_NOPRIV:
 | 
				
			||||||
 | 
					                return "noAuthNoPriv";
 | 
				
			||||||
 | 
					            case SecurityLevel.AUTH_NOPRIV:
 | 
				
			||||||
 | 
					                return "authNoPriv";
 | 
				
			||||||
 | 
					            case SecurityLevel.AUTH_PRIV:
 | 
				
			||||||
 | 
					                return "authPriv";
 | 
				
			||||||
 | 
					            default:
 | 
				
			||||||
 | 
					                return "unknown";
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 获取所有交换机的状态
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public Map<String, Map<String, Object>> getAllSwitchesStatus() {
 | 
				
			||||||
 | 
					        Map<String, Map<String, Object>> allStatus = new HashMap<>();
 | 
				
			||||||
 | 
					        for (String switchIp : allSwitchTasks.keySet()) {
 | 
				
			||||||
 | 
					            allStatus.put(switchIp, getSwitchStatus(switchIp));
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return allStatus;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 更新交换机的采集配置
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void updateSwitchConfig(String switchIp, String community, int port, String clientId,
 | 
				
			||||||
 | 
					                                   List<CollectVo> collectVos, SwitchOidVo switchOidVo) {
 | 
				
			||||||
 | 
					        // 先停止现有任务
 | 
				
			||||||
 | 
					        stopSwitchCollection(switchIp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 重新启动任务
 | 
				
			||||||
 | 
					        startSwitchCollection(switchIp, community, port, clientId, collectVos, switchOidVo);
 | 
				
			||||||
 | 
					        log.info("更新交换机 {} 的采集配置{}", switchIp);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 更新SNMP v3交换机的采集配置
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void updateV3SwitchConfig(String switchIp, int port, String clientId, String securityName,
 | 
				
			||||||
 | 
					                                     String authProtocol, String authPassword,
 | 
				
			||||||
 | 
					                                     String privProtocol, String privPassword,
 | 
				
			||||||
 | 
					                                     int securityLevel, List<CollectVo> collectVos,
 | 
				
			||||||
 | 
					                                     SwitchOidVo switchOidVo) {
 | 
				
			||||||
 | 
					        // 先停止现有任务
 | 
				
			||||||
 | 
					        stopSwitchCollection(switchIp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 重新启动任务
 | 
				
			||||||
 | 
					        startV3SwitchCollection(switchIp, port, clientId, securityName, authProtocol, authPassword,
 | 
				
			||||||
 | 
					                privProtocol, privPassword, securityLevel, collectVos, switchOidVo);
 | 
				
			||||||
 | 
					        log.info("更新SNMP v3交换机 {} 的采集配置{}", switchIp);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 批量处理设备配置(支持v2c和v3混合)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void batchProcessSwitchConfigurations(List<DeviceConfig> devices) {
 | 
				
			||||||
 | 
					        for (DeviceConfig device : devices) {
 | 
				
			||||||
 | 
					            try {
 | 
				
			||||||
 | 
					                if (device.getVersion() == SnmpConstants.version3) {
 | 
				
			||||||
 | 
					                    // SNMP v3设备
 | 
				
			||||||
 | 
					                    startV3SwitchCollection(
 | 
				
			||||||
 | 
					                            device.getSwitchIp(),
 | 
				
			||||||
 | 
					                            device.getPort(),
 | 
				
			||||||
 | 
					                            device.getClientId(),
 | 
				
			||||||
 | 
					                            device.getSecurityName(),
 | 
				
			||||||
 | 
					                            device.getAuthProtocol(),
 | 
				
			||||||
 | 
					                            device.getAuthPassword(),
 | 
				
			||||||
 | 
					                            device.getPrivProtocol(),
 | 
				
			||||||
 | 
					                            device.getPrivPassword(),
 | 
				
			||||||
 | 
					                            device.getSecurityLevel(),
 | 
				
			||||||
 | 
					                            device.getCollectVos(),
 | 
				
			||||||
 | 
					                            device.getSwitchOidVo()
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                } else {
 | 
				
			||||||
 | 
					                    // SNMP v2c设备
 | 
				
			||||||
 | 
					                    startSwitchCollection(
 | 
				
			||||||
 | 
					                            device.getSwitchIp(),
 | 
				
			||||||
 | 
					                            device.getCommunity(),
 | 
				
			||||||
 | 
					                            device.getPort(),
 | 
				
			||||||
 | 
					                            device.getClientId(),
 | 
				
			||||||
 | 
					                            device.getCollectVos(),
 | 
				
			||||||
 | 
					                            device.getSwitchOidVo()
 | 
				
			||||||
 | 
					                    );
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            } catch (Exception e) {
 | 
				
			||||||
 | 
					                log.error("处理交换机配置失败,switchIp: {}", device.getSwitchIp(), e);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 设备配置类(用于批量处理,支持v2c和v3)
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    @Data
 | 
				
			||||||
 | 
					    public static class DeviceConfig {
 | 
				
			||||||
 | 
					        private String switchIp;
 | 
				
			||||||
 | 
					        private String community;
 | 
				
			||||||
 | 
					        private int port;
 | 
				
			||||||
 | 
					        private String clientId;
 | 
				
			||||||
 | 
					        private List<CollectVo> collectVos;
 | 
				
			||||||
 | 
					        private SwitchOidVo switchOidVo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // SNMP v3特有字段
 | 
				
			||||||
 | 
					        private int version = SnmpConstants.version2c; // 默认v2c
 | 
				
			||||||
 | 
					        private String securityName;
 | 
				
			||||||
 | 
					        private String authProtocol;
 | 
				
			||||||
 | 
					        private String authPassword;
 | 
				
			||||||
 | 
					        private String privProtocol;
 | 
				
			||||||
 | 
					        private String privPassword;
 | 
				
			||||||
 | 
					        private int securityLevel = SecurityLevel.AUTH_PRIV; // 默认认证+加密
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -0,0 +1,310 @@
 | 
				
			|||||||
 | 
					package com.ruoyi.rocketmq.snmp.service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.alibaba.fastjson.JSONObject;
 | 
				
			||||||
 | 
					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.utils.DateUtils;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.*;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.domain.vo.CollectDataVo;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.service.*;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.snmp.dto.CollectionResult;
 | 
				
			||||||
 | 
					import com.ruoyi.rocketmq.utils.SwitchJsonDataParser;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.InitialSwitchInfoDetailsRemote;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
				
			||||||
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
 | 
					import org.springframework.stereotype.Service;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.math.BigDecimal;
 | 
				
			||||||
 | 
					import java.math.RoundingMode;
 | 
				
			||||||
 | 
					import java.util.Date;
 | 
				
			||||||
 | 
					import java.util.Iterator;
 | 
				
			||||||
 | 
					import java.util.List;
 | 
				
			||||||
 | 
					import java.util.Map;
 | 
				
			||||||
 | 
					import java.util.function.Function;
 | 
				
			||||||
 | 
					import java.util.stream.Collectors;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Service
 | 
				
			||||||
 | 
					@Slf4j
 | 
				
			||||||
 | 
					public class ProcessSwitchCollectDataService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private RemoteRevenueConfigService remoteRevenueConfigService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchInfoService initialSwitchInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchInfoTempService initialSwitchInfoTempService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchPowerSupplyService initialSwitchPowerSupplyService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchFanInfoService initialSwitchFanInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchMpuInfoService initialSwitchMpuInfoService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchOpticalModuleService initialSwitchOpticalModuleService;
 | 
				
			||||||
 | 
					    @Autowired
 | 
				
			||||||
 | 
					    private IInitialSwitchOtherCollectDataService insertInitialSwitchOtherInfo;
 | 
				
			||||||
 | 
					    // 在类中添加
 | 
				
			||||||
 | 
					    private static final ObjectMapper objectMapper = new ObjectMapper();
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 交换机所有数据入库
 | 
				
			||||||
 | 
					     * @param result
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public void handleSwitchDataMessage(CollectionResult result, String clientId) {
 | 
				
			||||||
 | 
					        if(result != null){
 | 
				
			||||||
 | 
					            List<Map<String, String>> resultData = result.getData();
 | 
				
			||||||
 | 
					            CollectDataVo switchDataVo = new CollectDataVo();
 | 
				
			||||||
 | 
					            switchDataVo.setTimestamp(result.getTimestamp());
 | 
				
			||||||
 | 
					            switchDataVo.setValue(JSONObject.toJSONString(resultData));
 | 
				
			||||||
 | 
					            switch(result.getDeviceType()){
 | 
				
			||||||
 | 
					                case "net":
 | 
				
			||||||
 | 
					//                    handleSwitchNetMessage(switchDataVo, clientId);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "pwr":
 | 
				
			||||||
 | 
					                    handleSwitchPwrMessage(switchDataVo, clientId);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "module":
 | 
				
			||||||
 | 
					                    handleSwitchModuleMessage(switchDataVo, clientId);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "mpu":
 | 
				
			||||||
 | 
					                    handleSwitchMpuMessage(switchDataVo, clientId);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                case "fan":
 | 
				
			||||||
 | 
					                    handleSwitchFanMessage(switchDataVo, clientId);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					                default:
 | 
				
			||||||
 | 
					                    handleSwitchOtherMessage(switchDataVo, clientId);
 | 
				
			||||||
 | 
					                    break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }else{
 | 
				
			||||||
 | 
					            throw new RuntimeException("交换机data数据为空");
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 其他发现数据(默认处理)
 | 
				
			||||||
 | 
					     * @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);
 | 
				
			||||||
 | 
					                                }
 | 
				
			||||||
 | 
					                            }
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }else{
 | 
				
			||||||
 | 
					                        if (firstElement.isObject()) {
 | 
				
			||||||
 | 
					                            Iterator<Map.Entry<String, JsonNode>> fields = firstElement.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);
 | 
				
			||||||
 | 
					                                    System.out.println("1");
 | 
				
			||||||
 | 
					//                                    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 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);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -10,6 +10,7 @@ import com.ruoyi.rocketmq.mapper.RmTemplateSwitchMapper;
 | 
				
			|||||||
import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
					import com.ruoyi.system.api.RemoteRevenueConfigService;
 | 
				
			||||||
import com.ruoyi.system.api.domain.RmResourceGroupRemote;
 | 
					import com.ruoyi.system.api.domain.RmResourceGroupRemote;
 | 
				
			||||||
import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
					import com.ruoyi.system.api.domain.RmResourceRegistrationRemote;
 | 
				
			||||||
 | 
					import com.ruoyi.system.api.domain.RmSwitchManagementRemote;
 | 
				
			||||||
import lombok.extern.slf4j.Slf4j;
 | 
					import lombok.extern.slf4j.Slf4j;
 | 
				
			||||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
					import org.springframework.beans.factory.annotation.Autowired;
 | 
				
			||||||
import org.springframework.stereotype.Component;
 | 
					import org.springframework.stereotype.Component;
 | 
				
			||||||
@@ -30,6 +31,26 @@ public class DataProcessUtil {
 | 
				
			|||||||
    @Autowired
 | 
					    @Autowired
 | 
				
			||||||
    private  RemoteRevenueConfigService remoteRevenueConfigService;
 | 
					    private  RemoteRevenueConfigService remoteRevenueConfigService;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 根据clinetId获取交换机名称
 | 
				
			||||||
 | 
					     * @param clientId
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public String getDeviceNameByClientId(String clientId){
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            RmSwitchManagementRemote queryParam = new RmSwitchManagementRemote();
 | 
				
			||||||
 | 
					            queryParam.setClientId(clientId);
 | 
				
			||||||
 | 
					            R<List<RmSwitchManagementRemote>> switchMsg = remoteRevenueConfigService
 | 
				
			||||||
 | 
					                    .getSwitchNameByClientId(queryParam, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (switchMsg != null && switchMsg.getData() != null) {
 | 
				
			||||||
 | 
					                return switchMsg.getData().get(0).getClientId();
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            log.error("获取交换机名称信息失败,clientId: {}", clientId, e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 补充资源组信息
 | 
					     * 补充资源组信息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
@@ -219,4 +240,25 @@ public class DataProcessUtil {
 | 
				
			|||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 根据clientId查询交换机信息
 | 
				
			||||||
 | 
					     * @param clientId
 | 
				
			||||||
 | 
					     * @return
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public RmSwitchManagementRemote getSwitchMsg(String clientId) {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					            RmSwitchManagementRemote queryParam = new RmSwitchManagementRemote();
 | 
				
			||||||
 | 
					            queryParam.setClientId(clientId);
 | 
				
			||||||
 | 
					            R<List<RmSwitchManagementRemote>> switchMsg = remoteRevenueConfigService
 | 
				
			||||||
 | 
					                    .getSwitchNameByClientId(queryParam, SecurityConstants.INNER);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (switchMsg != null && switchMsg.getData() != null) {
 | 
				
			||||||
 | 
					                return switchMsg.getData().get(0);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        } catch (Exception e) {
 | 
				
			||||||
 | 
					            log.error("获取交换机名称信息失败,clientId: {}", clientId, e);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return null;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -130,8 +130,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        select id, `name`, mac, status, `type`, ipV4, in_dropped, out_dropped, in_speed, out_speed,
 | 
					        select id, `name`, mac, status, `type`, ipV4, in_dropped, out_dropped, in_speed, out_speed,
 | 
				
			||||||
               create_time, update_time, create_by, update_by, client_id, duplex, speed
 | 
					               create_time, update_time, create_by, update_by, client_id, duplex, speed
 | 
				
			||||||
        from ${tableName}
 | 
					        from ${tableName}
 | 
				
			||||||
        where client_id = #{clientId} and `name` like 'eth0%'
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="clientId != null and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					            <if test="name != null and name != ''"> and name = #{name}</if>
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
        limit 1
 | 
					        limit 1
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					    <select id="getNetTrafficList" parameterType="InitialBandwidthTraffic" resultMap="InitialBandwidthTrafficResult">
 | 
				
			||||||
 | 
					        select id, `name`, mac, status, `type`, ipV4, in_dropped, out_dropped, in_speed, out_speed,
 | 
				
			||||||
 | 
					        create_time, update_time, create_by, update_by, client_id, duplex, speed
 | 
				
			||||||
 | 
					        from ${tableName}
 | 
				
			||||||
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="clientId != null and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					            <if test="name != null and name != ''"> and name = #{name}</if>
 | 
				
			||||||
 | 
					            <if test="startTime != null  and startTime != ''"> and create_time >= #{startTime}</if>
 | 
				
			||||||
 | 
					            <if test="endTime != null  and endTime != ''"> and create_time <= #{endTime}</if>
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
</mapper>
 | 
					</mapper>
 | 
				
			||||||
@@ -45,7 +45,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="insertInitialCpuInfo" parameterType="InitialCpuInfo" useGeneratedKeys="true" keyProperty="id">
 | 
					    <insert id="insertInitialCpuInfo" parameterType="InitialCpuInfo" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        insert into initial_cpu_info
 | 
					        insert IGNORE into initial_cpu_info
 | 
				
			||||||
        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
					            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
				
			||||||
            <if test="avg1 != null">avg1,</if>
 | 
					            <if test="avg1 != null">avg1,</if>
 | 
				
			||||||
@@ -122,7 +122,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="batchInsertInitialCpuInfo" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
 | 
					    <insert id="batchInsertInitialCpuInfo" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        INSERT INTO initial_cpu_info
 | 
					        INSERT IGNORE INTO initial_cpu_info
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
        client_id,
 | 
					        client_id,
 | 
				
			||||||
        avg1,
 | 
					        avg1,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -30,6 +30,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        <include refid="selectInitialDiskInfoVo"/>
 | 
					        <include refid="selectInitialDiskInfoVo"/>
 | 
				
			||||||
        <where>  
 | 
					        <where>  
 | 
				
			||||||
            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					            <if test="startTime != null  and startTime != ''"> and create_time >= #{startTime}</if>
 | 
				
			||||||
 | 
					            <if test="endTime != null  and endTime != ''"> and create_time <= #{endTime}</if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
        order by create_time desc
 | 
					        order by create_time desc
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
@@ -40,7 +42,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="insertInitialDiskInfo" parameterType="InitialDiskInfo">
 | 
					    <insert id="insertInitialDiskInfo" parameterType="InitialDiskInfo">
 | 
				
			||||||
        insert into initial_disk_info
 | 
					        insert IGNORE into initial_disk_info
 | 
				
			||||||
        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="id != null">id,</if>
 | 
					            <if test="id != null">id,</if>
 | 
				
			||||||
            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
					            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
				
			||||||
@@ -110,7 +112,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="batchInsertInitialDiskInfo" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
 | 
					    <insert id="batchInsertInitialDiskInfo" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        INSERT INTO initial_disk_info
 | 
					        INSERT IGNORE INTO initial_disk_info
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
        id,
 | 
					        id,
 | 
				
			||||||
        client_id,
 | 
					        client_id,
 | 
				
			||||||
@@ -168,4 +170,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        where client_id = #{clientId} and `name`= #{name}
 | 
					        where client_id = #{clientId} and `name`= #{name}
 | 
				
			||||||
        limit 1
 | 
					        limit 1
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					    <select id="getAllDistName" parameterType="String" resultType="java.util.Map">
 | 
				
			||||||
 | 
					        select name from initial_disk_info
 | 
				
			||||||
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
 | 
					        group by name
 | 
				
			||||||
 | 
					    </select>
 | 
				
			||||||
</mapper>
 | 
					</mapper>
 | 
				
			||||||
@@ -28,6 +28,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        <include refid="selectInitialDockerInfoVo"/>
 | 
					        <include refid="selectInitialDockerInfoVo"/>
 | 
				
			||||||
        <where>  
 | 
					        <where>  
 | 
				
			||||||
            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					            <if test="startTime != null  and startTime != ''"> and create_time >= #{startTime}</if>
 | 
				
			||||||
 | 
					            <if test="endTime != null  and endTime != ''"> and create_time <= #{endTime}</if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
        order by create_time desc
 | 
					        order by create_time desc
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
@@ -38,7 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="insertInitialDockerInfo" parameterType="InitialDockerInfo" useGeneratedKeys="true" keyProperty="auto_id">
 | 
					    <insert id="insertInitialDockerInfo" parameterType="InitialDockerInfo" useGeneratedKeys="true" keyProperty="auto_id">
 | 
				
			||||||
        insert into initial_docker_info
 | 
					        insert IGNORE into initial_docker_info
 | 
				
			||||||
        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="id != null and id != ''">id,</if>
 | 
					            <if test="id != null and id != ''">id,</if>
 | 
				
			||||||
            <if test="name != null and name != ''">name,</if>
 | 
					            <if test="name != null and name != ''">name,</if>
 | 
				
			||||||
@@ -100,7 +102,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="batchInsertInitialDockerInfo" parameterType="java.util.List">
 | 
					    <insert id="batchInsertInitialDockerInfo" parameterType="java.util.List">
 | 
				
			||||||
        INSERT INTO initial_docker_info
 | 
					        INSERT IGNORE INTO initial_docker_info
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
        `id`,
 | 
					        `id`,
 | 
				
			||||||
        `name`,
 | 
					        `name`,
 | 
				
			||||||
@@ -150,6 +152,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    <select id="getDockerDetailsMsg" parameterType="InitialDockerInfo" resultMap="InitialDockerInfoResult">
 | 
					    <select id="getDockerDetailsMsg" parameterType="InitialDockerInfo" resultMap="InitialDockerInfoResult">
 | 
				
			||||||
        <include refid="selectInitialDockerInfoVo"/>
 | 
					        <include refid="selectInitialDockerInfoVo"/>
 | 
				
			||||||
        where client_id = #{clientId} and `name` = #{name}
 | 
					        where client_id = #{clientId} and `id` = #{id}
 | 
				
			||||||
 | 
					    </select>
 | 
				
			||||||
 | 
					    <select id="getAllDockerId" parameterType="String" resultType="java.util.Map">
 | 
				
			||||||
 | 
					        select id from initial_docker_info
 | 
				
			||||||
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
 | 
					        group by id
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
</mapper>
 | 
					</mapper>
 | 
				
			||||||
@@ -27,6 +27,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        <include refid="selectInitialMemoryInfoVo"/>
 | 
					        <include refid="selectInitialMemoryInfoVo"/>
 | 
				
			||||||
        <where>  
 | 
					        <where>  
 | 
				
			||||||
            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					            <if test="startTime != null  and startTime != ''"> and create_time >= #{startTime}</if>
 | 
				
			||||||
 | 
					            <if test="endTime != null  and endTime != ''"> and create_time <= #{endTime}</if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
        order by create_time desc
 | 
					        order by create_time desc
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
@@ -37,7 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="insertInitialMemoryInfo" parameterType="InitialMemoryInfo" useGeneratedKeys="true" keyProperty="id">
 | 
					    <insert id="insertInitialMemoryInfo" parameterType="InitialMemoryInfo" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        insert into initial_memory_info
 | 
					        insert IGNORE into initial_memory_info
 | 
				
			||||||
        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
					            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
				
			||||||
            <if test="swapSizeFree != null">swap_size_free,</if>
 | 
					            <if test="swapSizeFree != null">swap_size_free,</if>
 | 
				
			||||||
@@ -96,7 +98,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="batchInsertInitialMemoryInfo" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
 | 
					    <insert id="batchInsertInitialMemoryInfo" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        INSERT INTO initial_memory_info
 | 
					        INSERT IGNORE INTO initial_memory_info
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
        client_id,
 | 
					        client_id,
 | 
				
			||||||
        swap_size_free,
 | 
					        swap_size_free,
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -26,6 +26,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
        <include refid="selectInitialMountPointInfoVo"/>
 | 
					        <include refid="selectInitialMountPointInfoVo"/>
 | 
				
			||||||
        <where>  
 | 
					        <where>  
 | 
				
			||||||
            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					            <if test="startTime != null  and startTime != ''"> and create_time >= #{startTime}</if>
 | 
				
			||||||
 | 
					            <if test="endTime != null  and endTime != ''"> and create_time <= #{endTime}</if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
        order by create_time desc
 | 
					        order by create_time desc
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
@@ -36,7 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="insertInitialMountPointInfo" parameterType="InitialMountPointInfo" useGeneratedKeys="true" keyProperty="id">
 | 
					    <insert id="insertInitialMountPointInfo" parameterType="InitialMountPointInfo" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        insert into initial_mount_point_info
 | 
					        insert IGNORE into initial_mount_point_info
 | 
				
			||||||
        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
					        <trim prefix="(" suffix=")" suffixOverrides=",">
 | 
				
			||||||
            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
					            <if test="clientId != null and clientId != ''">client_id,</if>
 | 
				
			||||||
            <if test="mount != null and mount != ''">mount,</if>
 | 
					            <if test="mount != null and mount != ''">mount,</if>
 | 
				
			||||||
@@ -92,7 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
    </delete>
 | 
					    </delete>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <insert id="batchInsertInitialMountPointInfo" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
 | 
					    <insert id="batchInsertInitialMountPointInfo" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
 | 
				
			||||||
        INSERT INTO initial_mount_point_info
 | 
					        INSERT IGNORE INTO initial_mount_point_info
 | 
				
			||||||
        (
 | 
					        (
 | 
				
			||||||
        client_id,
 | 
					        client_id,
 | 
				
			||||||
        mount,
 | 
					        mount,
 | 
				
			||||||
@@ -138,7 +140,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    <select id="pointDetailsMsg" parameterType="String" resultMap="InitialMountPointInfoResult">
 | 
					    <select id="pointDetailsMsg" parameterType="String" resultMap="InitialMountPointInfoResult">
 | 
				
			||||||
        <include refid="selectInitialMountPointInfoVo"/>
 | 
					        <include refid="selectInitialMountPointInfoVo"/>
 | 
				
			||||||
        where client_id = #{clientId} and mount='/'
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					            <if test="mount != null  and mount != ''"> and mount = #{mount}</if>
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
        limit 1
 | 
					        limit 1
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					    <select id="getAllMountName" parameterType="String" resultType="java.util.Map">
 | 
				
			||||||
 | 
					        select mount from initial_mount_point_info
 | 
				
			||||||
 | 
					        <where>
 | 
				
			||||||
 | 
					            <if test="clientId != null  and clientId != ''"> and client_id = #{clientId}</if>
 | 
				
			||||||
 | 
					        </where>
 | 
				
			||||||
 | 
					        group by mount
 | 
				
			||||||
 | 
					    </select>
 | 
				
			||||||
</mapper>
 | 
					</mapper>
 | 
				
			||||||
@@ -49,6 +49,8 @@
 | 
				
			|||||||
            <if test="ifOutDiscards != null "> and if_out_discards = #{ifOutDiscards}</if>
 | 
					            <if test="ifOutDiscards != null "> and if_out_discards = #{ifOutDiscards}</if>
 | 
				
			||||||
            <if test="ifInErrors != null "> and if_in_errors = #{ifInErrors}</if>
 | 
					            <if test="ifInErrors != null "> and if_in_errors = #{ifInErrors}</if>
 | 
				
			||||||
            <if test="ifOutErrors != null "> and if_out_errors = #{ifOutErrors}</if>
 | 
					            <if test="ifOutErrors != null "> and if_out_errors = #{ifOutErrors}</if>
 | 
				
			||||||
 | 
					            <if test="startTime != null  and startTime != ''"> and create_time >= #{startTime}</if>
 | 
				
			||||||
 | 
					            <if test="endTime != null  and endTime != ''"> and create_time <= #{endTime}</if>
 | 
				
			||||||
        </where>
 | 
					        </where>
 | 
				
			||||||
    </select>
 | 
					    </select>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user