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
Unverified
Commit
22d95fa0
authored
Sep 01, 2023
by
芋道源码
Committed by
Gitee
Sep 01, 2023
Browse files
Options
Browse Files
Download
Plain Diff
!229 完善订单管理和售后管理相关问题
Merge pull request !229 from puhui999/dev-to-dev
parents
3918fab1
f0249e94
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
110 additions
and
36 deletions
+110
-36
src/api/mall/trade/order/index.ts
+15
-3
src/views/mall/product/spu/components/SkuList.vue
+4
-13
src/views/mall/product/spu/components/index.ts
+2
-2
src/views/mall/product/spu/form/BasicInfoForm.vue
+37
-3
src/views/mall/product/spu/form/index.vue
+11
-11
src/views/mall/trade/afterSale/detail/index.vue
+41
-4
src/views/mall/trade/order/detail/index.vue
+0
-0
No files found.
src/api/mall/trade/order/index.ts
View file @
22d95fa0
...
...
@@ -15,11 +15,11 @@ export interface OrderVO {
cancelTime
?:
Date
|
null
// 订单取消时间
cancelType
?:
number
|
null
// 取消类型
remark
?:
string
// 商家备注
payOrderId
:
number
|
null
// 支付订单编号
payOrderId
?
:
number
|
null
// 支付订单编号
payed
?:
boolean
// 是否已支付
payTime
?:
Date
|
null
// 付款时间
payChannelCode
?:
string
// 支付渠道
origin
alPrice
?:
number
|
null
// 商品原价(总)
tot
alPrice
?:
number
|
null
// 商品原价(总)
orderPrice
?:
number
|
null
// 订单原价(总)
discountPrice
?:
number
|
null
// 订单优惠(总)
deliveryPrice
?:
number
|
null
// 运费金额
...
...
@@ -44,12 +44,19 @@ export interface OrderVO {
pointPrice
?:
number
|
null
// 积分抵扣的金额
receiverAreaName
?:
string
//收件人地区名字
items
?:
OrderItemRespVO
[]
// 订单项列表
//用户信息
//
用户信息
user
?:
{
id
?:
number
|
null
nickname
?:
string
avatar
?:
string
}
// 订单操作日志
orderLog
:
orderLog
[]
}
export
interface
orderLog
{
content
?:
string
createTime
?:
Date
}
export
interface
OrderItemRespVO
{
...
...
@@ -94,6 +101,11 @@ export const getOrder = async (id: number | null) => {
return
await
request
.
get
({
url
:
`/trade/order/get-detail?id=`
+
id
})
}
// 查询交易订单物流详情
export
const
getExpressTrackList
=
async
(
id
:
number
|
null
)
=>
{
return
await
request
.
get
({
url
:
`/trade/order/get-express-track-list?id=`
+
id
})
}
export
interface
DeliveryVO
{
id
:
number
// 订单编号
logisticsId
:
number
|
null
// 物流公司编号
...
...
src/views/mall/product/spu/components/SkuList.vue
View file @
22d95fa0
...
...
@@ -328,24 +328,15 @@ const tableHeaders = ref<{ prop: string; label: string }[]>([]) // 多属性表
* 保存时,每个商品规格的表单要校验下。例如说,销售金额最低是 0.01 这种。
*/
const
validateSku
=
()
=>
{
const
checks
=
[
'price'
,
'marketPrice'
,
'costPrice'
]
let
warningInfo
=
'请检查商品各行相关属性配置,'
let
validate
=
true
// 默认通过
for
(
const
sku
of
formData
.
value
!
.
skus
!
)
{
// 作为活动组件的校验
if
(
props
.
isActivityComponent
)
{
for
(
const
rule
of
props
?.
ruleConfig
)
{
const
arg
=
getValue
(
sku
,
rule
.
name
)
if
(
!
rule
.
rule
(
arg
))
{
validate
=
false
// 只要有一个不通过则直接不通过
warningInfo
+=
rule
.
message
break
}
}
}
else
{
if
(
checks
.
some
((
check
)
=>
sku
[
check
]
<
0.01
))
{
for
(
const
rule
of
props
?.
ruleConfig
)
{
const
arg
=
getValue
(
sku
,
rule
.
name
)
if
(
!
rule
.
rule
(
arg
))
{
validate
=
false
// 只要有一个不通过则直接不通过
warningInfo
=
'商品相关价格不能低于 0.01 元!!'
warningInfo
+=
rule
.
message
break
}
}
...
...
src/views/mall/product/spu/components/index.ts
View file @
22d95fa0
...
...
@@ -24,7 +24,7 @@ interface RuleConfig {
}
/**
* 获得商品的规格列表
* 获得商品的规格列表
- 商品相关的公共函数
*
* @param spu
* @return PropertyAndValues 规格列表
...
...
@@ -51,4 +51,4 @@ const getPropertyList = (spu: Spu): PropertyAndValues[] => {
return
properties
}
export
{
SkuList
,
getPropertyList
,
PropertyAndValues
,
RuleConfig
}
export
{
SkuList
,
PropertyAndValues
,
RuleConfig
,
getPropertyList
}
src/views/mall/product/spu/form/BasicInfoForm.vue
View file @
22d95fa0
...
...
@@ -109,7 +109,12 @@
<!-- 多规格添加-->
<el-col
:span=
"24"
>
<el-form-item
v-if=
"!formData.specType"
>
<SkuList
ref=
"skuListRef"
:prop-form-data=
"formData"
:propertyList=
"propertyList"
/>
<SkuList
ref=
"skuListRef"
:prop-form-data=
"formData"
:propertyList=
"propertyList"
:rule-config=
"ruleConfig"
/>
</el-form-item>
<el-form-item
v-if=
"formData.specType"
label=
"商品属性"
>
<el-button
class=
"mr-15px mb-10px"
@
click=
"attributesAddFormRef.open"
>
添加规格
</el-button>
...
...
@@ -120,7 +125,12 @@
<SkuList
:is-batch=
"true"
:prop-form-data=
"formData"
:propertyList=
"propertyList"
/>
</el-form-item>
<el-form-item
label=
"属性列表"
>
<SkuList
ref=
"skuListRef"
:prop-form-data=
"formData"
:propertyList=
"propertyList"
/>
<SkuList
ref=
"skuListRef"
:prop-form-data=
"formData"
:propertyList=
"propertyList"
:rule-config=
"ruleConfig"
/>
</el-form-item>
</
template
>
</el-col>
...
...
@@ -175,7 +185,7 @@ import { propTypes } from '@/utils/propTypes'
import
{
checkSelectedNode
,
defaultProps
,
handleTree
,
treeToString
}
from
'@/utils/tree'
import
{
createImageViewer
}
from
'@/components/ImageViewer'
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
getPropertyList
,
SkuList
}
from
'@/views/mall/product/spu/components/index.ts'
import
{
getPropertyList
,
RuleConfig
,
SkuList
}
from
'@/views/mall/product/spu/components/index.ts'
import
ProductAttributes
from
'./ProductAttributes.vue'
import
ProductPropertyAddForm
from
'./ProductPropertyAddForm.vue'
import
{
basicInfoSchema
}
from
'./spu.data'
...
...
@@ -186,6 +196,30 @@ import * as ExpressTemplateApi from '@/api/mall/trade/delivery/expressTemplate'
defineOptions
({
name
:
'ProductSpuBasicInfoForm'
})
// sku 相关属性校验规则
const
ruleConfig
:
RuleConfig
[]
=
[
{
name
:
'stock'
,
rule
:
(
arg
)
=>
arg
>=
1
,
message
:
'商品库存必须大于等于 1 !!!'
},
{
name
:
'price'
,
rule
:
(
arg
)
=>
arg
>=
0.01
,
message
:
'商品销售价格必须大于等于 0.01 !!!'
},
{
name
:
'marketPrice'
,
rule
:
(
arg
)
=>
arg
>=
0.01
,
message
:
'商品市场价格必须大于等于 0.01 !!!'
},
{
name
:
'costPrice'
,
rule
:
(
arg
)
=>
arg
>=
0.01
,
message
:
'商品成本价格必须大于等于 0.01 !!!'
}
]
// ====== 商品详情相关操作 ======
const
{
allSchemas
}
=
useCrudSchemas
(
basicInfoSchema
)
/** 商品图预览 */
...
...
src/views/mall/product/spu/form/index.vue
View file @
22d95fa0
...
...
@@ -142,17 +142,17 @@ const submitForm = async () => {
await
unref
(
otherSettingsRef
)?.
validate
()
// 深拷贝一份, 这样最终 server 端不满足,不需要恢复,
const
deepCopyFormData
=
cloneDeep
(
unref
(
formData
.
value
))
as
ProductSpuApi
.
Spu
// 兜底处理 sku 空数据
formData
.
value
.
skus
!
.
forEach
((
sku
)
=>
{
// 因为是空数据这里判断一下商品条码是否为空就行
if
(
sku
.
barCode
===
''
)
{
const
index
=
deepCopyFormData
.
skus
!
.
findIndex
(
(
item
)
=>
JSON
.
stringify
(
item
.
properties
)
===
JSON
.
stringify
(
sku
.
properties
)
)
// 删除这条 sku
deepCopyFormData
.
skus
!
.
splice
(
index
,
1
)
}
})
// 兜底处理 sku 空数据
TODO 后续没得问题就移除
//
formData.value.skus!.forEach((sku) => {
//
// 因为是空数据这里判断一下商品条码是否为空就行
//
if (sku.barCode === '') {
//
const index = deepCopyFormData.skus!.findIndex(
//
(item) => JSON.stringify(item.properties) === JSON.stringify(sku.properties)
//
)
//
// 删除这条 sku
//
deepCopyFormData.skus!.splice(index, 1)
//
}
//
})
deepCopyFormData
.
skus
!
.
forEach
((
item
)
=>
{
// 给sku name赋值
item
.
name
=
deepCopyFormData
.
name
...
...
src/views/mall/trade/afterSale/detail/index.vue
View file @
22d95fa0
...
...
@@ -122,8 +122,36 @@
</el-row>
</el-descriptions-item>
</el-descriptions>
<!-- 售后信息 TODO @puhui999:需要接入 -->
<el-descriptions
title=
"售后日志"
/>
<el-descriptions
title=
"售后日志"
>
<el-descriptions-item
labelClassName=
"no-colon"
>
<el-timeline>
<el-timeline-item
v-for=
"saleLog in formData.afterSaleLog"
:key=
"saleLog.id"
:timestamp=
"formatDate(saleLog.createTime)"
placement=
"top"
>
<el-card>
<span>
用户类型:
</span>
<dict-tag
:type=
"DICT_TYPE.USER_TYPE"
:value=
"saleLog.userType"
class=
"mr-10px"
/>
<span>
售后状态(之前):
</span>
<dict-tag
:type=
"DICT_TYPE.TRADE_AFTER_SALE_STATUS"
:value=
"saleLog.beforeStatus"
class=
"mr-10px"
/>
<span>
售后状态(之后):
</span>
<dict-tag
:type=
"DICT_TYPE.TRADE_AFTER_SALE_STATUS"
:value=
"saleLog.afterStatus"
class=
"mr-10px"
/>
<span>
操作明细:{{ saleLog.content }}
</span>
</el-card>
</el-timeline-item>
</el-timeline>
</el-descriptions-item>
</el-descriptions>
</ContentWrap>
<!-- 各种操作的弹窗 -->
...
...
@@ -140,10 +168,12 @@ import { isArray } from '@/utils/is'
defineOptions
({
name
:
'TradeOrderDetailForm'
})
const
{
t
}
=
useI18n
()
// 国际化
const
message
=
useMessage
()
// 消息弹窗
const
{
params
}
=
useRoute
()
// 查询参数
const
formData
=
ref
({
order
:
{}
order
:
{},
afterSaleLog
:
[]
})
const
updateAuditReasonFormRef
=
ref
()
// 拒绝售后表单 Ref
...
...
@@ -155,11 +185,12 @@ const getDetail = async () => {
}
}
// TODO @puhui999:操作后,需要提示和刷新哈。
/** 同意售后 */
const
agree
=
()
=>
{
message
.
confirm
(
'是否同意售后?'
).
then
(()
=>
{
AfterSaleApi
.
agree
(
formData
.
value
.
id
)
message
.
success
(
t
(
'common.success'
))
getDetail
()
})
}
...
...
@@ -172,6 +203,8 @@ const disagree = () => {
const
receive
=
()
=>
{
message
.
confirm
(
'是否确认收货?'
).
then
(()
=>
{
AfterSaleApi
.
receive
(
formData
.
value
.
id
)
message
.
success
(
t
(
'common.success'
))
getDetail
()
})
}
...
...
@@ -179,6 +212,8 @@ const receive = () => {
const
refuse
=
()
=>
{
message
.
confirm
(
'是否拒绝收货?'
).
then
(()
=>
{
AfterSaleApi
.
refuse
(
formData
.
value
.
id
)
message
.
success
(
t
(
'common.success'
))
getDetail
()
})
}
...
...
@@ -186,6 +221,8 @@ const refuse = () => {
const
refund
=
()
=>
{
message
.
confirm
(
'是否确认退款?'
).
then
(()
=>
{
AfterSaleApi
.
refund
(
formData
.
value
.
id
)
message
.
success
(
t
(
'common.success'
))
getDetail
()
})
}
...
...
src/views/mall/trade/order/detail/index.vue
View file @
22d95fa0
This diff is collapsed.
Click to expand it.
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