记得上下班打卡 | git大法好,push需谨慎
Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
liquidnet-bus-v1
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
董敬伟
liquidnet-bus-v1
Commits
8174a421
Commit
8174a421
authored
Jun 27, 2021
by
张国柄
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/test' into test
parents
5d463718
050b56ef
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
182 additions
and
18 deletions
+182
-18
KylinTableStatusConst.java
...quidnet/service/kylin/constant/KylinTableStatusConst.java
+9
-0
PerformancesExpressController.java
...troller/zhengzai/kylin/PerformancesExpressController.java
+38
-0
performanceOrderList.html
...ngzai/kylin/performancesExpress/performanceOrderList.html
+7
-1
PerformancesExpressServiceImpl.java
...ai/kylin/service/impl/PerformancesExpressServiceImpl.java
+117
-12
MongoVoUtils.java
...idnet/client/admin/zhengzai/kylin/utils/MongoVoUtils.java
+4
-2
PerformanceExpressPerformanceOrderListAdminDao.java
...n/dao/PerformanceExpressPerformanceOrderListAdminDao.java
+1
-0
KylinOrderExpress.java
...com/liquidnet/service/kylin/entity/KylinOrderExpress.java
+3
-1
db_kylin_structure.sql
.../liquidnet-service-kylin-impl/docu/db_kylin_structure.sql
+3
-2
No files found.
liquidnet-bus-api/liquidnet-service-kylin-api/src/main/java/com/liquidnet/service/kylin/constant/KylinTableStatusConst.java
View file @
8174a421
...
...
@@ -9,6 +9,9 @@ package com.liquidnet.service.kylin.constant;
* @since 2021-05-25 6:38 下午
*/
public
class
KylinTableStatusConst
{
/**
* 退款
*/
// 批量退款 1处理完成 11 处理中
public
static
final
Integer
STATUS_APPLY
=
1
;
// 1申请退款
public
static
final
Integer
STATUS_APPLY11
=
11
;
...
...
@@ -72,4 +75,10 @@ public class KylinTableStatusConst {
// 出票状态
public
static
final
Integer
ENTITIES_STATUS0
=
0
;
// 未出票
public
static
final
Integer
ENTITIES_STATUS1
=
1
;
// 已出票
/**
* 快递
*/
public
static
final
Integer
ORDER_EXPRESS_STATUS1
=
1
;
// 申请
public
static
final
Integer
ORDER_EXPRESS_STATUS2
=
2
;
// 取消
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/java/com/liquidnet/client/admin/web/controller/zhengzai/kylin/PerformancesExpressController.java
View file @
8174a421
...
...
@@ -95,4 +95,42 @@ public class PerformancesExpressController extends BaseController {
}
}
/**
* 取消
*/
@RequiresPermissions
(
"kylin:performancesExpress:cancelOrder"
)
@PostMapping
(
"/cancelOrder"
)
@ResponseBody
public
AjaxResult
cancelOrder
(
PerformanceExpressSearchAdminParam
performanceExpressSearchAdminParam
)
{
ResponseDto
res
=
performancesExpressServiceImpl
.
cancelOrder
(
performanceExpressSearchAdminParam
);
try
{
if
(
res
.
isSuccess
())
{
return
success
();
}
else
{
return
error
(
res
.
getMessage
());
}
}
catch
(
Exception
e
)
{
return
error
(
e
.
getMessage
());
}
}
/**
* 结果主动查询
*/
@RequiresPermissions
(
"kylin:performancesExpress:getResult"
)
@PostMapping
(
"/getResult"
)
@ResponseBody
public
AjaxResult
getResult
(
PerformanceExpressSearchAdminParam
performanceExpressSearchAdminParam
)
{
ResponseDto
res
=
performancesExpressServiceImpl
.
getResult
(
performanceExpressSearchAdminParam
);
try
{
if
(
res
.
isSuccess
())
{
return
success
();
}
else
{
return
error
(
res
.
getMessage
());
}
}
catch
(
Exception
e
)
{
return
error
(
e
.
getMessage
());
}
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-web/src/main/resources/templates/zhengzai/kylin/performancesExpress/performanceOrderList.html
View file @
8174a421
...
...
@@ -69,6 +69,8 @@
<th:block
th:include=
"include :: footer"
/>
<script
th:inline=
"javascript"
>
var
placeOrderFlag
=
[[
$
{@
permission
.
hasPermi
(
'kylin:performancesExpress:placeOrder'
)}]];
var
cancelOrderFlag
=
[[
$
{@
permission
.
hasPermi
(
'kylin:performancesExpress:cancelOrder'
)}]];
var
getResultFlag
=
[[
$
{@
permission
.
hasPermi
(
'kylin:performancesExpress:getResult'
)}]];
var
prefix
=
ctx
+
"kylin/performancesExpress"
;
...
...
@@ -79,6 +81,8 @@
url
:
prefix
+
"/performanceOrderList"
,
modalName
:
"演出订单"
,
placeOrderUrl
:
prefix
+
"/placeOrder"
,
cancelOrderUrl
:
prefix
+
"/cancelOrder"
,
getResultUrl
:
prefix
+
"/getResult"
,
columns
:
[{
checkbox
:
true
},
...
...
@@ -135,7 +139,9 @@
align
:
'center'
,
formatter
:
function
(
value
,
row
,
index
)
{
var
actions
=
[];
actions
.
push
(
'<a class="btn btn-danger btn-xs '
+
placeOrderFlag
+
'" href="javascript:void(0)" onclick="$.operate.remove(
\'
'
+
row
.
orderTicketsId
+
'
\'
,
\'
确定下单吗?
\'
, table.options.placeOrderUrl)"></i>下单</a> '
);
actions
.
push
(
'<a class="btn btn-success btn-xs '
+
placeOrderFlag
+
'" href="javascript:void(0)" onclick="$.operate.remove(
\'
'
+
row
.
orderTicketsId
+
'
\'
,
\'
确定下单吗?
\'
, table.options.placeOrderUrl)"></i>下单</a> '
);
actions
.
push
(
'<a class="btn btn-danger btn-xs '
+
cancelOrderFlag
+
'" href="javascript:void(0)" onclick="$.operate.remove(
\'
'
+
row
.
orderTicketsId
+
'
\'
,
\'
确定取消快递单吗?
\'
, table.options.cancelOrderUrl)"></i>取消</a> '
);
actions
.
push
(
'<a class="btn btn-default btn-xs '
+
getResultFlag
+
'" href="javascript:void(0)" onclick="$.operate.remove(
\'
'
+
row
.
orderTicketsId
+
'
\'
,
\'
确定获取快递信息吗?
\'
, table.options.getResultUrl)"></i>主动获取下单信息</a> '
);
return
actions
.
join
(
''
);
}
}]
...
...
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/kylin/service/impl/PerformancesExpressServiceImpl.java
View file @
8174a421
package
com
.
liquidnet
.
client
.
admin
.
zhengzai
.
kylin
.
service
.
impl
;
import
com.baomidou.mybatisplus.core.conditions.query.QueryWrapper
;
import
com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper
;
import
com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
;
import
com.liquidnet.client.admin.common.utils.StringUtils
;
import
com.liquidnet.client.admin.zhengzai.kylin.utils.ShunfengSignUtils
;
import
com.liquidnet.commons.lang.util.BeanUtil
;
import
com.liquidnet.commons.lang.util.DateUtil
;
import
com.liquidnet.commons.lang.util.IDGenerator
;
import
com.liquidnet.commons.lang.util.JsonUtils
;
import
com.liquidnet.service.base.ResponseDto
;
import
com.liquidnet.service.kylin.constant.KylinTableStatusConst
;
import
com.liquidnet.service.kylin.dao.*
;
import
com.liquidnet.service.kylin.dto.param.*
;
import
com.liquidnet.service.kylin.entity.*
;
...
...
@@ -52,9 +55,9 @@ public class PerformancesExpressServiceImpl extends ServiceImpl<KylinOrderExpres
@Value
(
"${liquidnet.shunfeng.jAddress}"
)
private
String
jAddress
;
@Value
(
"${liquidnet.shunfeng.payMethod}"
)
private
String
payMethod
;
private
Integer
payMethod
;
@Value
(
"${liquidnet.shunfeng.expressType}"
)
private
String
expressType
;
private
Integer
expressType
;
@Value
(
"${liquidnet.shunfeng.depositumInfo}"
)
private
String
depositumInfo
;
...
...
@@ -115,7 +118,14 @@ public class PerformancesExpressServiceImpl extends ServiceImpl<KylinOrderExpres
hBody
.
put
(
"depositumInfo"
,
depositumInfo
);
hBody
.
put
(
"orderId"
,
orderInfo
.
getOrderCode
());
Integer
placeCount
=
kylinOrderExpressMapper
.
selectCount
(
new
QueryWrapper
<
KylinOrderExpress
>()
.
eq
(
"order_tickets_id"
,
orderTicketsId
)
);
String
codeNum
=
StringUtils
.
leftPad
(
String
.
valueOf
(
placeCount
),
3
,
"0"
);
String
OrderExpressCode
=
"NEW"
+
orderInfo
.
getOrderCode
().
concat
(
codeNum
);
hBody
.
put
(
"orderId"
,
OrderExpressCode
);
hBody
.
put
(
"depositumNo"
,
orderInfo
.
getNumber
());
hBody
.
put
(
"dContact"
,
orderInfo
.
getExpressContacts
());
hBody
.
put
(
"dMobile"
,
orderInfo
.
getExpressPhone
());
...
...
@@ -134,23 +144,118 @@ public class PerformancesExpressServiceImpl extends ServiceImpl<KylinOrderExpres
String
msg
=
(
String
)
hashMap
.
get
(
"msg"
);
return
ResponseDto
.
failure
(
msg
);
}
else
{
HashMap
hashMapResult
=
(
HashMap
)
hashMap
.
get
(
"result"
);
KylinOrderExpress
kylinOrderExpress
=
new
KylinOrderExpress
();
String
orderExpressId
=
IDGenerator
.
nextSnowId
();
kylinOrderExpress
.
setExpressStatus
(
KylinTableStatusConst
.
ORDER_EXPRESS_STATUS1
);
kylinOrderExpress
.
setOrderExpressId
(
orderExpressId
);
kylinOrderExpress
.
setOrderTicketsId
(
orderTicketsId
);
kylinOrderExpress
.
setMailno
((
String
)
hashMap
.
get
(
"mailno"
));
kylinOrderExpress
.
setExpressType
(
1
);
kylinOrderExpress
.
setFilterResult
((
Integer
)
hashMap
.
get
(
"filter_result"
));
kylinOrderExpress
.
setRemark
((
String
)
hashMap
.
get
(
"remark"
));
kylinOrderExpress
.
setOrigincode
((
String
)
hashMap
.
get
(
"origincode"
));
kylinOrderExpress
.
setDestcode
((
String
)
hashMap
.
get
(
"destcode"
));
kylinOrderExpress
.
setPrintIcon
((
String
)
hashMap
.
get
(
"printIcon"
));
kylinOrderExpress
.
setPrintFlag
((
String
)
hashMap
.
get
(
"printFlag"
));
kylinOrderExpress
.
setTwoDimensionCode
((
String
)
hashMap
.
get
(
"twoDimensionCode"
));
kylinOrderExpress
.
setOrderExpressCode
(
OrderExpressCode
);
kylinOrderExpress
.
setMailno
((
String
)
hashMapResult
.
get
(
"mailno"
));
kylinOrderExpress
.
setExpressType
(
expressType
);
kylinOrderExpress
.
setFilterResult
(
hashMapResult
.
get
(
"filter_result"
).
toString
());
kylinOrderExpress
.
setRemark
((
String
)
hashMapResult
.
get
(
"remark"
));
kylinOrderExpress
.
setOrigincode
((
String
)
hashMapResult
.
get
(
"origincode"
));
kylinOrderExpress
.
setDestcode
((
String
)
hashMapResult
.
get
(
"destcode"
));
kylinOrderExpress
.
setPrintIcon
((
String
)
hashMapResult
.
get
(
"printIcon"
));
kylinOrderExpress
.
setPrintFlag
((
String
)
hashMapResult
.
get
(
"printFlag"
));
kylinOrderExpress
.
setTwoDimensionCode
((
String
)
hashMapResult
.
get
(
"twoDimensionCode"
));
kylinOrderExpress
.
setCreatedAt
(
DateUtil
.
getNowTime
());
kylinOrderExpressMapper
.
insert
(
kylinOrderExpress
);
}
}
return
ResponseDto
.
success
();
}
public
ResponseDto
cancelOrder
(
PerformanceExpressSearchAdminParam
performanceExpressSearchAdminParam
)
{
List
<
String
>
ids
=
performanceExpressSearchAdminParam
.
getIds
();
for
(
String
orderTicketsId
:
ids
)
{
KylinOrderExpress
orderExpressInfo
=
kylinOrderExpressMapper
.
selectOne
(
new
QueryWrapper
<
KylinOrderExpress
>().
eq
(
"order_tickets_id"
,
orderTicketsId
)
.
ne
(
"express_status"
,
KylinTableStatusConst
.
ORDER_EXPRESS_STATUS2
)
);
if
(
null
!=
orderExpressInfo
)
{
HashMap
<
String
,
Object
>
hBody
=
new
HashMap
<>();
hBody
.
put
(
"orderId"
,
orderExpressInfo
.
getOrderExpressCode
());
// 时间戳
long
currentTimeMillis
=
System
.
currentTimeMillis
();
// 生成签名并请求
String
result
=
shunfengSignUtils
.
generateSignatureAndRequest
(
currentTimeMillis
+
""
,
hBody
,
"/public/order/v1/cancelOrder"
);
HashMap
hashMap
=
JsonUtils
.
fromJson
(
result
,
HashMap
.
class
);
System
.
out
.
println
(
result
);
if
(
hashMap
.
get
(
"succ"
).
equals
(
"fail"
))
{
String
msg
=
(
String
)
hashMap
.
get
(
"msg"
);
return
ResponseDto
.
failure
(
msg
);
}
else
{
KylinOrderExpress
kylinOrderExpress
=
new
KylinOrderExpress
();
kylinOrderExpress
.
setExpressStatus
(
KylinTableStatusConst
.
ORDER_EXPRESS_STATUS2
);
kylinOrderExpress
.
setUpdatedAt
(
DateUtil
.
getNowTime
());
kylinOrderExpressMapper
.
update
(
kylinOrderExpress
,
new
UpdateWrapper
<
KylinOrderExpress
>().
in
(
"order_express_id"
,
orderExpressInfo
.
getOrderExpressId
())
);
}
}
}
return
ResponseDto
.
success
();
}
public
ResponseDto
getResult
(
PerformanceExpressSearchAdminParam
performanceExpressSearchAdminParam
)
{
List
<
String
>
ids
=
performanceExpressSearchAdminParam
.
getIds
();
for
(
String
orderTicketsId
:
ids
)
{
KylinOrderExpress
orderExpressInfo
=
kylinOrderExpressMapper
.
selectOne
(
new
QueryWrapper
<
KylinOrderExpress
>().
eq
(
"order_tickets_id"
,
orderTicketsId
)
.
ne
(
"express_status"
,
KylinTableStatusConst
.
ORDER_EXPRESS_STATUS2
)
);
if
(
null
!=
orderExpressInfo
)
{
KylinOrderTickets
orderInfo
=
kylinOrderTicketsMapper
.
selectOne
(
new
QueryWrapper
<
KylinOrderTickets
>().
eq
(
"order_tickets_id"
,
orderTicketsId
)
);
Integer
placeCount
=
kylinOrderExpressMapper
.
selectCount
(
new
QueryWrapper
<
KylinOrderExpress
>()
.
eq
(
"order_tickets_id"
,
orderTicketsId
)
);
String
codeNum
=
StringUtils
.
leftPad
(
String
.
valueOf
(
placeCount
),
3
,
"0"
);
String
OrderExpressCode
=
"NEW"
+
orderInfo
.
getOrderCode
().
concat
(
codeNum
);
HashMap
<
String
,
Object
>
hBody
=
new
HashMap
<>();
hBody
.
put
(
"orderId"
,
OrderExpressCode
);
hBody
.
put
(
"searchType"
,
1
);
//查询类型:1,正向单查询,传入的orderid为正向定单号,2,退货单查询,传入的orderid为退货原始订单号
// 时间戳
long
currentTimeMillis
=
System
.
currentTimeMillis
();
// 生成签名并请求
String
result
=
shunfengSignUtils
.
generateSignatureAndRequest
(
currentTimeMillis
+
""
,
hBody
,
"/public/order/v1/getResult"
);
HashMap
hashMap
=
JsonUtils
.
fromJson
(
result
,
HashMap
.
class
);
System
.
out
.
println
(
result
);
if
(
hashMap
.
get
(
"succ"
).
equals
(
"fail"
))
{
String
msg
=
(
String
)
hashMap
.
get
(
"msg"
);
return
ResponseDto
.
failure
(
msg
);
}
else
{
HashMap
hashMapResult
=
(
HashMap
)
hashMap
.
get
(
"result"
);
KylinOrderExpress
kylinOrderExpress
=
new
KylinOrderExpress
();
String
orderExpressId
=
IDGenerator
.
nextSnowId
();
kylinOrderExpress
.
setExpressStatus
(
KylinTableStatusConst
.
ORDER_EXPRESS_STATUS1
);
kylinOrderExpress
.
setOrderExpressId
(
orderExpressId
);
kylinOrderExpress
.
setOrderTicketsId
(
orderTicketsId
);
kylinOrderExpress
.
setOrderExpressCode
(
OrderExpressCode
);
kylinOrderExpress
.
setMailno
((
String
)
hashMapResult
.
get
(
"mailno"
));
kylinOrderExpress
.
setExpressType
(
expressType
);
kylinOrderExpress
.
setFilterResult
(
hashMapResult
.
get
(
"filter_result"
).
toString
());
kylinOrderExpress
.
setRemark
((
String
)
hashMapResult
.
get
(
"remark"
));
kylinOrderExpress
.
setOrigincode
((
String
)
hashMapResult
.
get
(
"origincode"
));
kylinOrderExpress
.
setDestcode
((
String
)
hashMapResult
.
get
(
"destcode"
));
kylinOrderExpress
.
setPrintIcon
((
String
)
hashMapResult
.
get
(
"printIcon"
));
kylinOrderExpress
.
setPrintFlag
((
String
)
hashMapResult
.
get
(
"printFlag"
));
kylinOrderExpress
.
setTwoDimensionCode
((
String
)
hashMapResult
.
get
(
"twoDimensionCode"
));
kylinOrderExpress
.
setCreatedAt
(
DateUtil
.
getNowTime
());
kylinOrderExpressMapper
.
insert
(
kylinOrderExpress
);
}
}
}
return
ResponseDto
.
success
();
}
}
liquidnet-bus-client/liquidnet-client-admin/liquidnet-client-admin-zhengzai/src/main/java/com/liquidnet/client/admin/zhengzai/kylin/utils/MongoVoUtils.java
View file @
8174a421
...
...
@@ -167,12 +167,14 @@ public class MongoVoUtils {
KylinOrderListVo
voItem
=
new
KylinOrderListVo
();
KylinOrderTicketVo
data
;
if
(
dataSingle
==
null
)
{
data
=
(
KylinOrderTicketVo
)
redisUtil
.
get
(
KylinRedisConst
.
ORDER
+
orderId
);
data
=
(
KylinOrderTicketVo
)
dataUtils
.
getOrderTicketVo
(
orderId
);
// data = (KylinOrderTicketVo) redisUtil.get(KylinRedisConst.ORDER + orderId);
}
else
{
data
=
dataSingle
;
}
BeanUtils
.
copyProperties
(
data
,
voItem
);
List
<
KylinOrderListVo
>
redisData
=
(
List
<
KylinOrderListVo
>)
redisUtil
.
get
(
KylinRedisConst
.
ORDER_LIST
+
userId
);
List
<
KylinOrderListVo
>
redisData
=
(
List
<
KylinOrderListVo
>)
dataUtils
.
getOrderList
(
userId
);
// List<KylinOrderListVo> redisData = (List<KylinOrderListVo>) redisUtil.get(KylinRedisConst.ORDER_LIST + userId);
if
(
type
==
1
)
{
redisVo
.
add
(
voItem
);
if
(
redisData
.
size
()
>
0
)
{
...
...
liquidnet-bus-do/liquidnet-service-kylin-do/src/main/java/com/liquidnet/service/kylin/dao/PerformanceExpressPerformanceOrderListAdminDao.java
View file @
8174a421
...
...
@@ -19,6 +19,7 @@ public class PerformanceExpressPerformanceOrderListAdminDao {
String
expressContacts
;
String
expressAddress
;
String
expressPhone
;
String
expressStatus
;
Integer
expressType
;
...
...
liquidnet-bus-do/liquidnet-service-kylin-do/src/main/java/com/liquidnet/service/kylin/entity/KylinOrderExpress.java
View file @
8174a421
...
...
@@ -26,10 +26,12 @@ public class KylinOrderExpress implements Serializable {
private
String
orderExpressId
;
private
String
orderTicketsId
;
private
String
OrderExpressCode
;
private
String
mailno
;
private
Integer
expressType
;
private
Integer
filterResult
;
private
String
filterResult
;
private
String
remark
;
private
Integer
expressStatus
;
private
String
origincode
;
private
String
destcode
;
private
String
printIcon
;
...
...
liquidnet-bus-service/liquidnet-service-kylin/liquidnet-service-kylin-impl/docu/db_kylin_structure.sql
View file @
8174a421
...
...
@@ -748,11 +748,12 @@ CREATE TABLE `kylin_order_express`
`mid`
int
unsigned
NOT
NULL
AUTO_INCREMENT
,
`order_express_id`
varchar
(
255
)
NOT
NULL
DEFAULT
''
COMMENT
'order_express_id'
,
`order_tickets_id`
varchar
(
255
)
NOT
NULL
DEFAULT
''
COMMENT
'订单id'
,
`order_express_code`
varchar
(
255
)
NOT
NULL
DEFAULT
''
COMMENT
'订单快递编号'
,
`mailno`
varchar
(
255
)
NOT
NULL
DEFAULT
''
COMMENT
'顺丰运单号'
,
`express_type`
tinyint
NOT
NULL
DEFAULT
'0'
COMMENT
'快件产品类型 1顺丰特快...'
,
`filter_result`
tinyint
NOT
NULL
DEFAULT
'0'
COMMENT
'1-人工确认;2-可收派;3-不可以收派'
,
`filter_result`
varchar
(
2
)
NOT
NULL
DEFAULT
'0'
COMMENT
'1-人工确认;2-可收派;3-不可以收派'
,
`remark`
varchar
(
255
)
NOT
NULL
DEFAULT
''
COMMENT
'filter_result=3时返回不可以收派的原因代码'
,
`
status`
tinyint
NOT
NULL
DEFAULT
'0'
COMMENT
'快递状态'
,
`
express_status`
tinyint
NOT
NULL
DEFAULT
'0'
COMMENT
'快递状态'
,
`origincode`
varchar
(
255
)
NOT
NULL
DEFAULT
''
COMMENT
'原寄地区域代码 可用于顺丰电子面单标签打印'
,
`destcode`
varchar
(
255
)
NOT
NULL
DEFAULT
''
COMMENT
'目的地区域代码 可用于顺丰电子面单标签打印'
,
`print_icon`
varchar
(
255
)
NOT
NULL
DEFAULT
''
COMMENT
'打印图标'
,
...
...
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