Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yd-backend
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
AutogeneralShanghai
yd-backend
Commits
205206b7
Commit
205206b7
authored
Jun 09, 2022
by
jianan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
电子报聘审批通知3
parent
e5c3885e
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
137 additions
and
77 deletions
+137
-77
yd-api/src/main/java/com/yd/api/agms/service/impl/AgmsHiringServiceImpl.java
+38
-18
yd-api/src/main/java/com/yd/api/practitioner/service/impl/PractitionerHiringServiceImpl.java
+2
-55
yd-api/src/main/java/com/yd/dal/service/practitioner/PractitionerHiringDALService.java
+8
-0
yd-api/src/main/java/com/yd/dal/service/practitioner/impl/PractitionerHiringDALServiceImpl.java
+57
-0
yd-api/src/main/java/com/yd/rmi/tencent/wechatinterf/service/impl/WechatInterfServiceImpl.java
+32
-4
No files found.
yd-api/src/main/java/com/yd/api/agms/service/impl/AgmsHiringServiceImpl.java
View file @
205206b7
...
...
@@ -433,12 +433,14 @@ public class AgmsHiringServiceImpl implements AgmsHiringService {
private
void
noticeNextStep
(
MdPractitionerHiringApproveSteps
nextStep
,
Long
basicInfoId
)
{
AclPractitionerHiringBasicInfo
basicInfo
=
aclPractitionerHiringBasicInfoDalService
.
findById
(
basicInfoId
);
AclPractitionerHiringMembership
membership
=
membershipMapper
.
selectByHiringBasicInfoId
(
basicInfoId
);
// 查询辅导人所在S1,S2,S3
AclPractitionerHiringMembership
hiringMemberShip
=
practitionerHiringDalService
.
queryHiringMemberShip
(
basicInfoId
);
// 1.获取下一步审批人的手机号
String
[]
mobileNoArray
=
new
String
[
1
];
// 1.1 如果是体系负责人
if
(
StringUtils
.
isNotEmpty
(
nextStep
.
getApproveRole
()))
{
Long
practitionerId
=
members
hip
.
getApprovedBy
();
Long
practitionerId
=
hiringMemberS
hip
.
getApprovedBy
();
AclPractitioner
aclPractitioner
=
aclPractitionerMapper
.
selectByPrimaryKey
(
practitionerId
);
mobileNoArray
[
0
]
=
aclPractitioner
.
getMobileNo
();
}
else
{
...
...
@@ -449,29 +451,45 @@ public class AgmsHiringServiceImpl implements AgmsHiringService {
List
<
PractitionerInfo
>
practitionerList
=
aclPractitionerDalService
.
findPractitionerInfoByMobileList
(
Arrays
.
asList
(
mobileNoArray
));
// 2.报聘人组织关系, 姓名
StringBuilder
name2
=
new
StringBuilder
();
String
s3SubordinateSystemName
=
hiringMemberShip
.
getS3SubordinateSystemName
();
String
s2SubordinateSystemName
=
hiringMemberShip
.
getS2SubordinateSystemName
();
String
s1SubordinateSystemName
=
hiringMemberShip
.
getS1SubordinateSystemName
();
String
s3SubordinateSystemName
=
membership
.
getS3SubordinateSystemName
();
String
s2SubordinateSystemName
=
membership
.
getS2SubordinateSystemName
();
String
s1SubordinateSystemName
=
membership
.
getS1SubordinateSystemName
();
boolean
flag
=
false
;
if
(
StringUtils
.
isNotEmpty
(
s3SubordinateSystemName
))
{
name2
.
append
(
s3SubordinateSystemName
).
append
(
"纵队"
);
name2
.
append
(
s3SubordinateSystemName
);
if
(
s3SubordinateSystemName
.
indexOf
(
"纵队"
)
<
0
)
{
name2
.
append
(
"纵队"
);
}
flag
=
true
;
}
if
(
StringUtils
.
isNotEmpty
(
s2SubordinateSystemName
))
{
name2
.
append
(
s2SubordinateSystemName
).
append
(
"体系"
);
name2
.
append
(
s2SubordinateSystemName
);
if
(
s2SubordinateSystemName
.
indexOf
(
"体系"
)
<
0
)
{
name2
.
append
(
"体系"
);
}
flag
=
true
;
}
if
(
StringUtils
.
isNotEmpty
(
s1SubordinateSystemName
))
{
name2
.
append
(
s1SubordinateSystemName
).
append
(
"分部"
);
name2
.
append
(
s1SubordinateSystemName
);
if
(
s1SubordinateSystemName
.
indexOf
(
"分部"
)
<
0
)
{
name2
.
append
(
"分部"
);
}
flag
=
true
;
}
if
(
flag
)
{
name2
.
append
(
"的"
);
}
name2
.
append
(
"的"
).
append
(
basicInfo
.
getName
());
name2
.
append
(
basicInfo
.
getName
());
// 发送短信通知下一位审批人进行审批
this
.
noticeSendSMS
(
name2
.
toString
(),
practitionerList
,
basicInfo
);
//
this.noticeSendSMS(name2.toString(), practitionerList, basicInfo);
// 公众号推送通知下一位审批人进行审批
this
.
noticeSendWeChatMsg
(
name2
.
toString
(),
practitionerList
,
basicInfo
);
}
private
void
noticeSendWeChatMsg
(
String
hiringName
,
List
<
PractitionerInfo
>
practitionerList
,
AclPractitionerHiringBasicInfo
basicInfo
)
{
//TODO 配置数据库
// String templateId = systemConfigService.getSingleConfigValue("TENCENT_WECHAT_TEMPLATE_ID_XB");
// String jumpUrl = systemConfigService.getSingleConfigValue("hiringApprove_page_url") + orderId;
String
templateId
=
"4_GL7QFaFxucU4K35-2dy6RcjuPE6eQjJyf_2BKddx4"
;
...
...
@@ -493,7 +511,7 @@ public class AgmsHiringServiceImpl implements AgmsHiringService {
dataInfo
.
setKeyword2
(
keyword2
);
dataInfo
.
setRemark
(
remark
);
//
TODO
调微信接口
// 调微信接口
if
(
StringUtils
.
isNotBlank
(
templateId
))
{
SendTemplateRequest
sendTemplateRequest
=
new
SendTemplateRequest
();
sendTemplateRequest
.
setTemplateId
(
templateId
);
...
...
@@ -501,12 +519,14 @@ public class AgmsHiringServiceImpl implements AgmsHiringService {
sendTemplateRequest
.
setUrl
(
jumpUrl
);
for
(
PractitionerInfo
practitionerInfo
:
practitionerList
)
{
// openId
sendTemplateRequest
.
setToUser
(
practitionerInfo
.
getYdWechatOpenid
());
// 审批人姓名
first
.
setValue
(
firstValue
.
replace
(
"name"
,
practitionerInfo
.
getName
()));
// 微信通知
wechatInterfService
.
sendTemplateMessage
(
sendTemplateRequest
);
// openId不为null, 执行
if
(
StringUtils
.
isNotBlank
(
practitionerInfo
.
getYdWechatOpenid
()))
{
sendTemplateRequest
.
setToUser
(
practitionerInfo
.
getYdWechatOpenid
());
// 审批人姓名
first
.
setValue
(
firstValue
.
replace
(
"name"
,
practitionerInfo
.
getName
()));
// 微信通知
wechatInterfService
.
sendTemplateMessage
(
sendTemplateRequest
);
}
}
}
}
...
...
yd-api/src/main/java/com/yd/api/practitioner/service/impl/PractitionerHiringServiceImpl.java
View file @
205206b7
...
...
@@ -644,7 +644,7 @@ public class PractitionerHiringServiceImpl implements PractitionerHiringService
//基本信息
AclPractitionerHiringBasicInfo
hiringBasicInfo
=
basicInfoMapper
.
selectByPrimaryKey
(
hiringBasicInfoId
);
//组织关系
AclPractitionerHiringMembership
hiringMemberShip
=
this
.
queryHiringMemberShip
(
hiringBasicInfoId
);
AclPractitionerHiringMembership
hiringMemberShip
=
practitionerHiringDalService
.
queryHiringMemberShip
(
hiringBasicInfoId
);
//工作经历
List
<
AclPractitionerHiringWorkingExperience
>
hiringWorkingExperienceList
=
workingExperienceMapper
.
selectByHiringBasicInfoId
(
hiringBasicInfoId
);
//申请名目
...
...
@@ -671,59 +671,6 @@ public class PractitionerHiringServiceImpl implements PractitionerHiringService
return
resp
;
}
private
AclPractitionerHiringMembership
queryHiringMemberShip
(
Long
hiringBasicInfoId
)
{
AclPractitionerHiringMembership
hiringMemberShip
=
membershipMapper
.
selectByHiringBasicInfoId
(
hiringBasicInfoId
);
if
(
hiringMemberShip
.
getMentorPractitionerId
()
==
null
)
{
return
hiringMemberShip
;
}
AclPractitioner
mentor
=
aclPractitionerDALService
.
findPractitionerById
(
hiringMemberShip
.
getMentorPractitionerId
());
// 查询并显示“辅导人”所属的S1分部,分部负责人,S2体系,体系负责人,S3纵队,纵队负责人,没有的显示空
List
<
AclPractitionerSubordinateSystem
>
subordinateSystemList
=
aclPractitionerSubordinateSystemDALService
.
findAll
();
Map
<
Long
,
AclPractitionerSubordinateSystem
>
subordinateSystemMap
=
new
HashMap
<>();
subordinateSystemList
.
forEach
(
i
->
subordinateSystemMap
.
put
(
i
.
getId
(),
i
));
Map
<
Long
,
AclPractitioner
>
aclPractitionerMap
=
aclPractitionerDALService
.
findAllMap
();
//所属体系
AclPractitionerSubordinateSystem
subordinateSystem
=
null
;
//体系团队长
AclPractitioner
systemOwner
=
null
;
if
(
mentor
.
getS1Id
()
!=
null
)
{
subordinateSystem
=
subordinateSystemMap
.
get
(
mentor
.
getS1Id
());
if
(
subordinateSystem
!=
null
)
{
hiringMemberShip
.
setS1SubordinateSystemName
(
subordinateSystem
.
getName
());
systemOwner
=
aclPractitionerMap
.
get
(
subordinateSystem
.
getOwnerPractitionerId
());
hiringMemberShip
.
setS1TeamLeaderName
(
systemOwner
!=
null
?
systemOwner
.
getName
()
:
null
);
hiringMemberShip
.
setS1TeamLeaderId
(
systemOwner
!=
null
?
systemOwner
.
getId
()
:
null
);
}
}
if
(
null
!=
mentor
.
getS2Id
())
{
subordinateSystem
=
subordinateSystemMap
.
get
(
mentor
.
getS2Id
());
if
(
subordinateSystem
!=
null
)
{
hiringMemberShip
.
setS2SubordinateSystemName
(
subordinateSystem
!=
null
?
subordinateSystem
.
getName
()
:
null
);
systemOwner
=
aclPractitionerMap
.
get
(
subordinateSystem
.
getOwnerPractitionerId
());
hiringMemberShip
.
setS2TeamLeaderName
(
systemOwner
!=
null
?
systemOwner
.
getName
()
:
null
);
hiringMemberShip
.
setS2TeamLeaderId
(
systemOwner
!=
null
?
systemOwner
.
getId
()
:
null
);
}
}
if
(
null
!=
mentor
.
getS3Id
())
{
subordinateSystem
=
subordinateSystemMap
.
get
(
mentor
.
getS3Id
());
if
(
subordinateSystem
!=
null
)
{
hiringMemberShip
.
setS3SubordinateSystemName
(
subordinateSystem
!=
null
?
subordinateSystem
.
getName
()
:
null
);
systemOwner
=
aclPractitionerMap
.
get
(
subordinateSystem
.
getOwnerPractitionerId
());
hiringMemberShip
.
setS3TeamLeaderName
(
systemOwner
!=
null
?
systemOwner
.
getName
()
:
null
);
hiringMemberShip
.
setS3TeamLeaderId
(
systemOwner
!=
null
?
systemOwner
.
getId
()
:
null
);
}
}
return
hiringMemberShip
;
}
@Override
public
CommonResultResponseVO
saveDigitalSignatures
(
SaveDigitalSignaturesRequestVO
requestVO
)
{
CommonResultResponseVO
resp
=
new
CommonResultResponseVO
();
...
...
@@ -992,7 +939,7 @@ public class PractitionerHiringServiceImpl implements PractitionerHiringService
return
;
}
// 查询辅导人所在S1,S2,S3
AclPractitionerHiringMembership
hiringMemberShip
=
this
.
queryHiringMemberShip
(
hiringBasicInfoId
);
AclPractitionerHiringMembership
hiringMemberShip
=
practitionerHiringDalService
.
queryHiringMemberShip
(
hiringBasicInfoId
);
Long
s1TeamLeaderId
=
hiringMemberShip
.
getS1TeamLeaderId
();
Long
s2TeamLeaderId
=
hiringMemberShip
.
getS2TeamLeaderId
();
...
...
yd-api/src/main/java/com/yd/dal/service/practitioner/PractitionerHiringDALService.java
View file @
205206b7
package
com
.
yd
.
dal
.
service
.
practitioner
;
import
com.yd.api.practitioner.vo.hiring.PractitionerHiringContractTerms
;
import
com.yd.dal.entity.customer.AclPractitionerHiringMembership
;
import
com.yd.dal.entity.practitioner.hiring.*
;
import
java.util.List
;
...
...
@@ -98,4 +99,11 @@ public interface PractitionerHiringDALService {
Integer
getNextStepSeqByApproveStatus
(
String
approveStatus
);
List
<
Long
>
queryBasicInfoIdList
(
List
<
Long
>
list
);
/**
* 查询报聘经纪人的组织架构
* @param hiringBasicInfoId
* @return
*/
AclPractitionerHiringMembership
queryHiringMemberShip
(
Long
hiringBasicInfoId
);
}
yd-api/src/main/java/com/yd/dal/service/practitioner/impl/PractitionerHiringDALServiceImpl.java
View file @
205206b7
...
...
@@ -4,6 +4,7 @@ import com.yd.api.practitioner.vo.hiring.PractitionerHiringContractTerms;
import
com.yd.dal.entity.agms.hiring.PractitionerHiringListInfo
;
import
com.yd.dal.entity.customer.AclPractitioner
;
import
com.yd.dal.entity.customer.AclPractitionerHiringMembership
;
import
com.yd.dal.entity.customer.AclPractitionerSubordinateSystem
;
import
com.yd.dal.entity.customer.CustomerFileUpload
;
import
com.yd.dal.entity.customer.practitioner.PractitionerInfo
;
import
com.yd.dal.entity.meta.MdPractitionerHiringApproveSteps
;
...
...
@@ -14,6 +15,7 @@ import com.yd.dal.mapper.customer.AclPractitionerMapper;
import
com.yd.dal.mapper.practitioner.PractitionerHiringMapper
;
import
com.yd.dal.service.customer.AclFileUploadDALService
;
import
com.yd.dal.service.customer.AclPractitionerDALService
;
import
com.yd.dal.service.customer.AclPractitionerSubordinateSystemDALService
;
import
com.yd.dal.service.meta.MdPractitionerHiringApproveStepsDALService
;
import
com.yd.dal.service.practitioner.PractitionerHiringDALService
;
import
com.yd.dal.service.user.AclUserDALService
;
...
...
@@ -51,6 +53,8 @@ public class PractitionerHiringDALServiceImpl implements PractitionerHiringDALSe
private
SystemConfigService
systemConfigService
;
@Autowired
private
AclUserDALService
aclUserDalService
;
@Autowired
private
AclPractitionerSubordinateSystemDALService
aclPractitionerSubordinateSystemDALService
;
@Override
public
List
<
HiringListInfo
>
findHiringList
(
Long
practitionerId
,
Long
approvingStatus
)
{
...
...
@@ -327,4 +331,57 @@ public class PractitionerHiringDALServiceImpl implements PractitionerHiringDALSe
public
List
<
Long
>
queryBasicInfoIdList
(
List
<
Long
>
list
)
{
return
practitionerHiringMapper
.
queryBasicInfoIdList
(
list
);
}
@Override
public
AclPractitionerHiringMembership
queryHiringMemberShip
(
Long
hiringBasicInfoId
)
{
AclPractitionerHiringMembership
hiringMemberShip
=
membershipMapper
.
selectByHiringBasicInfoId
(
hiringBasicInfoId
);
if
(
hiringMemberShip
.
getMentorPractitionerId
()
==
null
)
{
return
hiringMemberShip
;
}
AclPractitioner
mentor
=
aclPractitionerDALService
.
findPractitionerById
(
hiringMemberShip
.
getMentorPractitionerId
());
// 查询并显示“辅导人”所属的S1分部,分部负责人,S2体系,体系负责人,S3纵队,纵队负责人,没有的显示空
List
<
AclPractitionerSubordinateSystem
>
subordinateSystemList
=
aclPractitionerSubordinateSystemDALService
.
findAll
();
Map
<
Long
,
AclPractitionerSubordinateSystem
>
subordinateSystemMap
=
new
HashMap
<>();
subordinateSystemList
.
forEach
(
i
->
subordinateSystemMap
.
put
(
i
.
getId
(),
i
));
Map
<
Long
,
AclPractitioner
>
aclPractitionerMap
=
aclPractitionerDALService
.
findAllMap
();
//所属体系
AclPractitionerSubordinateSystem
subordinateSystem
=
null
;
//体系团队长
AclPractitioner
systemOwner
=
null
;
if
(
mentor
.
getS1Id
()
!=
null
)
{
subordinateSystem
=
subordinateSystemMap
.
get
(
mentor
.
getS1Id
());
if
(
subordinateSystem
!=
null
)
{
hiringMemberShip
.
setS1SubordinateSystemName
(
subordinateSystem
.
getName
());
systemOwner
=
aclPractitionerMap
.
get
(
subordinateSystem
.
getOwnerPractitionerId
());
hiringMemberShip
.
setS1TeamLeaderName
(
systemOwner
!=
null
?
systemOwner
.
getName
()
:
null
);
hiringMemberShip
.
setS1TeamLeaderId
(
systemOwner
!=
null
?
systemOwner
.
getId
()
:
null
);
}
}
if
(
null
!=
mentor
.
getS2Id
())
{
subordinateSystem
=
subordinateSystemMap
.
get
(
mentor
.
getS2Id
());
if
(
subordinateSystem
!=
null
)
{
hiringMemberShip
.
setS2SubordinateSystemName
(
subordinateSystem
!=
null
?
subordinateSystem
.
getName
()
:
null
);
systemOwner
=
aclPractitionerMap
.
get
(
subordinateSystem
.
getOwnerPractitionerId
());
hiringMemberShip
.
setS2TeamLeaderName
(
systemOwner
!=
null
?
systemOwner
.
getName
()
:
null
);
hiringMemberShip
.
setS2TeamLeaderId
(
systemOwner
!=
null
?
systemOwner
.
getId
()
:
null
);
}
}
if
(
null
!=
mentor
.
getS3Id
())
{
subordinateSystem
=
subordinateSystemMap
.
get
(
mentor
.
getS3Id
());
if
(
subordinateSystem
!=
null
)
{
hiringMemberShip
.
setS3SubordinateSystemName
(
subordinateSystem
!=
null
?
subordinateSystem
.
getName
()
:
null
);
systemOwner
=
aclPractitionerMap
.
get
(
subordinateSystem
.
getOwnerPractitionerId
());
hiringMemberShip
.
setS3TeamLeaderName
(
systemOwner
!=
null
?
systemOwner
.
getName
()
:
null
);
hiringMemberShip
.
setS3TeamLeaderId
(
systemOwner
!=
null
?
systemOwner
.
getId
()
:
null
);
}
}
return
hiringMemberShip
;
}
}
yd-api/src/main/java/com/yd/rmi/tencent/wechatinterf/service/impl/WechatInterfServiceImpl.java
View file @
205206b7
package
com
.
yd
.
rmi
.
tencent
.
wechatinterf
.
service
.
impl
;
import
com.yd.rmi.cache.SystemConfigService
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSONObject
;
import
com.yd.dal.service.transaction.TranLogDALService
;
import
com.yd.rmi.cache.SystemConfigService
;
import
com.yd.rmi.tencent.wechat.vo.accesstoken.AccessTokenByCodeRequest
;
import
com.yd.rmi.tencent.wechat.vo.accesstoken.AccessTokenByCodeResponse
;
import
com.yd.rmi.tencent.wechatinterf.pojo.accesstoken.AccessTokenRequest
;
...
...
@@ -18,6 +20,7 @@ import com.yd.rmi.tencent.wechatinterf.pojo.unifiedorder.UnifiedorderResponse;
import
com.yd.rmi.tencent.wechatinterf.service.WechatInterfService
;
import
com.yd.util.CommonUtil
;
import
com.yd.util.EncryptUtil
;
import
com.yd.util.HttpUtil
;
import
com.yd.util.JsonUtil
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
...
...
@@ -376,17 +379,42 @@ public class WechatInterfServiceImpl implements WechatInterfService {
@Override
public
void
sendTemplateMessage
(
SendTemplateRequest
sendTemplateRequest
)
{
String
appId
=
systemConfigService
.
getSingleConfigValue
(
"YD-TENCENT_WECHAT_APPID"
);
String
secret
=
systemConfigService
.
getSingleConfigValue
(
"YD-TENCENT_WECHAT_APP_SECRET"
);
String
grantType
=
systemConfigService
.
getSingleConfigValue
(
"TENCENT_WECHAT_TOKEN_GRANT_TYPE"
);
// TokenRequest tokenRequest = new TokenRequest();
// tokenRequest.setAppid(appId);
// tokenRequest.setSecret(secret);
// tokenRequest.setGrant_type(grantType);
// TokenResponse token = this.token(tokenRequest);
TokenResponse
token
=
this
.
token
(
new
TokenRequest
());
AccessTokenRequest
accessTokenRequest
=
new
AccessTokenRequest
();
accessTokenRequest
.
setAppid
(
appId
);
accessTokenRequest
.
setSecret
(
secret
);
accessTokenRequest
.
setGrant_type
(
grantType
);
String
token
=
getAccessTokenByDEV
(
accessTokenRequest
);
String
url
=
systemConfigService
.
getSingleConfigValue
(
"TENCENT_WECHAT_TEMPLATE_SEND_URL"
)
+
token
.
getAccess_token
()
;
String
url
=
systemConfigService
.
getSingleConfigValue
(
"TENCENT_WECHAT_TEMPLATE_SEND_URL"
)
+
token
;
logger
.
error
(
"【》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》发送微信模板消息开始"
);
tranLogDALService
.
logDB
(
"wechat"
,
"sendTemplateMessage"
,
"in"
,
sendTemplateRequest
.
getToUser
(),
url
,
null
,
null
);
String
responseStr
=
weChatTransaction
(
url
,
null
);
String
responseStr
=
weChatTransaction
(
url
,
JsonUtil
.
objToJson
(
sendTemplateRequest
)
);
tranLogDALService
.
logDB
(
"wechat"
,
"sendTemplateMessage"
,
"out"
,
sendTemplateRequest
.
getToUser
(),
responseStr
,
null
,
null
);
}
/**
* 在本地开发时,通过dev去获取access_token
* @param accessTokenRequest
* @return
*/
private
String
getAccessTokenByDEV
(
AccessTokenRequest
accessTokenRequest
)
{
String
requestJson
=
JsonUtil
.
objToJson
(
accessTokenRequest
);
String
responseJson
=
HttpUtil
.
postForJson
(
"https://mdev.zuihuibi.cn/api/getAccessToken"
,
requestJson
);
JSONObject
result
=
JSON
.
parseObject
(
responseJson
);
return
result
.
getString
(
"data"
);
}
/**
* 微信接口交互
*/
@Override
...
...
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