import { orderType } from './../../constant/index' import { reactive } from 'vue' import { state } from '@/state' import request from '@/helpers/request' import { browser } from '@/helpers/utils' import { Dialog } from 'vant' import dayjs from 'dayjs' type orderType = | 'VIDEO' | 'LIVE' | 'PRACTICE' | 'GOODS' | 'VIP' | 'SVIP' | 'MUSIC' | 'PIANO_ROOM' | 'ACTI_REGIST' | 'ALBUM' | 'TENANT_ALBUM' | '' const original = () => { return { orderType: '' as orderType, // 购买类型 orderInfo: { // 订单信息 orderNo: '', actualPrice: 0, payStatus: true }, orderObject: { // 订单对象 orderNo: '', actualPrice: 0, orderName: '', orderDesc: '', orderType: '' as orderType, recomUserId: null as any, // 推荐人编号 orderList: [] as Array, // 商品信息 activityId: '' as any, // 活动编号 couponId: '' as string, // 优惠券编号 couponDiscountPrice: 0 as number, // 优惠券扣减金额 discountPrice: 0 as number // 优惠 } as any // orderObject: { // orderNo: '', // actualPrice: 28, // orderName: '小酷Ai月度会员', // orderDesc: '小酷Ai月度会员', // orderType: 'VIP', // recomUserId: 0, // activityId: null, // orderList: [ // { // orderType: 'VIP', // goodsName: '小酷Ai月度会员', // id: 2, // title: '月度会员', // price: 28, // startTime: '2023-02-28', // endTime: '2023-03-28' // } // ] // } } } export const orderStatus = reactive(original()) // 重置对象 export const resestState = () => { Object.assign(orderStatus, original()) } // 购买会员多少数量满足条件 export const memberNeedNumber = (item: any) => { if (item.vipEndDays > 0) { const endTime = dayjs(item.startTime).add(item.vipEndDays, 'day') const unit = item.period === 'YEAR' ? 'years' : 'months' const months = endTime.diff(dayjs(item.startTime), unit) if (item.period === 'MONTH') { return months + 1 } else if (item.period === 'QUARTERLY') { return Math.ceil((months + 1) / 3) } else if (item.period === 'YEAR_HALF') { return Math.ceil((months + 1) / 6) } else if (item.period === 'YEAR') { return months + 1 } else { return 1 } } return 1 } export const orderInfos = () => { // 商品列表 const orderList = orderStatus.orderObject.orderList || [] return orderList.map((item: any) => { const params = { goodType: item.orderType, goodName: item.goodsName, recomUserId: item.recomUserId, // 推荐人id bizContent: {} } as any if (item.orderType === 'VIDEO') { params.bizContent = { videoLessonGroupId: item.courseGroupId, payMoney: item.coursePrice || 0 } } else if (item.orderType === 'LIVE') { params.bizContent = { groupId: item.courseGroupId } } else if (item.orderType === 'PRACTICE') { const tempTime = item.classTime || [] const classCourse: any = [] tempTime.forEach((time: any) => { classCourse.push({ classDate: time.classDate, startTime: time.startTime, endTime: time.endTime }) }) params.bizContent = { courseGroupName: item.courseGroupName, courseIntroduce: item.courseIntroduce, subjectId: item.subjectId, singleCourseMinutes: item.singleCourseMinutes, courseNum: item.courseNum, coursePrice: item.coursePrice, teacherId: item.teacherId, classTime: classCourse } } else if (item.orderType === 'VIP') { params.bizContent = item.id params.goodsNum = item.num } else if (item.orderType === "SVIP") { params.bizContent = item.id const needNumber = memberNeedNumber(item) params.vipEndDays = item.num > needNumber ? item.vipEndDays : null params.goodsNum = item.num } else if (item.orderType === 'MUSIC') { params.bizContent = { musicSheetId: item.id, actualPrice: item.actualPrice || 0, clientType: state.platformType } } else if (item.orderType === 'ALBUM') { params.bizContent = { musicSheetId: item.id, actualPrice: item.actualPrice || 0, clientType: state.platformType } } else if (item.orderType === 'PIANO_ROOM') { params.bizContent = item.id } else if (item.orderType === 'ACTI_REGIST') { params.bizContent = { activityId: item.activityId } } else if (item.orderType === 'TENANT_ALBUM') { params.bizContent = { musicSheetId: item.id, actualPrice: item.actualPrice || 0, clientType: state.platformType } } return params }) } export const orderTenantInfos = () => { // 商品列表 const orderList = orderStatus.orderObject.orderList || [] return orderList.map((item: any) => { const params: any = { goodType: item.orderType, goodName: item.goodsName, goodNum: 1, bizContent: {} } as any if (item.orderType === 'VIP') { params.bizContent = item.id params.bizId = item.id params.goodsNum = item.num } else if (item.orderType === "SVIP") { params.bizContent = item.id // params.vipEndDays = item.vipEndDays const needNumber = memberNeedNumber(item) params.vipEndDays = item.num > needNumber ? item.vipEndDays : null params.goodsNum = item.num } else if (item.orderType === 'MUSIC') { params.bizContent = { musicSheetId: item.id, actualPrice: item.actualPrice || 0, clientType: state.platformType } params.bizId = item.id } else if (item.orderType === 'ALBUM') { params.bizContent = { musicSheetId: item.id, actualPrice: item.actualPrice || 0, clientType: state.platformType } params.bizId = item.id } else if (item.orderType === 'TENANT_ALBUM') { console.log(item, 'item') params.bizContent = { tenantAlbumId: item.id, actualPrice: item.actualPrice || 0, buyNumber: 1, buyMultiple: 1, clientType: state.platformType } params.tenantGroupAlbumId = item.tenantGroupAlbumId params.bizId = item.id params.buyNumber = 1 params.buyMultiple = 1 } else if (item.orderType === 'LIVE') { params.bizContent = { groupId: item.courseGroupId } } else if (item.orderType === 'VIDEO') { params.bizContent = { videoLessonGroupId: item.courseGroupId, payMoney: item.coursePrice || 0 } } else if (item.orderType === 'PRACTICE') { const tempTime = item.classTime || [] const classCourse: any = [] tempTime.forEach((time: any) => { classCourse.push({ classDate: time.classDate, startTime: time.startTime, endTime: time.endTime }) }) params.bizContent = { courseGroupName: item.courseGroupName, courseIntroduce: item.courseIntroduce, subjectId: item.subjectId, singleCourseMinutes: item.singleCourseMinutes, courseNum: item.courseNum, coursePrice: item.coursePrice, teacherId: item.teacherId, classTime: classCourse } } else if (item.orderType === 'PIANO_ROOM') { params.bizContent = item.id } else if (item.orderType === 'ACTI_REGIST') { params.bizContent = { activityId: item.activityId } } return params }) } /** * @title 0元购买 * @param {function} callBack 回调函数 * @returns {Promise} */ export const onSubmitZero = async (callBack?: Function): Promise => { // 正常支付 try { const orderObject = orderStatus.orderObject const url = state.platformType === 'TEACHER' ? '/api-teacher/userOrder/executeOrder' : '/api-student/userOrder/executeOrder' const res = await request.post(url, { data: { orderName: orderObject.orderName, orderDesc: orderObject.orderDesc, orderType: orderObject.orderType, actualPrice: orderObject.actualPrice || 0, recomUserId: orderObject.recomUserId, activityId: orderObject.activityId, orderInfos: [...orderInfos()] } }) const result = res.data || {} // 支付成功 if (result.status == 'PAID') { if (callBack) { callBack() } else { Dialog.alert({ message: '领取成功', confirmButtonText: '确定', confirmButtonColor: '#2dc7aa' }) } } else { Dialog.alert({ message: result.msg, confirmButtonText: '确定', confirmButtonColor: '#2dc7aa' }) } } catch { Dialog.alert({ title: '提示', message: '支付失败,请稍后重试!', confirmButtonText: '确定', confirmButtonColor: '#2dc7aa' }) } } /** * @author wxl * @description 处理基础支付功能 */ // 判断浏览器与支付类型,返回对应页面名称 export const beforeSubmit = (pt: string) => { // const pt = state.pay_channel let payCode = 'qrCode' // 判断当前浏览器 if (browser().weixin) { // 微信浏览器 if (pt == 'alipay_qr' || pt == 'alipay_wap') { payCode = 'qrCode' } else if (pt == 'wx_pub') { payCode = 'pay' } } else if (browser().alipay) { // 支付宝浏览器 if (pt == 'alipay_wap') { // 支付宝 H5 支付 payCode = 'pay' } else { payCode = 'qrCode' } } else { payCode = 'qrCode' } return payCode == 'qrCode' ? 'payDefine' : 'payResult' }