Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
B
bigwood
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
罗超
bigwood
Commits
f37f6c2b
Commit
f37f6c2b
authored
Aug 24, 2023
by
沈良进
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
新增页面
parent
597da35f
Show whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
1231 additions
and
37 deletions
+1231
-37
DetailsList.vue
src/components/scattered/dida/DetailsList.vue
+416
-0
DidaHeader.vue
src/components/scattered/dida/DidaHeader.vue
+313
-0
DidaListTable.vue
src/components/scattered/dida/DidaListTable.vue
+285
-0
index.ts
src/i18n/ja-RB/index.ts
+2
-1
index.ts
src/i18n/ko-HG/index.ts
+2
-1
index.ts
src/i18n/zh-SW/index.ts
+2
-1
index.ts
src/i18n/zh-TW/index.ts
+2
-1
didaHotel.vue
src/pages/scattered/didaHotel.vue
+81
-0
routes.ts
src/router/routes.ts
+122
-33
menus.ts
src/utils/menus.ts
+6
-0
No files found.
src/components/scattered/dida/DetailsList.vue
0 → 100644
View file @
f37f6c2b
<
template
>
<div
class=
"rounded-borders bg-white row items-center q-pb-md"
>
<q-field
stack-label
:label=
"$t('v101.scatteredDetails.ruzhuTime')+'/'+$t('v101.scatteredDetails.tuifangTime')"
standout
class=
"col-2"
style=
"min-width: 200px"
dense
>
<div
class=
"self-center full-width no-outline"
tabindex=
"0"
>
{{
dateRangeFormat
}}
</div>
<q-popup-proxy
:offset=
"[0, 10]"
ref=
"qDateProxy"
>
<q-date
v-model=
"dateRange"
:options=
"optionsFn"
range
mask=
"YYYY/MM/DD"
landscape
@
range-end=
"dateRangeHandler"
></q-date>
</q-popup-proxy>
</q-field>
<div
class=
"row"
:class=
"
{'q-mt-sm':$q.platform.is.mobile}">
<q-select
:class=
"
{'q-ml-lg':$q.platform.is.desktop}" style="min-width: 90px;z-index: 99999;" unelevated v-model="room" dense :options="theRooms" emit-value option-label="name" option-value="id" map-options :label="$t('v101.scattered.kefang')" standout @update:model-value="getRoomList">
</q-select>
<q-btn
unelevated
class=
"bg-white hover q-px-xs q-py-sm q-ml-xs text-grey-6"
icon=
"person"
>
<div
class=
"text-dark q-ml-xs"
>
{{
auditNum
}}{{
$t
(
'v101.scattered.chengren'
)
}}
<span
class=
"q-px-sm"
>
.
</span>
<template
v-if=
"childNum>0"
>
{{
childNum
}}
</
template
>
{{$t('v101.scattered.ertong')}}
</div>
<q-popup-proxy
class=
"no-shadow absolute"
style=
"z-index: 0;box-shadow: 0 0 50px #ddd !important"
:offset=
"[0, 20]"
:model-value=
"isShowPop"
>
<q-card
class=
"row wrap q-pa-md rounded-borders"
style=
"max-width:697px;"
>
<div
class=
"q-mr-md"
v-for=
"(item,index) in search.searchroomGroup"
:key=
"index"
style=
"min-width: 150px;"
>
<div
class=
"q-mb-md text-subtitle2"
>
{{ $t('v101.scattered.kefang') }}{{index+1}}
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"item.numberOfAdults"
dense
:options=
"adultList"
emit-value
map-options
:label=
"$t('v101.scattered.chengren')"
standout
@
update:model-value=
"setPeopleNum"
/>
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"item.numberOfChildren"
dense
:options=
"childrenList"
emit-value
map-options
:label=
"$t('v101.scattered.ertong')"
standout
@
update:model-value=
"setPeopleNum"
/>
</div>
</div>
</q-card>
</q-popup-proxy>
</q-btn>
</div>
<div
class=
"q-pl-lg text-red-6 row items-center"
style=
"position: relative;"
v-if=
"$q.platform.is.desktop"
>
<q-icon
class=
"absolute"
style=
"left: 85px;top: 0;"
name=
"information"
size=
"18px"
></q-icon>
<span
class=
"q-pl-lg"
>
{{ $t('v101.scatteredDetails.prompt') }}
</span>
</div>
<div
class=
"col"
></div>
<q-btn
color=
"primary"
unelevated
:label=
"$t('query')"
:loading=
"loading"
@
click=
"initHotel"
/>
</div>
<div
class=
"q-pl-lg q-pb-lg text-red-6 row items-center"
style=
"position: relative;"
v-if=
"$q.platform.is.mobile"
>
<q-icon
class=
"absolute"
style=
"left: 65px;top: 0;"
name=
"information"
size=
"18px"
></q-icon>
<span
class=
"q-pl-sm"
>
{{ $t('v101.scatteredDetails.prompt') }}
</span>
</div>
<div
class=
"bg-light-blue-1 q-pa-md fz14 rounded-borders row items-center"
>
<div
class=
"text-weight-bold"
>
{{ $t('v101.scatteredDetails.fuheTJroom') }}
</div>
</div>
<div
class=
"q-my-md"
>
<
template
v-if=
"SimilarList&&SimilarList.length>0"
>
<q-card
class=
"row q-mb-md"
v-for=
"(item,index) in SimilarList"
:key=
"index"
v-loading=
"loading"
>
<div
class=
"col q-pa-sm q-pr-lg"
:class=
"
{'col-3 row no-wrap justify-between': $q.platform.is.desktop,'col-4 column': $q.platform.is.mobile}" :style="{'border-right': $q.platform.is.desktop?'1px solid #eeeeee':''}">
<div
v-if=
"$q.platform.is.desktop"
:class=
"
{'col-6':$q.platform.is.desktop,'col-12':$q.platform.is.mobile}" :style="{'height':$q.platform.is.desktop?'100px':'50px'}">
<q-img
:src=
"item.roomImageURL"
:style=
"
{'height':$q.platform.is.desktop?'100%':'50px'}" spinner-color="drk" spinner-size="20px" mode="cover"/>
</div>
<div
class=
"col column"
:class=
"
{'q-pl-xs':$q.platform.is.desktop}">
<div
class=
"text-right text-green q-pt-md"
>
{{
getGradeType
(
item
.
gradeType
)
}}{{
getRoomType
(
item
.
roomType
)
}}
</div>
<div
class=
"row no-wrap justify-end q-pt-md text-right"
>
<span
class=
"text-blue bg-blue-1 q-px-sm q-mr-sm"
style=
"white-space: nowrap;"
>
<template
v-if=
"item.smoking==0"
>
{{
$t
(
'v101.scatteredDetails.jinyan'
)
}}
</
template
>
<
template
v-if=
"item.smoking==1"
>
{{
$t
(
'v101.scatteredDetails.kexiyan'
)
}}
</
template
>
</span>
<span
class=
"text-blue bg-blue-1 q-px-sm"
style=
"white-space: nowrap;"
>
<
template
v-if=
"item.withBath==0"
>
{{
$t
(
'v101.scatteredDetails.wuyushi'
)
}}
</
template
>
<
template
v-if=
"item.withBath==1"
>
{{
$t
(
'v101.scatteredDetails.youyushi'
)
}}
</
template
>
</span>
</div>
</div>
</div>
<div
class=
"col"
:style=
"{'border-left': $q.platform.is.mobile?'1px solid #eeeeee':''}"
>
<div
class=
"relative-position"
v-for=
"(subItem,subIndex) in item.roomOptions"
:key=
"subIndex"
>
<q-separator
v-if=
"subIndex!=0"
/>
<div
class=
"col q-ml-lg q-pt-lg q-pb-md q-pr-md"
>
<div
class=
"col q-pt-sm"
:class=
"{'row items-center no-wrap': $q.platform.is.desktop,'common': $q.platform.is.mobile}"
>
<div
class=
"absolute text-white q-px-lg"
style=
"left: 0;top: 0;border-bottom-right-radius: 10px;"
:class=
"getMealType(subItem.meals)==ScatMeaList[0].name?'HD_Black':'HD_Green'"
>
{{getMealType(subItem.meals)}}
</div>
<div
class=
"col-2 text-grey-6"
v-if=
"$q.platform.is.desktop"
>
{{subItem.bookingDeadline}}
</div>
<div
class=
"col-3"
:class=
"{'q-pl-lg':$q.platform.is.desktop}"
v-if=
"$q.platform.is.desktop"
>
{{subItem.minNights}}
</div>
<div
class=
"row text-red"
:class=
"{'col q-pl-lg':$q.platform.is.desktop}"
v-if=
"$q.platform.is.desktop"
>
<div
class=
"column"
>
<span
class=
"wrap-title"
>
{{$t('v101.scatteredDetails.Time1')}}
</span>
<span>
{{subItem['check-inStartTime']}}
</span>
</div>
<div
class=
"column q-pl-md q-pr-md"
>
<span
class=
"wrap-title"
>
{{$t('v101.scatteredDetails.Time2')}}
</span>
<span>
{{subItem['finalCheck-inTime']}}
</span>
</div>
<div
class=
"column"
>
<span
class=
"wrap-title"
>
{{$t('v101.scatteredDetails.Time3')}}
</span>
<span>
{{subItem['finalCheck-outTime']}}
</span>
</div>
</div>
<div
class=
"row no-wrap justify-end items-center"
:class=
"{'q-pl-lg':$q.platform.is.desktop}"
>
<div
class=
"row no-wrap items-center q-pr-lg"
>
<span
class=
"text-grey-6"
>
円
</span>
<span
class=
"fz20 text-red q-px-sm"
>
{{getPrice(subItem.chargeableRateInfoPerPersonForANightBySetCurrency)}}
</span>
<span
class=
"text-grey-6"
>
/{{$t('v101.scatteredDetails.renju')}}
</span>
</div>
<div
class=
"q-pt-xs"
>
<q-btn
class=
"bg-green-6 hover q-px-md q-py-xs q-ml-xs text-white"
@
click=
"goUrl('/scattered/HotelSure',subItem)"
:label=
"$t('v101.scatteredDetails.yuyue')"
/>
</div>
</div>
</div>
<div
class=
"q-pt-sm"
>
<span
class=
"text-green fz12 q-px-sm"
style=
"border:1px solid green"
>
{{subItem.minNights}}
</span>
</div>
</div>
</div>
</div>
</q-card>
</template>
<div
v-else
class=
"col q-pa-lg text-center"
>
{{$t('noneData')}}
</div>
</div>
</template>
<
script
lang=
"ts"
>
import
{
useRouter
}
from
'vue-router'
import
{
useI18n
}
from
'vue-i18n'
import
svgIcon
from
'../../global/svg-icon.vue'
import
{
computed
,
inject
,
provide
,
reactive
,
ref
,
toRefs
,
defineComponent
,
onMounted
,
watch
}
from
'vue'
import
HotelService
from
'../../../api/scattered'
import
message
from
'../../../utils/message'
import
{
ApiResult
}
from
'../../../@types/enumHelper'
import
{
date
}
from
'quasar'
import
{
HotelRate
,
HotelArea
,
useHotel
}
from
'../../../utils/hotelRate'
import
{
useQuasar
}
from
'quasar'
import
useScrollModule
from
'../../../module/scrollbar/scrollModule'
import
{
DirtionmaryHelper
}
from
'../../../config/dictionary'
import
{
moneyFormat
}
from
'../../../utils/tools'
export
default
defineComponent
({
components
:
{
svgIcon
},
props
:[
''
],
setup
(
props
,
context
)
{
const
$router
=
useRouter
()
const
$q
=
useQuasar
()
const
qDateProxy
=
ref
(
null
)
as
any
const
qNameProxy
=
ref
(
null
)
as
any
const
{
locale
,
t
}
=
useI18n
()
const
data
=
reactive
({
scrollStyle
:
{}
as
any
,
Areas
:
[]
as
Array
<
HotelArea
>
,
//区域
cascader
:
{
addressValue
:
null
}
as
any
,
dateRange
:
{}
as
any
,
//当前日期
dateRangeFormat
:
''
,
//可选日期
loading
:
false
,
canHide
:
false
,
//更多筛选
theRooms
:
[]
as
Array
<
Number
>
,
//客房下拉
room
:
1
,
//客房数
auditNum
:
1
,
childNum
:
null
as
any
,
adultList
:
[]
as
Array
<
Number
>
,
//成人下拉
childrenList
:
[]
as
Array
<
Number
>
,
//儿童下拉
isShowPop
:
false
,
//房间
SimilarList
:
[]
as
Array
<
any
>
,
JapanIncrease
:
0
,
//除以
RoomTypeList
:
[]
as
Array
<
HotelArea
>
,
//房间等级
scatteredRoomTypeList
:
[]
as
Array
<
HotelArea
>
,
//散客房间类型
ScatMeaList
:
[]
as
Array
<
HotelArea
>
//散客房间餐型
})
for
(
let
i
=
1
;
i
<
11
;
i
++
){
data
.
theRooms
.
push
(
i
)
}
for
(
let
i
=
1
;
i
<
10
;
i
++
){
data
.
adultList
.
push
(
i
)
}
for
(
let
i
=
0
;
i
<
6
;
i
++
){
data
.
childrenList
.
push
(
i
)
}
data
.
scrollStyle
=
useScrollModule
().
scrollStyle
const
search
=
inject
(
DirtionmaryHelper
.
HOTEL_QUERY_PARAM
)
as
any
if
(
search
.
searchroomGroup
&&
search
.
searchroomGroup
.
length
==
0
){
search
.
searchroomGroup
.
push
({
roomNum
:
1
,
numberOfAdults
:
1
,
numberOfChildren
:
0
})
}
let
getParamsMsg
=
JSON
.
parse
(
localStorage
.
getItem
(
DirtionmaryHelper
.
SCATTERED_HOTEL_DATE
))
data
.
auditNum
=
getParamsMsg
.
auditNum
data
.
childNum
=
getParamsMsg
.
childNum
?
getParamsMsg
.
childNum
:
''
data
.
room
=
data
.
theRooms
[
search
.
searchroomGroup
.
length
-
1
]
// data.dateRange.to = date.formatDate(date.addToDate(new Date(), { days: 9 }), 'YYYY/MM/DD')
// data.dateRange.from = date.formatDate(date.addToDate(new Date(), { days: 8 }), 'YYYY/MM/DD')
// data.dateRangeFormat = `${data.dateRange.from} - ${data.dateRange.to}`
// search.arrivalDate = data.dateRange.from
// search.departureDate = data.dateRange.to
data
.
dateRange
.
to
=
search
.
arrivalDate
data
.
dateRange
.
from
=
search
.
departureDate
data
.
dateRangeFormat
=
`
${
search
.
arrivalDate
}
-
${
search
.
departureDate
}
`
data
.
RoomTypeList
=
useHotel
.
getHotelRoomType
()
data
.
scatteredRoomTypeList
=
useHotel
.
getHotelScatRoom
()
data
.
ScatMeaList
=
useHotel
.
getHotelScatMeal
()
const
methods
=
{
goUrl
(
url
:
stringify
,
row
:
{}){
url
=
`
${
url
}
/
${
search
.
hotelId
}
/
${
row
.
roomOptionCd
}
`
let
d
=
{
room
:
data
.
room
,
auditNum
:
data
.
auditNum
,
childNum
:
data
.
childNum
,
}
context
.
emit
(
'goUrl'
,
url
,
d
)
// window.open(url, '_blank')
// $router.push({ path:url })
},
getPrice
(
price
){
return
Math
.
ceil
(
price
/
data
.
JapanIncrease
)
},
//获取餐
getMealType
(
meals
)
{
if
(
meals
!=
""
)
{
let
mealType
=
meals
.
split
(
","
);
if
(
mealType
[
0
]
==
0
&&
mealType
[
2
]
==
0
)
{
return
data
.
ScatMeaList
[
0
].
name
;
}
if
(
mealType
[
0
]
==
1
&&
mealType
[
2
]
==
1
)
{
return
data
.
ScatMeaList
[
1
].
name
;
}
if
(
mealType
[
0
]
==
1
&&
mealType
[
2
]
==
0
)
{
return
data
.
ScatMeaList
[
2
].
name
;
}
if
(
mealType
[
0
]
==
0
&&
mealType
[
2
]
==
1
)
{
return
data
.
ScatMeaList
[
30
].
name
;
}
}
},
//获取房间等级
getRoomType
(
type
)
{
let
gradeType
=
""
;
switch
(
parseInt
(
type
))
{
case
1
:
gradeType
=
data
.
scatteredRoomTypeList
[
0
].
name
;
break
;
case
2
:
gradeType
=
data
.
scatteredRoomTypeList
[
1
].
name
;
break
;
case
3
:
gradeType
=
data
.
scatteredRoomTypeList
[
2
].
name
;
break
;
case
4
:
gradeType
=
data
.
scatteredRoomTypeList
[
3
].
name
;
break
;
case
5
:
gradeType
=
data
.
scatteredRoomTypeList
[
4
].
name
;
break
;
case
6
:
gradeType
=
data
.
scatteredRoomTypeList
[
5
].
name
;
break
;
case
7
:
gradeType
=
data
.
scatteredRoomTypeList
[
6
].
name
;
break
;
case
8
:
gradeType
=
data
.
scatteredRoomTypeList
[
7
].
name
;
break
;
case
9
:
gradeType
=
data
.
scatteredRoomTypeList
[
8
].
name
;
break
;
}
return
gradeType
;
},
//获取房型
getGradeType
(
type
)
{
let
gradeType
=
""
;
switch
(
parseInt
(
type
))
{
case
1
:
gradeType
=
data
.
RoomTypeList
[
0
].
name
;
break
;
case
2
:
gradeType
=
data
.
RoomTypeList
[
1
].
name
;
break
;
case
3
:
gradeType
=
data
.
RoomTypeList
[
2
].
name
;
break
;
case
4
:
gradeType
=
data
.
RoomTypeList
[
3
].
name
;
break
;
case
5
:
gradeType
=
data
.
RoomTypeList
[
4
].
name
;
break
;
case
6
:
gradeType
=
data
.
RoomTypeList
[
5
].
name
;
break
;
}
return
gradeType
;
},
initHotel
()
{
data
.
loading
=
true
let
param
=
Object
.
assign
(
search
)
HotelService
.
GetHotelRoomsList
(
param
)
.
then
(
r
=>
{
data
.
SimilarList
=
[]
as
Array
<
any
>
if
(
r
.
data
.
resultCode
==
ApiResult
.
SUCCESS
)
{
if
(
Object
.
prototype
.
toString
.
call
(
r
.
data
.
data
.
roomRateDetails
)
==
"[object Object]"
)
{
data
.
SimilarList
.
push
(
r
.
data
.
data
.
roomRateDetails
);
}
else
{
data
.
SimilarList
=
r
.
data
.
data
.
roomRateDetails
;
}
data
.
SimilarList
.
forEach
(
x
=>
{
if
(
Object
.
prototype
.
toString
.
call
(
x
.
roomOptions
)
==
"[object Object]"
)
{
let
arr
=
[];
arr
.
push
(
x
.
roomOptions
);
x
.
roomOptions
=
arr
;
}
});
data
.
JapanIncrease
=
r
.
data
.
data
.
JapanIncrease
;
}
data
.
loading
=
false
}).
catch
(
e
=>
{
data
.
loading
=
false
message
.
errorMsg
(
e
.
message
)
})
},
//设置房间里面成人数改变总成人数和儿童数
setPeopleNum
()
{
data
.
auditNum
=
0
;
data
.
childNum
=
0
;
search
.
searchroomGroup
.
forEach
(
x
=>
{
data
.
auditNum
+=
x
.
numberOfAdults
;
data
.
childNum
+=
x
.
numberOfChildren
;
})
if
(
data
.
auditNum
==
null
||
data
.
auditNum
==
undefined
)
{
data
.
auditNum
=
1
}
if
(
data
.
childNum
==
null
||
data
.
childNum
==
undefined
)
{
data
.
childNum
=
1
}
},
//房间数改变
getRoomList
(
roomNum
)
{
let
length
=
search
.
searchroomGroup
.
length
if
(
roomNum
>
length
){
for
(
let
i
=
1
;
i
<=
roomNum
-
length
;
i
++
)
{
let
obj
=
{
roomNum
:
i
,
numberOfAdults
:
1
,
numberOfChildren
:
0
}
search
.
searchroomGroup
.
push
(
obj
);
}
}
else
{
search
.
searchroomGroup
=
search
.
searchroomGroup
.
filter
((
x
:
any
,
i
:
Number
)
=>
{
if
(
roomNum
>
i
)
return
x
})
}
data
.
auditNum
=
0
;
data
.
childNum
=
0
;
search
.
searchroomGroup
.
forEach
(
x
=>
{
data
.
auditNum
+=
x
.
numberOfAdults
;
data
.
childNum
+=
x
.
numberOfChildren
;
})
data
.
isShowPop
=
true
search
.
auditNum
=
data
.
auditNum
;
search
.
childNum
=
data
.
childNum
;
},
dateRangeHandler
(
e
:
any
)
{
search
.
arrivalDate
=
`
${
e
.
from
.
year
}
/
${
e
.
from
.
month
}
/
${
e
.
from
.
day
}
`
if
(
search
.
arrivalDate
!=
`
${
e
.
to
.
year
}
/
${
e
.
to
.
month
}
/
${
e
.
to
.
day
}
`
){
search
.
departureDate
=
`
${
e
.
to
.
year
}
/
${
e
.
to
.
month
}
/
${
e
.
to
.
day
}
`
data
.
dateRangeFormat
=
`
${
search
.
arrivalDate
}
-
${
search
.
departureDate
}
`
if
(
qDateProxy
.
value
)
qDateProxy
.
value
.
hide
()
}
else
{
// message.errorMsg(`${t('v101.scatteredDetails.timeTis')}`)
}
},
optionsFn
(
cd
:
any
)
{
return
cd
>=
date
.
formatDate
(
date
.
addToDate
(
new
Date
(),
{
days
:
8
}),
'YYYY/MM/DD'
)
},
}
watch
(
search
.
searchroomGroup
,
(
n
,
o
)
=>
{
})
onMounted
(()
=>
{
methods
.
initHotel
()
})
return
{
...
toRefs
(
data
),
...
methods
,
qDateProxy
,
qNameProxy
,
search
,
}
}
})
</
script
>
<
style
>
.wrap-title
{
/* width: 33.33%; */
overflow
:
hidden
;
white-space
:
wrap
;
}
.HD_Black
{
background-color
:
black
;
}
.HD_Green
{
background-color
:
green
;
}
</
style
>
\ No newline at end of file
src/components/scattered/dida/DidaHeader.vue
0 → 100644
View file @
f37f6c2b
<
template
>
<div
class=
"rounded-borders bg-white row items-center q-pa-md"
>
<q-select
v-if=
"$q.platform.is.desktop"
style=
"min-width: 190px;"
unelevated
v-model=
"placeKeyWords"
dense
:options=
"Areas"
emit-value
option-label=
"name"
option-value=
"name"
map-options
:label=
"$t('hotel.area')"
standout
/>
<q-field
v-if=
"$q.platform.is.desktop"
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>
<div
class=
"row"
v-if=
"$q.platform.is.desktop"
>
<q-select
class=
"q-ml-lg"
style=
"min-width: 90px;z-index: 99999;"
unelevated
v-model=
"room"
dense
:options=
"theRooms"
emit-value
option-label=
"name"
option-value=
"id"
map-options
:label=
"$t('v101.scattered.kefang')"
standout
@
update:model-value=
"getRoomList"
>
</q-select>
<q-btn
unelevated
class=
"bg-white hover q-px-xs q-py-sm q-ml-xs text-grey-6"
icon=
"person"
>
<div
class=
"text-dark q-ml-xs"
>
{{
auditNum
}}{{
$t
(
'v101.scattered.chengren'
)
}}
<span
class=
"q-px-sm"
>
.
</span>
<template
v-if=
"childNum>0"
>
{{
childNum
}}
</
template
>
{{$t('v101.scattered.ertong')}}
</div>
<q-popup-proxy
class=
"no-shadow absolute"
style=
"z-index: 0;box-shadow: 0 0 50px #ddd !important"
:offset=
"[0, 20]"
:model-value=
"isShowPop"
>
<q-card
class=
"row wrap q-pa-md rounded-borders"
style=
"max-width:697px;"
>
<div
class=
"q-mr-md"
v-for=
"(item,index) in search.searchroomGroup"
:key=
"index"
style=
"min-width: 150px;"
>
<div
class=
"q-mb-md text-subtitle2"
>
{{ $t('v101.scattered.kefang') }}{{index+1}}
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"item.numberOfAdults"
dense
:options=
"adultList"
emit-value
map-options
:label=
"$t('v101.scattered.chengren')"
standout
@
update:model-value=
"setPeopleNum"
/>
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"item.numberOfChildren"
dense
:options=
"childrenList"
emit-value
map-options
:label=
"$t('v101.scattered.ertong')"
standout
@
update:model-value=
"setPeopleNum"
/>
</div>
</div>
</q-card>
</q-popup-proxy>
</q-btn>
</div>
<div
class=
"col"
></div>
<q-btn
unelevated
class=
"bg-grey-3 hover q-mr-md"
:title=
"$t('morequery')"
>
<q-badge
rounded
class=
"din bg-red-2 text-red-14 text-weight-bold"
floating
:label=
"searchCnt"
v-if=
"searchCnt > 0"
/>
<svg-icon
color=
"dark"
icon=
"Text/Filter.svg"
:tips=
"$t('morequery')"
:size=
"20"
></svg-icon>
<q-tooltip>
{{ $t('morequery') }}
</q-tooltip>
<q-popup-proxy
class=
"no-shadow"
style=
"box-shadow: 0 0 50px #ddd !important"
:offset=
"[0, 20]"
:model-value=
"canHide"
>
<q-card
class=
"q-pa-md rounded-borders"
style=
"width: 300px"
>
<div
class=
"q-mb-md text-subtitle2"
>
{{ $t('morequery') }}
</div>
<div
class=
"q-my-md"
v-if=
"$q.platform.is.mobile"
>
<q-select
unelevated
v-model=
"placeKeyWords"
dense
:options=
"Areas"
emit-value
option-label=
"name"
option-value=
"name"
map-options
:label=
"$t('hotel.area')"
standout
/>
</div>
<div
class=
"q-my-md"
v-if=
"$q.platform.is.mobile"
>
<q-field
stack-label
:label=
"$t('daterange')"
standout
style=
"min-width: 190px"
dense
>
<div
class=
"self-center full-width no-outline"
tabindex=
"0"
>
{{ dateRangeFormat }}
</div>
<q-popup-proxy
:offset=
"[0, 10]"
ref=
"qDateProxy"
>
<q-date
v-model=
"dateRange"
:options=
"optionsFn"
range
mask=
"YYYY/MM/DD"
landscape
@
range-end=
"dateRangeHandler"
></q-date>
</q-popup-proxy>
</q-field>
</div>
<div
class=
"q-my-md row justify-between"
v-if=
"$q.platform.is.mobile"
>
<q-select
style=
"min-width: 90px;z-index: 99999;"
unelevated
v-model=
"room"
dense
:options=
"theRooms"
emit-value
option-label=
"name"
option-value=
"id"
map-options
:label=
"$t('v101.scattered.kefang')"
standout
@
update:model-value=
"getRoomList"
>
</q-select>
<q-btn
unelevated
class=
"bg-white hover q-px-xs q-py-sm q-ml-xs text-grey-6"
icon=
"person"
>
<div
class=
"text-dark q-ml-xs"
>
{{auditNum}}{{$t('v101.scattered.chengren')}}
<span
class=
"q-px-sm"
>
.
</span>
<
template
v-if=
"childNum>0"
>
{{
childNum
}}
</
template
>
{{$t('v101.scattered.ertong')}}
</div>
<q-popup-proxy
class=
"no-shadow absolute"
style=
"z-index: 0;box-shadow: 0 0 50px #ddd !important"
:offset=
"[0, 20]"
:model-value=
"isShowPop"
>
<q-card
class=
"row wrap q-pa-md rounded-borders"
style=
"max-width:697px;"
>
<div
class=
"q-mr-md"
v-for=
"(item,index) in search.searchroomGroup"
:key=
"index"
style=
"min-width: 150px;"
>
<div
class=
"q-mb-md text-subtitle2"
>
{{ $t('v101.scattered.kefang') }}{{index+1}}
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"item.numberOfAdults"
dense
:options=
"adultList"
emit-value
map-options
:label=
"$t('v101.scattered.chengren')"
standout
@
update:model-value=
"setPeopleNum"
/>
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"item.numberOfChildren"
dense
:options=
"childrenList"
emit-value
map-options
:label=
"$t('v101.scattered.ertong')"
standout
@
update:model-value=
"setPeopleNum"
/>
</div>
</div>
</q-card>
</q-popup-proxy>
</q-btn>
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"search.searchHotelCategory"
dense
:options=
"HotelLiveRates"
emit-value
option-label=
"name"
option-value=
"id"
clearable
multiple
map-options
:label=
"$t('v101.scattered.zhusutype')"
standout
/>
</div>
<div
class=
"q-my-md row items-center"
>
<q-input
v-model=
"search.searchMinRate"
class=
"col q-mr-md"
mask=
"#.##"
reverse-fill-mask
dense
type=
"text"
standout
:label=
"$t('hotel.minPrice')"
/>
<q-input
v-model=
"search.searchMaxRate"
class=
"col"
dense
mask=
"#.##"
reverse-fill-mask
ftype=
"text"
standout
:label=
"$t('hotel.maxPrice')"
/>
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"search.searchRoomType"
dense
:options=
"HotelRoomTypes"
emit-value
option-label=
"name"
option-value=
"id"
clearable
multiple
map-options
:label=
"$t('v101.scattered.fangxingtype')"
standout
/>
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"search.searchMealType"
dense
:options=
"HotelMealTypes"
emit-value
option-label=
"name"
option-value=
"id"
clearable
multiple
map-options
:label=
"$t('v101.scattered.canxingtype')"
standout
/>
</div>
<div
class=
"q-my-md"
>
<q-select
v-model=
"search.searchHotelFeatures"
dense
:options=
"HotelConceptTypes"
emit-value
option-label=
"name"
option-value=
"id"
clearable
multiple
map-options
:label=
"$t('v101.scattered.liniantype')"
standout
/>
</div>
<div
class=
"q-my-md row items-center"
>
<q-input
v-model=
"search.reviewRatingLowerLimits"
class=
"col q-mr-md"
mask=
"#.##"
reverse-fill-mask
dense
type=
"text"
standout
:label=
"$t('v101.scattered.minpingfen')"
/>
<q-input
v-model=
"search.reviewRatingUpperLimits"
class=
"col"
dense
mask=
"#.##"
reverse-fill-mask
ftype=
"text"
standout
:label=
"$t('v101.scattered.maxpingfen')"
/>
</div>
<div
class=
"q-my-md"
>
<q-input
v-model=
"keyWords"
class=
"col"
reverse-fill-mask
dense
type=
"text"
standout
:label=
"$t('v101.scattered.jiudianName')"
/>
</div>
</q-card>
</q-popup-proxy>
</q-btn>
<q-btn
color=
"primary"
unelevated
:label=
"$t('query')"
/>
</div>
</template>
<
script
lang=
"ts"
>
import
{
useI18n
}
from
'vue-i18n'
import
svgIcon
from
'../../global/svg-icon.vue'
import
{
computed
,
inject
,
provide
,
reactive
,
ref
,
toRefs
,
defineComponent
,
onMounted
,
watch
}
from
'vue'
import
HotelService
from
'../../../api/hotel'
import
message
from
'../../../utils/message'
import
{
ApiResult
}
from
'../../../@types/enumHelper'
import
{
CascaderOption
,
NCascader
,
NSelect
}
from
'naive-ui'
import
{
date
}
from
'quasar'
import
{
HotelRate
,
HotelArea
,
useHotel
}
from
'../../../utils/hotelRate'
import
{
useQuasar
}
from
'quasar'
import
useScrollModule
from
'../../../module/scrollbar/scrollModule'
// import { dateDiffer } from '../../../utils/tools'
import
{
DirtionmaryHelper
}
from
'../../../config/dictionary'
export
default
defineComponent
({
components
:
{
svgIcon
,
NCascader
,
NSelect
},
setup
()
{
const
$q
=
useQuasar
()
const
qDateProxy
=
ref
(
null
)
as
any
const
qNameProxy
=
ref
(
null
)
as
any
const
{
locale
,
t
}
=
useI18n
()
const
data
=
reactive
({
scrollStyle
:
{}
as
any
,
Areas
:
[]
as
Array
<
HotelArea
>
,
//区域
cascader
:
{
addressValue
:
null
}
as
any
,
dateRange
:
{}
as
any
,
//当前日期
dateRangeFormat
:
''
,
//可选日期
loading
:
false
,
hotelsRates
:
[]
as
Array
<
HotelRate
>
,
canHide
:
false
,
//更多筛选
theRooms
:
[]
as
Array
<
Number
>
,
//客房下拉
room
:
1
,
//客房数
auditNum
:
1
,
childNum
:
null
as
any
,
adultList
:
[]
as
Array
<
Number
>
,
//成人下拉
childrenList
:
[]
as
Array
<
Number
>
,
//儿童下拉
isShowPop
:
false
,
//房间
HotelLiveRates
:
[]
as
Array
<
HotelRate
>
,
//住宿类型
HotelRoomTypes
:
[]
as
Array
<
HotelRate
>
,
//房类型
HotelMealTypes
:
[]
as
Array
<
HotelRate
>
,
//餐型
HotelConceptTypes
:
[]
as
Array
<
HotelRate
>
,
//理念
keyWords
:
''
as
stringify
,
placeKeyWords
:
t
(
'v101.scattered.HotelArea1'
),
})
for
(
let
i
=
1
;
i
<
11
;
i
++
){
data
.
theRooms
.
push
(
i
)
}
for
(
let
i
=
1
;
i
<
10
;
i
++
){
data
.
adultList
.
push
(
i
)
}
for
(
let
i
=
0
;
i
<
6
;
i
++
){
data
.
childrenList
.
push
(
i
)
}
data
.
scrollStyle
=
useScrollModule
().
scrollStyle
const
search
=
inject
(
DirtionmaryHelper
.
HOTEL_QUERY_PARAM
)
as
any
if
(
search
.
searchroomGroup
&&
search
.
searchroomGroup
.
length
==
0
){
search
.
searchroomGroup
.
push
({
roomNum
:
1
,
numberOfAdults
:
1
,
numberOfChildren
:
0
})
}
data
.
dateRange
.
to
=
date
.
formatDate
(
date
.
addToDate
(
new
Date
(),
{
days
:
9
}),
'YYYY/MM/DD'
)
data
.
dateRange
.
from
=
date
.
formatDate
(
date
.
addToDate
(
new
Date
(),
{
days
:
8
}),
'YYYY/MM/DD'
)
data
.
dateRangeFormat
=
`
${
data
.
dateRange
.
from
}
-
${
data
.
dateRange
.
to
}
`
search
.
arrivalDate
=
data
.
dateRange
.
from
search
.
departureDate
=
data
.
dateRange
.
to
data
.
hotelsRates
=
useHotel
.
getHotelRate
()
data
.
HotelLiveRates
=
useHotel
.
getAccommodationType
()
data
.
Areas
=
useHotel
.
getHotelArea
()
data
.
HotelRoomTypes
=
useHotel
.
getHotelRoom
()
data
.
HotelMealTypes
=
useHotel
.
getHotelMeal
()
data
.
HotelConceptTypes
=
useHotel
.
getHotelConcept
()
if
(
data
.
keyWords
==
''
)
{
search
.
freewordType
=
1
;
search
.
freeword
=
data
.
placeKeyWords
;
}
else
{
search
.
freewordType
=
2
;
search
.
freeword
=
data
.
keyWords
;
}
const
methods
=
{
//设置房间里面成人数改变总成人数和儿童数
setPeopleNum
()
{
data
.
auditNum
=
0
;
data
.
childNum
=
0
;
search
.
searchroomGroup
.
forEach
(
x
=>
{
data
.
auditNum
+=
x
.
numberOfAdults
;
data
.
childNum
+=
x
.
numberOfChildren
;
})
if
(
data
.
auditNum
==
null
||
data
.
auditNum
==
undefined
)
{
data
.
auditNum
=
1
}
if
(
data
.
childNum
==
null
||
data
.
childNum
==
undefined
)
{
data
.
childNum
=
1
}
},
//房间数改变
getRoomList
(
roomNum
)
{
let
length
=
search
.
searchroomGroup
.
length
if
(
roomNum
>
length
){
for
(
let
i
=
1
;
i
<=
roomNum
-
length
;
i
++
)
{
let
obj
=
{
roomNum
:
i
,
numberOfAdults
:
1
,
numberOfChildren
:
0
}
search
.
searchroomGroup
.
push
(
obj
);
}
}
else
{
search
.
searchroomGroup
=
search
.
searchroomGroup
.
filter
((
x
:
any
,
i
:
Number
)
=>
{
if
(
roomNum
>
i
)
return
x
})
}
data
.
auditNum
=
0
;
data
.
childNum
=
0
;
search
.
searchroomGroup
.
forEach
(
x
=>
{
data
.
auditNum
+=
x
.
numberOfAdults
;
data
.
childNum
+=
x
.
numberOfChildren
;
})
data
.
isShowPop
=
true
search
.
auditNum
=
data
.
auditNum
;
search
.
childNum
=
data
.
childNum
;
},
dateRangeHandler
(
e
:
any
)
{
search
.
arrivalDate
=
`
${
e
.
from
.
year
}
/
${
e
.
from
.
month
}
/
${
e
.
from
.
day
}
`
search
.
departureDate
=
`
${
e
.
to
.
year
}
/
${
e
.
to
.
month
}
/
${
e
.
to
.
day
}
`
data
.
dateRangeFormat
=
`
${
search
.
arrivalDate
}
-
${
search
.
departureDate
}
`
if
(
qDateProxy
.
value
)
qDateProxy
.
value
.
hide
()
},
optionsFn
(
cd
:
any
)
{
return
cd
>=
date
.
formatDate
(
date
.
addToDate
(
new
Date
(),
{
days
:
8
}),
'YYYY/MM/DD'
)
},
setData
(){
localStorage
.
removeItem
(
DirtionmaryHelper
.
SCATTERED_HOTEL_DATE
)
let
d
=
{
searchroomGroup
:
search
.
searchroomGroup
,
room
:
data
.
room
,
auditNum
:
data
.
auditNum
,
childNum
:
data
.
childNum
,
arrivalDate
:
search
.
arrivalDate
,
departureDate
:
search
.
departureDate
,
}
localStorage
.
setItem
(
DirtionmaryHelper
.
SCATTERED_HOTEL_DATE
,
JSON
.
stringify
(
d
))
}
}
const
searchCnt
=
computed
(()
=>
{
let
setCnt
=
0
if
(
$q
.
platform
.
is
.
mobile
)
{
if
(
data
.
placeKeyWords
&&!
data
.
keyWords
)
setCnt
++
if
(
data
.
dateRange
)
setCnt
++
if
(
search
.
searchroomGroup
.
length
>
0
)
setCnt
++
}
if
(
data
.
keyWords
)
setCnt
++
if
(
search
.
reviewRatingUpperLimits
)
setCnt
++
if
(
search
.
reviewRatingLowerLimits
)
setCnt
++
if
(
search
.
searchHotelCategory
&&
search
.
searchHotelCategory
.
length
>
0
)
setCnt
++
if
(
search
.
searchHotelFeatures
&&
search
.
searchHotelFeatures
.
length
>
0
)
setCnt
++
if
(
search
.
searchRoomType
&&
search
.
searchRoomType
.
length
>
0
)
setCnt
++
if
(
search
.
searchMealType
&&
search
.
searchMealType
.
length
>
0
)
setCnt
++
if
(
search
.
searchMinRate
)
setCnt
++
if
(
search
.
searchMaxRate
)
setCnt
++
if
(
data
.
keyWords
==
''
)
{
search
.
freewordType
=
1
;
search
.
freeword
=
data
.
placeKeyWords
;
}
else
{
search
.
freewordType
=
2
;
search
.
freeword
=
data
.
keyWords
;
}
return
setCnt
})
watch
(
search
,
(
n
,
o
)
=>
{
methods
.
setData
()
})
watch
(
data
.
room
,
(
n
,
o
)
=>
{
methods
.
setData
()
})
watch
(
data
.
auditNum
,
(
n
,
o
)
=>
{
methods
.
setData
()
})
watch
(
data
.
childNum
,
(
n
,
o
)
=>
{
methods
.
setData
()
})
onMounted
(()
=>
{
methods
.
setData
()
})
return
{
...
toRefs
(
data
),
...
methods
,
qDateProxy
,
qNameProxy
,
searchCnt
,
search
,
}
}
})
</
script
>
<
style
>
</
style
>
src/components/scattered/dida/DidaListTable.vue
0 → 100644
View file @
f37f6c2b
<
template
>
<div
class=
"full-height column hotel-list"
>
<q-table
v-if=
"$q.platform.is.desktop"
:loading=
"loading"
:rows=
"hotels"
:loading-label=
"$t('loading')"
class=
"col sticky-header-column-table"
flat
:pagination=
"pages"
:no-data-label=
"$t('noneData')"
:columns=
"cols"
>
<template
v-slot:top
>
<div
class=
"row full-width"
>
<div
class=
"col"
></div>
<q-btn
class=
"hover q-mr-md"
v-for=
"(item,index) in 2"
:class=
"
{'bg-blue text-white':pages.sort==index+1,'bg-grey-3':pages.sort!=index+1}" @click="pages.sort=index+1,initHotels()">
{{
index
+
1
==
1
?
$t
(
'v101.scattered.anrenqi'
):
$t
(
'v101.scattered.anjiage'
)
}}
</q-btn>
</div>
</
template
>
<
template
v-slot:body-cell-hotelName=
"props"
>
<q-td
class=
"cursor-pointer"
:props=
"props"
@
click=
"goUrl('/scattered/HotelDetails',props.row)"
>
<span>
{{
props
.
row
.
hotelName
}}
</span>
</q-td>
</
template
>
<
template
v-slot:body-cell-reviewRating=
"props"
>
<q-td
:props=
"props"
>
<div
class=
"row no-wrap items-center"
>
<q-rating
v-model=
"props.row.reviewRating"
size=
"1.5em"
color=
"orange"
:max=
"5"
icon=
"star_border"
icon-selected=
"star"
icon-half=
"star_half"
no-dimming
readonly
/>
<span
class=
"q-ml-xs"
v-if=
"props.row.reviewRating>0"
>
{{
props
.
row
.
reviewRating
}}
</span>
</div>
</q-td>
</
template
>
<
template
v-slot:body-cell-lowrateBySetCurrency=
"props"
>
<q-td
:props=
"props"
>
<span
class=
"q-ml-xs text-orange text-weight-bold fz18"
>
円
<template
v-if=
"props.row.type==1"
>
{{
getPrice
(
props
.
row
.
lowrateBySetCurrency
)
}}
</
template
>
<
template
v-else
>
{{
props
.
row
.
lowrateBySetCurrency
}}
</
template
>
</span>
<span
class=
"text-grey-8 q-pl-xs"
>
{{$t('v101.scattered.qi')}}
</span>
</q-td>
</template>
<!-- <template v-slot:body-cell-type="props">
<q-td :props="props">
<span class="q-ml-xs text-green-4 fz14" >
{{props.row.type==2?$t('v101.scattered.ziying'):$t('v101.scattered.jalan')}}
</span>
</q-td>
</template> -->
<
template
v-slot:body-cell-hotelFeaturesMask=
"props"
>
<q-td
:props=
"props"
>
<span
v-for=
"(subItem,index) in props.row.hotelFeaturesMask"
:key=
"index"
>
<span
class=
"rounded-borders bg-blue-1 text-blue q-mr-xs q-px-sm q-py-xs"
v-if=
"subItem"
>
{{
subItem
==
1
?
themeList
[
index
].
name
:
''
}}
</span>
</span>
</q-td>
</
template
>
<
template
v-slot:bottom
>
<q-pagination
class=
"full-width justify-end"
v-model=
"pages.displayFrom"
color=
"primary"
:max=
"pageCount"
:input=
"true"
@
update:model-value=
"changePageHandler"
/>
</
template
>
</q-table>
<q-table
hide-header
v-else
:title=
"pageTitle"
:rows=
"hotels"
grid
:columns=
"mobileCols"
row-key=
"name"
card-class=
"no-shadow bg-primary text-white"
:pagination=
"pages"
:loading=
"loading"
>
<
template
v-slot:top
>
<div
class=
"row full-width"
>
<div
class=
"col"
></div>
<q-btn
dense
unelevated
class=
"hover q-px-sm q-mr-md"
v-for=
"(item,index) in 2"
:class=
"
{'bg-blue text-white':pages.sort==index+1,'bg-grey-3':pages.sort!=index+1}" @click="pages.sort=index+1,initHotels()">
{{
index
+
1
==
1
?
$t
(
'v101.scattered.anrenqi'
):
$t
(
'v101.scattered.anjiage'
)
}}
</q-btn>
</div>
</
template
>
<
template
v-slot:item=
"props"
>
<div
@
click=
"goUrl('/scattered/HotelDetails',props.row)"
class=
"rounded-borders bg-primary text-white col-12 q-mb-sm"
style=
"padding: 12px;margin-left: 12px;margin-right: 12px; width: calc(100% - 24px);"
>
<div>
<div
style=
"opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;"
>
{{
$t
(
'v101.scattered.titleHeard1'
)
}}
</div>
<div
style=
"font-size: 13px;"
>
{{
props
.
row
.
hotelName
}}
</div>
</div>
<div
class=
"q-my-md"
>
<div
style=
"opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;"
>
{{
$t
(
'v101.scattered.titleHeard2'
)
}}
</div>
<div
style=
"font-size: 13px;"
>
<q-rating
v-model=
"props.row.reviewRating"
size=
"1.5em"
color=
"orange"
:max=
"5"
icon=
"star_border"
icon-selected=
"star"
icon-half=
"star_half"
no-dimming
readonly
/>
<span
class=
"q-ml-xs"
v-if=
"props.row.reviewRating>0"
>
{{
props
.
row
.
reviewRating
}}
</span>
</div>
</div>
<div>
<div
style=
"opacity: 0.54;font-weight: 500;font-size: 12px;margin-bottom: 4px;"
>
{{
$t
(
'v101.scattered.titleHeard3'
)
}}
</div>
<div
class=
""
>
<span>
円
<template
v-if=
"props.row.type==1"
>
{{
getPrice
(
props
.
row
.
lowrateBySetCurrency
)
}}
</
template
>
<
template
v-else
>
{{
props
.
row
.
lowrateBySetCurrency
}}
</
template
>
</span>
<span
class=
"q-pl-xs"
>
{{$t('v101.scattered.qi')}}
</span>
</div>
</div>
</div>
</template>
<
template
v-slot:bottom
>
<q-pagination
class=
"full-width justify-end"
v-model=
"pages.displayFrom"
color=
"primary"
:max=
"pageCount"
:input=
"true"
@
update:model-value=
"changePageHandler"
/>
</
template
>
</q-table>
</div>
</template>
<
script
lang=
"ts"
>
import
{
useRouter
}
from
'vue-router'
import
HotelService
from
'../../../api/scattered'
import
{
DirtionmaryHelper
}
from
'../../../config/dictionary'
import
message
from
'../../../utils/message'
import
{
defineComponent
,
inject
,
reactive
,
toRefs
,
watch
}
from
'vue'
import
{
date
,
useQuasar
}
from
'quasar'
import
{
useI18n
}
from
'vue-i18n'
import
{
HotelArea
,
useHotel
}
from
'../../../utils/hotelRate'
export
default
defineComponent
({
components
:
{
},
name
:
'list-table'
,
setup
()
{
const
$q
=
useQuasar
()
const
{
t
}
=
useI18n
()
const
search
=
inject
(
DirtionmaryHelper
.
HOTEL_QUERY_PARAM
)
as
any
const
$router
=
useRouter
()
watch
(
search
,
(
n
,
o
)
=>
{
if
(
data
.
loading
)
return
console
.
log
(
'search change'
)
data
.
pages
.
displayFrom
=
1
methods
.
initHotels
()
})
const
data
=
reactive
({
groupBookingFlg
:
''
as
any
,
JapanIncrease
:
''
as
any
,
travelLngLat
:
[]
as
Array
<
any
>
,
//地图坐标
themeList
:
[]
as
Array
<
HotelArea
>
,
hotels
:
[]
as
Array
<
any
>
,
loading
:
false
,
cols
:
[
{
name
:
'hotelName'
,
label
:
t
(
'v101.scattered.titleHeard1'
),
align
:
'left'
},
{
name
:
'reviewRating'
,
label
:
t
(
'v101.scattered.titleHeard2'
),
field
:
(
row
:
any
)
=>
(
row
.
reviewRating
),
align
:
'left'
},
{
name
:
'lowrateBySetCurrency'
,
label
:
t
(
'v101.scattered.titleHeard3'
),
align
:
'left'
},
// { name: 'type', label: t('v101.scattered.titleHeard4'), field: (row: any) => row.type==2?t('v101.scattered.ziying'):t('v101.scattered.jalan'), align: 'left' },
{
name
:
'hotelFeaturesMask'
,
label
:
t
(
'v101.scattered.titleHeard5'
),
align
:
'left'
},
{
name
:
'address'
,
label
:
t
(
'v101.scattered.titleHeard6'
),
field
:
(
row
:
any
)
=>
(
row
.
address
),
align
:
'left'
},
]
as
any
,
pages
:
{
displayFrom
:
1
,
//页数
numberOfResults
:
12
,
rowsPerPage
:
15
,
sort
:
1
},
pageCount
:
0
,
pageTitle
:
''
as
(
string
|
undefined
),
mobileCols
:[
{
name
:
'hotelName'
,
label
:
t
(
'hotel.col.first'
),
field
:(
row
:
any
)
=>
row
.
hotelName
},
{
name
:
'TotalInventory'
,
label
:
t
(
'hotel.col.three'
),
field
:(
row
:
any
)
=>
row
.
TotalInventory
},
{
name
:
'LowerPrice'
,
label
:
t
(
'hotel.col.four'
),
field
:(
row
:
any
)
=>
`¥
${
row
.
LowerPrice
.
toFixed
(
2
)}${
t
(
'unit.jp'
)}
{t('hotel.col.low')}`
}
],
showPriceList
:
false
,
queryHotelObj
:{},
orderSubmitObj
:{}
as
any
,
orderSubmitItemObj
:{}
as
any
,
showOrderPreview
:
false
,
showHotelDetailId
:
0
,
})
data
.
themeList
=
useHotel
.
getHotelTheme
()
data
.
pageTitle
=
inject
(
DirtionmaryHelper
.
PAGE_TITLE_KEY
)
const
methods
=
{
initHotels
()
{
data
.
loading
=
true
data
.
hotels
=
[]
let
dataList
=
[]
as
any
[];
data
.
travelLngLat
=
[];
let
param
=
Object
.
assign
(
data
.
pages
,
search
)
HotelService
.
GetJAPANHotelList
(
param
)
.
then
(
r
=>
{
if
(
r
.
data
.
data
.
parmResult
&&
r
.
data
.
data
.
parmResult
.
hotelSummary
)
{
dataList
=
r
.
data
.
data
.
parmResult
.
hotelSummary
;
}
var
ourHotelList
=
r
.
data
.
data
.
ourHotelList
;
if
(
ourHotelList
&&
ourHotelList
.
length
>
0
)
{
ourHotelList
.
forEach
(
x
=>
{
x
.
type
=
2
})
}
if
(
dataList
&&
dataList
.
length
>
0
)
{
//获取酒店坐标
dataList
.
forEach
(
x
=>
{
x
.
reviewRating
=
parseFloat
(
x
.
reviewRating
);
x
.
lowrateBySetCurrency
=
parseFloat
(
x
.
lowrateBySetCurrency
);
let
obj
=
{
lat
:
x
.
latitudeW
,
lng
:
x
.
longitudeW
,
name
:
x
.
hotelName
}
data
.
travelLngLat
.
push
(
obj
);
x
.
type
=
1
})
}
data
.
hotels
=
ourHotelList
.
concat
(
dataList
);
data
.
hotels
.
forEach
(
x
=>
{
if
(
isNaN
(
x
.
reviewRating
)){
x
.
reviewRating
=
0
}
x
.
hotelFeaturesMask
=
x
.
hotelFeaturesMask
.
split
(
','
)
})
//按价格升序
if
(
data
.
pages
.
sort
==
2
){
data
.
hotels
.
sort
(
methods
.
getSortFun
(
'asc'
,
'lowrateBySetCurrency'
));
}
//按照星级降序
if
(
data
.
pages
.
sort
==
1
){
data
.
hotels
.
sort
(
methods
.
getSortFun
(
'desc'
,
'reviewRating'
));
}
let
jalanTotalCount
=
0
if
(
r
.
data
.
data
.
parmResult
&&
r
.
data
.
data
.
parmResult
.
numberOfResultMatched
)
{
jalanTotalCount
=
r
.
data
.
data
.
parmResult
.
numberOfResultMatched
;
}
let
ourHotelTotalCount
=
0
;
if
(
ourHotelList
&&
ourHotelList
.
length
>
0
)
{
ourHotelTotalCount
=
ourHotelList
[
0
].
totalHotelCount
;
}
let
totalCount
=
Number
(
jalanTotalCount
)
+
Number
(
ourHotelTotalCount
);
data
.
pageCount
=
Math
.
ceil
(
parseFloat
(
r
.
data
.
data
.
parmResult
.
numberOfResultMatched
)
/
data
.
pages
.
numberOfResults
)
data
.
groupBookingFlg
=
r
.
data
.
data
.
parmResult
.
groupBookingFlg
;
data
.
JapanIncrease
=
r
.
data
.
data
.
parmResult
.
JapanIncrease
;
data
.
loading
=
false
})
.
catch
(
e
=>
{
data
.
loading
=
false
})
},
//数组排序
getSortFun
(
order
,
sortBy
)
{
var
ordAlpah
=
(
order
==
'asc'
)
?
'>'
:
'<'
;
var
sortFun
=
new
Function
(
'a'
,
'b'
,
'return a.'
+
sortBy
+
ordAlpah
+
'b.'
+
sortBy
+
'?1:-1'
);
return
sortFun
;
},
//获取价格
getPrice
(
price
)
{
return
Math
.
ceil
(
price
/
data
.
JapanIncrease
);
},
changePageHandler
(
n
:
any
)
{
data
.
pages
.
displayFrom
=
n
console
.
log
(
n
)
methods
.
initHotels
()
},
showHotelDetailHandler
(
hotelId
:
number
){
data
.
showHotelDetailId
=
hotelId
},
goUrl
(
url
:
string
,
row
:
{}){
url
=
`
${
url
}
/
${
row
.
hotelId
}
/
${
data
.
groupBookingFlg
}
/
${
row
.
type
==
1
?
methods
.
getPrice
(
row
.
lowrateBySetCurrency
):
row
.
lowrateBySetCurrency
}
`
window
.
open
(
url
,
'_blank'
)
// $router.push({ path:url })
},
}
methods
.
initHotels
()
return
{
...
toRefs
(
data
),
...
methods
}
}
})
</
script
>
<
style
>
</
style
>
src/i18n/ja-RB/index.ts
View file @
f37f6c2b
...
...
@@ -333,7 +333,8 @@ export default {
scattered
:
{
first
:
'個人客の予定です'
,
second
:
'ホテル検索'
,
three
:
'ホテル注文'
three
:
'ホテル注文'
,
didaName
:
'道旅酒店'
,
},
car
:
{
first
:
'車両予約'
,
...
...
src/i18n/ko-HG/index.ts
View file @
f37f6c2b
...
...
@@ -333,7 +333,8 @@ export default {
scattered
:
{
first
:
'산행객 예약'
,
second
:
'호텔 검색'
,
three
:
'호텔 주문서'
three
:
'호텔 주문서'
,
didaName
:
'道旅酒店'
,
},
car
:
{
first
:
'차량 예약'
,
...
...
src/i18n/zh-SW/index.ts
View file @
f37f6c2b
...
...
@@ -333,7 +333,8 @@ export default {
scattered
:
{
first
:
'散客预定'
,
second
:
'酒店检索'
,
three
:
'酒店订单'
three
:
'酒店订单'
,
didaName
:
'道旅酒店'
,
},
car
:
{
first
:
'车辆预定'
,
...
...
src/i18n/zh-TW/index.ts
View file @
f37f6c2b
...
...
@@ -333,7 +333,8 @@ export default {
scattered
:
{
first
:
'散客預定'
,
second
:
'酒店檢索'
,
three
:
'酒店訂單'
three
:
'酒店訂單'
,
didaName
:
'道旅酒店'
,
},
car
:
{
first
:
'車輛預定'
,
...
...
src/pages/scattered/didaHotel.vue
0 → 100644
View file @
f37f6c2b
<
template
>
<div
class=
"fix-height-subpage column no-wrap q-pa-md"
>
<dida-header></dida-header>
<div
class=
"col q-mt-md"
:class=
"
{'light-shadow q-pa-md bg-white rounded-border':$q.platform.is.desktop}">
<dida-list-table></dida-list-table>
</div>
</div>
</
template
>
<
script
lang=
"ts"
>
import
useMetaModule
from
'../../module/meta/metaModule'
import
{
useI18n
}
from
'vue-i18n'
import
svgIcon
from
'../../components/global/svg-icon.vue'
import
{
defineComponent
,
inject
,
provide
,
reactive
,
ref
,
toRefs
}
from
'vue'
import
{
DirtionmaryHelper
}
from
'../../config/dictionary'
import
DidaHeader
from
'../../components/scattered/dida/DidaHeader.vue'
import
DidaListTable
from
'../../components/scattered/dida/DidaListTable.vue'
import
{
date
}
from
'quasar'
export
default
defineComponent
({
components
:
{
svgIcon
,
DidaHeader
,
DidaListTable
},
setup
()
{
const
data
=
reactive
({})
let
{
setTitle
}
=
useMetaModule
()
const
{
locale
,
t
}
=
useI18n
()
const
pageTitle
=
inject
(
DirtionmaryHelper
.
PAGE_TITLE_KEY
)
as
any
pageTitle
.
value
=
t
(
'hotel.pageTitle'
)
setTitle
(
pageTitle
.
value
)
const
search
=
reactive
({
arrivalDate
:
''
,
//开始日期
departureDate
:
''
,
//结束日期
searchroomGroup
:
[]
as
Array
<
ang
>
,
//客房数
searchHotelIdList
:
[],
freeword
:
''
,
//地区名字 酒店名字
freewordType
:
1
,
//类型 1,地区,2-酒店名称
reviewRatingUpperLimits
:
''
,
//最大评分数
reviewRatingLowerLimits
:
''
,
//最小评分数
searchHotelCategory
:
[],
//酒店分类
searchHotelFeatures
:
[],
//酒店特征
searchRoomType
:
[],
//类型的房间
searchMealType
:
[],
//饮食条件搜索
searchMinRate
:
''
,
//最小金额
searchMaxRate
:
''
,
//最大金额
})
provide
(
DirtionmaryHelper
.
HOTEL_QUERY_PARAM
,
search
)
const
menu
=
inject
(
DirtionmaryHelper
.
MENU_KEYS
)
as
any
menu
.
value
=
23
const
methods
=
{}
return
{
...
toRefs
(
data
),
...
methods
}
}
})
</
script
>
<
style
></
style
>
src/router/routes.ts
View file @
f37f6c2b
import
{
RouteRecordRaw
}
from
'vue-router'
import
{
RouteRecordRaw
}
from
'vue-router'
const
routes
:
RouteRecordRaw
[]
=
[
{
const
routes
:
RouteRecordRaw
[]
=
[{
path
:
'/index'
,
component
:
()
=>
import
(
'layouts/MainLayout.vue'
),
children
:
[
{
path
:
''
,
component
:
()
=>
import
(
'pages/Index.vue'
)
},
{
path
:
'/hotel'
,
component
:
()
=>
import
(
'pages/hotel/HotelList.vue'
)
},
//酒店
{
path
:
'/hotel/order/:orderId?'
,
component
:
()
=>
import
(
'pages/hotel/HotelOrder.vue'
)
},
{
path
:
'/hotel/modify/:orderId'
,
component
:
()
=>
import
(
'pages/hotel/ModifyHotelOrder.vue'
)
},
{
path
:
'/hotel/offer/:orderId'
,
component
:
()
=>
import
(
'pages/hotel/ListOfQuotation.vue'
)
},
children
:
[{
path
:
''
,
component
:
()
=>
import
(
'pages/Index.vue'
)
},
{
path
:
'/hotel'
,
component
:
()
=>
import
(
'pages/hotel/HotelList.vue'
)
},
//酒店
{
path
:
'/hotel/order/:orderId?'
,
component
:
()
=>
import
(
'pages/hotel/HotelOrder.vue'
)
},
{
path
:
'/hotel/modify/:orderId'
,
component
:
()
=>
import
(
'pages/hotel/ModifyHotelOrder.vue'
)
},
{
path
:
'/hotel/offer/:orderId'
,
component
:
()
=>
import
(
'pages/hotel/ListOfQuotation.vue'
)
},
{
path
:
'/personal'
,
component
:
()
=>
import
(
'pages/personal/personal.vue'
)
},
//个人中心
{
path
:
'/passbook'
,
component
:
()
=>
import
(
'pages/passbook/passbook.vue'
)
},
//幸福存折
{
path
:
'/personal'
,
component
:
()
=>
import
(
'pages/personal/personal.vue'
)
},
//个人中心
{
path
:
'/passbook'
,
component
:
()
=>
import
(
'pages/passbook/passbook.vue'
)
},
//幸福存折
{
path
:
'/scattered'
,
component
:
()
=>
import
(
'pages/scattered/HotelList.vue'
)
},
//散客
{
path
:
'/scattered/HotelDetails/:hotelId/:groupBookingFlg/:lowrateBySetCurrency'
,
component
:
()
=>
import
(
'pages/scattered/hotelDetails.vue'
)
},
{
path
:
'/scattered/HotelSure/:hotelId/:roomOptionCd'
,
component
:
()
=>
import
(
'pages/scattered/HotelSure.vue'
)
},
{
path
:
'/scattered/HotelOrder'
,
component
:
()
=>
import
(
'pages/scattered/HotelOrder.vue'
)
},
{
path
:
'/scattered'
,
component
:
()
=>
import
(
'pages/scattered/HotelList.vue'
)
},
//散客
{
path
:
'/didahotel'
,
//道旅酒店
component
:
()
=>
import
(
'pages/scattered/didaHotel.vue'
)
},
{
path
:
'/scattered/HotelDetails/:hotelId/:groupBookingFlg/:lowrateBySetCurrency'
,
component
:
()
=>
import
(
'pages/scattered/hotelDetails.vue'
)
},
{
path
:
'/scattered/HotelSure/:hotelId/:roomOptionCd'
,
component
:
()
=>
import
(
'pages/scattered/HotelSure.vue'
)
},
{
path
:
'/scattered/HotelOrder'
,
component
:
()
=>
import
(
'pages/scattered/HotelOrder.vue'
)
},
{
path
:
'/comingsoon'
,
component
:
()
=>
import
(
'pages/ComingSoon.vue'
)
},
{
path
:
'/comingsoon'
,
component
:
()
=>
import
(
'pages/ComingSoon.vue'
)
},
{
path
:
'/ticket/list'
,
component
:
()
=>
import
(
'pages/ticket/TicketList.vue'
)
},
//门票
{
path
:
'/ticket/preview/:ticketId/:Time'
,
component
:
()
=>
import
(
'pages/ticket/TicketOrderPreview.vue'
)
},
{
path
:
'/ticket/order'
,
component
:
()
=>
import
(
'pages/ticket/TicketOrder.vue'
)
},
{
path
:
'/ticket/preview/:ticketId/:Time'
,
component
:
()
=>
import
(
'pages/ticket/TicketOrderPreview.vue'
)
},
{
path
:
'/ticket/order/:orderId?'
,
component
:
()
=>
import
(
'pages/ticket/TicketOrder.vue'
)
},
{
path
:
'/ticket/list'
,
component
:
()
=>
import
(
'pages/ticket/TicketList.vue'
)
},
//门票
{
path
:
'/ticket/preview/:ticketId/:Time'
,
component
:
()
=>
import
(
'pages/ticket/TicketOrderPreview.vue'
)
},
{
path
:
'/ticket/order'
,
component
:
()
=>
import
(
'pages/ticket/TicketOrder.vue'
)
},
{
path
:
'/ticket/preview/:ticketId/:Time'
,
component
:
()
=>
import
(
'pages/ticket/TicketOrderPreview.vue'
)
},
{
path
:
'/ticket/order/:orderId?'
,
component
:
()
=>
import
(
'pages/ticket/TicketOrder.vue'
)
},
{
path
:
'/vehicle/index'
,
component
:
()
=>
import
(
'pages/CharteredBus/CharteredBusList.vue'
)
},
//车辆
{
path
:
'/vehicle/Preview/:ProductId/:Time/:orderId?'
,
component
:
()
=>
import
(
'pages/CharteredBus/CharteredBusPreview.vue'
)
},
{
path
:
'/vehicle/addEditVehicle/:Id?'
,
component
:
()
=>
import
(
'pages/vehicle/addEditVehicle.vue'
)
},
{
path
:
'/vehicle/order/:OrderId?/:pages?'
,
component
:
()
=>
import
(
'pages/vehicle/vehicleOrder.vue'
)
},
{
path
:
'/vehicle/index'
,
component
:
()
=>
import
(
'pages/CharteredBus/CharteredBusList.vue'
)
},
//车辆
{
path
:
'/vehicle/Preview/:ProductId/:Time/:orderId?'
,
component
:
()
=>
import
(
'pages/CharteredBus/CharteredBusPreview.vue'
)
},
{
path
:
'/vehicle/addEditVehicle/:Id?'
,
component
:
()
=>
import
(
'pages/vehicle/addEditVehicle.vue'
)
},
{
path
:
'/vehicle/order/:OrderId?/:pages?'
,
component
:
()
=>
import
(
'pages/vehicle/vehicleOrder.vue'
)
},
{
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'
)
},
{
path
:
'/travel/payList'
,
component
:
()
=>
import
(
'pages/travel/OrderPayList.vue'
)
},
{
path
:
'/travel/orderList'
,
component
:
()
=>
import
(
'pages/travel/orderList.vue'
)
},
{
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'
)
},
{
path
:
'/travel/payList'
,
component
:
()
=>
import
(
'pages/travel/OrderPayList.vue'
)
},
{
path
:
'/travel/orderList'
,
component
:
()
=>
import
(
'pages/travel/orderList.vue'
)
},
]
},
{
...
...
src/utils/menus.ts
View file @
f37f6c2b
...
...
@@ -45,6 +45,12 @@ const useMenus = {
id
:
14
,
parentId
:
13
,
},
// {
// name: t('menu.scattered.didaName'),
// url: '/didahotel',
// id: 23,
// parentId: 13,
// },
{
name
:
t
(
'menu.scattered.three'
),
url
:
'/scattered/HotelOrder'
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment