合伙人端开店的流程里加入开店营业时间,放在开店流程的第一页。
This commit is contained in:
@@ -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:00–22:00,可按实际调整。
|
||||||
|
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="partner-field">
|
<div className="partner-field">
|
||||||
|
|
||||||
<label>门店简介</label>
|
<label>门店简介</label>
|
||||||
|
|||||||
Reference in New Issue
Block a user