Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yanxuan-qc-change-system
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
胡园园
yanxuan-qc-change-system
Commits
81f64f17
Commit
81f64f17
authored
Dec 15, 2022
by
“zcwang”
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
modify:邮件发送完善
parent
468f2772
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
230 additions
and
66 deletions
+230
-66
ChangeFlowBiz.java
...om/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
+196
-58
AppConfig.java
...com/netease/mail/yanxuan/change/biz/config/AppConfig.java
+11
-2
IusService.java
...tease/mail/yanxuan/change/biz/service/rpc/IusService.java
+3
-4
AutoSubmit.java
.../com/netease/mail/yanxuan/change/biz/task/AutoSubmit.java
+19
-1
TestController.java
...se/mail/yanxuan/change/web/controller/TestController.java
+1
-1
No files found.
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
View file @
81f64f17
...
@@ -6,8 +6,32 @@
...
@@ -6,8 +6,32 @@
*/
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
biz
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
biz
;
import
cn.afterturn.easypoi.excel.ExcelExportUtil
;
import
java.io.ByteArrayOutputStream
;
import
cn.afterturn.easypoi.excel.entity.ExportParams
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.net.URLEncoder
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.HashSet
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Optional
;
import
java.util.Set
;
import
java.util.UUID
;
import
java.util.stream.Collectors
;
import
javax.servlet.http.HttpServletResponse
;
import
javax.validation.Valid
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.Assert
;
import
com.alibaba.fastjson.JSON
;
import
com.alibaba.fastjson.JSON
;
import
com.github.pagehelper.PageHelper
;
import
com.github.pagehelper.PageHelper
;
import
com.github.pagehelper.PageInfo
;
import
com.github.pagehelper.PageInfo
;
...
@@ -19,20 +43,50 @@ import com.netease.mail.yanxuan.change.biz.service.ChangeFlowService;
...
@@ -19,20 +43,50 @@ import com.netease.mail.yanxuan.change.biz.service.ChangeFlowService;
import
com.netease.mail.yanxuan.change.biz.service.InteriorChangeConfigService
;
import
com.netease.mail.yanxuan.change.biz.service.InteriorChangeConfigService
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeConfigService
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeConfigService
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeTypeService
;
import
com.netease.mail.yanxuan.change.biz.service.change.ChangeTypeService
;
import
com.netease.mail.yanxuan.change.biz.service.rpc.*
;
import
com.netease.mail.yanxuan.change.biz.service.rpc.FlowService
;
import
com.netease.mail.yanxuan.change.biz.service.rpc.ItemService
;
import
com.netease.mail.yanxuan.change.biz.service.rpc.IusService
;
import
com.netease.mail.yanxuan.change.biz.service.rpc.SupplierSendService
;
import
com.netease.mail.yanxuan.change.biz.service.rpc.TodoService
;
import
com.netease.mail.yanxuan.change.common.bean.CommonConstants
;
import
com.netease.mail.yanxuan.change.common.bean.CommonConstants
;
import
com.netease.mail.yanxuan.change.common.bean.RequestLocalBean
;
import
com.netease.mail.yanxuan.change.common.bean.RequestLocalBean
;
import
com.netease.mail.yanxuan.change.common.bean.ResponseCode
;
import
com.netease.mail.yanxuan.change.common.bean.ResponseCode
;
import
com.netease.mail.yanxuan.change.common.enums.*
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeFlowEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeResultEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeStatusEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeSubjectEnum
;
import
com.netease.mail.yanxuan.change.common.enums.CreateSourceEnum
;
import
com.netease.mail.yanxuan.change.common.enums.FileTypeEnum
;
import
com.netease.mail.yanxuan.change.common.enums.FlowOperationTypeEnum
;
import
com.netease.mail.yanxuan.change.common.enums.FlowxOperationEnum
;
import
com.netease.mail.yanxuan.change.common.enums.NeedFileEnum
;
import
com.netease.mail.yanxuan.change.common.enums.OperateTypeEnum
;
import
com.netease.mail.yanxuan.change.common.util.DateUtils
;
import
com.netease.mail.yanxuan.change.common.util.DateUtils
;
import
com.netease.mail.yanxuan.change.dal.entity.*
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeConfig
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeFile
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeRecord
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeType
;
import
com.netease.mail.yanxuan.change.dal.mapper.ChangeRecordMapper
;
import
com.netease.mail.yanxuan.change.dal.mapper.ChangeRecordMapper
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeCommanderPO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeCommanderPO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeConfigPo
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeConfigPo
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeGoodsPrincipalPO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeGoodsPrincipalPO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.*
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeExecConfigReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCancelReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCreateReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowDeliverReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowFile
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowListQueryReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowSubmitReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.rpc.GoodsResponseRpc
;
import
com.netease.mail.yanxuan.change.dal.meta.model.rpc.GoodsResponseRpc
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.*
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.BasicChangeFlowVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.CategoryInfoVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowExecVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowListVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ItemBasicInfoVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ItemVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.PageVO
;
import
com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum
;
import
com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum
;
import
com.netease.mail.yanxuan.change.integration.email.service.IEmailService
;
import
com.netease.mail.yanxuan.change.integration.email.service.IEmailService
;
import
com.netease.mail.yanxuan.change.integration.excel.ChangeFlowExcelDTO
;
import
com.netease.mail.yanxuan.change.integration.excel.ChangeFlowExcelDTO
;
...
@@ -40,7 +94,6 @@ import com.netease.mail.yanxuan.change.integration.flow.UserQueryDTO;
...
@@ -40,7 +94,6 @@ import com.netease.mail.yanxuan.change.integration.flow.UserQueryDTO;
import
com.netease.mail.yanxuan.change.integration.flow.ius.IusRpcService
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.IusRpcService
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.req.IusDepartmentReq
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.req.IusDepartmentReq
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.rsp.IusUserInfoRsp
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.rsp.IusUserInfoRsp
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.rsp.OrgPosLeaderChainRsp
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.rsp.SecondaryDepartments
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.rsp.SecondaryDepartments
;
import
com.netease.mail.yanxuan.change.integration.item.SimplePhyCateGoryResultCo
;
import
com.netease.mail.yanxuan.change.integration.item.SimplePhyCateGoryResultCo
;
import
com.netease.mail.yanxuan.change.integration.item.meta.SpuTO
;
import
com.netease.mail.yanxuan.change.integration.item.meta.SpuTO
;
...
@@ -55,22 +108,10 @@ import com.netease.yanxuan.flowx.sdk.meta.dto.base.UserReachDTO;
...
@@ -55,22 +108,10 @@ import com.netease.yanxuan.flowx.sdk.meta.dto.base.UserReachDTO;
import
com.netease.yanxuan.flowx.sdk.meta.dto.exec.InterfaceInputDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.exec.InterfaceInputDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.exec.UserBaseContainerDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.exec.UserBaseContainerDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.flow.FlowCreateReqDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.flow.FlowCreateReqDTO
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.ss.usermodel.Workbook
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.Assert
;
import
javax.servlet.http.HttpServletResponse
;
import
cn.afterturn.easypoi.excel.ExcelExportUtil
;
import
javax.validation.Valid
;
import
cn.afterturn.easypoi.excel.entity.ExportParams
;
import
java.io.ByteArrayOutputStream
;
import
lombok.extern.slf4j.Slf4j
;
import
java.io.IOException
;
import
java.io.OutputStream
;
import
java.net.URLEncoder
;
import
java.util.*
;
import
java.util.stream.Collectors
;
/**
/**
* @Author zcwang
* @Author zcwang
...
@@ -261,7 +302,18 @@ public class ChangeFlowBiz {
...
@@ -261,7 +302,18 @@ public class ChangeFlowBiz {
}
}
String
subjectParam
=
ChangeSubjectEnum
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
()
+
changeType
String
subjectParam
=
ChangeSubjectEnum
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
()
+
changeType
+
changeRecord
.
getFlowId
().
toString
();
+
changeRecord
.
getFlowId
().
toString
();
qcSendEmail
(
changeCommander
,
subjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_EXECUTE
,
param
);
List
<
ChangeFlowExecVO
>
changeFlowExecRecord
=
changeFlowExecService
.
getChangeFlowExecRecord
(
changeRecord
.
getId
());
List
<
String
>
execUserEmailList
=
changeFlowExecRecord
.
stream
().
map
(
ChangeFlowExecVO:
:
getChangeExecUserEmail
)
.
collect
(
Collectors
.
toList
());
// 获取指定人的上级部门主管邮箱
List
<
String
>
ccList
=
getDepartmentInfo
(
execUserEmailList
);
// 变更执行,抄送:所有变更行动人上一级LEADER,变更负责人、变更转交人(如有)
ccList
.
add
(
changeCommander
);
// 变更执行,收件人:所有变更行动人+变更管理QM(cuiyixian@corp.netease.com)
execUserEmailList
.
add
(
appConfig
.
getChangeManageQM
());
qcSendEmail
(
execUserEmailList
,
ccList
,
subjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_EXECUTE
,
param
);
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
changeFlowCreateReq
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
changeFlowCreateReq
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
subjectParam
,
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
subjectParam
,
...
@@ -288,7 +340,12 @@ public class ChangeFlowBiz {
...
@@ -288,7 +340,12 @@ public class ChangeFlowBiz {
param
.
put
(
"changeType"
,
changeType
.
toString
());
param
.
put
(
"changeType"
,
changeType
.
toString
());
param
.
put
(
"flowUrl"
,
changeRecord
.
getFlowId
());
param
.
put
(
"flowUrl"
,
changeRecord
.
getFlowId
());
String
subjectParam
=
changeRecord
.
getFlowId
().
toString
();
String
subjectParam
=
changeRecord
.
getFlowId
().
toString
();
qcSendEmail
(
changeCommander
,
subjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_RELEASE_FLOW
,
param
);
// 发起变更,收件人:变更负责人
List
<
String
>
receiver
=
Collections
.
singletonList
(
changeCommander
);
List
<
String
>
ccList
=
getDepartmentInfo
(
receiver
);
// 发起变更,抄送:变更负责人上一级主管、变更管理QM(cuiyixian@corp.netease.com)
ccList
.
add
(
appConfig
.
getChangeManageQM
());
qcSendEmail
(
receiver
,
ccList
,
subjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_RELEASE_FLOW
,
param
);
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
changeFlowCreateReq
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
changeFlowCreateReq
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
subjectParam
,
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
subjectParam
,
...
@@ -297,34 +354,38 @@ public class ChangeFlowBiz {
...
@@ -297,34 +354,38 @@ public class ChangeFlowBiz {
return
flowId
;
return
flowId
;
}
}
private
List
<
String
>
getDepartmentInfo
(
List
<
String
>
receiver
)
{
IusDepartmentReq
iusDepartmentReq
=
new
IusDepartmentReq
();
iusDepartmentReq
.
setHasOrgPos
(
true
);
iusDepartmentReq
.
setIcac
(
true
);
iusDepartmentReq
.
setUids
(
receiver
);
HashMap
<
String
,
List
<
SecondaryDepartments
>>
map
=
iusService
.
queryDepartment
(
iusDepartmentReq
);
ArrayList
<
List
<
SecondaryDepartments
>>
secondaryDepartments
=
new
ArrayList
<>(
map
.
values
());
List
<
String
>
ccList
=
new
ArrayList
<>();
if
(
CollectionUtils
.
isNotEmpty
(
secondaryDepartments
))
{
for
(
List
<
SecondaryDepartments
>
secondaryDepartment
:
secondaryDepartments
)
{
ccList
.
addAll
(
secondaryDepartment
.
stream
().
map
(
SecondaryDepartments:
:
getUid
).
collect
(
Collectors
.
toList
()));
}
}
return
ccList
;
}
/**
/**
* 严选QC端发送邮件
* 严选QC端发送邮件
*
*
* @param changeCommander 负责人
* @param subjectParam 主体参数
* @param subjectParam 主体参数
* @param receiver 收件人
* @param emailTemplateEnum 邮件模板
* @param emailTemplateEnum 邮件模板
* @param param 正文参数
* @param param 正文参数
*/
*/
public
void
qcSendEmail
(
String
changeCommander
,
String
subjectParam
,
EmailTemplateEnum
emailTemplateEnum
,
public
void
qcSendEmail
(
List
<
String
>
receiver
,
List
<
String
>
ccList
,
String
subjectParam
,
EmailTemplateEnum
emailTemplateEnum
,
Map
<
String
,
Object
>
param
)
{
Map
<
String
,
Object
>
param
)
{
try
{
try
{
IusDepartmentReq
iusDepartmentReq
=
new
IusDepartmentReq
();
iEmailService
.
sendEmail
(
receiver
,
ccList
,
param
,
emailTemplateEnum
,
iusDepartmentReq
.
setHasOrgPos
(
true
);
iusDepartmentReq
.
setIcac
(
true
);
iusDepartmentReq
.
setUids
(
Collections
.
singletonList
(
changeCommander
));
HashMap
<
String
,
List
<
SecondaryDepartments
>>
map
=
iusService
.
queryDepartment
(
iusDepartmentReq
);
log
.
info
(
"[qcSendEmail] subjectParam:{}, map:{}"
,
subjectParam
,
map
);
List
<
SecondaryDepartments
>
secondaryDepartments
=
map
.
get
(
changeCommander
);
List
<
String
>
ccList
=
new
ArrayList
<>();
if
(
CollectionUtils
.
isNotEmpty
(
secondaryDepartments
))
{
ccList
=
secondaryDepartments
.
stream
().
map
(
SecondaryDepartments:
:
getUid
).
collect
(
Collectors
.
toList
());
}
// 变更管理QM,所有邮件都要发
ccList
.
add
(
appConfig
.
getChangeManageQM
());
iEmailService
.
sendEmail
(
Collections
.
singletonList
(
changeCommander
),
ccList
,
param
,
emailTemplateEnum
,
subjectParam
);
subjectParam
);
}
catch
(
Exception
e
)
{
}
catch
(
Exception
e
)
{
log
.
error
(
"[op:qcSendEmail] error,
changeCommander:{}, subjectParam:{}, e:{}"
,
changeCommand
er
,
subjectParam
,
log
.
error
(
"[op:qcSendEmail] error,
receiver:{}, subjectParam:{}, e:{}"
,
receiv
er
,
subjectParam
,
e
);
e
);
}
}
}
}
...
@@ -532,7 +593,19 @@ public class ChangeFlowBiz {
...
@@ -532,7 +593,19 @@ public class ChangeFlowBiz {
param
.
put
(
"flowUrl"
,
changeRecord
.
getFlowId
());
param
.
put
(
"flowUrl"
,
changeRecord
.
getFlowId
());
param
.
put
(
"dataList"
,
changeExecRecords
);
param
.
put
(
"dataList"
,
changeExecRecords
);
String
subjectParam
=
changeRecord
.
getFlowId
().
toString
();
String
subjectParam
=
changeRecord
.
getFlowId
().
toString
();
qcSendEmail
(
changeRecord
.
getChangeCommander
(),
subjectParam
,
// 负责人
String
changeCommander
=
changeRecord
.
getChangeCommander
();
List
<
ChangeFlowExecVO
>
changeFlowExecRecord
=
changeFlowExecService
.
getChangeFlowExecRecord
(
changeRecord
.
getId
());
List
<
String
>
execUserEmailList
=
changeFlowExecRecord
.
stream
().
map
(
ChangeFlowExecVO:
:
getChangeExecUserEmail
)
.
collect
(
Collectors
.
toList
());
// 获取指定人的上级部门主管邮箱
List
<
String
>
ccList
=
getDepartmentInfo
(
execUserEmailList
);
// 变更执行,抄送:所有变更行动人上一级LEADER,变更负责人、变更转交人(如有)
ccList
.
add
(
changeCommander
);
// 变更执行,收件人:所有变更行动人+变更管理QM(cuiyixian@corp.netease.com)
execUserEmailList
.
add
(
appConfig
.
getChangeManageQM
());
qcSendEmail
(
execUserEmailList
,
ccList
,
subjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_EXECUTE
,
param
);
EmailTemplateEnum
.
YX_QC_CHANGE_EXECUTE
,
param
);
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
...
@@ -598,9 +671,23 @@ public class ChangeFlowBiz {
...
@@ -598,9 +671,23 @@ public class ChangeFlowBiz {
log
.
error
(
"queryInfoPo error:{}"
,
JSON
.
toJSONString
(
changeConfigPo
));
log
.
error
(
"queryInfoPo error:{}"
,
JSON
.
toJSONString
(
changeConfigPo
));
}
}
//【已完结】变更主体+变更内容+工单ID 变更风险行动项已完结,请开始执行变更。
//【已完结】变更主体+变更内容+工单ID 变更风险行动项已完结,请开始执行变更。
String
finishSubjectParam
=
ChangeSubjectEnum
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
()
+
changeRecord
.
getChangeContent
()
String
finishSubjectParam
=
ChangeSubjectEnum
+
changeRecord
.
getFlowId
();
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
()
qcSendEmail
(
changeRecord
.
getChangeCommander
(),
finishSubjectParam
,
+
changeRecord
.
getChangeContent
()
+
changeRecord
.
getFlowId
();
// 变更确认,收件人:变更负责人+变更供应商+所有变更行动人+变更管理QM(cuiyixian@corp.netease.com)
List
<
ChangeFlowExecVO
>
execRecord
=
changeFlowExecService
.
getChangeFlowExecRecord
(
changeRecord
.
getId
());
List
<
String
>
userEmailList
=
execRecord
.
stream
().
map
(
ChangeFlowExecVO:
:
getChangeExecUserEmail
)
.
collect
(
Collectors
.
toList
());
// 变更确认,抄送人:所有变更行动人上一级LEADER+变更管理委员会(yx_change_SC@qun.mail.163.com)
List
<
String
>
list
=
this
.
getDepartmentInfo
(
userEmailList
);
list
.
add
(
appConfig
.
getChangeCommittee
());
userEmailList
.
add
(
changeRecord
.
getChangeCommander
());
userEmailList
.
add
(
appConfig
.
getChangeManageQM
());
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
userEmailList
.
add
(
changeRecord
.
getChangeSupplier
());
}
qcSendEmail
(
userEmailList
,
list
,
finishSubjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_FINISH
,
finishPartMap
);
EmailTemplateEnum
.
YX_QC_CHANGE_FINISH
,
finishPartMap
);
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
...
@@ -622,20 +709,46 @@ public class ChangeFlowBiz {
...
@@ -622,20 +709,46 @@ public class ChangeFlowBiz {
changeFlowService
.
updateRecord
(
changeRecord
);
changeFlowService
.
updateRecord
(
changeRecord
);
todoService
.
progressTodoTask
(
changeRecord
,
OperateTypeEnum
.
FINISH
.
getType
());
todoService
.
progressTodoTask
(
changeRecord
,
OperateTypeEnum
.
FINISH
.
getType
());
// 发送邮件
// 发送邮件
Map
<
String
,
Object
>
cancelMap
=
new
HashMap
<>();
Hash
Map
<
String
,
Object
>
cancelMap
=
new
HashMap
<>();
cancelMap
.
put
(
"changeId"
,
changeRecord
.
getFlowId
());
cancelMap
.
put
(
"changeId"
,
changeRecord
.
getFlowId
());
cancelMap
.
put
(
"changeSubject"
,
ChangeSubjectEnum
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
());
cancelMap
.
put
(
"changeSubject"
,
ChangeSubjectEnum
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
());
cancelMap
.
put
(
"changeContent"
,
changeRecord
.
getChangeContent
());
cancelMap
.
put
(
"flowUrl"
,
changeRecord
.
getFlowId
());
AjaxResponse
<
IusUserInfoRsp
>
userInfo
=
iusRpcService
.
queryUserInfo
(
changeRecord
.
getChangeCommander
());
ChangeConfigPo
changeConfigPo1
=
changeConfigService
cancelMap
.
put
(
"changeCommander"
,
userInfo
.
getData
().
getName
());
.
queryInfoPo
(
changeRecord
.
getParentChangeClassId
(),
changeRecord
.
getSonChangeClassId
());
cancelMap
.
put
(
"cancelReason"
,
changeRecord
.
getCancelReason
());
StringBuilder
changeType1
=
new
StringBuilder
();
String
cancelSubjectParam
=
changeRecord
.
getFlowId
().
toString
();
try
{
qcSendEmail
(
changeRecord
.
getChangeCommander
(),
cancelSubjectParam
,
changeType1
.
append
(
changeConfigPo1
.
getChangeTypes
().
get
(
0
).
getTypeName
());
EmailTemplateEnum
.
YX_QC_CHANGE_SUBMIT_CANCEL
,
cancelMap
);
}
catch
(
Exception
e
)
{
log
.
error
(
"queryInfoPo error:{}"
,
JSON
.
toJSONString
(
changeConfigPo1
));
}
try
{
changeType1
.
append
(
changeConfigPo1
.
getChangeTypes
().
get
(
1
).
getTypeName
());
}
catch
(
Exception
e
)
{
log
.
error
(
"queryInfoPo error:{}"
,
JSON
.
toJSONString
(
changeConfigPo1
));
}
//【已完结】变更主体+变更内容+工单ID 变更风险行动项已完结,请开始执行变更。
String
cancelFinishSubjectParam
=
ChangeSubjectEnum
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
()
+
changeRecord
.
getChangeContent
()
+
changeRecord
.
getFlowId
();
// 变更确认,收件人:变更负责人+变更供应商+所有变更行动人+变更管理QM(cuiyixian@corp.netease.com)
List
<
ChangeFlowExecVO
>
execRecordList
=
changeFlowExecService
.
getChangeFlowExecRecord
(
changeRecord
.
getId
());
List
<
String
>
userEmails
=
execRecordList
.
stream
().
map
(
ChangeFlowExecVO:
:
getChangeExecUserEmail
)
.
collect
(
Collectors
.
toList
());
// 变更确认,抄送人:所有变更行动人上一级LEADER+变更管理委员会(yx_change_SC@qun.mail.163.com)
List
<
String
>
departmentInfoList
=
this
.
getDepartmentInfo
(
userEmails
);
departmentInfoList
.
add
(
appConfig
.
getChangeCommittee
());
userEmails
.
add
(
changeRecord
.
getChangeCommander
());
userEmails
.
add
(
appConfig
.
getChangeManageQM
());
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
userEmails
.
add
(
changeRecord
.
getChangeSupplier
());
}
qcSendEmail
(
userEmails
,
departmentInfoList
,
cancelFinishSubjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_FINISH
,
cancelMap
);
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
cancelSubjectParam
,
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
cancel
Finish
SubjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_
SUBMIT_CANCEL
,
cancelMap
);
EmailTemplateEnum
.
YX_QC_CHANGE_
FINISH
,
cancelMap
);
}
}
return
cancelNode
;
return
cancelNode
;
case
DELAY:
case
DELAY:
...
@@ -728,7 +841,22 @@ public class ChangeFlowBiz {
...
@@ -728,7 +841,22 @@ public class ChangeFlowBiz {
cancelMap
.
put
(
"changeCommander"
,
user
.
getData
().
getName
());
cancelMap
.
put
(
"changeCommander"
,
user
.
getData
().
getName
());
cancelMap
.
put
(
"cancelReason"
,
changeRecord
.
getCancelReason
());
cancelMap
.
put
(
"cancelReason"
,
changeRecord
.
getCancelReason
());
String
cancelSubjectParam
=
changeRecord
.
getFlowId
().
toString
();
String
cancelSubjectParam
=
changeRecord
.
getFlowId
().
toString
();
qcSendEmail
(
changeCommander
,
cancelSubjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_SUBMIT_CANCEL
,
cancelMap
);
List
<
String
>
receiver
=
new
ArrayList
<>(
Collections
.
singletonList
(
changeCommander
));
List
<
ChangeFlowExecVO
>
execRecord
=
changeFlowExecService
.
getChangeFlowExecRecord
(
changeRecord
.
getId
());
List
<
String
>
userEmailList
=
execRecord
.
stream
().
map
(
ChangeFlowExecVO:
:
getChangeExecUserEmail
)
.
collect
(
Collectors
.
toList
());
receiver
.
addAll
(
userEmailList
);
// 取消变更,抄送人:变更负责人+变更行动人上一级主管、变更管理QM(cuiyixian@corp.netease.com)
userEmailList
.
addAll
(
receiver
);
List
<
String
>
ccList
=
this
.
getDepartmentInfo
(
userEmailList
);
ccList
.
add
(
appConfig
.
getChangeManageQM
());
// 取消变更,收件人:变更发起人(供应商邮箱号或严选发起人)、变更负责人、变更行动人
String
creator
=
changeRecord
.
getCreator
();
if
(!
creator
.
equals
(
changeCommander
))
{
receiver
.
add
(
creator
);
}
qcSendEmail
(
receiver
,
ccList
,
cancelSubjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_SUBMIT_CANCEL
,
cancelMap
);
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
cancelSubjectParam
,
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
cancelSubjectParam
,
...
@@ -1131,7 +1259,17 @@ public class ChangeFlowBiz {
...
@@ -1131,7 +1259,17 @@ public class ChangeFlowBiz {
cancelMap
.
put
(
"restsChangeCommander"
,
newUser
.
getData
().
getName
());
cancelMap
.
put
(
"restsChangeCommander"
,
newUser
.
getData
().
getName
());
cancelMap
.
put
(
"restsChangeCommanderEmail"
,
deliverUser
);
cancelMap
.
put
(
"restsChangeCommanderEmail"
,
deliverUser
);
String
cancelSubjectParam
=
changeRecord
.
getFlowId
().
toString
();
String
cancelSubjectParam
=
changeRecord
.
getFlowId
().
toString
();
qcSendEmail
(
changeCommander
,
cancelSubjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_SUBMIT_FORWARD
,
cancelMap
);
// 转交,收件人:变更转交人(工单接收人)、变更负责人(工单转交人)
List
<
String
>
receiver
=
Arrays
.
asList
(
changeCommander
,
deliverUser
);
// 转交,抄送人:变更发起人+原变更负责人上一级主管、变更转交人(工单接收人)上一级主管+变更行动项负责人
List
<
String
>
ccList
=
this
.
getDepartmentInfo
(
receiver
);
ccList
.
add
(
changeRecord
.
getCreator
());
List
<
ChangeFlowExecVO
>
execRecord
=
changeFlowExecService
.
getChangeFlowExecRecord
(
changeRecord
.
getId
());
List
<
String
>
userEmailList
=
execRecord
.
stream
().
map
(
ChangeFlowExecVO:
:
getChangeExecUserEmail
)
.
collect
(
Collectors
.
toList
());
ccList
.
addAll
(
userEmailList
);
qcSendEmail
(
receiver
,
ccList
,
cancelSubjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_SUBMIT_FORWARD
,
cancelMap
);
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
cancelSubjectParam
,
sendSupplierEmail
.
sendSupplierEmail
(
changeRecord
.
getChangeSupplier
(),
cancelSubjectParam
,
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/config/AppConfig.java
View file @
81f64f17
...
@@ -6,6 +6,8 @@
...
@@ -6,6 +6,8 @@
*/
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
config
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
config
;
import
java.util.List
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Component
;
import
org.springframework.stereotype.Component
;
...
@@ -33,8 +35,8 @@ public class AppConfig {
...
@@ -33,8 +35,8 @@ public class AppConfig {
@Value
(
"${testEmail:A@163.com}"
)
@Value
(
"${testEmail:A@163.com}"
)
private
String
testEmail
;
private
String
testEmail
;
@Value
(
"${sendEmail:
wb.wangzhichao01@mesg.corp.netease.com
}"
)
@Value
(
"${sendEmail:
[\"wb.wangzhichao01@mesg.corp.netease.com\"]
}"
)
private
String
sendEmail
;
private
List
<
String
>
receiver
;
@Value
(
"${change.goods.principal.name:aaa}"
)
@Value
(
"${change.goods.principal.name:aaa}"
)
private
String
defaultName
;
private
String
defaultName
;
...
@@ -54,6 +56,12 @@ public class AppConfig {
...
@@ -54,6 +56,12 @@ public class AppConfig {
@Value
(
"${changeManageQM:cuiyixian@corp.netease.com}"
)
@Value
(
"${changeManageQM:cuiyixian@corp.netease.com}"
)
private
String
changeManageQM
;
private
String
changeManageQM
;
/**
* 变更管理委员会
*/
@Value
(
"${changeCommittee:yx_change_SC@qun.mail.163.com}"
)
private
String
changeCommittee
;
@Value
(
"${exportLimit:20}"
)
@Value
(
"${exportLimit:20}"
)
private
Long
exportLimit
;
private
Long
exportLimit
;
}
}
\ No newline at end of file
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/rpc/IusService.java
View file @
81f64f17
...
@@ -37,14 +37,14 @@ public class IusService {
...
@@ -37,14 +37,14 @@ public class IusService {
public
HashMap
<
String
,
List
<
SecondaryDepartments
>>
queryDepartment
(
IusDepartmentReq
iusDepartmentReq
)
{
public
HashMap
<
String
,
List
<
SecondaryDepartments
>>
queryDepartment
(
IusDepartmentReq
iusDepartmentReq
)
{
log
.
info
(
"[queryDepartment] queryDepartment req:{}"
,
JSON
.
toJSONString
(
iusDepartmentReq
));
log
.
info
(
"[queryDepartment] queryDepartment req:{}"
,
JSON
.
toJSONString
(
iusDepartmentReq
));
AjaxResponse
<
HashMap
<
String
,
List
<
SecondaryDepartments
>>>
response
=
iusRpcService
.
queryDepartment
(
iusDepartmentReq
);
AjaxResponse
<
HashMap
<
String
,
List
<
SecondaryDepartments
>>>
response
=
iusRpcService
.
queryDepartment
(
iusDepartmentReq
);
HashMap
<
String
,
List
<
SecondaryDepartments
>>
map
;
log
.
info
(
"[queryDepartment] response of queryDepartment ={}"
,
JSON
.
toJSONString
(
response
));
if
(
ResponseCodeEnum
.
SUCCESS
.
getCode
()
==
response
.
getCode
())
{
if
(
ResponseCodeEnum
.
SUCCESS
.
getCode
()
==
response
.
getCode
())
{
map
=
response
.
getData
();
return
response
.
getData
();
}
else
{
}
else
{
log
.
error
(
"[queryDepartment] queryDepartment failed, query={}, errMsg={}"
,
JSON
.
toJSONString
(
iusDepartmentReq
),
log
.
error
(
"[queryDepartment] queryDepartment failed, query={}, errMsg={}"
,
JSON
.
toJSONString
(
iusDepartmentReq
),
JSON
.
toJSONString
(
response
));
JSON
.
toJSONString
(
response
));
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
CREATE_FLOW_ERROR
,
"查询部门错误"
);
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
CREATE_FLOW_ERROR
,
"查询部门错误"
);
}
}
return
map
;
}
}
}
}
\ No newline at end of file
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/task/AutoSubmit.java
View file @
81f64f17
...
@@ -7,11 +7,14 @@
...
@@ -7,11 +7,14 @@
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
task
;
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
task
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
import
com.netease.mail.yanxuan.change.biz.config.AppConfig
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeFlowExecService
;
import
com.netease.mail.yanxuan.change.common.enums.*
;
import
com.netease.mail.yanxuan.change.common.enums.*
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
@@ -27,6 +30,7 @@ import com.netease.mail.yanxuan.change.common.bean.CommonConstants;
...
@@ -27,6 +30,7 @@ import com.netease.mail.yanxuan.change.common.bean.CommonConstants;
import
com.netease.mail.yanxuan.change.common.util.DateUtils
;
import
com.netease.mail.yanxuan.change.common.util.DateUtils
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeRecord
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeRecord
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeConfigPo
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeConfigPo
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowExecVO
;
import
com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum
;
import
com.netease.mail.yanxuan.change.integration.email.enums.EmailTemplateEnum
;
import
com.netease.mail.yanxuan.dschedule.core.biz.model.ReturnT
;
import
com.netease.mail.yanxuan.dschedule.core.biz.model.ReturnT
;
import
com.netease.mail.yanxuan.dschedule.core.handler.IJobHandler
;
import
com.netease.mail.yanxuan.dschedule.core.handler.IJobHandler
;
...
@@ -59,6 +63,12 @@ public class AutoSubmit extends IJobHandler {
...
@@ -59,6 +63,12 @@ public class AutoSubmit extends IJobHandler {
@Autowired
@Autowired
private
ChangeConfigService
changeConfigService
;
private
ChangeConfigService
changeConfigService
;
@Autowired
private
ChangeFlowExecService
changeFlowExecService
;
@Autowired
private
AppConfig
appConfig
;
@Override
@Override
public
ReturnT
<
String
>
execute
(
String
...
strings
)
throws
Exception
{
public
ReturnT
<
String
>
execute
(
String
...
strings
)
throws
Exception
{
log
.
info
(
"AutoSubmit start"
);
log
.
info
(
"AutoSubmit start"
);
...
@@ -135,7 +145,15 @@ public class AutoSubmit extends IJobHandler {
...
@@ -135,7 +145,15 @@ public class AutoSubmit extends IJobHandler {
}
}
String
subjectParam
=
ChangeSubjectEnum
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
()
+
changeType
String
subjectParam
=
ChangeSubjectEnum
.
getChangeSubjectEnum
(
changeRecord
.
getChangeSubject
()).
getDesc
()
+
changeType
+
changeRecord
.
getFlowId
().
toString
();
+
changeRecord
.
getFlowId
().
toString
();
changeFlowBiz
.
qcSendEmail
(
changeRecord
.
getChangeCommander
(),
subjectParam
,
// 变更结果确认,收件人:变更负责人
List
<
String
>
receiver
=
Collections
.
singletonList
(
changeRecord
.
getChangeCommander
());
// 变更结果确认,抄送:所有行动项负责人+变更管理QM
List
<
ChangeFlowExecVO
>
execRecord
=
changeFlowExecService
.
getChangeFlowExecRecord
(
changeRecord
.
getId
());
List
<
String
>
userEmailList
=
execRecord
.
stream
().
map
(
ChangeFlowExecVO:
:
getChangeExecUserEmail
)
.
collect
(
Collectors
.
toList
());
userEmailList
.
add
(
appConfig
.
getChangeManageQM
());
changeFlowBiz
.
qcSendEmail
(
receiver
,
userEmailList
,
subjectParam
,
EmailTemplateEnum
.
YX_QC_CHANGE_AFFIRM
,
map
);
EmailTemplateEnum
.
YX_QC_CHANGE_AFFIRM
,
map
);
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
changeRecord
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
...
...
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/controller/TestController.java
View file @
81f64f17
...
@@ -113,7 +113,7 @@ public class TestController {
...
@@ -113,7 +113,7 @@ public class TestController {
String
mapToJson
=
req
.
getMapToJson
();
String
mapToJson
=
req
.
getMapToJson
();
log
.
debug
(
"[testSendEmail] subjectParam:{}, emailTemplateEnum:{}, mapToJson:{}"
,
subjectParam
,
log
.
debug
(
"[testSendEmail] subjectParam:{}, emailTemplateEnum:{}, mapToJson:{}"
,
subjectParam
,
emailTemplateEnum
,
mapToJson
);
emailTemplateEnum
,
mapToJson
);
changeFlowBiz
.
qcSendEmail
(
appConfig
.
get
SendEmail
(),
subjectParam
,
changeFlowBiz
.
qcSendEmail
(
appConfig
.
get
Receiver
(),
appConfig
.
getReceiver
(),
subjectParam
,
emailTemplateEnum
,
JSON
.
parseObject
(
mapToJson
,
Map
.
class
));
emailTemplateEnum
,
JSON
.
parseObject
(
mapToJson
,
Map
.
class
));
// 如果是供应商,再次发送供应商邮件
// 如果是供应商,再次发送供应商邮件
if
(
req
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
if
(
req
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
...
...
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