import request from '@/helpers/request' import { state } from '@/state' import { Cell, Popup } from 'vant' import { defineComponent, PropType } from 'vue' import ChoiceCoupon from './choice-coupon' import styles from './index.module.less' /* * 订单类型对应优惠券类型 */ export const couponEnum = { UNIVERSAL: 'UNIVERSAL', VIP: 'VIP', SVIP: 'SVIP', PIANO_ROOM: 'PIANO', GOODS: 'MALL', MUSIC: 'MUSIC', VIP_COURSE: 'VIP_COURSE', DISCOUNT: 'DISCOUNT', PRACTICE: 'SPARRING', LIVE: 'LIVE', VIDEO: 'VIDEO', ALBUM: 'ALBUM' } export default defineComponent({ name: 'use-conpon', props: { disabled: { type: Boolean, default: false }, orderAmount: { type: Number, default: 0 }, orderType: { type: String, default: '' }, orderGoodsType: { type: Array, default: () => [] }, discountPrice: { // 优惠券使用金额 type: Number, default: 0 }, // 选择的优惠券 couponId: { type: String, default: '' }, usedLength: { type: String as PropType<'SINGLE' | 'MULTIPLE'>, default: 'SINGLE' } }, emits: ['couponSelect'], data() { return { popupStatus: false, popupLoading: false, useCouponList: [] as any, useCouponLoading: false, useCouponCount: 0, dataLoading: false, list: [] as any } }, computed: { couponCount() { const limitCount = this.useCouponList.map((list: any) => { return Number(list.discountPrice || 0) }) let count = 0 if (this.disabled) { count = this.discountPrice } else { count = limitCount.length > 0 ? limitCount.reduce((sum: any, list: any) => { return sum + list }) : 0 } return count }, couponCategory() { // 如果订单类型不在优惠券类型里面,则默认查询通用券 const temp: any[] = [] this.orderGoodsType.forEach((item: any) => { if(couponEnum[item.orderType]) { temp.push(couponEnum[item.orderType]) } }) return temp.join(',') + (temp.length ? ',UNIVERSAL' : 'UNIVERSAL') } }, watch: { couponId(val: any) { // 为 const ids = val ? val.split(',').map(i => Number(i)) : [] const selectCouponList: any[] = [] this.useCouponList.forEach((item: any) => { if(ids.includes(item.couponIssueId)) { selectCouponList.push(item) } }); this.useCouponList = selectCouponList } }, mounted() { this.getList() }, methods: { resetCouponList() { this.list = [] this.getList() }, async getList() { if (this.dataLoading) return this.dataLoading = true try { const res = await request.post(`${state.platformApi}/couponInfo/page`, { data: { couponCategory: this.couponCategory, couponType: 'FULL_DISCOUNT', useState: 'USABLE', orderUse: 1, page: 1, rows: 100 } }) this.dataLoading = false const result = res.data || {} // 处理重复请求数据 if (this.list.length > 0 && result.pageNo === 1) return this.list = result.rows || [] // 处理可用优惠券是否支付使用 this.list.forEach((item: any) => { item.checked = false if(item.couponCategory === 'UNIVERSAL') { let disabled = true; this.orderGoodsType.forEach((goods: any) => { if(item.useLimit <= goods.price && disabled) { disabled = false } }) item.disabled = disabled } else { const disItem: any = this.orderGoodsType.find((goods: any) => couponEnum[goods.orderType] === item.couponCategory) const useLastAmount = disItem.price || 0 // 如果使用金额大于订单金额则优惠券不可用 if (item.useLimit > useLastAmount) { item.disabled = true } else { item.disabled = false } } }) let count = 0 this.list.forEach((item: any) => { if (!item.disabled) { count++ } }) // console.log(this.list, 'list') this.useCouponCount = count } catch { // } }, // async getUseableCoupon() { // try { // this.useCouponLoading = true // // 判断是哪个端 // const url = // state.platformType === 'STUDENT' ? '/api-student' : '/api-teacher' // const res = await request.get(`${url}/couponInfo/statInfo`) // this.useCouponLoading = false // const result = (res.data || []).find( // result => result.useState === 'USABLE' // ) // this.useCouponCount = result.total || 0 // } catch { // // TODO: handle // } // }, onSubmit(item: any) { // useCouponList this.useCouponList = item this.$emit('couponSelect', item) this.popupStatus = false this.popupLoading = false } }, render() { return ( <> !this.useCouponLoading && ( <> {/* 判断是否有选择优惠券 */} {this.couponCount > 0 ? ( -¥ {this.couponCount} ) : ( <> {/* 判断是否有可以的优惠券 */} {this.useCouponCount > 0 ? `${this.useCouponCount}张可使用` : '暂无可使用优惠券'} )} ) }} onClick={() => { if (this.disabled) return this.popupStatus = true this.popupLoading = true }} > { this.popupLoading = false }} > {/* 优化体验 */} {this.popupLoading && ( (this.popupStatus = false)} onSubmit={(item: any) => this.onSubmit(item)} /> )} ) } })