服务器注册图形监控监控项接口开发

This commit is contained in:
gaoyutao
2025-10-15 18:22:16 +08:00
parent 87824abb77
commit 3019f65515
10 changed files with 404 additions and 90 deletions

View File

@@ -92,7 +92,11 @@ public class ScreenController extends BaseController
public AjaxResult countDeviceNumTop5()
{
List<Map> maps = epsServerRevenueConfigService.countDeviceNumTop5();
return success(maps);
if(maps.isEmpty()){
return success();
}else{
return success(maps);
}
}
/**

View File

@@ -104,6 +104,7 @@
// String.class
// );
//
// System.out.println("secretKey" + secretKey);
// System.out.println("API响应结果" + response.getBody());
// System.out.println("定时任务执行完成");
//

View File

@@ -256,7 +256,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<!-- 查询所有资源名称-->
<select id="selectAllResourceNameByType" parameterType="RmResourceRegistration" resultType="java.util.Map">
select resource_name resourceName,ip_address ipAddress,hardware_sn hardwareSn from rm_resource_registration
SELECT
resource_name AS resourceName,
CASE
WHEN resource_type = '1' THEN ip_address
WHEN resource_type = '2' THEN snmp_collect_addr
END AS ipAddress,
hardware_sn AS hardwareSn
FROM rm_resource_registration
<where>
and registration_status = 1
<if test="hardwareSn != null and hardwareSn != ''"> and hardware_sn = #{hardwareSn}</if>

View File

@@ -1,26 +1,20 @@
package com.ruoyi.rocketmq.controller;
import java.util.List;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.web.page.TableDataInfo;
import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.security.annotation.RequiresPermissions;
import com.ruoyi.rocketmq.domain.InitialSystemOtherCollectData;
import com.ruoyi.rocketmq.service.IInitialSystemOtherCollectDataService;
import com.ruoyi.common.core.web.controller.BaseController;
import com.ruoyi.common.core.web.domain.AjaxResult;
import com.ruoyi.common.core.utils.poi.ExcelUtil;
import com.ruoyi.common.core.web.page.TableDataInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* 交换机系统其他信息采集数据Controller
@@ -102,4 +96,85 @@ public class InitialSystemOtherCollectDataController extends BaseController
{
return toAjax(initialSystemOtherCollectDataService.deleteInitialSystemOtherCollectDataByIds(ids));
}
/**
* 查询交换机系统其他信息采集数据列表
*/
@RequiresPermissions("rocketmq:systemOtherCollectData:list")
@PostMapping("/getMontiorMsg")
public AjaxResult getMontiorMsg(InitialSystemOtherCollectData initialSystemOtherCollectData)
{
Map list = initialSystemOtherCollectDataService.getMonitorMsg(initialSystemOtherCollectData);
return success(list);
}
/**
* 查询系统登陆用户数(个)监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
@RequiresPermissions("rocketmq:systemOtherCollectData:list")
@PostMapping("/systemUserNumEcharts")
public AjaxResult systemUserNumEcharts(@RequestBody InitialSystemOtherCollectData initialSystemOtherCollectData) {
Map<String, Object> echartsData = initialSystemOtherCollectDataService.systemUserNumEcharts(initialSystemOtherCollectData);
return success(echartsData);
}
/**
* 查询交换卷文件的可用空间监控信息列表并封装为多折线ECharts图表数据
*/
@RequiresPermissions("rocketmq:systemOtherCollectData:list")
@PostMapping("/systemSwapSizeFreeEcharts")
public AjaxResult systemSwapSizeFreeEcharts(@RequestBody InitialSystemOtherCollectData initialSystemOtherCollectData) {
Map<String, Object> echartsData = initialSystemOtherCollectDataService.systemSwapSizeFreeEcharts(initialSystemOtherCollectData);
return success(echartsData);
}
/**
* 查询内存利用率监控信息列表并封装为多折线ECharts图表数据
*/
@RequiresPermissions("rocketmq:systemOtherCollectData:list")
@PostMapping("/memoryUtilizationEcharts")
public AjaxResult memoryUtilizationEcharts(@RequestBody InitialSystemOtherCollectData initialSystemOtherCollectData) {
Map<String, Object> echartsData = initialSystemOtherCollectDataService.memoryUtilizationEcharts(initialSystemOtherCollectData);
return success(echartsData);
}
/**
* 查询可用交换空间百分比监控信息列表并封装为多折线ECharts图表数据
*/
@RequiresPermissions("rocketmq:systemOtherCollectData:list")
@PostMapping("/systemSwapSizePercentEcharts")
public AjaxResult systemSwapSizePercentEcharts(@RequestBody InitialSystemOtherCollectData initialSystemOtherCollectData) {
Map<String, Object> echartsData = initialSystemOtherCollectDataService.systemSwapSizePercentEcharts(initialSystemOtherCollectData);
return success(echartsData);
}
/**
* 查询可用内存监控信息列表并封装为多折线ECharts图表数据
*/
@RequiresPermissions("rocketmq:systemOtherCollectData:list")
@PostMapping("/memorySizeAvailableEcharts")
public AjaxResult memorySizeAvailableEcharts(@RequestBody InitialSystemOtherCollectData initialSystemOtherCollectData) {
Map<String, Object> echartsData = initialSystemOtherCollectDataService.memorySizeAvailableEcharts(initialSystemOtherCollectData);
return success(echartsData);
}
/**
* 查询可用内存百分比监控信息列表并封装为多折线ECharts图表数据
*/
@RequiresPermissions("rocketmq:systemOtherCollectData:list")
@PostMapping("/memorySizePercentEcharts")
public AjaxResult memorySizePercentEcharts(@RequestBody InitialSystemOtherCollectData initialSystemOtherCollectData) {
Map<String, Object> echartsData = initialSystemOtherCollectDataService.memorySizePercentEcharts(initialSystemOtherCollectData);
return success(echartsData);
}
/**
* 查询进程数监控信息列表并封装为多折线ECharts图表数据
*/
@RequiresPermissions("rocketmq:systemOtherCollectData:list")
@PostMapping("/procNumEcharts")
public AjaxResult procNumEcharts(@RequestBody InitialSystemOtherCollectData initialSystemOtherCollectData) {
Map<String, Object> echartsData = initialSystemOtherCollectDataService.procNumEcharts(initialSystemOtherCollectData);
return success(echartsData);
}
}

