diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 03c1f999..4e0e763e 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -215,15 +215,15 @@ export const CouponTemplateValidityTypeEnum = { export const PromotionProductScopeEnum = { ALL: { scope: 1, - name: '全部商品参与' + name: '通用劵' }, SPU: { scope: 2, - name: '指定商品参与' + name: '商品劵' }, CATEGORY: { scope: 3, - name: '指定品类参与' + name: '品类劵' } } diff --git a/src/views/mall/product/category/components/ProductCategorySelect.vue b/src/views/mall/product/category/components/ProductCategorySelect.vue index b8011290..b257769a 100644 --- a/src/views/mall/product/category/components/ProductCategorySelect.vue +++ b/src/views/mall/product/category/components/ProductCategorySelect.vue @@ -24,7 +24,7 @@ const props = defineProps({ multiple: propTypes.bool.def(false) // 是否多选 }) -/** 选中的分类ID */ +/** 选中的分类 ID */ const selectCategoryId = computed({ get: () => { return props.value @@ -37,8 +37,8 @@ const selectCategoryId = computed({ /** 分类选择 */ const emit = defineEmits(['update:modelValue']) +/** 初始化 **/ const categoryList = ref([]) // 分类树 - onMounted(async () => { // 获得分类树 const data = await ProductCategoryApi.getCategoryList({}) diff --git a/src/views/mall/promotion/coupon/components/CouponSend.vue b/src/views/mall/promotion/coupon/components/CouponSendForm.vue similarity index 93% rename from src/views/mall/promotion/coupon/components/CouponSend.vue rename to src/views/mall/promotion/coupon/components/CouponSendForm.vue index 7686539b..c4037c4e 100644 --- a/src/views/mall/promotion/coupon/components/CouponSend.vue +++ b/src/views/mall/promotion/coupon/components/CouponSendForm.vue @@ -1,5 +1,6 @@ <template> <Dialog v-model="dialogVisible" :appendToBody="true" title="发送优惠券" width="70%"> + <!-- 搜索工作栏 --> <el-form ref="queryFormRef" :inline="true" @@ -27,6 +28,8 @@ </el-button> </el-form-item> </el-form> + + <!-- 列表 --> <el-table v-loading="loading" :data="list" show-overflow-tooltip> <el-table-column align="center" label="优惠券名称" prop="name" min-width="60" /> <el-table-column @@ -41,7 +44,7 @@ label="最低消费" prop="usePrice" min-width="60" - :formatter="userPriceFormat" + :formatter="usePriceFormat" /> <el-table-column align="center" @@ -72,6 +75,7 @@ </el-table-column> </el-table> <!-- 分页 --> + <!-- TODO 疯狂:可以看看,为啥弹窗没把分页包进去,可能和 footer 有关? --> <Pagination v-model:limit="queryParams.pageSize" v-model:page="queryParams.pageNo" @@ -80,18 +84,17 @@ /> </Dialog> </template> - <script lang="ts" setup> import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate' import * as CouponApi from '@/api/mall/promotion/coupon/coupon' import { discountFormat, remainedCountFormat, - userPriceFormat, + usePriceFormat, validityTypeFormat } from '@/views/mall/promotion/coupon/formatter' -defineOptions({ name: 'PromotionCouponSend' }) +defineOptions({ name: 'PromotionCouponSendForm' }) const message = useMessage() // 消息弹窗 const total = ref(0) // 列表的总页数 @@ -147,7 +150,7 @@ const handleSendCoupon = async (templateId: number) => { try { sendLoading.value = true await CouponApi.sendCoupon({ templateId, userIds }) - + // 提示 message.success('发送成功') dialogVisible.value = false } finally { diff --git a/src/views/mall/promotion/coupon/formatter.ts b/src/views/mall/promotion/coupon/formatter.ts index 60eebb5d..2b0ba7c6 100644 --- a/src/views/mall/promotion/coupon/formatter.ts +++ b/src/views/mall/promotion/coupon/formatter.ts @@ -39,6 +39,6 @@ export const remainedCountFormat = (row: CouponTemplateVO) => { } // 格式化【最低消费】 -export const userPriceFormat = (row: CouponTemplateVO) => { +export const usePriceFormat = (row: CouponTemplateVO) => { return `¥${floatToFixed2(row.usePrice)}` } diff --git a/src/views/mall/promotion/coupon/template/CouponTemplateForm.vue b/src/views/mall/promotion/coupon/template/CouponTemplateForm.vue index e511dd0c..297e4abc 100644 --- a/src/views/mall/promotion/coupon/template/CouponTemplateForm.vue +++ b/src/views/mall/promotion/coupon/template/CouponTemplateForm.vue @@ -10,7 +10,41 @@ <el-form-item label="优惠券名称" prop="name"> <el-input v-model="formData.name" placeholder="请输入优惠券名称" /> </el-form-item> - <el-form-item label="优惠券类型" prop="discountType"> + <el-form-item label="优惠劵类型" prop="productScope"> + <el-radio-group v-model="formData.productScope"> + <el-radio + v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_PRODUCT_SCOPE)" + :key="dict.value" + :label="dict.value" + > + {{ dict.label }} + </el-radio> + </el-radio-group> + </el-form-item> + <el-form-item + label="商品" + v-if="formData.productScope === PromotionProductScopeEnum.SPU.scope" + prop="productSpuIds" + > + <div class="flex items-center gap-1 flex-wrap"> + <div class="select-box spu-pic" v-for="(spu, index) in productSpus" :key="spu.id"> + <el-image :src="spu.picUrl" /> + <Icon icon="ep:circle-close-filled" class="del-icon" @click="handleRemoveSpu(index)" /> + </div> + <div class="select-box" @click="openSpuTableSelect"> + <Icon icon="ep:plus" /> + </div> + </div> + </el-form-item> + <!-- TODO 疯狂:要不把 productSpuIds 改成 productScopeValues,更通用?另外,改完后,涉及到优惠劵的匹配逻辑,要补充分类相关的逻辑,例如说获得匹配的优惠劵列表之类的,包括使用卷的时候; --> + <el-form-item + label="分类" + v-if="formData.productScope === PromotionProductScopeEnum.CATEGORY.scope" + prop="productCategoryIds" + > + <ProductCategorySelect v-model="formData.productCategoryIds" /> + </el-form-item> + <el-form-item label="优惠类型" prop="discountType"> <el-radio-group v-model="formData.discountType"> <el-radio v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_DISCOUNT_TYPE)" @@ -147,37 +181,6 @@ /> 天有效 </el-form-item> - <el-form-item label="活动商品" prop="productScope"> - <el-radio-group v-model="formData.productScope"> - <el-radio - v-for="dict in getIntDictOptions(DICT_TYPE.PROMOTION_PRODUCT_SCOPE)" - :key="dict.value" - :label="dict.value" - > - {{ dict.label }} - </el-radio> - </el-radio-group> - </el-form-item> - <el-form-item - v-if="formData.productScope === PromotionProductScopeEnum.SPU.scope" - prop="productSpuIds" - > - <div class="flex items-center gap-1 flex-wrap"> - <div class="select-box spu-pic" v-for="(spu, index) in productSpus" :key="spu.id"> - <el-image :src="spu.picUrl" /> - <Icon icon="ep:circle-close-filled" class="del-icon" @click="handleRemoveSpu(index)" /> - </div> - <div class="select-box" @click="openSpuTableSelect"> - <Icon icon="ep:plus" /> - </div> - </div> - </el-form-item> - <el-form-item - v-if="formData.productScope === PromotionProductScopeEnum.CATEGORY.scope" - prop="productCategoryIds" - > - <ProductCategorySelect v-model="formData.productCategoryIds" multiple /> - </el-form-item> </el-form> <template #footer> <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button> @@ -367,6 +370,7 @@ const getProductScope = async () => { productSpus.value = await ProductSpuApi.getSpuDetailList(formData.value.productSpuIds) break case PromotionProductScopeEnum.CATEGORY.scope: + // TODO @疯狂:貌似分类不会选中。 formData.value.productCategoryIds = formData.value.productSpuIds formData.value.productSpuIds = [] break @@ -375,7 +379,7 @@ const getProductScope = async () => { } } -/** 活动商品 按钮 */ +/** 活动商品的按钮 */ const spuTableSelectRef = ref() const openSpuTableSelect = () => { spuTableSelectRef.value.open(productSpus.value) diff --git a/src/views/member/user/index.vue b/src/views/member/user/index.vue index 672e9bfc..fa62dea5 100644 --- a/src/views/member/user/index.vue +++ b/src/views/member/user/index.vue @@ -154,7 +154,7 @@ <!-- 修改用户等级弹窗 --> <UpdateLevelForm ref="updateLevelFormRef" @success="getList" /> <!-- 发送优惠券弹窗 --> - <CouponSend ref="couponSend" /> + <CouponSendForm ref="couponSendFormRef" /> </template> <script setup lang="ts"> import { dateFormatter } from '@/utils/formatTime' @@ -164,7 +164,7 @@ import MemberTagSelect from '@/views/member/tag/components/MemberTagSelect.vue' import MemberLevelSelect from '@/views/member/level/components/MemberLevelSelect.vue' import MemberGroupSelect from '@/views/member/group/components/MemberGroupSelect.vue' import UpdateLevelForm from '@/views/member/user/UpdateLevelForm.vue' -import CouponSend from '@/views/mall/promotion/coupon/components/CouponSend.vue' +import CouponSendForm from '@/views/mall/promotion/coupon/components/CouponSendForm.vue' defineOptions({ name: 'MemberUser' }) @@ -224,14 +224,13 @@ const handleSelectionChange = (rows: UserApi.UserVO[]) => { } /** 发送优惠券 */ -const couponSend = ref() +const couponSendFormRef = ref() const openCoupon = () => { if (selectedIds.value.length === 0) { message.warning('请选择要发送优惠券的用户') return } - - couponSend.value.open(selectedIds.value) + couponSendFormRef.value.open(selectedIds.value) } /** 初始化 **/