Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
corporate-culture-qd
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
王立鹏
corporate-culture-qd
Commits
049bef0f
Commit
049bef0f
authored
Jul 23, 2026
by
lijiabin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【需求 23684】feat: 优化竞拍管理和出价校验
parent
dacd3221
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
99 additions
and
22 deletions
+99
-22
index.ts
src/api/backend/activity/index.ts
+3
-2
types.ts
src/api/backend/activity/types.ts
+6
-0
exchangeGoodsRecordDilaog.vue
src/views/auction/components/exchangeGoodsRecordDilaog.vue
+2
-2
exchangeYabiRecordDilaog.vue
src/views/auction/components/exchangeYabiRecordDilaog.vue
+1
-1
index.vue
src/views/auction/index.vue
+8
-1
index.vue
src/views/backend/settingsMenu/auctionManage/index.vue
+79
-16
No files found.
src/api/backend/activity/index.ts
View file @
049bef0f
...
...
@@ -2,6 +2,7 @@ import service from '@/utils/request/index'
import
type
{
BackendAuctionListSearchParams
,
BackendAuctionListItemDto
,
BackendDeleteAuctionDto
,
BackendAddOrUpdateAuctionItemDto
,
BackendAuctionRecordItemDto
,
BackendLotteryPrizeListSearchParams
,
...
...
@@ -44,11 +45,11 @@ export const addOrUpdateAuctionItem = (data: BackendAddOrUpdateAuctionItemDto) =
/**
* 删除竞拍物品数据
*/
export
const
deleteAuction
=
(
idList
:
number
[]
)
=>
{
export
const
deleteAuction
=
(
data
:
BackendDeleteAuctionDto
)
=>
{
return
service
.
request
({
url
:
'api/cultureAuctionItems/deleteAuction'
,
method
:
'POST'
,
data
:
{
idList
}
,
data
,
})
}
...
...
src/api/backend/activity/types.ts
View file @
049bef0f
...
...
@@ -36,8 +36,14 @@ export interface BackendAuctionListItemDto extends PageSearchParams {
remainingTime
:
string
}
export
interface
BackendDeleteAuctionDto
{
idList
:
number
[]
confirmDelete
:
boolean
}
export
interface
BackendAddOrUpdateAuctionItemDto
{
id
?:
number
status
?:
AuctionStatusEnum
name
:
string
quantity
:
number
specification
:
string
...
...
src/views/auction/components/exchangeGoodsRecordDilaog.vue
View file @
049bef0f
...
...
@@ -13,7 +13,7 @@
<div
class=
"w-750px flex items-center gap-3"
>
<el-select
v-model=
"searchParams.itemType"
placeholder=
"选择商品类型"
clearable
>
<el-option
label=
"亚声实物"
:value=
"ShopGoodsTypeEnum.REAL_GOODS"
/>
<el-option
label=
"虚拟
装饰
"
:value=
"ShopGoodsTypeEnum.VIRTUAL_GOODS"
/>
<el-option
label=
"虚拟
商品
"
:value=
"ShopGoodsTypeEnum.VIRTUAL_GOODS"
/>
</el-select>
<el-date-picker
...
...
@@ -38,7 +38,7 @@
<el-table-column
prop=
"itemType"
label=
"商品类型"
width=
"100"
align=
"center"
>
<template
#
default=
"scope"
>
{{
scope
.
row
.
itemType
===
ShopGoodsTypeEnum
.
REAL_GOODS
?
'亚声实物'
:
'虚拟
装饰
'
}}
{{
scope
.
row
.
itemType
===
ShopGoodsTypeEnum
.
REAL_GOODS
?
'亚声实物'
:
'虚拟
商品
'
}}
</
template
>
</el-table-column>
...
...
src/views/auction/components/exchangeYabiRecordDilaog.vue
View file @
049bef0f
...
...
@@ -13,7 +13,7 @@
<div
class=
"w-750px flex items-center gap-3"
>
<!--
<el-select
v-model=
"searchParams.type"
placeholder=
"选择商品类型"
clearable
>
<el-option
label=
"亚声实物"
:value=
"ShopGoodsTypeEnum.REAL_GOODS"
/>
<el-option
label=
"虚拟
装饰
"
:value=
"ShopGoodsTypeEnum.VIRTUAL_GOODS"
/>
<el-option
label=
"虚拟
商品
"
:value=
"ShopGoodsTypeEnum.VIRTUAL_GOODS"
/>
</el-select>
-->
<el-date-picker
...
...
src/views/auction/index.vue
View file @
049bef0f
...
...
@@ -175,10 +175,17 @@ const onBid = async (item: AuctionItemDto) => {
}
else
{
if
(
val
.
value
>
yabiData
.
value
.
currentValue
)
return
push
.
error
(
'您的YA币余额不足'
)
if
(
val
.
value
<
data
.
minIncrement
+
(
data
.
currentPrice
||
data
.
startingPrice
))
// 如果还没有出价 只需要出价大于等于起拍价
if
(
data
.
currentPrice
===
0
)
{
if
(
val
.
value
<
data
.
startingPrice
)
return
push
.
error
(
`出价必须大于等于起拍价: 至少【
${
data
.
startingPrice
}
】YA币`
,
)
}
else
{
if
(
val
.
value
<
data
.
minIncrement
+
(
data
.
currentPrice
||
data
.
startingPrice
))
return
push
.
error
(
`出价必须大于等于前最高出价+最低加价幅度: 至少【
${
data
.
minIncrement
+
(
data
.
currentPrice
||
data
.
startingPrice
)}
】YA币`
,
)
}
instance
.
confirmButtonLoading
=
true
instance
.
confirmButtonText
=
'Loading...'
...
...
src/views/backend/settingsMenu/auctionManage/index.vue
View file @
049bef0f
...
...
@@ -88,7 +88,7 @@
{{
// 未展示的时候不展示竞拍状态
row
.
isDisplay
===
0
?
''
?
'
未展示在前台时不展示竞拍状态
'
:
auctionStatusListOptions
.
find
((
item
)
=>
item
.
value
===
row
.
status
)?.
label
}}
</
template
>
...
...
@@ -195,6 +195,17 @@
inactive-text=
"否"
/>
</el-form-item>
<el-form-item
v-if=
"form.id"
label=
"竞拍状态"
prop=
"status"
>
<el-select
v-model=
"form.status"
placeholder=
"请选择竞拍状态"
class=
"w-60%!"
>
<el-option
v-for=
"item in editAuctionStatusOptions"
:key=
"item.value"
:label=
"item.label"
:value=
"item.value"
:disabled=
"item.disabled"
/>
</el-select>
</el-form-item>
</el-form>
</el-scrollbar>
<
template
#
footer
>
...
...
@@ -221,7 +232,7 @@ import {
}
from
'@/api/backend'
import
type
{
FormInstance
,
FormRules
}
from
'element-plus'
import
type
{
BackendAuctionListItemDto
,
BackendAddOrUpdateAuctionItemDto
}
from
'@/api/backend'
import
{
auctionStatusListOptions
}
from
'@/constants'
import
{
AuctionStatusEnum
,
auctionStatusListOptions
}
from
'@/constants'
import
UploadFile
from
'@/components/common/UploadFile/index.vue'
import
AuctionRecordDialog
from
'./components/auctionRecordDialog.vue'
import
dayjs
from
'dayjs'
...
...
@@ -253,19 +264,45 @@ const [form, resetForm] = useResetData<BackendAddOrUpdateAuctionItemDto>({
isDisplay
:
0
,
startTime
:
''
,
endTime
:
''
,
status
:
undefined
,
})
// 可编辑的 竞拍状态 只可以选择 「竞拍成功 / 已流拍」
const
editAuctionStatusOptions
=
computed
(()
=>
{
const
options
=
auctionStatusListOptions
.
filter
((
item
)
=>
[
AuctionStatusEnum
.
AUCTION_SUCCESS
,
AuctionStatusEnum
.
AUCTION_FAILED
].
includes
(
item
.
value
),
)
.
map
((
item
)
=>
({
...
item
,
disabled
:
false
,
}))
const
hasCurrentStatus
=
options
.
some
((
item
)
=>
item
.
value
===
form
.
value
.
status
)
if
(
form
.
value
.
status
!==
undefined
&&
!
hasCurrentStatus
)
{
const
currentStatus
=
auctionStatusListOptions
.
find
((
item
)
=>
item
.
value
===
form
.
value
.
status
)
options
.
unshift
({
label
:
currentStatus
?.
label
||
`未知状态(
${
form
.
value
.
status
}
)`
,
value
:
form
.
value
.
status
,
disabled
:
true
,
})
}
return
options
})
// 表单验证规则
const
formRules
:
FormRules
=
{
name
:
[{
required
:
true
,
message
:
'请输入名称'
,
trigger
:
'blur'
}],
description
:
[{
required
:
true
,
message
:
'请输入介绍内容'
,
trigger
:
'blur'
}],
quantity
:
[{
required
:
true
,
message
:
'请输入数量'
,
trigger
:
'blur'
}],
specification
:
[{
required
:
true
,
message
:
'请输入规格'
,
trigger
:
'blur'
}],
//
specification: [{ required: true, message: '请输入规格', trigger: 'blur' }],
startingPrice
:
[{
required
:
true
,
message
:
'请输入起拍价'
,
trigger
:
'blur'
}],
minIncrement
:
[{
required
:
true
,
message
:
'请输入最低加价幅度'
,
trigger
:
'blur'
}],
bidLimit
:
[{
required
:
true
,
message
:
'请输入竞拍次数上限'
,
trigger
:
'blur'
}],
startTime
:
[{
required
:
true
,
message
:
'请选择竞拍时间'
,
trigger
:
'change'
}],
isDisplay
:
[{
required
:
true
,
message
:
'请选择是否展示在前台'
,
trigger
:
'blur'
}],
imageUrl
:
[{
required
:
true
,
message
:
'请上传图片'
,
trigger
:
'change'
}],
status
:
[{
required
:
true
,
message
:
'请选择竞拍状态'
,
trigger
:
'change'
}],
}
const
dateRange
=
computed
({
get
()
{
...
...
@@ -304,21 +341,18 @@ const handleEdit = (row: BackendAddOrUpdateAuctionItemDto) => {
// 删除
const
handleDelete
=
async
(
row
:
BackendAuctionListItemDto
)
=>
{
const
confirmDelete
=
row
.
currentPrice
>
0
await
confirm
({
title
:
'提示'
,
message
:
`确定要删除竞拍物品"
${
row
.
name
}
"吗?`
,
message
:
confirmDelete
?
'该竞拍已有人出价,是否确定删除?删除后无法恢复,并会同步删除竞拍者的记录'
:
`确定要删除竞拍物品"
${
row
.
name
}
"吗?`
,
type
:
'danger'
,
})
try
{
await
deleteAuction
([
row
.
id
])
refresh
()
push
.
success
(
'删除成功'
)
refresh
()
}
catch
(
error
)
{
if
(
error
!==
'cancel'
)
{
push
.
error
(
'删除失败'
)
}
}
await
deleteAuction
({
idList
:
[
row
.
id
],
confirmDelete
})
refresh
()
push
.
success
(
'删除成功'
)
}
// 提交表单
...
...
@@ -384,13 +418,42 @@ const handleBatchShow = async () => {
}
const
handleBatchDelete
=
async
()
=>
{
const
bidRows
=
selectedRows
.
value
.
filter
((
item
)
=>
item
.
currentPrice
>
0
)
const
unbidRows
=
selectedRows
.
value
.
filter
((
item
)
=>
item
.
currentPrice
===
0
)
const
formatNames
=
(
rows
:
BackendAuctionListItemDto
[])
=>
rows
.
map
((
item
)
=>
`【
${
item
.
name
}
】`
).
join
(
''
)
let
message
=
`确定要删除竞拍物品
${
formatNames
(
unbidRows
)}
吗?`
if
(
bidRows
.
length
&&
unbidRows
.
length
)
{
message
=
`其中
${
formatNames
(
bidRows
)}
这些竞拍已有人出价,是否确定删除?删除后无法恢复,并会同步删除竞拍者的记录,其余
${
formatNames
(
unbidRows
)}
未出价会正常删除,确定删除吗?`
}
else
if
(
bidRows
.
length
)
{
message
=
`
${
formatNames
(
bidRows
)}
这些竞拍已有人出价,是否确定删除?删除后无法恢复,并会同步删除竞拍者的记录,确定删除吗?`
}
await
confirm
({
title
:
'提示'
,
message
:
'确定要删除这些竞拍物品吗?'
,
message
,
type
:
'danger'
,
})
await
deleteAuction
(
selectedRows
.
value
.
map
((
item
)
=>
item
.
id
))
if
(
unbidRows
.
length
&&
bidRows
.
length
)
{
await
Promise
.
all
([
deleteAuction
({
idList
:
unbidRows
.
map
((
item
)
=>
item
.
id
),
confirmDelete
:
false
,
}),
deleteAuction
({
idList
:
bidRows
.
map
((
item
)
=>
item
.
id
),
confirmDelete
:
true
,
}),
])
}
else
{
const
rows
=
bidRows
.
length
?
bidRows
:
unbidRows
await
deleteAuction
({
idList
:
rows
.
map
((
item
)
=>
item
.
id
),
confirmDelete
:
bidRows
.
length
>
0
,
})
}
refresh
()
push
.
success
(
'删除成功'
)
}
...
...
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