123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- <!-- 装修营销组件:优惠券 -->
- <template>
- <scroll-view class="scroll-box" scroll-x scroll-anchoring>
- <view class="coupon-box ss-flex">
- <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 } 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 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>
|