|
...
|
...
|
@@ -8,15 +8,13 @@ import com.zhonglai.luhui.api.controller.data.SensorData; |
|
|
|
import com.zhonglai.luhui.api.controller.data.TableGenerateSqlEnum;
|
|
|
|
import com.zhonglai.luhui.api.mapper.DeviceSensorDataMapper;
|
|
|
|
import com.zhonglai.luhui.dao.mapper.PublicMapper;
|
|
|
|
import com.zhonglai.luhui.datasource.config.DynamicDataSourceContextHolder;
|
|
|
|
import com.zhonglai.luhui.datasource.enums.DataSource;
|
|
|
|
import com.zhonglai.luhui.datasource.enums.DataSourceType;
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
import java.io.IOException;
|
|
|
|
import java.lang.reflect.Field;
|
|
|
|
import java.text.SimpleDateFormat;
|
|
|
|
import java.util.*;
|
|
|
|
|
|
|
|
@Service
|
|
...
|
...
|
@@ -27,7 +25,6 @@ public class DataService { |
|
|
|
@Autowired
|
|
|
|
public DeviceSensorDataMapper deviceSensorDataMapper;
|
|
|
|
|
|
|
|
@DataSource(value = DataSourceType.SLAVE)
|
|
|
|
public Map<String,Object> getViewDataBeifen(Integer dateTime,String id,String data_type)
|
|
|
|
{
|
|
|
|
|
|
...
|
...
|
@@ -273,7 +270,15 @@ public class DataService { |
|
|
|
return "取点颗粒必须是10的整数倍,并且不能小于10";
|
|
|
|
}
|
|
|
|
|
|
|
|
int nowTime = getBeforeDawnTimeMilly(DateUtils.getNowTimeMilly()); //当天凌晨时间
|
|
|
|
int nowTime = DateUtils.getBeforeDawnTimeMilly(DateUtils.getNowTimeMilly()); //当天凌晨时间
|
|
|
|
|
|
|
|
// 计算当前时间的1年后的秒
|
|
|
|
long twoYearsLater = nowTime + (365 * 24 * 60 * 60 );
|
|
|
|
|
|
|
|
if (endTime > twoYearsLater) {
|
|
|
|
response.setStatus(500);
|
|
|
|
return "只能查看1年之内的数据,要查看更多数据请联系管理员";
|
|
|
|
}
|
|
|
|
|
|
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
if(nowTime>startTime)
|
|
...
|
...
|
@@ -285,14 +290,6 @@ public class DataService { |
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
if(endTime > nowTime)
|
|
|
|
{
|
|
|
|
StringBuffer sbafter = getDeviceTimeData(deviceInfoId,dataType,new Date(endTime*1000l),interval*60);
|
|
|
|
if(null != sbafter)
|
|
|
|
{
|
|
|
|
sb.append(sbafter);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return sb.toString();
|
|
|
|
}
|
|
...
|
...
|
@@ -303,85 +300,34 @@ public class DataService { |
|
|
|
* @param dataType
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
@DataSource(value = DataSourceType.SLAVE)
|
|
|
|
public StringBuffer getBeifeiDbDeviceHistoryData(String deviceInfoId,String dataType,int startTime,int endTime,int interval)
|
|
|
|
{
|
|
|
|
DynamicDataSourceContextHolder.setDataSourceType(DataSourceType.SLAVE.name());
|
|
|
|
List<Map<String,Object>> list = publicMapper.getObjectListBySQL("SELECT count(*) ct FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='ly-device-data' and TABLE_NAME='"+deviceInfoId+"-"+dataType+"'");
|
|
|
|
List<String> tableNames = getTableNames(startTime, endTime);
|
|
|
|
// 每次查询的最大天数,超过则分批查询
|
|
|
|
int BATCH_QUERY_DAYS = 30;
|
|
|
|
|
|
|
|
if(null != list && list.size() !=0 && null != list.get(0) && null != list.get(0).get("ct") && (list.get(0).get("ct")+"").equals("1"))
|
|
|
|
if(null != tableNames && tableNames.size() !=0 && null != tableNames.get(0) )
|
|
|
|
{
|
|
|
|
list = publicMapper.getObjectListBySQL("select *,(`time` % "+interval+") asb from `ly-device-data`.`"+deviceInfoId+"-"+dataType+"` where ((`time` % "+interval+")=0 OR `value`<>'') AND `time`>="+startTime+" and `time`<="+endTime+" order by `time` asc");
|
|
|
|
|
|
|
|
if(null != list && list.size() !=0 )
|
|
|
|
{
|
|
|
|
StringBuffer sb = new StringBuffer();
|
|
|
|
|
|
|
|
List<DeviceSensorData> deviceSensorDataList = new ArrayList<>();
|
|
|
|
|
|
|
|
for(int i=0;i<list.size();i++)
|
|
|
|
{
|
|
|
|
Map<String,Object> map = list.get(i);
|
|
|
|
if(StringUtils.isNotEmpty((String)map.get("value")))
|
|
|
|
{
|
|
|
|
sb.append(map.get("time"));
|
|
|
|
sb.append(",");
|
|
|
|
sb.append(map.get("value"));
|
|
|
|
sb.append("\r\n");
|
|
|
|
}else{
|
|
|
|
String svalue = (String) map.get("value");
|
|
|
|
Long sasb = 0l;
|
|
|
|
if (i-1>=0)
|
|
|
|
{
|
|
|
|
// **分批查询**(一次最多查 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);
|
|
|
|
|
|
|
|
String object = (String) list.get(i-1).get("value");
|
|
|
|
if((Long) list.get(i-1).get("asb")!=0 && !"".equals(object)){
|
|
|
|
svalue = object;
|
|
|
|
sasb = (Long) list.get(i-1).get("asb");
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
String xvalue = (String) map.get("value");
|
|
|
|
Long xasb = 0l;
|
|
|
|
if (i+1<list.size())
|
|
|
|
{
|
|
|
|
String object = (String) list.get(i+1).get("value");
|
|
|
|
if((Long) list.get(i+1).get("asb")!=0 && !"".equals(object)){
|
|
|
|
xvalue = object;
|
|
|
|
xasb = (Long) list.get(i+1).get("asb");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if(!"".equals(svalue) && !"".equals(xvalue) )
|
|
|
|
{
|
|
|
|
if(sasb-xasb>=0)
|
|
|
|
{
|
|
|
|
sb.append(map.get("time"));
|
|
|
|
sb.append(",");
|
|
|
|
sb.append(xvalue);
|
|
|
|
sb.append("\r\n");
|
|
|
|
}else {
|
|
|
|
sb.append(map.get("time"));
|
|
|
|
sb.append(",");
|
|
|
|
sb.append(svalue);
|
|
|
|
sb.append("\r\n");
|
|
|
|
}
|
|
|
|
}else{
|
|
|
|
sb.append(map.get("time"));
|
|
|
|
sb.append(",");
|
|
|
|
sb.append( svalue+""+xvalue);
|
|
|
|
sb.append("\r\n");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
// 销毁数据源 在执行方法之后
|
|
|
|
DynamicDataSourceContextHolder.clearDataSourceType();
|
|
|
|
return sb;
|
|
|
|
List<DeviceSensorData> tempDataList = queryBatchTables(batchTables, deviceInfoId, dataType, startTime, endTime);
|
|
|
|
deviceSensorDataList.addAll(tempDataList);
|
|
|
|
}
|
|
|
|
if(null != deviceSensorDataList && deviceSensorDataList.size()!=0)
|
|
|
|
{
|
|
|
|
//间隔时间补全
|
|
|
|
Date sdate = new Date(startTime*1000l);
|
|
|
|
String day = DateUtils.parseDateToStr("yyyyMMdd",sdate);
|
|
|
|
StringBuffer stringBuffer10 = SensorData.deviceSensorDataListToIntervalCompletion(deviceSensorDataList, Integer.parseInt(sdate.getTime() / 1000 + ""), interval, day);
|
|
|
|
return stringBuffer10;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 销毁数据源 在执行方法之后
|
|
|
|
DynamicDataSourceContextHolder.clearDataSourceType();
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
...
|
...
|
@@ -466,4 +412,45 @@ public class DataService { |
|
|
|
CaseFormat toFormat = CaseFormat.LOWER_UNDERSCORE;
|
|
|
|
return fromFormat.to(toFormat, s);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 根据 startTime 和 endTime 计算查询的表名列表
|
|
|
|
*/
|
|
|
|
private List<String> getTableNames(int startTime, int endTime) {
|
|
|
|
List<String> tableNames = new ArrayList<>();
|
|
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
|
Calendar calendar = Calendar.getInstance();
|
|
|
|
calendar.setTimeInMillis((long) startTime * 1000);
|
|
|
|
|
|
|
|
while (startTime <= endTime) {
|
|
|
|
tableNames.add(TableGenerateSqlEnum.DeviceSensorData.getTableName(sdf.format(calendar.getTime())));
|
|
|
|
calendar.add(Calendar.DAY_OF_MONTH, 1);
|
|
|
|
startTime += 86400; // 加一天(秒)
|
|
|
|
}
|
|
|
|
|
|
|
|
return tableNames;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* 查询一批表的数据
|
|
|
|
*/
|
|
|
|
private List<DeviceSensorData> queryBatchTables(List<String> tableNames, String deviceInfoId, String dataType, int startTime, int endTime) {
|
|
|
|
StringBuilder sqlBuilder = new StringBuilder();
|
|
|
|
|
|
|
|
for (int i = 0; i < tableNames.size(); i++) {
|
|
|
|
if (i > 0) {
|
|
|
|
sqlBuilder.append(" UNION ALL ");
|
|
|
|
}
|
|
|
|
sqlBuilder.append("SELECT device_info_id, data_type, data_value, creat_time FROM ")
|
|
|
|
.append(tableNames.get(i))
|
|
|
|
.append(" WHERE device_info_id = '"+deviceInfoId+"' AND data_type = '"+dataType+"' AND creat_time BETWEEN "+startTime+" AND "+endTime);
|
|
|
|
}
|
|
|
|
|
|
|
|
sqlBuilder.append(" ORDER BY creat_time ASC");
|
|
|
|
|
|
|
|
// **执行 SQL 查询**
|
|
|
|
List<DeviceSensorData> deviceSensorDataList = deviceSensorDataMapper.getDeviceSensorDataList(sqlBuilder.toString());
|
|
|
|
|
|
|
|
return deviceSensorDataList;
|
|
|
|
}
|
|
|
|
} |
...
|
...
|
|