From a7359d443b7a5c0697c449b9272d5eb2b81d4d5b Mon Sep 17 00:00:00 2001 From: Mauve Date: Tue, 22 Sep 2026 16:37:00 +0800 Subject: [PATCH] merge limo to daylight --- App.vue | 424 ++- api/bookingApi.js | 1 + api/commonApi.js | 1 - api/configApi.js | 2 +- api/limoApi.js | 22 + api/notificationApi.js | 9 + booking/bookingConfirm/bookingConfirm.vue | 1 + booking/bookingDetail/bookingDetail.vue | 2 +- booking/bookingRecord/bookingRecord.vue | 582 ++- booking/newBooking/newBooking.vue | 24 +- .../playerRoomCalendar/playerRoomCalendar.vue | 44 +- booking/submitBooking/submitBooking.vue | 276 +- common/config.js | 5 +- common/countryDialCodes.js | 257 ++ common/request.js | 13 +- components/header/header.vue | 14 +- limo/bookingDetail/bookingDetail.vue | 827 +++++ limo/newLimo/newLimo.vue | 3112 +++++++++++++++++ limo/notification/notification.vue | 761 ++++ locale/en.json | 29 +- locale/zh-Hant.json | 353 +- main.js | 11 + manifest.json | 6 +- .../ios/NetworkUtils.framework/Info.plist | Bin 756 -> 757 bytes .../ios/NetworkUtils.framework/NetworkUtils | Bin 69216 -> 141992 bytes .../fixedCoordinateConverter.js | 344 ++ pages.json | 91 +- pages/dashboard/dashboard.vue | 175 +- pages/findPlayer/findPlayer.vue | 308 +- pages/login/login.vue | 63 +- pages/notification/notification.vue | 232 +- pages/playerDetail/playerDetail.vue | 28 +- pages/roomCalendar/roomCalendar.vue | 27 +- pages/samlLogin/samlLogin.vue | 52 +- pages/setting/setting.vue | 20 +- salessupport/todoList/todoList.vue | 36 +- static/css/custom.scss | 261 +- static/css/limo.scss | 302 ++ static/css/todo.scss | 2 +- static/icon/tabbar/LNRB-select.png | Bin 0 -> 2956 bytes static/icon/tabbar/LNRB.png | Bin 0 -> 1723 bytes static/icon/tabbar/calendar-check-fill.png | Bin 0 -> 1339 bytes static/icon/tabbar/calendar-check.png | Bin 0 -> 1158 bytes static/icon/tabbar/ico_home.png | Bin 0 -> 865 bytes static/icon/tabbar/ico_home_active.png | Bin 0 -> 2118 bytes static/icon/tabbar/ico_set.png | Bin 0 -> 747 bytes static/icon/tabbar/ico_set_active.png | Bin 0 -> 1992 bytes static/icon/tabbar/ico_todo.png | Bin 0 -> 672 bytes static/icon/tabbar/ico_todo_active.png | Bin 0 -> 846 bytes static/icon/tabbar/taxi-fill.png | Bin 0 -> 883 bytes static/icon/tabbar/taxi-line.png | Bin 0 -> 630 bytes static/images/car_no.png | Bin 0 -> 6146 bytes static/images/clock.png | Bin 0 -> 6599 bytes static/images/copy.png | Bin 0 -> 3840 bytes static/images/hotel_notification.png | Bin 0 -> 3551 bytes static/images/limo.png | Bin 0 -> 3684 bytes static/images/limo_notification.png | Bin 0 -> 3906 bytes static/images/read_all.png | Bin 0 -> 7241 bytes static/images/room_book.png | Bin 1131 -> 692 bytes .../components/lu-data-select/props.js | 7 +- uni_modules/uni-datetime-picker/changelog.md | 173 + .../uni-datetime-picker/calendar-item.vue | 177 + .../uni-datetime-picker/calendar.vue | 947 +++++ .../uni-datetime-picker/i18n/en.json | 22 + .../uni-datetime-picker/i18n/index.js | 8 + .../uni-datetime-picker/i18n/zh-Hans.json | 22 + .../uni-datetime-picker/i18n/zh-Hant.json | 22 + .../uni-datetime-picker/time-picker.vue | 940 +++++ .../uni-datetime-picker.vue | 1068 ++++++ .../components/uni-datetime-picker/util.js | 421 +++ uni_modules/uni-datetime-picker/package.json | 107 + uni_modules/uni-datetime-picker/readme.md | 21 + .../uview-ui/components/u-tabs/u-tabs.vue | 2 +- 73 files changed, 11614 insertions(+), 1040 deletions(-) create mode 100644 api/limoApi.js create mode 100644 api/notificationApi.js create mode 100644 common/countryDialCodes.js create mode 100644 limo/bookingDetail/bookingDetail.vue create mode 100644 limo/newLimo/newLimo.vue create mode 100644 limo/notification/notification.vue create mode 100644 nativeplugins/NetworkUtils/ios/NetworkUtils.framework/fixedCoordinateConverter.js create mode 100644 static/css/limo.scss create mode 100644 static/icon/tabbar/LNRB-select.png create mode 100644 static/icon/tabbar/LNRB.png create mode 100644 static/icon/tabbar/calendar-check-fill.png create mode 100644 static/icon/tabbar/calendar-check.png create mode 100644 static/icon/tabbar/ico_home.png create mode 100644 static/icon/tabbar/ico_home_active.png create mode 100644 static/icon/tabbar/ico_set.png create mode 100644 static/icon/tabbar/ico_set_active.png create mode 100644 static/icon/tabbar/ico_todo.png create mode 100644 static/icon/tabbar/ico_todo_active.png create mode 100644 static/icon/tabbar/taxi-fill.png create mode 100644 static/icon/tabbar/taxi-line.png create mode 100644 static/images/car_no.png create mode 100644 static/images/clock.png create mode 100644 static/images/copy.png create mode 100644 static/images/hotel_notification.png create mode 100644 static/images/limo.png create mode 100644 static/images/limo_notification.png create mode 100644 static/images/read_all.png create mode 100644 uni_modules/uni-datetime-picker/changelog.md create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue create mode 100644 uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js create mode 100644 uni_modules/uni-datetime-picker/package.json create mode 100644 uni_modules/uni-datetime-picker/readme.md diff --git a/App.vue b/App.vue index b00a7cf..66790b8 100644 --- a/App.vue +++ b/App.vue @@ -1,6 +1,6 @@ diff --git a/booking/newBooking/newBooking.vue b/booking/newBooking/newBooking.vue index 8b458c1..8b1b544 100644 --- a/booking/newBooking/newBooking.vue +++ b/booking/newBooking/newBooking.vue @@ -458,9 +458,8 @@ this.userData = uni.getStorageSync("userData"); // this.modelBooking.bookingTypeId = this.userData.bookingTypeId; this.modelBooking.propertyId = this.userData.propertyId; - + this.modelBooking.teamId = this.userData.teamStructureId; - this.modelBooking.sectionName = this.userData.section; this.modelBooking.sectionId = this.userData.sectionId; this.modelBooking.createdBy = this.userData.userId; this.modelBooking.createdByName = this.userData.userName; @@ -701,7 +700,7 @@ } } } - + if (this.maxRange == 0) this.getSetting(); } } else { @@ -776,8 +775,9 @@ this.currentTask = task; } }); - + this.currentTask = null; + if (res.success) { item.name = res.data.englishName; @@ -807,10 +807,10 @@ let item = this.modelBooking.sharerList[index]; let book = uni.getStorageSync("bookingData") let oldItem = book.sharerList[index]; - // 姓名被手动修改后,清除不再匹配的玩家 ID。 - if (item.name != oldItem.name && item.playerId.length > 4) { - item.playerId = ""; - } + //清空plaerId + // if (item.name != oldItem.name && item.playerId.length == 8) { + // item.playerId = ""; + // } }, async buildCalendar() { uni.showLoading({ @@ -949,9 +949,9 @@ 'available': 0, }); } - + } - + var isWaitlist = false; var waitlistCount = 0; var criteriaCount = e.length - 1; @@ -984,7 +984,7 @@ let checkDate = JSON.parse(JSON.stringify(e)); checkDate.pop(); if (!this.checkDate(checkDate)) return false; - + //rebuild special code let specialCode = this.modelBooking.specialCode; let specialName = this.modelBooking.specialName; @@ -1525,7 +1525,7 @@ } else { this.showMsgNoExtend = true; } - + }, checkConsecutiveNight(checkInDate, night) { diff --git a/booking/playerRoomCalendar/playerRoomCalendar.vue b/booking/playerRoomCalendar/playerRoomCalendar.vue index 49822af..b4fc5ff 100644 --- a/booking/playerRoomCalendar/playerRoomCalendar.vue +++ b/booking/playerRoomCalendar/playerRoomCalendar.vue @@ -18,19 +18,19 @@ - + {{$t("common.playerId")}} - {{ safePlayerData.playerId }} + {{ playerData.playerId }} - + {{$t("common.tier")}} - {{ safePlayerData.tierName }} + {{ playerData.tierName }} - + {{$t("common.name")}} - {{ playerName }} + {{playerData.salutation + " " + playerData.name }} @@ -197,13 +197,11 @@ propertyTabItemStyle() { return { height: '70rpx', - padding: '0 24rpx', - flexShrink: 0, + padding: '0', }; }, propertyTabActiveStyle() { return { - whiteSpace: 'nowrap', color: '#C39A4B', fontFamily: 'Inter-Bold', fontSize: '30rpx', @@ -212,7 +210,6 @@ }, propertyTabInactiveStyle() { return { - whiteSpace: 'nowrap', color: '#111111', fontFamily: 'Inter-Bold', fontSize: '30rpx', @@ -241,7 +238,6 @@ this.navBack(); }, async loadPropertiesRoomTypes() { - if (!this.canLoadPlayerCalendar()) return; try { this.calendarReady = false; uni.showLoading({ @@ -249,19 +245,14 @@ }); await this.loadCalendarSetting(); const res = await getPropertiesRoomTypes({}); - if (this.isNoPermissionResponse(res)) { - this.showCalendarNoPermission(); - return; - } - this.propertyList = Array.isArray(res && res.propertyList) ? res.propertyList : []; - if (!this.propertyList.length) throw new Error('No calendar properties configured'); + this.propertyList = res.propertyList; this.selectedPropertyCode = this.getDefaultPropertyCode(); this.selectDefaultOptions(); this.buildCalendar(); await this.loadQualificationData(); this.calendarRenderKey += 1; this.$nextTick(() => { - this.calendarReady = !this.calendarNoPermission; + this.calendarReady = true; }); } catch (e) { uni.$u.toast(e.message || e.errMsg || 'Load property room types failed'); @@ -464,12 +455,10 @@ })); }, refreshCalendar() { - if (!this.canLoadPlayerCalendar()) return; this.ensureSelectedOptionsForRefresh(true); this.loadQualificationData(); }, async loadQualificationData() { - if (!this.canLoadPlayerCalendar()) return; const records = []; const dateRange = this.getCalendarDateRange(); const requestId = this.startCalendarRequest(); @@ -523,20 +512,7 @@ }); }, isNoPermissionResponse(res) { - return res && res.success === false && (res.errorCode || res.code) === 'NO_PERMISSION'; - }, - canLoadPlayerCalendar() { - this.userData = uni.getStorageSync("userData"); - if (!this.userData || this.userData.canViewCalendar !== true) { - this.showCalendarNoPermission(); - return false; - } - if (!this.safePlayerData.playerId) { - this.calendarReady = false; - uni.$u.toast(this.$t("common.dataNotFound")); - return false; - } - return true; + return res && res.success === false && res.errorCode === 'NO_PERMISSION'; }, showCalendarNoPermission() { this.qualificationMap = {}; diff --git a/booking/submitBooking/submitBooking.vue b/booking/submitBooking/submitBooking.vue index 4797510..d325089 100644 --- a/booking/submitBooking/submitBooking.vue +++ b/booking/submitBooking/submitBooking.vue @@ -139,10 +139,10 @@ - + {{ $t("common.misCharge") }} - {{ bookingData.miscCharge || "-" }} + {{ bookingData.mischarge || "-" }} @@ -254,18 +254,19 @@ {{$t("bookingConfirm.approvalRemark")}} - + customStyle="height:30px;width:100%;" label="Extend" name="Extend" + :value="unqualifiedDateCheckboxStates[currentUnqualifiedIndex] && unqualifiedDateCheckboxStates[currentUnqualifiedIndex].includes('Extend')"> + customStyle="height:30px;width:100%;" label="Remark" name="Remark" + :value="unqualifiedDateCheckboxStates[currentUnqualifiedIndex] && unqualifiedDateCheckboxStates[currentUnqualifiedIndex].includes('Remark')"> @@ -328,32 +329,41 @@ {{$t("bookingConfirm.approvalRemark")}} - - + + + + + + + + + + - + customStyle="height:30px;width:100%;" label="Extend" name="Extend" + :value="unqualifiedDateCheckboxStates[currentUnqualifiedIndex] && unqualifiedDateCheckboxStates[currentUnqualifiedIndex].includes('Extend')"> + customStyle="height:30px;width:100%;" label="Remark" name="Remark" + :value="unqualifiedDateCheckboxStates[currentUnqualifiedIndex] && unqualifiedDateCheckboxStates[currentUnqualifiedIndex].includes('Remark')"> @@ -427,8 +437,7 @@ selectedApprover:'', showRemark: false, showWaitlistModal:false, - // Waitlist 弹窗 Extend/Remark(必须与 u-checkbox-group 的 :value 绑定,勿用子项 :value) - waitlistOtherRemarkCheckList: [], + showRadio:false, unqualifiedDateList: [], currentUnqualifiedIndex: 0, unqualifiedDateRemarks: [], @@ -454,17 +463,6 @@ // 數據方法 getBooking(){ this.bookingData = uni.getStorageSync("bookingData"); - // 确保 roomRemark 是响应式字段,否则 iOS 上可能出现 u-checkbox 状态未被正确回刷导致“可多选” - if (this.bookingData !== null && this.bookingData !== undefined && typeof this.bookingData === 'object') { - const hasRoomRemark = Object.prototype.hasOwnProperty.call(this.bookingData, 'roomRemark'); - if (!hasRoomRemark || this.bookingData.roomRemark === null || this.bookingData.roomRemark === undefined || this.bookingData.roomRemark === 'null') { - (this.$set ? this.$set(this.bookingData, 'roomRemark', '') : this.bookingData.roomRemark = ''); - } - const hasOtherRemark = Object.prototype.hasOwnProperty.call(this.bookingData, 'otherRemark'); - if (!hasOtherRemark || this.bookingData.otherRemark === null || this.bookingData.otherRemark === undefined || this.bookingData.otherRemark === 'null') { - (this.$set ? this.$set(this.bookingData, 'otherRemark', '') : this.bookingData.otherRemark = ''); - } - } if(this.bookingData!==null && this.bookingData!==undefined && this.bookingData!==''){ this.oldDateList = this.bookingData.dateList; this.checkList = []; @@ -500,7 +498,11 @@ this.submitBooking(); } }, - buildUnqualifiedDateLists() { + submitApproval() { + // 显示审批模态框 + this.getApprovalReason(); + this.showApprovalModal = true; + this.showModalBtn = true; this.currentUnqualifiedIndex = 0; this.unqualifiedDateList = []; this.unqualifiedDateRemarks = []; @@ -508,27 +510,33 @@ this.unqualifiedDateApprovers = []; this.unqualifiedDateOtherRemarks = []; this.unqualifiedDateCheckboxStates = []; - if (this.checkList != null && this.checkList.length > 0) { - if (this.bookingData.bookType == 1) { - for (let i = 0; i < this.bookingData.extendDate.length; i++) { - for (let j = 0; j < this.checkList.length; j++) { - if (i == this.checkList[j] && this.bookingData.extendDate[i].status == 1) { + if(this.checkList!=null && this.checkList.length>0){ + if(this.bookingData.bookType==1){ + // 把extendDate中的状态都设置成不够分 + for(let i=0;i uItem === item); - if (unqualifiedIndex === -1 && item.date && item.date.length) { - unqualifiedIndex = this.unqualifiedDateList.findIndex((uItem) => { - const ud = uItem.date; - const id = item.date; - return ud && id && ud.length && id.length && - ud[0] === id[0] && ud[ud.length - 1] === id[id.length - 1]; - }); - } - // 仅一条 Waitlist/Unqualified 时,引用不一致也会导致 findIndex 失败,直接对齐下标 0 - if (unqualifiedIndex === -1 && this.unqualifiedDateList.length === 1) { - unqualifiedIndex = 0; - } - const checkboxState = unqualifiedIndex !== -1 - ? (this.unqualifiedDateCheckboxStates[unqualifiedIndex] || []) - : []; - const otherSlot = unqualifiedIndex !== -1 - ? (this.unqualifiedDateOtherRemarks[unqualifiedIndex] || '') - : ''; - const wlTags = this.waitlistOtherRemarkCheckList || []; - const globalOther = (this.bookingData && this.bookingData.otherRemark) ? String(this.bookingData.otherRemark) : ''; - const parseTags = (s) => String(s).split(';').map((x) => x.trim()).filter(Boolean); - const hasExtend = checkboxState.includes('Extend') || - parseTags(otherSlot).includes('Extend') || - wlTags.includes('Extend') || - parseTags(globalOther).includes('Extend'); + let remarkArr = []; + let roomRemark = this.bookingData.roomRemark; + let otherRemark = this.bookingData.otherRemark; + if(roomRemark!=''&&roomRemark!=undefined) remarkArr.push(roomRemark); + if(otherRemark!=''&&otherRemark!=undefined) remarkArr.push(otherRemark); - const roomRemark = this.bookingData.roomRemark; - const idxRemark = unqualifiedIndex !== -1 ? this.unqualifiedDateRemarks[unqualifiedIndex] : ''; - const manualRemark = (idxRemark != null && idxRemark !== '') ? idxRemark : this.freeRemark; - const remarkChecked = unqualifiedIndex !== -1 && - (this.unqualifiedDateCheckboxStates[unqualifiedIndex] || []).includes('Remark'); - - if (unqualifiedIndex !== -1 && this.unqualifiedDateOtherRemarks[unqualifiedIndex] != null) { - this.bookingData.otherRemark = this.unqualifiedDateOtherRemarks[unqualifiedIndex]; + // 找到对应的unqualifiedDate索引 + const unqualifiedIndex = this.unqualifiedDateList.findIndex(uItem => uItem === item); + let extendStr = ''; + if (unqualifiedIndex !== -1) { + const checkboxState = this.unqualifiedDateCheckboxStates[unqualifiedIndex] || []; + if (checkboxState.includes('Extend')) { + extendStr = 'Extend'; + } } - // 对应 BookingDate 的 remark:勾选 Extend 时放在字符串首位 - const dateParts = []; - if (hasExtend) { - dateParts.push('Extend'); - } - if (roomRemark != null && roomRemark !== '' && roomRemark !== undefined) { - dateParts.push(roomRemark); - } if (item.status == 1 && - item.remarkText != null && item.remarkText !== '' && item.remarkText !== undefined) { - dateParts.push(item.remarkText); - } - if ((remarkChecked || this.showRemark) && manualRemark !== '' && manualRemark != null && item.status == 1) { - if (manualRemark !== item.remarkText) dateParts.push(manualRemark); + item.remarkText != '' && + item.remarkText != undefined) { + if (extendStr) { + remarkArr.push(extendStr + '; ' + item.remarkText); + } else { + remarkArr.push(item.remarkText); + } + } else if (item.status == 1 && extendStr) { + remarkArr.push(extendStr); } + + if(this.showRemark&&this.freeRemark!=''&&item.status==1) remarkArr.push(this.freeRemark); - const dateRemarkJoin = dateParts.join('; '); - if (dateRemarkJoin) { - this.bookingData.remark = dateRemarkJoin; - item.remark = dateRemarkJoin; - } else { + if(remarkArr.length>0) { + this.bookingData.remark = remarkArr.join('; '); + item.remark = remarkArr.join('; '); + }else{ this.bookingData.remark = ""; item.remark = ""; } @@ -1585,10 +1563,6 @@ }, showWaitlistPop() { - // 关键:直接点「放入 Waitlist」不会经过 submitApproval,必须在此处填充 unqualifiedDateList, - // 否则 getWaitlistRemark 里 findIndex 恒为 -1,Extend 永远不会写入 remark - this.buildUnqualifiedDateLists(); - this.waitlistOtherRemarkCheckList = (this.unqualifiedDateCheckboxStates[0] || []).slice(); this.showWaitlistModal = true; this.showMsgBox = false; }, @@ -1632,27 +1606,17 @@ } }); }, - onWaitlistRoomRemarkGroupChange(e) { - const raw = Array.isArray(e) ? e : (e && Array.isArray(e.detail) ? e.detail : []); - const names = raw.map((x) => (x != null ? String(x) : '')).filter(Boolean); - if (!this.bookingData) { - return; + changeRoomRemark(e,item) { + if (e) { + if(e==item.roomRemark){ + item.roomRemark="" + item.showRadio = true; + setTimeout(()=>{item.showRadio = false;this.$forceUpdate()},1) + }else{ + item.roomRemark=e + } } - if (!Object.prototype.hasOwnProperty.call(this.bookingData, 'roomRemark')) { - this.$set(this.bookingData, 'roomRemark', ''); - } - if (names.length === 0) { - this.bookingData.roomRemark = ''; - return; - } - if (names.length === 1) { - this.bookingData.roomRemark = names[0]; - return; - } - // 双选时视为互斥:保留本次切换目标(与原先不同的那一项) - const prev = this.bookingData.roomRemark; - const next = names.find((n) => n !== prev) || names[names.length - 1]; - this.bookingData.roomRemark = next; + this.$forceUpdate() }, // changeOtherRemark(e,item) { // if (e) { @@ -1671,41 +1635,27 @@ // this.$forceUpdate() // } // }, - changeWaitlistOtherRemark(e) { - const raw = Array.isArray(e) ? e : (e && Array.isArray(e.detail) ? e.detail : []); - const names = raw.map((x) => (x != null ? String(x) : '')).filter(Boolean); - this.waitlistOtherRemarkCheckList = names.slice(); - const extras = names.filter((n) => n !== 'Remark'); - const str = extras.join('; '); - this.showRemark = names.includes('Remark'); - const n = this.unqualifiedDateCheckboxStates.length; - for (let i = 0; i < n; i++) { - this.$set(this.unqualifiedDateCheckboxStates, i, names.slice()); - this.$set(this.unqualifiedDateOtherRemarks, i, str); - } - if (this.bookingData) { - this.bookingData.otherRemark = str; - } - }, changeOtherRemark(e) { - const raw = Array.isArray(e) ? e : (e && Array.isArray(e.detail) ? e.detail : []); - const idx = this.currentUnqualifiedIndex; - if (!raw || raw.length === 0) { - this.showRemark = false; - this.$set(this.unqualifiedDateOtherRemarks, idx, ''); - this.$set(this.unqualifiedDateCheckboxStates, idx, []); - if (this.bookingData) { - this.bookingData.otherRemark = ''; + if (e) { + let str = ''; + let show = false; + for (let i = 0; i < e.length; i++) { + + if (e[i] == 'Remark') { + show = true; + } else { + str = e[i]; + } } - return; - } - const names = raw.map((x) => (x != null ? String(x) : '')).filter(Boolean); - const extras = names.filter((n) => n !== 'Remark'); - this.showRemark = names.includes('Remark'); - this.$set(this.unqualifiedDateCheckboxStates, idx, names.slice()); - this.$set(this.unqualifiedDateOtherRemarks, idx, extras.join('; ')); - if (this.bookingData) { - this.bookingData.otherRemark = extras.join('; '); + this.showRemark = show; + // 存储到当前索引的otherRemark + this.unqualifiedDateOtherRemarks[this.currentUnqualifiedIndex] = str; + // 存储checkbox状态 + this.unqualifiedDateCheckboxStates[this.currentUnqualifiedIndex] = e; + } else { + this.showRemark = false; + this.unqualifiedDateOtherRemarks[this.currentUnqualifiedIndex] = ''; + this.unqualifiedDateCheckboxStates[this.currentUnqualifiedIndex] = []; } }, @@ -1721,16 +1671,6 @@ }, }, computed:{ - waitlistRoomGroupValue() { - if (!this.bookingData || !this.bookingData.roomRemark) { - return []; - } - const r = this.bookingData.roomRemark; - if (r === '2nd Room' || r === '3rd Room') { - return [r]; - } - return []; - }, getStatusColor(){ return function (booking) { let operaStatus = null; @@ -2051,4 +1991,4 @@ color: #C39A4B; margin-bottom: 15px; } - + \ No newline at end of file diff --git a/common/config.js b/common/config.js index 40beca1..049fa0c 100644 --- a/common/config.js +++ b/common/config.js @@ -14,7 +14,7 @@ class config { //this.version = "beta 2.0"; //ali ECS - // this.internalUrl = 'https://mcrm.willtechmacau.com:9086'; + // this.internalUrl = 'https://sep.willtechmo.com'; this.externalUrl = 'https://mp.mixixili.cn'; this.debugMode = true; @@ -36,4 +36,5 @@ class config { this.emailExt = "";// 如果是dev的時候設置成空字符串,讓他們自己輸入 } } -export default config \ No newline at end of file +export default config + \ No newline at end of file diff --git a/common/countryDialCodes.js b/common/countryDialCodes.js new file mode 100644 index 0000000..c377008 --- /dev/null +++ b/common/countryDialCodes.js @@ -0,0 +1,257 @@ +const countryDialCodes = [ + { iso2: 'MO', country: 'Macau', code: '+853' }, + { iso2: 'CN', country: 'China', code: '+86' }, + { iso2: 'HK', country: 'Hong Kong', code: '+852' }, + { iso2: 'AF', country: 'Afghanistan', code: '+93' }, + { iso2: 'AX', country: 'Aland Islands', code: '+358' }, + { iso2: 'AL', country: 'Albania', code: '+355' }, + { iso2: 'DZ', country: 'Algeria', code: '+213' }, + { iso2: 'AS', country: 'American Samoa', code: '+1' }, + { iso2: 'AD', country: 'Andorra', code: '+376' }, + { iso2: 'AO', country: 'Angola', code: '+244' }, + { iso2: 'AI', country: 'Anguilla', code: '+1' }, + { iso2: 'AG', country: 'Antigua and Barbuda', code: '+1' }, + { iso2: 'AR', country: 'Argentina', code: '+54' }, + { iso2: 'AM', country: 'Armenia', code: '+374' }, + { iso2: 'AW', country: 'Aruba', code: '+297' }, + { iso2: 'AC', country: 'Ascension Island', code: '+247' }, + { iso2: 'AU', country: 'Australia', code: '+61' }, + { iso2: 'AT', country: 'Austria', code: '+43' }, + { iso2: 'AZ', country: 'Azerbaijan', code: '+994' }, + { iso2: 'BS', country: 'Bahamas', code: '+1' }, + { iso2: 'BH', country: 'Bahrain', code: '+973' }, + { iso2: 'BD', country: 'Bangladesh', code: '+880' }, + { iso2: 'BB', country: 'Barbados', code: '+1' }, + { iso2: 'BY', country: 'Belarus', code: '+375' }, + { iso2: 'BE', country: 'Belgium', code: '+32' }, + { iso2: 'BZ', country: 'Belize', code: '+501' }, + { iso2: 'BJ', country: 'Benin', code: '+229' }, + { iso2: 'BM', country: 'Bermuda', code: '+1' }, + { iso2: 'BT', country: 'Bhutan', code: '+975' }, + { iso2: 'BO', country: 'Bolivia', code: '+591' }, + { iso2: 'BA', country: 'Bosnia and Herzegovina', code: '+387' }, + { iso2: 'BW', country: 'Botswana', code: '+267' }, + { iso2: 'BR', country: 'Brazil', code: '+55' }, + { iso2: 'IO', country: 'British Indian Ocean Territory', code: '+246' }, + { iso2: 'VG', country: 'British Virgin Islands', code: '+1' }, + { iso2: 'BN', country: 'Brunei', code: '+673' }, + { iso2: 'BG', country: 'Bulgaria', code: '+359' }, + { iso2: 'BF', country: 'Burkina Faso', code: '+226' }, + { iso2: 'BI', country: 'Burundi', code: '+257' }, + { iso2: 'KH', country: 'Cambodia', code: '+855' }, + { iso2: 'CM', country: 'Cameroon', code: '+237' }, + { iso2: 'CA', country: 'Canada', code: '+1' }, + { iso2: 'CV', country: 'Cape Verde', code: '+238' }, + { iso2: 'BQ', country: 'Caribbean Netherlands', code: '+599' }, + { iso2: 'KY', country: 'Cayman Islands', code: '+1' }, + { iso2: 'CF', country: 'Central African Republic', code: '+236' }, + { iso2: 'TD', country: 'Chad', code: '+235' }, + { iso2: 'CL', country: 'Chile', code: '+56' }, + { iso2: 'CX', country: 'Christmas Island', code: '+61' }, + { iso2: 'CC', country: 'Cocos (Keeling) Islands', code: '+61' }, + { iso2: 'CO', country: 'Colombia', code: '+57' }, + { iso2: 'KM', country: 'Comoros', code: '+269' }, + { iso2: 'CG', country: 'Congo - Brazzaville', code: '+242' }, + { iso2: 'CD', country: 'Congo - Kinshasa', code: '+243' }, + { iso2: 'CK', country: 'Cook Islands', code: '+682' }, + { iso2: 'CR', country: 'Costa Rica', code: '+506' }, + { iso2: 'CI', country: 'Cote d\'Ivoire', code: '+225' }, + { iso2: 'HR', country: 'Croatia', code: '+385' }, + { iso2: 'CU', country: 'Cuba', code: '+53' }, + { iso2: 'CW', country: 'Curacao', code: '+599' }, + { iso2: 'CY', country: 'Cyprus', code: '+357' }, + { iso2: 'CZ', country: 'Czechia', code: '+420' }, + { iso2: 'DK', country: 'Denmark', code: '+45' }, + { iso2: 'DJ', country: 'Djibouti', code: '+253' }, + { iso2: 'DM', country: 'Dominica', code: '+1' }, + { iso2: 'DO', country: 'Dominican Republic', code: '+1' }, + { iso2: 'EC', country: 'Ecuador', code: '+593' }, + { iso2: 'EG', country: 'Egypt', code: '+20' }, + { iso2: 'SV', country: 'El Salvador', code: '+503' }, + { iso2: 'GQ', country: 'Equatorial Guinea', code: '+240' }, + { iso2: 'ER', country: 'Eritrea', code: '+291' }, + { iso2: 'EE', country: 'Estonia', code: '+372' }, + { iso2: 'SZ', country: 'Eswatini', code: '+268' }, + { iso2: 'ET', country: 'Ethiopia', code: '+251' }, + { iso2: 'FK', country: 'Falkland Islands', code: '+500' }, + { iso2: 'FO', country: 'Faroe Islands', code: '+298' }, + { iso2: 'FJ', country: 'Fiji', code: '+679' }, + { iso2: 'FI', country: 'Finland', code: '+358' }, + { iso2: 'FR', country: 'France', code: '+33' }, + { iso2: 'GF', country: 'French Guiana', code: '+594' }, + { iso2: 'PF', country: 'French Polynesia', code: '+689' }, + { iso2: 'GA', country: 'Gabon', code: '+241' }, + { iso2: 'GM', country: 'Gambia', code: '+220' }, + { iso2: 'GE', country: 'Georgia', code: '+995' }, + { iso2: 'DE', country: 'Germany', code: '+49' }, + { iso2: 'GH', country: 'Ghana', code: '+233' }, + { iso2: 'GI', country: 'Gibraltar', code: '+350' }, + { iso2: 'GR', country: 'Greece', code: '+30' }, + { iso2: 'GL', country: 'Greenland', code: '+299' }, + { iso2: 'GD', country: 'Grenada', code: '+1' }, + { iso2: 'GP', country: 'Guadeloupe', code: '+590' }, + { iso2: 'GU', country: 'Guam', code: '+1' }, + { iso2: 'GT', country: 'Guatemala', code: '+502' }, + { iso2: 'GG', country: 'Guernsey', code: '+44' }, + { iso2: 'GN', country: 'Guinea', code: '+224' }, + { iso2: 'GW', country: 'Guinea-Bissau', code: '+245' }, + { iso2: 'GY', country: 'Guyana', code: '+592' }, + { iso2: 'HT', country: 'Haiti', code: '+509' }, + { iso2: 'HN', country: 'Honduras', code: '+504' }, + { iso2: 'HU', country: 'Hungary', code: '+36' }, + { iso2: 'IS', country: 'Iceland', code: '+354' }, + { iso2: 'IN', country: 'India', code: '+91' }, + { iso2: 'ID', country: 'Indonesia', code: '+62' }, + { iso2: 'IR', country: 'Iran', code: '+98' }, + { iso2: 'IQ', country: 'Iraq', code: '+964' }, + { iso2: 'IE', country: 'Ireland', code: '+353' }, + { iso2: 'IM', country: 'Isle of Man', code: '+44' }, + { iso2: 'IL', country: 'Israel', code: '+972' }, + { iso2: 'IT', country: 'Italy', code: '+39' }, + { iso2: 'JM', country: 'Jamaica', code: '+1' }, + { iso2: 'JP', country: 'Japan', code: '+81' }, + { iso2: 'JE', country: 'Jersey', code: '+44' }, + { iso2: 'JO', country: 'Jordan', code: '+962' }, + { iso2: 'KZ', country: 'Kazakhstan', code: '+7' }, + { iso2: 'KE', country: 'Kenya', code: '+254' }, + { iso2: 'KI', country: 'Kiribati', code: '+686' }, + { iso2: 'XK', country: 'Kosovo', code: '+383' }, + { iso2: 'KW', country: 'Kuwait', code: '+965' }, + { iso2: 'KG', country: 'Kyrgyzstan', code: '+996' }, + { iso2: 'LA', country: 'Laos', code: '+856' }, + { iso2: 'LV', country: 'Latvia', code: '+371' }, + { iso2: 'LB', country: 'Lebanon', code: '+961' }, + { iso2: 'LS', country: 'Lesotho', code: '+266' }, + { iso2: 'LR', country: 'Liberia', code: '+231' }, + { iso2: 'LY', country: 'Libya', code: '+218' }, + { iso2: 'LI', country: 'Liechtenstein', code: '+423' }, + { iso2: 'LT', country: 'Lithuania', code: '+370' }, + { iso2: 'LU', country: 'Luxembourg', code: '+352' }, + { iso2: 'MG', country: 'Madagascar', code: '+261' }, + { iso2: 'MW', country: 'Malawi', code: '+265' }, + { iso2: 'MY', country: 'Malaysia', code: '+60' }, + { iso2: 'MV', country: 'Maldives', code: '+960' }, + { iso2: 'ML', country: 'Mali', code: '+223' }, + { iso2: 'MT', country: 'Malta', code: '+356' }, + { iso2: 'MH', country: 'Marshall Islands', code: '+692' }, + { iso2: 'MQ', country: 'Martinique', code: '+596' }, + { iso2: 'MR', country: 'Mauritania', code: '+222' }, + { iso2: 'MU', country: 'Mauritius', code: '+230' }, + { iso2: 'YT', country: 'Mayotte', code: '+262' }, + { iso2: 'MX', country: 'Mexico', code: '+52' }, + { iso2: 'FM', country: 'Micronesia', code: '+691' }, + { iso2: 'MD', country: 'Moldova', code: '+373' }, + { iso2: 'MC', country: 'Monaco', code: '+377' }, + { iso2: 'MN', country: 'Mongolia', code: '+976' }, + { iso2: 'ME', country: 'Montenegro', code: '+382' }, + { iso2: 'MS', country: 'Montserrat', code: '+1' }, + { iso2: 'MA', country: 'Morocco', code: '+212' }, + { iso2: 'MZ', country: 'Mozambique', code: '+258' }, + { iso2: 'MM', country: 'Myanmar (Burma)', code: '+95' }, + { iso2: 'NA', country: 'Namibia', code: '+264' }, + { iso2: 'NR', country: 'Nauru', code: '+674' }, + { iso2: 'NP', country: 'Nepal', code: '+977' }, + { iso2: 'NL', country: 'Netherlands', code: '+31' }, + { iso2: 'NC', country: 'New Caledonia', code: '+687' }, + { iso2: 'NZ', country: 'New Zealand', code: '+64' }, + { iso2: 'NI', country: 'Nicaragua', code: '+505' }, + { iso2: 'NE', country: 'Niger', code: '+227' }, + { iso2: 'NG', country: 'Nigeria', code: '+234' }, + { iso2: 'NU', country: 'Niue', code: '+683' }, + { iso2: 'NF', country: 'Norfolk Island', code: '+672' }, + { iso2: 'KP', country: 'North Korea', code: '+850' }, + { iso2: 'MK', country: 'North Macedonia', code: '+389' }, + { iso2: 'MP', country: 'Northern Mariana Islands', code: '+1' }, + { iso2: 'NO', country: 'Norway', code: '+47' }, + { iso2: 'OM', country: 'Oman', code: '+968' }, + { iso2: 'PK', country: 'Pakistan', code: '+92' }, + { iso2: 'PW', country: 'Palau', code: '+680' }, + { iso2: 'PS', country: 'Palestinian Territories', code: '+970' }, + { iso2: 'PA', country: 'Panama', code: '+507' }, + { iso2: 'PG', country: 'Papua New Guinea', code: '+675' }, + { iso2: 'PY', country: 'Paraguay', code: '+595' }, + { iso2: 'PE', country: 'Peru', code: '+51' }, + { iso2: 'PH', country: 'Philippines', code: '+63' }, + { iso2: 'PL', country: 'Poland', code: '+48' }, + { iso2: 'PT', country: 'Portugal', code: '+351' }, + { iso2: 'PR', country: 'Puerto Rico', code: '+1' }, + { iso2: 'QA', country: 'Qatar', code: '+974' }, + { iso2: 'RE', country: 'Reunion', code: '+262' }, + { iso2: 'RO', country: 'Romania', code: '+40' }, + { iso2: 'RU', country: 'Russia', code: '+7' }, + { iso2: 'RW', country: 'Rwanda', code: '+250' }, + { iso2: 'WS', country: 'Samoa', code: '+685' }, + { iso2: 'SM', country: 'San Marino', code: '+378' }, + { iso2: 'ST', country: 'Sao Tome and Principe', code: '+239' }, + { iso2: 'SA', country: 'Saudi Arabia', code: '+966' }, + { iso2: 'SN', country: 'Senegal', code: '+221' }, + { iso2: 'RS', country: 'Serbia', code: '+381' }, + { iso2: 'SC', country: 'Seychelles', code: '+248' }, + { iso2: 'SL', country: 'Sierra Leone', code: '+232' }, + { iso2: 'SG', country: 'Singapore', code: '+65' }, + { iso2: 'SX', country: 'Sint Maarten', code: '+1' }, + { iso2: 'SK', country: 'Slovakia', code: '+421' }, + { iso2: 'SI', country: 'Slovenia', code: '+386' }, + { iso2: 'SB', country: 'Solomon Islands', code: '+677' }, + { iso2: 'SO', country: 'Somalia', code: '+252' }, + { iso2: 'ZA', country: 'South Africa', code: '+27' }, + { iso2: 'KR', country: 'South Korea', code: '+82' }, + { iso2: 'SS', country: 'South Sudan', code: '+211' }, + { iso2: 'ES', country: 'Spain', code: '+34' }, + { iso2: 'LK', country: 'Sri Lanka', code: '+94' }, + { iso2: 'BL', country: 'St. Barthelemy', code: '+590' }, + { iso2: 'SH', country: 'St. Helena', code: '+290' }, + { iso2: 'KN', country: 'St. Kitts and Nevis', code: '+1' }, + { iso2: 'LC', country: 'St. Lucia', code: '+1' }, + { iso2: 'MF', country: 'St. Martin', code: '+590' }, + { iso2: 'PM', country: 'St. Pierre and Miquelon', code: '+508' }, + { iso2: 'VC', country: 'St. Vincent and Grenadines', code: '+1' }, + { iso2: 'SD', country: 'Sudan', code: '+249' }, + { iso2: 'SR', country: 'Suriname', code: '+597' }, + { iso2: 'SJ', country: 'Svalbard and Jan Mayen', code: '+47' }, + { iso2: 'SE', country: 'Sweden', code: '+46' }, + { iso2: 'CH', country: 'Switzerland', code: '+41' }, + { iso2: 'SY', country: 'Syria', code: '+963' }, + { iso2: 'TW', country: 'Taiwan', code: '+886' }, + { iso2: 'TJ', country: 'Tajikistan', code: '+992' }, + { iso2: 'TZ', country: 'Tanzania', code: '+255' }, + { iso2: 'TH', country: 'Thailand', code: '+66' }, + { iso2: 'TL', country: 'Timor-Leste', code: '+670' }, + { iso2: 'TG', country: 'Togo', code: '+228' }, + { iso2: 'TK', country: 'Tokelau', code: '+690' }, + { iso2: 'TO', country: 'Tonga', code: '+676' }, + { iso2: 'TT', country: 'Trinidad and Tobago', code: '+1' }, + { iso2: 'TA', country: 'Tristan da Cunha', code: '+290' }, + { iso2: 'TN', country: 'Tunisia', code: '+216' }, + { iso2: 'TR', country: 'Turkiye', code: '+90' }, + { iso2: 'TM', country: 'Turkmenistan', code: '+993' }, + { iso2: 'TC', country: 'Turks and Caicos Islands', code: '+1' }, + { iso2: 'TV', country: 'Tuvalu', code: '+688' }, + { iso2: 'VI', country: 'U.S. Virgin Islands', code: '+1' }, + { iso2: 'UG', country: 'Uganda', code: '+256' }, + { iso2: 'UA', country: 'Ukraine', code: '+380' }, + { iso2: 'AE', country: 'United Arab Emirates', code: '+971' }, + { iso2: 'GB', country: 'United Kingdom', code: '+44' }, + { iso2: 'US', country: 'United States', code: '+1' }, + { iso2: 'UY', country: 'Uruguay', code: '+598' }, + { iso2: 'UZ', country: 'Uzbekistan', code: '+998' }, + { iso2: 'VU', country: 'Vanuatu', code: '+678' }, + { iso2: 'VA', country: 'Vatican City', code: '+39' }, + { iso2: 'VE', country: 'Venezuela', code: '+58' }, + { iso2: 'VN', country: 'Vietnam', code: '+84' }, + { iso2: 'WF', country: 'Wallis and Futuna', code: '+681' }, + { iso2: 'EH', country: 'Western Sahara', code: '+212' }, + { iso2: 'YE', country: 'Yemen', code: '+967' }, + { iso2: 'ZM', country: 'Zambia', code: '+260' }, + { iso2: 'ZW', country: 'Zimbabwe', code: '+263' }, +]; + +export function getCountryDialCodeOptions() { + return countryDialCodes.map(item => ({ + ...item, + label: item.code, + value: item.code, + })); +} + +export default countryDialCodes; diff --git a/common/request.js b/common/request.js index e930f0f..4439fa9 100644 --- a/common/request.js +++ b/common/request.js @@ -121,10 +121,8 @@ module.exports = (vm) => { break; case 400: kickout() - break; case 401: - if(error.config.url.indexOf('refresh_token')==-1 && error.config.url.indexOf('logout')==-1 && !error.config.custom?.tokenRetried){ - error.config.custom = {...error.config.custom, tokenRetried: true}; + if(error.config.url.indexOf('refresh_token')==-1 && error.config.url.indexOf('logout')==-1){ return tokenRefresh().then(_ => { error.config.header.Authorization = uni.getStorageSync("token"); error.config.header.RefreshToken = uni.getStorageSync("refreshToken") @@ -143,22 +141,19 @@ module.exports = (vm) => { } function tokenRefresh(){ - const storedRefreshToken = uni.getStorageSync("refreshToken"); - if (storedRefreshToken) { + let oldToken = uni.getStorageSync("token"); + if (oldToken !== null && oldToken !== '') { return refreshToken({}) .then((data) => { - if (!data?.success || !data.accessToken) throw new Error('Token refresh failed'); uni.setStorageSync("token",data.accessToken); uni.setStorageSync("tokenTime",dayjs().unix()); return Promise.resolve(true) }) .catch(error => { kickout() - return Promise.reject(error); }) } else { kickout() - return Promise.reject(new Error('Missing RefreshToken')); } } function checkToken(){ @@ -203,4 +198,4 @@ function checkIP(header){ } }*/ } -} +} \ No newline at end of file diff --git a/components/header/header.vue b/components/header/header.vue index c61140a..d65631a 100644 --- a/components/header/header.vue +++ b/components/header/header.vue @@ -10,6 +10,13 @@ bgColor="#C39A4B" titleStyle="max-width:none;width:auto;font-weight:bold;color:#ffffff;" > + + + - \ No newline at end of file + diff --git a/limo/bookingDetail/bookingDetail.vue b/limo/bookingDetail/bookingDetail.vue new file mode 100644 index 0000000..6d59b89 --- /dev/null +++ b/limo/bookingDetail/bookingDetail.vue @@ -0,0 +1,827 @@ + + + + + diff --git a/limo/newLimo/newLimo.vue b/limo/newLimo/newLimo.vue new file mode 100644 index 0000000..3531dde --- /dev/null +++ b/limo/newLimo/newLimo.vue @@ -0,0 +1,3112 @@ + + + + + diff --git a/limo/notification/notification.vue b/limo/notification/notification.vue new file mode 100644 index 0000000..45874a6 --- /dev/null +++ b/limo/notification/notification.vue @@ -0,0 +1,761 @@ + + + + + diff --git a/locale/en.json b/locale/en.json index 7802045..58b3f33 100644 --- a/locale/en.json +++ b/locale/en.json @@ -232,9 +232,9 @@ "bookingDetail.failed":" Failed", "bookingDetail.confirmApprove":"Are you sure to approve booking?", "bookingDetail.confirmReject":"Are you sure to reject booking?", - "bookingDetail.changeMiscChargeSuccess":"Change Misc Charge Success", + "bookingDetail.changeMisChargeSuccess":"Change MisCharge Success", "bookingDetail.miscChargeLess":"Amount cannot be less than original.", - "bookingDetail.changeMiscChargeFail":"Change Misc Charge Fail", + "bookingDetail.changeMisChargeFail":"Change MisCharge Fail", "multipleDate.title":"Multiple Date", "multipleDate.addDate":"ADD DATE", "multipleDate.pleaseAddDate":"Please Add Date", @@ -295,7 +295,7 @@ "hotel.title":"Room", "reservations.title":"Reservations", "approval.title":"Approval", - "hotel.roombooking":"Room Booking", + "hotel.roombooking":"Limo & Room Booking", "approval.pendingApproval":"Pending Approval", "approval.allRequest":"All Request", "approval.searchStr":"Search", @@ -319,5 +319,26 @@ "notification.pendingApproval":"Pending Approval", "notification.pendingApprovalRequest": "Pending Approval Request", "playerDetail.confirm":"CONFIRM", - "newBooking.validEta":"The ETA time format is incorrect. Please re-enter it, eg: HH:mm" + "newBooking.validEta":"The ETA time format is incorrect. Please re-enter it, eg: HH:mm", + "notification.title":"Notification", + "approvalRouting.title":"Approval Routing", + "limoBookingRecord.bookingType":"Booking Type", + "limoBookingRecord.pickupDatetime":"Pick up Datetime", + "limoBookingRecord.pickup":"Pick up", + "limoBookingRecord.dropoff":"Drop off", + "limoBookingRecord.extraDropoff":"Extra Drop off", + "limoBookingDetail.carTypeAndPlate":"Car Type and Plate", + "limoBookingDetail.overrideBy":"Override By", + "limoBookingDetail.tripPrice":"Trip Price", + "limoBookingDetail.driverSource":"Driver Source", + "limoBookingDetail.remark":"Remark", + "limoBookingDetail.driverContact":"Driver Contact", + "limoBookingDetail.pickupPoint":"Pick up point", + "limoBookingDetail.extraDropoff":"Extra Drop-off", + "limoBookingDetail.dropoffPoint":"Drop off point", + "limoBookingDetail.flightNo":"Flight No", + "limoBookingDetail.greetType":"Greet Type", + "limoBookingCopy.carType":"Car Type", + "limoBookingCopy.carNo":"Car No", + "limoBookingCopy.driverContact":"Driver Contact" } diff --git a/locale/zh-Hant.json b/locale/zh-Hant.json index e1491ef..ce82aa8 100644 --- a/locale/zh-Hant.json +++ b/locale/zh-Hant.json @@ -1,4 +1,4 @@ - { +{ "common.appName": "MOBILE CRM APP", "common.userLogin": "用戶登入", "common.loginsso": "登入", @@ -13,7 +13,7 @@ "common.room": "間", "common.rooms": "間", "common.bookingType": "預訂類型", - "common.misCharge":"雜項費用", + "common.misCharge": "雜項費用", "common.checkInDate": "入住日期", "common.checkOutDate": "退房日期", "common.roomType": "房型", @@ -29,12 +29,11 @@ "common.confirm": "確認", "common.in": "入住", "common.out": "離開", - "common.start":"開始", + "common.start": "開始", "common.selected": "已選擇", - "common.userLocked":"這個用戶賬戶已鎖定", - "common.ipLocked":"這個IP已鎖定", - "common.end":"終止", - "common.rangeError":"日期範圍不正確", + "common.userLocked": "這個用戶賬戶已鎖定", + "common.end": "終止", + "common.rangeError": "日期範圍不正確", "common.removeConfirm": "確認要刪除嗎?", "common.warning": "系統提示", "common.login": "登入", @@ -45,8 +44,9 @@ "common.alterSharerExist": "該客人已添加", "common.alterSharerLimit": "同住人限制", "common.errorMsg": "錯誤信息", + "common.misCharge":"雜項費用", "common.goBack": "返回", - "common.back":"返回", + "common.back": "返回", "common.language": "語言", "common.version": "版本", "common.user": "用戶", @@ -58,23 +58,23 @@ "common.search": "查詢", "common.status": "狀態", "common.inputRemark": "請輸入備註", - "common.nextBooking":"下一個預訂", + "common.nextBooking": "下一個預訂", "common.to": "到", - "common.close":"關閉", - "common.save":"保存", + "common.close": "關閉", + "common.save": "保存", "common.inputUserNameAndPassword": "請輸入用戶名和密碼", - "common.loginerror":"用戶名或密碼錯誤", - "common.mfaerror":"登入失敗", - "common.loginfail":"登入失敗", - "common.connected":"已連接", - "common.disconnected":"連接失敗", - "common.submit":"遞交", - "common.noPermission":"您沒有權限查看", - "common.rangeTip":"日期范围无效", - "common.jailBreakTitle":"禁止使用", - "common.jailBreakMessage":"禁止越獄過的設備使用該APP", - "common.noRecord":"沒有記錄", - "common.etaTime":"預計時間", + "common.loginerror": "用戶名或密碼錯誤", + "common.mfaerror": "登入失敗", + "common.loginfail": "登入失敗", + "common.connected": "已連接", + "common.disconnected": "連接失敗", + "common.submit": "遞交", + "common.noPermission": "您沒有權限查看", + "common.rangeTip": "日期范围无效", + "common.jailBreakTitle": "禁止使用", + "common.jailBreakMessage": "禁止越獄過的設備使用該APP", + "common.noRecord": "沒有記錄", + "common.etaTime": "預計時間", "calendar.mon": "一", "calendar.tue": "二", "calendar.wed": "三", @@ -91,6 +91,8 @@ "findPlayer.noPermission": "您沒有權限查看此客人.", "bookingRecord.title": "預定記錄", "bookingRecord.newsBooking": "預訂房間 / 候補名單", + "bookingRecord.newLimo": "預訂車輛", + "bookingRecord.calendar": "CALENDAR", "bookingRecord.extend": "續房", "bookingRecord.group": "關聯", "bookingRecord.sharer": "同住人", @@ -116,153 +118,12 @@ "newBooking.alertBookingType": "必須選擇預訂類型", "newBooking.extension": "續房", "newBooking.preference": "注意:特殊需求均無法保證,須視乎實際状況安排", - "newBooking.deposit":"押金", - "newBooking.postCharge":"房賬", - "newBooking.waiveDeposit":"免收押金", - "newBooking.collectDeposit":"收取押金", - "newBooking.yesPost":"掛房賬", - "newBooking.noPost":"鎖房賬", - "bookingConfirm.title": "預覽 & 確認", - "bookingConfirm.submitBooking": "遞交預定", - "bookingConfirm.createdOn": "預訂日期", - "bookingConfirm.createdBy": "預訂者", - "bookingConfirm.viewBooking": "預定詳情", - "bookingConfirm.urgentApproval":"緊急審批請求", - "bookingConfirm.submitApproval":"提交審批人", - "bookingConfirm.alert10": "正在處理客人 ", - "bookingConfirm.alert1": "預訂正在處理中", - "bookingConfirm.alert1_1":" 的候補名單!", - "bookingConfirm.alert2": " 的預定!", - "bookingConfirm.alert3": "您的預定未能通過!", - "bookingConfirm.alert4": "需放在候補名單", - "bookingConfirm.alert5": "部分預定未能通過!", - "bookingConfirm.IMAlert1":"請聯繫MSC預訂房間", - "bookingConfirm.IMAlert2":"選擇的日期需放在候補名單, 請申請批准預訂房間", - "bookingConfirm.putInWaitlist": "放入候補名單", - "bookingConfirm.currentStay": "當前入住", - "bookingConfirm.extending": "延長入住", - "bookingConfirm.extensionEmail": "MSC正在處理續房", - "bookingConfirm.extensionProccessing": "續房正在處理中", - "bookingConfirm.addSharer": "新增", - "bookingConfirm.canNotAddSharer": "不能新增同住人", - "bookingConfirm.confirmBooking": "確認預定", - "bookingConfirm.backToRecords": "返回主頁", - "bookingConfirm.viewProceedBooking": "查看並繼續", - "bookingConfirm.wantToWaitList": "是否放入候補名單?", - "bookingConfirm.secondRoom1":"超過可預訂房間數量", - "bookingConfirm.secondRoom2":"其中一晚已超過可預訂房間數量", - "bookingConfirm.secondRoom3":"已預訂套房或以上房型", - "bookingConfirm.secondRoom4":"只可預訂基本房型", - "bookingConfirm.duplicateWaitlist":"已提交候補名單", - "bookingConfirm.remark":"候補名單備註", - "bookingConfirm.numOfRoom":"請求房間數量", - "bookingConfirm.requestReason":"請求原因", - "bookingConfirm.routeToApprover":"發送至審批員", - "bookingConfirm.approvalRoutingRemark":"審批備注", - "bookingDetail.title": "預定詳情", - "bookingDetail.pendingAlert": "預定正在處理中!", - "bookingDetail.waitlistAlert": "預定已列入候補名單!", - "bookingDetail.confirmationNo": "預訂編號", - "bookingDetail.saveImage": "保存圖片", - "bookingDetail.extension": "續房", - "bookingDetail.cancelSuccessful": "取消成功", - "bookingDetail.cancelFailed": "取消失敗", - "bookingDetail.confirmCancel": "你確定要取消預定嗎?", - "bookingDetail.statusChange": "預定狀態已改變", - "bookingDetail.approve":"審批", - "bookingDetail.reject":"拒絕", - "bookingDetail.changeMiscChargeSuccess":"修改雜項費用成功", - "bookingDetail.changeMiscChargeFail":"修改雜項費用失敗", - "bookingDetail.cancelTimeErr":"當前時間段不能取消預定", - "bookingDetail.successfully":"成功", - "bookingDetail.failed":"失敗", - "bookingDetail.toCancelBooking": "確定要取消預訂嗎?", - "bookingDetail.backToBooking": "返回預訂", - "bookingDetail.backToDetail": "返回詳情", - "bookingDetail.SelectDate": "選擇預訂日期", - "bookingDetail.confirmApprove": "確定要批准此預訂嗎?", - "bookingDetail.confirmReject": "確定要拒絕此預訂嗎?", - "bookingDetail.errorDate":"必須選擇連續的日期!", - "bookingDetail.cancelBooking":"取消預定", - "bookingDetail.ETA":"預計時間", - "bookingDetail.miscChargeLess":"金額不可低於原值.", - "bookingDetail.cannotCancel":"不能取消这条记录", - "multipleDate.title": "選擇多個日期", - "multipleDate.addDate": "新增日期", - "multipleDate.pleaseAddDate": "請新增日期", - "multipleDate.reachMaxBookNum": "已達最大多個日期預定", - "submitBooking.title": "遞交", - "submitBooking.alert1": "TPD的狀態發生了改變,請重新選擇", - "submitBooking.submitedSuccessful": "遞交成功", - "submitBooking.roomCriteriaNotQualified":"不符合訂房條件", - "submitBooking.underWaitlist":"放入候補名單", - "submitBooking.copyRemark":"複製備註", - "putInWaitlist.title": "候補名單", - "newWaitlist.title": "创建候補名單", - "newWaitlist.remark": "備註", - "newWaitlist.submitWaitlist": "遞交候補名單", - "newWaitlist.savesuccessful": "成功遞交候補名單!", - "newWaitlist.viewSubmitedWaitlist": "查看候補名單", - "setting.title": "設定", - "region.title":"地區限制", - "region.showMessage":"此應用程序僅限於澳門使用。", - "region.reson":"禁用原因", - "region.resonMsgNotInMacau":"您的定位不在澳門", - "region.resonMsgOpenVPN":"您打開了VPN", - "region.resonMsgNotInMacauOpenVpn":"您的定位不在澳門且打開了VPN", - "region.resonMsglocationErr":"檢查定位時出錯", - "region.resonMsgVPNErr":"檢查VPN時出錯", - "region.resonMsgFunctionErr":"檢查定位和VPN時出錯", - "region.retry":"重試", - "region.commitTitle":"用戶使用協議及聲明", - "region.commitment1":"本人在此承諾遵守所有適用於使用 Mobile CRM (以下簡稱MCRM) 的公司政策及法定義務。尤其,本人所在地不在澳門特別行政區時,本人同意不使用具有博彩數據的MCRM功能。此外,本人承諾不允許任何其他人(無論是否為澳門美高梅員工)使用安裝在本人移動裝置上的MCRM或存取其中的數據。本人亦承諾不將MCRM上的任何信息分享至其他個人設備。本人知悉此類行為將受到法律的刑事處分,並嚴重違反本人合同規定的責任義務。", - "region.commitment2":"I hereby undertake to adhere to all Company’s policies and all legal obligations that are applicable to the usage of Mobile CRM (hereinafter called MCRM). In particular, I agree not to use MCRM functionality with gaming data whenever my location is outside of the Macau SAR. I further undertake not to allow anybody else, whether an MGM employee or not, to use MCRM on my mobile phone or to access the data therein. I also undertake not to share any of the information on MCRM to any other personal devices. I’m aware that such actions are criminally punished by law and constitute a serious breach of my contractual obligations.", - "region.resonMsgNotInMacauIP":"您的IP不在澳門", - "dashboard.title":"主頁", - "dashboard.dataAsOf":"數據更新於:", - "dashboard.achievement":"成就", - "dashboard.kpi":"指標", - "dashboard.teamtarget":"團隊目標", - "dashboard.individualtarget":"個人目標", - "dashboard.newreactivetheo":"New & Reactive Theo", - "dashboard.directoffer":"Direct Offer Redemption Rate", - "dashboard.hostedplayer":"Hosted Player Active Rate", - "dashboard.eventattendance":"Event Attendance (w/gaming action)", - "todo.title":"待辦", - "todo.arrival":"到達", - "todo.departure":"離開", - "todo.inhouse":"在場", - "todo.others":"其他", - "todo.notConfNo":"該條記錄沒有Opera Confirmation No.", - "todo.etaSuccess":"修改ETA成功", - "todo.etaFail":"修改ETA失敗", - "todo.detailFail":"獲取信息失敗", - "todo.missParams":"缺少參數", - "todo.notRecord":"沒有對應的記錄", - "todo.invokeError":"調用ESB API時出錯", - "todo.noPermission":"沒有權限", - "todo.returnError":"返回數據時出錯", - "todo.etaFormatError":"ETA Time格式錯誤", - "todo.etaRequired": "ETA Time不能為空", - "todo.lookupPlayer":"您沒有權限查看該玩家", - "hotel.title":"酒店", - "approval.title": "審批", - "approval.approve": "批准", - "hotel.roombooking":"酒店預定", - "approval.pendingApproval":"等待審批", - "approval.batchApprove": "批量批准", - "approval.batchReject": "批量拒絕", - "approval.approvalFail": "審批失敗", - "approval.allRequest":"所有請求", - "approval.searchStr":"搜索", - "notification.noData":"沒有返回數據", - "notification.noPermission":"沒有權限", - "notification.pendingApproval":"審批列表", - "notification.pendingApprovalRequest": "待批准請求", - "playerDetail.confirm":"確認", - "newBooking.validEta":"ETA 時間格式有誤,請重新輸入 eg: HH:mm", - "bookingRecord.newLimo": "预定车辆", - "bookingRecord.calendar": "CALENDAR", + "newBooking.deposit": "押金", + "newBooking.postCharge": "房賬", + "newBooking.waiveDeposit": "免收押金", + "newBooking.collectDeposit": "收取押金", + "newBooking.yesPost": "掛房賬", + "newBooking.noPost": "鎖房賬", "newLimo.createTitle": "建立預訂", "newLimo.editTitle": "編輯預訂", "newLimo.sectionBookingInformation": "預訂資訊", @@ -294,9 +155,152 @@ "newLimo.notApplicable": "不適用", "newLimo.remarksPlaceholder": "", "newLimo.removeStop": "刪除", - "approvalRouting.title": "審批路由", + "bookingConfirm.title": "預覽 & 確認", + "bookingConfirm.submitBooking": "遞交預定", + "bookingConfirm.createdOn": "預訂日期", + "bookingConfirm.createdBy": "預訂者", + "bookingConfirm.viewBooking": "預定詳情", + "bookingConfirm.urgentApproval": "緊急審批請求", + "bookingConfirm.submitApproval": "提交審批人", + "bookingConfirm.alert10": "正在處理客人 ", + "bookingConfirm.alert1": "預訂正在處理中", + "bookingConfirm.alert1_1": " 的候補名單!", + "bookingConfirm.alert2": " 的預定!", + "bookingConfirm.alert3": "您的預定未能通過!", + "bookingConfirm.alert4": "需放在候補名單", + "bookingConfirm.alert5": "部分預定未能通過!", + "bookingConfirm.IMAlert1": "請聯繫MSC預訂房間", + "bookingConfirm.IMAlert2": "選擇的日期需放在候補名單, 請申請批准預訂房間", + "bookingConfirm.putInWaitlist": "放入候補名單", + "bookingConfirm.currentStay": "當前入住", + "bookingConfirm.extending": "延長入住", + "bookingConfirm.extensionEmail": "MSC正在處理續房", + "bookingConfirm.extensionProccessing": "續房正在處理中", + "bookingConfirm.addSharer": "新增", + "bookingConfirm.canNotAddSharer": "不能新增同住人", + "bookingConfirm.confirmBooking": "確認預定", + "bookingConfirm.backToRecords": "返回主頁", + "bookingConfirm.viewProceedBooking": "查看並繼續", + "bookingConfirm.wantToWaitList": "是否放入候補名單?", + "bookingConfirm.secondRoom1": "超過可預訂房間數量", + "bookingConfirm.secondRoom2": "其中一晚已超過可預訂房間數量", + "bookingConfirm.secondRoom3": "已預訂套房或以上房型", + "bookingConfirm.secondRoom4": "只可預訂基本房型", + "bookingConfirm.duplicateWaitlist": "已提交候補名單", + "bookingConfirm.remark": "候補名單備註", + "bookingConfirm.numOfRoom": "請求房間數量", + "bookingConfirm.requestReason": "請求原因", + "bookingConfirm.routeToApprover": "發送至審批員", + "bookingConfirm.approvalRoutingRemark": "審批備注", + "bookingConfirm.numOfRoom":"請求房間數量", + "bookingConfirm.requestReason":"請求原因", + "bookingConfirm.routeToApprover":"發送至審批員", + "bookingConfirm.approvalRoutingRemark":"審批備注", + "bookingDetail.title": "預定詳情", + "bookingDetail.pendingAlert": "預定正在處理中!", + "bookingDetail.waitlistAlert": "預定已列入候補名單!", + "bookingDetail.confirmationNo": "預訂編號", + "approvalRouting.title":"審批路由", + "bookingDetail.saveImage": "保存圖片", + "bookingDetail.extension": "續房", + "bookingDetail.cancelSuccessful": "取消成功", + "bookingDetail.cancelFailed": "取消失敗", + "bookingDetail.confirmCancel": "你確定要取消預定嗎?", + "bookingDetail.statusChange": "預定狀態已改變", + "bookingDetail.approve": "審批", + "bookingDetail.reject": "拒絕", + "bookingDetail.cancelTimeErr": "當前時間段不能取消預定", + "bookingDetail.successfully": "成功", + "bookingDetail.failed": "失敗", + "bookingDetail.toCancelBooking": "確定要取消預訂嗎?", + "bookingDetail.backToBooking": "返回預訂", + "bookingDetail.backToDetail": "返回詳情", + "bookingDetail.SelectDate": "選擇預訂日期", + "bookingDetail.confirmApprove": "確定要批准此預訂嗎?", + "bookingDetail.confirmReject": "確定要拒絕此預訂嗎?", + "bookingDetail.errorDate": "必須選擇連續的日期!", + "bookingDetail.cancelBooking": "取消預定", + "bookingDetail.ETA": "預計時間", + "bookingDetail.changeMisChargeSuccess": "修改雜項費用成功", + "bookingDetail.changeMisChargeFail": "修改雜項費用失敗", + "bookingDetail.miscChargeLess": "金額不可低於原值.", + "bookingDetail.cannotCancel": "不能取消这条记录", + "multipleDate.title": "選擇多個日期", + "multipleDate.addDate": "新增日期", + "multipleDate.pleaseAddDate": "請新增日期", + "multipleDate.reachMaxBookNum": "已達最大多個日期預定", + "submitBooking.title": "遞交", + "submitBooking.alert1": "TPD的狀態發生了改變,請重新選擇", + "submitBooking.submitedSuccessful": "遞交成功", + "submitBooking.roomCriteriaNotQualified": "不符合訂房條件", + "submitBooking.underWaitlist": "放入候補名單", + "submitBooking.copyRemark": "複製備註", + "putInWaitlist.title": "候補名單", + "newWaitlist.title": "创建候補名單", + "newWaitlist.remark": "備註", + "newWaitlist.submitWaitlist": "遞交候補名單", + "newWaitlist.savesuccessful": "成功遞交候補名單!", + "newWaitlist.viewSubmitedWaitlist": "查看候補名單", + "setting.title": "設定", + "region.title": "地區限制", + "region.showMessage": "此應用程序僅限於澳門使用。", + "region.reson": "禁用原因", + "region.resonMsgNotInMacau": "您的定位不在澳門", + "region.resonMsgOpenVPN": "您打開了VPN", + "region.resonMsgNotInMacauOpenVpn": "您的定位不在澳門且打開了VPN", + "region.resonMsglocationErr": "檢查定位時出錯", + "region.resonMsgVPNErr": "檢查VPN時出錯", + "region.resonMsgFunctionErr": "檢查定位和VPN時出錯", + "region.retry": "重試", + "region.commitTitle": "用戶使用協議及聲明", + "region.commitment1": "本人在此承諾遵守所有適用於使用 Mobile CRM (以下簡稱MCRM) 的公司政策及法定義務。尤其,本人所在地不在澳門特別行政區時,本人同意不使用具有博彩數據的MCRM功能。此外,本人承諾不允許任何其他人(無論是否為澳門美高梅員工)使用安裝在本人移動裝置上的MCRM或存取其中的數據。本人亦承諾不將MCRM上的任何信息分享至其他個人設備。本人知悉此類行為將受到法律的刑事處分,並嚴重違反本人合同規定的責任義務。", + "region.commitment2": "I hereby undertake to adhere to all Company’s policies and all legal obligations that are applicable to the usage of Mobile CRM (hereinafter called MCRM). In particular, I agree not to use MCRM functionality with gaming data whenever my location is outside of the Macau SAR. I further undertake not to allow anybody else, whether an MGM employee or not, to use MCRM on my mobile phone or to access the data therein. I also undertake not to share any of the information on MCRM to any other personal devices. I’m aware that such actions are criminally punished by law and constitute a serious breach of my contractual obligations.", + "region.resonMsgNotInMacauIP": "您的IP不在澳門", + "dashboard.title": "主頁", + "dashboard.dataAsOf": "數據更新於:", + "dashboard.achievement": "成就", + "dashboard.kpi": "指標", + "dashboard.teamtarget": "團隊目標", + "dashboard.individualtarget": "個人目標", + "dashboard.newreactivetheo": "New & Reactive Theo", + "dashboard.directoffer": "Direct Offer Redemption Rate", + "dashboard.hostedplayer": "Hosted Player Active Rate", + "dashboard.eventattendance": "Event Attendance (w/gaming action)", + "todo.title": "待辦", + "todo.arrival": "到達", + "todo.departure": "離開", + "todo.inhouse": "在場", + "todo.others": "其他", + "todo.notConfNo": "該條記錄沒有Opera Confirmation No.", + "todo.etaSuccess": "修改ETA成功", + "todo.etaFail": "修改ETA失敗", + "todo.detailFail": "獲取信息失敗", + "todo.missParams": "缺少參數", + "todo.notRecord": "沒有對應的記錄", + "todo.invokeError": "調用ESB API時出錯", + "todo.noPermission": "沒有權限", + "todo.returnError": "返回數據時出錯", + "todo.etaFormatError": "ETA Time格式錯誤", + "todo.etaRequired": "ETA Time不能為空", + "todo.lookupPlayer": "您沒有權限查看該玩家", + "hotel.title": "酒店", "reservations.title": "預訂", + "approval.title": "審批", + "hotel.roombooking": "汽車、酒店預定", "notification.title": "通知", + "approval.approve": "批准", + "approval.pendingApproval": "等待審批", + "approval.batchApprove": "批量批准", + "approval.batchReject": "批量拒絕", + "approval.approvalFail": "審批失敗", + "approval.allRequest": "所有請求", + "approval.searchStr": "搜索", + "notification.noData": "沒有返回數據", + "notification.noPermission": "沒有權限", + "notification.pendingApproval": "審批列表", + "notification.pendingApprovalRequest": "待批准請求", + "playerDetail.confirm": "確認", + "newBooking.validEta": "ETA 時間格式有誤,請重新輸入 eg: HH:mm", "limoBookingRecord.bookingType": "預定類型", "limoBookingRecord.pickupDatetime": "接載日期", "limoBookingRecord.pickup": "接載地點", @@ -318,5 +322,10 @@ "newLimo.tenOut": "10 Out", "newLimo.tenOutContact": "10 Out 聯絡人", "newLimo.contactGuestDirectly": "直接聯絡客人", - "newLimo.guestContact": "客人聯絡人" + "newLimo.guestContact": "客人聯絡人", + "newLimo.additionalOptions":"更多選項", + "limoBookingDetail.driverSource":"司機源", + "limoBookingDetail.remark":"備注", + "limoBookingDetail.flightNo":"航班號", + "limoBookingDetail.greetType":"問候類型" } diff --git a/main.js b/main.js index 81ccc39..64aa1fd 100644 --- a/main.js +++ b/main.js @@ -25,6 +25,17 @@ Vue.use(watermark, { Vue.config.productionTip = false Vue.prototype.$store = store +Vue.mixin({ + onShow() { + uni.$emit('refreshNotificationCount'); + this.$nextTick(() => { + const header = this.$refs && this.$refs.headerRef; + if (header && typeof header.fetchNotificationCount === 'function') { + header.fetchNotificationCount(); + } + }); + } +}); // 注册全局方法 Vue.prototype.isLogin = function(){ getApp().isLogin(); diff --git a/manifest.json b/manifest.json index 49061b0..f39495a 100644 --- a/manifest.json +++ b/manifest.json @@ -18,7 +18,8 @@ "modules" : { "Camera" : {}, "UTS-Proxy" : {}, - "Geolocation" : {} + "Geolocation" : {}, + "Push" : {} }, "distribute" : { "distribute" : { @@ -75,7 +76,8 @@ "system" : { "__platform__" : [ "ios" ] } - } + }, + "push" : {} }, "icons" : { "ios" : { diff --git a/nativeplugins/NetworkUtils/ios/NetworkUtils.framework/Info.plist b/nativeplugins/NetworkUtils/ios/NetworkUtils.framework/Info.plist index c925cbdbc6b86cc9d7edb65b46bb80dc6ce977b2..e1ece01302080016fd680df47ccf379f2d8b0d80 100644 GIT binary patch delta 107 zcmeyu`jvIVSw`e3eO_u?he~*%=1_ diff --git a/nativeplugins/NetworkUtils/ios/NetworkUtils.framework/NetworkUtils b/nativeplugins/NetworkUtils/ios/NetworkUtils.framework/NetworkUtils index 8a60190aeb8dc4ff46f46a384f44180cb8a39b9b..6c98b7afc4f8ed34ae7f06e0bc8afa459c3a9507 100644 GIT binary patch literal 141992 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 LPfQl= 39.0 && lat <= 41.0 && lng >= 115.0 && lng <= 118.0) { + // 北京地区特殊校正 + latCorrection = 0.00220; + lngCorrection = -0.00140 * latFactor; + } else if (lat >= 30.5 && lat <= 32.0 && lng >= 120.5 && lng <= 122.5) { + // 上海地区特殊校正 + latCorrection = 0.00230; + lngCorrection = -0.00150 * latFactor; + } else if (lat >= 22.0 && lat <= 24.0 && lng >= 112.5 && lng <= 115.0) { + // 广州深圳地区特殊校正 + latCorrection = 0.00240; + lngCorrection = -0.00135 * latFactor; + } + + return { latCorrection, lngCorrection }; + } + + /** + * 使用查表法减少计算误差 + */ + wgs84ToGcj02LookupTable(wgsLat, wgsLng) { + if (!this.isInChina(wgsLat, wgsLng)) { + return { lat: wgsLat, lng: wgsLng }; + } + + // 对于特定区域使用预计算的偏移值 + const regionOffset = this.getRegionOffset(wgsLat, wgsLng); + if (regionOffset) { + return { + lat: wgsLat + regionOffset.latOffset, + lng: wgsLng + regionOffset.lngOffset + }; + } + + // 否则使用高精度算法 + return this.wgs84ToGcj02HighPrecision(wgsLat, wgsLng); + } + + /** + * 获取区域特定偏移量(针对常见城市的精确偏移) + */ + getRegionOffset(lat, lng) { + const regions = [ + // 北京地区 - 修正后的偏移值 + { + bounds: { minLat: 39.4, maxLat: 41.0, minLng: 115.4, maxLng: 117.5 }, + latOffset: 0.00580, // 修正向南偏移 + lngOffset: 0.00506 // 修正向东偏移 + }, + // 上海地区 + { + bounds: { minLat: 30.7, maxLat: 31.9, minLng: 120.9, maxLng: 122.2 }, + latOffset: 0.00590, + lngOffset: 0.00496 + }, + // 广州地区 + { + bounds: { minLat: 22.5, maxLat: 23.9, minLng: 112.9, maxLng: 114.8 }, + latOffset: 0.00600, + lngOffset: 0.00486 + }, + // 深圳地区 + { + bounds: { minLat: 22.4, maxLat: 22.8, minLng: 113.7, maxLng: 114.6 }, + latOffset: 0.00595, + lngOffset: 0.00491 + } + ]; + + for (const region of regions) { + if (lat >= region.bounds.minLat && lat <= region.bounds.maxLat && + lng >= region.bounds.minLng && lng <= region.bounds.maxLng) { + return region; + } + } + return null; + } + + /** + * 修正的纬度转换函数 + */ + transformLatFixed(x, y) { + let ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); + + ret += (20.0 * Math.sin(6.0 * x * this.PI) + + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0; + + ret += (20.0 * Math.sin(y * this.PI) + + 40.0 * Math.sin(y / 3.0 * this.PI)) * 2.0 / 3.0; + + ret += (160.0 * Math.sin(y / 12.0 * this.PI) + + 320.0 * Math.sin(y * this.PI / 30.0)) * 2.0 / 3.0; + + return ret; + } + + /** + * 修正的经度转换函数 + */ + transformLngFixed(x, y) { + let ret = 300.0 + x + 2.0 * y + 0.1 * x * x + + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); + + ret += (20.0 * Math.sin(6.0 * x * this.PI) + + 20.0 * Math.sin(2.0 * x * this.PI)) * 2.0 / 3.0; + + ret += (20.0 * Math.sin(x * this.PI) + + 40.0 * Math.sin(x / 3.0 * this.PI)) * 2.0 / 3.0; + + ret += (150.0 * Math.sin(x / 12.0 * this.PI) + + 300.0 * Math.sin(x / 30.0 * this.PI)) * 2.0 / 3.0; + + return ret; + } + + transformLat(x, y) { + return this.transformLatFixed(x, y); + } + + transformLng(x, y) { + return this.transformLngFixed(x, y); + } + + isInChina(lat, lng) { + return lng >= 72.004 && lng <= 137.8347 && + lat >= 0.8293 && lat <= 55.8271; + } + + /** + * 计算偏移距离(米) + */ + calculateOffsetDistance(originalLat, originalLng, convertedLat, convertedLng) { + const latDiffMeters = (convertedLat - originalLat) * 111000; + const lngDiffMeters = (convertedLng - originalLng) * 111000 * Math.cos(originalLat * this.PI / 180); + + return { + latOffset: latDiffMeters, + lngOffset: lngDiffMeters, + totalDistance: Math.sqrt(latDiffMeters * latDiffMeters + lngDiffMeters * lngDiffMeters) + }; + } + + /** + * 比较不同算法的转换结果 + */ + compareAlgorithms(wgsLat, wgsLng) { + const standard = this.wgs84ToGcj02Standard(wgsLat, wgsLng); + const fixed = this.wgs84ToGcj02Fixed(wgsLat, wgsLng); + const highPrecision = this.wgs84ToGcj02HighPrecision(wgsLat, wgsLng); + const lookup = this.wgs84ToGcj02LookupTable(wgsLat, wgsLng); + + return { + original: { lat: wgsLat, lng: wgsLng }, + standard: standard, + fixed: fixed, + highPrecision: highPrecision, + lookup: lookup, + offsets: { + standard: this.calculateOffsetDistance(wgsLat, wgsLng, standard.lat, standard.lng), + fixed: this.calculateOffsetDistance(wgsLat, wgsLng, fixed.lat, fixed.lng), + highPrecision: this.calculateOffsetDistance(wgsLat, wgsLng, highPrecision.lat, highPrecision.lng), + lookup: this.calculateOffsetDistance(wgsLat, wgsLng, lookup.lat, lookup.lng) + } + }; + } + + /** + * 验证修正效果 + */ + validateCorrection(wgsLat, wgsLng, expectedGcjLat, expectedGcjLng) { + const result = this.wgs84ToGcj02Fixed(wgsLat, wgsLng); + const error = this.calculateOffsetDistance(expectedGcjLat, expectedGcjLng, result.lat, result.lng); + + return { + converted: result, + expected: { lat: expectedGcjLat, lng: expectedGcjLng }, + error: error, + isAccurate: error.totalDistance < 10 // 误差小于10米认为准确 + }; + } +} + +// 测试和验证 +const fixedConverter = new FixedCoordinateConverter(); + +// 测试北京天安门坐标 +const testLat = 39.9093; +const testLng = 116.3974; + +console.log('=== 修正后的坐标转换算法比较 ==='); +const comparison = fixedConverter.compareAlgorithms(testLat, testLng); +console.log('原始坐标:', comparison.original); +console.log('标准算法:', comparison.standard); +console.log('修正算法:', comparison.fixed); +console.log('高精度算法:', comparison.highPrecision); +console.log('查表算法:', comparison.lookup); +console.log('偏移分析:', comparison.offsets); + +// 导出修正版本 +if (typeof module !== 'undefined' && module.exports) { + module.exports = FixedCoordinateConverter; +} + +if (typeof window !== 'undefined') { + window.FixedCoordinateConverter = FixedCoordinateConverter; +} \ No newline at end of file diff --git a/pages.json b/pages.json index afcc563..6d7a34c 100644 --- a/pages.json +++ b/pages.json @@ -22,16 +22,6 @@ "disableSwipeBack": true } }, - { - "path": "pages/roomCalendar/roomCalendar", - "style": { - "navigationBarTitleText": "", - "enablePullDownRefresh": false, - "backgroundColor": "#ffffff", - "navigationStyle": "custom", - "disableSwipeBack": true - } - }, { "path": "pages/dashboard/dashboard", "style": { @@ -80,10 +70,11 @@ } }, { - "path": "booking/playerRoomCalendar/playerRoomCalendar", - "style": { - "navigationBarTitleText": "", - "enablePullDownRefresh": false, + "path" : "booking/playerRoomCalendar/playerRoomCalendar", + "style" : + { + "navigationBarTitleText" : "", + "enablePullDownRefresh" : false, "backgroundColor": "#ffffff", "navigationStyle": "custom", "disableSwipeBack": true @@ -231,6 +222,37 @@ "disableSwipeBack": true } }, + { + "path" : "limo/newLimo/newLimo", + "style" : + { + "navigationBarTitleText": "", + "enablePullDownRefresh" : false, + "backgroundColor": "#ffffff", + "navigationStyle": "custom", + "disableSwipeBack": true + } + }, + { + "path": "limo/bookingDetail/bookingDetail", + "style" : + { + "navigationBarTitleText" : "", + "enablePullDownRefresh" : false, + "navigationStyle": "custom", + "disableSwipeBack": true + } + }, + { + "path": "limo/notification/notification", + "style": { + "navigationBarTitleText": "", + "enablePullDownRefresh" : false, + "backgroundColor": "#ffffff", + "navigationStyle": "custom", + "disableSwipeBack": true + } + }, { "path" : "pages/roomCount/roomCount", "style" : @@ -242,6 +264,17 @@ "disableSwipeBack": true } }, + { + "path" : "pages/roomCalendar/roomCalendar", + "style" : + { + "navigationBarTitleText": "", + "enablePullDownRefresh" : false, + "backgroundColor": "#ffffff", + "navigationStyle": "custom", + "disableSwipeBack": true + } + }, { "path" : "pages/playerDetail/playerDetail", "style" : @@ -280,31 +313,39 @@ "list": [ { "pagePath": "pages/dashboard/dashboard", - "iconPath": "static/images/ico_home.png", - "selectedIconPath": "static/images/ico_home_active.png", + "iconPath": "static/icon/tabbar/ico_home.png", + "selectedIconPath": "static/icon/tabbar/ico_home_active.png", "text": "%dashboard.title%", "visible":false }, { "pagePath": "salessupport/todoList/todoList", - "iconPath": "static/images/ico_todo.png", - "selectedIconPath": "static/images/ico_todo_active.png", + "iconPath": "static/icon/tabbar/ico_todo.png", + "selectedIconPath": "static/icon/tabbar/ico_todo_active.png", "text": "%todo.title%", "visible":false }, { "pagePath": "pages/findPlayer/findPlayer", - "iconPath": "static/images/ico_hotel.png", - "selectedIconPath": "static/images/ico_hotel_active.png", - "text": "%hotel.title%", + "iconPath": "static/icon/tabbar/calendar-check.png", + "selectedIconPath": "static/icon/tabbar/calendar-check-fill.png", + "text": "%reservations.title%", "visible":false }, + // approvalRouting + // { + // "pagePath": "pages/approval/approval", + // "iconPath": "/static/images/task.png", + // "selectedIconPath": "/static/images/task_active.png", + // "text": "%approval.title%", + // "visible":true + // }, { "pagePath": "pages/roomCalendar/roomCalendar", "iconPath": "static/images/calendar-line.png", "selectedIconPath": "static/images/calendar-fill.png", "text": "%roomCalendar.title%", - "visible": false + "visible":false }, // approvalRouting // { @@ -316,12 +357,12 @@ // }, { "pagePath": "pages/setting/setting", - "iconPath": "static/images/ico_set.png", - "selectedIconPath": "static/images/ico_set_active.png", + "iconPath": "static/icon/tabbar/ico_set.png", + "selectedIconPath": "static/icon/tabbar/ico_set_active.png", "text": "%setting.title%", "visible":true } ] }, "uniIdRouter": {} -} +} \ No newline at end of file diff --git a/pages/dashboard/dashboard.vue b/pages/dashboard/dashboard.vue index e7a2b98..410126c 100644 --- a/pages/dashboard/dashboard.vue +++ b/pages/dashboard/dashboard.vue @@ -1,7 +1,35 @@