Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
T
traffic-signal-platform
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
signal
traffic-signal-platform
Commits
e4f75e3f
Commit
e4f75e3f
authored
Feb 06, 2023
by
duanruiming
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[add] 态势检测-辖区分组、区域列表
parent
c9a388ff
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
197 additions
and
36 deletions
+197
-36
SituationDetectionController.java
...et/wanji/web/controller/SituationDetectionController.java
+17
-0
TBaseCrossInfoController.java
...va/net/wanji/web/controller/TBaseCrossInfoController.java
+2
-1
TBaseAreaCross.java
...ce/src/main/java/net/wanji/web/entity/TBaseAreaCross.java
+26
-0
TBaseAreaCrossMapper.java
.../main/java/net/wanji/web/mapper/TBaseAreaCrossMapper.java
+13
-0
TBaseAreaInfoMapper.java
...c/main/java/net/wanji/web/mapper/TBaseAreaInfoMapper.java
+3
-0
AreaTreePO.java
...ol-service/src/main/java/net/wanji/web/po/AreaTreePO.java
+9
-10
SituationDetectionService.java
...java/net/wanji/web/service/SituationDetectionService.java
+5
-0
TBaseCrossInfoService.java
...ain/java/net/wanji/web/service/TBaseCrossInfoService.java
+2
-2
SituationDetectionServiceImpl.java
...wanji/web/service/impl/SituationDetectionServiceImpl.java
+79
-22
AreaListVO.java
.../java/net/wanji/web/vo/situationDetection/AreaListVO.java
+21
-0
TBaseAreaCrossMapper.xml
...ervice/src/main/resources/mapper/TBaseAreaCrossMapper.xml
+11
-0
TBaseAreaInfoMapper.xml
...service/src/main/resources/mapper/TBaseAreaInfoMapper.xml
+9
-1
No files found.
signal-control-service/src/main/java/net/wanji/web/controller/SituationDetectionController.java
View file @
e4f75e3f
...
@@ -3,6 +3,7 @@ package net.wanji.web.controller;
...
@@ -3,6 +3,7 @@ package net.wanji.web.controller;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.Api
;
import
io.swagger.annotations.ApiOperation
;
import
io.swagger.annotations.ApiOperation
;
import
net.wanji.feign.pojo.result.JsonViewObject
;
import
net.wanji.feign.pojo.result.JsonViewObject
;
import
net.wanji.web.po.AreaTreePO
;
import
net.wanji.web.service.SituationDetectionService
;
import
net.wanji.web.service.SituationDetectionService
;
import
net.wanji.web.vo.situationDetection.*
;
import
net.wanji.web.vo.situationDetection.*
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
@@ -168,4 +169,20 @@ public class SituationDetectionController extends BaseController {
...
@@ -168,4 +169,20 @@ public class SituationDetectionController extends BaseController {
return
jsonViewObject
.
success
(
list
);
return
jsonViewObject
.
success
(
list
);
}
}
@ApiOperation
(
value
=
"辖区分组"
,
notes
=
"辖区分组"
)
@GetMapping
(
"/jurisdictionTree"
)
public
JsonViewObject
jurisdictionTree
()
{
List
<
AreaTreePO
>
areaTreePOS
=
situationDetectionService
.
jurisdictionTree
();
JsonViewObject
jsonViewObject
=
JsonViewObject
.
newInstance
();
return
jsonViewObject
.
success
(
areaTreePOS
);
}
@ApiOperation
(
value
=
"查询区域列表"
,
notes
=
"辖区分组"
)
@GetMapping
(
"/selectAreaList"
)
public
JsonViewObject
selectAreaList
(
Integer
areaId
)
{
List
<
AreaListVO
>
areaListVOS
=
situationDetectionService
.
selectAreaList
(
areaId
);
JsonViewObject
jsonViewObject
=
JsonViewObject
.
newInstance
();
return
jsonViewObject
.
success
(
areaListVOS
);
}
}
}
signal-control-service/src/main/java/net/wanji/web/controller/TBaseCrossInfoController.java
View file @
e4f75e3f
...
@@ -56,7 +56,8 @@ public class TBaseCrossInfoController {
...
@@ -56,7 +56,8 @@ public class TBaseCrossInfoController {
@ApiOperation
(
value
=
"路网管理-路口管理-区域名称下拉框"
,
notes
=
"路网管理-路口管理-区域名称下拉框"
)
@ApiOperation
(
value
=
"路网管理-路口管理-区域名称下拉框"
,
notes
=
"路网管理-路口管理-区域名称下拉框"
)
@GetMapping
(
"/areaTree"
)
@GetMapping
(
"/areaTree"
)
public
JsonViewObject
areaTree
()
{
public
JsonViewObject
areaTree
()
{
return
crossInfoService
.
areaTree
();
JsonViewObject
jsonViewObject
=
JsonViewObject
.
newInstance
();
return
jsonViewObject
.
success
(
crossInfoService
.
areaTree
());
}
}
}
}
signal-control-service/src/main/java/net/wanji/web/entity/TBaseAreaCross.java
0 → 100644
View file @
e4f75e3f
package
net
.
wanji
.
web
.
entity
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.Date
;
/**
* @author duanruiming
* @date 2023/02/06 14:56
*/
@Data
@ApiModel
(
value
=
"区域路口实体"
,
description
=
"区域路口实体"
)
public
class
TBaseAreaCross
{
@ApiModelProperty
(
name
=
"id"
,
notes
=
""
)
private
Integer
id
;
@ApiModelProperty
(
name
=
"区域编号"
,
notes
=
""
)
private
Integer
areaId
;
@ApiModelProperty
(
name
=
"路口编号"
,
notes
=
""
)
private
String
crossId
;
@ApiModelProperty
(
name
=
"创建时间"
,
notes
=
""
)
private
Date
gmtCreate
;
@ApiModelProperty
(
name
=
"修改时间"
,
notes
=
""
)
private
Date
gmtModified
;
}
signal-control-service/src/main/java/net/wanji/web/mapper/TBaseAreaCrossMapper.java
0 → 100644
View file @
e4f75e3f
package
net
.
wanji
.
web
.
mapper
;
import
com.baomidou.mybatisplus.core.mapper.BaseMapper
;
import
net.wanji.web.entity.TBaseAreaCross
;
import
org.springframework.stereotype.Repository
;
/**
* @author duanruiming
* @date 2023/02/06 15:01
*/
@Repository
public
interface
TBaseAreaCrossMapper
extends
BaseMapper
<
TBaseAreaCross
>
{
}
signal-control-service/src/main/java/net/wanji/web/mapper/TBaseAreaInfoMapper.java
View file @
e4f75e3f
...
@@ -33,4 +33,7 @@ public interface TBaseAreaInfoMapper extends BaseMapper<TBaseAreaInfo> {
...
@@ -33,4 +33,7 @@ public interface TBaseAreaInfoMapper extends BaseMapper<TBaseAreaInfo> {
int
updateByPrimaryKey
(
TBaseAreaInfo
record
);
int
updateByPrimaryKey
(
TBaseAreaInfo
record
);
List
<
AreaTreePO
>
selectAreaTree
();
List
<
AreaTreePO
>
selectAreaTree
();
List
<
AreaTreePO
>
selectJurisdictionArea
();
}
}
signal-control-service/src/main/java/net/wanji/web/po/AreaTreePO.java
View file @
e4f75e3f
package
net
.
wanji
.
web
.
po
;
package
net
.
wanji
.
web
.
po
;
import
lombok.Getter
;
import
io.swagger.annotations.ApiModel
;
import
lombok.Setter
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.List
;
import
java.util.List
;
...
@@ -13,22 +14,20 @@ import java.util.List;
...
@@ -13,22 +14,20 @@ import java.util.List;
* @author wj
* @author wj
* @since 2022-11-28
* @since 2022-11-28
*/
*/
@
Getter
@
Data
@
Setter
@
ApiModel
(
value
=
"树形区域目录实体"
,
description
=
"树形区域目录实体"
)
public
class
AreaTreePO
{
public
class
AreaTreePO
{
/**
@ApiModelProperty
(
value
=
"行政区划代码"
)
* 行政区划代码
*/
private
Integer
areaCode
;
private
Integer
areaCode
;
/**
@ApiModelProperty
(
value
=
"行政区划名称"
)
* 行政区划名称
*/
private
String
areaName
;
private
String
areaName
;
@ApiModelProperty
(
value
=
"父行政区划代码"
)
private
Integer
parentCode
;
private
Integer
parentCode
;
@ApiModelProperty
(
value
=
"子行政区划列表"
)
private
List
<
AreaTreePO
>
children
;
private
List
<
AreaTreePO
>
children
;
}
}
signal-control-service/src/main/java/net/wanji/web/service/SituationDetectionService.java
View file @
e4f75e3f
package
net
.
wanji
.
web
.
service
;
package
net
.
wanji
.
web
.
service
;
import
net.wanji.web.entity.TBaseCrossInfo
;
import
net.wanji.web.entity.TBaseCrossInfo
;
import
net.wanji.web.po.AreaTreePO
;
import
net.wanji.web.vo.situationDetection.*
;
import
net.wanji.web.vo.situationDetection.*
;
import
java.text.ParseException
;
import
java.text.ParseException
;
...
@@ -34,4 +35,8 @@ public interface SituationDetectionService {
...
@@ -34,4 +35,8 @@ public interface SituationDetectionService {
List
<
CrossDeviceStatusInfoOutVO
>
crossDeviceStatusInfo
();
List
<
CrossDeviceStatusInfoOutVO
>
crossDeviceStatusInfo
();
TBaseCrossInfo
selectCrossInfoById
(
String
signalId
);
TBaseCrossInfo
selectCrossInfoById
(
String
signalId
);
List
<
AreaTreePO
>
jurisdictionTree
();
List
<
AreaListVO
>
selectAreaList
(
Integer
areaId
);
}
}
signal-control-service/src/main/java/net/wanji/web/service/TBaseCrossInfoService.java
View file @
e4f75e3f
...
@@ -157,7 +157,7 @@ public class TBaseCrossInfoService {
...
@@ -157,7 +157,7 @@ public class TBaseCrossInfoService {
* 区域名称下拉框
* 区域名称下拉框
*
*
*/
*/
public
JsonViewObject
areaTree
()
{
public
List
<
AreaTreePO
>
areaTree
()
{
List
<
AreaTreePO
>
infos
=
areaInfoMapper
.
selectAreaTree
();
List
<
AreaTreePO
>
infos
=
areaInfoMapper
.
selectAreaTree
();
// 构建树
// 构建树
Map
<
Integer
,
List
<
AreaTreePO
>>
parentCodeMap
=
infos
.
stream
().
collect
(
Collectors
.
groupingBy
(
AreaTreePO:
:
getParentCode
));
Map
<
Integer
,
List
<
AreaTreePO
>>
parentCodeMap
=
infos
.
stream
().
collect
(
Collectors
.
groupingBy
(
AreaTreePO:
:
getParentCode
));
...
@@ -170,6 +170,6 @@ public class TBaseCrossInfoService {
...
@@ -170,6 +170,6 @@ public class TBaseCrossInfoService {
}
}
}
}
infos
=
infos
.
stream
().
filter
(
po
->
po
.
getParentCode
()
!=
null
).
collect
(
Collectors
.
toList
());
infos
=
infos
.
stream
().
filter
(
po
->
po
.
getParentCode
()
!=
null
).
collect
(
Collectors
.
toList
());
return
JsonViewObject
.
newInstance
().
success
(
infos
)
;
return
infos
;
}
}
}
}
signal-control-service/src/main/java/net/wanji/web/service/impl/SituationDetectionServiceImpl.java
View file @
e4f75e3f
...
@@ -3,15 +3,19 @@ package net.wanji.web.service.impl;
...
@@ -3,15 +3,19 @@ package net.wanji.web.service.impl;
import
cn.hutool.core.date.DateField
;
import
cn.hutool.core.date.DateField
;
import
cn.hutool.core.date.DateUnit
;
import
cn.hutool.core.date.DateUnit
;
import
cn.hutool.core.date.DateUtil
;
import
cn.hutool.core.date.DateUtil
;
import
com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper
;
import
lombok.RequiredArgsConstructor
;
import
net.wanji.web.common.enums.*
;
import
net.wanji.web.common.enums.*
;
import
net.wanji.web.common.util.CrossUtil
;
import
net.wanji.web.common.util.CrossUtil
;
import
net.wanji.web.entity.TBaseAreaCross
;
import
net.wanji.web.entity.TBaseAreaInfo
;
import
net.wanji.web.entity.TBaseCrossInfo
;
import
net.wanji.web.entity.TBaseCrossInfo
;
import
net.wanji.web.mapper.*
;
import
net.wanji.web.mapper.*
;
import
net.wanji.web.po.*
;
import
net.wanji.web.po.*
;
import
net.wanji.web.service.SituationDetectionService
;
import
net.wanji.web.service.SituationDetectionService
;
import
net.wanji.web.service.TBaseCrossInfoService
;
import
net.wanji.web.vo.situationDetection.*
;
import
net.wanji.web.vo.situationDetection.*
;
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.text.ParseException
;
import
java.text.ParseException
;
...
@@ -26,29 +30,22 @@ import java.util.stream.Collectors;
...
@@ -26,29 +30,22 @@ import java.util.stream.Collectors;
* @date 2022/10/26 13:48
* @date 2022/10/26 13:48
*/
*/
@Service
@Service
@RequiredArgsConstructor
public
class
SituationDetectionServiceImpl
implements
SituationDetectionService
{
public
class
SituationDetectionServiceImpl
implements
SituationDetectionService
{
@Autowired
private
final
OptRecordsMapper
optRecordsMapper
;
OptRecordsMapper
optRecordsMapper
;
private
final
CrossAlarmMapper
crossAlarmMapper
;
@Autowired
private
final
EventAlarmMapper
eventAlarmMapper
;
CrossAlarmMapper
crossAlarmMapper
;
private
final
ControlHistMapper
controlHistMapper
;
@Autowired
private
final
VehicleTraceMapper
vehicleTraceMapper
;
EventAlarmMapper
eventAlarmMapper
;
private
final
VideoDeviceInfoMapper
videoDeviceInfoMapper
;
@Autowired
private
final
GreenwaveRealtimeMapper
greenwaveRealtimeMapper
;
ControlHistMapper
controlHistMapper
;
private
final
AllDeviceStatusMapper
allDeviceStatusMapper
;
@Autowired
private
final
GreenwaveCrossMapper
greenwaveCrossMapper
;
VehicleTraceMapper
vehicleTraceMapper
;
private
final
TBaseCrossInfoMapper
tBaseCrossInfoMapper
;
@Autowired
private
final
TBaseAreaInfoMapper
tBaseAreaInfoMapper
;
VideoDeviceInfoMapper
videoDeviceInfoMapper
;
private
final
TBaseCrossInfoService
tBaseCrossInfoService
;
@Autowired
private
final
TBaseAreaCrossMapper
tBaseAreaCrossMapper
;
GreenwaveRealtimeMapper
greenwaveRealtimeMapper
;
@Autowired
AllDeviceStatusMapper
allDeviceStatusMapper
;
@Autowired
GreenwaveCrossMapper
greenwaveCrossMapper
;
@Autowired
TBaseCrossInfoMapper
tBaseCrossInfoMapper
;
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
...
@@ -393,6 +390,66 @@ public class SituationDetectionServiceImpl implements SituationDetectionService
...
@@ -393,6 +390,66 @@ public class SituationDetectionServiceImpl implements SituationDetectionService
public
TBaseCrossInfo
selectCrossInfoById
(
String
signalId
)
{
public
TBaseCrossInfo
selectCrossInfoById
(
String
signalId
)
{
return
tBaseCrossInfoMapper
.
selectById
(
signalId
);
return
tBaseCrossInfoMapper
.
selectById
(
signalId
);
}
}
@Override
public
List
<
AreaTreePO
>
jurisdictionTree
()
{
// 行政列表
List
<
AreaTreePO
>
areaTreePOS
=
tBaseCrossInfoService
.
areaTree
();
List
<
AreaTreePO
>
resultList
=
areaTreePOS
.
stream
().
filter
(
areaTreePO
->
areaTreePO
.
getChildren
()
!=
null
).
collect
(
Collectors
.
toList
());
// 辖区构建
List
<
AreaTreePO
>
jurisdictionAreaList
=
tBaseAreaInfoMapper
.
selectJurisdictionArea
();
Map
<
Integer
,
List
<
AreaTreePO
>>
parentCodeListMap
=
jurisdictionAreaList
.
stream
().
collect
(
Collectors
.
groupingBy
(
AreaTreePO:
:
getParentCode
));
for
(
AreaTreePO
areaTreePO
:
resultList
)
{
List
<
AreaTreePO
>
childrenList
=
areaTreePO
.
getChildren
();
for
(
AreaTreePO
child
:
childrenList
)
{
Integer
areaCode
=
child
.
getAreaCode
();
if
(!
parentCodeListMap
.
isEmpty
()
&&
parentCodeListMap
.
containsKey
(
areaCode
))
{
child
.
setChildren
(
parentCodeListMap
.
get
(
areaCode
));
}
}
}
return
resultList
;
}
@Override
public
List
<
AreaListVO
>
selectAreaList
(
Integer
areaId
)
{
List
<
AreaListVO
>
results
=
new
ArrayList
<>();
LambdaQueryWrapper
<
TBaseAreaCross
>
queryWrapper
=
new
LambdaQueryWrapper
<>();
if
(
Objects
.
nonNull
(
areaId
))
{
queryWrapper
.
eq
(
TBaseAreaCross:
:
getAreaId
,
areaId
);
}
List
<
TBaseAreaCross
>
entityList
=
tBaseAreaCrossMapper
.
selectList
(
queryWrapper
);
// key:辖区编号 value:路口列表
Map
<
Integer
,
List
<
TBaseAreaCross
>>
areaIdMap
=
entityList
.
stream
().
collect
(
Collectors
.
groupingBy
(
TBaseAreaCross:
:
getAreaId
));
// 辖区列表
LambdaQueryWrapper
<
TBaseAreaInfo
>
tBaseAreaInfoLambdaQueryWrapper
=
new
LambdaQueryWrapper
<>();
tBaseAreaInfoLambdaQueryWrapper
.
eq
(
TBaseAreaInfo:
:
getType
,
2
);
List
<
TBaseAreaInfo
>
jurisdictionAreaList
=
tBaseAreaInfoMapper
.
selectList
(
tBaseAreaInfoLambdaQueryWrapper
);
// 构建区域返回列表
for
(
Map
.
Entry
<
Integer
,
List
<
TBaseAreaCross
>>
entry
:
areaIdMap
.
entrySet
())
{
AreaListVO
areaListVO
=
new
AreaListVO
();
Set
<
String
>
crossIds
=
new
HashSet
<>();
Set
<
String
>
ployLines
=
new
HashSet
<>();
List
<
TBaseAreaCross
>
crosseList
=
entry
.
getValue
();
for
(
TBaseAreaCross
tBaseAreaCross
:
crosseList
)
{
for
(
TBaseAreaInfo
tBaseAreaInfo
:
jurisdictionAreaList
)
{
if
(
Objects
.
equals
(
tBaseAreaCross
.
getAreaId
(),
tBaseAreaInfo
.
getCode
()))
{
crossIds
.
add
(
tBaseAreaCross
.
getCrossId
());
ployLines
.
add
(
tBaseAreaInfo
.
getPolylines
());
}
}
}
areaListVO
.
setCrossIds
(
crossIds
);
areaListVO
.
setPloyLines
(
ployLines
);
results
.
add
(
areaListVO
);
}
return
results
;
}
}
}
class
CrossAlarmComparator
implements
Comparator
<
CrossAlarmOutVO
>
{
class
CrossAlarmComparator
implements
Comparator
<
CrossAlarmOutVO
>
{
...
...
signal-control-service/src/main/java/net/wanji/web/vo/situationDetection/AreaListVO.java
0 → 100644
View file @
e4f75e3f
package
net
.
wanji
.
web
.
vo
.
situationDetection
;
import
io.swagger.annotations.ApiModel
;
import
io.swagger.annotations.ApiModelProperty
;
import
lombok.Data
;
import
java.util.Set
;
/**
* @author duanruiming
* @date 2023/02/06 14:43
*/
@Data
@ApiModel
(
value
=
"区域列表实体"
,
description
=
"区域列表实体"
)
public
class
AreaListVO
{
@ApiModelProperty
(
value
=
"区域路口编号列表"
)
private
Set
<
String
>
crossIds
;
@ApiModelProperty
(
value
=
"区域点列表"
)
private
Set
<
String
>
ployLines
;
}
signal-control-service/src/main/resources/mapper/TBaseAreaCrossMapper.xml
0 → 100644
View file @
e4f75e3f
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"net.wanji.web.mapper.TBaseAreaCrossMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"net.wanji.web.entity.TBaseAreaCross"
>
<id
column=
"id"
property=
"id"
jdbcType=
"INTEGER"
/>
<result
column=
"area_id"
property=
"areaId"
jdbcType=
"INTEGER"
/>
<result
column=
"cross_id"
property=
"crossId"
jdbcType=
"VARCHAR"
/>
<result
column=
"gmt_create"
property=
"gmtCreate"
jdbcType=
"TIMESTAMP"
/>
<result
column=
"gmt_modified"
property=
"gmtModified"
jdbcType=
"TIMESTAMP"
/>
</resultMap>
</mapper>
\ No newline at end of file
signal-control-service/src/main/resources/mapper/TBaseAreaInfoMapper.xml
View file @
e4f75e3f
...
@@ -155,7 +155,15 @@
...
@@ -155,7 +155,15 @@
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP}
gmt_modified = #{gmtModified,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=INTEGER}
where id = #{id,jdbcType=INTEGER}
</update>
</update>
<!-- 查询行政区域 -->
<select
id=
"selectAreaTree"
resultType=
"net.wanji.web.po.AreaTreePO"
>
<select
id=
"selectAreaTree"
resultType=
"net.wanji.web.po.AreaTreePO"
>
select id, code areaCode, name areaName, parent_code parentCode from t_base_area_info
select id, code areaCode, name areaName, parent_code parentCode
from t_base_area_info where type = 1
</select>
</select>
<!-- 查询交警辖区 -->
<select
id=
"selectJurisdictionArea"
resultType=
"net.wanji.web.po.AreaTreePO"
>
select id, code areaCode, name areaName, parent_code parentCode
from t_base_area_info where type = 2
</select>
</mapper>
</mapper>
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