Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
D
datacollector
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
chenweisong
datacollector
Commits
d1b5fd52
Commit
d1b5fd52
authored
Apr 05, 2020
by
chenweisong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
更新
parent
4516ffc9
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
73 additions
and
150 deletions
+73
-150
ApiResponse.java
...main/java/com/keymobile/rest/common/bean/ApiResponse.java
+0
-36
ExceptionHandlerConfig.java
...om/keymobile/rest/common/conf/ExceptionHandlerConfig.java
+0
-37
ApiConstant.java
.../java/com/keymobile/rest/common/constant/ApiConstant.java
+0
-18
CommonException.java
.../com/keymobile/rest/common/exception/CommonException.java
+2
-2
TaskController.java
...in/java/com/keymobile/rest/controller/TaskController.java
+39
-40
TemplateController.java
...ava/com/keymobile/rest/controller/TemplateController.java
+17
-15
UserController.java
...in/java/com/keymobile/rest/controller/UserController.java
+14
-1
CommonConstant.java
...om/keymobile/rest/controller/constant/CommonConstant.java
+1
-1
No files found.
src/main/java/com/keymobile/rest/common/bean/ApiResponse.java
deleted
100644 → 0
View file @
4516ffc9
package
com
.
keymobile
.
rest
.
common
.
bean
;
import
com.keymobile.rest.common.constant.ApiConstant
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
java.io.Serializable
;
@Data
@Builder
@AllArgsConstructor
public
class
ApiResponse
<
T
>
implements
Serializable
{
private
int
code
;
private
String
msg
;
private
T
data
;
public
static
ApiResponse
ok
()
{
return
ApiResponse
.
builder
().
code
(
ApiConstant
.
SUCCEED_CODE
).
msg
(
ApiConstant
.
SUCCEED
).
build
();
}
public
static
<
T
>
ApiResponse
ok
(
T
data
)
{
return
ApiResponse
.
builder
().
code
(
ApiConstant
.
SUCCEED_CODE
).
msg
(
ApiConstant
.
SUCCEED
).
data
(
data
).
build
();
}
public
static
ApiResponse
fail
()
{
return
ApiResponse
.
builder
().
code
(
ApiConstant
.
FAILED_CODE
).
msg
(
ApiConstant
.
FAILED
).
build
();
}
public
static
ApiResponse
fail
(
int
code
,
String
msg
)
{
return
ApiResponse
.
builder
().
code
(
code
).
msg
(
msg
).
build
();
}
}
src/main/java/com/keymobile/rest/common/conf/ExceptionHandlerConfig.java
deleted
100644 → 0
View file @
4516ffc9
package
com
.
keymobile
.
rest
.
common
.
conf
;
import
com.keymobile.rest.common.bean.ApiResponse
;
import
com.keymobile.rest.common.constant.ApiConstant
;
import
com.keymobile.rest.common.exception.CommonException
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.web.bind.annotation.ExceptionHandler
;
import
org.springframework.web.bind.annotation.RestControllerAdvice
;
/**
* description: 全局异常处理
*
* @author :ws6049
* @date :2019/1/13 0:26
*/
//@RestControllerAdvice
public
class
ExceptionHandlerConfig
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
ExceptionHandlerConfig
.
class
);
/**
* description: 捕获全局异常
* created by King on 2019/1/13 0:30.
*
* @return ApiResponse
* @Param: ex
*/
@ExceptionHandler
(
Exception
.
class
)
public
ApiResponse
globalException
(
Throwable
ex
)
{
if
(
ex
instanceof
CommonException
)
{
logger
.
warn
(
"访问出错:"
+
ex
.
getMessage
());
return
ApiResponse
.
fail
(
ApiConstant
.
FAILED_CODE
,
ex
.
getMessage
());
}
logger
.
error
(
"访问出错:"
,
ex
);
return
ApiResponse
.
fail
(
ApiConstant
.
FAILED_CODE
,
"服务器内部出错"
);
}
}
src/main/java/com/keymobile/rest/common/constant/ApiConstant.java
deleted
100644 → 0
View file @
4516ffc9
package
com
.
keymobile
.
rest
.
common
.
constant
;
public
interface
ApiConstant
{
int
SUCCEED_CODE
=
200
;
int
FAILED_CODE
=
500
;
String
SUCCEED
=
"成功"
;
String
FAILED
=
"失败"
;
String
ERROR
=
"系统错误"
;
String
UNAUTHORIZED
=
"未授权"
;
String
PARAM_ERROR
=
"参数错误"
;
}
src/main/java/com/keymobile/rest/common/exception/CommonException.java
View file @
d1b5fd52
...
...
@@ -12,7 +12,7 @@ import lombok.Data;
public
class
CommonException
extends
RuntimeException
{
private
static
final
long
serialVersionUID
=
3455708526465670030L
;
public
CommonException
(
String
m
sg
)
{
super
(
m
sg
);
public
CommonException
(
String
m
essage
)
{
super
(
m
essage
);
}
}
src/main/java/com/keymobile/rest/controller/TaskController.java
View file @
d1b5fd52
...
...
@@ -5,7 +5,7 @@ import com.keymobile.rest.common.bean.SimplePage;
import
com.keymobile.rest.common.utils.BeanUti
;
import
com.keymobile.rest.common.utils.DateUtil
;
import
com.keymobile.rest.common.validator.CommonValidator
;
import
com.keymobile.rest.controller.constant.C
trl
Constant
;
import
com.keymobile.rest.controller.constant.C
ommon
Constant
;
import
com.keymobile.rest.model.User
;
import
com.keymobile.rest.model.*
;
import
com.keymobile.rest.model.Process
;
...
...
@@ -35,9 +35,8 @@ import java.util.*;
public
class
TaskController
{
/**
* 默认启动的固化流程
* 默认启动的固化流程
文件
*/
@Value
(
"${app.default-bpmn-file}"
)
private
String
process
;
...
...
@@ -103,7 +102,7 @@ public class TaskController {
// 获取个人任务
List
<
Task
>
tasks
=
taskService
.
createTaskQuery
().
taskAssignee
(
username
).
active
().
list
();
tasks
.
forEach
(
task
->
{
missions
.
add
(
convertTaskToMission
(
task
,
ImmutableMap
.
of
(
"username"
,
username
,
"type"
,
C
trl
Constant
.
TASK_TYPE_PERSONAL
)));
missions
.
add
(
convertTaskToMission
(
task
,
ImmutableMap
.
of
(
"username"
,
username
,
"type"
,
C
ommon
Constant
.
TASK_TYPE_PERSONAL
)));
});
// 获取组任务
...
...
@@ -120,7 +119,7 @@ public class TaskController {
// 组id
String
groupId
=
"id:"
+
templateId
;
if
(
groupId
.
equals
(
identityLink
.
getGroupId
()))
{
missions
.
add
(
convertTaskToMission
(
groupTask
,
ImmutableMap
.
of
(
"username"
,
username
,
"type"
,
C
trl
Constant
.
TASK_TYPE_GROUP
,
"templateId"
,
templateId
,
"config"
,
template
.
getConfig
())));
missions
.
add
(
convertTaskToMission
(
groupTask
,
ImmutableMap
.
of
(
"username"
,
username
,
"type"
,
C
ommon
Constant
.
TASK_TYPE_GROUP
,
"templateId"
,
templateId
,
"config"
,
template
.
getConfig
())));
}
});
}
...
...
@@ -142,7 +141,7 @@ public class TaskController {
// 新建活动
Activity
activity
=
new
Activity
();
activity
=
BeanUti
.
convertTo
(
form
,
activity
);
User
admin
=
sessionService
.
getUserByName
(
C
trl
Constant
.
USER_NAME_ADMIN
);
User
admin
=
sessionService
.
getUserByName
(
C
ommon
Constant
.
USER_NAME_ADMIN
);
activity
.
setUserId
(
admin
.
getId
());
activity
.
setCreateAt
(
DateUtil
.
getTimestamp
());
activity
.
setStatus
(
Activity
.
STATUS_WAIT
);
...
...
@@ -254,9 +253,10 @@ public class TaskController {
public
Object
passTask
(
@PathVariable
String
taskId
,
@PathVariable
int
status
)
{
Task
task
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
();
CommonValidator
.
notNull
(
task
,
"任务不存在"
);
boolean
pass
=
status
==
C
trl
Constant
.
STATUS_PASS
;
boolean
pass
=
status
==
C
ommon
Constant
.
STATUS_PASS
;
Map
vars
=
new
HashMap
();
vars
.
put
(
CtrlConstant
.
ACT_SIGN_DATA_AUDIT
,
pass
);
vars
.
put
(
CommonConstant
.
ACT_SIGN_DATA_AUDIT
,
pass
);
taskService
.
complete
(
task
.
getId
(),
vars
);
if
(
pass
)
{
String
executionId
=
task
.
getExecutionId
();
// 总的会签任务数量
...
...
@@ -270,15 +270,15 @@ public class TaskController {
Activity
activity
=
process
.
getActivity
();
if
(
nrOfCompletedInstances
==
nrOfInstances
-
1
)
{
if
(
activity
.
getNeedConfirm
()
==
Activity
.
NEED_CONFIRM
)
{
vars
.
put
(
C
trl
Constant
.
ACT_NEED_CONFIRM
,
true
);
vars
.
put
(
C
trlConstant
.
ACT_MANAGER
,
Ctrl
Constant
.
USER_NAME_MANAGER
);
vars
.
put
(
C
ommon
Constant
.
ACT_NEED_CONFIRM
,
true
);
vars
.
put
(
C
ommonConstant
.
ACT_MANAGER
,
Common
Constant
.
USER_NAME_MANAGER
);
}
else
{
vars
.
put
(
C
trl
Constant
.
ACT_NEED_CONFIRM
,
false
);
vars
.
put
(
C
ommon
Constant
.
ACT_NEED_CONFIRM
,
false
);
// if (StringUtils.isNotEmpty(template.getBackStreamAddr())) {
// vars.put(CtrlConstant.ACT_NEED_DATA_BACK_FLOW, true);
// vars.put(CtrlConstant.ACT_BACK_FLOW_USER, "");
// } else {
vars
.
put
(
C
trl
Constant
.
ACT_NEED_DATA_BACK_FLOW
,
false
);
vars
.
put
(
C
ommon
Constant
.
ACT_NEED_DATA_BACK_FLOW
,
false
);
// 流程完
// }
}
...
...
@@ -286,7 +286,6 @@ public class TaskController {
activityService
.
save
(
activity
);
}
}
taskService
.
complete
(
task
.
getId
(),
vars
);
return
pass
?
"审核通过成功"
:
"审核驳回成功"
;
}
...
...
@@ -299,10 +298,18 @@ public class TaskController {
public
Object
confirmTask
(
@PathVariable
String
taskId
,
@PathVariable
int
status
)
{
Task
task
=
taskService
.
createTaskQuery
().
taskId
(
taskId
).
singleResult
();
CommonValidator
.
notNull
(
task
,
"任务不存在"
);
boolean
pass
=
status
==
C
trl
Constant
.
STATUS_PASS
;
boolean
pass
=
status
==
C
ommon
Constant
.
STATUS_PASS
;
Map
vars
=
new
HashMap
();
vars
.
put
(
CtrlConstant
.
ACT_SIGN_CONFIRM
,
pass
);
return
"审核通过成功"
;
vars
.
put
(
CommonConstant
.
ACT_SIGN_CONFIRM
,
pass
);
taskService
.
complete
(
task
.
getId
(),
vars
);
if
(
pass
)
{
String
processInstanceId
=
task
.
getProcessInstanceId
();
Process
process
=
processService
.
findByProcessId
(
processInstanceId
);
Activity
activity
=
process
.
getActivity
();
activity
.
setStatus
(
Activity
.
STATUS_WAIT
);
activityService
.
save
(
activity
);
}
return
pass
?
"负责人确认通过"
:
"负责人确认不通过"
;
}
@ApiOperation
(
value
=
"进度列表"
)
...
...
@@ -313,16 +320,8 @@ public class TaskController {
@ApiImplicitParam
(
name
=
"status"
,
value
=
"状态"
,
paramType
=
"query"
,
dataType
=
"integer"
)
})
@GetMapping
(
value
=
"/task/progresses"
)
public
SimplePage
viewTasksProgress
(
int
pageNo
,
int
pageSize
,
String
name
,
Integer
status
)
{
Page
<
Activity
>
page
;
String
orderBy
=
"descending"
;
//
String
propBy
=
"id"
;
// groupBy
if
(
name
!=
null
)
{
page
=
activityService
.
findAllByName
(
name
,
pageNo
,
pageSize
,
orderBy
,
propBy
);
}
else
{
page
=
activityService
.
findAll
(
pageNo
,
pageSize
,
orderBy
,
propBy
);
}
return
SimplePage
.
of
(
page
);
public
Object
viewTasksProgress
(
int
pageNo
,
int
pageSize
,
String
name
,
Integer
status
)
{
return
null
;
}
public
Mission
convertTaskToMission
(
Task
task
,
Map
<
String
,
Object
>
params
)
{
...
...
@@ -335,12 +334,12 @@ public class TaskController {
.
createAt
(
DateUtil
.
formatDateTime
(
task
.
getCreateTime
()));
int
missionType
=
0
;
String
mission
=
""
;
if
(
task
.
getTaskDefinitionKey
().
equals
(
C
trl
Constant
.
MISSION_KEY_DATA_ENTER
))
{
missionType
=
C
trl
Constant
.
MISSION_TYPE_DATA_ENTER
;
mission
=
C
trl
Constant
.
MISSION_TEXT_DATA_ENTER
;
if
(
task
.
getTaskDefinitionKey
().
equals
(
C
ommon
Constant
.
MISSION_KEY_DATA_ENTER
))
{
missionType
=
C
ommon
Constant
.
MISSION_TYPE_DATA_ENTER
;
mission
=
C
ommon
Constant
.
MISSION_TEXT_DATA_ENTER
;
long
templateId
=
0
;
String
config
=
""
;
if
(
type
==
C
trl
Constant
.
TASK_TYPE_PERSONAL
)
{
if
(
type
==
C
ommon
Constant
.
TASK_TYPE_PERSONAL
)
{
String
assignee
=
task
.
getAssignee
();
String
[]
array
=
assignee
.
split
(
":"
);
try
{
...
...
@@ -349,21 +348,21 @@ public class TaskController {
}
catch
(
Exception
e
)
{
}
}
else
if
(
type
==
C
trl
Constant
.
TASK_TYPE_GROUP
)
{
}
else
if
(
type
==
C
ommon
Constant
.
TASK_TYPE_GROUP
)
{
templateId
=
Long
.
parseLong
(
params
.
get
(
"templateId"
).
toString
());
config
=
params
.
get
(
"config"
).
toString
();
}
builder
.
config
(
config
);
builder
.
excelId
(
templateId
);
}
else
if
(
task
.
getTaskDefinitionKey
().
equals
(
C
trl
Constant
.
MISSION_KEY_DATA_AUDIT
))
{
missionType
=
C
trl
Constant
.
MISSION_TYPE_DATA_AUDIT
;
mission
=
C
trl
Constant
.
MISSION_TEXT_DATA_AUDIT
;
}
else
if
(
task
.
getTaskDefinitionKey
().
equals
(
C
trl
Constant
.
MISSION_KEY_MANAGER_AUDIT
))
{
missionType
=
C
trl
Constant
.
MISSION_TYPE_MANAGER_AUDIT
;
mission
=
C
trl
Constant
.
MISSION_TEXT_MANAGER_AUDIT
;
}
else
if
(
task
.
getTaskDefinitionKey
().
equals
(
C
trl
Constant
.
MISSION_KEY_DATA_BACK_FLOW
))
{
missionType
=
C
trl
Constant
.
MISSION_TYPE_DATA_BACK_FLOW
;
mission
=
C
trl
Constant
.
MISSION_TEXT_DATA_BACK_FLOW
;
}
else
if
(
task
.
getTaskDefinitionKey
().
equals
(
C
ommon
Constant
.
MISSION_KEY_DATA_AUDIT
))
{
missionType
=
C
ommon
Constant
.
MISSION_TYPE_DATA_AUDIT
;
mission
=
C
ommon
Constant
.
MISSION_TEXT_DATA_AUDIT
;
}
else
if
(
task
.
getTaskDefinitionKey
().
equals
(
C
ommon
Constant
.
MISSION_KEY_MANAGER_AUDIT
))
{
missionType
=
C
ommon
Constant
.
MISSION_TYPE_MANAGER_AUDIT
;
mission
=
C
ommon
Constant
.
MISSION_TEXT_MANAGER_AUDIT
;
}
else
if
(
task
.
getTaskDefinitionKey
().
equals
(
C
ommon
Constant
.
MISSION_KEY_DATA_BACK_FLOW
))
{
missionType
=
C
ommon
Constant
.
MISSION_TYPE_DATA_BACK_FLOW
;
mission
=
C
ommon
Constant
.
MISSION_TEXT_DATA_BACK_FLOW
;
}
builder
.
mission
(
mission
)
.
missionType
(
missionType
);
...
...
src/main/java/com/keymobile/rest/controller/
Excel
Controller.java
→
src/main/java/com/keymobile/rest/controller/
Template
Controller.java
View file @
d1b5fd52
...
...
@@ -2,7 +2,7 @@ package com.keymobile.rest.controller;
import
com.keymobile.rest.common.utils.DateUtil
;
import
com.keymobile.rest.common.validator.CommonValidator
;
import
com.keymobile.rest.controller.constant.C
trl
Constant
;
import
com.keymobile.rest.controller.constant.C
ommon
Constant
;
import
com.keymobile.rest.model.User
;
import
com.keymobile.rest.model.Activity
;
import
com.keymobile.rest.model.DataInfo
;
...
...
@@ -18,9 +18,9 @@ import org.springframework.web.bind.annotation.*;
import
java.util.HashMap
;
import
java.util.Map
;
@Api
(
tags
=
"模板 控制器"
,
description
=
"
Excel
Mgr"
)
@Api
(
tags
=
"模板 控制器"
,
description
=
"
Template
Mgr"
)
@RestController
public
class
Excel
Controller
{
public
class
Template
Controller
{
@Autowired
private
TemplateService
templateService
;
...
...
@@ -54,7 +54,11 @@ public class ExcelController {
CommonValidator
.
notNull
(
template
,
"模板不存在"
);
User
user
=
sessionService
.
getLoginUser
();
try
{
taskService
.
claim
(
taskId
,
user
.
getName
());
}
catch
(
Exception
e
)
{
System
.
out
.
println
(
"任务已被领取,补录失败"
);
}
String
processInstanceId
=
task
.
getProcessInstanceId
();
Process
process
=
processService
.
findByProcessId
(
processInstanceId
);
...
...
@@ -70,13 +74,12 @@ public class ExcelController {
Map
vars
=
new
HashMap
<>();
if
(
template
.
getNeedAudit
()
==
Template
.
NEED_AUDIT
)
{
vars
.
put
(
C
trl
Constant
.
ACT_NEED_DATA_AUDIT
,
true
);
vars
.
put
(
C
ommon
Constant
.
ACT_NEED_DATA_AUDIT
,
true
);
Map
audit
=
feignAuthService
.
getUserById
(
template
.
getAuditId
());
CommonValidator
.
notNull
(
audit
,
"模板审核人不存在"
);
vars
.
put
(
C
trl
Constant
.
ACT_AUDIT_USER
,
audit
.
get
(
"name"
).
toString
());
vars
.
put
(
C
ommon
Constant
.
ACT_AUDIT_USER
,
audit
.
get
(
"name"
).
toString
());
}
else
{
vars
.
put
(
CtrlConstant
.
ACT_NEED_DATA_AUDIT
,
false
);
vars
.
put
(
CommonConstant
.
ACT_NEED_DATA_AUDIT
,
false
);
String
executionId
=
task
.
getExecutionId
();
// 总的会签任务数量
int
nrOfInstances
=
Integer
.
parseInt
(
runtimeService
.
getVariable
(
executionId
,
"nrOfInstances"
).
toString
());
...
...
@@ -84,23 +87,22 @@ public class ExcelController {
// int nrOfActiveInstances = Integer.parseInt(runtimeService.getVariable(executionId, "nrOfActiveInstances").toString());
// 已经完成的会签任务数量
int
nrOfCompletedInstances
=
Integer
.
parseInt
(
runtimeService
.
getVariable
(
executionId
,
"nrOfCompletedInstances"
).
toString
());
Activity
activity
=
process
.
getActivity
();
if
(
nrOfCompletedInstances
==
nrOfInstances
-
1
)
{
if
(
activity
.
getNeedConfirm
()
==
Activity
.
NEED_CONFIRM
)
{
vars
.
put
(
C
trl
Constant
.
ACT_NEED_CONFIRM
,
true
);
vars
.
put
(
C
trlConstant
.
ACT_MANAGER
,
Ctrl
Constant
.
USER_NAME_MANAGER
);
if
(
process
.
getActivity
()
.
getNeedConfirm
()
==
Activity
.
NEED_CONFIRM
)
{
vars
.
put
(
C
ommon
Constant
.
ACT_NEED_CONFIRM
,
true
);
vars
.
put
(
C
ommonConstant
.
ACT_MANAGER
,
Common
Constant
.
USER_NAME_MANAGER
);
}
else
{
vars
.
put
(
C
trl
Constant
.
ACT_NEED_CONFIRM
,
false
);
vars
.
put
(
C
ommon
Constant
.
ACT_NEED_CONFIRM
,
false
);
// if (StringUtils.isNotEmpty(template.getBackStreamAddr())) {
// vars.put(CtrlConstant.ACT_NEED_DATA_BACK_FLOW, true);
// vars.put(CtrlConstant.ACT_BACK_FLOW_USER, "");
// } else {
vars
.
put
(
C
trl
Constant
.
ACT_NEED_DATA_BACK_FLOW
,
false
);
vars
.
put
(
C
ommon
Constant
.
ACT_NEED_DATA_BACK_FLOW
,
false
);
// 流程完
// }
}
activity
.
setStatus
(
Activity
.
STATUS_WAIT
);
activityService
.
save
(
activity
);
process
.
getActivity
()
.
setStatus
(
Activity
.
STATUS_WAIT
);
activityService
.
save
(
process
.
getActivity
()
);
}
}
taskService
.
complete
(
task
.
getId
(),
vars
);
...
...
src/main/java/com/keymobile/rest/controller/UserController.java
View file @
d1b5fd52
...
...
@@ -24,7 +24,6 @@ public class UserController {
return
feignAuthService
.
getOrgs
();
}
@ApiOperation
(
value
=
"根据组织id获取用户"
,
hidden
=
true
)
@ApiImplicitParams
({
@ApiImplicitParam
(
name
=
"orgId"
,
value
=
"机构id"
,
paramType
=
"query"
,
required
=
true
,
dataType
=
"long"
)
...
...
@@ -55,6 +54,20 @@ public class UserController {
return
users
;
}
/**
* tree structure
*
* {
* node: {},
* subNodes: [
* {
* node: {},
* subNodes:
* []
* }
* ]
* }
*/
@ApiOperation
(
value
=
"获取补录范围用户树"
)
@GetMapping
(
value
=
"/users"
)
public
Map
getUsers
()
{
...
...
src/main/java/com/keymobile/rest/controller/constant/C
trl
Constant.java
→
src/main/java/com/keymobile/rest/controller/constant/C
ommon
Constant.java
View file @
d1b5fd52
package
com
.
keymobile
.
rest
.
controller
.
constant
;
public
interface
C
trl
Constant
{
public
interface
C
ommon
Constant
{
int
TASK_TYPE_PERSONAL
=
1
;
int
TASK_TYPE_GROUP
=
2
;
...
...
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