Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
J
jinfa-platform
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
陈智峰
jinfa-platform
Commits
58cf7e14
Commit
58cf7e14
authored
Oct 12, 2020
by
GuanHua
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat:修改积分商品详情链接问题
parent
f1feab42
Show whitespace changes
Inline
Side-by-side
Showing
26 changed files
with
1074 additions
and
12 deletions
+1074
-12
afterServiceRoute.ts
config/routes/afterServiceRoute.ts
+276
-0
index.ts
config/routes/index.ts
+2
-1
menu.ts
src/locales/zh-CN/menu.ts
+57
-2
columns.tsx
src/pages/afterService/common/columns.tsx
+58
-0
styles.less
src/pages/afterService/common/styles.less
+6
-0
index.tsx
src/pages/afterService/components/DetailPreview/index.tsx
+13
-0
index.less
...ages/afterService/components/OrderDetailHeader/index.less
+35
-0
index.tsx
...pages/afterService/components/OrderDetailHeader/index.tsx
+63
-0
index.less
...ges/afterService/components/OrderDetailWrapper/index.less
+4
-0
index.tsx
...ages/afterService/components/OrderDetailWrapper/index.tsx
+15
-0
index.less
src/pages/afterService/components/StatusColors/index.less
+0
-0
index.tsx
src/pages/afterService/components/StatusColors/index.tsx
+107
-0
detail.tsx
src/pages/afterService/exchangeGoods/orderList/detail.tsx
+32
-0
index.tsx
src/pages/afterService/exchangeGoods/orderList/index.tsx
+103
-0
useSelfTable.tsx
...terService/exchangeGoods/orderList/model/useSelfTable.tsx
+18
-0
index.ts
...ages/afterService/exchangeGoods/orderList/schema/index.ts
+75
-0
index.tsx
.../afterService/exchangeGoods/waitSubmitOrderList/index.tsx
+106
-0
useSelfTable.tsx
.../exchangeGoods/waitSubmitOrderList/model/useSelfTable.tsx
+26
-0
index.ts
...Service/exchangeGoods/waitSubmitOrderList/schema/index.ts
+57
-0
index.tsx
src/pages/lxMall/commodityDetail/index.tsx
+1
-0
index.tsx
src/pages/lxMall/information/index.tsx
+5
-0
list.tsx
src/pages/lxMall/pointsMall/list.tsx
+7
-5
index.tsx
...ansaction/purchaseOrder/components/StatusColors/index.tsx
+1
-1
index.tsx
src/pages/transaction/purchaseOrder/constant/index.tsx
+3
-2
api.ts
src/services/api.ts
+3
-1
ytt.config.ts
ytt.config.ts
+1
-0
No files found.
config/routes/afterServiceRoute.ts
0 → 100644
View file @
58cf7e14
/*
* 售后能力
* @Author: ghua
* @Date: 2020-10-09 14:26:12
* @Last Modified by: ghua
* @Last Modified time: 2020-10-12 16:23:41
*/
const
AfterServiceRoute
=
{
path
:
'/memberCenter/afterService'
,
name
:
'afterService'
,
icon
:
'smile'
,
routes
:
[
{
// 换货申请
path
:
'/memberCenter/afterService/exchange'
,
name
:
'exchange'
,
routes
:
[
{
// 换货申请单查询
path
:
'/memberCenter/afterService/exchange/orderList'
,
name
:
'orderList'
,
component
:
'@/pages/afterService/exchangeGoods/orderList'
},
{
// 换货申请单查询
path
:
'/memberCenter/afterService/exchange/orderPreview'
,
name
:
'orderList'
,
hideInMenu
:
true
,
noMargin
:
true
,
component
:
'@/pages/afterService/exchangeGoods/orderList/detail'
},
{
// 待提交换货申请单
path
:
'/memberCenter/afterService/exchange/waitSubmitOrderList'
,
name
:
'waitSubmitOrderList'
,
component
:
'@/pages/afterService/exchangeGoods/waitSubmitOrderList'
},
{
// 待新增退货发货单
path
:
'/memberCenter/afterService/exchange/waitAddReturnOrder'
,
name
:
'waitAddReturnOrder'
,
},
{
// 待新增物流单
path
:
'/memberCenter/afterService/exchange/waitAddLogisticsOrder'
,
name
:
'waitAddLogisticsOrder'
,
},
{
// 待退货发货
path
:
'/memberCenter/afterService/exchange/returnOrder'
,
name
:
'returnOrder'
,
},
{
// 待确认退货回单
path
:
'/memberCenter/afterService/exchange/returnConfirmOrder'
,
name
:
'returnConfirmOrder'
,
},
{
// 待新增换货入库单
path
:
'/memberCenter/afterService/exchange/waitAddStorageOrder'
,
name
:
'waitAddStorageOrder'
,
},
{
// 待换货收货
path
:
'/memberCenter/afterService/exchange/waitReceiving'
,
name
:
'waitReceiving'
,
},
{
// 待确认售后完成
path
:
'/memberCenter/afterService/exchange/waitComfirm'
,
name
:
'waitComfirm'
,
},
]
},
{
// 换货处理
path
:
'/memberCenter/afterService/handleExchange'
,
name
:
'handleExchange'
,
routes
:
[
{
// 换货申请单查询
path
:
'/memberCenter/afterService/handleExchange/orderList'
,
name
:
'orderList'
,
},
{
// 待提交审核换货申请单
path
:
'/memberCenter/afterService/handleExchange/waitAddExamineOrder'
,
name
:
'waitAddExamineOrder'
,
},
{
// 待审核换货申请单(一级)
path
:
'/memberCenter/afterService/handleExchange/waitExamineLevelOne'
,
name
:
'waitExamineLevelOne'
,
},
{
// 待审核换货申请单(二级)
path
:
'/memberCenter/afterService/handleExchange/waitExamineLevelTwo'
,
name
:
'waitExamineLevelTwo'
,
},
{
// 待确认换货申请单
path
:
'/memberCenter/afterService/handleExchange/waitConfirmExchangeOrder'
,
name
:
'waitConfirmExchangeOrder'
},
{
// 待新增退货入库单
path
:
'/memberCenter/afterService/handleExchange/waitAddReturnOrder'
,
name
:
'waitAddReturnOrder'
,
},
{
// 待退货收货
path
:
'/memberCenter/afterService/handleExchange/waitReturnReceivingOrder'
,
name
:
'waitReturnReceivingOrder'
,
},
{
// 待新增换货发货单
path
:
'/memberCenter/afterService/handleExchange/waitSendOutOrder'
,
name
:
'waitSendOutOrder'
,
},
{
// 待新增物流单
path
:
'/memberCenter/afterService/handleExchange/waitAddLogisticsOrder'
,
name
:
'waitAddLogisticsOrder'
,
},
{
// 待换货发货
path
:
'/memberCenter/afterService/handleExchange/waitSendOut'
,
name
:
'waitSendOut'
,
},
{
// 待确认换货回单
path
:
'/memberCenter/afterService/handleExchange/exchangeConfirmOrder'
,
name
:
'exchangeConfirmOrder'
,
},
]
},
{
// 退货申请
path
:
'/memberCenter/afterService/return'
,
name
:
'return'
,
routes
:
[
{
// 退申请单查询
path
:
'/memberCenter/afterService/return/orderList'
,
name
:
'orderList'
,
},
{
// 待提交退货申请单
path
:
'/memberCenter/afterService/return/waitSubmitOrder'
,
name
:
'waitSubmitOrder'
,
},
{
// 待退货发货
path
:
'/memberCenter/afterService/return/waitReturnAndSendOut'
,
name
:
'waitReturnAndSendOut'
,
},
{
// 待确认退货回单
path
:
'/memberCenter/afterService/return/waitConfirmOrder'
,
name
:
'waitConfirmOrder'
,
},
{
// 待确认退款结果
path
:
'/memberCenter/afterService/return/waitConfirmRefundResult'
,
name
:
'waitConfirmRefundResult'
,
},
{
// 待确认售后完成
path
:
'/memberCenter/afterService/return/waitConfirmFinsh'
,
name
:
'waitConfirmFinsh'
,
},
]
},
{
// 退货处理
path
:
'/memberCenter/afterService/handleReturn'
,
name
:
'handleReturn'
,
routes
:
[
{
// 退申请单查询
path
:
'/memberCenter/afterService/handleReturn/orderList'
,
name
:
'orderList'
,
},
{
// 待提交审核退货申请单
path
:
'/memberCenter/afterService/handleReturn/waitSubmitExamineOrder'
,
name
:
'waitSubmitExamineOrder'
,
},
{
// 待审核退货申请单(一级)
path
:
'/memberCenter/afterService/handleReturn/waitExamineLevelOne'
,
name
:
'waitExamineLevelOne'
,
},
{
// 待审核退货申请单(二级)
path
:
'/memberCenter/afterService/handleReturn/waitExamineLevelTwo'
,
name
:
'waitExamineLevelTwo'
,
},
{
// 待确认退货申请单
path
:
'/memberCenter/afterService/handleReturn/waitConfirmReturn'
,
name
:
'waitConfirmReturn'
,
},
{
// 待退货收货
path
:
'/memberCenter/afterService/handleReturn/waitReturnAndReceiving'
,
name
:
'waitReturnAndReceiving'
,
},
{
// 待退款
path
:
'/memberCenter/afterService/handleReturn/waitRefund'
,
name
:
'waitRefund'
,
},
]
},
{
// 维修申请
path
:
'/memberCenter/afterService/repair'
,
name
:
'repair'
,
routes
:
[
{
// 维修申请单查询
path
:
'/memberCenter/afterService/repair/orderList'
,
name
:
'orderList'
,
},
{
// 待提交维修申请单
path
:
'/memberCenter/afterService/repair/waitSubmitOrder'
,
name
:
'waitSubmitOrder'
,
},
{
// 待确认售后完成
path
:
'/memberCenter/afterService/repair/waitConfirmFinsh'
,
name
:
'waitConfirmFinsh'
,
},
]
},
{
// 维修处理
path
:
'/memberCenter/afterService/handleRepair'
,
name
:
'handleRepair'
,
routes
:
[
{
// 维修申请单查询
path
:
'/memberCenter/afterService/handleRepair/orderList'
,
name
:
'orderList'
,
},
{
// 待提交审核维修申请单
path
:
'/memberCenter/afterService/handleRepair/waitSubmitExamineOrder'
,
name
:
'waitSubmitExamineOrder'
,
},
{
// 待审核维修申请单(一级)
path
:
'/memberCenter/afterService/handleRepair/waitExamineLevelOne'
,
name
:
'waitExamineLevelOne'
,
},
{
// 待审核维修申请单(二级)
path
:
'/memberCenter/afterService/handleRepair/waitExamineLevelTwo'
,
name
:
'waitExamineLevelTwo'
,
},
{
// 待确认维修申请单
path
:
'/memberCenter/afterService/handleRepair/waitConfirmOrder'
,
name
:
'waitConfirmOrder'
,
},
]
},
]
}
export
default
AfterServiceRoute
\ No newline at end of file
config/routes/index.ts
View file @
58cf7e14
...
...
@@ -12,8 +12,9 @@ import TranactionRoute from './tranactionRoute' // 交易能力路由
import
LogisticsRoute
from
'./logisticsRoutes'
// 物流能力路由
import
PayandSettleRoute
from
'./payandSettle'
//支付与结算
import
AuthConfigRoute
from
'./authConfigRoute'
import
AfterService
from
'./afterServiceRoute'
// 售后
const
routes
=
[
CommodityRoute
,
MemberRoute
,
ShopRoute
,
ChannelRoute
,
TranactionRoute
,
PayandSettleRoute
,
LogisticsRoute
,
AuthConfigRoute
]
const
routes
=
[
CommodityRoute
,
MemberRoute
,
ShopRoute
,
ChannelRoute
,
TranactionRoute
,
AfterService
,
PayandSettleRoute
,
LogisticsRoute
,
AuthConfigRoute
]
const
memberCenterRoute
=
{
path
:
'/memberCenter'
,
...
...
src/locales/zh-CN/menu.ts
View file @
58cf7e14
...
...
@@ -202,8 +202,8 @@ export default {
'menu.tranactionAbility.enquiryOfferConfirm.toSubmit'
:
'待提交审核报价单'
,
'menu.tranactionAbility.enquiryOfferConfirm.enquiryOne'
:
'待审核报价单(一级)'
,
'menu.tranactionAbility.enquiryOfferConfirm.enquiryTwo'
:
'待审核报价单(二级)'
,
'menu.tranactionAbility.enquiryOfferConfirm.viewEnquiryDetail'
:
'报价单详情'
,
'menu.tranactionAbility.enquiryOfferConfirm.enquiryOfferComfirmSearch'
:
'待确认报价单'
,
'menu.tranactionAbility.enquiryOfferConfirm.viewEnquiryDetail'
:
'报价单详情'
,
'menu.tranactionAbility.enquiryOfferConfirm.enquiryOfferComfirmSearch'
:
'待确认报价单'
,
// 供应商评价
...
...
@@ -222,6 +222,61 @@ export default {
'menu.tranactionAbility.purchaserEvaluation.received'
:
'收到的评价'
,
'menu.tranactionAbility.purchaserEvaluation.sent'
:
'发出的评价'
,
// 售后能力
'menu.afterService'
:
'售后'
,
'menu.afterService.exchange'
:
'换货申请'
,
'menu.afterService.exchange.orderList'
:
'换货申请单查询'
,
'menu.afterService.exchange.waitSubmitOrderList'
:
'待提交换货申请单'
,
'menu.afterService.exchange.waitAddReturnOrder'
:
'待新增退货发货单'
,
'menu.afterService.exchange.waitAddLogisticsOrder'
:
'待新增物流单'
,
'menu.afterService.exchange.returnOrder'
:
'待退货发货'
,
'menu.afterService.exchange.returnConfirmOrder'
:
'待确认退货回单'
,
'menu.afterService.exchange.waitAddStorageOrder'
:
'待新增换货入库单'
,
'menu.afterService.exchange.waitReceiving'
:
'待换货收货'
,
'menu.afterService.exchange.waitComfirm'
:
'待确认售后完成'
,
'menu.afterService.handleExchange'
:
'换货处理'
,
'menu.afterService.handleExchange.orderList'
:
'换货申请单查询'
,
'menu.afterService.handleExchange.waitAddExamineOrder'
:
'待提交审核换货申请单'
,
'menu.afterService.handleExchange.waitExamineLevelOne'
:
'待审核换货申请单(一级)'
,
'menu.afterService.handleExchange.waitExamineLevelTwo'
:
'待审核换货申请单(二级)'
,
'menu.afterService.handleExchange.waitConfirmExchangeOrder'
:
'待确认换货申请单'
,
'menu.afterService.handleExchange.waitAddReturnOrder'
:
'待新增退货入库单'
,
'menu.afterService.handleExchange.waitReturnReceivingOrder'
:
'待退货收货'
,
'menu.afterService.handleExchange.waitSendOutOrder'
:
'待新增换货发货单'
,
'menu.afterService.handleExchange.waitAddLogisticsOrder'
:
'待新增物流单'
,
'menu.afterService.handleExchange.waitSendOut'
:
'待换货发货'
,
'menu.afterService.handleExchange.exchangeConfirmOrder'
:
'待确认换货回单'
,
'menu.afterService.return'
:
'退货申请'
,
'menu.afterService.return.orderList'
:
'退申请单查询'
,
'menu.afterService.return.waitSubmitOrder'
:
'待提交退货申请单'
,
'menu.afterService.return.waitReturnAndSendOut'
:
'待退货发货'
,
'menu.afterService.return.waitConfirmOrder'
:
'待确认退货回单'
,
'menu.afterService.return.waitConfirmRefundResult'
:
'待确认退款结果'
,
'menu.afterService.return.waitConfirmFinsh'
:
'待确认售后完成'
,
'menu.afterService.handleReturn'
:
'退货处理'
,
'menu.afterService.handleReturn.orderList'
:
'退申请单查询'
,
'menu.afterService.handleReturn.waitSubmitExamineOrder'
:
'待提交审核退货申请单'
,
'menu.afterService.handleReturn.waitExamineLevelOne'
:
'待审核退货申请单(一级)'
,
'menu.afterService.handleReturn.waitExamineLevelTwo'
:
'待审核退货申请单(二级)'
,
'menu.afterService.handleReturn.waitConfirmReturn'
:
'待确认退货申请单'
,
'menu.afterService.handleReturn.waitReturnAndReceiving'
:
'待退货收货'
,
'menu.afterService.handleReturn.waitRefund'
:
'待退款'
,
'menu.afterService.repair'
:
'维修申请'
,
'menu.afterService.repair.orderList'
:
'维修申请单查询'
,
'menu.afterService.repair.waitSubmitOrder'
:
'待提交维修申请单'
,
'menu.afterService.repair.waitConfirmFinsh'
:
'待确认售后完成'
,
'menu.afterService.handleRepair'
:
'维修处理'
,
'menu.afterService.handleRepair.orderList'
:
'维修申请单查询'
,
'menu.afterService.handleRepair.waitSubmitExamineOrder'
:
'待提交审核维修申请单'
,
'menu.afterService.handleRepair.waitExamineLevelOne'
:
'待审核维修申请单(一级)'
,
'menu.afterService.handleRepair.waitExamineLevelTwo'
:
'待审核维修申请单(二级)'
,
'menu.afterService.handleRepair.waitConfirmOrder'
:
'待确认维修申请单'
,
//物流能力
'menu.logisticsAbility'
:
'物流'
,
'menu.logisticsAbility.logistics'
:
'物流管理'
,
...
...
src/pages/afterService/common/columns.tsx
0 → 100644
View file @
58cf7e14
import
React
from
'react'
import
{
formatTimeString
}
from
'@/utils'
import
{
ORDER_TYPE
}
from
'@/constants'
import
StatusColors
from
'../components/StatusColors'
import
EyePreview
from
'@/components/EyePreview'
export
const
baseOrderListColumns
:
any
[]
=
[
{
title
:
'申请单号'
,
align
:
'center'
,
dataIndex
:
'applyNo'
,
key
:
'applyNo'
,
render
:
(
text
,
record
)
=>
{
// 查看订单, 需根据状态显示不同schema
return
<
EyePreview
url=
{
`/`
}
>
{
text
}
</
EyePreview
>
},
ellipsis
:
true
,
},
{
title
:
'申请单摘要'
,
align
:
'center'
,
dataIndex
:
'applyAbstract'
,
key
:
'applyAbstract'
,
ellipsis
:
true
,
},
{
title
:
'供应会员'
,
align
:
'center'
,
dataIndex
:
'supplierName'
,
key
:
'supplierName'
,
ellipsis
:
true
,
},
{
title
:
'单据时间'
,
align
:
'center'
,
dataIndex
:
'applyTime'
,
key
:
'applyTime'
,
render
:
(
text
)
=>
formatTimeString
(
text
)
},
{
title
:
'外部状态'
,
align
:
'center'
,
dataIndex
:
'outerStatus'
,
key
:
'outerStatus'
,
render
:
text
=>
<
StatusColors
status=
{
text
}
type=
'out'
/>
},
{
title
:
'内部状态'
,
align
:
'center'
,
dataIndex
:
'innerStatus'
,
key
:
'innerStatus'
,
render
:
(
text
)
=>
<
StatusColors
status=
{
text
}
type=
'inside'
/>
},
]
\ No newline at end of file
src/pages/afterService/common/styles.less
0 → 100644
View file @
58cf7e14
:global {
.god-table-control {
margin-bottom: 0;
}
}
\ No newline at end of file
src/pages/afterService/components/DetailPreview/index.tsx
0 → 100644
View file @
58cf7e14
import
React
from
'react'
const
DetailPreView
:
React
.
FC
=
()
=>
{
return
(
<
div
>
</
div
>
)
}
export
default
DetailPreView
\ No newline at end of file
src/pages/afterService/components/OrderDetailHeader/index.less
0 → 100644
View file @
58cf7e14
.titleAvator {
width: 48px;
height: 48px;
background: rgba(135, 119, 217, 1);
border-radius: 4px;
border: 1px solid rgba(223, 225, 230, 1);
line-height: 48px;
text-align: center;
color: #fff;
font-size: 24px;
margin: 0 24px;
}
.titleAvatorText {
color: #303133;
font-size: 18px;
line-height: 20px;
}
.detailHeader {
background: #fff;
padding: 24px;
}
.detailCol {
display: flex;
margin-top: 20px;
color: #303133;
}
.colLabel {
color: #909399;
margin-right: 16px;
}
\ No newline at end of file
src/pages/afterService/components/OrderDetailHeader/index.tsx
0 → 100644
View file @
58cf7e14
import
React
,
{
ReactNode
}
from
'react'
import
{
Row
,
Col
}
from
'antd'
import
{
history
}
from
'umi'
import
{
ArrowLeftOutlined
}
from
'@ant-design/icons'
import
style
from
'./index.less'
export
interface
OrderDetailHeaderProps
{
headerTitle
:
{
// 图标显示的文字
titleLabel
:
string
,
titleValue
:
ReactNode
,
picName
?:
string
,
}
|
null
,
extraRight
?:
ReactNode
,
detailList
?:
{
label
:
string
,
name
:
string
,
render
?(
text
,
record
?),
[
key
:
string
]:
any
}[],
detailData
?:
any
}
/**
* 订单详情头部
*/
const
OrderDetailHeader
:
React
.
FC
<
OrderDetailHeaderProps
>
=
({
headerTitle
,
extraRight
,
detailList
=
[],
detailData
=
{}
})
=>
{
return
(
<
div
className=
{
style
.
detailHeader
}
>
<
Row
>
{
headerTitle
&&
<
Col
>
<
Row
align=
'middle'
>
<
Col
>
<
ArrowLeftOutlined
onClick=
{
()
=>
history
.
goBack
()
}
/>
</
Col
>
<
Col
className=
{
style
.
titleAvator
}
>
{
headerTitle
.
picName
}
</
Col
>
</
Row
>
</
Col
>
}
<
Col
style=
{
{
flex
:
1
}
}
>
<
Row
justify=
'space-between'
align=
'middle'
style=
{
{
paddingTop
:
14
}
}
>
<
Col
style=
{
{
flex
:
1
}
}
>
<
div
className=
{
style
.
titleAvatorText
}
>
{
headerTitle
.
titleLabel
}{
headerTitle
.
titleValue
}
</
div
>
<
Row
>
{
detailList
.
map
(
v
=>
{
const
{
label
,
render
,
name
,
...
colProps
}
=
v
return
<
Col
key=
{
label
}
{
...
colProps
}
className=
{
style
.
detailCol
}
>
<
span
className=
{
style
.
colLabel
}
>
{
label
}
:
</
span
>
{
render
?
render
(
detailData
[
name
],
detailData
)
:
<
span
>
{
detailData
[
name
]
}
</
span
>
}
</
Col
>
})
}
</
Row
>
</
Col
>
<
Col
>
{
extraRight
}
</
Col
>
</
Row
>
</
Col
>
</
Row
>
</
div
>
)
}
OrderDetailHeader
.
defaultProps
=
{}
export
default
OrderDetailHeader
\ No newline at end of file
src/pages/afterService/components/OrderDetailWrapper/index.less
0 → 100644
View file @
58cf7e14
.wrapper {
padding: 24px;
}
\ No newline at end of file
src/pages/afterService/components/OrderDetailWrapper/index.tsx
0 → 100644
View file @
58cf7e14
import
React
from
'react'
import
style
from
'./index.less'
export
interface
OrderDetailWrapperProps
{}
const
OrderDetailWrapper
:
React
.
FC
<
OrderDetailWrapperProps
>
=
(
props
)
=>
{
return
(
<
div
className=
{
style
.
wrapper
}
>
{
props
.
children
}
</
div
>
)
}
OrderDetailWrapper
.
defaultProps
=
{}
export
default
OrderDetailWrapper
\ No newline at end of file
src/pages/afterService/components/StatusColors/index.less
0 → 100644
View file @
58cf7e14
src/pages/afterService/components/StatusColors/index.tsx
0 → 100644
View file @
58cf7e14
import
React
from
'react'
import
{
Tag
}
from
'antd'
import
{
PurchaseOrderInsideWorkStateTexts
,
PurchaseOrderOutWorkStateTexts
,
PurchaseOrderInsideWorkState
,
PurchaseOrderOutWorkState
,
SaleOrderInsideWorkState
,
SaleOrderInsideWorkStateTexts
}
from
'@/constants'
export
interface
IStatusColor
{
[
key
:
string
]:
{
value
:
string
|
number
,
color
:
string
}
}
// 用于标签状态控制
export
interface
StatusColorsProps
{
status
:
number
,
type
:
'out'
|
'inside'
|
'saleInside'
}
export
enum
ORDER_EXAMINE_ENUM
{
/**
* 新增订单
*/
ADD_ORDER
=
1
,
/**
* 一级审核
*/
ONE_LEVEL_VALIDATE
,
/**
* 二级审核
*/
TWO_LEVEL_VALIDATE
,
/**
* 提交订单中
*/
SUBMIT_ORDER_PROCESS
,
/**
* 提交订单成功
*/
SUBMIT_ORDER_SUCCESS
,
/**
* 一级审核失败
*/
ONE_LEVEL_VALIDATE_ERROR
,
/**
* 二级审核失败
*/
TWO_LEVEL_VALIDATE_ERROR
}
export
const
ORDER_EXAMINE_LIST
=
[
''
,
'新增订单'
,
'一级审核中'
,
'二级审核中'
,
'提交订单'
,
'提交成功'
,
'一级审核不通过'
,
'二级审核不通过'
]
// 状态颜色映射
export
const
StatusColorsMaps
=
{
ready
:
'#C0C4CC'
,
process
:
'#FFC400'
,
submit
:
'#6C9CEB'
,
success
:
'#41CC9E'
,
error
:
'#EF6260'
}
const
matchStatusColor
=
(
status
:
number
):
string
=>
{
const
maps
=
{
[
ORDER_EXAMINE_ENUM
.
ADD_ORDER
]:
StatusColorsMaps
.
ready
,
[
ORDER_EXAMINE_ENUM
.
ONE_LEVEL_VALIDATE
]:
StatusColorsMaps
.
process
,
[
ORDER_EXAMINE_ENUM
.
TWO_LEVEL_VALIDATE
]:
StatusColorsMaps
.
process
,
[
ORDER_EXAMINE_ENUM
.
SUBMIT_ORDER_PROCESS
]:
StatusColorsMaps
.
submit
,
[
ORDER_EXAMINE_ENUM
.
SUBMIT_ORDER_SUCCESS
]:
StatusColorsMaps
.
success
}
const
READY_LISTS
=
[
PurchaseOrderInsideWorkState
.
CANCEL_ORDER
,
PurchaseOrderOutWorkState
.
CANCEL_ORDER
]
// 默认返回错误的状态颜色
return
maps
[
status
]
||
StatusColorsMaps
.
error
}
const
typeMaps
=
{
'out'
:
PurchaseOrderOutWorkStateTexts
,
'inside'
:
PurchaseOrderInsideWorkStateTexts
,
'saleInside'
:
SaleOrderInsideWorkStateTexts
}
// 订单内部状态显示
const
StatusColors
:
React
.
FC
<
StatusColorsProps
>
=
(
props
)
=>
{
const
{
status
,
type
}
=
props
const
statusText
=
typeMaps
[
type
]
const
statusShowColor
=
matchStatusColor
(
status
)
return
(<
Tag
color=
{
statusShowColor
}
>
{
statusText
[
status
]
}
</
Tag
>)
}
StatusColors
.
defaultProps
=
{}
export
default
StatusColors
\ No newline at end of file
src/pages/afterService/exchangeGoods/orderList/detail.tsx
0 → 100644
View file @
58cf7e14
import
React
,
{
useState
}
from
'react'
import
OrderDetailHeader
from
'../../components/OrderDetailHeader'
import
OrderDetailWrapper
from
'../../components/OrderDetailWrapper'
const
OrderDetail
:
React
.
FC
=
()
=>
{
const
[
formData
,
setFormData
]
=
useState
<
any
>
({})
const
headerTiTle
=
{
picName
:
'单'
,
titleLabel
:
'申请单号:'
,
titleValue
:
'FPTY12'
}
const
detailList
=
[
{
label
:
'申请单摘要'
,
name
:
'orderThe'
,
span
:
8
,
render
:
text
=>
'进口头层黄牛皮荔枝纹'
},
{
label
:
'供应会员'
,
name
:
'supplyMembersName'
,
span
:
8
,
render
:
text
=>
'温州隆昌手袋有限公司'
},
{
label
:
'单据时间'
,
name
:
'orderModel'
,
span
:
8
,
render
:
text
=>
'2020-09-09 12:58:25'
},
{
label
:
'外部状态'
,
name
:
'type'
,
span
:
8
,
render
:
text
=>
'售后完成'
},
{
label
:
'内部状态'
,
name
:
'createTime'
,
span
:
8
,
render
:
text
=>
'已确认售后完成'
},
]
return
(
<
div
>
<
OrderDetailHeader
headerTitle=
{
headerTiTle
}
detailList=
{
detailList
}
detailData=
{
formData
}
/>
<
OrderDetailWrapper
>
111
</
OrderDetailWrapper
>
</
div
>
)
}
export
default
OrderDetail
src/pages/afterService/exchangeGoods/orderList/index.tsx
0 → 100644
View file @
58cf7e14
/*
* 换货申请单列表
* @Author: ghua
* @Date: 2020-10-12 11:03:30
* @Last Modified by: ghua
* @Last Modified time: 2020-10-12 14:49:16
*/
import
React
,
{
useRef
}
from
'react'
import
{
Card
,
Select
,
message
}
from
'antd'
import
{
StandardTable
}
from
'god'
import
{
PageHeaderWrapper
}
from
'@ant-design/pro-layout'
import
{
PublicApi
}
from
'@/services/api'
import
{
useSelfTable
}
from
'./model/useSelfTable'
import
{
tableListSchema
}
from
'./schema'
import
{
useStateFilterSearchLinkageEffect
}
from
'@/formSchema/effects/useFilterSearch'
import
{
FORM_FILTER_PATH
}
from
'@/formSchema/const'
import
Submit
from
'@/components/NiceForm/components/Submit'
import
{
DatePicker
}
from
'@formily/antd-components'
import
{
PurchaseOrderInsideWorkState
}
from
'@/constants'
import
styles
from
'../../common/styles.less'
// 一级待审核订单
export
interface
ExchangeOrderListProps
{
}
const
fetchTableData
=
async
(
params
)
=>
{
const
{
data
}
=
await
PublicApi
.
getAsReplaceGoodsPageByConsumer
(
params
)
return
data
}
const
ExchangeOrderList
:
React
.
FC
<
ExchangeOrderListProps
>
=
(
props
)
=>
{
const
{
columns
,
ref
,
rowSelection
,
rowSelectionCtl
}
=
useSelfTable
()
const
handleSubmitBatch
=
async
()
=>
{
if
(
rowSelectionCtl
.
selectRow
.
length
===
0
)
{
message
.
error
(
'请先勾选订单'
)
return
;
}
const
canBitch
=
!
rowSelectionCtl
.
selectRow
.
some
(
v
=>
v
.
interiorState
!==
PurchaseOrderInsideWorkState
.
ONE_LEVEL_AUDIT_ORDER
)
if
(
canBitch
)
{
await
PublicApi
.
postOrderProcurementOrderReviewedAll
({
ids
:
rowSelectionCtl
.
selectedRowKeys
})
ref
.
current
.
reload
()
}
else
{
message
.
error
(
'只能批量提交内部状态为审核中的订单'
)
}
}
return
<
PageHeaderWrapper
>
<
Card
>
<
StandardTable
className=
{
styles
.
noMarBottom
}
fetchTableData=
{
params
=>
fetchTableData
(
params
)
}
// rowSelection={rowSelection}
columns=
{
columns
}
currentRef=
{
ref
}
rowKey=
{
'id'
}
formilyLayouts=
{
{
justify
:
'start'
}
}
formilyProps=
{
{
ctx
:
{
inline
:
false
,
schema
:
tableListSchema
,
effects
:
(
$
,
actions
)
=>
{
useStateFilterSearchLinkageEffect
(
$
,
actions
,
'applyNo'
,
FORM_FILTER_PATH
,
);
},
components
:
{
DateRangePicker
:
DatePicker
.
RangePicker
,
Select
,
Submit
}
},
layouts
:
{
// order: 1,
// span: 16
}
}
}
// formilyChilds={{
// children: <Space>
// <Button onClick={handleSubmitBatch}>批量提交审核</Button>
// </Space>,
// layouts: {
// span: 8
// }
// }}
/>
</
Card
>
</
PageHeaderWrapper
>
}
ExchangeOrderList
.
defaultProps
=
{}
export
default
ExchangeOrderList
\ No newline at end of file
src/pages/afterService/exchangeGoods/orderList/model/useSelfTable.tsx
0 → 100644
View file @
58cf7e14
import
React
,
{
useRef
}
from
'react'
import
{
baseOrderListColumns
}
from
'../../../common/columns'
import
{
useRowSelectionTable
}
from
'@/hooks/useRowSelectionTable'
// 业务hooks
export
const
useSelfTable
=
()
=>
{
const
ref
=
useRef
<
any
>
({})
const
[
rowSelection
,
rowSelectionCtl
]
=
useRowSelectionTable
({
customKey
:
'id'
})
const
secondColumns
:
any
[]
=
baseOrderListColumns
return
{
columns
:
secondColumns
,
ref
,
rowSelection
,
rowSelectionCtl
}
}
src/pages/afterService/exchangeGoods/orderList/schema/index.ts
0 → 100644
View file @
58cf7e14
import
{
ISchema
}
from
'@formily/antd'
;
import
{
FORM_FILTER_PATH
}
from
'@/formSchema/const'
;
/**
* 除了订单必填字段, 默认
*/
export
const
tableListSchema
:
ISchema
=
{
type
:
'object'
,
properties
:
{
applyNo
:
{
type
:
'string'
,
"x-component"
:
'SearchFilter'
,
'x-component-props'
:
{
placeholder
:
'请输入申请单号'
,
align
:
'flex-start'
,
},
},
[
FORM_FILTER_PATH
]:
{
type
:
'object'
,
'x-component'
:
'flex-layout'
,
'x-component-props'
:
{
inline
:
true
,
colStyle
:
{
marginRight
:
20
}
},
properties
:
{
"applyAbstract"
:
{
type
:
'string'
,
'x-component-props'
:
{
placeholder
:
'请输入申请单摘要'
,
}
},
"supplierName"
:
{
type
:
'string'
,
"x-component-props"
:
{
placeholder
:
'请输入供应会员名称'
}
},
"[startTime,endTime]"
:
{
type
:
'array'
,
"x-component"
:
'daterangepicker'
,
'x-component-props'
:
{
placeholder
:
[
'开始时间'
,
'结束时间'
],
},
},
"outerStatus"
:
{
type
:
'string'
,
"x-component"
:
'Select'
,
'x-component-props'
:
{
options
:
[],
style
:
{
width
:
'180px'
},
placeholder
:
'请选择外部状态'
},
},
"innerStatus"
:
{
type
:
'string'
,
"x-component"
:
'Select'
,
'x-component-props'
:
{
options
:
[],
style
:
{
width
:
'180px'
},
placeholder
:
'请选择内部状态'
},
},
submit
:
{
'x-component'
:
'Submit'
,
'x-component-props'
:
{
children
:
'查询'
,
},
},
},
},
}
}
\ No newline at end of file
src/pages/afterService/exchangeGoods/waitSubmitOrderList/index.tsx
0 → 100644
View file @
58cf7e14
/*
* 待提交换货申请单
* @Author: ghua
* @Date: 2020-10-12 15:03:51
* @Last Modified by: ghua
* @Last Modified time: 2020-10-12 15:04:52
*/
import
React
,
{
useRef
}
from
'react'
import
{
Card
,
Select
,
message
,
Space
,
Button
}
from
'antd'
import
{
StandardTable
}
from
'god'
import
{
PageHeaderWrapper
}
from
'@ant-design/pro-layout'
import
{
PublicApi
}
from
'@/services/api'
import
{
useSelfTable
}
from
'./model/useSelfTable'
import
{
PlusOutlined
}
from
'@ant-design/icons'
import
DropDeleteDown
from
'@/components/DropDeleteDown'
import
{
tableListSchema
}
from
'./schema'
import
{
useStateFilterSearchLinkageEffect
}
from
'@/formSchema/effects/useFilterSearch'
import
{
FORM_FILTER_PATH
}
from
'@/formSchema/const'
import
Submit
from
'@/components/NiceForm/components/Submit'
import
{
DatePicker
}
from
'@formily/antd-components'
import
{
useRowSelectionTable
}
from
'@/hooks/useRowSelectionTable'
import
{
PurchaseOrderInsideWorkState
}
from
'@/constants'
import
styles
from
'../../common/styles.less'
// 一级待审核订单
export
interface
WaitSubmitOrderListProps
{
}
const
fetchTableData
=
async
(
params
)
=>
{
const
{
data
}
=
await
PublicApi
.
getAsReplaceGoodsPageToBeSubmitByConsumer
(
params
)
return
data
}
const
WaitSubmitOrderList
:
React
.
FC
<
WaitSubmitOrderListProps
>
=
(
props
)
=>
{
const
{
columns
,
ref
,
rowSelection
,
rowSelectionCtl
}
=
useSelfTable
()
const
handleSubmitBatch
=
async
()
=>
{
if
(
rowSelectionCtl
.
selectRow
.
length
===
0
)
{
message
.
error
(
'请先勾选订单'
)
return
;
}
const
canBitch
=
!
rowSelectionCtl
.
selectRow
.
some
(
v
=>
v
.
interiorState
!==
PurchaseOrderInsideWorkState
.
ONE_LEVEL_AUDIT_ORDER
)
if
(
canBitch
)
{
await
PublicApi
.
postOrderProcurementOrderReviewedAll
({
ids
:
rowSelectionCtl
.
selectedRowKeys
})
ref
.
current
.
reload
()
}
else
{
message
.
error
(
'只能批量提交内部状态为审核中的订单'
)
}
}
return
<
PageHeaderWrapper
>
<
Card
>
<
StandardTable
className=
{
styles
.
noMarBottom
}
fetchTableData=
{
params
=>
fetchTableData
(
params
)
}
// rowSelection={rowSelection}
columns=
{
columns
}
currentRef=
{
ref
}
rowKey=
{
'id'
}
formilyLayouts=
{
{
justify
:
'space-between'
}
}
formilyProps=
{
{
ctx
:
{
inline
:
false
,
schema
:
tableListSchema
,
effects
:
(
$
,
actions
)
=>
{
useStateFilterSearchLinkageEffect
(
$
,
actions
,
'applyNo'
,
FORM_FILTER_PATH
,
);
},
components
:
{
DateRangePicker
:
DatePicker
.
RangePicker
,
Select
,
Submit
}
},
layouts
:
{
order
:
1
,
span
:
16
}
}
}
formilyChilds=
{
{
children
:
<
Space
>
<
Button
onClick=
{
handleSubmitBatch
}
type=
"primary"
icon=
{
<
PlusOutlined
/>
}
style=
{
{
width
:
112
}
}
>
新建
</
Button
>
</
Space
>,
layouts
:
{
span
:
8
}
}
}
/>
</
Card
>
</
PageHeaderWrapper
>
}
WaitSubmitOrderList
.
defaultProps
=
{}
export
default
WaitSubmitOrderList
\ No newline at end of file
src/pages/afterService/exchangeGoods/waitSubmitOrderList/model/useSelfTable.tsx
0 → 100644
View file @
58cf7e14
import
React
,
{
useRef
}
from
'react'
import
{
baseOrderListColumns
}
from
'../../../common/columns'
import
{
useRowSelectionTable
}
from
'@/hooks/useRowSelectionTable'
// 业务hooks
export
const
useSelfTable
=
()
=>
{
const
ref
=
useRef
<
any
>
({})
const
[
rowSelection
,
rowSelectionCtl
]
=
useRowSelectionTable
({
customKey
:
'id'
})
const
secondColumns
:
any
[]
=
baseOrderListColumns
.
concat
([
{
title
:
'操作'
,
align
:
'center'
,
dataIndex
:
'ctl'
,
key
:
'ctl'
,
render
:
(
text
,
record
)
=>
<></>
}
])
return
{
columns
:
secondColumns
,
ref
,
rowSelection
,
rowSelectionCtl
}
}
src/pages/afterService/exchangeGoods/waitSubmitOrderList/schema/index.ts
0 → 100644
View file @
58cf7e14
import
{
ISchema
}
from
'@formily/antd'
;
import
{
FORM_FILTER_PATH
}
from
'@/formSchema/const'
;
/**
* 除了订单必填字段, 默认
*/
export
const
tableListSchema
:
ISchema
=
{
type
:
'object'
,
properties
:
{
applyNo
:
{
type
:
'string'
,
"x-component"
:
'SearchFilter'
,
'x-component-props'
:
{
placeholder
:
'请输入申请单号'
,
align
:
'flex-end'
,
},
},
[
FORM_FILTER_PATH
]:
{
type
:
'object'
,
'x-component'
:
'flex-layout'
,
'x-component-props'
:
{
inline
:
true
,
colStyle
:
{
marginLeft
:
20
}
},
properties
:
{
"applyAbstract"
:
{
type
:
'string'
,
'x-component-props'
:
{
placeholder
:
'请输入申请单摘要'
,
}
},
"supplierName"
:
{
type
:
'string'
,
"x-component-props"
:
{
placeholder
:
'请输入供应会员名称'
}
},
"[startTime,endTime]"
:
{
type
:
'array'
,
"x-component"
:
'daterangepicker'
,
'x-component-props'
:
{
placeholder
:
[
'开始时间'
,
'结束时间'
],
},
},
submit
:
{
'x-component'
:
'Submit'
,
'x-component-props'
:
{
children
:
'查询'
,
},
},
},
},
}
}
\ No newline at end of file
src/pages/lxMall/commodityDetail/index.tsx
View file @
58cf7e14
...
...
@@ -86,6 +86,7 @@ const CommodityDetail = (props) => {
commodityId
:
id
}
let
headers
=
{}
switch
(
layoutType
)
{
case
LAYOUT_TYPE
.
channel
:
headers
=
{
...
...
src/pages/lxMall/information/index.tsx
View file @
58cf7e14
...
...
@@ -149,6 +149,8 @@ const Information: React.FC<InformationPropsType> = (props) => {
<
div
className=
{
styles
.
information
}
>
<
div
className=
{
styles
.
information_container
}
>
<
BreadCrumbs
{
...
props
}
/>
{
(
carouselNews
.
length
>
0
||
photoNews
.
length
>
0
)
&&
(
<
div
className=
{
styles
.
information_focus
}
>
<
div
className=
{
styles
.
information_focus_left
}
>
<
Carousel
...
...
@@ -184,6 +186,9 @@ const Information: React.FC<InformationPropsType> = (props) => {
}
</
div
>
</
div
>
)
}
<
div
className=
{
styles
.
information_wrap
}
>
<
div
className=
{
styles
.
information_left
}
>
<
div
className=
{
styles
.
information_tabs
}
>
...
...
src/pages/lxMall/pointsMall/list.tsx
View file @
58cf7e14
...
...
@@ -14,15 +14,17 @@ interface CommodityListPropsType {
const
CommodityList
:
React
.
FC
<
CommodityListPropsType
>
=
(
props
)
=>
{
const
{
showType
,
commodityList
=
[],
layoutType
=
LAYOUT_TYPE
.
mall
}
=
props
const
getCommodityDetailUrl
=
()
=>
{
const
getCommodityDetailUrl
=
(
item
)
=>
{
switch
(
layoutType
)
{
case
LAYOUT_TYPE
.
channel
:
return
"/channelmall"
return
`/channelmall/commodity/detail?id=
${
item
.
id
}
&type=
${
item
.
priceType
}
&channelId=
${
btoa
(
JSON
.
stringify
({
shopId
:
item
.
storeId
,
memberId
:
item
.
memberId
}))}
`
case
LAYOUT_TYPE
.
ichannel
:
return
`/ichannelmall/commodity/detail?id=
${
item
.
id
}
&type=
${
item
.
priceType
}
&channelId=
${
btoa
(
JSON
.
stringify
({
shopId
:
item
.
storeId
,
memberId
:
item
.
memberId
}))}
`
case
LAYOUT_TYPE
.
mall
:
case
LAYOUT_TYPE
.
shop
:
return
"/shop"
return
`/shop/commodity/detail?id=
${
item
.
id
}
&type=
${
item
.
priceType
}
&shopId=
${
btoa
(
JSON
.
stringify
({
shopId
:
item
.
storeId
,
memberId
:
item
.
memberId
}))}
`
default
:
return
""
return
`/commodity/detail?id=
${
item
.
id
}
&type=
${
item
.
priceType
}
&shopId=
${
btoa
(
JSON
.
stringify
({
shopId
:
item
.
storeId
,
memberId
:
item
.
memberId
}))}
`
}
}
...
...
@@ -31,7 +33,7 @@ const CommodityList: React.FC<CommodityListPropsType> = (props) => {
{
commodityList
.
map
((
item
,
index
)
=>
(
<
div
key=
{
item
.
id
}
className=
{
cx
(
styles
.
point_commodity_list_item
,
styles
.
row
)
}
>
<
a
href=
{
`${getCommodityDetailUrl()}/commodity/detail?id=${item.id}&type=${item.priceType}&shopId=${btoa(JSON.stringify({ shopId: item.storeId, memberId: item.memberId }))}`
}
target=
"_blank"
>
<
a
href=
{
getCommodityDetailUrl
(
item
)
}
target=
"_blank"
>
<
div
className=
{
styles
.
goods_img
}
>
{
item
.
mainPic
?
<
img
src=
{
item
.
mainPic
}
/>
:
<
Skeleton
.
Image
style=
{
{
width
:
220
,
height
:
220
}
}
/>
...
...
src/pages/transaction/purchaseOrder/components/StatusColors/index.tsx
View file @
58cf7e14
...
...
@@ -94,7 +94,7 @@ const typeMaps = {
}
// 订单内部状态显示
const
StatusColors
:
React
.
FC
<
StatusColorsProps
>
=
(
props
)
=>
{
const
StatusColors
:
React
.
FC
<
StatusColorsProps
>
=
(
props
)
=>
{
const
{
status
,
type
}
=
props
const
statusText
=
typeMaps
[
type
]
const
statusShowColor
=
matchStatusColor
(
status
)
...
...
src/pages/transaction/purchaseOrder/constant/index.tsx
View file @
58cf7e14
...
...
@@ -59,13 +59,13 @@ export const baseOrderListColumns: any[] = [
align
:
'center'
,
dataIndex
:
'externalState'
,
key
:
'externalState'
,
render
:
text
=>
<
StatusColors
status=
{
text
}
type=
'out'
/>
render
:
text
=>
<
StatusColors
status=
{
text
}
type=
'out'
/>
},
{
title
:
'内部状态'
,
align
:
'center'
,
dataIndex
:
'interiorState'
,
key
:
'interiorState'
,
render
:
(
text
)
=>
<
StatusColors
status=
{
text
}
type=
'inside'
/>
render
:
(
text
)
=>
<
StatusColors
status=
{
text
}
type=
'inside'
/>
},
]
\ No newline at end of file
src/services/api.ts
View file @
58cf7e14
...
...
@@ -8,6 +8,7 @@ import * as PayApi from './PayApi'
import
*
as
SearchApi
from
'./SearchApi'
import
*
as
OrderApi
from
'./OrderApi'
import
*
as
SettleApi
from
'./SettleApi'
import
*
as
AfterService
from
'./AfterServiceApi'
/**
* 可在这里写入自定义的接口
...
...
@@ -27,5 +28,6 @@ export const PublicApi = {
...
PayApi
,
...
SearchApi
,
...
OrderApi
,
...
SettleApi
...
SettleApi
,
...
AfterService
}
ytt.config.ts
View file @
58cf7e14
...
...
@@ -9,6 +9,7 @@ const tokenList = [
{
name
:
'Search'
,
token
:
'ca19f532efba91f7773cbfbd526b798c6ac83df670071e97d72c50dca1d53a48'
},
// 搜索服务
{
name
:
'Order'
,
token
:
'31b93b223421ca52389b088a7457c651fab7c1bf658fc7dd38d0689d09c8e235'
},
//订单服务
{
name
:
'Settle'
,
token
:
'fffbeeaaa198c285955997c606bc279fc6950fea118580c786f2c73eecccaa6a'
},
//结算服务
{
name
:
'AfterService'
,
token
:
'39db719680bf1b3db21bc1deda933cde16d17559e9676bf848ec96c1320e68df'
},
// '售后服务'
// { name: '', token: 'c0e920f071595a73ba234b6fa6cfe42192d3d740d59f030caa2c7f0f08777d78' } // 商户会员管理服务
]
...
...
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