作者 钟来

添加兼容wifi设备数据查询指定设备类型

... ... @@ -63,7 +63,7 @@ public class SensorDataController {
public AjaxResult getDeviceOriginalData(
@ApiParam(name = "startTime", value = "开始时间(时间戳)", required = true) @RequestParam(name = "startTime") int startTime,
@ApiParam(name = "endTime", value = "结束时间(时间戳)", required = true) @RequestParam(name = "endTime") int endTime,
@ApiParam(name = "deviceInfoId", value = "设备信息表id/imei号", required = true) @RequestParam(name = "id") String id,
@ApiParam(name = "id", value = "设备信息表id/imei号", required = true) @RequestParam(name = "id") String id,
String dataType,Integer interval) throws IOException {
Map<String,StringBuffer> map = dataService.getBeifeiDbDeviceHistoryDataByDeviceId( id, dataType, startTime, endTime,interval);
... ...
... ... @@ -343,15 +343,43 @@ public class DataService {
List<Map<String, Object>> tempDataList = queryDeviceIdAndDataType(deviceId, startTime, endTime); //获取设备id和数据类型
if(null != tempDataList && tempDataList.size()!=0)
{
Map<String,String> dataTypeMap = new HashMap<>();
if (StringUtils.isEmpty(dataType))
{
List<Map<String, Object>> dataTpyeList = queryDeviceIdAndDefaultDataType(deviceId, startTime, endTime);
for (Map<String, Object> map:dataTpyeList)
{
String device_info_id = map.get("device_info_id")+"";
String all_data_value = map.get("all_data_value")+"";
if(!dataTypeMap.containsKey(device_info_id))
{
dataTypeMap.put(device_info_id,"");
}
if(StringUtils.isNotEmpty(all_data_value))
{
for (String data_value:all_data_value.split(","))
{
dataTypeMap.put(device_info_id,dataTypeMap.get(device_info_id)+","+deviceTypeToDataTypeMap.get(data_value));
}
}
}
}
Map<String,StringBuffer> deviceAndDataTypeDataMap = new HashMap();
for(Map<String, Object> deviceAndDataTypeMap:tempDataList) //遍历设备id和数据类型,获取曲线数据
{
String deviceInfoId = deviceAndDataTypeMap.get("device_info_id")+"";
String dbDataType = deviceAndDataTypeMap.get("data_type")+"";
if (StringUtils.isNotEmpty(dataType) && !((","+dataType+",").indexOf(dbDataType+",")>=0)) ///数据类型过滤
{
continue;
}
if (StringUtils.isEmpty(dataType) && !((","+dataTypeMap.get(deviceInfoId)+",").indexOf(dbDataType+",")>=0)) ///数据类型过滤
{
continue;
}
String key = deviceInfoId+"-"+dbDataType;
if (!deviceAndDataTypeDataMap.containsKey(key))
{
... ... @@ -410,6 +438,30 @@ public class DataService {
return null;
}
public List<Map<String, Object>> queryDeviceIdAndDefaultDataType(String deviceId,int startTime,int endTime)
{
List<String> tableNames = getTableNames(startTime, endTime);
// 每次查询的最大天数,超过则分批查询
int BATCH_QUERY_DAYS = 30;
if(null != tableNames && tableNames.size() !=0 && null != tableNames.get(0) )
{
List<Map<String, Object>> deviceSensorDataList = new ArrayList<>();
// **分批查询**(一次最多查 30 天)
for (int i = 0; i < tableNames.size(); i += BATCH_QUERY_DAYS) {
int batchStart = i;
int batchEnd = Math.min(i + BATCH_QUERY_DAYS, tableNames.size());
List<String> batchTables = tableNames.subList(batchStart, batchEnd);
List<Map<String, Object>> tempDataList = queryDeviceIdAndDataTypeIsTypes(batchTables, deviceId, startTime, endTime);
deviceSensorDataList.addAll(tempDataList);
}
return deviceSensorDataList;
}
return null;
}
/**
* 获取数据指定天的数据
*
... ... @@ -560,6 +612,47 @@ public class DataService {
return publicMapper.getObjectListBySQL(finalSql);
}
/**
* 在指定时间范围内,查询出所有表中出现过的设备ID和数据类型的对应关系
*/
private List<Map<String, Object>> queryDeviceIdAndDataTypeIsTypes(List<String> tableNames, String deviceId, int startTime, int endTime) {
StringBuilder sqlBuilder = new StringBuilder(" SELECT\n" +
"device_info_id,\n" +
"data_value,\n" +
"MIN(creat_time) AS creat_time FROM (");
for (int i = 0; i < tableNames.size(); i++) {
if (i > 0) {
sqlBuilder.append(" UNION ALL ");
}
sqlBuilder.append("SELECT device_info_id, data_value, creat_time FROM ")
.append(tableNames.get(i))
.append(" WHERE device_info_id LIKE '").append(deviceId).append("%'")
.append(" AND creat_time BETWEEN ").append(startTime).append(" AND ").append(endTime).append(" AND data_type = 'type'");
}
sqlBuilder.append(") u GROUP BY device_info_id, data_value");
// 外层去重并排序(防止重复)
String finalSql = "SELECT device_info_id, GROUP_CONCAT(data_value ORDER BY creat_time SEPARATOR ',') AS all_data_value FROM (" + sqlBuilder + ") t GROUP BY device_info_id ORDER BY device_info_id";
return publicMapper.getObjectListBySQL(finalSql);
}
private static Map<String,String> deviceTypeToDataTypeMap = new HashMap<>();
static {
deviceTypeToDataTypeMap.put("1", "ecus,wt");
deviceTypeToDataTypeMap.put("2", "ecms,wt");
deviceTypeToDataTypeMap.put("3", "pH,wt");
deviceTypeToDataTypeMap.put("4", "orp");
deviceTypeToDataTypeMap.put("5", "wt,dom,dop");
deviceTypeToDataTypeMap.put("6", "nh3n,wt");
deviceTypeToDataTypeMap.put("7", "td,wt");
deviceTypeToDataTypeMap.put("8", "sal,wt");
deviceTypeToDataTypeMap.put("9", "cod,wt");
deviceTypeToDataTypeMap.put("10", "cl2,wt");
deviceTypeToDataTypeMap.put("11", "chl,wt");
deviceTypeToDataTypeMap.put("12", "bga,wt");
deviceTypeToDataTypeMap.put("13", "tp,wt");
deviceTypeToDataTypeMap.put("14", "ss,wt");
deviceTypeToDataTypeMap.put("15", "oiw,wt");
deviceTypeToDataTypeMap.put("16", "yw");
}
}
... ...