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
20beff75
Commit
20beff75
authored
Aug 04, 2020
by
huangcb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
优化创建模型/修改模型功能
parent
374e6f04
Changes
17
Hide whitespace changes
Inline
Side-by-side
Showing
17 changed files
with
1174 additions
and
66 deletions
+1174
-66
IoTApplication.java
src/main/java/com/esv/datacenter/iot/IoTApplication.java
+4
-0
BaseDataComponent.java
...sv/datacenter/iot/common/component/BaseDataComponent.java
+67
-0
TimescaleComponent.java
...v/datacenter/iot/common/component/TimescaleComponent.java
+34
-39
LogbackFilter.java
...a/com/esv/datacenter/iot/common/filter/LogbackFilter.java
+4
-3
FileUtils.java
...in/java/com/esv/datacenter/iot/common/util/FileUtils.java
+51
-0
ObjectModelController.java
...r/iot/module/omodel/controller/ObjectModelController.java
+19
-11
ObjectModelPropertyService.java
...iot/module/omodel/service/ObjectModelPropertyService.java
+18
-0
ObjectModelService.java
...acenter/iot/module/omodel/service/ObjectModelService.java
+2
-2
ObjectModelPropertyServiceImpl.java
...e/omodel/service/impl/ObjectModelPropertyServiceImpl.java
+68
-0
ObjectModelServiceImpl.java
...ot/module/omodel/service/impl/ObjectModelServiceImpl.java
+15
-9
application-demo.yml
src/main/resources/application-demo.yml
+4
-0
application-dev.yml
src/main/resources/application-dev.yml
+4
-0
application-local.yml
src/main/resources/application-local.yml
+4
-0
application-test.yml
src/main/resources/application-test.yml
+4
-0
SqlReservedWords.txt
src/main/resources/data/SqlReservedWords.txt
+820
-0
SimpleTest.java
src/test/java/com/esv/datacenter/iot/SimpleTest.java
+32
-0
TimescaleComponentTest.java
...tacenter/iot/common/component/TimescaleComponentTest.java
+24
-2
No files found.
src/main/java/com/esv/datacenter/iot/IoTApplication.java
View file @
20beff75
package
com
.
esv
.
datacenter
.
iot
;
import
com.esv.datacenter.iot.common.constants.CommonConstants
;
import
com.esv.datacenter.iot.common.util.LogUtils
;
import
org.slf4j.MDC
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
import
org.springframework.cloud.client.discovery.EnableDiscoveryClient
;
...
...
@@ -21,6 +24,7 @@ import java.util.TimeZone;
public
class
IoTApplication
{
public
static
void
main
(
String
[]
args
)
{
MDC
.
put
(
CommonConstants
.
LOG_TRACE_ID
,
LogUtils
.
getThreadTraceId
());
SpringApplication
.
run
(
IoTApplication
.
class
,
args
);
}
...
...
src/main/java/com/esv/datacenter/iot/common/component/BaseDataComponent.java
0 → 100644
View file @
20beff75
package
com
.
esv
.
datacenter
.
iot
.
common
.
component
;
import
com.esv.datacenter.iot.common.util.FileUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.cloud.context.config.annotation.RefreshScope
;
import
org.springframework.stereotype.Component
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/03 20:09
* @version:1.0
*/
@Component
@RefreshScope
@Slf4j
public
class
BaseDataComponent
{
@Value
(
"${db.dict.table-field.map}"
)
private
String
dbTableFieldMap
;
private
static
Map
<
String
,
Boolean
>
sqlReservedWordsMap
;
/**
* @description 获取数据库表字段映射
* @return java.util.Map<java.lang.Integer,java.lang.String>
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 20:12
**/
public
Map
<
Integer
,
String
>
getDbTableFieldMap
()
{
Map
<
Integer
,
String
>
map
=
new
HashMap
<>(
32
);
String
[]
kvs
=
dbTableFieldMap
.
split
(
","
);
for
(
String
kv
:
kvs
)
{
map
.
put
(
Integer
.
parseInt
(
kv
.
split
(
"-"
)[
0
]),
kv
.
split
(
"-"
)[
1
]);
}
return
map
;
}
/**
* @description 获取SQL保留字
* @return java.util.Map<java.lang.String,java.lang.Boolean>
* @author huangChaobin@esvtek.com
* @createTime 2020/08/04 9:13
**/
public
Map
<
String
,
Boolean
>
getSqlReservedWordsMap
()
{
if
(
null
!=
sqlReservedWordsMap
)
{
return
sqlReservedWordsMap
;
}
sqlReservedWordsMap
=
new
HashMap
<>(
1024
);
String
dataPath
=
"/data/SqlReservedWords.txt"
;
try
{
String
fileContent
=
FileUtils
.
getJarFileContent
(
this
.
getClass
(),
dataPath
);
String
[]
words
=
fileContent
.
split
(
","
);
for
(
int
i
=
0
;
i
<
words
.
length
;
i
++)
{
sqlReservedWordsMap
.
put
(
words
[
i
],
true
);
}
}
catch
(
Exception
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
return
sqlReservedWordsMap
;
}
}
src/main/java/com/esv/datacenter/iot/common/component/TimescaleComponent.java
View file @
20beff75
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.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.cloud.context.config.annotation.RefreshScope
;
...
...
@@ -66,9 +63,8 @@ public class TimescaleComponent {
@Autowired
private
DynamicDataSource
dynamicDataSource
;
@Autowired
private
FeignBaseService
feignBaseService
;
private
BaseDataComponent
baseDataComponent
;
/**
* @description 创建表
...
...
@@ -109,7 +105,7 @@ public class TimescaleComponent {
}
catch
(
Exception
e
)
{
log
.
error
(
"建表[{}]失败"
,
table
);
log
.
error
(
e
.
getMessage
(),
e
);
return
fals
e
;
throw
e
;
}
finally
{
// 关闭数据源
if
(
Objects
.
nonNull
(
dataSource
)
&&
!
dataSource
.
isClosed
())
{
...
...
@@ -128,7 +124,7 @@ public class TimescaleComponent {
* @createTime 2020/08/03 17:10
**/
public
Boolean
dropTable
(
Long
modelId
)
{
HikariDataSource
dataSource
=
this
.
getHikariDataSource
4Transaction
();
HikariDataSource
dataSource
=
this
.
getHikariDataSource
();
String
table
=
tablePrefix
+
modelId
;
try
{
...
...
@@ -149,7 +145,7 @@ public class TimescaleComponent {
}
catch
(
Exception
e
)
{
log
.
error
(
"删除表[{}]失败"
,
table
);
log
.
error
(
e
.
getMessage
(),
e
);
return
fals
e
;
throw
e
;
}
finally
{
// 关闭数据源
if
(
Objects
.
nonNull
(
dataSource
)
&&
!
dataSource
.
isClosed
())
{
...
...
@@ -162,8 +158,7 @@ public class TimescaleComponent {
private
String
generateCreateTableSql
(
String
table
,
List
<
ObjectModelPropertyEntity
>
propertyEntityList
)
{
// 获取字典表数据
String
dictType
=
"col_type"
;
Map
<
Integer
,
String
>
dictMap
=
this
.
getDictMap
(
dictType
);
Map
<
Integer
,
String
>
dbTableFieldMap
=
this
.
baseDataComponent
.
getDbTableFieldMap
();
// 获取表字段映射
Map
<
String
,
String
>
fieldMap
=
this
.
getTableFieldMap
();
...
...
@@ -173,10 +168,32 @@ public class TimescaleComponent {
sb
.
append
(
"create table if not exists "
).
append
(
table
).
append
(
"("
)
.
append
(
"time TIMESTAMPTZ NOT NULL,"
)
.
append
(
"instance_id int8 NULL"
);
String
propertyType
;
String
defaultValue
;
for
(
ObjectModelPropertyEntity
propertyEntity
:
propertyEntityList
)
{
propertyType
=
dbTableFieldMap
.
get
(
propertyEntity
.
getPropertyType
()).
toLowerCase
();
defaultValue
=
StringUtils
.
trimToNull
(
propertyEntity
.
getPropertyDefaultValue
());
sb
.
append
(
","
);
sb
.
append
(
propertyEntity
.
getPropertyCode
()).
append
(
" "
);
sb
.
append
(
fieldMap
.
get
(
dictMap
.
get
(
propertyEntity
.
getPropertyType
()))).
append
(
" NULL"
);
sb
.
append
(
fieldMap
.
get
(
propertyType
)).
append
(
" NULL"
);
if
(
Objects
.
nonNull
(
defaultValue
))
{
sb
.
append
(
" DEFAULT "
);
switch
(
propertyType
)
{
case
"boolean"
:
if
(
"true"
.
equalsIgnoreCase
(
defaultValue
))
{
sb
.
append
(
"'1'::\"bit\""
);
}
else
{
sb
.
append
(
"'0'::\"bit\""
);
}
break
;
case
"number"
:
sb
.
append
(
defaultValue
);
break
;
default
:
sb
.
append
(
"'"
).
append
(
defaultValue
).
append
(
"'::text"
);
break
;
}
}
}
sb
.
append
(
");"
);
...
...
@@ -204,19 +221,17 @@ public class TimescaleComponent {
StringBuffer
sb
=
new
StringBuffer
();
sb
.
append
(
"select t1.tablename"
)
.
append
(
" from pg_tables t1, pg_class t2"
)
.
append
(
" where t1.tablename
like
'"
)
.
append
(
table
Prefix
)
.
append
(
"
_%
' and t1.tablename = t2.relname"
)
.
append
(
" where t1.tablename
=
'"
)
.
append
(
table
)
.
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
;
}
if
(
null
!=
resultMapList
&&
0
<
resultMapList
.
size
())
{
return
true
;
}
return
false
;
...
...
@@ -253,24 +268,4 @@ public class TimescaleComponent {
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/filter/LogbackFilter.java
View file @
20beff75
package
com
.
esv
.
datacenter
.
iot
.
common
.
filter
;
import
com.esv.datacenter.iot.common.constants.CommonConstants
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
import
org.slf4j.MDC
;
...
...
@@ -39,7 +40,7 @@ public class LogbackFilter implements Filter {
filterChain
.
doFilter
(
servletRequest
,
servletResponse
);
}
finally
{
if
(
bInsertMDC
)
{
MDC
.
remove
(
"traceId"
);
MDC
.
remove
(
CommonConstants
.
LOG_TRACE_ID
);
}
}
}
...
...
@@ -50,10 +51,10 @@ public class LogbackFilter implements Filter {
}
private
boolean
setMDC
(
String
traceId
)
{
if
(
StringUtils
.
isEmpty
(
traceId
)
||
"null"
.
equalsIgnoreCase
(
traceId
))
{
if
(
StringUtils
.
isEmpty
(
traceId
)
||
CommonConstants
.
NULL_STRING
.
equalsIgnoreCase
(
traceId
))
{
traceId
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
}
MDC
.
put
(
"traceId"
,
traceId
);
MDC
.
put
(
CommonConstants
.
LOG_TRACE_ID
,
traceId
);
return
true
;
}
}
src/main/java/com/esv/datacenter/iot/common/util/FileUtils.java
0 → 100644
View file @
20beff75
package
com
.
esv
.
datacenter
.
iot
.
common
.
util
;
import
lombok.extern.slf4j.Slf4j
;
import
java.io.*
;
@Slf4j
public
class
FileUtils
{
public
static
String
readFileContent
(
String
fileName
)
{
String
fileContent
=
null
;
FileInputStream
fip
=
null
;
InputStreamReader
reader
=
null
;
try
{
File
f
=
new
File
(
fileName
);
fip
=
new
FileInputStream
(
f
);
reader
=
new
InputStreamReader
(
fip
,
"UTF-8"
);
StringBuffer
sb
=
new
StringBuffer
();
while
(
reader
.
ready
())
{
sb
.
append
((
char
)
reader
.
read
());
}
fileContent
=
sb
.
toString
();
}
catch
(
IOException
e
)
{
log
.
error
(
e
.
getMessage
());
}
finally
{
try
{
if
(
null
!=
reader
)
{
reader
.
close
();
}
if
(
null
!=
fip
)
{
fip
.
close
();
}
}
catch
(
IOException
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
}
return
fileContent
;
}
public
static
String
getJarFileContent
(
Class
<?>
c
,
String
dataPath
)
throws
Exception
{
InputStream
inputStream
=
c
.
getResourceAsStream
(
dataPath
);
BufferedReader
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
inputStream
,
"UTF-8"
));
StringBuffer
sb
=
new
StringBuffer
();
String
txt
;
while
((
txt
=
bufferedReader
.
readLine
())
!=
null
)
{
sb
.
append
(
txt
);
}
return
sb
.
toString
();
}
}
src/main/java/com/esv/datacenter/iot/module/omodel/controller/ObjectModelController.java
View file @
20beff75
package
com
.
esv
.
datacenter
.
iot
.
module
.
omodel
.
controller
;
import
com.alibaba.fastjson.JSON
;
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.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.ObjectModelPropertyService
;
import
com.esv.datacenter.iot.module.omodel.service.ObjectModelService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.lang3.StringUtils
;
...
...
@@ -37,10 +36,13 @@ public class ObjectModelController {
private
ObjectModelService
objectModelService
;
private
ObjectModelInstanceService
objectModelInstanceService
;
private
ObjectModelPropertyService
objectModelPropertyService
;
public
ObjectModelController
(
ObjectModelService
objectModelService
,
ObjectModelInstanceService
objectModelInstanceService
)
{
public
ObjectModelController
(
ObjectModelService
objectModelService
,
ObjectModelInstanceService
objectModelInstanceService
,
ObjectModelPropertyService
objectModelPropertyService
)
{
this
.
objectModelService
=
objectModelService
;
this
.
objectModelInstanceService
=
objectModelInstanceService
;
this
.
objectModelPropertyService
=
objectModelPropertyService
;
}
/**
...
...
@@ -52,14 +54,11 @@ public class ObjectModelController {
**/
@PostMapping
(
"/add"
)
public
EResponse
add
(
@RequestBody
@Validated
(
ValidatorInsert
.
class
)
ObjectModelForm
form
)
throws
EException
{
// 参数校验:模型属性
String
[]
notBlandParams
=
new
String
[]{
"propertyCode"
,
"propertyName"
,
"propertyType"
};
List
<
ModelPropertyForm
>
propertyList
=
form
.
getPropertyList
();
propertyList
.
forEach
(
property
->
{
ReqUtils
.
checkParamsNotBlank
(
JSON
.
parseObject
(
property
.
toString
()),
notBlandParams
);
});
// TODO,参数校验:模型属性是否数据库保留字段
// 将模型属性代码转换为小写
this
.
objectModelPropertyService
.
propertyCode2Lowercase
(
propertyList
);
// 模型属性校验
this
.
objectModelPropertyService
.
checkModelProperty
(
propertyList
);
Long
id
=
objectModelService
.
createObjectModel
(
form
);
JSONObject
data
=
new
JSONObject
();
...
...
@@ -113,7 +112,16 @@ public class ObjectModelController {
// 校验模型ID是否有效
this
.
checkIsValidModelId
(
form
.
getId
());
return
EResponse
.
ok
(
objectModelService
.
updateModel
(
form
));
List
<
ModelPropertyForm
>
propertyList
=
form
.
getPropertyList
();
// 将模型属性代码转换为小写
this
.
objectModelPropertyService
.
propertyCode2Lowercase
(
propertyList
);
// 模型属性校验
this
.
objectModelPropertyService
.
checkModelProperty
(
propertyList
);
// 更新模型
this
.
objectModelService
.
updateModel
(
form
);
return
EResponse
.
ok
();
}
/**
...
...
src/main/java/com/esv/datacenter/iot/module/omodel/service/ObjectModelPropertyService.java
View file @
20beff75
...
...
@@ -44,5 +44,23 @@ public interface ObjectModelPropertyService extends IService<ObjectModelProperty
**/
void
saveModelProperty
(
Long
modelId
,
List
<
ModelPropertyForm
>
propertyList
);
/**
* @description 校验属性
* @param propertyList:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 19:59
**/
void
checkModelProperty
(
List
<
ModelPropertyForm
>
propertyList
);
/**
* @description 属性代码转换为小写
* @param propertyList:
* @return void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/03 20:40
**/
void
propertyCode2Lowercase
(
List
<
ModelPropertyForm
>
propertyList
);
}
src/main/java/com/esv/datacenter/iot/module/omodel/service/ObjectModelService.java
View file @
20beff75
...
...
@@ -48,11 +48,11 @@ public interface ObjectModelService extends IService<ObjectModelEntity> {
/**
* @description 更新模型
* @param form:
* @return
java.lang.Integer
* @return
void
* @author huangChaobin@esvtek.com
* @createTime 2020/08/01 10:48
**/
Integer
updateModel
(
ObjectModelForm
form
);
void
updateModel
(
ObjectModelForm
form
);
/**
* @description 模型实例数
...
...
src/main/java/com/esv/datacenter/iot/module/omodel/service/impl/ObjectModelPropertyServiceImpl.java
View file @
20beff75
package
com
.
esv
.
datacenter
.
iot
.
module
.
omodel
.
service
.
impl
;
import
com.alibaba.fastjson.JSON
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.esv.datacenter.iot.common.component.BaseDataComponent
;
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.util.ReqUtils
;
import
com.esv.datacenter.iot.module.omodel.dao.ObjectModelPropertyDao
;
import
com.esv.datacenter.iot.module.omodel.entity.ObjectModelPropertyEntity
;
import
com.esv.datacenter.iot.module.omodel.form.ModelPropertyForm
;
import
com.esv.datacenter.iot.module.omodel.service.ObjectModelPropertyService
;
import
com.esv.datacenter.iot.module.omodel.vo.ModelPropertyVO
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.BeanUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
@Service
(
"objectModelPropertyService"
)
public
class
ObjectModelPropertyServiceImpl
extends
ServiceImpl
<
ObjectModelPropertyDao
,
ObjectModelPropertyEntity
>
implements
ObjectModelPropertyService
{
@Autowired
private
BaseDataComponent
baseDataComponent
;
@Override
public
Integer
logicDeleteModelProperty
(
ObjectModelPropertyEntity
entity
)
{
return
this
.
getBaseMapper
().
logicDeleteModelProperty
(
entity
);
...
...
@@ -71,4 +84,59 @@ public class ObjectModelPropertyServiceImpl extends ServiceImpl<ObjectModelPrope
this
.
updateById
(
entity
);
}
}
@Override
public
void
checkModelProperty
(
List
<
ModelPropertyForm
>
propertyList
)
{
Map
<
Integer
,
String
>
dbTableFieldMap
=
this
.
baseDataComponent
.
getDbTableFieldMap
();
Map
<
String
,
Boolean
>
sqlReservedWordsMap
=
this
.
baseDataComponent
.
getSqlReservedWordsMap
();
String
[]
notBlandParams
=
new
String
[]{
"propertyCode"
,
"propertyName"
,
"propertyType"
};
propertyList
.
forEach
(
property
->
{
// 必填校验
ReqUtils
.
checkParamsNotBlank
(
JSON
.
parseObject
(
property
.
toString
()),
notBlandParams
);
// propertyCode是否为保留字校验
if
(
sqlReservedWordsMap
.
containsKey
(
property
.
getPropertyCode
()))
{
throw
new
EException
(
ECode
.
PARAM_ERROR
.
code
(),
"属性代码["
+
property
.
getPropertyCode
()+
"]为保留字段"
);
}
// propertyType校验
if
(!
dbTableFieldMap
.
containsKey
(
property
.
getPropertyType
()))
{
throw
new
EException
(
ECode
.
PARAM_ERROR
.
code
(),
"无效的属性类型["
+
property
.
getPropertyType
()+
"]"
);
}
// propertyDefaultValue校验
String
propertyType
=
dbTableFieldMap
.
get
(
property
.
getPropertyType
());
String
propertyDefaultValue
=
StringUtils
.
trimToNull
(
property
.
getPropertyDefaultValue
());
if
(
Objects
.
nonNull
(
propertyDefaultValue
))
{
switch
(
propertyType
)
{
case
"boolean"
:
if
(!
Boolean
.
TRUE
.
toString
().
equalsIgnoreCase
(
propertyDefaultValue
)
&&
!
Boolean
.
FALSE
.
toString
().
equalsIgnoreCase
(
propertyDefaultValue
))
{
throw
new
EException
(
ECode
.
PARAM_ERROR
.
code
(),
"无效的默认值["
+
propertyDefaultValue
+
"]"
);
}
break
;
case
"number"
:
try
{
new
BigDecimal
(
propertyDefaultValue
);
}
catch
(
Exception
e
)
{
throw
new
EException
(
ECode
.
PARAM_ERROR
.
code
(),
"无效的默认值["
+
propertyDefaultValue
+
"]"
);
}
break
;
default
:
break
;
}
}
});
}
@Override
public
void
propertyCode2Lowercase
(
List
<
ModelPropertyForm
>
propertyList
)
{
for
(
int
i
=
0
;
i
<
propertyList
.
size
();
i
++)
{
ModelPropertyForm
form
=
propertyList
.
get
(
i
);
if
(
Objects
.
nonNull
(
form
.
getPropertyCode
()))
{
form
.
setPropertyCode
(
form
.
getPropertyCode
().
toLowerCase
());
propertyList
.
set
(
i
,
form
);
}
}
}
}
\ No newline at end of file
src/main/java/com/esv/datacenter/iot/module/omodel/service/impl/ObjectModelServiceImpl.java
View file @
20beff75
...
...
@@ -113,7 +113,7 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
@Override
@Transactional
(
rollbackFor
=
Exception
.
class
)
public
Integer
updateModel
(
ObjectModelForm
form
)
{
public
void
updateModel
(
ObjectModelForm
form
)
{
Long
modelId
=
form
.
getId
();
// 模型名称校验:不能重复
...
...
@@ -125,6 +125,13 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
throw
new
EException
(
ECode
.
BIZ_PARAM_ERROR
.
code
(),
"模型["
+
form
.
getName
()
+
"]已存在"
);
}
// 更新模型
ObjectModelEntity
modelEntity
=
new
ObjectModelEntity
();
modelEntity
.
setId
(
modelId
);
modelEntity
.
setName
(
form
.
getName
());
modelEntity
.
setDescription
(
form
.
getDescription
());
this
.
getBaseMapper
().
updateById
(
modelEntity
);
// 判断是否修改模型属性并校验
List
<
ModelPropertyForm
>
propertyList
=
form
.
getPropertyList
();
if
(
null
!=
propertyList
&&
0
<
propertyList
.
size
())
{
...
...
@@ -134,14 +141,13 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
// 保存模型属性
this
.
objectModelPropertyService
.
saveModelProperty
(
modelId
,
propertyList
);
}
// 更新模型
ObjectModelEntity
modelEntity
=
new
ObjectModelEntity
(
);
modelEntity
.
setId
(
modelId
);
modelEntity
.
setName
(
form
.
getName
());
modelEntity
.
setDescription
(
form
.
getDescription
()
);
return
this
.
getBaseMapper
().
updateById
(
modelEntity
);
// 删除时序数据库表
this
.
timescaleComponent
.
dropTable
(
modelId
);
// 创建时序数据库表
this
.
createModelTimescaleDB
(
modelEntity
,
form
);
}
}
@Override
...
...
@@ -150,7 +156,7 @@ public class ObjectModelServiceImpl extends ServiceImpl<ObjectModelDao, ObjectMo
// 获取模型实例数
int
modelInstanceCount
=
this
.
modelInstanceCount
(
modelId
);
if
(
0
<
modelInstanceCount
)
{
throw
new
EException
(
ECode
.
BIZ_PARAM_ERROR
.
code
(),
"该模型已有实例,不能删除"
);
throw
new
EException
(
ECode
.
BIZ_PARAM_ERROR
.
code
(),
"该模型已有
"
+
modelInstanceCount
+
"个
实例,不能删除"
);
}
// 逻辑删除模型
...
...
src/main/resources/application-demo.yml
View file @
20beff75
...
...
@@ -68,6 +68,10 @@ ribbon:
enabled
:
true
clients
:
datacenter-base-service
feign-base-service-name
:
datacenter-base-service
db
:
dict
:
table-field
:
map
:
1-string,2-number,3-boolean
timescale
:
data-source
:
jdbc-url
:
jdbc:postgresql://192.168.31.248:5432/iot
...
...
src/main/resources/application-dev.yml
View file @
20beff75
...
...
@@ -68,6 +68,10 @@ ribbon:
enabled
:
true
clients
:
datacenter-base-service
feign-base-service-name
:
datacenter-base-service
db
:
dict
:
table-field
:
map
:
1-string,2-number,3-boolean
timescale
:
data-source
:
jdbc-url
:
jdbc:postgresql://192.168.31.248:5432/iot
...
...
src/main/resources/application-local.yml
View file @
20beff75
...
...
@@ -68,6 +68,10 @@ ribbon:
enabled
:
true
clients
:
datacenter-base-service
feign-base-service-name
:
datacenter-base-service
db
:
dict
:
table-field
:
map
:
1-string,2-number,3-boolean
timescale
:
data-source
:
jdbc-url
:
jdbc:postgresql://192.168.31.248:5432/iot
...
...
src/main/resources/application-test.yml
View file @
20beff75
...
...
@@ -68,6 +68,10 @@ ribbon:
enabled
:
true
clients
:
datacenter-base-service
feign-base-service-name
:
datacenter-base-service
db
:
dict
:
table-field
:
map
:
1-string,2-number,3-boolean
timescale
:
data-source
:
jdbc-url
:
jdbc:postgresql://192.168.31.248:5432/iot
...
...
src/main/resources/data/SqlReservedWords.txt
0 → 100644
View file @
20beff75
abort
,abs
,absolute
,access
,action
,ada
,add
,admin
,after
,aggregate
,alias
,all
,allocate
,also
,alter
,always
,analyse
,analyze
,and
,any
,are
,array
,as
,asc
,asensitive
,assertion
,assignment
,asymmetric
,at
,atomic
,attribute
,attributes
,audit
,authorization
,auto_increment
,avg
,avg_row_length
,backup
,backward
,before
,begin
,bernoulli
,between
,bigint
,binary
,bit
,bit_length
,bitvar
,blob
,bool
,boolean
,both
,breadth
,break
,browse
,bulk
,by
,cache
,call
,called
,cardinality
,cascade
,cascaded
,case
,cast
,catalog
,catalog_name
,ceil
,ceiling
,chain
,change
,char
,char_length
,character
,character_length
,character_set_catalog
,character_set_name
,character_set_schema
,characteristics
,characters
,check
,checked
,checkpoint
,checksum
,class
,class_origin
,clob
,close
,cluster
,clustered
,coalesce
,cobol
,collate
,collation
,collation_catalog
,collation_name
,collation_schema
,collect
,column
,column_name
,columns
,command_function
,command_function_code
,comment
,commit
,committed
,completion
,compress
,compute
,condition
,condition_number
,connect
,connection
,connection_name
,constraint
,constraint_catalog
,constraint_name
,constraint_schema
,constraints
,constructor
,contains
,containstable
,continue
,conversion
,convert
,copy
,corr
,corresponding
,count
,covar_pop
,covar_samp
,create
,createdb
,createrole
,createuser
,cross
,csv
,cube
,cume_dist
,current
,current_date
,current_default_transform_group
,current_path
,current_role
,current_time
,current_timestamp
,current_transform_group_for_type
,current_user
,cursor
,cursor_name
,cycle
,data
,database
,databases
,date
,datetime
,datetime_interval_code
,datetime_interval_precision
,day
,day_hour
,day_microsecond
,day_minute
,day_second
,dayofmonth
,dayofweek
,dayofyear
,dbcc
,deallocate
,dec
,decimal
,declare
,default
,defaults
,deferrable
,deferred
,defined
,definer
,degree
,delay_key_write
,delayed
,delete
,delimiter
,delimiters
,dense_rank
,deny
,depth
,deref
,derived
,desc
,describe
,descriptor
,destroy
,destructor
,deterministic
,diagnostics
,dictionary
,disable
,disconnect
,disk
,dispatch
,distinct
,distinctrow
,distributed
,div
,do
,domain
,double
,drop
,dual
,dummy
,dump
,dynamic
,dynamic_function
,dynamic_function_code
,each
,element
,else
,elseif
,enable
,enclosed
,encoding
,encrypted
,end
,end-exec
,enum
,equals
,errlvl
,escape
,escaped
,every
,except
,exception
,exclude
,excluding
,exclusive
,exec
,execute
,existing
,exists
,exit
,exp
,explain
,external
,extract
,false
,fetch
,fields
,file
,fillfactor
,filter
,final
,first
,float
,float4
,float8
,floor
,flush
,following
,for
,force
,foreign
,fortran
,forward
,found
,free
,freetext
,freetexttable
,freeze
,from
,full
,fulltext
,function
,fusion
,general
,generated
,get
,global
,go
,goto
,grant
,granted
,grants
,greatest
,group
,grouping
,handler
,having
,header
,heap
,hierarchy
,high_priority
,hold
,holdlock
,host
,hosts
,hour
,hour_microsecond
,hour_minute
,hour_second
,identified
,identity
,identity_insert
,identitycol
,if
,ignore
,ilike
,immediate
,immutable
,implementation
,implicit
,in
,include
,including
,increment
,index
,indicator
,infile
,infix
,inherit
,inherits
,initial
,initialize
,initially
,inner
,inout
,input
,insensitive
,insert
,insert_id
,instance
,instantiable
,instead
,int
,int1
,int2
,int3
,int4
,int8
,integer
,intersect
,intersection
,interval
,into
,invoker
,is
,isam
,isnull
,isolation
,iterate
,join
,key
,key_member
,key_type
,keys
,kill
,lancompiler
,language
,large
,last
,last_insert_id
,lateral
,leading
,least
,leave
,left
,length
,less
,level
,like
,limit
,lineno
,lines
,listen
,ln
,load
,local
,localtime
,localtimestamp
,location
,locator
,lock
,login
,logs
,long
,longblob
,longtext
,loop
,low_priority
,lower
,map
,match
,matched
,max
,max_rows
,maxextents
,maxvalue
,mediumblob
,mediumint
,mediumtext
,member
,merge
,message_length
,message_octet_length
,message_text
,method
,middleint
,min
,min_rows
,minus
,minute
,minute_microsecond
,minute_second
,minvalue
,mlslabel
,mod
,mode
,modifies
,modify
,module
,month
,monthname
,more
,move
,multiset
,mumps
,myisam
,name
,names
,national
,natural
,nchar
,nclob
,nesting
,new
,next
,no
,no_write_to_binlog
,noaudit
,nocheck
,nocompress
,nocreatedb
,nocreaterole
,nocreateuser
,noinherit
,nologin
,nonclustered
,none
,normalize
,normalized
,nosuperuser
,not
,nothing
,notify
,notnull
,nowait
,null
,nullable
,nullif
,nulls
,number
,numeric
,object
,octet_length
,octets
,of
,off
,offline
,offset
,offsets
,oids
,old
,on
,online
,only
,open
,opendatasource
,openquery
,openrowset
,openxml
,operation
,operator
,optimize
,option
,optionally
,options
,or
,order
,ordering
,ordinality
,others
,out
,outer
,outfile
,output
,over
,overlaps
,overlay
,overriding
,owner
,pack_keys
,pad
,parameter
,parameter_mode
,parameter_name
,parameter_ordinal_position
,parameter_specific_catalog
,parameter_specific_name
,parameter_specific_schema
,parameters
,partial
,partition
,pascal
,password
,path
,pctfree
,percent
,percent_rank
,percentile_cont
,percentile_disc
,placing
,plan
,pli
,position
,postfix
,power
,preceding
,precision
,prefix
,preorder
,prepare
,prepared
,preserve
,primary
,print
,prior
,privileges
,proc
,procedural
,procedure
,process
,processlist
,public
,purge
,quote
,raid0
,raiserror
,range
,rank
,raw
,read
,reads
,readtext
,real
,recheck
,reconfigure
,recursive
,ref
,references
,referencing
,regexp
,regr_avgx
,regr_avgy
,regr_count
,regr_intercept
,regr_r2
,regr_slope
,regr_sxx
,regr_sxy
,regr_syy
,reindex
,relative
,release
,reload
,rename
,repeat
,repeatable
,replace
,replication
,require
,reset
,resignal
,resource
,restart
,restore
,restrict
,result
,return
,returned_cardinality
,returned_length
,returned_octet_length
,returned_sqlstate
,returns
,revoke
,right
,rlike
,role
,rollback
,rollup
,routine
,routine_catalog
,routine_name
,routine_schema
,row
,row_count
,row_number
,rowcount
,rowguidcol
,rowid
,rownum
,rows
,rule
,save
,savepoint
,scale
,schema
,schema_name
,schemas
,scope
,scope_catalog
,scope_name
,scope_schema
,scroll
,search
,second
,second_microsecond
,section
,security
,select
,self
,sensitive
,separator
,sequence
,serializable
,server_name
,session
,session_user
,set
,setof
,sets
,setuser
,share
,show
,shutdown
,signal
,similar
,simple
,size
,smallint
,some
,soname
,source
,space
,spatial
,specific
,specific_name
,specifictype
,sql
,sql_big_result
,sql_big_selects
,sql_big_tables
,sql_calc_found_rows
,sql_log_off
,sql_log_update
,sql_low_priority_updates
,sql_select_limit
,sql_small_result
,sql_warnings
,sqlca
,sqlcode
,sqlerror
,sqlexception
,sqlstate
,sqlwarning
,sqrt
,ssl
,stable
,start
,starting
,state
,statement
,static
,statistics
,status
,stddev_pop
,stddev_samp
,stdin
,stdout
,storage
,straight_join
,strict
,string
,structure
,style
,subclass_origin
,sublist
,submultiset
,substring
,successful
,sum
,superuser
,symmetric
,synonym
,sysdate
,sysid
,system
,system_user
,table
,table_name
,tables
,tablesample
,tablespace
,temp
,template
,temporary
,terminate
,terminated
,text
,textsize
,than
,then
,ties
,time
,timestamp
,timezone_hour
,timezone_minute
,tinyblob
,tinyint
,tinytext
,to
,toast
,top
,top_level_count
,trailing
,tran
,transaction
,transaction_active
,transactions_committed
,transactions_rolled_back
,transform
,transforms
,translate
,translation
,treat
,trigger
,trigger_catalog
,trigger_name
,trigger_schema
,trim
,true
,truncate
,trusted
,tsequal
,type
,uescape
,uid
,unbounded
,uncommitted
,under
,undo
,unencrypted
,union
,unique
,unknown
,unlisten
,unlock
,unnamed
,unnest
,unsigned
,until
,update
,updatetext
,upper
,usage
,use
,user
,user_defined_type_catalog
,user_defined_type_code
,user_defined_type_name
,user_defined_type_schema
,using
,utc_date
,utc_time
,utc_timestamp
,vacuum
,valid
,validate
,validator
,value
,values
,var_pop
,var_samp
,varbinary
,varchar
,varchar2
,varcharacter
,variable
,variables
,varying
,verbose
,view
,volatile
,waitfor
,when
,whenever
,where
,while
,width_bucket
,window
,with
,within
,without
,work
,write
,writetext
,x509
,xor
,year
,year_month
,zerofill
,zone
\ No newline at end of file
src/test/java/com/esv/datacenter/iot/SimpleTest.java
0 → 100644
View file @
20beff75
package
com
.
esv
.
datacenter
.
iot
;
import
com.esv.datacenter.iot.common.util.FileUtils
;
import
lombok.extern.slf4j.Slf4j
;
import
org.junit.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
/**
* @description:
* @author: huangchaobin@esvtek.com
* @createTime: 2020/08/04 9:06
* @version:1.0
*/
@SpringBootTest
@Slf4j
public
class
SimpleTest
{
@Test
public
void
test
()
{
String
dataPath
=
"/data/SqlReservedWords.txt"
;
try
{
String
fileContent
=
FileUtils
.
getJarFileContent
(
this
.
getClass
(),
dataPath
);
String
[]
datas
=
fileContent
.
split
(
","
);
log
.
info
(
fileContent
);
log
.
info
(
datas
[
0
]);
log
.
info
(
datas
[
1
]);
}
catch
(
Exception
e
)
{
log
.
error
(
e
.
getMessage
(),
e
);
}
}
}
src/test/java/com/esv/datacenter/iot/common/component/TimescaleComponentTest.java
View file @
20beff75
...
...
@@ -29,7 +29,7 @@ public class TimescaleComponentTest {
@Test
public
void
createTable_test
()
{
Long
modelId
=
999L
;
Long
modelId
=
999
99
L
;
ModelAndInstanceDto
modelAndInstanceDto
=
new
ModelAndInstanceDto
();
ObjectModelEntity
objectModelEntity
=
new
ObjectModelEntity
();
...
...
@@ -40,6 +40,28 @@ public class TimescaleComponentTest {
ObjectModelPropertyEntity
objectModelPropertyEntity
=
new
ObjectModelPropertyEntity
();
objectModelPropertyEntity
.
setPropertyCode
(
"temp"
);
objectModelPropertyEntity
.
setPropertyType
(
2
);
objectModelPropertyEntity
.
setPropertyDefaultValue
(
"26"
);
objectModelPropertyEntity
.
setPropertyName
(
"温度"
);
objectModelPropertyEntity
.
setPropertyUnit
(
"摄氏度"
);
objectModelPropertyEntityList
.
add
(
objectModelPropertyEntity
);
modelAndInstanceDto
.
setObjectModelPropertyEntityList
(
objectModelPropertyEntityList
);
objectModelPropertyEntity
=
new
ObjectModelPropertyEntity
();
objectModelPropertyEntity
.
setPropertyCode
(
"hum"
);
objectModelPropertyEntity
.
setPropertyType
(
2
);
objectModelPropertyEntity
.
setPropertyName
(
"湿度"
);
objectModelPropertyEntityList
.
add
(
objectModelPropertyEntity
);
modelAndInstanceDto
.
setObjectModelPropertyEntityList
(
objectModelPropertyEntityList
);
objectModelPropertyEntity
=
new
ObjectModelPropertyEntity
();
objectModelPropertyEntity
.
setPropertyCode
(
"deleted"
);
objectModelPropertyEntity
.
setPropertyType
(
3
);
objectModelPropertyEntity
.
setPropertyName
(
"是否删除"
);
objectModelPropertyEntity
.
setPropertyDefaultValue
(
"false"
);
objectModelPropertyEntityList
.
add
(
objectModelPropertyEntity
);
modelAndInstanceDto
.
setObjectModelPropertyEntityList
(
objectModelPropertyEntityList
);
objectModelPropertyEntity
=
new
ObjectModelPropertyEntity
();
objectModelPropertyEntity
.
setPropertyCode
(
"remark"
);
objectModelPropertyEntity
.
setPropertyType
(
1
);
objectModelPropertyEntity
.
setPropertyName
(
"备注"
);
objectModelPropertyEntityList
.
add
(
objectModelPropertyEntity
);
modelAndInstanceDto
.
setObjectModelPropertyEntityList
(
objectModelPropertyEntityList
);
...
...
@@ -49,7 +71,7 @@ public class TimescaleComponentTest {
@Test
public
void
dropTable_test
()
{
Long
modelId
=
999L
;
Long
modelId
=
999
99
L
;
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