Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
A
admin-ci-test
概览
概览
详情
活动
周期分析
版本库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
统计图
问题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
test-ci
admin-ci-test
Commits
850dee5d
提交
850dee5d
authored
10月 16, 2023
作者:
龚洪江
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'develop'
# Conflicts: # src/api/interface/dataDashboardsType.ts
上级
5a5d1bde
0e27316b
隐藏空白字符变更
内嵌
并排
正在显示
27 个修改的文件
包含
1402 行增加
和
1149 行删除
+1402
-1149
kustomization.yaml
kustomization/overlays/dev/kustomization.yaml
+1
-1
dataDashboardsType.ts
src/api/interface/dataDashboardsType.ts
+7
-1
orderManageType.ts
src/api/interface/orderManageType.ts
+454
-0
orderManage.ts
src/api/modules/orderManage.ts
+18
-0
index.tsx
src/components/layout/title/index.tsx
+30
-5
index.tsx
...omponents/order/productOrder/logisticsStepModal/index.tsx
+15
-9
index.tsx
.../forumManage/topicList/components/addTopicModal/index.tsx
+1
-1
index.tsx
...s/orderManage/equipmentOrder/comp/confirmReturn/index.tsx
+161
-0
index.tsx
.../orderManage/equipmentOrder/comp/detailDelivery/index.tsx
+0
-73
index.scss
...erManage/equipmentOrder/comp/detailInformation/index.scss
+27
-0
index.tsx
...derManage/equipmentOrder/comp/detailInformation/index.tsx
+49
-48
index.tsx
...rderManage/equipmentOrder/comp/detailMessageBox/index.tsx
+0
-12
index.tsx
...orderManage/equipmentOrder/comp/detailPurchaser/index.tsx
+140
-72
index.tsx
.../orderManage/equipmentOrder/comp/detailTimeLine/index.tsx
+0
-55
index.tsx
...ges/orderManage/equipmentOrder/comp/orderClosed/index.tsx
+0
-100
index.tsx
...es/orderManage/equipmentOrder/comp/orderConfirm/index.tsx
+0
-191
index.tsx
...es/orderManage/equipmentOrder/comp/orderDeliver/index.tsx
+0
-251
index.tsx
...ges/orderManage/equipmentOrder/comp/orderRefund/index.tsx
+0
-93
index.tsx
.../orderManage/equipmentOrder/comp/shipmentsOrder/index.tsx
+165
-0
index.scss
src/pages/orderManage/equipmentOrder/detail/index.scss
+1
-18
index.tsx
src/pages/orderManage/equipmentOrder/detail/index.tsx
+32
-34
index.scss
src/pages/orderManage/equipmentOrder/index.scss
+28
-0
index.tsx
src/pages/orderManage/equipmentOrder/index.tsx
+250
-169
index.ts
src/router/index.ts
+2
-1
router.tsx
src/router/router.tsx
+0
-12
index.ts
src/store/module/menu/index.ts
+17
-3
isRoute.ts
src/utils/isRoute.ts
+4
-0
没有找到文件。
kustomization/overlays/dev/kustomization.yaml
浏览文件 @
850dee5d
...
@@ -14,4 +14,4 @@ patches:
...
@@ -14,4 +14,4 @@ patches:
images
:
images
:
-
name
:
REGISTRY/NAMESPACE/IMAGE:TAG
-
name
:
REGISTRY/NAMESPACE/IMAGE:TAG
newName
:
mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly-dev/admin
newName
:
mmc-registry.cn-shenzhen.cr.aliyuncs.com/sharefly-dev/admin
newTag
:
6fbb4c210cb5b7bffe02b2d4e1e5d440b72d5241
newTag
:
d56a5b90a7944c70db606f48b90da8bfea6d1730
src/api/interface/dataDashboardsType.ts
浏览文件 @
850dee5d
...
@@ -46,8 +46,14 @@ export type releaseReportDataType = InterFunction<
...
@@ -46,8 +46,14 @@ export type releaseReportDataType = InterFunction<
* 话题发布数量
* 话题发布数量
*/
*/
topicReleaseCount
?:
number
;
topicReleaseCount
?:
number
;
newsReleaseCount
?:
number
;
/**
* 招标信息数量
*/
tenderReleaseCount
?:
number
;
tenderReleaseCount
?:
number
;
/**
* 新闻发布数量
*/
newsReleaseCount
?:
number
;
}
}
>
;
>
;
// 数据看板-加盟信息
// 数据看板-加盟信息
...
...
src/api/interface/orderManageType.ts
浏览文件 @
850dee5d
...
@@ -1632,3 +1632,457 @@ export type uavPoSellerRemarkType = InterFunction<
...
@@ -1632,3 +1632,457 @@ export type uavPoSellerRemarkType = InterFunction<
},
},
any
any
>
;
>
;
//租赁-订单列表
type
rentReqType
=
{
deposit
:
number
;
/**
* 卖家企业名称
*/
companyName
?:
string
;
/**
* 确认收货时间
*/
confirmReceiptTime
?:
Date
;
/**
* 下单时间
*/
createTime
?:
Date
;
/**
* 租赁结束时间
*/
endDate
?:
Date
;
/**
* id
*/
id
:
number
;
kdnExpDTO
?:
{
logisticCode
?:
string
;
shipperCode
?:
string
;
stateEx
?:
string
;
traces
?:
{
acceptStation
?:
string
;
acceptTime
?:
string
;
action
?:
string
;
location
?:
string
;
}[];
};
returnKdnExpDTO
?:
{
logisticCode
?:
string
;
shipperCode
?:
string
;
stateEx
?:
string
;
traces
?:
{
acceptStation
?:
string
;
acceptTime
?:
string
;
action
?:
string
;
location
?:
string
;
}[];
};
/**
* 租赁商品id
*/
leaseGoodsId
?:
number
;
leaseRefundOrder
?:
{
/**
* 创建时间
*/
createTime
?:
Date
;
/**
* 物流编号
*/
expressCode
?:
string
;
/**
* 快递单号
*/
expressNum
?:
string
;
/**
* 图片文件
*/
file
?:
string
;
/**
* id
*/
id
?:
number
;
/**
* 订单id
*/
leaseOrderId
?:
number
;
/**
* 退款原因
*/
reason
?:
string
;
/**
* 归还状态:0已归还 1无需归还
*/
status
?:
number
;
};
storeDamageOrder
?:
{
/**
* 创建时间
*/
createTime
?:
Date
;
/**
* 物流编号
*/
expressCode
?:
string
;
/**
* 快递单号
*/
expressNum
?:
string
;
/**
* 图片文件
*/
file
?:
string
;
/**
* id
*/
id
?:
number
;
/**
* 订单id
*/
leaseOrderId
?:
number
;
/**
* 退款原因
*/
reason
?:
string
;
/**
* 归还状态:0已归还 1无需归还
*/
status
?:
number
;
modifiedDeposit
?:
number
;
};
confirmReceipt
?:
{
/**
* 创建时间
*/
createTime
?:
string
;
/**
* 物流编号
*/
expressCode
?:
string
;
/**
* 快递单号
*/
expressNum
?:
string
;
/**
* 图片文件
*/
file
?:
string
;
/**
* id
*/
id
?:
number
;
/**
* 订单id
*/
leaseOrderId
?:
number
;
/**
* 退款原因
*/
reason
?:
string
;
/**
* 归还状态:0已归还 1无需归还
*/
status
?:
number
;
};
/**
* 运费
*/
modeOfDeliveryInfo
?:
string
;
/**
* 订单需付金额
*/
needPayAmount
?:
number
;
/**
* 买家昵称
*/
nickname
?:
string
;
/**
* 订单名称
*/
orderName
?:
string
;
/**
* 订单编号
*/
orderNo
?:
string
;
/**
* 订单实付总额
*/
orderTotalAmount
?:
number
;
/**
* 其他方式支付额度
*/
otherAmount
?:
number
;
/**
* 支付时间
*/
payTime
?:
Date
;
/**
* wechatpay微信,alipay支付宝,offline线下
*/
payType
?:
string
;
/**
* 买家手机号
*/
phoneNum
?:
string
;
/**
* 评价状态
*/
remarkStatus
?:
number
;
/**
* 抵扣佣金余额
*/
salaryAmount
?:
number
;
/**
* 卖家备注
*/
sellerRemark
?:
string
;
/**
* 抵扣云享金余额
*/
shareAmount
?:
number
;
/**
* 订单规格列表
*/
sku
:
string
;
/**
* sku图片
*/
skuImg
?:
string
;
/**
* 租赁开始时间
*/
startDate
?:
Date
;
/**
* 订单状态
*/
statusCode
:
number
;
storeReceiveOrder
?:
{
/**
* 创建时间
*/
createTime
?:
Date
;
/**
* 物流编号
*/
expressCode
?:
string
;
/**
* 快递单号
*/
expressNum
?:
string
;
/**
* 图片文件
*/
file
?:
string
;
/**
* id
*/
id
?:
number
;
/**
* 订单id
*/
leaseOrderId
?:
number
;
/**
* 退款原因
*/
reason
?:
string
;
/**
* 归还状态:0已归还 1无需归还
*/
status
?:
number
;
};
/**
* 卖家id
*/
thirdBackUserAccountId
?:
number
;
uavOrderExpressDTO
?:
{
/**
* id
*/
id
?:
number
;
/**
* 是否已取件,0未取,1已取
*/
receive
?:
number
;
/**
* 取件时间
*/
receiveTime
?:
Date
;
/**
* 快递编码
*/
sendExpCode
?:
string
;
/**
* 快递编号
*/
sendExpNo
?:
string
;
/**
* 发货-平台操作发货时间
*/
sendTime
?:
Date
;
/**
* 发货-收货详细地址
*/
takeAddress
?:
string
;
/**
* 取货人
*/
takeName
?:
string
;
/**
* 取货人号码
*/
takePhone
?:
string
;
/**
* 地区信息
*/
takeRegion
?:
string
;
/**
* 订单id
*/
uavOrderId
?:
number
;
};
/**
* 最近修改时间
*/
updateTime
?:
Date
;
/**
* 买家id
*/
userAccountId
?:
number
;
/**
* 买家姓名
*/
userName
?:
string
;
/**
* 买家备注
*/
userRemark
?:
string
;
/**
* 购买数量
*/
wareNum
:
number
;
shareCashPledge
?:
number
;
salaryCashPledge
?:
number
;
};
export
type
rentOrderListType
=
InterListFunction
<
{
/**
* 结束时间
*/
endTime
?:
string
;
/**
* 关键字-订单编号
*/
keyword
?:
string
;
/**
* 开始时间
*/
startTime
?:
string
;
/**
* 订单状态码
*/
statusCode
?:
number
;
/**
* 用户uid
*/
uid
?:
string
;
},
rentReqType
>
;
// 租赁-订单字典
export
type
rentOrderDictType
=
InterFunction
<
any
,
{
status
:
string
;
doing
:
string
;
waiting
:
string
;
leaseOrderStatus
:
null
;
}[]
>
;
// 租赁-订单详情
export
type
rentOrderDetailType
=
InterFunction
<
{
/**
* id
*/
id
:
number
;
},
rentReqType
>
;
// 租赁订单-发货
export
type
rentOrderSendType
=
InterFunction
<
{
id
:
number
;
/**
* 快递编码
*/
sendExpCode
:
string
;
/**
* 快递编号
*/
sendExpNo
:
string
;
/**
* 发货-收货详细地址
*/
takeAddress
:
string
;
/**
* 取货人
*/
takeName
:
string
;
/**
* 取货人号码
*/
takePhone
:
string
;
/**
* 地区信息
*/
takeRegion
:
string
;
/**
* 订单id
*/
uavOrderId
:
number
;
},
any
>
;
// 租赁订单-平台确认归还
export
type
rentPfConfirmOrderWareType
=
InterFunction
<
{
/**
* 商家确认商品是否破损 0:未破损 1:破损
*/
damage
?:
number
;
/**
* 扣除的押金
*/
deductionAmount
?:
number
;
/**
* 物流编码
*/
expressCode
?:
string
;
/**
* 物流单号
*/
expressNum
?:
string
;
/**
* 图片文件
*/
file
?:
string
;
/**
* id
*/
id
?:
number
;
/**
* 订单id
*/
orderId
?:
number
;
/**
* 原因
*/
reason
?:
string
;
/**
* 归还状态 0已归还 1无需归还(注:发货后申请退款需要传,归还商品的时候不需要)
*/
status
?:
number
;
},
any
>
;
src/api/modules/orderManage.ts
浏览文件 @
850dee5d
...
@@ -38,6 +38,11 @@ import {
...
@@ -38,6 +38,11 @@ import {
uavPoSendType
,
uavPoSendType
,
uploadPOrderType
,
uploadPOrderType
,
walletAmountType
,
walletAmountType
,
rentOrderListType
,
rentOrderDictType
,
rentOrderSendType
,
rentOrderDetailType
,
rentPfConfirmOrderWareType
,
}
from
'~/api/interface/orderManageType'
;
}
from
'~/api/interface/orderManageType'
;
export
class
OrderManageAPI
{
export
class
OrderManageAPI
{
...
@@ -158,4 +163,17 @@ export class OrderManageAPI {
...
@@ -158,4 +163,17 @@ export class OrderManageAPI {
axios
.
get
(
'/oms/uav-po/userRemark'
,
{
params
});
axios
.
get
(
'/oms/uav-po/userRemark'
,
{
params
});
static
setUavPoSellerRemark
:
uavPoSellerRemarkType
=
(
params
)
=>
static
setUavPoSellerRemark
:
uavPoSellerRemarkType
=
(
params
)
=>
axios
.
get
(
'/oms/uav-po/sellerRemark'
,
{
params
});
axios
.
get
(
'/oms/uav-po/sellerRemark'
,
{
params
});
// 租赁-订单列表
static
getRentOrderList
:
rentOrderListType
=
(
data
)
=>
axios
.
post
(
'/oms/lease/order/list'
,
data
);
// 租赁-订单字典
static
getRentOrderDict
:
rentOrderDictType
=
()
=>
axios
.
get
(
'/oms/lease/order/statusList'
);
// 租赁-订单发货
static
rentOrderSend
:
rentOrderSendType
=
(
data
)
=>
axios
.
post
(
'/oms/lease/order/send'
,
data
);
// 租赁-订单详情
static
getRentOrderDetail
:
rentOrderDetailType
=
(
params
)
=>
axios
.
get
(
'/oms/lease/order/detail'
,
{
params
});
// 租赁订单-平台确认归还
static
rentPfConfirmOrderWare
:
rentPfConfirmOrderWareType
=
(
data
)
=>
axios
.
post
(
'/oms/lease/order/pfConfirmOrderWare'
,
data
);
}
}
src/components/layout/title/index.tsx
浏览文件 @
850dee5d
import
{
useEffect
,
useState
}
from
'react'
;
import
{
useEffect
,
useState
}
from
'react'
;
import
{
Header
}
from
'antd/es/layout/layout'
;
import
{
Header
}
from
'antd/es/layout/layout'
;
import
{
DownOutlined
,
Up
Outlined
}
from
'@ant-design/icons'
;
import
{
DownOutlined
,
LogoutOutlined
,
UpOutlined
,
Verified
Outlined
}
from
'@ant-design/icons'
;
import
{
Button
,
Dropdown
,
Image
,
M
enuProps
,
M
odal
}
from
'antd'
;
import
{
Button
,
Dropdown
,
Image
,
Modal
}
from
'antd'
;
import
Logo
from
'../../../assets/icon/logo_big.png'
;
import
Logo
from
'../../../assets/icon/logo_big.png'
;
import
'./index.scss'
;
import
'./index.scss'
;
import
{
REMOVE_MENU
,
REMOVE_MENU_ID
,
SET_COLLAPSE
}
from
'~/store/module/menu'
;
import
{
REMOVE_MENU
,
REMOVE_MENU_ID
,
SET_COLLAPSE
,
REMOVE_REQ_MENU
}
from
'~/store/module/menu'
;
import
{
useDispatch
,
useSelector
}
from
'react-redux'
;
import
{
useDispatch
,
useSelector
}
from
'react-redux'
;
import
{
useNavigate
}
from
'react-router-dom'
;
import
{
useNavigate
}
from
'react-router-dom'
;
import
Cookies
from
'js-cookie'
;
import
Cookies
from
'js-cookie'
;
import
{
FddInterfaceAPI
}
from
'~/api'
;
import
{
FddInterfaceAPI
}
from
'~/api'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
userFddInfoType
}
from
'~/api/interface/fddInterfaceType'
;
import
{
userFddInfoType
}
from
'~/api/interface/fddInterfaceType'
;
import
{
decode
}
from
'js-base64'
;
import
{
isRouteById
}
from
'~/utils/isRoute'
;
// fdd实名认证信息类型
// fdd实名认证信息类型
type
fddAuthType
=
InterDataType
<
userFddInfoType
>
;
type
fddAuthType
=
InterDataType
<
userFddInfoType
>
;
...
@@ -29,6 +31,7 @@ export function TitleView() {
...
@@ -29,6 +31,7 @@ export function TitleView() {
// 用户信息
// 用户信息
const
{
userInfo
}
=
useSelector
((
state
:
any
)
=>
state
.
UserInfo
);
const
{
userInfo
}
=
useSelector
((
state
:
any
)
=>
state
.
UserInfo
);
const
{
reqMenuList
}
=
useSelector
((
state
:
any
)
=>
state
.
Menu
);
// 菜单栏收起
// 菜单栏收起
const
setMenuCollapsed
=
()
=>
{
const
setMenuCollapsed
=
()
=>
{
setIsActive
(
!
isActive
);
setIsActive
(
!
isActive
);
...
@@ -42,14 +45,23 @@ export function TitleView() {
...
@@ -42,14 +45,23 @@ export function TitleView() {
}
}
});
});
};
};
// 获取第三方认证连接
const
getCompanyVerifyUrl
=
()
=>
{
FddInterfaceAPI
.
getCompanyVerifyUrl
({
port
:
1
}).
then
(({
result
})
=>
{
if
(
result
)
{
window
.
open
(
decode
(
result
),
'_blank'
);
}
});
};
// 右上角按钮
// 右上角按钮
const
items
:
MenuProps
[
'items'
]
=
[
const
[
items
,
setItems
]
=
useState
<
any
>
(
[
{
{
key
:
'1'
,
key
:
'1'
,
label
:
(
label
:
(
<
Button
<
Button
type=
'link'
type=
'link'
icon=
{
<
LogoutOutlined
/>
}
onClick=
{
()
=>
{
onClick=
{
()
=>
{
confirm
({
confirm
({
title
:
'退出登录'
,
title
:
'退出登录'
,
...
@@ -59,6 +71,7 @@ export function TitleView() {
...
@@ -59,6 +71,7 @@ export function TitleView() {
Cookies
.
remove
(
'SHAREFLY-TOKEN'
);
Cookies
.
remove
(
'SHAREFLY-TOKEN'
);
dispatch
(
REMOVE_MENU
());
dispatch
(
REMOVE_MENU
());
dispatch
(
REMOVE_MENU_ID
());
dispatch
(
REMOVE_MENU_ID
());
dispatch
(
REMOVE_REQ_MENU
());
},
},
});
});
}
}
}
}
...
@@ -67,10 +80,22 @@ export function TitleView() {
...
@@ -67,10 +80,22 @@ export function TitleView() {
</
Button
>
</
Button
>
),
),
},
},
];
{
key
:
'2'
,
label
:
(
<
Button
type=
'link'
icon=
{
<
VerifiedOutlined
/>
}
onClick=
{
getCompanyVerifyUrl
}
>
实名认证
</
Button
>
),
},
]);
useEffect
(()
=>
{
useEffect
(()
=>
{
getAppUserFddInfo
();
getAppUserFddInfo
();
if
(
!
isRouteById
(
reqMenuList
,
1450
))
{
items
.
splice
(
1
,
1
);
setItems
([...
items
]);
}
},
[]);
},
[]);
return
(
return
(
<
Header
<
Header
...
...
src/components/order/productOrder/logisticsStepModal/index.tsx
浏览文件 @
850dee5d
...
@@ -11,15 +11,21 @@ interface selfProps {
...
@@ -11,15 +11,21 @@ interface selfProps {
const
LogisticsStepModal
:
FC
<
ModalProps
&
selfProps
>
=
({
open
,
onCancel
,
logisticsStep
})
=>
{
const
LogisticsStepModal
:
FC
<
ModalProps
&
selfProps
>
=
({
open
,
onCancel
,
logisticsStep
})
=>
{
return
(
return
(
<
Modal
open=
{
open
}
title=
'物流进度'
onCancel=
{
onCancel
}
footer=
{
false
}
>
<
Modal
open=
{
open
}
title=
'物流进度'
onCancel=
{
onCancel
}
footer=
{
false
}
>
<
Steps
{
logisticsStep
?.
traces
?.
length
?
(
direction=
'vertical'
<
Steps
current=
{
(
logisticsStep
?.
traces
?.
length
||
1
)
-
1
}
direction=
'vertical'
progressDot
current=
{
(
logisticsStep
?.
traces
?.
length
||
1
)
-
1
}
items=
{
logisticsStep
?.
traces
?.
map
((
v
)
=>
({
progressDot
title
:
v
.
acceptStation
,
items=
{
logisticsStep
?.
traces
?.
map
((
v
)
=>
({
description
:
v
.
acceptTime
,
title
:
v
.
acceptStation
,
}))
}
description
:
v
.
acceptTime
,
/>
}))
}
/>
)
:
(
<
div
className=
'no-data'
style=
{
{
color
:
'#999'
,
textAlign
:
'center'
}
}
>
暂无物流
</
div
>
)
}
</
Modal
>
</
Modal
>
);
);
};
};
...
...
src/pages/forumManage/topicList/components/addTopicModal/index.tsx
浏览文件 @
850dee5d
...
@@ -98,7 +98,7 @@ const AddTopicModal: FC<ModalProps & selfProps> = ({ open, onCancel, onOk, curre
...
@@ -98,7 +98,7 @@ const AddTopicModal: FC<ModalProps & selfProps> = ({ open, onCancel, onOk, curre
name=
'gambitName'
name=
'gambitName'
rules=
{
[{
required
:
true
,
message
:
'请输入名称'
}]
}
rules=
{
[{
required
:
true
,
message
:
'请输入名称'
}]
}
>
>
<
Input
placeholder=
'请输入名称'
maxLength=
{
3
0
}
prefix=
'#'
/>
<
Input
placeholder=
'请输入名称'
maxLength=
{
2
0
}
prefix=
'#'
/>
</
Form
.
Item
>
</
Form
.
Item
>
<
Form
.
Item
<
Form
.
Item
label=
'图标'
label=
'图标'
...
...
src/pages/orderManage/equipmentOrder/comp/confirmReturn/index.tsx
0 → 100644
浏览文件 @
850dee5d
import
{
Form
,
Input
,
Modal
,
ModalProps
,
Radio
,
RadioChangeEvent
,
Button
,
message
,
InputNumber
,
}
from
'antd'
;
import
React
,
{
FC
,
useState
}
from
'react'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
rentOrderDetailType
}
from
'~/api/interface/orderManageType'
;
import
LogisticsStepModal
from
'~/components/order/productOrder/logisticsStepModal'
;
import
{
OrderManageAPI
}
from
'~/api'
;
import
{
UploadOutlined
}
from
'@ant-design/icons'
;
import
{
UploadFile
}
from
'antd/es/upload/interface'
;
import
{
Uploader
}
from
'~/components/uploader'
;
import
{
isEmptyBol
}
from
'~/utils/validateUtils'
;
// 租赁订单详情返回类型
type
detailType
=
InterDataType
<
rentOrderDetailType
>
;
interface
selfProps
{
onOk
:
()
=>
void
;
onCancel
:
()
=>
void
;
currentOrderItem
:
detailType
|
undefined
;
modalTitle
:
string
;
}
const
ConfirmReturn
:
FC
<
ModalProps
&
selfProps
>
=
({
open
,
onOk
,
onCancel
,
currentOrderItem
,
modalTitle
,
})
=>
{
const
[
form
]
=
Form
.
useForm
<
{
damage
:
number
;
reason
:
string
}
>
();
const
[
isDilapidation
,
setIsDilapidation
]
=
useState
<
boolean
>
(
false
);
const
[
logisticsStepModalShow
,
setLogisticsStepModalShow
]
=
useState
<
boolean
>
(
false
);
const
[
dilapidationImgList
,
setDilapidationImgList
]
=
useState
<
UploadFile
[]
>
([]);
const
radioChangeEvent
=
(
e
:
RadioChangeEvent
)
=>
{
setIsDilapidation
(
!!
e
.
target
.
value
);
};
// 物流弹窗
const
logisticsStepModalShowClick
=
()
=>
{
setLogisticsStepModalShow
(
true
);
};
const
logisticsStepModalCancel
=
()
=>
{
setLogisticsStepModalShow
(
false
);
};
const
handleOk
=
()
=>
{
form
.
validateFields
().
then
((
values
)
=>
{
OrderManageAPI
.
rentPfConfirmOrderWare
({
...
values
,
orderId
:
currentOrderItem
?.
id
,
}).
then
(({
code
})
=>
{
if
(
code
===
'200'
)
{
message
.
success
(
'确认归还成功'
);
form
.
resetFields
();
setDilapidationImgList
([]);
setIsDilapidation
(
false
);
onOk
();
}
});
});
};
const
handleCancel
=
()
=>
{
onCancel
();
form
.
resetFields
();
setDilapidationImgList
([]);
setIsDilapidation
(
false
);
};
// 破损图片上传
const
uploadDilapidationImg
=
(
value
:
any
)
=>
{
setDilapidationImgList
(
value
);
form
.
setFieldValue
(
'file'
,
JSON
.
stringify
(
value
.
map
((
v
:
any
)
=>
v
.
url
)));
};
// 破损金额限制
const
priceValidator
=
(
_rule
:
any
,
value
:
any
,
callback
:
any
)
=>
{
if
(
isEmptyBol
(
value
))
{
return
callback
(
new
Error
(
'金额不能为空'
));
}
if
(
value
<
0
)
{
return
callback
(
new
Error
(
'金额不能小于0'
));
}
if
(
value
>
(
currentOrderItem
?.
deposit
||
0
)
*
(
currentOrderItem
?.
wareNum
||
0
))
{
return
callback
(
new
Error
(
`金额不能大于
${(
currentOrderItem
?.
deposit
||
0
)
*
(
currentOrderItem
?.
wareNum
||
0
)}
`,
),
);
}
callback();
};
return (
<Modal open={open} onOk={handleOk} onCancel={handleCancel} title={modalTitle}>
<Form initialValues={{ damage: 0 }} form={form}>
<Form.Item label='判定' name='damage'>
<Radio.Group onChange={radioChangeEvent}>
<Radio value={0}>未破损</Radio>
<Radio value={1}>破损</Radio>
</Radio.Group>
</Form.Item>
{isDilapidation ? (
<>
<Form.Item
label='扣除金额'
name='deductionAmount'
rules={[{ required: true, validator: priceValidator }]}
>
<InputNumber placeholder='请输入抵扣金额' style={{ width: '200px' }} />
</Form.Item>
<Form.Item
label='破损图片'
name='file'
rules={[{ required: true, message: '请上传破损图片' }]}
>
<Uploader
listType='picture-card'
fileUpload
onChange={uploadDilapidationImg}
defaultFileList={dilapidationImgList}
>
<UploadOutlined />
</Uploader>
</Form.Item>
<Form.Item
label='破损描述'
name='reason'
rules={[{ required: true, message: '请输入破损描述' }]}
>
<Input.TextArea placeholder='请输入破损描述' maxLength={70} showCount rows={3} />
</Form.Item>
</>
) : (
''
)}
<Form.Item label='物流信息'>
<div>
<Button type='link' onClick={logisticsStepModalShowClick}>
查看详情
</Button>
</div>
</Form.Item>
<LogisticsStepModal
open={logisticsStepModalShow}
onCancel={logisticsStepModalCancel}
logisticsStep={currentOrderItem?.returnKdnExpDTO}
/>
</Form>
</Modal>
);
};
export default ConfirmReturn;
src/pages/orderManage/equipmentOrder/comp/detailDelivery/index.tsx
deleted
100644 → 0
浏览文件 @
5a5d1bde
import
React
,
{
useEffect
,
useState
}
from
'react'
;
import
{
Image
}
from
'antd'
;
import
{
orderDetailType
,
orderImageDetailType
}
from
'~/api/interface/orderManageType'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
OrderManageAPI
}
from
'~/api'
;
// 接口返回的类型
type
DataType
=
InterDataType
<
orderDetailType
>
;
// 参数类型
type
PropsType
=
{
detail
:
DataType
;
};
// 列表的类型
type
ListType
=
InterDataType
<
orderImageDetailType
>
;
// 设备状态列表
const
vcuSatusList
=
[
{
label
:
'正常'
,
value
:
0
},
{
label
:
'故障'
,
value
:
1
},
];
// 0:发货 1:收货 2:归还 3:平台收货
const
vcuTypeList
=
[
{
label
:
'发货验收'
,
value
:
0
},
{
label
:
'收货验收'
,
value
:
1
},
{
label
:
'归还验收'
,
value
:
2
},
{
label
:
'平台收货'
,
value
:
3
},
{
label
:
'退货申请'
,
value
:
4
},
];
const
DetailDelivery
:
React
.
FC
<
PropsType
>
=
(
props
)
=>
{
const
{
detail
}
=
props
;
// 验收信息列表
const
[
orderImageList
,
setOrderImageList
]
=
useState
<
ListType
>
([]);
// 获取订单验收信息
const
getOrderImageDetail
=
async
()
=>
{
const
res
=
await
OrderManageAPI
.
orderImageDetail
({
orderInfoId
:
detail
?.
id
});
if
(
res
&&
res
.
code
===
'200'
)
{
setOrderImageList
(
res
.
result
);
console
.
log
(
'获取订单验收信息 --->'
,
res
.
result
);
}
};
// 转换设备状态
const
getVcuSatus
=
(
code
:
number
)
=>
{
return
vcuSatusList
.
find
((
item
)
=>
item
.
value
===
code
)?.
label
||
code
;
};
// 转换标题
const
getVcuType
=
(
code
:
number
)
=>
{
return
vcuTypeList
.
find
((
item
)
=>
item
.
value
===
code
)?.
label
||
code
;
};
// componentDidMount
useEffect
(()
=>
{
if
(
!
detail
)
return
;
getOrderImageDetail
().
then
();
},
[
detail
]);
return
(
<
div
className=
{
'detail-delivery detail-half'
}
>
{
orderImageList
.
map
((
i
,
j
)
=>
(
<
div
key=
{
j
}
>
<
div
className=
{
'detail-title'
}
>
{
getVcuType
(
i
.
vcuType
)
}
</
div
>
<
div
className=
{
'detail-text'
}
>
验收状态:
{
getVcuSatus
(
i
.
vcuSatus
)
}
</
div
>
<
div
className=
{
'detail-text'
}
>
验收描述:
{
i
.
remark
||
'无'
}
</
div
>
<
div
className=
{
'detail-text'
}
>
验收凭证:
</
div
>
<
div
className=
{
'detail-image'
}
>
{
i
.
imgs
?.
map
((
i
,
j
)
=>
(
<
Image
key=
{
j
}
className=
{
'image'
}
src=
{
i
}
alt=
'付款凭证'
/>
))
}
{
!
i
.
imgs
&&
<
div
style=
{
{
height
:
'30px'
}
}
></
div
>
}
</
div
>
</
div
>
))
}
</
div
>
);
};
export
default
DetailDelivery
;
src/pages/orderManage/equipmentOrder/comp/detailInformation/index.scss
0 → 100644
浏览文件 @
850dee5d
.detail-information
{
.mall-sku-item
{
display
:
flex
;
align-items
:
center
;
margin-bottom
:
10px
;
.sku-img
{
width
:
48px
;
height
:
48px
;
}
.sku-info
{
margin-left
:
10px
;
line-height
:
16px
;
text-align
:
left
;
.info-name
{
color
:
#1677ff
}
.info-spec
{
margin-top
:
10px
;
span
:not
(
:last-child
)
{
&
:after
{
content
:
';'
;
}
}
}
}
}
}
src/pages/orderManage/equipmentOrder/comp/detailInformation/index.tsx
浏览文件 @
850dee5d
import
React
,
{
useEffect
,
useState
}
from
'react'
;
import
React
from
'react'
;
import
{
Table
}
from
'antd'
;
import
{
Image
,
Table
}
from
'antd'
;
import
{
ColumnsType
}
from
'antd/es/table'
;
import
{
ColumnsType
}
from
'antd/es/table'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
orderDetail
Type
}
from
'~/api/interface/orderManageType'
;
import
{
rentOrderDetailType
,
rentOrderDict
Type
}
from
'~/api/interface/orderManageType'
;
import
dayjs
from
'dayjs'
;
import
dayjs
from
'dayjs'
;
import
'./index.scss'
;
// 表格数据类型
// 表格数据类型
type
TableType
=
any
;
type
TableType
=
any
;
// 接口返回的类型
// 接口返回的类型
type
DataType
=
InterDataType
<
orderDetailType
>
;
type
DataType
=
InterDataType
<
rentOrderDetailType
>
;
// 订单状态返回类型
type
OrderStatusType
=
InterDataType
<
rentOrderDictType
>
;
// 参数类型
// 参数类型
type
PropsType
=
{
type
PropsType
=
{
detail
:
DataType
;
detail
:
DataType
;
orderStatusList
:
OrderStatusType
;
};
};
const
DetailInformation
:
React
.
FC
<
PropsType
>
=
(
props
)
=>
{
const
DetailInformation
:
React
.
FC
<
PropsType
>
=
({
detail
,
orderStatusList
})
=>
{
const
{
detail
}
=
props
;
// 表格数据
const
[
tableData
,
setTableData
]
=
useState
<
TableType
>
([]);
// 表格结构
// 表格结构
const
columns
:
ColumnsType
<
TableType
[
0
]
>
=
[
const
columns
:
ColumnsType
<
TableType
[
0
]
>
=
[
{
{
title
:
'商品'
,
title
:
'商品'
,
dataIndex
:
'wareTitle'
,
align
:
'center'
,
align
:
'center'
,
width
:
'20%'
,
render
:
(
_text
:
any
,
record
)
=>
(
<
div
className=
'mall-sku-item'
>
<
Image
src=
{
record
?.
skuImg
}
className=
'sku-img'
/>
<
div
className=
'sku-info'
>
<
div
className=
'info-name'
>
{
record
?.
orderName
}
</
div
>
<
div
className=
'info-spec'
>
{
Object
.
entries
(
JSON
.
parse
(
record
?.
sku
||
'[]'
)).
map
((
v
,
index
)
=>
(
<
span
key=
{
index
}
>
{
v
.
join
(
':'
)
}
</
span
>
))
}
</
div
>
</
div
>
</
div
>
),
},
},
{
{
title
:
'单价(元)'
,
title
:
'单价(元)'
,
dataIndex
:
'unitPrice'
,
dataIndex
:
'unitPrice'
,
align
:
'center'
,
align
:
'center'
,
render
:
(
text
)
=>
`¥
${
text
.
toLocaleString
()
}
`
,
render
:
(
text
)
=>
`¥
${
text
?.
toLocaleString
()
||
0
}
`,
},
},
{
{
title: '数量',
title: '数量',
...
@@ -38,58 +53,44 @@ const DetailInformation: React.FC<PropsType> = (props) => {
...
@@ -38,58 +53,44 @@ const DetailInformation: React.FC<PropsType> = (props) => {
},
},
{
{
title: '订单状态',
title: '订单状态',
dataIndex
:
'
waiting
'
,
dataIndex: '
statusCode
',
align: 'center',
align: 'center',
render: (text: number) =>
orderStatusList.find((item) => item.status === text?.toString())?.waiting,
},
},
{
{
title: '应收款',
title: '应收款',
dataIndex
:
'
shouldPay
'
,
dataIndex: '
orderTotalAmount
',
align: 'center',
align: 'center',
render
:
(
text
)
=>
`¥
${
text
.
toLocaleString
()
}
`
,
render: (text) => `
¥
$
{
text
?.
toLocaleString
()
||
0
}
`,
},
},
];
];
useEffect
(()
=>
{
if
(
!
detail
)
return
;
setTableData
([
{
id
:
1
,
wareTitle
:
detail
?.
wareTitle
,
unitPrice
:
detail
?.
unitPrice
,
wareNum
:
detail
?.
wareNum
,
waiting
:
detail
?.
waiting
,
shouldPay
:
detail
?.
shouldPay
,
},
]);
},
[
detail
]);
return (
return (
<
div
className=
{
'detail-information'
}
>
<div className='detail-information'>
<
div
className=
{
'detail-title'
}
>
订单明细
</
div
>
<div className='detail-title'>订单明细</div>
<
div
className=
{
'detail-text'
}
>
<div className='detail-text'>
<
span
className=
{
'item'
}
>
订单编号:
{
detail
?.
orderNo
}
</
span
>
<span className='item'>订单编号:{detail?.orderNo}</span>
<
span
className=
{
'item'
}
style=
{
{
display
:
'none'
}
}
>
<span className='item'>
合同编号:UAV202334741131
</
span
>
<
span
className=
{
'item'
}
>
订单租期:
订单租期:
{dayjs(detail?.startDate).format('YYYY-MM-DD')}
{dayjs(detail?.startDate).format('YYYY-MM-DD')}
{' ~ '}
{' ~ '}
{dayjs(detail?.endDate).format('YYYY-MM-DD')}
{dayjs(detail?.endDate).format('YYYY-MM-DD')}
</span>
</span>
<
span
className=
{
'item'
}
>
创建时间:
{
detail
?.
createTime
}
</
span
>
<span className='item'>{`
创建时间:
$
{
detail
?.
createTime
}
`}</span>
</
div
>
<
Table
style=
{
{
margin
:
'20px auto'
,
width
:
'90%'
}
}
size=
'small'
dataSource=
{
tableData
}
columns=
{
columns
}
rowKey=
'id'
bordered
pagination=
{
false
}
// rowSelection={{ selectedRowKeys, onChange: onSelectChange }}
/>
<
div
className=
'detail-price'
>
实收款
<
span
className=
{
'num'
}
>
¥
{
detail
?.
actualPay
}
</
span
>
元
</div>
</div>
{detail ? (
<Table
size='small'
dataSource={[detail]}
columns={columns}
rowKey='id'
bordered
pagination={false}
/>
) : (
''
)}
</div>
</div>
);
);
};
};
...
...
src/pages/orderManage/equipmentOrder/comp/detailMessageBox/index.tsx
deleted
100644 → 0
浏览文件 @
5a5d1bde
import
MessageBox
from
'~/components/messageBox'
;
function
DetailMessageBox
()
{
return
(
<
div
className=
{
'detail-delivery detail-half'
}
>
<
div
className=
{
'detail-title'
}
>
订单动态
</
div
>
<
MessageBox
/>
</
div
>
);
}
export
default
DetailMessageBox
;
src/pages/orderManage/equipmentOrder/comp/detailPurchaser/index.tsx
浏览文件 @
850dee5d
import
React
,
{
useEffect
}
from
'react'
;
import
React
,
{
useEffect
,
useState
}
from
'react'
;
import
{
Button
,
Image
}
from
'antd'
;
import
{
Button
,
Steps
,
Image
}
from
'antd'
;
import
{
o
rderDetailType
}
from
'~/api/interface/orderManageType'
;
import
{
rentO
rderDetailType
}
from
'~/api/interface/orderManageType'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
OrderManageAPI
}
from
'~/api'
;
import
{
OrderManageAPI
}
from
'~/api'
;
import
LogisticsStepModal
from
'~/components/order/productOrder/logisticsStepModal'
;
// 接口返回的类型
// 接口返回的类型
type
DataType
=
InterDataType
<
o
rderDetailType
>
;
type
DataType
=
InterDataType
<
rentO
rderDetailType
>
;
// 参数类型
// 参数类型
type
PropsType
=
{
type
PropsType
=
{
detail
:
DataType
;
detail
:
DataType
;
...
@@ -13,6 +14,8 @@ type PropsType = {
...
@@ -13,6 +14,8 @@ type PropsType = {
const
DetailPurchaser
:
React
.
FC
<
PropsType
>
=
(
props
)
=>
{
const
DetailPurchaser
:
React
.
FC
<
PropsType
>
=
(
props
)
=>
{
const
{
detail
}
=
props
;
const
{
detail
}
=
props
;
const
[
logisticsStepModalShow
,
setLogisticsStepModalShow
]
=
useState
<
boolean
>
(
false
);
const
[
currentKdnExpDTO
,
setCurrentKdnExpDTO
]
=
useState
<
DataType
[
0
][
'kdnExpDTO'
]
>
();
// 物流列表
// 物流列表
const
[
expressList
,
setExpressList
]
=
React
.
useState
<
{
label
:
string
;
value
:
string
}[]
>
([]);
const
[
expressList
,
setExpressList
]
=
React
.
useState
<
{
label
:
string
;
value
:
string
}[]
>
([]);
// 获取物流信息
// 获取物流信息
...
@@ -20,88 +23,153 @@ const DetailPurchaser: React.FC<PropsType> = (props) => {
...
@@ -20,88 +23,153 @@ const DetailPurchaser: React.FC<PropsType> = (props) => {
const
res
=
await
OrderManageAPI
.
listExpressInfo
({});
const
res
=
await
OrderManageAPI
.
listExpressInfo
({});
if
(
res
&&
res
.
code
===
'200'
)
{
if
(
res
&&
res
.
code
===
'200'
)
{
setExpressList
(
res
.
result
.
map
((
item
)
=>
({
label
:
item
.
exName
,
value
:
item
.
exCode
})));
setExpressList
(
res
.
result
.
map
((
item
)
=>
({
label
:
item
.
exName
,
value
:
item
.
exCode
})));
// console.log(res);
}
}
};
};
// 转换物流信息
// 转换物流信息
const
getExpressInfo
=
(
code
:
string
|
undefined
|
null
)
=>
{
const
getExpressInfo
=
(
code
:
string
|
undefined
|
null
)
=>
{
return
expressList
.
find
((
item
)
=>
item
.
value
===
code
)?.
label
||
code
;
return
expressList
.
find
((
item
)
=>
item
.
value
===
code
)?.
label
||
code
;
};
};
// 物流弹窗
const
logisticsStepModalShowClick
=
(
kdnExpDTO
:
DataType
[
0
][
'kdnExpDTO'
])
=>
{
setCurrentKdnExpDTO
(
kdnExpDTO
);
setLogisticsStepModalShow
(
true
);
};
const
logisticsStepModalCancel
=
()
=>
{
setLogisticsStepModalShow
(
false
);
};
// componentDidMount
// componentDidMount
useEffect
(()
=>
{
useEffect
(()
=>
{
getListExpressInfo
().
then
();
getListExpressInfo
().
then
();
},
[]);
},
[]);
return
(
return
(
<
div
className=
{
'detail-purchaser detail-half'
}
>
<
div
className=
'detail-purchaser detail-half'
>
<
div
className=
{
'detail-title'
}
>
买家信息
</
div
>
<
div
className=
'detail-title'
>
买家信息
</
div
>
<
div
className=
{
'detail-text'
}
>
UID:
{
detail
?.
uid
}
</
div
>
<
div
className=
'detail-text'
>
UID:
{
detail
?.
userAccountId
}
</
div
>
<
div
className=
{
'detail-text'
}
>
姓名:
{
detail
?.
buyerName
}
</
div
>
<
div
className=
'detail-text'
>
姓名:
{
detail
?.
nickname
}
</
div
>
<
div
className=
{
'detail-text'
}
>
手机号:
{
detail
?.
buyerPhone
}
</
div
>
<
div
className=
'detail-text'
>
手机号:
{
detail
?.
phoneNum
}
</
div
>
{
/*<div className={'detail-text'}>企业: 浙江科比特创新科技有限公司</div>*/
}
<
div
className=
'detail-text'
>
备注:
{
detail
?.
userRemark
}
</
div
>
<
div
className=
{
'detail-text'
}
>
备注:
{
detail
?.
remark
}
</
div
>
<
div
className=
'detail-title'
>
发货信息
</
div
>
<
div
className=
'detail-text'
>
收货人:
{
detail
?.
uavOrderExpressDTO
?.
takeName
}
</
div
>
<
div
style=
{
{
display
:
'none'
}
}
>
<
div
className=
'detail-text'
>
手机号:
{
detail
?.
uavOrderExpressDTO
?.
takePhone
}
</
div
>
<
div
className=
{
'detail-title'
}
>
合同信息
</
div
>
<
div
className=
'detail-text'
>
<
div
className=
{
'detail-text'
}
>
合同编号: UAV202334741131
</
div
>
收货地址:
<
div
className=
{
'detail-text'
}
>
合同状态: 已归档
</
div
>
{
(
detail
?.
uavOrderExpressDTO
?.
takeRegion
?.
split
(
'/'
).
join
(
''
)
||
''
)
+
<
div
className=
{
'detail-text'
}
>
detail
?.
uavOrderExpressDTO
?.
takeAddress
}
合同操作:
<
Button
type=
{
'link'
}
>
平台签署
</
Button
>
<
Button
type=
{
'link'
}
>
查看
</
Button
>
<
Button
type=
{
'link'
}
>
下载
</
Button
>
</
div
>
</
div
>
</
div
>
{
detail
?.
uavOrderExpressDTO
?.
sendExpCode
&&
(
<
div
style=
{
{
display
:
'none'
}
}
>
<>
<
div
className=
{
'detail-title'
}
>
付款凭证
</
div
>
<
div
className=
'detail-text'
>
物流单号:
{
detail
?.
uavOrderExpressDTO
?.
sendExpNo
}
</
div
>
<
div
className=
{
'detail-text'
}
>
预付款:
</
div
>
<
div
className=
'detail-text'
>
<
div
className=
{
'detail-image'
}
>
物流公司:
{
getExpressInfo
(
detail
?.
uavOrderExpressDTO
?.
sendExpCode
)
}
{
[
</
div
>
'https://pad-video-x.oss-cn-shenzhen.aliyuncs.com/file/infrastructure-05-05.png'
,
<
div
className=
'detail-text'
style=
{
{
display
:
'flex'
}
}
>
'https://pad-video-x.oss-cn-shenzhen.aliyuncs.com/file/infrastructure-05-05.png'
,
<
span
>
物流进度:
</
span
>
].
map
((
i
,
j
)
=>
(
<
div
>
<
Image
key=
{
j
}
className=
{
'image'
}
src=
{
i
}
alt=
'付款凭证'
/>
<
Steps
))
}
direction=
'vertical'
current=
{
0
}
progressDot
items=
{
[
{
title
:
detail
?.
kdnExpDTO
?.
traces
?.[
0
].
acceptStation
,
description
:
detail
?.
kdnExpDTO
?.
traces
?.[
0
].
acceptTime
,
},
{
title
:
`送至${
(detail?.uavOrderExpressDTO?.takeRegion?.split('/').join('') || '') +
detail?.uavOrderExpressDTO?.takeAddress
}`
,
},
]
}
/>
</
div
>
<
div
>
<
Button
type=
'link'
onClick=
{
()
=>
logisticsStepModalShowClick
(
detail
?.
kdnExpDTO
)
}
>
查看详情
</
Button
>
</
div
>
</
div
>
</>
)
}
{
detail
?.
confirmReceipt
?
(
<
div
>
<
div
className=
'detail-title'
>
收货信息
</
div
>
{
detail
?.
confirmReceipt
.
file
?
(
<
div
className=
'detail-text'
style=
{
{
display
:
'flex'
}
}
>
<
span
>
图片:
</
span
>
<
div
className=
'image-file'
style=
{
{
display
:
'flex'
,
alignItems
:
'center'
,
flexWrap
:
'wrap'
}
}
>
{
JSON
.
parse
(
detail
?.
confirmReceipt
.
file
).
map
((
v
:
any
,
index
:
number
)
=>
(
<
div
style=
{
{
marginRight
:
'10px'
,
marginBottom
:
'10px'
}
}
key=
{
index
}
>
<
Image
src=
{
v
}
width=
{
50
}
height=
{
50
}
/>
</
div
>
))
}
</
div
>
</
div
>
)
:
(
''
)
}
<
div
className=
'detail-text'
>
描述:
{
detail
?.
confirmReceipt
.
reason
}
</
div
>
</
div
>
</
div
>
<
div
className=
{
'detail-text'
}
>
尾款:
</
div
>
)
:
(
<
div
className=
{
'detail-image'
}
>
''
{
[
)
}
'https://pad-video-x.oss-cn-shenzhen.aliyuncs.com/file/infrastructure-05-05.png'
,
{
detail
?.
returnKdnExpDTO
?
(
'https://pad-video-x.oss-cn-shenzhen.aliyuncs.com/file/infrastructure-05-05.png'
,
<>
].
map
((
i
,
j
)
=>
(
<
div
className=
'detail-title'
>
归还信息
</
div
>
<
Image
key=
{
j
}
className=
{
'image'
}
src=
{
i
}
alt=
'付款凭证'
/>
<
div
className=
'detail-text'
>
物流单号:
{
detail
?.
returnKdnExpDTO
?.
logisticCode
}
</
div
>
))
}
<
div
className=
'detail-text'
>
物流公司:
{
getExpressInfo
(
detail
?.
returnKdnExpDTO
?.
shipperCode
)
}
</
div
>
<
div
className=
'detail-text'
>
物流进度:
<
Button
type=
'link'
onClick=
{
()
=>
logisticsStepModalShowClick
(
detail
?.
returnKdnExpDTO
)
}
>
查看详情
</
Button
>
</
div
>
</>
)
:
(
''
)
}
{
detail
?.
storeDamageOrder
?
(
<
div
>
<
div
className=
'detail-title'
>
破损信息
</
div
>
{
detail
?.
storeDamageOrder
.
file
?
(
<
div
className=
'detail-text'
style=
{
{
display
:
'flex'
}
}
>
<
span
>
图片:
</
span
>
<
div
className=
'image-file'
style=
{
{
display
:
'flex'
,
alignItems
:
'center'
,
flexWrap
:
'wrap'
}
}
>
{
JSON
.
parse
(
detail
?.
storeDamageOrder
.
file
).
map
((
v
:
any
,
index
:
number
)
=>
(
<
div
style=
{
{
marginRight
:
'10px'
,
marginBottom
:
'10px'
}
}
key=
{
index
}
>
<
Image
src=
{
v
}
width=
{
50
}
height=
{
50
}
/>
</
div
>
))
}
</
div
>
</
div
>
)
:
(
''
)
}
<
div
className=
'detail-text'
>
扣除金额:¥
{
detail
?.
storeDamageOrder
?.
modifiedDeposit
?.
toLocaleString
()
||
0
}
</
div
>
<
div
className=
'detail-text'
>
描述:
{
detail
?.
storeDamageOrder
.
reason
}
</
div
>
</
div
>
</
div
>
<
div
className=
{
'detail-text'
}
>
全款:
</
div
>
)
:
(
<
div
className=
{
'detail-image'
}
>
''
{
[
)
}
'https://pad-video-x.oss-cn-shenzhen.aliyuncs.com/file/infrastructure-05-05.png'
,
<
LogisticsStepModal
'https://pad-video-x.oss-cn-shenzhen.aliyuncs.com/file/infrastructure-05-05.png'
,
open=
{
logisticsStepModalShow
}
].
map
((
i
,
j
)
=>
(
onCancel=
{
logisticsStepModalCancel
}
<
Image
key=
{
j
}
className=
{
'image'
}
src=
{
i
}
alt=
'付款凭证'
/>
logisticsStep=
{
currentKdnExpDTO
}
))
}
/>
</
div
>
</
div
>
<
div
className=
{
'detail-title'
}
>
发货信息
</
div
>
<
div
className=
{
'detail-text'
}
>
收货人:
{
detail
?.
receipt
?.
takeName
}
</
div
>
<
div
className=
{
'detail-text'
}
>
手机号:
{
detail
?.
receipt
?.
takePhone
}
</
div
>
<
div
className=
{
'detail-text'
}
>
收货地址:
{
detail
?.
receipt
?.
detailAddress
}
</
div
>
<
div
className=
{
'detail-text'
}
>
物流单号:
{
detail
?.
receipt
?.
sendExNo
}
</
div
>
<
div
className=
{
'detail-text'
}
>
物流公司:
{
getExpressInfo
(
detail
?.
receipt
?.
sendExCode
)
}
</
div
>
<
div
className=
{
'detail-text'
}
>
物流进度:--
<
Button
type=
{
'link'
}
>
查看详情
</
Button
>
</
div
>
<
div
className=
{
'detail-title'
}
>
归还信息
</
div
>
<
div
className=
{
'detail-text'
}
>
收货人:
{
detail
?.
receipt
?.
renName
}
</
div
>
<
div
className=
{
'detail-text'
}
>
手机号:
{
detail
?.
receipt
?.
renPhone
}
</
div
>
<
div
className=
{
'detail-text'
}
>
收货地址:
{
detail
?.
receipt
?.
renAddress
}
</
div
>
<
div
className=
{
'detail-text'
}
>
物流单号:
{
detail
?.
receipt
?.
renExNo
}
</
div
>
<
div
className=
{
'detail-text'
}
>
物流公司:
{
getExpressInfo
(
detail
?.
receipt
?.
renExCode
)
}
</
div
>
<
div
className=
{
'detail-text'
}
>
物流进度:--
<
Button
type=
{
'link'
}
>
查看详情
</
Button
>
</
div
>
</
div
>
</
div
>
);
);
};
};
...
...
src/pages/orderManage/equipmentOrder/comp/detailTimeLine/index.tsx
deleted
100644 → 0
浏览文件 @
5a5d1bde
import
{
OrderManageAPI
}
from
'~/api'
;
import
React
,
{
useEffect
,
useState
}
from
'react'
;
import
{
Timeline
}
from
'antd'
;
import
{
orderDetailType
}
from
'~/api/interface/orderManageType'
;
import
{
InterDataType
}
from
'~/api/interface'
;
// 接口返回的类型
type
DataType
=
InterDataType
<
orderDetailType
>
;
// 参数类型
type
PropsType
=
{
detail
:
DataType
;
};
const
DetailTimeLine
:
React
.
FC
<
PropsType
>
=
(
props
)
=>
{
const
{
detail
}
=
props
;
// 流程列表
const
[
timeLineList
,
setTimeLineList
]
=
useState
<
{
label
:
string
;
color
:
string
}[]
>
([]);
// 获取订单流程
const
getOrderStatus
=
async
()
=>
{
const
res
=
await
OrderManageAPI
.
listTranStatus
({});
if
(
res
&&
res
.
code
===
'200'
)
{
// 转换列表数据(区分完成和未完)
const
list
=
res
.
result
.
map
((
i
)
=>
{
if
(
Number
(
i
.
status
)
<
Number
(
detail
?.
tranStatus
))
{
return
{
label
:
i
.
doing
,
color
:
'#1890ff'
,
};
}
else
{
return
{
label
:
i
.
waiting
,
color
:
'#ccc'
,
};
}
});
// 将当前项目变绿
const
current
=
list
.
findIndex
((
i
)
=>
i
.
color
===
'#ccc'
);
list
[
current
].
color
=
'#52c41a'
;
setTimeLineList
(
list
);
}
};
// componentDidMount
useEffect
(()
=>
{
if
(
!
detail
)
return
;
getOrderStatus
().
then
();
},
[
detail
]);
return
(
<
div
className=
{
'detail-timeline'
}
style=
{
{
width
:
'200px'
}
}
>
<
div
className=
{
'detail-title'
}
>
订单流程
</
div
>
<
Timeline
items=
{
timeLineList
}
mode=
{
'right'
}
/>
</
div
>
);
};
export
default
DetailTimeLine
;
src/pages/orderManage/equipmentOrder/comp/orderClosed/index.tsx
deleted
100644 → 0
浏览文件 @
5a5d1bde
import
{
InterListType
,
InterReqType
}
from
'~/api/interface'
;
import
{
listPcWechatOrderType
,
platFormCloseOrderType
}
from
'~/api/interface/orderManageType'
;
import
React
from
'react'
;
import
{
Form
,
message
,
Modal
,
Select
}
from
'antd'
;
import
{
OrderManageAPI
}
from
'~/api'
;
// 表格数据类型
type
TableType
=
InterListType
<
listPcWechatOrderType
>
;
// 请求数据的类型
type
ReqType
=
InterReqType
<
platFormCloseOrderType
>
;
// 传参类型
interface
propType
{
title
:
string
;
open
:
boolean
;
closed
:
any
;
data
?:
TableType
[
0
];
}
const
OrderClosed
:
React
.
FC
<
propType
>
=
(
props
)
=>
{
OrderClosed
.
defaultProps
=
{
data
:
undefined
,
};
// 参数
const
{
title
,
open
,
closed
,
data
}
=
props
;
// 表单钩子
const
[
form
]
=
Form
.
useForm
<
ReqType
>
();
// 关闭弹窗
const
handleCancel
=
()
=>
{
form
.
resetFields
();
closed
();
};
// 确认事件
const
handleOk
=
()
=>
{
form
.
validateFields
()
.
then
(
async
(
values
)
=>
{
// console.log('确认事件 --->', values);
await
handleSubmit
(
values
);
})
.
catch
((
err
)
=>
{
message
.
warning
({
content
:
err
.
errorFields
[
0
].
errors
[
0
],
})
.
then
();
});
};
// 提交事件
const
handleSubmit
=
async
(
values
:
ReqType
)
=>
{
const
res
=
await
OrderManageAPI
.
platFormCloseOrder
({
...
values
,
orderInfoId
:
Number
(
data
?.
id
),
});
if
(
res
&&
res
.
code
===
'200'
)
{
message
.
success
(
'操作成功'
);
handleCancel
();
}
};
return
(
<
Modal
open=
{
open
}
title=
{
title
}
onCancel=
{
handleCancel
}
onOk=
{
handleOk
}
destroyOnClose
width=
{
400
}
>
<
Form
name=
'addForm'
form=
{
form
}
labelAlign=
'right'
labelCol=
{
{
span
:
6
}
}
wrapperCol=
{
{
span
:
12
}
}
>
<
Form
.
Item
label=
'关闭理由'
name=
'shutReason'
rules=
{
[{
required
:
true
,
message
:
'请选择关闭理由'
}]
}
>
<
Select
placeholder=
{
'请选择关闭理由'
}
options=
{
[
{
label
:
'未及时付款'
},
{
label
:
'买家不想买'
},
{
label
:
'买家信息填写错误,重新下单'
},
{
label
:
'恶意买家,同行捣乱'
},
{
label
:
'缺货'
},
{
label
:
'买家拍错了'
},
{
label
:
'其他原因'
},
].
map
((
i
)
=>
({
label
:
i
.
label
,
value
:
i
.
label
}))
}
allowClear
/>
</
Form
.
Item
>
</
Form
>
</
Modal
>
);
};
export
default
OrderClosed
;
src/pages/orderManage/equipmentOrder/comp/orderConfirm/index.tsx
deleted
100644 → 0
浏览文件 @
5a5d1bde
import
{
InterListType
,
InterReqType
}
from
'~/api/interface'
;
import
{
listPcWechatOrderType
,
pfConfirmOrderWareType
}
from
'~/api/interface/orderManageType'
;
import
React
,
{
useEffect
}
from
'react'
;
import
{
Col
,
Form
,
Input
,
message
,
Modal
,
Radio
,
Row
}
from
'antd'
;
import
{
Uploader
}
from
'~/components/uploader'
;
import
{
PlusOutlined
}
from
'@ant-design/icons'
;
import
{
OrderManageAPI
}
from
'~/api'
;
// 表格数据类型
type
TableType
=
InterListType
<
listPcWechatOrderType
>
;
// 请求数据的类型
type
ReqType
=
InterReqType
<
pfConfirmOrderWareType
>
;
// 传参类型
interface
propType
{
title
:
string
;
open
:
boolean
;
closed
:
any
;
data
?:
TableType
[
0
];
}
const
OrderConfirm
:
React
.
FC
<
propType
>
=
(
props
)
=>
{
OrderConfirm
.
defaultProps
=
{
data
:
undefined
,
};
// 参数
const
{
title
,
open
,
closed
,
data
}
=
props
;
// 物流列表
const
[
expressList
,
setExpressList
]
=
React
.
useState
<
{
label
:
string
;
value
:
string
}[]
>
([]);
// 表单钩子
const
[
form
]
=
Form
.
useForm
<
ReqType
>
();
// 关闭弹窗
const
handleCancel
=
()
=>
{
form
.
resetFields
();
closed
();
};
// 确认事件
const
handleOk
=
()
=>
{
form
.
validateFields
()
.
then
(
async
(
values
)
=>
{
// console.log('确认事件 --->', values);
await
handleSubmit
(
values
);
})
.
catch
((
err
)
=>
{
message
.
warning
({
content
:
err
.
errorFields
[
0
].
errors
[
0
],
})
.
then
();
});
};
// 提交事件
const
handleSubmit
=
async
(
values
:
ReqType
)
=>
{
const
res
=
await
OrderManageAPI
.
pfConfirmOrderWare
({
...
values
,
orderInfoId
:
Number
(
data
?.
id
),
});
if
(
res
&&
res
.
code
===
'200'
)
{
message
.
success
(
'操作成功'
);
handleCancel
();
}
};
// 获取物流信息
const
getListExpressInfo
=
async
()
=>
{
const
res
=
await
OrderManageAPI
.
listExpressInfo
({});
if
(
res
&&
res
.
code
===
'200'
)
{
setExpressList
(
res
.
result
.
map
((
item
)
=>
({
label
:
item
.
exName
,
value
:
item
.
exCode
})));
// console.log(res);
}
};
// 转换物流信息
const
getExpressInfo
=
(
code
:
string
|
undefined
|
null
)
=>
{
return
expressList
.
find
((
item
)
=>
item
.
value
===
code
)?.
label
||
code
;
};
// componentDidMount
useEffect
(()
=>
{
if
(
!
open
)
return
;
if
(
!
data
)
return
;
getListExpressInfo
().
then
();
console
.
log
(
'data --->'
,
data
);
},
[
open
]);
return
(
<
Modal
open=
{
open
}
title=
{
title
}
onCancel=
{
handleCancel
}
onOk=
{
handleOk
}
destroyOnClose
width=
{
600
}
>
<
Form
name=
'addForm'
form=
{
form
}
labelAlign=
'right'
labelCol=
{
{
span
:
8
}
}
wrapperCol=
{
{
span
:
16
}
}
autoComplete=
'new-password'
>
<
Form
.
Item
label=
'收货方式'
labelCol=
{
{
span
:
4
}
}
>
物流归还
</
Form
.
Item
>
<
Form
.
Item
label=
'物流单号'
labelCol=
{
{
span
:
4
}
}
>
{
data
?.
receipt
?.
sendExNo
}
</
Form
.
Item
>
<
Form
.
Item
label=
'物流公司'
labelCol=
{
{
span
:
4
}
}
>
{
getExpressInfo
(
data
?.
receipt
?.
sendExCode
)
}
</
Form
.
Item
>
<
Row
gutter=
{
{
xs
:
8
,
sm
:
16
,
md
:
24
}
}
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'质检照片'
name=
'imgs'
rules=
{
[{
required
:
true
,
message
:
'请上传质检照片'
}]
}
>
<
Uploader
listType=
{
'picture-card'
}
fileUpload
fileLength=
{
3
}
onChange=
{
(
e
)
=>
{
form
.
setFieldValue
(
'imgs'
,
e
.
map
((
item
)
=>
item
.
url
),
);
}
}
>
<
PlusOutlined
/>
</
Uploader
>
</
Form
.
Item
>
</
Col
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'质检视频'
name=
'videoUrl'
rules=
{
[{
required
:
true
,
message
:
'请上传质检视频'
}]
}
>
<
Uploader
listType=
{
'picture-card'
}
fileUpload
fileLength=
{
1
}
fileType=
{
[
'video/mp4'
,
'video/avi'
,
'video/wmv'
,
'video/rmvb'
]
}
fileSize=
{
10
}
onChange=
{
(
e
)
=>
{
form
.
setFieldValue
(
'videoUrl'
,
e
[
0
].
url
);
}
}
>
<
PlusOutlined
/>
</
Uploader
>
</
Form
.
Item
>
</
Col
>
</
Row
>
<
Row
gutter=
{
{
xs
:
8
,
sm
:
16
,
md
:
24
}
}
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'设备状态'
name=
'vcuSatus'
rules=
{
[{
required
:
true
,
message
:
'请选择设备状态'
}]
}
initialValue=
{
0
}
>
<
Radio
.
Group
options=
{
[
{
label
:
'正常'
,
value
:
0
},
{
label
:
'故障'
,
value
:
1
},
]
}
onChange=
{
(
e
)
=>
{
form
.
setFieldValue
(
'vcuSatus'
,
e
.
target
.
value
);
}
}
/>
</
Form
.
Item
>
</
Col
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'操作密码'
name=
'authPwd'
rules=
{
[{
required
:
true
,
message
:
'请输入操作密码'
}]
}
>
<
Input
.
Password
placeholder=
{
'请输入操作密码'
}
maxLength=
{
20
}
allowClear
autoComplete=
'new-password'
/>
</
Form
.
Item
>
</
Col
>
</
Row
>
</
Form
>
</
Modal
>
);
};
export
default
OrderConfirm
;
src/pages/orderManage/equipmentOrder/comp/orderDeliver/index.tsx
deleted
100644 → 0
浏览文件 @
5a5d1bde
import
{
InterListType
,
InterReqType
}
from
'~/api/interface'
;
import
{
listPcWechatOrderType
,
sendOrderWareType
}
from
'~/api/interface/orderManageType'
;
import
React
,
{
useEffect
}
from
'react'
;
import
{
Col
,
Form
,
Input
,
message
,
Modal
,
Radio
,
Row
,
Select
}
from
'antd'
;
import
{
Uploader
}
from
'~/components/uploader'
;
import
{
PlusOutlined
}
from
'@ant-design/icons'
;
import
{
OrderManageAPI
}
from
'~/api'
;
// 表格数据类型
type
TableType
=
InterListType
<
listPcWechatOrderType
>
;
// 请求数据的类型
type
ReqType
=
InterReqType
<
sendOrderWareType
>
;
// 传参类型
interface
propType
{
title
:
string
;
open
:
boolean
;
closed
:
any
;
data
?:
TableType
[
0
];
}
const
OrderDeliver
:
React
.
FC
<
propType
>
=
(
props
)
=>
{
OrderDeliver
.
defaultProps
=
{
data
:
undefined
,
};
// 参数
const
{
title
,
open
,
closed
,
data
}
=
props
;
// 物流列表
const
[
expressList
,
setExpressList
]
=
React
.
useState
<
{
label
:
string
;
value
:
string
}[]
>
([]);
// 表单钩子
const
[
form
]
=
Form
.
useForm
<
ReqType
>
();
// 关闭弹窗
const
handleCancel
=
()
=>
{
form
.
resetFields
();
closed
();
};
// 确认事件
const
handleOk
=
()
=>
{
form
.
validateFields
()
.
then
(
async
(
values
)
=>
{
// console.log('确认事件 --->', values);
await
handleSubmit
(
values
);
})
.
catch
((
err
)
=>
{
message
.
warning
({
content
:
err
.
errorFields
[
0
].
errors
[
0
],
})
.
then
();
});
};
// 提交事件
const
handleSubmit
=
async
(
values
:
ReqType
)
=>
{
const
res
=
await
OrderManageAPI
.
sendOrderWare
({
...
values
,
orderInfoId
:
Number
(
data
?.
id
),
});
if
(
res
&&
res
.
code
===
'200'
)
{
message
.
success
(
'操作成功'
);
handleCancel
();
}
};
// 获取物流信息
const
getListExpressInfo
=
async
()
=>
{
const
res
=
await
OrderManageAPI
.
listExpressInfo
({});
if
(
res
&&
res
.
code
===
'200'
)
{
setExpressList
(
res
.
result
.
map
((
item
)
=>
({
label
:
item
.
exName
,
value
:
item
.
exCode
})));
// console.log(res);
}
};
// componentDidMount
useEffect
(()
=>
{
if
(
!
open
)
return
;
if
(
!
data
)
return
;
getListExpressInfo
().
then
();
// console.log('data --->', data);
},
[
open
]);
return
(
<
Modal
open=
{
open
}
title=
{
title
}
onCancel=
{
handleCancel
}
onOk=
{
handleOk
}
destroyOnClose
width=
{
600
}
>
<
Form
name=
'addForm'
form=
{
form
}
labelAlign=
'right'
labelCol=
{
{
span
:
8
}
}
wrapperCol=
{
{
span
:
16
}
}
autoComplete=
'new-password'
>
<
Form
.
Item
label=
'收货地址'
labelCol=
{
{
span
:
4
}
}
>
{
data
?.
receipt
?.
takeName
}
{
data
?.
receipt
?.
takePhone
}
{
data
?.
receipt
?.
detailAddress
}
</
Form
.
Item
>
<
Form
.
Item
label=
'发货方式'
labelCol=
{
{
span
:
4
}
}
>
物流发货
</
Form
.
Item
>
<
Row
gutter=
{
{
xs
:
8
,
sm
:
16
,
md
:
24
}
}
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'物流单号'
name=
'sendExNo'
rules=
{
[{
required
:
true
,
message
:
'请输入物流单号'
}]
}
>
<
Input
placeholder=
{
'请输入物流单号'
}
maxLength=
{
20
}
allowClear
/>
</
Form
.
Item
>
</
Col
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'物流公司'
name=
'sendExCode'
rules=
{
[{
required
:
true
,
message
:
'请选择物流公司'
}]
}
>
<
Select
placeholder=
{
'请选择物流公司'
}
options=
{
expressList
}
allowClear
/>
</
Form
.
Item
>
</
Col
>
</
Row
>
<
Row
gutter=
{
{
xs
:
8
,
sm
:
16
,
md
:
24
}
}
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'归还联系人'
name=
'renName'
rules=
{
[{
required
:
true
,
message
:
'请输入归还联系人'
}]
}
>
<
Input
placeholder=
{
'请输入归还联系人'
}
maxLength=
{
20
}
allowClear
/>
</
Form
.
Item
>
</
Col
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'归还电话'
name=
'renPhone'
rules=
{
[
{
required
:
true
,
message
:
'请输入归还联系人电话'
},
// 校验手机号
()
=>
({
validator
(
_
,
value
)
{
if
(
!
value
||
/^1
[
3-9
]\d
{9}$/
.
test
(
value
))
{
return
Promise
.
resolve
();
}
return
Promise
.
reject
(
'请输入正确的手机号'
);
},
}),
]
}
>
<
Input
placeholder=
{
'请输入归还联系人电话'
}
maxLength=
{
20
}
allowClear
type=
{
'number'
}
/>
</
Form
.
Item
>
</
Col
>
</
Row
>
<
Row
gutter=
{
{
xs
:
8
,
sm
:
16
,
md
:
24
}
}
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'归还地址'
name=
'renAddress'
rules=
{
[{
required
:
true
,
message
:
'请输入归还地址'
}]
}
>
<
Input
placeholder=
{
'请输入归还地址'
}
maxLength=
{
20
}
allowClear
/>
</
Form
.
Item
>
</
Col
>
</
Row
>
<
Row
gutter=
{
{
xs
:
8
,
sm
:
16
,
md
:
24
}
}
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'质检照片'
name=
'imgs'
rules=
{
[{
required
:
true
,
message
:
'请上传质检照片'
}]
}
>
<
Uploader
listType=
{
'picture-card'
}
fileUpload
fileLength=
{
3
}
onChange=
{
(
e
)
=>
{
form
.
setFieldValue
(
'imgs'
,
e
.
map
((
item
)
=>
item
.
url
),
);
}
}
>
<
PlusOutlined
/>
</
Uploader
>
</
Form
.
Item
>
</
Col
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'质检视频'
name=
'videoUrl'
rules=
{
[{
required
:
true
,
message
:
'请上传质检视频'
}]
}
>
<
Uploader
listType=
{
'picture-card'
}
fileUpload
fileLength=
{
1
}
fileType=
{
[
'video/mp4'
,
'video/avi'
,
'video/wmv'
,
'video/rmvb'
]
}
fileSize=
{
10
}
onChange=
{
(
e
)
=>
{
form
.
setFieldValue
(
'videoUrl'
,
e
[
0
].
url
);
}
}
>
<
PlusOutlined
/>
</
Uploader
>
</
Form
.
Item
>
</
Col
>
</
Row
>
<
Row
gutter=
{
{
xs
:
8
,
sm
:
16
,
md
:
24
}
}
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'设备状态'
name=
'vcuSatus'
rules=
{
[{
required
:
true
,
message
:
'请选择设备状态'
}]
}
initialValue=
{
0
}
>
<
Radio
.
Group
options=
{
[
{
label
:
'正常'
,
value
:
0
},
{
label
:
'故障'
,
value
:
1
},
]
}
onChange=
{
(
e
)
=>
{
form
.
setFieldValue
(
'vcuSatus'
,
e
.
target
.
value
);
}
}
/>
</
Form
.
Item
>
</
Col
>
<
Col
span=
{
11
}
>
<
Form
.
Item
label=
'操作密码'
name=
'authPwd'
rules=
{
[{
required
:
true
,
message
:
'请输入操作密码'
}]
}
>
<
Input
.
Password
placeholder=
{
'请输入操作密码'
}
maxLength=
{
20
}
allowClear
autoComplete=
'new-password'
/>
</
Form
.
Item
>
</
Col
>
</
Row
>
</
Form
>
</
Modal
>
);
};
export
default
OrderDeliver
;
src/pages/orderManage/equipmentOrder/comp/orderRefund/index.tsx
deleted
100644 → 0
浏览文件 @
5a5d1bde
import
{
InterListType
,
InterReqType
}
from
'~/api/interface'
;
import
{
listPcWechatOrderType
,
refundOrderType
}
from
'~/api/interface/orderManageType'
;
import
React
from
'react'
;
import
{
Form
,
message
,
Modal
,
Radio
}
from
'antd'
;
import
{
OrderManageAPI
}
from
'~/api'
;
// 表格数据类型
type
TableType
=
InterListType
<
listPcWechatOrderType
>
;
// 请求数据的类型
type
ReqType
=
InterReqType
<
refundOrderType
>
;
// 传参类型
interface
propType
{
title
:
string
;
open
:
boolean
;
closed
:
any
;
data
?:
TableType
[
0
];
}
const
OrderRefund
:
React
.
FC
<
propType
>
=
(
props
)
=>
{
OrderRefund
.
defaultProps
=
{
data
:
undefined
,
};
// 参数
const
{
title
,
open
,
closed
,
data
}
=
props
;
// 表单钩子
const
[
form
]
=
Form
.
useForm
<
ReqType
>
();
// 关闭弹窗
const
handleCancel
=
()
=>
{
form
.
resetFields
();
closed
();
};
// 确认事件
const
handleOk
=
()
=>
{
form
.
validateFields
()
.
then
(
async
(
values
)
=>
{
// console.log('确认事件 --->', values);
await
handleSubmit
(
values
);
})
.
catch
((
err
)
=>
{
message
.
warning
({
content
:
err
.
errorFields
[
0
].
errors
[
0
],
})
.
then
();
});
};
// 提交事件
const
handleSubmit
=
async
(
values
:
ReqType
)
=>
{
const
res
=
await
OrderManageAPI
.
refundOrder
({
...
values
,
orderInfoId
:
Number
(
data
?.
id
),
});
if
(
res
&&
res
.
code
===
'200'
)
{
message
.
success
(
'操作成功'
);
handleCancel
();
}
};
return
(
<
Modal
open=
{
open
}
title=
{
title
}
onCancel=
{
handleCancel
}
onOk=
{
handleOk
}
destroyOnClose
width=
{
400
}
>
<
Form
name=
'addForm'
form=
{
form
}
labelAlign=
'right'
labelCol=
{
{
span
:
6
}
}
wrapperCol=
{
{
span
:
12
}
}
>
<
Form
.
Item
label=
'是否同意'
name=
'refund'
rules=
{
[{
required
:
true
,
message
:
'请选择是否同意'
}]
}
>
<
Radio
.
Group
options=
{
[
{
label
:
'同意退款'
,
value
:
true
},
{
label
:
'拒绝退款'
,
value
:
false
},
]
}
/>
</
Form
.
Item
>
</
Form
>
</
Modal
>
);
};
export
default
OrderRefund
;
src/pages/orderManage/equipmentOrder/comp/shipmentsOrder/index.tsx
0 → 100644
浏览文件 @
850dee5d
import
{
FC
,
useEffect
,
useState
}
from
'react'
;
import
{
Cascader
,
Form
,
Input
,
message
,
Modal
,
ModalProps
,
Select
}
from
'antd'
;
import
{
OrderManageAPI
}
from
'~/api'
;
import
{
InterReqType
}
from
'~/api/interface'
;
import
{
rentOrderSendType
}
from
'~/api/interface/orderManageType'
;
import
regionData
from
'~/assets/json/district.json'
;
// 发货请求类型
type
sendMallType
=
Omit
<
Exclude
<
InterReqType
<
rentOrderSendType
>
,
undefined
>
,
'takeRegion'
>
&
{
takeRegion
:
string
[];
};
interface
selfProps
{
currentOrderItem
:
any
;
onCancel
:
()
=>
void
;
onOk
:
()
=>
void
;
}
const
ShipmentsOrder
:
FC
<
ModalProps
&
selfProps
>
=
({
onOk
,
onCancel
,
open
,
currentOrderItem
})
=>
{
const
[
form
]
=
Form
.
useForm
<
sendMallType
>
();
const
[
listExpressInfo
,
setListExpressInfo
]
=
useState
<
{
label
:
string
;
value
:
string
}[]
>
([]);
//获取物流公司列表
const
getExpressList
=
()
=>
{
OrderManageAPI
.
listExpressInfo
().
then
(({
result
})
=>
{
setListExpressInfo
(
result
?.
map
((
v
)
=>
({
label
:
v
.
exName
,
value
:
v
.
exCode
}))
||
[]);
});
};
const
handleOk
=
()
=>
{
form
.
validateFields
().
then
((
value
)
=>
{
OrderManageAPI
.
rentOrderSend
({
...
value
,
uavOrderId
:
currentOrderItem
?.
id
,
id
:
currentOrderItem
?.
uavOrderExpressDTO
.
id
,
takeRegion
:
value
?.
takeRegion
?.
join
(
'/'
),
}).
then
(({
code
})
=>
{
if
(
code
===
'200'
)
{
message
.
success
(
'发货成功'
);
form
.
resetFields
();
onOk
();
}
});
});
};
const
handleCancel
=
()
=>
{
form
.
resetFields
();
onCancel
();
};
useEffect
(()
=>
{
if
(
open
)
{
getExpressList
();
}
},
[
open
]);
useEffect
(()
=>
{
if
(
currentOrderItem
&&
open
)
{
form
.
setFieldsValue
({
takeName
:
currentOrderItem
.
uavOrderExpressDTO
.
takeName
,
takePhone
:
currentOrderItem
.
uavOrderExpressDTO
.
takePhone
,
takeRegion
:
currentOrderItem
.
uavOrderExpressDTO
.
takeRegion
.
split
(
'/'
),
takeAddress
:
currentOrderItem
.
uavOrderExpressDTO
.
takeAddress
,
});
}
},
[
currentOrderItem
]);
return
(
<
Modal
open=
{
open
}
title=
'发货'
onOk=
{
handleOk
}
onCancel=
{
handleCancel
}
>
<
Form
name=
'basic'
labelCol=
{
{
span
:
4
}
}
wrapperCol=
{
{
span
:
16
}
}
initialValues=
{
{
remember
:
true
}
}
autoComplete=
'off'
form=
{
form
}
>
<
Form
.
Item
label=
'物流公司'
name=
'sendExpCode'
rules=
{
[
{
required
:
true
,
message
:
'请选择物流公司'
,
},
]
}
>
<
Select
placeholder=
'请选择物流公司'
allowClear
options=
{
listExpressInfo
}
></
Select
>
</
Form
.
Item
>
<
Form
.
Item
label=
'物流编号'
name=
'sendExpNo'
rules=
{
[
{
required
:
true
,
message
:
'请输入物流编号'
,
},
]
}
>
<
Input
placeholder=
'请输入物流编号'
allowClear
maxLength=
{
50
}
/>
</
Form
.
Item
>
<
Form
.
Item
label=
'用户姓名'
name=
'takeName'
rules=
{
[
{
required
:
true
,
message
:
'请输入用户姓名'
,
},
]
}
>
<
Input
placeholder=
'请输入用户姓名'
allowClear
maxLength=
{
30
}
/>
</
Form
.
Item
>
<
Form
.
Item
label=
'手机号'
name=
'takePhone'
rules=
{
[
{
required
:
true
,
message
:
'请输入手机号'
,
},
{
pattern
:
/^1
[
3-9
]\d
{9}$/
,
message
:
'手机号格式不正确'
,
},
]
}
>
<
Input
placeholder=
'请输入手机号'
allowClear
maxLength=
{
30
}
/>
</
Form
.
Item
>
<
Form
.
Item
label=
'收货地址'
name=
'takeRegion'
rules=
{
[
{
required
:
false
,
message
:
'请选择收货地址'
,
},
]
}
>
<
Cascader
options=
{
regionData
}
placeholder=
'请选择收货地址'
allowClear
fieldNames=
{
{
label
:
'name'
,
value
:
'name'
,
children
:
'childInfo'
,
}
}
/>
</
Form
.
Item
>
<
Form
.
Item
label=
'详细地址'
name=
'takeAddress'
rules=
{
[
{
required
:
false
,
message
:
'请输入详细地址'
,
},
]
}
>
<
Input
.
TextArea
maxLength=
{
70
}
showCount
placeholder=
'请输入详细地址'
allowClear
/>
</
Form
.
Item
>
</
Form
>
</
Modal
>
);
};
export
default
ShipmentsOrder
;
src/pages/orderManage/equipmentOrder/detail/index.scss
浏览文件 @
850dee5d
...
@@ -3,24 +3,7 @@
...
@@ -3,24 +3,7 @@
box-sizing
:
border-box
;
box-sizing
:
border-box
;
.order-head
{
.order-head
{
width
:
100%
;
text-align
:
right
;
display
:
flex
;
align-items
:
center
;
justify-content
:
space-between
;
.head-text
{
font-size
:
13px
;
font-weight
:
600
;
color
:
#000000
;
div
{
margin-bottom
:
10px
;
span
{
margin-right
:
20px
;
}
}
}
}
}
.detail-wrap
{
.detail-wrap
{
...
...
src/pages/orderManage/equipmentOrder/detail/index.tsx
浏览文件 @
850dee5d
...
@@ -2,25 +2,27 @@ import { useEffect, useState } from 'react';
...
@@ -2,25 +2,27 @@ import { useEffect, useState } from 'react';
import
{
useNavigate
,
useSearchParams
}
from
'react-router-dom'
;
import
{
useNavigate
,
useSearchParams
}
from
'react-router-dom'
;
import
{
Button
}
from
'antd'
;
import
{
Button
}
from
'antd'
;
import
'./index.scss'
;
import
'./index.scss'
;
import
DetailDelivery
from
'~/pages/orderManage/equipmentOrder/comp/detailDelivery'
;
import
DetailPurchaser
from
'~/pages/orderManage/equipmentOrder/comp/detailPurchaser'
;
import
DetailPurchaser
from
'~/pages/orderManage/equipmentOrder/comp/detailPurchaser'
;
import
DetailInformation
from
'~/pages/orderManage/equipmentOrder/comp/detailInformation'
;
import
DetailInformation
from
'~/pages/orderManage/equipmentOrder/comp/detailInformation'
;
import
{
OrderManageAPI
}
from
'~/api'
;
import
{
OrderManageAPI
}
from
'~/api'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
InterDataType
}
from
'~/api/interface'
;
import
{
orderDetailType
}
from
'~/api/interface/orderManageType'
;
import
{
rentOrderDetailType
,
rentOrderDictType
}
from
'~/api/interface/orderManageType'
;
import
DetailTimeLine
from
'~/pages/orderManage/equipmentOrder/comp/detailTimeLine'
;
// import DetailMessageBox from '~/pages/orderManage/equipmentOrder/comp/detailMessageBox';
// 接口返回的类型
// 接口返回的类型
type
DataType
=
InterDataType
<
orderDetailType
>
;
type
DataType
=
InterDataType
<
rentOrderDetailType
>
;
// 订单状态返回类型
type
OrderStatusType
=
InterDataType
<
rentOrderDictType
>
;
function
EquipmentOrderDetail
()
{
function
EquipmentOrderDetail
()
{
// 路由钩子
// 路由钩子
const
navigate
=
useNavigate
();
const
navigate
=
useNavigate
();
// 参数钩子
// 参数钩子
const
[
searchParams
]
=
useSearchParams
();
const
[
searchParams
]
=
useSearchParams
();
// 接收到的参数
// 订单id
const
orderNo
=
searchParams
.
get
(
'orderNo'
)
as
string
;
// const [orderId, setOrderId] = useState<number>(0);
// 订单状态字典
const
[
orderStatusList
,
setOrderStatusList
]
=
useState
<
OrderStatusType
>
([]);
// 返回上一页
// 返回上一页
const
handleBack
=
()
=>
{
const
handleBack
=
()
=>
{
navigate
(
-
1
);
navigate
(
-
1
);
...
@@ -28,42 +30,38 @@ function EquipmentOrderDetail() {
...
@@ -28,42 +30,38 @@ function EquipmentOrderDetail() {
// 订单详情
// 订单详情
const
[
orderDetail
,
setOrderDetail
]
=
useState
<
DataType
>
(
null
!
);
const
[
orderDetail
,
setOrderDetail
]
=
useState
<
DataType
>
(
null
!
);
// 获取订单详情
// 获取订单详情
const
getOrderDetail
=
async
()
=>
{
const
getOrderDetail
=
(
id
:
number
)
=>
{
const
res
=
await
OrderManageAPI
.
orderDetail
({
OrderManageAPI
.
getRentOrderDetail
({
orderNo
:
orderNo
,
id
,
}).
then
(({
result
})
=>
{
if
(
result
)
{
setOrderDetail
(
result
);
}
});
};
// 获取订单状态
const
getOrderStatus
=
()
=>
{
OrderManageAPI
.
getRentOrderDict
().
then
(({
result
})
=>
{
setOrderStatusList
(
result
||
[]);
});
});
if
(
res
&&
res
.
code
===
'200'
)
{
setOrderDetail
(
res
.
result
);
// console.log('获取订单详情 --->', res.result);
}
};
};
// componentDidMount
// componentDidMount
useEffect
(()
=>
{
useEffect
(()
=>
{
getOrderDetail
().
then
();
// setOrderId(Number(searchParams.get('id') || 0));
},
[
orderNo
]);
getOrderDetail
(
Number
(
searchParams
.
get
(
'id'
)
||
0
));
getOrderStatus
();
},
[]);
return
(
return
(
<
div
className=
{
'order-detail'
}
>
<
div
className=
'order-detail'
>
<
div
className=
{
'order-head'
}
>
<
div
className=
'order-head'
>
<
div
className=
'head-text'
>
<
Button
type=
'primary'
onClick=
{
()
=>
handleBack
()
}
>
<
div
>
<
span
>
订单编号:
{
orderDetail
?.
orderNo
}
</
span
>
<
span
style=
{
{
display
:
'none'
}
}
>
合同编号:UAV202334741131
</
span
>
</
div
>
<
div
>
<
span
>
当前状态:
{
orderDetail
?.
waiting
}
</
span
>
<
span
>
创建时间:
{
orderDetail
?.
createTime
}
</
span
>
</
div
>
</
div
>
<
Button
type=
{
'primary'
}
onClick=
{
()
=>
handleBack
()
}
>
返回
返回
</
Button
>
</
Button
>
</
div
>
</
div
>
<
div
className=
{
'detail-wrap'
}
>
<
div
className=
'detail-wrap'
>
<
DetailPurchaser
detail=
{
orderDetail
}
/>
<
DetailPurchaser
detail=
{
orderDetail
}
/>
<
DetailDelivery
detail=
{
orderDetail
}
/>
<
DetailInformation
detail=
{
orderDetail
}
orderStatusList=
{
orderStatusList
}
/>
<
DetailTimeLine
detail=
{
orderDetail
}
/>
{
/*<DetailMessageBox />*/
}
<
DetailInformation
detail=
{
orderDetail
}
/>
</
div
>
</
div
>
</
div
>
</
div
>
);
);
...
...
src/pages/orderManage/equipmentOrder/index.scss
0 → 100644
浏览文件 @
850dee5d
.equipment-order
{
.mall-sku-item
{
display
:
flex
;
align-items
:
center
;
margin-bottom
:
10px
;
.sku-img
{
width
:
48px
;
height
:
48px
;
}
.sku-info
{
margin-left
:
10px
;
line-height
:
16px
;
text-align
:
left
;
.info-name
{
color
:
#1677ff
}
.info-spec
{
margin-top
:
10px
;
span
:not
(
:last-child
)
{
&
:after
{
content
:
';'
;
}
}
}
}
}
}
src/pages/orderManage/equipmentOrder/index.tsx
浏览文件 @
850dee5d
...
@@ -5,43 +5,32 @@ import { ColumnsType } from 'antd/es/table';
...
@@ -5,43 +5,32 @@ import { ColumnsType } from 'antd/es/table';
import
{
useNavigate
}
from
'react-router-dom'
;
import
{
useNavigate
}
from
'react-router-dom'
;
import
qs
from
'query-string'
;
import
qs
from
'query-string'
;
import
{
InterListType
,
InterReqType
}
from
'~/api/interface'
;
import
{
InterListType
,
InterReqType
}
from
'~/api/interface'
;
import
{
listPcWechatOrder
Type
}
from
'~/api/interface/orderManageType'
;
import
{
rentOrderList
Type
}
from
'~/api/interface/orderManageType'
;
import
{
OrderManageAPI
}
from
'~/api'
;
import
{
OrderManageAPI
}
from
'~/api'
;
import
OrderDeliver
from
'src/pages/orderManage/equipmentOrder/comp/orderDeliver'
;
import
ShipmentsOrder
from
'./comp/shipmentsOrder'
;
import
OrderConfirm
from
'~/pages/orderManage/equipmentOrder/comp/orderConfirm'
;
import
ConfirmReturn
from
'./comp/confirmReturn'
;
import
OrderClosed
from
'~/pages/orderManage/equipmentOrder/comp/orderClosed'
;
import
TableItem
from
'~/components/order/selfTableItem'
;
import
OrderRefund
from
'~/pages/orderManage/equipmentOrder/comp/orderRefund'
;
import
'./index.scss'
;
import
{
filterObjAttr
}
from
'~/utils'
;
import
dayjs
from
'dayjs'
;
import
{
CommentOutlined
}
from
'@ant-design/icons'
;
import
{
useSelector
}
from
'react-redux'
;
// 表格数据类型
// 表格数据类型
type
TableType
=
InterListType
<
listPcWechatOrder
Type
>
;
type
TableType
=
InterListType
<
rentOrderList
Type
>
;
// 请求数据的类型
// 请求数据的类型
type
ReqType
=
InterReqType
<
listPcWechatOrder
Type
>
;
type
ReqType
=
InterReqType
<
rentOrderList
Type
>
;
// 搜索表单的数据
// 搜索表单的数据
let
query
:
ReqType
=
{};
let
query
:
ReqType
=
{};
// 订单状态
const
orderStatus
=
[
{
value
:
'100'
,
label
:
'等待买家付款'
,
button
:
'关闭订单'
},
{
value
:
'200'
,
label
:
'等待卖家发货'
,
button
:
'去发货'
},
{
value
:
'300'
,
label
:
'待买家收货'
},
{
value
:
'400'
,
label
:
'待归还'
},
{
value
:
'500'
,
label
:
'等待卖家确认'
,
button
:
'确认收货'
},
{
value
:
'600'
,
label
:
'交易完成'
},
{
value
:
'700'
,
label
:
'退款中'
,
button
:
'退款审批'
},
{
value
:
'999'
,
label
:
'订单关闭'
},
{
value
:
'1000'
,
label
:
'已取消'
},
];
function
EquipmentOrderView
()
{
function
EquipmentOrderView
()
{
// 路由钩子
// 路由钩子
const
navigate
=
useNavigate
();
const
navigate
=
useNavigate
();
const
{
userInfo
}
=
useSelector
((
state
:
any
)
=>
state
.
UserInfo
);
// 发货弹窗是否显示
// 发货弹窗是否显示
const
[
deliverVisible
,
setDeliverVisible
]
=
useState
<
boolean
>
(
false
);
const
[
deliverVisible
,
setDeliverVisible
]
=
useState
<
boolean
>
(
false
);
// 收货弹窗是否显示
// 确认归还
const
[
confirmVisible
,
setConfirmVisible
]
=
useState
<
boolean
>
(
false
);
const
[
confirmReturnShow
,
setConfirmReturnShow
]
=
useState
<
boolean
>
(
false
);
// 关闭弹窗是否显示
const
[
closedVisible
,
setClosedVisible
]
=
useState
<
boolean
>
(
false
);
// 退款弹窗是否显示
const
[
refundVisible
,
setRefundVisible
]
=
useState
<
boolean
>
(
false
);
// 当前选择的是第几个按钮
// 当前选择的是第几个按钮
const
[
statusCodeButtonIndex
,
setStatusCodeButtonIndex
]
=
useState
<
number
>
(
0
);
const
[
statusCodeButtonIndex
,
setStatusCodeButtonIndex
]
=
useState
<
number
>
(
0
);
// 订单状态搜索列表
// 订单状态搜索列表
...
@@ -58,18 +47,17 @@ function EquipmentOrderView() {
...
@@ -58,18 +47,17 @@ function EquipmentOrderView() {
// 表格数据
// 表格数据
const
[
tableData
,
setTableData
]
=
useState
<
TableType
>
([]);
const
[
tableData
,
setTableData
]
=
useState
<
TableType
>
([]);
// 需要编辑的数据
// 需要编辑的数据
const
[
editData
,
setEditData
]
=
useState
<
TableType
[
0
]
>
();
// 用于编辑
const
[
currentOrderItem
,
setCurrentOrderItem
]
=
useState
<
TableType
[
0
]
>
();
// 加载列表
// 加载列表
const
getTableList
=
async
(
value
=
{})
=>
{
const
getTableList
=
(
value
=
{})
=>
{
// 只需要修改这个地方的接口即可
// 只需要修改这个地方的接口即可
const
res
=
await
OrderManageAPI
.
listPcWechatOrder
({
OrderManageAPI
.
getRentOrderList
({
pageNo
:
pagination
.
current
,
pageNo
:
pagination
.
current
,
pageSize
:
pagination
.
pageSize
,
pageSize
:
pagination
.
pageSize
,
...
value
,
...
value
,
...
query
,
...
query
,
});
}).
then
(({
result
})
=>
{
if
(
res
&&
res
.
code
===
'200'
)
{
const
{
list
,
pageNo
,
totalCount
,
pageSize
,
totalPage
}
=
result
;
// 解构
const
{
list
,
pageNo
,
totalCount
,
pageSize
,
totalPage
}
=
res
.
result
;
// 解构
setPagination
({
setPagination
({
total
:
totalCount
,
total
:
totalCount
,
current
:
pageNo
,
current
:
pageNo
,
...
@@ -77,18 +65,17 @@ function EquipmentOrderView() {
...
@@ -77,18 +65,17 @@ function EquipmentOrderView() {
totalPage
,
totalPage
,
});
});
setTableData
(
list
);
setTableData
(
list
);
// console.log('加载列表 --->', list);
});
}
};
};
// 翻页
// 翻页
const
paginationChange
=
(
pageNo
:
number
,
pageSize
:
number
)
=>
{
const
paginationChange
=
(
pageNo
:
number
,
pageSize
:
number
)
=>
{
getTableList
({
pageNo
,
pageSize
})
.
then
()
;
getTableList
({
pageNo
,
pageSize
});
};
};
// 表单提交
// 表单提交
const
onFinish
=
(
data
:
ReqType
)
=>
{
const
onFinish
=
(
data
:
ReqType
)
=>
{
pagination
.
current
=
1
;
pagination
.
current
=
1
;
query
=
data
;
query
=
filterObjAttr
(
data
,
[
'rangeTime'
])
;
getTableList
(
data
).
then
(
);
getTableList
(
query
);
};
};
// 订单状态筛选
// 订单状态筛选
const
statusChangeEvent
=
(
i
:
number
)
=>
{
const
statusChangeEvent
=
(
i
:
number
)
=>
{
...
@@ -97,8 +84,8 @@ function EquipmentOrderView() {
...
@@ -97,8 +84,8 @@ function EquipmentOrderView() {
}
else
{
}
else
{
setStatusCodeButtonIndex
(
i
);
setStatusCodeButtonIndex
(
i
);
}
}
query
=
{
...
query
,
tranStatus
:
tranStatusList
[
i
].
value
};
query
=
{
...
query
,
statusCode
:
Number
(
tranStatusList
[
i
].
value
)
};
getTableList
()
.
then
()
;
getTableList
();
};
};
// 跳转订单详情
// 跳转订单详情
const
handleDetail
=
(
record
:
TableType
[
0
])
=>
{
const
handleDetail
=
(
record
:
TableType
[
0
])
=>
{
...
@@ -106,129 +93,228 @@ function EquipmentOrderView() {
...
@@ -106,129 +93,228 @@ function EquipmentOrderView() {
navigate
(
`/orderManage/equipmentOrder/detail?
${
qs
.
stringify
(
search
)}
`
);
navigate
(
`/orderManage/equipmentOrder/detail?
${
qs
.
stringify
(
search
)}
`
);
};
};
// 获取订单状态
// 获取订单状态
const
getOrderStatus
=
async
()
=>
{
const
getOrderStatus
=
()
=>
{
const
res
=
await
OrderManageAPI
.
listTranStatus
({});
OrderManageAPI
.
getRentOrderDict
().
then
(({
result
})
=>
{
if
(
res
&&
res
.
code
===
'200'
)
{
const
arr
=
result
.
map
((
item
)
=>
({
value
:
item
.
status
,
label
:
item
.
waiting
}));
const
arr
=
res
.
result
.
map
((
item
)
=>
({
value
:
item
.
status
,
label
:
item
.
waiting
}));
setTranStatusList
([{
value
:
undefined
,
label
:
'全部订单'
},
...
arr
]);
setTranStatusList
([{
value
:
undefined
,
label
:
'全部订单'
},
...
arr
]);
// console.log('getOrderStatus --->', arr);
});
}
};
// 是否显示按钮
const
showStatusButton
=
(
code
:
string
)
=>
{
return
orderStatus
.
filter
((
i
)
=>
i
.
button
)
.
map
((
i
)
=>
i
.
value
)
.
includes
(
code
);
};
// 转化按钮文字
const
getStatusButton
=
(
code
:
string
)
=>
{
return
orderStatus
.
filter
((
i
)
=>
i
.
button
).
find
((
i
)
=>
i
.
value
===
code
)?.
button
||
code
;
};
// 点击事件
const
handleAction
=
(
data
:
TableType
[
0
])
=>
{
const
{
tranStatus
}
=
data
;
setEditData
(
data
);
if
(
tranStatus
===
'100'
)
{
setClosedVisible
(
true
);
}
if
(
tranStatus
===
'200'
)
{
setDeliverVisible
(
true
);
}
if
(
tranStatus
===
'500'
)
{
setConfirmVisible
(
true
);
}
if
(
tranStatus
===
'700'
)
{
setRefundVisible
(
true
);
}
};
};
// 关闭弹窗
// 获取租赁订单详情
const
handleClosed
=
()
=>
{
const
getRentDetail
=
(
id
:
number
)
=>
{
setEditData
(
undefined
);
OrderManageAPI
.
getRentOrderDetail
({
id
}).
then
(({
result
})
=>
{
setDeliverVisible
(
false
);
if
(
result
)
{
setConfirmVisible
(
false
);
setCurrentOrderItem
(
result
);
setClosedVisible
(
false
);
}
setRefundVisible
(
false
);
});
paginationChange
(
pagination
.
current
,
pagination
.
pageSize
);
};
};
// componentDidMount
// componentDidMount
useEffect
(()
=>
{
useEffect
(()
=>
{
query
=
{};
query
=
{};
getOrderStatus
()
.
then
()
;
getOrderStatus
();
getTableList
()
.
then
()
;
getTableList
();
},
[]);
},
[]);
// 操作按钮列表
const
operateBtnList
=
[
{
label
:
'发货'
,
status
:
200
,
onClick
:
(
item
:
TableType
[
0
])
=>
{
getRentDetail
(
item
.
id
);
setDeliverVisible
(
true
);
},
},
{
label
:
'确认归还'
,
status
:
500
,
onClick
:
(
item
:
TableType
[
0
])
=>
{
getRentDetail
(
item
.
id
);
setConfirmReturnShow
(
true
);
},
},
{
label
:
'确认退款'
,
status
:
800
,
onClick
:
(
item
:
TableType
[
0
])
=>
{
getRentDetail
(
item
.
id
);
setConfirmReturnShow
(
true
);
},
},
];
// 获取当前按钮对象
const
getOperateBtnItem
=
(
code
:
number
)
=>
{
return
operateBtnList
.
find
((
i
)
=>
i
.
status
===
code
);
};
// 发货
const
shipmentsOrderOk
=
()
=>
{
setDeliverVisible
(
false
);
getTableList
(
query
);
};
const
shipmentsOrderCancel
=
()
=>
{
setDeliverVisible
(
false
);
};
//确认归还
const
confirmReturnCancel
=
()
=>
{
setConfirmReturnShow
(
false
);
};
const
confirmReturnOk
=
()
=>
{
setConfirmReturnShow
(
false
);
getTableList
(
query
);
};
// 表格结构
// 表格结构
const
columns
:
ColumnsType
<
TableType
[
0
]
>
=
[
const
columns
:
ColumnsType
<
TableType
[
0
]
>
=
[
{
{
title
:
'商品'
,
title
:
'商品'
,
dataIndex
:
'wareTitle'
,
align
:
'center'
,
align
:
'center'
,
width
:
250
,
width
:
'20%'
,
render
:
(
_text
,
record
)
=>
(
render
:
(
_text
,
record
)
=>
(
<
div
style=
{
{
display
:
'flex'
,
alignItems
:
'center'
}
}
>
<
TableItem
<
Image
src=
{
record
.
wareImg
}
style=
{
{
width
:
48
,
height
:
48
}
}
/>
tr=
{
<
div
style=
{
{
marginLeft
:
10
,
textAlign
:
'left'
,
lineHeight
:
'16px'
}
}
>
<
div
className=
'mall-sku-item'
>
<
div
style=
{
{
color
:
'#1677ff'
}
}
>
{
record
.
wareTitle
}
</
div
>
<
Image
src=
{
record
.
skuImg
}
className=
'sku-img'
/>
<
div
>
{
record
.
wareNo
}
</
div
>
<
div
className=
'sku-info'
>
<
div
>
订单编号:
{
record
.
orderNo
}
</
div
>
<
div
className=
'info-name'
>
{
record
.
orderName
}
</
div
>
<
div
>
创建时间:
{
record
.
createTime
}
</
div
>
<
div
className=
'info-spec'
>
</
div
>
{
Object
.
entries
(
JSON
.
parse
(
record
.
sku
)).
map
((
v
,
index
)
=>
(
</
div
>
<
span
key=
{
index
}
>
{
v
.
join
(
':'
)
}
</
span
>
))
}
</
div
>
</
div
>
</
div
>
}
td=
{
<
div
>
<
span
>
订单编号:
</
span
>
<
span
>
{
record
.
orderNo
}
</
span
>
</
div
>
}
/>
),
),
},
},
{
{
title
:
'单价(元)'
,
title
:
'租期'
,
dataIndex
:
'unitPrice'
,
align
:
'center'
,
align
:
'center'
,
render
:
(
text
)
=>
`¥
${
text
.
toLocaleString
()}
`
,
width
:
'15%'
,
render
:
(
_text
,
record
)
=>
(
<
TableItem
tr=
{
<
div
>
<
div
>
{
`${record.startDate}至${record.endDate}`
}
</
div
>
<
div
>
(
{
dayjs
(
record
.
endDate
).
diff
(
dayjs
(
record
.
startDate
),
'day'
)
}
天)
</
div
>
</
div
>
}
td=
{
<
div
>
{
`创建时间:${record.createTime}`
}
</
div
>
}
/>
),
},
},
{
{
title
:
'数量'
,
title
:
'数量'
,
align
:
'center'
,
dataIndex
:
'wareNum'
,
dataIndex
:
'wareNum'
,
render
:
(
text
)
=>
<
TableItem
tr=
{
text
}
/>,
},
{
title
:
'单价'
,
align
:
'center'
,
align
:
'center'
,
dataIndex
:
'unitPrice'
,
render
:
(
text
)
=>
<
TableItem
tr=
{
<
span
>
¥
{
text
?.
toLocaleString
()
}
</
span
>
}
/>,
},
},
{
{
title
:
'买家'
,
title
:
'买家'
,
dataIndex
:
'userName'
,
align
:
'center'
,
align
:
'center'
,
width
:
'130px'
,
width
:
'130px'
,
render
:
(
_text
,
record
)
=>
(
render
:
(
_text
,
record
)
=>
(
<>
<
TableItem
<
div
>
{
record
.
uid
}
</
div
>
tr=
{
<
div
>
<
div
>
{
record
.
buyerName
||
record
.
nickName
}
(
{
record
.
buyerPhone
}
)
<
div
>
</
div
>
{
record
.
userName
||
record
.
nickname
}
(
{
record
.
userAccountId
}
)
</>
</
div
>
<
div
>
{
record
.
phoneNum
}
</
div
>
{
record
.
userRemark
?
(
<
div
>
<
Tooltip
placement=
'top'
title=
{
record
.
userRemark
}
>
<
Button
icon=
{
<
CommentOutlined
/>
}
></
Button
>
</
Tooltip
>
</
div
>
)
:
(
''
)
}
</
div
>
}
/>
),
),
},
},
{
{
title
:
'订单状态'
,
title
:
'订单状态'
,
dataIndex
:
'
waiting
'
,
dataIndex
:
'
statusCode
'
,
align
:
'center'
,
align
:
'center'
,
width
:
'10%'
,
render
:
(
text
:
number
)
=>
(
<
TableItem
tr=
{
tranStatusList
.
find
((
v
)
=>
v
.
value
===
String
(
text
))?.
label
}
/>
),
},
},
{
{
title
:
'
实收款
'
,
title
:
'
押金
'
,
dataIndex
:
'
shouldPay
'
,
dataIndex
:
'
deposit
'
,
align
:
'center'
,
align
:
'center'
,
render
:
(
text
)
=>
`¥
${
text
.
toLocaleString
()}
`
,
width
:
'10%'
,
render
:
(
text
:
number
,
record
)
=>
(
<
TableItem
tr=
{
<
div
>
<
div
>
¥
{
(
text
*
record
.
wareNum
).
toLocaleString
()
}
</
div
>
<
div
>
{
record
.
shareCashPledge
?
(
<
span
>
云享金抵扣:¥
{
record
.
shareCashPledge
.
toLocaleString
()
}
</
span
>
)
:
(
''
)
}
{
record
.
salaryCashPledge
?
(
<
span
>
余额抵扣:¥
{
record
.
salaryCashPledge
.
toLocaleString
()
}
</
span
>
)
:
(
''
)
}
</
div
>
</
div
>
}
/>
),
},
},
{
{
title
:
'
相关运营
'
,
title
:
'
实付款
'
,
dataIndex
:
'
userName
'
,
dataIndex
:
'
orderTotalAmount
'
,
align
:
'center'
,
align
:
'center'
,
render
:
(
_text
,
_record
)
=>
`--`
,
width
:
'10%'
,
render
:
(
text
,
record
)
=>
(
<
TableItem
tr=
{
<
div
>
<
div
>
¥
{
text
.
toLocaleString
()
}
</
div
>
<
div
>
{
record
.
shareAmount
?
(
<
span
>
云享金抵扣:¥
{
record
.
shareAmount
.
toLocaleString
()
}
</
span
>
)
:
(
''
)
}
{
record
.
salaryAmount
?
(
<
span
>
余额抵扣:¥
{
record
.
salaryAmount
.
toLocaleString
()
}
</
span
>
)
:
(
''
)
}
</
div
>
</
div
>
}
/>
),
},
},
{
{
title
:
'推荐人'
,
title
:
'推荐人'
,
dataIndex
:
'userName'
,
dataIndex
:
'userName'
,
align
:
'center'
,
align
:
'center'
,
render
:
(
_text
,
_record
)
=>
`--`
,
render
:
(
_text
,
_record
)
=>
<
TableItem
tr=
{
''
}
/>,
},
{
title
:
'订单交期'
,
dataIndex
:
'userName'
,
align
:
'center'
,
render
:
(
_text
,
_record
)
=>
`--`
,
},
},
{
{
title
:
'备注'
,
title
:
'备注'
,
...
@@ -236,60 +322,58 @@ function EquipmentOrderView() {
...
@@ -236,60 +322,58 @@ function EquipmentOrderView() {
align
:
'center'
,
align
:
'center'
,
ellipsis
:
true
,
ellipsis
:
true
,
width
:
'100px'
,
width
:
'100px'
,
render
:
(
text
)
=>
(
render
:
(
text
)
=>
<
TableItem
tr=
{
text
}
/>,
<
Tooltip
placement=
'top'
title=
{
text
}
>
<
div
className=
'remark-wrap'
>
{
text
}
</
div
>
</
Tooltip
>
),
},
},
{
{
title
:
'操作'
,
title
:
'操作'
,
dataIndex
:
'action'
,
dataIndex
:
'action'
,
align
:
'center'
,
fixed
:
'right'
,
fixed
:
'right'
,
width
:
'130px'
,
width
:
'130px'
,
onHeaderCell
:
()
=>
({
style
:
{
textAlign
:
'center'
,
},
}),
onCell
:
()
=>
({
style
:
{
textAlign
:
'right'
,
},
}),
render
:
(
_text
,
record
)
=>
(
render
:
(
_text
,
record
)
=>
(
<>
<
TableItem
{
showStatusButton
(
record
?.
tranStatus
)
&&
(
tr=
{
<
Button
<>
type=
{
'link'
}
{
getOperateBtnItem
(
record
.
statusCode
)
?
(
disabled=
{
[
'999'
,
'1000'
].
includes
(
record
?.
tranStatus
)
}
<
Button
onClick=
{
()
=>
handleAction
(
record
)
}
type=
'link'
>
onClick=
{
()
=>
getOperateBtnItem
(
record
.
statusCode
)?.
onClick
(
record
)
}
{
getStatusButton
(
record
?.
tranStatus
)
}
disabled=
{
!!
userInfo
.
roleInfo
.
superAdmin
}
</
Button
>
>
)
}
{
getOperateBtnItem
(
record
.
statusCode
)?.
label
}
<
Button
type=
{
'link'
}
onClick=
{
()
=>
handleDetail
(
record
)
}
>
</
Button
>
详情
)
:
(
</
Button
>
''
</>
)
}
<
Button
type=
'link'
onClick=
{
()
=>
handleDetail
(
record
)
}
>
详情
</
Button
>
</>
}
/>
),
),
},
},
];
];
return
(
return
(
<>
<
div
className=
'equipment-order'
>
<
SearchBox
<
SearchBox
search=
{
[
search=
{
[
{
{
label
:
'
订单编号
'
,
label
:
'
关键字
'
,
name
:
'
orderNo
'
,
name
:
'
keyword
'
,
type
:
'input'
,
type
:
'input'
,
placeholder
:
'请输入订单编号'
,
placeholder
:
'请输入订单编号'
,
},
},
{
{
label
:
'买家账号'
,
name
:
'buyerAccount'
,
type
:
'input'
,
placeholder
:
'请输入用户账号'
,
},
{
label
:
'相关销售'
,
name
:
'saleId'
,
type
:
'Select'
,
placeholder
:
'请选择相关销售'
,
options
:
[],
},
{
label
:
'时间'
,
label
:
'时间'
,
name
:
'rangeTime'
,
name
:
'rangeTime'
,
type
:
'rangePicker'
,
type
:
'rangePicker'
,
...
@@ -331,25 +415,22 @@ function EquipmentOrderView() {
...
@@ -331,25 +415,22 @@ function EquipmentOrderView() {
}
}
}
}
// rowSelection={{ selectedRowKeys, onChange: onSelectChange }}
// rowSelection={{ selectedRowKeys, onChange: onSelectChange }}
/>
/>
{
/*发货
弹窗
*/
}
{
/*发货*/
}
<
OrderDeliv
er
<
ShipmentsOrd
er
open=
{
deliverVisible
}
open=
{
deliverVisible
}
title=
{
'卖家发货'
}
currentOrderItem=
{
currentOrderItem
}
data=
{
editData
}
onCancel=
{
shipmentsOrderCancel
}
closed=
{
handleClosed
}
onOk=
{
shipmentsOrderOk
}
/>
/>
{
/*收货弹窗*/
}
{
/*确认归还*/
}
<
OrderConfirm
<
ConfirmReturn
open=
{
confirmVisible
}
open=
{
confirmReturnShow
}
title=
{
'确认收货'
}
onOk=
{
confirmReturnOk
}
data=
{
editData
}
onCancel=
{
confirmReturnCancel
}
closed=
{
handleClosed
}
currentOrderItem=
{
currentOrderItem
}
modalTitle=
{
currentOrderItem
?.
statusCode
===
500
?
'确认归还'
:
'确认退款'
}
/>
/>
{
/*关闭订单*/
}
</
div
>
<
OrderClosed
open=
{
closedVisible
}
title=
{
'关闭订单'
}
data=
{
editData
}
closed=
{
handleClosed
}
/>
{
/*退款弹窗*/
}
<
OrderRefund
open=
{
refundVisible
}
title=
{
'退款审批'
}
data=
{
editData
}
closed=
{
handleClosed
}
/>
</>
);
);
}
}
...
...
src/router/index.ts
浏览文件 @
850dee5d
...
@@ -4,7 +4,7 @@ import { InterDataType } from '~/api/interface';
...
@@ -4,7 +4,7 @@ import { InterDataType } from '~/api/interface';
import
{
listMenuInfoType
}
from
'~/api/interface/systemManageType'
;
import
{
listMenuInfoType
}
from
'~/api/interface/systemManageType'
;
import
{
SystemManageAPI
}
from
'~/api'
;
import
{
SystemManageAPI
}
from
'~/api'
;
import
{
store
}
from
'~/store'
;
import
{
store
}
from
'~/store'
;
import
{
SET_MENU
}
from
'~/store/module/menu'
;
import
{
SET_MENU
,
SET_REQ_MENU
}
from
'~/store/module/menu'
;
//菜单类型
//菜单类型
type
menuType
=
InterDataType
<
listMenuInfoType
>
;
type
menuType
=
InterDataType
<
listMenuInfoType
>
;
...
@@ -16,6 +16,7 @@ export const authRouterList = async () => {
...
@@ -16,6 +16,7 @@ export const authRouterList = async () => {
const
{
result
}
=
await
SystemManageAPI
.
getListRoleMenuInfo
({
const
{
result
}
=
await
SystemManageAPI
.
getListRoleMenuInfo
({
roleId
:
Number
(
localStorage
.
getItem
(
'roleId'
)),
roleId
:
Number
(
localStorage
.
getItem
(
'roleId'
)),
});
});
store
.
dispatch
(
SET_REQ_MENU
([
result
]));
const
ids
:
number
[]
=
getAllKeys
([
result
]);
const
ids
:
number
[]
=
getAllKeys
([
result
]);
const
getRouteList
=
(
data
:
RouteObjectType
[])
=>
{
const
getRouteList
=
(
data
:
RouteObjectType
[])
=>
{
return
data
.
reduce
((
pre
:
RouteObjectType
[],
cur
)
=>
{
return
data
.
reduce
((
pre
:
RouteObjectType
[],
cur
)
=>
{
...
...
src/router/router.tsx
浏览文件 @
850dee5d
...
@@ -170,7 +170,6 @@ import LimitInfo from '~/pages/systemManage/limitManage/limitInfo';
...
@@ -170,7 +170,6 @@ import LimitInfo from '~/pages/systemManage/limitManage/limitInfo';
import
CustomListDetail
from
'~/pages/customManage/customList/detail'
;
import
CustomListDetail
from
'~/pages/customManage/customList/detail'
;
import
ServiceCategoryDetail
from
'~/pages/categoryManage/serviceCategoryList/detail'
;
import
ServiceCategoryDetail
from
'~/pages/categoryManage/serviceCategoryList/detail'
;
const
AddressManageView
=
React
.
lazy
(()
=>
import
(
'~/pages/systemManage/addressManage'
));
const
AddressManageView
=
React
.
lazy
(()
=>
import
(
'~/pages/systemManage/addressManage'
));
const
RealNameAuthView
=
React
.
lazy
(()
=>
import
(
'~/pages/systemManage/realNameAuth'
));
// const IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表
// const IndustryListView = React.lazy(() => import('~/pages/mallManage/industryManage/industryList')); //行业列表
// const IndustryDetailView = React.lazy(
// const IndustryDetailView = React.lazy(
...
@@ -1312,17 +1311,6 @@ export const routerList: Array<RouteObjectType> = [
...
@@ -1312,17 +1311,6 @@ export const routerList: Array<RouteObjectType> = [
icon
:
<
EnvironmentOutlined
/>,
icon
:
<
EnvironmentOutlined
/>,
},
},
},
},
{
path
:
'/systemManage/realNameAuth'
,
element
:
withLoadingComponent
(<
RealNameAuthView
/>),
errorElement
:
<
ErrorPage
/>,
meta
:
{
id
:
1450
,
title
:
'实名认证'
,
icon
:
<
VerifiedOutlined
/>,
develop
:
true
,
},
},
],
],
},
},
];
];
src/store/module/menu/index.ts
浏览文件 @
850dee5d
import
{
createSlice
}
from
'@reduxjs/toolkit'
;
import
{
createSlice
}
from
'@reduxjs/toolkit'
;
const
initialState
=
{
const
initialState
=
{
menuList
:
[],
reqMenuList
:
[],
//请求的菜单
menuList
:
[],
//过滤后的菜单
collapsedActive
:
false
,
collapsedActive
:
false
,
roleId
:
localStorage
.
getItem
(
'roleId'
)
?
Number
(
localStorage
.
getItem
(
'roleId'
))
:
-
1
,
roleId
:
localStorage
.
getItem
(
'roleId'
)
?
Number
(
localStorage
.
getItem
(
'roleId'
))
:
-
1
,
};
};
...
@@ -13,12 +14,18 @@ export const menuSlice = createSlice({
...
@@ -13,12 +14,18 @@ export const menuSlice = createSlice({
SET_MENU
(
state
,
action
)
{
SET_MENU
(
state
,
action
)
{
state
.
menuList
=
action
.
payload
;
state
.
menuList
=
action
.
payload
;
},
},
SET_REQ_MENU
(
state
,
action
)
{
state
.
reqMenuList
=
action
.
payload
;
},
SET_COLLAPSE
(
state
,
action
)
{
SET_COLLAPSE
(
state
,
action
)
{
state
.
collapsedActive
=
action
.
payload
;
state
.
collapsedActive
=
action
.
payload
;
},
},
REMOVE_MENU
(
state
)
{
REMOVE_MENU
(
state
)
{
state
.
menuList
=
[];
state
.
menuList
=
[];
},
},
REMOVE_REQ_MENU
(
state
)
{
state
.
reqMenuList
=
[];
},
SET_MENU_ID
(
state
,
action
)
{
SET_MENU_ID
(
state
,
action
)
{
state
.
roleId
=
action
.
payload
;
state
.
roleId
=
action
.
payload
;
localStorage
.
setItem
(
'roleId'
,
action
.
payload
);
localStorage
.
setItem
(
'roleId'
,
action
.
payload
);
...
@@ -29,7 +36,14 @@ export const menuSlice = createSlice({
...
@@ -29,7 +36,14 @@ export const menuSlice = createSlice({
},
},
});
});
export
const
{
SET_MENU
,
SET_COLLAPSE
,
REMOVE_MENU
,
SET_MENU_ID
,
REMOVE_MENU_ID
}
=
export
const
{
menuSlice
.
actions
;
SET_MENU
,
SET_COLLAPSE
,
REMOVE_MENU
,
SET_MENU_ID
,
REMOVE_MENU_ID
,
REMOVE_REQ_MENU
,
SET_REQ_MENU
,
}
=
menuSlice
.
actions
;
export
const
Menu
=
menuSlice
.
reducer
;
export
const
Menu
=
menuSlice
.
reducer
;
src/utils/isRoute.ts
浏览文件 @
850dee5d
...
@@ -24,3 +24,7 @@ export const isRoute = (list: any, pathname: string) => {
...
@@ -24,3 +24,7 @@ export const isRoute = (list: any, pathname: string) => {
(
v
.
children
&&
isRoute
(
v
.
children
,
pathname
)),
(
v
.
children
&&
isRoute
(
v
.
children
,
pathname
)),
);
);
};
};
export
const
isRouteById
=
(
list
:
any
,
id
:
number
)
=>
{
return
list
.
some
((
v
:
any
)
=>
v
.
id
===
id
||
(
v
.
children
&&
isRouteById
(
v
.
children
,
id
)));
};
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论