Skip to content

Commit 27219e1

Browse files
committed
mall:优惠券 商品适用范围,增加商品分类
1 parent 60d2e31 commit 27219e1

File tree

4 files changed

+75
-4
lines changed

4 files changed

+75
-4
lines changed

src/api/mall/promotion/coupon/couponTemplate.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ export interface CouponTemplateVO {
99
takeType: number
1010
usePrice: number
1111
productScope: number
12-
productSpuIds: string
12+
productSpuIds: number[]
1313
validityType: number
1414
validStartTime: Date
1515
validEndTime: Date

src/utils/constants.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,10 @@ export const PromotionProductScopeEnum = {
220220
SPU: {
221221
scope: 2,
222222
name: '指定商品参与'
223+
},
224+
CATEGORY: {
225+
scope: 3,
226+
name: '指定品类参与'
223227
}
224228
}
225229

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<template>
2+
<el-tree-select
3+
v-model="selectCategoryId"
4+
:data="categoryList"
5+
:props="defaultProps"
6+
:multiple="multiple"
7+
:show-checkbox="multiple"
8+
class="w-1/1"
9+
node-key="id"
10+
placeholder="请选择商品分类"
11+
/>
12+
</template>
13+
<script lang="ts" setup>
14+
import { defaultProps, handleTree } from '@/utils/tree'
15+
import * as ProductCategoryApi from '@/api/mall/product/category'
16+
import { oneOf } from 'vue-types'
17+
import { propTypes } from '@/utils/propTypes'
18+
19+
/** 商品分类选择组件 */
20+
defineOptions({ name: 'ProductCategorySelect' })
21+
22+
const props = defineProps({
23+
value: oneOf([propTypes.number, propTypes.array.def([])]).isRequired, // 选中的ID
24+
multiple: propTypes.bool.def(false) // 是否多选
25+
})
26+
27+
/** 选中的分类ID */
28+
const selectCategoryId = computed({
29+
get: () => {
30+
return props.value
31+
},
32+
set: (val: number | number[]) => {
33+
emit('update:modelValue', val)
34+
}
35+
})
36+
37+
/** 分类选择 */
38+
const emit = defineEmits(['update:modelValue'])
39+
40+
const categoryList = ref([]) // 分类树
41+
42+
onMounted(async () => {
43+
// 获得分类树
44+
const data = await ProductCategoryApi.getCategoryList({})
45+
categoryList.value = handleTree(data, 'id', 'parentId')
46+
})
47+
</script>

src/views/mall/promotion/coupon/template/CouponTemplateForm.vue

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,12 @@
172172
</div>
173173
</div>
174174
</el-form-item>
175+
<el-form-item
176+
v-if="formData.productScope === PromotionProductScopeEnum.CATEGORY.scope"
177+
prop="productCategoryIds"
178+
>
179+
<ProductCategorySelect v-model="formData.productCategoryIds" multiple />
180+
</el-form-item>
175181
</el-form>
176182
<template #footer>
177183
<el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
@@ -190,6 +196,7 @@ import {
190196
PromotionProductScopeEnum
191197
} from '@/utils/constants'
192198
import SpuTableSelect from '@/views/mall/product/spu/components/SpuTableSelect.vue'
199+
import ProductCategorySelect from '@/views/mall/product/category/components/ProductCategorySelect.vue'
193200
194201
defineOptions({ name: 'CouponTemplateForm' })
195202
@@ -218,7 +225,8 @@ const formData = ref({
218225
fixedStartTerm: undefined,
219226
fixedEndTerm: undefined,
220227
productScope: PromotionProductScopeEnum.ALL.scope,
221-
productSpuIds: []
228+
productSpuIds: [],
229+
productCategoryIds: []
222230
})
223231
const formRules = reactive({
224232
name: [{ required: true, message: '优惠券名称不能为空', trigger: 'blur' }],
@@ -235,7 +243,8 @@ const formRules = reactive({
235243
fixedStartTerm: [{ required: true, message: '开始领取天数不能为空', trigger: 'blur' }],
236244
fixedEndTerm: [{ required: true, message: '开始领取天数不能为空', trigger: 'blur' }],
237245
productScope: [{ required: true, message: '商品范围不能为空', trigger: 'blur' }],
238-
productSpuIds: [{ required: true, message: '商品范围不能为空', trigger: 'blur' }]
246+
productSpuIds: [{ required: true, message: '商品范围不能为空', trigger: 'blur' }],
247+
productCategoryIds: [{ required: true, message: '分类范围不能为空', trigger: 'blur' }]
239248
})
240249
const formRef = ref() // 表单 Ref
241250
const productSpus = ref<ProductSpuApi.Spu[]>([]) // 商品列表
@@ -302,6 +311,12 @@ const submitForm = async () => {
302311
? formData.value.validTimes[1]
303312
: undefined
304313
} as CouponTemplateApi.CouponTemplateVO
314+
315+
if (formData.value.productCategoryIds?.length > 0) {
316+
// 改个名字?加个字段?
317+
data.productSpuIds = formData.value.productCategoryIds
318+
}
319+
305320
if (formType.value === 'create') {
306321
await CouponTemplateApi.createCouponTemplate(data)
307322
message.success(t('common.createSuccess'))
@@ -337,7 +352,8 @@ const resetForm = () => {
337352
fixedStartTerm: undefined,
338353
fixedEndTerm: undefined,
339354
productScope: PromotionProductScopeEnum.ALL.scope,
340-
productSpuIds: []
355+
productSpuIds: [],
356+
productCategoryIds: []
341357
}
342358
formRef.value?.resetFields()
343359
productSpus.value = []
@@ -350,6 +366,10 @@ const getProductScope = async () => {
350366
// 获得商品列表
351367
productSpus.value = await ProductSpuApi.getSpuDetailList(formData.value.productSpuIds)
352368
break
369+
case PromotionProductScopeEnum.CATEGORY.scope:
370+
formData.value.productCategoryIds = formData.value.productSpuIds
371+
formData.value.productSpuIds = []
372+
break
353373
default:
354374
break
355375
}

0 commit comments

Comments
 (0)