Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
O
order-group
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
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
order-group-application
order-group
Commits
7c2f87a5
Commit
7c2f87a5
authored
Aug 20, 2020
by
zhiheng.zhang
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/qa' into qa
parents
c010847f
0511fc0c
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
65 additions
and
24 deletions
+65
-24
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/adapter/OrderSdkAdapter.java
+1
-0
order-application-service/pom.xml
+3
-3
order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
+15
-9
order-application-service/src/main/java/cn/freemud/constant/RedisKeyConstant.java
+5
-0
order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
+34
-8
shopping-cart-application-service/src/main/java/cn/freemud/service/impl/MaterialPromotionService.java
+7
-4
No files found.
assortment-ordercenter-sdk/src/main/java/com/freemud/sdk/api/assortment/order/adapter/OrderSdkAdapter.java
View file @
7c2f87a5
...
...
@@ -2582,6 +2582,7 @@ public class OrderSdkAdapter {
index
++;
material
.
setOpid
(
index
);
material
.
setSpecification
(
material
.
getProductId
());
material
.
setSpecificationName
(
material
.
getProductName
());
updateOrderItemAndSettlement
(
orderItemList
,
orderSettlementCreateReqList
,
material
,
partnerId
,
partnerProductId
,
true
);
}
}
...
...
order-application-service/pom.xml
View file @
7c2f87a5
...
...
@@ -119,7 +119,7 @@
<dependency>
<artifactId>
assortment-data-manager
</artifactId>
<groupId>
com.freemud.sdk.api.assortment
</groupId>
<version>
4.6.8.RELEASE
</version>
<version>
5.1.1-SNAPSHOT
</version>
</dependency>
<dependency>
<groupId>
cn.freemud.commons
</groupId>
...
...
@@ -315,12 +315,12 @@
<dependency>
<groupId>
com.freemud.application.service.sdk
</groupId>
<artifactId>
paymentcenter-sdk
</artifactId>
<version>
2.
7.1
.RELEASE
</version>
<version>
2.
8
.RELEASE
</version>
</dependency>
<dependency>
<groupId>
com.freemud.sdk.api.assortment
</groupId>
<artifactId>
assortment-payment-sdk
</artifactId>
<version>
2.
5.5-
RELEASE
</version>
<version>
2.
6.
RELEASE
</version>
</dependency>
<dependency>
<groupId>
org.apache.rocketmq
</groupId>
...
...
order-application-service/src/main/java/cn/freemud/adapter/OrderAdapter.java
View file @
7c2f87a5
...
...
@@ -17,9 +17,9 @@ import cn.freemud.base.util.DateUtil;
import
cn.freemud.constant.CustomerScoreConstant
;
import
cn.freemud.entities.dto.*
;
import
cn.freemud.entities.dto.activity.ShareDiscountActivityDto
;
import
cn.freemud.entities.dto.order.*
;
import
cn.freemud.entities.dto.order.CreateOrderAccountDto
;
import
cn.freemud.entities.dto.order.CreateOrderProductDto
;
import
cn.freemud.entities.dto.order.*
;
import
cn.freemud.entities.dto.promotion.OrderBeanRequest
;
import
cn.freemud.entities.dto.promotion.ShoppingCartGoodsResponse
;
import
cn.freemud.entities.dto.shoppingCart.ActivityDiscountsDto
;
...
...
@@ -28,23 +28,24 @@ import cn.freemud.entities.vo.*;
import
cn.freemud.entities.vo.encircle.CreateReserveOrderVo
;
import
cn.freemud.entities.vo.encircle.PreviewOrderInfoVo
;
import
cn.freemud.enums.ActivityTypeEnum
;
import
cn.freemud.enums.*
;
import
cn.freemud.enums.OrderChannelType
;
import
cn.freemud.enums.OrderSourceType
;
import
cn.freemud.enums.OrderType
;
import
cn.freemud.enums.PayStatus
;
import
cn.freemud.enums.QueryOrderStatus
;
import
cn.freemud.enums.ResponseResult
;
import
cn.freemud.enums.*
;
import
cn.freemud.interceptor.ServiceException
;
import
cn.freemud.redis.RedisCache
;
import
cn.freemud.request.wechat.dto.SignMessageBuilder
;
import
cn.freemud.service.impl.OrderCommonService
;
import
cn.freemud.utils.LogUtil
;
import
cn.freemud.utils.QrCodeUtil
;
import
cn.freemud.utils.RSAUtils
;
import
cn.freemud.utils.WebUtil
;
import
cn.freemud.utils.*
;
import
com.alibaba.fastjson.JSONObject
;
import
com.freemud.api.assortment.datamanager.entity.db.AssortmentOpenPlatformPartnerWxappConfig
;
import
com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo
;
import
com.freemud.api.assortment.datamanager.enums.IappIdType
;
import
com.freemud.application.sdk.api.log.LogThreadLocal
;
import
com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager
;
import
com.freemud.application.sdk.api.log.LogThreadLocal
;
import
com.freemud.application.sdk.api.ordercenter.enums.AfterSalesType
;
...
...
@@ -53,6 +54,7 @@ import com.freemud.application.sdk.api.ordercenter.enums.OrderSettlementType;
import
com.freemud.application.sdk.api.ordercenter.enums.ProductTypeEnum
;
import
com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto
;
import
com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq
;
import
com.freemud.application.sdk.api.ordercenter.request.create.OrderTaskReq
;
import
com.freemud.application.sdk.api.promotioncenter.dto.promotion.GoodsStockDTO
;
import
com.freemud.application.sdk.api.promotioncenter.request.promotion.ActivityUpdateStockRequest
;
import
com.freemud.application.sdk.api.storecenter.response.StoreResponse
;
...
...
@@ -2385,10 +2387,14 @@ public class OrderAdapter {
return
createOrder
;
}
/**
* 支付信息转换
*/
public
UnifiedOrderRequest
convent2UnifiedOrderRequest
(
QueryOrdersResponse
.
DataBean
.
OrderBean
orderBean
,
PaymentRequest
paymentRequest
,
Long
amount
,
Integer
cardAmount
,
String
transId
)
{
return
convent2UnifiedOrderRequest
(
orderBean
,
paymentRequest
,
amount
,
cardAmount
,
transId
,
null
);
}
/**
* 支付信息转换
*/
public
UnifiedOrderRequest
convent2UnifiedOrderRequest
(
QueryOrdersResponse
.
DataBean
.
OrderBean
orderBean
,
PaymentRequest
paymentRequest
,
Long
amount
,
Integer
cardAmount
,
String
transId
,
String
partnerPayOvertime
)
{
UnifiedOrderRequest
orderPayDto
=
new
UnifiedOrderRequest
();
orderPayDto
.
setPartnerId
(
orderBean
.
getCompanyId
());
orderPayDto
.
setBody
(
paymentRequest
.
getPrincipalName
());
...
...
@@ -2402,6 +2408,7 @@ public class OrderAdapter {
orderPayDto
.
setUndisAmount
(
1L
);
orderPayDto
.
setVipAmount
(
Long
.
valueOf
(
cardAmount
));
orderPayDto
.
setAppId
(
paymentRequest
.
getWxAppId
());
orderPayDto
.
setPayTimeOutTime
(
StringUtils
.
defaultIfBlank
(
partnerPayOvertime
,
"30"
));
List
<
UnifiedOrderRequest
.
ProductBean
>
productBeans
=
new
ArrayList
<
UnifiedOrderRequest
.
ProductBean
>();
if
(
CollectionUtils
.
isNotEmpty
(
orderBean
.
getProductList
()))
{
orderBean
.
getProductList
().
forEach
(
orderProductBean
->
{
...
...
@@ -3043,7 +3050,6 @@ public class OrderAdapter {
return
gson
.
toJson
(
map
);
}
public
Integer
getNewOrderClient
(
String
name
)
{
String
_name
=
OrderSourceType
.
SAAS
.
getCode
();
Integer
orderClientType
;
...
...
order-application-service/src/main/java/cn/freemud/constant/RedisKeyConstant.java
View file @
7c2f87a5
...
...
@@ -56,4 +56,9 @@ public class RedisKeyConstant {
* 点餐门店绑定的商城门店redis的key前缀
*/
public
final
static
String
OPENSTORE_MICROMALL_BIND_STOREID_PREFIX
=
"openstore:micromall:bind:storeId:"
;
/**
* 商户订单支付超时时间设置key
*/
public
final
static
String
PARTNER_PAY_OVERTIME
=
"partner_pay_overtime"
;
}
order-application-service/src/main/java/cn/freemud/service/impl/OrderServiceImpl.java
View file @
7c2f87a5
...
...
@@ -24,8 +24,8 @@ import cn.freemud.base.util.DateUtil;
import
cn.freemud.constant.OrderRefundConstant
;
import
cn.freemud.constant.RedisKeyConstant
;
import
cn.freemud.constant.ResponseCodeConstant
;
import
cn.freemud.entities.dto.PayAccessResponse
;
import
cn.freemud.entities.dto.*
;
import
cn.freemud.entities.dto.PayAccessResponse
;
import
cn.freemud.entities.dto.QueryOrdersResponseDto.DataBean.OrderBean
;
import
cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseDto
;
import
cn.freemud.entities.dto.activity.PayGitCheckAndJoinRequestDto
;
...
...
@@ -58,8 +58,12 @@ import com.alibaba.fastjson.JSONArray;
import
com.alibaba.fastjson.JSONObject
;
import
com.freemud.api.assortment.datamanager.entity.db.*
;
import
com.freemud.api.assortment.datamanager.entity.vo.AssortmentCustomerInfoVo
;
import
com.freemud.api.assortment.datamanager.enums.IappIdType
;
import
com.freemud.api.assortment.datamanager.manager.*
;
import
com.freemud.api.assortment.datamanager.enums.IappIdType
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentCloudPrinterManager
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformPartnerConfigManager
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformWxappAuthorizerManager
;
import
com.freemud.api.assortment.datamanager.manager.AssortmentOpenPlatformWxappManager
;
import
com.freemud.api.assortment.datamanager.manager.cache.CacheOpenPlatformPartnerWxappConfigManager
;
import
com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustomerInfoManager
;
import
com.freemud.api.assortment.datamanager.meal.MealCacheManager
;
...
...
@@ -78,8 +82,8 @@ import com.freemud.application.sdk.api.ordercenter.request.OrderConditionsReq;
import
com.freemud.application.sdk.api.ordercenter.request.OrderExtInfoDto
;
import
com.freemud.application.sdk.api.ordercenter.request.OrderExtendedReq
;
import
com.freemud.application.sdk.api.ordercenter.request.carpark.ParkingOrderCreateReq
;
import
com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse
;
import
com.freemud.application.sdk.api.ordercenter.response.carpark.OrderResp
;
import
com.freemud.application.sdk.api.ordercenter.response.BaseDownLoadResponse
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderInfoReqs
;
import
com.freemud.application.sdk.api.ordercenter.response.orderInfo.OrderSettlementResp
;
import
com.freemud.application.sdk.api.ordercenter.service.OrderDownLoadSdkService
;
...
...
@@ -109,6 +113,7 @@ import com.freemud.sdk.api.assortment.order.request.order.*;
import
com.freemud.sdk.api.assortment.order.response.order.*
;
import
com.freemud.sdk.api.assortment.order.response.payment.OrderPayResponse
;
import
com.freemud.sdk.api.assortment.order.service.OrderCenterSdkService
;
import
com.freemud.sdk.api.assortment.order.util.LockUtils
;
import
com.freemud.sdk.api.assortment.order.vo.ProductGroupVo
;
import
com.freemud.sdk.api.assortment.orderdistributor.entity.dto.PaymentMqMessageDto
;
import
com.freemud.sdk.api.assortment.orderdistributor.service.PaymentQueueService
;
...
...
@@ -121,6 +126,7 @@ import com.google.common.collect.Maps;
import
com.google.gson.Gson
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.MapUtils
;
import
org.apache.commons.lang.ObjectUtils
;
import
org.apache.commons.lang.StringUtils
;
import
org.apache.commons.lang.builder.ToStringBuilder
;
...
...
@@ -129,9 +135,12 @@ import org.springframework.beans.BeanUtils;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Qualifier
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.boot.autoconfigure.AutoConfigureOrder
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.stereotype.Service
;
import
tk.mybatis.mapper.util.StringUtil
;
import
java.lang.reflect.InvocationTargetException
;
import
java.math.BigDecimal
;
import
java.text.SimpleDateFormat
;
import
java.util.*
;
...
...
@@ -160,7 +169,6 @@ public class OrderServiceImpl implements Orderservice {
@Value
(
"${mq.cloud_print_exchange}"
)
private
String
cloud_print_exchange
;
@Autowired
private
AssortmentCloudPrinterManager
cloudPrinterManager
;
// @Autowired
...
...
@@ -512,6 +520,7 @@ public class OrderServiceImpl implements Orderservice {
/**
* 开通会员卡
*
* @param partnerId 商户号
* @param ruleId 会员规则ID
* @param oid 订单号
...
...
@@ -2125,7 +2134,8 @@ public class OrderServiceImpl implements Orderservice {
if
(
totalAmount
<
0
)
{
throw
new
ServiceException
(
ResponseResult
.
PAY_AMOUNT_ERROR
);
}
else
if
(
totalAmount
>
0
&&
StringUtils
.
isBlank
(
cardCode
))
{
orderPayResponse
=
getPreOrderPay
(
createPrepayRequestDto
.
getFatherOrderBean
(),
paymentRequest
,
LogThreadLocal
.
getTrackingNo
(),
createPrepayRequestDto
.
getCardAmount
(),
transId
);
String
partnerPayOvertime
=
this
.
getPartnerPayOvertime
(
createPrepayRequestDto
.
getPartnerId
());
orderPayResponse
=
getPreOrderPay
(
createPrepayRequestDto
.
getFatherOrderBean
(),
paymentRequest
,
LogThreadLocal
.
getTrackingNo
(),
createPrepayRequestDto
.
getCardAmount
(),
transId
,
partnerPayOvertime
);
}
else
if
(
totalAmount
>
0
&&
StringUtils
.
isNotBlank
(
cardCode
))
{
//svc卡支付
orderPayResponse
=
svcPay
(
cardCode
,
createPrepayRequestDto
.
getFatherOrderBean
(),
paymentRequest
,
transId
,
LogThreadLocal
.
getTrackingNo
());
...
...
@@ -2228,9 +2238,9 @@ public class OrderServiceImpl implements Orderservice {
return
ResponseUtil
.
error
(
ResponseResultEnum
.
PAY_UNIFIED_ORDER_ERROR
.
getCode
(),
ResponseResultEnum
.
PAY_UNIFIED_ORDER_ERROR
.
getMessage
(),
null
);
}
public
OrderPayResponse
getPreOrderPay
(
QueryOrdersResponse
.
DataBean
.
OrderBean
orderBean
,
PaymentRequest
paymentRequest
,
String
trackingNo
,
Integer
cardAmount
,
String
transId
)
{
public
OrderPayResponse
getPreOrderPay
(
QueryOrdersResponse
.
DataBean
.
OrderBean
orderBean
,
PaymentRequest
paymentRequest
,
String
trackingNo
,
Integer
cardAmount
,
String
transId
,
String
partnerPayOvertime
)
{
try
{
UnifiedOrderRequest
request
=
orderAdapter
.
convent2UnifiedOrderRequest
(
orderBean
,
paymentRequest
,
orderBean
.
getAmount
(),
cardAmount
,
transId
);
UnifiedOrderRequest
request
=
orderAdapter
.
convent2UnifiedOrderRequest
(
orderBean
,
paymentRequest
,
orderBean
.
getAmount
(),
cardAmount
,
transId
,
partnerPayOvertime
);
com
.
freemud
.
application
.
sdk
.
api
.
base
.
BaseResponse
<
UnifiedOrderResponse
>
responseBase
=
standardPaymentService
.
unifiedOrder
(
request
,
trackingNo
);
if
(!
ResponseCodeConstant
.
RESPONSE_SUCCESS_STR
.
equals
(
responseBase
.
getCode
()))
{
log
.
error
(
"支付SDK返回信息错误,trackingNo:{} request:{} response:{}"
,
trackingNo
,
JSONObject
.
toJSONString
(
request
),
JSONObject
.
toJSONString
(
responseBase
));
...
...
@@ -2672,7 +2682,8 @@ public class OrderServiceImpl implements Orderservice {
}
//唤起微信支付
if
(
totalAmount
>
0
&&
StringUtils
.
isBlank
(
createOrderVo
.
getCardCode
())
&&
StringUtils
.
isBlank
(
createOrderVo
.
getFaceCode
()))
{
orderPayResponse
=
getPreOrderPay
(
fatherBeanListOne
,
paymentRequest
,
LogThreadLocal
.
getTrackingNo
(),
cardAmount
,
fatherBeanListOne
.
getOid
());
String
partnerPayOvertime
=
this
.
getPartnerPayOvertime
(
createOrderVo
.
getPartnerId
());
orderPayResponse
=
getPreOrderPay
(
fatherBeanListOne
,
paymentRequest
,
LogThreadLocal
.
getTrackingNo
(),
cardAmount
,
fatherBeanListOne
.
getOid
(),
partnerPayOvertime
);
return
orderPayResponse
;
}
//储值卡支付
...
...
@@ -2893,4 +2904,19 @@ public class OrderServiceImpl implements Orderservice {
return
ResponseUtil
.
success
(
responses
.
getResult
());
}
/**
* 获取商户支付超时时间
* @param partnerId 商户Id
* @return 超时时间
*/
private
String
getPartnerPayOvertime
(
String
partnerId
)
{
return
Optional
.
ofNullable
(
openPlatformPartnerConfigManager
.
selectPartnerConfigByPartnerKey
(
partnerId
,
RedisKeyConstant
.
PARTNER_PAY_OVERTIME
))
.
orElseGet
(()
->
{
AssortmentOpenPlatformPartnerConfig
config
=
new
AssortmentOpenPlatformPartnerConfig
();
config
.
setPartnerValue
(
"30"
);
openPlatformPartnerConfigManager
.
addPartnerConfig
(
partnerId
,
RedisKeyConstant
.
PARTNER_PAY_OVERTIME
,
config
);
return
config
;
}).
getPartnerValue
();
}
}
shopping-cart-application-service/src/main/java/cn/freemud/service/impl/MaterialPromotionService.java
View file @
7c2f87a5
...
...
@@ -10,6 +10,7 @@ import cn.freemud.entities.vo.*;
import
cn.freemud.enums.GoodsTypeEnum
;
import
cn.freemud.service.IPromotionService
;
import
lombok.Data
;
import
lombok.extern.log4j.Log4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
...
...
@@ -29,6 +30,7 @@ import java.util.List;
* 注意:本内容仅限于上海非码科技内部传阅,禁止外泄以及用于其他的商业目
*/
@Service
(
"MaterialPromotionService"
)
@Log4j
public
class
MaterialPromotionService
implements
IPromotionService
{
@Autowired
private
ShoppingCartConvertAdapter
shoppingCartConvertAdapter
;
...
...
@@ -77,9 +79,9 @@ public class MaterialPromotionService implements IPromotionService {
@Override
public
void
updateShoppingCartGoodsApportion
(
ShoppingCartGoodsResponseVo
shoppingCartGoodsResponseVo
,
ActivityCalculationDiscountResponseDto
.
CalculationDiscountResult
calculationDiscountResult
,
ShoppingCartGoodsDto
shoppingCartGoodsDto
,
CreateOrderVo
.
PremiumExchangeActivity
premiumExchangeActivity
,
ShoppingCartInfoRequestVo
shoppingCartInfoRequestVo
)
{
HashMap
<
String
,
MaterialApportion
>
map
=
getApportionGoodsDetail
(
calculationDiscountResult
);
System
.
out
.
println
(
"updateShoppingCartGoodsApportion->map:"
+
map
);
log
.
info
(
"updateShoppingCartGoodsApportion->map:"
+
map
);
List
<
ShoppingCartGoodsDto
.
CartGoodsDetailDto
>
products
=
shoppingCartGoodsDto
.
getProducts
();
System
.
out
.
println
(
"updateShoppingCartGoodsApportion->product:"
+
products
);
log
.
info
(
"updateShoppingCartGoodsApportion->product:"
+
products
);
if
(
map
.
size
()
>
0
)
{
String
pk
=
""
;
for
(
ShoppingCartGoodsDto
.
CartGoodsDetailDto
product
:
products
)
{
...
...
@@ -87,7 +89,8 @@ public class MaterialPromotionService implements IPromotionService {
for
(
ShoppingCartGoodsDto
.
CartGoodsDetailDto
.
MaterialGoods
materialGoods
:
product
.
getMaterialList
())
{
pk
=
shoppingCartConvertAdapter
.
jointPk
(
product
.
getCartGoodsUid
(),
materialGoods
.
getSpuId
());
MaterialApportion
material
=
map
.
get
(
pk
);
if
(
material
!=
null
&&
material
.
getApportionAmount
().
intValue
()
==
0
)
continue
;
if
((
material
==
null
)
||
(
material
!=
null
&&
material
.
getApportionAmount
().
intValue
()
==
0
))
continue
;
List
<
ActivityDiscountsDto
>
activityDiscountsDtos
=
materialGoods
.
getActivityDiscountsDtos
();
if
(
CollectionUtils
.
isEmpty
(
activityDiscountsDtos
))
{
activityDiscountsDtos
=
new
ArrayList
<>();
...
...
@@ -116,7 +119,7 @@ public class MaterialPromotionService implements IPromotionService {
for
(
ShoppingCartGoodsDto
.
CartGoodsDetailDto
.
MaterialGoods
materialGoods
:
product
.
getMaterialList
())
{
product
.
setSalePrice
(
product
.
getSalePrice
()
+
materialGoods
.
getSalePrice
());
//现金
product
.
setOriginalPrice
(
product
.
getOriginalPrice
()
+
materialGoods
.
getOriginalPrice
());
product
.
setTotalDiscountAmount
(
product
.
getTotalDiscountAmount
()
+
materialGoods
.
getTotalDiscountAmount
()
*
product
.
getQty
()
);
product
.
setTotalDiscountAmount
(
product
.
getTotalDiscountAmount
()
+
materialGoods
.
getTotalDiscountAmount
());
product
.
setProductType
(
GoodsTypeEnum
.
MATERIAL
.
getGoodsType
());
}
}
...
...
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