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 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">
<span class="text-weight-bold text-primary q-mr-sm">{{
TotalCount
}}</span>
<span>{{$t('v103.scheduledTrip.experiencetrip')}}</span>
</div>
<q-chip
v-for="(x, i) in chosenAddress"
size="13px"
:key="i"
removable
outline
color="grey"
:label="x.Name"
@remove="removeChosen(x,i)"
/>
<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-if="i!=0"
size="13px"
:key="i"
removable
outline
color="grey"
: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,22 +412,22 @@ 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.df
data.chosenObj.crCount + data.chosenObj.etzcCount <
data.chosenObj.df
) {
data.chosenObj[m] = data.chosenObj[m] - 1;
}
......@@ -353,14 +435,15 @@ 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;
let sumCount =
data.chosenObj.crCount +
data.chosenObj.etCount +
......
......@@ -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,60 +1045,61 @@ export default {
rtt: '制限を撤廃します',
td: '団訂です',
bianji: '編集を確定します',
sjc:{
c1:'名前」です',
c1x: '姓です',
c1m:'名前です',
c2:'電話です',
c3:'性別」です',
c4:'連絡先です',
c5:'乗車場所です',
c6:'降ります',
c7:'所定の時間を選択します',
c8:'予定時間です',
c9: '航厦です',
c10:'航空会社の名前です',
c11:'便名」です',
c12:'到着時間です',
c13:'出発時間です',
c14: '大人の数です',
c15: '子供の数です',
c16: '赤ちゃんの数です',
c17: '手荷物数です',
c18: '託送手荷物数です',
c19: '製品名です',
c20: '空港です',
c21: '大人です',
c22: '子供です',
c23: '赤ちゃんです',
c24: '乗降場です',
c25: '乗ります',
c26: '降ります',
c27: '手に荷物を持ちます',
c28: '手荷物を預けます',
c29: '人員です',
c30: '人です',
c31: 'お荷物です',
},
sjcp:{
c1: '姓を入力してください」です',
c1m: '名前を入力してくださいです',
c2: '電話です',
c3: '性別」です',
c4: '連絡先(Line番号、WeChat番号)です',
c5: '乗車場所を入力してくださいです',
c6: '下車場所を入力してくださいです',
c7: '航厦を入力してください',
c8: '航空会社名を入力します',
c9: '便名を入力します',
c10: 'フライトタイムです',
c11: '人数を入力してくださいです',
c12: '子供の数を入力します',
c13: '赤ちゃんの数を入力します',
c14: '手荷物数を入力します',
c15: '手荷物数を入力します',
}
},
sjc:{
c1:'名前」です',
c1x: '姓です',
c1m:'名前です',
c2:'電話です',
c3:'性別」です',
c4:'連絡先です',
c5:'乗車場所です',
c6:'降ります',
c7:'所定の時間を選択します',
c8:'予定時間です',
c9: '航厦です',
c10:'航空会社の名前です',
c11:'便名」です',
c12:'到着時間です',
c13:'出発時間です',
c14: '大人の数です',
c15: '子供の数です',
c16: '赤ちゃんの数です',
c17: '手荷物数です',
c18: '託送手荷物数です',
c19: '製品名です',
c20: '空港です',
c21: '大人です',
c22: '子供です',
c23: '赤ちゃんです',
c24: '乗降場です',
c25: '乗ります',
c26: '降ります',
c27: '手に荷物を持ちます',
c28: '手荷物を預けます',
c29: '人員です',
c30: '人です',
c31: 'お荷物です',
},
sjcp:{
c1: '姓を入力してください」です',
c1m: '名前を入力してくださいです',
c2: '電話です',
c3: '性別」です',
c4: '連絡先(Line番号、WeChat番号)です',
c5: '乗車場所を入力してくださいです',
c6: '下車場所を入力してくださいです',
c7: '航厦を入力してください',
c8: '航空会社名を入力します',
c9: '便名を入力します',
c10: 'フライトタイムです',
c11: '人数を入力してくださいです',
c12: '子供の数を入力します',
c13: '赤ちゃんの数を入力します',
c14: '手荷物数を入力します',
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.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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