Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
cloud-platform
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
youjj
cloud-platform
Commits
2ef211bf
Commit
2ef211bf
authored
Nov 01, 2019
by
libin
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'master-member-feture-count'
parents
a86808b6
e9bc38ea
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
137 additions
and
36 deletions
+137
-36
AppUserManageDTO.java
...m/github/wxiaoqi/security/admin/dto/AppUserManageDTO.java
+5
-0
AppUserLoginBiz.java
...om/github/wxiaoqi/security/admin/biz/AppUserLoginBiz.java
+5
-3
AppUserManageBiz.java
...m/github/wxiaoqi/security/admin/biz/AppUserManageBiz.java
+10
-0
AppUserSellingWaterBiz.java
...ub/wxiaoqi/security/admin/biz/AppUserSellingWaterBiz.java
+12
-0
AppUsersManageController.java
...wxiaoqi/security/admin/rest/AppUsersManageController.java
+6
-1
AppUserDetailMapper.xml
...e-admin/src/main/resources/mapper/AppUserDetailMapper.xml
+3
-0
BaseOrderMapper.java
.../java/com/xxfc/platform/order/mapper/BaseOrderMapper.java
+1
-1
OrderMemberController.java
...a/com/xxfc/platform/order/rest/OrderMemberController.java
+18
-1
OrderMemberService.java
...a/com/xxfc/platform/order/service/OrderMemberService.java
+77
-30
No files found.
ace-modules/ace-admin-api/src/main/java/com/github/wxiaoqi/security/admin/dto/AppUserManageDTO.java
View file @
2ef211bf
...
...
@@ -60,6 +60,11 @@ public class AppUserManageDTO {
*/
private
Set
<
Integer
>
citySet
;
/**
* 用户id
*/
private
Integer
userId
;
// /**
// * 接收前台时间范围
// */
...
...
ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/AppUserLoginBiz.java
View file @
2ef211bf
...
...
@@ -63,6 +63,9 @@ public class AppUserLoginBiz extends BaseBiz<AppUserLoginMapper, AppUserLogin> {
@Autowired
private
AppUserRelationBiz
appUserRelationBiz
;
@Autowired
private
AppUserSellingWaterBiz
appUserSellingWaterBiz
;
@Transactional
(
rollbackFor
=
Exception
.
class
,
propagation
=
Propagation
.
REQUIRED
)
@Override
public
void
insertSelective
(
AppUserLogin
entity
)
{
...
...
@@ -417,11 +420,10 @@ public class AppUserLoginBiz extends BaseBiz<AppUserLoginMapper, AppUserLogin> {
leaderId
=
appUserLogins
.
get
(
0
).
getId
();
//2.根据leader userId查询下级 userid
if
(
Objects
.
nonNull
(
leaderId
))
{
List
<
AppUserRelation
>
appUserRelationList
=
appUserRelationBiz
.
findMemberPageByLeaderId
(
leaderId
);
if
(
CollectionUtils
.
isEmpty
(
appUserRelationList
)){
memberIds
=
appUserSellingWaterBiz
.
findMemberIdByLeaderIdAndOrdreType
(
leaderId
,
3
);
if
(
CollectionUtils
.
isEmpty
(
memberIds
)){
return
Collections
.
EMPTY_LIST
;
}
memberIds
=
appUserRelationList
.
stream
().
map
(
AppUserRelation:
:
getUserId
).
collect
(
Collectors
.
toList
());
}
}
List
<
Integer
>
userIds
=
mapper
.
findAppUser
(
phone
,
name
,
memberIds
);
...
...
ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/AppUserManageBiz.java
View file @
2ef211bf
...
...
@@ -184,4 +184,14 @@ public class AppUserManageBiz extends BaseBiz<AppUserDetailMapper, AppUserDetail
}
}
public
AppUserManageVo
findUserInfoById
(
Integer
userId
)
{
AppUserManageVo
appUserManageVo
=
new
AppUserManageVo
();
AppUserManageDTO
appUserManageDTO
=
new
AppUserManageDTO
();
appUserManageDTO
.
setUserId
(
userId
);
List
<
AppUserManageVo
>
appUserManageVos
=
mapper
.
selectAppUserManage
(
appUserManageDTO
);
if
(
CollectionUtils
.
isEmpty
(
appUserManageVos
)){
return
appUserManageVo
;
}
return
appUserManageVos
.
get
(
0
);
}
}
ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/biz/AppUserSellingWaterBiz.java
View file @
2ef211bf
...
...
@@ -399,6 +399,18 @@ public class AppUserSellingWaterBiz extends BaseBiz<AppUserSellingWaterMapper, A
return
sellingWalletPagVo
;
}
public
List
<
Integer
>
findMemberIdByLeaderIdAndOrdreType
(
Integer
leaderId
,
int
orderType
)
{
Example
example
=
new
Example
(
AppUserSellingWater
.
class
);
Example
.
Criteria
criteria
=
example
.
createCriteria
();
criteria
.
andEqualTo
(
"userId"
,
leaderId
);
criteria
.
andEqualTo
(
"orderType"
,
orderType
);
List
<
AppUserSellingWater
>
appUserSellingWaters
=
mapper
.
selectByExample
(
example
);
if
(
CollectionUtils
.
isEmpty
(
appUserSellingWaters
)){
return
Collections
.
EMPTY_LIST
;
}
return
appUserSellingWaters
.
stream
().
map
(
AppUserSellingWater:
:
getSourceId
).
collect
(
Collectors
.
toList
());
}
private
enum
SellerWallterStatus
{
CANCEL
(
2
,
"取消订单"
),
POST
(
1
,
"已入账"
),
...
...
ace-modules/ace-admin/src/main/java/com/github/wxiaoqi/security/admin/rest/AppUsersManageController.java
View file @
2ef211bf
...
...
@@ -19,7 +19,6 @@ import com.xxfc.platform.vehicle.feign.VehicleFeign;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.http.HttpServletRequest
;
import
java.util.Set
;
/**
...
...
@@ -66,6 +65,12 @@ public class AppUsersManageController extends BaseController<AppUserManageBiz,Ap
appUserManageDTO
.
setCitySet
(
cityList
);
return
ObjectRestResponse
.
succ
(
baseBiz
.
findAllByQueryAndCity
(
appUserManageDTO
));
}
@GetMapping
(
"/user_info/{id}"
)
public
ObjectRestResponse
<
AppUserManageVo
>
findUserInfo
(
@PathVariable
(
value
=
"id"
)
Integer
userId
){
AppUserManageVo
appUserManageVo
=
baseBiz
.
findUserInfoById
(
userId
);
return
ObjectRestResponse
.
succ
(
appUserManageVo
);
}
/**
* 查询一条
* @param id
...
...
ace-modules/ace-admin/src/main/resources/mapper/AppUserDetailMapper.xml
View file @
2ef211bf
...
...
@@ -166,6 +166,9 @@
<if
test=
"source !=null "
>
and d.source = #{source}
</if>
<if
test=
"userId!=null"
>
and l.id=#{userId}
</if>
<if
test=
"citySet != null "
>
and d.city_code in
<foreach
collection=
"citySet"
item=
"item"
index=
"index"
open=
"("
separator=
","
close=
")"
>
...
...
xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/mapper/BaseOrderMapper.java
View file @
2ef211bf
...
...
@@ -12,7 +12,7 @@ import java.math.BigDecimal;
import
java.util.List
;
import
java.util.Map
;
/**
/**
;
*
*
* @author zjw
...
...
xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/rest/OrderMemberController.java
View file @
2ef211bf
...
...
@@ -3,7 +3,9 @@ package com.xxfc.platform.order.rest;
import
cn.hutool.core.bean.BeanUtil
;
import
com.github.wxiaoqi.security.admin.feign.UserFeign
;
import
com.github.wxiaoqi.security.auth.client.annotation.IgnoreClientToken
;
import
com.github.wxiaoqi.security.auth.client.annotation.IgnoreUserToken
;
import
com.github.wxiaoqi.security.common.context.BaseContextHandler
;
import
com.github.wxiaoqi.security.common.exception.BaseException
;
import
com.github.wxiaoqi.security.common.msg.ObjectRestResponse
;
import
com.github.wxiaoqi.security.common.rest.BaseController
;
import
com.xxfc.platform.order.biz.OrderMemberDetailBiz
;
...
...
@@ -20,7 +22,12 @@ import org.springframework.beans.factory.annotation.Autowired;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.*
;
import
javax.servlet.ServletOutputStream
;
import
javax.servlet.http.HttpServletResponse
;
import
java.net.URLEncoder
;
import
java.time.LocalDateTime
;
import
java.time.format.DateTimeFormatter
;
import
java.util.Base64
;
@Controller
@RequestMapping
(
"orderMember"
)
...
...
@@ -69,6 +76,16 @@ public class OrderMemberController extends BaseController<OrderMemberDetailBiz,
@PostMapping
(
"/export"
)
@ResponseBody
public
void
exportMemberOrders
(
@RequestBody
MemberOrderFindDTO
memberOrderFindDTO
,
HttpServletResponse
response
){
// orderMemberService.exportMemberOrderData(memberOrderFindDTO);
try
{
String
name
=
DateTimeFormatter
.
ofPattern
(
"YYYYMMddHHmmss"
).
format
(
LocalDateTime
.
now
());
response
.
setContentType
(
"application/vnd.ms-excel;charset=utf-8"
);
String
filename
=
String
.
format
(
"%s-MemberOrder.xlsx"
,
name
);
response
.
setHeader
(
"Content-Disposition"
,
"attachment;filename="
+
new
String
(
filename
.
getBytes
(),
"iso8859-1"
));
ServletOutputStream
outputStream
=
response
.
getOutputStream
();
orderMemberService
.
exportMemberOrderData
(
memberOrderFindDTO
,
name
,
outputStream
);
response
.
setCharacterEncoding
(
"UTF-8"
);
}
catch
(
Exception
ex
){
throw
new
BaseException
(
"导出数据失败"
);
}
}
}
\ No newline at end of file
xx-order/xx-order-server/src/main/java/com/xxfc/platform/order/service/OrderMemberService.java
View file @
2ef211bf
package
com
.
xxfc
.
platform
.
order
.
service
;
import
cn.hutool.core.bean.BeanUtil
;
import
cn.hutool.poi.excel.ExcelUtil
;
import
cn.hutool.poi.excel.ExcelWriter
;
import
com.github.wxiaoqi.security.admin.bo.UserBo
;
import
com.github.wxiaoqi.security.admin.entity.BaseUserMemberLevel
;
import
com.github.wxiaoqi.security.admin.feign.UserFeign
;
import
com.github.wxiaoqi.security.admin.feign.rest.UserRestInterface
;
import
com.github.wxiaoqi.security.auth.client.config.UserAuthConfig
;
import
com.github.wxiaoqi.security.common.exception.BaseException
;
import
com.github.wxiaoqi.security.common.util.excel.ExcelExport
;
import
com.github.wxiaoqi.security.common.util.process.ResultCode
;
import
com.github.wxiaoqi.security.common.vo.PageDataVO
;
import
com.xxfc.platform.activity.feign.ActivityFeign
;
...
...
@@ -20,7 +17,6 @@ import com.xxfc.platform.order.biz.OrderTemplateBiz;
import
com.xxfc.platform.order.contant.enumerate.ItemTypeEnum
;
import
com.xxfc.platform.order.contant.enumerate.OrderStatusEnum
;
import
com.xxfc.platform.order.contant.enumerate.OrderTypeEnum
;
import
com.xxfc.platform.order.entity.BaseOrder
;
import
com.xxfc.platform.order.entity.OrderItem
;
import
com.xxfc.platform.order.pojo.dto.MemberOrderBo
;
import
com.xxfc.platform.order.pojo.dto.MemberOrderFindDTO
;
...
...
@@ -37,19 +33,20 @@ import org.apache.commons.collections.CollectionUtils;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.ss.usermodel.*
;
import
org.apache.poi.ss.util.CellRangeAddress
;
import
org.apache.poi.xssf.usermodel.XSSFCellStyle
;
import
org.apache.poi.xssf.usermodel.XSSFFont
;
import
org.apache.poi.xssf.usermodel.XSSFSheet
;
import
org.apache.poi.xssf.usermodel.XSSFWorkbook
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
javax.annotation.PostConstruct
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.
File
OutputStream
;
import
java.io.OutputStream
;
import
java.math.BigDecimal
;
import
java.time.Instant
;
import
java.time.LocalDate
;
import
java.time.LocalDateTime
;
import
java.text.SimpleDateFormat
;
import
java.time.format.DateTimeFormatter
;
import
java.util.*
;
import
java.util.concurrent.atomic.AtomicInteger
;
import
java.util.function.Function
;
import
java.util.stream.Collectors
;
...
...
@@ -96,6 +93,10 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz
@Autowired
public
HttpServletRequest
request
;
private
SimpleDateFormat
simleFormatter
=
new
SimpleDateFormat
(
"YYYY-MM-dd HH:mm:ss"
);
private
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"YYYYMMddHHmmss"
);
@PostConstruct
public
void
init
()
{
this
.
orderTypeEnum
=
OrderTypeEnum
.
MEMBER
;
...
...
@@ -197,56 +198,95 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz
* 导出数据
* @param memberOrderFindDTO
*/
public
void
exportMemberOrderData
(
MemberOrderFindDTO
memberOrderFindDTO
)
throws
Exception
{
public
void
exportMemberOrderData
(
MemberOrderFindDTO
memberOrderFindDTO
,
String
name
,
OutputStream
outputStream
)
throws
Exception
{
MemberOrderPageVo
memberOrderPageVo
=
listMemberOrderPage
(
memberOrderFindDTO
);
List
<
MemberOrderBo
>
memberOrderBoList
=
memberOrderPageVo
.
getMemberOrderPage
().
getData
();
MemberOrderStatisticsBo
memberOrderStatisticsBo
=
memberOrderPageVo
.
getMemberOrderStatisticsBo
();
FileOutputStream
fileOutputStream
=
new
FileOutputStream
(
"ts.xlsx"
);
ExcelExport
excelExport
=
new
ExcelExport
();
Workbook
workbook
=
excelExport
.
getWorkbook
();
Sheet
sheet
=
workbook
.
createSheet
();
CellStyle
cellStyleHeader01
=
workbook
.
createCellStyle
();
cellStyleHeader01
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
sheet
.
autoSizeColumn
(
9
);
XSSFWorkbook
hssfWorkbook
=
new
XSSFWorkbook
();
XSSFSheet
sheet
=
hssfWorkbook
.
createSheet
(
name
+
"会员订单列表"
);
CellStyle
headerCellStyle
=
createHeaderCellStyle
(
hssfWorkbook
);
CellStyle
generalCellStyle
=
createGeneralCellStyle
(
hssfWorkbook
);
Row
row1
=
sheet
.
createRow
(
0
);
DateTimeFormatter
dateTimeFormatter
=
DateTimeFormatter
.
ofPattern
(
"YYYYMMddHHmmss"
);
createHeader
(
row1
,
0
,
new
String
[]{
dateTimeFormatter
.
format
(
LocalDateTime
.
now
())+
"会员订单列表"
},
cellStyleHeader01
);
createHeader
(
row1
,
0
,
new
String
[]{
name
+
"会员订单列表"
},
headerCellStyle
);
CellRangeAddress
cellRangeAddress
=
new
CellRangeAddress
(
0
,
0
,
0
,
11
);
sheet
.
addMergedRegion
(
cellRangeAddress
);
Row
row2
=
sheet
.
createRow
(
1
);
Cell
row2_cell1
=
row2
.
createCell
(
0
);
row2_cell1
.
setCellValue
(
"统计"
);
row2_cell1
.
setCellStyle
(
cellStyleHeader01
);
row2_cell1
.
setCellStyle
(
headerCellStyle
);
CellRangeAddress
cellRangeAddress2
=
new
CellRangeAddress
(
1
,
2
,
0
,
0
);
sheet
.
addMergedRegion
(
cellRangeAddress2
);
String
[]
header2
=
new
String
[]{
"会员订单总数(单)"
,
"会员订单总额(元)"
,
"钻石会员订单(单)"
,
"钻石会员订单总额(元)"
,
"黄金会员订单(单)"
,
"黄金会员订单总额(元)"
,
"普通会员订单(单)"
,
"普通会员订单总额(元)"
};
createHeader
(
row2
,
1
,
header2
,
cellStyleHeader01
);
createHeader
(
row2
,
1
,
header2
,
headerCellStyle
);
String
[]
countData
=
getData
(
memberOrderStatisticsBo
);
Row
row4
=
sheet
.
createRow
(
2
);
createCellCount
(
row4
,
1
,
countData
,
cellStyleHeader01
);
createCellCount
(
row4
,
1
,
countData
,
generalCellStyle
);
Row
row5
=
sheet
.
createRow
(
4
);
String
[]
header3
=
new
String
[]{
"订单号"
,
"创建时间"
,
"订单状态"
,
"名称"
,
"用户姓名"
,
"手机号"
,
"上级姓名/手机号"
,
"促成人姓名/手机号"
,
"订单价格(元)"
,
"优惠金额(元)"
,
"实付金额(元)"
,
"支付时间"
};
CellRangeAddress
cellRangeAddress3
=
new
CellRangeAddress
(
3
,
3
,
0
,
header3
.
length
);
sheet
.
addMergedRegion
(
cellRangeAddress3
);
createHeader
(
row5
,
0
,
header3
,
cellStyleHeader01
);
createHeader
(
row5
,
0
,
header3
,
headerCellStyle
);
workbook
.
write
(
fileOutputStream
);
fileOutputStream
.
close
();
workbook
.
close
();
for
(
int
i
=
0
;
i
<
header3
.
length
;
i
++){
sheet
.
setColumnWidth
(
i
,
24
*
256
);
}
List
<
String
[]>
orderDataList
=
getMemberOrderDataList
(
memberOrderBoList
,
12
);
createMemberOrderCellData
(
sheet
,
5
,
generalCellStyle
,
orderDataList
);
hssfWorkbook
.
write
(
outputStream
);
hssfWorkbook
.
close
();
}
private
List
<
String
[]>
getMemberOrderDataList
(
List
<
MemberOrderBo
>
memberOrderBoList
,
Integer
size
){
List
<
String
[]>
memerOrderData
=
new
ArrayList
<>();
String
[]
data
=
null
;
String
[]
data
;
for
(
MemberOrderBo
memberOrderBo
:
memberOrderBoList
)
{
data
=
new
String
[
size
];
data
[
0
]=
memberOrderBo
.
getOrderNo
();
data
[
1
]=
simleFormatter
.
format
(
memberOrderBo
.
getCreatTime
());
data
[
2
]=
memberOrderBo
.
getStatus
()==
2
?
"取消"
:
memberOrderBo
.
getStatus
()==
3
?
"待支付"
:
memberOrderBo
.
getStatus
()==
6
?
"已完成"
:
""
;
data
[
3
]=
memberOrderBo
.
getName
();
data
[
4
]=
memberOrderBo
.
getUserName
();
data
[
5
]=
memberOrderBo
.
getPhone
()==
null
?
""
:
memberOrderBo
.
getPhone
();
data
[
6
]=
String
.
format
(
"%s/%s"
,
memberOrderBo
.
getLeaderName
()==
null
?
""
:
memberOrderBo
.
getLeaderName
(),
memberOrderBo
.
getLeaderPhone
()==
null
?
""
:
memberOrderBo
.
getLeaderPhone
());
data
[
7
]=
String
.
format
(
"%s/%s"
,
memberOrderBo
.
getFacilitateName
()==
null
?
""
:
memberOrderBo
.
getFacilitateName
(),
memberOrderBo
.
getFacilitatePhone
()==
null
?
""
:
memberOrderBo
.
getFacilitatePhone
());
data
[
8
]=
memberOrderBo
.
getOrderAmount
().
toString
();
data
[
9
]=
memberOrderBo
.
getCouponAmount
().
toString
();
data
[
10
]=
memberOrderBo
.
getRealAmount
().
toString
();
data
[
11
]=
memberOrderBo
.
getPayTime
()==
null
?
""
:
simleFormatter
.
format
(
new
Date
(
memberOrderBo
.
getPayTime
()));
memerOrderData
.
add
(
data
);
}
return
null
;
return
memerOrderData
;
}
private
CellStyle
createGeneralCellStyle
(
XSSFWorkbook
hssfWorkbook
){
CellStyle
cellStyleGeneral
=
createHeaderCellStyle
(
hssfWorkbook
);
cellStyleGeneral
.
setWrapText
(
true
);
XSSFFont
generalFont
=
createFont
(
hssfWorkbook
);
generalFont
.
setBold
(
false
);
cellStyleGeneral
.
setFont
(
generalFont
);
return
cellStyleGeneral
;
}
private
CellStyle
createHeaderCellStyle
(
XSSFWorkbook
hssfWorkbook
){
XSSFCellStyle
cellStyleHeader
=
hssfWorkbook
.
createCellStyle
();
cellStyleHeader
.
setAlignment
(
HorizontalAlignment
.
CENTER
);
cellStyleHeader
.
setVerticalAlignment
(
VerticalAlignment
.
CENTER
);
cellStyleHeader
.
setLocked
(
false
);
XSSFFont
headerFont
=
createFont
(
hssfWorkbook
);
cellStyleHeader
.
setFont
(
headerFont
);
return
cellStyleHeader
;
}
private
XSSFFont
createFont
(
XSSFWorkbook
hssfWorkbook
){
XSSFFont
font
=
hssfWorkbook
.
createFont
();
font
.
setFontName
(
"黑体"
);
font
.
setBold
(
true
);
return
font
;
}
private
String
[]
getData
(
MemberOrderStatisticsBo
memberOrderStatisticsBo
){
...
...
@@ -270,11 +310,18 @@ public class OrderMemberService extends AbstractOrderHandle<OrderMemberDetailBiz
}
}
private
void
createMemberOrderCellData
(
Sheet
sheet
,
int
startRowIndex
,
CellStyle
cellStyle
,
List
<
String
[]>
memberOrderList
){
for
(
String
[]
data
:
memberOrderList
)
{
Row
row
=
sheet
.
createRow
(
startRowIndex
++);
createCellCount
(
row
,
0
,
data
,
cellStyle
);
}
}
private
void
createCellCount
(
Row
row
,
int
CellStartIndex
,
String
[]
data
,
CellStyle
cellStyle
){
for
(
int
i
=
CellStartIndex
,
y
=
0
;
y
<
data
.
length
;
i
++,
y
++){
Cell
cell
=
row
.
createCell
(
i
);
cell
.
setCellValue
(
Objects
.
toString
(
data
[
y
]));
cell
.
setCellStyle
(
cellStyle
);
cell
.
setCellValue
(
data
[
y
]);
}
}
...
...
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