fix: 修复预约时段及API对接

This commit is contained in:
MaDaLei 2026-04-17 12:13:46 +08:00
parent e91f140bac
commit 6fcb1a828b
5 changed files with 57 additions and 55 deletions

View File

@ -69,7 +69,7 @@ export const getAppointmentDetail = (id) => get('/appointment/detail', { id })
// 创建预约 // 创建预约
export const createAppointment = (data) => post('/appointment/create', data) export const createAppointment = (data) => post('/appointment/create', data)
/** 门店某日半小时挂号时段(可约 / 已约满 / 已过) */ /** 门店某日可预约半小时档(可约 / 已满 / 已过) */
export const getAppointmentAvailableSlots = (storeId, date) => export const getAppointmentAvailableSlots = (storeId, date) =>
get('/appointment/available-slots', { storeId, date }) get('/appointment/available-slots', { storeId, date })
@ -117,7 +117,7 @@ export const updateUser = (data) => put('/user/update', data)
// 门店列表(客户预约选店) // 门店列表(客户预约选店)
export const getStoreList = () => get('/store/list', {}) export const getStoreList = () => get('/store/list', {})
// 门店详情(含预约放号配置) // 门店详情(含营业时间等预约相关配置)
export const getStoreDetail = (id) => get('/store/get', { id }) export const getStoreDetail = (id) => get('/store/get', { id })
// 更新店铺 // 更新店铺

View File

