| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114 |
- 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 () => (
- <div class={styles.goodsApply}>
- <img src={headBg} class={styles.headBg} />
- <div class={styles.goodsHeader}>
- <div class={styles.orchestraTitle}>
- <img class={styles.headTitle} src={headTitle} />
- <p class={[styles.name, 'van-multi-ellipsis--l3']}>
- {state.registerInfo.orchestraName}
- </p>
- </div>
- <img src={headPhone} class={styles.headPhone} />
- </div>
- <Form
- validateFirst
- errorMessageAlign="right"
- scrollToError={true}
- onSubmit={onSubmit}
- onFailed={(e: any) => {
- // 获取第一个校验错误的元素
- nextTick(() => {
- const isError = document.getElementsByClassName('van-field__error-message')
- // 滚动到错误元素对应位置
- isError[0]?.scrollIntoView({
- block: 'center',
- behavior: 'smooth'
- })
- })
- }}
- ref="form"
- class={styles.form}
- >
- <CellGroup class={styles.applyCellGroup} border={false}>
- <div class={[styles.title, styles.titleApply]}></div>
- <Field
- required
- label="学员信息"
- placeholder="请填写学员真实姓名"
- inputAlign="right"
- v-model={forms.username}
- maxlength={15}
- rules={[{ validator, message }]}
- />
- <Field
- required
- label="性别"
- inputAlign="right"
- rules={[{ required: true, message: '请选择性别' }]}
- >
- {{
- input: () => (
- <RadioGroup v-model={forms.sex}>
- <Tag
- size="large"
- type="primary"
- class={[styles.radioSection, forms.sex === 1 ? styles.active : '']}
- >
- <Radio class={styles.radioItem} name={1}></Radio>
- 男生
- </Tag>
- <Tag
- size="large"
- type="primary"
- class={[styles.radioSection, forms.sex === 0 ? styles.active : '']}
- >
- <Radio class={styles.radioItem} name={0}></Radio>女生
- </Tag>
- </RadioGroup>
- )
- }}
- </Field>
- <Field
- required
- label="年级"
- inputAlign="right"
- readonly
- isLink
- clickable={false}
- placeholder="请选择年级"
- v-model={forms.currentGradeTxt}
- onClick={() => (state.gradeStatus = true)}
- rules={[{ required: true, message: '请选择年级' }]}
- />
- <Field
- required
- label="班级"
- inputAlign="right"
- readonly
- isLink
- clickable={false}
- placeholder="请选择班级"
- v-model={forms.currentClassTxt}
- onClick={() => (state.classStatus = true)}
- rules={[{ required: true, message: '请选择班级' }]}
- />
- <Field
- required
- label="入选声部"
- inputAlign="right"
- readonly
- isLink
- clickable={false}
- placeholder="请选择入选声部"
- v-model={forms.registerSubjectTxt}
- onClick={() => {
- if (state.subjectList.length <= 0) {
- showToast('暂无报名入选声部')
- return
- }
- state.subjectStatus = true
- }}
- rules={[{ required: true, message: '请选择入选声部' }]}
- />
- </CellGroup>
- <CellGroup class={styles.applyCellGroup} border={false}>
- <div class={[styles.title, styles.titleParent]}></div>
- <Field
- required
- label="家长姓名"
- inputAlign="right"
- placeholder="请填写家长真实姓名"
- v-model={forms.parentName}
- maxlength={15}
- rules={[{ required: true, message: '请填写家长真实姓名' }]}
- />
- <Field
- required
- label="手机号"
- inputAlign="right"
- placeholder="请输入手机号"
- v-model={forms.phone}
- maxlength={11}
- type="tel"
- rules={[{ pattern: state.pattern, message: '输入监护人手机号码有误' }]}
- />
- </CellGroup>
- <CellGroup class={styles.applyCellGroup} border={false}>
- <div class={[styles.title, styles.titleTips]}></div>
- <div class={styles.tipsContainer} v-html={state.registerInfo.joinNotice}>
- {/* <p class={styles.line}>
- <i class={[styles.num, styles.numOne]}></i>
- 为保障乐团训练质量,开训前,家长务必准备好①乐器和②管乐AI学练工具,准备方式不限;
- </p>
- <p class={styles.line}>
- <i class={[styles.num, styles.numTwo]}></i>
- 为了降低家长投入压力,可参与项目支持方提供的AI学练工具团购,政策如下:
- <p class={[styles.child]}>
- 1、支持方<span style="color: #F67146">免费</span>
- 提供一支全新乐器供学生训练(可带回家) ;<br />
- 2、乐器提供时间为一年,如期满继续训练,乐器将
- <span style="color: #F67146">赠送</span>至学生以作鼓励;
- <br />
- 3、如期间或期满不再训练,家长归还乐器即可,
- <span style="color: #F67146">无需额外支付</span>乐器费用。
- </p>
- </p> */}
- </div>
- </CellGroup>
- <CellGroup class={styles.applyCellGroup} border={false}>
- <div class={[styles.title, styles.titleTool]}></div>
- <Field
- required
- label={otherParams.toolPlan.title}
- labelAlign="top"
- rules={[{ required: true, message: otherParams.toolPlan.title }]}
- >
- {{
- input: () => (
- <RadioGroup v-model={forms.groupBuyType} class={styles.toolRadioGroup}>
- <Tag
- size="large"
- type="primary"
- class={[
- styles.radioSectionTag,
- styles.radioSection,
- forms.groupBuyType === 'GROUP_BUY' ? styles.active : ''
- ]}
- >
- <Radio
- class={styles.radioItem}
- name={'GROUP_BUY'}
- disabled={forms.registerSubjectId ? false : true}
- onClick={() => {
- if (!forms.registerSubjectId) {
- showToast('请选择入选声部')
- return
- }
- }}
- ></Radio>
- {otherParams.toolPlan.groupTitle}
- <p class={styles.radioTip}>{otherParams.toolPlan.groupDesc}</p>
- </Tag>
- <Tag
- size="large"
- type="primary"
- class={[
- styles.radioSectionTag,
- styles.radioSection,
- forms.groupBuyType === 'SELF' ? styles.active : ''
- ]}
- >
- <Radio class={styles.radioItem} name={'SELF'}></Radio>
- {otherParams.toolPlan.selfTitle}
- <p class={styles.radioTip}>{otherParams.toolPlan.selfDesc}</p>
- </Tag>
- </RadioGroup>
- )
- }}
- </Field>
- </CellGroup>
- {forms.groupBuyType === 'GROUP_BUY' && (
- <>
- <CellGroup class={[styles.applyCellGroup, styles.groupBuy]} border={false}>
- <div class={[styles.title, styles.titleIntrumentTool]}></div>
- <Cell border={false}>
- {{
- icon: () => <Image src={state.vipYearInfo.goodsUrl} class={styles.goodsImg} />,
- value: () => (
- <div class={styles.vipYearInfo}>
- <div class={styles.goodsTitle}>
- {state.vipYearInfo.goodsName} <img src={icon12} />
- </div>
- <p class={styles.goodsTips}>乐团首次训练之日起生效</p>
- <p class={[styles.goodsMemo, 'van-multi-ellipsis--l2']}>
- {state.vipYearInfo.description}
- </p>
- <div class={styles.goodsPrice}>
- <div class={styles.priceGroup}>
- 团购价:
- <p>
- <span>¥</span> {moneyFormat(state.vipYearInfo.currentPrice)}
- </p>
- </div>
- {/* <del class={styles.priceOrigin}>
- 原价: ¥{moneyFormat(state.vipYearInfo.originalPrice)}
- </del> */}
- </div>
- </div>
- )
- }}
- </Cell>
- <Cell border={false}>
- {{
- icon: () => <Image src={state.goodsInfo.goodsUrl} class={styles.goodsImg} />,
- value: () => (
- <div class={styles.goodsInfo}>
- <div class={styles.goodsTitle}>
- {state.goodsInfo.goodsName}
- {state.goodsInfo.currentPrice <= 0 ? <img src={iconFree} /> : ''}
- </div>
- <p class={[styles.goodsMemo, 'van-multi-ellipsis--l2']}>
- {state.goodsInfo.description}
- </p>
- <div class={styles.goodsPrice}>
- <div class={styles.priceGroup}>
- 团购价:
- <p>
- {state.goodsInfo.currentPrice <= 0 ? (
- <del>
- <span>¥</span> {moneyFormat(state.goodsInfo.groupPrice)}
- </del>
- ) : (
- <>
- <span>¥</span> {moneyFormat(state.goodsInfo.currentPrice)}
- </>
- )}
- </p>
- </div>
- {/* {state.goodsInfo.currentPrice > 0 ? (
- <>
- <div class={styles.priceGroup}>
- 团购价:
- <p>
- <span>¥</span> {moneyFormat(state.goodsInfo.currentPrice)}
- </p>
- </div>
- <div class={styles.priceOrigin}>
- 原价: ¥{moneyFormat(state.goodsInfo.originalPrice)}
- </div>
- </>
- ) : (
- <>
- <div class={styles.priceGroup}>
- 原价:
- <p>
- <span>¥</span>{' '}
- <del>{moneyFormat(state.goodsInfo.originalPrice)}</del>
- </p>
- </div>
- </>
- )} */}
- </div>
- </div>
- )
- }}
- </Cell>
- {otherParams.leBao.show ? (
- <Cell
- class={styles.inspectCell}
- style={{ backgroundColor: state.inspectStatus ? '#FFF3EA' : '#f4f4f4' }}
- >
- {{
- icon: () => (
- <img
- src={iconBao}
- class={styles.iconBao}
- onClick={() => {
- if (state.instrumentsInspectionDescribe) state.inspectPopupStatus = true
- }}
- />
- ),
- value: () => (
- <div class={styles.baoContainer}>
- <div
- class={styles.baoTitle}
- onClick={() => {
- if (state.instrumentsInspectionDescribe)
- state.inspectPopupStatus = true
- }}
- >
- 下校检查乐器 1-2次/学期
- </div>
- <div class={styles.baoPrice}>
- <p
- onClick={() => {
- state.inspectStatus = !state.inspectStatus
- calcPrice()
- }}
- >
- <span class={styles.prefix}>¥</span> {state.inspectInfo.currentPrice}
- <span class={styles.suffix}>/年</span>
- </p>
- <Checkbox
- v-model={state.inspectStatus}
- onClick={() => {
- calcPrice()
- }}
- >
- {{
- icon: (props: any) => (
- <img
- class={styles.checkboxImg}
- src={props.checked ? iconCheckboxActive : iconCheckbox}
- />
- )
- }}
- </Checkbox>
- </div>
- </div>
- )
- }}
- </Cell>
- ) : (
- ''
- )}
- </CellGroup>
- <OSticky position="bottom">
- <div class={styles.paymentContainer}>
- <div class={styles.payemntPrice}>
- <p class={styles.needPrice}>
- 总计:
- <span class={styles.numFont}>
- <span>¥ </span>
- {moneyFormat(state.orderInfo.needPrice)}
- </span>
- </p>
- </div>
- <div class={styles.paymentBtn}>
- <Button
- color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
- round
- native-type="submit"
- >
- 团购支付
- </Button>
- </div>
- </div>
- </OSticky>
- </>
- )}
- {forms.groupBuyType === 'SELF' && (
- <>
- <CellGroup class={[styles.applyCellGroup, styles.self]} border={false}>
- <div
- class={styles.toolImg}
- onClick={() => {
- showImagePreview([state.registerInfo?.instrumentPriceImg])
- localStorage.setItem('read-tool-image', '1')
- state.toolImgStatus = true
- }}
- >
- <Image src={state.registerInfo?.instrumentPriceImg} />
- {!state.toolImgStatus && (
- <div class={styles.toolImgOverflow}>
- <Button>点击查看《乐团训练工具标准配置表》</Button>
- <img src={iconHead} class={styles.iconHead} />
- </div>
- )}
- </div>
- <Field
- required
- label="您计划配置的乐器品牌"
- labelAlign="top"
- border={false}
- placeholder="请填写您计划配置的乐器品牌"
- v-model={forms.instrumentsBrand}
- maxlength={20}
- class={styles.toolInput}
- rules={[{ required: true, message: '请填写您计划配置的乐器品牌' }]}
- />
- <Field
- style="padding-top: 0;"
- required
- label="您计划配置的AI学练工具品牌"
- labelAlign="top"
- border={false}
- class={styles.toolInput}
- placeholder="请填写您计划配置的AI学练工具品牌"
- v-model={forms.learningTools}
- maxlength={20}
- rules={[{ required: true, message: '请填写您计划配置的AI学练工具品牌' }]}
- />
- </CellGroup>
- <div class={'btnGroup'} style={{ paddingTop: '30px' }}>
- <Button
- type="primary"
- color="linear-gradient(135deg, #FF8C4A 0%, #FF531C 100%)"
- round
- block
- native-type="submit"
- >
- 提交
- </Button>
- </div>
- </>
- )}
- </Form>
- {/* 年级 */}
- <Popup
- v-model:show={state.gradeStatus}
- position="bottom"
- round
- safeAreaInsetBottom
- // duration={0}
- lazyRender={false}
- class={'popupBottomSearch'}
- >
- <Picker
- showToolbar
- columns={state.currentGrade}
- onCancel={() => (state.gradeStatus = false)}
- onConfirm={(val: any) => {
- const selectedOption = val.selectedOptions[0]
- forms.currentGrade = selectedOption.value
- forms.currentGradeTxt = selectedOption.text
- state.gradeStatus = false
- }}
- />
- </Popup>
- {/* 班级 */}
- <Popup v-model:show={state.classStatus} position="bottom" round class={'popupBottomSearch'}>
- <Picker
- showToolbar
- columns={state.classList}
- onCancel={() => (state.classStatus = false)}
- onConfirm={(val: any) => {
- const selectedOption = val.selectedOptions[0]
- forms.currentClass = selectedOption.value
- forms.currentClassTxt = selectedOption.text
- state.classStatus = false
- }}
- />
- </Popup>
- {/* 入选声部 */}
- <Popup
- v-model:show={state.subjectStatus}
- position="bottom"
- round
- class={'popupBottomSearch'}
- >
- <Picker
- showToolbar
- columns={state.subjectList}
- onCancel={() => (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()
- }}
- />
- </Popup>
- {/* 入选声部 */}
- <Popup v-model:show={state.inspectPopupStatus} round closeable class={styles.inspectPopup}>
- <InspectModal describe={state.instrumentsInspectionDescribe} />
- </Popup>
- {/* 确认信息 */}
- <ODialog
- title="确认信息"
- v-model:show={state.submitStatus}
- message={
- '<p style="text-align: left;">请确认您准备的乐器和AI学练工具符合<span style="color: #F67146;font-weight: bold;">《乐团训练工具标准配置表》</span></p>'
- }
- class={styles.dialogSubmit}
- allowHtml
- confirmButtonText="返回"
- cancelButtonText="确认"
- showCancelButton
- onConfirm={() => {
- state.submitStatus = false
- }}
- onCancel={async () => {
- onRegisterUser()
- }}
- />
- {/* 学生在读 */}
- <ODialog
- title="提示"
- v-model:show={state.studentReadStatus}
- message={'您已在其他乐团在读,请退团再报名该乐团。'}
- confirmButtonText="确认"
- showCancelButton={false}
- onConfirm={() => {
- // state.submitStatus = false
- onLoutout()
- }}
- />
- <ODialog
- title="提示"
- v-model:show={state.dialogStatus}
- message={state.dialogMessage}
- confirmButtonText={state.dialogOrchestraStatus ? '确认取消' : '继续支付'}
- cancelButtonText="取消订单"
- showCancelButton={!state.dialogOrchestraStatus}
- messageAlign={state.dialogOrchestraStatus ? 'left' : 'center'}
- onConfirm={async () => {
- 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 {
- //
- }
- }}
- />
- </div>
- )
- }
- })
|