travelOrder.vue 11.8 KB
<template>
  <div>
    <div class="box">
      <el-card :body-style="{ padding: '0px' }" class="mt20">
        <div slot="header">
          <div class="bg-lineg">{{ language == 0 ? '旅游服务下单' : 'Hotel booking order' }}</div>
        </div>
        <!--        {{room}}-->
        <el-row class="pd20" :gutter="20">
          <el-col :span="14">
            <div class="border-info">
              <h3>{{ hotelName }}</h3>
              <div class="roomType">{{ room.roomType }}</div>
              <div class="room">
                <span>{{ room.bedType }}</span>
              </div>
            </div>

            <div class="leftboderTT">{{ language == 0 ? '预约信息' : 'Reservation information' }}</div>
            <div class="border-rr mt20 pd20">
              <el-form :model="form" :label-width="language == 0 ?'120':'160'" :rules="rules" ref="formRef">
<!--                :disabled-date="disabledDateRZ"-->
                <el-form-item :label="language==0?'选择日期':'Date'" required>
                  <el-date-picker v-model="rzRange"
                    format="YYYY-MM-DD" :clearable="false"
                    value-format="YYYY-MM-DD"/>

                  <div class="tip" v-if="lform.travelStart">{{ language==0?'可订日期':'Available date' }}{{ lform.travelStart.slice(0, 10) }} ~ {{ lform.travelEnd.slice(0, 10) }}</div>

                  <!--                    :picker-options="pickerOptions"-->
                </el-form-item>
                <el-form-item :label="language==0? n.name:'Rooms'" required prop="roomNum" v-for="n in typeList">
                  <el-input-number v-model="n.num" :min="0" :max="canOrderNum" @change="changeRoomNum(n)"/>
                  <div class="red ml20">
                    <span v-if="language == 0">剩余票数:{{ canOrderNum }}</span>
                    <span v-else>{{ canOrderNum }} Remaining rooms</span>
                  </div>
                  <div class="tip" v-if="language==1">If you need to make a hotel reservation, please fill in the full names of all required persons when booking the hotel. (For two or more people, please use ',')</div>
                </el-form-item>

                <div class="fakeFormItem">
                  <label>需填写{{ needPersonNum }}位游客</label>
                  <div>
                    <div v-show="needPersonNum > form.personArr.length">还需填写{{needPersonNum-form.personArr.length}}位游客</div>
                    <div>
                      <el-button plain type="primary" @click="showAddPerson">新增出行人</el-button>
                    </div>
                  </div>
                </div>
                <div v-show="form.personArr.length>0">
                  <div class="fakeFormItem personIt" v-for="(n,index) in form.personArr">
                    <label>
                      <el-icon @click="delPerson(n,index)"><Remove /></el-icon>
                      游客{{index+1}}
                    </label>
                    <div class="mation">
                      <div>{{n.name}}</div>
                      身份证:{{n.idcCode}}
                    </div>
                    <el-icon @click="showAddPerson(n)"><Edit /></el-icon>
                  </div>
                </div>

                <el-form-item :label="language==0?'联系手机':'Contact phone'" required prop="phone">
                  <el-input v-model="form.phone"/>
                </el-form-item>

              </el-form>
            </div>
          </el-col>
          <el-col :span="10">
            <div class="leftboderTT">{{ language == 0 ? '订单明细' : 'Order details' }}</div>
            <div class="border-rr mt20 pd20 ccitemBox">
              <label> {{ language == 0 ? '基本费用' : 'Room fee' }}
                <span class="fr" v-if="language==0">{{
                    language == 0 ? '¥' : '€'
                  }}{{ ( form.roomNum * choseRooms.length).toFixed(2) }}</span>
                <span class="fr" v-else>{{
                    language == 0 ? '¥' : '€'
                  }}{{ ( form.roomNum * choseRooms.length).toFixed(2) }}</span>
              </label>
              <div class="ccitem" v-for="(c, index) in choseRooms" :key="index" v-show="form.roomNum>0">
                {{ c }}
                <span v-if="language==0">{{ form.roomNum }}*{{ language == 0 ? '¥' : '€' }}{{ room.roomPrice }}</span>
                <span v-else>{{ form.roomNum }}*{{ language == 0 ? '¥' : '€' }}{{ room.roomPriceEn }}</span>
              </div>


              <label>{{ language == 0 ? '共计' : 'Total' }}<span
                  class="fr bigMoney">{{ language == 0 ? '¥' : '€' }}{{ money }}</span></label>

            </div>
          </el-col>
        </el-row>
      </el-card>

      <el-card class="mt30">
        <el-row justify="space-between" align="middle">
          <el-col :span="12">
            <label>{{ language == 0 ? '共计金额' : 'Total' }}
              <span class=" text-warning">  {{ language == 0 ? '¥' : '€' }}<span class="bigMoney">{{ money }}</span></span>
            </label>
          </el-col>
          <el-col :span="12" class="text-right">
            <el-button type="primary" class="btn-lineG w200px" size="large" round @click="submit">{{ language == 0 ?'确认付款':'Book Now' }}</el-button>
          </el-col>
        </el-row>
      </el-card>
      <div style="height: 60px;"></div>

    </div>

    <el-dialog v-model="show" title="出行人信息" width="500px" center>
      <div>
      <el-form label-width="100" ref="personRef">
        <el-form-item label="姓名">
          <el-input v-model="person.name" placeholder="请与证件姓名一致"/>
        </el-form-item>
        <el-form-item label="证件号">
          <el-input v-model="person.idcCode" placeholder="请填写身份证号"/>
        </el-form-item>
      </el-form>
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="show = false">取 消</el-button>
          <el-button type="primary" @click="addPerson">完成</el-button>
        </div>
      </template>
    </el-dialog>
  </div>
