From fc039057777af016e1e4646ec65932914337841e Mon Sep 17 00:00:00 2001 From: jacy <18049821889@163.com> Date: Mon, 27 Jul 2026 23:25:18 +0800 Subject: [PATCH] feat(store): benefit coupon usage rules and show env photos on store detail Add benefitUsageRule on store create/edit (HQ + partner) and C-end detail between intro and env gallery. Co-authored-by: Cursor --- apps/admin-web/src/lib/storeCreate.ts | 5 +++++ apps/admin-web/src/pages/StoresPage.tsx | 19 ++++++++++++++++- apps/h5-partner/src/lib/storeDraft.ts | 15 +++++++++---- apps/h5-partner/src/pages/StoreCreatePage.tsx | 21 +++++++++++++++++++ apps/h5-partner/src/pages/StoreDetailPage.tsx | 17 +++++++++++++++ .../src/pages/store-detail/index.tsx | 9 ++++++++ server/dukang-api/prisma/schema.prisma | 2 ++ .../src/modules/ops/admin-stores.service.ts | 15 ++++++++++++- .../src/modules/ops/dto/admin-mutate.dto.ts | 8 +++++++ .../src/modules/store/store.service.ts | 14 +++++++++++++ 10 files changed, 119 insertions(+), 6 deletions(-) diff --git a/apps/admin-web/src/lib/storeCreate.ts b/apps/admin-web/src/lib/storeCreate.ts index cc68ce3..c7a363e 100644 --- a/apps/admin-web/src/lib/storeCreate.ts +++ b/apps/admin-web/src/lib/storeCreate.ts @@ -14,6 +14,7 @@ export type StoreCreateForm = { latitude?: number | null; longitude?: number | null; intro?: string; + benefitUsageRule?: string; openTime?: string; closeTime?: string; openTime2?: string; @@ -48,6 +49,7 @@ export function validateStoreCreateStep1( | 'phone' | 'address' | 'intro' + | 'benefitUsageRule' | 'openTime' | 'closeTime' | 'openTime2' @@ -88,6 +90,9 @@ export function validateStoreCreateStep1( const len = form.intro.trim().length; if (len < 2 || len > 500) return '门店简介须为 2~500 字'; } + if (form.benefitUsageRule?.trim() && form.benefitUsageRule.trim().length > 1000) { + return '好客权益券使用规则最多 1000 字'; + } return null; } diff --git a/apps/admin-web/src/pages/StoresPage.tsx b/apps/admin-web/src/pages/StoresPage.tsx index 697951f..50823c1 100644 --- a/apps/admin-web/src/pages/StoresPage.tsx +++ b/apps/admin-web/src/pages/StoresPage.tsx @@ -504,6 +504,7 @@ export default function StoresPage() { } : {}), intro: values.intro?.trim() || undefined, + benefitUsageRule: values.benefitUsageRule?.trim() || undefined, openTime: values.openTime?.trim() || '10:00', closeTime: values.closeTime?.trim() || '22:00', ...(values.openTime2?.trim() && values.closeTime2?.trim() @@ -585,6 +586,7 @@ export default function StoresPage() { name: d.name, phone: d.phone, intro: d.intro, + benefitUsageRule: d.benefitUsageRule, coverUrl: d.coverUrl, address: d.address, district: d.district, @@ -688,6 +690,7 @@ export default function StoresPage() { phone: v.phone, coverUrl: v.coverUrl, intro: v.intro, + benefitUsageRule: v.benefitUsageRule ?? null, district: v.district, address: v.address, avgPrice: v.avgPrice, @@ -797,7 +800,14 @@ export default function StoresPage() { - + + + + @@ -1031,6 +1041,13 @@ export default function StoresPage() { + + +
diff --git a/apps/h5-partner/src/lib/storeDraft.ts b/apps/h5-partner/src/lib/storeDraft.ts index 899f880..f3d5f89 100644 --- a/apps/h5-partner/src/lib/storeDraft.ts +++ b/apps/h5-partner/src/lib/storeDraft.ts @@ -22,6 +22,8 @@ export type StoreDraftForm = { categoryParentId: string; categoryId: string; intro: string; + /** 好客权益券使用规则 */ + benefitUsageRule: string; coverUrl: string; envPhotoUrls: string[]; contractUrl: string; @@ -61,6 +63,7 @@ export const defaultStoreForm = (): StoreDraftForm => ({ categoryParentId: '', categoryId: '', intro: '', + benefitUsageRule: '', coverUrl: '', envPhotoUrls: ['', '', ''], contractUrl: '', @@ -155,6 +158,7 @@ export function validateStoreStep1( | 'avgPrice' | 'categoryId' | 'intro' + | 'benefitUsageRule' >, ): string | null { if (!form.regionCodes || form.regionCodes.length < 3) return '请选择省 / 市 / 区县'; @@ -185,10 +189,13 @@ export function validateStoreStep1( if (Number.isNaN(n) || n < 0) return '人均费用须为非负数字'; } if (!form.categoryId.trim()) return '请选择店铺类型'; - if (form.intro.trim()) { - const len = form.intro.trim().length; - if (len < 2 || len > 500) return '门店简介须为 2~500 字'; - } + if (form.intro.trim()) { + const len = form.intro.trim().length; + if (len < 2 || len > 500) return '门店简介须为 2~500 字'; + } + if (form.benefitUsageRule.trim().length > 1000) { + return '好客权益券使用规则最多 1000 字'; + } return null; } diff --git a/apps/h5-partner/src/pages/StoreCreatePage.tsx b/apps/h5-partner/src/pages/StoreCreatePage.tsx index b639ffd..64d4cdc 100644 --- a/apps/h5-partner/src/pages/StoreCreatePage.tsx +++ b/apps/h5-partner/src/pages/StoreCreatePage.tsx @@ -536,6 +536,7 @@ export default function StoreCreatePage() { categoryId: form.categoryId.trim(), intro: form.intro.trim() || undefined, + benefitUsageRule: form.benefitUsageRule.trim() || undefined, coverUrl: form.coverUrl.trim() || undefined, @@ -936,6 +937,26 @@ export default function StoreCreatePage() {
+
+ + + +