This commit is contained in:
zpc 2025-12-29 22:40:36 +08:00
parent 05ad1348cf
commit d085baf581
9 changed files with 360 additions and 426 deletions

3
.vs/ProjectSettings.json Normal file
View File

@ -0,0 +1,3 @@
{
"CurrentProjectSetting": null
}

View File

@ -0,0 +1,6 @@
{
"ExpandedNodes": [
""
],
"PreviewInSolutionExplorer": false
}

Binary file not shown.

View File

@ -0,0 +1,23 @@
{
"Version": 1,
"WorkspaceRootPath": "D:\\CodeManage\\Coreshop\\uniapp\\mahjong_group\\",
"Documents": [],
"DocumentGroupContainers": [
{
"Orientation": 0,
"VerticalTabListWidth": 256,
"DocumentGroups": [
{
"DockedWidth": 200,
"SelectedChildIndex": -1,
"Children": [
{
"$type": "Bookmark",
"Name": "ST:128:0:{116d2292-e37d-41cd-a077-ebacac4c8cc4}"
}
]
}
]
}
]
}

Binary file not shown.

BIN
.vs/slnx.sqlite Normal file

Binary file not shown.

View File

@ -8,8 +8,8 @@ const development = {
// API基础URL
baseUrl: 'https://sqqp.zpc-xy.com',
host: ['https://sqqp.zpc-xy.com'],
// baseUrl: 'http://192.168.195.15:2401',
// host: ['http://192.168.195.15:2401'],
// baseUrl: 'http://192.168.1.21:2016',
// host: ['http://192.168.1.21:2016'],
// baseUrl: 'http://192.168.1.24:2016',
// host: ['http://192.168.1.24:2016'],
imageUrl: 'https://guyu-1308826010.cos.ap-shanghai.myqcloud.com',

View File

@ -14,23 +14,40 @@
</view>
</label-field>
<view :style="{ height: lineHeight }"></view>
<label-field label="时间段">
<view v-if="roomDetailLoading" class="center" style="padding: 30rpx 0;">
<text style="color: #999; font-size: 24rpx;">加载时段信息中...</text>
</view>
<uni-data-select v-else v-model="selectedTimeSlot" placeholder="请选择时间段"
:localdata="timeSlotOptions" @change="onTimeSlotChange"></uni-data-select>
<view v-if="!roomDetailLoading && timeSlotOptions.length === 0" style="padding: 20rpx 0;">
<text style="color: #FF0000; font-size: 24rpx;">当前日期该房间暂无可预约时段</text>
</view>
<label-field label="开始时间">
<picker mode="time" :value="startTime" @change="onStartTimeChange">
<view class="picker-value">{{ startTime || '请选择开始时间' }}</view>
</picker>
</label-field>
<view :style="{ height: lineHeight }"></view>
<label-field label="最晚到店时间">
<view class="input-wrapper" style="padding: 15rpx 20rpx;" @click="openLatestDateTimePicker">
<text>{{ getLatestDateTimeDisplayText() }}</text>
<label-field label="结束时间">
<view class="end-time-row">
<picker mode="time" :value="endTime" @change="onEndTimeChange">
<view class="picker-value">{{ endTime || '请选择结束时间' }}</view>
</picker>
<view class="next-day-toggle" v-if="startTime && endTime">
<text class="next-day-label" :class="{ active: !isNextDay }" @click="setNextDay(false)">当天</text>
<text class="next-day-divider">/</text>
<text class="next-day-label" :class="{ active: isNextDay }" @click="setNextDay(true)">次日</text>
</view>
</view>
</label-field>
</card-container>
<!-- 时长和跨时段信息显示 -->
<view class="time-info" v-if="startTime && endTime && !timeError">
<view class="time-info-item">
<text class="time-info-label">预计时长</text>
<text class="time-info-value">{{ calculateDuration() }}</text>
</view>
<view class="time-info-item">
<text class="time-info-label">跨越时段</text>
<text class="time-info-value">{{ calculateCrossSlots() }}</text>
</view>
</view>
<!-- 时间错误提示 -->
<view class="time-error" v-if="timeError">
<text>{{ timeError }}</text>
</view>
</card-container>
<card-container marginTop="30rpx">
@ -137,14 +154,9 @@
</view>
</view>
<up-datetime-picker :show="datePickerVisible" v-model="datePickerValue" mode="date"
:minDate="datePickerMinDate" :maxDate="datePickerMaxDate" title="选择日期" @confirm="onDatePickerConfirm"
<up-datetime-picker :show="datePickerVisible" v-model="datePickerValue" mode="date"
:minDate="datePickerMinDate" :maxDate="datePickerMaxDate" title="选择日期" @confirm="onDatePickerConfirm"
@cancel="() => datePickerVisible = false" @close="() => datePickerVisible = false"></up-datetime-picker>
<up-datetime-picker :show="latestDateTimePickerVisible" v-model="latestDateTimePickerValue" mode="time"
:minHour="latestDateTimeMinHour" :maxHour="latestDateTimeMaxHour"
:minMinute="latestDateTimeMinMinute" :maxMinute="latestDateTimeMaxMinute"
title="选择最晚到店时间" @confirm="onLatestDateTimePickerConfirm"
@cancel="() => latestDateTimePickerVisible = false" @close="() => latestDateTimePickerVisible = false"></up-datetime-picker>
<up-picker title="年龄范围选择" :show="agePickerVisible" :columns="agePickerColumns" :keyName="'text'"
:defaultIndex="agePickerDefaultIndex" @confirm="onAgePickerConfirm" @cancel="() => agePickerVisible = false"
@close="() => agePickerVisible = false"></up-picker>
@ -224,25 +236,19 @@
const lineHeight = ref("15rpx")
//
const selectedDate = ref(null) //
const selectedTimeSlot = ref(null) // 0-3null
const roomDetail = ref(null) //
const roomDetailLoading = ref(false) //
const timeSlotOptions = ref([]) //
//
const startTime = ref('') // "HH:mm"
const endTime = ref('') // "HH:mm"
const timeError = ref('') //
const isNextDay = ref(false) //
//
const datePickerVisible = ref(false)
const datePickerValue = ref(Date.now())
const datePickerMinDate = ref(Date.now()) //
// 7+6
const datePickerMaxDate = ref(new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).getTime())
//
const latestDateTimePickerVisible = ref(false)
const latestDateTimePickerValue = ref('00:00') // HH:MM
const latestDateTime = ref(null) //
//
const latestDateTimeMinHour = ref(0)
const latestDateTimeMaxHour = ref(23)
const latestDateTimeMinMinute = ref(0)
const latestDateTimeMaxMinute = ref(59)
//
const reservationInfo = ref({
room_id: 0, //id
@ -384,14 +390,15 @@
//
selectedDate.value = selectedTimestamp;
//
selectedTimeSlot.value = null;
//
startTime.value = '';
endTime.value = '';
timeError.value = '';
isNextDay.value = false; //
reservationInfo.value.start_time = 0;
reservationInfo.value.end_time = 0;
//
latestDateTime.value = null;
//
if (reservationInfo.value.room_id) {
console.log('重新加载房间详情, roomId:', reservationInfo.value.room_id, 'date:', selectedTimestamp);
@ -400,284 +407,204 @@
datePickerVisible.value = false;
}
/**
* 获取最晚到店时间显示文本
* 开始时间变更处理
*/
const getLatestDateTimeDisplayText = () => {
if (!latestDateTime.value) {
return '请选择最晚到店时间';
}
const date = new Date(latestDateTime.value * 1000);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}`;
const onStartTimeChange = (e) => {
startTime.value = e.detail.value;
validateTimeRange();
buildTimeFromPicker();
}
/**
* 获取时间段的时间范围限制
* 结束时间变更处理
*/
const getTimeSlotRange = () => {
if (!selectedTimeSlot.value || selectedTimeSlot.value === null || selectedTimeSlot.value === undefined) {
return { minHour: 0, maxHour: 23, minMinute: 0, maxMinute: 59 };
}
let minHour = 0, maxHour = 23, minMinute = 0, maxMinute = 59;
switch (selectedTimeSlot.value) {
case 0: // 00:00-05:59
minHour = 0;
maxHour = 5;
minMinute = 0;
maxMinute = 59;
break;
case 1: // 06:00-11:59
minHour = 6;
maxHour = 11;
minMinute = 0;
maxMinute = 59;
break;
case 2: // 12:00-17:59
minHour = 12;
maxHour = 17;
minMinute = 0;
maxMinute = 59;
break;
case 3: // 18:00-23:59
minHour = 18;
maxHour = 23;
minMinute = 0;
maxMinute = 59;
break;
}
return { minHour, maxHour, minMinute, maxMinute };
const onEndTimeChange = (e) => {
endTime.value = e.detail.value;
//
autoDetectNextDay();
validateTimeRange();
buildTimeFromPicker();
}
/**
* 打开最晚到店时间选择器
* 自动检测是否需要切换到次日当结束时间小于开始时间时
*/
const openLatestDateTimePicker = () => {
if (!selectedDate.value) {
uni.showToast({
title: '请先选择日期',
icon: 'none'
});
return;
const autoDetectNextDay = () => {
if (!startTime.value || !endTime.value) return;
const [startH, startM] = startTime.value.split(':').map(Number);
const [endH, endM] = endTime.value.split(':').map(Number);
const startMinutes = startH * 60 + startM;
const endMinutes = endH * 60 + endM;
//
if (endMinutes <= startMinutes) {
isNextDay.value = true;
}
if (!selectedTimeSlot.value || selectedTimeSlot.value === null || selectedTimeSlot.value === undefined) {
uni.showToast({
title: '请先选择时间段',
icon: 'none'
});
return;
}
//
const timeRange = getTimeSlotRange();
latestDateTimeMinHour.value = timeRange.minHour;
latestDateTimeMaxHour.value = timeRange.maxHour;
latestDateTimeMinMinute.value = timeRange.minMinute;
latestDateTimeMaxMinute.value = timeRange.maxMinute;
// 使
updateLatestDateTimeFromSlot();
// HH:MM
let timeString = null;
if (latestDateTime.value) {
const date = new Date(latestDateTime.value * 1000);
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
timeString = `${hours}:${minutes}`;
} else {
// 使+30
const timeRangeForDefault = getTimeSlotRange();
let defaultHour = timeRangeForDefault.minHour;
let defaultMinute = 30;
if (defaultMinute > timeRangeForDefault.maxMinute) {
defaultMinute = timeRangeForDefault.maxMinute;
}
timeString = `${String(defaultHour).padStart(2, '0')}:${String(defaultMinute).padStart(2, '0')}`;
}
// "HH:MM"
if (timeString && typeof timeString === 'string' && timeString.match(/^\d{2}:\d{2}$/)) {
latestDateTimePickerValue.value = timeString;
} else {
// 使
const timeRangeForFallback = getTimeSlotRange();
latestDateTimePickerValue.value = `${String(timeRangeForFallback.minHour).padStart(2, '0')}:00`;
}
//
nextTick(() => {
latestDateTimePickerVisible.value = true;
});
}
/**
* 最晚到店时间选择器确认
* 设置结束时间是否为次日
*/
const onLatestDateTimePickerConfirm = async (e) => {
// up-datetime-picker mode="time" v-model "HH:MM"
// e { value: "HH:MM", mode: 'time' } "HH:MM"
let timeString = latestDateTimePickerValue.value;
// v-model
if (!timeString || typeof timeString !== 'string') {
if (e && typeof e === 'object' && e.value !== undefined) {
timeString = e.value;
} else if (typeof e === 'string') {
timeString = e;
}
const setNextDay = (value) => {
isNextDay.value = value;
validateTimeRange();
buildTimeFromPicker();
}
/**
* 验证时间范围支持跨天预约
*/
const validateTimeRange = () => {
timeError.value = '';
if (!startTime.value || !endTime.value) {
return true;
}
//
if (!timeString || typeof timeString !== 'string' || !timeString.includes(':')) {
console.error('时间选择器返回的值格式无效:', e, 'latestDateTimePickerValue:', latestDateTimePickerValue.value);
uni.showToast({
title: '时间选择失败,请重试',
icon: 'none'
});
latestDateTimePickerVisible.value = false;
const [startH, startM] = startTime.value.split(':').map(Number);
const [endH, endM] = endTime.value.split(':').map(Number);
const startMinutes = startH * 60 + startM;
let endMinutes = endH * 60 + endM;
// 24
if (isNextDay.value) {
endMinutes += 24 * 60;
}
//
const durationMinutes = endMinutes - startMinutes;
if (durationMinutes <= 0) {
timeError.value = '结束时间必须晚于开始时间';
return false;
}
if (durationMinutes < 60) {
timeError.value = '预约时长不能少于1小时';
return false;
}
if (durationMinutes > 720) {
timeError.value = '预约时长不能超过12小时';
return false;
}
return true;
}
/**
* 构建时间戳从时间选择器值支持跨天预约
*/
const buildTimeFromPicker = () => {
if (!selectedDate.value || !startTime.value || !endTime.value) {
return;
}
// "HH:MM"
const timeParts = timeString.split(':');
if (timeParts.length !== 2) {
console.error('时间格式错误:', timeString);
uni.showToast({
title: '时间格式错误',
icon: 'none'
});
latestDateTimePickerVisible.value = false;
if (!validateTimeRange()) {
//
reservationInfo.value.start_time = 0;
reservationInfo.value.end_time = 0;
return;
}
const hours = parseInt(timeParts[0], 10);
const minutes = parseInt(timeParts[1], 10);
if (isNaN(hours) || isNaN(minutes) || hours < 0 || hours > 23 || minutes < 0 || minutes > 59) {
console.error('时间值无效:', hours, minutes);
uni.showToast({
title: '时间值无效',
icon: 'none'
});
latestDateTimePickerVisible.value = false;
return;
}
//
if (selectedTimeSlot.value !== null && selectedTimeSlot.value !== undefined) {
const timeRange = getTimeSlotRange();
if (hours < timeRange.minHour || hours > timeRange.maxHour) {
uni.showToast({
title: `时间必须在 ${timeRange.minHour}:00-${timeRange.maxHour}:59 范围内`,
icon: 'none'
});
latestDateTimePickerVisible.value = false;
return;
}
if (hours === timeRange.minHour && minutes < timeRange.minMinute) {
uni.showToast({
title: `时间必须在 ${timeRange.minHour}:${String(timeRange.minMinute).padStart(2, '0')}-${timeRange.maxHour}:59 范围内`,
icon: 'none'
});
latestDateTimePickerVisible.value = false;
return;
}
if (hours === timeRange.maxHour && minutes > timeRange.maxMinute) {
uni.showToast({
title: `时间必须在 ${timeRange.minHour}:00-${timeRange.maxHour}:${String(timeRange.maxMinute).padStart(2, '0')} 范围内`,
icon: 'none'
});
latestDateTimePickerVisible.value = false;
return;
}
}
// 使
if (!selectedDate.value) {
uni.showToast({
title: '请先选择日期',
icon: 'none'
});
latestDateTimePickerVisible.value = false;
return;
}
//
const date = new Date(selectedDate.value * 1000);
const year = date.getFullYear();
const month = date.getMonth();
const day = date.getDate();
const dateTime = new Date(year, month, day, hours, minutes, 0);
//
const selectedTimestamp = Math.floor(dateTime.getTime() / 1000);
//
if (isNaN(selectedTimestamp) || selectedTimestamp <= 0) {
console.error('时间戳转换失败:', dateTime, selectedTimestamp);
uni.showToast({
title: '时间处理失败',
icon: 'none'
});
latestDateTimePickerVisible.value = false;
return;
const [startH, startM] = startTime.value.split(':').map(Number);
const [endH, endM] = endTime.value.split(':').map(Number);
const startDateTime = new Date(date.getFullYear(), date.getMonth(), date.getDate(), startH, startM, 0);
// 1
let endDateTime;
if (isNextDay.value) {
const nextDay = new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1, endH, endM, 0);
endDateTime = nextDay;
} else {
endDateTime = new Date(date.getFullYear(), date.getMonth(), date.getDate(), endH, endM, 0);
}
//
latestDateTime.value = selectedTimestamp;
latestDateTimePickerVisible.value = false;
reservationInfo.value.start_time = Math.floor(startDateTime.getTime() / 1000);
reservationInfo.value.end_time = Math.floor(endDateTime.getTime() / 1000);
}
/**
* 根据时间段自动更新最晚到店时间时间段开始时间+30分钟
* 计算时长显示支持跨天预约
*/
const updateLatestDateTimeFromSlot = () => {
if (!selectedDate.value || selectedTimeSlot.value === null || selectedTimeSlot.value === undefined) {
return;
const calculateDuration = () => {
if (!startTime.value || !endTime.value) return '-';
const [startH, startM] = startTime.value.split(':').map(Number);
const [endH, endM] = endTime.value.split(':').map(Number);
let endMinutes = endH * 60 + endM;
// 24
if (isNextDay.value) {
endMinutes += 24 * 60;
}
//
const date = new Date(selectedDate.value * 1000);
const year = date.getFullYear();
const month = date.getMonth();
const day = date.getDate();
//
let startHour = 0;
let startMinute = 30; // 30
switch (selectedTimeSlot.value) {
case 0: // 00:00-05:59
startHour = 0;
startMinute = 30;
break;
case 1: // 06:00-11:59
startHour = 6;
startMinute = 30;
break;
case 2: // 12:00-17:59
startHour = 12;
startMinute = 30;
break;
case 3: // 18:00-23:59
startHour = 18;
startMinute = 30;
break;
const diffMinutes = endMinutes - (startH * 60 + startM);
if (diffMinutes <= 0) return '-';
const hours = Math.floor(diffMinutes / 60);
const mins = diffMinutes % 60;
if (mins === 0) {
return `${hours}小时`;
}
// +30
const latestDateTimeObj = new Date(year, month, day, startHour, startMinute, 0);
//
latestDateTime.value = Math.floor(latestDateTimeObj.getTime() / 1000);
return `${hours}小时${mins}分钟`;
}
/**
* 计算跨越时段支持跨天预约
*/
const calculateCrossSlots = () => {
if (!startTime.value || !endTime.value) return '-';
const [startH] = startTime.value.split(':').map(Number);
const [endH] = endTime.value.split(':').map(Number);
const slots = [];
const ranges = [
{ name: '凌晨', start: 0, end: 6 },
{ name: '上午', start: 6, end: 12 },
{ name: '下午', start: 12, end: 18 },
{ name: '晚上', start: 18, end: 24 }
];
if (isNextDay.value) {
// +
// 24
for (const r of ranges) {
if (startH < r.end && 24 > r.start) {
if (!slots.includes(r.name)) {
slots.push(r.name);
}
}
}
// 0
for (const r of ranges) {
if (0 < r.end && endH > r.start) {
if (!slots.includes(r.name)) {
slots.push(r.name);
}
}
}
} else {
//
for (const r of ranges) {
// < AND >
if (startH < r.end && endH > r.start) {
slots.push(r.name);
}
}
}
return slots.join('、') || '-';
}
const tipsShow = () => {
submitPopupRef.value.open()
}
@ -807,38 +734,27 @@ const onCustomDepositInput = (val) => {
return false
}
//
if (selectedTimeSlot.value === null || selectedTimeSlot.value === undefined) {
//
if (!startTime.value || !endTime.value) {
uni.showToast({
title: '请选择时间',
title: '请选择开始和结束时间',
icon: 'none'
})
return false
}
//
if (roomDetail.value && roomDetail.value.time_slots) {
const selectedSlot = roomDetail.value.time_slots.find(
slot => slot.slot_type === selectedTimeSlot.value
);
if (!selectedSlot || selectedSlot.status !== 'available') {
uni.showToast({
title: '该时段已不可预约,请重新选择',
icon: 'none',
duration: 2000
});
//
if (reservationInfo.value.room_id && selectedDate.value) {
await loadRoomDetailForReservation(reservationInfo.value.room_id, selectedDate.value);
}
return false;
}
//
if (timeError.value) {
uni.showToast({
title: timeError.value,
icon: 'none'
})
return false
}
if (!info.start_time || info.start_time === 0) {
uni.showToast({
title: '请选择时间',
title: '请选择开始时间',
icon: 'none'
})
return false
@ -846,7 +762,7 @@ const onCustomDepositInput = (val) => {
if (!info.end_time || info.end_time === 0) {
uni.showToast({
title: '请选择时间',
title: '请选择结束时间',
icon: 'none'
})
return false
@ -947,9 +863,7 @@ const onCustomDepositInput = (val) => {
//
credit_limit: currentValue.value,
deposit_fee: finalDeposit,
important_data: {},
//
latestDateTime: latestDateTime.value || null
important_data: {}
}
//
@ -1079,14 +993,15 @@ const onCustomDepositInput = (val) => {
maxPlayerCount.value = savedMaxPlayerCount;
peopleRange.value = savedPeopleRange;
peopleText.value = savedPeopleText;
//
selectedTimeSlot.value = null;
//
startTime.value = '';
endTime.value = '';
timeError.value = '';
isNextDay.value = false; //
reservationInfo.value.start_time = 0;
reservationInfo.value.end_time = 0;
//
latestDateTime.value = null;
gameRuleText.value = "请先选择玩法类型"
}
@ -1145,9 +1060,6 @@ const onCustomDepositInput = (val) => {
} else {
peopleText.value = "请选择游玩人数";
}
// time_slots
generateTimeSlotOptions(detail.time_slots);
} else {
uni.showToast({
title: '获取房间详情失败',
@ -1164,103 +1076,7 @@ const onCustomDepositInput = (val) => {
roomDetailLoading.value = false;
}
}
/**
* 根据房间的 time_slots 动态生成时间段选项
* 只显示可预约的时段status === 'available'
*/
const generateTimeSlotOptions = (timeSlots) => {
if (!timeSlots || !Array.isArray(timeSlots)) {
timeSlotOptions.value = [];
return;
}
//
const timeRangeMap = {
0: { text: '凌晨', range: '00:00-05:59' },
1: { text: '上午', range: '06:00-11:59' },
2: { text: '下午', range: '12:00-17:59' },
3: { text: '晚上', range: '18:00-23:59' }
};
//
const availableSlots = timeSlots.filter(slot => slot.status === 'available');
timeSlotOptions.value = availableSlots.map(slot => {
const slotInfo = timeRangeMap[slot.slot_type] || { text: slot.slot_name, range: '' };
//
let displayText = slotInfo.text;
if (slotInfo.range) {
displayText += ` (${slotInfo.range})`;
}
//
if (slot.price_desc_standard) {
displayText += ` ${slot.price_desc_standard}`;
}
return {
value: slot.slot_type,
text: displayText
};
});
}
/**
* 时段选择改变事件
*/
const onTimeSlotChange = (val) => {
if (!selectedDate.value) return;
selectedTimeSlot.value = val;
//
calculateTimeFromSlot();
// +30
updateLatestDateTimeFromSlot();
}
/**
* 根据选择的日期和时段计算开始时间和结束时间
*/
const calculateTimeFromSlot = () => {
if (!selectedDate.value || selectedTimeSlot.value === null || selectedTimeSlot.value === undefined) return;
//
const date = new Date(selectedDate.value * 1000);
const year = date.getFullYear();
const month = date.getMonth();
const day = date.getDate();
//
let startHour = 0;
let endHour = 0;
switch (selectedTimeSlot.value) {
case 0: // 00:00-05:59
startHour = 0;
endHour = 6;
break;
case 1: // 06:00-11:59
startHour = 6;
endHour = 12;
break;
case 2: // 12:00-17:59
startHour = 12;
endHour = 18;
break;
case 3: // 18:00-23:59
startHour = 18;
endHour = 24;
break;
}
//
const startTime = new Date(year, month, day, startHour, 0, 0);
const endTime = new Date(year, month, day, endHour, 0, 0);
//
reservationInfo.value.start_time = Math.floor(startTime.getTime() / 1000);
reservationInfo.value.end_time = Math.floor(endTime.getTime() / 1000);
}
onLoad(async (options) => {
const config = await getConfigData();
console.log('config', config);
@ -1416,6 +1232,92 @@ const onCustomDepositInput = (val) => {
border-radius: 4px;
}
/* 时间选择器样式 */
.picker-value {
padding: 15rpx 20rpx;
background-color: #f5f5f5;
border-radius: 8rpx;
font-size: 28rpx;
color: #333;
}
/* 结束时间行布局(时间选择器 + 当天/次日切换) */
.end-time-row {
display: flex;
align-items: center;
gap: 20rpx;
}
/* 当天/次日切换样式 */
.next-day-toggle {
display: flex;
align-items: center;
background-color: #f0f0f0;
border-radius: 8rpx;
padding: 8rpx 16rpx;
}
.next-day-label {
font-size: 24rpx;
color: #999;
padding: 4rpx 12rpx;
border-radius: 6rpx;
transition: all 0.2s;
&.active {
color: #fff;
background-color: #00AC4E;
}
}
.next-day-divider {
font-size: 24rpx;
color: #ccc;
margin: 0 4rpx;
}
/* 时间信息显示 */
.time-info {
margin: 20rpx 0;
padding: 20rpx;
background-color: #f8f8f8;
border-radius: 12rpx;
}
.time-info-item {
display: flex;
justify-content: space-between;
margin-bottom: 10rpx;
&:last-child {
margin-bottom: 0;
}
}
.time-info-label {
font-size: 24rpx;
color: #999;
}
.time-info-value {
font-size: 24rpx;
color: #333;
font-weight: 500;
}
/* 时间错误提示 */
.time-error {
margin: 16rpx 0;
padding: 16rpx;
background-color: #fff2f0;
border-radius: 8rpx;
text {
font-size: 24rpx;
color: #ff4d4f;
}
}
/* 可点击的行(年龄范围显示) */
.clickable-row {
font-size: 28rpx;