import { Image, Cell, CellGroup, Tag, Button, Stepper, Icon, Popup, showConfirmDialog, showToast, Form, Field, CountDown, RadioGroup, Radio, Picker } from 'vant'; import { computed, defineComponent, nextTick, onMounted, reactive, ref } from 'vue'; import qs from 'query-string'; import { state as baseState, setLogin, setLoginInit } from '@/state'; import styles from './index.module.less'; import MSticky from '@/components/m-sticky'; // import MVideo from '@/components/m-video'; import { useRoute, useRouter } from 'vue-router'; import { useStudentRegisterStore } from '@/store/modules/student-register-store'; import request from '@/helpers/request'; import { browser, checkPhone, moneyFormat } from '@/helpers/utils'; import deepClone from '@/helpers/deep-clone'; import OWxTip from '@/components/m-wx-tip'; import MDialog from '@/components/m-dialog'; // import f1 from './images/new/f-1.png'; // import f2 from './images/new/f-2.png'; // import f3 from './images/new/f-3.png'; // import iconTip2 from './images/new/icon-tip2.png'; // import functionBg from './images/new/function-bg.png'; import giftTip from './images/new/icon-4.png'; import iconGift from './images/new/icon-gift.png'; import dayjs from 'dayjs'; // import MMessageTip from '@/components/m-message-tip'; import { CurrentTime, useCountDown } from '@vant/use'; import Payment from '../adapay/payment'; import QrcodePayment from './qrcode-payment'; import MImgCode from '@/components/m-img-code'; import { beforeSubmit } from './order-state'; const classList: any = []; for (let i = 1; i <= 40; i++) { classList.push({ text: i + '班', value: i }); } const GRADE_ENUM = { '1': '一年级', '2': '二年级', '3': '三年级', '4': '四年级', '5': '五年级', '6': '六年级', '7': '七年级', '8': '八年级', '9': '九年级' } as any; const getGradeList = (gradeYear: string) => { let tempList: any = []; const five = [ { text: '一年级', value: 1 }, { text: '二年级', value: 2 }, { text: '三年级', value: 3 }, { text: '四年级', value: 4 }, { text: '五年级', value: 5 } ]; const one = [{ text: '六年级', value: 6 }]; const three = [ { text: '七年级', value: 7 }, { text: '八年级', value: 8 }, { text: '九年级', value: 9 } ]; if (gradeYear === 'FIVE_YEAR_SYSTEM') { tempList.push(...[...five]); } else if (gradeYear === 'SIX_YEAR_SYSTEM') { tempList.push(...[...five, ...one]); } else if (gradeYear === 'THREE_YEAR_SYSTEM') { tempList.push(...[...three]); } else if (gradeYear === 'FORE_YEAR_SYSTEM') { tempList.push(...[...one, ...three]); } else { tempList.push(...[...five, ...one, ...three]); } return tempList; }; export default defineComponent({ name: 'student-register', setup() { const route = useRoute(); const studentRegisterStore = useStudentRegisterStore(); const router = useRouter(); // 初始化学校编号 studentRegisterStore.setShoolId(route.query.sId as any); const countDownRef = ref(); const forms = reactive({ schoolId: route.query.sId as any, paymentType: '', // 支付类型 // popupShow: false, details: [] as any[], // schoolType: '', // 学校类型 gradeYear: '', // 学制 // bugGoods: false, // 是否购买AI registerType: '', // 报名类型 detailVip: {} as any, giftVipDay: 0, // 赠送天数 submitLoading: false, // showMore: true, showTips: false, showButton: false, showMessage: '请使用微信打开', countDownStatus: true, countDownTime: 1000 * 120, // 倒计时时间 // modelValue: false, // 是否选中协议 imgCodeStatus: false, gradeNumText: '', currentClassText: '', gradeStatus: false, classStatus: false, loading: false, dialogStatus: false, dialogMessage: '', dialogConfirmStatus: false, contract_sign: false, // 是否实名认证 countDownTimePay: 60 * 1000, dialogConfig: {} as any, showOtherSchool: false, showOtherMessage: '', joinType: '' as 'digitalize' | 'tradition', gradeList: [] as any, classList: [] as any }); const state = reactive({ showQrcode: false, qrCodeUrl: '', pay_channel: '', orderInfo: {} as any, // 订单信息 authShow: false, orderNo: null as any, config: {} as any, paymentStatus: false, orderTimer: null as any }); const studentInfo = reactive({ autoRegister: true, client_id: 'cooleshow-student', client_secret: 'cooleshow-student', extra: { nickname: '', currentGradeNum: '', currentClass: '', gender: 1, registerType: null as any, // 报名类型 giftVipDay: 0 // 赠送会员天数 }, grant_type: 'password', loginType: 'SMS', password: '', username: '' }); const countDown = useCountDown({ // 倒计时 60 秒 time: forms.countDownTimePay, onChange(current: CurrentTime) { forms.dialogMessage = `有待支付订单,请在${Math.ceil( current.total / 1000 )}s后重试`; }, onFinish() { forms.dialogStatus = false; } }); const onCodeSend = () => { forms.countDownStatus = false; nextTick(() => { countDownRef.value.start(); }); }; const onSendCode = () => { // 发送验证码 if (!checkPhone(studentInfo.username)) { return showToast('请输入正确的手机号码'); } forms.imgCodeStatus = true; }; const validatePhone = computed(() => { return checkPhone(studentInfo.username) ? true : false; }); const onFinished = () => { forms.countDownStatus = true; countDownRef.value.reset(); }; const orderType = computed(() => { return state.orderInfo.orderType; }); const getRegisterGoods = async () => { try { const { data } = await request.get( '/edu-app/open/userOrder/registerGoods/' + forms.schoolId, { noAuthorization: true // 是否请求接口的时候添加toekn } ); // 默认选中商品 studentRegisterStore.setVip(data.details || []); forms.details = deepClone(data.details || []); if (forms.details.length > 0) { forms.detailVip = forms.details[0]; // forms.giftVipDay = forms.details[0].membershipDays; } forms.giftVipDay = data.giftVipDay || 0; forms.gradeYear = data.gradeYear; forms.registerType = data.registerType; studentInfo.extra.registerType = data.registerType; const schoolInstrumentList = data.schoolInstrumentList || []; if (data.schoolInstrumentSetType === 'SCHOOL') { forms.gradeList = getGradeList(data.gradeYear); forms.classList = classList; } else if (data.schoolInstrumentSetType === 'GRADE') { schoolInstrumentList.forEach((item: any) => { forms.gradeList.push({ text: GRADE_ENUM[item.gradeNum], value: item.gradeNum, instrumentId: item.instrumentId }); }); forms.classList = classList; } else if (data.schoolInstrumentSetType === 'CLASS') { // 班级 const tempGradeList: any[] = []; schoolInstrumentList.forEach((item: any) => { if (!tempGradeList.includes(item.gradeNum)) { tempGradeList.push(item.gradeNum); } }); const lastGradeList: any[] = []; tempGradeList.forEach((temp: any) => { const list = { text: GRADE_ENUM[temp], value: temp, children: [] as any }; schoolInstrumentList.forEach((item: any) => { if (item === item.gradeNum) { list.children.push({ text: item.classNum + '班', value: item.classNum }); } }); lastGradeList.push(list); }); forms.gradeList = lastGradeList; forms.classList = []; } if (browser().weixin) { // if ( // data.schoolStatus === 0 && // forms.schoolId == '1770035687490105346' // ) { // forms.showTips = true; // forms.showMessage = '团购时间已截止,感谢您的参与'; // forms.showButton = false; // return; // } if (data.registerType !== 'BUG_GOODS' || data.schoolStatus === 0) { forms.showTips = true; forms.showMessage = '二维码已经失效,详情请咨询学校老师'; forms.showButton = false; return; } } else { forms.showTips = true; } } catch {} }; // 计算金额 const calcPrice = computed(() => { let amount: number = 0; //现价 let originAmount: number = 0; // 原价 const vipList: any[] = studentRegisterStore.getVip; vipList.forEach((vip: any) => { amount += Number(vip.currentPrice); originAmount += Number(vip.originalPrice); }); // const goodsList: any[] = studentRegisterStore.getGoods; // goodsList.forEach((good: any) => { // amount += Number(good.price) * good.quantity; // originAmount += Number(good.originalPrice) * good.quantity; // }); return { amount, originAmount }; }); const checkForm = () => { if (!checkPhone(studentInfo.username)) { showToast('请输入正确的手机号码'); return true; } else if (!studentInfo.password) { showToast('请输入验证码'); return true; } else if (!studentInfo.extra.nickname) { showToast('请输入学生姓名'); return true; } else if (!studentInfo.extra.currentGradeNum) { showToast('请选择所在年级'); return true; } else if (!studentInfo.extra.currentClass) { showToast('请选择所在班级'); return true; } return false; }; // 登记成功之后购买 const onSubmit = async () => { forms.submitLoading = true; try { if (checkForm()) return; const { extra, ...res } = studentInfo; const result = await request.post('/edu-app/userlogin', { requestType: 'form', data: { ...res, extra: JSON.stringify({ ...extra, giftVipDay: forms.detailVip.membershipDays || 0 + forms.giftVipDay || 0, schoolId: forms.schoolId }) } }); if (result.code !== 200) { if (result.code === 5436) { forms.showTips = true; forms.showMessage = '二维码已经失效,详情请咨询学校老师'; forms.showButton = false; } else if (result.code === 5435) { forms.showTips = true; forms.showMessage = result.message; forms.showButton = true; } else if (result.code === 5435) { forms.showTips = true; forms.showMessage = result.message; forms.showButton = false; } } else { studentRegisterStore.setToken( result.data.token_type + ' ' + result.data.access_token ); setLoginInit(); // 传统方式 if (forms.joinType === 'tradition') { setTimeout(() => { showToast('报名成功'); router.push('/download'); }, 100); return; } // 获取用户信息 const res = await request.get('/edu-app/user/getUserInfo', { requestType: 'form' }); setLogin(res.data); await onRegisterSubmit(); } } finally { } forms.submitLoading = false; }; // 登记成功之后购买 const onRegisterSubmit = async () => { try { // 请求是否有待支付订单,如果有则自动关闭 const status = await paymentOrderUnpaid(); if (status) return; const schoolInfo = await request.get( '/edu-app/userPaymentOrder/registerStatus/' + forms.schoolId ); const vipList = studentRegisterStore.getVip; if (schoolInfo.data.hasBuyCourse && vipList.length > 0) { forms.dialogConfirmStatus = true; return; } await paymentContinue(); } catch { // } }; const getUserInfos = async () => { if ( studentInfo.password.length !== 6 || !checkPhone(studentInfo.username) ) { return; } try { // 15907120131; const { data } = await request.get( `/edu-app/open/student/studentInfo?mobile=${studentInfo.username}&code=${studentInfo.password}&type=REGISTER` ); if (data) { if (!studentInfo.extra.nickname) { studentInfo.extra.nickname = data.nickname; } if (!studentInfo.extra.currentGradeNum) { const tempGrade: any = forms.gradeList || []; tempGrade?.forEach((i: any) => { if (i.value === data.currentGradeNum) { forms.gradeNumText = i.text; studentInfo.extra.currentGradeNum = data.currentGradeNum; } }); } if (!studentInfo.extra.currentClass) { forms.classList.forEach((i: any) => { if (i.value === data.currentClass) { forms.currentClassText = i.text; studentInfo.extra.currentClass = data.currentClass; } }); } // if (!studentInfo.extra.gender) { studentInfo.extra.gender = studentInfo.extra.gender !== data.gender ? data.gender : studentInfo.extra.gender; } } catch { // } }; // 查询未支付订单 const paymentOrderUnpaid = async () => { let result = false; try { const { data } = await request.get('/edu-app/userPaymentOrder/unpaid'); // 判断是否有待支付订单 if (!data.id) return false; // 判断是否可以取消订单 if (data.cancelPayment) { await request.post( '/edu-app/userPaymentOrder/cancelPayment/' + data.orderNo ); return false; } else { forms.countDownTime = data.cancelTimes; countDown.reset(Number(data.cancelTimes)); countDown.start(); forms.dialogMessage = `有待支付订单,请在${Math.ceil( countDown.current.value.total / 1000 )}s后重试`; forms.dialogStatus = true; forms.dialogConfig = data; result = true; } } catch { // } return result; }; const paymentContinue = async () => { try { const vipList = studentRegisterStore.getVip; const goodsList = studentRegisterStore.getGoods; const params: any[] = []; vipList.forEach((vip: any) => { params.push({ giftVipDay: vip.membershipDays, goodsId: vip.goodsId, goodsNum: 1, goodsType: vip.goodsType, paymentCashAmount: vip.currentPrice, // 现金支付金额 paymentCouponAmount: 0 // 优惠券金额 }); }); goodsList.forEach((goods: any) => { params.push({ goodsId: goods.productId, goodsNum: goods.quantity, goodsType: 'INSTRUMENTS', paymentCashAmount: goods.price, // 现金支付金额 paymentCouponAmount: 0, // 优惠券金额 goodsSkuId: goods.productSkuId }); }); // 创建订单 const result = await request.post( '/edu-app/userPaymentOrder/executeOrder', { // hideLoading: false, data: { registerType: forms.registerType, paymentType: forms.paymentType, bizId: forms.schoolId, // 乐团编号 orderType: 'SCHOOL_REGISTER', paymentCashAmount: calcPrice.value.amount || 0, paymentCouponAmount: 0, goodsInfos: params, orderName: '学生登记', orderDesc: '学生登记' } } ); if (result.code === 5436) { forms.showTips = true; forms.showMessage = '二维码已经失效,详情请咨询学校老师'; forms.showButton = false; } else if (result.code === 5435) { forms.showTips = true; forms.showMessage = result.message; forms.showButton = true; } else { state.config = { ...result.data.paymentConfig, paymentType: result.data.paymentType }; state.orderNo = result.data.orderNo; await lastSubmit(); } } catch (e: any) { console.log(e, 'any'); } }; const lastSubmit = async () => { try { const users = baseState.user.data; // 判断是否需要实名认证, 姓名,卡号 - 参数设置可以控制 if ( forms.contract_sign && (!users?.account.realName || !users?.account.idCardNo) ) { state.authShow = true; return; } const { data } = await request.post( '/edu-app/userPaymentOrder/updateReceiveAddress', { // hideLoading: false, data: { orderNo: state.orderNo, orderType: 'SCHOOL_REGISTER' } } ); state.pay_channel = data.paymentChannel; if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') { router.replace({ path: '/payment-result', query: { orderNo: state.orderNo } }); } else { onCallback(); } } catch { // } }; /** * @description 回调,判断是否有支付渠道,如果有则直接去支付 * @returns void */ const onCallback = () => { const pt = state.pay_channel; // 判断是否有支付方式 if (pt) { const payCode: string = beforeSubmit(state.pay_channel); onConfirm({ payCode, pay_channel: pt }); } else { if (orderType.value === 'VIP') { state.paymentStatus = true; } else { // 直接去拉取微信支付 onConfirm({ payCode: 'payResult', pay_channel: 'wx_pub' }); } } }; const onConfirm = (val: any) => { const config: any = state.config; state.pay_channel = val.pay_channel; const params = qs.stringify({ pay_channel: val.pay_channel, wxAppId: config.wxAppId, alipayAppId: config.alipayAppId, paymentType: forms.paymentType, body: config.body, price: config.price, orderNo: config.merOrderNo, userId: config.userId }); // console.log(params, state.config); // return; if (val.payCode === 'payResult') { window.location.href = window.location.origin + '/classroom-app/#/payResult?' + params; } else { state.qrCodeUrl = window.location.origin + '/classroom-app/#/payDefine?' + params; state.showQrcode = true; state.paymentStatus = false; setTimeout(() => { getPaymentOrderStatus(); }, 300); } }; // 放弃支付时,则取消订单 const onBackOut = async () => { try { await request.post( '/edu-app/userPaymentOrder/cancelPayment/' + state.orderNo ); // router.back(); } catch { // } }; // 轮询查询订单状态 const getPaymentOrderStatus = async () => { // 循环查询订单 // const orderNo = state.orderNo const orderTimer = setInterval(async () => { // 判断是否在当前路由,如果不是则清除定时器 if (route.name != 'student-register-form') { clearInterval(orderTimer); return; } state.orderTimer = orderTimer; try { const { data } = await request.post( '/edu-app/open/userOrder/paymentStatus/' + state.orderNo, { hideLoading: true } ); if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') { // 默认关闭支付二维码弹窗 state.showQrcode = false; clearInterval(state.orderTimer); setTimeout(() => { router.replace({ path: '/payment-result', query: { orderNo: state.orderNo } }); }, 100); } } catch { // clearInterval(state.orderTimer); } }, 5000); }; // 实名认证成功 const onAuthSuccess = () => { // state.authShow = false; paymentContinue(); // 实名成功后自动支付 }; onMounted(async () => { getRegisterGoods(); }); return () => (
{/* 解决学生不会练、不知练的对错、家长无法辅导、无需再额外请老师 */} {forms.detailVip.description}
赠送课堂乐器现在购买赠送乐器AI学练工具 {forms.detailVip.membershipDays || 0}天有效期