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
42f0bf07
authored
Oct 05, 2023
by
YunaiV
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
promotion:优化砍价活动的管理
parent
4c2eb3d8
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
204 additions
and
192 deletions
+204
-192
src/views/mall/promotion/bargain/activity/BargainActivityForm.vue
+7
-6
src/views/mall/promotion/bargain/activity/bargainActivity.data.ts
+0
-19
src/views/mall/promotion/bargain/activity/index.vue
+195
-70
src/views/mall/promotion/combination/activity/CombinationActivityForm.vue
+1
-0
src/views/mall/promotion/seckill/activity/index.vue
+1
-1
src/views/mall/promotion/seckill/activity/seckillActivity.data.ts
+0
-96
No files found.
src/views/mall/promotion/bargain/activity/BargainActivityForm.vue
View file @
42f0bf07
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
<el-table-column
align=
"center"
label=
"砍价底价(元)"
min-width=
"168"
>
<el-table-column
align=
"center"
label=
"砍价底价(元)"
min-width=
"168"
>
<
template
#
default=
"{ row: sku }"
>
<
template
#
default=
"{ row: sku }"
>
<el-input-number
<el-input-number
v-model=
"sku.productConfig.bargainPrice"
v-model=
"sku.productConfig.bargain
Min
Price"
:min=
"0"
:min=
"0"
:precision=
"2"
:precision=
"2"
:step=
"0.1"
:step=
"0.1"
...
@@ -86,7 +86,7 @@ const ruleConfig: RuleConfig[] = [
...
@@ -86,7 +86,7 @@ const ruleConfig: RuleConfig[] = [
message
:
'商品砍价起始价格不能小于 0 !!!'
message
:
'商品砍价起始价格不能小于 0 !!!'
},
},
{
{
name
:
'productConfig.bargainPrice'
,
name
:
'productConfig.bargain
Min
Price'
,
rule
:
(
arg
)
=>
arg
>=
0
,
rule
:
(
arg
)
=>
arg
>=
0
,
message
:
'商品砍价底价不能小于 0 !!!'
message
:
'商品砍价底价不能小于 0 !!!'
},
},
...
@@ -123,14 +123,14 @@ const getSpuDetails = async (
...
@@ -123,14 +123,14 @@ const getSpuDetails = async (
spuId
:
spu
.
id
!
,
spuId
:
spu
.
id
!
,
skuId
:
sku
.
id
!
,
skuId
:
sku
.
id
!
,
bargainFirstPrice
:
1
,
bargainFirstPrice
:
1
,
bargainPrice
:
1
,
bargain
Min
Price
:
1
,
stock
:
1
stock
:
1
}
}
if
(
typeof
products
!==
'undefined'
)
{
if
(
typeof
products
!==
'undefined'
)
{
const
product
=
products
.
find
((
item
)
=>
item
.
skuId
===
sku
.
id
)
const
product
=
products
.
find
((
item
)
=>
item
.
skuId
===
sku
.
id
)
if
(
product
)
{
if
(
product
)
{
product
.
bargainFirstPrice
=
formatToFraction
(
product
.
bargainFirstPrice
)
product
.
bargainFirstPrice
=
formatToFraction
(
product
.
bargainFirstPrice
)
product
.
bargain
Price
=
formatToFraction
(
product
.
barga
inPrice
)
product
.
bargain
MinPrice
=
formatToFraction
(
product
.
bargainM
inPrice
)
}
}
config
=
product
||
config
config
=
product
||
config
}
}
...
@@ -173,7 +173,7 @@ const open = async (type: string, id?: number) => {
...
@@ -173,7 +173,7 @@ const open = async (type: string, id?: number) => {
spuId
:
data
.
spuId
!
,
spuId
:
data
.
spuId
!
,
skuId
:
data
.
skuId
,
skuId
:
data
.
skuId
,
bargainFirstPrice
:
data
.
bargainFirstPrice
,
// 砍价起始价格,单位分
bargainFirstPrice
:
data
.
bargainFirstPrice
,
// 砍价起始价格,单位分
bargain
Price
:
data
.
barga
inPrice
,
// 砍价底价
bargain
MinPrice
:
data
.
bargainM
inPrice
,
// 砍价底价
stock
:
data
.
stock
// 活动库存
stock
:
data
.
stock
// 活动库存
}
}
]
]
...
@@ -204,12 +204,13 @@ const submitForm = async () => {
...
@@ -204,12 +204,13 @@ const submitForm = async () => {
// 提交请求
// 提交请求
formLoading
.
value
=
true
formLoading
.
value
=
true
try
{
try
{
// TODO @puhui999: 这样要深克隆
const
data
=
formRef
.
value
.
formModel
as
BargainActivityApi
.
BargainActivityVO
const
data
=
formRef
.
value
.
formModel
as
BargainActivityApi
.
BargainActivityVO
const
products
=
spuAndSkuListRef
.
value
.
getSkuConfigs
(
'productConfig'
)
const
products
=
spuAndSkuListRef
.
value
.
getSkuConfigs
(
'productConfig'
)
products
.
forEach
((
item
:
BargainProductVO
)
=>
{
products
.
forEach
((
item
:
BargainProductVO
)
=>
{
// 砍价价格元转分
// 砍价价格元转分
item
.
bargainFirstPrice
=
convertToInteger
(
item
.
bargainFirstPrice
)
item
.
bargainFirstPrice
=
convertToInteger
(
item
.
bargainFirstPrice
)
item
.
bargain
Price
=
convertToInteger
(
item
.
barga
inPrice
)
item
.
bargain
MinPrice
=
convertToInteger
(
item
.
bargainM
inPrice
)
})
})
// 用户每次砍价金额分转元, 元转分
// 用户每次砍价金额分转元, 元转分
data
.
randomMinPrice
=
convertToInteger
(
data
.
randomMinPrice
)
data
.
randomMinPrice
=
convertToInteger
(
data
.
randomMinPrice
)
...
...
src/views/mall/promotion/bargain/activity/bargainActivity.data.ts
View file @
42f0bf07
...
@@ -133,20 +133,6 @@ const crudSchemas = reactive<CrudSchema[]>([
...
@@ -133,20 +133,6 @@ const crudSchemas = reactive<CrudSchema[]>([
}
}
},
},
{
{
label
:
'砍价成功数量'
,
field
:
'successCount'
,
isSearch
:
false
,
isForm
:
false
},
{
label
:
'活动状态'
,
field
:
'status'
,
dictType
:
DICT_TYPE
.
COMMON_STATUS
,
dictClass
:
'number'
,
isSearch
:
true
,
isForm
:
false
},
{
label
:
'拼团商品'
,
label
:
'拼团商品'
,
field
:
'spuId'
,
field
:
'spuId'
,
isSearch
:
false
,
isSearch
:
false
,
...
@@ -155,11 +141,6 @@ const crudSchemas = reactive<CrudSchema[]>([
...
@@ -155,11 +141,6 @@ const crudSchemas = reactive<CrudSchema[]>([
span
:
24
span
:
24
}
}
}
}
},
{
label
:
'操作'
,
field
:
'action'
,
isForm
:
false
}
}
])
])
export
const
{
allSchemas
}
=
useCrudSchemas
(
crudSchemas
)
export
const
{
allSchemas
}
=
useCrudSchemas
(
crudSchemas
)
src/views/mall/promotion/bargain/activity/index.vue
View file @
42f0bf07
<
template
>
<
template
>
<!-- 搜索工作栏 -->
<ContentWrap>
<ContentWrap>
<Search
:schema=
"allSchemas.searchSchema"
@
reset=
"setSearchParams"
@
search=
"setSearchParams"
>
<!-- 搜索工作栏 -->
<!-- 新增等操作按钮 -->
<el-form
<template
#
actionMore
>
class=
"-mb-15px"
:model=
"queryParams"
ref=
"queryFormRef"
:inline=
"true"
label-width=
"68px"
>
<el-form-item
label=
"活动名称"
prop=
"name"
>
<el-input
v-model=
"queryParams.name"
placeholder=
"请输入活动名称"
clearable
@
keyup
.
enter=
"handleQuery"
class=
"!w-240px"
/>
</el-form-item>
<el-form-item
label=
"活动状态"
prop=
"status"
>
<el-select
v-model=
"queryParams.status"
placeholder=
"请选择活动状态"
clearable
class=
"!w-240px"
>
<el-option
v-for=
"dict in getIntDictOptions(DICT_TYPE.COMMON_STATUS)"
:key=
"dict.value"
:label=
"dict.label"
:value=
"dict.value"
/>
</el-select>
</el-form-item>
<el-form-item>
<el-button
@
click=
"handleQuery"
><Icon
icon=
"ep:search"
class=
"mr-5px"
/>
搜索
</el-button>
<el-button
@
click=
"resetQuery"
><Icon
icon=
"ep:refresh"
class=
"mr-5px"
/>
重置
</el-button>
<el-button
<el-button
v-hasPermi=
"['promotion:bargain-activity:create']"
plain
type=
"primary"
type=
"primary"
plain
@
click=
"openForm('create')"
@
click=
"openForm('create')"
v-hasPermi=
"['promotion:bargain-activity:create']"
>
>
<Icon
class=
"mr-5px"
icon=
"ep:plus"
/>
<Icon
icon=
"ep:plus"
class=
"mr-5px"
/>
新增
新增
</el-button>
</el-button>
</
template
>
</
el-form-item
>
</
Search
>
</
el-form
>
</ContentWrap>
</ContentWrap>
<!-- 列表 -->
<!-- 列表 -->
<ContentWrap>
<ContentWrap>
<Table
<el-table
v-loading=
"loading"
:data=
"list"
:stripe=
"true"
:show-overflow-tooltip=
"true"
>
v-model:currentPage=
"tableObject.currentPage"
<el-table-column
label=
"活动编号"
prop=
"id"
min-width=
"80"
/>
v-model:pageSize=
"tableObject.pageSize"
<el-table-column
label=
"活动名称"
prop=
"name"
min-width=
"140"
/>
:columns=
"allSchemas.tableColumns"
<el-table-column
label=
"活动时间"
min-width=
"210"
>
:data=
"tableObject.tableList"
<template
#
default=
"scope"
>
:loading=
"tableObject.loading"
{{
formatDate
(
scope
.
row
.
startTime
,
'YYYY-MM-DD'
)
}}
:pagination=
"{
~
{{
formatDate
(
scope
.
row
.
endTime
,
'YYYY-MM-DD'
)
}}
total: tableObject.total
</
template
>
}"
</el-table-column>
>
<el-table-column
label=
"商品图片"
prop=
"spuName"
min-width=
"80"
>
<
template
#
spuId=
"{ row }"
>
<
template
#
default=
"scope"
>
<el-image
<el-image
:src=
"row.picUrl"
:src=
"scope.row.picUrl"
class=
"mr-5px h-30px w-30px align-middle"
class=
"h-40px w-40px"
@
click=
"imagePreview(row.picUrl)"
:preview-src-list=
"[scope.row.picUrl]"
/>
preview-teleported
<span
class=
"align-middle"
>
{{
row
.
spuName
}}
</span>
/>
</
template
>
</
template
>
<
template
#
action=
"{ row }"
>
</el-table-column>
<el-button
<el-table-column
label=
"商品标题"
prop=
"spuName"
min-width=
"300"
/>
v-hasPermi=
"['promotion:bargain-activity:update']"
<el-table-column
link
label=
"起始价格"
type=
"primary"
prop=
"bargainFirstPrice"
@
click=
"openForm('update', row.id)"
min-width=
"100"
>
:formatter=
"fenToYuanFormat"
编辑
/>
</el-button>
<el-table-column
<el-button
label=
"砍价底价"
v-hasPermi=
"['promotion:bargain-activity:delete']"
prop=
"bargainMinPrice"
link
min-width=
"100"
type=
"danger"
:formatter=
"fenToYuanFormat"
@
click=
"handleDelete(row.id)"
/>
>
<el-table-column
label=
"总砍价人数"
prop=
"recordUserCount"
min-width=
"100"
/>
删除
<el-table-column
label=
"成功砍价人数"
prop=
"recordSuccessUserCount"
min-width=
"110"
/>
</el-button>
<el-table-column
label=
"助力人数"
prop=
"helpUserCount"
min-width=
"100"
/>
</
template
>
<el-table-column
label=
"活动状态"
align=
"center"
prop=
"status"
min-width=
"100"
>
</Table>
<
template
#
default=
"scope"
>
<dict-tag
:type=
"DICT_TYPE.COMMON_STATUS"
:value=
"scope.row.status"
/>
</
template
>
</el-table-column>
<el-table-column
label=
"库存"
align=
"center"
prop=
"stock"
min-width=
"80"
/>
<el-table-column
label=
"总库存"
align=
"center"
prop=
"totalStock"
min-width=
"80"
/>
<el-table-column
label=
"创建时间"
align=
"center"
prop=
"createTime"
:formatter=
"dateFormatter"
width=
"180px"
/>
<el-table-column
label=
"操作"
align=
"center"
width=
"150px"
fixed=
"right"
>
<
template
#
default=
"scope"
>
<el-button
link
type=
"primary"
@
click=
"openForm('update', scope.row.id)"
v-hasPermi=
"['promotion:bargain-activity:update']"
>
编辑
</el-button>
<el-button
link
type=
"danger"
@
click=
"handleClose(scope.row.id)"
v-if=
"scope.row.status === 0"
v-hasPermi=
"['promotion:bargain-activity:close']"
>
关闭
</el-button>
<el-button
link
type=
"danger"
@
click=
"handleDelete(scope.row.id)"
v-else
v-hasPermi=
"['promotion:bargain-activity:delete']"
>
删除
</el-button>
</
template
>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination
:total=
"total"
v-model:page=
"queryParams.pageNo"
v-model:limit=
"queryParams.pageSize"
@
pagination=
"getList"
/>
</ContentWrap>
</ContentWrap>
<!-- 表单弹窗:添加/修改 -->
<!-- 表单弹窗:添加/修改 -->
<BargainActivityForm
ref=
"formRef"
@
success=
"getList"
/>
<BargainActivityForm
ref=
"formRef"
@
success=
"getList"
/>
</template>
</template>
<
script
lang=
"ts"
setup
>
import
{
allSchemas
}
from
'./bargainActivity.data'
<
script
setup
lang=
"ts"
>
import
{
DICT_TYPE
,
getIntDictOptions
}
from
'@/utils/dict'
import
{
dateFormatter
}
from
'@/utils/formatTime'
import
*
as
BargainActivityApi
from
'@/api/mall/promotion/bargain/bargainActivity'
import
*
as
BargainActivityApi
from
'@/api/mall/promotion/bargain/bargainActivity'
import
BargainActivityForm
from
'./BargainActivityForm.vue'
import
BargainActivityForm
from
'./BargainActivityForm.vue'
import
{
createImageViewer
}
from
'@/components/ImageViewer'
import
{
formatDate
}
from
'@/utils/formatTime'
import
{
sortTableColumns
}
from
'@/hooks/web/useCrudSchemas'
import
{
fenToYuanFormat
}
from
'@/utils/formatter'
import
{
fenToYuan
}
from
'@/utils'
defineOptions
({
name
:
'PromotionBargainActivity'
})
defineOptions
({
name
:
'PromotionBargainActivity'
})
// tableObject:表格的属性对象,可获得分页大小、条数等属性
const
message
=
useMessage
()
// 消息弹窗
// tableMethods:表格的操作对象,可进行获得分页、删除记录等操作
const
{
t
}
=
useI18n
()
// 国际化
// 详细可见:https://doc.iocoder.cn/vue3/crud-schema/
const
{
tableObject
,
tableMethods
}
=
useTable
({
const
loading
=
ref
(
true
)
// 列表的加载中
getListApi
:
BargainActivityApi
.
getBargainActivityPage
,
// 分页接口
const
total
=
ref
(
0
)
// 列表的总页数
delListApi
:
BargainActivityApi
.
deleteBargainActivity
// 删除接口
const
list
=
ref
([])
// 列表的数据
const
queryParams
=
reactive
({
pageNo
:
1
,
pageSize
:
10
,
name
:
null
,
status
:
null
})
})
// 获得表格的各种操作
const
queryFormRef
=
ref
()
// 搜索的表单
const
{
getList
,
setSearchParams
}
=
tableMethods
const
exportLoading
=
ref
(
false
)
// 导出的加载中
/** 商品图预览 */
/** 查询列表 */
const
imagePreview
=
(
imgUrl
:
string
)
=>
{
const
getList
=
async
()
=>
{
createImageViewer
({
loading
.
value
=
true
urlList
:
[
imgUrl
]
try
{
})
const
data
=
await
BargainActivityApi
.
getBargainActivityPage
(
queryParams
)
list
.
value
=
data
.
list
total
.
value
=
data
.
total
}
finally
{
loading
.
value
=
false
}
}
/** 搜索按钮操作 */
const
handleQuery
=
()
=>
{
queryParams
.
pageNo
=
1
getList
()
}
/** 重置按钮操作 */
const
resetQuery
=
()
=>
{
queryFormRef
.
value
.
resetFields
()
handleQuery
()
}
}
/** 添加/修改操作 */
/** 添加/修改操作 */
...
@@ -93,15 +198,35 @@ const openForm = (type: string, id?: number) => {
...
@@ -93,15 +198,35 @@ const openForm = (type: string, id?: number) => {
formRef
.
value
.
open
(
type
,
id
)
formRef
.
value
.
open
(
type
,
id
)
}
}
// TODO 芋艿:这里要改下
/** 关闭按钮操作 */
const
handleClose
=
async
(
id
:
number
)
=>
{
try
{
// 关闭的二次确认
await
message
.
confirm
(
'确认关闭该秒杀活动吗?'
)
// 发起关闭
await
BargainActivityApi
.
closeSeckillActivity
(
id
)
message
.
success
(
'关闭成功'
)
// 刷新列表
await
getList
()
}
catch
{}
}
/** 删除按钮操作 */
/** 删除按钮操作 */
const
handleDelete
=
(
id
:
number
)
=>
{
const
handleDelete
=
async
(
id
:
number
)
=>
{
tableMethods
.
delList
(
id
,
false
)
try
{
// 删除的二次确认
await
message
.
delConfirm
()
// 发起删除
await
BargainActivityApi
.
deleteBargainActivity
(
id
)
message
.
success
(
t
(
'common.delSuccess'
))
// 刷新列表
await
getList
()
}
catch
{}
}
}
/** 初始化 **/
/** 初始化 **/
onMounted
(()
=>
{
onMounted
(
async
()
=>
{
// 获得活动列表
await
getList
()
sortTableColumns
(
allSchemas
.
tableColumns
,
'spuId'
)
getList
()
})
})
</
script
>
</
script
>
src/views/mall/promotion/combination/activity/CombinationActivityForm.vue
View file @
42f0bf07
...
@@ -167,6 +167,7 @@ const submitForm = async () => {
...
@@ -167,6 +167,7 @@ const submitForm = async () => {
products
.
forEach
((
item
:
CombinationActivityApi
.
CombinationProductVO
)
=>
{
products
.
forEach
((
item
:
CombinationActivityApi
.
CombinationProductVO
)
=>
{
item
.
combinationPrice
=
convertToInteger
(
item
.
combinationPrice
)
item
.
combinationPrice
=
convertToInteger
(
item
.
combinationPrice
)
})
})
// TODO @puhui999: 这样要深克隆
const
data
=
formRef
.
value
.
formModel
as
CombinationActivityApi
.
CombinationActivityVO
const
data
=
formRef
.
value
.
formModel
as
CombinationActivityApi
.
CombinationActivityVO
data
.
products
=
products
data
.
products
=
products
// 真正提交
// 真正提交
...
...
src/views/mall/promotion/seckill/activity/index.vue
View file @
42f0bf07
...
@@ -106,7 +106,7 @@
...
@@ -106,7 +106,7 @@
:formatter=
"dateFormatter"
:formatter=
"dateFormatter"
width=
"180px"
width=
"180px"
/>
/>
<el-table-column
label=
"操作"
align=
"center"
width=
"150px"
>
<el-table-column
label=
"操作"
align=
"center"
width=
"150px"
fixed=
"right"
>
<
template
#
default=
"scope"
>
<
template
#
default=
"scope"
>
<el-button
<el-button
link
link
...
...
src/views/mall/promotion/seckill/activity/seckillActivity.data.ts
View file @
42f0bf07
...
@@ -95,42 +95,6 @@ const crudSchemas = reactive<CrudSchema[]>([
...
@@ -95,42 +95,6 @@ const crudSchemas = reactive<CrudSchema[]>([
}
}
},
},
{
{
label
:
'新增订单数'
,
field
:
'orderCount'
,
isForm
:
false
,
form
:
{
component
:
'InputNumber'
,
value
:
0
},
table
:
{
width
:
120
}
},
{
label
:
'付款人数'
,
field
:
'userCount'
,
isForm
:
false
,
form
:
{
component
:
'InputNumber'
,
value
:
0
},
table
:
{
width
:
120
}
},
{
label
:
'订单实付金额'
,
field
:
'totalPrice'
,
isForm
:
false
,
form
:
{
component
:
'InputNumber'
,
value
:
0
},
table
:
{
width
:
120
}
},
{
label
:
'总限购数量'
,
label
:
'总限购数量'
,
field
:
'totalLimitCount'
,
field
:
'totalLimitCount'
,
form
:
{
form
:
{
...
@@ -164,26 +128,6 @@ const crudSchemas = reactive<CrudSchema[]>([
...
@@ -164,26 +128,6 @@ const crudSchemas = reactive<CrudSchema[]>([
}
}
},
},
{
{
label
:
'秒杀库存'
,
field
:
'stock'
,
isForm
:
false
,
form
:
{
component
:
'InputNumber'
,
value
:
0
},
table
:
{
width
:
120
}
},
{
label
:
'秒杀总库存'
,
field
:
'totalStock'
,
isForm
:
false
,
table
:
{
width
:
120
}
},
{
label
:
'秒杀活动商品'
,
label
:
'秒杀活动商品'
,
field
:
'spuId'
,
field
:
'spuId'
,
isTable
:
true
,
isTable
:
true
,
...
@@ -198,37 +142,6 @@ const crudSchemas = reactive<CrudSchema[]>([
...
@@ -198,37 +142,6 @@ const crudSchemas = reactive<CrudSchema[]>([
}
}
},
},
{
{
label
:
'创建时间'
,
field
:
'createTime'
,
formatter
:
dateFormatter
,
search
:
{
component
:
'DatePicker'
,
componentProps
:
{
valueFormat
:
'YYYY-MM-DD HH:mm:ss'
,
type
:
'daterange'
,
defaultTime
:
[
new
Date
(
'1 00:00:00'
),
new
Date
(
'1 23:59:59'
)]
}
},
isForm
:
false
,
table
:
{
width
:
120
}
},
{
label
:
'状态'
,
field
:
'status'
,
dictType
:
DICT_TYPE
.
COMMON_STATUS
,
dictClass
:
'number'
,
isForm
:
false
,
isSearch
:
true
,
form
:
{
component
:
'Radio'
},
table
:
{
width
:
80
}
},
{
label
:
'备注'
,
label
:
'备注'
,
field
:
'remark'
,
field
:
'remark'
,
isSearch
:
false
,
isSearch
:
false
,
...
@@ -245,15 +158,6 @@ const crudSchemas = reactive<CrudSchema[]>([
...
@@ -245,15 +158,6 @@ const crudSchemas = reactive<CrudSchema[]>([
table
:
{
table
:
{
width
:
300
width
:
300
}
}
},
{
label
:
'操作'
,
field
:
'action'
,
isForm
:
false
,
table
:
{
width
:
120
,
fixed
:
'right'
}
}
}
])
])
export
const
{
allSchemas
}
=
useCrudSchemas
(
crudSchemas
)
export
const
{
allSchemas
}
=
useCrudSchemas
(
crudSchemas
)
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