feat(store): 门店套餐 v3.4.10 全端实现
新增 StorePackage 与变更审核流,覆盖总部直存、合伙/门店提审、C 端展示与套餐异议工单;同步 PRD/开发文档与 REQ 索引。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -42,10 +42,10 @@ import {
|
||||
patchEnvPhotoAt,
|
||||
|
||||
} from '../lib/storeDraft';
|
||||
import StorePackagesForm from '../components/StorePackagesForm';
|
||||
import { normalizePackageFormItems, validatePackageFormItems } from '../lib/storePackages';
|
||||
|
||||
|
||||
|
||||
const STEPS = ['基本信息', '照片上传', '结算资质'] as const;
|
||||
const STEPS = ['基本信息', '照片上传', '结算资质', '门店套餐'] as const;
|
||||
|
||||
type StoreCategoryNode = {
|
||||
id: string;
|
||||
@@ -111,7 +111,7 @@ export default function StoreCreatePage() {
|
||||
|
||||
const stepFromUrl = Number(params.get('step') || 0);
|
||||
|
||||
const step = stepFromUrl >= 1 && stepFromUrl <= 3 ? stepFromUrl : (saved?.step ?? 1);
|
||||
const step = stepFromUrl >= 1 && stepFromUrl <= 4 ? stepFromUrl : (saved?.step ?? 1);
|
||||
|
||||
|
||||
|
||||
@@ -318,13 +318,25 @@ export default function StoreCreatePage() {
|
||||
|
||||
}
|
||||
|
||||
if (step === 3) {
|
||||
const msg = validateStoreStep3(form);
|
||||
if (msg) {
|
||||
if (isPhoneValidationMessage(msg)) {
|
||||
setFieldErrors({ phone: msg });
|
||||
return;
|
||||
}
|
||||
reportFormError(msg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
goStep(step + 1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
async function submit() {
|
||||
async function submit(skipPackages = false) {
|
||||
|
||||
const msg = validateStoreStep3(form);
|
||||
|
||||
@@ -337,6 +349,15 @@ export default function StoreCreatePage() {
|
||||
return;
|
||||
}
|
||||
|
||||
const packagesToSubmit = skipPackages ? [] : form.packages || [];
|
||||
if (!skipPackages) {
|
||||
const pkgMsg = validatePackageFormItems(packagesToSubmit);
|
||||
if (pkgMsg) {
|
||||
reportFormError(pkgMsg);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const step1Msg = validateStoreStep1(form);
|
||||
|
||||
if (step1Msg) {
|
||||
@@ -472,6 +493,15 @@ export default function StoreCreatePage() {
|
||||
|
||||
draftSaveDisabledRef.current = true;
|
||||
clearAllStoreDrafts(accountId);
|
||||
const packages = normalizePackageFormItems(packagesToSubmit);
|
||||
if (packages.length) {
|
||||
await request('PARTNER_H5', `/partner/stores/${result.store.id}/packages`, {
|
||||
method: 'PUT',
|
||||
body: JSON.stringify({
|
||||
packages: packages.map((p) => ({ ...p, price: Number(p.price).toFixed(2) })),
|
||||
}),
|
||||
});
|
||||
}
|
||||
setForm(defaultStoreForm());
|
||||
setFieldErrors({});
|
||||
setSubmitError('');
|
||||
@@ -496,7 +526,7 @@ export default function StoreCreatePage() {
|
||||
|
||||
|
||||
|
||||
const progress = step === 1 ? 0 : step === 2 ? 50 : 100;
|
||||
const progress = step === 1 ? 0 : step === 2 ? 33 : step === 3 ? 66 : 100;
|
||||
|
||||
const nextDisabled = submitting;
|
||||
|
||||
@@ -1096,6 +1126,20 @@ export default function StoreCreatePage() {
|
||||
|
||||
)}
|
||||
|
||||
{step === 4 && (
|
||||
<>
|
||||
<section className="partner-section">
|
||||
<h2 className="partner-section-title">门店套餐(可选)</h2>
|
||||
<p className="partner-form-hint">可不填;提交后将进入总部审核。也可跳过此步。</p>
|
||||
<StorePackagesForm
|
||||
items={form.packages?.length ? form.packages : [{ name: '', price: '', dishes: '', usableTime: '', otherNotes: '', sortOrder: 0 }]}
|
||||
onChange={(packages) => setForm((prev) => ({ ...prev, packages }))}
|
||||
disabled={submitting}
|
||||
/>
|
||||
</section>
|
||||
</>
|
||||
)}
|
||||
|
||||
|
||||
|
||||
<footer className="partner-sticky-footer">
|
||||
@@ -1110,7 +1154,7 @@ export default function StoreCreatePage() {
|
||||
|
||||
)}
|
||||
|
||||
{step < 3 ? (
|
||||
{step < 4 ? (
|
||||
|
||||
<button type="button" className="partner-btn-primary" onClick={() => void handleNext()} disabled={nextDisabled}>
|
||||
|
||||
@@ -1122,11 +1166,16 @@ export default function StoreCreatePage() {
|
||||
|
||||
) : (
|
||||
|
||||
<button type="button" className="partner-btn-primary" onClick={() => void submit()} disabled={submitting}>
|
||||
<>
|
||||
<button type="button" className="partner-btn-outline" onClick={() => void submit(true)} disabled={submitting}>
|
||||
跳过
|
||||
</button>
|
||||
<button type="button" className="partner-btn-primary" onClick={() => void submit(false)} disabled={submitting}>
|
||||
|
||||
{submitting ? '提交中…' : '提交'}
|
||||
{submitting ? '提交中…' : '提交'}
|
||||
|
||||
</button>
|
||||
</button>
|
||||
</>
|
||||
|
||||
)}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user