合伙人端开店的流程里加入开店营业时间,放在开店流程的第一页。

This commit is contained in:
2026-07-22 11:30:25 +08:00
parent ae7c63c08d
commit 7c9827875f
2 changed files with 73 additions and 1 deletions
+23 -1
View File
@@ -8,6 +8,8 @@ export type StoreDraftForm = {
phone: string; phone: string;
storeSmsCode: string; storeSmsCode: string;
address: string; address: string;
openTime: string;
closeTime: string;
intro: string; intro: string;
coverUrl: string; coverUrl: string;
envPhotoUrls: string[]; envPhotoUrls: string[];
@@ -37,6 +39,8 @@ export const defaultStoreForm = (): StoreDraftForm => ({
phone: '', phone: '',
storeSmsCode: '', storeSmsCode: '',
address: '', address: '',
openTime: '10:00',
closeTime: '22:00',
intro: '', intro: '',
coverUrl: '', coverUrl: '',
envPhotoUrls: ['', '', ''], envPhotoUrls: ['', '', ''],
@@ -68,6 +72,8 @@ function normalizeForm(raw: Record<string, unknown>): StoreDraftForm {
phone: String(raw.phone ?? base.phone), phone: String(raw.phone ?? base.phone),
storeSmsCode: String(raw.storeSmsCode ?? base.storeSmsCode), storeSmsCode: String(raw.storeSmsCode ?? base.storeSmsCode),
address: String(raw.address ?? base.address), address: String(raw.address ?? base.address),
openTime: String(raw.openTime ?? base.openTime),
closeTime: String(raw.closeTime ?? base.closeTime),
intro: String(raw.intro ?? base.intro), intro: String(raw.intro ?? base.intro),
coverUrl: String(raw.coverUrl ?? base.coverUrl), coverUrl: String(raw.coverUrl ?? base.coverUrl),
envPhotoUrls: normalizeStringArray(raw.envPhotoUrls, 3), envPhotoUrls: normalizeStringArray(raw.envPhotoUrls, 3),
@@ -119,14 +125,30 @@ export function clearAllStoreDrafts(accountId?: string) {
const PHONE_RE = /^1\d{10}$/; const PHONE_RE = /^1\d{10}$/;
const BANK_RE = /^\d{16,19}$/; 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( export function validateStoreStep1(
form: Pick<StoreDraftForm, 'regionCodes' | 'cityId' | 'name' | 'address' | 'intro'>, form: Pick<
StoreDraftForm,
'regionCodes' | 'cityId' | 'name' | 'address' | 'openTime' | 'closeTime' | 'intro'
>,
): string | null { ): string | null {
if (!form.regionCodes || form.regionCodes.length < 3) return '请选择省 / 市 / 区县'; if (!form.regionCodes || form.regionCodes.length < 3) return '请选择省 / 市 / 区县';
if (!form.cityId) return '所选地区未匹配到开城城市,请联系总部配置开城区划'; if (!form.cityId) return '所选地区未匹配到开城城市,请联系总部配置开城区划';
if (!form.name.trim()) return '请填写门店名称'; if (!form.name.trim()) return '请填写门店名称';
if (!form.address.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()) { if (form.intro.trim()) {
const len = form.intro.trim().length; const len = form.intro.trim().length;
if (len < 10 || len > 500) return '门店简介须为 10~500 字'; if (len < 10 || len > 500) return '门店简介须为 10~500 字';
@@ -487,6 +487,10 @@ export default function StoreCreatePage() {
address: form.address.trim(), address: form.address.trim(),
openTime: form.openTime.trim(),
closeTime: form.closeTime.trim(),
intro: form.intro.trim() || undefined, intro: form.intro.trim() || undefined,
coverUrl: form.coverUrl.trim() || undefined, coverUrl: form.coverUrl.trim() || undefined,
@@ -657,6 +661,52 @@ export default function StoreCreatePage() {
</div> </div>
<div className="partner-field">
<label> <span className="text-primary">*</span></label>
<div className="partner-input-row" style={{ alignItems: 'center', gap: 8 }}>
<input
className="partner-field-input partner-field-input--block"
type="time"
value={form.openTime}
onChange={(e) => patchForm({ openTime: e.target.value })}
aria-label="营业开始时间"
/>
<span className="label-md text-muted"></span>
<input
className="partner-field-input partner-field-input--block"
type="time"
value={form.closeTime}
onChange={(e) => patchForm({ closeTime: e.target.value })}
aria-label="营业结束时间"
/>
</div>
<p className="label-md text-muted" style={{ marginTop: 8 }}>
10:0022:00
</p>
</div>
<div className="partner-field"> <div className="partner-field">
<label></label> <label></label>