diff --git a/apps/h5-partner/src/lib/storeDraft.ts b/apps/h5-partner/src/lib/storeDraft.ts index 4a61c72..c8d67a4 100644 --- a/apps/h5-partner/src/lib/storeDraft.ts +++ b/apps/h5-partner/src/lib/storeDraft.ts @@ -8,6 +8,8 @@ export type StoreDraftForm = { phone: string; storeSmsCode: string; address: string; + openTime: string; + closeTime: string; intro: string; coverUrl: string; envPhotoUrls: string[]; @@ -37,6 +39,8 @@ export const defaultStoreForm = (): StoreDraftForm => ({ phone: '', storeSmsCode: '', address: '', + openTime: '10:00', + closeTime: '22:00', intro: '', coverUrl: '', envPhotoUrls: ['', '', ''], @@ -68,6 +72,8 @@ function normalizeForm(raw: Record): StoreDraftForm { phone: String(raw.phone ?? base.phone), storeSmsCode: String(raw.storeSmsCode ?? base.storeSmsCode), address: String(raw.address ?? base.address), + openTime: String(raw.openTime ?? base.openTime), + closeTime: String(raw.closeTime ?? base.closeTime), intro: String(raw.intro ?? base.intro), coverUrl: String(raw.coverUrl ?? base.coverUrl), envPhotoUrls: normalizeStringArray(raw.envPhotoUrls, 3), @@ -119,14 +125,30 @@ export function clearAllStoreDrafts(accountId?: string) { const PHONE_RE = /^1\d{10}$/; const BANK_RE = /^\d{16,19}$/; +const TIME_RE = /^([01]\d|2[0-3]):[0-5]\d$/; + +function timeToMinutes(value: string): number { + const [h, m] = value.split(':').map(Number); + return h * 60 + m; +} export function validateStoreStep1( - form: Pick, + form: Pick< + StoreDraftForm, + 'regionCodes' | 'cityId' | 'name' | 'address' | 'openTime' | 'closeTime' | 'intro' + >, ): string | null { if (!form.regionCodes || form.regionCodes.length < 3) return '请选择省 / 市 / 区县'; if (!form.cityId) return '所选地区未匹配到开城城市,请联系总部配置开城区划'; if (!form.name.trim()) return '请填写门店名称'; if (!form.address.trim()) return '请填写详细地址'; + if (!form.openTime.trim()) return '请填写营业开始时间'; + if (!TIME_RE.test(form.openTime.trim())) return '营业开始时间格式须为 HH:MM'; + if (!form.closeTime.trim()) return '请填写营业结束时间'; + if (!TIME_RE.test(form.closeTime.trim())) return '营业结束时间格式须为 HH:MM'; + if (timeToMinutes(form.openTime.trim()) >= timeToMinutes(form.closeTime.trim())) { + return '营业结束时间须晚于开始时间'; + } if (form.intro.trim()) { const len = form.intro.trim().length; if (len < 10 || len > 500) return '门店简介须为 10~500 字'; diff --git a/apps/h5-partner/src/pages/StoreCreatePage.tsx b/apps/h5-partner/src/pages/StoreCreatePage.tsx index 779ccc3..02b6f83 100644 --- a/apps/h5-partner/src/pages/StoreCreatePage.tsx +++ b/apps/h5-partner/src/pages/StoreCreatePage.tsx @@ -487,6 +487,10 @@ export default function StoreCreatePage() { address: form.address.trim(), + openTime: form.openTime.trim(), + + closeTime: form.closeTime.trim(), + intro: form.intro.trim() || undefined, coverUrl: form.coverUrl.trim() || undefined, @@ -657,6 +661,52 @@ export default function StoreCreatePage() { +
+ + + +
+ + patchForm({ openTime: e.target.value })} + + aria-label="营业开始时间" + + /> + + + + patchForm({ closeTime: e.target.value })} + + aria-label="营业结束时间" + + /> + +
+ +

+ + 将展示给用户端与门店端,默认 10:00–22:00,可按实际调整。 + +

+ +
+