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
jinan
traffic-signal-platform
Commits
2a41d054
Commit
2a41d054
authored
Mar 22, 2025
by
黄伟铭
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修正干线路口事件描述列表干线实时告警
parent
dfc2871f
Changes
7
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
132 additions
and
73 deletions
+132
-73
TrunkLineController.java
.../java/net/wanji/opt/controllerv2/TrunkLineController.java
+7
-5
TrunkLineMapper.java
...c/main/java/net/wanji/opt/dao/mapper/TrunkLineMapper.java
+8
-3
TrunkLineService.java
...c/main/java/net/wanji/opt/servicev2/TrunkLineService.java
+2
-1
TrunkLineImpl.java
...in/java/net/wanji/opt/servicev2/implv2/TrunkLineImpl.java
+56
-33
TrunLineCrossStatusEntity.java
...t/wanji/opt/synthesis/pojo/TrunLineCrossStatusEntity.java
+11
-0
TrunkLineCrossProblemEntity.java
...wanji/opt/synthesis/pojo/TrunkLineCrossProblemEntity.java
+7
-3
TrunkLineMapper.xml
...ize-service/src/main/resources/mapper/TrunkLineMapper.xml
+41
-28
No files found.
signal-optimize-service/src/main/java/net/wanji/opt/controllerv2/TrunkLineController.java
View file @
2a41d054
...
@@ -8,6 +8,7 @@ import net.wanji.opt.po.base.EventStatisticPo;
...
@@ -8,6 +8,7 @@ import net.wanji.opt.po.base.EventStatisticPo;
import
net.wanji.opt.servicev2.TrunkLineService
;
import
net.wanji.opt.servicev2.TrunkLineService
;
import
net.wanji.opt.servicev2.TrunkLineStatusDisService
;
import
net.wanji.opt.servicev2.TrunkLineStatusDisService
;
import
net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity
;
import
net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity
;
import
net.wanji.opt.vo2.CrossRealTimeAlarmVO
;
import
net.wanji.opt.vo2.CrossRealTimeAlarmVO
;
import
net.wanji.opt.vo2.TrunkLineCrossProblemVO
;
import
net.wanji.opt.vo2.TrunkLineCrossProblemVO
;
...
@@ -100,23 +101,24 @@ public class TrunkLineController {
...
@@ -100,23 +101,24 @@ public class TrunkLineController {
}
}
}
}
@ApiOperation
(
value
=
"干线路口
问题"
,
notes
=
"干线路口问题
"
,
response
=
JsonViewObject
.
class
,
httpMethod
=
"GET"
)
@ApiOperation
(
value
=
"干线路口
状态"
,
notes
=
"干线路口状态
"
,
response
=
JsonViewObject
.
class
,
httpMethod
=
"GET"
)
@ApiImplicitParams
({
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"greenID"
,
value
=
"绿波ID"
,
required
=
true
,
dataType
=
"Integer"
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"greenID"
,
value
=
"绿波ID"
,
required
=
true
,
dataType
=
"Integer"
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"time"
,
value
=
"时间 格式:yyyy-MM-dd HH:ii:ss"
,
dataType
=
"String"
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"time"
,
value
=
"时间 格式:yyyy-MM-dd HH:ii:ss"
,
dataType
=
"String"
,
paramType
=
"query"
),
@ApiImplicitParam
(
name
=
"type"
,
value
=
"类型,0查询当前时间,1查询历史时间"
,
required
=
true
,
dataType
=
"Integer"
,
paramType
=
"query"
),
})
})
@GetMapping
(
value
=
"/getTrunkLineCrossProblem"
)
@GetMapping
(
value
=
"/getTrunkLineCrossProblem"
)
@ApiResponses
({
@ApiResponses
({
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
TrunkLineCrossProblemVO
.
class
),
@ApiResponse
(
code
=
200
,
message
=
"OK"
,
response
=
TrunkLineCrossProblemVO
.
class
),
})
})
public
JsonViewObject
getTrunkLineCrossProblem
(
Integer
greenID
,
@RequestParam
(
defaultValue
=
""
)
String
tim
e
)
{
public
JsonViewObject
getTrunkLineCrossProblem
(
Integer
greenID
,
String
time
,
Integer
typ
e
)
{
try
{
try
{
JsonViewObject
object
=
JsonViewObject
.
newInstance
();
JsonViewObject
object
=
JsonViewObject
.
newInstance
();
List
<
TrunkLineCrossProblem
VO
>
list
=
trunkLineService
.
getTrunkLineCrossProblem
(
greenID
,
tim
e
);
List
<
TrunkLineCrossProblem
Entity
>
list
=
trunkLineService
.
getTrunkLineCrossProblem
(
greenID
,
time
,
typ
e
);
return
object
.
success
(
list
);
return
object
.
success
(
list
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
log
.
error
(
"获取干线路口
问题
失败: "
,
e
);
log
.
error
(
"获取干线路口
状态
失败: "
,
e
);
return
JsonViewObject
.
newInstance
().
fail
(
"获取干线路口
问题
失败"
);
return
JsonViewObject
.
newInstance
().
fail
(
"获取干线路口
状态
失败"
);
}
}
}
}
}
}
signal-optimize-service/src/main/java/net/wanji/opt/dao/mapper/TrunkLineMapper.java
View file @
2a41d054
package
net
.
wanji
.
opt
.
dao
.
mapper
;
package
net
.
wanji
.
opt
.
dao
.
mapper
;
import
net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity
;
import
net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity
;
import
net.wanji.opt.synthesis.pojo.TrunLineCrossStatusEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity
;
import
net.wanji.opt.synthesis.pojo.vo.CrossOrGreenWaveTypeEntity
;
import
net.wanji.opt.synthesis.pojo.vo.CrossOrGreenWaveTypeEntity
;
import
net.wanji.opt.vo2.CrossRealTimeAlarmVO
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Param
;
import
java.util.List
;
import
java.util.List
;
...
@@ -43,9 +43,14 @@ public interface TrunkLineMapper{
...
@@ -43,9 +43,14 @@ public interface TrunkLineMapper{
List
<
TrunkLineCrossProblemEntity
>
getTrunkLineCrossProblem
(
@Param
(
"greenID"
)
Integer
greenID
,
@Param
(
"time"
)
String
time
);
List
<
TrunkLineCrossProblemEntity
>
getTrunkLineCrossProblem
(
@Param
(
"greenID"
)
Integer
greenID
,
@Param
(
"time"
)
String
time
);
/**
/**
* 获取进出口方向
* 获取
干线的路口
进出口方向
*/
*/
TrunkLineCrossProblemEntity
getIODir
(
@Param
(
"greenID"
)
Integer
greenID
);
List
<
TrunkLineCrossProblemEntity
>
getIODir
(
@Param
(
"greenID"
)
Integer
greenID
);
/**
* 获取干线的路口进出口方向
*/
List
<
TrunLineCrossStatusEntity
>
getTrunkLineCrossStatus
(
@Param
(
"greenID"
)
Integer
greenID
,
@Param
(
"type"
)
Integer
type
,
@Param
(
"time"
)
String
time
,
@Param
(
"inDir"
)
Integer
inDir
,
@Param
(
"outDir"
)
Integer
outDir
);
/**
/**
* 获取干线类型信息
* 获取干线类型信息
...
...
signal-optimize-service/src/main/java/net/wanji/opt/servicev2/TrunkLineService.java
View file @
2a41d054
package
net
.
wanji
.
opt
.
servicev2
;
package
net
.
wanji
.
opt
.
servicev2
;
import
net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity
;
import
net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity
;
import
net.wanji.opt.synthesis.pojo.vo.CrossOrGreenWaveTypeEntity
;
import
net.wanji.opt.synthesis.pojo.vo.CrossOrGreenWaveTypeEntity
;
import
net.wanji.opt.vo2.CrossRealTimeAlarmVO
;
import
net.wanji.opt.vo2.CrossRealTimeAlarmVO
;
...
@@ -27,7 +28,7 @@ public interface TrunkLineService {
...
@@ -27,7 +28,7 @@ public interface TrunkLineService {
/**
/**
* 干线路口事件描述列表
* 干线路口事件描述列表
*/
*/
List
<
TrunkLineCrossProblem
VO
>
getTrunkLineCrossProblem
(
Integer
greenID
,
String
tim
e
);
List
<
TrunkLineCrossProblem
Entity
>
getTrunkLineCrossProblem
(
Integer
greenID
,
String
time
,
Integer
typ
e
);
/**
/**
* 获取路口类型信息
* 获取路口类型信息
...
...
signal-optimize-service/src/main/java/net/wanji/opt/servicev2/implv2/TrunkLineImpl.java
View file @
2a41d054
package
net
.
wanji
.
opt
.
servicev2
.
implv2
;
package
net
.
wanji
.
opt
.
servicev2
.
implv2
;
import
io.swagger.models.auth.In
;
import
lombok.extern.slf4j.Slf4j
;
import
lombok.extern.slf4j.Slf4j
;
import
net.wanji.opt.dao.mapper.TrunkLineMapper
;
import
net.wanji.opt.dao.mapper.TrunkLineMapper
;
import
net.wanji.opt.servicev2.TrunkLineService
;
import
net.wanji.opt.servicev2.TrunkLineService
;
import
net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity
;
import
net.wanji.opt.synthesis.pojo.CrossRealTimeAlarmEntity
;
import
net.wanji.opt.synthesis.pojo.TrunLineCrossStatusEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity
;
import
net.wanji.opt.synthesis.pojo.TrunkLineProblemDescribeEntity
;
import
net.wanji.opt.synthesis.pojo.vo.CrossOrGreenWaveTypeEntity
;
import
net.wanji.opt.synthesis.pojo.vo.CrossOrGreenWaveTypeEntity
;
...
@@ -45,42 +47,63 @@ public class TrunkLineImpl implements TrunkLineService {
...
@@ -45,42 +47,63 @@ public class TrunkLineImpl implements TrunkLineService {
}
}
@Override
@Override
public
List
<
TrunkLineCrossProblemVO
>
getTrunkLineCrossProblem
(
Integer
greenID
,
String
time
)
{
public
List
<
TrunkLineCrossProblemEntity
>
getTrunkLineCrossProblem
(
Integer
greenID
,
String
time
,
Integer
type
)
{
List
<
TrunkLineCrossProblemEntity
>
list
=
trunkLineMapper
.
getTrunkLineCrossProblem
(
greenID
,
time
);
//查询干线路口数据
TrunkLineCrossProblemEntity
ioDir
=
trunkLineMapper
.
getIODir
(
greenID
);
List
<
TrunkLineCrossProblemEntity
>
list
=
trunkLineMapper
.
getIODir
(
greenID
);
List
<
TrunkLineCrossProblemVO
>
voList
=
new
ArrayList
<>();
List
<
TrunkLineCrossProblemEntity
>
result1
=
new
ArrayList
<>();
List
<
TrunkLineCrossProblemEntity
>
result
=
new
ArrayList
<>();
for
(
TrunkLineCrossProblemEntity
e
:
list
)
{
Integer
inDir
=
0
;
TrunkLineCrossProblemVO
vo
=
new
TrunkLineCrossProblemVO
();
Integer
outDir
=
0
;
for
(
TrunkLineCrossProblemEntity
temp
:
list
){
vo
.
setCrossID
(
e
.
getCrossID
());
inDir
=
temp
.
getInDir
();
vo
.
setName
(
e
.
getName
());
outDir
=
temp
.
getOutDir
();
vo
.
setWkt
(
e
.
getWkt
());
}
List
<
TrunLineCrossStatusEntity
>
crossStatusList
=
trunkLineMapper
.
getTrunkLineCrossStatus
(
greenID
,
type
,
time
,
inDir
,
outDir
);
if
(
e
.
getDirection
()
!=
null
)
{
for
(
TrunkLineCrossProblemEntity
temp
:
list
){
String
temp
=
e
.
getDirection
().
substring
(
1
,
e
.
getDirection
().
length
()
-
1
);
for
(
TrunLineCrossStatusEntity
temp1
:
crossStatusList
){
temp
=
temp
.
replace
(
"\""
,
""
);
if
(
temp
.
getSort
().
equals
(
1
)){
String
[]
temp1
=
temp
.
split
(
","
);
if
(
temp
.
getCrossID
().
equals
(
temp1
.
getCrossID
())){
if
(
temp1
.
getDirType
().
equals
(
temp
.
getOutDir
())
){
String
[]
dirStatus
=
getDirStatus
(
ioDir
.
getInDir
(),
ioDir
.
getOutDir
(),
temp1
,
e
.
getStatus
());
temp
.
setStatusR
(
temp1
.
getStatus
());
vo
.
setDir_1_name
(
dirStatus
[
0
]);
temp
.
setDirectionR
(
temp
.
getOutDir
().
toString
());
vo
.
setStatus_1_name
(
dirStatus
[
1
]);
temp
.
setStartTime
(
temp1
.
getStartTime
());
vo
.
setDir_2_name
(
dirStatus
[
2
]);
}
vo
.
setStatus_2_name
(
dirStatus
[
3
]);
}
}
else
if
(
temp
.
getSort
().
equals
(
list
.
size
())){
voList
.
add
(
vo
);
if
(
temp
.
getCrossID
().
equals
(
temp1
.
getCrossID
())){
}
else
{
if
(
temp1
.
getDirType
().
equals
(
temp
.
getInDir
())
){
Map
<
String
,
String
>
IOdirMap
=
getDirName
(
ioDir
.
getInDir
(),
ioDir
.
getOutDir
());
temp
.
setStatusL
(
temp1
.
getStatus
());
vo
.
setStatus_1_name
(
"正常"
);
temp
.
setDirectionL
(
temp
.
getInDir
().
toString
());
vo
.
setStatus_2_name
(
"正常"
);
temp
.
setStartTime
(
temp1
.
getStartTime
());
vo
.
setDir_1_name
(
IOdirMap
.
get
(
"dirName"
));
}
vo
.
setDir_2_name
(
IOdirMap
.
get
(
"dirNameReverse"
));
}
}
else
{
voList
.
add
(
vo
);
if
(
temp
.
getCrossID
().
equals
(
temp1
.
getCrossID
())){
if
(
temp1
.
getDirType
().
equals
(
temp
.
getOutDir
())
){
temp
.
setStatusR
(
temp1
.
getStatus
());
temp
.
setDirectionR
(
temp
.
getOutDir
().
toString
());
}
if
(
temp1
.
getDirType
().
equals
(
temp
.
getInDir
())
){
temp
.
setStatusL
(
temp1
.
getStatus
());
temp
.
setDirectionL
(
temp
.
getInDir
().
toString
());
}
}
temp
.
setStartTime
(
temp1
.
getStartTime
());
}
}
}
}
result1
.
add
(
temp
);
}
for
(
int
i
=
0
;
i
<
result1
.
size
()
-
1
;
i
++){
int
j
=
i
+
1
;
TrunkLineCrossProblemEntity
temp
=
result1
.
get
(
i
);
TrunkLineCrossProblemEntity
temp1
=
result1
.
get
(
j
);
temp
.
setStatusL
(
temp1
.
getStatusL
());
temp
.
setDirectionL
(
temp1
.
getDirectionL
());
result
.
add
(
temp
);
}
result
.
add
(
result1
.
get
(
result1
.
size
()
-
1
));
return
voLis
t
;
return
resul
t
;
}
}
@Override
@Override
...
...
signal-optimize-service/src/main/java/net/wanji/opt/synthesis/pojo/TrunLineCrossStatusEntity.java
0 → 100644
View file @
2a41d054
package
net
.
wanji
.
opt
.
synthesis
.
pojo
;
import
lombok.Data
;
@Data
public
class
TrunLineCrossStatusEntity
{
private
String
crossID
;
private
String
startTime
;
private
Integer
dirType
;
private
Integer
status
;
}
signal-optimize-service/src/main/java/net/wanji/opt/synthesis/pojo/TrunkLineCrossProblemEntity.java
View file @
2a41d054
...
@@ -4,12 +4,16 @@ import lombok.Data;
...
@@ -4,12 +4,16 @@ import lombok.Data;
@Data
@Data
public
class
TrunkLineCrossProblemEntity
{
public
class
TrunkLineCrossProblemEntity
{
private
String
greenID
;
private
String
crossID
;
private
String
crossID
;
private
String
name
;
private
String
name
;
private
String
wkt
;
private
Integer
inDir
;
private
Integer
inDir
;
private
Integer
outDir
;
private
Integer
outDir
;
private
Integer
status
;
private
Integer
sort
;
private
String
direction
;
private
String
startTime
;
private
String
startTime
;
private
String
wkt
;
private
Integer
statusL
;
private
String
directionL
;
private
Integer
statusR
;
private
String
directionR
;
}
}
signal-optimize-service/src/main/resources/mapper/TrunkLineMapper.xml
View file @
2a41d054
...
@@ -14,29 +14,27 @@
...
@@ -14,29 +14,27 @@
</resultMap>
</resultMap>
<select
id=
"getTrunkLineProblemDescribe"
parameterType=
"String"
resultMap=
"tlProblemDescribe"
>
<select
id=
"getTrunkLineProblemDescribe"
parameterType=
"String"
resultMap=
"tlProblemDescribe"
>
select
b.greenID ,b.status ,b.time , (
select
a.green_id as greenID, a.start_time as time, a.type as status,
case
case
b.status
a.type
when 1 then '畅通'
when 705 then '干线缓行'
when 2 then '缓行'
when 706 then '干线拥堵'
when 3 then '拥堵'
end as status_cn
when 4 then '严重拥堵'
when 5 then '畅通'
end
) status_cn
from
from
(select DISTINCT
t_event_info a
a.green_id as greenID,
where a.green_id = 1
max(a.start_time) time,
and a.type in (705,706)
max(a.status) as status
<if
test=
"time == '' "
>
from
and a.end_time is null
t_greenwave_hist a
and dt = DATE_FORMAT(now(),'%Y%m%d')
where a.green_id = #{greenID}
and DATE_FORMAT(start_time,'%Y-%m-%d %H:%i:%s')
<![CDATA[ <= ]]>
DATE_FORMAT(now(),'%Y-%m-%d %H:%i:%s')
<if
test=
"time != null and time != '' "
>
</if>
<if
test=
"time != '' "
>
and dt = DATE_FORMAT(#{time},'%Y%m%d')
and DATE_FORMAT(start_time,'%Y-%m-%d %H:%i:%s')
<![CDATA[ <= ]]>
DATE_FORMAT(#{time},'%Y-%m-%d %H:%i:%s')
and DATE_FORMAT(start_time,'%Y-%m-%d %H:%i:%s')
<![CDATA[ <= ]]>
DATE_FORMAT(#{time},'%Y-%m-%d %H:%i:%s')
and DATE_FORMAT(end_time,'%Y-%m-%d %H:%i:%s') >= DATE_FORMAT(#{time},'%Y-%m-%d %H:%i:%s')
</if>
</if>
) b
</select>
</select>
<select
id=
"getTrunkLineRealTimeAlarm"
parameterType=
"map"
resultMap=
"tlRealTimeAlarmsResultMap"
>
<select
id=
"getTrunkLineRealTimeAlarm"
parameterType=
"map"
resultMap=
"tlRealTimeAlarmsResultMap"
>
...
@@ -78,15 +76,7 @@
...
@@ -78,15 +76,7 @@
</if>
</if>
</select>
</select>
<select
id=
"getIODir"
parameterType=
"map"
resultType=
"net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity"
>
select
distinct a.in_dir,
a.out_dir
from
t_greenwave_cross a
where
a.green_id = #{greenID}
</select>
<select
id=
"getGreenWaveTypeList"
parameterType=
"map"
<select
id=
"getGreenWaveTypeList"
parameterType=
"map"
resultType=
"net.wanji.opt.synthesis.pojo.vo.CrossOrGreenWaveTypeEntity"
>
resultType=
"net.wanji.opt.synthesis.pojo.vo.CrossOrGreenWaveTypeEntity"
>
select DATE_FORMAT(sub.start_time, '%H:%i') as startTime,
select DATE_FORMAT(sub.start_time, '%H:%i') as startTime,
...
@@ -108,4 +98,27 @@
...
@@ -108,4 +98,27 @@
order by startTime
order by startTime
</select>
</select>
<select
id=
"getIODir"
parameterType=
"map"
resultType=
"net.wanji.opt.synthesis.pojo.TrunkLineCrossProblemEntity"
>
select a.green_id as greenID,a.cross_id as crossID,b.name, SUBSTR(b.location , 7 , LENGTH(b.location) - 7) as wkt,
a.in_dir as inDir,a.out_dir as outDir,a.sort
from t_greenwave_cross a
left join t_base_cross_info b on a.cross_id = b.id
where a.green_id = #{greenID}
order by a.sort
</select>
<select
id=
"getTrunkLineCrossStatus"
parameterType=
"map"
resultType=
"net.wanji.opt.synthesis.pojo.TrunLineCrossStatusEntity"
>
select t.cross_id as crossID,t.start_time as startTime,t.dir_type as dirType,t.status
from t_cross_dir_data_hist t
where t.cross_id in (select cross_id from t_greenwave_cross where green_id = #{greenID} )
<if
test=
"type == 1 "
>
and t.start_time = DATE_FORMAT(FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(#{time}) / 300 ) * 300), '%Y-%m-%d %H:%i:00')
</if>
<if
test=
"type == 0 "
>
and t.start_time = DATE_FORMAT(FROM_UNIXTIME(FLOOR(UNIX_TIMESTAMP(DATE_SUB(now(),INTERVAL 6 MINUTE)) / 300 ) * 300), '%Y-%m-%d %H:%i:00')
</if>
and t.dir_type in (#{inDir},#{outDir})
</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