Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
dsk-cr20g
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
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
Administrator
dsk-cr20g
Commits
1593724c
Commit
1593724c
authored
Aug 29, 2023
by
yht15023815643
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'dev20230707' of
http://192.168.60.201/root/dsk-operate-sys
into dev20230707
parents
1f8f212d
a8339010
Changes
8
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
801 additions
and
831 deletions
+801
-831
JskCombineInfoController.java
.../com/dsk/web/controller/dsk/JskCombineInfoController.java
+57
-23
ExcelUtil.java
...mon/src/main/java/com/dsk/common/utils/poi/ExcelUtil.java
+359
-625
index.vue
dsk-operate-ui/src/views/custom/overview/index.vue
+171
-177
JskCombineSearchDto.java
...va/com/dsk/system/domain/dsk/dto/JskCombineSearchDto.java
+4
-0
JskCombineBidProjectExportVo.java
...sk/system/domain/dsk/vo/JskCombineBidProjectExportVo.java
+55
-0
JskCombineWinBidProjectExportVo.java
...system/domain/dsk/vo/JskCombineWinBidProjectExportVo.java
+55
-0
EnterpriseBussinessService.java
...com/dsk/system/dskService/EnterpriseBussinessService.java
+34
-1
JskCombineInfoService.java
...java/com/dsk/system/dskService/JskCombineInfoService.java
+66
-5
No files found.
dsk-admin/src/main/java/com/dsk/web/controller/dsk/JskCombineInfoController.java
View file @
1593724c
package
com
.
dsk
.
web
.
controller
.
dsk
;
import
cn.hutool.core.date.DateUtil
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.dsk.common.core.controller.BaseController
;
import
com.dsk.common.core.domain.AjaxResult
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.common.core.page.TableDataInfo
;
import
com.dsk.common.utils.poi.ExcelUtil
;
import
com.dsk.system.domain.dsk.dto.JskCombineCertificateDto
;
import
com.dsk.system.domain.dsk.dto.JskCombineSearchDto
;
import
com.dsk.system.domain.dsk.vo.JskCombineBidProjectExportVo
;
import
com.dsk.system.domain.dsk.vo.JskCombineWinBidProjectExportVo
;
import
com.dsk.system.dskService.JskCombineInfoService
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.poi.util.IOUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
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
;
import
org.springframework.security.access.prepost.PreAuthorize
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletResponse
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Map
;
/**
* 集团户相关信息
*
* @author lcl
* @create 2023/8/7
*/
...
...
@@ -59,6 +68,7 @@ public class JskCombineInfoController extends BaseController {
public
TableDataInfo
certificateList
(
@RequestBody
JskCombineSearchDto
dto
)
throws
Exception
{
return
baseService
.
certificateList
(
dto
);
}
/**
* 集团成员资质列表
*/
...
...
@@ -138,4 +148,28 @@ public class JskCombineInfoController extends BaseController {
public
AjaxResult
centralEnterprseSocialPage
(
@RequestBody
JSONObject
object
)
{
return
baseService
.
centralEnterprseSocialPage
(
object
);
}
/**
* 导出中标业绩
*/
@PostMapping
(
"/export/win/bid"
)
@PreAuthorize
(
"@ss.hasPermi('combine:info:export:win:bid')"
)
public
void
exportWinBid
(
@RequestBody
JskCombineSearchDto
dto
,
HttpServletResponse
response
)
{
List
<
JskCombineWinBidProjectExportVo
>
list
=
baseService
.
exportWinBid
(
dto
);
ExcelUtil
<
JskCombineWinBidProjectExportVo
>
util
=
new
ExcelUtil
<>(
JskCombineWinBidProjectExportVo
.
class
);
util
.
exportExcel
(
response
,
list
,
"集团中标"
,
dto
.
getCombineName
().
concat
(
"中标业绩清单"
),
true
);
// String fileName = util.localInit(list, "集团中标", dto.getCombineName().concat("中标业绩清单"), true);
}
/**
* 导出招标业绩
*/
@PostMapping
(
"/export/bid"
)
@PreAuthorize
(
"@ss.hasPermi('combine:info:export:bid')"
)
public
void
exportBid
(
@RequestBody
JskCombineSearchDto
dto
,
HttpServletResponse
response
)
{
List
<
JskCombineBidProjectExportVo
>
list
=
baseService
.
exportBid
(
dto
);
ExcelUtil
<
JskCombineBidProjectExportVo
>
util
=
new
ExcelUtil
<>(
JskCombineBidProjectExportVo
.
class
);
util
.
exportExcel
(
response
,
list
,
"集团招标"
,
dto
.
getCombineName
().
concat
(
"招标公告清单"
),
true
);
}
}
dsk-common/src/main/java/com/dsk/common/utils/poi/ExcelUtil.java
View file @
1593724c
This diff is collapsed.
Click to expand it.
dsk-operate-ui/src/views/custom/overview/index.vue
View file @
1593724c
...
...
@@ -207,11 +207,7 @@
hzqkList
:[],
creditLevel
:[],
chartDom
:
''
,
myChart
:
''
,
option
:
''
,
chartDom1
:
''
,
myChart1
:
''
,
option1
:
''
,
pageNum
:
1
,
pageSize
:
10
,
recordlist
:[],
...
...
@@ -234,19 +230,7 @@
this
.
getFollowList
()
},
mounted
(){
this
.
$nextTick
(()
=>
{
this
.
chartDom
=
document
.
getElementById
(
"hzqk-echarts"
)
this
.
myChart
=
echarts
.
init
(
this
.
chartDom
)
this
.
chartDom1
=
document
.
getElementById
(
"zxpj-echarts"
)
this
.
myChart1
=
echarts
.
init
(
this
.
chartDom1
)
})
window
.
addEventListener
(
"resize"
,
this
.
resizeEcharts
);
},
beforeDestroy
(){
window
.
removeEventListener
(
"resize"
,
this
.
resizeEcharts
);
},
activated
()
{
this
.
resizeEcharts
()
},
methods
:
{
getData
(){
...
...
@@ -285,7 +269,6 @@
pageNum
:
this
.
pageNum
,
//页码
pageSize
:
this
.
pageSize
,
}
console
.
log
(
this
.
params
)
if
(
this
.
params
.
startTime
){
param
.
startTime
=
this
.
params
.
startTime
}
...
...
@@ -302,13 +285,6 @@
})
})
},
resizeEcharts
(){
const
self
=
this
setTimeout
(
function
(){
//图表跟随页面大小变化宽度
self
.
myChart
.
resize
()
self
.
myChart1
.
resize
()
},
10
)
},
initChart
(
list
){
let
data
=
[]
if
(
list
.
length
>
10
){
...
...
@@ -318,8 +294,10 @@
}
else
{
data
=
list
}
this
.
$nextTick
(()
=>
{
let
myChart
=
echarts
.
init
(
document
.
getElementById
(
"hzqk-echarts"
))
//业主单位合作情况
this
.
option
=
{
let
option
=
{
tooltip
:
{
trigger
:
'axis'
,
axisPointer
:
{
...
...
@@ -424,11 +402,17 @@
}
]
}
this
.
option
&&
this
.
myChart
.
setOption
(
this
.
option
)
myChart
.
setOption
(
option
);
window
.
addEventListener
(
"resize"
,
function
()
{
myChart
.
resize
();
//图表跟随页面大小变化宽度
});
})
},
initChart1
(
data
){
this
.
$nextTick
(()
=>
{
let
myChart
=
echarts
.
init
(
document
.
getElementById
(
"zxpj-echarts"
))
//客户资信评级
this
.
option1
=
{
let
option
=
{
tooltip
:
{
trigger
:
'axis'
,
axisPointer
:
{
...
...
@@ -473,12 +457,18 @@
return
'客户数量 '
+
value
}
},
itemStyle
:{
normal
:
{
barBorderRadius
:
[
9
,
9
,
0
,
0
],
color
:
'#165DFF'
}
itemStyle
:
{
normal
:{
color
:
new
echarts
.
graphic
.
LinearGradient
(
0
,
1
,
0
,
0
,
[{
offset
:
0
,
color
:
'#56A5FF'
},
{
offset
:
1
,
color
:
'#1B8EFF'
}]),
barBorderRadius
:[
20
,
20
,
0
,
0
]
}
},
}
],
...
...
@@ -489,7 +479,11 @@
},
}
}
this
.
option1
&&
this
.
myChart1
.
setOption
(
this
.
option1
)
myChart
.
setOption
(
option
);
window
.
addEventListener
(
"resize"
,
function
()
{
myChart
.
resize
();
//图表跟随页面大小变化宽度
});
})
},
handleCurrentChange
(
val
)
{
this
.
pageNum
=
1
;
...
...
dsk-system/src/main/java/com/dsk/system/domain/dsk/dto/JskCombineSearchDto.java
View file @
1593724c
...
...
@@ -20,6 +20,10 @@ public class JskCombineSearchDto implements Serializable {
*/
@NotNull
(
message
=
"集团id不能为空!"
)
private
String
combineId
;
/**
* 集团名称
*/
private
String
combineName
;
/**
* 筛选参数
*/
...
...
dsk-system/src/main/java/com/dsk/system/domain/dsk/vo/JskCombineBidProjectExportVo.java
0 → 100644
View file @
1593724c
package
com
.
dsk
.
system
.
domain
.
dsk
.
vo
;
import
com.dsk.common.annotation.Excel
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 集团中标业绩
* @author lcl
* @create 2023/8/28
*/
@Data
public
class
JskCombineBidProjectExportVo
implements
Serializable
{
@Excel
(
name
=
"序号"
,
width
=
6
)
private
Integer
id
;
@Excel
(
name
=
"招标发布时间"
,
width
=
15
,
dateFormat
=
"yyyy/MM/dd"
)
private
Date
bidTime
;
@Excel
(
name
=
"招标成员"
,
width
=
30
)
private
String
companyName
;
@Excel
(
name
=
"持股比例"
,
suffix
=
"%"
,
width
=
15
)
private
Double
stockPercent
;
@Excel
(
name
=
"成员等级"
,
width
=
15
)
private
String
memberLevel
;
@Excel
(
name
=
"项目名称"
,
width
=
50
)
private
String
projectName
;
@Excel
(
name
=
"预算金额"
,
suffix
=
"万元"
)
private
Double
bidAmount
;
@Excel
(
name
=
"项目地区"
,
width
=
20
)
private
String
address
;
@Excel
(
name
=
"招标采购分类"
,
width
=
15
)
private
String
bidType
;
@Excel
(
name
=
"项目类型"
,
width
=
15
)
private
String
projectType
;
@Excel
(
name
=
"代理单位"
,
width
=
30
)
private
String
projectUnit
;
}
dsk-system/src/main/java/com/dsk/system/domain/dsk/vo/JskCombineWinBidProjectExportVo.java
0 → 100644
View file @
1593724c
package
com
.
dsk
.
system
.
domain
.
dsk
.
vo
;
import
com.dsk.common.annotation.Excel
;
import
lombok.Data
;
import
java.io.Serializable
;
import
java.util.Date
;
/**
* 集团中标业绩
* @author lcl
* @create 2023/8/28
*/
@Data
public
class
JskCombineWinBidProjectExportVo
implements
Serializable
{
@Excel
(
name
=
"序号"
,
width
=
6
)
private
Integer
id
;
@Excel
(
name
=
"中标时间"
,
width
=
15
,
dateFormat
=
"yyyy/MM/dd"
)
private
Date
bidTime
;
@Excel
(
name
=
"成员名称"
,
width
=
30
)
private
String
companyName
;
@Excel
(
name
=
"持股比例"
,
suffix
=
"%"
,
width
=
15
)
private
Double
stockPercent
;
@Excel
(
name
=
"成员等级"
,
width
=
15
)
private
String
memberLevel
;
@Excel
(
name
=
"项目名称"
,
width
=
50
)
private
String
projectName
;
@Excel
(
name
=
"中标金额"
,
suffix
=
"万元"
)
private
Double
bidAmount
;
@Excel
(
name
=
"中标地区"
,
width
=
20
)
private
String
address
;
@Excel
(
name
=
"业绩类型"
,
width
=
15
)
private
String
boundType
;
@Excel
(
name
=
"项目类型"
,
width
=
15
)
private
String
projectType
;
@Excel
(
name
=
"业主单位"
,
width
=
30
)
private
String
projectUnit
;
}
dsk-system/src/main/java/com/dsk/system/dskService/EnterpriseBussinessService.java
View file @
1593724c
...
...
@@ -57,8 +57,41 @@ public class EnterpriseBussinessService {
}
public
TableDataInfo
clientPage
(
EnterpriseBussinessClientPageBody
body
)
throws
Exception
{
if
(
body
.
isVaildCid
())
return
new
TableDataInfo
(
new
ArrayList
<>(),
0
);
if
(
body
.
isVaildCid
())
{
return
new
TableDataInfo
(
new
ArrayList
<>(),
0
);
}
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/enterpriseBussiness/clientPage2"
,
BeanUtil
.
beanToMap
(
body
,
false
,
false
));
Map
data
=
MapUtils
.
getMap
(
map
,
"data"
,
null
);
List
<
Object
>
list
=
CommonUtils
.
assertAsArray
(
MapUtils
.
getObject
(
data
,
"list"
,
""
));
if
(
CollectionUtils
.
isEmpty
(
list
))
{
return
new
TableDataInfo
(
list
,
0
);
}
ArrayList
<
Long
>
cIds
=
new
ArrayList
<>();
for
(
Object
dataMap
:
list
)
{
cIds
.
add
(
MapUtils
.
getLong
(
CommonUtils
.
assertAsMap
(
dataMap
),
"companyId"
));
}
HashMap
<
String
,
Object
>
paramMap
=
new
HashMap
<>();
paramMap
.
put
(
"ids"
,
cIds
);
Map
<
String
,
Object
>
uipIdMap
=
dskOpenApiUtil
.
requestBody
(
"/operate/enterprise/getUipIdByCid"
,
paramMap
);
Object
uipIdData
=
uipIdMap
.
get
(
"data"
);
List
<
Map
<
String
,
Object
>>
mapList
=
new
ArrayList
<>();
if
(
ObjectUtil
.
isNotEmpty
(
uipIdData
))
{
mapList
=
(
List
<
Map
<
String
,
Object
>>)
uipIdData
;
}
for
(
Object
dataMap
:
list
)
{
Map
<
String
,
Object
>
companyMap
=
CommonUtils
.
assertAsMap
(
dataMap
);
Long
cusCompanyId
=
MapUtils
.
getLong
(
companyMap
,
"companyId"
,
0L
);
companyMap
.
put
(
"uipId"
,
null
);
for
(
Map
<
String
,
Object
>
m
:
mapList
)
{
String
uipId
=
MapUtils
.
getString
(
m
,
"uipId"
,
null
);
Long
companyId
=
MapUtils
.
getLong
(
m
,
"companyId"
,
0L
);
if
(
cusCompanyId
.
equals
(
companyId
))
{
companyMap
.
put
(
"uipId"
,
uipId
);
}
}
}
return
dskOpenApiUtil
.
responsePage
(
map
);
}
...
...
dsk-system/src/main/java/com/dsk/system/dskService/JskCombineInfoService.java
View file @
1593724c
package
com
.
dsk
.
system
.
dskService
;
import
cn.hutool.core.bean.BeanException
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.core.
util.Object
Util
;
import
cn.hutool.core.
map.Map
Util
;
import
com.alibaba.fastjson2.JSONObject
;
import
com.dsk.common.core.domain.AjaxResult
;
import
com.dsk.common.core.domain.R
;
import
com.dsk.common.core.page.TableDataInfo
;
import
com.dsk.common.exception.ServiceException
;
import
com.dsk.common.utils.DskOpenApiUtil
;
import
com.dsk.system.domain.dsk.dto.JskCombineCertificateDto
;
import
com.dsk.system.domain.dsk.dto.JskCombineSearchDto
;
import
com.dsk.system.domain.dsk.vo.JskCombineBidProjectExportVo
;
import
com.dsk.system.domain.dsk.vo.JskCombineWinBidProjectExportVo
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.MapUtils
;
import
org.apache.ibatis.util.MapUtil
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
org.springframework.util.ObjectUtils
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -81,7 +81,7 @@ public class JskCombineInfoService {
return
dskOpenApiUtil
.
responsePage
(
map
);
}
public
TableDataInfo
menberCertificateList
(
JskCombineCertificateDto
dto
)
throws
Exception
{
public
TableDataInfo
menberCertificateList
(
JskCombineCertificateDto
dto
)
throws
Exception
{
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/member/certificateList"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
// if (!ObjectUtils.isEmpty(map.get("data"))) {
// Map<String, Object> data = BeanUtil.beanToMap(map.get("data"));
...
...
@@ -141,4 +141,65 @@ public class JskCombineInfoService {
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/nationzj/enterprice/centralEnterprse/social/page"
,
object
);
return
BeanUtil
.
toBean
(
map
,
AjaxResult
.
class
);
}
public
List
<
JskCombineWinBidProjectExportVo
>
exportWinBid
(
JskCombineSearchDto
dto
)
{
if
(
ObjectUtils
.
isEmpty
(
dto
.
getPageSize
()))
throw
new
ServiceException
(
"导出条数不能为空!"
);
if
(
dto
.
getPageSize
()
>
2000
)
dto
.
setPageSize
(
2000
);
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/businessList"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
if
(
ObjectUtils
.
isEmpty
(
map
.
get
(
"data"
)))
throw
new
ServiceException
(
"导出失败,系统错误!"
);
Map
<
String
,
Object
>
data
=
BeanUtil
.
beanToMap
(
map
.
get
(
"data"
));
if
(
ObjectUtils
.
isEmpty
(
data
.
get
(
"list"
)))
throw
new
ServiceException
(
"导出失败,系统错误!"
);
List
<
Map
<
String
,
Object
>>
list
=
(
List
<
Map
<
String
,
Object
>>)
data
.
get
(
"list"
);
if
(
ObjectUtils
.
isEmpty
(
list
))
throw
new
ServiceException
(
"导出失败,无数据导出!"
);
List
<
JskCombineWinBidProjectExportVo
>
result
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
list
.
size
();
i
++)
{
JskCombineWinBidProjectExportVo
vo
=
new
JskCombineWinBidProjectExportVo
();
vo
.
setId
(
i
+
1
);
vo
.
setBidTime
(
MapUtil
.
getDate
(
list
.
get
(
i
),
"bidTime"
));
vo
.
setCompanyName
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"companyName"
));
vo
.
setStockPercent
(
MapUtil
.
getDouble
(
list
.
get
(
i
),
"stockPercent"
));
vo
.
setMemberLevel
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"memberLevel"
));
vo
.
setProjectName
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectName"
));
vo
.
setBidAmount
(
MapUtil
.
getDouble
(
list
.
get
(
i
),
"bidAmount"
));
vo
.
setAddress
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"address"
));
vo
.
setBoundType
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"boundType"
));
vo
.
setProjectType
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectType"
));
vo
.
setProjectUnit
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectUnit"
));
result
.
add
(
vo
);
}
return
result
;
}
public
List
<
JskCombineBidProjectExportVo
>
exportBid
(
JskCombineSearchDto
dto
)
{
if
(
ObjectUtils
.
isEmpty
(
dto
.
getPageSize
()))
throw
new
ServiceException
(
"导出条数不能为空!"
);
if
(
dto
.
getPageSize
()
>
2000
)
dto
.
setPageSize
(
2000
);
Map
<
String
,
Object
>
map
=
dskOpenApiUtil
.
requestBody
(
"/operate/combine/businessList"
,
BeanUtil
.
beanToMap
(
dto
,
false
,
false
));
if
(
ObjectUtils
.
isEmpty
(
map
.
get
(
"data"
)))
throw
new
ServiceException
(
"导出失败,系统错误!"
);
Map
<
String
,
Object
>
data
=
BeanUtil
.
beanToMap
(
map
.
get
(
"data"
));
if
(
ObjectUtils
.
isEmpty
(
data
.
get
(
"list"
)))
throw
new
ServiceException
(
"导出失败,系统错误!"
);
List
<
Map
<
String
,
Object
>>
list
=
(
List
<
Map
<
String
,
Object
>>)
data
.
get
(
"list"
);
if
(
ObjectUtils
.
isEmpty
(
list
))
throw
new
ServiceException
(
"导出失败,无数据导出!"
);
List
<
JskCombineBidProjectExportVo
>
result
=
new
ArrayList
<>();
for
(
int
i
=
0
;
i
<
list
.
size
();
i
++)
{
JskCombineBidProjectExportVo
vo
=
new
JskCombineBidProjectExportVo
();
vo
.
setId
(
i
+
1
);
vo
.
setBidTime
(
MapUtil
.
getDate
(
list
.
get
(
i
),
"bidTime"
));
vo
.
setCompanyName
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"companyName"
));
vo
.
setStockPercent
(
MapUtil
.
getDouble
(
list
.
get
(
i
),
"stockPercent"
));
vo
.
setMemberLevel
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"memberLevel"
));
vo
.
setProjectName
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectName"
));
vo
.
setBidAmount
(
MapUtil
.
getDouble
(
list
.
get
(
i
),
"bidAmount"
));
vo
.
setAddress
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"address"
));
vo
.
setBidType
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"boundType"
));
vo
.
setProjectType
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectType"
));
vo
.
setProjectUnit
(
MapUtil
.
getStr
(
list
.
get
(
i
),
"projectUnit"
));
result
.
add
(
vo
);
}
return
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