</template>

<script setup>
import {useRouter, useRoute} from "vue-router";
import {ref, reactive, onMounted} from "vue";
import {useStorage} from "@vueuse/core/index";
import {checkResidueRoom, getBaseInfoByActiveId, newsSubmitOrderHotel} from "@/apiPc/booking"
import dayjs from 'dayjs'
import {ElMessage,ElMessageBox} from "element-plus";
import useUserStore from "@/store/modules/user";
const user = useUserStore().user
const language = useStorage('language', 0)
const router = useRouter()
const route = useRoute()
const room = ref({})
const hotelName = ref('')
const canOrderNum = ref(0)
const needPersonNum = ref(0)
const person = ref({
  name: '',
  idcCode: ''
})
const show = ref(false)
const lform = ref({})
const form = ref({
  roomNum: 0,
  phone: user?.phonenumber||'',
  personArr: []
})
const rzRange = ref('')
const typeList = ref([
    {
      name: '成人票',
      value: '1'
    },
    {
      name: '儿童票',
      value: '2'
    },
    {
      name: '老年票',
      value: '2'
    }
])
const money = ref(0)
const choseRooms = ref([])
const rules = ref({
  phone: { required: true, message: language.value==0? '请输入联系电话':"Please enter a contact number", trigger: 'blur' }
})

let usedays = 0
onMounted(() => {
  console.log(route.query)
  hotelName.value = route.query.hotelName
  money.value = 0
  rzRange.value = dayjs(route.query.start).format('YYYY-MM-DD')
  initDays()
  checkreRooms()
})
function initDays() {
  // 可定日期范围
  getBaseInfoByActiveId(route.params.cptId).then(res=>{
      lform.value = res.data
  }).catch(err=>{
    console.log(err)
  })
}
function disabledDateRZ(date) {
  //判读今天大与form.value.travelStart
  if (lform.value.travelStart) {
    const today = dayjs().format('YYYY-MM-DD')
    if (lform.value.travelStart < today) {
      return !((date.getTime() >= dayjs(today).valueOf())&&(date.getTime() <= dayjs(lform.value.travelEnd).valueOf()))
    } else {
      return !((date.getTime() >= dayjs(lform.value.travelStart).valueOf())&&(date.getTime() <= dayjs(lform.value.travelEnd).valueOf()))
    }
  }
  // return true
}
function changeRoomNum(e) {
  console.log(e)
  countMoney()
}
function checkreRooms() {
  //获取票类型 typeList
}
const showAddPerson = (item) => {
  if(item){
    person.value = item
  } else {
    person.value = {
      name: '',
      idcCode: ''
    }
  }
  show.value = true
}
const addPerson = () => {
  if(!person.value.name){
    ElMessage.warning(language.value == 0 ? '请填写姓名' : 'Please fill in the name')
    return
  }
  if(!person.value.idcCode){
    ElMessage.warning(language.value == 0 ? '请填写身份证号' : 'Please fill in the ID number')
    return
  }
  form.value.personArr.push(person.value)
  show.value = false
}
const delPerson = (item,index) => {
  form.value.personArr.splice(index,1)
}

