index.tsx 72 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119
  1. import {
  2. Image,
  3. Cell,
  4. Tag,
  5. Button,
  6. Popup,
  7. showToast,
  8. Form,
  9. Field,
  10. CountDown,
  11. RadioGroup,
  12. Radio,
  13. Picker,
  14. closeToast
  15. } from 'vant';
  16. import {
  17. computed,
  18. defineComponent,
  19. nextTick,
  20. onMounted,
  21. onUnmounted,
  22. reactive,
  23. ref
  24. } from 'vue';
  25. import qs from 'query-string';
  26. import {
  27. state as baseState,
  28. goWechatAuth,
  29. setLogin,
  30. setLoginInit
  31. } from '@/state';
  32. import styles from './index.module.less';
  33. import MSticky from '@/components/m-sticky';
  34. // import MVideo from '@/components/m-video';
  35. import { useRoute, useRouter } from 'vue-router';
  36. import { useStudentRegisterStore } from '@/store/modules/student-register-store';
  37. import request from '@/helpers/request';
  38. import requestStudent from './request';
  39. import { browser, checkPhone, getUrlCode, moneyFormat } from '@/helpers/utils';
  40. import deepClone from '@/helpers/deep-clone';
  41. import OWxTip from '@/components/m-wx-tip';
  42. import MDialog from '@/components/m-dialog';
  43. // import f1 from './images/new/f-1.png';
  44. // import f2 from './images/new/f-2.png';
  45. // import f3 from './images/new/f-3.png';
  46. // import iconTip2 from './images/new/icon-tip2.png';
  47. // import functionBg from './images/new/function-bg.png';
  48. import tuangou from './images/new/tuangou.png';
  49. import icon3 from './images/new/icon-3.png';
  50. import icon5 from './images/new/icon-5.png';
  51. import icon6 from './images/new/icon-6.png';
  52. import giftTip from './images/new/icon-4.png';
  53. import iconGift from './images/new/icon-gift.png';
  54. import dayjs from 'dayjs';
  55. // import MMessageTip from '@/components/m-message-tip';
  56. import { CurrentTime, useCountDown } from '@vant/use';
  57. import Payment from '../adapay/payment';
  58. import QrcodePayment from './qrcode-payment';
  59. import MImgCode from '@/components/m-img-code';
  60. import { beforeSubmit } from './order-state';
  61. import { useInterval, useIntervalFn } from '@vueuse/core';
  62. import MPopup from '@/components/m-popup';
  63. import UserAuth from './component/user-auth';
  64. import MMessageTip from '@/components/m-message-tip';
  65. import SelectStudent from './modal/select-student';
  66. const classList: any = [];
  67. for (let i = 1; i <= 40; i++) {
  68. classList.push({ text: i + '班', value: i });
  69. }
  70. const GRADE_ENUM = {
  71. '1': '一年级',
  72. '2': '二年级',
  73. '3': '三年级',
  74. '4': '四年级',
  75. '5': '五年级',
  76. '6': '六年级',
  77. '7': '七年级',
  78. '8': '八年级',
  79. '9': '九年级'
  80. } as any;
  81. const getGradeList = (gradeYear: string, instrumentCode?: string) => {
  82. let tempList: any = [];
  83. const five = [
  84. { text: '一年级', value: 1, instrumentCode },
  85. { text: '二年级', value: 2, instrumentCode },
  86. { text: '三年级', value: 3, instrumentCode },
  87. { text: '四年级', value: 4, instrumentCode },
  88. { text: '五年级', value: 5, instrumentCode }
  89. ];
  90. const one = [{ text: '六年级', value: 6, instrumentCode }];
  91. const three = [
  92. { text: '七年级', value: 7, instrumentCode },
  93. { text: '八年级', value: 8, instrumentCode },
  94. { text: '九年级', value: 9, instrumentCode }
  95. ];
  96. if (gradeYear === 'FIVE_YEAR_SYSTEM') {
  97. tempList.push(...[...five]);
  98. } else if (gradeYear === 'SIX_YEAR_SYSTEM') {
  99. tempList.push(...[...five, ...one]);
  100. } else if (gradeYear === 'THREE_YEAR_SYSTEM') {
  101. tempList.push(...[...three]);
  102. } else if (gradeYear === 'FORE_YEAR_SYSTEM') {
  103. tempList.push(...[...one, ...three]);
  104. } else {
  105. tempList.push(...[...five, ...one, ...three]);
  106. }
  107. return tempList;
  108. };
  109. export default defineComponent({
  110. name: 'student-register',
  111. setup() {
  112. const route = useRoute();
  113. const studentRegisterStore = useStudentRegisterStore();
  114. const router = useRouter();
  115. // 初始化学校编号
  116. studentRegisterStore.setShoolId(route.query.sId as any);
  117. const countDownRef = ref();
  118. const mstickyRef = ref();
  119. const forms = reactive({
  120. schoolId: route.query.sId as any,
  121. paymentType: '', // 支付类型
  122. multi_user_limit: 1, // 限制注册学生数量
  123. // popupShow: false,
  124. registerDetails: {} as any,
  125. details: [] as any[],
  126. // schoolType: '', // 学校类型
  127. gradeYear: '', // 学制
  128. schoolInstrumentSetType: null as any,
  129. // bugGoods: false, // 是否购买AI
  130. isRegister: 'create' as 'create' | 'update' | '', // 是否注册学生
  131. isTipRegister: true, // 是否显示名字不一致 - 默认显示
  132. isChangeSchool: false, // 是否切换学校
  133. registerType: '', // 报名类型
  134. detailVip: {} as any,
  135. giftVipDay: 0, // 赠送天数
  136. submitLoading: false,
  137. // showMore: true,
  138. showTips: false,
  139. showButton: false,
  140. showMessage: '请使用微信扫描二维码',
  141. countDownStatus: true,
  142. countDownTime: 1000 * 120, // 倒计时时间
  143. // modelValue: false, // 是否选中协议
  144. imgCodeStatus: false,
  145. gradeNumText: '',
  146. currentClassText: '',
  147. gradeStatus: false,
  148. classStatus: false,
  149. loading: false,
  150. dialogStatus: false,
  151. dialogMessage: '',
  152. confirmButtonText: '确定',
  153. cancelButtonText: '取消',
  154. messageAlign: 'center' as 'left' | 'center' | 'right',
  155. dialogConfirmStatus: false,
  156. contract_sign: false, // 是否实名认证
  157. countDownTimePay: 60 * 1000,
  158. dialogConfig: {} as any,
  159. showSelectStudent: false, // 选择学生
  160. studentList: [], // 手机号关联学生列表
  161. studentItem: {} as any, // 选择的学生
  162. joinType: '' as 'digitalize' | 'tradition',
  163. gradeList: [] as any,
  164. classList: [] as any,
  165. saveUserId: null as any,
  166. saveId: null as any,
  167. openId: null as any,
  168. code: null as any,
  169. intervalFnRef: null as any, // 页面订时器
  170. registerExpireTime: null as any, // 结束时间
  171. instrumentCode: null as any, // 乐器编码
  172. activeOverTime: 0, // 活动结束时间
  173. activeOverStatus: true, // 活动是否结束 默认已结束
  174. gradePopupShow: false,
  175. gradePopupIndex: [] as any, // 年级下拉索引
  176. classPopupShow: false,
  177. classPopupIndex: [] as any // 班级下拉索引
  178. });
  179. const otherParams = reactive({
  180. showOtherSchool: false,
  181. showCloseButton: true, // 是否显示关闭按钮
  182. showOtherMessage: '',
  183. /** limit 超限制,change 更换学生,nickname 名称不一致 */
  184. otherType: '' as 'limit' | 'change' | 'nickname' | 'member',
  185. showCancelButton: true,
  186. cancelButtonColor: '',
  187. cancelButtonText: '取消',
  188. showConfirmButton: true,
  189. confirmButtonColor: '',
  190. confirmButtonText: '确定',
  191. messageAlign: 'left' as 'center' | 'left' | 'right'
  192. });
  193. const state = reactive({
  194. showQrcode: false,
  195. qrCodeUrl: '',
  196. pay_channel: '',
  197. orderInfo: {} as any, // 订单信息
  198. authShow: false,
  199. orderNo: null as any,
  200. config: {} as any,
  201. paymentStatus: false,
  202. orderTimer: null as any
  203. });
  204. /*
  205. 新用户:
  206. autoRegister: true
  207. loginType: 'SMS'
  208. 已存在用户:
  209. autoRegister: false
  210. loginType: 'TOKEN'
  211. password: xxx
  212. */
  213. const studentInfo = reactive({
  214. autoRegister: true,
  215. multiUser: true, // 是否为多用户
  216. client_id: 'cooleshow-student',
  217. client_secret: 'cooleshow-student',
  218. extra: {
  219. nickname: '',
  220. currentGradeNum: '' as any,
  221. currentClass: '' as any,
  222. gender: 1 as any,
  223. registerType: null as any, // 报名类型
  224. giftVipDay: 0 // 赠送会员天数
  225. },
  226. grant_type: 'password',
  227. loginType: 'SMS',
  228. password: '',
  229. username: ''
  230. });
  231. // 页面定时
  232. const pageTimer = useInterval(1000, { controls: true });
  233. pageTimer.pause();
  234. const overCountDown = useCountDown({
  235. time: forms.activeOverTime,
  236. onFinish() {
  237. forms.activeOverStatus = true;
  238. if (forms.submitLoading) return;
  239. applyOver();
  240. }
  241. });
  242. /** 报名结束提示 */
  243. const applyOver = () => {
  244. forms.showTips = true;
  245. forms.showMessage = '团购时间已截止,感谢您的参与';
  246. forms.showButton = false;
  247. forms.intervalFnRef?.pause();
  248. };
  249. const onCodeSend = () => {
  250. forms.countDownStatus = false;
  251. nextTick(() => {
  252. countDownRef.value.start();
  253. });
  254. };
  255. const onSendCode = () => {
  256. // 发送验证码
  257. if (!checkPhone(studentInfo.username)) {
  258. return showToast('请输入正确的手机号码');
  259. }
  260. forms.imgCodeStatus = true;
  261. };
  262. const validatePhone = computed(() => {
  263. return checkPhone(studentInfo.username) ? true : false;
  264. });
  265. const onFinished = () => {
  266. forms.countDownStatus = true;
  267. countDownRef.value.reset();
  268. };
  269. const orderType = computed(() => {
  270. return state.orderInfo.orderType;
  271. });
  272. const getRegisterGoods = async () => {
  273. try {
  274. const { data } = await request.get(
  275. '/edu-app/open/userOrder/registerGoods/' + forms.schoolId,
  276. {
  277. noAuthorization: true // 是否请求接口的时候添加toekn
  278. }
  279. );
  280. // 默认选中商品
  281. studentRegisterStore.setVip(data.details || []);
  282. forms.details = deepClone(data.details || []);
  283. forms.registerDetails = data;
  284. forms.registerExpireTime = data.registerExpireTime; // '2024-03-27 17:33:52'; //
  285. if (forms.registerExpireTime) {
  286. if (dayjs(new Date()).isBefore(forms.registerExpireTime)) {
  287. // 活动没有结束
  288. forms.activeOverStatus = false;
  289. // 默认返回毫秒
  290. forms.activeOverTime = dayjs(forms.registerExpireTime).diff(
  291. dayjs(new Date())
  292. );
  293. overCountDown.reset(forms.activeOverTime);
  294. overCountDown.start();
  295. } else {
  296. applyOver();
  297. forms.activeOverStatus = true;
  298. }
  299. }
  300. if (forms.details.length > 0) {
  301. forms.detailVip = forms.details[0];
  302. // forms.giftVipDay = forms.details[0].membershipDays;
  303. }
  304. forms.giftVipDay = data.giftVipDay || 0;
  305. forms.gradeYear = data.gradeYear;
  306. forms.schoolInstrumentSetType = data.schoolInstrumentSetType;
  307. forms.registerType = data.registerType;
  308. studentInfo.extra.registerType = data.registerType;
  309. const schoolInstrumentList = data.schoolInstrumentList || [];
  310. if (data.schoolInstrumentSetType === 'SCHOOL') {
  311. const instrumentCode = schoolInstrumentList[0]?.instrumentCode;
  312. forms.gradeList = getGradeList(data.gradeYear, instrumentCode);
  313. forms.classList = classList;
  314. } else if (data.schoolInstrumentSetType === 'GRADE') {
  315. schoolInstrumentList.forEach((item: any) => {
  316. forms.gradeList.push({
  317. text: GRADE_ENUM[item.gradeNum],
  318. value: item.gradeNum,
  319. instrumentId: item.instrumentId,
  320. instrumentCode: item.instrumentCode
  321. });
  322. });
  323. forms.gradeList.sort((a: any, b: any) => a.value - b.value);
  324. forms.classList = classList;
  325. } else if (data.schoolInstrumentSetType === 'CLASS') {
  326. // 班级
  327. const tempGradeList: any[] = [];
  328. schoolInstrumentList.forEach((item: any) => {
  329. if (!tempGradeList.includes(item.gradeNum)) {
  330. tempGradeList.push(item.gradeNum);
  331. }
  332. });
  333. const lastGradeList: any[] = [];
  334. tempGradeList.forEach((temp: any) => {
  335. const list = {
  336. text: GRADE_ENUM[temp],
  337. value: temp,
  338. instrumentId: '',
  339. instrumentCode: '',
  340. instrumentName: '',
  341. classList: [] as any
  342. };
  343. schoolInstrumentList.forEach((item: any) => {
  344. if (temp === item.gradeNum) {
  345. list.instrumentId = item.instrumentId;
  346. list.instrumentCode = item.instrumentCode;
  347. list.instrumentName = item.instrumentName;
  348. list.classList.push({
  349. text: item.classNum + '班',
  350. value: item.classNum,
  351. instrumentCode: item.instrumentCode
  352. });
  353. }
  354. });
  355. // 排序班级
  356. list.classList.sort((a: any, b: any) => a.value - b.value);
  357. lastGradeList.push(list);
  358. });
  359. lastGradeList.sort((a: any, b: any) => a.value - b.value);
  360. forms.gradeList = lastGradeList;
  361. forms.classList = [];
  362. } else {
  363. forms.gradeList = getGradeList(data.gradeYear);
  364. forms.classList = classList;
  365. }
  366. if (browser().weixin) {
  367. // if (
  368. // data.schoolStatus === 0 &&
  369. // forms.schoolId == '1770035687490105346'
  370. // ) {
  371. // forms.showTips = true;
  372. // forms.showMessage = '团购时间已截止,感谢您的参与';
  373. // forms.showButton = false;
  374. // return;
  375. // }
  376. if (data.registerType !== 'BUG_GOODS' || data.schoolStatus === 0) {
  377. forms.showTips = true;
  378. forms.showMessage = '二维码已经失效,详情请咨询学校老师';
  379. forms.showButton = false;
  380. return;
  381. }
  382. } else {
  383. forms.showTips = true;
  384. return;
  385. }
  386. // 判断是否有倒计时,倒计时是滞结束
  387. if (!forms.registerExpireTime || !forms.activeOverStatus) {
  388. pagePointInit();
  389. }
  390. } catch {}
  391. };
  392. // 计算金额
  393. const calcPrice = computed(() => {
  394. let amount: number = 0; //现价
  395. let originAmount: number = 0; // 原价
  396. const vipList: any[] = studentRegisterStore.getVip;
  397. vipList.forEach((vip: any) => {
  398. amount += Number(vip.currentPrice);
  399. originAmount += Number(vip.originalPrice);
  400. });
  401. // const goodsList: any[] = studentRegisterStore.getGoods;
  402. // goodsList.forEach((good: any) => {
  403. // amount += Number(good.price) * good.quantity;
  404. // originAmount += Number(good.originalPrice) * good.quantity;
  405. // });
  406. return {
  407. amount,
  408. originAmount
  409. };
  410. });
  411. // 格式化提示状态
  412. const changeTipStatus = (register: boolean, school: boolean) => {
  413. forms.isTipRegister = register;
  414. forms.isChangeSchool = school;
  415. };
  416. const checkForm = (status = true) => {
  417. if (!checkPhone(studentInfo.username)) {
  418. status && showToast('请输入正确的手机号码');
  419. return true;
  420. } else if (!studentInfo.password) {
  421. status && showToast('请输入验证码');
  422. return true;
  423. } else if (!studentInfo.extra.nickname) {
  424. status && showToast('请输入学生姓名');
  425. return true;
  426. } else if (!studentInfo.extra.currentGradeNum) {
  427. status && showToast('请选择所在年级');
  428. return true;
  429. } else if (!studentInfo.extra.currentClass) {
  430. status && showToast('请选择所在班级');
  431. return true;
  432. }
  433. return false;
  434. };
  435. //
  436. const checkSubmit = () => {
  437. const { extra } = studentInfo;
  438. // console.log(
  439. // forms.studentItem.nickname,
  440. // extra.nickname,
  441. // forms.isRegister,
  442. // forms.isTipRegister,
  443. // 'isRegister'
  444. // );
  445. if (
  446. forms.studentItem.nickname !== extra.nickname &&
  447. forms.isTipRegister
  448. ) {
  449. otherParams.showOtherMessage =
  450. '学生姓名与上次提交信息不一致,请确认修改学生信息或创建新的学生账号';
  451. otherParams.showOtherSchool = true;
  452. otherParams.showCancelButton = true;
  453. otherParams.showCloseButton = true;
  454. otherParams.cancelButtonColor =
  455. 'linear-gradient( 224deg, #3FE1E6 0%, #00CDD4 100%)';
  456. otherParams.cancelButtonText = '新建学生';
  457. otherParams.confirmButtonColor =
  458. 'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
  459. otherParams.confirmButtonText = '修改信息';
  460. otherParams.otherType = 'nickname';
  461. otherParams.messageAlign = 'left';
  462. return true;
  463. }
  464. // 判断新建学员是否上限了
  465. if (
  466. forms.isRegister === 'create' &&
  467. forms.studentList.length >= forms.multi_user_limit
  468. ) {
  469. otherParams.showOtherMessage = `同一手机号最多创建${forms.multi_user_limit}个学生`;
  470. otherParams.showOtherSchool = true;
  471. otherParams.showCancelButton = false;
  472. otherParams.showCloseButton = true;
  473. otherParams.confirmButtonColor =
  474. 'linear-gradient( 305deg, #40C8FF 0%, #3192FF 100%)';
  475. otherParams.confirmButtonText = '我知道了';
  476. otherParams.otherType = 'limit';
  477. otherParams.messageAlign = 'center';
  478. return true;
  479. }
  480. // 判断是否为同一个学校
  481. if (
  482. forms.studentItem.schoolId &&
  483. forms.studentItem.schoolId !== forms.registerDetails.schoolId &&
  484. !forms.isChangeSchool &&
  485. forms.isRegister === 'update'
  486. ) {
  487. otherParams.showOtherMessage = `您已绑定【${
  488. forms.studentItem?.schoolName || ''
  489. }】,提交后将更换到
  490. <span style="color: #2B85FF">【${
  491. forms.registerDetails.schoolName || ''
  492. }】</span>
  493. ,是否确认提交?`;
  494. otherParams.showOtherSchool = true;
  495. otherParams.showCloseButton = false;
  496. otherParams.showCancelButton = true;
  497. otherParams.cancelButtonColor = '';
  498. otherParams.cancelButtonText = '取消';
  499. otherParams.confirmButtonColor = '';
  500. otherParams.confirmButtonText = '确定';
  501. otherParams.otherType = 'change';
  502. otherParams.messageAlign = 'left';
  503. return true;
  504. }
  505. return false;
  506. };
  507. /**
  508. * 登记成功之后购买
  509. */
  510. const onSubmit = async () => {
  511. forms.submitLoading = true;
  512. try {
  513. if (checkForm() || checkSubmit()) {
  514. forms.submitLoading = false;
  515. return;
  516. }
  517. const { extra, loginType, autoRegister, password, multiUser, ...res } =
  518. studentInfo;
  519. /*
  520. 新用户:
  521. autoRegister: true
  522. loginType: 'SMS'
  523. 已存在用户:
  524. autoRegister: false
  525. loginType: 'TOKEN'
  526. password: xxx
  527. */
  528. let tLoginType = loginType,
  529. tAutoRegister = autoRegister,
  530. tPassword = password,
  531. tMultiUser = multiUser;
  532. if (forms.isRegister === 'update') {
  533. tLoginType = 'TOKEN';
  534. tAutoRegister = false;
  535. tPassword = forms.studentItem.token;
  536. tMultiUser = false;
  537. }
  538. const result = await request.post('/edu-app/userlogin', {
  539. requestType: 'form',
  540. data: {
  541. loginType: tLoginType,
  542. autoRegister: tAutoRegister,
  543. password: tPassword,
  544. multiUser: tMultiUser,
  545. ...res,
  546. extra: JSON.stringify({
  547. ...extra,
  548. giftVipDay:
  549. forms.detailVip.membershipDays || 0 + forms.giftVipDay || 0,
  550. schoolId: forms.schoolId
  551. })
  552. }
  553. });
  554. if (result.code !== 200) {
  555. if (result.code === 5436) {
  556. forms.showTips = true;
  557. forms.showMessage = '二维码已经失效,详情请咨询学校老师';
  558. forms.showButton = false;
  559. } else if (result.code === 5435) {
  560. forms.showTips = true;
  561. forms.showMessage = result.message;
  562. forms.showButton = true;
  563. } else if (result.code === 5437) {
  564. forms.showTips = true;
  565. forms.showMessage = '团购时间已截止,感谢您的参与'; //result.message;
  566. forms.showButton = false;
  567. }
  568. } else {
  569. studentRegisterStore.setToken(
  570. result.data.token_type + ' ' + result.data.access_token
  571. );
  572. setLoginInit();
  573. let joinType = 'NOT_REGISTER';
  574. if (forms.joinType === 'digitalize') {
  575. joinType = 'SELECT_INSTRUMENT';
  576. }
  577. if (forms.joinType === 'tradition') {
  578. joinType = 'NOT_BUY_INSTRUMENT';
  579. }
  580. // 更新时间
  581. const id = await updateStat(
  582. pageTimer.counter.value,
  583. joinType,
  584. result.data.userId,
  585. forms.schoolId
  586. );
  587. forms.saveId = id;
  588. forms.saveUserId = id;
  589. pageTimer.counter.value = 0;
  590. // 获取用户信息
  591. const res = await request.get('/edu-app/user/getUserInfo', {
  592. requestType: 'form'
  593. });
  594. setLogin(res.data);
  595. await onRegisterSubmit();
  596. }
  597. } catch {
  598. // 重置信息 - 如果是新建则不提示
  599. changeTipStatus(forms.isRegister === 'create' ? false : true, false);
  600. } finally {
  601. forms.submitLoading = false;
  602. }
  603. };
  604. const updateStudentInfo = async () => {
  605. try {
  606. const { extra, username } = studentInfo;
  607. const registerResult = await request.post('/edu-app/student/register', {
  608. data: {
  609. schoolId: forms.schoolId,
  610. clientType: 'STUDENT',
  611. ...extra,
  612. giftVipDay:
  613. forms.detailVip.membershipDays || 0 + forms.giftVipDay || 0,
  614. mobile: username,
  615. newRegUser: forms.isRegister === 'create' ? true : false
  616. }
  617. });
  618. if (registerResult.code !== 200) {
  619. if (registerResult.code === 5436) {
  620. forms.showTips = true;
  621. forms.showMessage = '二维码已经失效,详情请咨询学校老师';
  622. forms.showButton = false;
  623. } else if (registerResult.code === 5435) {
  624. forms.showTips = true;
  625. forms.showMessage = registerResult.message;
  626. forms.showButton = true;
  627. } else if (registerResult.code === 5437) {
  628. forms.showTips = true;
  629. forms.showMessage = '团购时间已截止,感谢您的参与'; //result.message;
  630. forms.showButton = false;
  631. }
  632. console.log('-----');
  633. return false;
  634. } else {
  635. console.log('=====');
  636. return true;
  637. }
  638. } catch {}
  639. };
  640. // 登记成功之后购买
  641. const onRegisterSubmit = async () => {
  642. try {
  643. // 请求是否有待支付订单,如果有则自动关闭
  644. const status = await paymentOrderUnpaid();
  645. if (status) return;
  646. const schoolInfo = await request.get(
  647. '/edu-app/userPaymentOrder/registerStatus/' + forms.schoolId
  648. );
  649. const vipList = studentRegisterStore.getVip;
  650. // 传统方式
  651. if (forms.joinType === 'tradition') {
  652. const updateStatus = await updateStudentInfo();
  653. if (!updateStatus) return;
  654. setTimeout(() => {
  655. showToast('报名成功');
  656. // router.push('/download');
  657. }, 100);
  658. setTimeout(() => {
  659. if (browser().weixin) {
  660. // 关闭微信
  661. (window as any).WeixinJSBridge.call('closeWindow');
  662. }
  663. }, 1000);
  664. return;
  665. }
  666. if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
  667. // forms.dialogConfirmStatus = true;
  668. otherParams.showOtherMessage = `该学员已购买会员,是否确认购买?`;
  669. otherParams.showOtherSchool = true;
  670. otherParams.showCloseButton = false;
  671. otherParams.showCancelButton = true;
  672. otherParams.cancelButtonColor = '';
  673. otherParams.cancelButtonText = '取消';
  674. otherParams.confirmButtonColor = '';
  675. otherParams.confirmButtonText = '确定';
  676. otherParams.otherType = 'member';
  677. otherParams.messageAlign = 'center';
  678. return;
  679. }
  680. await paymentContinue();
  681. } catch {
  682. // 重置信息 - 如果是新建则不提示
  683. changeTipStatus(forms.isRegister === 'create' ? false : true, false);
  684. }
  685. };
  686. const getUserInfos = async () => {
  687. if (
  688. studentInfo.password.length !== 6 ||
  689. !checkPhone(studentInfo.username)
  690. ) {
  691. return;
  692. }
  693. try {
  694. // 15907120131;
  695. const { data } = await request.get(
  696. `/edu-app/open/student/studentInfo?mobile=${studentInfo.username}&code=${studentInfo.password}&type=REGISTER`
  697. );
  698. forms.studentList = data || [];
  699. if (forms.studentList.length > 0) {
  700. const firstStudent: any = forms.studentList[0];
  701. forms.studentItem = firstStudent;
  702. studentInfo.extra.nickname = firstStudent.nickname;
  703. const tempGrade: any = forms.gradeList || [];
  704. tempGrade?.forEach((i: any) => {
  705. if (i.value === firstStudent.currentGradeNum) {
  706. forms.instrumentCode = i.instrumentCode;
  707. forms.gradeNumText = i.text;
  708. studentInfo.extra.currentGradeNum = firstStudent.currentGradeNum;
  709. if (forms.schoolInstrumentSetType === 'CLASS') {
  710. forms.classList = i.classList;
  711. }
  712. }
  713. });
  714. forms.classList.forEach((i: any) => {
  715. if (i.value === firstStudent.currentClass) {
  716. forms.currentClassText = i.text;
  717. studentInfo.extra.currentClass = firstStudent.currentClass;
  718. }
  719. });
  720. studentInfo.extra.gender = firstStudent.gender;
  721. forms.isRegister = 'update';
  722. changeTipStatus(true, false);
  723. } else {
  724. forms.isRegister = 'create';
  725. changeTipStatus(false, false);
  726. forms.studentItem = [];
  727. }
  728. } catch {
  729. //
  730. }
  731. };
  732. // 查询未支付订单
  733. const paymentOrderUnpaid = async () => {
  734. let result = false;
  735. try {
  736. const { data } = await request.get(
  737. '/edu-app/userPaymentOrder/schoolRegisterOrder?schoolId=' +
  738. forms.schoolId
  739. );
  740. // 判断是否有待支付订单
  741. if (data && data.length > 0) {
  742. let isPadding = false; // 是否有待支付订单
  743. let paddingConfig = {} as any;
  744. let paddingData = {} as any;
  745. let isFinal = false; // 是否有完成订单
  746. let finalConfig = {} as any;
  747. data.forEach((element: any) => {
  748. // 判断是否待支付
  749. if (element.status === 'PAYING' || element.status === 'WAIT_PAY') {
  750. isPadding = true;
  751. paddingConfig = element.paymentConfig;
  752. paddingData = element;
  753. }
  754. if (
  755. element.status === 'PAID' ||
  756. element.status === 'PART_REFUNDED' ||
  757. element.status === 'REFUNDED'
  758. ) {
  759. isFinal = true;
  760. finalConfig = element.paymentConfig;
  761. }
  762. });
  763. // 判断是否有完成订单 并且选择 自备
  764. if (isFinal && forms.joinType === 'tradition') {
  765. const studentResult = await updateStudentInfo();
  766. if (!studentResult) return;
  767. setTimeout(() => {
  768. showToast('您已通过数字化方式报名成功');
  769. }, 100);
  770. return true;
  771. }
  772. // 提交报名信息时,判断该手机号是否存在待支付订单,若存则判断本次提交的报名方式,若本次提交的是团购则提示【您有待支付的报名订单,是否继续支付 重新下单/继续支付】,点击重新下单时,关闭老订单,创建新订单;若本次提交的是自备,则提示 【您有数字化方式报名的待支付订单,请关闭订单后重新报名 取消/关闭】取消则停留在当前界面,关闭则关闭订单,并停留在当前界面,用户需要再次点击报名按钮提交信息
  773. if (isPadding && forms.joinType === 'tradition') {
  774. forms.dialogStatus = true;
  775. forms.dialogMessage =
  776. '您有数字化方式报名的待支付订单,请关闭订单后重新报名';
  777. forms.cancelButtonText = '取消';
  778. forms.confirmButtonText = '关闭';
  779. forms.dialogConfig = paddingConfig;
  780. forms.messageAlign = 'left';
  781. return true;
  782. }
  783. if (isPadding && forms.joinType === 'digitalize') {
  784. // 会选判断逻辑 -
  785. // await request.get(
  786. // '/edu-app/userPaymentOrder/registerStatus/' + forms.schoolId
  787. // );
  788. // const vipList = studentRegisterStore.getVip;
  789. // if (schoolInfo.data.hasBuyCourse && vipList.length > 0) {
  790. // forms.dialogConfirmStatus = true;
  791. // return true;
  792. // }
  793. // 最终确认,有待支付订单直接去支付,没有则才会创建订单
  794. state.config = paddingConfig?.paymentConfig;
  795. state.orderNo = paddingConfig?.orderNo;
  796. const updateStatus = await updateStudentInfo();
  797. if (!updateStatus) return;
  798. await lastSubmit();
  799. return true;
  800. }
  801. return false;
  802. } else {
  803. return false;
  804. }
  805. } catch {
  806. // 重置信息 - 如果是新建则不提示
  807. changeTipStatus(forms.isRegister === 'create' ? false : true, false);
  808. }
  809. return result;
  810. };
  811. // 重新下单
  812. const resetOrderPayment = async () => {
  813. try {
  814. const orderNo = forms.dialogConfig?.orderNo;
  815. if (!orderNo) return;
  816. await request.post(
  817. '/edu-app/userPaymentOrder/cancelPayment/' + orderNo
  818. );
  819. await onRegisterSubmit();
  820. } catch {
  821. //
  822. }
  823. };
  824. // 取消订单
  825. const cancelPaymentOrder = async () => {
  826. try {
  827. const orderNo = forms.dialogConfig?.orderNo;
  828. if (!orderNo) return;
  829. await request.post(
  830. '/edu-app/userPaymentOrder/cancelPayment/' + orderNo
  831. );
  832. } catch {}
  833. };
  834. const paymentContinue = async () => {
  835. try {
  836. const vipList = studentRegisterStore.getVip;
  837. const goodsList = studentRegisterStore.getGoods;
  838. const params: any[] = [];
  839. vipList.forEach((vip: any) => {
  840. params.push({
  841. giftVipDay: vip.membershipDays,
  842. goodsId: vip.goodsId,
  843. goodsNum: 1,
  844. goodsType: vip.goodsType,
  845. paymentCashAmount: vip.currentPrice, // 现金支付金额
  846. paymentCouponAmount: 0 // 优惠券金额
  847. });
  848. });
  849. goodsList.forEach((goods: any) => {
  850. params.push({
  851. goodsId: goods.productId,
  852. goodsNum: goods.quantity,
  853. goodsType: 'INSTRUMENTS',
  854. paymentCashAmount: goods.price, // 现金支付金额
  855. paymentCouponAmount: 0, // 优惠券金额
  856. goodsSkuId: goods.productSkuId
  857. });
  858. });
  859. // 创建订单
  860. // const { extra, username } = studentInfo;
  861. // const result = await request.post('/edu-app/student/register', {
  862. // data: {
  863. // schoolId: forms.schoolId,
  864. // clientType: 'STUDENT',
  865. // ...extra,
  866. // giftVipDay:
  867. // forms.detailVip.membershipDays || 0 + forms.giftVipDay || 0,
  868. // mobile: username,
  869. // newRegUser: forms.isRegister === 'create' ? true : false,
  870. // orderReq: {
  871. // buryId: forms.saveUserId,
  872. // registerType: forms.registerType,
  873. // paymentType: forms.paymentType,
  874. // bizId: forms.schoolId, // 乐团编号
  875. // orderType: 'SCHOOL_REGISTER',
  876. // paymentCashAmount: calcPrice.value.amount || 0,
  877. // paymentCouponAmount: 0,
  878. // goodsInfos: params,
  879. // orderName: '学生登记',
  880. // orderDesc: '学生登记'
  881. // }
  882. // }
  883. // });
  884. // if (result !== 200) {
  885. // if (result.code === 5436) {
  886. // forms.showTips = true;
  887. // forms.showMessage = '二维码已经失效,详情请咨询学校老师';
  888. // forms.showButton = false;
  889. // } else if (result.code === 5435) {
  890. // forms.showTips = true;
  891. // forms.showMessage = result.message;
  892. // forms.showButton = true;
  893. // } else if (result.code === 5437) {
  894. // forms.showTips = true;
  895. // forms.showMessage = '团购时间已截止,感谢您的参与'; //result.message;
  896. // forms.showButton = false;
  897. // } else if (result.code === 5436) {
  898. // forms.showTips = true;
  899. // forms.showMessage = '二维码已经失效,详情请咨询学校老师';
  900. // forms.showButton = false;
  901. // } else if (result.code === 5435) {
  902. // forms.showTips = true;
  903. // forms.showMessage = result.message;
  904. // forms.showButton = true;
  905. // }
  906. // } else {
  907. // console.log(result.data, 1);
  908. // state.config = {
  909. // ...result.data.paymentConfig,
  910. // paymentType: result.data.paymentType
  911. // };
  912. // state.orderNo = result.data.orderNo;
  913. // await lastSubmit();
  914. // }
  915. const updateStatus = await updateStudentInfo();
  916. console.log(updateStatus, 'updateStatus');
  917. if (!updateStatus) return;
  918. const result = await request.post(
  919. '/edu-app/userPaymentOrder/executeOrder',
  920. {
  921. // hideLoading: false,
  922. data: {
  923. buryId: forms.saveUserId,
  924. registerType: forms.registerType,
  925. paymentType: forms.paymentType,
  926. bizId: forms.schoolId, // 乐团编号
  927. orderType: 'SCHOOL_REGISTER',
  928. paymentCashAmount: calcPrice.value.amount || 0,
  929. paymentCouponAmount: 0,
  930. goodsInfos: params,
  931. orderName: '学生登记',
  932. orderDesc: '学生登记'
  933. }
  934. }
  935. );
  936. if (result.code === 5436) {
  937. forms.showTips = true;
  938. forms.showMessage = '二维码已经失效,详情请咨询学校老师';
  939. forms.showButton = false;
  940. } else if (result.code === 5435) {
  941. forms.showTips = true;
  942. forms.showMessage = result.message;
  943. forms.showButton = true;
  944. } else {
  945. state.config = {
  946. ...result.data.paymentConfig,
  947. paymentType: result.data.paymentType
  948. };
  949. state.orderNo = result.data.orderNo;
  950. await lastSubmit();
  951. }
  952. } catch (e: any) {
  953. console.log(e, 'any');
  954. // 重置信息 - 如果是新建则不提示
  955. changeTipStatus(forms.isRegister === 'create' ? false : true, false);
  956. }
  957. };
  958. const lastSubmit = async () => {
  959. try {
  960. const users = baseState.user.data;
  961. // 判断是否需要实名认证, 姓名,卡号 - 参数设置可以控制
  962. if (
  963. forms.contract_sign &&
  964. (!users?.account.realName || !users?.account.idCardNo)
  965. ) {
  966. state.authShow = true;
  967. return;
  968. }
  969. const { data } = await request.post(
  970. '/edu-app/userPaymentOrder/updateReceiveAddress',
  971. {
  972. // hideLoading: false,
  973. data: {
  974. orderNo: state.orderNo,
  975. orderType: 'SCHOOL_REGISTER'
  976. }
  977. }
  978. );
  979. state.pay_channel = data.paymentChannel;
  980. if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
  981. router.replace({
  982. path: '/payment-result',
  983. query: {
  984. orderNo: state.orderNo
  985. }
  986. });
  987. } else {
  988. onCallback();
  989. }
  990. } catch {
  991. // 重置信息 - 如果是新建则不提示
  992. changeTipStatus(forms.isRegister === 'create' ? false : true, false);
  993. }
  994. };
  995. /**
  996. * @description 回调,判断是否有支付渠道,如果有则直接去支付
  997. * @returns void
  998. */
  999. const onCallback = () => {
  1000. const pt = state.pay_channel;
  1001. // 判断是否有支付方式
  1002. if (pt) {
  1003. const payCode: string = beforeSubmit(state.pay_channel);
  1004. onConfirm({
  1005. payCode,
  1006. pay_channel: pt
  1007. });
  1008. } else {
  1009. if (orderType.value === 'VIP') {
  1010. state.paymentStatus = true;
  1011. } else {
  1012. // 直接去拉取微信支付
  1013. onConfirm({
  1014. payCode: 'payResult',
  1015. pay_channel: 'wx_pub'
  1016. });
  1017. }
  1018. }
  1019. };
  1020. const onConfirm = (val: any) => {
  1021. const config: any = state.config;
  1022. state.pay_channel = val.pay_channel;
  1023. const params = qs.stringify({
  1024. pay_channel: val.pay_channel,
  1025. wxAppId: config.wxAppId,
  1026. alipayAppId: config.alipayAppId,
  1027. paymentType: forms.paymentType,
  1028. body: config.body,
  1029. price: config.price,
  1030. orderNo: config.merOrderNo,
  1031. userId: config.userId
  1032. });
  1033. // console.log(params, state.config);
  1034. // return;
  1035. if (val.payCode === 'payResult') {
  1036. window.location.href =
  1037. window.location.origin + '/classroom-app/#/payResult?' + params;
  1038. } else {
  1039. state.qrCodeUrl =
  1040. window.location.origin + '/classroom-app/#/payDefine?' + params;
  1041. state.showQrcode = true;
  1042. state.paymentStatus = false;
  1043. setTimeout(() => {
  1044. getPaymentOrderStatus();
  1045. }, 300);
  1046. }
  1047. };
  1048. // 放弃支付时,则取消订单
  1049. const onBackOut = async () => {
  1050. try {
  1051. await request.post(
  1052. '/edu-app/userPaymentOrder/cancelPayment/' + state.orderNo
  1053. );
  1054. // router.back();
  1055. } catch {
  1056. //
  1057. }
  1058. };
  1059. // 轮询查询订单状态
  1060. const getPaymentOrderStatus = async () => {
  1061. // 循环查询订单
  1062. // const orderNo = state.orderNo
  1063. const orderTimer = setInterval(async () => {
  1064. // 判断是否在当前路由,如果不是则清除定时器
  1065. if (route.name != 'student-register-form') {
  1066. clearInterval(orderTimer);
  1067. return;
  1068. }
  1069. state.orderTimer = orderTimer;
  1070. try {
  1071. const { data } = await request.post(
  1072. '/edu-app/open/userOrder/paymentStatus/' + state.orderNo,
  1073. {
  1074. hideLoading: true
  1075. }
  1076. );
  1077. if (data.status !== 'WAIT_PAY' && data.status !== 'PAYING') {
  1078. // 默认关闭支付二维码弹窗
  1079. state.showQrcode = false;
  1080. clearInterval(state.orderTimer);
  1081. setTimeout(() => {
  1082. router.replace({
  1083. path: '/payment-result',
  1084. query: {
  1085. orderNo: state.orderNo
  1086. }
  1087. });
  1088. }, 100);
  1089. }
  1090. } catch {
  1091. //
  1092. clearInterval(state.orderTimer);
  1093. }
  1094. }, 5000);
  1095. };
  1096. // 实名认证成功
  1097. const onAuthSuccess = () => {
  1098. //
  1099. state.authShow = false;
  1100. paymentContinue(); // 实名成功后自动支付
  1101. };
  1102. /**
  1103. * 页面停留时间
  1104. * @param pageBrowseTime 停留时间
  1105. * @param joinType 加入方式
  1106. * @param userId 用户编号
  1107. * @param schoolId 学校编号
  1108. */
  1109. const updateStat = async (
  1110. pageBrowseTime = 5,
  1111. joinType?: string,
  1112. userId?: string,
  1113. schoolId?: string
  1114. ) => {
  1115. try {
  1116. const { data } = await requestStudent.post(
  1117. '/edu-app/open/studentRegisterPointRecord/update',
  1118. {
  1119. data: {
  1120. id: forms.saveId,
  1121. useTime: pageBrowseTime, // 固定10秒
  1122. joinType,
  1123. userId,
  1124. schoolId
  1125. }
  1126. }
  1127. );
  1128. forms.saveId = data;
  1129. return data;
  1130. } catch {
  1131. //
  1132. }
  1133. };
  1134. const getAppIdAndCode = async (url?: string) => {
  1135. try {
  1136. const { data } = await request.get(
  1137. '/edu-app/open/paramConfig/wechatAppId'
  1138. );
  1139. // 判断是否有微信appId
  1140. if (data) {
  1141. closeToast();
  1142. goWechatAuth(data, url);
  1143. }
  1144. } catch {
  1145. //
  1146. }
  1147. };
  1148. if (browser().weixin) {
  1149. //授权
  1150. const openId = sessionStorage.getItem('active-open-id');
  1151. forms.openId = openId;
  1152. const code = getUrlCode();
  1153. if (!code) {
  1154. const newUrl =
  1155. window.location.origin +
  1156. window.location.pathname +
  1157. '#' +
  1158. route.path +
  1159. '?' +
  1160. qs.stringify({
  1161. ...route.query
  1162. });
  1163. getAppIdAndCode(newUrl);
  1164. return '';
  1165. } else {
  1166. forms.code = code;
  1167. }
  1168. }
  1169. const formatTimerTo = (num: number): string => {
  1170. if (num > 9) {
  1171. return num + '';
  1172. } else {
  1173. return '0' + num;
  1174. }
  1175. };
  1176. const pagePointInit = async () => {
  1177. try {
  1178. // 判断是否获取微信code码
  1179. if (!forms.code) return;
  1180. const { data } = await request.post(
  1181. '/edu-app/open/studentRegisterPointRecord/save',
  1182. {
  1183. data: {
  1184. code: forms.code,
  1185. schoolId: forms.schoolId,
  1186. openId: forms.openId
  1187. }
  1188. }
  1189. );
  1190. forms.saveId = data.id;
  1191. forms.openId = data.openId;
  1192. sessionStorage.setItem('active-open-id', data.openId);
  1193. // 间隔多少时间同步数据
  1194. forms.intervalFnRef = useIntervalFn(async () => {
  1195. // 页面时间恢复
  1196. pageTimer.counter.value = 0;
  1197. pageTimer.resume();
  1198. // 同步数据时先进行有效时间进行保存
  1199. await updateStat();
  1200. }, 5000);
  1201. } catch {}
  1202. };
  1203. /** 手机号变更时清空验证码信息,用户信息 */
  1204. const phoneChangeEmptyInfo = () => {
  1205. studentInfo.password = '';
  1206. studentInfo.extra.nickname = '';
  1207. studentInfo.extra.currentGradeNum = '';
  1208. studentInfo.extra.currentClass = '';
  1209. studentInfo.extra.gender = 1;
  1210. forms.currentClassText = '';
  1211. forms.gradeNumText = '';
  1212. forms.studentList = []; // 手机号关联学生列表
  1213. forms.studentItem = {}; // 选择的学生
  1214. forms.isRegister = 'create'; // 是否注册学生
  1215. forms.isTipRegister = true; // 是否显示名字不一致 - 默认显示
  1216. forms.isChangeSchool = false; // 是否切换学校
  1217. };
  1218. onMounted(async () => {
  1219. try {
  1220. // 获取支付类型
  1221. const { data } = await request.get(
  1222. '/edu-app/open/paramConfig/queryByParamNameList',
  1223. {
  1224. requestType: 'form',
  1225. params: {
  1226. paramNames:
  1227. 'payment_service_provider,contract_sign,multi_user_limit'
  1228. }
  1229. }
  1230. );
  1231. if (data && Array.isArray(data)) {
  1232. data.forEach((item: any) => {
  1233. if (item.paramName === 'contract_sign') {
  1234. forms.contract_sign = item.paramValue === '1' ? true : false;
  1235. } else if (item.paramName === 'payment_service_provider') {
  1236. forms.paymentType = item.paramValue || '';
  1237. } else if (item.paramName === 'multi_user_limit') {
  1238. forms.multi_user_limit = item.paramValue
  1239. ? Number(item.paramValue)
  1240. : 1;
  1241. }
  1242. });
  1243. }
  1244. await getRegisterGoods();
  1245. } catch {}
  1246. });
  1247. onUnmounted(() => {
  1248. forms.intervalFnRef?.pause(); // 暂停回调
  1249. });
  1250. return () => (
  1251. <div class={styles['student-register']}>
  1252. <div class={styles.studentRegisterContainer}>
  1253. {!forms.activeOverStatus && (
  1254. <div class={styles.countdownSection}>
  1255. <div class={styles.timer}>
  1256. <img src={icon3} class={styles.timerTitle} />
  1257. <div class={styles.timerAll}>
  1258. <span>{formatTimerTo(overCountDown.current.value.days)}</span>
  1259. <span>
  1260. {formatTimerTo(overCountDown.current.value.hours)}
  1261. </span>
  1262. <span>
  1263. {formatTimerTo(overCountDown.current.value.minutes)}
  1264. </span>
  1265. <span>
  1266. {formatTimerTo(overCountDown.current.value.seconds)}
  1267. </span>
  1268. </div>
  1269. </div>
  1270. <div class={styles.timerTip}>
  1271. 为了确保您能顺利参与学习,请在规定时间内报名。
  1272. </div>
  1273. </div>
  1274. )}
  1275. <div
  1276. class={[
  1277. styles.studentSection,
  1278. styles.studentSectionForm,
  1279. styles.noSendDay
  1280. ]}
  1281. // style={{ display: 'none' }}
  1282. >
  1283. <div class={styles.title3}></div>
  1284. <Form labelAlign="left" class={styles.registerForm}>
  1285. <Field
  1286. clearable={false}
  1287. label="联系方式(直接监护人)"
  1288. placeholder="请输入手机号码"
  1289. type="tel"
  1290. required
  1291. autocomplete="off"
  1292. inputAlign="right"
  1293. class={styles.username}
  1294. v-model={studentInfo.username}
  1295. border={false}
  1296. maxlength={11}
  1297. onUpdate:modelValue={() => {
  1298. phoneChangeEmptyInfo();
  1299. }}>
  1300. {{
  1301. label: () => (
  1302. <div>
  1303. 联系方式
  1304. {/* (直接监护人) */}
  1305. <p class={styles.tips}>(直接监护人)</p>
  1306. </div>
  1307. )
  1308. }}
  1309. </Field>
  1310. <div class={['van-hairline--bottom', styles.fieldTipsGroup]}>
  1311. <div class={[styles.fieldTips]}>
  1312. 手机号是音乐数字课堂的唯一登录账户
  1313. </div>
  1314. </div>
  1315. <Field
  1316. center
  1317. clearable={false}
  1318. required
  1319. inputAlign="right"
  1320. label="验证码"
  1321. placeholder="请输入验证码"
  1322. autocomplete="off"
  1323. type="number"
  1324. v-model={studentInfo.password}
  1325. maxlength={6}
  1326. onUpdate:modelValue={(val: any) => {
  1327. getUserInfos();
  1328. }}>
  1329. {{
  1330. button: () =>
  1331. forms.countDownStatus ? (
  1332. <span
  1333. class={[
  1334. styles.codeText,
  1335. !validatePhone.value ? styles.codeTextDisabled : ''
  1336. ]}
  1337. onClick={onSendCode}>
  1338. 获取验证码
  1339. </span>
  1340. ) : (
  1341. <CountDown
  1342. ref={(el: any) => (countDownRef.value = el)}
  1343. auto-start={false}
  1344. class={styles.countDown}
  1345. time={forms.countDownTime}
  1346. onFinish={onFinished}
  1347. format="ss秒后重试"
  1348. />
  1349. )
  1350. }}
  1351. </Field>
  1352. </Form>
  1353. </div>
  1354. <div
  1355. class={[
  1356. styles.studentSection,
  1357. styles.studentSectionForm,
  1358. forms.giftVipDay <= 0 && styles.noSendDay
  1359. ]}
  1360. // style={{ display: 'none' }}
  1361. >
  1362. <div class={styles.title1}></div>
  1363. <Form labelAlign="left" class={styles.registerForm}>
  1364. {/* 大于等于2,则可以切换学生 */}
  1365. {forms.studentList.length > 1 && (
  1366. <div
  1367. class={[
  1368. styles.selectStudentGroup,
  1369. forms.showSelectStudent && styles.selectStudentGroupChecked
  1370. ]}
  1371. onClick={() => (forms.showSelectStudent = true)}>
  1372. <i
  1373. class={[
  1374. styles.studentIcon,
  1375. !forms.studentItem.userId && styles.studentIconAdd
  1376. ]}></i>
  1377. <span>
  1378. {forms.studentItem.userId
  1379. ? forms.studentItem.nickname
  1380. : '新增学生'}
  1381. </span>
  1382. </div>
  1383. )}
  1384. <Field
  1385. clearable={false}
  1386. required
  1387. inputAlign="right"
  1388. label="学生姓名"
  1389. placeholder="请输入学生姓名"
  1390. autocomplete="off"
  1391. maxlength={14}
  1392. v-model={studentInfo.extra.nickname}
  1393. />
  1394. <Field
  1395. clearable={false}
  1396. required
  1397. inputAlign="right"
  1398. label="学生性别"
  1399. placeholder="请选择性别"
  1400. autocomplete="off"
  1401. // v-model={studentInfo.extra.nickname}
  1402. >
  1403. {{
  1404. input: () => (
  1405. <RadioGroup
  1406. checked-color="linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)"
  1407. v-model={studentInfo.extra.gender}
  1408. direction="horizontal">
  1409. <Tag
  1410. size="large"
  1411. type="primary"
  1412. color={
  1413. !(studentInfo.extra.gender === 1)
  1414. ? '#F5F6FA'
  1415. : 'linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)'
  1416. }
  1417. textColor={
  1418. !(studentInfo.extra.gender === 1) ? '#626264' : '#fff'
  1419. }
  1420. class={styles.radioSection}>
  1421. <Radio class={styles.radioItem} name={1}></Radio>男
  1422. </Tag>
  1423. <Tag
  1424. size="large"
  1425. type="primary"
  1426. color={
  1427. !(studentInfo.extra.gender === 0)
  1428. ? '#F5F6FA'
  1429. : 'linear-gradient( 135deg, #31C7FF 0%, #007AFE 100%)'
  1430. }
  1431. textColor={
  1432. !(studentInfo.extra.gender === 0) ? '#626264' : '#fff'
  1433. }
  1434. class={styles.radioSection}>
  1435. <Radio class={styles.radioItem} name={0}></Radio>女
  1436. </Tag>
  1437. </RadioGroup>
  1438. )
  1439. }}
  1440. </Field>
  1441. <Field
  1442. clearable={false}
  1443. required
  1444. inputAlign="right"
  1445. label="所在年级"
  1446. placeholder="请选择年级"
  1447. isLink
  1448. readonly
  1449. clickable={false}
  1450. modelValue={forms.gradeNumText}
  1451. onClick={() => {
  1452. forms.gradePopupIndex = [studentInfo.extra.currentGradeNum];
  1453. forms.gradeStatus = true;
  1454. }}
  1455. />
  1456. <Field
  1457. clearable={false}
  1458. required
  1459. inputAlign="right"
  1460. label="所在班级"
  1461. placeholder="请选择班级"
  1462. isLink
  1463. readonly
  1464. clickable={false}
  1465. modelValue={forms.currentClassText}
  1466. onClick={() => {
  1467. if (
  1468. forms.schoolInstrumentSetType === 'CLASS' &&
  1469. forms.classList.length <= 0
  1470. ) {
  1471. showToast('请先选择年级');
  1472. return;
  1473. }
  1474. forms.classPopupIndex = [studentInfo.extra.currentClass];
  1475. forms.classStatus = true;
  1476. }}
  1477. />
  1478. {forms.giftVipDay > 0 ? (
  1479. <div class={styles.memberNumer}>
  1480. <img src={iconGift} class={styles.iconGift} />
  1481. <p>
  1482. 注册成功即可获得乐器AI学练工具
  1483. <span>{forms.giftVipDay || 0}</span>天有效期
  1484. </p>
  1485. </div>
  1486. ) : (
  1487. ''
  1488. )}
  1489. </Form>
  1490. </div>
  1491. <div class={styles.studentSection}>
  1492. <div class={styles.title2}></div>
  1493. <div class={styles.goodsGroup}>
  1494. <div
  1495. class={[
  1496. styles.goodsItem,
  1497. styles.digitalize,
  1498. forms.joinType === 'digitalize' && styles.checked
  1499. ]}
  1500. onClick={() => {
  1501. //
  1502. if (checkForm()) {
  1503. showToast('请将资料填写完整');
  1504. return;
  1505. }
  1506. forms.joinType = 'digitalize';
  1507. nextTick(() => {
  1508. mstickyRef.value?.onChnageHeight();
  1509. setTimeout(() => {
  1510. window.scrollTo(0, 1000);
  1511. }, 50);
  1512. });
  1513. }}>
  1514. <div class={styles.goodsInner}>
  1515. <i class={styles.proposalTip}></i>
  1516. 数字化方式
  1517. </div>
  1518. </div>
  1519. <div
  1520. class={[
  1521. styles.goodsItem,
  1522. styles.tradition,
  1523. forms.joinType === 'tradition' && styles.checked1
  1524. ]}
  1525. onClick={() => {
  1526. if (checkForm()) {
  1527. showToast('请将资料填写完整');
  1528. return;
  1529. }
  1530. forms.joinType = 'tradition';
  1531. nextTick(() => {
  1532. mstickyRef.value?.onChnageHeight();
  1533. setTimeout(() => {
  1534. window.scrollTo(0, 1000);
  1535. }, 50);
  1536. });
  1537. }}>
  1538. <div class={styles.goodsInner}>传统方式</div>
  1539. </div>
  1540. </div>
  1541. </div>
  1542. {forms.joinType === 'digitalize' && (
  1543. <div class={[styles.goodsExtra]}>
  1544. <i class={styles.iconArrow}></i>
  1545. <Cell border={false} class={styles.goodsCell}>
  1546. {{
  1547. icon: () => (
  1548. <Image
  1549. class={styles.img}
  1550. src={forms.detailVip.goodsUrl || tuangou}
  1551. />
  1552. ),
  1553. title: () => (
  1554. <div class={styles.section}>
  1555. <div class={styles.sectionContent}>
  1556. <h2>
  1557. {/* {forms.detailVip.goodsName} */}
  1558. <img src={icon5} class={styles.goodsName} />
  1559. <Tag class={styles.brandName}>
  1560. {/* {forms.detailVip.brandName} */}
  1561. 12个月
  1562. </Tag>
  1563. </h2>
  1564. <p class={[styles.model]}>
  1565. {/* 解决学生不会练、不知练的对错、家长无法辅导、无需再额外请老师 */}
  1566. {/* {forms.detailVip.description} */}
  1567. <p>
  1568. <i></i>解决学生不会练、不知练的对错
  1569. </p>
  1570. <p>
  1571. <i></i>家长无法辅导、无需再额外请老师
  1572. </p>
  1573. </p>
  1574. {/* <span class={styles.sendInstrument}>赠送课堂乐器</span> */}
  1575. <img src={icon6} class={styles.sendInstrument} />
  1576. </div>
  1577. </div>
  1578. )
  1579. }}
  1580. </Cell>
  1581. {forms.detailVip.membershipDays ? (
  1582. <div class={styles.memberNumer}>
  1583. <img src={iconGift} class={styles.iconGift} />
  1584. <p>
  1585. 现在购买赠送乐器AI学练工具
  1586. <span>{forms.detailVip.membershipDays || 0}</span>天有效期
  1587. </p>
  1588. </div>
  1589. ) : (
  1590. ''
  1591. )}
  1592. </div>
  1593. )}
  1594. {forms.joinType === 'tradition' && (
  1595. <div class={styles.goodsTradition}>
  1596. <i class={styles.iconArrow}></i>
  1597. <div class={styles.goodsTitle}></div>
  1598. <div class={styles.steps}>
  1599. <div class={styles.step}>
  1600. <span class={styles.nums}>
  1601. <span class={styles.numInner}>1</span>
  1602. </span>
  1603. <div class={styles.stepContent}>
  1604. <span>AI工具标准:</span>
  1605. 可以学练音乐教材中的乐曲,通过手机应用商店准备。
  1606. </div>
  1607. </div>
  1608. {['Panpipes', 'Ocarina', 'Tenor Recorder', 'Woodwind'].includes(
  1609. forms.instrumentCode
  1610. ) && (
  1611. <div class={styles.step}>
  1612. <span class={styles.nums}>
  1613. <span class={styles.numInner}>2</span>
  1614. </span>
  1615. <div class={styles.stepContent}>
  1616. <span>
  1617. {forms.instrumentCode === 'Panpipes' && '排箫'}
  1618. {forms.instrumentCode === 'Ocarina' && '陶笛'}
  1619. {forms.instrumentCode === 'Tenor Recorder' && '竖笛'}
  1620. {forms.instrumentCode === 'Woodwind' && '葫芦丝'}
  1621. 标准:
  1622. </span>
  1623. {forms.instrumentCode === 'Panpipes' &&
  1624. '管数不限,建议20管以上C调加嘴排箫(不需要重复更换),黑色,选择单一原调(调性多很难掌握);'}
  1625. {forms.instrumentCode === 'Ocarina' &&
  1626. 'C调、蓝色、十二孔高音、树脂或陶土均可;'}
  1627. {forms.instrumentCode === 'Tenor Recorder' &&
  1628. 'C调、木质、高音德式八孔;'}
  1629. {forms.instrumentCode === 'Woodwind' &&
  1630. 'C调、红木色、树脂或木质;'}
  1631. {/* 管数不限,建议20管以上C调加嘴排箫(音域宽,能演奏更多复杂乐曲,不需要重复更换),黑色,要选择单一原调(调性多学生很难掌握),价格由学生根据自身情况确定。 */}
  1632. </div>
  1633. </div>
  1634. )}
  1635. </div>
  1636. </div>
  1637. )}
  1638. {forms.joinType && (
  1639. <MSticky position="bottom" ref={mstickyRef}>
  1640. <div class={styles.paymentContainer}>
  1641. {forms.joinType === 'digitalize' && (
  1642. <>
  1643. <div class={styles.payemntPrice}>
  1644. <img src={giftTip} class={styles.giftTip} />
  1645. <div>
  1646. <span class={styles.needPrice}>
  1647. <i style="font-style: normal">¥ </i>
  1648. <span>{moneyFormat(calcPrice.value.amount)}</span>
  1649. <i class={styles.unit} style="font-style: normal">
  1650. /年
  1651. </i>
  1652. </span>
  1653. {calcPrice.value.originAmount >
  1654. calcPrice.value.amount ? (
  1655. <del class={styles.allPrice}>
  1656. ¥ {moneyFormat(calcPrice.value.originAmount)}
  1657. </del>
  1658. ) : (
  1659. ''
  1660. )}
  1661. </div>
  1662. </div>
  1663. <div
  1664. class={styles.paymentBtn}
  1665. onClick={() => {
  1666. onSubmit();
  1667. }}>
  1668. <Button
  1669. round
  1670. disabled={forms.submitLoading}
  1671. loading={forms.submitLoading}>
  1672. 立即支付
  1673. </Button>
  1674. </div>
  1675. </>
  1676. )}
  1677. {forms.joinType === 'tradition' && (
  1678. <div
  1679. class={styles.traditionBtn}
  1680. onClick={() => {
  1681. onSubmit();
  1682. }}>
  1683. <Button
  1684. round
  1685. disabled={forms.submitLoading}
  1686. loading={forms.submitLoading}>
  1687. 提交报名
  1688. </Button>
  1689. </div>
  1690. )}
  1691. </div>
  1692. </MSticky>
  1693. )}
  1694. </div>
  1695. {forms.imgCodeStatus ? (
  1696. <MImgCode
  1697. v-model:value={forms.imgCodeStatus}
  1698. phone={studentInfo.username}
  1699. type="REGISTER"
  1700. onClose={() => {
  1701. forms.imgCodeStatus = false;
  1702. }}
  1703. onSendCode={onCodeSend}
  1704. />
  1705. ) : null}
  1706. {/* 年级 */}
  1707. <Popup
  1708. v-model:show={forms.gradeStatus}
  1709. position="bottom"
  1710. round
  1711. safeAreaInsetBottom
  1712. lazyRender={false}
  1713. class={'popupBottomSearch'}
  1714. onOpen={() => {
  1715. forms.gradePopupShow = true;
  1716. }}
  1717. onClosed={() => {
  1718. forms.gradePopupShow = false;
  1719. }}>
  1720. {forms.gradePopupShow && (
  1721. <Picker
  1722. showToolbar
  1723. v-model={forms.gradePopupIndex}
  1724. columns={forms.gradeList}
  1725. onCancel={() => (forms.gradeStatus = false)}
  1726. onConfirm={(val: any) => {
  1727. const selectedOption = val.selectedOptions[0];
  1728. studentInfo.extra.currentGradeNum = selectedOption.value;
  1729. forms.gradeNumText = selectedOption.text;
  1730. forms.gradeStatus = false;
  1731. if (
  1732. ['SCHOOL', 'GRADE'].includes(forms.schoolInstrumentSetType)
  1733. ) {
  1734. forms.instrumentCode = selectedOption.instrumentCode;
  1735. }
  1736. if (forms.schoolInstrumentSetType === 'CLASS') {
  1737. forms.classList = selectedOption.classList;
  1738. }
  1739. if (
  1740. ['CLASS', 'GRADE'].includes(forms.schoolInstrumentSetType)
  1741. ) {
  1742. forms.currentClassText = '';
  1743. studentInfo.extra.currentClass = '';
  1744. }
  1745. }}
  1746. />
  1747. )}
  1748. </Popup>
  1749. {/* 班级 */}
  1750. <Popup
  1751. v-model:show={forms.classStatus}
  1752. position="bottom"
  1753. round
  1754. class={'popupBottomSearch'}
  1755. onOpen={() => {
  1756. forms.classPopupShow = true;
  1757. }}
  1758. onClosed={() => {
  1759. forms.classPopupShow = false;
  1760. }}>
  1761. {forms.classPopupShow && (
  1762. <Picker
  1763. showToolbar
  1764. v-model={forms.classPopupIndex}
  1765. columns={forms.classList}
  1766. onCancel={() => (forms.classStatus = false)}
  1767. onConfirm={(val: any) => {
  1768. const selectedOption = val.selectedOptions[0];
  1769. studentInfo.extra.currentClass = selectedOption.value;
  1770. forms.currentClassText = selectedOption.text;
  1771. forms.classStatus = false;
  1772. if (['CLASS'].includes(forms.schoolInstrumentSetType)) {
  1773. forms.instrumentCode = selectedOption.instrumentCode;
  1774. }
  1775. }}
  1776. />
  1777. )}
  1778. </Popup>
  1779. {/* 已经购买过样品 */}
  1780. {/* <MDialog
  1781. title="提示"
  1782. v-model:show={forms.dialogConfirmStatus}
  1783. message={'已购买会员,是否确认购买?'}
  1784. primaryColor="#FF8057"
  1785. allowHtml={true}
  1786. confirmButtonText="确定"
  1787. showCancelButton
  1788. onConfirm={async () => {
  1789. await paymentContinue();
  1790. }}
  1791. onCancel={() => {
  1792. //取消支付,判断是否有结束时间,是否已经结束
  1793. if (forms.registerExpireTime && forms.activeOverStatus) {
  1794. applyOver();
  1795. }
  1796. }}
  1797. /> */}
  1798. <MDialog
  1799. title="提示"
  1800. v-model:show={forms.dialogStatus}
  1801. message={forms.dialogMessage}
  1802. allowHtml={true}
  1803. primaryColor="#FF8057"
  1804. showCancelButton={true}
  1805. messageAlign={forms.messageAlign}
  1806. confirmButtonText={forms.confirmButtonText}
  1807. cancelButtonText={forms.cancelButtonText}
  1808. onConfirm={async () => {
  1809. if (forms.joinType === 'tradition') {
  1810. //
  1811. await cancelPaymentOrder();
  1812. //取消支付,判断是否有结束时间,是否已经结束
  1813. if (forms.registerExpireTime && forms.activeOverStatus) {
  1814. applyOver();
  1815. }
  1816. }
  1817. if (forms.joinType === 'digitalize') {
  1818. // 继续支付
  1819. const paymentConfig = forms.dialogConfig;
  1820. state.config = paymentConfig?.paymentConfig;
  1821. state.orderNo = paymentConfig?.orderNo;
  1822. const updateStatus = await updateStudentInfo();
  1823. if (!updateStatus) return;
  1824. await lastSubmit();
  1825. }
  1826. }}
  1827. onCancel={(val: any) => {
  1828. // countDown.pause();
  1829. if (forms.joinType === 'tradition') {
  1830. forms.dialogStatus = false;
  1831. //取消支付,判断是否有结束时间,是否已经结束
  1832. if (forms.registerExpireTime && forms.activeOverStatus) {
  1833. applyOver();
  1834. }
  1835. }
  1836. if (forms.joinType === 'digitalize') {
  1837. // 重新下单 - 先关闭订单
  1838. resetOrderPayment();
  1839. }
  1840. }}
  1841. />
  1842. <Popup
  1843. show={state.paymentStatus}
  1844. closeOnClickOverlay={false}
  1845. position="bottom"
  1846. round
  1847. closeOnPopstate
  1848. safeAreaInsetBottom
  1849. style={{ minHeight: '30%' }}>
  1850. <Payment
  1851. paymentConfig={state.orderInfo}
  1852. onClose={() => (state.paymentStatus = false)}
  1853. onBackOut={onBackOut}
  1854. onConfirm={(val: any) => onConfirm(val)}
  1855. />
  1856. </Popup>
  1857. <Popup
  1858. v-model:show={state.showQrcode}
  1859. round
  1860. onClose={() => {
  1861. // 二维码关闭时清除定时器
  1862. clearInterval(state.orderTimer);
  1863. }}>
  1864. <QrcodePayment
  1865. url={state.qrCodeUrl}
  1866. pay_channel={state.pay_channel}
  1867. orderType={orderType.value}
  1868. />
  1869. </Popup>
  1870. <MPopup v-model:modelValue={state.authShow}>
  1871. <UserAuth onSuccess={onAuthSuccess} hideHeader={!browser().isApp} />
  1872. </MPopup>
  1873. {/* 是否在微信中打开 */}
  1874. <OWxTip
  1875. show={forms.showTips}
  1876. message={forms.showMessage}
  1877. showButton={forms.showButton}
  1878. buttonText="刷新"
  1879. onConfirm={() => window.location.reload()}
  1880. />
  1881. <MMessageTip
  1882. show={otherParams.showOtherSchool}
  1883. // showCloseButton={otherParams.showCloseButton}
  1884. messageAlign={otherParams.messageAlign}
  1885. message={otherParams.showOtherMessage}
  1886. showCancelButton={otherParams.showCancelButton}
  1887. cancelButtonColor={otherParams.cancelButtonColor}
  1888. cancelButtonText={otherParams.cancelButtonText}
  1889. confirmButtonColor={otherParams.confirmButtonColor}
  1890. confirmButtonText={otherParams.confirmButtonText}
  1891. onClose={() => (otherParams.showOtherSchool = false)}
  1892. onCancel={async () => {
  1893. otherParams.showOtherSchool = false;
  1894. if (otherParams.otherType === 'nickname') {
  1895. forms.isRegister = 'create'; // 新建
  1896. changeTipStatus(false, false);
  1897. onSubmit();
  1898. } else if (otherParams.otherType === 'member') {
  1899. const updateStatus = await updateStudentInfo();
  1900. if (!updateStatus) return;
  1901. //取消支付,判断是否有结束时间,是否已经结束
  1902. if (forms.registerExpireTime && forms.activeOverStatus) {
  1903. applyOver();
  1904. }
  1905. // onConfirm={async () => {
  1906. // await paymentContinue();
  1907. // }}
  1908. // onCancel={() => {
  1909. // //取消支付,判断是否有结束时间,是否已经结束
  1910. // if (forms.registerExpireTime && forms.activeOverStatus) {
  1911. // applyOver();
  1912. // }
  1913. // }}
  1914. }
  1915. }}
  1916. onConfirm={async () => {
  1917. otherParams.showOtherSchool = false;
  1918. // 名字
  1919. if (otherParams.otherType === 'nickname') {
  1920. forms.isRegister = 'update'; // 修改
  1921. changeTipStatus(false, false);
  1922. // 直接注册
  1923. onSubmit();
  1924. } else if (otherParams.otherType === 'change') {
  1925. // 学校更换
  1926. forms.isChangeSchool = true;
  1927. // 直接注册
  1928. onSubmit();
  1929. } else if (otherParams.otherType === 'limit') {
  1930. // 人数超限制
  1931. changeTipStatus(
  1932. forms.isRegister === 'create' && !forms.studentItem.userId
  1933. ? false
  1934. : true,
  1935. false
  1936. );
  1937. } else if (otherParams.otherType === 'member') {
  1938. await paymentContinue();
  1939. }
  1940. }}
  1941. />
  1942. <Popup
  1943. v-model:show={forms.showSelectStudent}
  1944. round
  1945. position="bottom"
  1946. safeAreaInsetBottom
  1947. closeable>
  1948. <SelectStudent
  1949. studentItem={forms.studentItem}
  1950. list={forms.studentList}
  1951. onClose={() => (forms.showSelectStudent = false)}
  1952. onConfirm={(val: any) => {
  1953. forms.studentItem = val;
  1954. if (val.userId) {
  1955. const firstStudent = val;
  1956. studentInfo.extra.nickname = firstStudent.nickname;
  1957. const tempGrade: any = forms.gradeList || [];
  1958. if (!firstStudent.currentGradeNum) {
  1959. studentInfo.extra.currentGradeNum = null;
  1960. forms.gradeNumText = '';
  1961. forms.instrumentCode = '';
  1962. }
  1963. tempGrade?.forEach((i: any) => {
  1964. if (i.value === firstStudent.currentGradeNum) {
  1965. forms.instrumentCode = i.instrumentCode;
  1966. forms.gradeNumText = i.text;
  1967. studentInfo.extra.currentGradeNum =
  1968. firstStudent.currentGradeNum;
  1969. if (forms.schoolInstrumentSetType === 'CLASS') {
  1970. forms.classList = i.classList;
  1971. }
  1972. }
  1973. });
  1974. if (!firstStudent.currentClass) {
  1975. studentInfo.extra.currentClass = null;
  1976. forms.currentClassText = '';
  1977. }
  1978. forms.classList.forEach((i: any) => {
  1979. if (i.value === firstStudent.currentClass) {
  1980. forms.currentClassText = i.text;
  1981. studentInfo.extra.currentClass = firstStudent.currentClass;
  1982. }
  1983. });
  1984. studentInfo.extra.gender = firstStudent.gender;
  1985. forms.isRegister = 'update';
  1986. changeTipStatus(true, false);
  1987. } else {
  1988. forms.isRegister = 'create';
  1989. changeTipStatus(false, false);
  1990. studentInfo.extra.nickname = '';
  1991. studentInfo.extra.currentGradeNum = '';
  1992. studentInfo.extra.currentClass = '';
  1993. studentInfo.extra.gender = 1;
  1994. forms.currentClassText = '';
  1995. forms.gradeNumText = '';
  1996. }
  1997. }}
  1998. />
  1999. </Popup>
  2000. </div>
  2001. );
  2002. }
  2003. });