Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
G
gogirl-miniapp-backend
Overview
Overview
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
huluobin
gogirl-miniapp-backend
Commits
28ad9ad9
Commit
28ad9ad9
authored
Jun 24, 2020
by
huluobin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update
parent
96716f27
Show whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
77 additions
and
83 deletions
+77
-83
ScheduleManageService.java
...gogirl/application/order/serve/ScheduleManageService.java
+1
-1
ScheduleManageServiceImpl.java
...plication/order/serve/impl/ScheduleManageServiceImpl.java
+50
-76
CustomerServiceImpl.java
...l/application/user/customer/impl/CustomerServiceImpl.java
+7
-4
StoreTechnicianPeriod.java
...n/java/com/gogirl/shared/order/StoreTechnicianPeriod.java
+19
-2
No files found.
src/main/java/com/gogirl/application/order/serve/ScheduleManageService.java
View file @
28ad9ad9
...
...
@@ -142,7 +142,7 @@ public interface ScheduleManageService extends IService<ScheduleManage> {
IPage
<
LeisureScheduleServeResp
>
queryPageLeisureScheduleServe
(
LeisureScheduleServeQuery
query
);
/**
* 查询美甲师不可用时间段
* 查询美甲师
信息和美甲师
不可用时间段
*
* @param scheduledId 是否必传 否
* @param departmentId 店铺id
...
...
src/main/java/com/gogirl/application/order/serve/impl/ScheduleManageServiceImpl.java
View file @
28ad9ad9
...
...
@@ -62,7 +62,6 @@ import java.time.ZoneOffset;
import
java.util.*
;
import
java.util.concurrent.ExecutionException
;
import
java.util.concurrent.ForkJoinPool
;
import
java.util.concurrent.atomic.AtomicLong
;
import
java.util.stream.Collectors
;
import
static
com
.
gogirl
.
domain
.
order
.
serve
.
OrderServe
.
COMMENT_STATUS_NO
;
...
...
@@ -108,74 +107,65 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
String
scheduleDate
,
List
<
Integer
>
serveIdList
)
throws
ParseException
{
/
/1.查询美甲师排班表
/
*1.查询美甲师排班*/
List
<
StoreClassesTechnician
>
storeClassesTechnicianList
=
storeClassesTechnicianService
.
listClassesTechnician
(
scheduledId
,
departmentId
,
scheduleDate
);
//过滤不能做服务的美甲师
if
(
ListUtil
.
isNotEmpty
(
serveIdList
))
{
//美甲师能做哪些服务config查询
List
<
TechnicianServe
>
technicianServeList
=
technicianServeMapper
.
selectList
(
new
LambdaQueryWrapper
<
TechnicianServe
>().
in
(
TechnicianServe:
:
getServeId
,
serveIdList
));
//过滤不能做服务的美甲师
storeClassesTechnicianList
=
storeClassesTechnicianList
.
stream
()
.
filter
(
storeClassesTechnician
->
technicianServeList
.
stream
().
map
(
TechnicianServe:
:
getTechnicianId
).
collect
(
Collectors
.
toList
())
.
contains
(
storeClassesTechnician
.
getTechnicianManage
().
getId
()))
.
collect
(
Collectors
.
toList
());
storeClassesTechnicianList
=
storeClassesTechnicianList
.
stream
().
filter
(
storeClassesTechnician
->
technicianServeList
.
stream
().
map
(
TechnicianServe:
:
getTechnicianId
).
collect
(
Collectors
.
toList
()).
contains
(
storeClassesTechnician
.
getTechnicianManage
().
getId
())).
collect
(
Collectors
.
toList
());
}
List
<
StoreTechnicianPeriod
>
storeTechnicianPeriodList
=
new
ArrayList
<>();
SimpleDateFormat
simpleDateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
//遍历美甲师排班 获取每个美甲师的不可用时间段
for
(
StoreClassesTechnician
storeClassesTechnician
:
storeClassesTechnicianList
)
{
//一天开始的时间
long
dayStartTime
=
simpleDateFormat
.
parse
(
scheduleDate
+
" 00:00:00"
).
getTime
();
//一天结束的时间
long
dayEndTime
=
simpleDateFormat
.
parse
(
scheduleDate
+
" 23:59:59"
).
getTime
();
//遍历美甲师排班 获取每个美甲师的不可用时间段
for
(
StoreClassesTechnician
storeClassesTechnician
:
storeClassesTechnicianList
)
{
/*2、获取各个边界时间*/
//上班开始时间str
String
startTime
=
storeClassesTechnician
.
getClassesManage
().
getStartTime
().
toString
();
//上班结束时间str
String
endTime
=
storeClassesTechnician
.
getClassesManage
().
getEndTime
().
toString
();
//上班开始时间
long
workStartTime
=
simpleDateFormat
.
parse
(
scheduleDate
+
" "
+
startTime
).
getTime
();
//上班结束时间
long
workEndTime
=
simpleDateFormat
.
parse
(
scheduleDate
+
" "
+
endTime
).
getTime
();
//最晚可预约时间
String
latestScheduledTime
=
storeClassesTechnician
.
getClassesManage
().
getLatestScheduledTime
().
toString
();
/
/美甲师正在服务的时间为不可用时间
/
*3、已预约的时间不可用*/
List
<
ScheduleServe
>
scheduleServeList
=
storeClassesTechnician
.
getListScheduleServe
();
List
<
Period
>
periodList
=
scheduleServeList
.
stream
().
map
(
scheduleServe
->
new
Period
(
scheduleServe
.
getStartTime
().
getTime
(),
scheduleServe
.
getEndTime
().
getTime
())).
collect
(
Collectors
.
toList
());
//正在服务时间不可用
List
<
Period
>
periodList
=
scheduleServeList
.
stream
()
.
map
(
scheduleServe
->
new
Period
(
scheduleServe
.
getStartTime
().
getTime
(),
scheduleServe
.
getEndTime
().
getTime
()))
.
collect
(
Collectors
.
toList
());
//当前时间之前不可用
/*4、当前时间之前的时间不可用*/
Period
period2
=
new
Period
(
dayStartTime
,
System
.
currentTimeMillis
());
periodList
.
add
(
period2
);
//最晚可预约时间
if
(
StringUtils
.
isNotEmpty
(
latestScheduledTime
)
&&
storeClassesTechnician
.
getClassesManage
().
getLatestScheduledTimeEnable
()
==
1
)
{
/*5、如果开启了门店最晚预约时间,最晚可预约时间之后的时间不可用*/
if
(
StringUtils
.
isNotEmpty
(
latestScheduledTime
)
&&
storeClassesTechnician
.
getClassesManage
().
getLatestScheduledTimeEnable
()
==
1
)
{
long
latestScheduledTimeMills
=
simpleDateFormat
.
parse
(
scheduleDate
+
" "
+
latestScheduledTime
).
getTime
();
Period
latestScheduledTimeMillsPeriod
=
new
Period
(
latestScheduledTimeMills
,
dayEndTime
);
periodList
.
add
(
latestScheduledTimeMillsPeriod
);
}
/
/上班开始时间之前的时间不可用
/
*6、上班开始时间之前的时间不可用*/
Period
period3
=
new
Period
(
dayStartTime
,
workStartTime
);
periodList
.
add
(
period3
);
/
/请假时间不可用
/
*7、请假时间不可用*/
List
<
Period
>
takeLeavePeriodList
=
takeLeaveEventMapper
.
selectList
(
new
LambdaQueryWrapper
<
TakeLeaveEvent
>()
.
eq
(
TakeLeaveEvent:
:
getApplyTechnicianId
,
storeClassesTechnician
.
getTechnicianManage
().
getId
())
.
eq
(
TakeLeaveEvent:
:
getStatus
,
TakeLeaveEvent
.
STATUS_APPROVAL_PASS
)
...
...
@@ -186,22 +176,14 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
periodList
.
addAll
(
takeLeavePeriodList
);
/
/10点上班的
/
*8、10点上班(早班)下班后时间不可用*/
if
(
startTime
.
equals
(
"10:00:00"
))
{
//下班后多久的时间是可用的
Period
period4
=
new
Period
(
workEndTime
,
dayEndTime
);
periodList
.
add
(
period4
);
}
StoreTechnician
storeTechnician
=
storeClassesTechnician
.
getTechnicianManage
();
StoreTechnicianPeriod
storeTechnicianDTO
=
new
StoreTechnicianPeriod
(
periodList
,
storeTechnician
.
getId
(),
storeTechnician
.
getName
(),
storeTechnician
.
getPicturePath
(),
storeTechnician
.
getGrade
()
);
/*9、构造返回值*/
StoreTechnicianPeriod
storeTechnicianDTO
=
new
StoreTechnicianPeriod
(
periodList
,
storeClassesTechnician
.
getTechnicianManage
());
storeTechnicianPeriodList
.
add
(
storeTechnicianDTO
);
}
...
...
@@ -214,8 +196,8 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
LocalDateTime
serveStartTime
,
LocalDateTime
serveEndTime
)
throws
ParseException
{
List
<
StoreTechnicianPeriod
>
storeTechnicianPeriodList
=
this
.
queryStoreTechnicianPeriod
(
null
,
departmentId
,
serveStartTime
.
toLocalDate
().
toString
(),
Lists
.
newArrayList
(
serveId
));
Period
servePeriod
=
new
Period
(
serveStartTime
.
toInstant
(
ZoneOffset
.
of
(
"+8"
)).
toEpochMilli
(),
serveEndTime
.
toInstant
(
ZoneOffset
.
of
(
"+8"
)).
toEpochMilli
());
Period
servePeriod
=
new
Period
(
serveStartTime
.
toInstant
(
ZoneOffset
.
of
(
"+8"
)).
toEpochMilli
(),
serveEndTime
.
toInstant
(
ZoneOffset
.
of
(
"+8"
)).
toEpochMilli
());
List
<
Integer
>
technicianIds
=
storeTechnicianPeriodList
.
stream
().
filter
(
storeTechnicianPeriod
->
!
storeTechnicianPeriod
.
getPeriodList
().
stream
().
map
(
period
->
period
.
conflict
(
servePeriod
))
.
collect
(
Collectors
.
toList
()).
contains
(
true
))
...
...
@@ -233,13 +215,10 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
SimpleDateFormat
simpleDateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
//美甲师不可用日期列表
List
<
StoreTechnicianPeriod
>
storeTechnicianDTOList
=
this
.
queryStoreTechnicianPeriod
(
qry
.
getId
(),
qry
.
getDepartmentId
(),
qry
.
getScheduleDate
(),
qry
.
getListScheduleServer
().
stream
().
map
(
ScheduleServeQuery:
:
getServeId
).
collect
(
Collectors
.
toList
()));
/*1、获取美甲师和美甲师不可用时间段*/
List
<
StoreTechnicianPeriod
>
storeTechnicianDTOList
=
this
.
queryStoreTechnicianPeriod
(
qry
.
getId
(),
qry
.
getDepartmentId
(),
qry
.
getScheduleDate
(),
qry
.
getListScheduleServer
().
stream
().
map
(
ScheduleServeQuery:
:
getServeId
).
collect
(
Collectors
.
toList
()));
/
/查询时段
/
*2、迭代出所有需要返回的时间节点*/
if
(
ListUtil
.
isEmpty
(
qry
.
getDateTimeList
()))
{
long
workStartTime
=
simpleDateFormat
.
parse
(
qry
.
getScheduleDate
()
+
" 10:00:00"
).
getTime
();
long
workEndTime
=
simpleDateFormat
.
parse
(
qry
.
getScheduleDate
()
+
" 22:00:00"
).
getTime
();
...
...
@@ -251,6 +230,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
}
qry
.
setDateTimeList
(
dateTimeList
);
}
//预约服务时长和图片
qry
.
getListScheduleServer
().
forEach
(
scheduleServeQuery
->
{
if
(
scheduleServeQuery
.
getProduceId
()
==
null
)
{
...
...
@@ -286,41 +266,33 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
});
});
//线程池加速
ForkJoinPool
myPool
=
new
ForkJoinPool
(
qry
.
getDateTimeList
().
size
());
List
<
IdleTimeDTO
>
idleTimeDTOList
=
new
ArrayList
<>(
qry
.
getDateTimeList
().
size
());
myPool
.
submit
(()
->
{
qry
.
getDateTimeList
()
myPool
.
submit
(()
->
qry
.
getDateTimeList
()
.
forEach
(
dateTime
->
{
AtomicLong
time
=
new
AtomicLong
(
System
.
currentTimeMillis
());
//每个主服务由不同的美甲师做,setter主服务的时间period
mainScheduleServeQueryLinkedList
.
forEach
(
mainServeDTO
->
{
Period
period
=
new
Period
();
period
.
setStartTime
(
dateTime
);
period
.
setLength
(
mainServeDTO
.
getLengthTimeForEndTime
().
longValue
()
*
60000
);
period
.
setEndTime
(
dateTime
+
period
.
getLength
());
mainServeDTO
.
setPeriod
(
period
);
mainScheduleServeQueryLinkedList
.
forEach
(
mainScheduleServeQuery
->
{
Period
period
=
new
Period
(
dateTime
,
dateTime
+
mainScheduleServeQuery
.
getLengthTimeForEndTime
().
longValue
()
*
60000
);
mainScheduleServeQuery
.
setPeriod
(
period
);
});
//主服务深度克隆
List
<
ScheduleServeQuery
>
cloneMainServeDTOList
=
mainScheduleServeQueryLinkedList
.
stream
().
map
(
CloneUtil:
:
deepClone
).
collect
(
Collectors
.
toList
(
));
Queue
<
ScheduleServeQuery
>
cloneMainServeDTOList
=
mainScheduleServeQueryLinkedList
.
stream
().
map
(
CloneUtil:
:
deepClone
).
collect
(
Collectors
.
toCollection
(
LinkedList:
:
new
));
//美甲师深度克隆
List
<
StoreTechnicianPeriod
>
cloneStoreTechnicianDTOList
=
storeTechnicianDTOList
.
stream
().
map
(
CloneUtil:
:
deepClone
).
collect
(
Collectors
.
toList
());
//构造预约方案树🌲
TreeProgram
treeProgram
=
this
.
rec
(
new
LinkedList
<>(
cloneMainServeDTOList
),
cloneStoreTechnicianDTOList
,
TreeProgram
.
root
());
time
.
set
(
System
.
currentTimeMillis
());
List
<
TreeProgram
>
defaultNodes
=
new
ArrayList
<>();
//根据需要预约的服务和美甲师构造预约方案树🌲
TreeProgram
treeProgram
=
this
.
buildTreeProgram
(
cloneMainServeDTOList
,
cloneStoreTechnicianDTOList
,
TreeProgram
.
root
());
//构造默认美甲师
this
.
recDefault
(
defaultNodes
,
treeProgram
);
time
.
set
(
System
.
currentTimeMillis
()
);
List
<
TreeProgram
>
defaultNodeList
=
new
ArrayList
<>(
);
this
.
buildDefaultNodeList
(
defaultNodeList
,
treeProgram
);
IdleTimeDTO
idleTimeDTO
=
new
IdleTimeDTO
();
idleTimeDTO
.
setDateTime
(
dateTime
);
...
...
@@ -329,12 +301,11 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
/*关键信息 节点是否可用*/
idleTimeDTO
.
setStatus
(!
treeProgram
.
childNull
());
idleTimeDTO
.
setTreeProgram
(
treeProgram
);
idleTimeDTO
.
setDefaultNodeList
(
defaultNodes
);
idleTimeDTO
.
setDefaultNodeList
(
defaultNodeList
);
idleTimeDTOList
.
add
(
idleTimeDTO
);
});
}).
get
();
})).
get
();
myPool
.
shutdown
();
...
...
@@ -344,10 +315,11 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
idleTimeDTO
.
setTreeProgram
(
null
);
});
}
/*排序返回*/
return
idleTimeDTOList
.
stream
().
sorted
(
Comparator
.
comparing
(
IdleTimeDTO:
:
getTime
)).
collect
(
Collectors
.
toList
());
}
private
void
recDefaul
t
(
List
<
TreeProgram
>
list
,
private
void
buildDefaultNodeLis
t
(
List
<
TreeProgram
>
list
,
TreeProgram
parent
)
{
if
(!
CollectionUtils
.
isEmpty
(
parent
.
getChildList
()))
{
TreeProgram
treeProgram
=
new
TreeProgram
();
...
...
@@ -366,25 +338,28 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
treeProgram
.
setStoreTechnicianDTO
(
defaultNode
.
getStoreTechnicianDTO
());
list
.
add
(
treeProgram
);
this
.
recDefaul
t
(
list
,
defaultNode
);
this
.
buildDefaultNodeLis
t
(
list
,
defaultNode
);
}
}
private
TreeProgram
rec
(
Queue
<
ScheduleServeQuery
>
scheduleServeQueryList
,
private
TreeProgram
buildTreeProgram
(
Queue
<
ScheduleServeQuery
>
scheduleServeQueryList
,
List
<
StoreTechnicianPeriod
>
storeTechnicians
,
TreeProgram
parent
)
{
long
time
=
System
.
currentTimeMillis
();
final
ScheduleServeQuery
scheduleServeQuery
=
scheduleServeQueryList
.
poll
();
List
<
TreeProgram
>
childList
=
Lists
.
newArrayList
();
//遍历每一个美甲师
storeTechnicians
.
forEach
(
storeTechnician
->
{
storeTechnicians
.
stream
()
.
filter
(
storeTechnicianPeriod
->
{
List
<
TechnicianServe
>
technicianServeList
=
technicianServeMapper
.
selectList
(
new
LambdaQueryWrapper
<
TechnicianServe
>().
eq
(
TechnicianServe:
:
getServeId
,
scheduleServeQuery
.
getServeId
()));
return
technicianServeList
.
stream
().
map
(
TechnicianServe:
:
getTechnicianId
).
collect
(
Collectors
.
toList
()).
contains
(
storeTechnicianPeriod
.
getTechnicianId
());
})
.
forEach
(
storeTechnician
->
{
//美甲师深度克隆
List
<
TreeProgram
>
pathClone
=
parent
.
getPath
().
stream
().
map
(
CloneUtil:
:
deepClone
).
filter
(
Objects:
:
nonNull
)
.
collect
(
Collectors
.
toList
());
List
<
TreeProgram
>
pathClone
=
parent
.
getPath
().
stream
().
map
(
CloneUtil:
:
deepClone
).
filter
(
Objects:
:
nonNull
).
collect
(
Collectors
.
toList
());
//包含当前美甲师的父节点list
List
<
ScheduleServeQuery
>
severedList
=
pathClone
...
...
@@ -434,7 +409,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
//如果还有服务 继续构造子树
if
(!
CollectionUtils
.
isEmpty
(
scheduleServeQueryList
))
{
Queue
<
ScheduleServeQuery
>
cloneScheduleServeQueryList
=
scheduleServeQueryList
.
stream
().
map
(
CloneUtil:
:
deepClone
).
collect
(
Collectors
.
toCollection
(
LinkedList:
:
new
));
this
.
rec
(
cloneScheduleServeQueryList
,
storeTechnicians
,
node
);
this
.
buildTreeProgram
(
cloneScheduleServeQueryList
,
storeTechnicians
,
node
);
//如果构造的子树为空
if
(!
node
.
childNull
())
{
...
...
@@ -454,8 +429,7 @@ public class ScheduleManageServiceImpl extends ServiceImpl<ScheduleManageMapper,
private
boolean
test
(
List
<
TreeProgram
>
path
)
{
Map
<
StoreTechnicianPeriod
,
List
<
TreeProgram
>>
map
=
path
.
stream
()
.
collect
(
Collectors
.
groupingBy
(
TreeProgram:
:
getStoreTechnicianDTO
));
Map
<
StoreTechnicianPeriod
,
List
<
TreeProgram
>>
map
=
path
.
stream
().
collect
(
Collectors
.
groupingBy
(
TreeProgram:
:
getStoreTechnicianDTO
));
List
<
TreeProgram
>
treePrograms
=
map
.
values
().
stream
()
...
...
src/main/java/com/gogirl/application/user/customer/impl/CustomerServiceImpl.java
View file @
28ad9ad9
...
...
@@ -24,7 +24,6 @@ import com.gogirl.infrastructure.common.util.StringUtils;
import
com.gogirl.infrastructure.mapper.order.serve.OrderManageMapper
;
import
com.gogirl.infrastructure.mapper.order.serve.OrderRecordMapper
;
import
com.gogirl.infrastructure.mapper.order.serve.OrderServeMapper
;
import
com.gogirl.infrastructure.mapper.order.serve.ScheduleManageMapper
;
import
com.gogirl.infrastructure.mapper.product.serve.BaseServeMapper
;
import
com.gogirl.infrastructure.mapper.store.store.StoreManageMapper
;
import
com.gogirl.infrastructure.mapper.user.customer.CustomerBalanceMapper
;
...
...
@@ -52,36 +51,40 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> i
@Resource
private
CustomerMapper
customerMapper
;
@Resource
private
WechatService
wechatService
;
@Resource
private
GogirlTokenService
gogirlTokenService
;
@Resource
private
ScheduleManageMapper
scheduleManageMapper
;
@Resource
private
CustomerDetailMapper
customerDetailMapper
;
@Resource
private
CustomerBalanceMapper
customerBalanceMapper
;
@Resource
private
QRCodeService
qrCodeService
;
@Resource
private
StoreManageMapper
storeManageMapper
;
@Resource
private
OrderManageMapper
orderManageMapper
;
@Resource
private
OrderServeMapper
orderServeMapper
;
@Resource
private
BaseServeMapper
baseServeMapper
;
@Resource
private
OrderRecordMapper
orderRecordMapper
;
@Resource
private
CustomerDetailService
customerDetailService
;
@Resource
private
OrderManageService
orderManageService
;
...
...
src/main/java/com/gogirl/shared/order/StoreTechnicianPeriod.java
View file @
28ad9ad9
package
com
.
gogirl
.
shared
.
order
;
import
com.fasterxml.jackson.annotation.JsonIgnore
;
import
com.gogirl.domain.store.store.StoreTechnician
;
import
lombok.AllArgsConstructor
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
...
...
@@ -23,11 +24,27 @@ public class StoreTechnicianPeriod implements Serializable {
*/
private
Integer
technicianId
;
//美甲师姓名
/**
* 美甲师姓名
*/
private
String
name
;
/**
* 美甲师头像
*/
private
String
picturePath
;
/**
* 美甲师级别
*/
private
String
grade
;
public
StoreTechnicianPeriod
(
List
<
Period
>
periodList
,
StoreTechnician
storeTechnician
)
{
this
.
periodList
=
periodList
;
this
.
technicianId
=
storeTechnician
.
getId
();
this
.
name
=
storeTechnician
.
getName
();
this
.
picturePath
=
storeTechnician
.
getPicturePath
();
}
}
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