snmp采集工具优化,采集数据入库优化。

This commit is contained in:
gaoyutao
2025-10-20 18:17:44 +08:00
parent b0e63880fc
commit 52728eba49
13 changed files with 336 additions and 27 deletions

View File

@@ -4,6 +4,7 @@ import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.domain.RmAlarmRecordRemote;
import com.ruoyi.system.api.domain.RmMonitorPolicyRemote;
import com.ruoyi.system.api.domain.RmNetworkInterfaceRemote;
import com.ruoyi.system.api.factory.RemoteRocketMqFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
@@ -52,4 +53,29 @@ public interface RemoteRocketMqService {
*/
@PostMapping("/networkInterface/getNetworkInterfaceList")
public R<List<RmNetworkInterfaceRemote>> getNetworkInterfaceList(@RequestBody RmNetworkInterfaceRemote rmNetworkInterfaceRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 下发策略
* @param id
* @param source
* @return
*/
@GetMapping("/monitorPolicy/innerIssueSwitchPolicy")
public R<String> innerIssueSwitchPolicy(Long id, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 查询策略信息
* @param rmMonitorPolicyRemote
* @param source
* @return
*/
@PostMapping("/monitorPolicy/getPolicyMsgInner")
public R<List<RmMonitorPolicyRemote>> getPolicyMsgInner(@RequestBody RmMonitorPolicyRemote rmMonitorPolicyRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
/**
* 策略添加新设备
* @param rmMonitorPolicyRemote
* @param source
* @return
*/
@PostMapping("/monitorPolicy/updatePolicyMsgInner")
public R<Integer> updatePolicyMsgInner(@RequestBody RmMonitorPolicyRemote rmMonitorPolicyRemote, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}

View File

@@ -0,0 +1,61 @@
package com.ruoyi.system.api.domain;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.web.domain.BaseEntity;
import lombok.Data;
import java.util.Date;
@Data
public class RmMonitorPolicyRemote extends BaseEntity {
/** 主键ID */
private Long id;
/** 策略名称 */
@Excel(name = "策略名称")
private String policyName;
/** 描述 */
@Excel(name = "描述")
private String description;
/** 资源组ID */
private Long resourceGroupId;
/** 资源组名称 */
@Excel(name = "关联资源组")
private String resourceGroupName;
/** 模板ID */
private Long templateId;
/** 模板名称 */
@Excel(name = "关联监控模板")
private String templateName;
/** 状态0-待下发1-已下发 */
@Excel(name = "策略状态", readConverterExp = "0=待下发,1=已下发")
private String status;
/** 下发策略时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "下发策略时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date deployTime;
/** 资源类型linux switch */
private String resourceType;
/** 查询条件名称 */
private String queryName;
/** 创建时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "创建时间")
private Date createTime;
/** 修改时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "修改时间")
private Date updateTime;
/** 交换机类型 */
private String switchType;
/** 部署设备 */
private String deployDevice;
/** 优先级 */
private String priority;
}

View File

@@ -3,6 +3,7 @@ package com.ruoyi.system.api.factory;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.system.api.RemoteRocketMqService;
import com.ruoyi.system.api.domain.RmAlarmRecordRemote;
import com.ruoyi.system.api.domain.RmMonitorPolicyRemote;
import com.ruoyi.system.api.domain.RmNetworkInterfaceRemote;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -51,6 +52,21 @@ public class RemoteRocketMqFallbackFactory implements FallbackFactory<RemoteRock
public R<List<RmNetworkInterfaceRemote>> getNetworkInterfaceList(RmNetworkInterfaceRemote rmNetworkInterfaceRemote, String source) {
return R.fail(throwable.getMessage());
}
@Override
public R<String> innerIssueSwitchPolicy(Long id, String source) {
return R.fail(throwable.getMessage());
}
@Override
public R<List<RmMonitorPolicyRemote>> getPolicyMsgInner(RmMonitorPolicyRemote rmMonitorPolicyRemote, String source) {
return R.fail(throwable.getMessage());
}
@Override
public R<Integer> updatePolicyMsgInner(RmMonitorPolicyRemote rmMonitorPolicyRemote, String source) {
return R.fail(throwable.getMessage());
}
};
}
}

View File

@@ -137,7 +137,7 @@ public class InitialSwitchInfoDetailsServiceImpl implements IInitialSwitchInfoDe
String switchSn = details.getSwitchSn();
RmEpsTopologyManagement rmEpsTopologyManagement = new RmEpsTopologyManagement();
rmEpsTopologyManagement.setInterfaceName(interfaceName);
rmEpsTopologyManagement.setSwitchSn(switchSn);
rmEpsTopologyManagement.setSwitchIpAddress(details.getSwitchIp());
List<RmEpsTopologyManagement> managements = rmEpsTopologyManagementMapper.selectRmEpsTopologyManagementList(rmEpsTopologyManagement);
// 赋值
if(!managements.isEmpty()){

View File

@@ -1,7 +1,12 @@
package com.ruoyi.system.service.impl;
import com.ruoyi.common.core.constant.SecurityConstants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.utils.uuid.IdUtils;
import com.ruoyi.system.api.RemoteRocketMqService;
import com.ruoyi.system.api.domain.RmMonitorPolicyRemote;
import com.ruoyi.system.domain.RmSwitchInterfaceInfo;
import com.ruoyi.system.domain.RmSwitchManagement;
import com.ruoyi.system.mapper.RmSwitchInterfaceInfoMapper;
@@ -25,6 +30,8 @@ public class RmSwitchManagementServiceImpl implements IRmSwitchManagementService
private RmSwitchManagementMapper rmSwitchManagementMapper;
@Autowired
private RmSwitchInterfaceInfoMapper rmSwitchInterfaceInfoMapper;
@Autowired
private RemoteRocketMqService remoteRocketMqService;
/**
* 查询交换机管理
@@ -65,11 +72,45 @@ public class RmSwitchManagementServiceImpl implements IRmSwitchManagementService
* @return 结果
*/
@Override
public int insertRmSwitchManagement(RmSwitchManagement rmSwitchManagement)
{
public int insertRmSwitchManagement(RmSwitchManagement rmSwitchManagement) {
// 初始化交换机信息
rmSwitchManagement.setCreateTime(DateUtils.getNowDate());
rmSwitchManagement.setClientId(IdUtils.simpleUUID());
return rmSwitchManagementMapper.insertRmSwitchManagement(rmSwitchManagement);
String clientId= IdUtils.simpleUUID();
rmSwitchManagement.setClientId(clientId);
rmSwitchManagementMapper.insertRmSwitchManagement(rmSwitchManagement);
// 查询并更新优先级为0的交换机策略
R<List<RmMonitorPolicyRemote>> policyMsgR = remoteRocketMqService.getPolicyMsgInner(
new RmMonitorPolicyRemote() {{
setPriority("0");
setResourceType("switch");
}},
SecurityConstants.INNER
);
if (policyMsgR.getData() != null && !policyMsgR.getData().isEmpty()) {
RmMonitorPolicyRemote policyMsg = policyMsgR.getData().get(0);
// 构建设备信息字符串
String newDeviceList = StringUtils.isBlank(policyMsg.getDeployDevice())
? clientId
: policyMsg.getDeployDevice() + "\n" + clientId;
// 更新策略设备列表
remoteRocketMqService.updatePolicyMsgInner(
new RmMonitorPolicyRemote() {{
setId(policyMsg.getId());
setDeployDevice(newDeviceList);
setUpdateTime(DateUtils.getNowDate());
}},
SecurityConstants.INNER
);
// 下发更新后的策略
remoteRocketMqService.innerIssueSwitchPolicy(policyMsg.getId(), SecurityConstants.INNER);
}
return 1;
}
/**

View File

@@ -1,5 +1,6 @@
package com.ruoyi.rocketmq.controller;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.controller.BaseController;
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.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.InnerAuth;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.rocketmq.domain.RmMonitorPolicy;
import com.ruoyi.rocketmq.service.IRmMonitorPolicyService;
@@ -152,4 +154,38 @@ public class RmMonitorPolicyController extends BaseController
return toAjax(rows);
}
/**
* 策略下发,内部调用
* @param id
* @return
*/
@Log(title = "issueSwitchPolicy", businessType = BusinessType.UPDATE)
@GetMapping("/innerIssueSwitchPolicy")
@InnerAuth
public R<String> innerIssueSwitchPolicy(Long id)
{
rmMonitorPolicyService.issueSwitchPolicy(id);
return R.ok("优先级0策略下发成功");
}
/**
* 查询资源监控策略列表
*/
@PostMapping("/getPolicyMsgInner")
@InnerAuth
public R<List<RmMonitorPolicy>> getPolicyMsgInner(@RequestBody RmMonitorPolicy rmMonitorPolicy)
{
List<RmMonitorPolicy> list = rmMonitorPolicyService.selectRmMonitorPolicyList(rmMonitorPolicy);
return R.ok(list);
}
/**
* 修改资源监控策略
*/
@PostMapping("/updatePolicyMsgInner")
@InnerAuth
public R<Integer> updatePolicyMsgInner(@RequestBody RmMonitorPolicy rmMonitorPolicy)
{
int rows = rmMonitorPolicyService.updatePolicyMsgInner(rmMonitorPolicy);
return R.ok(rows);
}
}

View File

@@ -8,6 +8,8 @@ public class CollectDataVo {
private String type;
/** 数据 */
private String value;
/** 交换机ip */
private String switchIp;
/** 时间戳 */
private long timestamp;
}

View File

@@ -76,4 +76,11 @@ public interface IRmMonitorPolicyService
int issueSwitchPolicy(Long id);
int updateResourcePolicy(RmMonitorPolicy rmMonitorPolicy);
/**
* 修改资源监控策略内部调用
* @param rmMonitorPolicy
* @return
*/
int updatePolicyMsgInner(RmMonitorPolicy rmMonitorPolicy);
}

View File

@@ -353,6 +353,11 @@ public class RmMonitorPolicyServiceImpl implements IRmMonitorPolicyService
return 1;
}
@Override
public int updatePolicyMsgInner(RmMonitorPolicy rmMonitorPolicy) {
return rmMonitorPolicyMapper.updateRmMonitorPolicy(rmMonitorPolicy);
}
/**
* 根据id查询监控策略详情
* @param id

View File

@@ -0,0 +1,38 @@
package com.ruoyi.rocketmq.snmp.config;
import com.ruoyi.rocketmq.domain.RmMonitorPolicy;
import com.ruoyi.rocketmq.service.IRmMonitorPolicyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.List;
@Component
@Slf4j
public class SwitchStrategyInitializer {
@Autowired
private IRmMonitorPolicyService rmMonitorPolicyService;
// 服务启动时下发默认策略
@PostConstruct
public void init() {
log.info("开始初始化交换机采集策略...");
try {
// 下发优先级为0的交换机策略
RmMonitorPolicy queryParam = new RmMonitorPolicy();
queryParam.setPriority("0");
queryParam.setResourceType("switch");
List<RmMonitorPolicy> defaultPolicy = rmMonitorPolicyService.selectRmMonitorPolicyList(queryParam);
if(!defaultPolicy.isEmpty()){
rmMonitorPolicyService.issueSwitchPolicy(defaultPolicy.get(0).getId());
}
} catch (Exception e) {
log.error("初始化交换机采集策略失败", e);
}
}
}

View File

@@ -28,6 +28,8 @@ import java.util.concurrent.ScheduledFuture;
@Slf4j
public class MultiSwitchCollectionScheduler {
private static final String PREFIX = "switch";
private static final String SUFFIX = "Collect";
private final TaskScheduler taskScheduler;
private final DynamicOidCollector dynamicOidCollector;
private boolean collectorInitialized = false;
@@ -95,8 +97,27 @@ public class MultiSwitchCollectionScheduler {
// 根据CollectVo配置创建不同的定时任务
for (CollectVo collectVo : collectVos) {
if (collectVo.isCollect()) { //剔除switchVo中的其他oid
ScheduledFuture<?> task = createCollectionTask(switchIp, clientId, switchVo, collectVo);
if (collectVo.isCollect()) {
ScheduledFuture<?> task;
// 剔除switchVo中的其他oid
if (switchVo.getOtherOID() != null) {
Map<String, String> otherOid = switchOidVo.getOtherOID();
String type = collectVo.getType();
// 创建新的 Map避免修改原始数据
Map<String, String> filteredOid = new HashMap<>(otherOid);
filteredOid.entrySet().removeIf(entry ->
!entry.getValue().equalsIgnoreCase(extractMiddle(type))
);
// 创建新的 SwitchOidDto避免修改原始 switchVo
SwitchOidDto resultMap = createSwitchMsg(switchVo);
resultMap.setOtherOID(filteredOid);
task = createCollectionTask(switchIp, clientId, resultMap, collectVo);
} else {
task = createCollectionTask(switchIp, clientId, switchVo, collectVo);
}
if (task != null) {
switchTasks.put(collectVo.getType(), task);
}
@@ -112,6 +133,69 @@ public class MultiSwitchCollectionScheduler {
switchIp, switchTasks.size());
}
/**
* 赋值oid
* @param switchVo
*/
public SwitchOidDto createSwitchMsg(SwitchOidDto switchVo){
SwitchOidDto resultMap = new SwitchOidDto();
resultMap.setIp(switchVo.getIp());
resultMap.setCommunity(switchVo.getCommunity());
resultMap.setPort(switchVo.getPort());
resultMap.setVersion(switchVo.getVersion());
resultMap.setTimeout(switchVo.getTimeout());
resultMap.setRetries(switchVo.getRetries());
// SNMP v3 特有参数
resultMap.setSecurityName(switchVo.getSecurityName());
resultMap.setAuthProtocol(switchVo.getAuthProtocol());
resultMap.setAuthPassword(switchVo.getAuthPassword());
resultMap.setPrivProtocol(switchVo.getPrivProtocol());
resultMap.setPrivPassword(switchVo.getPrivPassword());
resultMap.setSecurityLevel(switchVo.getSecurityLevel());
// OID配置复制所有OID Map
resultMap.setNetOID(new LinkedHashMap<>(switchVo.getNetOID()));
resultMap.setEntityOID(new LinkedHashMap<>(switchVo.getEntityOID()));
resultMap.setPwrOID(new LinkedHashMap<>(switchVo.getPwrOID()));
resultMap.setFanOID(new LinkedHashMap<>(switchVo.getFanOID()));
resultMap.setMpuOID(new LinkedHashMap<>(switchVo.getMpuOID()));
resultMap.setModuleOID(new LinkedHashMap<>(switchVo.getModuleOID()));
resultMap.setPowerOID(new LinkedHashMap<>(switchVo.getPowerOID()));
// 过滤条件
resultMap.setFilters(new HashMap<>(switchVo.getFilters()));
return resultMap;
}
/**
* 提取字符串的中间部分(去除固定的前缀和后缀)
* @param type 输入字符串(如 "switchAssCollect"
* @return 中间部分(如 "Ass"
*/
public String extractMiddle(String type) {
if (type == null || type.isEmpty()) {
return type;
}
// 检查是否以 "switch" 开头
if (!type.startsWith(PREFIX)) {
throw new IllegalArgumentException("Type must start with 'switch'");
}
// 检查是否以 "Collect" 结尾
if (!type.endsWith(SUFFIX)) {
throw new IllegalArgumentException("Type must end with 'Collect'");
}
// 计算中间部分的起始和结束位置
int prefixLength = PREFIX.length();
int suffixLength = SUFFIX.length();
int middleStart = prefixLength;
int middleEnd = type.length() - suffixLength;
// 提取中间部分
return type.substring(middleStart, middleEnd);
}
/**
* 启动SNMP v3交换机采集任务
*/

