|
@@ -0,0 +1,373 @@
|
|
|
+import { defineComponent, onMounted, reactive, computed } from 'vue'
|
|
|
+import styles from './index.module.less'
|
|
|
+import ColHeader from '@/components/col-header'
|
|
|
+import { postMessage } from '@/helpers/native-message'
|
|
|
+import request from '@/helpers/request'
|
|
|
+import { useEventListener } from '@vant/use'
|
|
|
+import tip1Img from './imgs/tip1Img.png'
|
|
|
+import tip2Img from './imgs/tip2Img.png'
|
|
|
+import shadowImg from './imgs/shadow.png'
|
|
|
+import svipCon1 from './imgs/svipCon1.png'
|
|
|
+import svipCon2 from './imgs/svipCon2.png'
|
|
|
+import dayjs from 'dayjs'
|
|
|
+import { state as baseState } from '@/state'
|
|
|
+import { Toast, Popup, Button } from 'vant'
|
|
|
+import { useRouter } from 'vue-router'
|
|
|
+import { tradeOrder } from '@/student/trade/tradeOrder'
|
|
|
+import { orderStatus } from '@/views/order-detail/orderStatus'
|
|
|
+import { memberType, studyCardType } from '@/constant'
|
|
|
+
|
|
|
+export default defineComponent({
|
|
|
+ name: 'double12Active',
|
|
|
+ setup(props, { emit }) {
|
|
|
+ const router = useRouter()
|
|
|
+ const state = reactive({
|
|
|
+ titleOpacity: 0,
|
|
|
+ navBarHeight: 0,
|
|
|
+ orderVisiable: false,
|
|
|
+ orderDetail: {} as any,
|
|
|
+ activityId: '19'
|
|
|
+ })
|
|
|
+ const activitData = reactive({
|
|
|
+ activityStart: '2024-12-12 00:00:00',
|
|
|
+ activityEnd: '2024-12-12 23:59:59',
|
|
|
+ registrationPrice: 0,
|
|
|
+ buyCount: 0, // buyCount 小于1的时候 代表能无限购买
|
|
|
+ buyNum: 0,
|
|
|
+ vipCardId: 0,
|
|
|
+ activityList: []
|
|
|
+ })
|
|
|
+ const subBtnState = computed(() => {
|
|
|
+ if (Date.now() < new Date(activitData.activityStart).getTime()) {
|
|
|
+ return {
|
|
|
+ disable: true,
|
|
|
+ text: '活动未开始'
|
|
|
+ }
|
|
|
+ } else if (Date.now() > new Date(activitData.activityEnd).getTime()) {
|
|
|
+ return {
|
|
|
+ disable: true,
|
|
|
+ text: '活动已结束'
|
|
|
+ }
|
|
|
+ } else if (activitData.buyCount <= activitData.buyNum) {
|
|
|
+ return {
|
|
|
+ disable: true,
|
|
|
+ text: '您已参与活动'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ disable: false,
|
|
|
+ text: '立即购买'
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const userInfo = computed(() => {
|
|
|
+ return baseState.user.data
|
|
|
+ })
|
|
|
+ // 是否为永久会员
|
|
|
+ const isPermanent = computed(() => {
|
|
|
+ return userInfo.value.userVip?.vipType === 'PERMANENT_SVIP' ? true : false
|
|
|
+ })
|
|
|
+ initActivit()
|
|
|
+ function initActivit() {
|
|
|
+ request
|
|
|
+ .get(
|
|
|
+ `/api-student/memberPriceSettings/getDoubleTwelve/${state.activityId}`
|
|
|
+ )
|
|
|
+ .then(res => {
|
|
|
+ if (res.code === 200 && res.data) {
|
|
|
+ const {
|
|
|
+ activityStart,
|
|
|
+ activityEnd,
|
|
|
+ registrationPrice,
|
|
|
+ buyCount,
|
|
|
+ buyNum,
|
|
|
+ vipCardId,
|
|
|
+ activityRewardList
|
|
|
+ } = res.data || {}
|
|
|
+ activitData.activityStart = activityStart
|
|
|
+ activitData.activityEnd = activityEnd
|
|
|
+ activitData.registrationPrice = registrationPrice
|
|
|
+ activitData.buyCount = buyCount < 1 ? 99999 : buyCount //buyCount 小于1的时候 代表能无限购买
|
|
|
+ activitData.buyNum = buyNum
|
|
|
+ activitData.vipCardId = vipCardId
|
|
|
+ activitData.activityList = (activityRewardList || []).map(item => {
|
|
|
+ const { rewardType, vipCardId, unit } = item.activityReward
|
|
|
+ if (rewardType === 'DISCOUNT') {
|
|
|
+ return {
|
|
|
+ goodType: rewardType,
|
|
|
+ goodName: `畅学卡 ${studyCardType[unit]}`,
|
|
|
+ goodNum: 1,
|
|
|
+ bizContent: vipCardId,
|
|
|
+ giftFlag: true,
|
|
|
+ vipEndDays: null,
|
|
|
+ goodsNum: 1,
|
|
|
+ unit
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ goodType: rewardType,
|
|
|
+ goodName: `小酷Ai SVIP ${memberType[unit]}`,
|
|
|
+ goodNum: 1,
|
|
|
+ bizContent: vipCardId,
|
|
|
+ giftFlag: true,
|
|
|
+ vipEndDays: null,
|
|
|
+ goodsNum: 1,
|
|
|
+ unit
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+ console.log(err)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ async function handleSubmit() {
|
|
|
+ try {
|
|
|
+ // 永久会员
|
|
|
+ if (isPermanent.value) {
|
|
|
+ Toast('您已是永久SVIP会员')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const vipType = 'SVIP'
|
|
|
+ // 判断是否有待支付订单
|
|
|
+ const resPadding = await request.post(
|
|
|
+ `/api-student/userOrder/getPendingOrder`,
|
|
|
+ {
|
|
|
+ data: { goodType: vipType }
|
|
|
+ }
|
|
|
+ )
|
|
|
+ console.log(resPadding, 'resPadding')
|
|
|
+ if (resPadding?.data?.id) {
|
|
|
+ state.orderVisiable = true
|
|
|
+ state.orderDetail = resPadding.data || {}
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 组合订单参数
|
|
|
+ const { data } = await request.post(
|
|
|
+ `/api-student/memberPriceSettings/list`,
|
|
|
+ {
|
|
|
+ data: {
|
|
|
+ status: 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+
|
|
|
+ const member: any = (data?.list || []).find(item => {
|
|
|
+ return item.id === activitData.vipCardId
|
|
|
+ })
|
|
|
+ if (!member) {
|
|
|
+ Toast('未匹配上活动')
|
|
|
+ }
|
|
|
+ member.title = memberType[member.period]
|
|
|
+ const startTime = dayjs(
|
|
|
+ userInfo.value.userVip.svipEndDate || new Date()
|
|
|
+ ).toDate()
|
|
|
+ const endTime = dayjs(startTime).add(1, 'year').toDate()
|
|
|
+
|
|
|
+ orderStatus.orderObject.orderType = vipType
|
|
|
+ orderStatus.orderObject.orderName = `小酷Ai ${vipType} ${member.title}`
|
|
|
+ orderStatus.orderObject.orderDesc = `小酷Ai ${vipType} ${member.title}`
|
|
|
+ orderStatus.orderObject.actualPrice = activitData.registrationPrice
|
|
|
+ orderStatus.orderObject.recomUserId = ''
|
|
|
+ orderStatus.orderObject.activityId = state.activityId
|
|
|
+ orderStatus.orderObject.orderNo = ''
|
|
|
+ const orderData = {
|
|
|
+ orderType: vipType,
|
|
|
+ goodsName: `小酷Ai ${vipType} ${member.title}`,
|
|
|
+ id: member.id,
|
|
|
+ title: member.title,
|
|
|
+ num: 1, // 购买个数
|
|
|
+ salePrice: member.salePrice,
|
|
|
+ period: member.period,
|
|
|
+ vipEndDays: userInfo.value.userVip?.vipEndDays || 0, // 会员剩余天数
|
|
|
+ svipEndDays: userInfo.value.userVip?.svipEndDays || 0,
|
|
|
+ discount: member.discount, // 是否有折扣
|
|
|
+ discountPrice: member.discountPrice, // 折扣金额
|
|
|
+ price: activitData.registrationPrice,
|
|
|
+ startTime: dayjs(startTime).format('YYYY-MM-DD'),
|
|
|
+ endTime: dayjs(endTime).format('YYYY-MM-DD'),
|
|
|
+ recomUserId: '',
|
|
|
+ activityBuyCount: 0, // 活动购买限制次数
|
|
|
+ activityList: [], // 活动赠送的东西
|
|
|
+ discountEndTime: userInfo.value.discountEndTime, // 畅学卡结束时间
|
|
|
+ discountStartTime: userInfo.value.discountStartTime // 畅学卡开始时间
|
|
|
+ }
|
|
|
+ const canBuyNum = activitData.buyCount - activitData.buyNum
|
|
|
+ if (canBuyNum > 0) {
|
|
|
+ orderData.activityBuyCount = canBuyNum
|
|
|
+ orderData.activityList = activitData.activityList
|
|
|
+ }
|
|
|
+ orderStatus.orderObject.orderList = [orderData]
|
|
|
+ router.push({
|
|
|
+ path: '/orderDetail',
|
|
|
+ query: {
|
|
|
+ orderType: vipType
|
|
|
+ }
|
|
|
+ })
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 取消支付
|
|
|
+ const onCancelOrder = async () => {
|
|
|
+ try {
|
|
|
+ await request.post(`/api-student/userOrder/orderCancel`, {
|
|
|
+ data: { orderNo: state.orderDetail.orderNo }
|
|
|
+ })
|
|
|
+ state.orderVisiable = false
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 继续支付
|
|
|
+ const onContinueOrder = async () => {
|
|
|
+ const orderDetail = state.orderDetail || {}
|
|
|
+ tradeOrder(orderDetail, () => {
|
|
|
+ router.push({
|
|
|
+ path: '/orderDetail',
|
|
|
+ query: {
|
|
|
+ orderType: orderDetail.orderType
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+ onMounted(() => {
|
|
|
+ postMessage({ api: 'getNavHeight' }, res => {
|
|
|
+ const { content } = res as any
|
|
|
+ const dpi = content.dpi || 2
|
|
|
+ if (content.navHeight) {
|
|
|
+ const navHeight = content.navHeight / dpi
|
|
|
+ state.navBarHeight = navHeight
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ useEventListener('scroll', () => {
|
|
|
+ const height =
|
|
|
+ window.scrollY ||
|
|
|
+ window.pageYOffset ||
|
|
|
+ document.documentElement.scrollTop
|
|
|
+ state.titleOpacity = height > 30 ? 1 : 0
|
|
|
+ })
|
|
|
+ return () => (
|
|
|
+ <div
|
|
|
+ class={styles.double12Active}
|
|
|
+ style={{
|
|
|
+ '--navBarHeight': `${state.navBarHeight}px`
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ <ColHeader
|
|
|
+ background={`rgba(255,255,255, ${state.titleOpacity})`}
|
|
|
+ color={`rgba(0,0,0, ${state.titleOpacity})`}
|
|
|
+ backIconColor="black"
|
|
|
+ hideHeader={false}
|
|
|
+ border={false}
|
|
|
+ />
|
|
|
+ <div class={styles.headImg}></div>
|
|
|
+ <div class={styles.activeArea1}>
|
|
|
+ <img class={styles.tip1} src={tip1Img} />
|
|
|
+ <img class={styles.shadowImg} src={shadowImg} />
|
|
|
+ <div class={styles.activeCon}>
|
|
|
+ <div class={styles.activeBox}>活动时间</div>
|
|
|
+ <div class={styles.activeTimes}>
|
|
|
+ {`${dayjs(activitData.activityStart).format(
|
|
|
+ 'YYYY年MM月DD日HH:MM'
|
|
|
+ )}-${dayjs(activitData.activityEnd).format(
|
|
|
+ 'YYYY年MM月DD日HH:MM'
|
|
|
+ )}`}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.activeCon}>
|
|
|
+ <div class={styles.activeBox}>活动内容</div>
|
|
|
+ <div class={styles.activeListCon}>
|
|
|
+ <div class={styles.activeList}>
|
|
|
+ SVIP年度会员限时特惠至
|
|
|
+ <span class={styles.number}>
|
|
|
+ {' '}
|
|
|
+ {activitData.registrationPrice}{' '}
|
|
|
+ </span>
|
|
|
+ <span>元</span>
|
|
|
+ </div>
|
|
|
+ <div class={styles.activeList}>
|
|
|
+ 活动期间<span>买一年送一年</span>
|
|
|
+ </div>
|
|
|
+ <div class={styles.activeList}>
|
|
|
+ 同时额外<span>获赠一年畅学卡</span>,享受约课75折!
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.activeContent}>
|
|
|
+ <div class={[styles.vipNumber, styles.vipBuy1]}>
|
|
|
+ <div>SVIP年度会员</div>
|
|
|
+ <div>价值1280元</div>
|
|
|
+ </div>{' '}
|
|
|
+ <div class={[styles.vipNumber, styles.vipBuy2]}>
|
|
|
+ <div>SVIP年度会员</div>
|
|
|
+ <div>价值1280元</div>
|
|
|
+ </div>{' '}
|
|
|
+ <div class={[styles.vipNumber, styles.vipBuy3]}>
|
|
|
+ <div>畅学卡一年期</div>
|
|
|
+ <div>价值129元</div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.svipDetails}>
|
|
|
+ <span>¥</span>
|
|
|
+ <span>{activitData.registrationPrice}</span>
|
|
|
+ <span>(SVIP会员买1年赠1年,还送1年畅学)</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <img class={styles.activeArea2} src={svipCon1} />
|
|
|
+ <div class={styles.activeArea3}>
|
|
|
+ <img class={styles.tip1} src={tip2Img} />
|
|
|
+ <img class={styles.shadowImg} src={shadowImg} />
|
|
|
+ <div class={styles.titCon}>
|
|
|
+ 专为音乐学习者设计的全方位学习通行证,畅学卡生效期间,购买任何VIP定制课、趣纠课、直播课、视频课
|
|
|
+ <span>享受75折</span>优惠,助您在音乐道路上更进一步。
|
|
|
+ </div>
|
|
|
+ <div class={styles.classCon}>
|
|
|
+ <div class={styles.classBox}>
|
|
|
+ 课程全部<span>75</span>
|
|
|
+ <span>折</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <img class={styles.activeArea4} src={svipCon2} />
|
|
|
+ <div class={styles.subBtnCon}>
|
|
|
+ <div
|
|
|
+ class={[styles.subBtn, subBtnState.value.disable && styles.disable]}
|
|
|
+ onClick={() => {
|
|
|
+ !subBtnState.value.disable && handleSubmit()
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {subBtnState.value.text}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <Popup
|
|
|
+ v-model:show={state.orderVisiable}
|
|
|
+ style={{ background: 'transparent' }}
|
|
|
+ closeOnClickOverlay={false}
|
|
|
+ >
|
|
|
+ <div class={styles.dialogContainer}>
|
|
|
+ <div class={styles.dialogTitle}>提示</div>
|
|
|
+ <div class={styles.dialogContent}>
|
|
|
+ 您有待支付的订单,是否继续支付
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class={[styles.dialogBtnGroup, styles.orderGroup]}>
|
|
|
+ <Button round type="default" plain block onClick={onCancelOrder}>
|
|
|
+ 取消订单
|
|
|
+ </Button>
|
|
|
+ <Button
|
|
|
+ round
|
|
|
+ type="primary"
|
|
|
+ block
|
|
|
+ class={styles.dialogBtn}
|
|
|
+ onClick={onContinueOrder}
|
|
|
+ >
|
|
|
+ 继续支付
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </Popup>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }
|
|
|
+})
|