Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
T
topsun-bpm
Project
Project
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
鲁鑫
topsun-bpm
Commits
5d5b5826
Commit
5d5b5826
authored
Jan 19, 2024
by
覃振观
👶
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
工作中心111
parent
324f972c
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
157 additions
and
82 deletions
+157
-82
sapWorkCenter.js
...rc/main/webapp/biz/topsun/sap/workCenter/sapWorkCenter.js
+7
-0
CloseableClientHttpRequest.java
.../com/huigou/topsun/config/CloseableClientHttpRequest.java
+1
-1
SapWorkCenterApplication.java
.../sap/workcenter/application/SapWorkCenterApplication.java
+2
-1
SapWorkCenterApplicationImpl.java
...center/application/impl/SapWorkCenterApplicationImpl.java
+29
-67
SapWorkCenterLogController.java
...sap/workcenter/controller/SapWorkCenterLogController.java
+22
-1
SapWorkCenter.java
...om/huigou/topsun/sap/workcenter/domain/SapWorkCenter.java
+16
-1
PersistTool.java
topsun/src/main/java/com/huigou/topsun/util/PersistTool.java
+12
-11
TestClientHttp.java
.../src/main/java/com/huigou/topsun/util/TestClientHttp.java
+68
-0
No files found.
topsun-xt/src/main/webapp/biz/topsun/sap/workCenter/sapWorkCenter.js
View file @
5d5b5826
...
...
@@ -62,4 +62,11 @@ function updateHandler(data) {
data
.
updkz
=
'U'
;
let
url
=
DataUtil
.
composeURLByParam
(
'/sapWorkCenter/goWorkCenterDetail.do'
,
data
);
UICtrl
.
addTabItem
({
tabid
:
'workCenterEdit'
+
new
Date
().
getTime
(),
text
:
"AAAA"
,
url
:
url
});
}
function
addHandler
(
data
)
{
// 更新标识: I 插入; U 修改; D 删除
data
.
updkz
=
'I'
;
let
url
=
DataUtil
.
composeURLByParam
(
'/sapWorkCenter/goWorkCenterDetail.do'
,
data
);
UICtrl
.
addTabItem
({
tabid
:
'workCenterAdd'
+
new
Date
().
getTime
(),
text
:
"AAAA"
,
url
:
url
});
}
\ No newline at end of file
topsun/src/main/java/com/huigou/topsun/co
mmon
/CloseableClientHttpRequest.java
→
topsun/src/main/java/com/huigou/topsun/co
nfig
/CloseableClientHttpRequest.java
View file @
5d5b5826
package
com
.
huigou
.
topsun
.
co
mmon
;
package
com
.
huigou
.
topsun
.
co
nfig
;
import
org.springframework.http.client.ClientHttpRequest
;
import
org.springframework.http.client.ClientHttpResponse
;
...
...
topsun/src/main/java/com/huigou/topsun/sap/workcenter/application/SapWorkCenterApplication.java
View file @
5d5b5826
package
com
.
huigou
.
topsun
.
sap
.
workcenter
.
application
;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.huigou.topsun.sap.workcenter.domain.SapWorkCenter
;
import
com.huigou.util.SDO
;
import
java.util.ArrayList
;
...
...
@@ -18,5 +19,5 @@ public interface SapWorkCenterApplication {
Map
<
String
,
Object
>
saveWorkCenterDetail
(
SDO
sdo
);
boolean
saveWorkCenter
();
boolean
saveWorkCenter
(
SapWorkCenter
workCenter
);
}
topsun/src/main/java/com/huigou/topsun/sap/workcenter/application/impl/SapWorkCenterApplicationImpl.java
View file @
5d5b5826
...
...
@@ -5,24 +5,19 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import
com.fasterxml.jackson.core.type.TypeReference
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.huigou.topsun.common.CloseableClientHttpRequest
;
import
com.huigou.topsun.sap.workcenter.repository.SapWorkCenterRepository
;
import
com.huigou.topsun.sap.workcenter.application.SapWorkCenterApplication
;
import
com.huigou.topsun.sap.workcenter.domain.SapWorkCenter
;
import
com.huigou.topsun.util.PersistTool
;
import
com.huigou.topsun.util.TestClientHttp
;
import
com.huigou.util.SDO
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.http.HttpMethod
;
import
org.springframework.http.client.ClientHttpResponse
;
import
org.springframework.http.client.SimpleClientHttpRequestFactory
;
import
org.springframework.stereotype.Service
;
import
org.springframework.transaction.annotation.Transactional
;
import
java.io.*
;
import
java.net.URI
;
import
java.nio.charset.StandardCharsets
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
javax.persistence.EntityManager
;
import
javax.persistence.PersistenceContext
;
import
java.util.*
;
/**
* @author YourUserName
...
...
@@ -33,6 +28,10 @@ public class SapWorkCenterApplicationImpl implements SapWorkCenterApplication {
private
final
ObjectMapper
objectMapper
;
@PersistenceContext
(
unitName
=
"system"
)
private
EntityManager
entityManager
;
private
final
PersistTool
persist
;
private
final
SapWorkCenterRepository
rep
;
/***
...
...
@@ -47,7 +46,7 @@ public class SapWorkCenterApplicationImpl implements SapWorkCenterApplication {
HashMap
<
String
,
Object
>
param
=
new
HashMap
<>(
12
);
List
<
SapWorkCenter
>
workCenters
;
try
{
execute
=
execute
(
param
,
"http://127.0.0.1:8080/topsun_xt_war/sapWorkCenter/queryWorkCenter.ajax"
);
execute
=
TestClientHttp
.
execute
(
param
,
"http://127.0.0.1:8080/topsun_xt_war/sapWorkCenter/queryWorkCenter.ajax"
);
String
resultStr
=
JSONObject
.
parseObject
(
execute
).
get
(
"data"
).
toString
();
workCenters
=
objectMapper
.
readValue
(
resultStr
,
new
TypeReference
<
List
<
SapWorkCenter
>>()
{});
}
catch
(
Exception
e
)
{
...
...
@@ -60,18 +59,6 @@ public class SapWorkCenterApplicationImpl implements SapWorkCenterApplication {
});
}
/**
* description 模拟 SAP 接口 (临时)
* @return java.lang.String
* @author qinzhenguan
* @createDate 2024/1/17 14:57
*/
@Override
public
String
queryWorkCenter
()
throws
JsonProcessingException
{
List
<
SapWorkCenter
>
list
=
rep
.
findAll
();
return
list
.
size
()
>
0
?
objectMapper
.
writeValueAsString
(
list
)
:
""
;
}
/***
* @description 发送请求到 SAP 系统,保存工作中心数据
* @param sdo 提交的数据集
...
...
@@ -85,7 +72,7 @@ public class SapWorkCenterApplicationImpl implements SapWorkCenterApplication {
HashMap
<
String
,
Object
>
param
=
new
HashMap
<>(
12
);
param
.
put
(
"data"
,
sdo
.
getProperties
());
try
{
execute
=
execute
(
param
,
"http://127.0.0.1:8080/topsun_xt_war/sapWorkCenter/saveWorkCenter.ajax"
);
execute
=
TestClientHttp
.
execute
(
param
,
"http://127.0.0.1:8080/topsun_xt_war/sapWorkCenter/saveWorkCenter.ajax"
);
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
...
...
@@ -93,56 +80,31 @@ public class SapWorkCenterApplicationImpl implements SapWorkCenterApplication {
}
@Override
public
boolean
saveWorkCenter
()
{
@Transactional
(
transactionManager
=
"transactionManager"
,
rollbackFor
=
{
Exception
.
class
})
public
boolean
saveWorkCenter
(
SapWorkCenter
workCenter
)
{
Set
<
Object
>
set
=
new
HashSet
<>();
set
.
add
(
workCenter
);
persist
.
persistEntitys
(
set
);
entityManager
.
flush
();
entityManager
.
clear
();
// String str = null;
// str.length();
System
.
out
.
println
(
"GG"
);
return
false
;
}
/***
* description 模拟发送请求到 SAP
* @param param 请求体 body
* @param url 请求地址
/**
* description 模拟 SAP 接口 (临时)
* @return java.lang.String
* @author qinzhenguan
* @createDate 2024/1/17 1
7:01
* @createDate 2024/1/17 1
4:57
*/
public
String
execute
(
Object
param
,
String
url
)
throws
IOException
{
String
str
=
""
;
try
{
SimpleClientHttpRequestFactory
requestFactory
=
new
SimpleClientHttpRequestFactory
();
requestFactory
.
setConnectTimeout
(
5000
);
requestFactory
.
setReadTimeout
(
5000
);
URI
uri
=
URI
.
create
(
url
);
HttpMethod
method
=
HttpMethod
.
POST
;
// ------------------------ header ------------------------
try
(
CloseableClientHttpRequest
request
=
new
CloseableClientHttpRequest
(
requestFactory
.
createRequest
(
uri
,
method
)))
{
request
.
addHeader
(
"Content-type"
,
"application/json;charset=utf-8"
);
// ------------------------ body ------------------------
//JSONObject body = new JSONObject();
if
(
param
!=
null
)
{
String
bodyText
=
new
ObjectMapper
().
writeValueAsString
(
param
);
try
(
OutputStream
requestBody
=
request
.
getBody
())
{
requestBody
.
write
(
bodyText
.
getBytes
());
}
}
@Override
public
String
queryWorkCenter
()
throws
JsonProcessingException
{
List
<
SapWorkCenter
>
list
=
rep
.
findAll
();
return
list
.
size
()
>
0
?
objectMapper
.
writeValueAsString
(
list
)
:
""
;
}
// ------------------------ response ------------------------
try
(
ClientHttpResponse
response
=
request
.
execute
();
InputStream
ist
=
response
.
getBody
();
InputStreamReader
istr
=
new
InputStreamReader
(
ist
,
StandardCharsets
.
UTF_8
);
BufferedReader
bfreader
=
new
BufferedReader
(
istr
))
{
str
=
bfreader
.
readLine
();
System
.
out
.
println
(
str
);
}
}
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
e
);
}
return
str
;
}
}
topsun/src/main/java/com/huigou/topsun/sap/workcenter/controller/SapWorkCenterLogController.java
View file @
5d5b5826
...
...
@@ -4,17 +4,27 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import
com.fasterxml.jackson.core.type.TypeReference
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.huigou.topsun.sap.workcenter.application.SapWorkCenterApplication
;
import
com.huigou.topsun.sap.workcenter.domain.SapWorkCenter
;
import
com.huigou.uasp.annotation.ControllerMapping
;
import
com.huigou.uasp.annotation.SkipAuth
;
import
com.huigou.uasp.client.CommonController
;
import
com.huigou.util.SDO
;
import
com.huigou.util.StringUtil
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.http.client.ClientHttpResponse
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.RequestBody
;
import
javax.servlet.http.HttpServletRequest
;
import
java.io.BufferedReader
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.InputStreamReader
;
import
java.nio.charset.StandardCharsets
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
/**
* SapWorkCenterLogController SAP工作中心控制类
...
...
@@ -72,7 +82,18 @@ public class SapWorkCenterLogController extends CommonController {
@SkipAuth
public
String
saveWorkCenter
()
{
boolean
isSuccess
=
centerServer
.
saveWorkCenter
();
HttpServletRequest
request
=
this
.
getRequest
();
SapWorkCenter
workCenter
;
try
(
InputStream
ist
=
request
.
getInputStream
();
InputStreamReader
istr
=
new
InputStreamReader
(
ist
,
StandardCharsets
.
UTF_8
);)
{
String
requestBody
=
new
BufferedReader
(
istr
).
lines
().
collect
(
Collectors
.
joining
(
"\n"
));
ObjectMapper
objectMapper
=
new
ObjectMapper
();
workCenter
=
objectMapper
.
readValue
(
requestBody
,
SapWorkCenter
.
class
);
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
e
);
}
boolean
isSuccess
=
centerServer
.
saveWorkCenter
(
workCenter
);
return
success
();
}
...
...
topsun/src/main/java/com/huigou/topsun/sap/workcenter/domain/SapWorkCenter.java
View file @
5d5b5826
...
...
@@ -9,6 +9,8 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import
com.fasterxml.jackson.databind.annotation.JsonSerialize
;
import
com.huigou.topsun.common.NumberToStringSerializer
;
import
com.fasterxml.jackson.annotation.JsonFormat
;
import
org.apache.commons.lang3.builder.EqualsBuilder
;
import
org.apache.commons.lang3.builder.HashCodeBuilder
;
/**
* @author YourUserName
...
...
@@ -386,7 +388,20 @@ public class SapWorkCenter implements Serializable {
*/
@Column
(
name
=
"UPDKZ"
,
nullable
=
true
,
length
=
255
)
private
String
updkz
;
@Override
public
boolean
equals
(
Object
o
)
{
if
(
this
==
o
)
{
return
true
;
}
if
(
o
==
null
||
getClass
()
!=
o
.
getClass
())
{
return
false
;
}
SapWorkCenter
center
=
(
SapWorkCenter
)
o
;
return
new
EqualsBuilder
().
append
(
id
,
center
.
id
).
append
(
werks
,
center
.
werks
).
append
(
apbpl
,
center
.
apbpl
).
append
(
verwe
,
center
.
verwe
).
append
(
stext
,
center
.
stext
).
append
(
planv
,
center
.
planv
).
append
(
veran
,
center
.
veran
).
append
(
rgekz
,
center
.
rgekz
).
append
(
vorgschl
,
center
.
vorgschl
).
append
(
steus
,
center
.
steus
).
append
(
ktext
,
center
.
ktext
).
append
(
kapart
,
center
.
kapart
).
append
(
planr
,
center
.
planr
).
append
(
kalid
,
center
.
kalid
).
append
(
meins
,
center
.
meins
).
append
(
begzt
,
center
.
begzt
).
append
(
endzt
,
center
.
endzt
).
append
(
ngrad
,
center
.
ngrad
).
append
(
aznor
,
center
.
aznor
).
append
(
kapeh
,
center
.
kapeh
).
append
(
kapter
,
center
.
kapter
).
append
(
ueberlast
,
center
.
ueberlast
).
append
(
fork2
,
center
.
fork2
).
append
(
kapartJh
,
center
.
kapartJh
).
append
(
fort2
,
center
.
fort2
).
append
(
begda
,
center
.
begda
).
append
(
endda
,
center
.
endda
).
append
(
kostl
,
center
.
kostl
).
append
(
lstar1
,
center
.
lstar1
).
append
(
leinh1
,
center
.
leinh1
).
append
(
forml1
,
center
.
forml1
).
append
(
lstar2
,
center
.
lstar2
).
append
(
leinh2
,
center
.
leinh2
).
append
(
forml2
,
center
.
forml2
).
append
(
lstar3
,
center
.
lstar3
).
append
(
leinh3
,
center
.
leinh3
).
append
(
forml3
,
center
.
forml3
).
append
(
lstar4
,
center
.
lstar4
).
append
(
leinh4
,
center
.
leinh4
).
append
(
forml4
,
center
.
forml4
).
append
(
lstar5
,
center
.
lstar5
).
append
(
leinh5
,
center
.
leinh5
).
append
(
forml5
,
center
.
forml5
).
append
(
lstar6
,
center
.
lstar6
).
append
(
leinh6
,
center
.
leinh6
).
append
(
forml6
,
center
.
forml6
).
append
(
par01
,
center
.
par01
).
append
(
parv1
,
center
.
parv1
).
append
(
par02
,
center
.
par02
).
append
(
parv2
,
center
.
parv2
).
append
(
par03
,
center
.
par03
).
append
(
parv3
,
center
.
parv3
).
append
(
par04
,
center
.
par04
).
append
(
parv4
,
center
.
parv4
).
append
(
par05
,
center
.
par05
).
append
(
parv5
,
center
.
parv5
).
append
(
par06
,
center
.
par06
).
append
(
parv6
,
center
.
parv6
).
append
(
lstarRef1
,
center
.
lstarRef1
).
append
(
zbz
,
center
.
zbz
).
append
(
updkz
,
center
.
updkz
).
isEquals
();
}
@Override
public
int
hashCode
()
{
return
new
HashCodeBuilder
(
17
,
37
).
append
(
id
).
append
(
werks
).
append
(
apbpl
).
append
(
verwe
).
append
(
stext
).
append
(
planv
).
append
(
veran
).
append
(
rgekz
).
append
(
vorgschl
).
append
(
steus
).
append
(
ktext
).
append
(
kapart
).
append
(
planr
).
append
(
kalid
).
append
(
meins
).
append
(
begzt
).
append
(
endzt
).
append
(
ngrad
).
append
(
aznor
).
append
(
kapeh
).
append
(
kapter
).
append
(
ueberlast
).
append
(
fork2
).
append
(
kapartJh
).
append
(
fort2
).
append
(
begda
).
append
(
endda
).
append
(
kostl
).
append
(
lstar1
).
append
(
leinh1
).
append
(
forml1
).
append
(
lstar2
).
append
(
leinh2
).
append
(
forml2
).
append
(
lstar3
).
append
(
leinh3
).
append
(
forml3
).
append
(
lstar4
).
append
(
leinh4
).
append
(
forml4
).
append
(
lstar5
).
append
(
leinh5
).
append
(
forml5
).
append
(
lstar6
).
append
(
leinh6
).
append
(
forml6
).
append
(
par01
).
append
(
parv1
).
append
(
par02
).
append
(
parv2
).
append
(
par03
).
append
(
parv3
).
append
(
par04
).
append
(
parv4
).
append
(
par05
).
append
(
parv5
).
append
(
par06
).
append
(
parv6
).
append
(
lstarRef1
).
append
(
zbz
).
append
(
updkz
).
toHashCode
();
}
public
String
getId
()
{
return
this
.
id
;
}
...
...
topsun/src/main/java/com/huigou/topsun/util/PersistTool.java
View file @
5d5b5826
...
...
@@ -8,10 +8,7 @@ import javax.persistence.Id;
import
javax.persistence.PersistenceContext
;
import
java.lang.reflect.Field
;
import
java.math.BigDecimal
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.Set
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
...
...
@@ -27,11 +24,11 @@ public class PersistTool {
private
EntityManager
entityManager
;
/**
* @description 持久化数据. 不执行.flush() 业务代码自行控制提交 <br>
* @param entitys 持久化数据集合 Set { Entity, HashMap }
* @description 持久化数据. 不执行.flush() 业务代码自行控制提交 <br>
* Entity 时,如果 ID 为空执行 Persist,否则执行 Merge <br>
* List 时,要求数据集格式 : <br>
* HashMap {”add“: List< Entity >,”up“: List< Entity >,”del“: List< Entity >}
* @param entitys 持久化数据集合 Set { Entity, HashMap }
* @author qinzhenguan
* @createDate 2023/12/26 16:44
*/
...
...
@@ -65,11 +62,11 @@ public class PersistTool {
}
else
{
persistEntity
(
list
.
get
(
i
));
}
// 这里
不执行批量提交, 会导致在此之后 无法回滚此提交的更改
//
if(i % 80 == 0 || i == (list.size() - 1)) {
//
entityManager.flush();
//
entityManager.clear();
//
}
// 这里
批量提交, 可能会导致在此之后 无法回滚此提交的更改 (未测试)
if
(
i
%
80
==
0
||
i
==
(
list
.
size
()
-
1
))
{
entityManager
.
flush
();
entityManager
.
clear
();
}
}
}
...
...
@@ -89,7 +86,11 @@ public class PersistTool {
String
id
=
(
String
)
field
.
get
(
entity
);
if
(
StringUtil
.
isBlank
(
id
)){
if
(
field
.
getType
().
equals
(
BigDecimal
.
class
))
{
// js 大数字丢失精度, 故 在代码中使用 String。
field
.
set
(
entity
,
String
.
valueOf
(
Snowflake
.
nextId
()));
}
else
if
(
field
.
getType
().
equals
(
String
.
class
))
{
String
uuid
=
UUID
.
randomUUID
().
toString
().
replace
(
"-"
,
""
);
field
.
set
(
entity
,
uuid
);
}
entityManager
.
persist
(
entity
);
}
else
{
...
...
topsun/src/main/java/com/huigou/topsun/util/TestClientHttp.java
0 → 100644
View file @
5d5b5826
package
com
.
huigou
.
topsun
.
util
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
com.huigou.topsun.config.CloseableClientHttpRequest
;
import
org.springframework.http.HttpMethod
;
import
org.springframework.http.client.ClientHttpResponse
;
import
org.springframework.http.client.SimpleClientHttpRequestFactory
;
import
java.io.*
;
import
java.net.URI
;
import
java.nio.charset.StandardCharsets
;
/**
* TestClientHttp 用于测试的 ClientHttp
*
* @author qinzhenguan
* @createDate 2024/01/19 15:43
**/
public
class
TestClientHttp
{
/***
* description 模拟发送请求到 SAP
* @param param 请求体 body
* @param url 请求地址
* @return java.lang.String
* @author qinzhenguan
* @createDate 2024/1/17 17:01
*/
public
static
String
execute
(
Object
param
,
String
url
)
throws
IOException
{
String
str
=
""
;
try
{
SimpleClientHttpRequestFactory
requestFactory
=
new
SimpleClientHttpRequestFactory
();
requestFactory
.
setConnectTimeout
(
5000
);
requestFactory
.
setReadTimeout
(
5000
);
URI
uri
=
URI
.
create
(
url
);
HttpMethod
method
=
HttpMethod
.
POST
;
// ------------------------ header ------------------------
try
(
CloseableClientHttpRequest
request
=
new
CloseableClientHttpRequest
(
requestFactory
.
createRequest
(
uri
,
method
)))
{
request
.
addHeader
(
"Content-type"
,
"application/json;charset=utf-8"
);
// ------------------------ body ------------------------
//JSONObject body = new JSONObject();
if
(
param
!=
null
)
{
String
bodyText
=
new
ObjectMapper
().
writeValueAsString
(
param
);
try
(
OutputStream
requestBody
=
request
.
getBody
())
{
requestBody
.
write
(
bodyText
.
getBytes
());
}
}
// ------------------------ response ------------------------
try
(
ClientHttpResponse
response
=
request
.
execute
();
InputStream
ist
=
response
.
getBody
();
InputStreamReader
istr
=
new
InputStreamReader
(
ist
,
StandardCharsets
.
UTF_8
);
BufferedReader
bfreader
=
new
BufferedReader
(
istr
))
{
str
=
bfreader
.
readLine
();
System
.
out
.
println
(
str
);
}
}
}
catch
(
IOException
e
)
{
throw
new
RuntimeException
(
e
);
}
return
str
;
}
}
\ No newline at end of file
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