Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
M
mall.oytour.com
Project
Project
Details
Activity
Releases
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
黄奎
mall.oytour.com
Commits
51d5561c
Commit
51d5561c
authored
Jan 02, 2025
by
黄奎
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
文件导入修改
parent
abe1623c
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
185 additions
and
86 deletions
+185
-86
ImportExcelNPOIHelper.cs
Mall.Common/Plugin/ImportExcelNPOIHelper.cs
+59
-60
BrandHelper.cs
Mall.DataHelper/Import/BrandHelper.cs
+91
-4
Program.cs
TestCore/Program.cs
+35
-22
No files found.
Mall.Common/Plugin/ImportExcelNPOIHelper.cs
View file @
51d5561c
...
@@ -162,7 +162,7 @@ namespace Mall.Common.Plugin
...
@@ -162,7 +162,7 @@ namespace Mall.Common.Plugin
case
CellType
.
Numeric
:
case
CellType
.
Numeric
:
if
(
DateUtil
.
IsCellDateFormatted
(
row
.
GetCell
(
j
)))
if
(
DateUtil
.
IsCellDateFormatted
(
row
.
GetCell
(
j
)))
{
{
dataRow
[
j
]
=
row
.
GetCell
(
j
).
DateCellValue
.
ToString
(
"yyyy-MM-dd HH:mm:ss"
);
dataRow
[
j
]
=
row
.
GetCell
(
j
).
DateCellValue
.
ToString
(
"yyyy-MM-dd HH:mm:ss"
);
}
}
else
else
{
{
...
@@ -254,61 +254,59 @@ namespace Mall.Common.Plugin
...
@@ -254,61 +254,59 @@ namespace Mall.Common.Plugin
/// <returns></returns>
/// <returns></returns>
private
List
<
Tuple
<
int
,
int
,
string
>>
FindPicCell
()
private
List
<
Tuple
<
int
,
int
,
string
>>
FindPicCell
()
{
{
string
_file
=
Path
.
Combine
(
RootPath
,
"xl/drawings/drawing1.xml"
);
// 图片信息文件
List
<
Tuple
<
int
,
int
,
string
>>
PictureInfo
=
new
List
<
Tuple
<
int
,
int
,
string
>>
{
};
// 存放返回的图片信息格式(row, column, path)
List
<
Tuple
<
int
,
int
,
string
>>
PictureInfo
=
new
List
<
Tuple
<
int
,
int
,
string
>>
{
};
// 存放返回的图片信息格式(row, column, path)
List
<
Tuple
<
string
,
string
>>
PictureTargetList
=
new
List
<
Tuple
<
string
,
string
>>
{
};
// 存放图片ID和路径对应关系的List
List
<
Tuple
<
string
,
string
>>
PictureTargetList
=
new
List
<
Tuple
<
string
,
string
>>
{
};
// 存放图片ID和路径对应关系的List
string
_file
=
Path
.
Combine
(
RootPath
,
"xl/drawings/drawing1.xml"
);
// 图片信息文件
// 先获取图片文件的路径信息
if
(
System
.
IO
.
File
.
Exists
(
_file
))
FindPicPathByID
(
ref
PictureTargetList
);
// 默认xml命名空间
XNamespace
xdr
=
"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
;
XNamespace
a
=
"http://schemas.openxmlformats.org/drawingml/2006/main"
;
XNamespace
r
;
//string xml = Read(_file);
XDocument
xDoc
=
XDocument
.
Load
(
_file
);
// 给xml命名空间赋文件中的当前值
var
root
=
xDoc
.
Root
;
foreach
(
var
item
in
root
.
Attributes
())
{
{
if
(
item
.
Name
.
LocalName
==
"xdr"
)
// 先获取图片文件的路径信息
FindPicPathByID
(
ref
PictureTargetList
);
// 默认xml命名空间
XNamespace
xdr
=
"http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing"
;
XNamespace
a
=
"http://schemas.openxmlformats.org/drawingml/2006/main"
;
XNamespace
r
;
XDocument
xDoc
=
XDocument
.
Load
(
_file
);
// 给xml命名空间赋文件中的当前值
var
root
=
xDoc
.
Root
;
foreach
(
var
item
in
root
.
Attributes
())
{
{
xdr
=
item
.
Value
;
if
(
item
.
Name
.
LocalName
==
"xdr"
)
}
{
else
if
(
item
.
Name
.
LocalName
==
"a"
)
xdr
=
item
.
Value
;
{
}
a
=
item
.
Value
;
else
if
(
item
.
Name
.
LocalName
==
"a"
)
{
a
=
item
.
Value
;
}
}
}
}
foreach
(
var
node
in
xDoc
.
Descendants
(
xdr
+
"twoCellAnchor"
))
foreach
(
var
node
in
xDoc
.
Descendants
(
xdr
+
"twoCellAnchor"
))
{
var
nFrom
=
(
XElement
)
node
.
FirstNode
;
var
nTo
=
(
XElement
)
nFrom
.
NextNode
;
var
nPic
=
((
XElement
)((
XElement
)((
XElement
)
nTo
.
NextNode
).
FirstNode
.
NextNode
).
FirstNode
);
// 找到起始行和列
string
StartRow
=
((
XElement
)((
XElement
)
nFrom
).
FirstNode
.
NextNode
.
NextNode
).
Value
;
string
StartCol
=
((
XElement
)((
XElement
)
nFrom
).
FirstNode
).
Value
;
// 找节点中的r的命名空间,如果找不到返回默认命名空间
r
=
nPic
.
FirstAttribute
.
IsNamespaceDeclaration
?
nPic
.
FirstAttribute
.
Value
:
"http://schemas.openxmlformats.org/officeDocument/2006/relationships"
;
string
nPicId
=
(
nPic
.
Attribute
(
r
+
"embed"
)
!=
null
?
nPic
.
Attribute
(
r
+
"embed"
)
:
nPic
.
Attribute
(
r
+
"link"
)).
Value
.
ToString
();
// 通过图片ID找到路径
string
PicPath
=
""
;
foreach
(
var
tupleItem
in
PictureTargetList
)
{
{
if
(
tupleItem
.
Item1
==
nPicId
)
var
nFrom
=
(
XElement
)
node
.
FirstNode
;
var
nTo
=
(
XElement
)
nFrom
.
NextNode
;
var
nPic
=
((
XElement
)((
XElement
)((
XElement
)
nTo
.
NextNode
).
FirstNode
.
NextNode
).
FirstNode
);
// 找到起始行和列
string
StartRow
=
((
XElement
)((
XElement
)
nFrom
).
FirstNode
.
NextNode
.
NextNode
).
Value
;
string
StartCol
=
((
XElement
)((
XElement
)
nFrom
).
FirstNode
).
Value
;
// 找节点中的r的命名空间,如果找不到返回默认命名空间
r
=
nPic
.
FirstAttribute
.
IsNamespaceDeclaration
?
nPic
.
FirstAttribute
.
Value
:
"http://schemas.openxmlformats.org/officeDocument/2006/relationships"
;
string
nPicId
=
(
nPic
.
Attribute
(
r
+
"embed"
)
!=
null
?
nPic
.
Attribute
(
r
+
"embed"
)
:
nPic
.
Attribute
(
r
+
"link"
)).
Value
.
ToString
();
// 通过图片ID找到路径
string
PicPath
=
""
;
foreach
(
var
tupleItem
in
PictureTargetList
)
{
{
PicPath
=
tupleItem
.
Item2
;
if
(
tupleItem
.
Item1
==
nPicId
)
if
(
PicPath
.
StartsWith
(
".."
))
{
{
PicPath
=
PicPath
.
Replace
(
".."
,
Path
.
Combine
(
RootPath
,
"xl"
));
PicPath
=
tupleItem
.
Item2
;
if
(
PicPath
.
StartsWith
(
".."
))
{
PicPath
=
PicPath
.
Replace
(
".."
,
Path
.
Combine
(
RootPath
,
"xl"
));
}
}
}
}
}
PictureInfo
.
Add
(
new
Tuple
<
int
,
int
,
string
>(
int
.
Parse
(
StartRow
),
int
.
Parse
(
StartCol
),
PicPath
));
}
}
PictureInfo
.
Add
(
new
Tuple
<
int
,
int
,
string
>(
int
.
Parse
(
StartRow
),
int
.
Parse
(
StartCol
),
PicPath
));
}
}
return
PictureInfo
;
return
PictureInfo
;
}
}
...
@@ -321,27 +319,28 @@ namespace Mall.Common.Plugin
...
@@ -321,27 +319,28 @@ namespace Mall.Common.Plugin
private
void
FindPicPathByID
(
ref
List
<
Tuple
<
string
,
string
>>
PictureTargetList
,
int
_id
=
1
)
private
void
FindPicPathByID
(
ref
List
<
Tuple
<
string
,
string
>>
PictureTargetList
,
int
_id
=
1
)
{
{
string
_file
=
Path
.
Combine
(
RootPath
,
$"xl/drawings/_rels/drawing
{
_id
}
.xml.rels"
);
// 图片对应关系文件
string
_file
=
Path
.
Combine
(
RootPath
,
$"xl/drawings/_rels/drawing
{
_id
}
.xml.rels"
);
// 图片对应关系文件
XDocument
xDoc
=
XDocument
.
Load
(
_file
);
if
(
System
.
IO
.
File
.
Exists
(
_file
))
var
root
=
xDoc
.
Root
;
foreach
(
XElement
node
in
root
.
Nodes
())
{
{
var
attrs
=
node
.
Attributes
();
XDocument
xDoc
=
XDocument
.
Load
(
_file
);
string
Id
=
""
;
var
root
=
xDoc
.
Root
;
string
Target
=
""
;
foreach
(
XElement
node
in
root
.
Nodes
())
foreach
(
var
attr
in
attrs
)
{
{
if
(
attr
.
Name
==
"Id"
)
var
attrs
=
node
.
Attributes
();
string
Id
=
""
;
string
Target
=
""
;
foreach
(
var
attr
in
attrs
)
{
{
Id
=
attr
.
Value
.
ToString
();
if
(
attr
.
Name
==
"Id"
)
}
{
Id
=
attr
.
Value
.
ToString
();
else
if
(
attr
.
Name
==
"Target"
)
}
{
else
if
(
attr
.
Name
==
"Target"
)
Target
=
attr
.
Value
.
ToString
();
{
Target
=
attr
.
Value
.
ToString
();
}
}
}
PictureTargetList
.
Add
(
new
Tuple
<
string
,
string
>(
Id
,
Target
));
}
}
PictureTargetList
.
Add
(
new
Tuple
<
string
,
string
>(
Id
,
Target
));
}
}
}
}
}
}
...
...
Mall.DataHelper/Import/BrandHelper.cs
View file @
51d5561c
...
@@ -46,7 +46,24 @@ namespace Mall.DataHelper.Import
...
@@ -46,7 +46,24 @@ namespace Mall.DataHelper.Import
/// <returns></returns>
/// <returns></returns>
public
static
RB_Brand_Enterprise_Extend
DataRowToModel
(
DataRow
dr
)
public
static
RB_Brand_Enterprise_Extend
DataRowToModel
(
DataRow
dr
)
{
{
RB_Brand_Enterprise_Extend
model
=
new
RB_Brand_Enterprise_Extend
();
RB_Brand_Enterprise_Extend
model
=
new
RB_Brand_Enterprise_Extend
()
{
BrandName
=
""
,
Logo
=
""
,
Banner
=
""
,
VideoUrl
=
""
,
CategoryName
=
""
,
Introduce
=
""
,
ShopNum
=
0
,
AreaRequirement
=
0
,
CustomerType
=
""
,
BrandType
=
""
,
Cooperation
=
""
,
PropertyDemand
=
""
,
Complementary
=
""
,
ContactName
=
""
,
ContactPhone
=
""
,
};
if
(
dr
!=
null
)
if
(
dr
!=
null
)
{
{
if
(
dr
.
Table
.
Columns
.
Contains
(
"品牌名称"
)
&&
!
string
.
IsNullOrEmpty
(
dr
[
"品牌名称"
].
ToString
().
Trim
()))
if
(
dr
.
Table
.
Columns
.
Contains
(
"品牌名称"
)
&&
!
string
.
IsNullOrEmpty
(
dr
[
"品牌名称"
].
ToString
().
Trim
()))
...
@@ -153,7 +170,29 @@ namespace Mall.DataHelper.Import
...
@@ -153,7 +170,29 @@ namespace Mall.DataHelper.Import
/// <returns></returns>
/// <returns></returns>
public
static
RB_Building_Carrier_Extend
DataRowToModel
(
DataRow
dr
)
public
static
RB_Building_Carrier_Extend
DataRowToModel
(
DataRow
dr
)
{
{
RB_Building_Carrier_Extend
model
=
new
RB_Building_Carrier_Extend
();
RB_Building_Carrier_Extend
model
=
new
RB_Building_Carrier_Extend
()
{
CategoryName
=
""
,
Logo
=
""
,
Address
=
""
,
LatAndLon
=
""
,
OpeningStatus
=
0
,
CarrierSize
=
0
,
LayersNum
=
""
,
CarNum
=
0
,
BuiltUpArea
=
0
,
AreaRequirement
=
0
,
VisitorsFlowrate
=
""
,
SupportingFacilities
=
""
,
ManagementCompany
=
""
,
Developers
=
""
,
Ascription
=
""
,
CarrierPlan
=
""
,
BrandDemand
=
""
,
Location
=
""
,
ContactName
=
""
,
ContactPhone
=
""
};
if
(
dr
!=
null
)
if
(
dr
!=
null
)
{
{
if
(
dr
.
Table
.
Columns
.
Contains
(
"项目名称"
)
&&
!
string
.
IsNullOrEmpty
(
dr
[
"项目名称"
].
ToString
().
Trim
()))
if
(
dr
.
Table
.
Columns
.
Contains
(
"项目名称"
)
&&
!
string
.
IsNullOrEmpty
(
dr
[
"项目名称"
].
ToString
().
Trim
()))
...
@@ -296,7 +335,35 @@ namespace Mall.DataHelper.Import
...
@@ -296,7 +335,35 @@ namespace Mall.DataHelper.Import
/// <returns></returns>
/// <returns></returns>
public
static
RB_Building_Extend
DataRowToModel
(
DataRow
dr
)
public
static
RB_Building_Extend
DataRowToModel
(
DataRow
dr
)
{
{
RB_Building_Extend
model
=
new
RB_Building_Extend
();
RB_Building_Extend
model
=
new
RB_Building_Extend
()
{
BuildId
=
0
,
Name
=
""
,
Banner
=
""
,
Address
=
""
,
LatAndLon
=
""
,
OperationTime
=
""
,
CategoryName
=
""
,
Areas
=
""
,
BuildingNum
=
""
,
FloorNum
=
""
,
ElevatorNum
=
""
,
FloorHeight
=
0
,
Developers
=
""
,
PropertyComp
=
""
,
SaleOrSelf
=
""
,
IsAllOperate
=
0
,
ConstructionTime
=
""
,
PropertyFee
=
0
,
RentFee
=
0
,
IndustryDirection
=
""
,
BrandDemand
=
""
,
Other
=
""
,
ContactName
=
""
,
ContactPhone
=
""
,
QIds
=
""
,
BannerList
=
new
List
<
string
>()
};
if
(
dr
!=
null
)
if
(
dr
!=
null
)
{
{
if
(
dr
.
Table
.
Columns
.
Contains
(
"楼宇名称"
)
&&
!
string
.
IsNullOrEmpty
(
dr
[
"楼宇名称"
].
ToString
().
Trim
()))
if
(
dr
.
Table
.
Columns
.
Contains
(
"楼宇名称"
)
&&
!
string
.
IsNullOrEmpty
(
dr
[
"楼宇名称"
].
ToString
().
Trim
()))
...
@@ -442,7 +509,27 @@ namespace Mall.DataHelper.Import
...
@@ -442,7 +509,27 @@ namespace Mall.DataHelper.Import
/// <returns></returns>
/// <returns></returns>
public
static
RB_EnterpriseServices_Extend
DataRowToModel
(
DataRow
dr
)
public
static
RB_EnterpriseServices_Extend
DataRowToModel
(
DataRow
dr
)
{
{
RB_EnterpriseServices_Extend
model
=
new
RB_EnterpriseServices_Extend
();
RB_EnterpriseServices_Extend
model
=
new
RB_EnterpriseServices_Extend
()
{
Name
=
""
,
Banner
=
""
,
Introduction
=
""
,
DevIntention
=
""
,
ETypeName
=
""
,
Address
=
""
,
LatAndLon
=
""
,
OperationTime
=
""
,
CategoryName
=
""
,
Renovation
=
""
,
Payment
=
""
,
HandoverDate
=
""
,
IntentionalFloor
=
""
,
ElevatorNum
=
""
,
PropertyFee
=
0
,
RentFee
=
0
,
ContactName
=
""
,
ContactPhone
=
""
,
};
if
(
dr
!=
null
)
if
(
dr
!=
null
)
{
{
if
(
dr
.
Table
.
Columns
.
Contains
(
"企业名称"
)
&&
!
string
.
IsNullOrEmpty
(
dr
[
"企业名称"
].
ToString
().
Trim
()))
if
(
dr
.
Table
.
Columns
.
Contains
(
"企业名称"
)
&&
!
string
.
IsNullOrEmpty
(
dr
[
"企业名称"
].
ToString
().
Trim
()))
...
...
TestCore/Program.cs
View file @
51d5561c
...
@@ -42,19 +42,23 @@ namespace TestCore
...
@@ -42,19 +42,23 @@ namespace TestCore
static
void
Main
(
string
[]
args
)
static
void
Main
(
string
[]
args
)
{
{
Console
.
WriteLine
(
"开始.."
);
Console
.
WriteLine
(
"开始.."
);
int
Type
=
4
;
int
Type
=
3
;
//品牌
if
(
Type
==
1
)
if
(
Type
==
1
)
{
{
BrandImport
();
BrandImport
();
}
}
//载体
else
if
(
Type
==
2
)
else
if
(
Type
==
2
)
{
{
CarrierImport
();
CarrierImport
();
}
}
//楼宇
else
if
(
Type
==
3
)
else
if
(
Type
==
3
)
{
{
BuildingImport
();
BuildingImport
();
}
}
//企业服务
else
else
{
{
EnterpriseImport
();
EnterpriseImport
();
...
@@ -181,46 +185,55 @@ namespace TestCore
...
@@ -181,46 +185,55 @@ namespace TestCore
string
buildingFile
=
rootPath
+
@"\活力楼宇导入.xlsx"
;
string
buildingFile
=
rootPath
+
@"\活力楼宇导入.xlsx"
;
var
buildingList
=
BuildingHelper
.
ImportYBuildingData
(
buildingFile
,
tempPath
);
var
buildingList
=
BuildingHelper
.
ImportYBuildingData
(
buildingFile
,
tempPath
);
var
categoryList
=
brandClassRepository
.
GetBrandClassListRepository
(
new
Mall
.
Model
.
Extend
.
TradePavilion
.
RB_BrandClass_Extend
()
{
});
var
categoryList
=
brandClassRepository
.
GetBrandClassListRepository
(
new
Mall
.
Model
.
Extend
.
TradePavilion
.
RB_BrandClass_Extend
()
{
});
var
oldBuildList
=
buildingRepository
.
GetBuildingRepository
(
new
Mall
.
Model
.
Extend
.
TradePavilion
.
RB_Building_Extend
()
{
TenantId
=
30
,
MallBaseId
=
20
});
Console
.
WriteLine
(
"End 解析楼宇文件..."
);
Console
.
WriteLine
(
"End 解析楼宇文件..."
);
Console
.
WriteLine
(
"开始导入楼宇数据..."
);
Console
.
WriteLine
(
"开始导入楼宇数据..."
);
foreach
(
var
item
in
buildingList
)
foreach
(
var
item
in
buildingList
)
{
{
if
(!
string
.
IsNullOrEmpty
(
item
.
Banner
))
if
(!
string
.
IsNullOrEmpty
(
item
.
Name
))
{
{
List
<
string
>
bannerList
=
new
List
<
string
>();
if
(!
string
.
IsNullOrEmpty
(
item
.
Banner
))
var
tempArray
=
item
.
Banner
.
Split
(
','
);
if
(
tempArray
!=
null
&&
tempArray
.
Length
>
0
)
{
{
foreach
(
var
tItem
in
tempArray
)
List
<
string
>
bannerList
=
new
List
<
string
>();
var
tempArray
=
item
.
Banner
.
Split
(
','
);
if
(
tempArray
!=
null
&&
tempArray
.
Length
>
0
)
{
{
if
(!
string
.
IsNullOrEmpty
(
tItem
)
)
foreach
(
var
tItem
in
tempArray
)
{
{
OssResult
bObj
=
SaveImg
(
tItem
);
if
(!
string
.
IsNullOrEmpty
(
tItem
))
if
(
bObj
.
resultCode
==
1
)
{
{
bannerList
.
Add
(
ViewFileSiteUrl
+
bObj
.
data
);
OssResult
bObj
=
SaveImg
(
tItem
);
if
(
bObj
.
resultCode
==
1
)
{
bannerList
.
Add
(
ViewFileSiteUrl
+
bObj
.
data
);
}
}
}
}
}
}
}
item
.
Banner
=
Mall
.
Common
.
Plugin
.
JsonHelper
.
Serialize
(
bannerList
);
}
}
item
.
Banner
=
Mall
.
Common
.
Plugin
.
JsonHelper
.
Serialize
(
bannerList
);
if
(!
string
.
IsNullOrEmpty
(
item
.
CategoryName
))
}
{
if
(!
string
.
IsNullOrEmpty
(
item
.
CategoryName
))
var
tempCategory
=
categoryList
.
FirstOrDefault
(
qitem
=>
qitem
.
ClassName
.
Trim
()
==
item
.
CategoryName
.
Trim
());
{
item
.
CategoryId
=
tempCategory
?.
ID
??
0
;
var
tempCategory
=
categoryList
.
FirstOrDefault
(
qitem
=>
qitem
.
ClassName
.
Trim
()
==
item
.
CategoryName
.
Trim
());
}
item
.
CategoryId
=
tempCategory
?.
ID
??
0
;
var
tempBuild
=
oldBuildList
?.
FirstOrDefault
(
qitem
=>
qitem
.
Name
==
item
.
Name
);
item
.
BuildId
=
tempBuild
?.
BuildId
??
0
;
item
.
TenantId
=
30
;
item
.
MallBaseId
=
20
;
item
.
CreateBy
=
30
;
item
.
CreateDate
=
DateTime
.
Now
;
item
.
UpdateBy
=
30
;
item
.
UpdateDate
=
DateTime
.
Now
;
}
}
item
.
TenantId
=
30
;
item
.
MallBaseId
=
20
;
item
.
CreateBy
=
30
;
item
.
CreateDate
=
DateTime
.
Now
;
item
.
UpdateBy
=
30
;
item
.
UpdateDate
=
DateTime
.
Now
;
}
}
bool
flag
=
false
;
bool
flag
=
false
;
string
str
=
Mall
.
Common
.
Plugin
.
JsonHelper
.
Serialize
(
buildingList
);
if
(
buildingList
!=
null
&&
buildingList
.
Count
>
0
)
if
(
buildingList
!=
null
&&
buildingList
.
Count
>
0
)
{
{
flag
=
buildingRepository
.
InsertBatch
(
buildingList
);
flag
=
buildingRepository
.
InsertBatch
(
buildingList
);
//buildingRepository.UpdateBatch
}
}
Console
.
WriteLine
(
"BuildingImport::Flag_{0} params:{1}"
,
flag
,
Mall
.
Common
.
Plugin
.
JsonHelper
.
Serialize
(
buildingList
));
Console
.
WriteLine
(
"BuildingImport::Flag_{0} params:{1}"
,
flag
,
Mall
.
Common
.
Plugin
.
JsonHelper
.
Serialize
(
buildingList
));
}
}
...
...
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