Browse Source

增加查询只有原始值的接口

2025年5月16日17:18:33
qingyuan_dev_new
lishuai 8 months ago
parent
commit
dcec5b061c
  1. 4
      common/tskv/src/main/java/com/thing/common/tskv/service/TsKvService.java
  2. 10
      common/tskv/src/main/java/com/thing/common/tskv/service/TsKvServiceImpl.java
  3. 3
      common/tskv/src/main/java/com/thing/common/tskv/service/tskv/TsKvBaseService.java
  4. 10
      common/tskv/src/main/java/com/thing/common/tskv/service/tskv/TsKvCkServiceImpl.java
  5. 60
      common/tskv/src/main/java/com/thing/common/tskv/service/tskv/TsKvMyServiceImpl.java
  6. 10
      common/tskv/src/main/java/com/thing/common/tskv/service/tskv/TsKvPgServiceImpl.java
  7. 15
      modules/thing/src/main/java/com/thing/cache/controller/CacheTsKvController.java
  8. 2
      modules/thing/src/main/java/com/thing/cache/service/TsKvHandleService.java
  9. 40
      modules/thing/src/main/java/com/thing/cache/service/impl/TsKvHandleServiceImpl.java

4
common/tskv/src/main/java/com/thing/common/tskv/service/TsKvService.java

@ -235,6 +235,8 @@ public interface TsKvService {
*/
List<TsKvDTO> findTsKvByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc);
List<TsKvDTO> findOriginalTsKvByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc);
/**
* 多设备 多属性 历史数据查询 按表名动态拼接sql
@ -284,6 +286,8 @@ public interface TsKvService {
*/
List<TsKvDTO> findTsKvByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc);
List<TsKvDTO> findOriginalTsKvByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc);
/**
* 多设备 多属性 历史聚合数据

10
common/tskv/src/main/java/com/thing/common/tskv/service/TsKvServiceImpl.java

@ -189,6 +189,11 @@ public class TsKvServiceImpl implements TsKvService {
return tsKvBaseService.findTsKvByCodesAndAttrs(codeList, attrList, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findOriginalTsKvByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc) {
return tsKvBaseService.findOriginalTsKvByCodesAndAttrs(codeList, attrList, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findTsKvByCodesAndAttrsWithTableSuffix(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc, String tableSuffix) {
return tsKvBaseService.findTsKvByCodesAndAttrsWithTableSuffix(codeList, attrList, startTime, endTime, isAsc,tableSuffix);
@ -214,6 +219,11 @@ public class TsKvServiceImpl implements TsKvService {
return tsKvBaseService.findTsKvByMultiMap(multiMap, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findOriginalTsKvByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc) {
return tsKvBaseService.findOriginalTsKvByMultiMap(multiMap, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findTsKvAggByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc, AggType agg) {
return tsKvBaseService.findTsKvAggByMultiMap(multiMap, startTime, endTime, isAsc, agg);

3
common/tskv/src/main/java/com/thing/common/tskv/service/tskv/TsKvBaseService.java

@ -138,6 +138,8 @@ public interface TsKvBaseService {
*/
List<TsKvDTO> findTsKvByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc);
List<TsKvDTO> findOriginalTsKvByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc);
/**
* 多设备 多属性 历史数据聚合查询
*
@ -175,6 +177,7 @@ public interface TsKvBaseService {
* @return list
*/
List<TsKvDTO> findTsKvByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc);
List<TsKvDTO> findOriginalTsKvByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc);
/**
* 多设备 多属性 历史聚合数据

10
common/tskv/src/main/java/com/thing/common/tskv/service/tskv/TsKvCkServiceImpl.java

@ -134,6 +134,11 @@ public class TsKvCkServiceImpl extends ServiceImpl<TsKvCkMapper, TsKvCk> impleme
return viewTsKvCkService.findTsKvByCodesAndAttrs(codeList, attrList, startTime, endTime, isAsc,"");
}
@Override
public List<TsKvDTO> findOriginalTsKvByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc) {
return null;
}
@Override
public List<TsKvDTO> findTsKvAggByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc, AggType agg) {
return viewTsKvCkService.findTsKvAggByCodesAndAttrs(codeList, attrList, startTime, endTime, isAsc, agg);
@ -154,6 +159,11 @@ public class TsKvCkServiceImpl extends ServiceImpl<TsKvCkMapper, TsKvCk> impleme
return viewTsKvCkService.findTsKvByMultiMap(multiMap, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findOriginalTsKvByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc) {
return null;
}
@Override
public List<TsKvDTO> findTsKvAggByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc, AggType agg) {
return viewTsKvCkService.findTsKvAggByMultiMap(multiMap, startTime, endTime, isAsc, agg);

60
common/tskv/src/main/java/com/thing/common/tskv/service/tskv/TsKvMyServiceImpl.java

@ -2,7 +2,6 @@ package com.thing.common.tskv.service.tskv;
import cn.hutool.core.util.ObjectUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.mybatisflex.annotation.UseDataSource;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryChain;
@ -24,7 +23,6 @@ import com.thing.common.tskv.entity.TsKvMy;
import com.thing.common.tskv.mapper.TsKvMyMapper;
import com.thing.common.tskv.service.DatabaseType;
import com.thing.common.tskv.service.TsKvNativeSQL;
import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
@ -36,7 +34,9 @@ import org.springframework.stereotype.Service;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import static com.thing.common.tskv.NativeSQLTool.*;
import static com.thing.common.util.time.DaXiaUtils.getAmEndTime;
@ -59,11 +59,11 @@ public class TsKvMyServiceImpl extends ServiceImpl<TsKvMyMapper, TsKvMy> impleme
this.eventPublisher = eventPublisher;
}
// private final Map<TimeType, String> intervalMap = Maps.newHashMap();
// private final Map<TimeType, String> intervalMap = Maps.newHashMap();
@Override
public Integer saveDTOTsKv(List<TsKvDTO> kvDTOList,String tableSuffix) {
return TsKvNativeSQL.saveDTOTsKv(kvDTOList, DatabaseType.MYSQL,tableSuffix);
public Integer saveDTOTsKv(List<TsKvDTO> kvDTOList, String tableSuffix) {
return TsKvNativeSQL.saveDTOTsKv(kvDTOList, DatabaseType.MYSQL, tableSuffix);
}
@Override
@ -179,8 +179,8 @@ public class TsKvMyServiceImpl extends ServiceImpl<TsKvMyMapper, TsKvMy> impleme
@Override
public List<TsKvDTO> findTsKvAggByCodeAndAttrs(String code, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc, AggType agg) {
try {
Method method = NativeSQLTool.class.getMethod("get" + agg + "Wrappers", Collection.class, Collection.class, Long.class, Long.class, AggType.class,DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, Lists.newArrayList(code), attrList, startTime, endTime, agg,DataBaseType.MYSQL);
Method method = NativeSQLTool.class.getMethod("get" + agg + "Wrappers", Collection.class, Collection.class, Long.class, Long.class, AggType.class, DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, Lists.newArrayList(code), attrList, startTime, endTime, agg, DataBaseType.MYSQL);
return RowUtil.toEntityList(Db.selectListBySql(sql), TsKvDTO.class);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new SysException(String.format("调用%s%s%s方法异常,请检查代码", "get", agg, "Wrappers"), e);
@ -197,8 +197,8 @@ public class TsKvMyServiceImpl extends ServiceImpl<TsKvMyMapper, TsKvMy> impleme
@Override
public PageData<TsKvDTO> findPageTsKvAggByCodeAndAttrs(String code, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc, AggType agg, Integer page, Integer limit) {
try {
Method method = NativeSQLTool.class.getMethod("get" + agg + "Wrappers", Collection.class, Collection.class, Long.class, Long.class, AggType.class,DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, Lists.newArrayList(code), attrList, startTime, endTime, agg,DataBaseType.MYSQL);
Method method = NativeSQLTool.class.getMethod("get" + agg + "Wrappers", Collection.class, Collection.class, Long.class, Long.class, AggType.class, DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, Lists.newArrayList(code), attrList, startTime, endTime, agg, DataBaseType.MYSQL);
long count = Db.selectCount(NativeSQLTool.countSql(sql, true));
return NativeSQLTool.getTsKvDTOPageData(sql, count, isAsc, page, limit);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
@ -212,11 +212,16 @@ public class TsKvMyServiceImpl extends ServiceImpl<TsKvMyMapper, TsKvMy> impleme
return this.listAs(queryWrapper, TsKvDTO.class);
}
@Override
public List<TsKvDTO> findOriginalTsKvByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc) {
return findTsKvByCodesAndAttrs(codeList, attrList, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findTsKvAggByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc, AggType agg) {
try {
Method method = NativeSQLTool.class.getMethod("get" + agg + "Wrappers", Collection.class, Collection.class, Long.class, Long.class, AggType.class,DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, codeList, attrList, startTime, endTime, agg,DataBaseType.MYSQL);
Method method = NativeSQLTool.class.getMethod("get" + agg + "Wrappers", Collection.class, Collection.class, Long.class, Long.class, AggType.class, DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, codeList, attrList, startTime, endTime, agg, DataBaseType.MYSQL);
sql = sql + " ORDER BY ts ";
if (!isAsc) {
sql = sql + " DESC";
@ -237,8 +242,8 @@ public class TsKvMyServiceImpl extends ServiceImpl<TsKvMyMapper, TsKvMy> impleme
@Override
public PageData<TsKvDTO> findPageTsKvAggByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc, AggType agg, Integer page, Integer limit) {
try {
Method method = NativeSQLTool.class.getMethod("get" + agg + "Wrappers", Collection.class, Collection.class, Long.class, Long.class, AggType.class,DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, codeList, attrList, startTime, endTime, agg,DataBaseType.MYSQL);
Method method = NativeSQLTool.class.getMethod("get" + agg + "Wrappers", Collection.class, Collection.class, Long.class, Long.class, AggType.class, DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, codeList, attrList, startTime, endTime, agg, DataBaseType.MYSQL);
long count = Db.selectCount(NativeSQLTool.countSql(sql, true));
return NativeSQLTool.getTsKvDTOPageData(sql, count, isAsc, page, limit);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
@ -252,11 +257,16 @@ public class TsKvMyServiceImpl extends ServiceImpl<TsKvMyMapper, TsKvMy> impleme
return this.listAs(queryChain.toQueryWrapper(), TsKvDTO.class);
}
@Override
public List<TsKvDTO> findOriginalTsKvByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc) {
return findTsKvByMultiMap(multiMap, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findTsKvAggByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc, AggType agg) {
try {
Method method = NativeSQLTool.class.getMethod("get" + agg + "MapWrapper", Map.class, Long.class, Long.class, AggType.class,DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, multiMap, startTime, endTime, agg,DataBaseType.MYSQL);
Method method = NativeSQLTool.class.getMethod("get" + agg + "MapWrapper", Map.class, Long.class, Long.class, AggType.class, DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, multiMap, startTime, endTime, agg, DataBaseType.MYSQL);
return RowUtil.toEntityList(Db.selectListBySql(sql), TsKvDTO.class);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
throw new SysException(String.format("调用%s%s%s方法异常,请检查代码", "get", agg, "MapWrapper"), e);
@ -273,8 +283,8 @@ public class TsKvMyServiceImpl extends ServiceImpl<TsKvMyMapper, TsKvMy> impleme
@Override
public PageData<TsKvDTO> findPageTsKvAggByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc, AggType agg, Integer page, Integer limit) {
try {
Method method = NativeSQLTool.class.getMethod("get" + agg + "MapWrapper", Map.class, Long.class, Long.class, AggType.class,DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, multiMap, startTime, endTime, agg,DataBaseType.MYSQL);
Method method = NativeSQLTool.class.getMethod("get" + agg + "MapWrapper", Map.class, Long.class, Long.class, AggType.class, DataBaseType.class);
String sql = (String) method.invoke(NativeSQLTool.class, multiMap, startTime, endTime, agg, DataBaseType.MYSQL);
long count = Db.selectCount(NativeSQLTool.countSql(sql, true));
return NativeSQLTool.getTsKvDTOPageData(sql, count, isAsc, page, limit);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
@ -335,33 +345,33 @@ public class TsKvMyServiceImpl extends ServiceImpl<TsKvMyMapper, TsKvMy> impleme
QueryWrapper queryWrapper = QueryWrapper.create();
queryWrapper.in(TsKvMy::getAttrKey, attrList, CollectionUtils.isNotEmpty(attrList))
.in(TsKvMy::getThingCode, codeList, CollectionUtils.isNotEmpty(codeList))
.in(TsKvMy::getTs,timeList,CollectionUtils.isNotEmpty(timeList));
.in(TsKvMy::getTs, timeList, CollectionUtils.isNotEmpty(timeList));
queryWrapper.orderBy(TsKvMy::getTs, isAsc);
return mapper.selectListByQueryAs(queryWrapper,TsKvDTO.class);
return mapper.selectListByQueryAs(queryWrapper, TsKvDTO.class);
}
@Override
public Integer deleteTskv(TsKvDTO kvDTO) {
String delSql = NativeSQLTool.deleteTskvSql(kvDTO);
return Db.deleteBySql(delSql);
return Db.deleteBySql(delSql);
}
@Override
public Integer deleteLastTskv(TsKvDTO kvDTO) {
String delSql = NativeSQLTool.deleteLastTskvSql(kvDTO);
return Db.deleteBySql(delSql);
return Db.deleteBySql(delSql);
}
@Override
public List<TsKvDTO> findTsKvByCodesAndAttrsWithTableSuffix(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc, String tableSuffix) {
StringBuilder sql = new StringBuilder(" SELECT thing_code,attr_key,ts,val FROM thing_ts_kv");
sql.append(tableSuffix);
NativeSQLTool.spliceCodesAndAttrsSql(codeList,attrList,sql,startTime,endTime);
NativeSQLTool.spliceCodesAndAttrsSql(codeList, attrList, sql, startTime, endTime);
sql.append(" ORDER BY ts ");
if(!isAsc){
if (!isAsc) {
sql.append(" DESC ");
}
return RowUtil.toEntityList(Db.selectListBySql(sql.toString()),TsKvDTO.class);
return RowUtil.toEntityList(Db.selectListBySql(sql.toString()), TsKvDTO.class);
}
private PageData<TsKvDTO> getTsKvDTOPageIntervalData(Integer page, Integer limit, long count, String sql) {

10
common/tskv/src/main/java/com/thing/common/tskv/service/tskv/TsKvPgServiceImpl.java

@ -203,6 +203,11 @@ public class TsKvPgServiceImpl extends ServiceImpl<TsKvPgMapper, TsKvPg> impleme
return this.listAs(queryWrapper, TsKvDTO.class);
}
@Override
public List<TsKvDTO> findOriginalTsKvByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc) {
return findTsKvByCodesAndAttrs(codeList, attrList, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findTsKvAggByCodesAndAttrs(Collection<String> codeList, Collection<String> attrList, Long startTime, Long endTime, Boolean isAsc, AggType agg) {
try {
@ -243,6 +248,11 @@ public class TsKvPgServiceImpl extends ServiceImpl<TsKvPgMapper, TsKvPg> impleme
return this.listAs(queryChain.toQueryWrapper(), TsKvDTO.class);
}
@Override
public List<TsKvDTO> findOriginalTsKvByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc) {
return findTsKvByMultiMap(multiMap, startTime, endTime, isAsc);
}
@Override
public List<TsKvDTO> findTsKvAggByMultiMap(Map<String, Collection<String>> multiMap, Long startTime, Long endTime, Boolean isAsc, AggType agg) {
try {

15
modules/thing/src/main/java/com/thing/cache/controller/CacheTsKvController.java

@ -56,6 +56,21 @@ public class CacheTsKvController {
return new Result<PageData<TsKvDTO>>().ok(page);
}
@GetMapping("list")
@Operation(summary = "列表")
@Parameters({
@Parameter(name = Constant.ORDER_FIELD, description = "排序字段"),
@Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)"),
@Parameter(name = "thingCodeList", description = "物编码list"),
@Parameter(name = "thingAttrList", description = "物属性list"),
@Parameter(name = "beginTime", description = "开始时间"),
@Parameter(name = "endTime", description = "结束时间")
})
public Result<List<TsKvDTO>> list(@RequestParam Map<String, Object> params) {
List<TsKvDTO> list = tsKvHandleService.list(params);
return new Result<List<TsKvDTO>>().ok(list);
}
@GetMapping("{thingCode}/{attrKey}/{ts}")
@Operation(summary="信息")

2
modules/thing/src/main/java/com/thing/cache/service/TsKvHandleService.java

@ -21,6 +21,8 @@ public interface TsKvHandleService {
PageData<TsKvDTO> page(Map<String, Object> params);
List<TsKvDTO> list(Map<String, Object> params);
CacheTsKvDTO get(String thingCode, String key, Long ts);
void save(TsKvModifyForm dto);

40
modules/thing/src/main/java/com/thing/cache/service/impl/TsKvHandleServiceImpl.java

@ -20,6 +20,7 @@ import com.thing.common.core.web.response.Result;
import com.thing.common.data.tskv.TsKvDTO;
import com.thing.common.tskv.event.TsKvEvent;
import com.thing.common.tskv.service.TsKvService;
import com.thing.common.tskv.service.tskv.TsKvBaseService;
import com.thing.queue.util.Topics;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
@ -35,7 +36,6 @@ import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author zhenghh. 2022-09-15
@ -48,6 +48,9 @@ public class TsKvHandleServiceImpl implements TsKvHandleService {
private TsKvService tsKvService;
@Resource
private ApplicationEventPublisher publisher;
@Resource
private TsKvBaseService tsKvBaseService;
/**
* 分页查询
*
@ -72,6 +75,41 @@ public class TsKvHandleServiceImpl implements TsKvHandleService {
}
}
@Override
public List<TsKvDTO> list(Map<String, Object> params) {
List<String> thingCodeList = MapUtil.get(params, "thingCodeList", List.class);
List<String> atterList = MapUtil.get(params, "thingAttrList", List.class);
Long startTime = MapUtil.getLong(params, "beginTime");
Long endTime = MapUtil.getLong(params, "endTime");
if (StringUtils.isNotBlank((String) params.get("beginTime"))) {
List<TsKvDTO> list = tsKvService.findOriginalTsKvByCodesAndAttrs(thingCodeList, atterList, startTime, endTime, Boolean.FALSE);
if(!CollectionUtils.isEmpty(list)) {
return list.stream().filter(s->
!s.getAttrKey().endsWith("am")
&& !s.getAttrKey().endsWith("hh")
&& !s.getAttrKey().endsWith("dd")
&& !s.getAttrKey().endsWith("mm")
&& !s.getAttrKey().endsWith("yy")).toList();
}
return Lists.newArrayList();
} else {
Map<String, Collection<String>> queryMap = new HashMap<>();
if (thingCodeList != null) {
thingCodeList.forEach(temp -> queryMap.put(temp, atterList));
}
List<TsKvDTO> list = tsKvService.findOriginalTsKvByMultiMap(queryMap, startTime, endTime, Boolean.FALSE);
if(!CollectionUtils.isEmpty(list)) {
return list.stream().filter(s->
!s.getAttrKey().endsWith("am")
&& !s.getAttrKey().endsWith("hh")
&& !s.getAttrKey().endsWith("dd")
&& !s.getAttrKey().endsWith("mm")
&& !s.getAttrKey().endsWith("yy")).toList();
}
return Lists.newArrayList();
}
}
@Override
public CacheTsKvDTO get(String thingCode, String key, Long ts) {
List<TsKvDTO> tsKvByCodeAndAttr = tsKvService.findTsKvByCodeAndAttr(thingCode, key, ts, ts, false);

Loading…
Cancel
Save