500 lines
17 KiB
JavaScript
500 lines
17 KiB
JavaScript
"use strict";
|
||
const common_vendor = require("../../common/vendor.js");
|
||
const modules_api_AppServer = require("../../modules/api/AppServer.js");
|
||
const common_assets = require("../../common/assets.js");
|
||
const appServer = new modules_api_AppServer.AppServer();
|
||
const _sfc_main = {
|
||
data() {
|
||
return {
|
||
serviceId: "",
|
||
serviceTitle: "",
|
||
userName: "",
|
||
userWechat: "",
|
||
userPhone: "",
|
||
userWhats: "",
|
||
remark: "",
|
||
checkInDate: "",
|
||
checkOutDate: "",
|
||
countryCity: "",
|
||
hotelName: "",
|
||
roomCount: 1,
|
||
roomType: "standard",
|
||
roomTypeIndex: 0,
|
||
needMeal: false,
|
||
mealPlan: "breakfast",
|
||
mealPlanIndex: 0,
|
||
submitting: false,
|
||
flashingField: "",
|
||
selectedDialCode: "86",
|
||
showCalendar: false,
|
||
calendarType: "checkIn",
|
||
showRoomTypePicker: false,
|
||
showMealRequirementPicker: false,
|
||
showMealPlanPicker: false,
|
||
minDate: "",
|
||
maxDate: "",
|
||
roomTypeColumns: [
|
||
[
|
||
{
|
||
label: "标准间",
|
||
value: "standard"
|
||
},
|
||
{
|
||
label: "大床房",
|
||
value: "king"
|
||
},
|
||
{
|
||
label: "双床房",
|
||
value: "twin"
|
||
},
|
||
{
|
||
label: "套房",
|
||
value: "suite"
|
||
},
|
||
{
|
||
label: "家庭房",
|
||
value: "family"
|
||
}
|
||
]
|
||
],
|
||
mealRequirementColumns: [
|
||
[
|
||
{
|
||
label: "是",
|
||
value: true
|
||
},
|
||
{
|
||
label: "否",
|
||
value: false
|
||
}
|
||
]
|
||
],
|
||
mealPlanColumns: [
|
||
[
|
||
{
|
||
label: "早餐",
|
||
value: "breakfast"
|
||
},
|
||
{
|
||
label: "三餐",
|
||
value: "three_meals"
|
||
},
|
||
{
|
||
label: "全包",
|
||
value: "all_inclusive"
|
||
}
|
||
]
|
||
]
|
||
};
|
||
},
|
||
computed: {
|
||
roomTypeText() {
|
||
const item = this.roomTypeColumns[0].find((t) => t.value === this.roomType);
|
||
return item ? item.label : "标准间";
|
||
},
|
||
needMealText() {
|
||
return this.needMeal ? "是" : "否";
|
||
},
|
||
mealPlanText() {
|
||
const item = this.mealPlanColumns[0].find((t) => t.value === this.mealPlan);
|
||
return item ? item.label : "早餐";
|
||
}
|
||
},
|
||
onLoad(options) {
|
||
this.initDateRange();
|
||
if (options.id) {
|
||
this.serviceId = options.id;
|
||
}
|
||
if (options.title) {
|
||
this.serviceTitle = decodeURIComponent(options.title);
|
||
}
|
||
},
|
||
methods: {
|
||
initDateRange() {
|
||
const now = /* @__PURE__ */ new Date();
|
||
const year = now.getFullYear();
|
||
const month = String(now.getMonth() + 1).padStart(2, "0");
|
||
const day = String(now.getDate()).padStart(2, "0");
|
||
this.minDate = `${year}-${month}-${day}`;
|
||
this.maxDate = `${year + 2}-12-31`;
|
||
},
|
||
openCheckInCalendar() {
|
||
this.calendarType = "checkIn";
|
||
this.initDateRange();
|
||
this.$nextTick(() => {
|
||
this.showCalendar = true;
|
||
});
|
||
},
|
||
openCheckOutCalendar() {
|
||
this.calendarType = "checkOut";
|
||
if (this.checkInDate) {
|
||
this.minDate = this.checkInDate;
|
||
} else {
|
||
this.initDateRange();
|
||
}
|
||
this.$nextTick(() => {
|
||
this.showCalendar = true;
|
||
});
|
||
},
|
||
closeCalendar() {
|
||
this.showCalendar = false;
|
||
this.initDateRange();
|
||
},
|
||
onCalendarConfirm(dates) {
|
||
if (dates && dates.length > 0) {
|
||
if (this.calendarType === "checkIn") {
|
||
this.checkInDate = dates[0];
|
||
if (this.checkOutDate && this.checkOutDate < dates[0]) {
|
||
this.checkOutDate = "";
|
||
}
|
||
} else {
|
||
this.checkOutDate = dates[0];
|
||
}
|
||
}
|
||
this.showCalendar = false;
|
||
this.initDateRange();
|
||
},
|
||
onRoomTypeConfirm(e) {
|
||
const selected = e.value[0];
|
||
this.roomType = selected.value;
|
||
this.roomTypeIndex = this.roomTypeColumns[0].findIndex((t) => t.value === selected.value);
|
||
this.showRoomTypePicker = false;
|
||
},
|
||
onMealRequirementConfirm(e) {
|
||
const selected = e.value[0];
|
||
this.needMeal = selected.value;
|
||
this.showMealRequirementPicker = false;
|
||
},
|
||
onMealPlanConfirm(e) {
|
||
const selected = e.value[0];
|
||
this.mealPlan = selected.value;
|
||
this.mealPlanIndex = this.mealPlanColumns[0].findIndex((t) => t.value === selected.value);
|
||
this.showMealPlanPicker = false;
|
||
},
|
||
increaseRoomCount() {
|
||
this.roomCount++;
|
||
},
|
||
decreaseRoomCount() {
|
||
if (this.roomCount > 1) {
|
||
this.roomCount--;
|
||
}
|
||
},
|
||
checkData() {
|
||
const validations = [
|
||
{
|
||
field: "userName",
|
||
selector: "#fieldUserName",
|
||
check: () => !this.userName.trim(),
|
||
message: "请输入真实姓名"
|
||
},
|
||
{
|
||
field: "contact",
|
||
selector: "#fieldContact",
|
||
check: () => !this.userWechat.trim() && !this.userPhone.trim() && !this.userWhats.trim(),
|
||
message: "请至少填写一种联系方式(微信号/手机号/WhatsApp)"
|
||
},
|
||
{
|
||
field: "checkInDate",
|
||
selector: "#fieldCheckInDate",
|
||
check: () => !this.checkInDate,
|
||
message: "请选择入住日期"
|
||
},
|
||
{
|
||
field: "checkOutDate",
|
||
selector: "#fieldCheckOutDate",
|
||
check: () => !this.checkOutDate,
|
||
message: "请选择退房日期"
|
||
},
|
||
{
|
||
field: "checkOutDate",
|
||
selector: "#fieldCheckOutDate",
|
||
check: () => this.checkInDate && this.checkOutDate && this.checkOutDate < this.checkInDate,
|
||
message: "退房日期不能早于入住日期"
|
||
},
|
||
{
|
||
field: "countryCity",
|
||
selector: "#fieldCountryCity",
|
||
check: () => !this.countryCity.trim(),
|
||
message: "请输入国家/城市"
|
||
},
|
||
{
|
||
field: "hotelName",
|
||
selector: "#fieldHotelName",
|
||
check: () => !this.hotelName.trim(),
|
||
message: "请输入酒店名称"
|
||
},
|
||
{
|
||
field: "roomCount",
|
||
selector: "#fieldRoomCount",
|
||
check: () => this.roomCount < 1,
|
||
message: "房间数量至少为1"
|
||
},
|
||
{
|
||
field: "mealPlan",
|
||
selector: "#fieldMealPlan",
|
||
check: () => this.needMeal && !this.mealPlan,
|
||
message: "请选择用餐方案"
|
||
}
|
||
];
|
||
for (const validation of validations) {
|
||
if (validation.check()) {
|
||
common_vendor.index.showToast({
|
||
title: validation.message,
|
||
icon: "none"
|
||
});
|
||
this.scrollToElement(validation.selector);
|
||
this.flashingField = validation.field;
|
||
setTimeout(() => {
|
||
this.flashingField = "";
|
||
}, 1500);
|
||
return;
|
||
}
|
||
}
|
||
this.submitAppointment();
|
||
},
|
||
async submitAppointment() {
|
||
var _a;
|
||
if (this.submitting)
|
||
return;
|
||
this.submitting = true;
|
||
common_vendor.index.showLoading({
|
||
title: "提交中...",
|
||
mask: true
|
||
});
|
||
try {
|
||
const appointmentData = {
|
||
hotServiceId: parseInt(this.serviceId) || null,
|
||
serviceType: "hotel",
|
||
realName: this.userName.trim(),
|
||
wechatId: this.userWechat.trim() || null,
|
||
phone: this.userPhone.trim() || null,
|
||
phoneCountryCode: this.userPhone.trim() ? this.selectedDialCode : null,
|
||
whatsapp: this.userWhats.trim() || null,
|
||
notes: this.remark.trim() || null,
|
||
checkInDate: this.checkInDate,
|
||
checkOutDate: this.checkOutDate,
|
||
countryCity: this.countryCity.trim(),
|
||
hotelName: this.hotelName.trim(),
|
||
roomCount: this.roomCount,
|
||
roomType: this.roomType,
|
||
needMeal: this.needMeal,
|
||
mealPlan: this.needMeal ? this.mealPlan : null
|
||
};
|
||
const result = await appServer.CreateAppointment(appointmentData);
|
||
common_vendor.index.hideLoading();
|
||
if (result.success || result.code === 0) {
|
||
common_vendor.index.showToast({
|
||
title: "预约提交成功",
|
||
icon: "success"
|
||
});
|
||
setTimeout(() => {
|
||
common_vendor.index.navigateBack({
|
||
delta: 1
|
||
});
|
||
}, 1500);
|
||
} else {
|
||
common_vendor.index.showToast({
|
||
title: ((_a = result.error) == null ? void 0 : _a.message) || "提交失败,请重试",
|
||
icon: "none"
|
||
});
|
||
}
|
||
} catch (error) {
|
||
common_vendor.index.hideLoading();
|
||
common_vendor.index.__f__("error", "at pages/appointment/hotel-reservation-page.vue:514", "提交预约失败:", error);
|
||
common_vendor.index.showToast({
|
||
title: "网络错误,请重试",
|
||
icon: "none"
|
||
});
|
||
} finally {
|
||
this.submitting = false;
|
||
}
|
||
},
|
||
scrollToElement(selector) {
|
||
const systemInfo = common_vendor.index.getSystemInfoSync();
|
||
const screenHeight = systemInfo.windowHeight;
|
||
const query = common_vendor.index.createSelectorQuery().in(this);
|
||
query.select(selector).boundingClientRect();
|
||
query.selectViewport().scrollOffset();
|
||
query.exec((res) => {
|
||
if (res[0] && res[1]) {
|
||
const rect = res[0];
|
||
const scrollInfo = res[1];
|
||
const targetScrollTop = scrollInfo.scrollTop + rect.top - screenHeight / 2 + rect.height / 2;
|
||
common_vendor.index.pageScrollTo({
|
||
scrollTop: Math.max(0, targetScrollTop),
|
||
duration: 300
|
||
});
|
||
}
|
||
});
|
||
},
|
||
back() {
|
||
common_vendor.index.navigateBack({
|
||
delta: 1
|
||
});
|
||
}
|
||
}
|
||
};
|
||
if (!Array) {
|
||
const _easycom_up_input2 = common_vendor.resolveComponent("up-input");
|
||
const _easycom_aure_country_picker2 = common_vendor.resolveComponent("aure-country-picker");
|
||
const _easycom_up_picker2 = common_vendor.resolveComponent("up-picker");
|
||
const _easycom_up_calendar2 = common_vendor.resolveComponent("up-calendar");
|
||
(_easycom_up_input2 + _easycom_aure_country_picker2 + _easycom_up_picker2 + _easycom_up_calendar2)();
|
||
}
|
||
const _easycom_up_input = () => "../../node-modules/uview-plus/components/u-input/u-input.js";
|
||
const _easycom_aure_country_picker = () => "../../uni_modules/aure-country-picker/components/aure-country-picker/aure-country-picker.js";
|
||
const _easycom_up_picker = () => "../../node-modules/uview-plus/components/u-picker/u-picker.js";
|
||
const _easycom_up_calendar = () => "../../node-modules/uview-plus/components/u-calendar/u-calendar.js";
|
||
if (!Math) {
|
||
(_easycom_up_input + _easycom_aure_country_picker + _easycom_up_picker + _easycom_up_calendar)();
|
||
}
|
||
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
||
return common_vendor.e({
|
||
a: common_assets._imports_0,
|
||
b: common_vendor.o((...args) => $options.back && $options.back(...args)),
|
||
c: common_vendor.t(_ctx.$t("infoEntry.title")),
|
||
d: common_vendor.t(_ctx.$t("infoEntry.personalInfo")),
|
||
e: common_vendor.t(_ctx.$t("infoEntry.realName")),
|
||
f: common_vendor.o(($event) => $data.userName = $event),
|
||
g: common_vendor.p({
|
||
placeholder: _ctx.$t("infoEntry.realNamePlaceholder"),
|
||
border: "surround",
|
||
modelValue: $data.userName
|
||
}),
|
||
h: $data.flashingField === "userName" ? 1 : "",
|
||
i: common_vendor.t(_ctx.$t("infoEntry.wechat")),
|
||
j: common_vendor.t(_ctx.$t("infoEntry.contactMethod")),
|
||
k: common_vendor.o(($event) => $data.userWechat = $event),
|
||
l: common_vendor.p({
|
||
placeholder: _ctx.$t("infoEntry.wechatPlaceholder"),
|
||
border: "surround",
|
||
modelValue: $data.userWechat
|
||
}),
|
||
m: $data.flashingField === "contact" ? 1 : "",
|
||
n: common_vendor.t(_ctx.$t("infoEntry.phone")),
|
||
o: common_vendor.t(_ctx.$t("infoEntry.contactMethod")),
|
||
p: common_vendor.o(($event) => $data.selectedDialCode = $event),
|
||
q: common_vendor.p({
|
||
title: _ctx.$t("infoEntry.selectCountry"),
|
||
height: "70%",
|
||
width: "60vw",
|
||
duration: 350,
|
||
position: "bottom",
|
||
round: true,
|
||
radius: "24rpx",
|
||
["mask-closable"]: true,
|
||
modelValue: $data.selectedDialCode
|
||
}),
|
||
r: common_vendor.o(($event) => $data.userPhone = $event),
|
||
s: common_vendor.p({
|
||
placeholder: _ctx.$t("infoEntry.phonePlaceholder"),
|
||
border: "surround",
|
||
modelValue: $data.userPhone
|
||
}),
|
||
t: $data.flashingField === "contact" ? 1 : "",
|
||
v: common_vendor.t(_ctx.$t("infoEntry.whatsapp")),
|
||
w: common_vendor.t(_ctx.$t("infoEntry.contactMethod")),
|
||
x: common_vendor.o(($event) => $data.userWhats = $event),
|
||
y: common_vendor.p({
|
||
placeholder: _ctx.$t("infoEntry.whatsappPlaceholder"),
|
||
border: "surround",
|
||
modelValue: $data.userWhats
|
||
}),
|
||
z: $data.flashingField === "contact" ? 1 : "",
|
||
A: common_vendor.t(_ctx.$t("infoEntry.remark")),
|
||
B: common_vendor.o(($event) => $data.remark = $event),
|
||
C: common_vendor.p({
|
||
placeholder: _ctx.$t("infoEntry.remarkPlaceholder"),
|
||
border: "surround",
|
||
modelValue: $data.remark
|
||
}),
|
||
D: common_vendor.t(_ctx.$t("infoEntry.serviceInfo")),
|
||
E: common_vendor.t($data.checkInDate || "请选择入住日期"),
|
||
F: !$data.checkInDate ? 1 : "",
|
||
G: common_assets._imports_1,
|
||
H: common_vendor.o((...args) => $options.openCheckInCalendar && $options.openCheckInCalendar(...args)),
|
||
I: $data.flashingField === "checkInDate" ? 1 : "",
|
||
J: common_vendor.t($data.checkOutDate || "请选择退房日期"),
|
||
K: !$data.checkOutDate ? 1 : "",
|
||
L: common_assets._imports_1,
|
||
M: common_vendor.o((...args) => $options.openCheckOutCalendar && $options.openCheckOutCalendar(...args)),
|
||
N: $data.flashingField === "checkOutDate" ? 1 : "",
|
||
O: common_vendor.o(($event) => $data.countryCity = $event),
|
||
P: common_vendor.p({
|
||
placeholder: "请输入国家/城市",
|
||
border: "surround",
|
||
modelValue: $data.countryCity
|
||
}),
|
||
Q: $data.flashingField === "countryCity" ? 1 : "",
|
||
R: common_vendor.o(($event) => $data.hotelName = $event),
|
||
S: common_vendor.p({
|
||
placeholder: "请输入酒店名称",
|
||
border: "surround",
|
||
modelValue: $data.hotelName
|
||
}),
|
||
T: $data.flashingField === "hotelName" ? 1 : "",
|
||
U: common_vendor.o((...args) => $options.decreaseRoomCount && $options.decreaseRoomCount(...args)),
|
||
V: common_vendor.t($data.roomCount),
|
||
W: common_vendor.o((...args) => $options.increaseRoomCount && $options.increaseRoomCount(...args)),
|
||
X: $data.flashingField === "roomCount" ? 1 : "",
|
||
Y: common_vendor.t($options.roomTypeText),
|
||
Z: common_assets._imports_2$1,
|
||
aa: common_vendor.o(($event) => $data.showRoomTypePicker = true),
|
||
ab: $data.flashingField === "roomType" ? 1 : "",
|
||
ac: common_vendor.t($options.needMealText),
|
||
ad: common_assets._imports_2$1,
|
||
ae: common_vendor.o(($event) => $data.showMealRequirementPicker = true),
|
||
af: $data.needMeal
|
||
}, $data.needMeal ? {
|
||
ag: common_vendor.t($options.mealPlanText),
|
||
ah: common_assets._imports_2$1,
|
||
ai: common_vendor.o(($event) => $data.showMealPlanPicker = true),
|
||
aj: $data.flashingField === "mealPlan" ? 1 : ""
|
||
} : {}, {
|
||
ak: $data.needMeal
|
||
}, $data.needMeal ? {} : {}, {
|
||
al: common_vendor.t(_ctx.$t("common.submit")),
|
||
am: common_vendor.o(($event) => $options.checkData()),
|
||
an: common_vendor.o($options.onRoomTypeConfirm),
|
||
ao: common_vendor.o(($event) => $data.showRoomTypePicker = false),
|
||
ap: common_vendor.o(($event) => $data.showRoomTypePicker = false),
|
||
aq: common_vendor.p({
|
||
show: $data.showRoomTypePicker,
|
||
columns: $data.roomTypeColumns,
|
||
defaultIndex: [$data.roomTypeIndex],
|
||
keyName: "label"
|
||
}),
|
||
ar: common_vendor.o($options.onMealRequirementConfirm),
|
||
as: common_vendor.o(($event) => $data.showMealRequirementPicker = false),
|
||
at: common_vendor.o(($event) => $data.showMealRequirementPicker = false),
|
||
av: common_vendor.p({
|
||
show: $data.showMealRequirementPicker,
|
||
columns: $data.mealRequirementColumns,
|
||
defaultIndex: [$data.needMeal ? 0 : 1],
|
||
keyName: "label"
|
||
}),
|
||
aw: common_vendor.o($options.onMealPlanConfirm),
|
||
ax: common_vendor.o(($event) => $data.showMealPlanPicker = false),
|
||
ay: common_vendor.o(($event) => $data.showMealPlanPicker = false),
|
||
az: common_vendor.p({
|
||
show: $data.showMealPlanPicker,
|
||
columns: $data.mealPlanColumns,
|
||
defaultIndex: [$data.mealPlanIndex],
|
||
keyName: "label"
|
||
}),
|
||
aA: common_vendor.o($options.onCalendarConfirm),
|
||
aB: common_vendor.o($options.closeCalendar),
|
||
aC: common_vendor.p({
|
||
show: $data.showCalendar,
|
||
mode: "single",
|
||
minDate: $data.minDate,
|
||
maxDate: $data.maxDate,
|
||
confirmText: _ctx.$t("common.confirm"),
|
||
color: "#57C9DD"
|
||
})
|
||
});
|
||
}
|
||
const MiniProgramPage = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render]]);
|
||
wx.createPage(MiniProgramPage);
|
||
//# sourceMappingURL=../../../.sourcemap/mp-weixin/pages/appointment/hotel-reservation-page.js.map
|