Skip to content

Commit 44be35b

Browse files
author
puhui999
committed
fix: 完善砍价活动管理对齐后端
1 parent 7bf3e41 commit 44be35b

File tree

5 files changed

+62
-22
lines changed

5 files changed

+62
-22
lines changed

src/api/mall/promotion/bargain/bargainActivity.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,18 +7,20 @@ export interface BargainActivityVO {
77
startTime?: Date
88
endTime?: Date
99
status?: number
10-
spuId?: number
1110
userSize?: number // 达到该人数,才能砍到低价
1211
bargainCount?: number // 最大帮砍次数
1312
totalLimitCount?: number // 最大购买次数
14-
stock?: number // 活动总库存
13+
spuId: number
14+
skuId: number
15+
bargainFirstPrice: number // 砍价起始价格,单位分
16+
bargainPrice: number // 砍价底价
17+
stock: number // 活动库存
1518
randomMinPrice?: number // 用户每次砍价的最小金额,单位:分
1619
randomMaxPrice?: number // 用户每次砍价的最大金额,单位:分
1720
successCount?: number // 砍价成功数量
18-
products?: BargainProductVO[]
1921
}
2022

21-
// 砍价活动所需属性
23+
// 砍价活动所需属性。 选择的商品和属性的时候使用方便使用活动的通用封装
2224
export interface BargainProductVO {
2325
spuId: number
2426
skuId: number

src/views/mall/product/spu/components/SkuList.vue

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ const validateSku = () => {
334334
for (const sku of formData.value!.skus!) {
335335
// 作为活动组件的校验
336336
if (props.isActivityComponent) {
337-
for (const rule of props.ruleConfig) {
337+
for (const rule of props?.ruleConfig) {
338338
const arg = getValue(sku, rule.name)
339339
if (!rule.rule(arg)) {
340340
validate = false // 只要有一个不通过则直接不通过
@@ -534,9 +534,10 @@ watch(
534534
}
535535
)
536536
const activitySkuListRef = ref<InstanceType<typeof ElTable>>()
537-
const clearSelection = () => {
538-
activitySkuListRef.value.clearSelection()
537+
538+
const getSkuTableRef = () => {
539+
return activitySkuListRef.value
539540
}
540541
// 暴露出生成 sku 方法,给添加属性成功时调用
541-
defineExpose({ generateTableData, validateSku, clearSelection })
542+
defineExpose({ generateTableData, validateSku, getSkuTableRef })
542543
</script>

src/views/mall/promotion/bargain/activity/BargainActivityForm.vue

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
<el-button @click="dialogVisible = false">取 消</el-button>
5252
</template>
5353
</Dialog>
54-
<SpuSelect ref="spuSelectRef" :isSelectSku="true" @confirm="selectSpu" />
54+
<SpuSelect ref="spuSelectRef" :isSelectSku="true" :radio="true" @confirm="selectSpu" />
5555
</template>
5656
<script lang="ts" setup>
5757
import * as BargainActivityApi from '@/api/mall/promotion/bargain/bargainActivity'
@@ -87,12 +87,12 @@ const ruleConfig: RuleConfig[] = [
8787
},
8888
{
8989
name: 'productConfig.bargainPrice',
90-
rule: (arg) => arg > 0,
90+
rule: (arg) => arg >= 0,
9191
message: '商品砍价底价不能小于0 !!!'
9292
},
9393
{
9494
name: 'productConfig.stock',
95-
rule: (arg) => arg > 1,
95+
rule: (arg) => arg >= 1,
9696
message: '商品活动库存不能小于1 !!!'
9797
}
9898
]
@@ -164,7 +164,20 @@ const open = async (type: string, id?: number) => {
164164
// 用户每次砍价金额分转元, 分转元
165165
data.randomMinPrice = formatToFraction(data.randomMinPrice)
166166
data.randomMaxPrice = formatToFraction(data.randomMaxPrice)
167-
await getSpuDetails(data.spuId!, data.products?.map((sku) => sku.skuId), data.products)
167+
// 对齐活动商品处理结构
168+
await getSpuDetails(
169+
data.spuId!,
170+
[data.skuId],
171+
[
172+
{
173+
spuId: data.spuId!,
174+
skuId: data.skuId,
175+
bargainFirstPrice: data.bargainFirstPrice, // 砍价起始价格,单位分
176+
bargainPrice: data.bargainPrice, // 砍价底价
177+
stock: data.stock // 活动库存
178+
}
179+
]
180+
)
168181
formRef.value.setValues(data)
169182
} finally {
170183
formLoading.value = false
@@ -201,12 +214,12 @@ const submitForm = async () => {
201214
// 用户每次砍价金额分转元, 元转分
202215
data.randomMinPrice = convertToInteger(data.randomMinPrice)
203216
data.randomMaxPrice = convertToInteger(data.randomMaxPrice)
204-
data.products = products
217+
const formData = { ...data, ...products[0] }
205218
if (formType.value === 'create') {
206-
await BargainActivityApi.createBargainActivity(data)
219+
await BargainActivityApi.createBargainActivity(formData)
207220
message.success(t('common.createSuccess'))
208221
} else {
209-
await BargainActivityApi.updateBargainActivity(data)
222+
await BargainActivityApi.updateBargainActivity(formData)
210223
message.success(t('common.updateSuccess'))
211224
}
212225
dialogVisible.value = false
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<template>
2+
<div></div>
3+
</template>
4+
5+
<script lang="ts" name="CombinationRecord" setup></script>

src/views/mall/promotion/components/SpuSelect.vue

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,8 @@ defineOptions({ name: 'PromotionSpuSelect' })
127127
const props = defineProps({
128128
// 默认不需要(不需要的情况下只返回 spu,需要的情况下返回 选中的 spu 和 sku 列表)
129129
// 其它活动需要选择商品和商品属性导入此组件即可,需添加组件属性 :isSelectSku='true'
130-
isSelectSku: propTypes.bool.def(false) // 是否需要选择 sku 属性
130+
isSelectSku: propTypes.bool.def(false), // 是否需要选择 sku 属性
131+
radio: propTypes.bool.def(false) // 是否单选 sku
131132
})
132133
133134
const message = useMessage() // 消息弹窗
@@ -146,7 +147,7 @@ const queryParams = ref({
146147
}) // 查询参数
147148
const propertyList = ref<PropertyAndValues[]>([]) // 商品属性列表
148149
const spuListRef = ref<InstanceType<typeof ElTable>>()
149-
const skuListRef = ref() // 商品属性选择 Ref
150+
const skuListRef = ref<InstanceType<typeof SkuList>>() // 商品属性选择 Ref
150151
const spuData = ref<ProductSpuApi.Spu>() // 商品详情
151152
const isExpand = ref(false) // 控制 SKU 列表显示
152153
const expandRowKeys = ref<number[]>() // 控制展开行需要设置 row-key 属性才能使用,该属性为展开行的 keys 数组。
@@ -155,12 +156,30 @@ const expandRowKeys = ref<number[]>() // 控制展开行需要设置 row-key 属
155156
const selectedSpuId = ref<number>(0) // 选中的商品 spuId
156157
const selectedSkuIds = ref<number[]>([]) // 选中的商品 skuIds
157158
const selectSku = (val: ProductSpuApi.Sku[]) => {
159+
const skuTable = skuListRef.value?.getSkuTableRef()
158160
if (selectedSpuId.value === 0) {
159161
message.warning('请先选择商品再选择相应的规格!!!')
160-
skuListRef.value.clearSelection()
162+
skuTable?.clearSelection()
161163
return
162164
}
163-
selectedSkuIds.value = val.map((sku) => sku.id!)
165+
if (val.length === 0) {
166+
selectedSkuIds.value = []
167+
return
168+
}
169+
if (props.radio) {
170+
// 只选择一个
171+
selectedSkuIds.value = [val.map((sku) => sku.id!)[0]]
172+
// 如果大于1个
173+
if (val.length > 1) {
174+
// 清空选择
175+
skuTable?.clearSelection()
176+
// 变更为最后一次选择的
177+
skuTable?.toggleRowSelection(val.pop(), true)
178+
return
179+
}
180+
} else {
181+
selectedSkuIds.value = val.map((sku) => sku.id!)
182+
}
164183
}
165184
const selectSpu = (val: ProductSpuApi.Spu[]) => {
166185
if (val.length === 0) {
@@ -176,9 +195,9 @@ const selectSpu = (val: ProductSpuApi.Spu[]) => {
176195
// 如果大于1个
177196
if (val.length > 1) {
178197
// 清空选择
179-
spuListRef.value.clearSelection()
198+
spuListRef.value?.clearSelection()
180199
// 变更为最后一次选择的
181-
spuListRef.value.toggleRowSelection(val.pop(), true)
200+
spuListRef.value?.toggleRowSelection(val.pop(), true)
182201
return
183202
}
184203
expandChange(val[0], val)
@@ -194,7 +213,7 @@ const expandChange = async (row: ProductSpuApi.Spu, expandedRows?: ProductSpuApi
194213
expandRowKeys.value = [selectedSpuId.value]
195214
return
196215
}
197-
// 如果以展开 skuList 则选择此对应的 spu 不需要重新获取渲染 skuList
216+
// 如果已展开 skuList 则选择此对应的 spu 不需要重新获取渲染 skuList
198217
if (isExpand.value && spuData.value?.id === row.id) {
199218
return
200219
}

0 commit comments

Comments
 (0)