View File

@@ -4,7 +4,6 @@ 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;
@@ -13,7 +12,6 @@ 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;
@@ -58,10 +56,11 @@ public class ProcessSwitchCollectDataService {
List<Map<String, String>> resultData = result.getData();
CollectDataVo switchDataVo = new CollectDataVo();
switchDataVo.setTimestamp(result.getTimestamp());
switchDataVo.setSwitchIp(result.getSwitchIp());
switchDataVo.setValue(JSONObject.toJSONString(resultData));
switch(result.getDeviceType()){
case "net":
// handleSwitchNetMessage(switchDataVo, clientId);
handleSwitchNetMessage(switchDataVo, clientId);
break;
case "pwr":
handleSwitchPwrMessage(switchDataVo, clientId);
@@ -119,7 +118,7 @@ public class ProcessSwitchCollectDataService {
insertData.setCollectType(fieldName);
if (!"null".equals(fieldValue)) {
insertData.setCollectValue(fieldValue);
// insertInitialSwitchOtherInfo.insertInitialSwitchOtherCollectData(insertData);
insertInitialSwitchOtherInfo.insertInitialSwitchOtherCollectData(insertData);
}
}
}
@@ -134,8 +133,7 @@ public class ProcessSwitchCollectDataService {
insertData.setCollectType(fieldName);
if (!"null".equals(fieldValue)) {
insertData.setCollectValue(fieldValue);
System.out.println("1");
// insertInitialSwitchOtherInfo.insertInitialSwitchOtherCollectData(insertData);
insertInitialSwitchOtherInfo.insertInitialSwitchOtherCollectData(insertData);
}
}
}
@@ -154,13 +152,6 @@ public class ProcessSwitchCollectDataService {
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;
@@ -186,9 +177,7 @@ public class ProcessSwitchCollectDataService {
switchInfos.forEach(switchInfo -> {
switchInfo.setClientId(clientId);
switchInfo.setCreateTime(createTime);
if(registMsgR != null && registMsgR.getData()!=null && registMsgR.getData().getSnmpCollectAddr()!=null){
switchInfo.setSwitchIp(registMsgR.getData().getSnmpCollectAddr());
}
switchInfo.setSwitchIp(switchDataVo.getSwitchIp());
InitialSwitchInfoTemp tempInfo = tempMap.get(switchInfo.getName());
if (tempInfo != null) {
// 计算inSpeed
@@ -212,9 +201,7 @@ public class ProcessSwitchCollectDataService {
switchInfos.forEach(switchInfo -> {
switchInfo.setClientId(clientId);
switchInfo.setCreateTime(createTime);
if(registMsgR != null && registMsgR.getData()!=null && registMsgR.getData().getSnmpCollectAddr()!=null){
switchInfo.setSwitchIp(registMsgR.getData().getSnmpCollectAddr());
}
switchInfo.setSwitchIp(switchDataVo.getSwitchIp());
});
}
// 清空临时表对应switch信息

View File

@@ -19,10 +19,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="switchType" column="switch_type" />
<result property="deployDevice" column="deploy_device" />
<result property="resourceType" column="resource_type" />
<result property="priority" column="priority" />
</resultMap>
<sql id="selectRmMonitorPolicyVo">
select id, template_id, resource_group_id, policy_name, description, status, deploy_time, create_time, update_time, create_by, update_by, switch_type, deploy_device, resource_type from rm_monitor_policy
select id, template_id, resource_group_id, policy_name, description, status, deploy_time, create_time, update_time, create_by, update_by, switch_type, deploy_device, resource_type, priority from rm_monitor_policy
</sql>
<select id="selectRmMonitorPolicyList" parameterType="RmMonitorPolicy" resultMap="RmMonitorPolicyResult">
@@ -30,11 +31,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<where>
<if test="templateId != null "> and template_id = #{templateId}</if>
<if test="resourceType != null "> and resource_type = #{resourceType}</if>
<if test="resourceType != null "> and resource_type = #{resourceType}</if>
<if test="resourceGroupId != null "> and resource_group_id = #{resourceGroupId}</if>
<if test="policyName != null and policyName != ''"> and policy_name like concat('%', #{policyName}, '%')</if>
<if test="description != null and description != ''"> and description = #{description}</if>
<if test="status != null and status != ''"> and status = #{status}</if>
<if test="deployTime != null "> and deploy_time = #{deployTime}</if>
<if test="priority != null "> and priority = #{priority}</if>
<if test="queryName != null and queryName != ''">
and (policy_name like concat('%', #{queryName}, '%')
or template_id in (select id from rm_monitor_template where template_name like concat('%', #{queryName}, '%'))
@@ -65,6 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="switchType != null">switch_type,</if>
<if test="deployDevice != null">deploy_device,</if>
<if test="resourceType != null">resource_type,</if>
<if test="priority != null">priority,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="templateId != null">#{templateId},</if>
@@ -80,6 +84,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="switchType != null">#{switchType},</if>
<if test="deployDevice != null">#{deployDevice},</if>
<if test="resourceType != null">#{resourceType},</if>
<if test="priority != null">#{priority},</if>
</trim>
</insert>
@@ -99,6 +104,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="switchType != null">switch_type = #{switchType},</if>
<if test="deployDevice != null">deploy_device = #{deployDevice},</if>
<if test="resourceType != null">resource_type = #{resourceType},</if>
<if test="priority != null">priority = #{priority},</if>
</trim>
where id = #{id}
</update>