From a1d7e81859f554f3a53680cc35f0f49bf1f77098 Mon Sep 17 00:00:00 2001
From: wwf <1971391498@qq.com>
Date: 星期四, 14 五月 2026 14:37:02 +0800
Subject: [PATCH] 导入项目
---
src/views/mall/promotion/rewardActivity/components/RewardRuleCouponSelect.vue | 133 ++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 133 insertions(+), 0 deletions(-)
diff --git a/src/views/mall/promotion/rewardActivity/components/RewardRuleCouponSelect.vue b/src/views/mall/promotion/rewardActivity/components/RewardRuleCouponSelect.vue
new file mode 100644
index 0000000..41b1f2b
--- /dev/null
+++ b/src/views/mall/promotion/rewardActivity/components/RewardRuleCouponSelect.vue
@@ -0,0 +1,133 @@
+<template>
+ <el-button class="ml-10px" type="text" @click="selectCoupon">娣诲姞浼樻儬鍔�</el-button>
+
+ <div
+ v-for="(item, index) in list"
+ :key="item.id"
+ class="coupon-list-item p-x-10px mb-10px flex justify-between"
+ >
+ <div class="coupon-list-item-left flex items-center flex-wrap">
+ <div class="mr-10px"> 浼樻儬鍒稿悕绉帮細{{ item.name }}</div>
+ <div class="mr-10px">
+ 鑼冨洿锛�
+ <dict-tag :type="DICT_TYPE.PROMOTION_PRODUCT_SCOPE" :value="item.productScope" />
+ </div>
+ <div class="flex items-center">
+ 浼樻儬锛�
+ <dict-tag :type="DICT_TYPE.PROMOTION_DISCOUNT_TYPE" :value="item.discountType" />
+ {{ discountFormat(item) }}
+ </div>
+ </div>
+ <div class="coupon-list-item-right">
+ 閫�
+ <el-input v-model="item.giveCount" class="w-150px! p-x-20px!" placeholder="" type="number" />
+ 寮�
+ <el-button class="ml-20px" link type="danger" @click="deleteCoupon(index)">鍒犻櫎</el-button>
+ </div>
+ </div>
+
+ <!-- 浼樻儬鍒搁�夋嫨 -->
+ <CouponSelect
+ ref="couponSelectRef"
+ :take-type="CouponTemplateTakeTypeEnum.ADMIN.type"
+ @change="handleCouponChange"
+ />
+</template>
+
+<script lang="ts" setup>
+import { CouponSelect } from '@/views/mall/promotion/coupon/components'
+import * as CouponTemplateApi from '@/api/mall/promotion/coupon/couponTemplate'
+import { RewardRule } from '@/api/mall/promotion/reward/rewardActivity'
+import { DICT_TYPE } from '@/utils/dict'
+import { CouponTemplateTakeTypeEnum } from '@/utils/constants'
+import { discountFormat } from '@/views/mall/promotion/coupon/formatter'
+import { isEmpty } from '@/utils/is'
+import { useVModel } from '@vueuse/core'
+
+defineOptions({ name: 'RewardRuleCouponSelect' })
+
+const props = defineProps<{
+ modelValue: RewardRule
+}>()
+
+const emits = defineEmits<{
+ (e: 'update:modelValue', v: any): void
+}>()
+
+const rewardRule = useVModel(props, 'modelValue', emits) // 璧犻�佽鍒�
+const list = ref<GiveCouponVO[]>([]) // 閫夋嫨鐨勪紭鎯犲埜鍒楄〃
+
+/** 閫夋嫨璧犻�佺殑浼樻儬绫诲瀷鎷撳睍 */
+interface GiveCouponVO extends CouponTemplateApi.CouponTemplateVO {
+ giveCount?: number
+}
+
+/** 閫夋嫨浼樻儬鍒� */
+const couponSelectRef = ref<InstanceType<typeof CouponSelect>>() // 浼樻儬鍒搁�夋嫨
+const selectCoupon = () => {
+ couponSelectRef.value?.open()
+}
+
+/** 閫夋嫨浼樻儬鍒稿悗鐨勫洖璋� */
+const handleCouponChange = (val: CouponTemplateApi.CouponTemplateVO[]) => {
+ for (const item of val) {
+ if (list.value.some((v) => v.id === item.id)) {
+ continue
+ }
+ list.value.push(item)
+ }
+}
+
+/** 鍒犻櫎浼樻儬鍒� */
+const deleteCoupon = (index: number) => {
+ list.value.splice(index, 1)
+}
+
+/** 鍒濆鍖栬禒閫佺殑浼樻儬鍒稿垪琛� */
+const initGiveCouponList = async () => {
+ // 鏍¢獙浼樻儬鍒稿瓨鍦�
+ if (isEmpty(rewardRule.value) || isEmpty(rewardRule.value.giveCouponTemplateCounts)) {
+ return
+ }
+ const tempLateIds = Object.keys(rewardRule.value.giveCouponTemplateCounts!)
+ const data = await CouponTemplateApi.getCouponTemplateList(tempLateIds)
+ if (!data) {
+ return
+ }
+ // 鍥炴樉
+ data.forEach((coupon) => {
+ list.value.push({
+ ...coupon,
+ giveCount: rewardRule.value.giveCouponTemplateCounts![coupon.id]
+ })
+ })
+}
+
+/** 璁剧疆璧犻�佺殑浼樻儬鍒� */
+const setGiveCouponList = () => {
+ if (isEmpty(rewardRule.value)) {
+ return
+ }
+ // 鏍稿績锛氭竻绌� rewardRule.value.giveCouponTemplateCounts锛岃В鍐冲垹闄や笉鐢熸晥鐨勯棶棰�
+ rewardRule.value.giveCouponTemplateCounts = {}
+
+ // 璁剧疆浼樻儬鍒稿拰鍏舵暟閲忕殑瀵瑰簲
+ list.value.forEach((rule) => {
+ rewardRule.value.giveCouponTemplateCounts![rule.id] = rule.giveCount!
+ })
+}
+defineExpose({ setGiveCouponList })
+
+/** 缁勪欢鍒濆鍖� */
+onMounted(async () => {
+ await nextTick()
+ await initGiveCouponList()
+})
+</script>
+
+<style lang="scss" scoped>
+.coupon-list-item {
+ border: 1px dashed var(--el-border-color-darker);
+ border-radius: 8px;
+}
+</style>
--
Gitblit v1.8.0