Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
I
iot-service
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Container Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
SuperHive
back-end
iot-service
Commits
374e6f04
Commit
374e6f04
authored
Aug 03, 2020
by
huangcb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
1.增加时序数据库TimescaleDB组件;2.创建模型/删除模型时,创建时序数据库表/删除时序数据表;3.增加模型实例功能接口;
parent
0a87cf26
Changes
25
Show whitespace changes
Inline
Side-by-side
Showing
25 changed files
with
1206 additions
and
22 deletions
+1206
-22
pom.xml
pom.xml
+8
-0
DataSourceConfig.java
...esv/datacenter/iot/common/component/DataSourceConfig.java
+71
-0
DynamicDataSource.java
...sv/datacenter/iot/common/component/DynamicDataSource.java
+67
-0
TimescaleComponent.java
...v/datacenter/iot/common/component/TimescaleComponent.java
+276
-0
FeignUtils.java
...n/java/com/esv/datacenter/iot/common/util/FeignUtils.java
+53
-0
ValidatorPage.java
...datacenter/iot/common/validator/groups/ValidatorPage.java
+13
-0
FeignConfigure.java
...in/java/com/esv/datacenter/iot/config/FeignConfigure.java
+26
-0
FeignBaseService.java
...n/java/com/esv/datacenter/iot/feign/FeignBaseService.java
+25
-0
ObjectModelController.java
...r/iot/module/omodel/controller/ObjectModelController.java
+30
-6
ObjectModelInstanceController.java
...dule/omodel/controller/ObjectModelInstanceController.java
+136
-0
ObjectModelInstanceDao.java
...acenter/iot/module/omodel/dao/ObjectModelInstanceDao.java
+23
-0
ModelAndInstanceDto.java
...datacenter/iot/module/omodel/dto/ModelAndInstanceDto.java
+28
-0
ModelInstanceForm.java
.../datacenter/iot/module/omodel/form/ModelInstanceForm.java
+49
-0
ObjectModelInstanceService.java
...iot/module/omodel/service/ObjectModelInstanceService.java
+57
-0
ObjectModelService.java
...acenter/iot/module/omodel/service/ObjectModelService.java
+9
-0
ObjectModelInstanceServiceImpl.java
...e/omodel/service/impl/ObjectModelInstanceServiceImpl.java
+112
-0
ObjectModelServiceImpl.java
...ot/module/omodel/service/impl/ObjectModelServiceImpl.java
+33
-5
ModelInstanceDetailVO.java
...atacenter/iot/module/omodel/vo/ModelInstanceDetailVO.java
+29
-0
application-demo.yml
src/main/resources/application-demo.yml
+21
-2
application-dev.yml
src/main/resources/application-dev.yml
+21
-2
application-local.yml
src/main/resources/application-local.yml
+21
-2
application-test.yml
src/main/resources/application-test.yml
+21
-2
ObjectModelDao.xml
src/main/resources/mapper/omodel/ObjectModelDao.xml
+0
-3
ObjectModelInstanceDao.xml
src/main/resources/mapper/omodel/ObjectModelInstanceDao.xml
+20
-0
TimescaleComponentTest.java
...tacenter/iot/common/component/TimescaleComponentTest.java
+57
-0
No files found.
pom.xml
View file @
374e6f04
...
...
@@ -60,6 +60,10 @@
<artifactId>
spring-cloud-starter-alibaba-nacos-config
</artifactId>
<version>
${alibaba-nacos-config.version}
</version>
</dependency>
<dependency>
<groupId>
org.springframework.cloud
</groupId>
<artifactId>
spring-cloud-starter-openfeign
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-cache
</artifactId>
...
...
@@ -100,6 +104,10 @@
<groupId>
mysql
</groupId>
<artifactId>
mysql-connector-java
</artifactId>
</dependency>
<dependency>
<groupId>
org.postgresql
</groupId>
<artifactId>
postgresql
</artifactId>
</dependency>
<dependency>
<groupId>
com.baomidou
</groupId>
<artifactId>
mybatis-plus-boot-starter
</artifactId>
...
...
src/main/java/com/esv/datacenter/iot/common/component/DataSourceConfig.java
0 → 100644
View file @
374e6f04
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
;
}
}
src/main/java/com/esv/datacenter/iot/common/component/DynamicDataSource.java
0 → 100644
View file @
374e6f04
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
;
}
}
src/main/java/com/esv/datacenter/iot/common/component/TimescaleComponent.java
0 → 100644
View file @
374e6f04
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
;
}
}
src/main/java/com/esv/datacenter/iot/common/util/FeignUtils.java
0 → 100644
View file @
374e6f04
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
));
}
}
}
src/main/java/com/esv/datacenter/iot/common/validator/groups/ValidatorPage.java
0 → 100644
View file @
374e6f04
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
{
}
src/main/java/com/esv/datacenter/iot/config/FeignConfigure.java
0 → 100644
View file @
374e6f04
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
();
}
}
src/main/java/com/esv/datacenter/iot/feign/FeignBaseService.java
0 → 100644
View file @
374e6f04
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
);
}
src/main/java/com/esv/datacenter/iot/module/omodel/controller/ObjectModelController.java
View file @
374e6f04
...
...
@@ -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.util.ReqUtils
;
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.ObjectModelForm
;
import
com.esv.datacenter.iot.module.omodel.service.ObjectModelInstanceService
;
import
com.esv.datacenter.iot.module.omodel.service.ObjectModelService
;
import
com.esv.gateway.common.DataPermsType
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.validation.annotation.Validated
;
...
...
@@ -59,6 +59,8 @@ public class ObjectModelController {
ReqUtils
.
checkParamsNotBlank
(
JSON
.
parseObject
(
property
.
toString
()),
notBlandParams
);
});
// TODO,参数校验:模型属性是否数据库保留字段
Long
id
=
objectModelService
.
createObjectModel
(
form
);
JSONObject
data
=
new
JSONObject
();
data
.
put
(
"id"
,
id
);
...
...
@@ -75,11 +77,11 @@ public class ObjectModelController {
**/
@PostMapping
(
"/list"
)
public
EResponse
list
(
@RequestBody
@Validated
(
ValidatorList
.
class
)
ObjectModelForm
form
)
throws
EException
{
if
(!
DataPermsType
.
DATA_PERM_ALL
.
equals
(
ReqUtils
.
getRequestDataPerm
()))
{
form
.
setTenantId
(
ReqUtils
.
getRequestTenantId
());
}
if
(
Objects
.
nonNull
(
StringUtils
.
trimToNull
(
form
.
getName
())))
{
form
.
setName
(
"%"
+
form
.
getName
()
+
"%"
);
String
modelName
=
StringUtils
.
trimToNull
(
form
.
getName
());
if
(
Objects
.
nonNull
(
modelName
))
{
form
.
setName
(
"%"
+
modelName
+
"%"
);
}
else
{
form
.
setName
(
null
);
}
return
EResponse
.
ok
(
objectModelService
.
getModel4Page
(
form
));
}
...
...
@@ -156,6 +158,28 @@ public class ObjectModelController {
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是否有效
* @param modelId:
...
...
src/main/java/com/esv/datacenter/iot/module/omodel/controller/ObjectModelInstanceController.java
0 → 100644
View file @
374e6f04
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值"
);
}
}
}
src/main/java/com/esv/datacenter/iot/module/omodel/dao/ObjectModelInstanceDao.java
View file @
374e6f04
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.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
;
/**
...
...
@@ -14,4 +18,23 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
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
);
}
src/main/java/com/esv/datacenter/iot/module/omodel/dto/ModelAndInstanceDto.java
0 → 100644
View file @
374e6f04
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
);
}
}
src/main/java/com/esv/datacenter/iot/module/omodel/form/ModelInstanceForm.java
View file @
374e6f04
package
com
.
esv
.
datacenter
.
iot
.
module
.
omodel
.
form
;
import
com.esv.datacenter.iot.common.validator.groups.*
;
import
lombok.Data
;
import
org.apache.commons.lang3.builder.ToStringBuilder
;
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:
...
...
@@ -13,6 +19,49 @@ import org.apache.commons.lang3.builder.ToStringStyle;
@Data
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
public
String
toString
()
{
return
ToStringBuilder
.
reflectionToString
(
this
,
ToStringStyle
.
JSON_STYLE
);
...
...
src/main/java/com/esv/datacenter/iot/module/omodel/service/ObjectModelInstanceService.java
View file @
374e6f04
package
com
.
esv
.
datacenter
.
iot
.
module
.
omodel
.
service
;
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.form.ModelInstanceForm
;
import
com.esv.datacenter.iot.module.omodel.vo.ModelInstanceDetailVO
;
import
com.esv.datacenter.iot.module.omodel.vo.ModelInstanceVO
;
import
java.util.List
;
...
...
@@ -24,5 +27,59 @@ public interface ObjectModelInstanceService extends IService<ObjectModelInstance
**/
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
);
}
src/main/java/com/esv/datacenter/iot/module/omodel/service/ObjectModelService.java
View file @
374e6f04
...
...
@@ -89,5 +89,14 @@ public interface ObjectModelService extends IService<ObjectModelEntity> {
**/
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
);
}
src/main/java/com/esv/datacenter/iot/module/omodel/service/impl/ObjectModelInstanceServiceImpl.java
View file @
374e6f04
package
com
.
esv
.
datacenter
.
iot
.
module
.
omodel
.
service
.
impl
;
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.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.entity.ObjectModelEntity
;
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.ObjectModelService
;
import
com.esv.datacenter.iot.module.omodel.vo.ModelInstanceDetailVO
;
import
com.esv.datacenter.iot.module.omodel.vo.ModelInstanceVO
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
...
...
@@ -17,6 +27,9 @@ import java.util.List;
@Service
(
"objectModelInstanceService"
)
public
class
ObjectModelInstanceServiceImpl
extends
ServiceImpl
<
ObjectModelInstanceDao
,
ObjectModelInstanceEntity
>
implements
ObjectModelInstanceService
{
@Autowired
ObjectModelService
objectModelService
;
@Override
public
List
<
ModelInstanceVO
>
getModelInstanceList
(
Long
modelId
)
{
List
<
ObjectModelInstanceEntity
>
entityList
=
this
.
getBaseMapper
().
selectList
(
new
LambdaQueryWrapper
<
ObjectModelInstanceEntity
>()
...
...
@@ -34,4 +47,103 @@ public class ObjectModelInstanceServiceImpl extends ServiceImpl<ObjectModelInsta
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
src/main/java/com/esv/datacenter/iot/module/omodel/service/impl/ObjectModelServiceImpl.java
View file @
374e6f04
...
...
@@ -4,11 +4,13 @@ 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.esv.datacenter.iot.common.component.TimescaleComponent
;
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.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.ObjectModelInstanceEntity
;
import
com.esv.datacenter.iot.module.omodel.entity.ObjectModelPropertyEntity
;
...
...
@@ -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.ModelVO
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
...
...
@@ -30,14 +33,13 @@ import java.util.List;
@Service
(
"objectModelService"
)
public
class
ObjectModelServiceImpl
extends
ServiceImpl
<
ObjectModelDao
,
ObjectModelEntity
>
implements
ObjectModelService
{
@Autowired
private
TimescaleComponent
timescaleComponent
;
@Autowired
private
ObjectModelPropertyService
objectModelPropertyService
;
@Autowired
private
ObjectModelInstanceService
objectModelInstanceService
;
public
ObjectModelServiceImpl
(
ObjectModelPropertyService
objectModelPropertyService
,
ObjectModelInstanceService
objectModelInstanceService
)
{
this
.
objectModelPropertyService
=
objectModelPropertyService
;
this
.
objectModelInstanceService
=
objectModelInstanceService
;
}
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Long
createObjectModel
(
ObjectModelForm
form
)
{
...
...
@@ -60,6 +62,7 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
this
.
objectModelPropertyService
.
saveModelProperty
(
modelId
,
form
.
getPropertyList
());
// 3.创建时序数据库表
this
.
createModelTimescaleDB
(
modelEntity
,
form
);
return
modelId
;
}
...
...
@@ -161,6 +164,9 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
propertyEntity
.
setDeleted
(
DbDeletedEnum
.
YES
.
getCode
());
propertyEntity
.
setModelId
(
modelId
);
this
.
objectModelPropertyService
.
logicDeleteModelProperty
(
propertyEntity
);
// 删除时序数据库表
this
.
timescaleComponent
.
dropTable
(
modelId
);
}
@Override
...
...
@@ -198,4 +204,26 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
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
src/main/java/com/esv/datacenter/iot/module/omodel/vo/ModelInstanceDetailVO.java
0 → 100644
View file @
374e6f04
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
);
}
}
src/main/resources/application-demo.yml
View file @
374e6f04
...
...
@@ -12,7 +12,7 @@ spring:
max-wait
:
60000
time-between-eviction-runs-millis
:
60000
min-evictable-idle-time-millis
:
300000
validation-query
:
SELECT 1
FROM DUAL
validation-query
:
SELECT
1
test-while-idle
:
true
test-on-borrow
:
false
test-on-return
:
false
...
...
@@ -63,3 +63,22 @@ management:
endpoint
:
health
:
show-details
:
always
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
src/main/resources/application-dev.yml
View file @
374e6f04
...
...
@@ -12,7 +12,7 @@ spring:
max-wait
:
60000
time-between-eviction-runs-millis
:
60000
min-evictable-idle-time-millis
:
300000
validation-query
:
SELECT 1
FROM DUAL
validation-query
:
SELECT
1
test-while-idle
:
true
test-on-borrow
:
false
test-on-return
:
false
...
...
@@ -63,3 +63,22 @@ management:
endpoint
:
health
:
show-details
:
always
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
src/main/resources/application-local.yml
View file @
374e6f04
...
...
@@ -12,7 +12,7 @@ spring:
max-wait
:
60000
time-between-eviction-runs-millis
:
60000
min-evictable-idle-time-millis
:
300000
validation-query
:
SELECT 1
FROM DUAL
validation-query
:
SELECT
1
test-while-idle
:
true
test-on-borrow
:
false
test-on-return
:
false
...
...
@@ -63,3 +63,22 @@ management:
endpoint
:
health
:
show-details
:
always
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
src/main/resources/application-test.yml
View file @
374e6f04
...
...
@@ -12,7 +12,7 @@ spring:
max-wait
:
60000
time-between-eviction-runs-millis
:
60000
min-evictable-idle-time-millis
:
300000
validation-query
:
SELECT 1
FROM DUAL
validation-query
:
SELECT
1
test-while-idle
:
true
test-on-borrow
:
false
test-on-return
:
false
...
...
@@ -63,3 +63,22 @@ management:
endpoint
:
health
:
show-details
:
always
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
src/main/resources/mapper/omodel/ObjectModelDao.xml
View file @
374e6f04
...
...
@@ -23,9 +23,6 @@
select *
from base_object_model
where deleted = false
<if
test=
"queryObj.tenantId != null"
>
and tenant_id = #{queryObj.tenantId}
</if>
<if
test=
"queryObj.name != null"
>
and name like #{queryObj.name}
</if>
...
...
src/main/resources/mapper/omodel/ObjectModelInstanceDao.xml
View file @
374e6f04
...
...
@@ -18,5 +18,25 @@
<result
property=
"updateTime"
column=
"update_time"
/>
</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>
\ No newline at end of file
src/test/java/com/esv/datacenter/iot/common/component/TimescaleComponentTest.java
0 → 100644
View file @
374e6f04
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
));
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment