From 1111ac148b44f3b2a3fa966e652ae61c8118f7ee Mon Sep 17 00:00:00 2001 From: liangjian <1394459087@qq.com> Date: Wed, 29 Jul 2026 09:05:38 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=9E=84=E6=A0=B8=E5=BF=83?= =?UTF-8?q?=E7=A7=9F=E4=BD=8F=E6=B5=81=E7=A8=8B=E9=A1=B5=E9=9D=A2=E4=B8=8E?= =?UTF-8?q?=E4=BA=A4=E4=BA=92=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 统一注册、看房、申请与入住等核心页面的视觉和流程衔接,补齐支付、签约与状态流转闭环,提升移动端操作连贯性。 --- api/index.js | 41 +- config.js | 8 +- locales/messages.js | 109 +- pages/index/component/MyApplicationTab.vue | 719 +++- pages/index/component/ProfileCenterTab.vue | 2 +- pages/index/component/SelectRoomTab.vue | 27 +- pages/index/component/StayServiceTab.vue | 2878 ++++++++++++++--- pages/index/index.vue | 391 ++- pkgAccount/login/login.vue | 91 +- pkgAccount/register/register.vue | 1437 ++++---- pkgBooking/book/book.vue | 665 +++- pkgBooking/book_viewing/book_viewing.vue | 701 +++- .../components/RoomTypeSelector.vue | 323 +- .../store_detail/components/FacilityList.vue | 54 +- .../store_detail/components/RoomList.vue | 103 +- .../store_detail/components/StoreInfo.vue | 126 +- pkgExplore/store_detail/store_detail.vue | 309 +- .../application_detail/application_detail.vue | 31 +- .../CurrentApplicationBillPanel.vue | 37 +- .../lost_found_publish/lost_found_publish.vue | 3 +- .../room_inspection/room_inspection.vue | 1141 ++++--- .../components/BuildingSelector.vue | 190 +- .../components/DateRangeSelector.vue | 140 +- .../components/FloorSelector.vue | 195 +- .../components/RoomTypeSelector.vue | 339 +- .../submit_request/components/TagSelector.vue | 37 +- pkgService/submit_request/submit_request.vue | 1204 +++++-- .../ticket_workbench/ticket_workbench.vue | 43 +- store/index.js | 3 +- .../tn-image-upload/tn-image-upload.vue | 2 +- utils/booking-helper.js | 127 +- utils/login-helper.js | 27 +- utils/reservation-flow.js | 26 +- utils/session-sync.js | 6 +- 34 files changed, 8734 insertions(+), 2801 deletions(-) diff --git a/api/index.js b/api/index.js index 5741b71..c236c1f 100644 --- a/api/index.js +++ b/api/index.js @@ -237,6 +237,21 @@ export function applicationFormMePage(params = {}, language) { }) } +export function applicationFormDetail(detailCode = '', language) { + const normalizedDetailCode = String(detailCode || '').trim() + if (!normalizedDetailCode) { + return Promise.reject(new Error('申请明细编码不能为空')) + } + + return request({ + url: `/applicationform/detail/${encodeURIComponent(normalizedDetailCode)}`, + method: 'GET', + header: { + 'X-Requested-Language': resolveLanguageHeader(language) + } + }) +} + // --- 工单 --- export function ticketOrderPage(params = {}, language) { return request({ @@ -526,6 +541,24 @@ export function accountQueryBill(params = {}, language) { }) } +export function accountQueryBillPreview(params = {}, language) { + const query = params || {} + const orderNo = String(query.orderNo || query.OrderNo || '').trim() + if (!orderNo) { + return Promise.reject(new Error('订单号不能为空')) + } + return request({ + url: '/accountquery/bill-preview', + method: 'GET', + params: { + OrderNo: orderNo + }, + header: { + 'X-Requested-Language': resolveLanguageHeader(language) + } + }) +} + export function paymentBillPay(data = {}, language) { const payload = data || {} return request({ @@ -576,9 +609,13 @@ export function paymentStatusByBillNo(params = {}, language) { } export function userDetailCancel(data = {}, language) { - const payload = data || {} + const source = data || {} + const payload = { + detailCode: String(source.detailCode || source.code || source.referenceTypeNo || '').trim(), + remark: source.remark == null ? '' : String(source.remark) + } return request({ - url: '/ApplicationForm/user/detail/cancel', + url: '/applicationform/user/detail/cancel', method: 'POST', data: payload, header: { diff --git a/config.js b/config.js index 17bc204..33e823b 100644 --- a/config.js +++ b/config.js @@ -2,8 +2,8 @@ export const config = { // 根据不同环境维护接口基准地址 // baseURL: 'http://192.168.199.182:5003/api', // baseURL: 'http://192.168.199.124:5111/admin/api', - // baseURL: 'https://api.xhct.yaens.com/admin/api', - baseURL: 'https://apartment.lvjuwuye.cn/admin/api', - filePrefix: 'https://apartment.lvjuwuye.cn/p' - // filePrefix: 'https://api.xhct.yaens.com/p' + baseURL: 'https://api.xhct.yaens.com/admin/api', + // baseURL: 'https://apartment.lvjuwuye.cn/admin/api', + // filePrefix: 'https://apartment.lvjuwuye.cn/p' + filePrefix: 'https://api.xhct.yaens.com/p' } diff --git a/locales/messages.js b/locales/messages.js index 7fced2a..b8830ff 100644 --- a/locales/messages.js +++ b/locales/messages.js @@ -91,6 +91,7 @@ const messages = { apartmentLabel: "Apartment", cancelOrder: "Cancel Order", cancelOrderContent: "This will close the current unpaid deposit order. Continue?", + cancelViewingContent: "This will close the current viewing request. Continue?", cancelOrderFailed: "Failed to cancel order", cancelOrderLoading: "Canceling...", cancelOrderSuccess: "Order canceled", @@ -158,6 +159,7 @@ const messages = { stayApplicationTitle: "Stay Application", submittedAtLabel: "Submitted At", toolbarSummary: "{total} applications", + viewingNoDepositToast: "Viewing requests do not require a deposit", viewingApplicationTitle: "Viewing Request", viewingTimeLabel: "Viewing Time" }, @@ -305,6 +307,36 @@ const messages = { refreshStatus: "Refresh Status", refreshing: "Refreshing...", reviewStep: "Review", + applicationPendingTitle: "Application submitted, waiting for review", + applicationPendingDesc: "Your application has been submitted. It will enter the room inspection step after butler review.", + applicationPendingNote: "Application is under review. Please wait for butler notification.", + applicationPendingPaymentTitle: "Please pay the deposit", + applicationPendingPaymentDesc: "Your stay application has been submitted. Please pay the deposit to confirm your booking.", + applicationPendingPaymentNote: "After the deposit is paid, the manager will review your application and arrange the next steps.", + viewingPendingTitle: "Viewing request submitted, waiting for confirmation", + viewingPendingDesc: "Your viewing request has been submitted. Please wait for the manager to confirm the viewing schedule.", + viewingPendingNote: "No deposit is required for viewing requests. Please watch for the viewing time and follow-up notice.", + viewingNoDepositToast: "Viewing requests do not require a deposit", + inspectionPendingTitle: "Please schedule and complete room inspection", + inspectionPendingDesc: "The flow has entered the room inspection step. Please complete the inspection on time.", + inspectionPendingNote: "After the room inspection is completed, the system will automatically proceed to bill payment.", + billPendingTitle: "Bill generated, please pay as soon as possible", + billPendingDesc: "The flow has entered the bill payment step. Complete payment to proceed to contract signing.", + billPendingNote: "Please complete the bill payment within the specified time. Overdue payment may affect your room selection.", + signContractDoneTitle: "Contract signed, waiting for check-in", + signContractDoneNote: "Contract signing is complete. Please wait for butler notification for check-in.", + applicationNo: "Application No.", + billNo: "Bill No.", + applicationStep: "Application", + inspectionStep: "Inspection", + billStep: "Bill", + contractShort: "Contract", + checkinShort: "Check-in", + applying: "Applying", + inspecting: "Inspecting", + pendingPayment: "Pending Payment", + pendingSignature: "Pending Signature", + pendingCheckin: "Pending Check-in", roomDeviceUnconfigured: "Smart devices are not configured for this room", signContract: "Sign Contract", signContractDesc: "A contract is ready for signature. You are now at the contract signing step.", @@ -323,7 +355,11 @@ const messages = { title: "My Stay", unpaid: "Unpaid", viewAll: "View All", - viewBill: "View Bills" + viewBill: "View Bills", + currentTaskTitle: "Current Task", + flowProgressTitle: "Flow Progress", + goInspection: "Book Inspection", + viewDetail: "View Details" } }, index: { @@ -544,7 +580,9 @@ const messages = { }, book_viewing: { book_viewing: { + availableTimeLabel: "Available Slots", backTitle: "Back", + bookingDateLabel: "Booking Date", budgetLabel: "Budget (CNY/month)", budgetPlaceholder: "Enter your expected budget", defaultInfoDesc: "A dedicated manager will arrange a one-on-one viewing for you", @@ -554,7 +592,12 @@ const messages = { duration4: "10-12 months", duration5: "Over 1 year", durationLabel: "Expected Stay Duration", + emptyRoomTypesDesc: "No room types available, please try again later", + loadFailed: "Failed to load room types", + mapSelectFailed: "Map selection failed, please enter manually", navTitle: "On-site Viewing", + popupSubtitle: "Select your preferred room type and area", + priceNegotiable: "Price negotiable", roomTypeLabel: "Preferred Room Type", remarkArea: "Preferred Area: {area}", remarkBudget: "Budget: {budget} CNY/month", @@ -569,11 +612,13 @@ const messages = { rentalNeeds: "Rental Needs", rentalNeedsDesc: "Help the manager recommend a suitable room", selectDurationRequired: "Please select the expected stay duration", + selectedTimeLabel: "Selected Time", selectTimeRequired: "Please select a viewing time slot", selectViewingTime: "Select Viewing Time", selectViewingTimeDesc: "Choose a time slot that works for you", submitBooking: "Submit Request", submitFailed: "Failed to submit the booking", + submitHint: "A dedicated manager will contact you shortly after submission", submitSuccessContent: "Your viewing request has been submitted.\nThe system will forward it to the authorized manager of the selected area. After the manager confirms the viewing, the order can be completed directly or converted into a booking for payment once a room is selected.", submitSuccessTitle: "Booking Submitted", submitting: "Submitting...", @@ -711,6 +756,7 @@ const messages = { }, store_detail: { store_detail: { + addressLabel: "Apartment Address", apartmentName: "Community", collapse: "Collapse", contactManager: "Contact Butler", @@ -1250,9 +1296,12 @@ const messages = { submit_request: { components: { BuildingSelector: { + emptyDesc: "No available buildings, please try again later", emptyText: "No buildings available", loadFailed: "Failed to load buildings", + loadFailedShort: "Failed to load buildings", loadingText: "Loading buildings...", + popupSubtitle: "Select your preferred building", popupTitle: "Select Building", selectAreaFirst: "Please select an area first", selectBuilding: "Select building" @@ -1266,9 +1315,12 @@ const messages = { }, FloorSelector: { clearSelection: "Not specified", + emptyDesc: "No available floors, please try again later", emptyText: "No floors available", loadFailed: "Failed to load floor list", + loadFailedShort: "Failed to load floors", loadingText: "Loading floors...", + popupSubtitle: "Select your preferred floor", popupTitle: "Select Floor", selectFloor: "Select floor" }, @@ -1576,6 +1628,7 @@ const messages = { apartmentLabel: "所属公寓", cancelOrder: "取消订单", cancelOrderContent: "取消后将关闭当前未支付的定金订单,是否继续?", + cancelViewingContent: "取消后将关闭当前预约看房申请,是否继续?", cancelOrderFailed: "取消订单失败", cancelOrderLoading: "取消中...", cancelOrderSuccess: "订单已取消", @@ -1643,6 +1696,7 @@ const messages = { stayApplicationTitle: "入住申请", submittedAtLabel: "提交时间", toolbarSummary: "共 {total} 条申请", + viewingNoDepositToast: "预约看房申请无需支付定金", viewingApplicationTitle: "预约看房申请", viewingTimeLabel: "预约时间" }, @@ -1790,6 +1844,36 @@ const messages = { refreshStatus: "刷新状态", refreshing: "刷新中...", reviewStep: "管家审核", + applicationPendingTitle: "申请单已提交,等待审核", + applicationPendingDesc: "您的申请单已提交,管家审核通过后将进入验房环节。", + applicationPendingNote: "申请单审核中,请耐心等待管家通知。", + applicationPendingPaymentTitle: "请支付定金", + applicationPendingPaymentDesc: "您的入住申请已提交,请先支付定金以确认预订。", + applicationPendingPaymentNote: "支付定金后,管家会尽快审核您的申请并安排后续入住流程。", + viewingPendingTitle: "预约看房已提交,等待确认", + viewingPendingDesc: "您的预约看房申请已提交,请等待管家与您确认看房安排。", + viewingPendingNote: "预约看房无需支付定金,请留意看房时间与后续通知。", + viewingNoDepositToast: "预约看房申请无需支付定金", + inspectionPendingTitle: "请预约并完成验房", + inspectionPendingDesc: "当前流程已进入验房阶段,请按预约时间完成房间验收。", + inspectionPendingNote: "验房完成后,系统将自动进入账单支付环节。", + billPendingTitle: "账单已生成,请尽快支付", + billPendingDesc: "当前流程已进入账单支付阶段,完成支付后即可进入合同签署环节。", + billPendingNote: "请在规定时间内完成账单支付,逾期可能影响选房资格。", + signContractDoneTitle: "合同已签署,等待办理入住", + signContractDoneNote: "合同签署完成,请等待管家通知办理入住。", + applicationNo: "申请编号", + billNo: "账单编号", + applicationStep: "申请单", + inspectionStep: "验房", + billStep: "账单", + contractShort: "合同", + checkinShort: "入住", + applying: "申请中", + inspecting: "验房中", + pendingPayment: "待支付", + pendingSignature: "待签约", + pendingCheckin: "待入住", roomDeviceUnconfigured: "房间智能设备未配置", signContract: "去签约", signContractDesc: "系统已生成待签合同,当前流程已进入签订合同阶段,完成签约后即可继续后续入住流程。", @@ -1808,7 +1892,12 @@ const messages = { title: "我的入住", unpaid: "待支付", viewAll: "全部", - viewBill: "查看账单" + viewBill: "查看账单", + currentTaskTitle: "当前任务", + currentStepTag: "当前", + flowProgressTitle: "流程进度", + goInspection: "去验房", + viewDetail: "查看详情" } }, index: { @@ -2029,7 +2118,9 @@ const messages = { }, book_viewing: { book_viewing: { + availableTimeLabel: "可约时段", backTitle: "返回", + bookingDateLabel: "预约日期", budgetLabel: "租金预算 (元/月)", budgetPlaceholder: "请输入您的心理价位", defaultInfoDesc: "专属管家为您提供一对一带看服务", @@ -2039,7 +2130,12 @@ const messages = { duration4: "10-12个月", duration5: "1年以上", durationLabel: "预计租住时长", + emptyRoomTypesDesc: "当前暂无可用房型,请稍后再试", + loadFailed: "房型加载失败", + mapSelectFailed: "地图选择失败,请手动输入", navTitle: "预约现场带看", + popupSubtitle: "选择您心仪的房型与区域", + priceNegotiable: "价格面议", roomTypeLabel: "意向房型", remarkArea: "意向区域:{area}", remarkBudget: "租金预算:{budget} 元/月", @@ -2054,11 +2150,13 @@ const messages = { rentalNeeds: "您的租住需求", rentalNeedsDesc: "帮助管家更好地为您推荐房源", selectDurationRequired: "请选择预计租住时长", + selectedTimeLabel: "已选时间", selectTimeRequired: "请选择看房时间段", selectViewingTime: "选择看房时间", selectViewingTimeDesc: "请选择您方便的时间段", submitBooking: "提交预约", submitFailed: "预约提交失败", + submitHint: "提交后专属管家将尽快与您联系", submitSuccessContent: "您的预约看房申请已提交,请等待管家联系", submitSuccessTitle: "预约成功", submitting: "提交中...", @@ -2196,6 +2294,7 @@ const messages = { }, store_detail: { store_detail: { + addressLabel: "公寓地址", apartmentName: "公寓详情", collapse: "收起", contactManager: "联系管家", @@ -2735,9 +2834,12 @@ const messages = { submit_request: { components: { BuildingSelector: { + emptyDesc: "当前暂无可用楼栋,请稍后再试", emptyText: "暂无可选楼栋", loadFailed: "楼栋列表加载失败", + loadFailedShort: "楼栋加载失败", loadingText: "楼栋加载中...", + popupSubtitle: "选择您期望入住的楼栋", popupTitle: "选择意向楼栋", selectAreaFirst: "请先选择区域", selectBuilding: "请选择楼栋" @@ -2751,9 +2853,12 @@ const messages = { }, FloorSelector: { clearSelection: "不选择", + emptyDesc: "当前暂无可用楼层,请稍后再试", emptyText: "暂无可选楼层", loadFailed: "楼层列表加载失败", + loadFailedShort: "楼层加载失败", loadingText: "楼层加载中...", + popupSubtitle: "选择您期望入住的楼层", popupTitle: "选择意向楼层", selectFloor: "请选择楼层" }, diff --git a/pages/index/component/MyApplicationTab.vue b/pages/index/component/MyApplicationTab.vue index 23f715a..079b354 100644 --- a/pages/index/component/MyApplicationTab.vue +++ b/pages/index/component/MyApplicationTab.vue @@ -248,48 +248,50 @@ {{ $tr('正在同步您的入住申请记录,请稍候。') }} - + - {{ $tr('租房定金须知') }} + + {{ getPaymentNoticeTitle() }} - + - - 1、缴纳线上定金可锁定房源并预约专属看房,平台收取定金后该房源临时下架,不再接待其他客户看房。 - Payment of the online deposit reserves the housing unit and arranges exclusive on-site viewing for you. After receiving the deposit, we will temporarily remove the property from the rental list and stop arranging viewings for other clients. - - - 2、请于约定时间完成实地看房,并在看房结束后 3 个工作日内签署租赁合同;若逾期未看房或未完成签约,视作您主动放弃房源,定金不予退还。 - You shall complete the on-site viewing at the agreed time and sign the rental contract within 3 working days after the viewing. Failure to complete the viewing or sign the contract within the time limit shall be deemed your voluntary waiver of the property, and the deposit will not be refunded. - - - 3、如因租客个人原因取消看房、看房后不愿承租房屋或拒绝签署租赁合同,定金不予退还。 - The deposit is non-refundable if you cancel the viewing, refuse to rent the property or decline to sign the contract due to personal reasons. - - - 4、若因我方房源信息虚假、房屋无法正常交付等我方过错,造成无法看房或签约,定金将全额按原支付路径退还。 - If the viewing or contract signing cannot be conducted due to our liabilities such as false property information or failure to deliver the housing normally, the full deposit will be refunded via your original payment channel. - - - 5、待双方正式签署租赁合同后,该定金可直接抵扣首期租金。 - After both parties formally sign the rental contract, this deposit may be directly deducted from your initial rent. - - - 6、您支付定金,即代表已完整知晓房源全部信息,并自愿接受本须知全部条款约束。 - By making the deposit payment, you confirm that you have fully reviewed all property information and voluntarily accept all terms and conditions set forth in this notice. + + + {{ $tr('本次支付') }} + {{ getPaymentNoticeBillAmountDisplay() }} + {{ $tr('确认后将发起微信支付') }} + + + + {{ $tr('正在同步申请详情,请稍候...') }} + + + {{ $tr('正在同步支付预览,请稍候...') }} + + + + + {{ $tr('入住申请信息') }} + + + + {{ item.label }} + {{ item.value }} + + + - + - - {{ $tr('同意并支付') }} - ({{ $tr('请滑动阅读至底部') }}) + + {{ getPaymentNoticeConfirmText() }} @@ -298,7 +300,7 @@ diff --git a/pkgBooking/book/book.vue b/pkgBooking/book/book.vue index 2ea41f0..f5e6140 100644 --- a/pkgBooking/book/book.vue +++ b/pkgBooking/book/book.vue @@ -79,24 +79,189 @@ $500.00 - {{ isSubmitting ? (language === 'zh' ? '处理中...' : 'Processing...') : $tr('进入支付页') }} + {{ isSubmitting ? (language === 'zh' ? '处理中...' : 'Processing...') : $tr('提交并支付') }} + + + + {{ $tr('租房定金须知') }} + + {{ $tr('支付号') }}:{{ pendingDepositPaymentContext.paymentNo }} + + + + + + 1、缴纳线上定金可锁定房源并预约专属看房,平台收取定金后该房源临时下架,不再接待其他客户看房。 + Payment of the online deposit reserves the housing unit and arranges exclusive on-site viewing for you. After receiving the deposit, we will temporarily remove the property from the rental list and stop arranging viewings for other clients. + + + 2、请于约定时间完成实地看房,并在看房结束后 3 个工作日内签署租赁合同;若逾期未看房或未完成签约,视作您主动放弃房源,定金不予退还。 + You shall complete the on-site viewing at the agreed time and sign the rental contract within 3 working days after the viewing. Failure to complete the viewing or sign the contract within the time limit shall be deemed your voluntary waiver of the property, and the deposit will not be refunded. + + + 3、如因租客个人原因取消看房、看房后不愿承租房屋或拒绝签署租赁合同,定金不予退还。 + The deposit is non-refundable if you cancel the viewing, refuse to rent the property or decline to sign the contract due to personal reasons. + + + 4、若因我方房源信息虚假、房屋无法正常交付等我方过错,造成无法看房或签约,定金将全额按原支付路径退还。 + If the viewing or contract signing cannot be conducted due to our liabilities such as false property information or failure to deliver the housing normally, the full deposit will be refunded via your original payment channel. + + + 5、待双方正式签署租赁合同后,该定金可直接抵扣首期租金。 + After both parties formally sign the rental contract, this deposit may be directly deducted from your initial rent. + + + 6、您支付定金,即代表已完整知晓房源全部信息,并自愿接受本须知全部条款约束。 + By making the deposit payment, you confirm that you have fully reviewed all property information and voluntarily accept all terms and conditions set forth in this notice. + + + + + + {{ $tr('同意并支付') }} + ({{ $tr('请滑动阅读至底部') }}) + + + + diff --git a/pkgBooking/book_viewing/components/RoomTypeSelector.vue b/pkgBooking/book_viewing/components/RoomTypeSelector.vue index f1cebc5..58638cb 100644 --- a/pkgBooking/book_viewing/components/RoomTypeSelector.vue +++ b/pkgBooking/book_viewing/components/RoomTypeSelector.vue @@ -1,40 +1,53 @@