Commit 374e6f04 authored by huangcb's avatar huangcb

1.增加时序数据库TimescaleDB组件;2.创建模型/删除模型时,创建时序数据库表/删除时序数据表;3.增加模型实例功能接口;

parent 0a87cf26
...@@ -60,6 +60,10 @@ ...@@ -60,6 +60,10 @@
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${alibaba-nacos-config.version}</version> <version>${alibaba-nacos-config.version}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId> <artifactId>spring-boot-starter-cache</artifactId>
...@@ -100,6 +104,10 @@ ...@@ -100,6 +104,10 @@
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.baomidou</groupId> <groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
......
package com.esv.datacenter.iot.common.component;
import lombok.Data;
/**
* @description: 数据源配置
* @author: huangchaobin@esvtek.com
* @createTime: 2020/07/27 13:48
* @version:1.0
*/
@Data
public class DataSourceConfig {
/**
*
*/
private String jdbcUrl;
/**
*
*/
private String driverClassName;
/**
*
*/
private String username;
/**
*
*/
private String password;
/**
*
*/
private String validationQuery;
/**
* 数据库连接超时时间,默认30秒,即30000
*/
private Long connectionTimeout;
/**
* 连接池中维护的最小空闲连接数
*/
private Integer minimumIdle;
/**
* 连接池中最大连接数,包括闲置和使用中的连接
*/
private Integer maximumPoolSize;
/**
* connection在连接池中的存活时间,默认是1800000,即30分钟。如果设置为0,表示存活时间无限大
*/
private Long maxLifetime;
public DataSourceConfig(String jdbcUrl, String driverClassName, String username, String password) {
this.jdbcUrl = jdbcUrl;
this.driverClassName = driverClassName;
this.username = username;
this.password = password;
}
public DataSourceConfig(String jdbcUrl, String driverClassName, String username, String password,
String validationQuery, Long connectionTimeout, Integer minimumIdle,
Integer maximumPoolSize, Long maxLifetime) {
this.jdbcUrl = jdbcUrl;
this.driverClassName = driverClassName;
this.username = username;
this.password = password;
this.validationQuery = validationQuery;
this.connectionTimeout = connectionTimeout;
this.minimumIdle = minimumIdle;
this.maximumPoolSize = maximumPoolSize;
this.maxLifetime = maxLifetime;
}
}
package com.esv.datacenter.iot.common.component;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.support.TransactionTemplate;
/**
* @description: 根据数据源配置信息,动态获取数据源
* @author: huangchaobin@esvtek.com
* @createTime: 2020/07/27 13:55
* @version:1.0
*/
@Component
@Slf4j
public class DynamicDataSource {
/**
* @description 获取数据源(无事务)
* 注意:一定要执行 dataSource.close();
* @param dataSourceConfig:
* @return com.zaxxer.hikari.HikariDataSource
* @author huangChaobin@esvtek.com
* @createTime 2020/07/27 14:01
**/
public HikariDataSource getDynamicDataSource(DataSourceConfig dataSourceConfig) {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(dataSourceConfig.getJdbcUrl());
dataSource.setDriverClassName(dataSourceConfig.getDriverClassName());
dataSource.setUsername(dataSourceConfig.getUsername());
dataSource.setPassword(dataSourceConfig.getPassword());
dataSource.setConnectionTestQuery(dataSourceConfig.getValidationQuery());
dataSource.setConnectionTimeout(dataSourceConfig.getConnectionTimeout());
dataSource.setMinimumIdle(dataSourceConfig.getMinimumIdle());
dataSource.setMaximumPoolSize(dataSourceConfig.getMaximumPoolSize());
dataSource.setMaxLifetime(dataSourceConfig.getMaxLifetime());
return dataSource;
}
/**
* @description 获取数据源(有事务)
* 注意:一定要执行 dataSource.close();
* @param dataSourceConfig:
* @return com.zaxxer.hikari.HikariDataSource
* @author huangChaobin@esvtek.com
* @createTime 2020/07/27 14:02
**/
public HikariDataSource getDynamicDataSource4Transaction(DataSourceConfig dataSourceConfig) {
HikariDataSource dataSource = this.getDynamicDataSource(dataSourceConfig);
// 事务的使用
PlatformTransactionManager txManager = new DataSourceTransactionManager(dataSource);
TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);
// 回滚的方法
transactionTemplate.execute(transactionStatus -> {
transactionStatus.setRollbackOnly();
return null;
});
return dataSource;
}
}
package com.esv.datacenter.iot.common.component;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.esv.datacenter.iot.common.util.FeignUtils;
import com.esv.datacenter.iot.feign.FeignBaseService;
import com.esv.datacenter.iot.module.omodel.dto.ModelAndInstanceDto;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelEntity;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelPropertyEntity;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/03 14:19
* @version:1.0
*/
@Component
@RefreshScope
@Slf4j
public class TimescaleComponent {
@Value("${timescale.data-source.jdbc-url}")
private String jdbcUrl;
@Value("${timescale.data-source.driver-class-name}")
private String driverClassName;
@Value("${timescale.data-source.validation-query}")
private String validationQuery;
@Value("${timescale.data-source.username}")
private String username;
@Value("${timescale.data-source.password}")
private String password;
@Value("${timescale.data-source.connection-timeout}")
private Long connectionTimeout;
@Value("${timescale.data-source.minimum-idle}")
private Integer minimumIdle;
@Value("${timescale.data-source.maximum-pool-size}")
private Integer maximumPoolSize;
@Value("${timescale.data-source.max-lifetime}")
private Long maxLifetime;
@Value("${timescale.table-field.map}")
private String tableFieldMap;
@Value("${timescale.table-prefix}")
private String tablePrefix;
@Autowired
private DynamicDataSource dynamicDataSource;
@Autowired
private FeignBaseService feignBaseService;
/**
* @description 创建表
* @param modelAndInstanceDto:
* @return java.lang.Boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 14:22
**/
public Boolean createTable(ModelAndInstanceDto modelAndInstanceDto) {
HikariDataSource dataSource = this.getHikariDataSource4Transaction();
// 表名
ObjectModelEntity modelEntity = modelAndInstanceDto.getObjectModelEntity();
List<ObjectModelPropertyEntity> propertyEntityList = modelAndInstanceDto.getObjectModelPropertyEntityList();
String table = tablePrefix + modelEntity.getId();
try {
// 校验表名是否已存在
if (checkTableExits(dataSource, table)) {
log.warn("创建表失败,表[{}]已存在", table);
return false;
}
// 获取建表SQL及超表SQL
String tableSql = this.generateCreateTableSql(table, propertyEntityList);
log.info("建表SQL:{}", tableSql);
String indexSql = this.generateTableIndexSql(table);
log.info("表索引SQL:{}", indexSql);
String hyperSql = this.generateHyperTableSql(table);
log.info("超表SQL:{}", hyperSql);
// 使用jdbcTemplate来执行sql
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute(tableSql);
jdbcTemplate.execute(indexSql);
jdbcTemplate.execute(hyperSql);
log.info("建表[{}]成功", table);
} catch (Exception e) {
log.error("建表[{}]失败", table);
log.error(e.getMessage(), e);
return false;
} finally {
// 关闭数据源
if (Objects.nonNull(dataSource) && !dataSource.isClosed()) {
dataSource.close();
}
}
return true;
}
/**
* @description
* @param modelId:
* @return java.lang.Boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 17:10
**/
public Boolean dropTable(Long modelId) {
HikariDataSource dataSource = this.getHikariDataSource4Transaction();
String table = tablePrefix + modelId;
try {
// 校验表名是否已存在
if (!checkTableExits(dataSource, table)) {
log.warn("删除表失败,表[{}]不存在", table);
return false;
}
// 获取删除表SQL
String deleteTableSql = this.generateDeleteTableSql(table);
log.info("删除表SQL:{}", deleteTableSql);
// 使用jdbcTemplate来执行sql
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute(deleteTableSql);
log.info("删除表[{}]成功", table);
} catch (Exception e) {
log.error("删除表[{}]失败", table);
log.error(e.getMessage(), e);
return false;
} finally {
// 关闭数据源
if (Objects.nonNull(dataSource) && !dataSource.isClosed()) {
dataSource.close();
}
}
return true;
}
private String generateCreateTableSql(String table, List<ObjectModelPropertyEntity> propertyEntityList) {
// 获取字典表数据
String dictType = "col_type";
Map<Integer, String> dictMap = this.getDictMap(dictType);
// 获取表字段映射
Map<String, String> fieldMap = this.getTableFieldMap();
// 生成SQL
StringBuffer sb = new StringBuffer();
sb.append("create table if not exists ").append(table).append("(")
.append("time TIMESTAMPTZ NOT NULL,")
.append("instance_id int8 NULL");
for (ObjectModelPropertyEntity propertyEntity : propertyEntityList) {
sb.append(",");
sb.append(propertyEntity.getPropertyCode()).append(" ");
sb.append(fieldMap.get(dictMap.get(propertyEntity.getPropertyType()))).append(" NULL");
}
sb.append(");");
return sb.toString();
}
private String generateTableIndexSql(String table) {
StringBuffer sb = new StringBuffer();
sb.append("CREATE INDEX ")
.append(table)
.append("_instance_id_idx ON ")
.append(table)
.append(" (instance_id);");
return sb.toString();
}
private String generateHyperTableSql(String table) {
StringBuffer sb = new StringBuffer();
sb.append("SELECT create_hypertable('")
.append(table).append("', 'time');");
return sb.toString();
}
private Boolean checkTableExits(HikariDataSource dataSource, String table) {
StringBuffer sb = new StringBuffer();
sb.append("select t1.tablename")
.append(" from pg_tables t1, pg_class t2")
.append(" where t1.tablename like '")
.append(tablePrefix)
.append("_%' and t1.tablename = t2.relname")
.append(" order by t1.tablename desc");
String sql = sb.toString();
// 使用jdbcTemplate来执行sql
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<Map<String, Object>> resultMapList = jdbcTemplate.queryForList(sql);
for (Map<String, Object> map : resultMapList) {
if (table.equals(String.valueOf(map.get("tablename")))) {
return true;
}
}
return false;
}
private String generateDeleteTableSql(String table) {
StringBuffer sb = new StringBuffer();
sb.append("drop table if exists ").append(table).append(";");
return sb.toString();
}
private HikariDataSource getHikariDataSource() {
HikariDataSource dataSource = this.dynamicDataSource.getDynamicDataSource(initDataSourceConfig());
return dataSource;
}
private HikariDataSource getHikariDataSource4Transaction() {
HikariDataSource dataSource = this.dynamicDataSource.getDynamicDataSource4Transaction(initDataSourceConfig());
return dataSource;
}
private DataSourceConfig initDataSourceConfig() {
DataSourceConfig dataSourceConfig = new DataSourceConfig(jdbcUrl, driverClassName, username, password,
validationQuery, connectionTimeout, minimumIdle, maximumPoolSize, maxLifetime);
return dataSourceConfig;
}
private Map<String, String> getTableFieldMap() {
Map<String, String> fieldMap = new HashMap<>(32);
String[] fields = tableFieldMap.split(",");
for (String field : fields) {
fieldMap.put(field.split("-")[0], field.split("-")[1]);
}
return fieldMap;
}
private Map<Integer, String> getDictMap(String dictType) {
JSONObject feignReqJson = new JSONObject();
feignReqJson.put("type", dictType);
JSONObject feignResultJson = feignBaseService.getDict(feignReqJson);
JSONArray dataJsonArray = FeignUtils.getFeignResultDataList(feignResultJson);
JSONArray dictArray = new JSONArray();
for (int i = 0; i < dataJsonArray.size(); i++) {
if (dictType.equals(dataJsonArray.getJSONObject(i).getString("type"))) {
dictArray = dataJsonArray.getJSONObject(i).getJSONArray("dictList");
break;
}
}
Map<Integer, String> dictMap = new HashMap<>(32);
for (int i = 0; i < dictArray.size(); i++) {
dictMap.put(dictArray.getJSONObject(i).getInteger("code"), dictArray.getJSONObject(i).getString("name"));
}
return dictMap;
}
}
package com.esv.datacenter.iot.common.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.esv.datacenter.iot.common.constants.CommonConstants;
import com.esv.datacenter.iot.common.exception.EException;
import lombok.extern.slf4j.Slf4j;
/**
* @description: Feign工具类
* @author: 黄朝斌
* @email: huangchaobin@esvtek.com
* @createTime: 2020/04/17 18:05
* @version:1.0
*/
@Slf4j
public class FeignUtils {
/**
* description 获取Feign调用结果数据
* param [resultJson]
* return com.alibaba.fastjson.JSONObject
* author Administrator
* createTime 2020/04/17 18:12
**/
public static JSONObject getFeignResultData(JSONObject resultJson) throws EException {
String result = resultJson.toJSONString();
log.info(result);
if (CommonConstants.FEIGN_RESULT_SUCCESS == resultJson.getIntValue(CommonConstants.FEIGN_RESULT_CODE)) {
return resultJson.getJSONObject(CommonConstants.FEIGN_RESULT_DATA);
} else {
throw new EException(resultJson.getIntValue(CommonConstants.FEIGN_RESULT_CODE), resultJson.getString(CommonConstants.FEIGN_RESULT_MESSAGE));
}
}
/**
* @description 获取Feign调用结果数据
* @param resultJson:
* @return com.alibaba.fastjson.JSONArray
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 16:34
**/
public static JSONArray getFeignResultDataList(JSONObject resultJson) throws EException {
String result = resultJson.toJSONString();
log.info(result);
if (CommonConstants.FEIGN_RESULT_SUCCESS == resultJson.getIntValue(CommonConstants.FEIGN_RESULT_CODE)) {
return resultJson.getJSONArray(CommonConstants.FEIGN_RESULT_DATA);
} else {
throw new EException(resultJson.getIntValue(CommonConstants.FEIGN_RESULT_CODE), resultJson.getString(CommonConstants.FEIGN_RESULT_MESSAGE));
}
}
}
package com.esv.datacenter.iot.common.validator.groups;
import javax.validation.groups.Default;
/**
* @description: 参数校验分组:分页查询
* @author: 黄朝斌
* @email: huangchaobin@esvtek.com
* @createTime: 2020/08/03 09:30
* @version:1.0
*/
public interface ValidatorPage extends Default {
}
package com.esv.datacenter.iot.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
/**
* @description: Feign接口配置
* @author: 黄朝斌
* @email: huangchaobin@esvtek.com
* @createTime: 2020/04/17 18:00
* @version:1.0
*/
@EnableFeignClients(basePackages = "com.esv.datacenter.iot.feign")
@Configuration
@Slf4j
public class FeignConfigure {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
package com.esv.datacenter.iot.feign;
import com.alibaba.fastjson.JSONObject;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/03 15:38
* @version:1.0
*/
@FeignClient("${feign-base-service-name}")
public interface FeignBaseService {
/**
* @description 获取字典数据
* @param bodyJson:
* @return com.alibaba.fastjson.JSONObject
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 15:43
**/
@PostMapping(value = "/base/dict/get")
JSONObject getDict(JSONObject bodyJson);
}
...@@ -7,11 +7,11 @@ import com.esv.datacenter.iot.common.response.ECode; ...@@ -7,11 +7,11 @@ import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.response.EResponse; import com.esv.datacenter.iot.common.response.EResponse;
import com.esv.datacenter.iot.common.util.ReqUtils; import com.esv.datacenter.iot.common.util.ReqUtils;
import com.esv.datacenter.iot.common.validator.groups.*; import com.esv.datacenter.iot.common.validator.groups.*;
import com.esv.datacenter.iot.module.omodel.form.ModelInstanceForm;
import com.esv.datacenter.iot.module.omodel.form.ModelPropertyForm; import com.esv.datacenter.iot.module.omodel.form.ModelPropertyForm;
import com.esv.datacenter.iot.module.omodel.form.ObjectModelForm; import com.esv.datacenter.iot.module.omodel.form.ObjectModelForm;
import com.esv.datacenter.iot.module.omodel.service.ObjectModelInstanceService; import com.esv.datacenter.iot.module.omodel.service.ObjectModelInstanceService;
import com.esv.datacenter.iot.module.omodel.service.ObjectModelService; import com.esv.datacenter.iot.module.omodel.service.ObjectModelService;
import com.esv.gateway.common.DataPermsType;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -59,6 +59,8 @@ public class ObjectModelController { ...@@ -59,6 +59,8 @@ public class ObjectModelController {
ReqUtils.checkParamsNotBlank(JSON.parseObject(property.toString()), notBlandParams); ReqUtils.checkParamsNotBlank(JSON.parseObject(property.toString()), notBlandParams);
}); });
// TODO,参数校验:模型属性是否数据库保留字段
Long id = objectModelService.createObjectModel(form); Long id = objectModelService.createObjectModel(form);
JSONObject data = new JSONObject(); JSONObject data = new JSONObject();
data.put("id", id); data.put("id", id);
...@@ -75,11 +77,11 @@ public class ObjectModelController { ...@@ -75,11 +77,11 @@ public class ObjectModelController {
**/ **/
@PostMapping("/list") @PostMapping("/list")
public EResponse list(@RequestBody @Validated(ValidatorList.class) ObjectModelForm form) throws EException { public EResponse list(@RequestBody @Validated(ValidatorList.class) ObjectModelForm form) throws EException {
if (!DataPermsType.DATA_PERM_ALL.equals(ReqUtils.getRequestDataPerm())) { String modelName = StringUtils.trimToNull(form.getName());
form.setTenantId(ReqUtils.getRequestTenantId()); if (Objects.nonNull(modelName)) {
} form.setName("%" + modelName + "%");
if (Objects.nonNull(StringUtils.trimToNull(form.getName()))) { } else {
form.setName("%" + form.getName() + "%"); form.setName(null);
} }
return EResponse.ok(objectModelService.getModel4Page(form)); return EResponse.ok(objectModelService.getModel4Page(form));
} }
...@@ -156,6 +158,28 @@ public class ObjectModelController { ...@@ -156,6 +158,28 @@ public class ObjectModelController {
return EResponse.ok(objectModelInstanceService.getModelInstanceList(form.getId())); return EResponse.ok(objectModelInstanceService.getModelInstanceList(form.getId()));
} }
/**
* @description 分页查询指定模型的实例列表
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 10:06
**/
@PostMapping("/getModelInstance4Page")
public EResponse getModelInstance4Page(@RequestBody @Validated(ValidatorList.class) ModelInstanceForm form) throws EException {
// 校验模型ID是否有效
this.checkIsValidModelId(form.getModelId());
String instanceName = StringUtils.trimToNull(form.getInstanceName());
if (Objects.nonNull(instanceName)) {
form.setInstanceName("%" + instanceName + "%");
} else {
form.setInstanceName(null);
}
return EResponse.ok(objectModelInstanceService.getModelInstance4Page(form));
}
/** /**
* @description 校验模型ID是否有效 * @description 校验模型ID是否有效
* @param modelId: * @param modelId:
......
package com.esv.datacenter.iot.module.omodel.controller;
import com.alibaba.fastjson.JSONObject;
import com.esv.datacenter.iot.common.exception.EException;
import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.response.EResponse;
import com.esv.datacenter.iot.common.validator.groups.ValidatorDelete;
import com.esv.datacenter.iot.common.validator.groups.ValidatorDetail;
import com.esv.datacenter.iot.common.validator.groups.ValidatorInsert;
import com.esv.datacenter.iot.module.omodel.form.ModelInstanceForm;
import com.esv.datacenter.iot.module.omodel.service.ObjectModelInstanceService;
import com.esv.datacenter.iot.module.omodel.service.ObjectModelService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description: 物模型实例Controller
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/03 10:14
* @version:1.0
*/
@Slf4j
@RestController
@RequestMapping("/model/instance")
@Validated
public class ObjectModelInstanceController {
private ObjectModelService objectModelService;
private ObjectModelInstanceService objectModelInstanceService;
public ObjectModelInstanceController(ObjectModelService objectModelService, ObjectModelInstanceService objectModelInstanceService) {
this.objectModelService = objectModelService;
this.objectModelInstanceService = objectModelInstanceService;
}
/**
* @description 创建模型实例
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 10:31
**/
@PostMapping("/add")
public EResponse add(@RequestBody @Validated(ValidatorInsert.class) ModelInstanceForm form) throws EException {
// 校验模型ID是否有效
this.checkIsValidModelId(form.getModelId());
Long id = objectModelInstanceService.createModelInstance(form);
JSONObject data = new JSONObject();
data.put("id", id);
return EResponse.ok(data);
}
/**
* @description 更新模型实例
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 11:20
**/
@PostMapping("/edit")
public EResponse edit(@RequestBody @Validated(ValidatorInsert.class) ModelInstanceForm form) throws EException {
// 校验模型ID是否有效
this.checkIsValidModelId(form.getModelId());
// 校验模型实例ID是否有效
this.checkIsValidModelInstanceId(form.getId());
// 更新模型实例
objectModelInstanceService.updateModelInstance(form);
return EResponse.ok();
}
/**
* @description 删除模型实例
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 11:26
**/
@PostMapping("/delete")
public EResponse delete(@RequestBody @Validated(ValidatorDelete.class) ModelInstanceForm form) throws EException {
// 校验模型实例ID是否有效
this.checkIsValidModelInstanceId(form.getId());
// 更新模型实例
objectModelInstanceService.deleteModelInstance(form.getId());
return EResponse.ok();
}
/**
* @description 获取模型实例详情
* @param form:
* @return com.esv.datacenter.iot.common.response.EResponse
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 13:45
**/
@PostMapping("/detail")
public EResponse detail(@RequestBody @Validated(ValidatorDetail.class) ModelInstanceForm form) throws EException {
objectModelInstanceService.getModelInstanceDetail(form.getId());
return EResponse.ok();
}
/**
* @description 校验模型ID是否有效
* @param modelId:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/01 14:25
**/
private void checkIsValidModelId(Long modelId) {
if (!objectModelService.isModelExits(modelId)) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型id值");
}
}
/**
* @description 校验是否有效模型实例ID
* @param id:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 11:18
**/
private void checkIsValidModelInstanceId(Long id) {
if (!objectModelInstanceService.isModelInstanceExits(id)) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型实例id值");
}
}
}
package com.esv.datacenter.iot.module.omodel.dao; package com.esv.datacenter.iot.module.omodel.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelEntity;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity; import com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.esv.datacenter.iot.module.omodel.form.ModelInstanceForm;
import com.esv.datacenter.iot.module.omodel.form.ObjectModelForm;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
...@@ -13,5 +17,24 @@ import org.apache.ibatis.annotations.Mapper; ...@@ -13,5 +17,24 @@ import org.apache.ibatis.annotations.Mapper;
*/ */
@Mapper @Mapper
public interface ObjectModelInstanceDao extends BaseMapper<ObjectModelInstanceEntity> { public interface ObjectModelInstanceDao extends BaseMapper<ObjectModelInstanceEntity> {
/**
* @description 分页查询
* @param page:
* @param queryObj:
* @return com.baomidou.mybatisplus.core.metadata.IPage
* @author huangChaobin@esvtek.com
* @createTime 2020/07/31 16:24
**/
IPage select4Page(IPage page, ModelInstanceForm queryObj);
/**
* @description 逻辑删除模型实例
* @param entity:
* @return java.lang.Integer
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 10:11
**/
Integer logicDeleteInstance(ObjectModelInstanceEntity entity);
} }
package com.esv.datacenter.iot.module.omodel.dto;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelEntity;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelPropertyEntity;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import java.util.List;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/03 15:11
* @version:1.0
*/
@Data
public class ModelAndInstanceDto {
private ObjectModelEntity objectModelEntity;
private List<ObjectModelPropertyEntity> objectModelPropertyEntityList;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
package com.esv.datacenter.iot.module.omodel.form; package com.esv.datacenter.iot.module.omodel.form;
import com.esv.datacenter.iot.common.validator.groups.*;
import lombok.Data; import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle; import org.apache.commons.lang3.builder.ToStringStyle;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/** /**
* @description: * @description:
...@@ -13,6 +19,49 @@ import org.apache.commons.lang3.builder.ToStringStyle; ...@@ -13,6 +19,49 @@ import org.apache.commons.lang3.builder.ToStringStyle;
@Data @Data
public class ModelInstanceForm { public class ModelInstanceForm {
/**
*
*/
@NotNull(message = "[模型实例ID]不能为空", groups = {ValidatorUpdate.class, ValidatorDetail.class, ValidatorDelete.class})
private Long id;
/**
* 租户ID
*/
private Long tenantId;
/**
* 部门ID
*/
private Long departmentId;
/**
* 模型ID
*/
@NotNull(message = "[模型ID]不能为空", groups = {ValidatorInsert.class, ValidatorUpdate.class, ValidatorList.class})
private Long modelId;
/**
* 实例名称
*/
@Length(max = 50, message = "[实例名称]长度不合法", groups = {ValidatorInsert.class, ValidatorUpdate.class})
@NotBlank(message = "[实例名称]不能为空", groups = {ValidatorInsert.class})
private String instanceName;
/**
* 实例描述
*/
@Length(max = 200, message = "[实例描述]长度不合法", groups = {ValidatorInsert.class, ValidatorUpdate.class})
@NotBlank(message = "[实例描述]不能为空", groups = {ValidatorInsert.class})
private String description;
/**
* 页码
**/
@Range(min = 1, max = 65535, message = "无效的pageNum", groups = {ValidatorList.class})
@NotNull(message = "参数pageNum不能为空", groups = {ValidatorList.class})
private Integer pageNum;
/**
* 每页记录条数
**/
@Range(min = 1, max = 100, message = "pageSize", groups = {ValidatorList.class})
@NotNull(message = "参数pageSize不能为空", groups = {ValidatorList.class})
private Integer pageSize;
@Override @Override
public String toString() { public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE); return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
......
package com.esv.datacenter.iot.module.omodel.service; package com.esv.datacenter.iot.module.omodel.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.esv.datacenter.iot.common.vo.PageResultVO;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity; import com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity;
import com.esv.datacenter.iot.module.omodel.form.ModelInstanceForm;
import com.esv.datacenter.iot.module.omodel.vo.ModelInstanceDetailVO;
import com.esv.datacenter.iot.module.omodel.vo.ModelInstanceVO; import com.esv.datacenter.iot.module.omodel.vo.ModelInstanceVO;
import java.util.List; import java.util.List;
...@@ -24,5 +27,59 @@ public interface ObjectModelInstanceService extends IService<ObjectModelInstance ...@@ -24,5 +27,59 @@ public interface ObjectModelInstanceService extends IService<ObjectModelInstance
**/ **/
List<ModelInstanceVO> getModelInstanceList(Long modelId); List<ModelInstanceVO> getModelInstanceList(Long modelId);
/**
* @description 分页查询模型实例列表
* @param queryObj:
* @return com.esv.datacenter.iot.common.vo.PageResultVO
* @author huangChaobin@esvtek.com
* @createTime 2020/07/31 16:26
**/
PageResultVO getModelInstance4Page(ModelInstanceForm queryObj);
/**
* @description 创建模型实例
* @param form:
* @return java.lang.Long
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 10:22
**/
Long createModelInstance(ModelInstanceForm form);
/**
* @description 更新模型实例
* @param form:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 11:02
**/
void updateModelInstance(ModelInstanceForm form);
/**
* @description 删除模型实例
* @param id:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 11:23
**/
void deleteModelInstance(Long id);
/**
* @description 判断模型实例是否存在
* @param id:
* @return java.lang.Boolean
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 11:06
**/
Boolean isModelInstanceExits(Long id);
/**
* @description 获取模型实例详情
* @param id:
* @return com.esv.datacenter.iot.module.omodel.vo.ModelInstanceDetailVO
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 11:30
**/
ModelInstanceDetailVO getModelInstanceDetail(Long id);
} }
...@@ -89,5 +89,14 @@ public interface ObjectModelService extends IService<ObjectModelEntity> { ...@@ -89,5 +89,14 @@ public interface ObjectModelService extends IService<ObjectModelEntity> {
**/ **/
Boolean isModelExits(Long modelId); Boolean isModelExits(Long modelId);
/**
* @description 获取模型信息
* @param id:
* @return com.esv.datacenter.iot.module.omodel.entity.ObjectModelEntity
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 13:39
**/
ObjectModelEntity getModelInfo(Long id);
} }
package com.esv.datacenter.iot.module.omodel.service.impl; package com.esv.datacenter.iot.module.omodel.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.common.em.DbDeletedEnum; import com.esv.datacenter.iot.common.em.DbDeletedEnum;
import com.esv.datacenter.iot.common.exception.EException;
import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.vo.PageResultVO;
import com.esv.datacenter.iot.module.omodel.dao.ObjectModelInstanceDao; import com.esv.datacenter.iot.module.omodel.dao.ObjectModelInstanceDao;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelEntity;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity; import com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity;
import com.esv.datacenter.iot.module.omodel.form.ModelInstanceForm;
import com.esv.datacenter.iot.module.omodel.service.ObjectModelInstanceService; import com.esv.datacenter.iot.module.omodel.service.ObjectModelInstanceService;
import com.esv.datacenter.iot.module.omodel.service.ObjectModelService;
import com.esv.datacenter.iot.module.omodel.vo.ModelInstanceDetailVO;
import com.esv.datacenter.iot.module.omodel.vo.ModelInstanceVO; import com.esv.datacenter.iot.module.omodel.vo.ModelInstanceVO;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -17,6 +27,9 @@ import java.util.List; ...@@ -17,6 +27,9 @@ import java.util.List;
@Service("objectModelInstanceService") @Service("objectModelInstanceService")
public class ObjectModelInstanceServiceImpl extends ServiceImpl<ObjectModelInstanceDao, ObjectModelInstanceEntity> implements ObjectModelInstanceService { public class ObjectModelInstanceServiceImpl extends ServiceImpl<ObjectModelInstanceDao, ObjectModelInstanceEntity> implements ObjectModelInstanceService {
@Autowired
ObjectModelService objectModelService;
@Override @Override
public List<ModelInstanceVO> getModelInstanceList(Long modelId) { public List<ModelInstanceVO> getModelInstanceList(Long modelId) {
List<ObjectModelInstanceEntity> entityList = this.getBaseMapper().selectList(new LambdaQueryWrapper<ObjectModelInstanceEntity>() List<ObjectModelInstanceEntity> entityList = this.getBaseMapper().selectList(new LambdaQueryWrapper<ObjectModelInstanceEntity>()
...@@ -34,4 +47,103 @@ public class ObjectModelInstanceServiceImpl extends ServiceImpl<ObjectModelInsta ...@@ -34,4 +47,103 @@ public class ObjectModelInstanceServiceImpl extends ServiceImpl<ObjectModelInsta
return voList; return voList;
} }
@Override
public PageResultVO getModelInstance4Page(ModelInstanceForm queryObj) {
IPage<ObjectModelInstanceEntity> page = new Page<>(queryObj.getPageNum(), queryObj.getPageSize());
this.baseMapper.select4Page(page, queryObj);
List<ObjectModelInstanceEntity> entityList = page.getRecords();
List<ModelInstanceVO> voList = new ArrayList<>();
for (ObjectModelInstanceEntity entity : entityList) {
ModelInstanceVO vo = new ModelInstanceVO();
BeanUtils.copyProperties(entity, vo);
vo.setCreateTime(entity.getCreateTime().getTime());
vo.setUpdateTime(entity.getUpdateTime().getTime());
voList.add(vo);
}
return new PageResultVO(page, voList);
}
@Override
public Long createModelInstance(ModelInstanceForm form) {
// 模型实例名称校验
int instanceCount = this.getBaseMapper().selectCount(new LambdaQueryWrapper<ObjectModelInstanceEntity>()
.eq(ObjectModelInstanceEntity::getModelId, form.getModelId())
.eq(ObjectModelInstanceEntity::getInstanceName, form.getInstanceName())
.eq(ObjectModelInstanceEntity::getDeleted, DbDeletedEnum.NO.getCode()));
if (0 < instanceCount) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "实例名称[" + form.getInstanceName() + "]已存在");
}
// 新增模型实例
ObjectModelInstanceEntity entity = new ObjectModelInstanceEntity();
BeanUtils.copyProperties(form, entity);
this.getBaseMapper().insert(entity);
return entity.getId();
}
@Override
public void updateModelInstance(ModelInstanceForm form) {
// 模型实例名称校验:不能重复
int count = this.getBaseMapper().selectCount(new LambdaQueryWrapper<ObjectModelInstanceEntity>()
.eq(ObjectModelInstanceEntity::getModelId, form.getModelId())
.eq(ObjectModelInstanceEntity::getInstanceName, form.getInstanceName())
.eq(ObjectModelInstanceEntity::getDeleted, DbDeletedEnum.NO.getCode())
.ne(ObjectModelInstanceEntity::getId, form.getId()));
if (0 < count) {
if (0 < count) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "实例名称[" + form.getInstanceName() + "]已存在");
}
}
ObjectModelInstanceEntity entity = new ObjectModelInstanceEntity();
entity.setId(form.getId());
entity.setInstanceName(form.getInstanceName());
entity.setDescription(form.getDescription());
this.getBaseMapper().updateById(entity);
}
@Override
public void deleteModelInstance(Long id) {
this.getBaseMapper().deleteById(id);
// TODO,删除时序数据
}
@Override
public Boolean isModelInstanceExits(Long id) {
int count = this.getBaseMapper().selectCount(new LambdaQueryWrapper<ObjectModelInstanceEntity>()
.eq(ObjectModelInstanceEntity::getId, id));
if (0 == count) {
return false;
} else {
return true;
}
}
@Override
public ModelInstanceDetailVO getModelInstanceDetail(Long id) {
ModelInstanceDetailVO vo = new ModelInstanceDetailVO();
ObjectModelInstanceEntity instanceEntity = this.getBaseMapper().selectById(id);
if (null == instanceEntity) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "无效的模型实例id值");
} else {
BeanUtils.copyProperties(instanceEntity, vo);
vo.setCreateTime(instanceEntity.getCreateTime().getTime());
vo.setUpdateTime(instanceEntity.getUpdateTime().getTime());
}
ObjectModelEntity modelEntity = objectModelService.getModelInfo(instanceEntity.getModelId());
if (null == modelEntity) {
throw new EException(ECode.BIZ_PARAM_ERROR.code(), "该实例未查询到有效模型");
} else {
vo.setModelName(modelEntity.getName());
vo.setModelDescription(modelEntity.getDescription());
}
return vo;
}
} }
\ No newline at end of file
...@@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; ...@@ -4,11 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.esv.datacenter.iot.common.component.TimescaleComponent;
import com.esv.datacenter.iot.common.em.DbDeletedEnum; import com.esv.datacenter.iot.common.em.DbDeletedEnum;
import com.esv.datacenter.iot.common.exception.EException; import com.esv.datacenter.iot.common.exception.EException;
import com.esv.datacenter.iot.common.response.ECode; import com.esv.datacenter.iot.common.response.ECode;
import com.esv.datacenter.iot.common.vo.PageResultVO; import com.esv.datacenter.iot.common.vo.PageResultVO;
import com.esv.datacenter.iot.module.omodel.dao.ObjectModelDao; import com.esv.datacenter.iot.module.omodel.dao.ObjectModelDao;
import com.esv.datacenter.iot.module.omodel.dto.ModelAndInstanceDto;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelEntity; import com.esv.datacenter.iot.module.omodel.entity.ObjectModelEntity;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity; import com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelPropertyEntity; import com.esv.datacenter.iot.module.omodel.entity.ObjectModelPropertyEntity;
...@@ -20,6 +22,7 @@ import com.esv.datacenter.iot.module.omodel.service.ObjectModelService; ...@@ -20,6 +22,7 @@ import com.esv.datacenter.iot.module.omodel.service.ObjectModelService;
import com.esv.datacenter.iot.module.omodel.vo.ModelDetailVO; import com.esv.datacenter.iot.module.omodel.vo.ModelDetailVO;
import com.esv.datacenter.iot.module.omodel.vo.ModelVO; import com.esv.datacenter.iot.module.omodel.vo.ModelVO;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -30,14 +33,13 @@ import java.util.List; ...@@ -30,14 +33,13 @@ import java.util.List;
@Service("objectModelService") @Service("objectModelService")
public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectModelEntity> implements ObjectModelService { public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectModelEntity> implements ObjectModelService {
@Autowired
private TimescaleComponent timescaleComponent;
@Autowired
private ObjectModelPropertyService objectModelPropertyService; private ObjectModelPropertyService objectModelPropertyService;
@Autowired
private ObjectModelInstanceService objectModelInstanceService; private ObjectModelInstanceService objectModelInstanceService;
public ObjectModelServiceImpl(ObjectModelPropertyService objectModelPropertyService, ObjectModelInstanceService objectModelInstanceService) {
this.objectModelPropertyService = objectModelPropertyService;
this.objectModelInstanceService = objectModelInstanceService;
}
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public Long createObjectModel(ObjectModelForm form) { public Long createObjectModel(ObjectModelForm form) {
...@@ -60,6 +62,7 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo ...@@ -60,6 +62,7 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
this.objectModelPropertyService.saveModelProperty(modelId, form.getPropertyList()); this.objectModelPropertyService.saveModelProperty(modelId, form.getPropertyList());
// 3.创建时序数据库表 // 3.创建时序数据库表
this.createModelTimescaleDB(modelEntity, form);
return modelId; return modelId;
} }
...@@ -161,6 +164,9 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo ...@@ -161,6 +164,9 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
propertyEntity.setDeleted(DbDeletedEnum.YES.getCode()); propertyEntity.setDeleted(DbDeletedEnum.YES.getCode());
propertyEntity.setModelId(modelId); propertyEntity.setModelId(modelId);
this.objectModelPropertyService.logicDeleteModelProperty(propertyEntity); this.objectModelPropertyService.logicDeleteModelProperty(propertyEntity);
// 删除时序数据库表
this.timescaleComponent.dropTable(modelId);
} }
@Override @Override
...@@ -198,4 +204,26 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo ...@@ -198,4 +204,26 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
return true; return true;
} }
} }
@Override
public ObjectModelEntity getModelInfo(Long id) {
return this.getBaseMapper().selectById(id);
}
private Boolean createModelTimescaleDB(ObjectModelEntity modelEntity, ObjectModelForm form) {
ModelAndInstanceDto modelAndInstanceDto = new ModelAndInstanceDto();
modelAndInstanceDto.setObjectModelEntity(modelEntity);
List<ObjectModelPropertyEntity> modelPropertyEntityList = new ArrayList<>();
for (ModelPropertyForm propertyForm : form.getPropertyList()) {
ObjectModelPropertyEntity entity = new ObjectModelPropertyEntity();
BeanUtils.copyProperties(propertyForm, entity);
entity.setModelId(modelEntity.getId());
modelPropertyEntityList.add(entity);
}
modelAndInstanceDto.setObjectModelPropertyEntityList(modelPropertyEntityList);
return timescaleComponent.createTable(modelAndInstanceDto);
}
} }
\ No newline at end of file
package com.esv.datacenter.iot.module.omodel.vo;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/03 11:26
* @version:1.0
*/
@Data
public class ModelInstanceDetailVO extends ModelInstanceVO {
/**
* 模型名称
*/
private String modelName;
/**
* 模型描述
*/
private String modelDescription;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
...@@ -12,7 +12,7 @@ spring: ...@@ -12,7 +12,7 @@ spring:
max-wait: 60000 max-wait: 60000
time-between-eviction-runs-millis: 60000 time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000 min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL validation-query: SELECT 1
test-while-idle: true test-while-idle: true
test-on-borrow: false test-on-borrow: false
test-on-return: false test-on-return: false
...@@ -62,4 +62,23 @@ management: ...@@ -62,4 +62,23 @@ management:
base-path: /esvActuator base-path: /esvActuator
endpoint: endpoint:
health: health:
show-details: always show-details: always
\ No newline at end of file ribbon:
eager-load:
enabled: true
clients: datacenter-base-service
feign-base-service-name: datacenter-base-service
timescale:
data-source:
jdbc-url: jdbc:postgresql://192.168.31.248:5432/iot
driver-class-name: org.postgresql.Driver
validation-query: SELECT 1
username: iot
password: 123456
connection-timeout: 10000
minimum-idle: 1
maximum-pool-size: 1
max-lifetime: 0
table-field:
map: string-text,number-numeric,boolean-bit(1)
table-prefix: iot_model_
\ No newline at end of file
...@@ -12,7 +12,7 @@ spring: ...@@ -12,7 +12,7 @@ spring:
max-wait: 60000 max-wait: 60000
time-between-eviction-runs-millis: 60000 time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000 min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL validation-query: SELECT 1
test-while-idle: true test-while-idle: true
test-on-borrow: false test-on-borrow: false
test-on-return: false test-on-return: false
...@@ -62,4 +62,23 @@ management: ...@@ -62,4 +62,23 @@ management:
base-path: /esvActuator base-path: /esvActuator
endpoint: endpoint:
health: health:
show-details: always show-details: always
\ No newline at end of file ribbon:
eager-load:
enabled: true
clients: datacenter-base-service
feign-base-service-name: datacenter-base-service
timescale:
data-source:
jdbc-url: jdbc:postgresql://192.168.31.248:5432/iot
driver-class-name: org.postgresql.Driver
validation-query: SELECT 1
username: iot
password: 123456
connection-timeout: 10000
minimum-idle: 1
maximum-pool-size: 1
max-lifetime: 0
table-field:
map: string-text,number-numeric,boolean-bit(1)
table-prefix: iot_model_
\ No newline at end of file
...@@ -12,7 +12,7 @@ spring: ...@@ -12,7 +12,7 @@ spring:
max-wait: 60000 max-wait: 60000
time-between-eviction-runs-millis: 60000 time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000 min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL validation-query: SELECT 1
test-while-idle: true test-while-idle: true
test-on-borrow: false test-on-borrow: false
test-on-return: false test-on-return: false
...@@ -62,4 +62,23 @@ management: ...@@ -62,4 +62,23 @@ management:
base-path: /esvActuator base-path: /esvActuator
endpoint: endpoint:
health: health:
show-details: always show-details: always
\ No newline at end of file ribbon:
eager-load:
enabled: true
clients: datacenter-base-service
feign-base-service-name: datacenter-base-service
timescale:
data-source:
jdbc-url: jdbc:postgresql://192.168.31.248:5432/iot
driver-class-name: org.postgresql.Driver
validation-query: SELECT 1
username: iot
password: 123456
connection-timeout: 10000
minimum-idle: 1
maximum-pool-size: 1
max-lifetime: 0
table-field:
map: string-text,number-numeric,boolean-bit(1)
table-prefix: iot_model_
\ No newline at end of file
...@@ -12,7 +12,7 @@ spring: ...@@ -12,7 +12,7 @@ spring:
max-wait: 60000 max-wait: 60000
time-between-eviction-runs-millis: 60000 time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000 min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL validation-query: SELECT 1
test-while-idle: true test-while-idle: true
test-on-borrow: false test-on-borrow: false
test-on-return: false test-on-return: false
...@@ -62,4 +62,23 @@ management: ...@@ -62,4 +62,23 @@ management:
base-path: /esvActuator base-path: /esvActuator
endpoint: endpoint:
health: health:
show-details: always show-details: always
\ No newline at end of file ribbon:
eager-load:
enabled: true
clients: datacenter-base-service
feign-base-service-name: datacenter-base-service
timescale:
data-source:
jdbc-url: jdbc:postgresql://192.168.31.248:5432/iot
driver-class-name: org.postgresql.Driver
validation-query: SELECT 1
username: iot
password: 123456
connection-timeout: 10000
minimum-idle: 1
maximum-pool-size: 1
max-lifetime: 0
table-field:
map: string-text,number-numeric,boolean-bit(1)
table-prefix: iot_model_
\ No newline at end of file
...@@ -23,9 +23,6 @@ ...@@ -23,9 +23,6 @@
select * select *
from base_object_model from base_object_model
where deleted = false where deleted = false
<if test="queryObj.tenantId != null">
and tenant_id = #{queryObj.tenantId}
</if>
<if test="queryObj.name != null"> <if test="queryObj.name != null">
and name like #{queryObj.name} and name like #{queryObj.name}
</if> </if>
......
...@@ -18,5 +18,25 @@ ...@@ -18,5 +18,25 @@
<result property="updateTime" column="update_time"/> <result property="updateTime" column="update_time"/>
</resultMap> </resultMap>
<!-- 分页查询 -->
<select id="select4Page" parameterType="com.esv.datacenter.iot.module.omodel.form.ModelInstanceForm"
resultType="com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity">
select *
from base_object_model_instance
where deleted = false
<if test="queryObj.modelId != null">
and model_id = #{queryObj.modelId}
</if>
<if test="queryObj.instanceName != null">
and instance_name like #{queryObj.instanceName}
</if>
ORDER BY instance_name ASC
</select>
<update id="logicDeleteInstance" parameterType="com.esv.datacenter.iot.module.omodel.entity.ObjectModelInstanceEntity">
update base_object_model_instance
set deleted = #{deleted}
where id = #{id}
</update>
</mapper> </mapper>
\ No newline at end of file
package com.esv.datacenter.iot.common.component;
import com.esv.datacenter.iot.module.omodel.dto.ModelAndInstanceDto;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelEntity;
import com.esv.datacenter.iot.module.omodel.entity.ObjectModelPropertyEntity;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/03 16:15
* @version:1.0
*/
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class TimescaleComponentTest {
@Autowired
private TimescaleComponent timescaleComponent;
@Test
public void createTable_test() {
Long modelId = 999L;
ModelAndInstanceDto modelAndInstanceDto = new ModelAndInstanceDto();
ObjectModelEntity objectModelEntity = new ObjectModelEntity();
objectModelEntity.setId(modelId);
modelAndInstanceDto.setObjectModelEntity(objectModelEntity);
List<ObjectModelPropertyEntity> objectModelPropertyEntityList = new ArrayList<>();
ObjectModelPropertyEntity objectModelPropertyEntity = new ObjectModelPropertyEntity();
objectModelPropertyEntity.setPropertyCode("temp");
objectModelPropertyEntity.setPropertyType(2);
objectModelPropertyEntityList.add(objectModelPropertyEntity);
modelAndInstanceDto.setObjectModelPropertyEntityList(objectModelPropertyEntityList);
Boolean result = timescaleComponent.createTable(modelAndInstanceDto);
log.info(String.valueOf(result));
}
@Test
public void dropTable_test() {
Long modelId = 999L;
Boolean result = timescaleComponent.dropTable(modelId);
log.info(String.valueOf(result));
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment