鸿宇研学生前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

404 lines
11 KiB

<template>
<view class="page__view">
<navbar title="填写订单" leftClick @leftClick="$utils.navigateBack" />
<view class="main">
<productCard :data="orderInfo"></productCard>
<uv-form
ref="form"
:model="form"
errorType="toast"
>
<view class="card">
<view class="card-header">联系人信息</view>
<view class="form-item">
<uv-form-item prop="name" :customStyle="formItemStyle">
<view class="form-item-label">
<image class="icon" src="@/pages_order/static/icon-require.png" mode="widthFix"></image>
真实姓名
</view>
<view class="form-item-content">
<formInput v-model="form.name"></formInput>
</view>
</uv-form-item>
</view>
<view class="form-item">
<uv-form-item prop="phone" :customStyle="formItemStyle">
<view class="form-item-label">
<image class="icon" src="@/pages_order/static/icon-require.png" mode="widthFix"></image>
手机号码
</view>
<view class="form-item-content">
<formInput v-model="form.phone"></formInput>
</view>
</uv-form-item>
</view>
</view>
<view class="card">
<view class="card-header">订单详情</view>
<view style="margin-top: 16rpx;">
<uv-form-item prop="members" :customStyle="formItemStyle">
<view>
<peopleNumberInput style="width: calc(100vw - 40rpx*2);"
v-model="form.prices"
:options="orderInfo.priceList"
></peopleNumberInput>
<memberChooseView
:members.sync="form.members"
></memberChooseView>
</view>
</uv-form-item>
</view>
</view>
<view class="card">
<view class="card-header">其他</view>
<view class="form-item">
<uv-form-item prop="couponId" :customStyle="formItemStyle">
<view class="form-item-label">选择优惠券</view>
<view class="form-item-content">
<view class="flex row" @click="jumpToSelectCoupon">
<view v-if="form.couponId" class="text">{{ couponInfo.title }}</view>
<view v-else class="text placeholder">请选择</view>
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
</view>
</view>
</uv-form-item>
</view>
<view class="form-item">
<uv-form-item prop="receiptId" :customStyle="formItemStyle">
<view class="form-item-label">选择发票类型</view>
<view class="form-item-content">
<view class="flex row" @click="jumpToSelectInvoice">
<view v-if="form.receiptId" class="text">{{ getInvoiceDesc(form.receiptId) }}</view>
<view v-else class="text placeholder">请选择</view>
<uv-icon name="arrow-right" color="#C6C6C6" size="32rpx"></uv-icon>
</view>
</view>
</uv-form-item>
</view>
</view>
</uv-form>
<view class="notice">
<!-- <view class="notice-header">下单须知</view> -->
<view class="notice-content">
<!-- todo: check key -->
<!-- <uv-parse :content="configList['order_instructions']"></uv-parse> -->
如有特殊病史或有不宜参加的旅程(项目)、男女报名如无法同住、分开报名需安排同住同车等,请备注
</view>
</view>
</view>
<view class="bottom">
<view class="agreement">
<uv-checkbox-group
v-model="checkboxValue"
shape="circle"
>
<uv-checkbox
size="40rpx"
icon-size="40rpx"
activeColor="#00A9FF"
:name="1"
></uv-checkbox>
</uv-checkbox-group>
<view class="desc">
我已阅读并同意
<text class="highlight" @click="$refs.modal.open('unsubscribe_policy', '退订政策')">《退订政策》</text>
<text class="highlight" @click="$refs.modal.open('model_contract', '合同范本')">《合同范本》</text>
<text class="highlight" @click="$refs.modal.open('booking_instructions', '预订须知')">《预订须知》</text>
<text class="highlight" @click="$refs.modal.open('safety_reminder', '安全提示')">《安全提示》</text>
</view>
</view>
<view class="flex bar">
<view class="col price">
<view class="flex price-label">
已选<view class="highlight">{{ `${totolPeople}人` }}</view>总额
</view>
<view class="flex price-value">
¥<view class="highlight">{{ totalPrice }}</view>
</view>
</view>
<button class="col btn btn-primary btn-pay" @click="onPay">立即支付</button>
</view>
</view>
<agreementModal ref="modal" @confirm="onConfirmAgreement"></agreementModal>
</view>
</template>
<script>
import { mapState } from 'vuex'
import productCard from '@/pages_order/order/components/productCard.vue'
import peopleNumberInput from './peopleNumberInput.vue'
import memberChooseView from './memberChooseView.vue'
import formInput from '@/pages_order/components/formInput.vue'
import agreementModal from '@/pages_order/components/agreementModal.vue'
export default {
components: {
productCard,
peopleNumberInput,
memberChooseView,
formInput,
agreementModal,
},
data() {
return {
form: {
name: '',
phone: '',
prices: [],
members: [],
couponId: '',
receiptId: '',
},
rules: {
'name': {
type: 'string',
required: true,
message: '请输入真实姓名',
},
'phone': {
type: 'string',
required: true,
message: '请输入手机号码',
},
'prices': {
type: 'array',
message: '请选择人数',
validator: (rule, value, callback) => {
if (value.some(num => num > 0)) {
return true
}
return false
},
},
'members': {
type: 'array',
required: true,
message: '请选择出行人',
},
},
checkboxValue: [],
formItemStyle: { padding: 0 },
}
},
computed: {
...mapState(['configList', 'userInfo', 'orderInfo', 'couponInfo']),
productPackage() {
const { time, product } = this.orderInfo
const { dateList } = product || {}
return dateList?.find?.(item => item.id === time) || {}
},
totolPeople() {
const { prices } = this.orderInfo
return prices.reduce((total, num) => {
return total + num
}, 0)
},
priceOrigin() {
const { prices, priceList } = this.orderInfo
return prices.reduce((total, num, index) => {
return total + priceList[index].price * (num || 0)
}, 0)
},
discount() {
return this.couponInfo?.discountAmount || 0
},
totalPrice() {
return this.priceOrigin - this.discount
},
},
onShow() {
if (this.couponInfo) {
this.form.couponId = this.couponInfo.id
}
},
onLoad(arg) {
console.log('onLoad')
console.log('orderInfo', this.orderInfo)
this.initData()
},
onReady() {
this.$refs.form.setRules(this.rules);
},
onUnload() {
this.$store.commit('setCouponInfo', null)
},
methods: {
initData() {
const {
time,
prices,
priceList,
members,
} = this.orderInfo
console.log('priceList', priceList)
console.log('members', members)
let arr = []
this.form = {
name: '',
phone: '',
prices,
members: members.map(item => ({ ...item, isSelected: true })),
couponId: '',
receiptId: '',
}
},
jumpToSelectCoupon() {
uni.navigateTo({
url: `/pages_order/coupon/couponSelect/index`
})
},
getCouponDesc() {
// todo
},
jumpToSelectInvoice() {
// todo
},
getInvoiceDesc() {
// todo
},
onConfirmAgreement(confirm) {
if (confirm) {
this.checkboxValue = [1]
} else {
this.checkboxValue = []
}
},
async onPay() {
if(!this.checkboxValue.length){
return uni.showToast({
title: '请先同意《用户协议》《隐私协议》《消费者告知》',
icon:'none'
})
}
try {
await this.$refs.form.validate()
const {
product,
time,
priceList,
} = this.orderInfo
console.log('priceList', priceList)
console.log('members', members)
const {
name,
phone,
prices,
members,
couponId,
receiptId,
} = this.form
const { startDate, endDate } = this.productPackage
// let json = members.map(member => {
// const { periodId } = member
// const { period_dictText, price } = priceList.find(item => item.periodId === periodId) || {}
// return {
// ...member,
// period_dictText,
// price,
// }
// })
// console.log('json', json)
let params = {
activityId: product.id,
startDate,
endDate,
dayNum: this.$dayjs(endDate).diff(this.$dayjs(startDate), 'day'),
couponId,
receiptId,
name,
phone,
priceOrigin: this.priceOrigin,
discount: this.discount,
priceDiscount: this.totalPrice,
payAmount: this.totalPrice,
tourisIds: members.map(touris => touris.id).join(';'),
// jsonObject: JSON.stringify(json),
}
const orderId = await this.$fetch('createOrder', params)
uni.navigateTo({
url: `/pages_order/order/orderPay/index?id=${orderId}`
})
} catch (err) {
console.log('createOrder', err)
}
},
},
}
</script>
<style scoped lang="scss">
@import '../styles/style.scss';
.price {
justify-content: flex-start;
&-label {
justify-content: flex-start;
column-gap: 12rpx;
font-family: PingFang SC;
font-weight: 400;
font-size: 24rpx;
line-height: 1.4;
color: #626262;
.highlight {
font-size: 24rpx;
font-weight: 500;
color: $uni-color;
}
}
&-value {
justify-content: flex-start;
column-gap: 8rpx;
font-family: PingFang SC;
font-weight: 500;
font-size: 24rpx;
line-height: 1.4;
color: $uni-color;
.highlight {
font-size: 40rpx;
}
}
}
.btn-pay {
flex: none;
width: auto;
padding: 14rpx 74rpx;
}
</style>