Commit de057a4c authored by 罗超's avatar 罗超

Merge branch 'master' of http://gitlab.oytour.com/luochao/bigwood

parents d8fd06e6 968812b3
This diff is collapsed.
......@@ -64,13 +64,13 @@ module.exports = configure(function (ctx) {
publicPath: ctx.dev ? '/' : './',
env: ctx.dev
? {
BASE_APP_API: 'http://192.168.10.11:8083/api/common/post',
BASE_APP_API: 'http://192.168.10.226:8015/api/common/post',//http://192.168.10.226:8015/api/common/post http://192.168.10.206:8015/api/common/post
JAVA_URL_API: 'http://efficient.oytour.com',
VERSION:require('./package.json').version,
}
: {
BASE_APP_API: 'https://reborn.oytour.com/api/common/post',
BASE_APP_API: 'https://reborn.oytour.com/api/common/post',//https://reborn.oytour.com/api/common/post
JAVA_URL_API: 'http://efficient.oytour.com',
VERSION:require('./package.json').version
},
......
import { Data } from './../../node_modules/_vite@2.9.15@vite/dist/node/index.d';
import Axios, { AxiosResponse, AxiosRequestConfig, AxiosError } from 'axios'
import message from '../utils/message'
......
import { Data } from './../../node_modules/_vite@2.9.15@vite/dist/node/index.d';
import Axios, { AxiosResponse, AxiosRequestConfig, AxiosError } from 'axios'
import message from '../utils/message'
import { i18n } from '../boot/i18n'
import router from '../router'
// import { message } from 'ant-design-vue'
// import Store from '../store'
// import { Notify } from 'quasar'
import * as OpenCC from 'opencc-js'
import { ApiResult } from 'src/@types/enumHelper';
import { dispatchAction } from 'src/store/utils';
import { UserActionsType } from 'src/store/modules/user/actions';
import { currentRouter } from 'src/router'
let {locale,t} =i18n.global
let converterTW = OpenCC.Converter({ from: 'cn', to: 'tw' }) //转繁
let datas: AxiosResponse // 接收需要转繁数据
......@@ -76,8 +69,8 @@ const service = Axios.create({
baseURL: process.env.JAVA_URL_API,
timeout: 20000,
headers: {
'Content-Type': 'application/json',
'Referer-Viitto': currentRouter.path
'User-Type': 'bus',
'Content-Type': 'application/json;charset=UTF-8'
}
})
......
......@@ -36,7 +36,7 @@ const request = (cmd:string,msg:any,isTrans:boolean=true): Promise<HttpResponse>
let timestamp = (new Date()).valueOf();
if (Store.state && Store.state.user?.token) {
token = Store.state.user?.token?.access_token
key = Store.state.user?.secretKey
key = Store.state.user?.userDetail?.secretKey
}
if (Store.state && Store.state.user?.userDetail) {
groupId = Store.state.user?.userDetail?.groupId
......
......@@ -33,22 +33,19 @@ const request = (cmd:string,msg:any): Promise<HttpResponse>=>{
let timestamp = (new Date()).valueOf();
if (Store.state.user?.token) {
token = Store.state.user?.token?.access_token
key = Store.state.user?.secretKey
key = Store.state.user?.userDetail?.secretKey
}
if (Store.state.user?.userDetail) {
groupId = Store.state.user?.userDetail?.groupId
}
var encodeMsg = encodeURIComponent(JSON.stringify(msg)).toLowerCase();
var md5Str = md5(`cmd=${cmd}&msg=${encodeMsg}&timestamp=${timestamp}&token=${token}&key=${key}`);
var md5Str = md5(`msg=${encodeMsg}&timestamp=${timestamp}&token=${token}&key=${key}`);
var postData = {
"groupId": groupId,
"msg": msg,
// "cmd": cmd,
// "timestamp": timestamp,
"timestamp": timestamp,
"token": token,
"sign": md5Str,
// "locale": language,
// "currencyCode": currencyCode
}
return service.post(process.env.JAVA_URL_API+cmd, postData)
}
......
import { HttpResponse } from '../@types'
import request from './request'
import requestJava from './requestJava'
class scheduledTripService {
// 跟团订单列表
static async Getrecentorder(param:any):Promise<HttpResponse>{
return requestJava('/api/b2b/user/getrecentorder',param)
}
// 待处理跟团订单列表
static async GetWaitDealOrderPageList(param:any):Promise<HttpResponse>{
return request('b2b_get_GetWaitDealOrderPageList',param)
}
// 跟团订单提交
static async SetOrderInfoForB2B(param:any):Promise<HttpResponse>{
return request('sellorder_post_SetOrderInfoForB2B',param)
}
// 获取销售信息
static async GetB2BSellByCustomerId(param:any):Promise<HttpResponse>{
return request('app_customer_GetB2BSellByCustomerId',param)
}
// 获取客户信息
static async GetCustomerSummary(param:any):Promise<HttpResponse>{
return request('b2b_get_GetCustomerSummary',param)
}
// 行程详情
static async GetB2BTravelInfoV1(param:any):Promise<HttpResponse>{
return request('b2b_get_GetB2BTravelInfoV1',param)
}
// 获取线路
static async GetB2BGroupSearchItem(param:any):Promise<HttpResponse>{
return request('b2b_get_GetGroupSearchItem',param)
}
// 获取出发城市
static async GetB2BSite(param:any):Promise<HttpResponse>{
return request('b2b_get_site',param)
}
// 获取分页数据
static async GetB2BTravelPageList(param:any):Promise<HttpResponse>{
return request('b2b_get_GetB2BTravelPageList',param)
......
import { HttpResponse } from '../@types'
import request from './request'
class travelService {
static async getTravelList(params:any):Promise<HttpResponse>{
return request('travelteam_GetTravelTeamPartnerPage',params)
}
static async addOrder(params:any):Promise<HttpResponse>{
return request('travelteam_GetTravelTeamPartnerPage',params)
}
static async newOrder(params:any):Promise<HttpResponse>{
return request('sellorder_post_SetTravelTeamOrderForB2B',params)
}
}
export default travelService
<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-select v-if="$q.platform.is.desktop" class="q-mr-md" style="min-width: 150px" 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>
......
......@@ -11,9 +11,11 @@
@range-end="dateRangeHandler"></q-date>
</q-popup-proxy>
</q-field>
<n-select v-if="$q.platform.is.desktop" filterable @update:value="changeHotel" class="q-ml-lg col-2"
<!-- <n-select v-if="$q.platform.is.desktop" filterable @update:value="changeHotel" class="q-ml-lg col-2"
style="min-width: 190px" clearable v-model:value="search.HotelChooseArray" :placeholder="$t('hotel.searchName')"
multiple :options="cacheHotels" max-tag-count="responsive" size="large" value-field="ID" label-field="Name" />
multiple :options="cacheHotels" max-tag-count="responsive" size="large" value-field="ID" label-field="Name" /> -->
<q-input v-if="$q.platform.is.desktop" class="q-ml-lg col-2" style="min-width: 190px" v-model="search.HotelName" reverse-fill-mask dense type="text"
standout :label="$t('hotel.searchName')" />
<div class="col"></div>
<q-btn unelevated class="bg-grey-3 hover q-mr-md" icon="shopping_cart" :title="$t('hotel.car.shoppingTitle')"
@click="rightCarOpen = true">
......@@ -43,9 +45,11 @@
</q-field>
</div>
<div v-if="$q.platform.is.mobile">
<n-select filterable style="min-width: 190px" clearable v-model:value="search.HotelChooseArray"
<!-- <n-select filterable style="min-width: 190px" clearable v-model:value="search.HotelChooseArray"
:placeholder="$t('hotel.searchName')" multiple :options="cacheHotels" max-tag-count="responsive"
size="large" value-field="ID" label-field="Name" />
size="large" value-field="ID" label-field="Name" /> -->
<q-input v-model="search.HotelName" reverse-fill-mask dense type="text"
standout :label="$t('hotel.searchName')" />
</div>
<div class="q-my-md">
<q-select v-model="search.Star" dense :options="hotelsRates" emit-value option-label="name"
......@@ -218,6 +222,7 @@ export default defineComponent({
if (search.Province > 0) setCnt++
if (search.StartDate.length > 0) setCnt++
if (search.HotelChooseArray.length > 0) setCnt++
if (search.HotelName) setCnt++
}
if (search.Star != 0) setCnt++
if (search.MaxPrice.length > 0) setCnt++
......@@ -225,7 +230,7 @@ export default defineComponent({
return setCnt
})
methods.initAddress()
methods.initHotels()
// methods.initHotels() //检索酒店名称下拉
watch(cars.value, (n, o) => {
localStorage.setItem(DirtionmaryHelper.HOTEL_HOTELCARS_CACHE, JSON.stringify(cars.value))
})
......
<template>
<div>
<q-card class="light-shadow q-pa-md bg-white rounded-borders q-mb-md" flat v-for="x in orders">
<q-card class="light-shadow q-pa-md bg-white rounded-borders q-mb-md" flat v-for="(x,index) in orders" :key="index">
<div class="row items-center desktop-only">
<div class="q-mr-md">
<q-btn :color="x.OrderType == 1 ? 'cyan' : 'negative'" unelevated disable size="sm"
......@@ -53,9 +53,9 @@
<div class="f12 text-grey-6">{{ $t('hotelorder.createTime') }}{{ x.CreateTime }}</div>
</div>
</div>
<div class="reactive">
<div class="q-mt-md row">
<q-table separator="cell" :hide-bottom="!x.Remark" :pagination="{ rowsPerPage: 100 }" dense :rows="x.DetailList"
<q-table separator="cell" :hide-bottom="!x.Remark||!x.isMore" :pagination="{ rowsPerPage: 100 }" dense :rows="x.NewDetailList"
bordered :columns="cols" class="sticky-rightrowspan-column-table light-border col no-shadow">
<template v-slot:header-cell-Room="props">
<q-th :props="props">
......@@ -105,11 +105,17 @@
<q-tooltip>{{ props.value }}</q-tooltip>
</q-td>
</template>
<template v-slot:bottom>
<div class="msl text-negative">{{ $t('v101.hotelRemark') }}{{ x.Remark }}</div>
<template v-slot:bottom="props">
<div v-if="x.Remark" class="msl text-negative">{{ $t('v101.hotelRemark') }}{{ x.Remark }}</div>
<more v-if="x.isMore" @change="ViewMore(x,index)" :upIcon="x.upIcon"></more>
</template>
</q-table>
</div>
</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"
......@@ -240,33 +246,6 @@
<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="PaymentDialog">
<div class="rounded-borders bg-white q-pb-lg q-pt-lg" style="width: 450px">
<div class="orderListDialog-title row justify-center q-pb-xs">
<span class="text-weight-bold">{{ $t('hotelorder.dialog.title') }}</span>
<q-icon class="orderListDialog-close text-grey" name="close" @click="PaymentDialog = false"></q-icon>
</div>
<div class="orderListDialog-bg column rounded-borders q-ma-lg q-py-lg q-px-lg">
<div class="orderListDialog-img">
<div class="row items-end q-pb-md">
<span class="text-grey-3">{{ $t('hotelorder.dialog.AccountName') }}:</span>
<span class="text-weight-bold text-white" style="font-size: 18px">株式会社ピースインターナショナル</span>
</div>
<div class="q-pb-sm" :class="{'row items-center justify-between':$q.platform.is.desktop}">
<div :class="{'q-mb-sm':$q.platform.is.mobile,'col':$q.platform.is.desktop}" >
<span class="text-grey-3">{{ $t('hotelorder.dialog.account') }}:</span>
<span class="text-cyan-12 text-weight-bold din" style="font-size: 18px">593-1070078</span>
</div >
<q-btn :class="{'q-ml-xl':$q.platform.is.mobile}" unelevated size="xs" class="bg-blue-11 text-white" v-if="copyId != -1" :label="$t('hotelorder.dialog.copy')" @click="setCopyHandler(null,'開戶名:張三,帳戶:7489 3272 7942 311')"></q-btn>
<q-btn :class="{'q-ml-xl':$q.platform.is.mobile}" icon="check" unelevated size="xs" class="bg-blue-11 text-white" :label="$t('hotelorder.copyed')" v-else></q-btn>
</div>
</div>
</div>
<div class="row justify-center q-pb-lg">
<span class="text-center f12 text-grey-6 q-px-lg">{{ $t('hotelorder.dialog.prompt') }}</span>
</div>
</div>
</q-dialog> -->
<q-dialog v-model="showBankAccount">
<BankAccount @change="showBankAccount=false"></BankAccount>
</q-dialog>
......@@ -287,9 +266,10 @@ import { currentRouter } from '../../../../router'
import { UploadFileInfo, NTag, NUpload } from 'naive-ui'
import { slice } from 'lodash'
import BankAccount from '../../../BankAccount.vue'
import more from '../../../more.vue'
export default defineComponent({
components: { svgIcon, NTag, NUpload, BankAccount },
components: { svgIcon, NTag, NUpload, BankAccount, more },
setup(props) {
const search = inject(DirtionmaryHelper.HOTEL_ORDER_SEARCH) as any
const { t } = useI18n()
......@@ -333,6 +313,20 @@ export default defineComponent({
})
const methods = {
ViewMore(x:any,index:Number){
x.upIcon = !x.upIcon
if(x.upIcon){
x.NewDetailList = JSON.parse(JSON.stringify(x.DetailList))
}else{
x.NewDetailList = []
x.DetailList.forEach((y:any,index:Number)=>{
if(index<2){
x.NewDetailList.push(y)
}
})
}
},
goUrl(id: number) {
currentRouter.push('/hotel/offer/' + id)
},
......@@ -345,9 +339,22 @@ export default defineComponent({
HotelService.GetHotelOrders(param)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
let arrList = function(arr: Array<any>){
arr.forEach(item => {
item.isMore = false
item.upIcon = false
item.NewDetailList = []
});
}
arrList(r.data.data.pageData)
r.data.data.pageData.forEach((x: any) => {
x.typeInfo = data.status.find(y => y.StatusId == x.OrderStatus) ?? data.status[1]
x.DetailList.forEach((y: any) => {
if(x.DetailList.length>2){
x.isMore = true
}
let dataLists = []
x.DetailList.forEach((y: any,index: Number) => {
let PeopleNum = 0
y.RoomList.forEach((z: any) => {
z.RoomInfo = data.rooms.find(r => r.TypeId == z.RoomType) ?? data.rooms[0]
......@@ -355,7 +362,11 @@ export default defineComponent({
})
console.log(PeopleNum)
y.PeopleNum = PeopleNum
if(index<2){
dataLists.push(y)
}
})
x.NewDetailList = JSON.parse(JSON.stringify(dataLists))
})
data.orders = r.data.data.pageData
data.pages.pageCount = r.data.data.pageCount
......@@ -387,9 +398,12 @@ export default defineComponent({
if (r.data.resultCode == ApiResult.SUCCESS) {
data.pages.pageIndex = 1
this.initOrders()
message.successMsg(`${t('success')}`)
}else{
message.errorMsg(r.data.message)
}
data.loading = false
message.errorMsg(r.data.message)
})
.catch(e => {
message.errorMsg(e.message)
......
<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"
<q-select v-if="$q.platform.is.desktop" class="q-mr-md" style="min-width: 150px" 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
......@@ -131,7 +131,7 @@ export default defineComponent({
if (search.StartTime.length > 0) setCnt++
if (search.OrderNo > 0) setCnt++
}
if (search.OrderId) setCnt++
if (search.OrderId>0) setCnt++
if (search.RoomType > 0) setCnt++
if (search.OrderType > 0) setCnt++
if (search.OrderType == 1 && search.ContactName.length > 0) setCnt++
......
<template>
<div class="absolute q-pb-sm text-center row justify-center" style="width: 100%; bottom: 0;"
:style="{'background-image':upIcon?'linear-gradient(-180deg,rgba(255,255,255,0) 70%,#fff 70%)':'linear-gradient(-180deg,rgba(255,255,255,0) 0%,#fff 70%)','height':upIcon?'25px':'25px'}">
<span class="text-red-8 cursor-pointer" style="width: 100px;" @click="viewMore">
<span class="row items-center" v-if="!upIcon">{{$t('expends.on')}}<span class="q-ml-sm q-mt-xs"></span></span>
<span class="row items-center" v-else>{{$t('expends.off')}}<span class="q-ml-sm q-pb-xs">︿</span></span>
</span>
</div>
</template>
<script lang="ts">
import { defineComponent, reactive,toRefs, PropType, computed, ref, toRef, Ref,watch } from 'vue'
import { copyToClipboard, useQuasar } from 'quasar'
import { useI18n } from 'vue-i18n'
export default defineComponent({
name: '',
props: ['upIcon'],
setup(props,context) {
const { t } = useI18n()
const data = reactive({
upIcon: false
})
watch(()=>props.upIcon,(n,o)=>{
data.upIcon = n
},{immediate:true})
const methods = {
viewMore() {
context.emit('change')
},
}
return {
...toRefs(data),
...methods, }
}
})
</script>
<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.B2BSelectOrderState" @update:model-value="setOrderStatus" dense :options="status" emit-value option-label="StatusName" option-value="StatusId" map-options :label="$t('hotelorder.search.status')" standout />
<q-select v-if="$q.platform.is.desktop" class="q-mr-md" style="min-width: 150px" v-model="search.B2BSelectOrderState" @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 class="q-mr-md" v-model="search.HotelName" dense standout :label="$t('v101.scatteredOrderList.first')"/>
<div class="col"></div>
<!-- <q-btn v-if="$q.platform.is.mobile" unelevated class="bg-grey-3 hover q-mr-md" :title="$t('morequery')">
......
<template>
<div class="rounded-borders bg-white" :class="{'q-col-gutter-sm':$q.platform.is.desktop}">
<div class="row items-center q-pa-md" :class="{'q-col-gutter-sm':$q.platform.is.desktop}">
<div class="text-subtitle2 q-mr-md">
<div class="row items-center no-wrap justify-between q-pa-md" :class="{'q-col-gutter-sm':$q.platform.is.desktop}">
<div class="col row items-center no-wrap">
<div class="q-mr-md" style="flex-shrink: 0;">
<div class="text-subtitle2">
<span class="text-weight-bold text-primary q-mr-sm">{{
TotalCount
}}</span>
<span>{{$t('v103.scheduledTrip.experiencetrip')}}</span>
</div>
</div>
<div class="col row wrap" v-if="$q.platform.is.desktop">
<template v-for="(x, i) in chosenAddress">
<!-- <q-chip
v-if="i==0"
size="13px"
:key="i"
outline
color="grey"
:label="x.Name"
/> -->
<q-chip
v-for="(x, i) in chosenAddress"
v-if="i!=0"
size="13px"
:key="i"
removable
......@@ -17,6 +31,12 @@
:label="x.Name"
@remove="removeChosen(x,i)"
/>
</template>
</div>
</div>
<div class="q-ml-md" v-if="$q.platform.is.desktop">
<q-btn style="width: 60px;" color="primary" unelevated size="sm" :label="$t('query')" @click="setSearchHandler"/>
</div>
</div>
<div
class="row items-center"
......@@ -24,9 +44,25 @@
style="border-top: 1px solid #eee"
>
<span class="f12" v-if="$q.platform.is.desktop">{{$t('v103.scheduledTrip.sort')}}:</span>
<q-chip
<span class="row items-center cursor-pointer rounded-borders q-px-sm q-py-xs q-mr-sm"
:class="{
'bg-grey-3': orderindex != x.value,
'bg-primary': orderindex == x.value,
'text-dark':orderindex != x.value,'text-white':orderindex == x.value
}"
v-for="(x, i) in sortArray"
:key="i"
@click="chosenSortHandler(x.value)">
<q-icon class="q-mr-sm" v-if="i==0" :class="x.icon" size="xs" v-close-popup/>
<span>{{x.label}}</span>
<q-icon v-if="i!=0"
:name="ordertype && orderindex == x.value ? 'keyboard_arrow_up' : 'keyboard_arrow_down'" class="q-ml-sm"
size="20px"
/>
</span>
<!-- <q-chip
square
:icon="x.icon"
class="cursor-pointer"
clickable
:text-color="sortNum != x.value ? 'dark' : 'white'"
......@@ -37,8 +73,9 @@
v-for="(x, i) in sortArray"
:key="i"
@click="chosenSortHandler(x)"
>{{ x.label }}</q-chip
>
{{ x.label }}
</q-chip> -->
</div>
</div>
<div class="q-mt-lg">
......@@ -110,7 +147,7 @@
>{{ x.dayNum }} {{$t('v103.scheduledTrip.day')}}</span
>
</div>
<div class="text-h6 product-price">CNY:{{ x.b2CPrice }}</div>
<div class="text-h6 product-price">CNY:{{ x.b2BPrice }}</div>
</div>
</div>
</div>
......@@ -162,10 +199,8 @@
const qNameProxy = ref(null) as any
const { locale, t } = useI18n()
const data = reactive({
searchAdd: {
name: "",
value: 0,
},
ordertype: 0,
orderindex:0,
areaList: [],
chosenAddress: [],
goodsType: [],
......@@ -178,21 +213,46 @@
dataList: [],
sortNum: 1,
sortArray: [
// {
// label: t('v103.scheduledTrip.recommend'),
// value: 1,
// icon: "iconfont icongood",
// },
// {
// label: t('v103.scheduledTrip.ascendingorder'),
// value: 2,
// icon: "iconfont iconmeiyuan",
// },
// {
// label: t('v103.scheduledTrip.descendingorder'),
// value: 3,
// icon: "iconfont iconmeiyuan",
// },
{
label: t('v103.scheduledTrip.recommend'),
value: 1,
value: 0,
icon: "iconfont icongood",
},
{
label: t('v103.scheduledTrip.ascendingorder'),
label: '团期',
value: 1,
icon: "iconfont iconon",
},
{
label: '价格',
value: 2,
icon: "iconfont iconmeiyuan",
},
{
label: t('v103.scheduledTrip.descendingorder'),
label: '销量',
value: 3,
icon: "iconfont iconmeiyuan",
icon: "iconfont icongood",
},
// {
// label: '评论数',
// value: 4,
// icon: "iconfont icongood",
// },
],
TotalCount: 0,
PageCount: 0,
......@@ -203,28 +263,68 @@
data.dateRange = { from: data.msg.startDate, to: data.msg.endDate };
watch(data.msg, (n, o) => {
data.msg.pageIndex = 1
methods.goSearchHandler()
methods.setSearchHandler()
},{deep: true})
watch(search, (n, o) => {
data.chosenAddress = JSON.parse(JSON.stringify(n.chosenAddress))
data.qMsg = JSON.parse(JSON.stringify(n.msg))
data.msg = JSON.parse(JSON.stringify(n.msg))
// methods.goSearchHandler();
if(n.RetrievalState) methods.setSearchHandler()
},{deep:true})
const methods = {
changeOrderType(i){
if(data.orderindex==i){
data.ordertype=this.ordertype==0?1:0
}else{
data.orderindex=i
data.ordertype=0
}
search.msg.orderByDate = data.orderindex==1?(data.ordertype==0?2:1):0
search.msg.orderByPrice = data.orderindex==2?(data.ordertype==0?2:1):0
search.msg.orderBySales = data.orderindex==3?(data.ordertype==0?2:1):0
// this.loadTeamDataInit()
},
// 删除目的地
removeChosen(x,i) {
search.deleteChosen = JSON.parse(JSON.stringify(x))
data.chosenAddress.splice(i,1)
search.chosenAddress = JSON.parse(JSON.stringify(data.chosenAddress))
if(x.type==1){
search.msg.lineId=0
search.msg.lineTeamId=0
}else if(x.type==2){
search.msg.lineTeamId=0
}else if(x.type==3){
search.msg.startCityId=0
}else if(x.type==4){
search.DayId = 0
search.msg.minTripDay = ""
search.msg.maxTripDay = ""
}else if(x.type==5){
search.datesId = 0
search.msg.startDate = ""
}else if(x.type==6){
search.msg.startDate = ""
search.msg.endDate = ""
}
},
// 排序方式
chosenSortHandler(x) {
data.sortNum = x.value;
data.msg.orderByDate = data.sortNum == 4 ? 1 : data.sortNum == 5 ? 2 : 0;
data.msg.orderByPrice = data.sortNum == 2 ? 1 : data.sortNum == 3 ? 2 : 0;
data.msg.orderByDay = data.sortNum == 6 ? 1 : data.sortNum == 7 ? 2 : 0;
chosenSortHandler(i) {
console.log(i,'----')
if(data.orderindex==i){
data.ordertype=data.ordertype==0?1:0
}else{
data.orderindex=i
data.ordertype=0
}
search.msg.orderByDate = data.orderindex==1?(data.ordertype==0?2:1):0
search.msg.orderByPrice = data.orderindex==2?(data.ordertype==0?2:1):0
search.msg.orderBySales = data.orderindex==3?(data.ordertype==0?2:1):0
methods.setSearchHandler()
// data.sortNum = x.value;
// data.msg.orderByDate = data.sortNum == 4 ? 1 : data.sortNum == 5 ? 2 : 0;
// data.msg.orderByPrice = data.sortNum == 2 ? 1 : data.sortNum == 3 ? 2 : 0;
// data.msg.orderByDay = data.sortNum == 6 ? 1 : data.sortNum == 7 ? 2 : 0;
},
goSearchHandler() {
$q.loading.show();
......@@ -259,6 +359,7 @@
$q.loading.hide();
if (r.data.resultCode == ApiResult.SUCCESS) {
if (r.data.data) {
data.msg.pageIndex = 1
data.PageCount = r.data.data.pageCount;
data.TotalCount = r.data.data.count;
var tempArray = r.data.data.pageData;
......@@ -286,6 +387,11 @@
message.errorMsg(e.message)
})
},
setSearchHandler(){
data.msg.pageIndex = 1
methods.goSearchHandler()
search.RetrievalState=false
},
GotoDetails(item) {
$router.push({
path:`/scheduledTrip/details/${encodeURIComponent(item.id)}/${item.tcid}`
......
This diff is collapsed.
......@@ -113,6 +113,7 @@ export default defineComponent({
const methods = {
getTickets() {
$q.loading.show();
let param = Object.assign(data.pages, search.msg)
TicketService.getTicketList(param)
.then(r => {
......@@ -122,7 +123,9 @@ export default defineComponent({
} else {
message.errorMsg(r.data.message)
}
$q.loading.hide();
}).catch(e => {
$q.loading.hide();
message.errorMsg(e.message)
data.loading = false
})
......
<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-select v-if="$q.platform.is.desktop" class="q-mr-md" style="min-width: 150px" 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>
......@@ -159,7 +159,7 @@ export default defineComponent({
if (search.StartTime.length > 0) setCnt++
if (search.OrderNo > 0) setCnt++
}
if (search.OrderId) setCnt++
if (search.OrderId>0) setCnt++
if (search.UseSTime.length > 0) setCnt++
if (search.MailingState > 0) setCnt++
if (search.Name) setCnt++
......
......@@ -3,7 +3,7 @@
<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.MailingState == 1 ? 'cyan' : 'negative'" unelevated disable size="sm" :label="`${x.MailingState == 1 ? $t('v102.ticket.zq') : $t('v102.ticket.yj')}`"></q-btn>
<q-btn :color="x.MailingState == 1 ? 'cyan' : x.MailingState == 2?'negative':'positive'" unelevated disable size="sm" :label="`${x.MailingState == 1 ? $t('v102.ticket.zq') : x.MailingState == 2 ?$t('v102.ticket.yj'):$t('v102.ticket.dzp')}`"></q-btn>
</div>
<div class="f12 text-grey-6">{{ $t('hotelorder.search.orderNum') }}{{ x.OrderNo }}</div>
<div class="q-ml-md">
......@@ -18,6 +18,7 @@
<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">
......@@ -43,7 +44,21 @@
<div class="f12 text-grey-6">{{ $t('hotelorder.createTime') }}{{ x.CreateTime }}</div>
</div>
</div>
<!-- <div v-if="x.MailingState == 4">
<div class="f12">
{{ $t('v102.ticket.dzp') }}
<span class="text-negative">{{ x.UseDate }}</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.TicketCodeFile">
{{ x.TicketCodeFile.split('/').at(-1) }}</div>
<q-btn dense unelevated color="primary" size="sm" class="q-mr-sm" v-if="x.TicketCodeFile">
<a class="text-white" style="text-decoration:none"
:href="x.TicketCodeFile">{{ $t('upload.down') }}</a>
</q-btn>
</div>
</div> -->
<div class="q-mt-md row">
<q-table separator="cell" :hide-bottom="!x.Remark" :pagination="{ rowsPerPage: 100 }" :rows="x.DetailList" bordered :columns="cols" class="sticky-rightrowspan-column-table light-border col no-shadow">
<template v-slot:body-cell-Date="props">
......@@ -61,6 +76,11 @@
<q-tooltip>{{ props.value }}</q-tooltip>
</q-td>
</template>
<!-- <template v-slot:body-cell-MailingMoney="props">
<q-td :props="props">
<span>{{moneyFormat(x.MailingMoney)}}</span>
</q-td>
</template> -->
<template v-slot:body-cell-Money="props">
<q-td :props="props" >
{{props.row.Money}}
......@@ -83,9 +103,22 @@
<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="text-subtitle2 text-dark text-weight-bolder">{{ x.MailingState==1?$t('v102.ticket.zqa'):$t('v102.ticket.dzp') }}:</div>
<div class="f12 text-dark q-mt-sm">
<template v-if="x.MailingState==1">
{{ x.SelffetchAddress?x.SelffetchAddress:$t('v102.ticket.nzqa') }}
</template>
<template v-else>
{{ x.TicketCodeFile?'':$t('v102.ticket.nzqa1') }}
<div class="row items-center f12 q-mt-sm">
<div class="text-accent q-mr-md" v-if="x.TicketCodeFile">
{{ x.TicketCodeFile.split('/').at(-1) }}</div>
<q-btn dense unelevated color="primary" size="sm" class="q-mr-sm" v-if="x.TicketCodeFile">
<a class="text-white" style="text-decoration:none"
:href="x.TicketCodeFile">{{ $t('upload.down') }}</a>
</q-btn>
</div>
</template>
</div>
</div>
</div>
......@@ -95,9 +128,16 @@
<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">{{ $t('unit.jp') }}</span>
<span class="f12">{{ x.CurrencyCode }}</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.MailingMoney>0">
<div class="f12 text-grey">{{ $t('v102.ticket.sjc.c6') }}</div>
<div class="dark">
<span class="f12">{{ moneyFormat(x.MailingMoney) }}</span>
<span class="f12">{{ x.CurrencyCode }}</span>
</div>
</div>
<div class="text-right">
......@@ -210,7 +250,7 @@ export default defineComponent({
{ name: 'Money', label: t('hotelorder.col.m'), field: (row: any) => row.Money, align: 'left' }
] as any[],
modifyOrder:{} as any,
showModify:false
showModify:false,
})
const methods = {
......@@ -228,9 +268,11 @@ export default defineComponent({
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]
x.Money = 0
let Money = 0
x.DetailList.forEach((y:any)=>{
x.Money+=y.Money
Money+=y.Money
})
x.Money= Number(Money+x.MailingMoney)
})
data.orders = r.data.data.pageData
data.pages.pageCount = r.data.data.pageCount
......@@ -303,89 +345,6 @@ export default defineComponent({
}
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,
......
......@@ -67,7 +67,7 @@
}"
>
{{
x.price ? moneyFormat(x.price.originalB2CPrice, 0) : "&nbsp;"
x.price ? x.price.originalB2BPrice : "&nbsp;"
}}
</div>
</div>
......
<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>
<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" style="min-width: 150px" v-model="search.orderState" @update:model-value="setorderState" dense :options="status" emit-value option-label="StatusName" option-value="StatusId" map-options :label="$t('hotelorder.search.status')" standout />
<q-select class="q-mr-md" style="min-width: 150px" v-model="search.queryDays" @update:model-value="setorderDay" dense :options="Days" emit-value option-label="StatusName" option-value="StatusId" map-options label="时间范围" standout />
<div class="col"></div>
<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.orderState" class="text-cyan" dense>
<q-tab :name="x.StatusId" :label="x.StatusName" v-for="x in status" @click="setorderState(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 { getTripOrderStatus, getTripOrderType, getHotelRoomType, getTicketOrderType } 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({
Days:[] as Array<StandardStatus>,
status: [] as Array<StandardStatus>,
cancelStatus: {} as StandardStatus | undefined,
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 = getTripOrderStatus()
data.status = allStatus
data.Days = getTripOrderType(true)
},
setQueryHandler() {
realSearch.queryDays = search.queryDays
realSearch.orderState = search.orderState
},
setorderState(statusId: number) {
realSearch.orderState = statusId
},
setorderDay(statusId: number) {
search.queryDays = statusId
}
}
const searchCnt = computed(() => {
let setCnt = 0
return setCnt
})
methods.initStatus()
return {
...toRefs(data),
...methods,
search,
searchCnt
}
}
})
</script>
<style></style>
<template>
<div>
<div class="q-py-sm"></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 wrap justify-between">
<span class="f12 text-grey-6">
{{ $t('hotelorder.search.orderNum') }}{{x.orderId}}</span>
<!-- <span class="text-center f12 text-grey-6">
<template v-if="$q.platform.is.desktop">{{ $t('v102.ticket.sj') }}</template>
{{x.serviceName}} {{x.servicePhone}}
</span> -->
<span class="f12 text-grey-6">{{ $t('hotelorder.createTime') }}:{{x.createDate}}</span>
</div>
<div class="q-pt-sm" :class="{'row justify-between':$q.platform.is.desktop,'column col':$q.platform.is.mobile}">
<div :class="{'row col':$q.platform.is.desktop}">
<div :style="{'width':$q.platform.is.desktop?'150px':'100%'}">
<q-img class="rounded-borders" :style="{'width':$q.platform.is.desktop?'150px':'100%'}" :ratio="16 / 9" src="http://imgfile.oytour.com/Upload/DMC/yEiRE8pRWE5ZF8cPNRnAiQST8WbyaGQc.jpg" spinner-color="grey" spinner-size="50px" fit="cover"/>
</div>
<div class="column" :class="{'q-pl-lg':$q.platform.is.desktop,'q-pt-sm':$q.platform.is.mobile}">
<span class="text-subtitle1 text-weight-bolder ellipsis cursor-pointer" >{{x.title}}</span>
<span class="f12 text-grey-700 ellipsis q-py-sm">{{x.ltName}}</span>
<span class="f13 text-grey-700">团号:{{x.tcid}} ( <span class="text-red">{{ x.guestNum }} </span>旅客 ) </span>
</div>
</div>
<div :class="{'row items-end':$q.platform.is.desktop}" :style="{'flex-shrink': $q.platform.is.desktop?0:'inherit'}">
<div class="column text-right">
<div class="fz13" :class="{'row justify-end q-pt-lg q-pb-xs':$q.platform.is.mobile||$q.platform.is.desktop}">
<span class="">总金额:<span class="fz15">¥{{moneyFormat(x.preferPrice)}}</span> </span>
<div v-if="x.discountMoney>0" class="q-pl-lg" :class="{'':$q.platform.is.desktop}">
<span class=" text-red">优惠金额:<span class="fz15">¥{{moneyFormat(x.discountMoney)}}</span></span>
</div>
</div>
<span class="fz14 text-orange-7">已付总额:<span class="fz17">¥{{moneyFormat(x.customerPayMoney)}}</span> </span>
</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">
<BankAccount @change="showBankAccount=false"></BankAccount>
</q-dialog>
<q-dialog v-model="showModify" persistent>
<modify-order-address :order="modifyOrder" @close="showModify=false" @success="showModify=false,initOrders()"></modify-order-address>
</q-dialog>
</template>
<script lang="ts">
import scheduledTripService from '../../../api/scheduledTrip'
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 { getTripOrderStatus, getSendType, moneyFormat } from '../../../utils/tools'
import ModifyOrderAddress from './ModifyOrderAddress.vue'
import BankAccount from '../../BankAccount.vue'
export default defineComponent({
components: { svgIcon, ModifyOrderAddress,BankAccount },
setup(props) {
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()
})
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: 'Date', label: t('v102.ticket.jq')+'('+t('v102.ticket.d')+')', field: (row: any) => row.Date, align: 'left' },
{ name: 'TicketName', label: t('v102.ticket.hn'), field: (row: any) => row.TicketName, 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[],
modifyOrder:{} as any,
showModify:false,
})
const methods = {
ViewPayment() {
data.showBankAccount = true
},
initOrders() {
data.loading = true
let param = Object.assign(data.pages, search)
scheduledTripService.Getrecentorder(param)
.then(r => {
data.loading = false
if (r.data.resultCode == ApiResult.SUCCESS) {
console.log(r.data.data,'====')
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]
// x.Money = 0
// let Money = 0
// x.DetailList.forEach((y:any)=>{
// Money+=y.Money
// })
// x.Money= Number(Money+x.MailingMoney)
})
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
})
let param2 = Object.assign(data.pages, search)
scheduledTripService.GetWaitDealOrderPageList(param)
.then(r => {
if (r.data.resultCode == ApiResult.SUCCESS) {
console.log(r.data.data,'---')
}
}
)
},
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
scheduledTripService.GetWaitDealOrderPageList(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 = getTripOrderStatus()
data.sends = getSendType()
methods.initOrders()
},
modify(order:any) {
// order.Sex = JSON.stringify(order.Sex)
data.modifyOrder=order
data.showModify =true
},
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()
return {
...toRefs(data),
...methods,
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>
......@@ -19,13 +19,13 @@
</div>
<div v-if="$q.platform.is.mobile">
<span class="text-grey-7 product-price" style="font-size: 13px">
CNY {{ moneyFormat(p.originalB2CPrice, 0) }} /每人
CNY {{ p.originalB2BPrice }} /每人
</span>
</div>
</div>
<div class="row items-end">
<span v-if="$q.platform.is.desktop" class="text-grey-7 product-price" style="font-size: 13px">
CNY {{ moneyFormat(p.originalB2CPrice, 0) }} /每人
CNY {{ p.originalB2BPrice }} /每人
</span>
<q-input
style="width: 150px"
......@@ -65,6 +65,7 @@
</q-input>
</div>
</div>
<div class="row items-end q-mt-md" v-if="p.isSupportChildren == 1">
<div class="col" :class="{'column':$q.platform.is.mobile}">
<div>
......@@ -74,19 +75,80 @@
<div v-if="$q.platform.is.mobile">
<span class="text-grey-7 product-price" style="font-size: 13px">
CNY
{{ moneyFormat(p.originalB2CPrice - p.childNoNeedPrice, 0) }} /每人
{{ p.originalB2BPrice - p.childNoNeedPrice }} /每人
</span>
</div>
</div>
<div class="row items-end">
<span v-if="$q.platform.is.desktop" class="text-grey-7 product-price" style="font-size: 13px">
CNY
{{ moneyFormat(p.originalB2CPrice - p.childNoNeedPrice, 0) }} /每人
{{ p.originalB2BPrice - p.childNoNeedPrice }} /每人
</span>
<q-input
style="width: 150px"
@input="changePeople"
v-model="chosenObj.etbzcCount"
class="col"
:class="{
'q-ml-sm q-px-none q-pl-none': $q.platform.is.desktop,
}"
mask="#"
reverse-fill-mask
dense
standout
readonly
:disable="!p.remainNum"
>
<template v-slot:prepend>
<q-btn
color="primary"
size="sm"
class="q-px-none"
flat
icon="remove"
@click="addPeople('etbzcCount', -1)"
/>
</template>
<template v-slot:append>
<q-btn
color="primary"
size="sm"
class="q-px-none"
flat
icon="add"
@click="addPeople('etbzcCount', 1)"
/>
</template>
</q-input>
</div>
</div>
<div class="row items-end q-mt-md" v-if="p.isSupportChildren == 1">
<div class="col" :class="{ column: $q.platform.is.mobile }">
<div>
<span class="text-subtitle2 text-weight-bold">儿童</span>
<span class="text-grey-6 f12 q-ml-sm">(2-11歲,占床)</span>
</div>
<div v-if="$q.platform.is.mobile">
<span class="text-grey-7 product-price" style="font-size: 13px">
CNY
{{ p.childNeedPrice + p.originalB2BPrice }} /每人
</span>
</div>
</div>
<div class="row items-end">
<span
v-if="$q.platform.is.desktop"
class="text-grey-7 product-price"
style="font-size: 13px"
>
CNY
{{ p.childNeedPrice + p.originalB2BPrice }} /每人
</span>
<q-input
style="width: 150px"
@input="changePeople"
v-model="chosenObj.etCount"
v-model="chosenObj.etzcCount"
class="col"
:class="{
'q-ml-sm q-px-none q-pl-none': $q.platform.is.desktop,
......@@ -105,7 +167,7 @@
class="q-px-none"
flat
icon="remove"
@click="addPeople('etCount', -1)"
@click="addPeople('etzcCount', -1)"
/>
</template>
<template v-slot:append>
......@@ -115,7 +177,7 @@
class="q-px-none"
flat
icon="add"
@click="addPeople('etCount', 1)"
@click="addPeople('etzcCount', 1)"
/>
</template>
</q-input>
......@@ -130,13 +192,13 @@
</div>
<div v-if="$q.platform.is.mobile">
<span v-if="$q.platform.is.desktop" class="text-grey-7 product-price" style="font-size: 13px">
CNY {{ moneyFormat(p.babyPrice, 0) }} /每人
CNY {{ p.babyPrice }} /每人
</span>
</div>
</div>
<div class="row items-end">
<span v-if="$q.platform.is.desktop" class="text-grey-7 product-price" style="font-size: 13px">
CNY {{ moneyFormat(p.babyPrice, 0) }} /每人
CNY {{ p.babyPrice }} /每人
</span>
<q-input
style="width: 150px"
......@@ -176,6 +238,7 @@
</q-input>
</div>
</div>
<div class="text-grey-6 f12 q-mt-mb" v-if="p.isSupportChildren == 2">
本團只支持成人出遊
</div>
......@@ -193,13 +256,13 @@
</div>
<div v-if="$q.platform.is.mobile">
<span class="text-grey-7 product-price" style="font-size: 13px">
CNY {{ moneyFormat(p.singleRoomPrice, 0) }} /每人
CNY {{ p.singleRoomPrice }} /每人
</span>
</div>
</div>
<div class="row items-end">
<span v-if="$q.platform.is.desktop" class="text-grey-7 product-price" style="font-size: 13px">
CNY {{ moneyFormat(p.singleRoomPrice, 0) }} /每人
CNY {{ p.singleRoomPrice }} /每人
</span>
<q-input
style="width: 150px"
......@@ -252,11 +315,11 @@
<div class="q-mt-md q-pt-md" style="border-top: 1px dashed #eee">
<div class="row items-center">
<span class="text-subtitle2 text-grey-6 col">總金額</span>
<span class="text-h6 text-primary product-price">CNY {{ moneyFormat(sumPrice,0) }}</span>
<span class="text-h6 text-primary product-price">CNY {{ sumPrice }}</span>
</div>
<div class="q-mt-md text-right">
<span class="q-mr-lg f12 text-negative" v-if="!p.startDate" >{{$q.platform.is.mobile?'請選擇上面的出行日期':'請選擇左側的出行日期'}} </span>
<q-btn color="primary" label="立即訂購" unelevated class="q-px-lg" :disable="sumPrice==0"/>
<q-btn color="primary" label="立即預定" unelevated class="q-px-lg" :disable="sumPrice==0" @click="goOrderHandler"/>
</div>
</div>
</div>
......@@ -272,9 +335,10 @@ import scheduledTripService from 'src/api/scheduledTrip'
import { ApiResult } from 'src/@types/enumHelper'
import message from 'src/utils/message'
import { moneyFormat } from 'src/utils/tools'
import md5 from "md5-ts";
export default defineComponent({
components: { },
props: ['price'],
props: ['msg','price'],
setup(props, context) {
const $router = useRouter()
const { t } = useI18n()
......@@ -293,6 +357,23 @@ export default defineComponent({
},{deep: true}
)
const methods = {
goOrderHandler(){
let order = {
configId: props.msg.configId,
tcid: data.p.tcid,
startCityId: 0,
orderInfo: data.chosenObj
}
let key = md5(JSON.stringify(order))
let lineTrip = localStorage.getItem('lineTrip')
lineTrip = lineTrip?JSON.parse(lineTrip):[]
lineTrip.push({
key,
order
})
localStorage.setItem("lineTrip",JSON.stringify(lineTrip))
$router.push({ path:`/scheduledTrip/preview/${key}`})
},
initModel() {
data.sumPrice=0
data.chosenObj = {
......@@ -301,6 +382,7 @@ export default defineComponent({
etCount: 0,
yeCount: 0,
lrCount: 0,
etzcCount: 0,
etbzcCount: 0,
etzc: 0,
df: 0,
......@@ -330,21 +412,21 @@ export default defineComponent({
changePeople(val) {},
addPeople(m, i, isDf = false) {
data.chosenObj[m] = parseInt(data.chosenObj[m]) + i;
if(m!='crCount'){
if (m != "crCount") {
data.chosenObj[m] = data.chosenObj[m] < 0 ? 0 : data.chosenObj[m];
}else{
} else {
data.chosenObj[m] = data.chosenObj[m] < 1 ? 1 : data.chosenObj[m];
}
if (!isDf) {
if (
data.chosenObj.crCount + data.chosenObj.etCount >
data.chosenObj.crCount + data.chosenObj.etzcCount >
data.p.remainNum
) {
data.chosenObj[m] = data.chosenObj[m] - 1;
}
} else {
if (
data.chosenObj.crCount + data.chosenObj.etCount <
data.chosenObj.crCount + data.chosenObj.etzcCount <
data.chosenObj.df
) {
data.chosenObj[m] = data.chosenObj[m] - 1;
......@@ -353,11 +435,12 @@ export default defineComponent({
methods.calcMoney()
},
calcMoney() {
if (!data.p) return;
if (!data.p || !data.p.originalB2BPrice) return data.sumPrice=0;
data.chosenObj.etCount = data.chosenObj.etbzcCount + data.chosenObj.etzcCount
let money =
data.p.originalB2CPrice * data.chosenObj.crCount;
data.p.originalB2BPrice * data.chosenObj.crCount;
money +=
(data.p.originalB2CPrice-data.p.childNoNeedPrice+data.p.babyChargePrice) * data.chosenObj.etCount;
(data.p.originalB2BPrice-data.p.childNoNeedPrice+data.p.babyChargePrice) * data.chosenObj.etCount;
money += data.p.babyPrice * data.chosenObj.yeCount;
money += data.p.singleRoomPrice * data.chosenObj.df;
......
......@@ -334,7 +334,9 @@ export default defineComponent({
currentImage:'',
showImagePriview: false,
d: props.days,
TitleT: []
})
data.TitleT = [t('v103.details.calendarhtml.d2'), t('v103.details.calendarhtml.d3'), t('v103.details.calendarhtml.d4')]
watch(() => props.days,(n,o) => {
data.d = n;
},{deep: true}
......@@ -356,9 +358,8 @@ export default defineComponent({
y.title = methods.formatTraffice(y.childItem.subTraffic);
y.icon = "iconfont iconjiaotong";
} else if (y.type == 4) {
let t = [t('v103.details.calendarhtml.d2'), t('v103.details.calendarhtml.d3'), t('v103.details.calendarhtml.d4')];
y.childItem.dinnerTypeName =
t[parseInt(y.childItem.useDinnerType) - 1];
y.childItem.dinnerTypeName = data.TitleT[parseInt(y.childItem.useDinnerType) - 1];
}
});
});
......
<template>
<div class="rounded-borders bg-white row items-center q-pa-md q-my-md">
<q-input v-if="$q.platform.is.desktop" v-model="searchClone.UseCompName" class="col-2 q-mr-md" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s1')" />
<q-input v-if="$q.platform.is.desktop" v-model="searchClone.TeamName" class="col-2 q-mr-md" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s3')" />
<q-select v-if="$q.platform.is.desktop" class="q-mr-md" style="min-width: 150px" v-model="searchClone.OfferState" @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" type="number" v-model="searchClone.OrderNo" dense standout :label="$t('hotelorder.search.orderNum')" />
<!-- <q-input v-if="$q.platform.is.desktop" v-model="searchClone.UseCompName" class="col-2 q-mr-md" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s1')" /> -->
<!-- <q-input v-if="$q.platform.is.desktop" v-model="searchClone.TeamName" class="col-2 q-mr-md" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s3')" /> -->
<q-field v-if="$q.platform.is.desktop" stack-label :label="$t('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">
......@@ -17,20 +18,23 @@
<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-my-md">
<q-input type="number" v-model="searchClone.OrderNo" dense standout :label="$t('hotelorder.search.orderNum')" />
<div class="q-my-md" v-if="$q.platform.is.mobile">
<q-select v-model="searchClone.OfferState" @update:model-value="setOrderStatus" dense :options="status" emit-value option-label="StatusName" option-value="StatusId" map-options :label="$t('hotelorder.search.status')" standout />
</div>
<div class="q-my-md">
<q-input type="number" v-model="searchClone.OrderId" dense standout :label="$t('hotelorder.search.orderId')" />
<!-- <div class="q-my-md">
<q-input v-model="searchClone.UseName" class="col-2" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s2')" />
</div>
<div class="q-my-md" v-if="$q.platform.is.mobile">
<q-input v-model="searchClone.UseCompName" class="col-2" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s1')" />
</div>
</div> -->
<div class="q-my-md">
<q-input v-model="searchClone.UseName" class="col-2" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s2')" />
<q-input v-model="searchClone.TeamName" class="col-2" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s3')" />
</div>
<div class="q-my-md" v-if="$q.platform.is.mobile">
<q-input v-model="searchClone.TeamName" class="col-2" reverse-fill-mask dense type="text" standout :label="$t('v102.vehicle.list.s3')" />
<q-input type="number" v-model="searchClone.OrderNo" dense standout :label="$t('hotelorder.search.orderNum')" />
</div>
<div class="q-my-md">
<q-input type="number" v-model="searchClone.OrderId" dense standout :label="$t('hotelorder.search.orderId')" />
</div>
<div class="q-my-md" v-if="$q.platform.is.mobile">
......@@ -62,6 +66,7 @@ import { ApiResult } from 'src/@types/enumHelper'
import message from 'src/utils/message'
import { useHotel } from '../../../utils/hotelRate'
import { useRouter } from 'vue-router'
import { getHotelOrderStatus, getHotelOrderType, getHotelRoomType } from '../../../utils/tools'
export default {
components: { svgIcon, NCascader },
setup(props) {
......@@ -79,7 +84,9 @@ export default {
} as any,
searchClone:{} as any,
canHide: false,
AirportList: [] as any
AirportList: [] as any,
status: [] as Array<StandardStatus>,
cancelStatus: {} as StandardStatus | undefined,
})
......@@ -95,6 +102,19 @@ export default {
search.msg.StartTime = data.dateRange.from
search.msg.EndTime = data.dateRange.to
const methods = {
setOrderStatus(statusId: number) {
data.searchClone.OfferState = statusId
},
initStatus() {
//通用的訂單類型
let allStatus = getHotelOrderStatus()
data.status = allStatus.filter((x: StandardStatus) => {
return x.StatusId != 4
})
data.cancelStatus = allStatus.find((x: StandardStatus) => {
return x.StatusId == 4
})
},
goUrl(){
$router.push({ path:`/vehicle/addEditVehicle`})
},
......@@ -143,15 +163,17 @@ export default {
let setCnt = 0
if ($q.platform.is.mobile) {
if (data.searchClone.UseCompName > 0) setCnt++
if (data.searchClone.TeamName > 0) setCnt++
if (data.dateRangeFormat.length>0) setCnt++
if (data.searchClone.OfferState) setCnt++
}
if (data.searchClone.TeamName > 0) setCnt++
if (data.searchClone.UseName>0) setCnt++
if (data.searchClone.OrderNo) setCnt++
if (data.searchClone.OrderId) setCnt++
if (data.searchClone.OrderId>0) setCnt++
return setCnt
})
methods.initStatus()
return {
qDateProxy,
searchCnt,
......
......@@ -13,9 +13,9 @@
<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.UseCompName }}/{{
<!-- <span>{{ $t('v102.ticket.sj') }}{{ x.UseCompName }}/{{
x.UseName
}}</span>
}}</span> -->
</div>
<div class="f12 text-grey-6">{{ $t('hotelorder.createTime') }}{{ x.CreateDate }}</div>
<div class="q-ml-md f12" :class="[x.typeInfo.Color]">
......@@ -80,10 +80,10 @@
<!-- {{ $t('v102.vehicle.tatle.th3') }}: -->
{{ x.UseTypeName }} </span>
<span class="q-mr-md">{{ $t('v102.vehicle.tatle.th4') }}: {{x.TripInfo}}</span>
<span class="q-mr-md" v-if="x.UnitPrice>0">{{ $t('v102.vehicle.list2.s21') }} {{x.UnitPrice}}</span>
<span class="q-mr-md" v-if="x.StopBusPrice>0">{{ $t('v102.vehicle.list2.s22') }} {{x.StopBusPrice}}</span>
<span class="q-mr-md" v-if="x.RoomPrice>0">{{ $t('v102.vehicle.list2.s23') }} {{x.RoomPrice}}</span>
<span class="q-mr-md"> {{ $t('hotelorder.xj') }}: {{ x.Money ?? 1 }} </span>
<span class="q-mr-md" v-if="x.UnitPrice>0">{{ $t('v102.vehicle.list2.s21') }}: {{x.UnitPrice}}</span>
<span class="q-mr-md" v-if="x.StopBusPrice>0">{{ $t('v102.vehicle.list2.s22') }}: {{x.StopBusPrice}}</span>
<span class="q-mr-md" v-if="x.RoomPrice>0">{{ $t('v102.vehicle.list2.s23') }}: {{x.RoomPrice}}</span>
<span class="q-mr-md" v-if="x.Money>0"> {{ $t('hotelorder.xj') }}: {{ x.Money }} </span>
</div>
</q-td>
</template>
......@@ -92,35 +92,28 @@
<div class="f12">
<div><span class="q-mr-xs text-grey-6">{{ $t('v102.vehicle.title9') }}</span>{{ x.BusTypeName }}</div>
<template v-if="x.DriverInfo ">
<div><span class="q-mr-xs text-grey-6">{{ $t('v102.vehicle.list2.s30') }}</span>{{ x.DriverInfo }}</div>
<div><span class="q-mr-xs text-grey-6">{{ $t('v102.vehicle.list2.s31') }}</span>{{ x.BusNo }}</div>
<div><span class="q-mr-xs text-grey-6">{{ $t('v102.vehicle.list2.s30') }}</span>{{ x.DriverInfo }}</div>
<div><span class="q-mr-xs text-grey-6">{{ $t('v102.vehicle.list2.s31') }}</span>{{ x.BusNo }}</div>
</template>
</div>
</q-td>
</template>
<template v-slot:body-cell-HandFittingFee="props">
<q-td :props="props" :colspan="x.DetailList.length" v-if="props.rowIndex == 0" >
{{ moneyFormat(x.ShouPeiFee) }}
<div class="q-mt-sm" v-if="x.OfferState == 2">
<div class="q-mt-sm" v-if="x.OfferState!=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>
</q-btn>
<span class="text-grey-500 f12">{{ $t('v101.noneHands') }}</span>
</div>
<template v-else>
{{ moneyFormat(x.ShouPeiFee)?moneyFormat(x.ShouPeiFee):$t('v102.vehicle.nomoney') }}
</template>
</q-td>
</template>
<!-- <template v-slot:body-cell-RoomNo="props">
<q-td :props="props">
<n-tag :bordered="false" size="small" type="error" v-if="!props.row.OrderNo">
{{ $t('hotelorder.check.un') }}
</n-tag>
<n-tag :bordered="false" size="small" type="success" v-else>
{{ props.row.OrderNo }}
</n-tag>
</q-td>
</template> -->
<template v-slot:bottom>
<div class="msl text-negative">{{ $t('v101.hotelRemark') }}{{ x.CreateRemark }}</div>
</template>
......@@ -136,9 +129,11 @@
<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="din text-subtitle1">{{ moneyFormat(x.totalMoney) }}</span>
<span class="f12">
<!-- {{ $t('unit.jp') }} -->
<span class="din text-subtitle1">
{{ x.OfferState!=2?$t('v102.vehicle.nomoney'):moneyFormat(x.totalMoney) }}
<!-- {{ x.totalMoney.toFixed(2) }} -->
</span>
<span class="f12" v-if="moneyFormat(x.totalMoney)>0">
{{x.CurrencyCode}}
</span>
</div>
......@@ -148,7 +143,7 @@
</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.OfferState != 1, 'bg-grey-2': x.OfferState == 1 }">
<q-list dense v-if="x.OfferState != 3" :class="{ 'row items-center justify-between full-width': $q.platform.is.mobile }">
<q-list dense v-if="x.OfferState != 2" :class="{ 'row items-center justify-between full-width': $q.platform.is.mobile }">
<q-item v-if="x.OfferState == 1" class="text-negative" clickable v-close-popup @click="cancel(x.Id)">
<q-item-section>
<q-item-label>{{ $t('hotelorder.opera.cancel') }}</q-item-label>
......@@ -159,26 +154,25 @@
<q-item-label>{{ $t('hotelorder.opera.edit') }}</q-item-label>
</q-item-section>
</q-item>
<!-- v-if="x.OfferState == 3" -->
<q-item class="text-positive" clickable v-close-popup @click="details(x.Id)">
<!-- <q-item class="text-positive" clickable v-close-popup @click="details(x.Id)">
<q-item-section>
<q-item-label>{{$t('v102.vehicle.list.s9')}}</q-item-label>
</q-item-section>
</q-item>
</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.totalMoney.toFixed(2) }}
<!-- {{ moneyFormat(x.totalMoney) }} -->
{{ moneyFormat(x.Income) }}
<span class="text-green-4 f12">
<!-- {{ $t('unit.jp') }} -->
{{x.CurrencyCode}}
</span>
</div>
</div>
</div>
</div>
<div v-if="x.OfferState == 5">
<div v-if="x.OfferState == 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>
......@@ -235,7 +229,6 @@ export default defineComponent({
CancelRemark: '',
Id: 0,
loading: false,
loading: false,
pages: {
pageIndex: 1,
pageSize: 5,
......@@ -253,7 +246,6 @@ export default defineComponent({
{ name: 'PeopleNum', label: t('v102.vehicle.title6'), field: (row: any) => row.PeopleNum, align: 'left' },
{ name: 'UseDayNum', label: t('v102.vehicle.tatle.th4'), field: (row: any) => row.UseDayNum, align: 'left' },
// { name: 'RoomNo', label: t('hotelorder.col.n'), align: 'left' },
{ name: 'BusTypeName', label: t('v102.vehicle.title91'), field: (row: any) => row, 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' },
......@@ -343,9 +335,11 @@ export default defineComponent({
$router.push({ path: `/vehicle/addEditVehicle${data.Id ? '/' + data.Id : ''}` })
},
getList() {
data.loading = true
let param = Object.assign(data.pages, search.msg)
HotelService.vehicleList(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.OfferState) ?? data.status[1]
......
This diff is collapsed.
......@@ -93,5 +93,9 @@ class DirtionmaryHelper {
* 元素滚动參數
*/
static readonly SCROLL_AREA_OBJ = "scrollareaobj"
/**
* 包机订单列表
*/
static readonly TRAVEL_ORDER_OBJ = "travelOrderObj"
}
export { userDictionmary,DirtionmaryHelper }
......@@ -345,6 +345,11 @@ export default {
second: 'チケット検索',
three: 'チケット注文'
},
stroke: {
first: '予約します',
second: 'スケジュール検索です',
three: '予約します'
},
finance: {
first: 'ツケ',
second: '月次請求書',
......@@ -780,6 +785,9 @@ export default {
table7: '発注日です',
table8: '操作',
quxiaodindan: 'キャンセルします',
youhui: '恩恵',
xiangqing: '详细',
shankedinfang: '個人客が部屋を予約する'
}
......@@ -836,8 +844,10 @@ export default {
gi: 'チケットを取ります',
zq: '切符は自分で受け取ります',
yj: 'チケットを送ります',
dzp: '電子チケットです',
zqs: '自己取票説明します',
zqd: '自分で指定の位置に行ってチケットを取ります、あなたが支払いを完了した後に私達はメールを通じてチケットの情報を取ることをお知らせします',
zqd1: '住所を持参します',
sj: 'ゲストメッセージです',
youji: 'メッセージを送ります',
unit: '枚',
......@@ -850,13 +860,15 @@ export default {
c2: '英語の名前です',
c3: '性別です',
c4: '連絡します',
c5: '宛先です'
c5: '宛先です',
c6: '郵送料です',
},
sjcp: {
c1: '中国語の名前を入力してくださいです',
c2: '英語の名前を入力してくださいです',
c4: '連絡先を入力します',
c5: '宛先を入力します'
c5: '宛先を入力します',
c6: '郵送料を入力願います',
},
st: '勘定書を決済します',
rtt: 'チケットの払い戻し制限です',
......@@ -867,7 +879,8 @@ export default {
sb: '注文書を提出します',
or: '注文書です',
zqa: '自分でアドレスを取ります',
nzqa: 'お客様サービスのご確認後、ご住所が分かりますので、至急メールにてお知らせいたします'
nzqa: 'お客様サービスのご確認後、ご住所が分かりますので、至急メールにてお知らせいたします',
nzqa1: 'お客様窓口で確認した後、電子チケットが表示されますので、すぐにメールでお知らせします'
},
to: {
pageTitle: 'チケット註文リストです',
......@@ -900,17 +913,26 @@ export default {
title7: "開始日",
title8: "トリップ日数",
title9: "車タイプ",
title91: "車の情報です",
title10: "ガイド情報",
title11: "チーム情報",
title12: "作成時間",
title13: "車種選択",
title14: "送迎時間",
close: "キャンセル",
travelvehicle: '旅行用車両です',
strokestatus:{
d1: '待ちます',
d2: '確認しました',
d3: 'キャンセルされました',
},
tatle: {
th1: '日付',
th2: '何日目',
th3: '車タイプ',
th4: 'トリップ情報',
th5: '操作します',
th6: '削除します',
},
add: '追加',
add2: '修正',
......@@ -972,7 +994,9 @@ export default {
tian: '日',
ms: '註文明細です',
ds: '総受注日数です',
nt: '註文情報がありません'
nt: '註文情報がありません',
zuo: '座',
nomoney: '見積もりは保留です',
},
CharteredBus: {
jiesongdianfw: '送迎点範囲です',
......@@ -1021,7 +1045,6 @@ export default {
rtt: '制限を撤廃します',
td: '団訂です',
bianji: '編集を確定します',
},
sjc:{
c1:'名前」です',
c1x: '姓です',
......@@ -1076,5 +1099,7 @@ export default {
c15: '手荷物数を入力します',
}
},
},
//#endregion
}
......@@ -345,6 +345,11 @@ export default {
second: '입장권 검색',
three: '입장권 주문서'
},
stroke: {
first: '일정을 예약하다',
second: '여행 검색',
three: '여정 예약'
},
finance: {
first: '계산서',
second: '월간 청구서',
......@@ -779,7 +784,10 @@ export default {
table6: '주문상태',
table7: '주문하는 날',
table8: '조작',
quxiaodindan: '주문 취소'
quxiaodindan: '주문 취소',
youhui: '할인',
xiangqing: '자세 한 정보',
shankedinfang: '개별손님들이 객실을 예약하다'
}
......@@ -836,8 +844,10 @@ export default {
gi: '투표용지입니다',
zq: '무료티켓입니다',
yj: "우편 티켓",
dzp: '전자쿠폰',
zqs: "주문서",
zqd: "직접 지정된 장소로 가서 표를 받으시면 돈을 지불하신 후에 우편으로 표를 받으라는 정보를 알려 드리겠습니다",
zqd1: '사용자 주소',
sj: '고객 메시지',
youji: '메시지 보내기',
unit: '장',
......@@ -850,13 +860,15 @@ export default {
c2: '영어 이름',
c3: "성별",
c4: "연락 전화",
c5: "수신 주소"
c5: "수신 주소",
c6: '우송료',
},
sjcp: {
c1: "중국어 이름을 입력해주세요",
c2: "영어 이름을 입력해주세요",
c4: "연락처를 입력해주세요",
c5: "수신 주소를 입력하십시오"
c5: "수신 주소를 입력하십시오",
c6: '우송료를 입력해 주십시오',
},
st: "계산서를 정리합니다",
rtt: "환불 제한",
......@@ -867,7 +879,8 @@ export default {
sb: "주문서를 제출하세요",
or: '주문서 설명',
zqa: '고유 주소',
nzqa: '고객 서비스 확인 후 사용자 주소 확인, 제일 먼저 이메일로 알려 드리겠습니다'
nzqa: '고객 서비스 확인 후 사용자 주소 확인, 제일 먼저 이메일로 알려 드리겠습니다',
nzqa1: '고객서비스 확인 후, 전자쿠폰을 볼 수 있으며, 저희는 제일 먼저 이메일로 알려드리겠습니다'
},
to: {
pageTitle: '티켓 주문 목록',
......@@ -900,17 +913,26 @@ export default {
title7: "시작 날짜",
title8: "여행 일수",
title9: "차량 종류",
title91: "차량 사용 정보",
title10: "가이드 정보",
title11: "팀 정보",
title12: "만든 시간",
title13: "차량 모델 선택",
title14: "공항 영송 시간",
close: "취소",
travelvehicle: '여정차용',
strokestatus:{
d1: '확인을 기다리다',
d2: '확인됨',
d3: '취소됨',
},
tatle: {
th1: '날짜',
th2: '며칠째',
th3: '차량 종류',
th4: '스트로크 정보',
th5: '조작',
th6: '삭제',
},
add: '추가',
add2: '수정',
......@@ -972,7 +994,9 @@ export default {
tian: '일',
ms: '주문서 명세',
ds:"총 주문일수",
nt:"주문 정보가 없습니다"
nt:"주문 정보가 없습니다",
zuo: '쭤',
nomoney: '미지불 오퍼',
},
CharteredBus:{
jiesongdianfw: '픽업점 범위',
......@@ -1074,7 +1098,8 @@ export default {
c14:"수하물 번호를 입력하세요",
c15:"수하물 번호 입력",
}
}
},
},
//#endregion
}
......@@ -223,7 +223,7 @@ export default {
hotelRate: '酒店星級',
minPrice: '最低價格',
maxPrice: '最高價格',
waringTips: '注意以下計費與報價均是按照人數進行計費',
waringTips: '注意以下計費與報價均是按照人數進行計費',
inHouseDate: '入住日期',
inhouseDays: '共計',
bigTips: '本房型不同的酒店入住人數限制不同,系統默認該房型只能入住一人',
......@@ -354,6 +354,11 @@ export default {
first: '帳單',
second: '月度請求書',
three: '匯款說明'
},
travel: {
first: '包机',
second: '包机服务',
three: ' '
}
},
login: {
......@@ -784,7 +789,10 @@ export default {
table6: '訂單狀態',
table7: '下單日期',
table8: '操作',
quxiaodindan: '取消訂單'
quxiaodindan: '取消訂單',
youhui: '优惠',
xiangqing: '详情',
shankedinfang: '散客訂房'
}
......@@ -841,8 +849,10 @@ export default {
gi: '取票方式',
zq: '自行取票',
yj: '郵寄票券',
dzp: '電子券',
zqs: '自行取票說明',
zqd: '自行前往指定位置取票,當您完成付款後我們將通過郵件通知您取票的門票訊息',
zqd1: '自取地址',
sj: '客人訊息',
youji: '郵寄訊息',
unit: '張',
......@@ -855,13 +865,15 @@ export default {
c2: '英文姓名',
c3: '性別',
c4: '聯絡電話',
c5: '收件地址'
c5: '收件地址',
c6: '郵寄費'
},
sjcp: {
c1: '請輸入中文姓名',
c2: '請輸入英文姓名',
c4: '請輸入聯絡電話',
c5: '請輸入收件地址'
c5: '請輸入收件地址',
c6: '請輸入郵寄費'
},
st: '結算帳單',
rtt: '退票限制',
......@@ -872,7 +884,8 @@ export default {
sb: '提交訂單',
or: '訂單備註',
zqa: '自取地址',
nzqa: '等待客服確認後,才能看到自取地址,我們將會第一時間通過郵件告知您'
nzqa: '等待客服確認後,才能看到自取地址,我們將會第一時間通過郵件告知您',
nzqa1: '等待客服確認後,才能看到电子券,我們將會第一時間通過郵件告知您'
},
to: {
pageTitle: '票券訂單列表',
......@@ -907,7 +920,7 @@ export default {
title9: "用車類型",
title91: "用車信息",
title10: "導遊信息",
title11: "团队信息",
title11: "團隊信息",
title12: "創建時間",
title13: "車型選擇",
title14: "接送機時間",
......@@ -944,37 +957,37 @@ export default {
s10: '確認報價',
},
list2: {
s1: '下單人',
s2: '下單時間',
s3: '訂車公司',
s4: '訂車人',
s5: '團體名稱',
s6: '人數',
s7: '日期',
s8: '天數',
s9: '去程航班',
s10: '回程航班',
s11: '用車類型',
s12: '導遊信息',
s13: '確認狀態',
s14: '接機信息',
s15: '確認狀態',
s1: '下單人',
s2: '下單時間',
s3: '訂車公司',
s4: '訂車人',
s5: '團體名稱',
s6: '人數',
s7: '日期',
s8: '天數',
s9: '去程航班',
s10: '回程航班',
s11: '用車類型',
s12: '導遊信息',
s13: '確認狀態',
s14: '接機信息',
s15: '確認狀態',
s16: '確認',
s17: '已確認',
s18: '確認人',
s19: '確認時間',
s18: '確認人',
s19: '確認時間',
s20: '行程信息',
s21: '價格',
s22: '停車費',
s23: '司機住宿費',
s24: '小計',
s25: '合計',
s26: '備註',
s27: '注意事項',
s28: '狀態',
s29: '手配費',
s30: '司機',
s31: '車牌號',
s21: '價格',
s22: '停車費',
s23: '司機住宿費',
s24: '小計',
s25: '合計',
s26: '備註',
s27: '注意事項',
s28: '狀態',
s29: '手配費',
s30: '司機',
s31: '車牌號',
},
tabtitle0: '團隊訂單',
tabtitle1: '接機訂單',
......@@ -986,7 +999,9 @@ export default {
tian: '天',
ms: '訂單明細',
ds: '訂單總天數',
nt: '沒有訂單信息'
nt: '沒有訂單信息',
zuo: '座',
nomoney: '暫未報價',
},
CharteredBus:{
jiesongdianfw: '接送點範圍',
......@@ -1096,8 +1111,8 @@ export default {
v103: {
scheduledTrip:{
pageTitle: '行程檢索',
screeningtitle: '篩選目的地',
searchinput: '搜尋目的地',
screeningtitle: '篩選關鍵詞',
searchinput: '搜尋關鍵詞',
allcommoditytype: '所有商品類別',
screeningdate: '篩選出發日期',
screeningprice: '價錢篩選',
......@@ -1110,8 +1125,8 @@ export default {
day: '天',
above: '天以上',
recommend: '強力推薦',
ascendingorder: '價格低到高',
descendingorder: '價格高到低',
ascendingorder: '價格低到高',
descendingorder: '價格高到低',
sightseeingitinerary: '觀光行程',
daytrip: '半/一日遊',
multiday: '多日遊',
......@@ -1121,7 +1136,7 @@ export default {
since: '起',
selectionscheme: '選擇方案',
headerlabel:{
d1: '印象自組團',
d1: '直營產品',
d2: '行程時間',
d21: '天',
d3: '日本語/中文 導覽',
......@@ -1149,7 +1164,7 @@ export default {
d9: '所选日期 4 ~ 7 天之间取消,收取手续费 50%',
d10: '所选日期 1 ~ 3 天之间取消,收取手续费 80%',
d11: '所选日期 0 ~ 0 天之间取消,收取手续费 100%',
d12: '注意由于站内商品来自全球各地,订单取消时间将依该供应商所在时区判定。供应商需 2-5 个工作天进行取消流程,依照您购买的商品取消政策收取手续费,并于取消流程完成后14 个工作天内退款。',
d12: '注意由于站内商品来自全球各地,订单取消时间将依该供应商所在时区判定。供应商需 2-5 个工作天进行取消流程,依照您购买的商品取消政策收取手续费,并于取消流程完成后14 个工作天内退款。',
},
warnbuytext:{
d1: '未满 2 岁幼儿不占位可免费参加(不含座位,餐点,门票,床位),请先于下订时在「备注栏」告知。',
......
......@@ -44,7 +44,7 @@ const userUserLoginModule = () => {
const param = {
account: userModel.username,
password: userModel.password,
platform: 0
platform: 3
}
let r = await dispatchAction<UserActionsType>('user', 'userLogin', param) as [boolean,string]
if(!r[0]){
......
......@@ -60,7 +60,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.sjc.c25') }}{{ $t('v102.CharteredBus.d') }}:</div>
<div class="row items-center col wrap q-mt-md">
<div class="q-pa-sm rounded-borders q-mr-md q-mb-md cursor-pointer row items-center" :class="{ 'bg-grey-2': !x.checked, 'bg-primary text-white': x.checked }" @click="changeDetailListHandler(x,2)" v-for="x in PlaceTypes">
<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,2)" v-for="x in PlaceTypes">
<span class="q-mr-sm q-pr-sm" :style="{'border-right': x.checked?'1px solid #ffffff':'1px solid gray'}">{{ x.Address }}</span>
<span>{{ x.Range }} m{{ $t('v102.CharteredBus.fw') }}</span>
</div>
......@@ -71,7 +71,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.sjc.c26') }}{{ $t('v102.CharteredBus.d') }}:</div>
<div class="row items-center col wrap q-mt-md">
<div class="q-pa-sm rounded-borders q-mr-md q-mb-md cursor-pointer row items-center" :class="{ 'bg-grey-2': !x.checked, 'bg-primary text-white': x.checked }" @click="changeDetailListHandler(x,4)" v-for="x in PlaceTypes2">
<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,4)" v-for="x in PlaceTypes2">
<span class="q-mr-sm q-pr-sm" :style="{'border-right': x.checked?'1px solid #ffffff':'1px solid gray'}">{{ x.Address }}</span>
<span>{{ x.Range }} m{{ $t('v102.CharteredBus.fw') }}</span>
</div>
......@@ -174,7 +174,7 @@
{{$t('v102.CharteredBus.baochetype2')}}
</template>
<template v-if="msg.OrderType==3">
{{$t('v102.CharteredBus.baochetype2')}}
{{$t('v102.CharteredBus.baochetype3')}}
</template>{{$t('v102.CharteredBus.xunxi')}}
</span>
</div>
......@@ -498,7 +498,6 @@ export default defineComponent({
menu.value = 5
const methods = {
changeKeyword(val: String) {
console.log(val,'====')
if(data.typeMap==1){
data.msg.GetonAddress = data.Address+val
}if(data.typeMap==2){
......
......@@ -114,7 +114,7 @@ export default defineComponent({
if(!accountRefVal.value.hasError){
data.loading=true
//hasError
UserService.sendVerify({account:data.account,platform:0}).then(r=>{
UserService.sendVerify({account:data.account,platform:3}).then(r=>{
console.log(r)
data.loading=false
if(r.data.resultCode==ApiResult.SUCCESS){
......
......@@ -39,7 +39,8 @@ export default defineComponent({
PriceLevel: 0,
Supplier: 0,
MaxPrice: '',
MinPrice: ''
MinPrice: '',
HotelName: ''
})
provide(DirtionmaryHelper.HOTEL_QUERY_PARAM, search)
......
<template>
<div class="fix-height-subpage column no-wrap q-pa-md">
<trip-order-header></trip-order-header>
<trip-order-list></trip-order-list>
</div>
</template>
<script lang="ts">
import Store from '../../store'
import { defineComponent, inject, provide, reactive, toRefs, onMounted } from 'vue'
import { currentRouter } from 'src/router'
import useMetaModule from '../../module/meta/metaModule'
import { useI18n } from 'vue-i18n'
import TripOrderHeader from 'src/components/trip/order/TripOrderHeader.vue'
import { DirtionmaryHelper } from 'src/config/dictionary'
import TripOrderList from 'src/components/trip/order/TripOrderList.vue'
export default defineComponent({
components: {TripOrderHeader, TripOrderList},
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)
let CustomerId
if (Store.state && Store.state.user?.userDetail) {
CustomerId = Store.state.user?.userDetail?.customerId
}
const search = reactive({
orderType: 1,//1跟团订单
queryDays: 0,//10天内
orderState: -1,//订单状态
CustomerId: CustomerId,//用户id
})
// search.OrderId = currentRouter.currentRoute.value.params.orderId
provide(DirtionmaryHelper.TICKET_ORDER_SEARCH, search)
const menu = inject(DirtionmaryHelper.MENU_KEYS) as any
menu.value = 18
const data = reactive({})
const methods = {}
onMounted(() => {})
return { ...toRefs(data), ...methods, search }
}
})
</script>
<style></style>
This diff is collapsed.
This diff is collapsed.
......@@ -6,7 +6,7 @@
:style="{ transform: stickyHeight }">
<div style="max-width: 1200px; margin-left: auto; margin-right: auto" :class="{ 'q-px-md': $q.screen.width < 1220 }" class="q-py-sm row items-center">
<span class="col product-price text-subtitle1 text-weight-bold" style="text-align: left">
<span>CNY {{ moneyFormat(dataList.priceList[0].originalB2CPrice, 0) }}</span>
<span>CNY {{ dataList.priceList[0].originalB2BPrice }}</span>
<span class="q-ml-sm f12 text-grey-7">{{$t('v103.details.since')}}</span>
</span>
<q-btn color="primary" unelevated class="q-px-xl" :label="$t('v103.details.selectionscheme')" @click="goScrollHandler(priceListHeight)" />
......@@ -64,7 +64,7 @@
class="q-mr-sm"
/>
<span
>日本 -
>{{dataList.aimPlaceName}} -
<span v-for="(x, i) in citys" :key="i">
<span class="cursor-pointer">{{ x }} </span>
......@@ -83,14 +83,14 @@
class="transparent q-mr-xl no-padding"
square
icon="iconfont icontime"
:label="` ${$t('v103.details.headerlabel.d2')} ${dataList.dayList.length} ${$t('v103.details.headerlabel.d21')}`"
:label="` ${$t('v103.details.headerlabel.d2')} ${dataList.dayNum} ${$t('v103.details.headerlabel.d21')}`"
/>
<q-chip
<!-- <q-chip
class="transparent q-mr-xl no-padding"
square
icon="iconfont iconnetwork-fill"
:label="$t('v103.details.headerlabel.d3')"
/>
/> -->
<q-chip
class="transparent q-mr-xl no-padding"
square
......@@ -109,8 +109,7 @@
class="product-price text-h6"
v-if="dataList.priceList.length > 0"
>
<!-- CNY:{{ dataList. }} -->
CNY:{{ moneyFormat(dataList.priceList[0].originalB2CPrice, 0) }}
CNY:{{ dataList.priceList[0].originalB2BPrice }}
<span class="f12 text-grey-6">{{$t('v103.details.since')}}</span>
</div>
<div v-else class="text-subtitle1 text-grey-6">{{$t('v103.details.nooffer')}}</div>
......@@ -146,6 +145,7 @@
</q-field>
<template v-if="currentPrice&&currentPrice.startDate">
<order-preview class="q-pa-md"
:msg="msg"
:price="currentPrice"
@reset="resetHandler"
></order-preview>
......@@ -169,8 +169,8 @@
</div>
<div class="" v-if="$q.platform.is.desktop">
<div class="row items-center">
<span class="product-price text-h6 q-mr-md">CNY {{ moneyFormat(dataList.priceList[0].originalB2CPrice, 0) }}</span>
<q-btn color="primary" outline :label="showOrderPreview ? $t('v103.details.deselect') : $t('v103.details.choose')" @click="showOrderPreview = !showOrderPreview" class="q-px-lg" />
<span class="product-price text-h6 q-mr-md">CNY {{ dataList.priceList[0].originalB2BPrice }}</span>
<q-btn color="primary" outline :label="showOrderPreview ? $t('v103.details.deselect') : $t('v103.details.choose')" @click="changeShowOrderPreviewHandler" class="q-px-lg" />
</div>
<div class="text-info q-mt-md text-right">{{$t('v103.details.earliest')}}:{{ dataList.priceList[0].startDate }}</div>
</div>
......@@ -186,7 +186,10 @@
<calendar :priceList="dataList.priceList" @change="changeChosenDateHandler" ref="calendarRef"></calendar>
</div>
<div class="col q-ml-xl">
<order-preview :price="currentPrice" @reset="resetHandler"></order-preview>
<order-preview
:msg="msg"
:price="currentPrice"
@reset="resetHandler"></order-preview>
</div>
</div>
</div>
......@@ -417,6 +420,17 @@ export default defineComponent({
data.days = n
},{immediate: true,deep: true})
const methods = {
changeShowOrderPreviewHandler() {
data.showOrderPreview = !data.showOrderPreview;
if (!data.showOrderPreview) {
if (data.currentPrice) {
data.currentPrice.isSupportChildren = null;
data.currentPrice.unionCityList = null;
data.currentPrice.singleRoomPrice = 0;
data.currentPrice.originalB2BPrice = 0;
}
}
},
getTopNum(x){
data.days = JSON.parse(x)
},
......@@ -435,13 +449,7 @@ export default defineComponent({
})
},
handleScroll(e) {
// console.log(document.querySelector('#scrollId .q-scrollarea__container').scrollTop, '...............')
let temp = document.querySelector('#scrollId .q-scrollarea__container').scrollTop
// if(temp-data.currentHeight>0){
// data.scrollDirection='down'
// }else{
// data.scrollDirection='up'
// }
data.stickyHeight = document.querySelector('.q-header--hidden') ? 'translateY(0px)' : 'translateY(0px)'
data.currentHeight = temp
if (data.videoPosition > 0 && data.videoPosition < data.currentHeight && data.options.currentPage == 0 && !data.isPictureInPicture) {
......@@ -459,6 +467,7 @@ export default defineComponent({
document.querySelector('#scrollId .q-scrollarea__container').removeEventListener('scroll', methods.handleScroll)
}
let nowTop =document.querySelector('#scrollId .q-scrollarea__container').scrollTop
data.scrollareaobj.pagesTop = nowTop
if (nowTop > 200) {
data.isShowTop = true
} else {
......@@ -582,10 +591,10 @@ export default defineComponent({
})
}, 1000)
})
}
} else {
message.errorMsg(r.data.message)
}
}
})
.catch(e => {
$q.loading.hide()
......
......@@ -677,6 +677,7 @@
}
.desktop-page{
max-width:1200px;
min-width: 900px;
margin:0 auto;
}
</style>
......@@ -702,6 +703,7 @@ import { date,useQuasar } from "quasar";
import { provide,inject, reactive, toRefs, defineComponent,ref,watch, getCurrentInstance } from 'vue';
import { useI18n } from 'vue-i18n'
import { DirtionmaryHelper } from 'src/config/dictionary'
import useMetaModule from '../../module/meta/metaModule'
import search from 'src/components/searchdata/search.vue'
import rightList from 'src/components/searchdata/rightList.vue'
export default defineComponent({
......@@ -711,15 +713,21 @@ export default defineComponent({
const { t } = useI18n()
const $q = useQuasar()
let {ctx:that, proxy} = getCurrentInstance()
let { setTitle } = useMetaModule()
const pageTitle = inject(DirtionmaryHelper.PAGE_TITLE_KEY) as any
pageTitle.value = '預訂行程'
setTitle(pageTitle.value)
const data= reactive({
})
const search = reactive({
RetrievalState: false,
datesId: 0,
DayId: 0,
chosenAddress: [] as Array<any>,//右边目的地
deleteChosen: null as any,//右侧删除目的地
msg:{
cityId: 0,
cityId: 0,//当前城市id
companyId: 0,
startDate: "", //开始日期
endDate: "", //结束日期
......@@ -727,19 +735,19 @@ export default defineComponent({
lineTeamId: 0, //系列编号
minPrice: "0", //最低价格
maxPrice: "100000", //最高价格
minTripDay: "", //最低行程
minTripDay: "", //最低行程
maxTripDay: "", //最高行程天数
orderByDate: 0,
orderByPrice: 0,
orderBySales: 0,
priceOrderByField: 4,
searchKey: "",
startCityId: 0,
priceOrderByField: 2,//1同业会员价 2同业价格 3直客会员价 4直客价格
searchKey: "",//关键词搜索
startCityId: 0,//出发城市id
teamType: [],
priceRange:{
min: 1,
max: 100000,
}
},
}
})
provide(DirtionmaryHelper.TICKET_QUERY_PARAM, search)
......@@ -773,6 +781,6 @@ export default defineComponent({
letter-spacing: 1px;
}
.addr-list:hover {
background: #f1416c1a;
background: #E1F5FE;
}
</style>
This diff is collapsed.
This diff is collapsed.
<template>
<div class="rounded-borders bg-white row items-center q-pa-md">
<q-field :class="$q.platform.is.desktop ? '' : 'q-mb-md'" stack-label :label="$t('daterange')" standout class="q-ml-lg 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>
<q-input class="q-mr-md q-ml-md" v-model="search.TCID" dense standout label="团号"/>
<div class="col"></div>
<q-btn color="primary" unelevated :label="$t('query')" @click="setQueryHandler"/>
</div>
</template>
<script lang="ts">
import { DirtionmaryHelper } from '../../../config/dictionary'
import { defineComponent, inject, reactive, ref } from 'vue'
import { date } from 'quasar'
export default defineComponent({
setup(props) {
const qDateProxy = ref(null) as any
const realSearch = inject(DirtionmaryHelper.TRAVEL_ORDER_OBJ) as any
const search = reactive(JSON.parse(JSON.stringify(realSearch)))
const dateRange = reactive({from: '', to: ''})
dateRange.to = date.formatDate(date.addToDate(new Date(), { days: 50 }), 'YYYY/MM/DD')
dateRange.from = date.formatDate(date.addToDate(new Date(), { days: 20 }), 'YYYY/MM/DD')
const dateRangeFormat = ref(`${dateRange.from} - ${dateRange.to}`)
search.StartTime = dateRange.from
search.EndTime = dateRange.to
const methods = {
setQueryHandler(){
realSearch.StartTime=search.StartTime
realSearch.EndTime=search.EndTime
realSearch.TCID=search.TCID
},
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} `
dateRangeFormat.value = `${search.StartTime} - ${search.EndTime} `
if (qDateProxy.value) qDateProxy.value.hide()
},
optionsFn(cd: any) {
return cd >= date.formatDate(date.addToDate(new Date(), { days: 20 }), 'YYYY/MM/DD')
},
}
return {
...methods,
search,
dateRange,
dateRangeFormat
}
}
})
</script>
<style></style>
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
......@@ -29,7 +29,8 @@
StartTime: "",
EndTime: '',
OrderId: props.OrderId,
OrderNo: ''
OrderNo: '',
OfferState: 0
}
})
provide(DirtionmaryHelper.TICKET_QUERY_PARAM, search)
......
This diff is collapsed.
......@@ -34,7 +34,9 @@ const routes: RouteRecordRaw[] = [
{ path: '/scheduledTrip/index', component: () => import('pages/scheduledTrip/scheduledTripList.vue') },//预定行程
{ path: '/scheduledTrip/details/:id/:tcid', component: () => import('pages/scheduledTrip/detailsNew.vue') },
{ path: '/scheduledTrip/preview/:tripId', component: () => import('pages/scheduledTrip/TripOrderPreview.vue') },
{ path: '/scheduledTrip/order/:orderId?', component: () => import('pages/scheduledTrip/TripOrder.vue') },
{ path: '/travel/order', component: () => import('pages/travel/order.vue') },
]
},
{
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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