View File

@@ -1,9 +1,8 @@
package com.ruoyi.rocketmq.domain;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.annotation.Excel;
import com.ruoyi.common.core.web.domain.BaseEntity;
import lombok.Data;
/**
* 交换机系统其他信息采集数据对象 initial_system_other_collect_data
@@ -11,6 +10,7 @@ import com.ruoyi.common.core.web.domain.BaseEntity;
* @author gyt
* @date 2025-09-23
*/
@Data
public class InitialSystemOtherCollectData extends BaseEntity
{
private static final long serialVersionUID = 1L;
@@ -29,58 +29,8 @@ public class InitialSystemOtherCollectData extends BaseEntity
/** 采集值 */
@Excel(name = "采集值")
private String collectValue;
public void setId(Long id)
{
this.id = id;
}
public Long getId()
{
return id;
}
public void setClientId(String clientId)
{
this.clientId = clientId;
}
public String getClientId()
{
return clientId;
}
public void setCollectType(String collectType)
{
this.collectType = collectType;
}
public String getCollectType()
{
return collectType;
}
public void setCollectValue(String collectValue)
{
this.collectValue = collectValue;
}
public String getCollectValue()
{
return collectValue;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("id", getId())
.append("clientId", getClientId())
.append("collectType", getCollectType())
.append("collectValue", getCollectValue())
.append("createTime", getCreateTime())
.append("updateTime", getUpdateTime())
.append("createBy", getCreateBy())
.append("updateBy", getUpdateBy())
.toString();
}
/** 开始时间 */
private String startTime;
/** 结束时间 */
private String endTime;
}

View File

@@ -0,0 +1,21 @@
package com.ruoyi.rocketmq.enums;
import lombok.Getter;
@Getter
public enum ServerLogoEnum {
交换卷文件的可用空间("systemSwapSizeFreeCollect", "交换卷/文件的可用空间(字节)"),
内存利用率("memoryUtilizationCollect", "内存利用率"),
可用交换空间百分比("systemSwapSizePercentCollect", "可用交换空间百分比"),
可用内存("memorySizeAvailableCollect", "可用内存"),
可用内存百分比("memorySizePercentCollect", "可用内存百分比"),
正在运行的进程数("procNumRunCollect", "正在运行的进程数"),
登录用户数("systemUsersNumCollect", "登录用户数"),
进程数("procNumCollect", "进程数");
private final String code;
private final String msg;
ServerLogoEnum(String code, String msg){
this.code = code;
this.msg = msg;
}
}