function countMoney() {
  if (language.value == 0) {
    money.value = ((form.value.roomNum * usedays) + ( form.value.addNum * usedays)).toFixed(2)
  } else {
    money.value = ((form.value.roomNum * usedays) + (form.value.addNum * usedays)).toFixed(2)

  }
  if (money.value == 'NaN') money.value = 0.00
}

function submit() {
  if(!user){
    useUserStore().setReLogin()
    return
  }
  if(!rzRange.value)return ElMessage.warning(language.value == 0 ? '请选择预订日期' : 'Please select check-in time')
  if(!form.value.phone){
    ElMessage.warning(language.value == 0 ? '请填写手机号' : 'Please fill in the phone number')
    return
  }
  if(form.value.personArr.length!=needPersonNum.value){
    ElMessage.warning(language.value == 0 ? '出行人数与票数不匹配' : 'The number of people travelling does not match the number of rooms')
    return
  }

  // 提交确认
  ElMessageBox.confirm(language.value == 0 ? '确认提交订单吗?' : 'Confirm to submit the order?', {
    confirmButtonText: language.value == 0 ? '确定' : 'Confirm',
    cancelButtonText: language.value == 0 ? '取消' : 'Cancel',
    type: 'warning'
  }).then(() => {
    newsSubmitOrderHotel(form.value).then(res => {
      if (res.data) {
        if (res.data.roomNum == -100) {
          ElMessage.warning(language.value == 0 ? '剩余票数不足' : 'The remaining number of rooms is insufficient')
          checkreRooms()
        } else {
          //去付钱
          router.push({
            name: 'bookingPay',
            query: {
              orderId:res.data.orderId,
              money:res.data.total,
              type:'hotel'
            }
          })
        }
      }
    })
  })
}

</script>

<style scoped lang="scss">
.bigMoney {
  font-size: 36px !important;
  font-family: 'DIN Alternate';
  font-weight: bold;
}

.bg-lineg {
  height: 40px;
  line-height: 40px;
  font-size: 18px;
  text-align: center;
}

.leftboderTT {
  font-weight: 600;
  font-size: 16px;
  color: #453DEA;
}

.border-rr {
  border-radius: 5px;
  border: 1px solid #DCDFE6;
}

.room {
  font-weight: 400;
  font-size: 14px;
  color: #929AA0;
}

.ccitemBox {
  overflow: auto;

  label {
    margin: 10px 0;
    display: block;
    min-height: 30px;

    span {
      color: #FF8124;
      font-family: DIN Alternate;
      font-size: 24px;
    }
  }
}

.ccitem {
  display: flex;
  justify-content: space-between;
  font-size: 15px;
  color: #666;
  margin: 5px 0 10px;

  label {
    font-size: 16px;
    color: #000;
  }

  span {
    font-size: 13px;
  }
}

.red {
  color: #FF8124;
}
.fakeFormItem {
  display: flex;
  padding: 10px 0;
  label{    height: 32px;    font-size: var(--el-form-label-font-size);    width: 120px;
    color: var(--el-text-color-regular);    padding: 0 12px 0 0;
    line-height: 32px;flex: 0 0 auto;
    display: inline-flex;
    justify-content: flex-end;
    align-items: center;gap: 10px;}
}
.tip{font-size: 14px;color: #666;padding: 0 10px;}
.personIt{display: flex;align-items: center;
  .mation{width: 200px;font-size: 12px;
    div{font-size: 14px;}
  }
}
</style>