@ -548,8 +548,8 @@ onMounted(async () => {
.c-time-row { display: flex; gap: 10px; } .c-time-row { display: flex; gap: 10px; }
.c-time-half { flex: 1; min-width: 0; } .c-time-half { flex: 1; min-width: 0; }
.c-time-half--slot .slot-range-text { .c-time-half--slot .slot-range-text {
font-size: 12px; font-size: 15px;
letter-spacing: -0.02em; letter-spacing: 0;
} }
.pet-name-row { .pet-name-row {
display: flex; display: flex;
@ -568,9 +568,9 @@ onMounted(async () => {
} }
.c-store-hint { .c-store-hint {
display: block; display: block;
margin-top: 6px; margin-top: 8px;
font-size: 11px; font-size: 13px;
color: #999993; color: #666660;
line-height: 1.4; line-height: 1.5;
} }
</style> </style>

View File

@ -243,7 +243,7 @@ const appointmentTime = computed(() => {
return normalizeToHalfHour(part) return normalizeToHalfHour(part)
}) })
/** B 端弹窗:挂号式时段 */ /** B 端弹窗:按半小时档选可约时段 */
const staffApptDateStr = ref('') const staffApptDateStr = ref('')
const staffAvailableTimes = ref([]) const staffAvailableTimes = ref([])
const staffLoadingSlots = ref(false) const staffLoadingSlots = ref(false)

View File

@ -13,46 +13,11 @@
</view> </view>
<view class="store-hero-text"> <view class="store-hero-text">
<text class="store-hero-title">门店资料</text> <text class="store-hero-title">门店资料</text>
<text class="store-hero-desc">请先设置营业时间再完善名称电话与地址营业时间即客户线上预约可选的时段范围半小时一号</text> <text class="store-hero-desc">在此维护门店名称电话地址与简介并设置营业时间营业时间决定客户线上可预约的时段范围每半小时为一个时段同一时段仅一单</text>
</view> </view>
</view> </view>
<!-- 营业时间置顶避免被误认为没有该配置 --> <view class="store-card">
<view class="store-card store-card--hours">
<view class="store-card-head">
<text class="store-card-title">营业时间</text>
<text class="store-card-sub">客户可预约时段开始结束之间的半点档均可放号与挂号类似</text>
</view>
<view class="store-field">
<view class="store-field-label">
<span class="store-ico"><AppIcon name="service" :size="15" color="#475569" /></span>
<text>开始时间</text>
</view>
<text class="store-field-tip">当日第一个可预约的半点例如 09:00</text>
<picker mode="selector" :range="HALF_HOUR_TIME_SLOTS" :value="bookingStartIdx" @change="onBookingStartChange">
<view class="app-form-input app-form-picker store-picker-like">
<text>{{ form.bookingDayStart || '请选择' }}</text>
<text class="app-form-arrow"></text>
</view>
</picker>
</view>
<view class="store-field store-field-last">
<view class="store-field-label">
<span class="store-ico"><AppIcon name="service" :size="15" color="#475569" /></span>
<text>结束时间</text>
</view>
<text class="store-field-tip">当日最后一个可预约的半点起始时刻例如 21:30 表示最晚可约 21:0021:30 这一档</text>
<picker mode="selector" :range="HALF_HOUR_TIME_SLOTS" :value="bookingLastIdx" @change="onBookingLastChange">
<view class="app-form-input app-form-picker store-picker-like">
<text>{{ form.bookingLastSlotStart || '请选择' }}</text>
<text class="app-form-arrow"></text>
</view>
</picker>
<view class="booking-hint">结束须不早于开始保存后对新建预约生效</view>
</view>
</view>
<view class="store-card" style="margin-top: 14px">
<view class="store-card-head"> <view class="store-card-head">
<text class="store-card-kicker">基础信息</text> <text class="store-card-kicker">基础信息</text>
</view> </view>
@ -100,6 +65,40 @@
</view> </view>
</view> </view>
<view class="store-card store-card--hours store-card--after-basic">
<view class="store-card-head">
<text class="store-card-title">营业时间</text>
<text class="store-card-sub">客户可预约时段为开始结束之间的半点档每半小时为一档每档最多一单已满或已过不可选</text>
</view>
<view class="store-field">
<view class="store-field-label">
<span class="store-ico"><AppIcon name="service" :size="15" color="#475569" /></span>
<text>开始时间</text>
</view>
<text class="store-field-tip">当日第一个可预约的半点例如 09:00</text>
<picker mode="selector" :range="HALF_HOUR_TIME_SLOTS" :value="bookingStartIdx" @change="onBookingStartChange">
<view class="app-form-input app-form-picker store-picker-like">
<text>{{ form.bookingDayStart || '请选择' }}</text>
<text class="app-form-arrow"></text>
</view>
</picker>
</view>
<view class="store-field store-field-last">
<view class="store-field-label">
<span class="store-ico"><AppIcon name="service" :size="15" color="#475569" /></span>
<text>结束时间</text>
</view>
<text class="store-field-tip">当日最后一个可预约的半点起始时刻例如 21:30 表示最晚可约 21:0021:30 这一档</text>
<picker mode="selector" :range="HALF_HOUR_TIME_SLOTS" :value="bookingLastIdx" @change="onBookingLastChange">
<view class="app-form-input app-form-picker store-picker-like">
<text>{{ form.bookingLastSlotStart || '请选择' }}</text>
<text class="app-form-arrow"></text>
</view>
</picker>
<view class="booking-hint">结束须不早于开始保存后对新建预约生效</view>
</view>
</view>
<view class="store-actions"> <view class="store-actions">
<button <button
class="van-button van-button--primary van-button--block store-save-btn" class="van-button van-button--primary van-button--block store-save-btn"
@ -343,6 +342,9 @@ onMounted(async () => {
border-color: #86efac; border-color: #86efac;
box-shadow: 0 8px 22px rgba(34, 197, 94, 0.12); box-shadow: 0 8px 22px rgba(34, 197, 94, 0.12);
} }
.store-card--after-basic {
margin-top: 14px;
}
.store-card-head { .store-card-head {
padding: 14px 14px 6px; padding: 14px 14px 6px;
} }
@ -362,8 +364,8 @@ onMounted(async () => {
.store-card-sub { .store-card-sub {
display: block; display: block;
margin-top: 6px; margin-top: 6px;
font-size: 12px; font-size: 13px;
line-height: 1.5; line-height: 1.55;
color: #64748b; color: #64748b;
} }
@ -385,9 +387,9 @@ onMounted(async () => {
.store-field-tip { .store-field-tip {
display: block; display: block;
margin-bottom: 8px; margin-bottom: 8px;
font-size: 11px; font-size: 13px;
line-height: 1.45; line-height: 1.5;
color: #94a3b8; color: #64748b;
} }
.store-ico { .store-ico {
width: 28px; width: 28px;
@ -489,8 +491,8 @@ onMounted(async () => {
} }
.booking-hint { .booking-hint {
margin-top: 8px; margin-top: 8px;
font-size: 12px; font-size: 13px;
color: #94a3b8; color: #64748b;
line-height: 1.45; line-height: 1.5;
} }
</style> </style>

View File

@ -43,7 +43,7 @@ export function halfHourPickerIndex(hhmm) {
const pad2 = (n) => String(n).padStart(2, '0') const pad2 = (n) => String(n).padStart(2, '0')
/** /**
* 半小时挂号展示为开始结束时间段 09:0009:30 * 半小时预约档展示为开始结束时间段 09:0009:30
* 末档 23:30 结束展示为 23:3024:00 * 末档 23:30 结束展示为 23:3024:00
*/ */
export function formatHalfHourSlotRange(startHHmm) { export function formatHalfHourSlotRange(startHHmm) {