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
yx-qc-change-flow
yanxuan-qc-change-system
Commits
0f3357e5
Commit
0f3357e5
authored
Apr 25, 2023
by
胡园园
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'release-2023042501' into 'master'
分支release-2023042501已上线,自动合并到master See merge request
!22
parents
850a2fb8
1bfda8fc
Pipeline
#47793
canceled with stages
Changes
23
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
Showing
23 changed files
with
418 additions
and
138 deletions
+418
-138
application.properties
...bly/src/main/resources/config/test/application.properties
+1
-1
ChangeFlowBiz.java
...om/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
+62
-20
ChangeFlowExecService.java
...ail/yanxuan/change/biz/service/ChangeFlowExecService.java
+8
-0
ISupplierItemService.java
...mail/yanxuan/change/biz/service/ISupplierItemService.java
+3
-1
InteriorChangeConfigService.java
...nxuan/change/biz/service/InteriorChangeConfigService.java
+3
-3
ChangeFlowExecServiceImpl.java
...an/change/biz/service/impl/ChangeFlowExecServiceImpl.java
+6
-2
InteriorChangeConfigServiceImpl.java
...nge/biz/service/impl/InteriorChangeConfigServiceImpl.java
+97
-77
SupplierItemServiceImpl.java
...xuan/change/biz/service/impl/SupplierItemServiceImpl.java
+68
-13
ChangeRecord.java
.../netease/mail/yanxuan/change/dal/entity/ChangeRecord.java
+10
-0
ChangeExecRecordMapper.java
...ail/yanxuan/change/dal/mapper/ChangeExecRecordMapper.java
+3
-0
ChangeFlowCreateReq.java
...anxuan/change/dal/meta/model/req/ChangeFlowCreateReq.java
+11
-0
ChangeFlowListQueryReq.java
...uan/change/dal/meta/model/req/ChangeFlowListQueryReq.java
+14
-0
ChangeFlowSubmitReq.java
...anxuan/change/dal/meta/model/req/ChangeFlowSubmitReq.java
+12
-0
ChangeFlowVO.java
...e/mail/yanxuan/change/dal/meta/model/vo/ChangeFlowVO.java
+5
-0
ItemBasicInfoVO.java
...ail/yanxuan/change/dal/meta/model/vo/ItemBasicInfoVO.java
+5
-0
ItemSkuVO.java
...ease/mail/yanxuan/change/dal/meta/model/vo/ItemSkuVO.java
+13
-0
ItemVO.java
...netease/mail/yanxuan/change/dal/meta/model/vo/ItemVO.java
+8
-0
ChangeRecordMapper.xml
.../src/main/resources/mybatis/mapper/ChangeRecordMapper.xml
+16
-2
SupplierUserRsp.java
...change/integration/flow/supplier/rsp/SupplierUserRsp.java
+1
-1
SupplierItemSkuVO.java
...il/yanxuan/change/integration/todo/SupplierItemSkuVO.java
+22
-0
SupplierItemVO.java
.../mail/yanxuan/change/integration/todo/SupplierItemVO.java
+11
-0
ChangeFlowController.java
...l/yanxuan/change/web/controller/ChangeFlowController.java
+21
-0
SupplierController.java
...ail/yanxuan/change/web/controller/SupplierController.java
+18
-18
No files found.
yanxuan-qc-change-system-assembly/src/main/resources/config/test/application.properties
View file @
0f3357e5
...
...
@@ -43,7 +43,7 @@ spring.redis.host=10.131.99.201
spring.redis.port
=
11030
# supplier
supplier.url
=
http://127.0.0.1:8550/proxy/test
-v1
.yanxuan-supplier-ms.service.mailsaas
supplier.url
=
http://127.0.0.1:8550/proxy/test.yanxuan-supplier-ms.service.mailsaas
### des\u914D\u7F6E
# \u5BFC\u51FA\u6587\u4EF6\u4E0A\u4F20\u5230\u54EA\u4E2A\u670D\u52A1\u5668\uFF0C\u6709test\u548Conline\u53EF\u9009
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
View file @
0f3357e5
...
...
@@ -25,6 +25,8 @@ import java.util.stream.Collectors;
import
javax.servlet.http.HttpServletResponse
;
import
javax.validation.Valid
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.*
;
import
com.netease.mail.yanxuan.change.integration.rpc.RpcResultException
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.apache.poi.ss.usermodel.Workbook
;
...
...
@@ -80,14 +82,6 @@ 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.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.service.IEmailService
;
import
com.netease.mail.yanxuan.change.integration.excel.ChangeFlowExcelDTO
;
...
...
@@ -190,17 +184,21 @@ public class ChangeFlowBiz {
}
// 工单负责人
String
changeCommander
=
null
;
// 获取工单负责人
GoodsResponseRpc
goodsResponseRpc
=
null
;
try
{
goodsResponseRpc
=
interiorChangeConfigService
.
queryCommanderInfo
(
ChangeCommanderPO
.
builder
().
parentChangeClassId
(
parentChangeClassId
)
.
sonChangeClassId
(
sonChangeClassId
).
changeSupplierId
(
changeFlowCreateReq
.
getChangeSupplier
())
.
goodsInfos
(
itemIds
).
flowCreator
(
uid
).
createSource
(
changeFlowCreateReq
.
getCreateSource
())
.
supplier
(
changeFlowCreateReq
.
getSupplier
()).
build
());
changeCommander
=
goodsResponseRpc
.
getEmail
();
}
catch
(
Exception
e
)
{
log
.
error
(
"[op:queryCommanderInfo] error, goodsResponseRpc:{}, e:{}"
,
JSON
.
toJSONString
(
goodsResponseRpc
),
e
);
if
(!
CreateSourceEnum
.
TONG_ZHOU
.
getType
().
equals
(
changeFlowCreateReq
.
getCreateSource
()))
{
changeCommander
=
uid
;
}
else
{
// 获取工单负责人
GoodsResponseRpc
goodsResponseRpc
=
null
;
try
{
goodsResponseRpc
=
interiorChangeConfigService
.
queryCommanderInfo
(
ChangeCommanderPO
.
builder
().
parentChangeClassId
(
parentChangeClassId
)
.
sonChangeClassId
(
sonChangeClassId
).
changeSupplierId
(
changeFlowCreateReq
.
getChangeSupplier
())
.
goodsInfos
(
itemIds
).
flowCreator
(
uid
).
createSource
(
changeFlowCreateReq
.
getCreateSource
())
.
supplier
(
changeFlowCreateReq
.
getSupplier
()).
build
(),
changeFlowCreateReq
.
getChangeCommander
());
changeCommander
=
goodsResponseRpc
.
getEmail
();
}
catch
(
Exception
e
)
{
log
.
error
(
"[op:queryCommanderInfo] error, goodsResponseRpc:{}, e:{}"
,
JSON
.
toJSONString
(
goodsResponseRpc
),
e
);
}
}
Assert
.
notNull
(
changeCommander
,
"未查询到负责人信息"
);
// 检验是否需要资料
...
...
@@ -458,6 +456,7 @@ public class ChangeFlowBiz {
if
(
ChangeSubjectEnum
.
PRODUCT
.
getType
().
equals
(
changeFlowCreateReq
.
getChangeSubject
()))
{
// 当变更类型是商品时有值
changeRecord
.
setChangeItem
(
changeFlowCreateReq
.
getChangeItems
());
changeRecord
.
setChangeSku
(
changeFlowCreateReq
.
getChangeSkus
());
}
if
(
ChangeSubjectEnum
.
SUPPLIER
.
getType
().
equals
(
changeFlowCreateReq
.
getChangeSubject
()))
{
changeRecord
.
setChangeSupplier
(
changeFlowCreateReq
.
getChangeSupplier
());
...
...
@@ -475,6 +474,7 @@ public class ChangeFlowBiz {
changeRecord
.
setCreateTime
(
DateUtils
.
getCurrentTime
());
changeRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
changeRecord
.
setCreator
(
uid
);
changeRecord
.
setChangeProfitAmount
(
changeFlowCreateReq
.
getChangeProfitAmount
());
return
changeRecord
;
}
...
...
@@ -532,6 +532,7 @@ public class ChangeFlowBiz {
.
collect
(
Collectors
.
toList
());
changeRecord
.
setParticipateChangeExecDepartment
(
JSON
.
toJSONString
(
execDepartmentList
));
changeRecord
.
setChangeItem
(
changeFlowSubmitReq
.
getChangeItems
());
changeRecord
.
setChangeSku
(
changeFlowSubmitReq
.
getChangeSkus
());
changeRecord
.
setChangeSupplier
(
changeFlowSubmitReq
.
getChangeSupplier
());
changeRecord
.
setChangeReason
(
changeFlowSubmitReq
.
getChangeReason
());
changeRecord
.
setChangeContent
(
changeFlowSubmitReq
.
getChangeContent
());
...
...
@@ -541,6 +542,7 @@ public class ChangeFlowBiz {
changeRecord
.
setChangeProfitDesc
(
changeFlowSubmitReq
.
getChangeProfitDesc
());
changeRecord
.
setChangeConfirmResultTime
(
changeFlowSubmitReq
.
getChangeConfirmResultTime
());
changeRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
changeRecord
.
setChangeProfitAmount
(
changeFlowSubmitReq
.
getChangeProfitAmount
());
// 提交工单
String
submitNode
=
flowService
.
submitFlow
(
flowId
.
toString
(),
flowDataDTO
,
uid
,
ChangeFlowEnum
.
CHANGE_FLOW_SUBMIT
.
getTopoId
(),
JSON
.
toJSONString
(
content
),
true
,
...
...
@@ -912,10 +914,22 @@ public class ChangeFlowBiz {
List
<
ChangeFlowFile
>
changeFileList
=
changeFileService
.
getChangeFileList
(
changeRecord
.
getId
());
changeFlowVO
.
setFiles
(
changeFileList
);
changeFlowVO
.
setChangeProfit
(
changeRecord
.
getChangeProfit
());
changeFlowVO
.
setChangeProfitAmount
(
changeRecord
.
getChangeProfitAmount
());
changeFlowVO
.
setChangeProfitDesc
(
changeRecord
.
getChangeProfitDesc
());
String
itemJsonStr
=
changeRecord
.
getChangeItem
();
String
changeSkuJson
=
changeRecord
.
getChangeSku
();
if
(
StringUtils
.
isNotBlank
(
itemJsonStr
))
{
List
<
ItemVO
>
itemList
=
JSON
.
parseArray
(
itemJsonStr
,
ItemVO
.
class
);
List
<
ItemSkuVO
>
itemSkuVOS
=
new
ArrayList
<>();
if
(
StringUtils
.
isNotBlank
(
changeSkuJson
))
{
itemSkuVOS
.
addAll
(
JSON
.
parseArray
(
changeSkuJson
,
ItemSkuVO
.
class
));
}
itemList
.
forEach
(
i
->
{
Optional
<
ItemSkuVO
>
anySkuInfo
=
itemSkuVOS
.
stream
().
filter
(
s
->
s
.
getItemId
().
equals
(
i
.
getItemId
())).
findAny
();
if
(
anySkuInfo
.
isPresent
())
{
i
.
setSkuIds
(
anySkuInfo
.
get
().
getSkuId
());
}
});
changeFlowVO
.
setChangeItems
(
itemList
);
// 变更执行/结果确认/完结节点,展示变更商品基础信息
String
flowNode
=
changeRecord
.
getFlowNode
();
...
...
@@ -979,6 +993,10 @@ public class ChangeFlowBiz {
log
.
debug
(
"[detail] itemId:{}, changeGoodsPrincipalPO:{}"
,
itemId
,
JSON
.
toJSONString
(
changeGoodsPrincipalPO
));
itemBasicInfoVO
.
setChangeGoodsPrincipal
(
changeGoodsPrincipalPO
);
Optional
<
ItemVO
>
anyHasSku
=
itemList
.
stream
().
filter
(
i
->
i
.
getItemId
().
equals
(
itemId
)).
findAny
();
if
(
anyHasSku
.
isPresent
())
{
itemBasicInfoVO
.
setSkuIds
(
anyHasSku
.
get
().
getSkuIds
());
}
return
itemBasicInfoVO
;
}).
collect
(
Collectors
.
toList
());
changeFlowVO
.
setItemBasicInfoList
(
itemBasicInfoVOS
);
...
...
@@ -1055,6 +1073,18 @@ public class ChangeFlowBiz {
public
ChangeFlowListVO
query
(
Integer
page
,
Integer
pageSize
,
ChangeFlowListQueryReq
changeFlowListQueryReq
)
{
log
.
info
(
"[query] page:{}, pageSize:{}, changeFlowListQueryReq:{}"
,
page
,
pageSize
,
JSON
.
toJSONString
(
changeFlowListQueryReq
));
if
(
StringUtils
.
isNotBlank
(
changeFlowListQueryReq
.
getChangeExecUser
()))
{
List
<
Long
>
recordIds
=
changeFlowExecService
.
queryByExecUser
(
changeFlowListQueryReq
.
getChangeExecUser
());
changeFlowListQueryReq
.
setChangeRecordIds
(
recordIds
);
log
.
info
(
"recordIds: {}"
,
recordIds
);
if
(
CollectionUtils
.
isEmpty
(
recordIds
))
{
ChangeFlowListVO
changeFlowListVO
=
new
ChangeFlowListVO
();
PageVO
pageVO
=
buildPageVo
(
0L
,
pageSize
,
page
);
changeFlowListVO
.
setPageVo
(
pageVO
);
changeFlowListVO
.
setChangeFlowList
(
new
ArrayList
<>());
return
changeFlowListVO
;
}
}
//进行分页
PageHelper
.
startPage
(
page
,
pageSize
);
PageInfo
<
ChangeRecord
>
changeRecordPageInfo
=
new
PageInfo
<>(
...
...
@@ -1076,7 +1106,19 @@ public class ChangeFlowBiz {
changeFlowVO
.
setChangeCommander
(
c
.
getChangeCommander
());
String
itemJsonStr
=
c
.
getChangeItem
();
if
(
StringUtils
.
isNotBlank
(
itemJsonStr
))
{
changeFlowVO
.
setChangeItems
(
JSON
.
parseArray
(
itemJsonStr
,
ItemVO
.
class
));
List
<
ItemVO
>
itemVOS
=
JSON
.
parseArray
(
itemJsonStr
,
ItemVO
.
class
);
String
changeSkuStr
=
c
.
getChangeSku
();
if
(
StringUtils
.
isNotBlank
(
changeSkuStr
))
{
List
<
ItemSkuVO
>
itemSkuVOS
=
JSON
.
parseArray
(
changeSkuStr
,
ItemSkuVO
.
class
);
itemVOS
.
forEach
(
i
->
{
Optional
<
ItemSkuVO
>
anySkuInfo
=
itemSkuVOS
.
stream
()
.
filter
(
s
->
s
.
getItemId
().
equals
(
i
.
getItemId
())).
findAny
();
if
(
anySkuInfo
.
isPresent
())
{
i
.
setSkuIds
(
anySkuInfo
.
get
().
getSkuId
());
}
});
}
changeFlowVO
.
setChangeItems
(
itemVOS
);
}
changeFlowVO
.
setChangeSupplier
(
c
.
getChangeSupplier
());
changeFlowVO
.
setChangeState
(
c
.
getState
()
==
3
?
ChangeStatusEnum
.
IN
.
getStatus
()
:
c
.
getState
());
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/ChangeFlowExecService.java
View file @
0f3357e5
...
...
@@ -36,4 +36,11 @@ public interface ChangeFlowExecService {
Integer
deleteByChangeRecordId
(
Long
id
);
void
saveRecord
(
ChangeExecRecord
exec
);
/**
* 查询包含执行人的工单
* @param changeExecUser
* @return
*/
List
<
Long
>
queryByExecUser
(
String
changeExecUser
);
}
\ No newline at end of file
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/ISupplierItemService.java
View file @
0f3357e5
...
...
@@ -13,7 +13,9 @@ public interface ISupplierItemService {
* @param itemName
* @param page
* @param pageSize
* @param skuId
* @return
*/
SupplierItemPageVO
supplierGoodsInfoBySupplier
(
SupplierGoodsInfoReq
supplierGoodsInfoReq
,
String
itemId
,
String
itemName
,
Integer
page
,
Integer
pageSize
);
SupplierItemPageVO
supplierGoodsInfoBySupplier
(
SupplierGoodsInfoReq
supplierGoodsInfoReq
,
String
itemId
,
String
itemName
,
Integer
page
,
Integer
pageSize
,
String
skuId
);
}
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/InteriorChangeConfigService.java
View file @
0f3357e5
...
...
@@ -6,7 +6,6 @@ import java.util.Map;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeCommanderPO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeGoodsPrincipalPO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.QueryCommanderEmailReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeFlowCreateReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.rpc.CommanderResponse
;
import
com.netease.mail.yanxuan.change.dal.meta.model.rpc.GoodsResponseRpc
;
...
...
@@ -20,9 +19,10 @@ public interface InteriorChangeConfigService {
/**
* 根据变更信息 返回住变更负责人
* @param changeCommander
* @param commander
* @return
*/
GoodsResponseRpc
queryCommanderInfo
(
ChangeCommanderPO
changeCommander
);
GoodsResponseRpc
queryCommanderInfo
(
ChangeCommanderPO
changeCommander
,
String
commander
);
/**
* 传入商品列表 返回商品信息
...
...
@@ -36,6 +36,6 @@ public interface InteriorChangeConfigService {
* @param req
* @return
*/
CommanderResponse
queryCommanderEmail
(
QueryCommanderEmailReq
req
);
List
<
CommanderResponse
>
queryCommanderEmail
(
QueryCommanderEmailReq
req
);
}
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/ChangeFlowExecServiceImpl.java
View file @
0f3357e5
...
...
@@ -64,4 +64,9 @@ public class ChangeFlowExecServiceImpl implements ChangeFlowExecService {
public
void
saveRecord
(
ChangeExecRecord
exec
)
{
changeExecRecordMapper
.
insertSelective
(
exec
);
}
}
\ No newline at end of file
@Override
public
List
<
Long
>
queryByExecUser
(
String
changeExecUser
)
{
return
changeExecRecordMapper
.
queryByUser
(
"%"
+
changeExecUser
+
"%"
);
}
}
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/InteriorChangeConfigServiceImpl.java
View file @
0f3357e5
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Objects
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
org.apache.commons.collections4.CollectionUtils
;
...
...
@@ -24,11 +19,7 @@ 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.rpc.ItemcenterRpcService
;
import
com.netease.mail.yanxuan.change.common.bean.ResponseCode
;
import
com.netease.mail.yanxuan.change.common.enums.ChangeCommanderEnum
;
import
com.netease.mail.yanxuan.change.common.enums.ChangePrincipalEnum
;
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.SupplierChangePrincipalEnum
;
import
com.netease.mail.yanxuan.change.common.enums.*
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeConfig
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeCommanderPO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeGoodsPrincipalPO
;
...
...
@@ -93,10 +84,11 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
* 接口不完整,关于商品的查询已经完成 供应商查询不完整接口已对接 具体返回值接口测试未完成
*
* @param changeCommander
* @param commander
* @return
*/
@Override
public
GoodsResponseRpc
queryCommanderInfo
(
ChangeCommanderPO
changeCommander
)
{
public
GoodsResponseRpc
queryCommanderInfo
(
ChangeCommanderPO
changeCommander
,
String
commander
)
{
GoodsResponseRpc
rpc
=
new
GoodsResponseRpc
();
//获取模板名称 通过一级变更类型 二级变更类型ID 定位模板
ChangeConfig
changeConfig
=
changeConfigService
.
queryChangeType
(
changeCommander
.
getParentChangeClassId
(),
...
...
@@ -115,8 +107,10 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
//发起人;
// 如果是同舟端,发起人以商品开发兜底
if
(
changeCommander
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
return
queryChangeSupplier
(
ChangeCommanderEnum
.
SUPPLIERS_ASSOCIATED
,
changeCommander
.
getSupplier
(),
List
<
GoodsResponseRpc
>
goodsResponseRpcList
=
queryChangeSupplier
(
ChangeCommanderEnum
.
SUPPLIERS_ASSOCIATED
,
changeCommander
.
getSupplier
(),
SupplierChangePrincipalEnum
.
GOODS_BU
.
getName
());
return
goodsResponseRpcList
.
get
(
0
);
}
rpc
.
setEmail
(
changeCommander
.
getFlowCreator
());
return
rpc
;
...
...
@@ -127,13 +121,27 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
return
rpc
;
}
if
(
Objects
.
equals
(
ChangeSubjectEnum
.
PRODUCT
.
getType
(),
changeConfig
.
getChangeSubject
()))
{
if
(
ChangeCommanderEnum
.
GOODS_ASSOCIATED
.
equals
(
changeCommanderEnum
)
&&
SupplierChangePrincipalEnum
.
PURCHASE
.
getName
().
equals
(
changeConfig
.
getChangeCommander
()))
{
GoodsResponseRpc
goodsResponseRpc
=
new
GoodsResponseRpc
();
goodsResponseRpc
.
setEmail
(
commander
);
return
goodsResponseRpc
;
}
//商品变更
return
queryGoodsCommander
(
changeCommanderEnum
,
changeCommander
.
getGoodsInfos
(),
changeConfig
.
getChangeCommander
());
List
<
GoodsResponseRpc
>
goodsResponseRpcList
=
queryGoodsCommander
(
changeCommanderEnum
,
changeCommander
.
getGoodsInfos
(),
changeConfig
.
getChangeCommander
());
return
goodsResponseRpcList
.
get
(
0
);
}
else
if
(
Objects
.
equals
(
ChangeSubjectEnum
.
SUPPLIER
.
getType
(),
changeConfig
.
getChangeSubject
()))
{
if
(
ChangeCommanderEnum
.
SUPPLIERS_ASSOCIATED
.
equals
(
changeCommanderEnum
)
&&
SupplierChangePrincipalEnum
.
PURCHASE
.
getName
().
equals
(
changeConfig
.
getChangeCommander
()))
{
GoodsResponseRpc
goodsResponseRpc
=
new
GoodsResponseRpc
();
goodsResponseRpc
.
setEmail
(
commander
);
return
goodsResponseRpc
;
}
//供应商 采购 计划 SQE
return
queryChangeSupplier
(
changeCommanderEnum
,
changeCommander
.
getChangeSupplierId
(),
changeConfig
.
getChangeCommander
());
List
<
GoodsResponseRpc
>
goodsResponseRpcList
=
queryChangeSupplier
(
changeCommanderEnum
,
changeCommander
.
getChangeSupplierId
(),
changeConfig
.
getChangeCommander
());
return
goodsResponseRpcList
.
get
(
0
);
}
//其他变更 备注 其他变更之后固定人 和发起人在上面判断会被排除掉 changeConfig.getChangeCommander();
return
null
;
...
...
@@ -150,17 +158,12 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
* 商品的关联角色 ChangeCommanderEnum
* @return
*/
private
GoodsResponseRpc
queryGoodsCommander
(
ChangeCommanderEnum
commanderEnum
,
List
<
Long
>
goodsInfos
,
private
List
<
GoodsResponseRpc
>
queryGoodsCommander
(
ChangeCommanderEnum
commanderEnum
,
List
<
Long
>
goodsInfos
,
String
commander
)
{
if
(!
commanderEnum
.
getId
().
equals
(
ChangeCommanderEnum
.
GOODS_ASSOCIATED
.
getId
())
||
CollectionUtils
.
isEmpty
(
goodsInfos
)
||
commander
==
null
)
{
return
null
;
}
Map
<
String
,
GoodsResponseRpc
>
map
=
new
HashMap
<
String
,
GoodsResponseRpc
>();
//记录最大出现次数
int
temp
=
0
;
//记录最大值
GoodsResponseRpc
responseRpc
=
new
GoodsResponseRpc
();
//记录出现的所有值
List
<
GoodsResponseRpc
>
emails
=
new
ArrayList
<
GoodsResponseRpc
>();
//遍历取出所有商品关联的人
...
...
@@ -203,30 +206,24 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
}
}
//逻辑发生变更
for
(
GoodsResponseRpc
email:
emails
)
{
if
(!
map
.
containsKey
(
email
.
getName
()))
{
email
.
setOccurrenceNumber
(
1
);
}
else
{
GoodsResponseRpc
goodsResponseRpc
=
map
.
get
(
email
.
getName
());
email
.
setOccurrenceNumber
(
goodsResponseRpc
.
getOccurrenceNumber
()
+
1
);
if
(
temp
<
goodsResponseRpc
.
getOccurrenceNumber
())
{
temp
=
goodsResponseRpc
.
getOccurrenceNumber
();
responseRpc
=
goodsResponseRpc
;
}
}
map
.
put
(
email
.
getName
(),
email
);
}
if
(
responseRpc
.
getName
()
==
null
)
{
Iterator
<
GoodsResponseRpc
>
iterator
=
map
.
values
().
iterator
();
responseRpc
=
iterator
.
next
();
}
if
(
StringUtils
.
isBlank
(
responseRpc
.
getEmail
()))
{
/*
* for (GoodsResponseRpc email: emails) { if (!map.containsKey(email.getName())) { email.setOccurrenceNumber(1);
* } else { GoodsResponseRpc goodsResponseRpc = map.get(email.getName());
* email.setOccurrenceNumber(goodsResponseRpc.getOccurrenceNumber() + 1); if (temp <
* goodsResponseRpc.getOccurrenceNumber()) { temp = goodsResponseRpc.getOccurrenceNumber(); responseRpc =
* goodsResponseRpc; } } map.put(email.getName(), email); } if (responseRpc.getName() == null) {
* Iterator<GoodsResponseRpc> iterator = map.values().iterator(); responseRpc = iterator.next(); }
*/
if
(
CollectionUtils
.
isEmpty
(
emails
))
{
//记录最大值
GoodsResponseRpc
responseRpc
=
new
GoodsResponseRpc
();
Integer
byType
=
ChangePrincipalEnum
.
getByType
(
commander
);
if
(
null
!=
byType
)
{
this
.
goodsGetEmail
(
responseRpc
,
byType
);
}
emails
.
add
(
responseRpc
);
}
return
responseRpc
;
return
emails
;
}
/**
...
...
@@ -240,9 +237,9 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
* 供应商关联角色
* @return
*/
private
GoodsResponseRpc
queryChangeSupplier
(
ChangeCommanderEnum
commanderEnum
,
String
changeSupplierId
,
private
List
<
GoodsResponseRpc
>
queryChangeSupplier
(
ChangeCommanderEnum
commanderEnum
,
String
changeSupplierId
,
String
commander
)
{
GoodsResponseRpc
goodsResponseRpc
=
new
GoodsResponseRpc
();
List
<
GoodsResponseRpc
>
goodsResponseRpcList
=
new
ArrayList
<>
();
if
(!
commanderEnum
.
getId
().
equals
(
ChangeCommanderEnum
.
SUPPLIERS_ASSOCIATED
.
getId
())
||
changeSupplierId
==
null
||
commander
==
null
)
{
return
null
;
...
...
@@ -268,17 +265,24 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
List
<
SupplierUserRsp
>
listAjaxResponse
=
supplierInfoService
.
querySupplierRelatedUser
(
req
);
log
.
debug
(
"[querySupplierRelatedUser] response:{}"
,
JSON
.
toJSONString
(
listAjaxResponse
));
if
(!
CollectionUtils
.
isEmpty
(
listAjaxResponse
))
{
SupplierUserRsp
supplierUserRsp
=
listAjaxResponse
.
get
(
0
);
Map
<
String
,
String
>
uid2NameMap
=
supplierUserRsp
.
getUid2NameMap
();
for
(
String
key
:
uid2NameMap
.
keySet
())
{
goodsResponseRpc
.
setName
(
uid2NameMap
.
get
(
key
));
goodsResponseRpc
.
setEmail
(
key
);
Optional
<
SupplierUserRsp
>
anySupplierUser
=
listAjaxResponse
.
stream
()
.
filter
(
i
->
i
.
getSupplierId
().
equals
(
changeSupplierId
)).
findAny
();
if
(
anySupplierUser
.
isPresent
())
{
Map
<
String
,
String
>
uid2NameMap
=
anySupplierUser
.
get
().
getUid2NameMap
();
for
(
String
key:
uid2NameMap
.
keySet
())
{
GoodsResponseRpc
goodsResponseRpc
=
new
GoodsResponseRpc
();
goodsResponseRpc
.
setName
(
uid2NameMap
.
get
(
key
));
goodsResponseRpc
.
setEmail
(
key
);
goodsResponseRpcList
.
add
(
goodsResponseRpc
);
}
}
}
if
(
StringUtils
.
isBlank
(
goodsResponseRpc
.
getEmail
()))
{
if
(
CollectionUtils
.
isEmpty
(
goodsResponseRpcList
))
{
GoodsResponseRpc
goodsResponseRpc
=
new
GoodsResponseRpc
();
this
.
getEmail
(
goodsResponseRpc
,
req
.
getSearchType
());
goodsResponseRpcList
.
add
(
goodsResponseRpc
);
}
return
goodsResponseRpc
;
return
goodsResponseRpc
List
;
}
/**
...
...
@@ -320,7 +324,7 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
@Override
public
Map
<
Long
,
ChangeGoodsPrincipalPO
>
queryGoodsPrincipalInfo
(
List
<
Long
>
itemIds
)
{
Map
<
Long
,
ChangeGoodsPrincipalPO
>
map
=
new
HashMap
<>();
for
(
Long
itemId
:
itemIds
)
{
for
(
Long
itemId:
itemIds
)
{
map
.
put
(
itemId
,
new
ChangeGoodsPrincipalPO
());
}
//商品BU
...
...
@@ -334,14 +338,16 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
//商品采购
String
GoodsPurchase
=
supplierSendService
.
queryGoodsPurchase
(
itemIds
);
JSONObject
jsonObject
=
JSONObject
.
parseObject
(
GoodsPurchase
);
List
<
GoodsPurchaseRpc
>
purchaseRpcs
=
JSONObject
.
parseArray
(
jsonObject
.
get
(
"data"
).
toString
(),
GoodsPurchaseRpc
.
class
);
for
(
GoodsPurchaseRpc
rpc
:
purchaseRpcs
)
{
List
<
GoodsPurchaseRpc
>
purchaseRpcs
=
JSONObject
.
parseArray
(
jsonObject
.
get
(
"data"
).
toString
(),
GoodsPurchaseRpc
.
class
);
for
(
GoodsPurchaseRpc
rpc:
purchaseRpcs
)
{
map
.
get
(
rpc
.
getItemId
().
longValue
()).
setPurchaseName
(
rpc
.
getSupplierTraceBusinessName
());
map
.
get
(
rpc
.
getItemId
().
longValue
()).
setPurchaseEmail
(
rpc
.
getSupplierTraceBusiness
());
goodsRpc
(
ChangePrincipalEnum
.
PURCHASE
.
getType
(),
rpc
.
getSupplierTraceBusinessName
(),
map
.
get
(
rpc
.
getItemId
().
longValue
()));
goodsRpc
(
ChangePrincipalEnum
.
PURCHASE
.
getType
(),
rpc
.
getSupplierTraceBusinessName
(),
map
.
get
(
rpc
.
getItemId
().
longValue
()));
}
//SQE
for
(
Long
itemId
:
itemIds
)
{
for
(
Long
itemId:
itemIds
)
{
String
sqe
=
qcApiRpcService
.
getDetail
(
itemId
.
intValue
());
logger
.
info
(
"[queryGoodsPrincipalInfo] sqe:{}"
,
sqe
);
JSONObject
jsonObject1
=
JSONObject
.
parseObject
(
sqe
);
...
...
@@ -357,61 +363,75 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
}
@Override
public
CommanderResponse
queryCommanderEmail
(
QueryCommanderEmailReq
req
)
{
public
List
<
CommanderResponse
>
queryCommanderEmail
(
QueryCommanderEmailReq
req
)
{
Integer
changeExecUserType
=
req
.
getChangeExecUserType
();
String
changeExecUser
=
req
.
getChangeExecUser
();
ChangeCommanderEnum
changeCommanderEnum
=
ChangeCommanderEnum
.
getChangeCommanderEnum
(
changeExecUserType
);
log
.
info
(
"[queryCommanderEmail] req:{},changeCommanderEnum:{}"
,
JSON
.
toJSONString
(
req
),
changeCommanderEnum
);
Assert
.
notNull
(
changeCommanderEnum
,
"变更负责人类型错误"
);
CommanderResponse
commanderResponse
=
new
CommanderResponse
();
switch
(
changeCommanderEnum
)
{
case
COMMANDER_ORIGINATOR:
// 如果是同舟端,发起人以商品开发兜底
if
(
req
.
getCreateSource
().
equals
(
CreateSourceEnum
.
TONG_ZHOU
.
getType
()))
{
List
<
CommanderResponse
>
commanderResponseList
=
new
ArrayList
<>();
try
{
GoodsResponseRpc
goodsResponseRpc
=
queryChangeSupplier
(
List
<
GoodsResponseRpc
>
goodsResponseRpcList
=
queryChangeSupplier
(
ChangeCommanderEnum
.
SUPPLIERS_ASSOCIATED
,
req
.
getChangeSupplier
(),
SupplierChangePrincipalEnum
.
GOODS_BU
.
getName
());
commanderResponse
.
setName
(
goodsResponseRpc
.
getName
());
commanderResponse
.
setEmail
(
goodsResponseRpc
.
getEmail
());
goodsResponseRpcList
.
forEach
(
i
->
{
CommanderResponse
commanderResponse
=
new
CommanderResponse
();
commanderResponse
.
setName
(
i
.
getName
());
commanderResponse
.
setEmail
(
i
.
getEmail
());
commanderResponseList
.
add
(
commanderResponse
);
});
}
catch
(
Exception
e
)
{
log
.
error
(
"[queryCommanderEmail] goodsResponseRpc error,e{}"
,
e
);
}
return
commanderResponse
;
return
commanderResponse
List
;
}
else
{
return
n
ull
;
return
n
ew
ArrayList
<>()
;
}
case
FIXED_PERSON:
return
n
ull
;
return
n
ew
ArrayList
<>()
;
case
GOODS_ASSOCIATED:
String
changeItems
=
req
.
getChangeItems
();
Assert
.
isTrue
(
StringUtils
.
isNotBlank
(
changeItems
),
"变更负责人为商品时,商品列表不可为空"
);
List
<
ItemVO
>
itemVOS
=
JSON
.
parseArray
(
changeItems
,
ItemVO
.
class
);
List
<
Long
>
itemIdList
=
itemVOS
.
stream
().
map
(
ItemVO:
:
getItemId
).
collect
(
Collectors
.
toList
());
List
<
CommanderResponse
>
commanderResponseList
=
new
ArrayList
<>();
try
{
GoodsResponseRpc
goodsResponseRpc
=
queryGoodsCommander
(
changeCommanderEnum
,
itemIdList
,
List
<
GoodsResponseRpc
>
goodsResponseRpcList
=
queryGoodsCommander
(
changeCommanderEnum
,
itemIdList
,
changeExecUser
);
log
.
info
(
"[queryCommanderEmail] queryGoodsCommander:{}"
,
JSON
.
toJSONString
(
goodsResponseRpc
));
commanderResponse
.
setName
(
goodsResponseRpc
.
getName
());
commanderResponse
.
setEmail
(
goodsResponseRpc
.
getEmail
());
log
.
info
(
"[queryCommanderEmail] queryGoodsCommander:{}"
,
JSON
.
toJSONString
(
goodsResponseRpcList
));
goodsResponseRpcList
.
forEach
(
i
->
{
CommanderResponse
commanderResponse
=
new
CommanderResponse
();
commanderResponse
.
setName
(
i
.
getName
());
commanderResponse
.
setEmail
(
i
.
getEmail
());
commanderResponseList
.
add
(
commanderResponse
);
});
}
catch
(
Exception
e
)
{
log
.
error
(
"[queryGoodsCommander] error,e{}"
,
e
);
}
return
commanderResponse
;
return
commanderResponse
List
;
case
SUPPLIERS_ASSOCIATED:
String
changeSupplier
=
req
.
getChangeSupplier
();
Assert
.
isTrue
(
StringUtils
.
isNotBlank
(
changeSupplier
),
"变更负责人为供应商时,供应商不可为空"
);
List
<
CommanderResponse
>
commanderSupplierResponseList
=
new
ArrayList
<>();
try
{
GoodsResponseRpc
supplierResponseRpc
=
queryChangeSupplier
(
changeCommanderEnum
,
changeSupplier
,
changeExecUser
);
log
.
debug
(
"[queryCommanderEmail] queryChangeSupplier:{}"
,
JSON
.
toJSONString
(
supplierResponseRpc
));
commanderResponse
.
setName
(
supplierResponseRpc
.
getName
());
commanderResponse
.
setEmail
(
supplierResponseRpc
.
getEmail
());
List
<
GoodsResponseRpc
>
supplierResponseRpcList
=
queryChangeSupplier
(
changeCommanderEnum
,
changeSupplier
,
changeExecUser
);
log
.
debug
(
"[queryCommanderEmail] queryChangeSupplier:{}"
,
JSON
.
toJSONString
(
supplierResponseRpcList
));
supplierResponseRpcList
.
forEach
(
i
->
{
CommanderResponse
commanderResponse
=
new
CommanderResponse
();
commanderResponse
.
setName
(
i
.
getName
());
commanderResponse
.
setEmail
(
i
.
getEmail
());
commanderSupplierResponseList
.
add
(
commanderResponse
);
});
}
catch
(
Exception
e
)
{
log
.
error
(
"[queryChangeSupplier] error,e{}"
,
e
);
}
return
commander
Response
;
return
commander
SupplierResponseList
;
default
:
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
COMMANDER_TYPE_NOT_EXIST
,
"变更负责人类型错误"
);
}
...
...
@@ -461,7 +481,7 @@ public class InteriorChangeConfigServiceImpl implements InteriorChangeConfigServ
}
private
void
getGoodsPrincipalNameEmailV2
(
Map
<
Long
,
ChangeGoodsPrincipalPO
>
map
,
List
<
ItemManagerTO
>
product
)
{
for
(
ItemManagerTO
rpc
:
product
)
{
for
(
ItemManagerTO
rpc:
product
)
{
ChangeGoodsPrincipalPO
goodsRpc
=
map
.
get
(
rpc
.
getItemId
());
String
uid
=
null
;
try
{
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/SupplierItemServiceImpl.java
View file @
0f3357e5
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Optional
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
com.netease.mail.yanxuan.change.biz.service.ISupplierItemService
;
import
com.netease.mail.yanxuan.change.common.bean.AjaxResult
;
import
com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplierSendService
;
import
com.netease.mail.yanxuan.change.integration.flow.supplier.req.SupplierGoodsInfoReq
;
import
com.netease.mail.yanxuan.change.integration.flow.supplier.rsp.SupplierGoodsInfoRsp
;
import
com.netease.mail.yanxuan.change.integration.item.ItemRpcService
;
import
com.netease.mail.yanxuan.change.integration.item.meta.SkuSpecTO
;
import
com.netease.mail.yanxuan.change.integration.item.meta.SkuSpecValueTO
;
import
com.netease.mail.yanxuan.change.integration.item.meta.SkuTo
;
import
com.netease.mail.yanxuan.change.integration.item.meta.SpuTO
;
import
com.netease.mail.yanxuan.change.integration.item.param.BatchQuerySpuInfoParam
;
import
com.netease.mail.yanxuan.change.integration.todo.PageVO
;
import
com.netease.mail.yanxuan.change.integration.todo.SupplierItemPageVO
;
import
com.netease.mail.yanxuan.change.integration.todo.SupplierItemSkuVO
;
import
com.netease.mail.yanxuan.change.integration.todo.SupplierItemVO
;
import
com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Set
;
import
java.util.stream.Collectors
;
import
lombok.extern.slf4j.Slf4j
;
@Service
@Slf4j
public
class
SupplierItemServiceImpl
implements
ISupplierItemService
{
@Autowired
...
...
@@ -32,15 +41,22 @@ public class SupplierItemServiceImpl implements ISupplierItemService {
private
ItemRpcService
itemRpcService
;
@Override
public
SupplierItemPageVO
supplierGoodsInfoBySupplier
(
SupplierGoodsInfoReq
supplierGoodsInfoReq
,
String
itemId
,
String
itemName
,
Integer
page
,
Integer
pageSize
)
{
AjaxResponse
<
List
<
SupplierGoodsInfoRsp
>>
listAjaxResponse
=
flowRpcSupplierSendService
.
supplierGoodsInfoBySupplier
(
supplierGoodsInfoReq
);
public
SupplierItemPageVO
supplierGoodsInfoBySupplier
(
SupplierGoodsInfoReq
supplierGoodsInfoReq
,
String
itemId
,
String
itemName
,
Integer
page
,
Integer
pageSize
,
String
skuId
)
{
AjaxResponse
<
List
<
SupplierGoodsInfoRsp
>>
listAjaxResponse
=
flowRpcSupplierSendService
.
supplierGoodsInfoBySupplier
(
supplierGoodsInfoReq
);
List
<
SupplierGoodsInfoRsp
>
data
=
listAjaxResponse
.
getData
();
List
<
SpuTO
>
spuTOList
=
new
ArrayList
<>();
if
(
data
!=
null
)
{
Set
<
Long
>
fullItemIds
=
data
.
stream
().
map
(
SupplierGoodsInfoRsp:
:
getItemId
).
collect
(
Collectors
.
toSet
());
log
.
debug
(
"[op:supplierGoodsInfoBySupplier] fullItemIds: {}"
,
fullItemIds
);
while
(
fullItemIds
.
size
()
>
200
)
{
List
<
Long
>
itemIds
=
new
ArrayList
<>(
fullItemIds
).
subList
(
0
,
200
);
AjaxResult
<
List
<
SpuTO
>>
listAjaxResult
=
itemRpcService
.
batchQuerySpuInfo
(
BatchQuerySpuInfoParam
.
builder
().
ids
(
itemIds
).
build
());
List
<
String
>
commonProps
=
new
ArrayList
<>();
commonProps
.
add
(
"sku"
);
commonProps
.
add
(
"skuSpec"
);
AjaxResult
<
List
<
SpuTO
>>
listAjaxResult
=
itemRpcService
.
batchQuerySpuInfo
(
BatchQuerySpuInfoParam
.
builder
().
ids
(
itemIds
).
commonProps
(
commonProps
).
build
());
List
<
SpuTO
>
pageSpuTo
=
listAjaxResult
.
getData
();
if
(!
CollectionUtils
.
isEmpty
(
pageSpuTo
))
{
spuTOList
.
addAll
(
pageSpuTo
);
...
...
@@ -48,18 +64,30 @@ public class SupplierItemServiceImpl implements ISupplierItemService {
fullItemIds
.
removeAll
(
itemIds
);
}
List
<
Long
>
itemIds
=
new
ArrayList
<>(
fullItemIds
);
AjaxResult
<
List
<
SpuTO
>>
listAjaxResult
=
itemRpcService
.
batchQuerySpuInfo
(
BatchQuerySpuInfoParam
.
builder
().
ids
(
itemIds
).
build
());
AjaxResult
<
List
<
SpuTO
>>
listAjaxResult
=
itemRpcService
.
batchQuerySpuInfo
(
BatchQuerySpuInfoParam
.
builder
().
ids
(
itemIds
).
build
());
List
<
SpuTO
>
pageSpuTo
=
listAjaxResult
.
getData
();
if
(!
CollectionUtils
.
isEmpty
(
pageSpuTo
))
{
spuTOList
.
addAll
(
pageSpuTo
);
}
}
if
(
StringUtils
.
isNotBlank
(
itemId
))
{
spuTOList
=
spuTOList
.
stream
().
filter
(
i
->
Long
.
valueOf
(
itemId
).
equals
(
i
.
getId
())).
collect
(
Collectors
.
toList
());
spuTOList
=
spuTOList
.
stream
().
filter
(
i
->
Long
.
valueOf
(
itemId
).
equals
(
i
.
getId
()))
.
collect
(
Collectors
.
toList
());
}
if
(
StringUtils
.
isNotBlank
(
itemName
))
{
spuTOList
=
spuTOList
.
stream
().
filter
(
i
->
i
.
getName
().
contains
(
itemName
)).
collect
(
Collectors
.
toList
());
}
if
(
StringUtils
.
isNotBlank
(
skuId
))
{
spuTOList
=
spuTOList
.
stream
().
filter
(
obj
->
!
CollectionUtils
.
isEmpty
(
obj
.
getSkuList
())).
filter
(
i
->
{
List
<
Long
>
skuIds
=
i
.
getSkuList
().
stream
().
map
(
SkuTo:
:
getId
).
collect
(
Collectors
.
toList
());
if
(
skuIds
.
contains
(
Long
.
valueOf
(
skuId
)))
{
return
Boolean
.
TRUE
;
}
else
{
return
Boolean
.
FALSE
;
}
}).
collect
(
Collectors
.
toList
());
}
PageVO
pageVO
=
buildPageVo
(
spuTOList
.
size
(),
page
,
pageSize
);
Integer
endIndex
=
page
*
pageSize
;
if
(
page
*
pageSize
>
spuTOList
.
size
())
{
...
...
@@ -70,8 +98,35 @@ public class SupplierItemServiceImpl implements ISupplierItemService {
SupplierItemVO
supplierItemVO
=
new
SupplierItemVO
();
supplierItemVO
.
setItemId
(
i
.
getId
());
supplierItemVO
.
setItemName
(
i
.
getName
());
supplierItemVO
.
setSpecList
(
i
.
getSpecList
());
List
<
SupplierItemSkuVO
>
skuVOList
=
i
.
getSkuList
().
stream
().
map
(
s
->
{
SupplierItemSkuVO
supplierItemSkuVO
=
new
SupplierItemSkuVO
();
supplierItemSkuVO
.
setSkuId
(
s
.
getId
());
supplierItemSkuVO
.
setSkuName
(
s
.
getDisplayName
());
supplierItemSkuVO
.
setSkuSpecCombine
(
s
.
getSkuSpecCombine
());
return
supplierItemSkuVO
;
}).
collect
(
Collectors
.
toList
());
supplierItemVO
.
setSkuInfoVOS
(
skuVOList
);
return
supplierItemVO
;
}).
collect
(
Collectors
.
toList
());
supplierItemVOList
.
forEach
(
i
->
{
List
<
SkuSpecTO
>
specList
=
i
.
getSpecList
();
i
.
getSkuInfoVOS
().
forEach
(
s
->
{
StringBuilder
displayString
=
new
StringBuilder
();
s
.
getSkuSpecCombine
().
forEach
(
spec
->
{
Optional
<
SkuSpecTO
>
any
=
specList
.
stream
().
filter
(
sp
->
sp
.
getId
()
==
spec
.
getSkuSpecId
())
.
findAny
();
if
(
any
.
isPresent
())
{
Optional
<
SkuSpecValueTO
>
anySpecValue
=
any
.
get
().
getSpecValueList
().
stream
()
.
filter
(
speValue
->
speValue
.
getId
()
==
spec
.
getSkuSpecValueId
()).
findAny
();
anySpecValue
.
ifPresent
(
skuSpecValueTO
->
displayString
.
append
(
skuSpecValueTO
.
getValue
()));
}
});
s
.
setDisplayString
(
displayString
.
toString
());
});
});
return
SupplierItemPageVO
.
builder
().
pageVo
(
pageVO
).
supplierItemVOList
(
supplierItemVOList
).
build
();
}
...
...
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/entity/ChangeRecord.java
View file @
0f3357e5
...
...
@@ -83,6 +83,11 @@ public class ChangeRecord {
private
String
changeItem
;
/**
* 变更sku
*/
private
String
changeSku
;
/**
* 变更供应商(变更主体为供应商时有效)
*/
private
String
changeSupplier
;
...
...
@@ -173,6 +178,11 @@ public class ChangeRecord {
private
Integer
autoSubmitEmail
;
/**
* 变更收益金额
*/
private
String
changeProfitAmount
;
/**
* 创建时间
*/
private
Long
createTime
;
...
...
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/mapper/ChangeExecRecordMapper.java
View file @
0f3357e5
...
...
@@ -36,4 +36,7 @@ public interface ChangeExecRecordMapper extends tk.mybatis.mapper.common.Mapper<
@Delete
(
"delete from TB_YX_QC_CHANGE_EXEC_RECORD where change_record_id = #{changeRecordId}"
)
Integer
deleteByBaseId
(
@Param
(
"changeRecordId"
)
Long
changeRecordId
);
@Select
(
"SELECT DISTINCT(change_record_id) FROM TB_YX_QC_CHANGE_EXEC_RECORD WHERE change_exec_user_email LIKE #{changeExecUser}"
)
List
<
Long
>
queryByUser
(
@Param
(
"changeExecUser"
)
String
changeExecUser
);
}
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/req/ChangeFlowCreateReq.java
View file @
0f3357e5
...
...
@@ -63,6 +63,11 @@ public class ChangeFlowCreateReq {
private
String
changeItems
;
/**
* 变更sku信息
*/
private
String
changeSkus
;
/**
* 变更供应商
*/
private
String
changeSupplier
;
...
...
@@ -142,4 +147,9 @@ public class ChangeFlowCreateReq {
* 同舟用户所属供应商
*/
private
String
supplier
;
/**
* 变更收益金额
*/
private
String
changeProfitAmount
;
}
\ No newline at end of file
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/req/ChangeFlowListQueryReq.java
View file @
0f3357e5
...
...
@@ -10,6 +10,8 @@ import com.netease.mail.yanxuan.change.common.enums.CreateSourceEnum;
import
lombok.Data
;
import
java.util.List
;
/**
* @Author zcwang
* @Date 2022/11/21
...
...
@@ -21,6 +23,8 @@ public class ChangeFlowListQueryReq {
*/
private
String
itemId
;
private
String
skuId
;
/**
* 变更供应商(变更主体为供应商时有效)
*/
...
...
@@ -78,6 +82,16 @@ public class ChangeFlowListQueryReq {
private
String
createSupplier
;
/**
* 变更执行人
*/
private
String
changeExecUser
;
/**
* 变更记录id集合
*/
private
List
<
Long
>
changeRecordIds
;
/**
* 工单id
*/
private
Long
flowId
;
...
...
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/req/ChangeFlowSubmitReq.java
View file @
0f3357e5
...
...
@@ -45,6 +45,12 @@ public class ChangeFlowSubmitReq {
* 变更商品
*/
private
String
changeItems
;
/**
* 变更sku信息
*/
private
String
changeSkus
;
/**
* 变更供应商
*/
...
...
@@ -109,4 +115,9 @@ public class ChangeFlowSubmitReq {
* 备注
*/
private
String
remark
;
/**
* 变更收益金额
*/
private
String
changeProfitAmount
;
}
\ No newline at end of file
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/vo/ChangeFlowVO.java
View file @
0f3357e5
...
...
@@ -106,6 +106,11 @@ public class ChangeFlowVO {
* 变更收益说明
*/
private
String
changeProfitDesc
;
/**
* 变更收益金额
*/
private
String
changeProfitAmount
;
/**
* 变更商品列表
*/
...
...
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/vo/ItemBasicInfoVO.java
View file @
0f3357e5
...
...
@@ -58,4 +58,8 @@ public class ItemBasicInfoVO {
*/
private
ChangeGoodsPrincipalPO
changeGoodsPrincipal
;
/**
* 商品sku
*/
private
List
<
String
>
skuIds
;
}
\ No newline at end of file
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/vo/ItemSkuVO.java
0 → 100644
View file @
0f3357e5
package
com
.
netease
.
mail
.
yanxuan
.
change
.
dal
.
meta
.
model
.
vo
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
ItemSkuVO
{
private
Long
itemId
;
private
List
<
String
>
skuId
;
}
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/vo/ItemVO.java
View file @
0f3357e5
...
...
@@ -8,6 +8,8 @@ package com.netease.mail.yanxuan.change.dal.meta.model.vo;
import
lombok.Data
;
import
java.util.List
;
/**
* @Author zcwang
* @Date 2022/11/21
...
...
@@ -24,4 +26,9 @@ public class ItemVO {
* 商品名
*/
private
String
itemName
;
/**
* 商品sku
*/
private
List
<
String
>
skuIds
;
}
\ No newline at end of file
yanxuan-qc-change-system-dal/src/main/resources/mybatis/mapper/ChangeRecordMapper.xml
View file @
0f3357e5
...
...
@@ -13,6 +13,7 @@
<result
column=
"change_department"
jdbcType=
"VARCHAR"
property=
"changeDepartment"
/>
<result
column=
"participate_change_exec_department"
jdbcType=
"VARCHAR"
property=
"participateChangeExecDepartment"
/>
<result
column=
"change_item"
jdbcType=
"VARCHAR"
property=
"changeItem"
/>
<result
column=
"change_sku"
jdbcType=
"VARCHAR"
property=
"changeSku"
/>
<result
column=
"change_supplier"
jdbcType=
"VARCHAR"
property=
"changeSupplier"
/>
<result
column=
"change_reason"
jdbcType=
"VARCHAR"
property=
"changeReason"
/>
<result
column=
"change_content"
jdbcType=
"VARCHAR"
property=
"changeContent"
/>
...
...
@@ -27,6 +28,7 @@
<result
column=
"create_source"
jdbcType=
"INTEGER"
property=
"createSource"
/>
<result
column=
"create_supplier"
jdbcType=
"VARCHAR"
property=
"createSupplier"
/>
<result
column=
"change_result_desc"
jdbcType=
"VARCHAR"
property=
"changeResultDesc"
/>
<result
column=
"change_profit_amount"
jdbcType=
"VARCHAR"
property=
"changeProfitAmount"
/>
<result
column=
"remark"
jdbcType=
"VARCHAR"
property=
"remark"
/>
<result
column=
"creator"
jdbcType=
"VARCHAR"
property=
"creator"
/>
<result
column=
"create_time"
jdbcType=
"BIGINT"
property=
"createTime"
/>
...
...
@@ -35,9 +37,9 @@
<sql
id=
"Base_Column_List"
>
id, flow_id, flow_node, change_subject, parent_change_class_id, son_change_class_id,
change_level, change_commander, change_department, participate_change_exec_department,
change_item, change_supplier, change_reason, change_content, change_risk_desc, change_checking,
change_item, change_s
ku, change_s
upplier, change_reason, change_content, change_risk_desc, change_checking,
change_profit, change_profit_desc, change_confirm_result_time, `state`, cancel_reason,
change_result, create_source, create_supplier, change_result_desc, remark, creator,
change_result, create_source, create_supplier, change_result_desc, remark, creator,
change_profit_amount,
create_time, update_time
</sql>
...
...
@@ -51,6 +53,9 @@
<if
test=
"itemId != null "
>
and change_item like concat('%',#{itemId},'%')
</if>
<if
test=
"skuId != null "
>
and change_sku like concat('%',#{skuId},'%')
</if>
<if
test=
"supplier != null "
>
and change_supplier = #{supplier}
</if>
...
...
@@ -84,6 +89,12 @@
<if
test=
"flowId != null"
>
and flow_id = #{flowId}
</if>
<if
test=
"changeRecordIds != null and changeRecordIds.size() > 0"
>
and id in
<foreach
collection=
"changeRecordIds"
close=
")"
open=
"("
item=
"item"
separator=
","
>
${item}
</foreach>
</if>
</where>
order by create_time desc
</select>
...
...
@@ -98,6 +109,9 @@
<if
test=
"itemId != null "
>
and change_item like concat('%',#{itemId},'%')
</if>
<if
test=
"skuId != null "
>
and change_sku like concat('%',#{skuId},'%')
</if>
<if
test=
"supplier != null "
>
and change_supplier = #{supplier}
</if>
...
...
yanxuan-qc-change-system-integration/src/main/java/com/netease/mail/yanxuan/change/integration/flow/supplier/rsp/SupplierUserRsp.java
View file @
0f3357e5
...
...
@@ -17,7 +17,7 @@ public class SupplierUserRsp {
private
String
supplierId
;
/**
*
角色ID(1-采购 2-计划 3-SQE 4-商品开发) 以及名称
*
key:邮箱 value:姓名
*/
private
Map
<
String
,
String
>
uid2NameMap
;
...
...
yanxuan-qc-change-system-integration/src/main/java/com/netease/mail/yanxuan/change/integration/todo/SupplierItemSkuVO.java
0 → 100644
View file @
0f3357e5
package
com
.
netease
.
mail
.
yanxuan
.
change
.
integration
.
todo
;
import
com.netease.mail.yanxuan.change.integration.item.meta.SkuSpecCombineTO
;
import
lombok.Data
;
import
java.util.List
;
@Data
public
class
SupplierItemSkuVO
{
private
Long
skuId
;
private
String
skuName
;
/**
* 规格描述
*/
private
String
displayString
;
//SKU规格构成对象
private
List
<
SkuSpecCombineTO
>
skuSpecCombine
;
}
yanxuan-qc-change-system-integration/src/main/java/com/netease/mail/yanxuan/change/integration/todo/SupplierItemVO.java
View file @
0f3357e5
package
com
.
netease
.
mail
.
yanxuan
.
change
.
integration
.
todo
;
import
com.netease.mail.yanxuan.change.integration.item.meta.SkuSpecTO
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
import
java.util.List
;
@Data
@Builder
@AllArgsConstructor
...
...
@@ -20,4 +23,12 @@ public class SupplierItemVO {
* 商品名称
*/
private
String
itemName
;
/**
* 商品sku
*/
private
List
<
SupplierItemSkuVO
>
skuInfoVOS
;
//SPU关联的规格信息列表
private
List
<
SkuSpecTO
>
specList
;
}
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/controller/ChangeFlowController.java
View file @
0f3357e5
...
...
@@ -8,6 +8,7 @@ package com.netease.mail.yanxuan.change.web.controller;
import
javax.validation.Valid
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.logging.log4j.util.Strings
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.util.Assert
;
...
...
@@ -42,6 +43,8 @@ import com.netease.yanxuan.flowx.sdk.meta.dto.exec.UserBaseContainerDTO;
import
lombok.extern.slf4j.Slf4j
;
import
java.util.List
;
/**
* @Author zcwang
* @Date 2022/11/14
...
...
@@ -83,6 +86,7 @@ public class ChangeFlowController {
@RequestParam
(
name
=
"pageSize"
,
defaultValue
=
"10"
)
Integer
pageSize
,
@RequestParam
(
name
=
"createSource"
)
Integer
createSource
,
@RequestParam
(
name
=
"itemId"
,
required
=
false
)
String
itemId
,
@RequestParam
(
name
=
"skuId"
,
required
=
false
)
String
skuId
,
@RequestParam
(
name
=
"supplier"
,
required
=
false
)
String
supplier
,
@RequestParam
(
name
=
"parentChangeClassId"
,
required
=
false
)
Long
parentChangeClassId
,
@RequestParam
(
name
=
"sonChangeClassId"
,
required
=
false
)
Long
sonChangeClassId
,
...
...
@@ -90,11 +94,14 @@ public class ChangeFlowController {
@RequestParam
(
name
=
"changeCommander"
,
required
=
false
)
String
changeCommander
,
@RequestParam
(
name
=
"changeDepartment"
,
required
=
false
)
String
changeDepartment
,
@RequestParam
(
name
=
"changeExecDepartment"
,
required
=
false
)
String
changeExecDepartment
,
@RequestParam
(
name
=
"changeExecUser"
,
required
=
false
)
String
changeExecUser
,
@RequestParam
(
name
=
"startTime"
,
required
=
false
)
Long
startTime
,
@RequestParam
(
name
=
"endTime"
,
required
=
false
)
Long
endTime
,
@RequestParam
(
name
=
"flowId"
,
required
=
false
)
Long
flowId
)
{
ChangeFlowListQueryReq
changeFlowListQueryReq
=
new
ChangeFlowListQueryReq
();
changeFlowListQueryReq
.
setChangeExecUser
(
changeExecUser
);
changeFlowListQueryReq
.
setItemId
(
itemId
);
changeFlowListQueryReq
.
setSkuId
(
skuId
);
changeFlowListQueryReq
.
setSupplier
(
supplier
);
changeFlowListQueryReq
.
setParentChangeClassId
(
parentChangeClassId
);
changeFlowListQueryReq
.
setSonChangeClassId
(
sonChangeClassId
);
...
...
@@ -249,6 +256,20 @@ public class ChangeFlowController {
*/
@PostMapping
(
"/queryCommanderInfo"
)
public
AjaxResult
<
CommanderResponse
>
queryCommanderInfo
(
@RequestBody
QueryCommanderEmailReq
req
)
{
List
<
CommanderResponse
>
commanderResponseList
=
interiorChangeConfigService
.
queryCommanderEmail
(
req
);
if
(
CollectionUtils
.
isEmpty
(
commanderResponseList
))
{
return
AjaxResult
.
success
();
}
return
AjaxResult
.
success
(
commanderResponseList
.
get
(
0
));
}
/**
* 查询负责人信息
* @param req
* @return
*/
@PostMapping
(
"/queryCommanderInfoV2"
)
public
AjaxResult
<
List
<
CommanderResponse
>>
queryCommanderInfoV2
(
@RequestBody
QueryCommanderEmailReq
req
)
{
return
AjaxResult
.
success
(
interiorChangeConfigService
.
queryCommanderEmail
(
req
));
}
}
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/controller/SupplierController.java
View file @
0f3357e5
package
com
.
netease
.
mail
.
yanxuan
.
change
.
web
.
controller
;
import
java.util.List
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
com.alibaba.fastjson.JSON
;
import
com.netease.mail.yanxuan.change.biz.config.AppConfig
;
import
com.netease.mail.yanxuan.change.biz.service.ISupplierItemService
;
...
...
@@ -9,19 +17,11 @@ import com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplier
import
com.netease.mail.yanxuan.change.integration.flow.supplier.FlowRpcSupplierService
;
import
com.netease.mail.yanxuan.change.integration.flow.supplier.req.SupplierGoodsInfoReq
;
import
com.netease.mail.yanxuan.change.integration.flow.supplier.req.SupplierSearchRemoteReq
;
import
com.netease.mail.yanxuan.change.integration.flow.supplier.rsp.SupplierInfoRsp
;
import
com.netease.mail.yanxuan.change.integration.flow.supplier.rsp.SupplierSimpleRsp
;
import
com.netease.mail.yanxuan.change.integration.todo.SupplierItemPageVO
;
import
com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.RestController
;
import
java.util.Collections
;
import
java.util.List
;
import
lombok.extern.slf4j.Slf4j
;
/**
* @author WangJiaXiang
...
...
@@ -46,9 +46,9 @@ public class SupplierController {
@GetMapping
(
"/query/supplier/infos"
)
public
AjaxResult
<
List
<
SupplierSimpleRsp
>>
querySupplierInfos
(
@RequestParam
(
name
=
"name"
,
required
=
false
)
String
name
,
@RequestParam
(
name
=
"uid"
,
required
=
false
)
String
uid
,
@RequestParam
(
name
=
"fuzzySearchText"
)
String
fuzzySearchText
)
{
@RequestParam
(
name
=
"name"
,
required
=
false
)
String
name
,
@RequestParam
(
name
=
"uid"
,
required
=
false
)
String
uid
,
@RequestParam
(
name
=
"fuzzySearchText"
)
String
fuzzySearchText
)
{
SupplierSearchRemoteReq
req
=
new
SupplierSearchRemoteReq
();
req
.
setSearchText
(
fuzzySearchText
);
AjaxResult
<
List
<
SupplierSimpleRsp
>>
supplierInfo
=
supplierSendService
.
queryByConditionForQc
(
req
);
...
...
@@ -56,19 +56,19 @@ public class SupplierController {
return
supplierInfo
;
}
log
.
error
(
"[querySupplierInfos] querySupplierInfos failed, name={},uid={},fuzzySearchText={}, errMsg={}"
,
name
,
uid
,
fuzzySearchText
,
JSON
.
toJSONString
(
supplierInfo
));
uid
,
fuzzySearchText
,
JSON
.
toJSONString
(
supplierInfo
));
return
null
;
}
@GetMapping
(
"/query/supplier/item"
)
public
AjaxResponse
<
SupplierItemPageVO
>
querySupplier
(
@RequestParam
String
supplier
,
@RequestParam
(
required
=
false
)
String
itemId
,
@RequestParam
(
required
=
false
)
String
itemName
,
@RequestParam
(
defaultValue
=
"1"
)
Integer
page
,
@RequestParam
(
defaultValue
=
"10"
)
Integer
pageSize
)
{
@RequestParam
(
required
=
false
)
String
itemId
,
@RequestParam
(
required
=
false
)
String
itemName
,
@RequestParam
(
required
=
false
)
String
skuId
,
@RequestParam
(
defaultValue
=
"1"
)
Integer
page
,
@RequestParam
(
defaultValue
=
"10"
)
Integer
pageSize
)
{
SupplierGoodsInfoReq
supplierGoodsInfoReq
=
new
SupplierGoodsInfoReq
();
supplierGoodsInfoReq
.
setSupplierIds
(
supplier
);
return
AjaxResponse
.
initSuccessResult
(
supplierItemService
.
supplierGoodsInfoBySupplier
(
supplierGoodsInfoReq
,
itemId
,
itemName
,
page
,
pageSize
));
return
AjaxResponse
.
initSuccessResult
(
supplierItemService
.
supplierGoodsInfoBySupplier
(
supplierGoodsInfoReq
,
itemId
,
itemName
,
page
,
pageSize
,
skuId
));
}
}
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