Commit 488bbe9a authored by 黄奎's avatar 黄奎

车辆

parent 41ccdbfe
import { HttpResponse } from '../@types'
import request from './request'
class HotelService {
/**
* 查詢當前登入用戶的酒店訂單信息
* @param param
* @returns
*/
static async vehicletripbus(param: any): Promise<HttpResponse> {
return request('tripbus_SetTripBus', param)
}
/**
* 查詢用车类型上面
* @param param
* @returns
*/
static async TypeVehicle(param: any): Promise<HttpResponse> {
return request('tripbus_GetBusTypeList', param)
}
/**
* 查詢用车类型列表下面
* @param param
* @returns
*/
static async listTypeVehicle(param: any): Promise<HttpResponse> {
return request('tripbus_GetTripBusUseType', param)
}
/**
* 查詢用车类预定列表
* @param param
* @returns
*/
static async vehicleList(param: any): Promise<HttpResponse> {
return request('tripbus_GetTripBusPage', param)
}
/**
* 修改查詢用车类详情
* @param param
* @returns
*/
static async VehicleDetails(Id: number): Promise<HttpResponse> {
return request('tripbus_GetTripBusInfo', { Id })
}
/**
* 取消用车
* @param param
* @returns
*/
static async cancellation(Id: number, CancelRemark: any): Promise<HttpResponse> {
return request('tripbus_CancelBusTrip', { Id, CancelRemark })
}
}
export default HotelService
\ No newline at end of file
<template>
<div class="full-height column hotel-list">
<q-table v-if="$q.platform.is.desktop" :loading="loading" :rows="hotels" :loading-label="$t('loading')" class="sticky-column-table col sticky-header-column-table hotel-table" flat :pagination="pages" :no-data-label="$t('noneData')">
<q-table v-if="$q.platform.is.desktop" :loading="loading" :rows="hotels" :loading-label="$t('loading')"
class="sticky-column-table col sticky-header-column-table hotel-table" flat :pagination="pages"
:no-data-label="$t('noneData')">
<template v-slot:top>
<div class="row full-width">
<div class="col"></div>
......@@ -17,13 +19,15 @@
<q-th v-for="(x, i) in cols">
{{ x }}
</q-th>
<q-th>{{$t('hotel.addRoomBtn')}}</q-th>
<q-th>{{ $t('hotel.addRoomBtn') }}</q-th>
</q-tr>
</template>
<template v-slot:body="props">
<q-tr :props="props">
<q-td style="width:200px">
<div class="ellipsis-3-lines" style="padding: 7px 16px;width: 200px;white-space: break-spaces;">{{ props.row.HotelName }}</div>
<div class="ellipsis-3-lines" style="padding: 7px 16px;width: 200px;white-space: break-spaces;">{{
props.row.HotelName
}}</div>
</q-td>
<q-td>
<div class="td-item">{{ $t('hotel.table.price') }}</div>
......@@ -50,47 +54,44 @@
</div>
</q-td>
<q-td class="text-center" style="border-left:1px solid #eee;">
<q-btn color="primary" :label="$t('hotel.addRoom')" size="sm" outline @click="finishHanler(props.row)"/>
<q-btn color="primary" :label="$t('hotel.addRoom')" size="sm" outline @click="finishHanler(props.row)" />
</q-td>
</q-tr>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount" :input="true" @update:model-value="changePageHandler" />
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount"
:input="true" @update:model-value="changePageHandler" />
</template>
</q-table>
<q-table
hide-header
v-else
:rows="hotels"
grid
:columns="mobileCols"
row-key="name"
card-class="no-shadow bg-primary text-white col"
:pagination="pages"
:loading="loading"
>
<template v-slot:item="props">
<div @click="viewHotelPriceListHandler(props.row)" class="rounded-borders bg-primary text-white col-12 q-mb-sm" style="padding: 12px;margin-left: 12px;margin-right: 12px; width: calc(100% - 24px);">
<div>
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{$t('hotel.col.first')}}</div>
<div style="font-size: 13px;">{{props.row.HotelName}}</div>
</div>
<div class="q-my-md">
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{$t('hotel.col.three')}}</div>
<div style="font-size: 13px;">{{props.row.TotalInventory}}</div>
</div>
<div>
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{$t('hotel.col.four')}}</div>
<div class="row items-center justify-between">
<span>{{props.row.LowerPrice.toFixed(2)}}{{$t('unit.jp')}} {{$t('hotel.col.low')}}</span>
<q-btn color="grey-3" :label="$t('hotel.addRoom')" size="sm" outline @click="finishHanler(props.row)"/>
<q-table hide-header v-else :rows="hotels" grid :columns="mobileCols" row-key="name"
card-class="no-shadow bg-primary text-white col" :pagination="pages" :loading="loading">
<template v-slot:item="props">
<div @click="viewHotelPriceListHandler(props.row)" class="rounded-borders bg-primary text-white col-12 q-mb-sm"
style="padding: 12px;margin-left: 12px;margin-right: 12px; width: calc(100% - 24px);">
<div>
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{ $t('hotel.col.first') }}
</div>
<div style="font-size: 13px;">{{ props.row.HotelName }}</div>
</div>
<div class="q-my-md">
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{ $t('hotel.col.three') }}
</div>
<div style="font-size: 13px;">{{ props.row.TotalInventory }}</div>
</div>
<div>
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{ $t('hotel.col.four') }}
</div>
<div class="row items-center justify-between">
<span>{{ props.row.LowerPrice.toFixed(2) }}{{ $t('unit.jp') }} {{ $t('hotel.col.low') }}</span>
<q-btn color="grey-3" :label="$t('hotel.addRoom')" size="sm" outline @click="finishHanler(props.row)" />
</div>
</div>
</div>
</div>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount" :input="true" @update:model-value="changePageHandler" />
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount"
:input="true" @update:model-value="changePageHandler" />
</template>
</q-table>
<q-dialog v-model="showPriceList">
......@@ -105,7 +106,7 @@ import HotelService from '../../../api/hotel'
import { DirtionmaryHelper } from '../../../config/dictionary'
import message from '../../../utils/message'
import { defineComponent, inject, reactive, toRefs, watch } from 'vue'
import { date,useQuasar } from 'quasar'
import { date, useQuasar } from 'quasar'
import { DateType, getDateType, getDayOfWeek } from '../../../utils/tools'
import { useI18n } from 'vue-i18n'
import HotelPriceList from '../list/HotelPriceList.vue'
......@@ -113,9 +114,9 @@ import SamplePriceList from '../list/SamplePriceList.vue'
export default defineComponent({
components: { HotelPriceList, SamplePriceList },
name: 'list-table',
emits:['finish'],
setup(props,context) {
const $q=useQuasar()
emits: ['finish'],
setup(props, context) {
const $q = useQuasar()
const { t } = useI18n()
const search = inject(DirtionmaryHelper.HOTEL_QUERY_PARAM) as any
watch(search, (n, o) => {
......@@ -137,13 +138,13 @@ export default defineComponent({
},
pageTitle: '' as (string | undefined),
dateTypes: [] as Array<DateType>,
mobileCols:[
{name:'HotelName',label:t('hotel.col.first'),field:(row:any)=>row.HotelName},
{name:'TotalInventory',label:t('hotel.col.three'),field:(row:any)=>row.TotalInventory},
{name:'LowerPrice',label:t('hotel.col.four'),field:(row:any)=>row.LowerPrice}
mobileCols: [
{ name: 'HotelName', label: t('hotel.col.first'), field: (row: any) => row.HotelName },
{ name: 'TotalInventory', label: t('hotel.col.three'), field: (row: any) => row.TotalInventory },
{ name: 'LowerPrice', label: t('hotel.col.four'), field: (row: any) => row.LowerPrice }
],
showPriceList:false,
queryHotelObj:{}
showPriceList: false,
queryHotelObj: {}
})
......@@ -164,11 +165,11 @@ export default defineComponent({
y.PriceList.forEach((z: any) => {
z.ins = methods.getDateTypeById(z.InventoryType)
})
let cd=new Date(y.DateStr)
y.FormatDate=`${date.formatDate(cd, 'MM/DD')} (${getDayOfWeek(date.getDayOfWeek(cd))})`
let cd = new Date(y.DateStr)
y.FormatDate = `${date.formatDate(cd, 'MM/DD')} (${getDayOfWeek(date.getDayOfWeek(cd))})`
})
if($q.platform.is.mobile){
x.LowerPrice=methods.calcLowerPrice(x)
if ($q.platform.is.mobile) {
x.LowerPrice = methods.calcLowerPrice(x)
}
})
......@@ -202,28 +203,28 @@ export default defineComponent({
getDateTypeById(id: number) {
return data.dateTypes.find(x => x.id == id)
},
calcLowerPrice(hotel:any){
let lower=0
hotel.subList.forEach((x:any)=>{
if(x.PriceList &&x.PriceList.length>0){
x.PriceList.forEach((y:any)=>{
if(y.CostPrice>lower) lower= y.CostPrice
calcLowerPrice(hotel: any) {
let lower = 0
hotel.subList.forEach((x: any) => {
if (x.PriceList && x.PriceList.length > 0) {
x.PriceList.forEach((y: any) => {
if (y.CostPrice > lower) lower = y.CostPrice
})
}
})
return lower
},
viewHotelPriceListHandler(row:any){
viewHotelPriceListHandler(row: any) {
data.queryHotelObj = row
data.showPriceList = true
},
finishHanler(hotel:any){
context.emit('finish',hotel)
finishHanler(hotel: any) {
context.emit('finish', hotel)
}
}
methods.calcDateRangeCols()
methods.initHotels()
return { ...toRefs(data), ...methods,search }
return { ...toRefs(data), ...methods, search }
}
})
</script>
......@@ -234,6 +235,7 @@ export default defineComponent({
height: 14px;
border-radius: 4px;
}
.td-item {
width: 100%;
height: 35px;
......@@ -244,12 +246,15 @@ export default defineComponent({
text-align: center;
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
}
.td-item:last-child {
border-bottom: none;
}
.hotel-table .q-table td {
padding: 0 !important;
}
/* .td-item.cursor-pointer:hover{
color: var(--q-primary) !important;
} */
......
......@@ -2,16 +2,20 @@
<q-card flat class="light-shadow rounded-border window-width q-pa-none">
<q-card-section class="q-pa-sm">
<div class="text-h6">{{ h.HotelName }}</div>
<div class="f12 text-grey-5">{{ `${search.StartDate} ${$t('hotel.col.zhi')} ${search.EndDate}` }} {{ $t('hotel.pricetips') }}</div>
<div class="f12 text-grey-5">{{ `${search.StartDate} ${$t('hotel.col.zhi')} ${search.EndDate}` }} {{
$t('hotel.pricetips')
}}</div>
</q-card-section>
<div style="max-height: 60vh; overflow-y: auto" class="q-pa-sm">
<template v-for="x in h.subList">
<div class="rounded-borders q-pa-sm q-mt-md" v-if="x.PriceList && x.PriceList.length > 0" :class="[x.PriceList[0].ins.bg, x.PriceList[0].ins.color]">
<div class="rounded-borders q-pa-sm q-mt-md" v-if="x.PriceList && x.PriceList.length > 0"
:class="[x.PriceList[0].ins.bg, x.PriceList[0].ins.color]">
<div class="row items-center">
<div class="text-subtitle2 col">
{{ x.FormatDate }}
</div>
<div class="f12" style="opacity: 0.5" :class="[x.PriceList[0].ins.color]">{{ x.PriceList[0].ins.text }}</div>
<div class="f12" style="opacity: 0.5" :class="[x.PriceList[0].ins.color]">{{ x.PriceList[0].ins.text }}
</div>
</div>
<!-- <q-separator color="white" style="opacity: .3;"/> -->
<div class="row justify-between q-pb-sm" style="border-bottom: 1px dashed rgba(255, 255, 255, 0.2)">
......@@ -36,13 +40,15 @@
<div class="price-item">
<div class="label">{{ $t('hotel.col.five') }}</div>
<div class="row items-center">
<div class="din">{{ x.PriceList[0].CostPrice.toFixed(2) }}{{$t('unit.jp')}}</div>
<div class="din">{{ x.PriceList[0].CostPrice.toFixed(2) }}{{ $t('unit.jp') }}</div>
<!-- <div class="q-ml-md" style="font-size: 12px; opacity: 0.5">{{ $t('hotel.col.more') }}</div> -->
</div>
</div>
<q-btn color="color" v-if="!search.SearchByUpdate" :label="$t('hotel.buy')" class="q-pa-none q-px-md" dense outline style="opacity: 0.5" @click="showOrderSubmitHandler(h,x)"/>
<q-btn color="color" v-if="!search.SearchByUpdate" :label="$t('hotel.buy')" class="q-pa-none q-px-md" dense
outline style="opacity: 0.5" @click="showOrderSubmitHandler(h, x)" />
</div>
<div class="row justify-between q-mt-md q-pa-sm rounded-borders" style="background:rgba(255,255,255,.3)" v-if="x.PriceList[0].room.length>0">
<div class="row justify-between q-mt-md q-pa-sm rounded-borders" style="background:rgba(255,255,255,.3)"
v-if="x.PriceList[0].room.length > 0">
<div class="price-item q-ma-none" v-for="y in x.PriceList[0].room">
<div class="label">{{ y.name }}</div>
<div class="f12">{{ y.price.toFixed(2) }}</div>
......@@ -85,10 +91,10 @@ export default defineComponent({
const search = inject(DirtionmaryHelper.HOTEL_QUERY_PARAM) as any
const methods = {
showOrderSubmitHandler(row:any,col:any){
context.emit('update:modelValue',row,col)
showOrderSubmitHandler(row: any, col: any) {
context.emit('update:modelValue', row, col)
},
setCurrentHotel(hotel:any) {
setCurrentHotel(hotel: any) {
hotel.subList.forEach((x: any) => {
x.ShowMorePrice = false
if (x.PriceList && x.PriceList.length > 0) {
......@@ -136,6 +142,7 @@ export default defineComponent({
.price-item {
margin-top: 8px;
}
.price-item .label {
opacity: 0.5;
font-size: 12px;
......
<template>
<div class="full-height column hotel-list">
<!-- <hotelCard></hotelCard> -->
<q-table v-if="$q.platform.is.desktop" :loading="loading" :rows="hotels" :loading-label="$t('loading')" class="sticky-column-table col sticky-header-column-table hotel-table" flat :pagination="pages" :no-data-label="$t('noneData')">
<q-table v-if="$q.platform.is.desktop" :loading="loading" :rows="hotels" :loading-label="$t('loading')"
class="sticky-column-table col sticky-header-column-table hotel-table" flat :pagination="pages"
:no-data-label="$t('noneData')">
<template v-slot:top>
<div class="row full-width">
<div class="col"></div>
......@@ -22,7 +24,8 @@
</template>
<template v-slot:body="props">
<q-tr :props="props">
<q-td style="width:200px;" class="cursor-pointer ListTable-title" @click="showHotelDetailHandler(props.row.HotelId)">
<q-td style="width:200px;" class="cursor-pointer ListTable-title"
@click="showHotelDetailHandler(props.row.HotelId)">
<div class="ellipsis-3-lines" style="padding: 7px 16px;width: 200px;white-space: break-spaces;">
{{ props.row.HotelName }}
<!-- <q-tooltip style="padding:none;">
......@@ -36,7 +39,8 @@
<div class="td-item">{{ $t('hotel.table.confirm') }}</div>
<div class="td-item">{{ $t('hotel.table.limit') }}</div>
</q-td>
<q-td v-for="x in props.row.subList" @click="x.PriceList[0].CostPrice>0?showOrderSubmitHandler(props.row,x):''">
<q-td v-for="x in props.row.subList"
@click="x.PriceList[0].CostPrice > 0 ? showOrderSubmitHandler(props.row, x) : ''">
<template v-if="x.PriceList && x.PriceList.length > 0">
<div class="td-item cursor-pointer" :class="[x.PriceList[0].ins.bg, x.PriceList[0].ins.color]">
{{ x.PriceList[0].CostPrice }}
......@@ -61,49 +65,46 @@
</q-tr>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount" :input="true" @update:model-value="changePageHandler" />
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount"
:input="true" @update:model-value="changePageHandler" />
</template>
</q-table>
<q-table
hide-header
v-else
:title="pageTitle"
:rows="hotels"
grid
:columns="mobileCols"
row-key="name"
card-class="no-shadow bg-primary text-white"
:pagination="pages"
:loading="loading"
>
<template v-slot:item="props">
<div @click="viewHotelPriceListHandler(props.row)" class="rounded-borders bg-primary text-white col-12 q-mb-sm" style="padding: 12px;margin-left: 12px;margin-right: 12px; width: calc(100% - 24px);">
<div @click.stop="showHotelDetailHandler(props.row.HotelId)">
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{$t('hotel.col.first')}}</div>
<div style="font-size: 13px;">{{props.row.HotelName}}</div>
</div>
<div class="q-my-md">
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{$t('hotel.col.three')}}</div>
<div style="font-size: 13px;">{{props.row.TotalInventory}}</div>
</div>
<div>
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{$t('hotel.col.four')}}</div>
<div class="">
<span>{{props.row.LowerPrice.toFixed(2)}}{{$t('unit.jp')}} {{$t('hotel.col.low')}}</span>
<q-table hide-header v-else :title="pageTitle" :rows="hotels" grid :columns="mobileCols" row-key="name"
card-class="no-shadow bg-primary text-white" :pagination="pages" :loading="loading">
<template v-slot:item="props">
<div @click="viewHotelPriceListHandler(props.row)" class="rounded-borders bg-primary text-white col-12 q-mb-sm"
style="padding: 12px;margin-left: 12px;margin-right: 12px; width: calc(100% - 24px);">
<div @click.stop="showHotelDetailHandler(props.row.HotelId)">
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{ $t('hotel.col.first') }}
</div>
<div style="font-size: 13px;">{{ props.row.HotelName }}</div>
</div>
<div class="q-my-md">
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{ $t('hotel.col.three') }}
</div>
<div style="font-size: 13px;">{{ props.row.TotalInventory }}</div>
</div>
<div>
<div style="opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;">{{ $t('hotel.col.four') }}
</div>
<div class="">
<span>{{ props.row.LowerPrice.toFixed(2) }}{{ $t('unit.jp') }} {{ $t('hotel.col.low') }}</span>
</div>
</div>
</div>
</div>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount" :input="true" @update:model-value="changePageHandler" />
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount"
:input="true" @update:model-value="changePageHandler" />
</template>
</q-table>
<q-dialog v-model="showPriceList">
<hotel-price-list :hotel="queryHotelObj" @update:model-value="showOrderSubmitHandler"></hotel-price-list>
</q-dialog>
<q-dialog v-model="showOrderPreview" persistent>
<table-operation :HotelRow="orderSubmitObj" :hotelInfor="orderSubmitItemObj" @close="showOrderPreview = false"></table-operation>
<table-operation :HotelRow="orderSubmitObj" :hotelInfor="orderSubmitItemObj"
@close="showOrderPreview = false"></table-operation>
</q-dialog>
<q-dialog v-model="showHotelDetails" persistent>
<hotel-details :hotelId="showHotelDetailId"></hotel-details>
......@@ -117,7 +118,7 @@ import HotelService from '../../../api/hotel'
import { DirtionmaryHelper } from '../../../config/dictionary'
import message from '../../../utils/message'
import { defineComponent, inject, reactive, toRefs, watch } from 'vue'
import { date,useQuasar } from 'quasar'
import { date, useQuasar } from 'quasar'
import { DateType, getDateType, getDayOfWeek } from '../../../utils/tools'
import { useI18n } from 'vue-i18n'
import HotelPriceList from './HotelPriceList.vue'
......@@ -126,10 +127,10 @@ import SamplePriceList from './SamplePriceList.vue'
import hotelCard from './hotelCard.vue'
import hotelDetails from './hotelDetails.vue'
export default defineComponent({
components: { HotelPriceList, TableOperation,SamplePriceList,hotelCard,hotelDetails },
components: { HotelPriceList, TableOperation, SamplePriceList, hotelCard, hotelDetails },
name: 'list-table',
setup() {
const $q=useQuasar()
const $q = useQuasar()
const { t } = useI18n()
const orderstatus = inject(DirtionmaryHelper.HOTEL_CAR_ORDER_STATUS) as any
const search = inject(DirtionmaryHelper.HOTEL_QUERY_PARAM) as any
......@@ -140,16 +141,16 @@ export default defineComponent({
methods.calcDateRangeCols()
methods.initHotels()
})
watch(updateHotel,(n,o)=>{
if(updateHotel.value.HotelId){
data.showOrderPreview=true
data.orderSubmitItemObj=null
data.orderSubmitObj=null
watch(updateHotel, (n, o) => {
if (updateHotel.value.HotelId) {
data.showOrderPreview = true
data.orderSubmitItemObj = null
data.orderSubmitObj = null
}
//methods.initHotels()
})
watch(orderstatus,(n,o)=>{
if(orderstatus.value==true){
watch(orderstatus, (n, o) => {
if (orderstatus.value == true) {
methods.initHotels()
orderstatus.value = false
}
......@@ -167,15 +168,15 @@ export default defineComponent({
},
pageTitle: '' as (string | undefined),
dateTypes: [] as Array<DateType>,
mobileCols:[
{name:'HotelName',label:t('hotel.col.first'),field:(row:any)=>row.HotelName},
{name:'TotalInventory',label:t('hotel.col.three'),field:(row:any)=>row.TotalInventory},
{name:'LowerPrice',label:t('hotel.col.four'),field:(row:any)=>${row.LowerPrice.toFixed(2)}${$t('unit.jp')} ${t('hotel.col.low')}`}
mobileCols: [
{ name: 'HotelName', label: t('hotel.col.first'), field: (row: any) => row.HotelName },
{ name: 'TotalInventory', label: t('hotel.col.three'), field: (row: any) => row.TotalInventory },
{ name: 'LowerPrice', label: t('hotel.col.four'), field: (row: any) => ${row.LowerPrice.toFixed(2)}${$t('unit.jp')} ${t('hotel.col.low')}` }
],
showPriceList:false,
queryHotelObj:{},
orderSubmitObj:{} as any,
orderSubmitItemObj:{} as any,
showPriceList: false,
queryHotelObj: {},
orderSubmitObj: {} as any,
orderSubmitItemObj: {} as any,
showOrderPreview: false,
showHotelDetails: false,
showHotelDetailId: 0
......@@ -199,11 +200,11 @@ export default defineComponent({
y.PriceList.forEach((z: any) => {
z.ins = methods.getDateTypeById(z.InventoryType)
})
let cd=new Date(y.DateStr)
y.FormatDate=`${date.formatDate(cd, 'MM/DD')} (${getDayOfWeek(date.getDayOfWeek(cd))})`
let cd = new Date(y.DateStr)
y.FormatDate = `${date.formatDate(cd, 'MM/DD')} (${getDayOfWeek(date.getDayOfWeek(cd))})`
})
if($q.platform.is.mobile){
x.LowerPrice=methods.calcLowerPrice(x)
if ($q.platform.is.mobile) {
x.LowerPrice = methods.calcLowerPrice(x)
}
})
......@@ -237,28 +238,28 @@ export default defineComponent({
getDateTypeById(id: number) {
return data.dateTypes.find(x => x.id == id)
},
calcLowerPrice(hotel:any){
let lower=0
hotel.subList.forEach((x:any)=>{
if(x.PriceList &&x.PriceList.length>0){
x.PriceList.forEach((y:any)=>{
if(y.CostPrice>lower) lower= y.CostPrice
calcLowerPrice(hotel: any) {
let lower = 0
hotel.subList.forEach((x: any) => {
if (x.PriceList && x.PriceList.length > 0) {
x.PriceList.forEach((y: any) => {
if (y.CostPrice > lower) lower = y.CostPrice
})
}
})
return lower
},
viewHotelPriceListHandler(row:any){
viewHotelPriceListHandler(row: any) {
data.queryHotelObj = row
data.showPriceList = true
},
showOrderSubmitHandler(row:any,col:any){
showOrderSubmitHandler(row: any, col: any) {
data.orderSubmitObj = row
data.orderSubmitItemObj = col
data.showOrderPreview = true
},
showHotelDetailHandler(hotelId:number){
data.showHotelDetailId=hotelId
showHotelDetailHandler(hotelId: number) {
data.showHotelDetailId = hotelId
data.showHotelDetails = true
}
}
......@@ -270,24 +271,28 @@ export default defineComponent({
</script>
<style>
.ListTable-title{
.ListTable-title {
position: relative !important;
}
.ListTable-title:hover .ListTable-show{
.ListTable-title:hover .ListTable-show {
display: block;
}
.ListTable-show{
.ListTable-show {
/* position: absolute;
left: 0;
top:80px;
z-index: 9999; */
/* display: none; */
}
.cos-item-icon {
width: 14px;
height: 14px;
border-radius: 4px;
}
.td-item {
width: 100%;
height: 35px;
......@@ -298,12 +303,15 @@ export default defineComponent({
text-align: center;
border-bottom: 1px solid rgba(0, 0, 0, 0.12);
}
.td-item:last-child {
border-bottom: none;
}
.hotel-table .q-table td {
padding: 0 !important;
}
/* .td-item.cursor-pointer:hover{
color: var(--q-primary) !important;
} */
......
<template>
<q-card flat class="q-pa-lg" style="shadow: 0px 0px 50px 0px rgba(82, 63, 105, 0.15);" :style="{'width':$q.platform.is.desktop?'50vw':'100vw'}">
<q-card flat class="q-pa-lg" style="shadow: 0px 0px 50px 0px rgba(82, 63, 105, 0.15);"
:style="{ 'width': $q.platform.is.desktop ? '50vw' : '100vw' }">
<div class="q-mb-xs">
<div class="" :class="{'row items':$q.platform.is.desktop}">
<div class="" :class="{ 'row items': $q.platform.is.desktop }">
<span class="text-primary text-h6 col">{{ parameters.HotelName }}</span>
<div class="f12" :class="{'q-mt-sm':$q.platform.is.mobile}">
<div class="f12" :class="{ 'q-mt-sm': $q.platform.is.mobile }">
<span class="q-mr-md">
<q-icon name="check" size="18px" color="primary" v-if="parameters.PriceIsBreakfast==1" />
<q-icon name="check" size="18px" color="primary" v-if="parameters.PriceIsBreakfast == 1" />
<q-icon name="close" size="18px" color="negative" v-else />
{{$t('dinner.a')}}
{{ $t('dinner.a') }}
</span>
<span class="">
<q-icon name="check" size="18px" color="primary" v-if="parameters.PriceIsDinner==1" />
<q-icon name="check" size="18px" color="primary" v-if="parameters.PriceIsDinner == 1" />
<q-icon name="close" size="18px" color="negative" v-else />
{{$t('dinner.c')}}
{{ $t('dinner.c') }}
</span>
</div>
</div>
......@@ -26,30 +27,36 @@
</q-popup-proxy> -->
</q-field>
<span class="text-grey-6 f12">
{{$t('hotel.inhouseDays')}}
<span class="din text-yellow-10">{{joinHouse.days}}</span>
{{$t('unit.night')}}
{{ $t('hotel.inhouseDays') }}
<span class="din text-yellow-10">{{ joinHouse.days }}</span>
{{ $t('unit.night') }}
</span>
</div>
</div>
<div class="f12 text-negative q-mb-md">{{ $t('hotel.waringTips') }}</div>
<div class="rounded-borders" style="max-height: 35vh; overflow-y: auto" :class="{'bg-grey-1':$q.platform.is.desktop,'q-px-md':$q.platform.is.desktop,'q-py-sm':$q.platform.is.desktop,}">
<div class="rounded-borders" style="max-height: 35vh; overflow-y: auto"
:class="{ 'bg-grey-1': $q.platform.is.desktop, 'q-px-md': $q.platform.is.desktop, 'q-py-sm': $q.platform.is.desktop, }">
<template v-for="(item, index) in parameters.DetailList">
<div class="row no-wrap items-center q-py-sm" :style="{ 'border-top': index > 0 && !item.Tips && $q.platform.is.desktop ? '1px dashed #ddd' : '' }"
:class="{'HotelTableOperation':$q.platform.is.mobile,'q-px-md':$q.platform.is.mobile,'q-mb-md':$q.platform.is.mobile}">
<div :class="{'row':$q.platform.is.desktop,'col-5':$q.platform.is.desktop,'q-pr-md':$q.platform.is.mobile,'col-6':$q.platform.is.mobile,'column':$q.platform.is.mobile}">
<div :class="{'q-pr-md':$q.platform.is.desktop,'col-4':$q.platform.is.desktop,}">
<div class="row no-wrap items-center q-py-sm"
:style="{ 'border-top': index > 0 && !item.Tips && $q.platform.is.desktop ? '1px dashed #ddd' : '' }"
:class="{ 'HotelTableOperation': $q.platform.is.mobile, 'q-px-md': $q.platform.is.mobile, 'q-mb-md': $q.platform.is.mobile }">
<div
:class="{ 'row': $q.platform.is.desktop, 'col-5': $q.platform.is.desktop, 'q-pr-md': $q.platform.is.mobile, 'col-6': $q.platform.is.mobile, 'column': $q.platform.is.mobile }">
<div :class="{ 'q-pr-md': $q.platform.is.desktop, 'col-4': $q.platform.is.desktop, }">
<div class="f12">{{ item.RoomName }}</div>
</div>
<div class="text-negative f12" :class="{'col-6':$q.platform.is.desktop,'q-pt-sm':$q.platform.is.mobile}">
<div class="text-negative f12" :class="{ 'col-6': $q.platform.is.desktop, 'q-pt-sm': $q.platform.is.mobile }">
<span class="fz10"></span>
<span class="din">{{ item.UPriceFormat }}</span>
<span class="text-dark" style="font-size: 12px">/{{ $t('unit.ren') }}</span>
</div>
</div>
<div :class="{'row':$q.platform.is.desktop,'col':$q.platform.is.desktop,'q-pl-md':$q.platform.is.desktop,'column':$q.platform.is.mobile}">
<div :class="{'col-7':$q.platform.is.desktop}">
<q-input style="width: 100%" @update:model-value="changePeople" v-model="item.PeopleNumber" class="col" :class="{'q-mr-md':$q.platform.is.desktop,'q-px-sm':$q.platform.is.desktop,'q-pl-sm':$q.platform.is.desktop,}" mask="#" reverse-fill-mask dense standout :label="$t('hotel.shopping.peopleNum')">
<div
:class="{ 'row': $q.platform.is.desktop, 'col': $q.platform.is.desktop, 'q-pl-md': $q.platform.is.desktop, 'column': $q.platform.is.mobile }">
<div :class="{ 'col-7': $q.platform.is.desktop }">
<q-input style="width: 100%" @update:model-value="changePeople" v-model="item.PeopleNumber" class="col"
:class="{ 'q-mr-md': $q.platform.is.desktop, 'q-px-sm': $q.platform.is.desktop, 'q-pl-sm': $q.platform.is.desktop, }"
mask="#" reverse-fill-mask dense standout :label="$t('hotel.shopping.peopleNum')">
<template v-slot:prepend>
<q-btn color="primary" size="sm" class="q-px-none" flat icon="remove" @click="addPeople(item, 0)" />
</template>
......@@ -58,16 +65,17 @@
</template>
</q-input>
</div>
<div :class="{'col':$q.platform.is.desktop,'text-center':$q.platform.is.desktop,'text-right':$q.platform.is.mobile,}">
<div
:class="{ 'col': $q.platform.is.desktop, 'text-center': $q.platform.is.desktop, 'text-right': $q.platform.is.mobile, }">
<span class="f12 text-grey-6">
{{$t('hotel.yg')}}<span class="din text-yellow-10">{{item.Number}}</span> {{$t('unit.jf')}}
{{ $t('hotel.yg') }}<span class="din text-yellow-10">{{ item.Number }}</span> {{ $t('unit.jf') }}
</span>
</div>
</div>
</div>
</template>
</div>
<div class="q-pt-md" :class="{'row':$q.platform.is.desktop,'items-center':$q.platform.is.desktop,'justify-between':$q.platform.is.desktop,'column':$q.platform.is.mobile}
<div class="q-pt-md" :class="{ 'row': $q.platform.is.desktop, 'items-center': $q.platform.is.desktop, 'justify-between': $q.platform.is.desktop, 'column': $q.platform.is.mobile }
">
<div>
<div class="text-grey-6 fz12 row items-center">
......@@ -84,14 +92,16 @@
<span>{{ $t('hotel.shopping.between') }}</span>
</div>
</div>
<div class="q-mt-sm rounded-borders bg-orange-1 text-orange-10 f12 q-pa-sm" v-if="(total-onlyNum)>0">
{{$t('hotel.outbind')}}
<div class="q-mt-sm rounded-borders bg-orange-1 text-orange-10 f12 q-pa-sm" v-if="(total - onlyNum) > 0">
{{ $t('hotel.outbind') }}
</div>
</div>
<div class="row" :class="{'items-center':$q.platform.is.desktop,'q-pl-md':$q.platform.is.desktop,'justify-end':$q.platform.is.mobile,'q-pt-md':$q.platform.is.mobile}">
<div class="row"
:class="{ 'items-center': $q.platform.is.desktop, 'q-pl-md': $q.platform.is.desktop, 'justify-end': $q.platform.is.mobile, 'q-pt-md': $q.platform.is.mobile }">
<div>
<q-btn flat dense color="dark" :label="$t('close')" class="q-mr-sm" @click="editor={}" v-close-popup/>
<q-btn unelevated dense color="negative" :disable="total==0" icon="shopping_cart" :label="$t('hotel.car.addShopping')" @click="join" />
<q-btn flat dense color="dark" :label="$t('close')" class="q-mr-sm" @click="editor = {}" v-close-popup />
<q-btn unelevated dense color="negative" :disable="total == 0" icon="shopping_cart"
:label="$t('hotel.car.addShopping')" @click="join" />
</div>
</div>
</div>
......@@ -116,7 +126,7 @@ export default defineComponent({
require: false
}
},
emits:['close'],
emits: ['close'],
setup(props, context) {
const { t } = useI18n()
const qDateProxyOpera = ref<any>(null)
......@@ -142,10 +152,10 @@ export default defineComponent({
Money: 0,
DetailList: [] as Array<any>,
Remark: '',
TaxesPrice:0,
PriceInTangTax:0,
PriceIsBreakfast:0,
PriceIsDinner:0
TaxesPrice: 0,
PriceInTangTax: 0,
PriceIsBreakfast: 0,
PriceIsDinner: 0
},
total: 0,
joinHouse: {
......@@ -180,53 +190,53 @@ export default defineComponent({
} else if (type == 0 && item.PeopleNumber > 1) {
item.PeopleNumber--
}
item.PeopleNumber=item.PeopleNumber!=''?item.PeopleNumber:'0'
item.PeopleNumber = item.PeopleNumber != '' ? item.PeopleNumber : '0'
methods.calculateNum()
},
changePeople(val:string){
setTimeout(()=>{
changePeople(val: string) {
setTimeout(() => {
methods.calculateNum()
},50)
}, 50)
},
// 计算房间数量
calculateNum() {
data.total = 0
data.sumPeople = 0
data.parameters.DetailList.forEach(item => {
item.Number = Math.ceil(parseFloat(item.PeopleNumber) / parseFloat(item.LimitGuestNum))
data.total += item.Number
data.sumPeople += parseInt(item.PeopleNumber)
item.Number = Math.ceil(parseFloat(item.PeopleNumber) / parseFloat(item.LimitGuestNum))
data.total += item.Number
data.sumPeople += parseInt(item.PeopleNumber)
})
},
join(){
const temp= JSON.parse(JSON.stringify(data.parameters))
temp.Money=0
temp.Total=data.total
join() {
const temp = JSON.parse(JSON.stringify(data.parameters))
temp.Money = 0
temp.Total = data.total
temp.SumPeople = data.sumPeople
temp.DetailList = temp.DetailList.filter(((x:any)=>x.PeopleNumber>0))
temp.DetailList.forEach((x:any) => {
temp.Money+=(x.PeopleNumber*(x.Unit_Price+x.TaxesPrice+x.PriceInTangTax))
temp.DetailList = temp.DetailList.filter(((x: any) => x.PeopleNumber > 0))
temp.DetailList.forEach((x: any) => {
temp.Money += (x.PeopleNumber * (x.Unit_Price + x.TaxesPrice + x.PriceInTangTax))
});
let existsIndex = cars.value.findIndex((x:any)=>x.Date == temp.Date)
let existsIndex = cars.value.findIndex((x: any) => x.Date == temp.Date)
let exists = existsIndex==-1?null:cars.value[existsIndex]
if(exists){
let existsHotel = exists.Hotels.findIndex((h:any)=>h.HotelId==temp.HotelId)
if(existsHotel!=-1) exists.Hotels.splice(existsHotel,1)
}else{
let exists = existsIndex == -1 ? null : cars.value[existsIndex]
if (exists) {
let existsHotel = exists.Hotels.findIndex((h: any) => h.HotelId == temp.HotelId)
if (existsHotel != -1) exists.Hotels.splice(existsHotel, 1)
} else {
exists = {
Date:temp.Date,
Hotels:[] as Array<any>
Date: temp.Date,
Hotels: [] as Array<any>
}
cars.value.push(exists)
}
exists.Hotels.push(temp)
cars.value.sort((x:any,y:any)=>{
return new Date(x.Date).getTime()-new Date(y.Date).getTime()
cars.value.sort((x: any, y: any) => {
return new Date(x.Date).getTime() - new Date(y.Date).getTime()
})
HotelLength.value = cars.value.length
message.successMsg(t('success'))
editor.value={}
editor.value = {}
context.emit('close')
},
// 组装可选房间
......@@ -244,7 +254,7 @@ export default defineComponent({
data.parameters.Date = hotel.DateStr
data.parameters.RemainingInventory = hotel.RemainingInventory
data.parameters.TaxesPrice = tempPrice.TaxesPrice
data.parameters.PriceInTangTax= tempPrice.PriceInTangTax
data.parameters.PriceInTangTax = tempPrice.PriceInTangTax
data.parameters.PriceIsBreakfast = tempPrice.PriceIsBreakfast
data.parameters.PriceIsDinner = tempPrice.PriceIsDinner
......@@ -288,38 +298,38 @@ export default defineComponent({
optionsFn(cd: any) {
return cd >= date.formatDate(date.addToDate(new Date(), { days: 7 }), 'YYYY/MM/DD')
},
setInjectHandler(){
setInjectHandler() {
data.parameters = editor.value
methods.calculateNum()
methods.setDateRange()
}
}
if(props.HotelRow && props.hotelInfor){
if (props.HotelRow && props.hotelInfor) {
data.HotelRow = props.HotelRow
data.hotelInfor = props.hotelInfor
methods.setList()
}else{
} else {
methods.setInjectHandler()
}
onMounted(()=>{
if(data.hotelInfor.RemainingInventory){
onMounted(() => {
if (data.hotelInfor.RemainingInventory) {
data.onlyNum = data.hotelInfor.RemainingInventory
}else{
} else {
data.onlyNum = editor.value.RemainingInventory
}
})
return { ...toRefs(data),editor,HotelLength, ...methods }
return { ...toRefs(data), editor, HotelLength, ...methods }
}
})
</script>
<style>
.HotelTableOperation{
/* box-shadow: 0 1px 3px #0003, 0 1px 1px #00000024, 0 2px 1px -1px #0000001f; */
border-radius: 10px;
vertical-align: top;
background: rgba(225,245,254,.7);
position: relative;
}
.HotelTableOperation {
/* box-shadow: 0 1px 3px #0003, 0 1px 1px #00000024, 0 2px 1px -1px #0000001f; */
border-radius: 10px;
vertical-align: top;
background: rgba(225, 245, 254, .7);
position: relative;
}
</style>
<template>
<template>
<div>
<q-card class="light-shadow q-pa-md bg-white rounded-borders q-mb-md" flat v-for="x in orders">
<div class="row items-center desktop-only">
<div class="q-mr-md">
<q-btn :color="x.OrderType == 1 ? 'cyan' : 'negative'" unelevated disable size="sm" :label="`${x.OrderType == 1 ? $t('hotelorder.orderType.guest') : $t('hotelorder.orderType.tour')}`"></q-btn>
<q-btn :color="x.OrderType == 1 ? 'cyan' : 'negative'" unelevated disable size="sm"
:label="`${x.OrderType == 1 ? $t('hotelorder.orderType.guest') : $t('hotelorder.orderType.tour')}`"></q-btn>
</div>
<div class="f12 text-grey-6">{{ $t('hotelorder.search.orderNum') }}{{ x.OrderNo }}</div>
<div class="q-ml-md">
<q-btn color="dark" flat size="sm" :label="$t('hotelorder.copy')" v-if="copyId != x.OrderId" @click="setCopyHandler(x)" />
<q-btn color="dark" flat size="sm" :label="$t('hotelorder.copy')" v-if="copyId != x.OrderId"
@click="setCopyHandler(x)" />
<q-btn color="cyan" icon="check" outline size="sm" :label="$t('hotelorder.copyed')" v-else></q-btn>
</div>
<div class="col text-center f12 text-grey-6">
<span v-if="x.OrderType == 1">{{ $t('hotelorder.search.contactInfo') }}{{ x.ContactName }}/{{ x.ContactNumber }}</span>
<span v-if="x.OrderType == 1">{{ $t('hotelorder.search.contactInfo') }}{{ x.ContactName }}/{{
x.ContactNumber
}}</span>
<span v-else>{{ $t('hotelorder.search.tcNum') }}{{ x.TCNum }}</span>
</div>
<div class="f12 text-grey-6">{{ $t('hotelorder.createTime') }}{{ x.CreateTime }}</div>
......@@ -23,7 +27,8 @@
<div class="mobile-only">
<div class="row justify-between">
<div class="q-mr-md">
<q-btn :color="x.OrderType == 1 ? 'cyan' : 'negative'" unelevated disable size="sm" :label="`${x.OrderType == 1 ? $t('hotelorder.orderType.guest') : $t('hotelorder.orderType.tour')}`"></q-btn>
<q-btn :color="x.OrderType == 1 ? 'cyan' : 'negative'" unelevated disable size="sm"
:label="`${x.OrderType == 1 ? $t('hotelorder.orderType.guest') : $t('hotelorder.orderType.tour')}`"></q-btn>
</div>
<div class="q-ml-md f12" :class="[x.typeInfo.Color]">
<q-icon :name="x.typeInfo.Icon" />
......@@ -40,7 +45,9 @@
</div>
</div>
<div class="f12 text-grey-6">
<span v-if="x.OrderType == 1">{{ $t('hotelorder.search.contactInfo') }}{{ x.ContactName }}/{{ x.ContactNumber }}</span>
<span v-if="x.OrderType == 1">{{ $t('hotelorder.search.contactInfo') }}{{ x.ContactName }}/{{
x.ContactNumber
}}</span>
<span v-else>{{ $t('hotelorder.search.tcNum') }}{{ x.TCNum }}</span>
</div>
<div class="f12 text-grey-6">{{ $t('hotelorder.createTime') }}{{ x.CreateTime }}</div>
......@@ -48,7 +55,8 @@
</div>
<div class="q-mt-md row">
<q-table separator="cell" :hide-bottom="!x.Remark" :pagination="{rowsPerPage:100}" dense :rows="x.DetailList" bordered :columns="cols" class="sticky-rightrowspan-column-table light-border col no-shadow">
<q-table separator="cell" :hide-bottom="!x.Remark" :pagination="{ rowsPerPage: 100 }" dense :rows="x.DetailList"
bordered :columns="cols" class="sticky-rightrowspan-column-table light-border col no-shadow">
<template v-slot:header-cell-Room="props">
<q-th :props="props">
<div class="row items-center">
......@@ -62,7 +70,8 @@
<q-td :props="props">
<div class="room-item f12 text-grey-6" v-for="x in props.row.RoomList">
<span class="q-mr-md"> {{ x.RoomInfo.TypeName }}: {{ x.Number }} {{ $t('unit.jian') }} </span>
<span class="q-mr-md"> {{ $t('hotelorder.people') }}: {{ x.PeopleNumber ?? 1 }} {{ $t('unit.ren') }} </span>
<span class="q-mr-md"> {{ $t('hotelorder.people') }}: {{ x.PeopleNumber ?? 1 }} {{ $t('unit.ren') }}
</span>
<span class="q-mr-md"> {{ $t('hotelorder.unitPrice') }}: {{ x.Unit_Price ?? 1 }} </span>
<span class="q-mr-md"> {{ $t('hotelorder.xj') }}: {{ x.Money ?? 1 }} </span>
</div>
......@@ -81,11 +90,12 @@
<template v-slot:body-cell-HandFittingFee="props">
<q-td :props="props" :colspan="x.DetailList.length" v-if="props.rowIndex == 0">
{{ moneyFormat(x.HandFittingFee) }}
<div class="q-mt-sm" v-if="x.OrderStatus==2">
<div class="q-mt-sm" v-if="x.OrderStatus == 2">
<q-btn size="sm" dense outline color="primary" v-if="x.ContractUrl">
<a class="text-primary" style="text-decoration:none" :href="x.ContractUrl">{{$t('v101.downloadHands')}}</a>
<a class="text-primary" style="text-decoration:none"
:href="x.ContractUrl">{{ $t('v101.downloadHands') }}</a>
</q-btn>
<span class="text-grey-500 f12">{{$t('v101.noneHands')}}</span>
<span class="text-grey-500 f12">{{ $t('v101.noneHands') }}</span>
</div>
</q-td>
</template>
......@@ -96,38 +106,47 @@
</q-td>
</template>
<template v-slot:bottom>
<div class="msl text-negative">{{$t('v101.hotelRemark')}}{{x.Remark}}</div>
<div class="msl text-negative">{{ $t('v101.hotelRemark') }}{{ x.Remark }}</div>
</template>
</q-table>
</div>
<div class="q-mt-md" v-if="x.OrderStatus != 3" :class="{ row: $q.platform.is.desktop, 'column reverse': $q.platform.is.mobile }">
<div class="pay row text-grey rounded-borders q-pa-md" v-if="$q.platform.is.desktop || ($q.platform.is.mobile && expendsOrderId == x.OrderId)" :class="{ 'bg-grey-2': $q.platform.is.mobile }">
<svg-icon color=" svg-red" icon="Code/Warning-1-circle.svg" :size="16" v-if="$q.platform.is.desktop"></svg-icon>
<div class="q-mt-md" v-if="x.OrderStatus != 3"
:class="{ row: $q.platform.is.desktop, 'column reverse': $q.platform.is.mobile }">
<div class="pay row text-grey rounded-borders q-pa-md"
v-if="$q.platform.is.desktop || ($q.platform.is.mobile && expendsOrderId == x.OrderId)"
:class="{ 'bg-grey-2': $q.platform.is.mobile }">
<svg-icon color=" svg-red" icon="Code/Warning-1-circle.svg" :size="16"
v-if="$q.platform.is.desktop"></svg-icon>
<div class="q-ml-sm">
<div class="q-mb-sm" v-if="x.CustomerPayType == 2 || x.CustomerPayType == 3">
<div class="f12">
{{$t('hotelorder.pay.t1')}}
<span class="text-orange">{{x.PaymentDate}}</span>
{{$t('hotelorder.pay.t11')}}
<span class="text-orange">{{x.FinalPaymentDate}}</span>
{{$t('hotelorder.pay.t12')}}
{{ $t('hotelorder.pay.t1') }}
<span class="text-orange">{{ x.PaymentDate }}</span>
{{ $t('hotelorder.pay.t11') }}
<span class="text-orange">{{ x.FinalPaymentDate }}</span>
{{ $t('hotelorder.pay.t12') }}
</div>
<q-btn dense outline color="accent" size="sm" class="q-mt-sm" :label="$t('hotelorder.payinfo')" @click="ViewPayment"></q-btn>
<q-btn dense outline color="accent" size="sm" class="q-mt-sm" :label="$t('hotelorder.payinfo')"
@click="ViewPayment"></q-btn>
<!-- <q-btn dense unelevated color="accent" size="sm" class="q-mt-sm q-ml-sm" :label="$t('hotelorder.sendpay')"></q-btn> -->
</div>
<div v-if="x.CustomerPayType == 1 || x.CustomerPayType == 3">
<div class="f12">
{{$t('hotelorder.pay.t2')}}
<span class="text-negative">{{x.UploadGuestDate }}</span>
{{$t('hotelorder.pay.t21')}}
{{ $t('hotelorder.pay.t2') }}
<span class="text-negative">{{ x.UploadGuestDate }}</span>
{{ $t('hotelorder.pay.t21') }}
</div>
<div class="row items-center f12 q-mt-sm">
<div class="text-accent q-mr-md" v-if="x.GuestFileList.length>0">{{x.GuestFileList[0].split('/').at(-1)}}</div>
<q-btn dense unelevated color="primary" size="sm" class="q-mr-sm" v-if="x.GuestFileList.length>0">
<a class="text-white" style="text-decoration:none" :href="x.GuestFileList[0]">{{$t('upload.down')}}</a>
<div class="text-accent q-mr-md" v-if="x.GuestFileList.length > 0">
{{ x.GuestFileList[0].split('/').at(-1) }}</div>
<q-btn dense unelevated color="primary" size="sm" class="q-mr-sm" v-if="x.GuestFileList.length > 0">
<a class="text-white" style="text-decoration:none"
:href="x.GuestFileList[0]">{{ $t('upload.down') }}</a>
</q-btn>
<n-upload class="col" :action="importFileUrl" @finish="handleFinish" @change="uploadHandleChange(x.OrderId)" file-list-style="display:none">
<q-btn dense outline color="primary" size="sm" :label="x.GuestFileList.length==0?$t('hotelorder.uploadGuest'):$t('upload.reload')"></q-btn>
<n-upload class="col" :action="importFileUrl" @finish="handleFinish"
@change="uploadHandleChange(x.OrderId)" file-list-style="display:none">
<q-btn dense outline color="primary" size="sm"
:label="x.GuestFileList.length == 0 ? $t('hotelorder.uploadGuest') : $t('upload.reload')"></q-btn>
</n-upload>
</div>
</div>
......@@ -138,10 +157,12 @@
<svg-icon color=" svg-red" icon="Code/Warning-1-circle.svg" :size="16"></svg-icon>
<span class="q-ml-sm">{{ $t('hotelorder.warn') }}</span>
</div>
<q-btn color="grey" @click="setShowWarnHander(x.OrderId)" dense size="sm" flat :label="expendsOrderId == x.OrderId ? $t('expends.off') : $t('expends.on')" />
<q-btn color="grey" @click="setShowWarnHander(x.OrderId)" dense size="sm" flat
:label="expendsOrderId == x.OrderId ? $t('expends.off') : $t('expends.on')" />
</div>
<div class="col desktop-only"></div>
<div class="rounded-borders bg-grey-2 q-pa-md" :class="{ 'q-mx-md': $q.platform.is.desktop, 'q-mt-md': $q.platform.is.mobile }">
<div class="rounded-borders bg-grey-2 q-pa-md"
:class="{ 'q-mx-md': $q.platform.is.desktop, 'q-mt-md': $q.platform.is.mobile }">
<div class="row items-center justify-between q-mb-sm q-pb-sm" style="border-bottom: 1px dashed #ddd">
<div class="f12 text-grey">{{ $t('hotelorder.orderMoney') }}</div>
<div class="dark q-ml-xl">
......@@ -150,7 +171,8 @@
<span class="f12">{{ $t('unit.jp') }}</span>
</div>
</div>
<div class="row items-center justify-between q-mb-sm q-pb-sm" style="border-bottom: 1px dashed #ddd" v-if="x.CustomerPayType == 1 || x.CustomerPayType == 3">
<div class="row items-center justify-between q-mb-sm q-pb-sm" style="border-bottom: 1px dashed #ddd"
v-if="x.CustomerPayType == 1 || x.CustomerPayType == 3">
<div class="f12 text-grey">{{ $t('hotelorder.payType.t1') }}</div>
<div class="dark">
<span class="f12">{{ moneyFormat(x.SelfPayMoney) }}</span>
......@@ -165,8 +187,10 @@
</div>
</div>
</div>
<div class="rounded-borders q-pa-sm justify-between" :class="{ column: $q.platform.is.desktop, 'row items-center': $q.platform.is.mobile, 'bg-green-1': x.OrderStatus != 1, 'bg-grey-2': x.OrderStatus == 1 }">
<q-list dense v-if="x.OrderStatus == 1" :class="{ 'row items-center justify-between full-width': $q.platform.is.mobile }">
<div class="rounded-borders q-pa-sm justify-between"
:class="{ column: $q.platform.is.desktop, 'row items-center': $q.platform.is.mobile, 'bg-green-1': x.OrderStatus != 1, 'bg-grey-2': x.OrderStatus == 1 }">
<q-list dense v-if="x.OrderStatus == 1"
:class="{ 'row items-center justify-between full-width': $q.platform.is.mobile }">
<q-item class="text-negative" clickable v-close-popup @click="cancelConfirmHandler(x.OrderId)">
<q-item-section>
<q-item-label>{{ $t('hotelorder.opera.cancel') }}</q-item-label>
......@@ -191,22 +215,24 @@
<div v-else>
<div class="f12 text-green-4">{{ $t('hotelorder.payed') }}</div>
<div class="text-subtitle1 din text-green-14">
{{x.OrderIncome.toFixed(2)}}
{{ x.OrderIncome.toFixed(2) }}
<span class="text-green-4 f12">{{ $t('unit.jp') }}</span>
</div>
</div>
</div>
</div>
<div v-if="x.OrderStatus == 3">
<div class="q-mt-md q-pa-sm row items-center rounded-borders bg-orange-1" style="border-width: 0 5px; border-style: solid; border-color:#ffb74d;">
<div class="text-subtitle2 text-weight-bolder text-grey-900">{{$t('v101.cancelRemark')}}:</div>
<div class="f12 text-grey-600 q-ml-sm col">{{x.CancelRemark?x.CancelRemark:$t('v101.selfCancle')}}</div>
<div class="f12 text-grey-900">{{x.CancelEmpName}} {{x.CancelTime}}</div>
<div class="q-mt-md q-pa-sm row items-center rounded-borders bg-orange-1"
style="border-width: 0 5px; border-style: solid; border-color:#ffb74d;">
<div class="text-subtitle2 text-weight-bolder text-grey-900">{{ $t('v101.cancelRemark') }}:</div>
<div class="f12 text-grey-600 q-ml-sm col">{{ x.CancelRemark ? x.CancelRemark : $t('v101.selfCancle') }}</div>
<div class="f12 text-grey-900">{{ x.CancelEmpName }} {{ x.CancelTime }}</div>
</div>
</div>
</q-card>
<q-card class="light-shadow q-pa-md bg-white rounded-borders q-mb-md" v-if="pages.pageCount > 0" flat>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount" :input="true" @update:model-value="changePageHandler" />
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary" :max="pages.pageCount"
:input="true" @update:model-value="changePageHandler" />
</q-card>
<q-inner-loading :showing="loading" :label="$t('loading')" label-class="text-grey-6 f12" />
</div>
......@@ -242,7 +268,7 @@
</div>
</q-dialog> -->
<q-dialog v-model="showBankAccount">
<q-card flat class="q-pa-md" style="background:#080655;width:30vw;min-width: 375px;" >
<q-card flat class="q-pa-md" style="background:#080655;width:30vw;min-width: 375px;">
<div class="row items-end">
<img src="../../../../assets/images/green_pic.jpg" style="width:100px;" />
<div class="q-ml-md f12 text-grey-4 col text-right">水口支店 店番593</div>
......@@ -263,7 +289,8 @@
<div class="pf text-grey-1 text-weight-bolder f12" style="opacity:.5">滋賀県甲賀市水口町本綾野5-21 (0748-65-1011)</div>
</div>
<div class="q-mt-md text-right">
<q-btn color="white" outline class="q-px-lg" style="opacity:.6" dense :label="$t('hotelorder.copy')" @click="setCopyHandler(null,'行名:京都銀行\n支店名:水口支店 店番593\n口座種別:レギュラー口座\n口座番号: 593-1070078\n账户名:株式会社ピースインターナショナル\n银行住所:滋賀県甲賀市水口町本綾野5-21\n银行邮变:〒528-0037\n電話番号:0748-65-1011\n')"/>
<q-btn color="white" outline class="q-px-lg" style="opacity:.6" dense :label="$t('hotelorder.copy')"
@click="setCopyHandler(null, '行名:京都銀行\n支店名:水口支店 店番593\n口座種別:レギュラー口座\n口座番号: 593-1070078\n账户名:株式会社ピースインターナショナル\n银行住所:滋賀県甲賀市水口町本綾野5-21\n银行邮变:〒528-0037\n電話番号:0748-65-1011\n')" />
</div>
</q-card>
</q-dialog>
......@@ -281,7 +308,7 @@ import { useI18n } from 'vue-i18n'
import svgIcon from '../../../global/svg-icon.vue'
import { copyToClipboard, useQuasar } from 'quasar'
import { currentRouter } from '../../../../router'
import { UploadFileInfo,NTag,NUpload } from 'naive-ui'
import { UploadFileInfo, NTag, NUpload } from 'naive-ui'
import { slice } from 'lodash'
export default defineComponent({
......@@ -305,7 +332,7 @@ export default defineComponent({
status: [] as Array<StandardStatus>,
rooms: [] as Array<RoomType>,
uploadOrderId: 0,
showBankAccount:false,
showBankAccount: false,
pages: {
pageIndex: 1,
pageSize: 10,
......@@ -329,10 +356,10 @@ export default defineComponent({
})
const methods = {
goUrl(id: number){
goUrl(id: number) {
currentRouter.push('/hotel/offer/' + id)
},
ViewPayment(){
ViewPayment() {
data.showBankAccount = true
},
initOrders() {
......@@ -399,7 +426,7 @@ export default defineComponent({
data.pages.pageIndex = n
methods.initOrders()
},
uploadHandleChange(orderId:number) {
uploadHandleChange(orderId: number) {
data.uploadOrderId = orderId
data.loading = true
},
......@@ -444,11 +471,11 @@ export default defineComponent({
message.errorMsg(r.message)
})
},
setCopyHandler(order: any,ctx?:string) {
if(ctx){
setCopyHandler(order: any, ctx?: string) {
if (ctx) {
data.copyId = -1
copyToClipboard(ctx)
}else{
} else {
data.copyId = order.OrderId
copyToClipboard(order.OrderNo)
}
......@@ -477,36 +504,44 @@ export default defineComponent({
.light-border table th {
border-color: #eee !important;
}
.light-border .room-item {
height: 28px;
line-height: 28px;
border-bottom: 1px solid #eee;
}
.light-border .room-item:last-child {
border-bottom: none;
}
.light-border .max-hotelname {
width: 140px;
height: 28px;
line-height: 28px;
}
.orderListDialog-title{
.orderListDialog-title {
position: relative;
}
.orderListDialog-title span{
.orderListDialog-title span {
font-size: 20px;
}
.orderListDialog-close{
.orderListDialog-close {
position: absolute;
right: 0;
top: -10px;
font-size: 26px;
}
.orderListDialog-bg{
.orderListDialog-bg {
background: #5098FF;
border-radius: 10px;
}
.orderListDialog-img{
.orderListDialog-img {
background: url('../../../../assets/images/wallet.png')no-repeat right #5098FF;
background-size: 97px 100%;
}
......
<template>
<div class="rounded-borders bg-white row items-center q-pa-md">
<q-select v-if="$q.platform.is.desktop" class="q-mr-md" v-model="search.OrderStatus" @update:model-value="setOrderStatus" dense :options="status" emit-value option-label="StatusName" option-value="StatusId" map-options :label="$t('hotelorder.search.status')" standout />
<q-input v-if="$q.platform.is.desktop" class="q-mr-md" v-model="search.OrderNo" dense standout :label="$t('hotelorder.search.orderNum')" />
<q-field v-if="$q.platform.is.desktop" clearable v-model="dateRangeFormat" :label="$t('hotelorder.search.daterange')" standout class="col-2" style="min-width: 190px" dense>
<q-select v-if="$q.platform.is.desktop" class="q-mr-md" v-model="search.OrderStatus"
@update:model-value="setOrderStatus" dense :options="status" emit-value option-label="StatusName"
option-value="StatusId" map-options :label="$t('hotelorder.search.status')" standout />
<q-input v-if="$q.platform.is.desktop" class="q-mr-md" v-model="search.OrderNo" dense standout
:label="$t('hotelorder.search.orderNum')" />
<q-field v-if="$q.platform.is.desktop" clearable v-model="dateRangeFormat"
:label="$t('hotelorder.search.daterange')" standout class="col-2" style="min-width: 190px" dense>
<div class="self-center full-width no-outline" tabindex="0">{{ dateRangeFormat }}</div>
<q-popup-proxy :offset="[0, 10]" ref="qDateProxy">
<q-date v-model="dateRange" :options="optionsFn" range mask="YYYY/MM/DD" landscape @range-end="dateRangeHandler"></q-date>
<q-date v-model="dateRange" :options="optionsFn" range mask="YYYY/MM/DD" landscape
@range-end="dateRangeHandler"></q-date>
</q-popup-proxy>
</q-field>
<div class="col"></div>
<q-btn unelevated class="bg-grey-3 hover q-mr-md" :title="$t('morequery')">
<q-badge rounded class="din bg-red-2 text-red-14 text-weight-bold" floating :label="searchCnt" v-if="searchCnt > 0" />
<q-badge rounded class="din bg-red-2 text-red-14 text-weight-bold" floating :label="searchCnt"
v-if="searchCnt > 0" />
<svg-icon color="dark" icon="Text/Filter.svg" :tips="$t('morequery')" :size="20"></svg-icon>
<q-tooltip>{{ $t('morequery') }}</q-tooltip>
<q-popup-proxy class="no-shadow" style="box-shadow: 0 0 50px #ddd !important" :offset="[0, 20]" :model-value="canHide">
<q-popup-proxy class="no-shadow" style="box-shadow: 0 0 50px #ddd !important" :offset="[0, 20]"
:model-value="canHide">
<q-card class="q-pa-md rounded-borders" style="width: 300px">
<div class="q-mb-md text-subtitle2">{{ $t('morequery') }}</div>
<div class="q-mt-md row">
<q-input v-model="search.OrderNo" dense standout :label="$t('hotelorder.search.orderNum')" class="mobile-only col q-mr-md" />
<q-input v-model="search.OrderNo" dense standout :label="$t('hotelorder.search.orderNum')"
class="mobile-only col q-mr-md" />
<q-input v-model="search.OrderId" dense standout :label="$t('hotelorder.search.orderId')" class="col" />
</div>
<div class="mobile-only q-mt-md">
<q-field clearable v-model="dateRangeFormat" :label="$t('hotelorder.search.daterange')" standout style="min-width: 190px" dense>
<q-field clearable v-model="dateRangeFormat" :label="$t('hotelorder.search.daterange')" standout
style="min-width: 190px" dense>
<div class="self-center full-width no-outline" tabindex="0">{{ dateRangeFormat }}</div>
<q-popup-proxy :offset="[0, 10]" ref="qDateProxy">
<q-date v-model="dateRange" :options="optionsFn" range mask="YYYY/MM/DD" @range-end="dateRangeHandler"></q-date>
<q-date v-model="dateRange" :options="optionsFn" range mask="YYYY/MM/DD"
@range-end="dateRangeHandler"></q-date>
</q-popup-proxy>
</q-field>
</div>
<q-select class="q-mt-md" v-model="search.RoomType" dense :options="rooms" emit-value option-label="TypeName" option-value="TypeId" map-options :label="$t('hotelorder.search.roomType')" standout />
<q-select class="q-mt-md" v-model="search.OrderType" dense :options="orderTypes" emit-value option-label="TypeName" option-value="TypeId" map-options :label="$t('hotelorder.search.orderType')" standout />
<q-input v-model="search.TCNum" dense standout :label="$t('hotelorder.search.tcNum')" class="q-mt-md" v-if="search.OrderType==2"/>
<q-input v-model="search.ContactName" :placeholder="$t('hotelorder.search.contactInfoHolder')" dense standout :label="$t('hotelorder.search.contactInfo')" class="q-mt-md" v-if="search.OrderType==1"/>
<q-select class="q-mt-md" v-model="search.RoomType" dense :options="rooms" emit-value option-label="TypeName"
option-value="TypeId" map-options :label="$t('hotelorder.search.roomType')" standout />
<q-select class="q-mt-md" v-model="search.OrderType" dense :options="orderTypes" emit-value
option-label="TypeName" option-value="TypeId" map-options :label="$t('hotelorder.search.orderType')"
standout />
<q-input v-model="search.TCNum" dense standout :label="$t('hotelorder.search.tcNum')" class="q-mt-md"
v-if="search.OrderType == 2" />
<q-input v-model="search.ContactName" :placeholder="$t('hotelorder.search.contactInfoHolder')" dense standout
:label="$t('hotelorder.search.contactInfo')" class="q-mt-md" v-if="search.OrderType == 1" />
</q-card>
</q-popup-proxy>
</q-btn>
<q-btn unelevated class="bg-blue-1 text-primary hover q-mr-md" :label="$t('hotelorder.recovery')" />
<q-btn color="primary" unelevated :label="$t('query')" @click="setQueryHandler"/>
<q-btn color="primary" unelevated :label="$t('query')" @click="setQueryHandler" />
</div>
<div class="rounded-borders bg-white q-pa-sm q-mt-md mobile-only">
<q-tabs v-model="search.OrderStatus" class="text-cyan" dense>
<q-tab :name="x.StatusId" :label="x.StatusName" v-for="x in status" @click="setOrderStatus(x.StatusId)"/>
<q-tab :name="x.StatusId" :label="x.StatusName" v-for="x in status" @click="setOrderStatus(x.StatusId)" />
</q-tabs>
</div>
</template>
......@@ -50,7 +65,7 @@ import { DirtionmaryHelper } from '../../../../config/dictionary'
import { computed, defineComponent, inject, reactive, ref, toRefs } from 'vue'
import { OrderType, RoomType, StandardStatus } from '../../../../@types'
import { getHotelOrderStatus, getHotelOrderType, getHotelRoomType } from '../../../../utils/tools'
import { date,useQuasar } from 'quasar'
import { date, useQuasar } from 'quasar'
import svgIcon from '../../../global/svg-icon.vue'
export default defineComponent({
......@@ -91,21 +106,21 @@ export default defineComponent({
data.dateRangeFormat = `${search.StartTime} - ${search.EndTime} `
if (qDateProxy.value) qDateProxy.value.hide()
},
setQueryHandler(){
realSearch.OrderId=search.OrderId
realSearch.RoomType=search.RoomType
realSearch.StartTime=search.StartTime
realSearch.EndTime=search.EndTime
realSearch.OrderStatus=search.OrderStatus
realSearch.OrderNo=search.OrderNo
realSearch.OrderType=search.OrderType
realSearch.TCNum=search.TCNum
realSearch.ContactName=search.ContactName
realSearch.ContactNumber=search.ContactName
setQueryHandler() {
realSearch.OrderId = search.OrderId
realSearch.RoomType = search.RoomType
realSearch.StartTime = search.StartTime
realSearch.EndTime = search.EndTime
realSearch.OrderStatus = search.OrderStatus
realSearch.OrderNo = search.OrderNo
realSearch.OrderType = search.OrderType
realSearch.TCNum = search.TCNum
realSearch.ContactName = search.ContactName
realSearch.ContactNumber = search.ContactName
console.log(realSearch)
},
setOrderStatus(statusId:number){
realSearch.OrderStatus=statusId
setOrderStatus(statusId: number) {
realSearch.OrderStatus = statusId
}
}
......@@ -116,11 +131,11 @@ export default defineComponent({
if (search.StartTime.length > 0) setCnt++
if (search.OrderNo > 0) setCnt++
}
if (search.OrderId.length>0) setCnt++
if (search.OrderId.length > 0) setCnt++
if (search.RoomType > 0) setCnt++
if (search.OrderType > 0) setCnt++
if (search.OrderType == 1 && search.ContactName.length>0) setCnt++
if (search.OrderType == 2 && search.TCNum.length>0) setCnt++
if (search.OrderType == 1 && search.ContactName.length > 0) setCnt++
if (search.OrderType == 2 && search.TCNum.length > 0) setCnt++
return setCnt
})
......@@ -135,4 +150,6 @@ export default defineComponent({
})
</script>
<style></style>
<style>
</style>
<template>
<q-card flat class="" style="width: 60vw;">
<q-card-section class="q-pa-sm">
<div class="text-h6" v-if='search.Id == 0'>{{ $t('v102.vehicle.add') }}</div>
<div class="text-h6" v-if='search.Id != 0'>{{ $t('v102.vehicle.add2') }}</div>
</q-card-section>
<q-card-section>
<div class="flex2">
<q-input style="" v-if="$q.platform.is.desktop" class="q-mr-md" v-model="search.UseCompName" dense
standout :label="$t('v102.vehicle.title1')" />
<div class="flex2">
<q-input class="q-mr-md" v-model="search.UseName" dense standout
:label="$t('v102.vehicle.title2')" />
</div>
<div class="flex2" style="">
<q-input class="q-mr-md" v-model="search.PickUpInfo" dense standout
:label="$t('v102.vehicle.title3')" />
</div>
<div class="flex2">
<q-input class="q-mr-md" style='' v-model="search.GoFlightInfo" dense standout
:label="$t('v102.vehicle.title4')" />
</div>
</div>
<div class="flex2" style="margin-top: 20px;">
<div class="flex2">
<q-input class="q-mr-md" style='' v-model="search.BackFlightInfo" dense standout
:label="$t('v102.vehicle.title5')" />
</div>
<div class="flex2">
 <q-input v-model="search.PeopleNum" class="q-mr-md" dense mask="#.##" reverse-fill-mask
ftype="text" standout :label="$t('v102.vehicle.title6')" />
</div>
<div class="q-my-md" style="margin-right: 15px;">
<q-field stack-label :label="$t('v102.vehicle.title7')" standout class="col-2"
style="min-width: 180px" dense>
<div class="self-center full-width no-outline" tabindex="0">{{ search.StartDate }}</div>
<q-popup-proxy :offset="[0, 10]" ref="qDateProxy">
<q-date v-model="search.StartDate" :options="optionsFn" mask="YYYY-MM-DD"
@update:model-value="dateRangeHandler">
</q-date>
</q-popup-proxy>
</q-field>
</div>
 <q-input @blur="checkInteger()" v-model="search.UseDayNum" class="q-mr-md" dense mask="#.##"
reverse-fill-mask ftype="text" standout :label="$t('v102.vehicle.title8')" />
</div>
<div class="flex2">
<q-input class="q-mr-md" style='' v-model="search.GuideInfo" dense standout
:label="$t('v102.vehicle.title10')" />
<q-input class="q-mr-md" style='' v-model="search.TeamName" dense standout
:label="$t('v102.vehicle.title11')" />
<div class="q-my-md">
<q-select style="width: 180px;" v-model="search.BusType" dense :options="vehicletop" emit-value
option-label="Name" option-value="Id" map-options clearable :label="$t('v102.vehicle.title13')"
standout />
</div>
</div>
<!-- 表格 -->
<table width="100%" border="1" style="text-align:left;border-collapse:collapse;table-layout:fixed;word-break:break-all;max-width: 800px;border: 1px solid rgba(0, 0, 0, 0.12);
margin: auto;">
<tr>
<th width="15%" align="center" class="td-title">{{ $t('v102.vehicle.tatle.th1') }}</th>
<th width="10%" align="center" class="td-title">{{ $t('v102.vehicle.tatle.th2') }}</th>
<th width="30%" align="center" class="td-title">{{ $t('v102.vehicle.tatle.th3') }}</th>
<th width="45%" align="center" class="td-title">{{ $t('v102.vehicle.tatle.th4') }}</th>
</tr>
<template v-for="(item, i) in search.details" :key="i">
<tr>
<td>
{{ item.UseDate }}
</td>
<td>
DAY{{ item.DayNum }}
</td>
<td>
<div class="q-my-md">
<q-select style="width: 180px;" v-model="item.UseType" dense :options="listvehicle"
emit-value option-label="Name" option-value="Id" map-options clearable
:label="$t('v102.vehicle.tatle.th3')" standout />
</div>
<!-- 用车时间 -->
<div v-if="item.UseType == 3 || item.UseType == 4">
<q-input dense standout v-model="item.UseTime" mask="time"
:label="$t('v102.vehicle.title14')" style="width:180px;">
<template v-slot:append>
<q-icon name="access_time" class="cursor-pointer">
<q-popup-proxy transition-show="scale" transition-hide="scale">
<q-time v-model="item.UseTime">
<div class="row items-center justify-end">
<q-btn v-close-popup label="确定" color="primary" flat />
</div>
</q-time>
</q-popup-proxy>
</q-icon>
</template>
</q-input>
</div>
</td>
<td>
<div>
<q-input class="q-mr-md" style='' v-model="item.TripInfo" dense standout
:label="$t('v102.vehicle.tatle.th4')" />
</div>
</td>
</tr>
</template>
</table>
<!-- 表格 -->
</q-card-section>
<q-card-actions align="right" class="bg-white">
<q-btn flat dense color="dark" :label="$t('close')" class="q-mr-sm" @click="down()" v-close-popup />
<q-btn unelevated dense color="accent q-px-md" :label="$t('v102.to.m.s')" @click="join" />
</q-card-actions>
</q-card>
</template>
<script lang="ts">
import HotelService from '../../api/vehicle'
import { DirtionmaryHelper } from '../../config/dictionary'
import { defineComponent, toRefs, watch, reactive, inject, ref, onMounted } from 'vue'
import { ApiResult } from '../../@types/enumHelper'
import useScrollModule from '../../module/scrollbar/scrollModule'
import { date } from 'quasar'
import { useI18n } from 'vue-i18n'
import message from '../../utils/message'
export default defineComponent({
props: {
Id: {
type: Number,
default: 0,
require: true
}
},
setup(props, context) {
const qDateProxy = ref(null) as any
const { t } = useI18n()
const data = reactive({
loading: false,
search: {
Id: props.Id,
UseCompName: "",//订车单位
UseName: "",//订车人
PickUpInfo: "",//接机信息
GoFlightInfo: "",//去程航班
BackFlightInfo: "",//回程航班
PeopleNum: '',//用车人数
UseDayNum: null,//行程天数
StartDate: "",//开始日期
BusType: null,//用车类型(接口返下拉列表)
GuideInfo: "",//导游信息
TeamName: "",//团队信息
details: [
// {
// DayNum: null,//第几天
// UseDate: "",//日期
// UseType: null,//用车类型(接口返下拉列表)
// TripInfo: "",//行程信息
// }
]
},
vehicletop: [],//上面车辆
listvehicle: [],//车辆类型
OpenTime: '',
dateRangeFormat: '',
h: {} as any,
scrollStyle: {} as any
})
// 获取车型下拉
onMounted(() => {
methods.vehicleinit()
methods.vehicleList()
if (props.Id && props.Id > 0) {
methods.details()
}
})
const methods = {
// 获取修改详情
details() {
HotelService.VehicleDetails(props.Id)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
data.search.UseCompName = r.data.data.UseCompName
data.search.UseName = r.data.data.UseName
data.search.PickUpInfo = r.data.data.PickUpInfo
data.search.GoFlightInfo = r.data.data.GoFlightInfo
data.search.BackFlightInfo = r.data.data.BackFlightInfo
data.search.PeopleNum = r.data.data.PeopleNum
data.search.UseDayNum = r.data.data.UseDayNum
data.search.StartDate = r.data.data.StartDate.slice(0, 10)
data.search.BusType = r.data.data.BusType
data.search.GuideInfo = r.data.data.GuideInfo
data.search.TeamName = r.data.data.TeamName
data.search.details = r.data.data.BusDetailsList
message.errorMsg(r.data.message)
}
})
.catch(e => {
message.errorMsg(e.message)
})
},
// 获取车型下拉
vehicleinit() {
HotelService.TypeVehicle({})
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
data.vehicletop = r.data.data
} else {
message.errorMsg(r.data.message)
}
})
.catch(e => {
message.errorMsg(e.message)
})
},
// 获取列表用车类型
vehicleList() {
HotelService.listTypeVehicle({})
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
data.listvehicle = r.data.data
} else {
message.errorMsg(r.data.message)
}
})
.catch(e => {
message.errorMsg(e.message)
})
},
// 获取时间
getDay(set: any, day: any) {
var today = new Date(set);
var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day;
today.setTime(targetday_milliseconds); //注意,这行是关键代码
var tYear = today.getFullYear();
var tMonth = today.getMonth();
var tDate = today.getDate();
tMonth = methods.doHandleMonth(tMonth + 1);
tDate = methods.doHandleMonth(tDate);
return tYear + "-" + tMonth + "-" + tDate;
},
doHandleMonth(month: any) {
var m = month;
if (month.toString().length == 1) {
m = "0" + month;
}
return m;
},
// 时间计算
getDiffDate(start: any, end: any) {
const startTime = methods.getDate(start);
const endTime = methods.getDate(end);
const dateArr = [];
while ((endTime.getTime() - startTime.getTime()) > 0) {
const year = startTime.getFullYear();
const month = startTime.getMonth().toString().length === 1 ? '0' + (parseInt(startTime.getMonth().toString(), 10) + 1) : (startTime.getMonth() + 1);
const day = startTime.getDate().toString().length === 1 ? '0' + startTime.getDate() : startTime.getDate();
dateArr.push(year + '-' + month + '-' + day);
startTime.setDate(startTime.getDate() + 1);
}
return dateArr;
},
getDate(datestr: any) {
const temp = datestr.split('-');
if (temp[1] === '01') {
temp[0] = parseInt(temp[0], 10) - 1;
temp[1] = '12';
} else {
temp[1] = parseInt(temp[1], 10) - 1;
}
const date = new Date(temp[0], temp[1], temp[2]);
return date;
},
// 点击时间选项
dateRangeHandler(e: any) {
// data.search.StartDate = data.search.StartDate
if (qDateProxy.value) {
qDateProxy.value.hide()
methods.checkInteger()
}
},
// 测试
// 天数失去焦点时间
checkInteger() {
let details2 = [] as any
let timelist = [] as any
if (data.search.UseDayNum && data.search.UseDayNum > 0) {
let list = methods.getDay(data.search.StartDate, data.search.UseDayNum)
if (list) {
timelist = methods.getDiffDate(data.search.StartDate, list)
if (timelist && timelist.length > 0) {
timelist.forEach((item: any, i: any) => {
details2.push({
DayNum: i + 1,
UseDate: item,//日期
UseType: null as any,//用车类型(接口返下拉列表)
UseTime: '',//接送机时间
TripInfo: "",//行程信息
})
})
data.search.details = details2
}
}
}
// console.log('时间差2', details2)
},
// 关闭
down() {
context.emit('close')
},
// 确定
join() {
HotelService.vehicletripbus(data.search)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
context.emit('refresh')
} else {
message.errorMsg(r.data.message)
}
})
.catch(e => {
message.errorMsg(e.message)
data.loading = false
})
},
optionsFn(cd: any) {
return cd >= date.formatDate(date.addToDate(new Date(), { days: 0 }), 'YYYY/MM/DD')
},
}
return { ...toRefs(data), ...methods, qDateProxy }
}
})
</script>
<style scoped>
.flex2 {
display: flex;
align-items: center;
}
.td-title {
font-size: 12px;
font-weight: 400;
color: #a8a8b3;
}
</style>
\ No newline at end of file
......@@ -414,7 +414,7 @@ export default {
date: '2022/11/29',
content: ''
},
Listofquotation:{
Listofquotation: {
pageTitle: '見積書です',
baojiadan: '見積書です',
dindanbaojia: 'ホテルを註文します',
......@@ -439,14 +439,14 @@ export default {
t8: '番号を変えます',
t9: '日本の口座を送金した後に直ちに情報を知らせてください、日本の旅行社の問い合わせを便利にしてくださいありがとうございます思いやり',
},
btn:{
btn: {
dayin: '印刷 です',
xiaza: '下載 です',
cjfaipiao: 'インボイスを作成します',
bjd: '見積書です'
}
},
scattered:{
scattered: {
kefang: '客室です',
chengren: '大人です',
ertong: '子供です',
......@@ -556,13 +556,13 @@ export default {
qi: 'からです',
ziying: '自営業です',
jalan: 'jalan',
zhutifea1:'駅から歩いて5分です',
zhutifea1: '駅から歩いて5分です',
zhutifea2: '温泉があります',
zhutifea3: 'ビーチまで5分です',
zhutifea4: 'チェックアウト11時以降です',
xiangqing: '詳細を見ます'
},
scatteredDetails:{
scatteredDetails: {
xiangqing: 'ホテルの詳細です',
jiudianxinxi: 'ホテル情報です',
miaoshu: 'です',
......@@ -686,7 +686,7 @@ export default {
renju: '一人当たりです',
yuyue: '予约',
},
scatteredOrder:{
scatteredOrder: {
prompt1: '13歳以上は成人扱いです',
prompt2: '成功を予約した後に部屋はあなたのために一晩中保留します',
fangxing: '部屋型です',
......@@ -766,7 +766,7 @@ export default {
notiaojian: 'このクーポンは利用条件を満たしていません!',
dindanhao: '註文番号です',
},
scatteredOrderList:{
scatteredOrderList: {
state1: '待ちます',
state2: '取引成立です',
state3: 'キャンセルしました',
......@@ -786,102 +786,136 @@ export default {
},
//#endregion
//#region v1.0.2
v102:{
ticket:{
v102: {
ticket: {
nobj: '見積もりがまだないので註文できません',
d:'入場券期日です',
d: '入場券期日です',
jq: '景観区の名称です',
hn:'チケットの名前です',
sl:'数',
starttime:'入場券の時間です',
pageTitle:'チケット検索',
name:'名前を入力してくださいです',
toggleListType1:'リストモードです',
toggleListType2:'カードモードです',
Japan:'日本です',
stoppage:'場のように停止します',
recommendTime:'お勧めします',
hn: 'チケットの名前です',
sl: '数',
starttime: '入場券の時間です',
pageTitle: 'チケット検索',
name: '名前を入力してくださいです',
toggleListType1: 'リストモードです',
toggleListType2: 'カードモードです',
Japan: '日本です',
stoppage: '場のように停止します',
recommendTime: 'お勧めします',
hour: '時間です',
minutes:'分です',
load:'画像の読み込みに失敗しました',
showtt:{
t1:'計',
t2:'種票型です'
minutes: '分です',
load: '画像の読み込みに失敗しました',
showtt: {
t1: '計',
t2: '種票型です'
},
buy:'今すぐチケットを予約します',
shortBuy:'予約です',
addr:'アドレスです',
map:'地図です',
jing:'スポットです',
detail:'景区詳細です',
d1:'オープン時間です',
d2:'景勝地の特色',
d3:'交通の説明です',
d4:'暖かい注意です',
d5:'予約事項です',
preview:{
pageTitle:'註文プレビューです'
buy: '今すぐチケットを予約します',
shortBuy: '予約です',
addr: 'アドレスです',
map: '地図です',
jing: 'スポットです',
detail: '景区詳細です',
d1: 'オープン時間です',
d2: '景勝地の特色',
d3: '交通の説明です',
d4: '暖かい注意です',
d5: '予約事項です',
preview: {
pageTitle: '註文プレビューです'
},
ordertip:'前日の23:00までに予約をお願いします',
pt:'遊びの日です',
tt:'選択票型です',
ti:'チケット情報です',
bc:'購入枚数ですが',
gi:'チケットを取ります',
zq:'切符は自分で受け取ります',
yj:'チケットを送ります',
zqs:'自己取票説明します',
zqd:'自分で指定の位置に行ってチケットを取ります、あなたが支払いを完了した後に私達はメールを通じてチケットの情報を取ることをお知らせします',
sj:'ゲストメッセージです',
youji:'メッセージを送ります',
unit:'枚',
sex:{
man:'男',
women:'女'
ordertip: '前日の23:00までに予約をお願いします',
pt: '遊びの日です',
tt: '選択票型です',
ti: 'チケット情報です',
bc: '購入枚数ですが',
gi: 'チケットを取ります',
zq: '切符は自分で受け取ります',
yj: 'チケットを送ります',
zqs: '自己取票説明します',
zqd: '自分で指定の位置に行ってチケットを取ります、あなたが支払いを完了した後に私達はメールを通じてチケットの情報を取ることをお知らせします',
sj: 'ゲストメッセージです',
youji: 'メッセージを送ります',
unit: '枚',
sex: {
man: '男',
women: '女'
},
sjc:{
c1:'中国語の名前です',
c2:'英語の名前です',
c3:'性別です',
c4:'連絡します',
c5:'宛先です'
sjc: {
c1: '中国語の名前です',
c2: '英語の名前です',
c3: '性別です',
c4: '連絡します',
c5: '宛先です'
},
sjcp:{
c1:'中国語の名前を入力してくださいです',
c2:'英語の名前を入力してくださいです',
c4:'連絡先を入力します',
c5:'宛先を入力します'
sjcp: {
c1: '中国語の名前を入力してくださいです',
c2: '英語の名前を入力してくださいです',
c4: '連絡先を入力します',
c5: '宛先を入力します'
},
st:'勘定書を決済します',
rtt:'チケットの払い戻し制限です',
rtc:'未消費はいつでも払い戻し可能で、復数のチケットの註文は一部払い戻しをサポートしません',
ms:'チケット予約です',
nt:'選択券はありません',
ds:'総受注額です',
sb:'注文書を提出します',
or:'注文書です',
zqa:'自分でアドレスを取ります',
nzqa:'お客様サービスのご確認後、ご住所が分かりますので、至急メールにてお知らせいたします'
st: '勘定書を決済します',
rtt: 'チケットの払い戻し制限です',
rtc: '未消費はいつでも払い戻し可能で、復数のチケットの註文は一部払い戻しをサポートしません',
ms: 'チケット予約です',
nt: '選択券はありません',
ds: '総受注額です',
sb: '注文書を提出します',
or: '注文書です',
zqa: '自分でアドレスを取ります',
nzqa: 'お客様サービスのご確認後、ご住所が分かりますので、至急メールにてお知らせいたします'
},
to:{
pageTitle:'チケット註文リストです',
ticketName:'チケットネームです',
to: {
pageTitle: 'チケット註文リストです',
ticketName: 'チケットネームです',
Name: 'お客様の名前です',
qj:'チケットを取ります',
qjc:'依頼人の名前(日/英)です',
qjp:'受取人電話です',
ps:{
p1:'配送待ちです',
p2:'配達しました'
qj: 'チケットを取ります',
qjc: '依頼人の名前(日/英)です',
qjp: '受取人電話です',
ps: {
p1: '配送待ちです',
p2: '配達しました'
},
m:{
t:'受け取り方を修正します',
c:'修正を取り消します',
s:'修正を保存します'
m: {
t: '受け取り方を修正します',
c: '修正を取り消します',
s: '修正を保存します'
},
},
vehicle: {
title: '顧客予約確認書(乗用車)',
title1: "車の予約単位",
title2: "車の予約人",
title3: "受信情報",
title4: "往路便",
title5: "帰りのフライト",
title6: "車の人数",
title7: "開始日",
title8: "トリップ日数",
title9: "車タイプ",
title10: "ガイド情報",
title11: "チーム情報",
title12: "作成時間",
title13: "車種選択",
title14: "送迎時間",
tatle: {
th1: '日付',
th2: '何日目',
th3: '車タイプ',
th4: 'トリップ情報',
},
add: '追加',
add2: '修正',
add3: '車のキャンセル',
add4: '理由',
add5: 'を選択して、',
list: {
s1: '自動車会社',
s2: '車掌',
s3: 'チーム名',
s4: '予定日を選択してください',
s5: '編集',
}
}
},
//#endregion
}
......@@ -22,18 +22,18 @@ export default {
have: '있다',
free: '무료',
before: '미리',
dinner:{
dinner: {
a: '아침식사',
b: '점심 식사',
c: '저녁식사'
},
hotelType:{
hotelType: {
a: '비즈니스 호텔',
b: '고급 호텔',
c: '온천 호텔',
d: '해변 리조트',
},
personal:{
personal: {
pageTitle: '개인 파일',
trading: '누적 거래',
order: '주문 수량',
......@@ -60,14 +60,14 @@ export default {
updateSuccess: '비밀번호가 성공적으로 변경되었습니다. 다시 로그인하십시오',
photoSuccess: '프로필 설정 성공'
},
upload:{
upload: {
'success': '업로드에 성공했습니다',
'failed': '업로드 실패',
'down': '다운로드',
'reload': '새로 고침'
},
hd:{
item:{
hd: {
item: {
a: '탕세',
b: '도시 세금',
c: '주차장',
......@@ -78,13 +78,13 @@ export default {
h: '따뜻한 알림'
}
},
dialog:{
titles:{
dialog: {
titles: {
hotel: '호텔 경고 제거',
horder: '주문취소 경고'
},
contents:{
hotel:{
contents: {
hotel: {
t1: '확실히 제거하셔야 합니다',
t2: '호텔'
},
......@@ -101,11 +101,11 @@ export default {
jf: '칸',
day: '일'
},
expends:{
expends: {
on: '벌',
off: '접'
},
hotelm:{
hotelm: {
pageTitle: '호텔 주문변경',
otherRoom: '다른 방을 사용한다',
noneOther: '더 이상 쓸 수 있는 집이 없다',
......@@ -113,7 +113,7 @@ export default {
cancel: '주문취소'
},
hotelorder: {
dialog:{
dialog: {
title: '당신의 전속지불계좌는 아래와 같습니다',
AccountName: '이름',
account: '계정',
......@@ -258,7 +258,7 @@ export default {
subtitle: '호텔 구매 리스트',
sumPrice: '주문총금액'
},
shopping:{
shopping: {
labelNum: '주택 수',
peopleNum: '수가',
small: '수량이 작으면 안 된다',
......@@ -399,7 +399,7 @@ export default {
//eg:
//#region v1.0.1
v101:{
v101: {
downloadHands: '핸드북 다운',
noneHands: '손에 쥔 책은 태어나지 않았다',
hotelTips: '호텔 아늑한 알람',
......@@ -410,11 +410,11 @@ export default {
hotelRemark: '설명',
cancelRemark: '설명 취소',
selfCancle: '고객이 주문을 취소했습니다',
versonDetails:{
versonDetails: {
date: '2022/11/29',
content: ''
},
Listofquotation:{
Listofquotation: {
pageTitle: '견적서',
baojiadan: '견적서',
dindanbaojia: '호텔 주문 오퍼',
......@@ -439,14 +439,14 @@ export default {
t8: '다시 번호',
t9: '일본계좌를송금한후일본여행사가문의할수있도록정보를적시에 알려주십시오. 감사합니다. 양해 바랍니다'
},
btn:{
btn: {
dayin: '인쇄',
xiaza: '다운로드',
cjfaipiao: '영수증 만들기',
bjd: '견적서'
}
},
scattered:{
scattered: {
kefang: '객실이요',
chengren: '어른',
ertong: '어린이들입니다',
......@@ -562,7 +562,7 @@ export default {
zhutifea4: '11시 이후에 체크아웃합니다',
xiangqing: '자세히 보기'
},
scatteredDetails:{
scatteredDetails: {
xiangqing: '호텔 정보',
jiudianxinxi: '호텔 정보',
miaoshu: '묘사합니다',
......@@ -686,7 +686,7 @@ export default {
renju: '1인 당',
yuyue: '예약',
},
scatteredOrder:{
scatteredOrder: {
prompt1: '13세 이상은 성인으로 취급한다',
prompt2: '예약이 완료되면 밤새 당신을 위해 방이 있습니다',
fangxing: '집 모양',
......@@ -766,7 +766,7 @@ export default {
notiaojian: '해당 쿠폰은 사용 조건에 미달!',
dindanhao: '주문번호입니다',
},
scatteredOrderList:{
scatteredOrderList: {
state1: '지불대기',
state2: '거래가 성공했습니다',
state3: '취소됨',
......@@ -786,102 +786,136 @@ export default {
},
//#endregion
//#region v1.0.2
v102:{
ticket:{
v102: {
ticket: {
nobj: '잠시 가격이 없어 주문을 할 수 없습니다',
d:"입장권 날짜",
d: "입장권 날짜",
jq: '관광지 명칭',
hn:"입장권 명칭",
sl:"수량",
starttime:'티켓타임',
pageTitle:"티켓 검색",
name:'명소 이름을 입력해주세요',
toggleListType1:"목록 모드",
toggleListType2:"카드 모드",
hn: "입장권 명칭",
sl: "수량",
starttime: '티켓타임',
pageTitle: "티켓 검색",
name: '명소 이름을 입력해주세요',
toggleListType1: "목록 모드",
toggleListType2: "카드 모드",
Japan: '일본',
stoppage:'정지하다',
stoppage: '정지하다',
recommendTime: '구경거리를 추천하다',
hour: '시간',
minutes: '분',
load:'이미지를 불러오는 데 실패했습니다',
showtt:{
t1:'모두',
t2:'종류 유형'
load: '이미지를 불러오는 데 실패했습니다',
showtt: {
t1: '모두',
t2: '종류 유형'
},
buy:"바로 예약하세요",
shortBuy:'예약',
addr:"주소",
map:'지도입니다',
jing:"명소",
detail:'관광지 상세',
d1:"오픈 타임",
d2:"풍경 특징",
d3:"교통 안내서",
d4:'따뜻한 알림',
d5:"예약 안내",
preview:{
pageTitle:'주문서 미리보기'
buy: "바로 예약하세요",
shortBuy: '예약',
addr: "주소",
map: '지도입니다',
jing: "명소",
detail: '관광지 상세',
d1: "오픈 타임",
d2: "풍경 특징",
d3: "교통 안내서",
d4: '따뜻한 알림',
d5: "예약 안내",
preview: {
pageTitle: '주문서 미리보기'
},
ordertip:"하루 전날 밤 23시까지 예약을 마치세요",
pt:"플레이 날짜",
tt:"선택 티켓",
ti:"티켓 정보",
bc:"구매 장수",
gi:'투표용지입니다',
zq:'무료티켓입니다',
yj:"우편 티켓",
zqs:"주문서",
zqd:"직접 지정된 장소로 가서 표를 받으시면 돈을 지불하신 후에 우편으로 표를 받으라는 정보를 알려 드리겠습니다",
sj:'고객 메시지',
youji:'메시지 보내기',
unit:'장',
sex:{
man:'男',
women:'女'
ordertip: "하루 전날 밤 23시까지 예약을 마치세요",
pt: "플레이 날짜",
tt: "선택 티켓",
ti: "티켓 정보",
bc: "구매 장수",
gi: '투표용지입니다',
zq: '무료티켓입니다',
yj: "우편 티켓",
zqs: "주문서",
zqd: "직접 지정된 장소로 가서 표를 받으시면 돈을 지불하신 후에 우편으로 표를 받으라는 정보를 알려 드리겠습니다",
sj: '고객 메시지',
youji: '메시지 보내기',
unit: '장',
sex: {
man: '男',
women: '女'
},
sjc:{
c1:'중국어 이름입니다',
c2:'영어 이름',
c3:"성별",
c4:"연락 전화",
c5:"수신 주소"
sjc: {
c1: '중국어 이름입니다',
c2: '영어 이름',
c3: "성별",
c4: "연락 전화",
c5: "수신 주소"
},
sjcp:{
c1:"중국어 이름을 입력해주세요",
c2:"영어 이름을 입력해주세요",
c4:"연락처를 입력해주세요",
c5:"수신 주소를 입력하십시오"
sjcp: {
c1: "중국어 이름을 입력해주세요",
c2: "영어 이름을 입력해주세요",
c4: "연락처를 입력해주세요",
c5: "수신 주소를 입력하십시오"
},
st:"계산서를 정리합니다",
rtt:"환불 제한",
rtc:"구매하지 않은 것은 언제든지 환불이 가능합니다. 여러 장의 주문서는 부분 환불이 불가능합니다",
ms:'티켓 예약 명세',
nt:"티켓이 없어요",
ds:'주문 총액입니다',
sb:"주문서를 제출하세요",
or:'주문서 설명',
zqa:'고유 주소',
nzqa:'고객 서비스 확인 후 사용자 주소 확인, 제일 먼저 이메일로 알려 드리겠습니다'
st: "계산서를 정리합니다",
rtt: "환불 제한",
rtc: "구매하지 않은 것은 언제든지 환불이 가능합니다. 여러 장의 주문서는 부분 환불이 불가능합니다",
ms: '티켓 예약 명세',
nt: "티켓이 없어요",
ds: '주문 총액입니다',
sb: "주문서를 제출하세요",
or: '주문서 설명',
zqa: '고유 주소',
nzqa: '고객 서비스 확인 후 사용자 주소 확인, 제일 먼저 이메일로 알려 드리겠습니다'
},
to:{
pageTitle:'티켓 주문 목록',
ticketName:'티켓 이름',
to: {
pageTitle: '티켓 주문 목록',
ticketName: '티켓 이름',
Name: '손님 이름',
qj:'쿠폰으로',
qjc:"사람 이름 (중국어/영어)",
qjp:"수신자 전화",
ps:{
p1:"배송을 기다립니다",
p2:"배송되었습니다"
qj: '쿠폰으로',
qjc: "사람 이름 (중국어/영어)",
qjp: "수신자 전화",
ps: {
p1: "배송을 기다립니다",
p2: "배송되었습니다"
},
m:{
t:"수신 방법 수정",
c:"수정 취소",
s:"변경 사항 저장"
m: {
t: "수신 방법 수정",
c: "수정 취소",
s: "변경 사항 저장"
},
},
vehicle: {
title: '고객차 주문확인서',
title1: "자동차 예약 회사",
title2: "자동차 예약자",
title3: "공항 정보",
title4: "출발 항공편",
title5: "돌아오는 항공편",
title6: "차량 사용 인원",
title7: "시작 날짜",
title8: "여행 일수",
title9: "차량 종류",
title10: "가이드 정보",
title11: "팀 정보",
title12: "만든 시간",
title13: "차량 모델 선택",
title14: "공항 영송 시간",
tatle: {
th1: '날짜',
th2: '며칠째',
th3: '차량 종류',
th4: '스트로크 정보',
},
add: '추가',
add2: '수정',
add3: '차용을 폐지하다',
add4: '원인',
add5: '확정',
list: {
s1: '차량 회사',
s2: '차량 운반자',
s3: '팀 이름',
s4: '예정일을 선택해 주세요',
s5: '편집',
}
}
},
//#endregion
}
export default {
//#region ending v1.0.0
failed: '執行失敗',
......@@ -399,7 +400,7 @@ export default {
//eg:
//#region v1.0.1
v101:{
v101: {
downloadHands: '下載手佩書',
noneHands: '手佩書未生成',
hotelTips: '酒店溫馨提醒',
......@@ -410,11 +411,11 @@ export default {
hotelRemark: '備註',
cancelRemark: '取消備註',
selfCancle: '客戶自己取消了訂單',
versonDetails:{
versonDetails: {
date: '2022/11/29',
content: ''
},
Listofquotation:{
Listofquotation: {
pageTitle: '報價單',
baojiadan: '報價單',
dindanbaojia: '酒店訂單報價',
......@@ -439,14 +440,14 @@ export default {
t8: '重新番号',
t9: '汇款日本账户后请及时告知信息,方便日本旅行社查询谢谢体谅',
},
btn:{
btn: {
dayin: '打印',
xiaza: '下載',
cjfaipiao: '創建發票',
bjd: '報價單'
}
},
scattered:{
scattered: {
kefang: '客房',
chengren: '成人',
ertong: '兒童',
......@@ -562,7 +563,7 @@ export default {
zhutifea4: '退房11點以後',
xiangqing: '查看詳情'
},
scatteredDetails:{
scatteredDetails: {
xiangqing: '酒店詳情',
jiudianxinxi: '酒店信息',
miaoshu: '描述',
......@@ -686,7 +687,7 @@ export default {
renju: '人均',
yuyue: '預約',
},
scatteredOrder:{
scatteredOrder: {
prompt1: '超過13歲視為成人處理',
prompt2: '預定成功後房間將為您整晚保留',
fangxing: '房型',
......@@ -766,7 +767,7 @@ export default {
notiaojian: '該優惠券不滿足使用條件!',
dindanhao: '訂單號',
},
scatteredOrderList:{
scatteredOrderList: {
state1: '待付款',
state2: '交易成功',
state3: '已取消',
......@@ -786,102 +787,136 @@ export default {
},
//#endregion
//#region v1.0.2
v102:{
ticket:{
v102: {
ticket: {
nobj: '暫無報價,不能下單',
d: '日期',
jq: '景區名稱',
hn: '票券名稱',
sl: '数量',
starttime:'门票時間',
pageTitle:"票券檢索",
name:'請輸入景點名稱',
toggleListType1:"列表模式",
toggleListType2:"卡片模式",
starttime: '门票時間',
pageTitle: "票券檢索",
name: '請輸入景點名稱',
toggleListType1: "列表模式",
toggleListType2: "卡片模式",
Japan: '日本',
stoppage:'停止如場',
stoppage: '停止如場',
recommendTime: '推薦遊玩',
hour: '小時',
minutes: '分鐘',
load:'圖片加載失敗',
showtt:{
t1:'共',
t2:'種票型'
load: '圖片加載失敗',
showtt: {
t1: '共',
t2: '種票型'
},
buy:'立即订票',
shortBuy:'預訂',
addr:'地址',
map:'地圖',
jing:'景點',
detail:'景區詳情',
d1:'開放時間',
d2:'景區特色',
d3:'交通說明',
d4:'溫馨提醒',
d5:'預訂須知',
preview:{
pageTitle:'订单预览'
buy: '立即订票',
shortBuy: '預訂',
addr: '地址',
map: '地圖',
jing: '景點',
detail: '景區詳情',
d1: '開放時間',
d2: '景區特色',
d3: '交通說明',
d4: '溫馨提醒',
d5: '預訂須知',
preview: {
pageTitle: '订单预览'
},
ordertip:'請在遊玩前一天的23:00前完成預訂',
pt:'遊玩日期',
tt:'選擇票型',
ti:'票券信息',
bc:'購買張數',
gi:'取票方式',
zq:'自行取票',
yj:'郵寄票券',
zqs:'自行取票說明',
zqd:'自行前往指定位置取票,當您完成付款後我們將通過郵件通知您取票的門票訊息',
sj:'客人訊息',
youji:'郵寄訊息',
unit:'張',
sex:{
man:'男',
women:'女'
ordertip: '請在遊玩前一天的23:00前完成預訂',
pt: '遊玩日期',
tt: '選擇票型',
ti: '票券信息',
bc: '購買張數',
gi: '取票方式',
zq: '自行取票',
yj: '郵寄票券',
zqs: '自行取票說明',
zqd: '自行前往指定位置取票,當您完成付款後我們將通過郵件通知您取票的門票訊息',
sj: '客人訊息',
youji: '郵寄訊息',
unit: '張',
sex: {
man: '男',
women: '女'
},
sjc:{
c1:'中文姓名',
c2:'英文姓名',
c3:'性別',
c4:'聯絡電話',
c5:'收件地址'
sjc: {
c1: '中文姓名',
c2: '英文姓名',
c3: '性別',
c4: '聯絡電話',
c5: '收件地址'
},
sjcp:{
c1:'請輸入中文姓名',
c2:'請輸入英文姓名',
c4:'請輸入聯絡電話',
c5:'請輸入收件地址'
sjcp: {
c1: '請輸入中文姓名',
c2: '請輸入英文姓名',
c4: '請輸入聯絡電話',
c5: '請輸入收件地址'
},
st:'結算帳單',
rtt:'退票限制',
rtc:'未消費隨時可退,多張票訂單不支持部分退款',
ms:'訂票明細',
nt:'沒有選擇票券',
ds:'訂單總額',
sb:'提交訂單',
or:'訂單備註',
zqa:'自取地址',
nzqa:'等待客服確認後,才能看到自取地址,我們將會第一時間通過郵件告知您'
st: '結算帳單',
rtt: '退票限制',
rtc: '未消費隨時可退,多張票訂單不支持部分退款',
ms: '訂票明細',
nt: '沒有選擇票券',
ds: '訂單總額',
sb: '提交訂單',
or: '訂單備註',
zqa: '自取地址',
nzqa: '等待客服確認後,才能看到自取地址,我們將會第一時間通過郵件告知您'
},
to:{
pageTitle:'票券訂單列表',
ticketName:'景點名稱',
to: {
pageTitle: '票券訂單列表',
ticketName: '景點名稱',
Name: '客人名稱',
qj:'取券方式',
qjc:'取件人姓名(中/英)',
qjp:'取件人電話',
ps:{
p1:'等待配送',
p2:'已配送'
qj: '取券方式',
qjc: '取件人姓名(中/英)',
qjp: '取件人電話',
ps: {
p1: '等待配送',
p2: '已配送'
},
m:{
t:'修改取件方式',
c:'取消修改',
s:'保存修改'
m: {
t: '修改取件方式',
c: '取消修改',
s: '保存修改'
},
},
vehicle: {
title: '客戶訂車確認單(小車)',
title1: "訂車單位",
title2: "訂車人",
title3: "接機信息",
title4: "去程航班",
title5: "回程航班",
title6: "用車人數",
title7: "開始日期",
title8: "行程天數",
title9: "用車類型",
title10: "導遊信息",
title11: "团队信息",
title12: "創建時間",
title13: "車型選擇",
title14: "接送機時間",
tatle: {
th1: '日期',
th2: '第幾天',
th3: '用車類型',
th4: '行程信息',
},
add: '添加',
add2: '修改',
add3: '取消用車',
add4: '原因',
add5: '確定',
list: {
s1: '用車公司',
s2: '用車人',
s3: '團隊名稱',
s4: '請選擇預定日期',
s5: '编辑',
}
}
},
//#endregion
}
<template>
<div class="fix-height-subpage column no-wrap q-pa-md">
<!-- 表格 -->
<q-card class="light-shadow q-pa-md bg-white rounded-borders q-mb-md" flat>
<div class="add">
<div class="flex">
<q-input v-model="pages.UseCompName" @blur="refresh" class="col q-mr-md" reverse-fill-mask dense
standout :label="$t('v102.vehicle.list.s1')" />
<q-input v-model="pages.UseName" @blur="refresh" class="col q-mr-md" dense reverse-fill-mask
standout :label="$t('v102.vehicle.list.s2')" />
<q-input v-model="pages.TeamName" @blur="refresh" class="col q-mr-md" dense reverse-fill-mask
standout :label="$t('v102.vehicle.list.s3')" />
<q-field v-if="$q.platform.is.desktop" clearable v-model="dateRangeFormat"
:label="$t('v102.vehicle.list.s4')" standout class="col-2" style="min-width: 190px" dense>
<div class="self-center full-width no-outline" tabindex="0">{{ dateRangeFormat }}</div>
<q-popup-proxy :offset="[0, 10]" ref="qDateProxy">
<q-date v-model="dateRange" :options="optionsFn" range mask="YYYY/MM/DD" landscape
@range-end="dateRangeHandler"></q-date>
</q-popup-proxy>
</q-field>
</div>
<div>
<q-btn class="col q-mr-md" color="primary" unelevated :label="$t('v102.vehicle.add')"
@click="mask(0)" />
<q-btn class="col q-mr-md" color="primary" unelevated :label="$t('query')" @click="refresh" />
</div>
</div>
<div class="">
<q-table v-if="$q.platform.is.desktop" separator="cell" :pagination="pages" dense :rows="hotels"
row-key="Id" bordered :columns="cols"
class="sticky-rightrowspan-column-table light-border col no-shadow">
<template v-slot:body-cell-Id="props">
<q-td :prop="props" v-if="props.row.Status == 0">
<span @click="mask(props.row.Id)">
<q-btn class="col q-mr-md" color="primary" unelevated
:label="$t('v102.vehicle.list.s5')" />
</span>
<span @click="cancel(props.row.Id)">
<q-btn color="red" unelevated :label="$t('v102.vehicle.add3')" />
</span>
</q-td>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary"
:max="pageCount" :input="true" @update:model-value="changePageHandler" />
</template>
</q-table>
<!-- 移动 -->
<q-table hide-header v-else :rows="hotels" grid :columns="cols" row-key="Id"
card-class="no-shadow bg-primary text-white col" :pagination="pages" :loading="loading">
<template v-slot:body-cell-Id="props" v-if="props.row.Status == 0">
<q-td :prop="props">
<span @click="mask(props.row.Id)">
<q-btn class="col q-mr-md" color="primary" unelevated
:label="$t('v102.vehicle.list.s5')" />
</span>
<span @click="cancel(props.row.Id)">
<q-btn color="red" unelevated :label="$t('v102.vehicle.add3')" />
</span>
</q-td>
</template>
<template v-slot:bottom>
<q-pagination class="full-width justify-end" v-model="pages.pageIndex" color="primary"
:max="pageCount" :input="true" @update:model-value="changePageHandler" />
</template>
</q-table>
</div>
</q-card>
<!-- 详情 -->
<q-dialog v-model="showPriceList">
<vehicle-popover @close="close" :Id='Id' @refresh="refresh">
</vehicle-popover>
</q-dialog>
<!-- 取消弹窗 -->
<q-dialog v-model="cancelshow">
<q-card flat class="" style="width: 40vw;">
<q-card-section class="q-pa-sm">
<div class="text-h6">{{ $t('v102.vehicle.add3') }}</div>
</q-card-section>
<q-card-section>
<q-input v-model="CancelRemark" :label="$t('v102.vehicle.add4')" :rows="3" filled type="textarea" />
</q-card-section>
<q-card-actions align="right" class="bg-white">
<q-btn flat dense color="dark" :label="$t('close')" class="q-mr-sm" @click="cancelshow = true"
v-close-popup />
<q-btn unelevated dense color="accent q-px-md" :label="$t('v102.vehicle.add5')"
@click="cancellations" />
</q-card-actions>
</q-card>
</q-dialog>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, reactive, toRefs, provide, onMounted, inject, watch, onBeforeUnmount, computed } from 'vue'
import { useI18n } from 'vue-i18n'
import { useQuasar } from 'quasar'
import { date } from 'quasar'
import vehiclePopover from '../../components/vehicle/vehiclePopover.vue'
// import { DirtionmaryHelper } from '../../../config/dictionary',
import useScrollModule from 'src/module/scrollbar/scrollModule'
import HotelService from '../../api/vehicle'
import message from 'src/utils/message'
import { ApiResult } from 'src/@types/enumHelper'
export default defineComponent({
components: { vehiclePopover },
setup() {
const qDateProxy = ref(null) as any
const { t } = useI18n()
const $q = useQuasar()
const data = reactive({
cancelshow: false,
CancelRemark: '',
Id: 0,
loading: false,
showPriceList: false,
pageTitle: '44' as (string | undefined),
pages: {
pageIndex: 1,
pageSize: 12,
rowsPerPage: 12,
UseCompName: '',
UseName: '',
TeamName: '',
StartTime: "",
EndTime: '',
},
dateRangeFormat: '',
dateRange: {} as any,
pageCount: 0,
hotels: [
] as Array<any>,
cols: [
{ name: 'UseCompName', label: t('v102.vehicle.title1'), field: (row: any) => row.UseCompName, align: 'left' },
{ name: 'UseName', label: t('v102.vehicle.title2'), field: (row: any) => row.UseName, align: 'left' },
{ name: 'PickUpInfo', label: t('v102.vehicle.title3'), field: (row: any) => row.PickUpInfo, align: 'left' },
{ name: 'GoFlightInfo', label: t('v102.vehicle.title4'), field: (row: any) => row.GoFlightInfo, align: 'left' },
{ name: 'BackFlightInfo', label: t('v102.vehicle.title5'), field: (row: any) => row.BackFlightInfo, align: 'left' },
{ name: 'PeopleNum', label: t('v102.vehicle.title6'), field: (row: any) => row.PeopleNum, align: 'left' },
{ name: 'StartDate', label: t('v102.vehicle.title7'), field: (row: any) => row.StartDate, align: 'left' },
{ name: 'UseDayNum', label: t('v102.vehicle.title8'), field: (row: any) => row.UseDayNum, align: 'left' },
{ name: 'BusTypeName', label: t('v102.vehicle.title9'), field: (row: any) => row.GuideInfo, align: 'left' },
{ name: 'UseName', label: t('v102.vehicle.title10'), field: (row: any) => row.GuideInfo, align: 'left' },
{ name: 'TeamName', label: t('v102.vehicle.title11'), field: (row: any) => row.TeamName, align: 'left' },
{ name: 'CreateDate', label: t('v102.vehicle.title12'), field: (row: any) => row.CreateDate, align: 'left' },
{ name: 'Id', label: t('hotel.addRoomBtn'), field: (row: any) => row.Id, align: 'left' },
] as any,
})
// data.dateRange.to = date.formatDate(date.addToDate(new Date(), { days: 9 }), 'YYYY/MM/DD')
// data.dateRange.from = date.formatDate(date.addToDate(new Date(), { days: 8 }), 'YYYY/MM/DD')
// data.dateRangeFormat = `${data.dateRange.from} - ${data.dateRange.to}`
// data.pages.StartTime = data.dateRange.from
// data.pages.EndTime = data.dateRange.to
// data.pageTitle = inject(DirtionmaryHelper.PAGE_TITLE_KEY)
const methods = {
cancel(item: any) {
data.cancelshow = true
data.Id = item
},
// 取消用车
cancellations() {
HotelService.cancellation(data.Id, data.CancelRemark)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
data.cancelshow = false
methods.refresh()
} else {
message.errorMsg(r.data.message)
}
})
.catch(e => {
message.errorMsg(e.message)
})
},
// 获取列表数据
initHotel() {
HotelService.vehicleList(data.pages)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
data.hotels = r.data.data.pageData
data.pageCount = r.data.data.pageCount
} else {
message.errorMsg(r.data.message)
}
})
.catch(e => {
message.errorMsg(e.message)
})
},
// 获取时间选择
dateRangeHandler(e: any) {
data.pages.StartTime = `${e.from.year}-${e.from.month}-${e.from.day}`
data.pages.EndTime = `${e.to.year}-${e.to.month}-${e.to.day} `
data.dateRangeFormat = `${data.pages.StartTime} - ${data.pages.EndTime} `
if (qDateProxy.value) {
qDateProxy.value.hide()
// methods.refresh()
}
},
close() {
data.showPriceList = false
},
// 刷新
refresh() {
// console.log('444')
data.pages.pageIndex = 1
methods.initHotel()
data.showPriceList = false
},
// 翻页
changePageHandler(n: any) {
console.log(n)
data.pages.pageIndex = n
methods.initHotel()
},
mask(val: any) {
data.Id = val
data.showPriceList = true
}
}
onMounted(() => {
methods.initHotel()
})
return { ...toRefs(data), ...methods, qDateProxy }
},
})
</script>
<style scoped>
.date-box /deep/.q-field__control {
height: 20px;
}
.add {
margin-bottom: 20px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
}
.shou {
cursor: pointer;
}
.driver {
font-size: 14px;
font-weight: 400;
border-bottom: 1px solid;
margin-left: 50px;
}
.title {
display: flex;
justify-content: center;
font-size: 22px;
margin-bottom: 10px;
}
.flex {
display: flex;
align-items: center;
}
th {
padding: 10px 10px;
font-size: 14px;
}
.table-title {
font-size: 14px;
}
</style>
......@@ -17,8 +17,9 @@ const routes: RouteRecordRaw[] = [
{ path: '/scattered/HotelOrder', component: () => import('pages/scattered/HotelOrder.vue') },
{ path: '/comingsoon', component: () => import('pages/ComingSoon.vue') },
{ path: '/ticket/list', component: () => import('pages/ticket/TicketList.vue') },
{path: '/ticket/preview/:ticketId/:Time', component: () => import('pages/ticket/TicketOrderPreview.vue')},
{path: '/ticket/order', component: () => import('pages/ticket/TicketOrder.vue')}
{ path: '/ticket/preview/:ticketId/:Time', component: () => import('pages/ticket/TicketOrderPreview.vue') },
{ path: '/ticket/order', component: () => import('pages/ticket/TicketOrder.vue') },
{ path: '/vehicle/index', component: () => import('pages/vehicle/index.vue') }//车辆
]
},
{
......
import { i18n } from '../boot/i18n'
interface Menu {
name:string,
url:string,
id:number,
parentId:number,
icon?:string,
childs?:Menu []
name: string,
url: string,
id: number,
parentId: number,
icon?: string,
childs?: Menu[]
}
const {t} =i18n.global
const useMenus={
getMenus():Menu[]{
let menus=[] as Menu[]
const { t } = i18n.global
const useMenus = {
getMenus(): Menu[] {
let menus = [] as Menu[]
menus.push({
name:t('menu.hotel.first'),
url:'',
id:1,
parentId:0,
icon:'Home/Building.svg',
childs:[
name: t('menu.hotel.first'),
url: '',
id: 1,
parentId: 0,
icon: 'Home/Building.svg',
childs: [
{
name:t('menu.hotel.second'),
url:'/hotel',
id:2,
parentId:1,
name: t('menu.hotel.second'),
url: '/hotel',
id: 2,
parentId: 1,
},
{
name:t('menu.hotel.three'),
url:'/hotel/order',
id:3,
parentId:1,
name: t('menu.hotel.three'),
url: '/hotel/order',
id: 3,
parentId: 1,
}
]
})
menus.push({
name:t('menu.scattered.first'),
url:'',
id:13,
parentId:0,
icon:'scattered/The.svg',
childs:[
name: t('menu.scattered.first'),
url: '',
id: 13,
parentId: 0,
icon: 'scattered/The.svg',
childs: [
{
name:t('menu.scattered.second'),
url:'/scattered',
id:14,
parentId:13,
name: t('menu.scattered.second'),
url: '/scattered',
id: 14,
parentId: 13,
},
{
name:t('menu.scattered.three'),
url:'/scattered/HotelOrder',
id:15,
parentId:13,
name: t('menu.scattered.three'),
url: '/scattered/HotelOrder',
id: 15,
parentId: 13,
}
]
})
menus.push({
name:t('menu.car.first'),
url:'',
id:4,
parentId:0,
icon:'Electric/Iron.svg',
childs:[
name: t('menu.car.first'),
url: '',
id: 4,
parentId: 0,
icon: 'Electric/Iron.svg',
childs: [
{
name:t('menu.car.second'),
url:'/comingsoon',
id:5,
parentId:4,
name: t('menu.car.second'),
url: '/vehicle/index',
id: 5,
parentId: 4,
},
{
name:t('menu.car.three'),
url:'/comingsoon',
id:6,
parentId:4,
name: t('menu.car.three'),
url: '/comingsoon',
id: 6,
parentId: 4,
}
]
}),
menus.push({
name: t('menu.ticket.first'),
url: '',
id: 7,
parentId: 0,
icon: 'Shopping/Ticket.svg',
childs: [
{
name: t('menu.ticket.second'),
url: '/ticket/list',
id: 8,
parentId: 7,
},
{
name: t('menu.ticket.three'),
url: '/ticket/order',
id: 9,
parentId: 7,
}
]
})
menus.push({
name:t('menu.ticket.first'),
url:'',
id:7,
parentId:0,
icon:'Shopping/Ticket.svg',
childs:[
name: t('menu.finance.first'),
url: '',
id: 10,
parentId: 0,
icon: 'Shopping/Money.svg',
childs: [
{
name:t('menu.ticket.second'),
url:'/ticket/list',
id:8,
parentId:7,
name: t('menu.finance.second'),
url: '/comingsoon',
id: 11,
parentId: 10,
},
{
name:t('menu.ticket.three'),
url:'/ticket/order',
id:9,
parentId:7,
}
]
})
menus.push({
name:t('menu.finance.first'),
url:'',
id:10,
parentId:0,
icon:'Shopping/Money.svg',
childs:[
{
name:t('menu.finance.second'),
url:'/comingsoon',
id:11,
parentId:10,
},
{
name:t('menu.finance.three'),
url:'/comingsoon',
id:12,
parentId:10,
name: t('menu.finance.three'),
url: '/comingsoon',
id: 12,
parentId: 10,
}
]
})
return menus
}
}
export {useMenus, type Menu}
export { useMenus, type Menu }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment