|
@@ -0,0 +1,2130 @@
|
|
|
+import {
|
|
|
+ Image,
|
|
|
+ Cell,
|
|
|
+ Tag,
|
|
|
+ Button,
|
|
|
+ Popup,
|
|
|
+ showToast,
|
|
|
+ Form,
|
|
|
+ Field,
|
|
|
+ CountDown,
|
|
|
+ RadioGroup,
|
|
|
+ Radio,
|
|
|
+ Picker,
|
|
|
+ closeToast,
|
|
|
+ Popover
|
|
|
+} from 'vant';
|
|
|
+import {
|
|
|
+ computed,
|
|
|
+ defineComponent,
|
|
|
+ nextTick,
|
|
|
+ onMounted,
|
|
|
+ onUnmounted,
|
|
|
+ reactive,
|
|
|
+ ref
|
|
|
+} from 'vue';
|
|
|
+import qs from 'query-string';
|
|
|
+import {
|
|
|
+ state as baseState,
|
|
|
+ goWechatAuth,
|
|
|
+ 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 requestStudent from './request';
|
|
|
+import { browser, checkPhone, getUrlCode, 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 tuangou from './images/new/tuangou.png';
|
|
|
+import icon3 from './images/new/icon-3.png';
|
|
|
+import icon5 from './images/new/icon-5.png';
|
|
|
+import icon6 from './images/new/icon-6.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';
|
|
|
+import { useInterval, useIntervalFn } from '@vueuse/core';
|
|
|
+import MPopup from '@/components/m-popup';
|
|
|
+import UserAuth from './component/user-auth';
|
|
|
+import MMessageTip from '@/components/m-message-tip';
|
|
|
+import SelectStudent from './modal/select-student';
|
|
|
+
|
|
|
+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, instrumentCode?: string) => {
|
|
|
+ let tempList: any = [];
|
|
|
+ const five = [
|
|
|
+ { text: '一年级', value: 1, instrumentCode },
|
|
|
+ { text: '二年级', value: 2, instrumentCode },
|
|
|
+ { text: '三年级', value: 3, instrumentCode },
|
|
|
+ { text: '四年级', value: 4, instrumentCode },
|
|
|
+ { text: '五年级', value: 5, instrumentCode }
|
|
|
+ ];
|
|
|
+ const one = [{ text: '六年级', value: 6, instrumentCode }];
|
|
|
+ const three = [
|
|
|
+ { text: '七年级', value: 7, instrumentCode },
|
|
|
+ { text: '八年级', value: 8, instrumentCode },
|
|
|
+ { text: '九年级', value: 9, instrumentCode }
|
|
|
+ ];
|
|
|
+ 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 mstickyRef = ref();
|
|
|
+ const forms = reactive({
|
|
|
+ schoolId: route.query.sId as any,
|
|
|
+ paymentType: '', // 支付类型
|
|
|
+ multi_user_limit: 1, // 限制注册学生数量
|
|
|
+ // popupShow: false,
|
|
|
+ registerDetails: {} as any,
|
|
|
+ details: [] as any[],
|
|
|
+ // schoolType: '', // 学校类型
|
|
|
+ gradeYear: '', // 学制
|
|
|
+ schoolInstrumentSetType: null as any,
|
|
|
+ // bugGoods: false, // 是否购买AI
|
|
|
+
|
|
|
+ isRegister: 'create' as 'create' | 'update' | '', // 是否注册学生
|
|
|
+ isTipRegister: false, // 是否显示名字不一致 - 默认显示
|
|
|
+ isChangeSchool: false, // 是否切换学校
|
|
|
+
|
|
|
+ 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: '',
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ messageAlign: 'center' as 'left' | 'center' | 'right',
|
|
|
+
|
|
|
+ tipStatus: true,
|
|
|
+ dialogConfirmStatus: false,
|
|
|
+ contract_sign: false, // 是否实名认证
|
|
|
+ countDownTimePay: 60 * 1000,
|
|
|
+ dialogConfig: {} as any,
|
|
|
+ showSelectStudent: false, // 选择学生
|
|
|
+ studentList: [], // 手机号关联学生列表
|
|
|
+ studentItem: {} as any, // 选择的学生
|
|
|
+ joinType: 'digitalize' as 'digitalize' | 'tradition',
|
|
|
+ gradeList: [] as any,
|
|
|
+ classList: [] as any,
|
|
|
+ saveUserId: null as any,
|
|
|
+ saveId: null as any,
|
|
|
+ openId: null as any,
|
|
|
+ code: null as any,
|
|
|
+ intervalFnRef: null as any, // 页面订时器
|
|
|
+ registerExpireTime: null as any, // 结束时间
|
|
|
+ instrumentCode: null as any, // 乐器编码
|
|
|
+ activeOverTime: 0, // 活动结束时间
|
|
|
+ activeOverStatus: true, // 活动是否结束 默认已结束
|
|
|
+ gradePopupShow: false,
|
|
|
+ gradePopupIndex: [] as any, // 年级下拉索引
|
|
|
+ classPopupShow: false,
|
|
|
+ classPopupIndex: [] as any // 班级下拉索引
|
|
|
+ });
|
|
|
+
|
|
|
+ const otherParams = reactive({
|
|
|
+ showOtherSchool: false,
|
|
|
+ showCloseButton: true, // 是否显示关闭按钮
|
|
|
+ showOtherMessage: '',
|
|
|
+ /** limit 超限制,change 更换学生,nickname 名称不一致 member 会员购买, payment 支付方式 */
|
|
|
+ otherType: '' as 'limit' | 'change' | 'nickname' | 'member' | 'payment',
|
|
|
+ showCancelButton: true,
|
|
|
+ cancelButtonColor: '',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ showConfirmButton: true,
|
|
|
+ confirmButtonColor: '',
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ messageAlign: 'left' as 'center' | 'left' | 'right'
|
|
|
+ });
|
|
|
+
|
|
|
+ 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
|
|
|
+ });
|
|
|
+
|
|
|
+ /*
|
|
|
+ 新用户:
|
|
|
+ autoRegister: true
|
|
|
+ loginType: 'SMS'
|
|
|
+
|
|
|
+ 已存在用户:
|
|
|
+ autoRegister: false
|
|
|
+ loginType: 'TOKEN'
|
|
|
+ password: xxx
|
|
|
+ */
|
|
|
+
|
|
|
+ const studentInfo = reactive({
|
|
|
+ autoRegister: true,
|
|
|
+ multiUser: true, // 是否为多用户
|
|
|
+ client_id: 'cooleshow-student',
|
|
|
+ client_secret: 'cooleshow-student',
|
|
|
+ extra: {
|
|
|
+ nickname: '',
|
|
|
+ currentGradeNum: '' as any,
|
|
|
+ currentClass: '' as any,
|
|
|
+ gender: 1 as any,
|
|
|
+ registerType: null as any, // 报名类型
|
|
|
+ giftVipDay: 0 // 赠送会员天数
|
|
|
+ },
|
|
|
+ grant_type: 'password',
|
|
|
+ loginType: 'SMS',
|
|
|
+ password: '',
|
|
|
+ username: ''
|
|
|
+ });
|
|
|
+ // 页面定时
|
|
|
+ const pageTimer = useInterval(1000, { controls: true });
|
|
|
+ pageTimer.pause();
|
|
|
+
|
|
|
+ const overCountDown = useCountDown({
|
|
|
+ time: forms.activeOverTime,
|
|
|
+ onFinish() {
|
|
|
+ forms.activeOverStatus = true;
|
|
|
+ if (forms.submitLoading) return;
|
|
|
+ applyOver();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ /** 报名结束提示 */
|
|
|
+ const applyOver = () => {
|
|
|
+ forms.showTips = true;
|
|
|
+ // forms.showMessage = '团购时间已截止,感谢您的参与';
|
|
|
+ forms.showMessage =
|
|
|
+ '<p style="color: #F44541">报名已截止,感谢您的参与</p>';
|
|
|
+ forms.showButton = false;
|
|
|
+ forms.intervalFnRef?.pause();
|
|
|
+ };
|
|
|
+
|
|
|
+ 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 || []);
|
|
|
+ forms.registerDetails = data;
|
|
|
+
|
|
|
+ forms.registerExpireTime = data.registerExpireTime; // '2024-03-27 17:33:52'; //
|
|
|
+ if (forms.registerExpireTime) {
|
|
|
+ if (dayjs(new Date()).isBefore(forms.registerExpireTime)) {
|
|
|
+ // 活动没有结束
|
|
|
+ forms.activeOverStatus = false;
|
|
|
+ // 默认返回毫秒
|
|
|
+ forms.activeOverTime = dayjs(forms.registerExpireTime).diff(
|
|
|
+ dayjs(new Date())
|
|
|
+ );
|
|
|
+ overCountDown.reset(forms.activeOverTime);
|
|
|
+ overCountDown.start();
|
|
|
+ } else {
|
|
|
+ applyOver();
|
|
|
+ forms.activeOverStatus = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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.schoolInstrumentSetType = data.schoolInstrumentSetType;
|
|
|
+ forms.registerType = data.registerType;
|
|
|
+ studentInfo.extra.registerType = data.registerType;
|
|
|
+ const schoolInstrumentList = data.schoolInstrumentList || [];
|
|
|
+ if (data.schoolInstrumentSetType === 'SCHOOL') {
|
|
|
+ const instrumentCode = schoolInstrumentList[0]?.instrumentCode;
|
|
|
+ forms.gradeList = getGradeList(data.gradeYear, instrumentCode);
|
|
|
+ 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,
|
|
|
+ instrumentCode: item.instrumentCode
|
|
|
+ });
|
|
|
+ });
|
|
|
+ forms.gradeList.sort((a: any, b: any) => a.value - b.value);
|
|
|
+ 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,
|
|
|
+ instrumentId: '',
|
|
|
+ instrumentCode: '',
|
|
|
+ instrumentName: '',
|
|
|
+ classList: [] as any
|
|
|
+ };
|
|
|
+ schoolInstrumentList.forEach((item: any) => {
|
|
|
+ if (temp === item.gradeNum) {
|
|
|
+ list.instrumentId = item.instrumentId;
|
|
|
+ list.instrumentCode = item.instrumentCode;
|
|
|
+ list.instrumentName = item.instrumentName;
|
|
|
+ list.classList.push({
|
|
|
+ text: item.classNum + '班',
|
|
|
+ value: item.classNum,
|
|
|
+ instrumentCode: item.instrumentCode
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ // 排序班级
|
|
|
+ list.classList.sort((a: any, b: any) => a.value - b.value);
|
|
|
+ lastGradeList.push(list);
|
|
|
+ });
|
|
|
+ lastGradeList.sort((a: any, b: any) => a.value - b.value);
|
|
|
+ forms.gradeList = lastGradeList;
|
|
|
+ forms.classList = [];
|
|
|
+ } else {
|
|
|
+ forms.gradeList = getGradeList(data.gradeYear);
|
|
|
+ forms.classList = classList;
|
|
|
+ }
|
|
|
+ if (browser().weixin) {
|
|
|
+ // if (
|
|
|
+ // data.schoolStatus === 0 &&
|
|
|
+ // forms.schoolId == '1770035687490105346'
|
|
|
+ // ) {
|
|
|
+ // forms.showTips = true;
|
|
|
+ // forms.showMessage = '<p style="color: #F44541">报名已截止,感谢您的参与</p>';
|
|
|
+ // 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;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否有倒计时,倒计时是滞结束
|
|
|
+ if (!forms.registerExpireTime || !forms.activeOverStatus) {
|
|
|
+ pagePointInit();
|
|
|
+ }
|
|
|
+ } catch {}
|
|
|
+ };
|
|
|
+
|
|
|
+ // 计算金额
|
|
|
+ const calcPrice = computed(() => {
|
|
|
+ let amount: number = 0; //现价
|
|
|
+ let originAmount: number = 0; // 原价
|
|
|
+ const vipList: any[] = studentRegisterStore.getVip;
|
|
|
+ vipList.forEach((vip: any) => {
|
|
|
+ amount +=
|
|
|
+ forms.joinType === 'digitalize' ? Number(vip.currentPrice) : 0;
|
|
|
+ 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 changeTipStatus = (register: boolean, school: boolean) => {
|
|
|
+ forms.isTipRegister = register;
|
|
|
+ forms.isChangeSchool = school;
|
|
|
+ };
|
|
|
+
|
|
|
+ const checkForm = (status = true) => {
|
|
|
+ if (!checkPhone(studentInfo.username)) {
|
|
|
+ status && showToast('请输入正确的手机号码');
|
|
|
+ return true;
|
|
|
+ } else if (!studentInfo.password) {
|
|
|
+ status && showToast('请输入验证码');
|
|
|
+ return true;
|
|
|
+ } else if (!studentInfo.extra.nickname) {
|
|
|
+ status && showToast('请输入学生姓名');
|
|
|
+ return true;
|
|
|
+ } else if (![0, 1].includes(studentInfo.extra.gender)) {
|
|
|
+ status && showToast('请选择性别');
|
|
|
+ return true;
|
|
|
+ } else if (!studentInfo.extra.currentGradeNum) {
|
|
|
+ status && showToast('请选择所在年级');
|
|
|
+ return true;
|
|
|
+ } else if (!studentInfo.extra.currentClass) {
|
|
|
+ status && showToast('请选择所在班级');
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+
|
|
|
+ //
|
|
|
+ const checkSubmit = () => {
|
|
|
+ const { extra } = studentInfo;
|
|
|
+ // console.log(
|
|
|
+ // forms.studentItem.nickname,
|
|
|
+ // extra.nickname,
|
|
|
+ // forms.isRegister,
|
|
|
+ // forms.isTipRegister,
|
|
|
+ // 'isRegister'
|
|
|
+ // );
|
|
|
+ if (
|
|
|
+ forms.studentItem.nickname !== extra.nickname &&
|
|
|
+ forms.isTipRegister
|
|
|
+ ) {
|
|
|
+ otherParams.showOtherMessage =
|
|
|
+ '学生姓名与上次提交信息不一致,请确认修改学生信息或创建新的学生账号';
|
|
|
+ otherParams.showOtherSchool = true;
|
|
|
+ otherParams.showCancelButton = true;
|
|
|
+ otherParams.showCloseButton = true;
|
|
|
+ otherParams.cancelButtonColor =
|
|
|
+ 'linear-gradient( 224deg, #3FE1E6 0%, #00CDD4 100%)';
|
|
|
+ otherParams.cancelButtonText = '新建学生';
|
|
|
+ otherParams.confirmButtonColor =
|
|
|
+ 'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
|
|
|
+ otherParams.confirmButtonText = '修改信息';
|
|
|
+ otherParams.otherType = 'nickname';
|
|
|
+ otherParams.messageAlign = 'left';
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断新建学员是否上限了
|
|
|
+ if (
|
|
|
+ forms.isRegister === 'create' &&
|
|
|
+ forms.studentList.length >= forms.multi_user_limit
|
|
|
+ ) {
|
|
|
+ otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
|
|
|
+ otherParams.showOtherSchool = true;
|
|
|
+ otherParams.showCancelButton = false;
|
|
|
+ otherParams.showCloseButton = true;
|
|
|
+ otherParams.confirmButtonColor =
|
|
|
+ 'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
|
|
|
+ otherParams.confirmButtonText = '我知道了';
|
|
|
+ otherParams.otherType = 'limit';
|
|
|
+ otherParams.messageAlign = 'center';
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 判断是否为同一个学校
|
|
|
+ if (
|
|
|
+ forms.studentItem.schoolId &&
|
|
|
+ forms.studentItem.schoolId !== forms.registerDetails.schoolId &&
|
|
|
+ !forms.isChangeSchool &&
|
|
|
+ forms.isRegister === 'update'
|
|
|
+ ) {
|
|
|
+ otherParams.showOtherMessage = `您已绑定【${
|
|
|
+ forms.studentItem?.schoolName || ''
|
|
|
+ }】,提交后将更换到
|
|
|
+ <span style="color: #2B85FF">【${
|
|
|
+ forms.registerDetails.schoolName || ''
|
|
|
+ }】</span>
|
|
|
+ ,是否确认提交?`;
|
|
|
+ otherParams.showOtherSchool = true;
|
|
|
+ otherParams.showCloseButton = false;
|
|
|
+ otherParams.showCancelButton = true;
|
|
|
+ otherParams.cancelButtonColor = '';
|
|
|
+ otherParams.cancelButtonText = '取消';
|
|
|
+ otherParams.confirmButtonColor = '';
|
|
|
+ otherParams.confirmButtonText = '确定';
|
|
|
+ otherParams.otherType = 'change';
|
|
|
+ otherParams.messageAlign = 'left';
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 登记成功之后购买
|
|
|
+ */
|
|
|
+ const onSubmit = async () => {
|
|
|
+ forms.submitLoading = true;
|
|
|
+ try {
|
|
|
+ if (checkForm() || checkSubmit()) {
|
|
|
+ forms.submitLoading = false;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ const { extra, loginType, autoRegister, password, multiUser, ...res } =
|
|
|
+ studentInfo;
|
|
|
+ /*
|
|
|
+ 新用户:
|
|
|
+ autoRegister: true
|
|
|
+ loginType: 'SMS'
|
|
|
+
|
|
|
+ 已存在用户:
|
|
|
+ autoRegister: false
|
|
|
+ loginType: 'TOKEN'
|
|
|
+ password: xxx
|
|
|
+ */
|
|
|
+ let tLoginType = loginType,
|
|
|
+ tAutoRegister = autoRegister,
|
|
|
+ tPassword = password,
|
|
|
+ tMultiUser = multiUser;
|
|
|
+ if (forms.isRegister === 'update') {
|
|
|
+ tLoginType = 'TOKEN';
|
|
|
+ tAutoRegister = false;
|
|
|
+ tPassword = forms.studentItem.token;
|
|
|
+ tMultiUser = false;
|
|
|
+ }
|
|
|
+ const result = await request.post('/edu-app/userlogin', {
|
|
|
+ requestType: 'form',
|
|
|
+ data: {
|
|
|
+ loginType: tLoginType,
|
|
|
+ autoRegister: tAutoRegister,
|
|
|
+ password: tPassword,
|
|
|
+ multiUser: tMultiUser,
|
|
|
+ ...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 === 5437) {
|
|
|
+ forms.showTips = true;
|
|
|
+ forms.showMessage =
|
|
|
+ '<p style="color: #F44541">报名已截止,感谢您的参与</p>'; //result.message;
|
|
|
+ forms.showButton = false;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ studentRegisterStore.setToken(
|
|
|
+ result.data.token_type + ' ' + result.data.access_token
|
|
|
+ );
|
|
|
+ setLoginInit();
|
|
|
+
|
|
|
+ let joinType = 'NOT_REGISTER';
|
|
|
+ if (forms.joinType === 'digitalize') {
|
|
|
+ joinType = 'SELECT_INSTRUMENT';
|
|
|
+ }
|
|
|
+ if (forms.joinType === 'tradition') {
|
|
|
+ joinType = 'NOT_BUY_INSTRUMENT';
|
|
|
+ }
|
|
|
+ // 更新时间
|
|
|
+ const id = await updateStat(
|
|
|
+ pageTimer.counter.value,
|
|
|
+ joinType,
|
|
|
+ result.data.userId,
|
|
|
+ forms.schoolId
|
|
|
+ );
|
|
|
+ forms.saveId = id;
|
|
|
+ forms.saveUserId = id;
|
|
|
+ pageTimer.counter.value = 0;
|
|
|
+
|
|
|
+ // 获取用户信息
|
|
|
+ const res = await request.get('/edu-app/user/getUserInfo', {
|
|
|
+ requestType: 'form'
|
|
|
+ });
|
|
|
+ setLogin(res.data);
|
|
|
+
|
|
|
+ await onRegisterSubmit();
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ // 重置信息 - 如果是新建则不提示
|
|
|
+ changeTipStatus(forms.isRegister === 'create' ? false : true, false);
|
|
|
+ } finally {
|
|
|
+ forms.submitLoading = false;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const updateStudentInfo = async () => {
|
|
|
+ try {
|
|
|
+ const { extra, username } = studentInfo;
|
|
|
+ const registerResult = await request.post('/edu-app/student/register', {
|
|
|
+ data: {
|
|
|
+ schoolId: forms.schoolId,
|
|
|
+ clientType: 'STUDENT',
|
|
|
+ schoolVerify: true,
|
|
|
+ ...extra,
|
|
|
+ giftVipDay:
|
|
|
+ forms.detailVip.membershipDays || 0 + forms.giftVipDay || 0,
|
|
|
+ mobile: username,
|
|
|
+ newRegUser: forms.isRegister === 'create' ? true : false
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ if (registerResult.code !== 200) {
|
|
|
+ if (registerResult.code === 5436) {
|
|
|
+ forms.showTips = true;
|
|
|
+ forms.showMessage = '二维码已经失效,详情请咨询学校老师';
|
|
|
+ forms.showButton = false;
|
|
|
+ } else if (registerResult.code === 5435) {
|
|
|
+ forms.showTips = true;
|
|
|
+ forms.showMessage = registerResult.message;
|
|
|
+ forms.showButton = true;
|
|
|
+ } else if (registerResult.code === 5437) {
|
|
|
+ forms.showTips = true;
|
|
|
+ forms.showMessage =
|
|
|
+ '<p style="color: #F44541">报名已截止,感谢您的参与</p>'; //result.message;
|
|
|
+ forms.showButton = false;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ } catch {}
|
|
|
+ };
|
|
|
+
|
|
|
+ // 登记成功之后购买
|
|
|
+ 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 (forms.joinType === 'tradition') {
|
|
|
+ const updateStatus = await updateStudentInfo();
|
|
|
+ if (!updateStatus) return;
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ showToast('报名成功');
|
|
|
+ // router.push('/download');
|
|
|
+ }, 100);
|
|
|
+
|
|
|
+ setTimeout(() => {
|
|
|
+ if (browser().weixin) {
|
|
|
+ // 关闭微信
|
|
|
+ (window as any).WeixinJSBridge.call('closeWindow');
|
|
|
+ }
|
|
|
+ }, 1000);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
|
|
|
+ // forms.dialogConfirmStatus = true;
|
|
|
+ otherParams.showOtherMessage = `该学员已购买会员,是否再次购买?`;
|
|
|
+ otherParams.showOtherSchool = true;
|
|
|
+ otherParams.showCloseButton = false;
|
|
|
+ otherParams.showCancelButton = true;
|
|
|
+ otherParams.cancelButtonColor = '';
|
|
|
+ otherParams.cancelButtonText = '取消';
|
|
|
+ otherParams.confirmButtonColor = '';
|
|
|
+ otherParams.confirmButtonText = '确定';
|
|
|
+ otherParams.otherType = 'member';
|
|
|
+ otherParams.messageAlign = 'center';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ await paymentContinue();
|
|
|
+ } catch {
|
|
|
+ // 重置信息 - 如果是新建则不提示
|
|
|
+ changeTipStatus(forms.isRegister === 'create' ? false : true, false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ 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`
|
|
|
+ );
|
|
|
+ forms.studentList = data || [];
|
|
|
+
|
|
|
+ if (forms.studentList.length > 0) {
|
|
|
+ const firstStudent: any = forms.studentList[0];
|
|
|
+ forms.studentItem = firstStudent;
|
|
|
+ studentInfo.extra.nickname = firstStudent.nickname;
|
|
|
+ const tempGrade: any = forms.gradeList || [];
|
|
|
+ tempGrade?.forEach((i: any) => {
|
|
|
+ if (i.value === firstStudent.currentGradeNum) {
|
|
|
+ forms.instrumentCode = i.instrumentCode;
|
|
|
+ forms.gradeNumText = i.text;
|
|
|
+ studentInfo.extra.currentGradeNum = firstStudent.currentGradeNum;
|
|
|
+ if (forms.schoolInstrumentSetType === 'CLASS') {
|
|
|
+ forms.classList = i.classList;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ forms.classList.forEach((i: any) => {
|
|
|
+ if (i.value === firstStudent.currentClass) {
|
|
|
+ forms.currentClassText = i.text;
|
|
|
+ studentInfo.extra.currentClass = firstStudent.currentClass;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ studentInfo.extra.gender = firstStudent.gender;
|
|
|
+
|
|
|
+ forms.isRegister = 'update';
|
|
|
+ changeTipStatus(true, false);
|
|
|
+ } else {
|
|
|
+ forms.isRegister = 'create';
|
|
|
+ changeTipStatus(false, false);
|
|
|
+ forms.studentItem = [];
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 查询未支付订单
|
|
|
+ const paymentOrderUnpaid = async () => {
|
|
|
+ let result = false;
|
|
|
+ try {
|
|
|
+ const { data } = await request.get(
|
|
|
+ '/edu-app/userPaymentOrder/schoolRegisterOrder?schoolId=' +
|
|
|
+ forms.schoolId
|
|
|
+ );
|
|
|
+ // 判断是否有待支付订单
|
|
|
+
|
|
|
+ if (data && data.length > 0) {
|
|
|
+ let isPadding = false; // 是否有待支付订单
|
|
|
+ let paddingConfig = {} as any;
|
|
|
+ let paddingData = {} as any;
|
|
|
+ let isFinal = false; // 是否有完成订单
|
|
|
+ let finalConfig = {} as any;
|
|
|
+ data.forEach((element: any) => {
|
|
|
+ // 判断是否待支付
|
|
|
+ if (element.status === 'PAYING' || element.status === 'WAIT_PAY') {
|
|
|
+ isPadding = true;
|
|
|
+ paddingConfig = element.paymentConfig;
|
|
|
+ paddingData = element;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (
|
|
|
+ element.status === 'PAID' ||
|
|
|
+ element.status === 'PART_REFUNDED' ||
|
|
|
+ element.status === 'REFUNDED'
|
|
|
+ ) {
|
|
|
+ isFinal = true;
|
|
|
+ finalConfig = element.paymentConfig;
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 60s 关单提示文案
|
|
|
+
|
|
|
+ // 判断是否有完成订单 并且选择 自备
|
|
|
+ if (isFinal && forms.joinType === 'tradition') {
|
|
|
+ // const studentResult = await updateStudentInfo();
|
|
|
+ // if (!studentResult) return;
|
|
|
+ setTimeout(() => {
|
|
|
+ showToast('您已报名成功,请勿重复报名');
|
|
|
+ }, 100);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提交报名信息时,判断该手机号是否存在待支付订单,若存则判断本次提交的报名方式,若本次提交的是团购则提示【您有待支付的报名订单,是否继续支付 重新下单/继续支付】,点击重新下单时,关闭老订单,创建新订单;若本次提交的是自备,则提示 【您有数字化方式报名的待支付订单,请关闭订单后重新报名 取消/关闭】取消则停留在当前界面,关闭则关闭订单,并停留在当前界面,用户需要再次点击报名按钮提交信息
|
|
|
+ if (isPadding && forms.joinType === 'tradition') {
|
|
|
+ // forms.dialogStatus = true;
|
|
|
+ // forms.dialogMessage =
|
|
|
+ // '您有数字化方式报名的待支付订单,请关闭订单后重新报名';
|
|
|
+ // forms.cancelButtonText = '取消';
|
|
|
+ // forms.confirmButtonText = '关闭';
|
|
|
+ // forms.dialogConfig = paddingConfig;
|
|
|
+ // forms.messageAlign = 'left';
|
|
|
+ forms.dialogConfig = paddingConfig;
|
|
|
+ const cancelStatus = await cancelPaymentOrder();
|
|
|
+ if (cancelStatus) {
|
|
|
+ onSubmit();
|
|
|
+ }
|
|
|
+ // 重新下单 - 先关闭订单
|
|
|
+ // resetOrderPayment();
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (isPadding && forms.joinType === 'digitalize') {
|
|
|
+ // 最终确认,有待支付订单直接去支付,没有则才会创建订单
|
|
|
+ // state.config = paddingConfig?.paymentConfig;
|
|
|
+ // state.orderNo = paddingConfig?.orderNo;
|
|
|
+ // const updateStatus = await updateStudentInfo();
|
|
|
+ // if (!updateStatus) return;
|
|
|
+ // await lastSubmit();
|
|
|
+
|
|
|
+ // 为了处理,有待支付订单,然后后台改了金额,会导致金额不一致
|
|
|
+ forms.dialogConfig = paddingConfig;
|
|
|
+ const cancelStatus = await cancelPaymentOrder();
|
|
|
+ if (cancelStatus) {
|
|
|
+ await paymentContinue();
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ } else {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ // 重置信息 - 如果是新建则不提示
|
|
|
+ changeTipStatus(forms.isRegister === 'create' ? false : true, false);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 重新下单
|
|
|
+ const resetOrderPayment = async () => {
|
|
|
+ try {
|
|
|
+ const orderNo = forms.dialogConfig?.orderNo;
|
|
|
+ if (!orderNo) return;
|
|
|
+ await request.post(
|
|
|
+ '/edu-app/userPaymentOrder/cancelPayment/' + orderNo
|
|
|
+ );
|
|
|
+
|
|
|
+ await onRegisterSubmit();
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+ // 取消订单
|
|
|
+ const cancelPaymentOrder = async () => {
|
|
|
+ try {
|
|
|
+ const orderNo = forms.dialogConfig?.orderNo;
|
|
|
+ if (!orderNo) return;
|
|
|
+ await request.post(
|
|
|
+ '/edu-app/userPaymentOrder/cancelPayment/' + orderNo
|
|
|
+ );
|
|
|
+ return true;
|
|
|
+ } catch {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ 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 updateStatus = await updateStudentInfo();
|
|
|
+ // console.log(updateStatus, 'updateStatus');
|
|
|
+ if (!updateStatus) return;
|
|
|
+
|
|
|
+ const result = await request.post(
|
|
|
+ '/edu-app/userPaymentOrder/executeOrder',
|
|
|
+ {
|
|
|
+ // hideLoading: false,
|
|
|
+ data: {
|
|
|
+ buryId: forms.saveUserId,
|
|
|
+ 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');
|
|
|
+ // 重置信息 - 如果是新建则不提示
|
|
|
+ changeTipStatus(forms.isRegister === 'create' ? false : true, false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ 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 {
|
|
|
+ // 重置信息 - 如果是新建则不提示
|
|
|
+ changeTipStatus(forms.isRegister === 'create' ? false : true, false);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @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(); // 实名成功后自动支付
|
|
|
+ };
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 页面停留时间
|
|
|
+ * @param pageBrowseTime 停留时间
|
|
|
+ * @param joinType 加入方式
|
|
|
+ * @param userId 用户编号
|
|
|
+ * @param schoolId 学校编号
|
|
|
+ */
|
|
|
+ const updateStat = async (
|
|
|
+ pageBrowseTime = 5,
|
|
|
+ joinType?: string,
|
|
|
+ userId?: string,
|
|
|
+ schoolId?: string
|
|
|
+ ) => {
|
|
|
+ try {
|
|
|
+ const { data } = await requestStudent.post(
|
|
|
+ '/edu-app/open/studentRegisterPointRecord/update',
|
|
|
+ {
|
|
|
+ data: {
|
|
|
+ id: forms.saveId,
|
|
|
+ useTime: pageBrowseTime, // 固定10秒
|
|
|
+ joinType,
|
|
|
+ userId,
|
|
|
+ schoolId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ forms.saveId = data;
|
|
|
+ return data;
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const getAppIdAndCode = async (url?: string) => {
|
|
|
+ try {
|
|
|
+ const { data } = await request.get(
|
|
|
+ '/edu-app/open/paramConfig/wechatAppId'
|
|
|
+ );
|
|
|
+ // 判断是否有微信appId
|
|
|
+ if (data) {
|
|
|
+ closeToast();
|
|
|
+ goWechatAuth(data, url);
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ //
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ if (browser().weixin) {
|
|
|
+ //授权
|
|
|
+ const openId = sessionStorage.getItem('active-open-id');
|
|
|
+ forms.openId = openId;
|
|
|
+ const code = getUrlCode();
|
|
|
+ if (!code) {
|
|
|
+ const newUrl =
|
|
|
+ window.location.origin +
|
|
|
+ window.location.pathname +
|
|
|
+ '#' +
|
|
|
+ route.path +
|
|
|
+ '?' +
|
|
|
+ qs.stringify({
|
|
|
+ ...route.query
|
|
|
+ });
|
|
|
+ getAppIdAndCode(newUrl);
|
|
|
+ return '';
|
|
|
+ } else {
|
|
|
+ forms.code = code;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const formatTimerTo = (num: number): string => {
|
|
|
+ if (num > 9) {
|
|
|
+ return num + '';
|
|
|
+ } else {
|
|
|
+ return '0' + num;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const pagePointInit = async () => {
|
|
|
+ try {
|
|
|
+ // 判断是否获取微信code码
|
|
|
+ if (!forms.code) return;
|
|
|
+ const { data } = await request.post(
|
|
|
+ '/edu-app/open/studentRegisterPointRecord/save',
|
|
|
+ {
|
|
|
+ data: {
|
|
|
+ code: forms.code,
|
|
|
+ schoolId: forms.schoolId,
|
|
|
+ openId: forms.openId
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ forms.saveId = data.id;
|
|
|
+ forms.openId = data.openId;
|
|
|
+ sessionStorage.setItem('active-open-id', data.openId);
|
|
|
+
|
|
|
+ // 间隔多少时间同步数据
|
|
|
+ forms.intervalFnRef = useIntervalFn(async () => {
|
|
|
+ // 页面时间恢复
|
|
|
+ pageTimer.counter.value = 0;
|
|
|
+ pageTimer.resume();
|
|
|
+ // 同步数据时先进行有效时间进行保存
|
|
|
+
|
|
|
+ await updateStat();
|
|
|
+ }, 5000);
|
|
|
+ } catch {}
|
|
|
+ };
|
|
|
+
|
|
|
+ /** 手机号变更时清空验证码信息,用户信息 */
|
|
|
+ const phoneChangeEmptyInfo = () => {
|
|
|
+ studentInfo.password = '';
|
|
|
+ studentInfo.extra.nickname = '';
|
|
|
+ studentInfo.extra.currentGradeNum = '';
|
|
|
+ studentInfo.extra.currentClass = '';
|
|
|
+ studentInfo.extra.gender = 1;
|
|
|
+ forms.currentClassText = '';
|
|
|
+ forms.gradeNumText = '';
|
|
|
+ forms.studentList = []; // 手机号关联学生列表
|
|
|
+ forms.studentItem = {}; // 选择的学生
|
|
|
+ forms.isRegister = 'create'; // 是否注册学生
|
|
|
+ forms.isTipRegister = false; // 是否显示名字不一致 - 默认显示
|
|
|
+ forms.isChangeSchool = false; // 是否切换学校
|
|
|
+ };
|
|
|
+
|
|
|
+ onMounted(async () => {
|
|
|
+ try {
|
|
|
+ // 获取支付类型
|
|
|
+ let expireDay = null;
|
|
|
+ const { data } = await request.get(
|
|
|
+ '/edu-app/open/paramConfig/queryByParamNameList',
|
|
|
+ {
|
|
|
+ requestType: 'form',
|
|
|
+ params: {
|
|
|
+ paramNames:
|
|
|
+ 'payment_service_provider,contract_sign,multi_user_limit,qr_code_expire_time'
|
|
|
+ }
|
|
|
+ }
|
|
|
+ );
|
|
|
+ if (data && Array.isArray(data)) {
|
|
|
+ data.forEach((item: any) => {
|
|
|
+ if (item.paramName === 'contract_sign') {
|
|
|
+ forms.contract_sign = item.paramValue === '1' ? true : false;
|
|
|
+ } else if (item.paramName === 'payment_service_provider') {
|
|
|
+ forms.paymentType = item.paramValue || '';
|
|
|
+ } else if (item.paramName === 'multi_user_limit') {
|
|
|
+ forms.multi_user_limit = item.paramValue
|
|
|
+ ? Number(item.paramValue)
|
|
|
+ : 1;
|
|
|
+ } else if (item.paramName === 'qr_code_expire_time') {
|
|
|
+ expireDay = item.paramValue ? Number(item.paramValue) : null;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ const createT = route.query.t;
|
|
|
+ if (createT && expireDay !== null) {
|
|
|
+ if (dayjs(Number(createT)).add(expireDay, 'day').isBefore(dayjs())) {
|
|
|
+ forms.showTips = true;
|
|
|
+ forms.showMessage = '二维码已经失效,详情请咨询学校老师';
|
|
|
+ forms.showButton = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ await getRegisterGoods();
|
|
|
+ } catch {}
|
|
|
+ });
|
|
|
+
|
|
|
+ onUnmounted(() => {
|
|
|
+ forms.intervalFnRef?.pause(); // 暂停回调
|
|
|
+ });
|
|
|
+
|
|
|
+ return () => (
|
|
|
+ <div class={styles['student-register']}>
|
|
|
+ <div class={styles.studentRegisterContainer}>
|
|
|
+ {!forms.activeOverStatus && (
|
|
|
+ <div class={styles.countdownSection}>
|
|
|
+ <div class={styles.timer}>
|
|
|
+ <img src={icon3} class={styles.timerTitle} />
|
|
|
+ <div class={styles.timerAll}>
|
|
|
+ <span>{formatTimerTo(overCountDown.current.value.days)}</span>
|
|
|
+ 天
|
|
|
+ <span>
|
|
|
+ {formatTimerTo(overCountDown.current.value.hours)}
|
|
|
+ </span>
|
|
|
+ 时
|
|
|
+ <span>
|
|
|
+ {formatTimerTo(overCountDown.current.value.minutes)}
|
|
|
+ </span>
|
|
|
+ 分
|
|
|
+ <span>
|
|
|
+ {formatTimerTo(overCountDown.current.value.seconds)}
|
|
|
+ </span>
|
|
|
+ 秒
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class={styles.timerTip}>
|
|
|
+ 为了确保您能顺利参与学习,请在规定时间内报名
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.studentSection,
|
|
|
+ styles.studentSectionForm,
|
|
|
+ styles.noSendDay
|
|
|
+ ]}>
|
|
|
+ {/* <div class={styles.title1}></div> */}
|
|
|
+
|
|
|
+ <Form labelAlign="left" class={styles.registerForm}>
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ label="联系方式(直接监护人)"
|
|
|
+ placeholder="请输入手机号码"
|
|
|
+ type="tel"
|
|
|
+ required
|
|
|
+ autocomplete="off"
|
|
|
+ inputAlign="right"
|
|
|
+ class={styles.username}
|
|
|
+ v-model={studentInfo.username}
|
|
|
+ border={false}
|
|
|
+ maxlength={11}
|
|
|
+ onUpdate:modelValue={() => {
|
|
|
+ phoneChangeEmptyInfo();
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ label: () => (
|
|
|
+ <div>
|
|
|
+ 联系方式
|
|
|
+ {/* (直接监护人) */}
|
|
|
+ <p class={styles.tips}>(直接监护人)</p>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Field>
|
|
|
+ <div class={['van-hairline--bottom', styles.fieldTipsGroup]}>
|
|
|
+ <div class={[styles.fieldTips]}>
|
|
|
+ <i class={styles.iconQuestion}></i>
|
|
|
+ 手机号是音乐数字课堂的唯一登录账户
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <Field
|
|
|
+ center
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="验证码"
|
|
|
+ placeholder="请输入验证码"
|
|
|
+ autocomplete="off"
|
|
|
+ type="number"
|
|
|
+ v-model={studentInfo.password}
|
|
|
+ maxlength={6}
|
|
|
+ onUpdate:modelValue={(val: any) => {
|
|
|
+ getUserInfos();
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ button: () =>
|
|
|
+ forms.countDownStatus ? (
|
|
|
+ <span
|
|
|
+ class={[
|
|
|
+ styles.codeText,
|
|
|
+ !validatePhone.value ? styles.codeTextDisabled : ''
|
|
|
+ ]}
|
|
|
+ onClick={onSendCode}>
|
|
|
+ 获取验证码
|
|
|
+ </span>
|
|
|
+ ) : (
|
|
|
+ <CountDown
|
|
|
+ ref={(el: any) => (countDownRef.value = el)}
|
|
|
+ auto-start={false}
|
|
|
+ class={styles.countDown}
|
|
|
+ time={forms.countDownTime}
|
|
|
+ onFinish={onFinished}
|
|
|
+ format="ss秒后重试"
|
|
|
+ />
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Field>
|
|
|
+ {/* 大于等于2,则可以切换学生 */}
|
|
|
+ {/* {forms.studentList.length > 1 && (
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.selectStudentGroup,
|
|
|
+ forms.showSelectStudent && styles.selectStudentGroupChecked
|
|
|
+ ]}
|
|
|
+ onClick={() => (forms.showSelectStudent = true)}>
|
|
|
+ <i
|
|
|
+ class={[
|
|
|
+ styles.studentIcon,
|
|
|
+ !forms.studentItem.userId && styles.studentIconAdd
|
|
|
+ ]}></i>
|
|
|
+ <span>
|
|
|
+ {forms.studentItem.userId
|
|
|
+ ? forms.studentItem.nickname
|
|
|
+ : '新增学生'}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ )} */}
|
|
|
+
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="学生姓名"
|
|
|
+ placeholder="请输入学生姓名"
|
|
|
+ autocomplete="off"
|
|
|
+ maxlength={14}
|
|
|
+ v-model={studentInfo.extra.nickname}>
|
|
|
+ {{
|
|
|
+ extra: () =>
|
|
|
+ forms.studentList.length > 1 && (
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.selectStudentGroup,
|
|
|
+ forms.showSelectStudent &&
|
|
|
+ styles.selectStudentGroupChecked
|
|
|
+ ]}
|
|
|
+ onClick={() => (forms.showSelectStudent = true)}>
|
|
|
+ <span>
|
|
|
+ {forms.studentItem.userId ? '切换' : '新增'}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Field>
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="学生性别"
|
|
|
+ placeholder="请选择性别"
|
|
|
+ autocomplete="off"
|
|
|
+ // v-model={studentInfo.extra.nickname}
|
|
|
+ >
|
|
|
+ {{
|
|
|
+ input: () => (
|
|
|
+ <RadioGroup
|
|
|
+ checked-color="linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)"
|
|
|
+ v-model={studentInfo.extra.gender}
|
|
|
+ direction="horizontal">
|
|
|
+ <Tag
|
|
|
+ size="large"
|
|
|
+ type="primary"
|
|
|
+ color={
|
|
|
+ !(studentInfo.extra.gender === 1)
|
|
|
+ ? '#F5F6FA'
|
|
|
+ : 'linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)'
|
|
|
+ }
|
|
|
+ textColor={
|
|
|
+ !(studentInfo.extra.gender === 1) ? '#626264' : '#fff'
|
|
|
+ }
|
|
|
+ class={styles.radioSection}>
|
|
|
+ <Radio class={styles.radioItem} name={1}></Radio>男
|
|
|
+ </Tag>
|
|
|
+ <Tag
|
|
|
+ size="large"
|
|
|
+ type="primary"
|
|
|
+ color={
|
|
|
+ !(studentInfo.extra.gender === 0)
|
|
|
+ ? '#F5F6FA'
|
|
|
+ : 'linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)'
|
|
|
+ }
|
|
|
+ textColor={
|
|
|
+ !(studentInfo.extra.gender === 0) ? '#626264' : '#fff'
|
|
|
+ }
|
|
|
+ class={styles.radioSection}>
|
|
|
+ <Radio class={styles.radioItem} name={0}></Radio>女
|
|
|
+ </Tag>
|
|
|
+ </RadioGroup>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Field>
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="所在年级"
|
|
|
+ placeholder="请选择年级"
|
|
|
+ isLink
|
|
|
+ readonly
|
|
|
+ clickable={false}
|
|
|
+ modelValue={forms.gradeNumText}
|
|
|
+ onClick={() => {
|
|
|
+ forms.gradePopupIndex = [studentInfo.extra.currentGradeNum];
|
|
|
+ forms.gradeStatus = true;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ <Field
|
|
|
+ clearable={false}
|
|
|
+ required
|
|
|
+ inputAlign="right"
|
|
|
+ label="所在班级"
|
|
|
+ placeholder="请选择班级"
|
|
|
+ isLink
|
|
|
+ readonly
|
|
|
+ clickable={false}
|
|
|
+ modelValue={forms.currentClassText}
|
|
|
+ onClick={() => {
|
|
|
+ if (
|
|
|
+ forms.schoolInstrumentSetType === 'CLASS' &&
|
|
|
+ forms.classList.length <= 0
|
|
|
+ ) {
|
|
|
+ showToast('请先选择年级');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ forms.classPopupIndex = [studentInfo.extra.currentClass];
|
|
|
+ forms.classStatus = true;
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ {/* {forms.giftVipDay > 0 ? (
|
|
|
+ <div class={styles.memberNumer}>
|
|
|
+ <img src={iconGift} class={styles.iconGift} />
|
|
|
+
|
|
|
+ <p>
|
|
|
+ 注册成功即可获得乐器AI学练工具
|
|
|
+ <span>{forms.giftVipDay || 0}</span>天有效期
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ ''
|
|
|
+ )} */}
|
|
|
+ </Form>
|
|
|
+ </div>
|
|
|
+ {/* <div class={styles.studentSection}>
|
|
|
+ <div class={styles.title2}></div>
|
|
|
+
|
|
|
+ <div class={styles.goodsGroup}>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.goodsItem,
|
|
|
+ styles.digitalize,
|
|
|
+ forms.joinType === 'digitalize' && styles.checked
|
|
|
+ ]}
|
|
|
+ onClick={() => {
|
|
|
+ //
|
|
|
+ if (checkForm()) {
|
|
|
+ showToast('请将资料填写完整');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ forms.joinType = 'digitalize';
|
|
|
+ nextTick(() => {
|
|
|
+ mstickyRef.value?.onChnageHeight();
|
|
|
+ setTimeout(() => {
|
|
|
+ window.scrollTo(0, 1000);
|
|
|
+ }, 50);
|
|
|
+ });
|
|
|
+ }}>
|
|
|
+ <div class={styles.goodsInner}>
|
|
|
+ <i class={styles.proposalTip}></i>
|
|
|
+ 数字化方式
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class={[
|
|
|
+ styles.goodsItem,
|
|
|
+ styles.tradition,
|
|
|
+ forms.joinType === 'tradition' && styles.checked1
|
|
|
+ ]}
|
|
|
+ onClick={() => {
|
|
|
+ if (checkForm()) {
|
|
|
+ showToast('请将资料填写完整');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ forms.joinType = 'tradition';
|
|
|
+ nextTick(() => {
|
|
|
+ mstickyRef.value?.onChnageHeight();
|
|
|
+ setTimeout(() => {
|
|
|
+ window.scrollTo(0, 1000);
|
|
|
+ }, 50);
|
|
|
+ });
|
|
|
+ }}>
|
|
|
+ <div class={styles.goodsInner}>传统方式</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div> */}
|
|
|
+
|
|
|
+ <div class={[styles.goodsExtra]}>
|
|
|
+ {/* <i class={styles.iconArrow}></i> */}
|
|
|
+ <Cell
|
|
|
+ border={false}
|
|
|
+ class={styles.goodsCell}
|
|
|
+ center
|
|
|
+ onClick={() => {
|
|
|
+ // console.log(forms.joinType, 'joinType');
|
|
|
+ if (forms.joinType === 'digitalize') {
|
|
|
+ otherParams.showOtherMessage = `没有陪练工具,将无法实现同步练习`;
|
|
|
+ otherParams.showOtherSchool = true;
|
|
|
+ otherParams.showCloseButton = true;
|
|
|
+ otherParams.showCancelButton = true;
|
|
|
+ otherParams.cancelButtonColor = '';
|
|
|
+ otherParams.cancelButtonText = '确认取消';
|
|
|
+ otherParams.confirmButtonColor = '';
|
|
|
+ otherParams.confirmButtonText = '放弃取消';
|
|
|
+ otherParams.otherType = 'payment';
|
|
|
+ otherParams.messageAlign = 'center';
|
|
|
+ } else if (forms.joinType === 'tradition') {
|
|
|
+ forms.joinType = 'digitalize';
|
|
|
+ }
|
|
|
+ }}>
|
|
|
+ {{
|
|
|
+ icon: () => (
|
|
|
+ <div class={styles.checkedGroup}>
|
|
|
+ <i
|
|
|
+ class={[
|
|
|
+ styles.iconChecked,
|
|
|
+ forms.joinType === 'digitalize' && styles.selected
|
|
|
+ ]}></i>
|
|
|
+
|
|
|
+ {/* {forms.tipStatus && <i class={styles.showBg}></i>} */}
|
|
|
+ {forms.joinType === 'digitalize' && (
|
|
|
+ <i class={styles.showBg}></i>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ ),
|
|
|
+ title: () => (
|
|
|
+ <div class={styles.section}>
|
|
|
+ <Image
|
|
|
+ class={styles.img}
|
|
|
+ src={forms.detailVip.goodsUrl || tuangou}
|
|
|
+ />
|
|
|
+ <div class={styles.sectionContent}>
|
|
|
+ <img src={icon5} class={styles.goodsName} />
|
|
|
+ {/* <h2>
|
|
|
+
|
|
|
+ <img src={icon5} class={styles.goodsName} />
|
|
|
+ </h2>
|
|
|
+ <p class={[styles.model]}>
|
|
|
+
|
|
|
+ <p>
|
|
|
+ <i></i>解决学生不会练、不知练的对错
|
|
|
+ </p>
|
|
|
+ <p>
|
|
|
+ <i></i>家长无法辅导、无需再额外请老师
|
|
|
+ </p>
|
|
|
+ </p>
|
|
|
+
|
|
|
+ <img src={icon6} class={styles.sendInstrument} /> */}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ }}
|
|
|
+ </Cell>
|
|
|
+
|
|
|
+ {/* {forms.detailVip.membershipDays ? (
|
|
|
+ <div class={styles.memberNumer}>
|
|
|
+ <img src={iconGift} class={styles.iconGift} />
|
|
|
+ <p>
|
|
|
+ 现在购买赠送乐器AI学练工具
|
|
|
+ <span>{forms.detailVip.membershipDays || 0}</span>天有效期
|
|
|
+ </p>
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ ''
|
|
|
+ )} */}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* {forms.joinType === 'tradition' && (
|
|
|
+ <div class={styles.goodsTradition}>
|
|
|
+ <i class={styles.iconArrow}></i>
|
|
|
+
|
|
|
+ <div class={styles.goodsTitle}></div>
|
|
|
+ <div class={styles.steps}>
|
|
|
+ <div class={styles.step}>
|
|
|
+ <span class={styles.nums}>
|
|
|
+ <span class={styles.numInner}>1</span>
|
|
|
+ </span>
|
|
|
+ <div class={styles.stepContent}>
|
|
|
+ <span>AI工具标准:</span>
|
|
|
+ 可以学练音乐教材中的乐曲,通过手机应用商店准备。
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ {['Panpipes', 'Ocarina', 'Tenor Recorder', 'Woodwind'].includes(
|
|
|
+ forms.instrumentCode
|
|
|
+ ) && (
|
|
|
+ <div class={styles.step}>
|
|
|
+ <span class={styles.nums}>
|
|
|
+ <span class={styles.numInner}>2</span>
|
|
|
+ </span>
|
|
|
+ <div class={styles.stepContent}>
|
|
|
+ <span>
|
|
|
+ {forms.instrumentCode === 'Panpipes' && '排箫'}
|
|
|
+ {forms.instrumentCode === 'Ocarina' && '陶笛'}
|
|
|
+ {forms.instrumentCode === 'Tenor Recorder' && '竖笛'}
|
|
|
+ {forms.instrumentCode === 'Woodwind' && '葫芦丝'}
|
|
|
+ 标准:
|
|
|
+ </span>
|
|
|
+ {forms.instrumentCode === 'Panpipes' &&
|
|
|
+ '管数不限,建议20管以上C调加嘴排箫(不需要重复更换),黑色,选择单一原调(调性多很难掌握);'}
|
|
|
+ {forms.instrumentCode === 'Ocarina' &&
|
|
|
+ 'C调、蓝色、十二孔高音、树脂或陶土均可;'}
|
|
|
+ {forms.instrumentCode === 'Tenor Recorder' &&
|
|
|
+ 'C调、木质、高音德式八孔;'}
|
|
|
+ {forms.instrumentCode === 'Woodwind' &&
|
|
|
+ 'C调、红木色、树脂或木质;'}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )} */}
|
|
|
+
|
|
|
+ {forms.joinType && (
|
|
|
+ <MSticky position="bottom" ref={mstickyRef}>
|
|
|
+ <div class={styles.paymentContainer}>
|
|
|
+ <div class={styles.payemntPrice}>
|
|
|
+ {/* <img src={giftTip} class={styles.giftTip} /> */}
|
|
|
+ <div>
|
|
|
+ <span class={styles.needPrice}>
|
|
|
+ <i style="font-style: normal">¥ </i>
|
|
|
+ <span>{moneyFormat(calcPrice.value.amount)}</span>
|
|
|
+ <i class={styles.unit} style="font-style: normal">
|
|
|
+ /年
|
|
|
+ </i>
|
|
|
+ </span>
|
|
|
+ {calcPrice.value.originAmount > calcPrice.value.amount &&
|
|
|
+ forms.joinType === 'digitalize' ? (
|
|
|
+ <del class={styles.allPrice}>
|
|
|
+ ¥ {moneyFormat(calcPrice.value.originAmount)}
|
|
|
+ </del>
|
|
|
+ ) : (
|
|
|
+ ''
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ class={styles.paymentBtn}
|
|
|
+ onClick={() => {
|
|
|
+ onSubmit();
|
|
|
+ }}>
|
|
|
+ <Button
|
|
|
+ round
|
|
|
+ disabled={forms.submitLoading}
|
|
|
+ loading={forms.submitLoading}>
|
|
|
+ {forms.joinType === 'digitalize'
|
|
|
+ ? '报名与支付'
|
|
|
+ : '提交报名'}
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* {forms.joinType === 'tradition' && (
|
|
|
+ <div
|
|
|
+ class={styles.traditionBtn}
|
|
|
+ onClick={() => {
|
|
|
+ onSubmit();
|
|
|
+ }}>
|
|
|
+ <Button
|
|
|
+ round
|
|
|
+ disabled={forms.submitLoading}
|
|
|
+ loading={forms.submitLoading}>
|
|
|
+ 提交报名
|
|
|
+ </Button>
|
|
|
+ </div>
|
|
|
+ )} */}
|
|
|
+ </div>
|
|
|
+ </MSticky>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {forms.imgCodeStatus ? (
|
|
|
+ <MImgCode
|
|
|
+ v-model:value={forms.imgCodeStatus}
|
|
|
+ phone={studentInfo.username}
|
|
|
+ type="REGISTER"
|
|
|
+ onClose={() => {
|
|
|
+ forms.imgCodeStatus = false;
|
|
|
+ }}
|
|
|
+ onSendCode={onCodeSend}
|
|
|
+ />
|
|
|
+ ) : null}
|
|
|
+
|
|
|
+ {/* 年级 */}
|
|
|
+ <Popup
|
|
|
+ v-model:show={forms.gradeStatus}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ safeAreaInsetBottom
|
|
|
+ lazyRender={false}
|
|
|
+ class={'popupBottomSearch'}
|
|
|
+ onOpen={() => {
|
|
|
+ forms.gradePopupShow = true;
|
|
|
+ }}
|
|
|
+ onClosed={() => {
|
|
|
+ forms.gradePopupShow = false;
|
|
|
+ }}>
|
|
|
+ {forms.gradePopupShow && (
|
|
|
+ <Picker
|
|
|
+ showToolbar
|
|
|
+ v-model={forms.gradePopupIndex}
|
|
|
+ columns={forms.gradeList}
|
|
|
+ onCancel={() => (forms.gradeStatus = false)}
|
|
|
+ onConfirm={(val: any) => {
|
|
|
+ const selectedOption = val.selectedOptions[0];
|
|
|
+ studentInfo.extra.currentGradeNum = selectedOption.value;
|
|
|
+ forms.gradeNumText = selectedOption.text;
|
|
|
+ forms.gradeStatus = false;
|
|
|
+ if (
|
|
|
+ ['SCHOOL', 'GRADE'].includes(forms.schoolInstrumentSetType)
|
|
|
+ ) {
|
|
|
+ forms.instrumentCode = selectedOption.instrumentCode;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (forms.schoolInstrumentSetType === 'CLASS') {
|
|
|
+ forms.classList = selectedOption.classList;
|
|
|
+ }
|
|
|
+ if (
|
|
|
+ ['CLASS', 'GRADE'].includes(forms.schoolInstrumentSetType)
|
|
|
+ ) {
|
|
|
+ forms.currentClassText = '';
|
|
|
+ studentInfo.extra.currentClass = '';
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </Popup>
|
|
|
+ {/* 班级 */}
|
|
|
+ <Popup
|
|
|
+ v-model:show={forms.classStatus}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ class={'popupBottomSearch'}
|
|
|
+ onOpen={() => {
|
|
|
+ forms.classPopupShow = true;
|
|
|
+ }}
|
|
|
+ onClosed={() => {
|
|
|
+ forms.classPopupShow = false;
|
|
|
+ }}>
|
|
|
+ {forms.classPopupShow && (
|
|
|
+ <Picker
|
|
|
+ showToolbar
|
|
|
+ v-model={forms.classPopupIndex}
|
|
|
+ columns={forms.classList}
|
|
|
+ onCancel={() => (forms.classStatus = false)}
|
|
|
+ onConfirm={(val: any) => {
|
|
|
+ const selectedOption = val.selectedOptions[0];
|
|
|
+ studentInfo.extra.currentClass = selectedOption.value;
|
|
|
+ forms.currentClassText = selectedOption.text;
|
|
|
+ forms.classStatus = false;
|
|
|
+ if (['CLASS'].includes(forms.schoolInstrumentSetType)) {
|
|
|
+ forms.instrumentCode = selectedOption.instrumentCode;
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+ {/* 已经购买过样品 */}
|
|
|
+ {/* <MDialog
|
|
|
+ title="提示"
|
|
|
+ v-model:show={forms.dialogConfirmStatus}
|
|
|
+ message={'已购买会员,是否确认购买?'}
|
|
|
+ primaryColor="#FF8057"
|
|
|
+ allowHtml={true}
|
|
|
+ confirmButtonText="确定"
|
|
|
+ showCancelButton
|
|
|
+ onConfirm={async () => {
|
|
|
+ await paymentContinue();
|
|
|
+ }}
|
|
|
+ onCancel={() => {
|
|
|
+ //取消支付,判断是否有结束时间,是否已经结束
|
|
|
+ if (forms.registerExpireTime && forms.activeOverStatus) {
|
|
|
+ applyOver();
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ /> */}
|
|
|
+
|
|
|
+ <MDialog
|
|
|
+ title="提示"
|
|
|
+ v-model:show={forms.dialogStatus}
|
|
|
+ message={forms.dialogMessage}
|
|
|
+ allowHtml={true}
|
|
|
+ primaryColor="#FF8057"
|
|
|
+ showCancelButton={true}
|
|
|
+ messageAlign={forms.messageAlign}
|
|
|
+ confirmButtonText={forms.confirmButtonText}
|
|
|
+ cancelButtonText={forms.cancelButtonText}
|
|
|
+ onConfirm={async () => {
|
|
|
+ if (forms.joinType === 'tradition') {
|
|
|
+ //
|
|
|
+ await cancelPaymentOrder();
|
|
|
+ //取消支付,判断是否有结束时间,是否已经结束
|
|
|
+ if (forms.registerExpireTime && forms.activeOverStatus) {
|
|
|
+ applyOver();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (forms.joinType === 'digitalize') {
|
|
|
+ // 继续支付
|
|
|
+ const paymentConfig = forms.dialogConfig;
|
|
|
+ state.config = paymentConfig?.paymentConfig;
|
|
|
+ state.orderNo = paymentConfig?.orderNo;
|
|
|
+
|
|
|
+ const updateStatus = await updateStudentInfo();
|
|
|
+ if (!updateStatus) return;
|
|
|
+ await lastSubmit();
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ onCancel={(val: any) => {
|
|
|
+ // countDown.pause();
|
|
|
+
|
|
|
+ if (forms.joinType === 'tradition') {
|
|
|
+ forms.dialogStatus = false;
|
|
|
+
|
|
|
+ //取消支付,判断是否有结束时间,是否已经结束
|
|
|
+ if (forms.registerExpireTime && forms.activeOverStatus) {
|
|
|
+ applyOver();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (forms.joinType === 'digitalize') {
|
|
|
+ // 重新下单 - 先关闭订单
|
|
|
+ resetOrderPayment();
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />
|
|
|
+
|
|
|
+ <Popup
|
|
|
+ show={state.paymentStatus}
|
|
|
+ closeOnClickOverlay={false}
|
|
|
+ position="bottom"
|
|
|
+ round
|
|
|
+ closeOnPopstate
|
|
|
+ safeAreaInsetBottom
|
|
|
+ style={{ minHeight: '30%' }}>
|
|
|
+ <Payment
|
|
|
+ paymentConfig={state.orderInfo}
|
|
|
+ onClose={() => (state.paymentStatus = false)}
|
|
|
+ onBackOut={onBackOut}
|
|
|
+ onConfirm={(val: any) => onConfirm(val)}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+ <Popup
|
|
|
+ v-model:show={state.showQrcode}
|
|
|
+ round
|
|
|
+ onClose={() => {
|
|
|
+ // 二维码关闭时清除定时器
|
|
|
+ clearInterval(state.orderTimer);
|
|
|
+ }}>
|
|
|
+ <QrcodePayment
|
|
|
+ url={state.qrCodeUrl}
|
|
|
+ pay_channel={state.pay_channel}
|
|
|
+ orderType={orderType.value}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+
|
|
|
+ <MPopup v-model:modelValue={state.authShow}>
|
|
|
+ <UserAuth onSuccess={onAuthSuccess} hideHeader={!browser().isApp} />
|
|
|
+ </MPopup>
|
|
|
+
|
|
|
+ {/* 是否在微信中打开 */}
|
|
|
+ <OWxTip
|
|
|
+ show={forms.showTips}
|
|
|
+ message={forms.showMessage}
|
|
|
+ showButton={forms.showButton}
|
|
|
+ buttonText="刷新"
|
|
|
+ onConfirm={() => window.location.reload()}
|
|
|
+ />
|
|
|
+
|
|
|
+ <MMessageTip
|
|
|
+ show={otherParams.showOtherSchool}
|
|
|
+ // showCloseButton={otherParams.showCloseButton}
|
|
|
+ messageAlign={otherParams.messageAlign}
|
|
|
+ message={otherParams.showOtherMessage}
|
|
|
+ showCancelButton={otherParams.showCancelButton}
|
|
|
+ cancelButtonColor={otherParams.cancelButtonColor}
|
|
|
+ cancelButtonText={otherParams.cancelButtonText}
|
|
|
+ confirmButtonColor={otherParams.confirmButtonColor}
|
|
|
+ confirmButtonText={otherParams.confirmButtonText}
|
|
|
+ onClose={() => (otherParams.showOtherSchool = false)}
|
|
|
+ onCancel={async () => {
|
|
|
+ otherParams.showOtherSchool = false;
|
|
|
+ if (otherParams.otherType === 'nickname') {
|
|
|
+ forms.isRegister = 'create'; // 新建
|
|
|
+ changeTipStatus(false, false);
|
|
|
+ onSubmit();
|
|
|
+ } else if (otherParams.otherType === 'member') {
|
|
|
+ const updateStatus = await updateStudentInfo();
|
|
|
+ if (!updateStatus) return;
|
|
|
+ //取消支付,判断是否有结束时间,是否已经结束
|
|
|
+ if (forms.registerExpireTime && forms.activeOverStatus) {
|
|
|
+ applyOver();
|
|
|
+ }
|
|
|
+ } else if (otherParams.otherType === 'payment') {
|
|
|
+ forms.joinType = 'tradition';
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ onConfirm={async () => {
|
|
|
+ otherParams.showOtherSchool = false;
|
|
|
+ // 名字
|
|
|
+ if (otherParams.otherType === 'nickname') {
|
|
|
+ forms.isRegister = 'update'; // 修改
|
|
|
+ changeTipStatus(false, false);
|
|
|
+ // 直接注册
|
|
|
+ onSubmit();
|
|
|
+ } else if (otherParams.otherType === 'change') {
|
|
|
+ // 学校更换
|
|
|
+ forms.isChangeSchool = true;
|
|
|
+ // 直接注册
|
|
|
+ onSubmit();
|
|
|
+ } else if (otherParams.otherType === 'limit') {
|
|
|
+ // 人数超限制
|
|
|
+ changeTipStatus(
|
|
|
+ forms.isRegister === 'create' && !forms.studentItem.userId
|
|
|
+ ? false
|
|
|
+ : true,
|
|
|
+ false
|
|
|
+ );
|
|
|
+ } else if (otherParams.otherType === 'member') {
|
|
|
+ await paymentContinue();
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />
|
|
|
+
|
|
|
+ <Popup
|
|
|
+ v-model:show={forms.showSelectStudent}
|
|
|
+ round
|
|
|
+ position="bottom"
|
|
|
+ safeAreaInsetBottom
|
|
|
+ closeable>
|
|
|
+ <SelectStudent
|
|
|
+ studentItem={forms.studentItem}
|
|
|
+ list={forms.studentList}
|
|
|
+ onClose={() => (forms.showSelectStudent = false)}
|
|
|
+ onConfirm={(val: any) => {
|
|
|
+ if (val.userId) {
|
|
|
+ forms.studentItem = val;
|
|
|
+ const firstStudent = val;
|
|
|
+ studentInfo.extra.nickname = firstStudent.nickname;
|
|
|
+ const tempGrade: any = forms.gradeList || [];
|
|
|
+
|
|
|
+ studentInfo.extra.currentGradeNum = null;
|
|
|
+ forms.gradeNumText = '';
|
|
|
+ forms.instrumentCode = '';
|
|
|
+
|
|
|
+ tempGrade?.forEach((i: any) => {
|
|
|
+ if (i.value === firstStudent.currentGradeNum) {
|
|
|
+ forms.instrumentCode = i.instrumentCode;
|
|
|
+ forms.gradeNumText = i.text;
|
|
|
+ studentInfo.extra.currentGradeNum =
|
|
|
+ firstStudent.currentGradeNum;
|
|
|
+ if (forms.schoolInstrumentSetType === 'CLASS') {
|
|
|
+ forms.classList = i.classList;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ studentInfo.extra.currentClass = null;
|
|
|
+ forms.currentClassText = '';
|
|
|
+
|
|
|
+ forms.classList.forEach((i: any) => {
|
|
|
+ if (i.value === firstStudent.currentClass) {
|
|
|
+ forms.currentClassText = i.text;
|
|
|
+ studentInfo.extra.currentClass = firstStudent.currentClass;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ studentInfo.extra.gender = firstStudent.gender;
|
|
|
+ forms.isRegister = 'update';
|
|
|
+ changeTipStatus(true, false);
|
|
|
+
|
|
|
+ forms.showSelectStudent = false;
|
|
|
+ } else {
|
|
|
+ // 判断新建学员是否上限了
|
|
|
+ if (forms.studentList.length >= forms.multi_user_limit) {
|
|
|
+ otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
|
|
|
+ otherParams.showOtherSchool = true;
|
|
|
+ otherParams.showCancelButton = false;
|
|
|
+ otherParams.showCloseButton = true;
|
|
|
+ otherParams.confirmButtonColor =
|
|
|
+ 'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
|
|
|
+ otherParams.confirmButtonText = '我知道了';
|
|
|
+ otherParams.otherType = 'limit';
|
|
|
+ otherParams.messageAlign = 'center';
|
|
|
+ return true;
|
|
|
+ } else {
|
|
|
+ forms.studentItem = val;
|
|
|
+ forms.isRegister = 'create';
|
|
|
+ changeTipStatus(false, false);
|
|
|
+ studentInfo.extra.nickname = '';
|
|
|
+ studentInfo.extra.currentGradeNum = '';
|
|
|
+ studentInfo.extra.currentClass = '';
|
|
|
+ studentInfo.extra.gender = 1;
|
|
|
+ forms.currentClassText = '';
|
|
|
+ forms.gradeNumText = '';
|
|
|
+ forms.showSelectStudent = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }}
|
|
|
+ />
|
|
|
+ </Popup>
|
|
|
+ </div>
|
|
|
+ );
|
|
|
+ }
|
|
|
+});
|