Commit 35ac083d authored by youjie's avatar youjie

no message

parent 4f000595
......@@ -2,15 +2,19 @@ import { HttpResponse } from '../@types'
import request from './request'
class CharteredBusService {
// 取消门票訂單
static async setTicketOrderCancel(OrderId:number):Promise<HttpResponse>{
return request('ticket_post_CancelTicketOrder',{OrderId})
// 包车訂單详情
static async GetTYMyCarOrderInfo(OrderId:number):Promise<HttpResponse>{
return request('CarSingle_post_GetTYMyCarOrderInfo',{OrderId})
}
// 门票訂單列表
static async getTicketOrderList(param:any):Promise<HttpResponse>{
return request('ticket_post_GetMyTicketOrderPageList',param)
// 取消包车訂單
static async CancelTYCarOrder(OrderId:number):Promise<HttpResponse>{
return request('CarSingle_post_CancelTYCarOrder',{OrderId})
}
// 提交包车訂單
// 包车訂單列表
static async GetTYMyCarOrderPageList(param:any):Promise<HttpResponse>{
return request('CarSingle_post_GetTYMyCarOrderPageList',param)
}
// 新增编辑 提交包车訂單
static async SetTYCarOrder(param:any):Promise<HttpResponse>{
return request('CarSingle_post_SetTYCarOrder',param)
}
......@@ -18,7 +22,7 @@ class CharteredBusService {
static async GetTYCarSingleProductMonthPrice(param:any):Promise<HttpResponse>{
return request('CarSingle_post_GetTYCarSingleProductMonthPrice',param)
}
// 包车详情
// 包车产品详情
static async GetTYCarSingleProductInfo(param:any):Promise<HttpResponse>{
return request('CarSingle_post_GetTYCarSingleProductInfo',param)
}
......
......@@ -84,7 +84,7 @@ export default {
data.searchClone = JSON.parse(JSON.stringify(search.msg))
const methods = {
goUrl(){
$router.push({ path:`/vehicle/addEditVehicle/2`})
$router.push({ path:`/vehicle/addEditVehicle/4`})
},
getCarType(e:any){
if(e){
......
......@@ -24,7 +24,7 @@
</div> -->
<div v-if="search.msg.ViewType == 2" class="row wrap justify-center">
<div class="q-py-md" style="width: 70%;min-width: 1000px;">
<div class="q-py-md" style="width: 100%;overflow: auto;">
<div class="row q-pa-md q-mb-md bg-white rounded-borders">
<div class="col"></div>
<q-btn dense unelevated class="hover q-px-sm q-mr-md" v-for="(item,index) in 2"
......
<template>
<div class="rounded-borders bg-white row items-center q-pa-md q-mb-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 @clear="getDateRange">
<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 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" />
<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-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.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 @clear="getDateRange">
<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-popup-proxy>
</q-field>
</div>
<div class="q-mt-md">
<q-field clearable v-model="dateRangeFormatUse" :label="$t('v102.CharteredBus.sjc.c8')" standout style="min-width: 190px" dense @clear="getDateRangeUse">
<div class="self-center full-width no-outline" tabindex="0">{{ dateRangeFormatUse }}</div>
<q-popup-proxy :offset="[0, 10]" ref="qDateProxyUse">
<q-date v-model="dateRangeUse" :options="optionsFnUse" range mask="YYYY/MM/DD" @range-end="dateRangeHandlerUse" ></q-date>
</q-popup-proxy>
</q-field>
</div>
<div class="q-mt-md row">
<q-input class="col" v-model="search.SurName" dense standout :label="$t('v102.CharteredBus.sjc.c1x')" />
<q-input class="col q-ml-sm" v-model="search.Name" dense standout :label="$t('v102.CharteredBus.sjc.c1m')" />
</div>
<q-input v-model="search.ProductName" dense standout :label="$t('v102.CharteredBus.sjc.c19')" class="q-mt-md" />
<q-input v-model="search.Mobile" dense standout :label="$t('v102.CharteredBus.sjc.c2')" class="q-mt-md"/>
</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" />
</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-tabs>
</div>
</template>
<script lang="ts">
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 svgIcon from '../../global/svg-icon.vue'
export default defineComponent({
components: { svgIcon },
setup(props) {
const qDateProxy = ref(null) as any
const qDateProxyUse = ref(null) as any
const $q = useQuasar()
const data = reactive({
status: [] as Array<StandardStatus>,
cancelStatus: {} as StandardStatus | undefined,
dateRangeFormat: '',
dateRangeFormatUse: '',
dateRange: {} as any,
dateRangeUse: {} as any,
canHide: false
})
const realSearch = inject(DirtionmaryHelper.TICKET_ORDER_SEARCH) as any
const search = reactive(JSON.parse(JSON.stringify(realSearch))) as any
const methods = {
initStatus() {
//通用的訂單類型
let allStatus = getHotelOrderStatus()
data.status = allStatus.filter((x: StandardStatus) => {
return x.StatusId != 3
})
data.cancelStatus = allStatus.find((x: StandardStatus) => {
return x.StatusId == 3
})
},
optionsFnUse(cd: any) {
return true
},
optionsFn(cd: any) {
return cd < date.formatDate(date.addToDate(new Date(), { days: 1 }), 'YYYY/MM/DD')
},
getDateRangeUse(value){
search.OrderSTime = ''
search.OrderETime = ''
data.dateRangeFormatUse = ''
},
getDateRange(value){
search.StartTime = ''
search.EndTime = ''
data.dateRangeFormat = ''
},
dateRangeHandlerUse(e: any) {
search.OrderSTime = `${e.from.year}/${e.from.month}/${e.from.day}`
search.OrderETime = `${e.to.year}/${e.to.month}/${e.to.day} `
data.dateRangeFormatUse = `${search.OrderSTime} - ${search.OrderETime} `
if (qDateProxyUse.value) qDateProxyUse.value.hide()
},
dateRangeHandler(e: any) {
search.StartTime = `${e.from.year}/${e.from.month}/${e.from.day}`
search.EndTime = `${e.to.year}/${e.to.month}/${e.to.day} `
data.dateRangeFormat = `${search.StartTime} - ${search.EndTime} `
if (qDateProxy.value) qDateProxy.value.hide()
},
setQueryHandler() {
realSearch.OrderId = search.OrderId
realSearch.OrderType = search.OrderType
realSearch.StartTime = search.StartTime
realSearch.EndTime = search.EndTime
realSearch.OrderSTime = search.OrderSTime
realSearch.OrderETime = search.OrderETime
realSearch.OrderStatus = search.OrderStatus
realSearch.OrderNo = search.OrderNo
realSearch.SurName = search.SurName
realSearch.Name = search.Name
realSearch.ProductName = search.ProductName
realSearch.Mobile = search.Mobile
console.log(realSearch)
},
setOrderStatus(statusId: number) {
realSearch.OrderStatus = statusId
}
}
const searchCnt = computed(() => {
let setCnt = 0
if ($q.platform.is.mobile) {
if (search.OrderStatus > 0) setCnt++
if (search.StartTime.length > 0) setCnt++
if (search.OrderNo > 0) setCnt++
}
if (search.OrderId.length > 0) setCnt++
if (search.OrderSTime.length > 0) setCnt++
if (search.MailingState > 0) setCnt++
if (search.Name) setCnt++
if (search.ProductName) setCnt++
if (search.Mobile) setCnt++
return setCnt
})
methods.initStatus()
return {
...toRefs(data),
...methods,
search,
searchCnt
}
}
})
</script>
<style></style>
<template>
<div>
<q-card class="light-shadow q-pa-md bg-white rounded-borders q-mb-md" flat v-for="(x,index) in orders">
<div class="row items-center desktop-only">
<div class="q-mr-md">
<q-btn :color="search.OrderType == 1 ?'cyan' : (search.OrderType == 2 ?'negative':'positive')" unelevated disable size="sm">
<template v-if="search.OrderType == 1">{{$t('v102.CharteredBus.baochetype1')}}</template>
<template v-if="search.OrderType == 2">{{$t('v102.CharteredBus.baochetype2')}}</template>
<template v-if="search.OrderType == 3">{{$t('v102.CharteredBus.baochetype3')}}</template>
</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="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>{{ $t('v102.ticket.sj') }}:{{ x.SurName }}{{ x.Name }}/{{ x.Mobile }}</span>
</div>
<div class="f12 text-grey-6">{{ $t('hotelorder.createTime') }}:{{ x.CreateTime }}</div>
<div class="q-ml-md f12" :class="[x.typeInfo.Color]">
<q-icon :name="x.typeInfo.Icon" />
<span class="q-ml-sm">{{ x.typeInfo.StatusName }}</span>
</div>
</div>
<div class="mobile-only">
<div class="row justify-between">
<div class="q-mr-md">
<q-btn :color="x.MailingState == 1 ? 'cyan' : 'negative'" unelevated disable size="sm" :label="`${x.MailingState == 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" />
<span class="q-ml-sm">{{ x.typeInfo.StatusName }}</span>
</div>
</div>
<div class="bg-grey-2 rounded-borders q-pa-sm q-mt-md">
<div class="row items-center justify-between">
<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="cyan" outline size="sm" :label="$t('hotelorder.copyed')" v-else></q-btn>
</div>
</div>
<div class="f12 text-grey-6">
<span v-if="x.MailingState">{{ $t('hotelorder.search.contactInfo') }}:{{ x.Name }}({{ x.EName }})/{{ x.ContactPhone }}</span>
</div>
<div class="f12 text-grey-6">{{ $t('hotelorder.createTime') }}:{{ x.CreateTime }}</div>
</div>
</div>
<div class="q-mt-md row">
<q-table separator="cell" :hide-bottom="!x.Remark" :pagination="{ rowsPerPage: 100 }" :rows="[x]" bordered :columns="cols" class="sticky-rightrowspan-column-table light-border col no-shadow">
<template v-slot:header>
<q-tr>
<q-th v-for="(item, i) in cols">
{{ item.label }}
</q-th>
</q-tr>
</template>
<template v-slot:body-cell-OrderDate="props">
<q-td :props="props">
<div class="max-hotelname ellipsis">
{{props.row.ProductName}}
</div>
<div class="text-grey-6 q-pt-xs">{{props.row.CreateTime
}}</div>
<q-tooltip>{{ props.row.ProductName }}</q-tooltip>
</q-td>
</template>
<template v-slot:body-cell-AirportName="props">
<q-td :props="props">
<div>{{ props.row.AirLine}}</div>
<div>
{{props.row.AirportName}}
</div>
<div class="text-grey-9 q-pt-xs">{{props.row.FlightNumber}}</div>
<div class="text-grey-6 q-pt-xs">
{{props.row.FlightTime}}
{{search.OrderType == 1?$t('v102.CharteredBus.dida'):$t('v102.CharteredBus.chufa')}}
</div>
</q-td>
</template>
<template v-slot:body-cell-HandLuggageNum="props">
<q-td :props="props">
<div v-if="props.row.HandLuggageNum>0">
<span class="text-grey-6 q-pt-xs q-pr-sm">{{ $t('v102.CharteredBus.sjc.c27') }}:</span> {{props.row.HandLuggageNum}}
</div>
<div v-if="props.row.RegisteredLuggageNum>0">
<span class="text-grey-6 q-pt-xs q-pr-sm">{{ $t('v102.CharteredBus.sjc.c28') }}:</span> {{props.row.RegisteredLuggageNum}}
</div>
</q-td>
</template>
<template v-slot:body-cell-GetonAddress="props">
<q-td :props="props">
<div v-if="props.row.GetonAddress">
<span class="text-grey-6 q-pt-xs q-pr-sm">{{ $t('v102.CharteredBus.sjc.c25') }}:</span>
{{props.row.GetonAddress}}
</div>
<div class="q-pt-xs" v-if="props.row.GetoffAddress">
<span class="text-grey-6 q-pt-xs q-pr-sm">{{ $t('v102.CharteredBus.sjc.c26') }}:</span> {{props.row.GetoffAddress}}
</div>
<div class="q-pt-xs"><span class="text-grey-6 q-pt-xs q-pr-sm fz12">{{ $t('v102.CharteredBus.sjc.c8') }}:</span>{{props.row.OrderDate}}</div>
</q-td>
</template>
<template v-slot:body-cell-Numr="props">
<q-td :props="props">
<div v-if="props.row.ManNum>0">
<span class="text-grey-6 q-pt-xs q-pr-sm">{{ $t('v102.CharteredBus.sjc.c21') }}:</span> {{props.row.ManNum}}{{ $t('v102.CharteredBus.sjc.c30') }}
</div>
<div class="q-pt-xs" v-if="props.row.ChildNum>0">
<span class="text-grey-6 q-pt-xs q-pr-sm">{{ $t('v102.CharteredBus.sjc.c22') }}:</span> {{props.row.ChildNum}}{{ $t('v102.CharteredBus.sjc.c30') }}
</div>
<div class="q-pt-xs" v-if="props.row.BabyNum>0">
<span class="text-grey-6 q-pt-xs q-pr-sm">{{ $t('v102.CharteredBus.sjc.c23') }}:</span> {{props.row.BabyNum}}{{ $t('v102.CharteredBus.sjc.c30') }}
</div>
</q-td>
</template>
<template v-slot:body-cell-Money="props">
<q-td :props="props" >
{{props.row.Money}}
</q-td>
</template>
<template v-slot:bottom>
<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" :class="{ 'bg-grey-2 q-mt-md': $q.platform.is.mobile, col: $q.platform.is.desktop }">
<!-- <div class="bg-orange-1 col-12 rounded-borders q-pa-md">
<div v-if="x.MailingState==2||x.MailingState==3">
<div class="text-subtitle2 text-dark text-weight-bolder row items-center">
<span class="col">{{ $t('v102.ticket.sjc.c5') }}:</span>
<span class="f12" :class="[x.SendType.Color]">{{ x.SendType.Name }}</span>
</div>
<div class="f12 text-dark q-mt-sm">{{ x.MailingAddress }}</div>
</div>
<div v-else>
<div class="text-subtitle2 text-dark text-weight-bolder">{{ $t('v102.ticket.zqa') }}:</div>
<div class="f12 text-dark q-mt-sm">
{{ x.SelffetchAddress?x.SelffetchAddress:$t('v102.ticket.nzqa') }}
</div>
</div>
</div> -->
</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="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">
<!-- <span class="f12">{{ $t('unit.jpc') }}</span> -->
<span class="din text-subtitle1">{{ moneyFormat(x.Money) }}</span>
<span class="f12">{{ x.CurrencyCode }}</span>
</div>
</div>
<div class="text-right">
<q-btn dense outline color="accent" size="sm" class="q-mt-sm" :label="$t('hotelorder.payinfo')" @click="ViewPayment"></q-btn>
</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 }">
<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>
</q-item-section>
</q-item>
<q-item class="text-primary" clickable v-close-popup @click="editOrder(x)">
<q-item-section>
<q-item-label>{{ $t('hotelorder.opera.edit') }}</q-item-label>
</q-item-section>
</q-item>
<q-item class="text-positive" clickable v-close-popup>
<q-item-section>
<q-item-label>{{ $t('v101.Listofquotation.baojiadan') }}</q-item-label>
</q-item-section>
</q-item>
</q-list>
<div v-else>
<div class="f12 text-green-4">{{ $t('hotelorder.payed') }}</div>
<div class="text-subtitle1 din text-green-14">
{{ x.Money.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>
</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-card>
<q-inner-loading :showing="loading" :label="$t('loading')" label-class="text-grey-6 f12" />
</div>
<div class="text-center q-mt-xl" v-if="(!orders || orders.length == 0) && !loading">
<svg-icon :size="50" color="nav" icon="General/Clipboard.svg"></svg-icon>
<div class="q-mt-md f12 text-grey-6">{{ $t('noneData') }}</div>
</div>
<q-dialog v-model="showBankAccount">
<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>
</div>
<div class="q-mt-md">
<div class="f12 text-grey-1" style="opacity: 0.3">帳戶名:</div>
<div class="pf text-grey-4 text-weight-bolder text-subtitle1">株式会社ピースインターナショナル</div>
</div>
<div class="q-mt-md">
<div class="f12 text-grey-1" style="opacity: 0.3">口座番號:</div>
<div class="pf text-grey-4 text-weight-bolder text-subtitle1">
593-1070078
<span class="f12 text-grey-1 text-weight-400" style="opacity: 0.5">(レギュラー口座)</span>
</div>
</div>
<div class="q-mt-md">
<div class="f12 text-grey-1" style="opacity: 0.3">銀行住所</div>
<div class="pf text-grey-1 text-weight-bolder f12" style="opacity: 0.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: 0.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>
</template>
<script lang="ts">
import CharteredBusService from '../../../api/CharteredBus'
import { DirtionmaryHelper } from '../../../config/dictionary'
import { defineComponent, inject, reactive, toRefs, watch } from 'vue'
import { ApiResult } from '../../../@types/enumHelper'
import message from '../../../utils/message'
import { SendType, StandardStatus } from '../../../@types'
import { useI18n } from 'vue-i18n'
import svgIcon from '../../global/svg-icon.vue'
import { copyToClipboard, useQuasar } from 'quasar'
import { getHotelOrderStatus, getSendType, moneyFormat } from '../../../utils/tools'
import { useRouter } from 'vue-router'
export default defineComponent({
components: { svgIcon },
props:['OrderType'],
setup(props) {
const $router = useRouter()
const search = inject(DirtionmaryHelper.TICKET_ORDER_SEARCH) as any
const { t } = useI18n()
const $q = useQuasar()
watch(search, (n, o) => {
if (data.loading) return
data.loading = true
data.pages.pageIndex = 1
data.orders = []
methods.initOrders()
})
watch(props, (n, o) => {
search.OrderType = props.OrderType
})
const data = reactive({
PaymentDialog: false,
orders: [] as Array<any>,
status: [] as Array<StandardStatus>,
sends: [] as Array<SendType>,
showBankAccount: false,
pages: {
pageIndex: 1,
pageSize: 10,
pageCount: 0
},
loading: false,
copyId: 0,
expendsOrderId: 0,
cols: [
{ name: 'OrderDate', label: t('v102.CharteredBus.sjc.c19')+'('+t('v102.CharteredBus.pt')+')', field: (row: any) => row, align: 'left' },
{ name: 'AirportName', label: t('v102.CharteredBus.hangban'), field: (row: any) => row, align: 'left' },
{ name: 'HandLuggageNum', label: t('v102.CharteredBus.sjc.c31'), field: (row: any) => row, align: 'left' },
{ name: 'GetonAddress', label: t('v102.CharteredBus.sjc.c24'), field: (row: any) => row, align: 'left' },
{ name: 'Numr', label: t('v102.CharteredBus.sjc.c29'), field: (row: any) => row.Num, align: 'left' },
{ name: 'Num', label: t('v102.ticket.sl'), field: (row: any) => row.Num, align: 'left' },
{ name: 'Money', label: t('hotelorder.col.m'), field: (row: any) => row.Money, align: 'left' }
] as any[],
})
const methods = {
ViewPayment() {
data.showBankAccount = true
},
initOrders() {
data.loading = true
let param = Object.assign(data.pages, search)
CharteredBusService.GetTYMyCarOrderPageList(param)
.then(r => {
data.loading = false
if (r.data.resultCode == ApiResult.SUCCESS) {
r.data.data.pageData.forEach((x: any) => {
x.typeInfo = data.status.find(y => y.StatusId == x.OrderStatus) ?? data.status[1]
x.SendType = data.sends.find(y => y.Id == x.MailingState) ?? data.sends[0]
})
data.orders = r.data.data.pageData
data.pages.pageCount = r.data.data.pageCount
} else {
message.errorMsg(r.data.message)
}
}).catch(e => {
message.errorMsg(e.message)
data.loading = false
})
},
cancelConfirmHandler(orderId: number) {
$q.dialog({
title: t('dialog.titles.horder'),
message: t('dialog.contents.horder'),
cancel: true,
persistent: true
}).onOk(() => {
methods.cancelOrderHandler(orderId)
})
},
cancelOrderHandler(orderId: number) {
if (data.loading) return
data.loading = true
CharteredBusService.CancelTYCarOrder(orderId)
.then(r => {
data.loading = false
if (r.data.resultCode == ApiResult.SUCCESS) {
methods.init()
message.successMsg(`${t('success')}`)
} else {
message.errorMsg(r.data.message)
}
}).catch(e => {
message.errorMsg(e.message)
data.loading = false
})
},
setShowWarnHander(id: number) {
data.expendsOrderId = id == data.expendsOrderId ? 0 : id
},
changePageHandler(n: any) {
data.pages.pageIndex = n
methods.initOrders()
},
init() {
data.status = getHotelOrderStatus()
data.sends = getSendType()
methods.initOrders()
},
editOrder(order:any) {
let onldOpen = `${order.OrderDate.split('-')}`
let newOpen = onldOpen.substring(0,4) + onldOpen.substring(5,7) + onldOpen.substring(8,10)
$router.push({ path:`/vehicle/Preview/${order.ProductId}/${newOpen}/${order.OrderId}`})
},
setCopyHandler(order: any, ctx?: string) {
if (ctx) {
data.copyId = -1
copyToClipboard(ctx)
} else {
data.copyId = order.OrderId
copyToClipboard(order.OrderNo)
}
setTimeout(() => {
data.copyId = 0
}, 2000)
}
}
methods.init()
// data.orders.push(
// {
// OrderType: 0,
// typeInfo: data.status[1],
// OrderIncome: 0.0,
// OrderNo: '20230106214591',
// OrderId: 89123,
// CreateTime: '2023/01/06 14:34:56',
// DetailList: [
// {
// TicketName: '大阪環球影城',
// TicketMoney: 4200.0,
// Date: '2023/09/10',
// TicketList: [
// {
// TypeName: '兒童票',
// Num: 5,
// Price: 400.0,
// Money: 2000.0
// },
// {
// TypeName: '成人票',
// Num: 2,
// Price: 800.0,
// Money: 1600.0
// },
// {
// TypeName: '學生票',
// Num: 1,
// Price: 600.0,
// Money: 600.0
// }
// ]
// }
// ],
// Remark: '迪士尼陆地乐园 客人姓名:Liu Chang+Hu Yuwei~~~~注意!!! 人数:2大 日期:1月3号 价格:大人490元/张 共收980元,全款已收!',
// Money:4200.0,
// OrderStatus:1
// },
// {
// OrderType: 1,
// typeInfo: data.status[2],
// OrderIncome: 0.0,
// OrderNo: '2023010621459800',
// OrderId: 891452,
// ContactName: '罗超',
// ContactEnName: 'LUOCHAO',
// ContactPhone: '892788812',
// Address: '318国道2913公桩左边的祝桑乡境内',
// CreateTime: '2023/01/06 14:34:56',
// DetailList: [
// {
// TicketName: '大阪環球影城',
// TicketMoney: 4200.0,
// Date: '2023/09/10',
// TicketList: [
// {
// TypeName: '兒童票',
// Num: 5,
// Price: 400.0,
// Money: 2000.0
// },
// {
// TypeName: '成人票',
// Num: 2,
// Price: 800.0,
// Money: 1600.0
// },
// {
// TypeName: '學生票',
// Num: 1,
// Price: 600.0,
// Money: 600.0
// }
// ]
// }
// ],
// Remark: '迪士尼陆地乐园 客人姓名:Liu Chang+Hu Yuwei~~~~注意!!! 人数:2大 日期:1月3号 价格:大人490元/张 共收980元,全款已收!',
// Money:4200.0,
// OrderStatus:2,
// SendType: data.sends[0]
// }
// )
return {
...toRefs(data),
...methods,
search,
moneyFormat
}
}
})
</script>
<style scoped>
.light-border table td:first-child{
border-left: 1px solid #eee
}
.light-border table tr td:last-child{
position: sticky;
right: 0;
z-index: 1;
box-shadow: rgb(0 0 0 / 5%) -2px 0px 0px;
}
.light-border table,
.light-border table td,
.light-border .q-table__middle,
.light-border.borders,
.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 {
position: relative;
}
.orderListDialog-title span {
font-size: 20px;
}
.orderListDialog-close {
position: absolute;
right: 0;
top: -10px;
font-size: 26px;
}
.orderListDialog-bg {
background: #5098ff;
border-radius: 10px;
}
.orderListDialog-img {
background: url('../../../../assets/images/wallet.png') no-repeat right #5098ff;
background-size: 97px 100%;
}
</style>
<template>
<q-card class="bg-white q-pa-md" style="max-width: 500px; min-width: 375px; ">
<div class="text-h6 q-mb-lg">
{{ $t('v102.to.m.t') }}
</div>
<div class="row items-center">
<span class="f12 text-grey-900 text-subtitle2 text-weight-bold" :class="{ 'col-2': $q.platform.is.desktop, 'col-3': $q.platform.is.mobile }">{{ $t('v102.ticket.gi') }}</span>
<span class="col f12">
<q-radio v-model="m.MailingState" checked-icon="task_alt" unchecked-icon="panorama_fish_eye" :val="1" :label="$t('v102.ticket.zq')" />
<q-radio v-model="m.MailingState" checked-icon="task_alt" unchecked-icon="panorama_fish_eye" :val="2" :label="$t('v102.ticket.yj')" />
</span>
</div>
<div v-if="m.MailingState == 1" class="bg-light-blue-1 q-pa-md fz14 rounded-borders q-mt-md">
<div class="text-weight-bold">{{ $t('v102.ticket.zqs') }}</div>
<div class="text-grey-900 q-mt-sm f12">{{ $t('v102.ticket.zqd') }}</div>
</div>
<div>
<div class="q-mt-md">
<span class="f12 text-grey-900 text-subtitle2 text-weight-bold">{{ $t('v102.ticket.sj') }}</span>
</div>
<div class="row items-center q-mt-md text-grey-600 q-mb-md" v-if="$q.platform.is.desktop">
<div class="col q-mr-md">{{ $t('v102.ticket.sjc.c1') }}</div>
<div class="col q-mr-md">{{ $t('v102.ticket.sjc.c2') }}</div>
<div class="col-2 q-mr-md">{{ $t('v102.ticket.sjc.c3') }}</div>
<div class="col q-mr-md">{{ $t('v102.ticket.sjc.c4') }}</div>
<div class="col-4" v-if="m.MailingState == 2">{{ $t('v102.ticket.sjc.c5') }}</div>
</div>
<div style="border-top: 1px dashed #eee" :class="{ 'row items-center': $q.platform.is.desktop, column: $q.platform.is.mobile }">
<q-input dense standout v-model="m.Name" class="col q-mt-md" :class="{ 'q-mr-md': $q.platform.is.desktop }" :placeholder="$t('v102.ticket.sjcp.c1')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestName"/>
<q-input dense standout v-model="m.EName" class="col q-mt-md" :class="{ 'q-mr-md': $q.platform.is.desktop }" :placeholder="$t('v102.ticket.sjcp.c2')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestEName"/>
<div class="col q-mt-md" :class="{ 'q-mr-md': $q.platform.is.desktop }">
<q-radio v-model="m.Sex" checked-icon="task_alt" unchecked-icon="panorama_fish_eye" :val="Number(1)" :label="$t('v102.ticket.sex.man')" />
<q-radio v-model="m.Sex" checked-icon="task_alt" unchecked-icon="panorama_fish_eye" :val="Number(2)" :label="$t('v102.ticket.sex.women')" />
</div>
<q-input dense standout v-model="m.Mobile" class="col q-mt-md" :class="{ 'q-mr-md': $q.platform.is.desktop }" :placeholder="$t('v102.ticket.sjcp.c4')" :rules="[ val => val && val.length == 11 || ' ']" ref="guestMobile"/>
<q-input v-if="m.MailingState == 2" dense standout v-model="m.MailingAddress" class="col-4 q-mt-md" :placeholder="$t('v102.ticket.sjcp.c5')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestAddress"/>
</div>
</div>
<div class="q-mt-md">
<q-input v-model="m.Remark" standout autogrow :label="$t('v102.ticket.or')" />
</div>
<div class="q-mt-lg text-right">
<!-- v-close-popup flat dense -->
<q-btn color="negative" class="q-px-lg" :label="$t('v102.to.m.c')" v-close-popup flat dense @click="close" />
<q-btn color="primary" class="q-ml-md q-px-lg" :label="$t('v102.to.m.s')" flat dense @click="submit"/>
</div>
</q-card>
</template>
<script lang="ts">
import { ref, defineComponent, reactive, toRefs, watch} from 'vue'
import { ApiResult } from 'src/@types/enumHelper'
import TicketService from '../../../api/ticket'
import message from '../../../utils/message'
import { useI18n } from 'vue-i18n'
export default defineComponent({
props: ['order'],
setup(props, context) {
watch(
() => props.order,
(n, o) => {
// data.m = JSON.parse(JSON.stringify(n))
}
)
const { t } = useI18n()
const guestName = ref(null) as any
const guestEName = ref(null) as any
const guestMobile = ref(null) as any
const guestAddress = ref(null) as any
const data = reactive({
m: {} as any,
loading: false
})
data.m=JSON.parse(JSON.stringify(props.order))
const methods = {
close(){
context.emit('close')
},
submit(){
if(data.loading) return
data.loading = true
let flag = false
guestName.value.validate()
guestEName.value.validate()
guestMobile.value.validate()
if(data.m.MailingState=='2'){
guestAddress.value.validate()
flag = !guestName.value.hasError && !guestEName.value.hasError && !guestMobile.value.hasError && !guestAddress.value.hasError
}else{
flag = !guestName.value.hasError && !guestEName.value.hasError && !guestMobile.value.hasError
data.m.MailingAddress = ''
}
if(!flag) return
let m = {
IsUpdateMailing: 1,
OrderId: data.m.OrderId,
CouponsId: data.m.CouponsId,
Money: data.m.Money,
UseDate: data.m.UseDate,
Birthday: data.m.Birthday,
DetailList: data.m.DetailList,
MailingState: data.m.MailingState,//邮寄状态 1自取 2邮寄
MailingAddress: data.m.MailingAddress,//MailingState =2 填写邮寄
Name: data.m.Name,
EName: data.m.EName,
Sex: data.m.Sex,//1男2女
Mobile: data.m.Mobile,
Remark: data.m.Remark,
}
let param = Object.assign(m)
TicketService.setTicketOrder(param)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
context.emit('success')
message.successMsg(`${t('success')}`)
} else {
message.errorMsg(r.data.message)
}
data.loading = false
}).catch(e => {
data.loading = false
message.errorMsg(e.message)
})
}
}
return {
...toRefs(data),
...methods,
guestName,
guestEName,
guestMobile,
guestAddress
}
}
})
</script>
<style></style>
......@@ -962,10 +962,15 @@ export default {
s29: '手配費:',
s30: '司機:',
s31: '車牌號:',
}
},
tabtitle0: '團隊訂單',
tabtitle1: '接機訂單',
tabtitle2: '送機訂單',
tabtitle3: '包車訂單',
},
CharteredBus:{
pageTitle: '車輛檢索',
pageTitle2: '包車訂單',
baochetype: '包車類型',
baochetype0: '不限',
baochetype1: '接機',
......@@ -1006,8 +1011,11 @@ export default {
nt: '沒有選擇車型',
rtt: '取消限製',
td: '团订',
bianji: '確定編輯訂單',
sjc:{
c1: '姓名',
c1x: '姓',
c1m: '名',
c2: '電話',
c3: '性別',
c4: '聯絡方式',
......@@ -1025,6 +1033,19 @@ export default {
c16: '婴儿数',
c17: '手提行李数',
c18: '托运行李数',
c19: '產品名稱',
c20: '機場',
c21: '成人',
c22: '儿童',
c23: '婴儿',
c24: '上下车地点',
c25: '上车',
c26: '下车',
c27: '手提行李',
c28: '托运行李',
c29: '人员',
c30: '人',
c31: '行李',
},
sjcp:{
c1: '請輸入姓',
......
<template>
<div class="fix-height-subpage column no-wrap q-pa-md">
<ticket-order-header></ticket-order-header>
<ticket-order-list></ticket-order-list>
<div class="q-py-md">
<CharteredBusOrderHeader></CharteredBusOrderHeader>
<CharteredBusOrderList :OrderType="OrderType"></CharteredBusOrderList>
</div>
</template>
<script lang="ts">
import { defineComponent, inject, provide, reactive, toRefs, onMounted } from 'vue'
import { defineComponent, inject, provide, reactive, toRefs, onMounted, watch } from 'vue'
import { currentRouter } from 'src/router'
import useMetaModule from '../../module/meta/metaModule'
import { useI18n } from 'vue-i18n'
import TicketOrderHeader from 'src/components/CharteredBus/order/TicketOrderHeader.vue'
import CharteredBusOrderHeader from '../../components/CharteredBus/order/CharteredBusOrderHeader.vue'
import { DirtionmaryHelper } from 'src/config/dictionary'
import TicketOrderList from 'src/components/CharteredBus/order/TicketOrderList.vue'
import CharteredBusOrderList from '../../components/CharteredBus/order/CharteredBusOrderList.vue'
export default defineComponent({
components: {TicketOrderHeader, TicketOrderList},
props:['type'],
components: {CharteredBusOrderHeader, CharteredBusOrderList},
setup(props) {
let { setTitle } = useMetaModule()
const { t } = useI18n()
const pageTitle = inject(DirtionmaryHelper.PAGE_TITLE_KEY) as any
pageTitle.value = t('v102.to.pageTitle')
setTitle(pageTitle.value)
// const pageTitle = inject(DirtionmaryHelper.PAGE_TITLE_KEY) as any
// pageTitle.value = t('v102.CharteredBus.pageTitle2')
// setTitle(pageTitle.value)
const search = reactive({
OrderType: props.type,
OrderId: '',
OrderNo: '',
SurName: '',
Name: '',
Mobile: '',
OrderStatus: 0,
StartTime: '',
EndTime: '',
OrderSTime: '',
OrderETime: '',
ProductName: '',
// TicketName:'',//景区名称
CouponsName: '',//景区名称
ContactNumber: '',//电话
Name: '',//顾客名称
UseSTime: '',//门票开始时间
UseETime: '',//门票结束时间
MailingState: -1
Mobile: '',//电话
})
search.OrderId = currentRouter.currentRoute.value.params.orderId
// search.OrderId = currentRouter.currentRoute.value.params.orderId
provide(DirtionmaryHelper.TICKET_ORDER_SEARCH, search)
const menu = inject(DirtionmaryHelper.MENU_KEYS) as any
menu.value = 9
const data = reactive({})
const data = reactive({
OrderType: ''
})
watch(props, (n, o) => {
data.OrderType = props.type
})
const methods = {}
onMounted(() => {})
return { ...toRefs(data), ...methods, search }
......
......@@ -50,7 +50,7 @@
<div :class="{'column':($q.screen.width<1200 || $q.platform.is.mobile),'row items-center':!($q.screen.width<1200 || $q.platform.is.mobile)}">
<div class="f12 text-dark" :class="{ 'col-2': $q.platform.is.desktop, 'col-3': $q.platform.is.mobile }">{{ $t('v102.CharteredBus.jc') }}:</div>
<div class="row items-center col wrap q-mt-md">
<div class="q-pa-sm rounded-borders q-mr-md cursor-pointer row items-center" :class="{ 'bg-grey-2': !x.checked, 'bg-primary text-white': x.checked }" @click="changeDetailListHandler(x,1)" v-for="x in AirportTypes">
<div class="q-pa-sm rounded-borders q-mr-md cursor-pointer row items-center" :class="{ 'bg-grey-2': !x.checked, 'bg-primary text-white': x.checked }" @click="changeDetailListHandler(x,1,msg.OrderId)" v-for="x in AirportTypes">
<span>{{ x.AirportName }}</span>
</div>
</div>
......@@ -168,12 +168,12 @@
</div>
<div class="row items-center q-mt-md text-grey-600 q-mb-md" v-if="$q.platform.is.desktop">
<div class="col q-mr-md">{{ $t('v102.CharteredBus.sjc.c5') }}</div>
<div class="col q-mr-md">{{ $t('v102.CharteredBus.sjc.c6') }}</div>
<div class="col q-mr-md" v-if="msg.OrderType!=2">{{ $t('v102.CharteredBus.sjc.c6') }}</div>
<div class="col">{{ $t('v102.CharteredBus.sjc.c8') }}</div>
</div>
<div style="border-top: 1px dashed #eee" :class="{'row items-center':$q.platform.is.desktop,'column':$q.platform.is.mobile}">
<q-input dense standout v-model="msg.GetonAddress" class="col q-mt-md col" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c5')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestGetonAddress"/>
<q-input dense standout v-model="msg.GetoffAddress" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c6')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestGetoffAddress"/>
<q-input v-if="msg.OrderType!=2" dense standout v-model="msg.GetoffAddress" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c6')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestGetoffAddress"/>
<q-field standout :model-value="msg.OrderDate" class="col text-dark cursor-pointer height" ref="guestTimeData">
<template v-slot:control>
<div class="self-center full-width no-outline" tabindex="0">
......@@ -198,15 +198,15 @@
<div class="col q-mr-md">{{ $t('v102.CharteredBus.sjc.c14') }}</div>
<div class="col q-mr-md">{{ $t('v102.CharteredBus.sjc.c15') }}</div>
<div class="col q-mr-md">{{ $t('v102.CharteredBus.sjc.c16') }}</div>
<div class="col q-mr-md">{{ $t('v102.CharteredBus.sjc.c17') }}</div>
<div class="col">{{ $t('v102.CharteredBus.sjc.c18') }}</div>
<div class="col q-mr-md" v-if="msg.OrderType!=3">{{ $t('v102.CharteredBus.sjc.c17') }}</div>
<div class="col" v-if="msg.OrderType!=3">{{ $t('v102.CharteredBus.sjc.c18') }}</div>
</div>
<div style="border-top: 1px dashed #eee" :class="{'row items-center':$q.platform.is.desktop,'column':$q.platform.is.mobile}">
<q-input dense standout v-model="msg.ManNum" mask="#" class="col q-mt-md col" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c11')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestManNum"/>
<q-input dense standout v-model="msg.ChildNum" mask="#" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c12')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestChildNum"/>
<q-input dense standout v-model="msg.BabyNum" mask="#" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c13')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestBabyNum"/>
<q-input dense standout v-model="msg.HandLuggageNum" mask="#" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c14')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestHandLuggageNum"/>
<q-input dense standout v-model="msg.RegisteredLuggageNum" mask="#" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c15')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestRegisteredLuggageNum"/>
<q-input v-if="msg.OrderType!=3" dense standout v-model="msg.HandLuggageNum" mask="#" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c14')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestHandLuggageNum"/>
<q-input v-if="msg.OrderType!=3" dense standout v-model="msg.RegisteredLuggageNum" mask="#" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c15')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestRegisteredLuggageNum"/>
</div>
</div>
......@@ -237,7 +237,7 @@
<q-input dense standout v-model="msg.SurName" class="col q-mt-md col" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c1')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestSurName"/>
<q-input dense standout v-model="msg.Name" class="col q-mt-md col" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c1m')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestName"/>
</div>
<q-input dense standout v-model="msg.Mobile" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c2')" :rules="[ val => val && val.length == 11 || ' ']" ref="guestMobile"/>
<q-input dense standout v-model="msg.Mobile" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c2')" :rules="[ val => val && val.length > 0 || ' ']" ref="guestMobile"/>
<!-- <q-input dense standout v-model="msg.ContactWay" class="col q-mt-md" :class="{'q-mr-md':$q.platform.is.desktop}" :placeholder="$t('v102.CharteredBus.sjcp.c4')" :rules="[ val => val && val.length >0 || ' ']" ref="guestContactWay"/> -->
<div class="col-2 q-mr-md">
<q-radio v-model="msg.Sex" checked-icon="task_alt" unchecked-icon="panorama_fish_eye" val="1" :label="$t('v102.ticket.sex.man')" />
......@@ -295,7 +295,7 @@
</span>
</div>
<div class="text-right">
<q-btn color="primary" unelevated class="q-px-lg" :disable="!isCheck" :label="$t('v102.ticket.sb')" @click="submit"/>
<q-btn color="primary" unelevated class="q-px-lg" :disable="!isCheck" :label="`${!msg.OrderId?$t('v102.ticket.sb'):$t('v102.CharteredBus.bianji')}`" @click="submit"/>
</div>
</div>
</div>
......@@ -362,31 +362,19 @@ export default defineComponent({
FlightTime: '',//航班时间
GetonAddress: '',//上车点
GetoffAddress: '',//下车点
ManNum: '',//成人数
ChildNum: '',//儿童数
BabyNum: '',//婴儿数
HandLuggageNum: '',//手提行李数量
RegisteredLuggageNum: '',//托运行李数量
ManNum: null,//成人数
ChildNum: null,//儿童数
BabyNum: null,//婴儿数
HandLuggageNum: null,//手提行李数量
RegisteredLuggageNum: null,//托运行李数量
ContactWay: '',//联络方式 WeChat
Mobile:'',//电话
ProductId: '',
CarId: '',//产品类型ID
MailingState: '1',//邮寄状态 1自取 2邮寄
MailingAddress: '',//MailingState =2 填写邮寄
Name:'',
EName:'',
Birthday: '',
CouponsId:'',//景点id
},
types: [],
AirportTypes: [],
PlaceTypes: [],
types: [] as any,
AirportTypes: [] as any,
PlaceTypes: [] as any,
isCheck: false,
SetOutTime: '',
detailsObj: {} as any,
......@@ -416,14 +404,73 @@ export default defineComponent({
const guestName = ref(null) as any
const guestMobile = ref(null) as any
const guestContactWay = ref(null) as any
if(currentRouter.currentRoute){
if(currentRouter.currentRoute.value.params.Time){
let time = currentRouter.currentRoute.value.params.Time
data.SetOutTime = time.substring(0,4)+'-'+time.substring(4,6)+'-'+time.substring(6,8)
}
data.msg.ProductId = currentRouter.currentRoute.value.params.ProductId
data.ProductId = data.msg.ProductId
if(currentRouter.currentRoute.value.params.orderId){
data.msg.OrderId = currentRouter.currentRoute.value.params.orderId
}
}
const menu = inject(DirtionmaryHelper.MENU_KEYS) as any
menu.value = 5
const methods = {
// 获取订单详情
getOrderInfo(){
CharteredBusService.GetTYMyCarOrderInfo(data.msg.OrderId)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
data.msg = {
OrderId: r.data.data.OrderId,
OrderType: String(r.data.data.OrderType),
OrderDate:r.data.data.OrderDate,//预定日期
Unit_Price: r.data.data.Unit_Price,//单价
Num: r.data.data.Num,//数量
Money: r.data.data.Money,
Sex: String(r.data.data.Sex),//1男2女
SurName: r.data.data.SurName,//姓
Name: r.data.data.Name,//名
Remark: r.data.data.Remark,
AirportId: r.data.data.AirportId,
AirportTerminal: r.data.data.AirportTerminal,//航厦
AirLine: r.data.data.AirLine,//航空公司名称
FlightNumber: r.data.data.FlightNumber,//航班号
FlightTime: r.data.data.FlightTime,//航班时间
GetonAddress: r.data.data.GetonAddress,//上车点
GetoffAddress: r.data.data.GetoffAddress,//下车点
ManNum: String(r.data.data.ManNum),//成人数
ChildNum: String(r.data.data.ChildNum),//儿童数
BabyNum: String(r.data.data.BabyNum),//婴儿数
HandLuggageNum: String(r.data.data.HandLuggageNum),//手提行李数量
RegisteredLuggageNum: String(r.data.data.RegisteredLuggageNum),//托运行李数量
ContactWay: r.data.data.ContactWay,//联络方式 WeChat
Mobile: r.data.data.Mobile,//电话
ProductId: r.data.data.ProductId,
CarId: r.data.data.CarId,//产品类型ID
}
data.AirportTypes.forEach(x=>{
if(x.AirportId==r.data.data.AirportId){
methods.changeDetailListHandler(x,1)
}
})
data.types.forEach(x=>{
if(x.Id==r.data.data.CarId){
methods.changeDetailListHandler(x,3)
}
})
} else {
message.errorMsg(r.data.message)
}
}).catch(e => {
message.errorMsg(e.message)
data.isCheck = false
})
},
dateRangeHandler(e: any){
data.msg.OrderDate = data.SetOutTime+' '+data.timeData
if (qTimeProxy.value) qTimeProxy.value.hide()
......@@ -493,6 +540,9 @@ export default defineComponent({
if(data.types&&data.types.length==0){
message.errorMsg(`${t('v102.ticket.nobj')}`)
}
if(data.msg.OrderId){
methods.getOrderInfo()
}
} else {
message.errorMsg(r.data.message)
}
......@@ -512,7 +562,10 @@ export default defineComponent({
}
guestGetonAddress.value.validate()
if(data.detailsObj.CarType!=2){
guestGetoffAddress.value.validate()
}
guestTimeData.value.validate()
guestManNum.value.validate()
......@@ -521,11 +574,15 @@ export default defineComponent({
guestMobile.value.validate()
if(data.detailsObj.CarType!=3){
if(!data.msg.AirportId){
message.errorMsg(`${t('v102.CharteredBus.sjc.jc')}`)
message.errorMsg(`${t('v102.CharteredBus.jc')}`)
return
}
if(data.detailsObj.CarType==1){
flag = !guestAirportTerminal.value.hasError && !guestAirLine.value.hasError && !guestFlightNumber.value.hasError && !guestFlightTime.value.hasError && !guestGetonAddress.value.hasError && !guestGetoffAddress.value.hasError && !guestTimeData.value.hasError && !guestManNum.value.hasError && !guestSurName.value.hasError && !guestName.value.hasError && !guestMobile.value.hasError
// && !guestContactWay.value.hasError
}else{
flag = !guestAirportTerminal.value.hasError && !guestAirLine.value.hasError && !guestFlightNumber.value.hasError && !guestFlightTime.value.hasError && !guestGetonAddress.value.hasError && !guestTimeData.value.hasError && !guestManNum.value.hasError && !guestSurName.value.hasError && !guestName.value.hasError && !guestMobile.value.hasError
}
}else{
flag = !guestGetonAddress.value.hasError && !guestGetoffAddress.value.hasError && !guestTimeData.value.hasError && !guestManNum.value.hasError && !guestSurName.value.hasError && !guestName.value.hasError && !guestMobile.value.hasError
......@@ -544,6 +601,10 @@ export default defineComponent({
message.errorMsg(`${data.detailsObj.CarType==1?t('v102.CharteredBus.sjc.c12'):t('v102.CharteredBus.sjc.c13')}`)
return
}
if(!data.msg.AirportId){
message.errorMsg(`${t('v102.CharteredBus.jc')}`)
return
}
}
if(!data.isCheck) return
if(data.loading) return
......@@ -559,7 +620,7 @@ export default defineComponent({
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
message.successMsg(`${t('success')}`)
$router.push({ path:'/vehicle/order' })
$router.push({ path:`/vehicle/order/${data.detailsObj.CarType}` })
} else {
message.errorMsg(r.data.message)
}
......@@ -576,8 +637,9 @@ export default defineComponent({
optionsFn(cd: any) {
return cd >= date.formatDate(date.addToDate(new Date(), { days: 1 }), 'YYYY/MM/DD')
},
changeDetailListHandler(e: any,i: Number) {
changeDetailListHandler(e: any,i: Number,OrderId: Number) {
if(i==1){
if(!OrderId){
data.AirportTypes.forEach(x=>{
x.checked = false
})
......@@ -588,6 +650,7 @@ export default defineComponent({
}
if(data.types.findIndex(x => x.checked) > -1) methods.getQuotation()
}
}
if(i==2){
data.PlaceTypes.forEach(x=>{
x.checked = false
......@@ -641,7 +704,9 @@ export default defineComponent({
})
}
}
if(data.msg.ProductId){
methods.getInfo()
}
return {
...toRefs(data),
......
......@@ -168,7 +168,7 @@ export default defineComponent({
scrollStyle: {} as any,
pages: ''
})
if(currentRouter.currentRoute.value.params.Id){
if(currentRouter.currentRoute&&currentRouter.currentRoute.value.params.Id){
data.search.Id = currentRouter.currentRoute.value.params.Id
}
......@@ -211,7 +211,6 @@ export default defineComponent({
HotelService.TypeVehicle({})
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
data.vehicletop = r.data.data
} else {
message.errorMsg(r.data.message)
......@@ -315,7 +314,7 @@ export default defineComponent({
},
// 关闭
down() {
$router.push({ path: data.pages==1?`/vehicle/order`:`/vehicle/index`})
$router.push({ path: `/vehicle/order/0`})
},
// 确定
join() {
......
<template>
<div class="q-py-md">
<!-- 表格 -->
<q-card class="light-shadow q-pa-md" flat>
<div class="add q-mb-md">
<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="bg-white rounded-borders">
<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 sticky-rightrowspan-column-table2">
<template v-slot:body-cell-Id="props">
<!--未提交报价,可以修改-->
<q-td :prop="props">
<span @click="mask(props.row.Id)" v-if="props.row.Status == 0 && props.row.OfferState == 1">
<q-btn class="col q-mr-md fz12" color="primary" unelevated
:label="$t('v102.vehicle.list.s5')" />
</span>
<span @click="cancel(props.row.Id)">
<q-btn class="col q-mr-md fz12" color="grey-6" unelevated :label="$t('v102.vehicle.add3')" />
</span>
<!--申请报价-->
<span v-if="props.row.OfferState == 1 && props.row.Status == 0"
@click="ApplyTripBus(props.row)">
<q-btn class="col q-mr-md fz12" unelevated color="primary"
:label="$t('v102.vehicle.list.s8')" />
</span>
<!--弹窗显示详细信息-->
<span @click="details(props.row.Id)" v-if="props.row.OfferState == 3">
<q-btn class="col q-mr-md fz12" color="primary" unelevated
:label="$t('v102.vehicle.list.s9')" />
</span>
<!--确认报价-->
<span v-if="props.row.OfferState == 3 && props.row.Status == 0"
@click="sureBusPrice(props.row)">
<q-btn class="col q-mr-md fz12" color="primary" unelevated
:label="$t('v102.vehicle.list.s10')" />
</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">
<q-td :prop="props">
<span @click="mask(props.row.Id)" v-if="props.row.Status == 0">
<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>
<!--申请报价-->
<span v-if="props.row.OfferState == 1 && props.row.Status == 0"
@click="ApplyTripBus(props.row)">
<q-btn class="col q-mr-md" color="primary" unelevated
:label="$t('v102.vehicle.list.s8')" />
</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="showdetails">
<vehicle-details @close="close" :Id='Id' @refresh="refresh">
</vehicle-details>
</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 useMetaModule from '../../module/meta/metaModule'
import { useI18n } from 'vue-i18n'
import { useQuasar } from 'quasar'
import { date } from 'quasar'
import vehiclePopover from '../../components/vehicle/vehiclePopover.vue'
import vehicleDetails from '../../components/vehicle/vehicleDetails.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'
import { useRouter } from 'vue-router'
export default defineComponent({
components: { vehiclePopover, vehicleDetails },
setup() {
const qDateProxy = ref(null) as any
const { t } = useI18n()
const $q = useQuasar()
const $router = useRouter()
const data = reactive({
showdetails: false,
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: 'OfferStateName', label: t('v102.vehicle.list.s6'), field: (row: any) => row.OfferStateName, align: 'left' },
{ name: 'IsSure', label: t('v102.vehicle.list.s10'), field: (row: any) => row.IsSure, 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 = {
// 详情
details(val: any) {
data.Id = val
data.showdetails = true
},
//申请报价
ApplyTripBus(item: any) {
HotelService.applyBusPricelation(item.Id)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
methods.refresh()
} else {
message.errorMsg(r.data.message)
}
})
.catch(e => {
message.errorMsg(e.message)
})
},
//确认报价
sureBusPrice(item: any) {
HotelService.sureBusPricelation(item.Id).then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
methods.refresh()
} else {
message.errorMsg(r.data.message)
}
}).catch(e => {
message.errorMsg(e.message)
})
},
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.showdetails = false
data.showPriceList = false
},
// 刷新
refresh() {
// console.log('444')
data.pages.pageIndex = 1
methods.initHotel()
data.showdetails = false
data.showPriceList = false
},
// 翻页
changePageHandler(n: any) {
console.log(n)
data.pages.pageIndex = n
methods.initHotel()
},
mask(val: any) {
data.Id = val
$router.push({ path:`/vehicle/addEditVehicle/0${data.Id?'/'+data.Id:''}`})
// 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;
}
.sticky-rightrowspan-column-table2 th:last-child,
.sticky-rightrowspan-column-table2 tbody tr td {
position: sticky !important;
right: 0 !important;
z-index: 1 !important;
box-shadow: rgba(0, 0, 0, 0.05) -2px 0px 0px !important;
}
</style>
<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 sticky-rightrowspan-column-table2">
<template v-slot:body-cell-Id="props">
<!--未提交报价,可以修改-->
<q-td :prop="props">
<span @click="mask(props.row.Id)" v-if="props.row.Status == 0 && props.row.OfferState == 1">
<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 class="col q-mr-md" color="grey-6" unelevated :label="$t('v102.vehicle.add3')" />
</span>
<!--申请报价-->
<span v-if="props.row.OfferState == 1 && props.row.Status == 0"
@click="ApplyTripBus(props.row)">
<q-btn class="col q-mr-md" unelevated color="primary"
:label="$t('v102.vehicle.list.s8')" />
</span>
<!--弹窗显示详细信息-->
<span @click="details(props.row.Id)" v-if="props.row.OfferState == 3">
<q-btn class="col q-mr-md" color="primary" unelevated
:label="$t('v102.vehicle.list.s9')" />
</span>
<!--确认报价-->
<span v-if="props.row.OfferState == 3 && props.row.Status == 0"
@click="sureBusPrice(props.row)">
<q-btn class="col q-mr-md" color="primary" unelevated
:label="$t('v102.vehicle.list.s10')" />
</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">
<q-td :prop="props">
<span @click="mask(props.row.Id)" v-if="props.row.Status == 0">
<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>
<!--申请报价-->
<span v-if="props.row.OfferState == 1 && props.row.Status == 0"
@click="ApplyTripBus(props.row)">
<q-btn class="col q-mr-md" color="primary" unelevated
:label="$t('v102.vehicle.list.s8')" />
</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="showdetails">
<vehicle-details @close="close" :Id='Id' @refresh="refresh">
</vehicle-details>
</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>
<q-tabs
v-model="tab"
dense
align="left"
class="bg-primary text-white shadow-2 rounded-borders"
:breakpoint="0">
<q-tab :name="0" :label="$t('v102.vehicle.tabtitle0')"></q-tab>
<q-tab :name="1" :label="$t('v102.vehicle.tabtitle1')"></q-tab>
<q-tab :name="2" :label="$t('v102.vehicle.tabtitle2')"></q-tab>
<q-tab :name="3" :label="$t('v102.vehicle.tabtitle3')"></q-tab>
</q-tabs>
<teamOrder v-if="tab==0"></teamOrder>
<CharteredBusOrder :type="tab" v-if="tab!=0"></CharteredBusOrder>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, reactive, toRefs, provide, onMounted, inject, watch, onBeforeUnmount, computed } from 'vue'
import { defineComponent, ref, reactive, toRefs, provide, onMounted, inject } from 'vue'
import useMetaModule from '../../module/meta/metaModule'
import { useI18n } from 'vue-i18n'
import { useQuasar } from 'quasar'
import { date } from 'quasar'
import vehiclePopover from '../../components/vehicle/vehiclePopover.vue'
import vehicleDetails from '../../components/vehicle/vehicleDetails.vue'//详情
import teamOrder from './teamOrder.vue'
import CharteredBusOrder from '../CharteredBus//CharteredBusOrder.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'
import { useRouter } from 'vue-router'
import { currentRouter } from 'src/router'
export default defineComponent({
components: { vehiclePopover, vehicleDetails },
components: { teamOrder,CharteredBusOrder },
setup() {
const qDateProxy = ref(null) as any
const { t } = useI18n()
const $q = useQuasar()
const $router = useRouter()
let { setTitle } = useMetaModule()
const pageTitle = inject(DirtionmaryHelper.PAGE_TITLE_KEY) as any
pageTitle.value = t('v102.vehicle.pageTitle')
setTitle(pageTitle.value)
const data = reactive({
showdetails: false,
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: 'OfferStateName', label: t('v102.vehicle.list.s6'), field: (row: any) => row.OfferStateName, align: 'left' },
{ name: 'IsSure', label: t('v102.vehicle.list.s10'), field: (row: any) => row.IsSure, align: 'left' },
{ name: 'Id', label: t('hotel.addRoomBtn'), field: (row: any) => row.Id, align: 'left' },
] as any,
tab: 0,
})
// 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 = {
// 详情
details(val: any) {
data.Id = val
data.showdetails = true
},
//申请报价
ApplyTripBus(item: any) {
HotelService.applyBusPricelation(item.Id)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
methods.refresh()
} else {
message.errorMsg(r.data.message)
}
})
.catch(e => {
message.errorMsg(e.message)
})
},
//确认报价
sureBusPrice(item: any) {
HotelService.sureBusPricelation(item.Id).then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
methods.refresh()
} else {
message.errorMsg(r.data.message)
}
}).catch(e => {
message.errorMsg(e.message)
})
},
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.showdetails = false
data.showPriceList = false
},
// 刷新
refresh() {
// console.log('444')
data.pages.pageIndex = 1
methods.initHotel()
data.showdetails = false
data.showPriceList = false
},
// 翻页
changePageHandler(n: any) {
console.log(n)
data.pages.pageIndex = n
methods.initHotel()
},
mask(val: any) {
data.Id = val
$router.push({ path:`/vehicle/addEditVehicle/1${data.Id?'/'+data.Id:''}`})
// data.showPriceList = true
if(currentRouter.currentRoute&&currentRouter.currentRoute.value.params.pages){
data.tab = currentRouter.currentRoute.value.params.pages
}
const menu = inject(DirtionmaryHelper.MENU_KEYS) as any
menu.value = 6
const methods = {
}
onMounted(() => {
methods.initHotel()
})
return { ...toRefs(data), ...methods, qDateProxy }
return { ...toRefs(data), ...methods }
},
})
</script>
......
......@@ -21,8 +21,8 @@ const routes: RouteRecordRaw[] = [
{ 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/CharteredBus/CharteredBusList.vue') },//车辆
{ path: '/vehicle/Preview/:ProductId/:Time', component: () => import('pages/CharteredBus/CharteredBusPreview.vue') },
{ path: '/vehicle/order', component: () => import('pages/vehicle/vehicleOrder.vue') },
{ path: '/vehicle/Preview/:ProductId/:Time/:orderId?', component: () => import('pages/CharteredBus/CharteredBusPreview.vue') },
{ path: '/vehicle/order/:pages?', component: () => import('pages/vehicle/vehicleOrder.vue') },
{ path: '/vehicle/addEditVehicle/:pages/:Id?', component: () => import('pages/vehicle/addEditVehicle.vue') },
{ path: '/ticket/preview/:ticketId/:Time', component: () => import('pages/ticket/TicketOrderPreview.vue') },
{ path: '/ticket/order/:orderId?', component: () => import('pages/ticket/TicketOrder.vue') }
......
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