View File

@@ -1,8 +1,10 @@
package com.ruoyi.rocketmq.mapper;
import java.util.List;
import com.ruoyi.rocketmq.domain.InitialSystemOtherCollectData;
import java.util.List;
import java.util.Map;
/**
* 交换机系统其他信息采集数据Mapper接口
*
@@ -58,4 +60,11 @@ public interface InitialSystemOtherCollectDataMapper
* @return 结果
*/
public int deleteInitialSystemOtherCollectDataByIds(Long[] ids);
/**
* 获取服务器图形监控监控项基础信息
* @param initialSystemOtherCollectData
* @return
*/
Map getMonitorMsg(InitialSystemOtherCollectData initialSystemOtherCollectData);
}

View File

@@ -1,8 +1,10 @@
package com.ruoyi.rocketmq.service;
import java.util.List;
import com.ruoyi.rocketmq.domain.InitialSystemOtherCollectData;
import java.util.List;
import java.util.Map;
/**
* 交换机系统其他信息采集数据Service接口
*
@@ -58,4 +60,60 @@ public interface IInitialSystemOtherCollectDataService
* @return 结果
*/
public int deleteInitialSystemOtherCollectDataById(Long id);
/**
* 获取服务器图形监控监控项基础信息
* @param initialSystemOtherCollectData
* @return
*/
Map getMonitorMsg(InitialSystemOtherCollectData initialSystemOtherCollectData);
/**
* 查询系统登陆用户数(个)监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
Map<String, Object> systemUserNumEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData);
/**
* 查询交换卷文件的可用空间监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
Map<String, Object> systemSwapSizeFreeEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData);
/**
* 查询内存利用率监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
Map<String, Object> memoryUtilizationEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData);
/**
* 查询可用交换空间百分比监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
Map<String, Object> systemSwapSizePercentEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData);
/**
* 查询可用内存监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
Map<String, Object> memorySizeAvailableEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData);
/**
* 查询可用内存百分比监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
Map<String, Object> memorySizePercentEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData);
/**
* 查询进程数监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
Map<String, Object> procNumEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData);
}

View File

@@ -1,13 +1,20 @@
package com.ruoyi.rocketmq.service.impl;
import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.rocketmq.domain.InitialCpuInfo;
import com.ruoyi.rocketmq.domain.InitialSystemOtherCollectData;
import com.ruoyi.rocketmq.enums.ServerLogoEnum;
import com.ruoyi.rocketmq.mapper.InitialCpuInfoMapper;
import com.ruoyi.rocketmq.mapper.InitialSystemOtherCollectDataMapper;
import com.ruoyi.rocketmq.service.IInitialSystemOtherCollectDataService;
import com.ruoyi.rocketmq.utils.EchartsDataUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 交换机系统其他信息采集数据Service业务层处理
@@ -20,6 +27,8 @@ public class InitialSystemOtherCollectDataServiceImpl implements IInitialSystemO
{
@Autowired
private InitialSystemOtherCollectDataMapper initialSystemOtherCollectDataMapper;
@Autowired
private InitialCpuInfoMapper initialCpuInfoMapper;
/**
* 查询交换机系统其他信息采集数据
@@ -93,4 +102,183 @@ public class InitialSystemOtherCollectDataServiceImpl implements IInitialSystemO
{
return initialSystemOtherCollectDataMapper.deleteInitialSystemOtherCollectDataById(id);
}
/**
* 获取服务器图形监控监控项基础信息
* @param initialSystemOtherCollectData
* @return
*/
@Override
public Map getMonitorMsg(InitialSystemOtherCollectData initialSystemOtherCollectData) {
Map map = initialSystemOtherCollectDataMapper.getMonitorMsg(initialSystemOtherCollectData);
// 获取cpu数量
InitialCpuInfo cpuInfo = initialCpuInfoMapper.getCpuInfoByClientId(initialSystemOtherCollectData.getClientId());
map.put("systemCpuNum", cpuInfo.getNum());
return map;
}
/**
* 查询系统登陆用户数(个)监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData
* @return
*/
@Override
public Map<String, Object> systemUserNumEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
initialSystemOtherCollectData.setCollectType(ServerLogoEnum.登录用户数.getCode());
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
extractors.put("usersNumData", InitialSystemOtherCollectData::getCollectValue);
return EchartsDataUtils.buildEchartsData(list,InitialSystemOtherCollectData::getCreateTime, extractors);
}
/**
* 查询交换卷文件的可用空间监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData 查询参数
* @return ECharts图表数据
*/
@Override
public Map<String, Object> systemSwapSizeFreeEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
initialSystemOtherCollectData.setCollectType(ServerLogoEnum.交换卷文件的可用空间.getCode());
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
extractors.put("swapSizeFreeData", InitialSystemOtherCollectData::getCollectValue);
return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
}
/**
* 查询内存利用率监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData 查询参数
* @return ECharts图表数据
*/
@Override
public Map<String, Object> memoryUtilizationEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
initialSystemOtherCollectData.setCollectType(ServerLogoEnum.内存利用率.getCode());
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
extractors.put("memoryUtilizationData", InitialSystemOtherCollectData::getCollectValue);
return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
}
/**
* 查询可用交换空间百分比监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData 查询参数
* @return ECharts图表数据
*/
@Override
public Map<String, Object> systemSwapSizePercentEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
initialSystemOtherCollectData.setCollectType(ServerLogoEnum.可用交换空间百分比.getCode());
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
extractors.put("swapSizePercentData", InitialSystemOtherCollectData::getCollectValue);
return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
}
/**
* 查询可用内存监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData 查询参数
* @return ECharts图表数据
*/
@Override
public Map<String, Object> memorySizeAvailableEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
initialSystemOtherCollectData.setCollectType(ServerLogoEnum.可用内存.getCode());
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
extractors.put("memorySizeAvailableData", InitialSystemOtherCollectData::getCollectValue);
return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
}
/**
* 查询可用内存百分比监控信息列表并封装为多折线ECharts图表数据
* @param initialSystemOtherCollectData 查询参数
* @return ECharts图表数据
*/
@Override
public Map<String, Object> memorySizePercentEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
initialSystemOtherCollectData.setCollectType(ServerLogoEnum.可用内存百分比.getCode());
List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
extractors.put("memorySizePercentData", InitialSystemOtherCollectData::getCollectValue);
return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
}
/**
* 查询进程数监控信息列表并封装为多折线ECharts图表数据
* 包含总进程数和正在运行的进程数两条折线
* @param initialSystemOtherCollectData 查询参数
* @return ECharts图表数据
*/
@Override
public Map<String, Object> procNumEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
// 查询总进程数数据
initialSystemOtherCollectData.setCollectType(ServerLogoEnum.进程数.getCode());
List<InitialSystemOtherCollectData> procNumList = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
// 查询正在运行的进程数数据
initialSystemOtherCollectData.setCollectType(ServerLogoEnum.正在运行的进程数.getCode());
List<InitialSystemOtherCollectData> procNumRunList = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
// 先按时间排序
procNumList.sort(Comparator.comparing(InitialSystemOtherCollectData::getCreateTime));
procNumRunList.sort(Comparator.comparing(InitialSystemOtherCollectData::getCreateTime));
// 提取x轴数据以总进程数的时间为准
List<String> xData = procNumList.stream()
.map(data -> {
SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");
return sdf.format(data.getCreateTime());
})
.collect(Collectors.toList());
// 提取总进程数y轴数据
List<Object> procNumData = procNumList.stream()
.map(data -> {
try {
return Double.parseDouble(data.getCollectValue());
} catch (NumberFormatException e) {
return 0;
}
})
.collect(Collectors.toList());
// 提取正在运行的进程数y轴数据并匹配时间点
List<Object> procNumRunData = new ArrayList<>();
for (InitialSystemOtherCollectData procNumDataItem : procNumList) {
Optional<InitialSystemOtherCollectData> match = procNumRunList.stream()
.filter(procNumRun -> procNumRun.getCreateTime().equals(procNumDataItem.getCreateTime()))
.findFirst();
if (match.isPresent()) {
try {
procNumRunData.add(Double.parseDouble(match.get().getCollectValue()));
} catch (NumberFormatException e) {
procNumRunData.add(0);
}
} else {
procNumRunData.add(0); // 没有对应时间点的数据用0填充
}
}
// 构建返回数据
Map<String, Object> yData = new HashMap<>();
yData.put("procNumData", procNumData); // 总进程数数据
yData.put("procNumRunData", procNumRunData); // 正在运行的进程数数据
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("xData", xData); // 时间轴数据
resultMap.put("yData", yData); // 数值数据
return resultMap;
}
}

