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}

{ // 获取第一个校验错误的元素 nextTick(() => { const isError = document.getElementsByClassName('van-field__error-message') // 滚动到错误元素对应位置 isError[0]?.scrollIntoView({ block: 'center', behavior: 'smooth' }) }) }} ref="form" class={styles.form} >
{{ input: () => ( 男生 女生 ) }} (state.gradeStatus = true)} rules={[{ required: true, message: '请选择年级' }]} /> (state.classStatus = true)} rules={[{ required: true, message: '请选择班级' }]} /> { if (state.subjectList.length <= 0) { showToast('暂无报名入选声部') return } state.subjectStatus = true }} rules={[{ required: true, message: '请选择入选声部' }]} />
{/*

为保障乐团训练质量,开训前,家长务必准备好①乐器和②管乐AI学练工具,准备方式不限;

为了降低家长投入压力,可参与项目支持方提供的AI学练工具团购,政策如下:

1、支持方免费 提供一支全新乐器供学生训练(可带回家) ;
2、乐器提供时间为一年,如期满继续训练,乐器将 赠送至学生以作鼓励;
3、如期间或期满不再训练,家长归还乐器即可, 无需额外支付乐器费用。

*/}
{{ input: () => ( { if (!forms.registerSubjectId) { showToast('请选择入选声部') return } }} > {otherParams.toolPlan.groupTitle}

{otherParams.toolPlan.groupDesc}

{otherParams.toolPlan.selfTitle}

{otherParams.toolPlan.selfDesc}

) }}
{forms.groupBuyType === 'GROUP_BUY' && ( <>
{{ icon: () => , value: () => (
{state.vipYearInfo.goodsName}

乐团首次训练之日起生效

{state.vipYearInfo.description}

团购价:

¥ {moneyFormat(state.vipYearInfo.currentPrice)}

{/* 原价: ¥{moneyFormat(state.vipYearInfo.originalPrice)} */}
) }}
{{ icon: () => , value: () => (
{state.goodsInfo.goodsName} {state.goodsInfo.currentPrice <= 0 ? : ''}

{state.goodsInfo.description}

团购价:

{state.goodsInfo.currentPrice <= 0 ? ( ¥ {moneyFormat(state.goodsInfo.groupPrice)} ) : ( <> ¥ {moneyFormat(state.goodsInfo.currentPrice)} )}

{/* {state.goodsInfo.currentPrice > 0 ? ( <>
团购价:

¥ {moneyFormat(state.goodsInfo.currentPrice)}

原价: ¥{moneyFormat(state.goodsInfo.originalPrice)}
) : ( <>
原价:

¥{' '} {moneyFormat(state.goodsInfo.originalPrice)}

)} */}
) }}
{otherParams.leBao.show ? ( {{ icon: () => ( { if (state.instrumentsInspectionDescribe) state.inspectPopupStatus = true }} /> ), value: () => (
{ if (state.instrumentsInspectionDescribe) state.inspectPopupStatus = true }} > 下校检查乐器 1-2次/学期

{ state.inspectStatus = !state.inspectStatus calcPrice() }} > ¥ {state.inspectInfo.currentPrice} /年

{ calcPrice() }} > {{ icon: (props: any) => ( ) }}
) }}
) : ( '' )}

总计: ¥ {moneyFormat(state.orderInfo.needPrice)}

)} {forms.groupBuyType === 'SELF' && ( <>
{ showImagePreview([state.registerInfo?.instrumentPriceImg]) localStorage.setItem('read-tool-image', '1') state.toolImgStatus = true }} > {!state.toolImgStatus && (
)}
)}
{/* 年级 */} (state.gradeStatus = false)} onConfirm={(val: any) => { const selectedOption = val.selectedOptions[0] forms.currentGrade = selectedOption.value forms.currentGradeTxt = selectedOption.text state.gradeStatus = false }} /> {/* 班级 */} (state.classStatus = false)} onConfirm={(val: any) => { const selectedOption = val.selectedOptions[0] forms.currentClass = selectedOption.value forms.currentClassTxt = selectedOption.text state.classStatus = false }} /> {/* 入选声部 */} (state.subjectStatus = false)} onConfirm={async (val: any) => { const selectedOption = val.selectedOptions[0] forms.registerSubjectId = selectedOption.value forms.registerSubjectTxt = selectedOption.text state.subjectStatus = false // 更新商品信息 await registerGoods() }} /> {/* 入选声部 */} {/* 确认信息 */} 请确认您准备的乐器和AI学练工具符合《乐团训练工具标准配置表》

' } class={styles.dialogSubmit} allowHtml confirmButtonText="返回" cancelButtonText="确认" showCancelButton onConfirm={() => { state.submitStatus = false }} onCancel={async () => { onRegisterUser() }} /> {/* 学生在读 */} { // state.submitStatus = false onLoutout() }} /> { if (state.dialogOrchestraStatus) { try { await request.post( '/api-student/userPaymentOrder/cancelPayment/' + state.dialogConfig.orderNo ) } catch { // } } else { const paymentConfig = state.dialogConfig.paymentConfig router.push({ path: '/orderDetail', query: { pm: 1, // h5乐团报名 config: JSON.stringify({ ...paymentConfig.paymentConfig, paymentType: paymentConfig.paymentType }), orderNo: paymentConfig.orderNo } }) } }} onCancel={async () => { try { await request.post( '/api-student/userPaymentOrder/cancelPayment/' + state.dialogConfig.orderNo ) } catch { // } }} />
) } })