import { defineComponent, nextTick, onMounted, reactive } from 'vue' import styles from './index.module.less' import headTitle from './images/header-title.png' import headPhone from './images/header-phone.png' import headBg from './images/header-bg.png' import iconHead from './images/icon-head.png' import iconBao from './images/icon-bao.png' import iconFree from './images/icon-free.png' import icon12 from './images/icon-12.png' import iconCheckbox from './images/icon-checkbox-ring.png' import iconCheckboxActive from './images/icon-checkbox-active.png' import { Button, CellGroup, Field, Form, Radio, RadioGroup, Tag, showToast, Image, showImagePreview, Cell, Checkbox, Picker, Popup } from 'vant' import OSticky from '@/components/o-sticky' import { browser, getUrlCode, moneyFormat, removeAuth } from '@/helpers/utils' import request from '@/helpers/request' import { useRoute, useRouter } from 'vue-router' import { goWechatAuth, setLogout } from '@/state' import ODialog from '@/components/o-dialog' import InspectModal from './modal/inspect-modal' import qs from 'query-string' // 乐团交付,乐团停止或关闭,有新的交付团;则不允许报名 const classList: any = [] for (let i = 1; i <= 40; i++) { classList.push({ text: i + '班', value: i }) } export default defineComponent({ name: 'pre-goods-apply', setup() { const route = useRoute() const router = useRouter() // 获取是否已经看过训练工具图片 const readToolImg = localStorage.getItem('read-tool-image') const state = reactive({ code: '' as any, // 微信授权code码 detail: {} as any, // 学员详情 toolImgStatus: readToolImg ? true : false, currentGrade: [ { text: '一年级', value: 1 }, { text: '二年级', value: 2 }, { text: '三年级', value: 3 }, { text: '四年级', value: 4 }, { text: '五年级', value: 5 }, { text: '六年级', value: 6 }, { text: '七年级', value: 7 }, { text: '八年级', value: 8 }, { text: '九年级', value: 9 } ], // 年级数组列表 classList: classList, subjectList: [] as any, // 入选声部列表 instrumentsInspectionDescribe: '', // 配置信息 inspectPopupStatus: false, // 查看说明 gradeStatus: false, classStatus: false, subjectStatus: false, registerInfo: {} as any, // 乐团信息 goodsInfo: {} as any, // 商品 textBookInfo: {} as any, // 教材 inspectInfo: {} as any, // 乐器检查 vipYearInfo: {} as any, // 学练工具 inspectStatus: true, // 是否开启微信登录(测试使用)默认为false testIsWeixin: false, details: [] as any, // pattern: /^1(3|4|5|6|7|8|9)\d{9}$/, nameReg: /^[\u4E00-\u9FA5]+$/, paymentType: '', musicPaymentType: '', // 乐团中对应支付方式 studentReadStatus: false, // 学生在读 dialogStatus: false, dialogMessage: '', dialogOrchestraStatus: false, // 是否为不同的乐团 dialogConfig: {} as any, orderInfo: { needPrice: 0, originalPrice: 0 }, submitStatus: false }) const forms = reactive({ username: null, sex: null as any, currentGrade: null, currentGradeTxt: null, // 年级编号 currentClass: '', // 班级 currentClassTxt: null, // 年级编号 registerSubjectId: '', registerSubjectTxt: null, // 所在入选声部 parentName: null, groupBuyType: '' as any, phone: null as any, learningTools: null, instrumentsBrand: null }) const otherParams = reactive({ toolPlan: { title: '', // 训练工具准备 groupTitle: '', // 团购标题 groupDesc: '', // 团购文案 selfTitle: '', // 自备标题 selfDesc: '' // 自备文案 }, leBao: { // 乐器保障 show: 1, // 是否显示 selected: 1 // 是否选择 } }) // 获取乐团报名信息 const studentRegister = async () => { try { const { data } = await request.get( '/api-student/orchestraRegister/register/' + route.query.id ) const detail = data || {} state.detail = detail const grade: any = state.currentGrade.find((item: any) => item.value == detail.currentGrade) const cls: any = state.classList.find((item: any) => item.value == detail.currentClass) const subjects: any = state.subjectList.find( (item: any) => item.value == detail.registerSubjectId ) forms.username = detail.username forms.sex = detail.sex ? 1 : 0 forms.currentGrade = detail.currentGrade forms.currentGradeTxt = grade ? grade.text : '' forms.currentClass = detail.currentClass forms.currentClassTxt = cls ? cls.text : '' forms.registerSubjectId = subjects ? subjects.value : '' // detail.registerSubjectId forms.registerSubjectTxt = subjects ? subjects.text : '' forms.parentName = detail.parentName forms.phone = detail.phone forms.instrumentsBrand = detail.instrumentsBrand forms.learningTools = detail.learningTools if (detail.registerSubjectId && detail.registerSubjectId !== 999) { // 更新商品信息 await registerGoods() } forms.groupBuyType = detail.groupBuyType } catch (e) { // console.log(e) } } // 获取入选声部信息 const getSubjects = async () => { try { const subjects = await request.post( '/api-student/open/orchestraSubjectConfig/pageByOrchestraId', { data: { orchestraId: route.query.id, page: 1, rows: 100 } } ) const rows = subjects.data.rows || [] rows.forEach((item: any) => { state.subjectList.push({ text: item.name, value: item.subjectId }) }) } catch { // } } const validator = (val: any) => { // 校验函数返回 true 表示校验通过,false 表示不通过 return state.nameReg.test(val) && val.length >= 2 && val.length <= 15 } const message = (value: any) => { if (!value) { return '请填写学员真实姓名' } else if (!state.nameReg.test(value)) { return '学员姓名必须为中文' } else if (value.length < 2 || value.length > 15) { return '学员姓名必须为2~15个字' } else { return '' } } const onRegisterUser = async () => { try { const params: any = { orchestraId: route.query.id, schoolId: state.detail.schoolId, ...forms } // 判断是否已报过名 // if (state.detail.id) { // params.id = state.detail.id // } // 开始报名 await request.post('/api-student/orchestraRegister/save', { hideLoading: false, data: { ...params, code: state.code } }) if (forms.groupBuyType === 'SELF') { router.push({ path: '/preGoodsSuccess' }) } } catch (e: any) { // return Promise.reject(e) } } // 乐团报名 const onSubmit = async () => { try { if (forms.groupBuyType === 'SELF') { state.submitStatus = true return } // 判断是否购买乐器 // 乐器报名前先注册用户 await onRegisterUser() // 重新计算金额 calcPrice() const params: any = [] // 支付参数 // 教材 const textBookInfo = state.textBookInfo params.push({ goodsId: textBookInfo.goodsId, goodsNum: 1, goodsType: textBookInfo.goodsType, paymentCashAmount: textBookInfo.currentPrice, // 现金支付金额 paymentCouponAmount: 0 // 优惠券金额 }) // 商品 const goodsInfo = state.goodsInfo params.push({ goodsId: goodsInfo.goodsId, goodsNum: 1, goodsType: goodsInfo.goodsType, paymentCashAmount: goodsInfo.currentPrice, // 现金支付金额 paymentCouponAmount: 0 // 优惠券金额 }) // 检查 if (state.inspectStatus) { const inspectInfo = state.inspectInfo params.push({ goodsId: inspectInfo.goodsId, goodsNum: 1, goodsType: inspectInfo.goodsType, paymentCashAmount: inspectInfo.currentPrice, // 现金支付金额 paymentCouponAmount: 0 // 优惠券金额 }) } // 学练工具 const vipYear = state.vipYearInfo params.push({ goodsId: vipYear.goodsId, goodsNum: 1, goodsType: vipYear.goodsType, paymentCashAmount: vipYear.currentPrice, // 现金支付金额 paymentCouponAmount: 0 // 优惠券金额 }) // 创建订单 const { data } = await request.post('/api-student/userPaymentOrder/executeOrder', { hideLoading: false, data: { paymentType: state.musicPaymentType || state.paymentType, bizId: route.query.id, // 乐团编号 orderType: 'ORCHESTRA', paymentCashAmount: state.orderInfo.needPrice || 0, paymentCouponAmount: 0, goodsInfos: params, orderName: '乐团报名缴费', orderDesc: '乐团报名缴费' } }) console.log(data) router.push({ path: '/orderDetail', query: { pm: 1, // h5乐团报名 config: JSON.stringify({ ...data.paymentConfig, paymentType: data.paymentType }), orderNo: data.orderNo } }) } catch { // } } const getRegisterStatus = async () => { try { const { data } = await request.get( '/api-student/orchestraRegister/registerStatus/' + route.query.id ) state.registerInfo = data || {} const trainingToolsConfig = data.trainingToolsConfig ? JSON.parse(data.trainingToolsConfig) : {} otherParams.toolPlan = trainingToolsConfig const musicalInstrumentConfig = data.musicalInstrumentConfig ? JSON.parse(data.musicalInstrumentConfig) : {} otherParams.leBao = musicalInstrumentConfig // 默认根据设置显示 state.inspectStatus = musicalInstrumentConfig.selected ? true : false // 判断学生是否在读 if (data.learningOrchestra?.length) { state.studentReadStatus = true } } catch { // } } const getAppIdAndCode = async () => { try { const { data } = await request.get('/api-student/open/paramConfig/wechatAppId') // 判断是否有微信appId if (data) { // goAuth(data) goWechatAuth(data) } } catch { // } } // 查询未支付订单 const paymentOrderUnpaid = async () => { try { const { data } = await request.get('/api-student/userPaymentOrder/unpaid', { params: { orchestraId: route.query.id } }) // 判断是否有待支付订单 if (data.id) { if (data.orchestraId !== route.query.id) { state.dialogMessage = '您在其它乐团存在待支付订单,取消后才可继续报名,是否确认取消?' state.dialogStatus = true state.dialogOrchestraStatus = true state.dialogConfig = data } else { state.dialogMessage = '您有待支付的订单,是否继续支付' state.dialogStatus = true state.dialogConfig = data } } } catch { // } } // 获取支付渠道 const sysParamConfig = async () => { try { const { data } = await request.get('/api-student/sysParamConfig/queryByParamName', { params: { paramName: 'payment_service_provider' } }) state.paymentType = data.paramValue || '' } catch { // } } // 获取商品信息 const registerGoods = async () => { try { const { data } = await request.get( '/api-student/orchestraRegister/registerGoods/' + route.query.id, { params: { subjectId: forms.registerSubjectId } } ) state.musicPaymentType = data.paymentServiceProvider || '' // 初始化数据商品数据 const details = data.details || [] details.forEach((item: any) => { if (item.goodsType === 'INSTRUMENTS') { const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : '' state.goodsInfo = { ...item, goodsUrl: img } state.instrumentsInspectionDescribe = item.instrumentsInspectionDescribe } else if (item.goodsType === 'TEXTBOOK') { const img = item.goodsUrl ? item.goodsUrl.split(',')[0] : '' state.textBookInfo = { ...item, goodsUrl: img } } else if (item.goodsType === 'INSTRUMENT_INSPECT') { state.inspectInfo = { ...item } } else if (item.goodsType === 'VIP_YEAR') { state.vipYearInfo = { ...item } } state.details = details }) calcPrice() } catch { // } } // 初始化金额 const calcPrice = () => { // const details = state.details const tempPrice = { needPrice: 0, //需要支付金额 originalPrice: 0 // 原价 } // 商品 tempPrice.needPrice += parseFloat(state.goodsInfo.currentPrice || 0) tempPrice.originalPrice += parseFloat(state.goodsInfo.originalPrice || 0) // 学练工具 tempPrice.needPrice += parseFloat(state.vipYearInfo.currentPrice || 0) tempPrice.originalPrice += parseFloat(state.vipYearInfo.originalPrice || 0) // 教材 tempPrice.needPrice += parseFloat(state.textBookInfo.currentPrice || 0) tempPrice.originalPrice += parseFloat(state.textBookInfo.originalPrice || 0) // 检查乐器 if (state.inspectStatus) { tempPrice.needPrice += parseFloat(state.inspectInfo.currentPrice || 0) tempPrice.originalPrice += parseFloat(state.inspectInfo.originalPrice || 0) } state.orderInfo = tempPrice } const onLoutout = () => { setLogout() removeAuth() const query = { returnUrl: route.path, ...route.query } as any window.location.href = window.location.origin + window.location.pathname + '#/loginMusic?' + qs.stringify(query) // router.replace({ // path: '/loginMusic', // query: query // }) } onMounted(async () => { // state.code = route.query.code || '' // console.log('pre register code: ' + state.code) await getSubjects() await studentRegister() sysParamConfig() // 查询未支付订单 // registerGoods() paymentOrderUnpaid() // 判断是否有授权码 // if (!props.code) { // setLogout() // const query = { // returnUrl: route.path, // ...route.query // } as any // router.replace({ // path: '/loginMusic', // query: query // }) // } }) // 先请求接口 判断是否有code if (state.testIsWeixin) { getRegisterStatus() } else { if (browser().weixin) { // 微信公众号支付 //授权 const code = getUrlCode() if (!code) { getAppIdAndCode() } else { state.code = code getRegisterStatus() } } else { onLoutout() } } return () => (
{state.registerInfo.orchestraName}