View File

@@ -25,6 +25,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="clientId != null and clientId != ''"> and client_id = #{clientId}</if>
<if test="collectType != null and collectType != ''"> and collect_type = #{collectType}</if>
<if test="collectValue != null and collectValue != ''"> and collect_value = #{collectValue}</if>
<if test="startTime != null and startTime != ''"> and create_time &gt;= #{startTime}</if>
<if test="endTime != null and endTime != ''"> and create_time &lt;= #{endTime}</if>
</where>
</select>
@@ -79,22 +81,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<select id="getSwitchMonitorMsg" parameterType="InitialSwitchOtherCollectData" resultType="java.util.Map">
<select id="getMonitorMsg" parameterType="InitialSystemOtherCollectData" resultType="java.util.Map">
SELECT
MAX(CASE WHEN t.collect_type = 'sysDescr' THEN t.collect_value END) as sysDescr,
MAX(CASE WHEN t.collect_type = 'sysObjectID' THEN t.collect_value END) as sysObjectID,
MAX(CASE WHEN t.collect_type = 'sysUpTime' THEN t.collect_value END) as sysUpTime,
MAX(CASE WHEN t.collect_type = 'sysContact' THEN t.collect_value END) as sysContact,
MAX(CASE WHEN t.collect_type = 'sysName' THEN t.collect_value END) as sysName,
MAX(CASE WHEN t.collect_type = 'sysLocation' THEN t.collect_value END) as sysLocation,
MAX(CASE WHEN t.collect_type = 'hwStackSystemMac' THEN t.collect_value END) as hwStackSystemMac,
MAX(CASE WHEN t.collect_type = 'entIndex' THEN t.collect_value END) as entIndex,
MAX(CASE WHEN t.collect_type = 'entPhysicalName' THEN t.collect_value END) as entPhysicalName,
MAX(CASE WHEN t.collect_type = 'entPhysicalSoftwareRev' THEN t.collect_value END) as entPhysicalSoftwareRev
FROM `initial_switch_other_collect_data` t
MAX(CASE WHEN t.collect_type = 'memorySizeTotalCollect' THEN t.collect_value END) as memorySizeTotalCollect,
MAX(CASE WHEN t.collect_type = 'systemSwOsCollect' THEN t.collect_value END) as systemSwOsCollect,
MAX(CASE WHEN t.collect_type = 'systemSwArchCollect' THEN t.collect_value END) as systemSwArchCollect,
MAX(CASE WHEN t.collect_type = 'kernelMaxprocCollect' THEN t.collect_value END) as kernelMaxprocCollect,
MAX(CASE WHEN t.collect_type = 'systemDiskSizeTotalCollect' THEN t.collect_value END) as systemDiskSizeTotalCollect,
MAX(CASE WHEN t.collect_type = 'systemBoottimeCollect' THEN t.collect_value END) as systemBoottimeCollect,
MAX(CASE WHEN t.collect_type = 'systemUnameCollect' THEN t.collect_value END) as systemUnameCollect,
MAX(CASE WHEN t.collect_type = 'systemLocaltimeCollect' THEN t.collect_value END) as systemLocaltimeCollect,
MAX(CASE WHEN t.collect_type = 'systemUptimeCollect' THEN t.collect_value END) as systemUptimeCollect
FROM `initial_system_other_collect_data` t
INNER JOIN (
SELECT client_id, MAX(create_time) as max_time
FROM `initial_switch_other_collect_data`
FROM `initial_system_other_collect_data`
WHERE client_id = #{clientId}
GROUP BY client_id
) latest ON t.client_id = latest.client_id AND t.create_time = latest.max_time