| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176 | 
							- <!-- 装修营销组件:优惠券  -->
 
- <template>
 
- 	<scroll-view class="scroll-box" scroll-x scroll-anchoring :style="[bgStyle, { marginLeft: `${data.space}px` }]">
 
- 		<view class="coupon-box ss-flex" :style="couponList.length === 2 ? couponBoxStyleTwo : couponBoxStyleNormal">
 
- 			<view class="coupon-item" :style="[couponBg, { marginLeft: `${data.space}px` }]"
 
- 				v-for="(item, index) in couponList" :key="index">
 
- 				<su-coupon :size="SIZE_LIST[columns - 1]" :textColor="data.textColor" background="" :couponId="item.id"
 
- 					:title="item.name" :type="formatCouponDiscountType(item)" :value="formatCouponDiscountValue(item)"
 
- 					:sellBy="formatValidityType(item)">
 
- 					<template v-slot:btn>
 
- 						<!-- 两列时,领取按钮坚排 -->
 
- 						<button v-if="columns === 2" @click.stop="onGetCoupon(item.id)"
 
- 							class="ss-reset-button card-btn vertical" :style="[btnStyles]">
 
- 							<view class="btn-text">立即领取</view>
 
- 						</button>
 
- 						<button v-else class="ss-reset-button card-btn" :style="[btnStyles]"
 
- 							@click.stop="onGetCoupon(item.id)">
 
- 							立即领取
 
- 						</button>
 
- 					</template>
 
- 				</su-coupon>
 
- 			</view>
 
- 		</view>
 
- 	</scroll-view>
 
- </template>
 
- <script setup>
 
- 	import sheep from '@/sheep';
 
- 	import CouponApi from '@/sheep/api/promotion/coupon';
 
- 	import {
 
- 		ref,
 
- 		onMounted,
 
- 		computed
 
- 	} from 'vue';
 
- 	import {
 
- 		CouponTemplateValidityTypeEnum,
 
- 		PromotionDiscountTypeEnum
 
- 	} from "@/sheep/util/const";
 
- 	import {
 
- 		floatToFixed2,
 
- 		formatDate
 
- 	} from "@/sheep/util";
 
- 	const props = defineProps({
 
- 		data: {
 
- 			type: Object,
 
- 			default: () => ({}),
 
- 		},
 
- 		styles: {
 
- 			type: Object,
 
- 			default: () => ({}),
 
- 		},
 
- 	});
 
- 	const {
 
- 		columns,
 
- 		button
 
- 	} = props.data;
 
- 	const SIZE_LIST = ['lg', 'md', 'xs']
 
- 	const couponBg = {
 
- 		background: `url(${sheep.$url.cdn(props.data.bgImg)}) no-repeat top center / 100% 100%`,
 
- 	};
 
- 	const btnStyles = {
 
- 		background: button.bgColor,
 
- 		color: button.color,
 
- 	};
 
- 	// 两列优惠券时的排版方式
 
- 	const couponBoxStyleNormal = {
 
- 		'display': 'flex',
 
- 		'justify-content': 'space-between'
 
- 	};
 
- 	// 非两列优惠券时的排版方式
 
- 	const couponBoxStyleTwo = {
 
- 		'display': 'flex',
 
- 		'justify-content': 'space-around'
 
- 	};
 
- 	// 设置背景样式
 
- 	const bgStyle = computed(() => {
 
- 		// 直接从 props.styles 解构
 
- 		const {
 
- 			bgType,
 
- 			bgImg,
 
- 			bgColor
 
- 		} = props.styles;
 
- 		// 根据 bgType 返回相应的样式
 
- 		return {
 
- 			background: bgType === 'img' ? `url(${bgImg}) no-repeat top center / 100% 100%` : bgColor
 
- 		};
 
- 	});
 
- 	// 格式化【折扣类型】
 
- 	const formatCouponDiscountType = (coupon) => {
 
- 		if (coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) {
 
- 			return 'reduce'
 
- 		}
 
- 		if (coupon.discountType === PromotionDiscountTypeEnum.PERCENT.type) {
 
- 			return 'percent'
 
- 		}
 
- 		return `未知【${coupon.discountType}】`
 
- 	}
 
- 	// 格式化【折扣】
 
- 	const formatCouponDiscountValue = (coupon) => {
 
- 		if (coupon.discountType === PromotionDiscountTypeEnum.PRICE.type) {
 
- 			return floatToFixed2(coupon.discountPrice)
 
- 		}
 
- 		if (coupon.discountType === PromotionDiscountTypeEnum.PERCENT.type) {
 
- 			return coupon.discountPercent
 
- 		}
 
- 		return `未知【${coupon.discountType}】`
 
- 	}
 
- 	// 格式化【有效期限】
 
- 	const formatValidityType = (row) => {
 
- 		if (row.validityType === CouponTemplateValidityTypeEnum.DATE.type) {
 
- 			return `${formatDate(row.validStartTime)} 至 ${formatDate(row.validEndTime)}`
 
- 		}
 
- 		if (row.validityType === CouponTemplateValidityTypeEnum.TERM.type) {
 
- 			return `领取后第 ${row.fixedStartTerm} - ${row.fixedEndTerm} 天内可用`
 
- 		}
 
- 		return '未知【' + row.validityType + '】'
 
- 	}
 
- 	const couponList = ref([]);
 
- 	// 立即领取优惠券
 
- 	async function onGetCoupon(id) {
 
- 		const {
 
- 			error,
 
- 			msg
 
- 		} = await CouponApi.takeCoupon(id);
 
- 		if (error === 0) {
 
- 			uni.showToast({
 
- 				title: msg,
 
- 				icon: 'none',
 
- 			});
 
- 			return
 
- 		}
 
- 		await getCouponTemplateList()
 
- 	}
 
- 	const getCouponTemplateList = async () => {
 
- 		const {
 
- 			data
 
- 		} = await CouponApi.getCouponTemplateListByIds(props.data.couponIds.join(','));
 
- 		couponList.value = data;
 
- 	}
 
- 	onMounted(() => {
 
- 		getCouponTemplateList()
 
- 	});
 
- </script>
 
- <style lang="scss" scoped>
 
- 	.card-btn {
 
- 		width: 140rpx;
 
- 		height: 50rpx;
 
- 		border-radius: 25rpx;
 
- 		font-size: 24rpx;
 
- 		line-height: 50rpx;
 
- 		&.vertical {
 
- 			width: 50rpx;
 
- 			height: 140rpx;
 
- 			margin: auto 20rpx auto 0;
 
- 			.btn-text {
 
- 				font-size: 24rpx;
 
- 				text-align: center;
 
- 				writing-mode: vertical-lr;
 
- 			}
 
- 		}
 
- 	}
 
- 	.coupon-item {
 
- 		&:nth-of-type(1) {
 
- 			margin-left: 0 !important;
 
- 		}
 
- 	}
 
- </style>
 
 
  |