feat: 新增工单中心、房间巡查、失物招领等业务模块

- 新增工单中心(ticket_center)与工单工作台(ticket_workbench)页面
- 新增房间巡查(room_inspection)与失物招领发布(lost_found_publish)页面
- 预约看样流程新增房型/楼栋/楼层选择器组件
- 新增工具模块: booking-entry、privacy、reservation-flow
- api/index.js 补充楼层列表、看样提交等接口
- locales/messages.js 补充多语言文案
- manifest.json 开启微信小程序隐私检查
- 完善登录、注册、申请详情、账单等相关页面交互
This commit is contained in:
liangjian
2026-07-24 09:35:46 +08:00
parent 9fea127de1
commit 445bd850f4
36 changed files with 9281 additions and 340 deletions

View File

@@ -25,8 +25,12 @@ const messages = {
"pkgService/message_detail/message_detail": "Message Detail",
"pkgService/my_application/my_application": "My Applications",
"pkgService/my_contract/my_contract": "My Contracts",
"pkgService/room_inspection/room_inspection": "Inspection",
"pkgService/service_stub/service_stub": "Service Center",
"pkgService/smart_control/smart_control": "Smart Control",
"pkgService/ticket_center/ticket_center": "Work Orders",
"pkgService/ticket_workbench/ticket_workbench": "Work Order",
"pkgService/lost_found_publish/lost_found_publish": "Lost and Found",
"pkgService/submit_request/submit_request": "Submit Request",
"pkgService/utility_recharge/utility_recharge": "Utility Recharge"
}
@@ -92,6 +96,7 @@ const messages = {
cancelOrderSuccess: "Order canceled",
cancelOrderTitle: "Cancel Order",
continuePay: "Continue Pay",
currentStepTag: "Current",
dateRangeJoiner: " to ",
depositNoticeTitle: "Rental Deposit Notice",
emptyDesc: "You have not submitted any application yet. Go select a room to start a stay or viewing application.",
@@ -102,11 +107,21 @@ const messages = {
loadingDesc: "Syncing your application records. Please wait.",
missingApplicationCode: "Missing application number",
missingBillCode: "Missing application bill number",
missingContractNo: "Missing contract number",
noPendingDepositBill: "No pending deposit bill available",
noMore: "No more applications",
occupantLabel: "Resident",
pageDesc: "Your stay and viewing application records",
pageTitle: "My Applications",
payDeposit: "Pay Deposit",
fetchPaymentParamsFailed: "Failed to get payment parameters",
fetchWechatLoginCodeFailed: "Failed to get WeChat login code",
loadingBill: "Loading bill...",
loadingPayment: "Opening payment...",
depositPaymentDesc: "Deposit Payment",
paymentSuccess: "Payment succeeded",
paymentCanceled: "Payment canceled",
paymentFailed: "Payment failed",
pendingPaymentAmountLabel: "Order Amount",
pendingPaymentDescLabel: "Description",
pendingPaymentExpireLabel: "Time Left",
@@ -118,8 +133,20 @@ const messages = {
refreshEmptySuccess: "No application found. Reservation records synced.",
refreshSuccess: "Application status refreshed",
refreshing: "Refreshing...",
refreshAction: "Refresh",
remarkLabel: "Remarks",
reservationFlowDesc: "Progress of the current reservation order",
reservationFlowTitle: "Reservation Flow",
reservationOrderFallback: "Reservation",
reservationOrderNoLabel: "Order No.",
roomNoLabel: "Room No.",
reservationRoomLabel: "Room Type",
reservationStatusLabel: "Order Status",
contractPendingReviewHint: "Contract signed, waiting for review",
inspectionPendingReviewHint: "Inspection under review",
checkinPendingHint: "Move-in is being processed, please wait",
scrollToRead: "Scroll to bottom",
refreshFlowAction: "Refresh Flow",
statusApproved: "Approved",
statusFinished: "Closed",
statusPending: "Pending",
@@ -249,9 +276,14 @@ const messages = {
loadingManagerInfo: "Loading butler info",
loadingShort: "Syncing",
managerContactSummary: "{count} butlers are available in this area",
managementContacts: "Dorm Managers & Admins",
dormitoryManagerTag: "Dorm Mgr",
counselorTag: "Admin",
noManagerContacts: "No management contacts",
managerFallback: "Community Butler",
managerInitialFallback: "B",
managerWechatCopied: "Butler Wechat copied",
mealDeliveryJumpFailed: "Failed to open the ordering mini-program",
multiButlerName: "{name} +{count}",
myBill: "Monthly Bill",
noButlerInfo: "No butler information yet",
@@ -268,7 +300,7 @@ const messages = {
pendingContractFound: "Pending contract found",
pendingSync: "Pending",
primaryButlerTag: "Lead",
publicService: "Facility Booking",
publicService: "Premium Services",
refreshFailed: "Refresh failed, please try again later",
refreshStatus: "Refresh Status",
refreshing: "Refreshing...",
@@ -366,6 +398,7 @@ const messages = {
},
register: {
register: {
admissionNoticeAttachmentLabel: "Admission Notice (Employment Certificate)",
accountLabel: "Account",
accountPlaceholder: "Enter account name",
accountSection: "Account Information",
@@ -436,6 +469,7 @@ const messages = {
submitRegister: "Submit Registration",
submitting: "Submitting...",
uploadFailed: "Upload failed, please retry",
uploadAdmissionNotice: "Upload admission notice or employment certificate",
uploadIdBack: "Upload ID card back",
uploadIdFront: "Upload ID card front",
uploadImageOption: "Upload Image",
@@ -521,6 +555,7 @@ const messages = {
duration5: "Over 1 year",
durationLabel: "Expected Stay Duration",
navTitle: "On-site Viewing",
roomTypeLabel: "Preferred Room Type",
remarkArea: "Preferred Area: {area}",
remarkBudget: "Budget: {budget} CNY/month",
remarkDuration: "Expected Stay: {duration}",
@@ -795,6 +830,10 @@ const messages = {
leaseDurationKey: "Expected Stay Duration",
leaseTermLabel: "Lease Term",
missingBillCode: "Missing application bill number",
missingContractNo: "Missing contract number",
inspectionPendingReviewHint: "Inspection under review",
checkinPendingHint: "Move-in is being processed, please wait",
refreshAction: "Refresh",
navTitle: "Application Detail",
paymentMethodKey: "Payment Method",
preferredAreaKey: "Preferred Area",
@@ -1147,8 +1186,62 @@ const messages = {
unsupportedSwitch: "This device does not support quick switching"
}
},
lost_found_publish: {
lost_found_publish: {
navTitle: "Lost and Found",
heroBadge: "Community Service",
heroTitle: "Publish lost or found item details",
heroDesc: "Share lost or found information with the community so that follow-up and matching can happen faster.",
formTitle: "Item Information",
formDesc: "Please complete the key details below. Required fields help others contact you faster.",
typeLabel: "Publish Type",
typePlaceholder: "Select lost or found",
typeLost: "Lost Item",
typeFound: "Found Item",
itemTypeLabel: "Item Category",
itemTypePlaceholder: "For example: documents, keys, electronics",
itemNameLabel: "Item Name",
itemNamePlaceholder: "Please enter the item name",
placeLabel: "Location",
placePlaceholder: "Please enter where it was lost or found",
whenLabel: "Time",
selectDate: "Select date",
selectTime: "Select time",
whenTip: "Optional. Fill in the approximate time if available.",
contractLabel: "Contact Person",
contractPlaceholder: "Please enter the contact person",
contractPhoneLabel: "Contact Phone",
contractPhonePlaceholder: "Please enter the contact phone",
remarkLabel: "Remarks",
remarkPlaceholder: "Add more details such as appearance, claim notes, or identifying features",
imagesLabel: "Images",
uploadImage: "Upload Image",
imagesTip: "Optional. Upload on-site or item photos to help identify the item.",
submitTip: "Please verify the information before publishing. We will submit it with the current language.",
submitting: "Submitting...",
submitButton: "Publish Now",
uploadFailed: "Image upload failed",
uploadOversize: "Each image must be within 5 MB",
uploadExceed: "You can upload up to 6 images",
validateItemType: "Please enter the item category",
validateItemName: "Please enter the item name",
validatePlace: "Please enter the location",
validateContract: "Please enter the contact person",
validateContractPhone: "Please enter the contact phone",
submitSuccess: "Published successfully",
submitFailed: "Failed to publish"
}
},
submit_request: {
components: {
BuildingSelector: {
emptyText: "No buildings available",
loadFailed: "Failed to load buildings",
loadingText: "Loading buildings...",
popupTitle: "Select Building",
selectAreaFirst: "Please select an area first",
selectBuilding: "Select building"
},
DateRangeSelector: {
dateDivider: "to",
endLabel: "Expected Check-out",
@@ -1156,6 +1249,14 @@ const messages = {
startLabel: "Expected Check-in",
startPlaceholder: "Select check-in date"
},
FloorSelector: {
clearSelection: "Not specified",
emptyText: "No floors available",
loadFailed: "Failed to load floor list",
loadingText: "Loading floors...",
popupTitle: "Select Floor",
selectFloor: "Select floor"
},
TagSelector: {
emptyText: "No tags available",
loadingText: "Loading tags..."
@@ -1167,12 +1268,14 @@ const messages = {
applyRemarkPlaceholder: "Enter your additional notes",
applyRoomType: "Requested Room Type",
areaLabel: "Area",
buildingLabel: "Preferred Building",
currentRoom: "Current Room",
dateCannotBefore: "{endLabel} cannot be earlier than {startLabel}",
emptyHobbyTags: "No hobby tags",
emptyLifestyleTags: "No lifestyle tags",
expectedCheckin: "Expected Check-in",
expectedCheckout: "Expected Checkout",
floorLabel: "Preferred Floor",
hobbyLabel: "Hobbies",
leaseRange: "Lease Period",
lifestyleLabel: "Lifestyle Habits",
@@ -1184,6 +1287,10 @@ const messages = {
roomTypeApplyBlockTitle: "Application Details",
roomTypeApplyDesc: "Confirm the room type, area, preference tags, and lease period before submitting.",
roomTypeApplyTitle: "Room Type Application",
switchRoomType: "Switch",
summaryTitle: "Application Summary",
expandSummary: "Expand",
collapseSummary: "Collapse",
selectCheckinDate: "Select check-in date",
selectCheckoutDate: "Select checkout date",
selectDateEnd: "Please select {label}",
@@ -1231,8 +1338,12 @@ const messages = {
"pkgService/message_detail/message_detail": "消息详情",
"pkgService/my_application/my_application": "我的申请",
"pkgService/my_contract/my_contract": "我的合同",
"pkgService/room_inspection/room_inspection": "验房",
"pkgService/service_stub/service_stub": "业务办理",
"pkgService/smart_control/smart_control": "智能控制",
"pkgService/ticket_center/ticket_center": "工单中心",
"pkgService/ticket_workbench/ticket_workbench": "工单处理",
"pkgService/lost_found_publish/lost_found_publish": "失物拾物",
"pkgService/submit_request/submit_request": "我要提交",
"pkgService/utility_recharge/utility_recharge": "水电充值"
}
@@ -1298,6 +1409,7 @@ const messages = {
cancelOrderSuccess: "订单已取消",
cancelOrderTitle: "取消订单",
continuePay: "继续支付",
currentStepTag: "当前",
dateRangeJoiner: " 至 ",
depositNoticeTitle: "租房定金须知",
emptyDesc: "您还没有提交任何申请,去选房后可发起入住申请或预约看房。",
@@ -1308,11 +1420,21 @@ const messages = {
loadingDesc: "正在同步您的入住申请记录,请稍候。",
missingApplicationCode: "申请编号缺失",
missingBillCode: "申请单编号缺失",
missingContractNo: "合同编号缺失",
noPendingDepositBill: "暂无待支付定金账单",
noMore: "没有更多申请了",
occupantLabel: "入住人",
pageDesc: "您的入住和预约看房申请记录",
pageTitle: "我的申请",
payDeposit: "支付定金",
fetchPaymentParamsFailed: "获取支付参数失败",
fetchWechatLoginCodeFailed: "获取微信登录凭证失败",
loadingBill: "正在获取账单...",
loadingPayment: "正在拉起支付...",
depositPaymentDesc: "支付定金",
paymentSuccess: "支付成功",
paymentCanceled: "已取消支付",
paymentFailed: "支付失败",
pendingPaymentAmountLabel: "订单金额",
pendingPaymentDescLabel: "支付说明",
pendingPaymentExpireLabel: "剩余支付时间",
@@ -1324,8 +1446,20 @@ const messages = {
refreshEmptySuccess: "未查到申请单,已同步预订单",
refreshSuccess: "申请状态已刷新",
refreshing: "刷新中...",
refreshAction: "刷新",
remarkLabel: "补充说明",
reservationFlowDesc: "当前预定单的流程进度",
reservationFlowTitle: "预定流程",
reservationOrderFallback: "预定单",
reservationOrderNoLabel: "预定单号",
roomNoLabel: "房间号",
reservationRoomLabel: "房型",
reservationStatusLabel: "订单状态",
contractPendingReviewHint: "合同已签,等待宿管审核",
inspectionPendingReviewHint: "验房审批中",
checkinPendingHint: "宿管正在办理入住,请耐心等待",
scrollToRead: "请滑动阅读至底部",
refreshFlowAction: "刷新流程",
statusApproved: "已通过",
statusFinished: "已结束",
statusPending: "待审核",
@@ -1455,9 +1589,14 @@ const messages = {
loadingManagerInfo: "正在加载管家信息",
loadingShort: "同步中",
managerContactSummary: "当前区域共有 {count} 位管家可联系",
managementContacts: "宿管与管理员",
dormitoryManagerTag: "宿管",
counselorTag: "管理员",
noManagerContacts: "暂无管理联系人",
managerFallback: "社区管家",
managerInitialFallback: "管",
managerWechatCopied: "管家微信已复制",
mealDeliveryJumpFailed: "打开点餐小程序失败",
multiButlerName: "{name} 等{count}位管家",
myBill: "本月账单",
noButlerInfo: "暂未获取到管家信息",
@@ -1474,7 +1613,7 @@ const messages = {
pendingContractFound: "发现待签合同",
pendingSync: "待同步",
primaryButlerTag: "主责",
publicService: "社区设施预约",
publicService: "公寓精选服务",
refreshFailed: "刷新失败,请稍后重试",
refreshStatus: "刷新状态",
refreshing: "刷新中...",
@@ -1572,6 +1711,7 @@ const messages = {
},
register: {
register: {
admissionNoticeAttachmentLabel: "入学通知书(在职证明)附件",
accountLabel: "登录账号",
accountPlaceholder: "请输入登录账号",
accountSection: "账号信息",
@@ -1642,6 +1782,7 @@ const messages = {
submitRegister: "提交注册申请",
submitting: "提交中...",
uploadFailed: "上传失败,请重试",
uploadAdmissionNotice: "点击上传入学通知书/在职证明",
uploadIdBack: "点击上传身份证反面",
uploadIdFront: "点击上传身份证正面",
uploadImageOption: "上传图片",
@@ -1727,6 +1868,7 @@ const messages = {
duration5: "1年以上",
durationLabel: "预计租住时长",
navTitle: "预约现场带看",
roomTypeLabel: "意向房型",
remarkArea: "意向区域:{area}",
remarkBudget: "租金预算:{budget} 元/月",
remarkDuration: "预计租住时长:{duration}",
@@ -1745,7 +1887,7 @@ const messages = {
selectViewingTimeDesc: "请选择您方便的时间段",
submitBooking: "提交预约",
submitFailed: "预约提交失败",
submitSuccessContent: "您的预约看房申请已提交。\n系统会自动转发给对应区域有房间权限的宿管,宿管确认带看后可直接完结订单,或选定房型房号后转为预定单发送给租客支付。",
submitSuccessContent: "您的预约看房申请已提交,请等待管家联系",
submitSuccessTitle: "预约成功",
submitting: "提交中...",
today: "今天",
@@ -2001,6 +2143,10 @@ const messages = {
leaseDurationKey: "预计租住时长",
leaseTermLabel: "预计租期",
missingBillCode: "申请单编号缺失",
missingContractNo: "合同编号缺失",
inspectionPendingReviewHint: "验房审批中",
checkinPendingHint: "宿管正在办理入住,请耐心等待",
refreshAction: "刷新",
navTitle: "申请详情",
paymentMethodKey: "支付方式",
preferredAreaKey: "意向区域",
@@ -2353,8 +2499,62 @@ const messages = {
unsupportedSwitch: "该设备不支持快捷开关"
}
},
lost_found_publish: {
lost_found_publish: {
navTitle: "失物拾物",
heroBadge: "社区服务",
heroTitle: "发布失物或招领信息",
heroDesc: "将失物或拾获信息同步给社区,方便后续核实与快速匹配。",
formTitle: "物品信息",
formDesc: "请补充关键字段,必填项越完整,越方便他人联系与认领。",
typeLabel: "发布类型",
typePlaceholder: "请选择失物或招领",
typeLost: "失物",
typeFound: "招领",
itemTypeLabel: "物品类型",
itemTypePlaceholder: "例如证件、钥匙、电子设备",
itemNameLabel: "物品名称",
itemNamePlaceholder: "请输入物品名称",
placeLabel: "地点",
placePlaceholder: "请输入丢失或拾取地点",
whenLabel: "时间",
selectDate: "选择日期",
selectTime: "选择时间",
whenTip: "可选,若已知大致时间可一并填写。",
contractLabel: "联系人",
contractPlaceholder: "请输入联系人",
contractPhoneLabel: "联系电话",
contractPhonePlaceholder: "请输入联系电话",
remarkLabel: "备注",
remarkPlaceholder: "可补充外观特征、认领说明或其他辅助信息",
imagesLabel: "现场图片",
uploadImage: "上传图片",
imagesTip: "可选,上传现场图或物品图可提升识别效率。",
submitTip: "发布前请确认信息准确,系统会按当前语言提交接口。",
submitting: "发布中...",
submitButton: "立即发布",
uploadFailed: "图片上传失败",
uploadOversize: "单张图片不能超过 5 MB",
uploadExceed: "最多上传 6 张图片",
validateItemType: "请输入物品类型",
validateItemName: "请输入物品名称",
validatePlace: "请输入地点",
validateContract: "请输入联系人",
validateContractPhone: "请输入联系电话",
submitSuccess: "发布成功",
submitFailed: "发布失败"
}
},
submit_request: {
components: {
BuildingSelector: {
emptyText: "暂无可选楼栋",
loadFailed: "楼栋列表加载失败",
loadingText: "楼栋加载中...",
popupTitle: "选择意向楼栋",
selectAreaFirst: "请先选择区域",
selectBuilding: "请选择楼栋"
},
DateRangeSelector: {
dateDivider: "至",
endLabel: "预计离开",
@@ -2362,6 +2562,14 @@ const messages = {
startLabel: "预计入住",
startPlaceholder: "请选择入住日期"
},
FloorSelector: {
clearSelection: "不选择",
emptyText: "暂无可选楼层",
loadFailed: "楼层列表加载失败",
loadingText: "楼层加载中...",
popupTitle: "选择意向楼层",
selectFloor: "请选择楼层"
},
TagSelector: {
emptyText: "暂无标签",
loadingText: "标签加载中..."
@@ -2373,12 +2581,14 @@ const messages = {
applyRemarkPlaceholder: "请输入您的申请补充说明",
applyRoomType: "申请房型",
areaLabel: "所属区域",
buildingLabel: "意向楼栋",
currentRoom: "当前房间",
dateCannotBefore: "{endLabel}不能早于{startLabel}",
emptyHobbyTags: "暂无兴趣爱好标签",
emptyLifestyleTags: "暂无生活习惯标签",
expectedCheckin: "预计入住",
expectedCheckout: "预计离开",
floorLabel: "意向楼层",
hobbyLabel: "兴趣爱好",
leaseRange: "租期时间",
lifestyleLabel: "生活习惯",
@@ -2390,6 +2600,10 @@ const messages = {
roomTypeApplyBlockTitle: "房型申请信息",
roomTypeApplyDesc: "请确认房型、区域、偏好标签和租期信息后提交申请。",
roomTypeApplyTitle: "房型申请",
switchRoomType: "切换",
summaryTitle: "申请摘要",
expandSummary: "展开",
collapseSummary: "收起",
selectCheckinDate: "请选择入住日期",
selectCheckoutDate: "请选择离开日期",
selectDateEnd: "请选择{label}",