Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
a06a63c1
authored
Oct 02, 2023
by
owen
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'origin/dev' into dev
parents
df8a3941
ab95d87c
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
87 additions
and
98 deletions
+87
-98
src/api/system/area/index.ts
+0
-8
src/router/modules/remaining.ts
+1
-1
src/views/mall/trade/afterSale/detail/index.vue
+42
-38
src/views/mall/trade/afterSale/index.vue
+4
-5
src/views/mall/trade/config/index.vue
+4
-1
src/views/mall/trade/delivery/express/ExpressForm.vue
+4
-4
src/views/mall/trade/delivery/express/index.vue
+4
-4
src/views/mall/trade/delivery/expressTemplate/ExpressTemplateForm.vue
+0
-0
src/views/mall/trade/delivery/expressTemplate/index.vue
+4
-4
src/views/mall/trade/delivery/pickUpStore/PickUpStoreForm.vue
+12
-26
src/views/mall/trade/delivery/pickUpStore/index.vue
+12
-7
No files found.
src/api/system/area/index.ts
View file @
a06a63c1
...
...
@@ -5,14 +5,6 @@ export const getAreaTree = async () => {
return
await
request
.
get
({
url
:
'/system/area/tree'
})
}
export
const
getChildrenArea
=
async
(
id
:
number
)
=>
{
return
await
request
.
get
({
url
:
'/system/area/get-children?id='
+
id
})
}
export
const
getAreaListByIds
=
async
(
ids
)
=>
{
return
await
request
.
get
({
url
:
'/system/area/get-by-ids?ids='
+
ids
})
}
// 获得 IP 对应的地区名
export
const
getAreaByIp
=
async
(
ip
:
string
)
=>
{
return
await
request
.
get
({
url
:
'/system/area/get-by-ip?ip='
+
ip
})
...
...
src/router/modules/remaining.ts
View file @
a06a63c1
...
...
@@ -405,7 +405,7 @@ const remainingRouter: AppRouteRecordRaw[] = [
meta
:
{
title
:
'订单详情'
,
icon
:
'ep:view'
,
activeMenu
:
'/mall/trade/order'
}
},
{
path
:
'after-sale/detail/:
orderI
d(\\d+)'
,
path
:
'after-sale/detail/:
i
d(\\d+)'
,
component
:
()
=>
import
(
'@/views/mall/trade/afterSale/detail/index.vue'
),
name
:
'TradeAfterSaleDetail'
,
meta
:
{
title
:
'退款详情'
,
icon
:
'ep:view'
,
activeMenu
:
'/mall/trade/after-sale'
}
...
...
src/views/mall/trade/afterSale/detail/index.vue
View file @
a06a63c1
...
...
@@ -6,7 +6,6 @@
<el-descriptions-item
label=
"配送方式: "
>
<dict-tag
:type=
"DICT_TYPE.TRADE_DELIVERY_TYPE"
:value=
"formData.order.deliveryType"
/>
</el-descriptions-item>
<!-- TODO 营销活动待实现 -->
<el-descriptions-item
label=
"订单类型: "
>
<dict-tag
:type=
"DICT_TYPE.TRADE_ORDER_TYPE"
:value=
"formData.order.type"
/>
</el-descriptions-item>
...
...
@@ -29,8 +28,7 @@
<el-descriptions-item
label=
"付款方式: "
>
<dict-tag
:type=
"DICT_TYPE.PAY_CHANNEL_CODE"
:value=
"formData.order.payChannelCode"
/>
</el-descriptions-item>
<!-- TODO 芋艿:待实现:跳转会员 -->
<!--
<el-descriptions-item
label=
"买家: "
>
{{
formData
.
user
.
nickname
}}
</el-descriptions-item>
-->
<el-descriptions-item
label=
"买家: "
>
{{
formData
?.
user
?.
nickname
}}
</el-descriptions-item>
</el-descriptions>
<!-- 售后信息 -->
...
...
@@ -46,7 +44,7 @@
<dict-tag
:type=
"DICT_TYPE.TRADE_AFTER_SALE_WAY"
:value=
"formData.way"
/>
</el-descriptions-item>
<el-descriptions-item
label=
"退款金额: "
>
{{
f
loatToFixed2
(
formData
.
refundPrice
)
}}
{{
f
enToYuan
(
formData
.
refundPrice
)
}}
</el-descriptions-item>
<el-descriptions-item
label=
"退款原因: "
>
{{
formData
.
applyReason
}}
</el-descriptions-item>
<el-descriptions-item
label=
"补充描述: "
>
...
...
@@ -92,7 +90,7 @@
<el-descriptions-item
labelClassName=
"no-colon"
>
<el-row
:gutter=
"20"
>
<el-col
:span=
"15"
>
<el-table
:data=
"
formData.items
"
border
>
<el-table
:data=
"
[formData.orderItem]
"
border
>
<el-table-column
label=
"商品"
prop=
"spuName"
width=
"auto"
>
<
template
#
default=
"{ row }"
>
{{
row
.
spuName
}}
...
...
@@ -102,19 +100,11 @@
</
template
>
</el-table-column>
<el-table-column
label=
"商品原价"
prop=
"price"
width=
"150"
>
<
template
#
default=
"{ row }"
>
{{
f
loatToFixed2
(
row
.
price
)
}}
元
</
template
>
<
template
#
default=
"{ row }"
>
{{
f
enToYuan
(
row
.
price
)
}}
元
</
template
>
</el-table-column>
<el-table-column
label=
"数量"
prop=
"count"
width=
"100"
/>
<el-table-column
label=
"合计"
prop=
"payPrice"
width=
"150"
>
<
template
#
default=
"{ row }"
>
{{
floatToFixed2
(
row
.
payPrice
)
}}
元
</
template
>
</el-table-column>
<el-table-column
label=
"售后状态"
prop=
"afterSaleStatus"
width=
"120"
>
<
template
#
default=
"{ row }"
>
<dict-tag
:type=
"DICT_TYPE.TRADE_ORDER_ITEM_AFTER_SALE_STATUS"
:value=
"row.afterSaleStatus"
/>
</
template
>
<
template
#
default=
"{ row }"
>
{{
fenToYuan
(
row
.
payPrice
)
}}
元
</
template
>
</el-table-column>
</el-table>
</el-col>
...
...
@@ -122,6 +112,8 @@
</el-row>
</el-descriptions-item>
</el-descriptions>
<!-- 操作日志 -->
<el-descriptions
title=
"售后日志"
>
<el-descriptions-item
labelClassName=
"no-colon"
>
<el-timeline>
...
...
@@ -153,7 +145,7 @@
</template>
<
script
lang=
"ts"
setup
>
import
*
as
AfterSaleApi
from
'@/api/mall/trade/afterSale/index'
import
{
f
loatToFixed2
}
from
'@/utils'
import
{
f
enToYuan
}
from
'@/utils'
import
{
DICT_TYPE
,
getDictLabel
,
getDictObj
}
from
'@/utils/dict'
import
{
formatDate
}
from
'@/utils/formatTime'
import
UpdateAuditReasonForm
from
'@/views/mall/trade/afterSale/form/AfterSaleDisagreeForm.vue'
...
...
@@ -191,7 +183,7 @@ const getUserTypeColor = (type: number) => {
/** 获得详情 */
const
getDetail
=
async
()
=>
{
const
id
=
params
.
orderI
d
as
unknown
as
number
const
id
=
params
.
i
d
as
unknown
as
number
if
(
id
)
{
const
res
=
await
AfterSaleApi
.
getAfterSale
(
id
)
// 没有表单信息则关闭页面返回
...
...
@@ -204,44 +196,56 @@ const getDetail = async () => {
}
/** 同意售后 */
const
agree
=
()
=>
{
message
.
confirm
(
'是否同意售后?'
).
then
(()
=>
{
AfterSaleApi
.
agree
(
formData
.
value
.
id
)
const
agree
=
async
()
=>
{
try
{
// 二次确认
await
message
.
confirm
(
'是否同意售后?'
)
await
AfterSaleApi
.
agree
(
formData
.
value
.
id
)
// 提示成功
message
.
success
(
t
(
'common.success'
))
getDetail
()
}
)
await
getDetail
()
}
catch
{}
}
/** 拒绝售后 */
const
disagree
=
()
=>
{
const
disagree
=
async
()
=>
{
updateAuditReasonFormRef
.
value
?.
open
(
formData
.
value
)
}
/** 确认收货 */
const
receive
=
()
=>
{
message
.
confirm
(
'是否确认收货?'
).
then
(()
=>
{
AfterSaleApi
.
receive
(
formData
.
value
.
id
)
const
receive
=
async
()
=>
{
try
{
// 二次确认
await
message
.
confirm
(
'是否确认收货?'
)
await
AfterSaleApi
.
receive
(
formData
.
value
.
id
)
// 提示成功
message
.
success
(
t
(
'common.success'
))
getDetail
()
}
)
await
getDetail
()
}
catch
{}
}
/** 拒绝收货 */
const
refuse
=
()
=>
{
message
.
confirm
(
'是否拒绝收货?'
).
then
(()
=>
{
AfterSaleApi
.
refuse
(
formData
.
value
.
id
)
const
refuse
=
async
()
=>
{
try
{
// 二次确认
await
message
.
confirm
(
'是否拒绝收货?'
)
await
AfterSaleApi
.
refuse
(
formData
.
value
.
id
)
// 提示成功
message
.
success
(
t
(
'common.success'
))
getDetail
()
}
)
await
getDetail
()
}
catch
{}
}
/** 确认退款 */
const
refund
=
()
=>
{
message
.
confirm
(
'是否确认退款?'
).
then
(()
=>
{
AfterSaleApi
.
refund
(
formData
.
value
.
id
)
const
refund
=
async
()
=>
{
try
{
// 二次确认
await
message
.
confirm
(
'是否确认退款?'
)
await
AfterSaleApi
.
refund
(
formData
.
value
.
id
)
// 提示成功
message
.
success
(
t
(
'common.success'
))
getDetail
()
}
)
await
getDetail
()
}
catch
{}
}
/** 图片预览 */
...
...
src/views/mall/trade/afterSale/index.vue
View file @
a06a63c1
...
...
@@ -135,17 +135,16 @@
</el-table-column>
<el-table-column
align=
"center"
label=
"订单金额"
prop=
"refundPrice"
>
<
template
#
default=
"scope"
>
<span>
{{
f
loatToFixed2
(
scope
.
row
.
refundPrice
)
}}
元
</span>
<span>
{{
f
enToYuan
(
scope
.
row
.
refundPrice
)
}}
元
</span>
</
template
>
</el-table-column>
<!-- TODO 芋艿:未来要加个会员链接 -->
<el-table-column
align=
"center"
label=
"买家"
prop=
"user.nickname"
/>
<el-table-column
align=
"center"
label=
"申请时间"
prop=
"createTime"
width=
"180"
>
<
template
#
default=
"scope"
>
<span>
{{
formatDate
(
scope
.
row
.
createTime
)
}}
</span>
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"售后状态"
>
<el-table-column
align=
"center"
label=
"售后状态"
width=
"100"
>
<
template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.TRADE_AFTER_SALE_STATUS"
:value=
"scope.row.status"
/>
</
template
>
...
...
@@ -177,7 +176,7 @@ import { formatDate } from '@/utils/formatTime'
import
{
createImageViewer
}
from
'@/components/ImageViewer'
import
{
TabsPaneContext
}
from
'element-plus'
import
{
cloneDeep
}
from
'lodash-es'
import
{
f
loatToFixed2
}
from
'@/utils'
import
{
f
enToYuan
}
from
'@/utils'
defineOptions
({
name
:
'TradeAfterSale'
})
...
...
@@ -240,7 +239,7 @@ const tabClick = async (tab: TabsPaneContext) => {
/** 处理退款 */
const
openAfterSaleDetail
=
(
id
:
number
)
=>
{
push
({
name
:
'TradeAfterSaleDetail'
,
params
:
{
orderId
:
id
}
})
push
({
name
:
'TradeAfterSaleDetail'
,
params
:
{
id
}
})
}
/** 查看订单详情 */
...
...
src/views/mall/trade/config/index.vue
View file @
a06a63c1
...
...
@@ -64,6 +64,9 @@
商城商品满多少金额即可包邮,单位:元
</el-text>
</el-form-item>
<el-form-item
label=
"启用门店自提"
prop=
"deliveryPickUpEnabled"
>
<el-switch
v-model=
"formData.deliveryPickUpEnabled"
style=
"user-select: none"
/>
</el-form-item>
</el-tab-pane>
<!-- 分销 -->
<el-tab-pane
label=
"分销"
>
...
...
@@ -206,7 +209,6 @@
<
script
setup
lang=
"ts"
>
import
*
as
ConfigApi
from
'@/api/mall/trade/config'
import
{
BrokerageBindModeEnum
,
BrokerageEnabledConditionEnum
}
from
'@/utils/constants'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
defineOptions
({
name
:
'TradeConfig'
})
...
...
@@ -221,6 +223,7 @@ const formData = ref({
afterSaleReturnReasons
:
[],
deliveryExpressFreeEnabled
:
false
,
deliveryExpressFreePrice
:
0
,
deliveryPickUpEnabled
:
false
,
brokerageEnabled
:
false
,
brokerageEnabledCondition
:
undefined
,
brokerageBindMode
:
undefined
,
...
...
src/views/mall/trade/delivery/express/ExpressForm.vue
View file @
a06a63c1
...
...
@@ -7,17 +7,17 @@
label-width=
"120px"
v-loading=
"formLoading"
>
<el-form-item
label=
"
快递
公司编码"
prop=
"code"
>
<el-form-item
label=
"公司编码"
prop=
"code"
>
<el-input
v-model=
"formData.code"
placeholder=
"请输入快递编码"
/>
</el-form-item>
<el-form-item
label=
"
快递
公司名称"
prop=
"name"
>
<el-form-item
label=
"公司名称"
prop=
"name"
>
<el-input
v-model=
"formData.name"
placeholder=
"请输入快递名称"
/>
</el-form-item>
<el-form-item
label=
"
快递
公司 logo"
prop=
"logo"
>
<el-form-item
label=
"公司 logo"
prop=
"logo"
>
<UploadImg
v-model=
"formData.logo"
:limit=
"1"
:is-show-tip=
"false"
/>
<div
style=
"font-size: 10px"
class=
"pl-10px"
>
推荐 180x180 图片分辨率
</div>
</el-form-item>
<el-form-item
label=
"
分类
排序"
prop=
"sort"
>
<el-form-item
label=
"排序"
prop=
"sort"
>
<el-input-number
v-model=
"formData.sort"
controls-position=
"right"
:min=
"0"
/>
</el-form-item>
<el-form-item
label=
"开启状态"
prop=
"status"
>
...
...
src/views/mall/trade/delivery/express/index.vue
View file @
a06a63c1
...
...
@@ -53,11 +53,11 @@
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
>
<el-table-column
label=
"
快递公司编号
"
prop=
"code"
/>
<el-table-column
label=
"
快递
公司名称"
prop=
"name"
/>
<el-table-column
label=
"
快递
公司 logo "
prop=
"logo"
>
<el-table-column
label=
"
公司编码
"
prop=
"code"
/>
<el-table-column
label=
"公司名称"
prop=
"name"
/>
<el-table-column
label=
"公司 logo "
prop=
"logo"
>
<template
#
default=
"scope"
>
<img
v-if=
"scope.row.logo"
:src=
"scope.row.logo"
alt=
"
快递公司logo"
class=
"h-10
0px"
/>
<img
v-if=
"scope.row.logo"
:src=
"scope.row.logo"
alt=
"
公司logo"
class=
"h-4
0px"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"排序"
align=
"center"
prop=
"sort"
/>
...
...
src/views/mall/trade/delivery/expressTemplate/ExpressTemplateForm.vue
View file @
a06a63c1
This diff is collapsed.
Click to expand it.
src/views/mall/trade/delivery/expressTemplate/index.vue
View file @
a06a63c1
...
...
@@ -51,14 +51,14 @@
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
>
<el-table-column
label=
"编号"
prop=
"id"
/>
<el-table-column
label=
"模板名称"
prop=
"name"
/>
<el-table-column
label=
"计费方式"
prop=
"chargeMode"
align=
"center"
>
<el-table-column
label=
"编号"
min-width=
"60"
prop=
"id"
/>
<el-table-column
label=
"模板名称"
min-width=
"100"
prop=
"name"
/>
<el-table-column
label=
"计费方式"
prop=
"chargeMode"
min-width=
"100"
align=
"center"
>
<template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.EXPRESS_CHARGE_MODE"
:value=
"scope.row.chargeMode"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"排序"
prop=
"sort"
/>
<el-table-column
label=
"排序"
min-width=
"100"
prop=
"sort"
/>
<el-table-column
label=
"创建时间"
align=
"center"
...
...
src/views/mall/trade/delivery/pickUpStore/PickUpStoreForm.vue
View file @
a06a63c1
...
...
@@ -51,7 +51,7 @@
<el-row>
<el-col
:span=
"12"
>
<el-form-item
label=
"门店所在地区"
prop=
"areaId"
>
<el-cascader
v-model=
"formData.areaId"
:options=
"areaList"
:props=
"
areaTree
Props"
/>
<el-cascader
v-model=
"formData.areaId"
:options=
"areaList"
:props=
"
default
Props"
/>
</el-form-item>
</el-col>
<el-col
:span=
"12"
>
...
...
@@ -99,7 +99,7 @@
</el-col>
</el-row>
<el-form-item
label=
"获取经纬度"
>
<el-button
type=
"primary"
@
click=
"mapDialogVisible
.value
= true"
>
获取
</el-button>
<el-button
type=
"primary"
@
click=
"mapDialogVisible = true"
>
获取
</el-button>
</el-form-item>
</el-form>
<template
#
footer
>
...
...
@@ -121,8 +121,9 @@
import
*
as
DeliveryPickUpStoreApi
from
'@/api/mall/trade/delivery/pickUpStore'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
CommonStatusEnum
}
from
'@/utils/constants'
import
{
defaultProps
}
from
'@/utils/tree'
import
{
getAreaTree
}
from
'@/api/system/area'
import
*
as
ConfigApi
from
'@/api/
infra
/config'
import
*
as
ConfigApi
from
'@/api/
mall/trade
/config'
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
...
...
@@ -161,12 +162,6 @@ const formRules = reactive({
status
:
[{
required
:
true
,
message
:
'开启状态不能为空'
,
trigger
:
'blur'
}]
})
const
formRef
=
ref
()
// 表单 Ref
const
areaTreeProps
=
{
children
:
'children'
,
label
:
'name'
,
value
:
'id'
,
emitPath
:
false
}
const
areaList
=
ref
()
// 区域树
const
tencentLbsUrl
=
ref
(
''
)
// 腾讯位置服务 url
...
...
@@ -244,16 +239,8 @@ const selectAddress = function (loc: any): void {
mapDialogVisible
.
value
=
false
}
/** 初始化数据 */
const
initData
=
async
()
=>
{
formLoading
.
value
=
true
try
{
const
data
=
await
getAreaTree
()
areaList
.
value
=
data
}
finally
{
formLoading
.
value
=
false
}
// TODO @jason:要不创建一个 initTencentLbsMap
/** 初始化腾讯地图 */
const
initTencentLbsMap
=
async
()
=>
{
window
.
selectAddress
=
selectAddress
window
.
addEventListener
(
'message'
,
...
...
@@ -267,17 +254,16 @@ const initData = async () => {
},
false
)
const
data
=
await
ConfigApi
.
getConfigKey
(
'tencent.lbs.key'
)
let
key
=
''
if
(
data
&&
data
.
length
>
0
)
{
key
=
data
}
const
data
=
await
ConfigApi
.
getTradeConfig
()
const
key
=
data
.
tencentLbsKey
tencentLbsUrl
.
value
=
`https://apis.map.qq.com/tools/locpicker?type=1&key=
${
key
}
&referer=myapp`
}
/** 初始化 **/
onMounted
(()
=>
{
initData
()
onMounted
(
async
()
=>
{
areaList
.
value
=
await
getAreaTree
()
// 加载地图
await
initTencentLbsMap
()
})
</
script
>
<
style
lang=
"scss"
>
...
...
src/views/mall/trade/delivery/pickUpStore/index.vue
View file @
a06a63c1
...
...
@@ -65,16 +65,21 @@
<!-- 列表 -->
<ContentWrap>
<el-table
v-loading=
"loading"
:data=
"list"
>
<el-table-column
label=
"编号"
prop=
"id"
/>
<el-table-column
label=
"门店 logo"
prop=
"logo"
>
<el-table-column
label=
"编号"
min-width=
"80"
prop=
"id"
/>
<el-table-column
label=
"门店 logo"
min-width=
"100"
prop=
"logo"
>
<template
#
default=
"scope"
>
<img
v-if=
"scope.row.logo"
:src=
"scope.row.logo"
alt=
"门店 logo"
class=
"h-
10
0px"
/>
<img
v-if=
"scope.row.logo"
:src=
"scope.row.logo"
alt=
"门店 logo"
class=
"h-
5
0px"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"门店名称"
prop=
"name"
/>
<el-table-column
label=
"门店手机"
prop=
"phone"
/>
<el-table-column
align=
"center"
label=
"门店详细地址"
prop=
"detailAddress"
/>
<el-table-column
align=
"center"
label=
"开启状态"
prop=
"status"
>
<el-table-column
label=
"门店名称"
min-width=
"150"
prop=
"name"
/>
<el-table-column
label=
"门店手机"
min-width=
"100"
prop=
"phone"
/>
<el-table-column
label=
"地址"
min-width=
"100"
prop=
"detailAddress"
/>
<el-table-column
label=
"营业时间"
min-width=
"180"
>
<
template
#
default=
"scope"
>
{{
scope
.
row
.
openingTime
}}
~
{{
scope
.
row
.
closingTime
}}
</
template
>
</el-table-column>
<el-table-column
align=
"center"
label=
"开启状态"
min-width=
"100"
prop=
"status"
>
<
template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.COMMON_STATUS"
:value=
"scope.row.status"
/>
</
template
>
...
...
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