From 233ed0af3b2babe5520ef95248a572b13fc3f5d0 Mon Sep 17 00:00:00 2001 From: jacy <18049821889@163.com> Date: Wed, 19 Aug 2026 15:54:51 +0800 Subject: [PATCH] =?UTF-8?q?v3.5.1=20=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursor/rules/mini-user-weapp-nav-title.mdc | 34 + AGENTS.md | 1 + apps/admin-web/src/App.tsx | 9 + apps/admin-web/src/admin.css | 602 ++++++++++++++++ apps/admin-web/src/layouts/AdminLayout.tsx | 35 +- apps/admin-web/src/lib/admin-events.ts | 72 ++ apps/admin-web/src/pages/BigScreenPage.tsx | 466 ++++++++++++ apps/admin-web/src/pages/OrdersPage.tsx | 14 + apps/admin-web/src/pages/StoreBillsPage.tsx | 6 +- .../src/pages/StorePackageAuditsPage.tsx | 369 +++++++++- apps/admin-web/src/pages/StoresPage.tsx | 29 +- apps/h5-partner/src/lib/api.ts | 49 +- apps/h5-partner/src/pages/LoginPage.tsx | 14 +- apps/h5-partner/src/pages/StoreDetailPage.tsx | 57 +- apps/h5-shop/src/lib/api.ts | 27 +- apps/h5-shop/src/lib/useRedeemSuccessBus.ts | 42 ++ apps/h5-shop/src/pages/LoginPage.tsx | 10 + apps/h5-shop/src/pages/MinePage.tsx | 6 + apps/h5-shop/src/pages/RedeemSuccessPage.tsx | 11 +- apps/h5-shop/src/pages/WithdrawPage.tsx | 6 + apps/mini-user/config/index.ts | 7 +- apps/mini-user/package.json | 2 - apps/mini-user/src/app.config.ts | 54 +- apps/mini-user/src/app.css | 6 - apps/mini-user/src/app.tsx | 1 - apps/mini-user/src/app.weapp.tsx | 73 ++ .../src/assets/icons/store-open-badge.png | Bin 16205 -> 828 bytes apps/mini-user/src/assets/icons/关于我们.png | Bin 8493 -> 2097 bytes apps/mini-user/src/assets/icons/删除.png | Bin 0 -> 198 bytes apps/mini-user/src/assets/icons/可用门店.png | Bin 4392 -> 1077 bytes apps/mini-user/src/assets/icons/地址管理.png | Bin 7996 -> 2066 bytes apps/mini-user/src/assets/icons/已付款.png | Bin 4186 -> 1079 bytes apps/mini-user/src/assets/icons/已完成.png | Bin 3685 -> 979 bytes apps/mini-user/src/assets/icons/待付款.png | Bin 7058 -> 1805 bytes apps/mini-user/src/assets/icons/编辑.png | Bin 0 -> 751 bytes apps/mini-user/src/assets/icons/联系客服.png | Bin 5538 -> 1424 bytes apps/mini-user/src/assets/icons/资质公示.png | Bin 6164 -> 1656 bytes apps/mini-user/src/assets/icons/默认.png | Bin 0 -> 2487 bytes .../src/components/WechatShareReady.weapp.tsx | 21 + .../src/lib/client-location.weapp.ts | 25 + apps/mini-user/src/lib/pay-ready.weapp.ts | 25 + apps/mini-user/src/lib/pay-wechat.weapp.ts | 89 +++ apps/mini-user/src/lib/region-data.ts | 16 +- apps/mini-user/src/lib/region-tree.json | 1 + apps/mini-user/src/lib/user-location.weapp.ts | 232 ++++++ apps/mini-user/src/lib/wechat-auth.weapp.ts | 80 +++ apps/mini-user/src/lib/wechat-share.weapp.ts | 165 +++++ apps/mini-user/src/lib/weixin.weapp.ts | 4 + .../src/pages/address-edit/index.tsx | 1 + apps/mini-user/src/pages/addresses/index.tsx | 1 + .../src/pages/benefit-detail/index.tsx | 1 + .../src/pages/customer-service/index.tsx | 1 + .../src/pages/invoice-apply/index.config.ts | 3 + .../src/pages/invoice-apply/index.tsx | 296 ++++++++ .../src/pages/invoice-titles/index.config.ts | 5 + .../src/pages/invoice-titles/index.tsx | 360 ++++++++++ apps/mini-user/src/pages/login/index.tsx | 1 + apps/mini-user/src/pages/mine/index.tsx | 1 + .../src/pages/order-confirm-pickup/index.tsx | 1 + .../src/pages/order-confirm/index.tsx | 1 + .../src/pages/order-detail/index.tsx | 22 + .../src/pages/order-logistics/index.tsx | 1 + apps/mini-user/src/pages/orders/index.tsx | 29 +- apps/mini-user/src/pages/pay/index.tsx | 1 + .../src/pages/pickup-receive/index.tsx | 1 + .../src/pages/privacy-policy/index.tsx | 1 + .../src/pages/product-detail/index.tsx | 1 + .../mini-user/src/pages/redeem-code/index.tsx | 1 + .../src/pages/redeem-success/index.tsx | 1 + apps/mini-user/src/pages/redeem/index.tsx | 1 + .../src/pages/store-detail/index.tsx | 1 + .../src/pages/store-package-detail/index.tsx | 2 + .../src/pages/user-agreement/index.tsx | 1 + apps/mini-user/src/styles/invoice.css | 415 +++++++++++ apps/mini-user/src/styles/order.css | 58 ++ packages/shared-types/src/index.ts | 1 + packages/shared-types/src/invoice.ts | 38 + .../shared-types/src/store-info-change.ts | 64 ++ packages/shared-types/src/trade.ts | 3 + pnpm-lock.yaml | 26 +- server/dukang-api/package.json | 2 + server/dukang-api/prisma/schema.prisma | 61 ++ .../src/common/compat/v31-compat.ts | 17 + .../common/filters/http-exception.filter.ts | 4 + .../src/common/guards/hq-auth.guard.ts | 4 +- .../src/common/guards/jwt-auth.guard.ts | 88 ++- .../common/guards/partner-primary.guard.ts | 2 +- server/dukang-api/src/jobs/jobs.module.ts | 3 +- .../src/jobs/order-expiry.scheduler.ts | 36 + .../modules/ops/admin-orders.controller.ts | 6 + .../src/modules/ops/admin-orders.service.ts | 29 + .../src/modules/ops/admin-stores.service.ts | 19 +- .../store/store-info-change.controller.ts | 99 +++ .../store/store-info-change.service.ts | 341 +++++++++ .../src/modules/store/store.module.ts | 11 +- .../src/modules/trade/dto/after-sale.dto.ts | 21 +- .../modules/trade/invoice-title.controller.ts | 67 ++ .../modules/trade/invoice-title.service.ts | 123 ++++ .../src/modules/trade/trade.module.ts | 5 +- .../src/modules/trade/trade.service.ts | 174 ++++- server/dukang-api/tsconfig.json | 3 +- 杜康好客-v3.5.1-工单迭代开发文档.md | 663 ++++++++++++++++++ 杜康好客-v3.5.1-开发文档.md | 171 +++++ 103 files changed, 5764 insertions(+), 185 deletions(-) create mode 100644 .cursor/rules/mini-user-weapp-nav-title.mdc create mode 100644 apps/admin-web/src/pages/BigScreenPage.tsx create mode 100644 apps/h5-shop/src/lib/useRedeemSuccessBus.ts create mode 100644 apps/mini-user/src/app.weapp.tsx create mode 100644 apps/mini-user/src/assets/icons/删除.png create mode 100644 apps/mini-user/src/assets/icons/编辑.png create mode 100644 apps/mini-user/src/assets/icons/默认.png create mode 100644 apps/mini-user/src/components/WechatShareReady.weapp.tsx create mode 100644 apps/mini-user/src/lib/client-location.weapp.ts create mode 100644 apps/mini-user/src/lib/pay-ready.weapp.ts create mode 100644 apps/mini-user/src/lib/pay-wechat.weapp.ts create mode 100644 apps/mini-user/src/lib/region-tree.json create mode 100644 apps/mini-user/src/lib/user-location.weapp.ts create mode 100644 apps/mini-user/src/lib/wechat-auth.weapp.ts create mode 100644 apps/mini-user/src/lib/wechat-share.weapp.ts create mode 100644 apps/mini-user/src/lib/weixin.weapp.ts create mode 100644 apps/mini-user/src/pages/invoice-apply/index.config.ts create mode 100644 apps/mini-user/src/pages/invoice-apply/index.tsx create mode 100644 apps/mini-user/src/pages/invoice-titles/index.config.ts create mode 100644 apps/mini-user/src/pages/invoice-titles/index.tsx create mode 100644 apps/mini-user/src/styles/invoice.css create mode 100644 packages/shared-types/src/store-info-change.ts create mode 100644 server/dukang-api/src/jobs/order-expiry.scheduler.ts create mode 100644 server/dukang-api/src/modules/store/store-info-change.controller.ts create mode 100644 server/dukang-api/src/modules/store/store-info-change.service.ts create mode 100644 server/dukang-api/src/modules/trade/invoice-title.controller.ts create mode 100644 server/dukang-api/src/modules/trade/invoice-title.service.ts create mode 100644 杜康好客-v3.5.1-工单迭代开发文档.md create mode 100644 杜康好客-v3.5.1-开发文档.md diff --git a/.cursor/rules/mini-user-weapp-nav-title.mdc b/.cursor/rules/mini-user-weapp-nav-title.mdc new file mode 100644 index 0000000..2632d42 --- /dev/null +++ b/.cursor/rules/mini-user-weapp-nav-title.mdc @@ -0,0 +1,34 @@ +--- +description: 小程序子页不要画与原生导航栏重复的二级 title,标题只用 navigationBarTitleText +globs: apps/mini-user/**/*.{tsx,ts} +alwaysApply: false +--- + +# mini-user · 小程序导航标题 + +微信小程序已有原生导航栏。页面内再画一层 `SubPageHeader` / 自定义 title,会与原生标题叠成**二级 title**。 + +## weapp + +- 页面标题只走 `index.config.ts` 的 `navigationBarTitleText` +- **不要**设 `navigationStyle: 'custom'`(除非该页需要完全自定义导航,如滚动透明顶栏、商品详情) +- **不要**在页面内再渲染与原生标题重复的 `SubPageHeader` +- H5 没有原生导航栏:可保留 `SubPageHeader`(仅返回键;H5 实现已隐藏 title 文案) + +```tsx +// ✅ weapp 用原生标题;H5 保留返回栏 +export default definePageConfig({ + navigationBarTitleText: '申请发票', +}); + +{process.env.TARO_ENV === 'h5' ? ( + +) : null} +``` + +```tsx +// ❌ 未配页标题 + 再画一层 SubPageHeader(weapp 会双标题) + +``` + +弹层/区块标题(如「编辑发票抬头」)不是导航二级 title,可保留。 diff --git a/AGENTS.md b/AGENTS.md index c5547de..317b84c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -139,6 +139,7 @@ C 端门店仅 status=OPEN **iOS 微信 H5 JSSDK**:登录/OAuth 后禁止仅 SPA 跳转再调扫码;见 `packages/weixin-sdk/GOTCHAS.md`、知识库「门店端 · 踩坑」。 **微信小程序 open-type**:`chooseAvatar` 等 Button 的祖先禁止 `stopPropagation`(会编成 catchtap);见知识库「C 端 · 踩坑」、`.cursor/rules/mini-user-weapp-opentype.mdc`。 +**微信小程序页面标题**:weapp 只用原生 `navigationBarTitleText`,不要再画一层与导航栏重复的 `SubPageHeader` title;见 `.cursor/rules/mini-user-weapp-nav-title.mdc`。 ## 环境与发版 diff --git a/apps/admin-web/src/App.tsx b/apps/admin-web/src/App.tsx index cbc81b8..31b8415 100644 --- a/apps/admin-web/src/App.tsx +++ b/apps/admin-web/src/App.tsx @@ -5,6 +5,7 @@ import LoginPage from './pages/LoginPage'; import DashboardPage from './pages/DashboardPage'; import UsersPage from './pages/UsersPage'; import OrdersPage from './pages/OrdersPage'; +import BigScreenPage from './pages/BigScreenPage'; import StorePackageAuditsPage from './pages/StorePackageAuditsPage'; import StoresPage from './pages/StoresPage'; import StoreRatingsPage from './pages/StoreRatingsPage'; @@ -65,6 +66,14 @@ export default function App() { return ( } /> + + + + } + /> diff --git a/apps/admin-web/src/admin.css b/apps/admin-web/src/admin.css index 81f5524..2143e93 100644 --- a/apps/admin-web/src/admin.css +++ b/apps/admin-web/src/admin.css @@ -104,3 +104,605 @@ body, overflow: visible; max-width: none; } + +/* v3.5.1 #1 订单大屏:发布会现场 */ +html:has(.big-screen-page), +body:has(.big-screen-page), +#root:has(.big-screen-page) { + overflow: hidden; + height: 100%; +} + +.big-screen-page { + position: fixed; + inset: 0; + width: 100vw; + height: 100vh; + background: radial-gradient(ellipse at 50% 18%, #163a6b 0%, #0b1e3a 42%, #061224 100%); + color: #d6e8ff; + padding: 20px 48px 24px; + box-sizing: border-box; + overflow: hidden; + display: flex; + flex-direction: column; +} + +.big-screen-stars { + pointer-events: none; + position: absolute; + inset: 0; + background-image: + radial-gradient(1px 1px at 8% 18%, rgba(255, 255, 255, 0.35), transparent), + radial-gradient(1px 1px at 22% 72%, rgba(160, 210, 255, 0.28), transparent), + radial-gradient(1.5px 1.5px at 78% 24%, rgba(255, 255, 255, 0.22), transparent), + radial-gradient(1px 1px at 91% 68%, rgba(160, 210, 255, 0.3), transparent), + radial-gradient(1px 1px at 46% 88%, rgba(255, 255, 255, 0.18), transparent), + radial-gradient(1.5px 1.5px at 61% 12%, rgba(160, 210, 255, 0.25), transparent); + opacity: 0.7; +} + +.big-screen-frame { + pointer-events: none; + position: absolute; + inset: 14px 18px; +} + +.big-screen-corner { + position: absolute; + width: 28px; + height: 28px; + border: 1px solid rgba(105, 192, 255, 0.7); +} + +.big-screen-corner--tl { + top: 0; + left: 0; + border-right: none; + border-bottom: none; +} + +.big-screen-corner--tr { + top: 0; + right: 0; + border-left: none; + border-bottom: none; +} + +.big-screen-corner--bl { + bottom: 0; + left: 0; + border-right: none; + border-top: none; +} + +.big-screen-corner--br { + bottom: 0; + right: 0; + border-left: none; + border-top: none; +} + +.big-screen-header { + position: relative; + z-index: 1; + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 10px; + border-bottom: 1px solid rgba(105, 192, 255, 0.18); +} + +.big-screen-brand { + display: flex; + align-items: baseline; + gap: 10px; +} + +.big-screen-title { + margin: 0; + font-size: 28px; + line-height: 1; + font-weight: 700; + letter-spacing: 4px; + color: #fff; +} + +.big-screen-subtitle { + font-size: 16px; + color: rgba(200, 220, 245, 0.55); + letter-spacing: 2px; +} + +.big-screen-live-wrap { + display: flex; + align-items: center; + gap: 12px; +} + +.big-screen-live-label { + font-size: 18px; + color: rgba(230, 244, 255, 0.88); + letter-spacing: 2px; +} + +.big-screen-live { + display: inline-flex; + align-items: center; + gap: 8px; + padding: 4px 12px 4px 10px; + border: 1px solid rgba(64, 169, 255, 0.7); + border-radius: 6px; + font-size: 14px; + font-weight: 700; + color: #fff; + letter-spacing: 2px; + background: rgba(8, 28, 56, 0.55); +} + +.big-screen-live-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: #ff4d4f; + box-shadow: 0 0 8px #ff4d4f; + animation: big-screen-pulse 1.2s ease-in-out infinite; +} + +@keyframes big-screen-pulse { + 0%, + 100% { + opacity: 1; + transform: scale(1); + } + 50% { + opacity: 0.35; + transform: scale(0.75); + } +} + +.big-screen-hero { + position: relative; + z-index: 1; + flex: 0 0 auto; + text-align: center; + padding: 16px 0 12px; +} + +.big-screen-clock { + font-size: 84px; + line-height: 1; + font-weight: 500; + font-variant-numeric: tabular-nums; + letter-spacing: 10px; + color: #9fd3ff; + text-shadow: 0 0 28px rgba(105, 192, 255, 0.45); +} + +.big-screen-date { + margin-top: 8px; + font-size: 16px; + letter-spacing: 4px; + color: rgba(180, 210, 240, 0.65); +} + +.big-screen-list { + position: relative; + z-index: 1; + flex: 1; + min-height: 0; + display: flex; + flex-direction: column; + padding: 0 8px; + overflow: hidden; +} + +.big-screen-list-head, +.big-screen-row { + display: grid; + grid-template-columns: 180px 1fr 160px 200px; + align-items: center; + column-gap: 16px; +} + +.big-screen-list-head { + flex: 0 0 auto; + padding: 0 28px 10px 40px; + font-size: 15px; + color: rgba(170, 200, 230, 0.55); + letter-spacing: 2px; +} + +.big-screen-list-body { + flex: 1 1 0%; + min-height: 0; + height: 0; + overflow: hidden; + position: relative; +} + +.big-screen-track { + position: absolute; + left: 0; + right: 0; + top: 0; + display: flex; + flex-direction: column; +} + +.big-screen-track.is-rolling { + animation: big-screen-marquee-up var(--marquee-ms, 20s) linear infinite; +} + +.big-screen-track.is-paused { + animation-play-state: paused; +} + +@keyframes big-screen-marquee-up { + from { + transform: translateY(0); + } + to { + transform: translateY(-50%); + } +} + +.big-screen-row { + position: relative; + flex: 0 0 auto; + height: 68px; + margin-bottom: 12px; + padding: 0 28px 0 40px; + background: rgba(18, 48, 88, 0.45); + border: 1px solid transparent; + border-radius: 4px; + font-size: 22px; + color: #e8f4ff; + box-sizing: border-box; +} + +.big-screen-row.is-latest { + border-color: rgba(64, 169, 255, 0.85); + box-shadow: 0 0 16px rgba(24, 144, 255, 0.28); +} + +.big-screen-row--t1 { + background: rgba(22, 54, 98, 0.48); + border-color: rgba(105, 192, 255, 0.16); +} + +.big-screen-row--t1 .big-screen-amount { + color: #e6f4ff; +} + +.big-screen-row--t2.is-latest { + border-color: rgba(255, 229, 143, 0.95); + box-shadow: 0 0 18px rgba(255, 229, 143, 0.42); +} + +.big-screen-row--t3.is-latest { + border-color: #ffd666; + box-shadow: 0 0 22px rgba(250, 173, 20, 0.55); +} + +.big-screen-row--t2 { + background: rgba(64, 48, 8, 0.42); + border-color: rgba(255, 229, 143, 0.45); + color: #fff7d6; +} + +.big-screen-row--t2 .big-screen-amount { + color: #ffe58f; + text-shadow: 0 0 10px rgba(255, 229, 143, 0.45); +} + +.big-screen-row--t3 { + background: rgba(72, 48, 0, 0.5); + border-color: rgba(250, 173, 20, 0.75); + color: #ffe7a3; + box-shadow: 0 0 18px rgba(250, 173, 20, 0.28); +} + +.big-screen-row--t3 .big-screen-amount { + color: #ffd666; + text-shadow: 0 0 14px rgba(255, 214, 102, 0.7); +} + +.big-screen-row-mark { + position: absolute; + left: 12px; + top: 50%; + width: 10px; + height: 22px; + margin-top: -11px; + border-radius: 6px; + background: #40a9ff; + box-shadow: 0 0 10px #40a9ff; +} + +.big-screen-row--t2 .big-screen-row-mark { + background: #ffe58f; + box-shadow: 0 0 10px #ffe58f; +} + +.big-screen-row--t3 .big-screen-row-mark { + background: #ffd666; + box-shadow: 0 0 12px #ffd666; +} + +.big-screen-amount { + font-weight: 700; + font-variant-numeric: tabular-nums; + white-space: nowrap; +} + +.big-screen-items { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.big-screen-time, +.big-screen-phone { + font-variant-numeric: tabular-nums; + letter-spacing: 1px; + white-space: nowrap; +} + +.big-screen-empty { + text-align: center; + color: rgba(255, 255, 255, 0.45); + padding: 48px 20px; + font-size: 18px; +} + +.big-screen-fx { + position: absolute; + inset: 0; + z-index: 20; + display: flex; + align-items: center; + justify-content: center; + pointer-events: none; + overflow: hidden; + background: rgba(4, 12, 28, 0.38); +} + +.big-screen-fx-canvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} + +.big-screen-fx-shock { + position: absolute; + width: 40px; + height: 40px; + border-radius: 50%; + border: 3px solid rgba(255, 214, 102, 0.85); + animation: big-screen-shock 1.1s ease-out forwards; +} + +@keyframes big-screen-shock { + 0% { + transform: scale(0.2); + opacity: 1; + } + 100% { + transform: scale(28); + opacity: 0; + } +} + +.big-screen-fx-sweep { + position: absolute; + inset: 0; + background: linear-gradient( + 115deg, + transparent 38%, + rgba(255, 245, 200, 0.22) 50%, + transparent 62% + ); + background-size: 220% 100%; + animation: big-screen-sweep 1.4s ease-out 0.15s both; +} + +.big-screen-fx-sweep--alt { + animation-delay: 0.55s; + background: linear-gradient( + 65deg, + transparent 38%, + rgba(255, 214, 102, 0.2) 50%, + transparent 62% + ); +} + +.big-screen-fx-shock--late { + animation-delay: 0.35s; + border-color: rgba(255, 236, 179, 0.55); +} + +@keyframes big-screen-sweep { + from { + background-position: 120% 0; + opacity: 0; + } + 30% { + opacity: 1; + } + to { + background-position: -40% 0; + opacity: 0; + } +} + +.big-screen-fx-card { + position: relative; + z-index: 2; + min-width: 420px; + max-width: 72vw; + padding: 28px 40px 32px; + border-radius: 12px; + text-align: center; + background: rgba(8, 22, 48, 0.82); + backdrop-filter: blur(8px); +} + +.big-screen-fx-card--t1 { + border: 2px solid rgba(105, 192, 255, 0.85); + box-shadow: 0 0 32px rgba(24, 144, 255, 0.45); + animation: big-screen-card-in-t1 0.55s cubic-bezier(0.2, 0.9, 0.2, 1) both; +} + +.big-screen-fx-card--t2 { + border: 2px solid rgba(255, 229, 143, 0.95); + box-shadow: 0 0 40px rgba(255, 214, 102, 0.5); + animation: big-screen-card-in-t2 0.6s cubic-bezier(0.16, 1.2, 0.3, 1) both; +} + +.big-screen-fx-card--t3 { + min-width: 520px; + padding: 36px 48px 40px; + border: 3px solid #ffd666; + box-shadow: + 0 0 28px rgba(255, 214, 102, 0.85), + 0 0 80px rgba(250, 173, 20, 0.45); + animation: big-screen-card-in-t3 0.7s cubic-bezier(0.12, 1.4, 0.2, 1) both; +} + +@keyframes big-screen-card-in-t1 { + from { + opacity: 0; + transform: translateY(80px) scale(0.92); + } + to { + opacity: 1; + transform: translateY(0) scale(1); + } +} + +@keyframes big-screen-card-in-t2 { + 0% { + opacity: 0; + transform: scale(0.6); + } + 70% { + transform: scale(1.06); + } + 100% { + opacity: 1; + transform: scale(1); + } +} + +@keyframes big-screen-card-in-t3 { + 0% { + opacity: 0; + transform: scale(0.4) rotate(-4deg); + } + 55% { + transform: scale(1.12) rotate(1deg); + } + 100% { + opacity: 1; + transform: scale(1) rotate(0); + } +} + +.big-screen-fx-kicker { + font-size: 16px; + letter-spacing: 8px; + color: rgba(230, 244, 255, 0.7); + margin-bottom: 8px; +} + +.big-screen-fx-card--t2 .big-screen-fx-kicker, +.big-screen-fx-card--t3 .big-screen-fx-kicker { + color: #ffe58f; +} + +.big-screen-fx-amount { + font-size: 64px; + font-weight: 800; + font-variant-numeric: tabular-nums; + letter-spacing: 2px; + line-height: 1.1; + color: #e6f7ff; +} + +.big-screen-fx-card--t1 .big-screen-fx-amount { + color: #91d5ff; + text-shadow: 0 0 18px rgba(105, 192, 255, 0.6); +} + +.big-screen-fx-card--t2 .big-screen-fx-amount { + color: #ffe58f; + text-shadow: 0 0 20px rgba(255, 229, 143, 0.7); + animation: big-screen-amount-pop 0.8s ease-out 0.15s both; +} + +.big-screen-fx-card--t3 .big-screen-fx-amount { + font-size: 84px; + color: #ffd666; + text-shadow: + 0 0 12px #ffd666, + 0 0 36px rgba(250, 173, 20, 0.8); + animation: big-screen-amount-flash 0.9s ease-in-out infinite; +} + +@keyframes big-screen-amount-pop { + 0% { + transform: scale(0.7); + } + 70% { + transform: scale(1.12); + } + 100% { + transform: scale(1); + } +} + +@keyframes big-screen-amount-flash { + 0%, + 100% { + filter: brightness(1); + } + 50% { + filter: brightness(1.35); + } +} + +.big-screen-fx-items { + margin-top: 12px; + font-size: 22px; + color: #fff; +} + +.big-screen-fx-meta { + margin-top: 10px; + display: flex; + justify-content: center; + gap: 28px; + font-size: 16px; + color: rgba(210, 228, 250, 0.75); + font-variant-numeric: tabular-nums; +} + +@media (max-width: 1200px) { + .big-screen-clock { + font-size: 56px; + } + .big-screen-list-head, + .big-screen-row { + grid-template-columns: 140px 1fr 120px 160px; + font-size: 16px; + } + .big-screen-fx-amount { + font-size: 44px; + } + .big-screen-fx-card--t3 .big-screen-fx-amount { + font-size: 56px; + } +} + diff --git a/apps/admin-web/src/layouts/AdminLayout.tsx b/apps/admin-web/src/layouts/AdminLayout.tsx index 4f3a1e4..17942e8 100644 --- a/apps/admin-web/src/layouts/AdminLayout.tsx +++ b/apps/admin-web/src/layouts/AdminLayout.tsx @@ -23,7 +23,7 @@ import { import { hasAnySystemSettingsPermission } from '@dukang/shared-types'; import { clearAuth, request, type HqProfile } from '../lib/api'; import { bindAdminEllipsisTitle } from '../lib/ellipsis-title'; -import { PACKAGE_AUDIT_CHANGED_EVENT } from '../lib/admin-events'; +import { AUDIT_NOTICE_CHANGED_EVENT, PACKAGE_AUDIT_CHANGED_EVENT } from '../lib/admin-events'; const { Header, Sider, Content } = Layout; @@ -61,7 +61,7 @@ const MENU_ITEMS: MenuProps['items'] = [ label: '门店', children: [ { key: '/stores', label: '门店列表' }, - { key: '/store-package-audits', label: '套餐审核' }, + { key: '/store-package-audits', label: '审核通知' }, { key: '/store-ratings', label: '门店评价' }, { key: '/store-categories', label: '门店分类' }, { key: '/store-accounts', label: '门店账户' }, @@ -244,14 +244,14 @@ function filterMenuItems(items: MenuProps['items'], permissionKeys: string[]): M .filter(Boolean) as MenuProps['items']; } -function attachPackageAuditBadge(items: MenuProps['items'], pendingCount: number): MenuProps['items'] { +function attachAuditBadge(items: MenuProps['items'], pendingCount: number): MenuProps['items'] { if (!items) return items; return items.map((item) => { if (!item || typeof item !== 'object' || !('key' in item)) return item; if ('children' in item && Array.isArray(item.children)) { return { ...item, - children: attachPackageAuditBadge(item.children as MenuProps['items'], pendingCount), + children: attachAuditBadge(item.children as MenuProps['items'], pendingCount), } as MenuItem; } if (String(item.key) === '/store-package-audits') { @@ -259,7 +259,7 @@ function attachPackageAuditBadge(items: MenuProps['items'], pendingCount: number ...item, label: ( - 套餐审核 + 审核通知 {pendingCount > 0 && } ), @@ -276,11 +276,14 @@ export default function AdminLayout() { const location = useLocation(); const contentRef = useRef(null); const [profile, setProfile] = useState(null); - const [packagePendingCount, setPackagePendingCount] = useState(0); + const [auditPendingCount, setAuditPendingCount] = useState(0); - function refreshPackagePendingCount() { - request<{ pendingCount: number }>('/admin/store-package-audits/summary') - .then((data) => setPackagePendingCount(data.pendingCount ?? 0)) + function refreshAuditPendingCount() { + Promise.all([ + request<{ pendingCount: number }>('/admin/store-package-audits/summary').catch(() => ({ pendingCount: 0 })), + request<{ pendingCount: number; packagePendingCount?: number }>('/admin/store-info-change-requests/summary').catch(() => ({ pendingCount: 0 })), + ]) + .then(([pkg, info]) => setAuditPendingCount((pkg.pendingCount ?? 0) + (info.pendingCount ?? 0))) .catch(() => {}); } @@ -289,13 +292,17 @@ export default function AdminLayout() { }, []); useEffect(() => { - refreshPackagePendingCount(); + refreshAuditPendingCount(); }, [location.pathname]); useEffect(() => { - const onChanged = () => refreshPackagePendingCount(); + const onChanged = () => refreshAuditPendingCount(); window.addEventListener(PACKAGE_AUDIT_CHANGED_EVENT, onChanged); - return () => window.removeEventListener(PACKAGE_AUDIT_CHANGED_EVENT, onChanged); + window.addEventListener(AUDIT_NOTICE_CHANGED_EVENT, onChanged); + return () => { + window.removeEventListener(PACKAGE_AUDIT_CHANGED_EVENT, onChanged); + window.removeEventListener(AUDIT_NOTICE_CHANGED_EVENT, onChanged); + }; }, []); useEffect(() => { @@ -320,8 +327,8 @@ export default function AdminLayout() { !profile || profile.adminRole === 'SUPER_ADMIN' ? MENU_ITEMS : filterMenuItems(MENU_ITEMS, profile.permissionKeys ?? []); - return attachPackageAuditBadge(base, packagePendingCount); - }, [profile, packagePendingCount]); + return attachAuditBadge(base, auditPendingCount); + }, [profile, auditPendingCount]); return ( diff --git a/apps/admin-web/src/lib/admin-events.ts b/apps/admin-web/src/lib/admin-events.ts index 649986f..818a9ce 100644 --- a/apps/admin-web/src/lib/admin-events.ts +++ b/apps/admin-web/src/lib/admin-events.ts @@ -1,5 +1,77 @@ export const PACKAGE_AUDIT_CHANGED_EVENT = 'admin:package-audit-changed'; +export const AUDIT_NOTICE_CHANGED_EVENT = 'dukang:audit-notice-changed'; +export const BIG_SCREEN_DEMO_CHANNEL = 'dukang-big-screen'; +export const BIG_SCREEN_DEMO_STORAGE_KEY = 'dukang:big-screen-demo'; + +export type BigScreenDemoOrder = { + payAmount: number; + items: string; + userPhoneMasked: string; +}; + +export type BigScreenDemoPayload = { + type: 'demo'; + id: string; + at: number; + orders: BigScreenDemoOrder[]; +}; + +export function buildBigScreenDemoPayload(): BigScreenDemoPayload { + return { + type: 'demo', + id: `demo-${Date.now()}`, + at: Date.now(), + orders: [ + { payAmount: 1288, items: '杜康君酿 · 浓香型 × 6瓶', userPhoneMasked: '138****8888' }, + { payAmount: 688, items: '杜康君酿 · 浓香型 × 2瓶', userPhoneMasked: '139****6666' }, + { payAmount: 188, items: '杜康君酿 · 浓香型 × 1瓶', userPhoneMasked: '137****1888' }, + ], + }; +} + +export function triggerBigScreenDemo() { + const payload = buildBigScreenDemoPayload(); + try { + localStorage.setItem(BIG_SCREEN_DEMO_STORAGE_KEY, JSON.stringify(payload)); + } catch { + /* ignore quota */ + } + try { + const ch = new BroadcastChannel(BIG_SCREEN_DEMO_CHANNEL); + ch.postMessage(payload); + ch.close(); + } catch { + /* BroadcastChannel 不可用时靠 localStorage 冷启动 */ + } + return payload; +} + +export function readPendingBigScreenDemo(maxAgeMs = 8000): BigScreenDemoPayload | null { + try { + const raw = localStorage.getItem(BIG_SCREEN_DEMO_STORAGE_KEY); + if (!raw) return null; + const parsed = JSON.parse(raw) as BigScreenDemoPayload; + if (parsed?.type !== 'demo' || !parsed.id || !Array.isArray(parsed.orders)) return null; + if (Date.now() - Number(parsed.at || 0) > maxAgeMs) return null; + return parsed; + } catch { + return null; + } +} + +export function clearPendingBigScreenDemo() { + try { + localStorage.removeItem(BIG_SCREEN_DEMO_STORAGE_KEY); + } catch { + /* ignore */ + } +} export function notifyPackageAuditChanged() { window.dispatchEvent(new Event(PACKAGE_AUDIT_CHANGED_EVENT)); + window.dispatchEvent(new Event(AUDIT_NOTICE_CHANGED_EVENT)); +} + +export function notifyAuditNoticeChanged() { + notifyPackageAuditChanged(); } diff --git a/apps/admin-web/src/pages/BigScreenPage.tsx b/apps/admin-web/src/pages/BigScreenPage.tsx new file mode 100644 index 0000000..0ba45f7 --- /dev/null +++ b/apps/admin-web/src/pages/BigScreenPage.tsx @@ -0,0 +1,466 @@ +import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from 'react'; +import { request } from '../lib/api'; +import { + BIG_SCREEN_DEMO_CHANNEL, + clearPendingBigScreenDemo, + readPendingBigScreenDemo, + type BigScreenDemoPayload, +} from '../lib/admin-events'; + +export type BigScreenOrder = { + id: string; + orderNo: string; + payAmount: number; + items: string; + createdAt: string; + userPhoneMasked: string | null; +}; + +type AmountTier = 1 | 2 | 3; + +const POLL_MS = 3000; +const ROW_MS = 2500; +const WEEKDAYS = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']; +const TIER_DURATION: Record = { 1: 3000, 2: 4500, 3: 6000 }; + +function pad(n: number) { + return String(n).padStart(2, '0'); +} + +function formatClock(d: Date) { + return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; +} + +function formatDateLine(d: Date) { + return `${d.getFullYear()} / ${pad(d.getMonth() + 1)} / ${pad(d.getDate())} ${WEEKDAYS[d.getDay()]}`; +} + +function formatHm(iso: string): string { + try { + return formatClock(new Date(iso)); + } catch { + return iso; + } +} + +function formatAmount(n: number): string { + return Number(n || 0).toLocaleString('zh-CN', { + minimumFractionDigits: 0, + maximumFractionDigits: 0, + }); +} + +export function amountTier(payAmount: number): AmountTier { + if (payAmount >= 1000) return 3; + if (payAmount >= 500) return 2; + return 1; +} + +function LiveClock() { + const [now, setNow] = useState(() => new Date()); + useEffect(() => { + const id = setInterval(() => setNow(new Date()), 1000); + return () => clearInterval(id); + }, []); + return ( + + {formatClock(now)} + {formatDateLine(now)} + + ); +} + +function OrderRow({ + order, + latest, +}: { + order: BigScreenOrder; + latest?: boolean; +}) { + const tier = amountTier(order.payAmount); + return ( + + {latest ? : null} + ¥ {formatAmount(order.payAmount)} + {order.items || '—'} + {formatHm(order.createdAt)} + {order.userPhoneMasked || '—'} + + ); +} + +type Particle = { + x: number; + y: number; + vx: number; + vy: number; + rot: number; + vr: number; + w: number; + h: number; + color: string; + life: number; + kind: 'rect' | 'ribbon' | 'spark'; + rain?: boolean; +}; + +const TIER_COLORS: Record = { + 1: ['#e6f7ff', '#91d5ff', '#40a9ff', '#ffffff', '#69c0ff'], + 2: ['#fff1b8', '#ffe58f', '#ffd666', '#fffbe6', '#ffe7ba'], + 3: ['#ffd666', '#faad14', '#ffec3d', '#fff1b8', '#ff4d4f', '#ff7a45', '#ffffff'], +}; + +function spawnParticles(tier: AmountTier, w: number, h: number): Particle[] { + const colors = TIER_COLORS[tier]; + const count = tier === 3 ? 180 : tier === 2 ? 110 : 70; + const out: Particle[] = []; + const cx = w / 2; + const cy = h * 0.42; + for (let i = 0; i < count; i++) { + const angle = Math.random() * Math.PI * 2; + const speed = (tier === 3 ? 8 : tier === 2 ? 6 : 4) * (0.4 + Math.random()); + const kind: Particle['kind'] = + tier === 3 && Math.random() < 0.25 ? 'ribbon' : Math.random() < 0.2 ? 'spark' : 'rect'; + out.push({ + x: cx + (Math.random() - 0.5) * 80, + y: cy + (Math.random() - 0.5) * 40, + vx: Math.cos(angle) * speed, + vy: Math.sin(angle) * speed - (tier === 3 ? 6 : 3), + rot: Math.random() * 360, + vr: (Math.random() - 0.5) * 18, + w: kind === 'ribbon' ? 10 + Math.random() * 16 : kind === 'spark' ? 2 : 6 + Math.random() * 8, + h: kind === 'ribbon' ? 28 + Math.random() * 24 : kind === 'spark' ? 10 + Math.random() * 8 : 4 + Math.random() * 6, + color: colors[Math.floor(Math.random() * colors.length)], + life: 1, + kind, + }); + } + if (tier >= 2) { + for (let i = 0; i < (tier === 3 ? 80 : 40); i++) { + out.push({ + x: Math.random() * w, + y: -20 - Math.random() * 80, + vx: (Math.random() - 0.5) * 1.4, + vy: 3 + Math.random() * 5, + rot: Math.random() * 360, + vr: (Math.random() - 0.5) * 10, + w: 5 + Math.random() * 8, + h: 10 + Math.random() * 14, + color: colors[Math.floor(Math.random() * colors.length)], + life: 1, + kind: 'rect', + rain: true, + }); + } + } + return out; +} + +function CelebrateFx({ order, onDone }: { order: BigScreenOrder; onDone: () => void }) { + const canvasRef = useRef(null); + const onDoneRef = useRef(onDone); + onDoneRef.current = onDone; + const tier = amountTier(order.payAmount); + const [displayAmount, setDisplayAmount] = useState(tier === 3 ? 0 : order.payAmount); + + useEffect(() => { + const duration = TIER_DURATION[tier]; + const timer = window.setTimeout(() => onDoneRef.current(), duration); + return () => window.clearTimeout(timer); + }, [order.id, tier]); + + useEffect(() => { + if (tier !== 3) return; + const start = performance.now(); + const dur = 900; + let raf = 0; + const tick = (now: number) => { + const p = Math.min(1, (now - start) / dur); + const eased = 1 - (1 - p) ** 3; + setDisplayAmount(Math.round(order.payAmount * eased)); + if (p < 1) raf = requestAnimationFrame(tick); + }; + raf = requestAnimationFrame(tick); + return () => cancelAnimationFrame(raf); + }, [order.payAmount, order.id, tier]); + + useEffect(() => { + const canvas = canvasRef.current; + if (!canvas) return; + const ctx = canvas.getContext('2d'); + if (!ctx) return; + const resize = () => { + canvas.width = canvas.clientWidth * devicePixelRatio; + canvas.height = canvas.clientHeight * devicePixelRatio; + ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0); + }; + resize(); + const particles = spawnParticles(tier, canvas.clientWidth, canvas.clientHeight); + let raf = 0; + let last = performance.now(); + const started = performance.now(); + const duration = TIER_DURATION[tier]; + const gravity = tier === 3 ? 0.18 : 0.14; + const loop = (now: number) => { + const dt = Math.min(32, now - last) / 16.6; + last = now; + ctx.clearRect(0, 0, canvas.clientWidth, canvas.clientHeight); + for (const p of particles) { + p.vy += gravity * dt; + p.x += p.vx * dt; + p.y += p.vy * dt; + p.rot += p.vr * dt; + p.life -= (tier === 3 ? 0.0032 : 0.005) * dt; + if (p.rain && (p.y > canvas.clientHeight + 30 || p.life <= 0) && now - started < duration - 400) { + p.x = Math.random() * canvas.clientWidth; + p.y = -16 - Math.random() * 60; + p.vx = (Math.random() - 0.5) * 1.4; + p.vy = 3 + Math.random() * 5; + p.life = 1; + } + if (p.life <= 0) continue; + ctx.save(); + ctx.translate(p.x, p.y); + ctx.rotate((p.rot * Math.PI) / 180); + ctx.globalAlpha = Math.max(0, p.life); + ctx.fillStyle = p.color; + if (p.kind === 'spark') { + ctx.fillRect(-p.w / 2, -p.h / 2, p.w, p.h); + } else { + ctx.fillRect(-p.w / 2, -p.h / 2, p.w, p.h); + } + ctx.restore(); + } + raf = requestAnimationFrame(loop); + }; + raf = requestAnimationFrame(loop); + const onResize = () => resize(); + window.addEventListener('resize', onResize); + return () => { + cancelAnimationFrame(raf); + window.removeEventListener('resize', onResize); + }; + }, [order.id, tier]); + + return ( + + + {tier === 3 ? : null} + {tier === 3 ? : null} + {tier >= 2 ? : null} + {tier >= 2 ? : null} + + {tier === 3 ? '高额成交' : tier === 2 ? '大额成交' : '新成交'} + ¥ {formatAmount(displayAmount)} + {order.items || '—'} + + {order.userPhoneMasked || '—'} + {formatHm(order.createdAt)} + + + + ); +} + +export default function BigScreenPage() { + const [items, setItems] = useState([]); + const [loadError, setLoadError] = useState(''); + const [paused, setPaused] = useState(false); + const [celebrate, setCelebrate] = useState(null); + const seenIdsRef = useRef | null>(null); + const queueRef = useRef([]); + const celebratingRef = useRef(false); + const viewportRef = useRef(null); + const demoSeenRef = useRef>(new Set()); + const [viewportH, setViewportH] = useState(0); + + const playNext = useCallback(() => { + const next = queueRef.current.shift() ?? null; + celebratingRef.current = !!next; + setCelebrate(next); + setPaused(!!next); + }, []); + + const enqueueNew = useCallback( + (fresh: BigScreenOrder[]) => { + if (!fresh.length) return; + const ranked = [...fresh].sort((a, b) => { + const td = amountTier(b.payAmount) - amountTier(a.payAmount); + if (td !== 0) return td; + return +new Date(b.createdAt) - +new Date(a.createdAt); + }); + queueRef.current.push(...ranked); + if (!celebratingRef.current) playNext(); + }, + [playNext], + ); + + const playDemo = useCallback( + (payload: BigScreenDemoPayload) => { + if (!payload?.orders?.length || demoSeenRef.current.has(payload.id)) return; + demoSeenRef.current.add(payload.id); + const now = new Date().toISOString(); + const fake: BigScreenOrder[] = payload.orders.map((o, i) => ({ + id: `${payload.id}-${i}`, + orderNo: `${payload.id}-${i}`, + payAmount: o.payAmount, + items: o.items, + createdAt: now, + userPhoneMasked: o.userPhoneMasked, + })); + setItems((prev) => [...fake, ...prev.filter((row) => !row.id.startsWith('demo-'))]); + enqueueNew(fake); + clearPendingBigScreenDemo(); + }, + [enqueueNew], + ); + + const fetchData = useCallback(() => { + return request<{ items: BigScreenOrder[] }>('/admin/orders/big-screen?limit=2000') + .then((d) => { + const list = d.items ?? []; + setItems((prev) => { + const demos = prev.filter((o) => o.id.startsWith('demo-')); + return demos.length ? [...demos, ...list] : list; + }); + setLoadError(''); + const seen = seenIdsRef.current; + if (!seen) { + seenIdsRef.current = new Set(list.map((o) => o.id)); + return; + } + const fresh = list.filter((o) => !seen.has(o.id)); + for (const o of fresh) seen.add(o.id); + enqueueNew(fresh); + }) + .catch((e) => { + setLoadError(e instanceof Error ? e.message : '加载失败'); + }); + }, [enqueueNew]); + + useEffect(() => { + void fetchData(); + const id = setInterval(() => void fetchData(), POLL_MS); + return () => clearInterval(id); + }, [fetchData]); + + useEffect(() => { + const pending = readPendingBigScreenDemo(); + if (pending) playDemo(pending); + + let ch: BroadcastChannel | null = null; + try { + ch = new BroadcastChannel(BIG_SCREEN_DEMO_CHANNEL); + ch.onmessage = (ev: MessageEvent) => { + if (ev.data?.type === 'demo' && ev.data.orders?.length) playDemo(ev.data); + }; + } catch { + ch = null; + } + return () => { + ch?.close(); + }; + }, [playDemo]); + + useEffect(() => { + const html = document.documentElement; + const prevHtml = html.style.overflow; + const prevBody = document.body.style.overflow; + html.style.overflow = 'hidden'; + document.body.style.overflow = 'hidden'; + return () => { + html.style.overflow = prevHtml; + document.body.style.overflow = prevBody; + }; + }, []); + + useEffect(() => { + const el = viewportRef.current; + if (!el) return; + const measure = () => setViewportH(el.clientHeight); + measure(); + const ro = new ResizeObserver(measure); + ro.observe(el); + return () => ro.disconnect(); + }, []); + + const unitItems = useMemo(() => { + if (!items.length) return []; + const rowH = 80; + const visible = Math.max(1, Math.ceil((viewportH || 480) / rowH)); + const minCount = visible + 1; + const unit: BigScreenOrder[] = []; + while (unit.length < minCount) unit.push(...items); + return unit; + }, [items, viewportH]); + + const trackItems = useMemo(() => unitItems.concat(unitItems), [unitItems]); + const marqueeMs = Math.max(unitItems.length, 1) * ROW_MS; + const rolling = items.length > 0 && unitItems.length > 0; + const latestId = items[0]?.id; + + return ( + + + + + + + + + + + + 杜康好客 + · 发布会现场 + + + 实时成交 + + + LIVE + + + + + + + + + 下单金额 + 下单商品 + 下单时间 + 下单人 + + + {items.length === 0 ? ( + {loadError || '暂无订单'} + ) : ( + + {trackItems.map((o, idx) => ( + + ))} + + )} + + + + {celebrate ? ( + + ) : null} + + ); +} diff --git a/apps/admin-web/src/pages/OrdersPage.tsx b/apps/admin-web/src/pages/OrdersPage.tsx index e6e2182..7dfbf82 100644 --- a/apps/admin-web/src/pages/OrdersPage.tsx +++ b/apps/admin-web/src/pages/OrdersPage.tsx @@ -21,6 +21,7 @@ import { } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import { request, type AdminOrderItem, type AdminOrderRow, type HqProfile, type Paginated } from '../lib/api'; +import { triggerBigScreenDemo } from '../lib/admin-events'; import { ADMIN_OPTIONS_PAGE_SIZE, DELIVERY_PROVIDER_LABELS, @@ -191,6 +192,7 @@ export default function OrdersPage() { const [trackOpen, setTrackOpen] = useState(false); const canDeleteOrders = (profile?.permissionKeys ?? []).includes('orders_delete'); const canProxyOrder = (profile?.permissionKeys ?? []).includes('orders'); + const isSuperAdmin = profile?.adminRole === 'SUPER_ADMIN'; const selectedOrders = useMemo( () => (data?.items ?? []).filter((row) => selectedRowKeys.includes(row.id)), @@ -542,6 +544,18 @@ export default function OrdersPage() { 订单监控 + window.open('/orders/big-screen', 'dukang-big-screen')}>大屏 + {isSuperAdmin ? ( + { + window.open('/orders/big-screen', 'dukang-big-screen'); + triggerBigScreenDemo(); + message.success('已发送测试成交动效(三级 / 二级 / 一级)'); + }} + > + 测试 + + ) : null} {canProxyOrder ? ( setProxyOpen(true)}> 代下单 diff --git a/apps/admin-web/src/pages/StoreBillsPage.tsx b/apps/admin-web/src/pages/StoreBillsPage.tsx index 89b01a1..60577a8 100644 --- a/apps/admin-web/src/pages/StoreBillsPage.tsx +++ b/apps/admin-web/src/pages/StoreBillsPage.tsx @@ -63,10 +63,12 @@ const KIND_COLORS: Record = { export default function StoreBillsPage() { const [searchParams] = useSearchParams(); const initialKind = searchParams.get('kind') === 'WITHDRAW' ? 'WITHDRAW' : ''; + const initialStoreId = searchParams.get('storeId') || ''; const [form] = Form.useForm(); const [filters, setFilters] = useState>({ kind: initialKind, status: initialKind === 'WITHDRAW' ? 'PENDING_REVIEW' : '', + storeId: initialStoreId, }); const [stores, setStores] = useState([]); const { data, loading, page, pageSize, setPage, setPageSize, reload } = useAdminList( @@ -97,8 +99,9 @@ export default function StoreBillsPage() { form.setFieldsValue({ kind: filters.kind || undefined, status: filters.status || undefined, + storeId: filters.storeId || undefined, }); - }, [filters.kind, filters.status, form]); + }, [filters.kind, filters.status, filters.storeId, form]); useEffect(() => { void request>(`/admin/stores?pageSize=${ADMIN_OPTIONS_PAGE_SIZE}`) @@ -359,6 +362,7 @@ export default function StoreBillsPage() { initialValues={{ kind: filters.kind || undefined, status: filters.status || undefined, + storeId: filters.storeId || undefined, }} onFinish={(v: { kind?: string; diff --git a/apps/admin-web/src/pages/StorePackageAuditsPage.tsx b/apps/admin-web/src/pages/StorePackageAuditsPage.tsx index 5c22607..c13cc3a 100644 --- a/apps/admin-web/src/pages/StorePackageAuditsPage.tsx +++ b/apps/admin-web/src/pages/StorePackageAuditsPage.tsx @@ -3,18 +3,23 @@ import { useSearchParams } from 'react-router-dom'; import { Badge, Button, + Descriptions, Drawer, Image, Input, Modal, Space, Table, + Tabs, Tag, Typography, message, } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import type { + StoreInfoChangeFieldDiff, + StoreInfoChangeRequestDto, + StoreInfoChangeStatus, StorePackageAuditDetailDto, StorePackageAuditSummaryDto, StorePackageChangeRequestDto, @@ -22,7 +27,10 @@ import type { StorePackageItemDto, StorePackageViewDto, } from '@dukang/shared-types'; -import { normalizeStorePackageImageUrls } from '@dukang/shared-types'; +import { + STORE_INFO_CHANGE_STATUS_LABELS, + normalizeStorePackageImageUrls, +} from '@dukang/shared-types'; import { request, type Paginated } from '../lib/api'; import { notifyPackageAuditChanged } from '../lib/admin-events'; import { fmtTime } from '../lib/constants'; @@ -297,6 +305,289 @@ function PackageDetailCard({ ); } +const INFO_CHANGE_FIELD_LABELS: Record = { + name: '门店名称', + contactPhone: '联系电话', + address: '详细地址', + intro: '门店简介', + benefitUsageRule: '权益券使用规则', + latitude: '纬度', + longitude: '经度', + openTime: '营业开始', + closeTime: '营业结束', + openTime2: '第二段开始', + closeTime2: '第二段结束', + avgPrice: '人均费用', +}; + +function fmtFieldValue(field: string, v: unknown): string { + if (v == null || String(v).trim() === '') return '(空)'; + if (field === 'avgPrice' || field === 'latitude' || field === 'longitude') { + return String(v); + } + return String(v); +} + +function InfoChangeAuditPanel({ + initialRequestId, +}: { + initialRequestId?: string | null; +}) { + const [loading, setLoading] = useState(false); + const [items, setItems] = useState([]); + const [total, setTotal] = useState(0); + const [page, setPage] = useState(1); + const [status, setStatus] = useState('PENDING'); + const [pendingCount, setPendingCount] = useState(0); + const [detailOpen, setDetailOpen] = useState(false); + const [detailLoading, setDetailLoading] = useState(false); + const [detail, setDetail] = useState<(StoreInfoChangeRequestDto & { diffs?: StoreInfoChangeFieldDiff[] }) | null>(null); + const [rejectOpen, setRejectOpen] = useState(false); + const [rejectReason, setRejectReason] = useState(''); + const [activeId, setActiveId] = useState(null); + + async function reload(nextPage = page, nextStatus = status) { + setLoading(true); + try { + const qs = new URLSearchParams({ page: String(nextPage), pageSize: '20' }); + if (nextStatus) qs.set('status', nextStatus); + const [data, summary] = await Promise.all([ + request<{ items: StoreInfoChangeRequestDto[]; total: number; page?: number }>( + `/admin/store-info-change-requests?${qs}`, + ), + request<{ pendingCount: number }>('/admin/store-info-change-requests/summary'), + ]); + setItems(data.items); + setTotal(data.total); + setPage(data.page ?? nextPage); + setPendingCount(summary.pendingCount ?? 0); + } catch (e) { + message.error(e instanceof Error ? e.message : '加载失败'); + } finally { + setLoading(false); + } + } + + useEffect(() => { + void reload(1, status); + }, [status]); + + useEffect(() => { + if (initialRequestId) void openDetail(initialRequestId); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + async function openDetail(id: string) { + setDetailOpen(true); + setDetailLoading(true); + setDetail(null); + try { + const data = await request( + `/admin/store-info-change-requests/${id}`, + ); + setDetail(data); + } catch (e) { + message.error(e instanceof Error ? e.message : '加载详情失败'); + setDetailOpen(false); + } finally { + setDetailLoading(false); + } + } + + async function audit(id: string, action: 'APPROVE' | 'REJECT', reason?: string) { + try { + await request(`/admin/store-info-change-requests/${id}/audit`, { + method: 'PUT', + body: JSON.stringify( + action === 'REJECT' ? { action, rejectReason: reason } : { action }, + ), + }); + message.success(action === 'APPROVE' ? '已通过' : '已驳回'); + setDetailOpen(false); + notifyPackageAuditChanged(); + void reload(page, status); + } catch (e) { + message.error(e instanceof Error ? e.message : '操作失败'); + } + } + + const columns: ColumnsType = [ + { title: '门店', dataIndex: 'storeName', render: (_, row) => row.storeName || row.storeId }, + { + title: '状态', + dataIndex: 'status', + render: (v: StoreInfoChangeStatus) => ( + {STORE_INFO_CHANGE_STATUS_LABELS[v] ?? v} + ), + }, + { + title: '变更字段', + render: (_, row) => + row.changedFields?.length + ? row.changedFields.map((f) => ( + {INFO_CHANGE_FIELD_LABELS[f] ?? f} + )) + : '—', + }, + { + title: '提交方', + render: (_, row) => + row.submitterType === 'PARTNER' ? '合伙人' : row.submitterType === 'SHOP' ? '门店' : '总部', + }, + { title: '提交时间', dataIndex: 'createdAt', render: (v) => fmtTime(String(v)) }, + { + title: '操作', + render: (_, row) => ( + + void openDetail(row.id)}> + 查看 + + {row.status === 'PENDING' ? ( + <> + void audit(row.id, 'APPROVE')}> + 通过 + + { + setActiveId(row.id); + setRejectReason(''); + setRejectOpen(true); + }} + > + 驳回 + + > + ) : ( + row.rejectReason || null + )} + + ), + }, + ]; + + return ( + + + {(['PENDING', 'APPROVED', 'REJECTED', ''] as const).map((s) => ( + setStatus(s)} + > + {s === 'PENDING' ? ( + + {STORE_INFO_CHANGE_STATUS_LABELS.PENDING} + + ) : s ? ( + STORE_INFO_CHANGE_STATUS_LABELS[s] + ) : ( + '全部' + )} + + ))} + + void reload(p, status), + }} + /> + + setDetailOpen(false)} + extra={ + detail?.status === 'PENDING' ? ( + + void audit(detail.id, 'APPROVE')}>通过 + { + setActiveId(detail.id); + setRejectReason(''); + setRejectOpen(true); + }} + > + 驳回 + + + ) : null + } + > + {detailLoading ? ( + 加载中… + ) : detail ? ( + <> + + {STORE_INFO_CHANGE_STATUS_LABELS[detail.status]} + + 提交方:{detail.submitterType === 'PARTNER' ? '合伙人' : detail.submitterType === 'SHOP' ? '门店' : '总部'} · {fmtTime(detail.createdAt)} + + + {detail.rejectReason ? ( + 驳回原因:{detail.rejectReason} + ) : null} + {detail.diffs && detail.diffs.length ? ( + + {detail.diffs.map((d) => ( + + + + {fmtFieldValue(d.field, d.live)} + + → + + {fmtFieldValue(d.field, d.proposed)} + + + + ))} + + ) : ( + 无变更字段明细 + )} + > + ) : null} + + + setRejectOpen(false)} + onOk={() => { + if (!activeId) return; + if (!rejectReason.trim()) { + message.warning('请填写驳回原因'); + return; + } + void audit(activeId, 'REJECT', rejectReason.trim()); + setRejectOpen(false); + }} + > + setRejectReason(e.target.value)} + /> + + + ); +} + export default function StorePackageAuditsPage() { const [loading, setLoading] = useState(false); const [items, setItems] = useState([]); @@ -340,6 +631,9 @@ export default function StorePackageAuditsPage() { // 从门店详情 / 门店列表跳转过来时,带 requestId 自动打开审核(对比)抽屉 const [searchParams] = useSearchParams(); + const initialTab = searchParams.get('tab') === 'info' ? 'info' : 'package'; + const [activeTab, setActiveTab] = useState(initialTab); + const infoRequestId = searchParams.get('infoRequestId'); useEffect(() => { const rid = searchParams.get('requestId'); if (rid) void openDetail(rid); @@ -438,33 +732,52 @@ export default function StorePackageAuditsPage() { return ( - 套餐变更审核 - - {(['PENDING', 'APPROVED', 'REJECTED', ''] as const).map((s) => ( - setStatus(s)}> - {s === 'PENDING' ? ( - - {HQ_PACKAGE_STATUS_LABELS.PENDING} - - ) : s ? ( - HQ_PACKAGE_STATUS_LABELS[s] - ) : ( - '全部' - )} - - ))} - - void reload(p, status), - }} + 审核通知 + + + {(['PENDING', 'APPROVED', 'REJECTED', ''] as const).map((s) => ( + setStatus(s)}> + {s === 'PENDING' ? ( + + {HQ_PACKAGE_STATUS_LABELS.PENDING} + + ) : s ? ( + HQ_PACKAGE_STATUS_LABELS[s] + ) : ( + '全部' + )} + + ))} + + void reload(p, status), + }} + /> + > + ), + }, + { + key: 'info', + label: '信息变更', + children: , + }, + ]} /> ( @@ -791,6 +793,31 @@ export default function StoresPage() { > ) : null} + {row.pendingInfoChangeId ? ( + <> + navigate(`/store-package-audits?tab=info&infoRequestId=${row.pendingInfoChangeId}`)} + > + 审核信息 + + navigate(`/store-package-audits?tab=info&infoRequestId=${row.pendingInfoChangeId}`)} + > + 对比 + + > + ) : null} + navigate(`/finance/store-bills?storeId=${row.id}`)} + > + 提现 + ), }, diff --git a/apps/h5-partner/src/lib/api.ts b/apps/h5-partner/src/lib/api.ts index 312f021..1373263 100644 --- a/apps/h5-partner/src/lib/api.ts +++ b/apps/h5-partner/src/lib/api.ts @@ -156,10 +156,19 @@ async function rawRequest( if (authToken) headers.Authorization = `Bearer ${authToken}`; const res = await fetch(`${apiBase}${path}`, { ...options, headers }); - const json = await res.json().catch(() => ({ code: res.status, message: '网络异常' })); + const json = await res.json().catch(() => ({ code: res.status, message: '网络异常' })) as { + code: number; + message?: string; + data?: T; + reason?: string; + }; if (json.code !== 0) { - const err = new Error(json.message || '请求失败') as Error & { status?: number }; + const err = new Error(json.message || '请求失败') as Error & { + status?: number; + reason?: string; + }; err.status = json.code === 401 ? 401 : json.code; + err.reason = json.reason; if (json.code === 400) { reportApiError( { apiBase, clientApp: CLIENT_APP, getToken: () => localStorage.getItem(ACCESS_TOKEN) }, @@ -224,8 +233,19 @@ export async function request( try { return await requestWithAuthRetry(path, fetchOptions); } catch (e) { - const err = e as Error & { status?: number }; + const err = e as Error & { status?: number; reason?: string }; const message = err.message || '请求失败'; + // 账号停用 / 合伙人绑定失效:强制退出登录 + if (err.reason === 'ACCOUNT_DISABLED') { + if (localStorage.getItem(ACCESS_TOKEN)) { + clearAuth({ keepProfile: true }); + if (!silent) showPartnerToast(message, 'error'); + if (typeof window !== 'undefined' && !isOnAppPath('/login')) { + window.location.href = toAppPath('/login?disabled=1'); + } + } + throw e; + } if (err.status === 401) { if (localStorage.getItem(ACCESS_TOKEN)) { clearAuth({ keepProfile: true }); @@ -260,7 +280,14 @@ export async function ensureSession(): Promise<{ authenticated: boolean; partner touchPartnerSession(); return { authenticated: true, partner }; } catch (e) { - const err = e as Error & { status?: number }; + const err = e as Error & { status?: number; reason?: string }; + if (err.reason === 'ACCOUNT_DISABLED') { + clearAuth({ keepProfile: true }); + if (typeof window !== 'undefined' && !isOnAppPath('/login')) { + window.location.href = toAppPath('/login?disabled=1'); + } + return { authenticated: false, partner: getPartnerProfile() }; + } if (err.status === 401) { const refreshed = await refreshSession(); if (refreshed?.partner) { @@ -277,3 +304,17 @@ export async function ensureSession(): Promise<{ authenticated: boolean; partner /** @deprecated 使用 PartnerSessionPayload */ export type PartnerAuthPayload = PartnerSessionPayload; + +export function submitStoreInfoChangeRequest(storeId: string, fields: Record) { + return request('PARTNER_H5', `/partner/stores/${storeId}/info-change-request`, { + method: 'POST', + body: JSON.stringify(fields), + }); +} + +export function listStoreInfoChangeRequests(storeId: string) { + return request>( + 'PARTNER_H5', + `/partner/stores/${storeId}/info-change-requests`, + ); +} diff --git a/apps/h5-partner/src/pages/LoginPage.tsx b/apps/h5-partner/src/pages/LoginPage.tsx index 640338e..84c0c5f 100644 --- a/apps/h5-partner/src/pages/LoginPage.tsx +++ b/apps/h5-partner/src/pages/LoginPage.tsx @@ -99,7 +99,7 @@ function formatWechatError(e: unknown): string { export default function LoginPage() { const navigate = useNavigate(); const { applySession, refresh, account } = usePartnerSession(); - const [params] = useSearchParams(); + const [params, setSearchParams] = useSearchParams(); const quick = params.get('quick') === '1'; const savedProfile = getPartnerProfile(); const remembered = loadRememberedPhone(); @@ -120,6 +120,18 @@ export default function LoginPage() { .catch(() => setWxAuthorize(false)); }, []); + useEffect(() => { + if (params.get('disabled') === '1') { + const tip = '账号已停用或解绑,请重新登录'; + setMsg(tip); + toastError(tip); + const next = new URLSearchParams(params); + next.delete('disabled'); + setSearchParams(next, { replace: true }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + const quickName = savedProfile?.name ?? '城市合伙人'; const quickCompany = savedProfile?.companyName ?? ''; const quickPhone = savedProfile?.phone || phone; diff --git a/apps/h5-partner/src/pages/StoreDetailPage.tsx b/apps/h5-partner/src/pages/StoreDetailPage.tsx index eee3398..d691521 100644 --- a/apps/h5-partner/src/pages/StoreDetailPage.tsx +++ b/apps/h5-partner/src/pages/StoreDetailPage.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import AppImage from '@dukang/shared-ui/AppImage'; -import { request } from '../lib/api'; +import { request, submitStoreInfoChangeRequest, listStoreInfoChangeRequests } from '../lib/api'; import { toastError, toastSuccess } from '../lib/toast'; import { usePartnerSession } from '../contexts/PartnerSessionContext'; import { canManagePartnerStore } from '../lib/partnerAccess'; @@ -60,6 +60,7 @@ export default function StoreDetailPage() { const [mapPickerOpen, setMapPickerOpen] = useState(false); const [actionError, setActionError] = useState(''); const [closeConfirmOpen, setCloseConfirmOpen] = useState(false); + const [pendingInfoChange, setPendingInfoChange] = useState(false); function applyStore(data: Record) { setStore(data); @@ -97,6 +98,12 @@ export default function StoreDetailPage() { setStore(null); setLoadError(e instanceof Error ? e.message : '加载失败'); }); + // 拉取该门店的信息变更审核记录,若有 PENDING 则展示「审核中」横幅 + listStoreInfoChangeRequests(id) + .then((reqs) => + setPendingInfoChange(Array.isArray(reqs) && reqs.some((r) => r.status === 'PENDING')), + ) + .catch(() => {}); }, [id]); async function changeStatus(next: StoreStatusValue) { @@ -162,26 +169,24 @@ export default function StoreDetailPage() { setSaving(true); setActionError(''); try { - const data = await request>('PARTNER_H5', `/partner/stores/${id}/basic`, { - method: 'PUT', - body: JSON.stringify({ - name: form.name.trim(), - contactPhone: form.contactPhone.trim(), - address: form.address.trim(), - intro: form.intro.trim(), - benefitUsageRule: form.benefitUsageRule.trim() || null, - ...(form.latitude.trim() && form.longitude.trim() - ? { - latitude: Number(form.latitude), - longitude: Number(form.longitude), - } - : {}), - }), + // v3.5.1 #5:基本信息变更走「提交变更」审核流,由总部审核通过后覆盖门店 + await submitStoreInfoChangeRequest(id, { + name: form.name.trim(), + contactPhone: form.contactPhone.trim(), + address: form.address.trim(), + intro: form.intro.trim(), + benefitUsageRule: form.benefitUsageRule.trim() || null, + ...(form.latitude.trim() && form.longitude.trim() + ? { + latitude: Number(form.latitude), + longitude: Number(form.longitude), + } + : {}), }); - applyStore(data); - toastSuccess(auditStatus === 'REJECTED' ? '已保存并重新提交审核' : '已保存'); + setPendingInfoChange(true); + toastSuccess('变更已提交,等待总部审核'); } catch (e) { - setActionError(e instanceof Error ? e.message : '保存失败'); + setActionError(e instanceof Error ? e.message : '提交失败'); } finally { setSaving(false); } @@ -279,6 +284,16 @@ export default function StoreDetailPage() { {auditStatus === 'APPROVED' && ( 总部审核已通过,可将门店设为营业中。 )} + {pendingInfoChange && ( + + + 基础信息变更审核中 + + + 已提交的资料变更正在等待总部审核,审核通过后才会覆盖门店线上信息。审核期间可继续修改并重新提交。 + + + )} {canMutate && !auditPending && status !== 'CLOSED' && ( @@ -481,8 +496,8 @@ export default function StoreDetailPage() { navigate('/stores')}>返回 {canMutate && ( void saveBasic()} disabled={readOnly || saving}> - save - {saving ? '保存中…' : auditRejected ? '保存并重新提交' : '保存修改'} + send + {saving ? '提交中…' : '提交变更'} )} diff --git a/apps/h5-shop/src/lib/api.ts b/apps/h5-shop/src/lib/api.ts index b36e390..fadec35 100644 --- a/apps/h5-shop/src/lib/api.ts +++ b/apps/h5-shop/src/lib/api.ts @@ -202,7 +202,7 @@ async function rawRequest( if (authToken) headers.Authorization = `Bearer ${authToken}`; const res = await fetch(`${apiBase}${path}`, { ...options, headers }); - let json: { code: number; message?: string; data?: T }; + let json: { code: number; message?: string; data?: T; reason?: string }; try { json = await res.json(); } catch { @@ -213,8 +213,12 @@ async function rawRequest( throw err; } if (json.code !== 0) { - const err = new Error(json.message || '请求失败') as Error & { status?: number }; + const err = new Error(json.message || '请求失败') as Error & { + status?: number; + reason?: string; + }; err.status = res.status >= 500 ? res.status : json.code; + err.reason = json.reason; if (json.code === 400) { reportApiError( { apiBase, clientApp: CLIENT_APP, getToken: () => localStorage.getItem(ACCESS_TOKEN) }, @@ -254,7 +258,15 @@ async function requestWithAuthRetry( try { return await rawRequest(path, options); } catch (e) { - const err = e as Error & { status?: number }; + const err = e as Error & { status?: number; reason?: string }; + // 账号停用 / 门店关闭 / 合伙人绑定失效:强制退出登录 + if (err.reason === 'ACCOUNT_DISABLED') { + clearAuth(); + if (typeof window !== 'undefined' && !window.location.pathname.startsWith('/login')) { + window.location.replace('/login?disabled=1'); + } + throw e; + } const canRecover = err.status === 401 && !retried && @@ -303,7 +315,14 @@ export async function ensureSession(): Promise<{ needsSelectStore: needsStoreSelection({ store, stores: me.stores }), }; } catch (e) { - const err = e as Error & { status?: number }; + const err = e as Error & { status?: number; reason?: string }; + if (err.reason === 'ACCOUNT_DISABLED') { + clearAuth(); + if (typeof window !== 'undefined' && !window.location.pathname.startsWith('/login')) { + window.location.replace('/login?disabled=1'); + } + return { authenticated: false, store: null, needsSelectStore: false }; + } if (err.status === 401) { const refreshed = await refreshSession(); if (refreshed) { diff --git a/apps/h5-shop/src/lib/useRedeemSuccessBus.ts b/apps/h5-shop/src/lib/useRedeemSuccessBus.ts new file mode 100644 index 0000000..41c3bd0 --- /dev/null +++ b/apps/h5-shop/src/lib/useRedeemSuccessBus.ts @@ -0,0 +1,42 @@ +import { useEffect, useRef } from 'react'; + +/** + * v3.5.1 #2:门店端核销即时刷新。 + * 核销成功后,通过浏览器自定义事件通知「门店信息页 / 提现页」即时刷新余额与提现按钮状态, + * 避免用户手动下拉刷新。 + */ + +const REDEEM_SUCCESS_EVENT = 'shop:redeem-success'; + +export type RedeemSuccessPayload = { + redeemNo?: string; + amount?: number; + storeId?: string; +}; + +/** 核销成功页 mount 时调用,广播核销成功事件 */ +export function notifyRedeemSuccess(payload: RedeemSuccessPayload = {}) { + if (typeof window === 'undefined') return; + window.dispatchEvent(new CustomEvent(REDEEM_SUCCESS_EVENT, { detail: payload })); +} + +/** 订阅核销成功事件,回调在事件触发时执行(通常用于刷新余额/提现状态) */ +export function useRedeemSuccessListener( + callback: (payload: RedeemSuccessPayload) => void, + deps: React.DependencyList = [], +) { + const savedCallback = useRef(callback); + useEffect(() => { + savedCallback.current = callback; + }, [callback]); + + useEffect(() => { + function handler(e: Event) { + const payload = (e as CustomEvent).detail ?? {}; + savedCallback.current(payload); + } + window.addEventListener(REDEEM_SUCCESS_EVENT, handler); + return () => window.removeEventListener(REDEEM_SUCCESS_EVENT, handler); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, deps); +} diff --git a/apps/h5-shop/src/pages/LoginPage.tsx b/apps/h5-shop/src/pages/LoginPage.tsx index b2ee058..bbadc01 100644 --- a/apps/h5-shop/src/pages/LoginPage.tsx +++ b/apps/h5-shop/src/pages/LoginPage.tsx @@ -86,6 +86,16 @@ export default function LoginPage() { if (hint) setMsg(hint); }, []); + useEffect(() => { + if (params.get('disabled') === '1') { + setMsg('账号已被停用或门店已关闭,请重新登录'); + const next = new URLSearchParams(params); + next.delete('disabled'); + setSearchParams(next, { replace: true }); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + useEffect(() => { if (!isWechatEnv() || !wxAuthorize || !params.get('code')) return; void handleShopWechatCallbackOnce() diff --git a/apps/h5-shop/src/pages/MinePage.tsx b/apps/h5-shop/src/pages/MinePage.tsx index 1fe75f0..471cf12 100644 --- a/apps/h5-shop/src/pages/MinePage.tsx +++ b/apps/h5-shop/src/pages/MinePage.tsx @@ -14,6 +14,7 @@ import { } from '../lib/wechat-auth'; import { isWechatEnv } from '../lib/weixin'; import { useStorePageView } from '../lib/usePageView'; +import { useRedeemSuccessListener } from '../lib/useRedeemSuccessBus'; export default function MinePage() { useStorePageView('store_mine_view'); @@ -43,6 +44,11 @@ export default function MinePage() { void loadMine(); }, [loadMine]); + // v3.5.1 #2:核销成功后即时刷新门店信息(余额等) + useRedeemSuccessListener(() => { + void loadMine(); + }, [loadMine]); + useEffect(() => { if (!isWechatEnv() || !wxAuthorize || !searchParams.get('code')) return; void handleShopWechatCallbackOnce() diff --git a/apps/h5-shop/src/pages/RedeemSuccessPage.tsx b/apps/h5-shop/src/pages/RedeemSuccessPage.tsx index a2a0ce4..01e0584 100644 --- a/apps/h5-shop/src/pages/RedeemSuccessPage.tsx +++ b/apps/h5-shop/src/pages/RedeemSuccessPage.tsx @@ -1,5 +1,6 @@ -import { useMemo } from 'react'; +import { useEffect, useMemo } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; +import { notifyRedeemSuccess } from '../lib/useRedeemSuccessBus'; function formatAmount(n: number) { return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); @@ -29,6 +30,14 @@ export default function RedeemSuccessPage() { ? new Date(String(result.createdAt)).toLocaleString('zh-CN') : new Date().toLocaleString('zh-CN'); + // v3.5.1 #2:核销成功后广播事件,通知门店信息页 / 提现页即时刷新 + useEffect(() => { + notifyRedeemSuccess({ + redeemNo: redeemNo !== '—' ? redeemNo : undefined, + amount, + }); + }, [redeemNo, amount]); + return ( diff --git a/apps/h5-shop/src/pages/WithdrawPage.tsx b/apps/h5-shop/src/pages/WithdrawPage.tsx index 3732626..424cbce 100644 --- a/apps/h5-shop/src/pages/WithdrawPage.tsx +++ b/apps/h5-shop/src/pages/WithdrawPage.tsx @@ -9,6 +9,7 @@ import { import PullToRefresh from '@dukang/shared-ui/PullToRefresh'; import { request } from '../lib/api'; import { useStorePageView } from '../lib/usePageView'; +import { useRedeemSuccessListener } from '../lib/useRedeemSuccessBus'; type StatusFilter = 'all' | StoreWithdrawStatus; @@ -42,6 +43,11 @@ export default function WithdrawPage() { void load(); }, [load]); + // v3.5.1 #2:核销成功后即时刷新可提余额与提现按钮状态 + useRedeemSuccessListener(() => { + void load(); + }, [load]); + const filtered = useMemo(() => { if (statusFilter === 'all') return items; return items.filter((r) => r.status === statusFilter); diff --git a/apps/mini-user/config/index.ts b/apps/mini-user/config/index.ts index ced7c2f..a928fbf 100644 --- a/apps/mini-user/config/index.ts +++ b/apps/mini-user/config/index.ts @@ -11,7 +11,7 @@ const isDevMode = /** 小程序/H5 请求的后端 origin(不含 /api);本地默认本机,生产构建默认远程 */ const API_ORIGIN = process.env.VITE_API_TARGET ?? - (isDevMode ? 'http://localhost:3010' : 'https://api.dukanghaoke.com'); + (isDevMode ? 'http://192.168.1.10:3010' : 'https://api.dukanghaoke.com'); const requireFromApp = createRequire(path.resolve(__dirname, '../package.json')); @@ -42,7 +42,7 @@ export default defineConfig(async () => ({ }, sourceRoot: 'src', outputRoot: 'dist', - plugins: ['@tarojs/plugin-framework-react', '@tarojs/plugin-html'], + plugins: ['@tarojs/plugin-framework-react'], alias: { // 指向包目录(不是 index.js),否则 react-dom/client 会变成 index.js/client react: REACT_DIR, @@ -98,6 +98,9 @@ export default defineConfig(async () => ({ mini: { /** dev:weapp 预览模式需开启,否则 React hooks 在 Vite 下会失效 */ debugReact: isDevMode, + optimizeMainPackage: { + enable: true, + }, postcss: { pxtransform: { enable: true, config: {} }, cssModules: { enable: false }, diff --git a/apps/mini-user/package.json b/apps/mini-user/package.json index f547e24..5fbac76 100644 --- a/apps/mini-user/package.json +++ b/apps/mini-user/package.json @@ -17,11 +17,9 @@ "@dukang/shared-types": "workspace:*", "@dukang/shared-ui": "workspace:*", "@dukang/weixin-sdk": "workspace:*", - "element-china-area-data": "^6.1.0", "@tarojs/components": "4.2.0", "@tarojs/helper": "4.2.0", "@tarojs/plugin-framework-react": "4.2.0", - "@tarojs/plugin-html": "4.2.0", "@tarojs/plugin-platform-h5": "4.2.0", "@tarojs/plugin-platform-weapp": "4.2.0", "@tarojs/react": "4.2.0", diff --git a/apps/mini-user/src/app.config.ts b/apps/mini-user/src/app.config.ts index 9414796..b45ee4c 100644 --- a/apps/mini-user/src/app.config.ts +++ b/apps/mini-user/src/app.config.ts @@ -4,27 +4,41 @@ export default defineAppConfig({ 'pages/stores/index', 'pages/benefit/index', 'pages/mine/index', - 'pages/product-detail/index', - 'pages/store-detail/index', - 'pages/store-package-detail/index', - 'pages/order-confirm/index', - 'pages/order-confirm-pickup/index', - 'pages/pay/index', - 'pages/orders/index', - 'pages/order-detail/index', - 'pages/order-logistics/index', - 'pages/pickup-receive/index', - 'pages/addresses/index', - 'pages/address-edit/index', - 'pages/customer-service/index', - 'pages/benefit-detail/index', - 'pages/redeem/index', - 'pages/redeem-code/index', - 'pages/redeem-success/index', - 'pages/login/index', - 'pages/user-agreement/index', - 'pages/privacy-policy/index', ], + subPackages: [ + { root: 'pages/product-detail', pages: ['index'] }, + { root: 'pages/store-detail', pages: ['index'] }, + { root: 'pages/store-package-detail', pages: ['index'] }, + { root: 'pages/order-confirm', pages: ['index'] }, + { root: 'pages/order-confirm-pickup', pages: ['index'] }, + { root: 'pages/pay', pages: ['index'] }, + { root: 'pages/orders', pages: ['index'] }, + { root: 'pages/order-detail', pages: ['index'] }, + { root: 'pages/order-logistics', pages: ['index'] }, + { root: 'pages/pickup-receive', pages: ['index'] }, + { root: 'pages/addresses', pages: ['index'] }, + { root: 'pages/address-edit', pages: ['index'] }, + { root: 'pages/customer-service', pages: ['index'] }, + { root: 'pages/benefit-detail', pages: ['index'] }, + { root: 'pages/redeem', pages: ['index'] }, + { root: 'pages/redeem-code', pages: ['index'] }, + { root: 'pages/redeem-success', pages: ['index'] }, + { root: 'pages/login', pages: ['index'] }, + { root: 'pages/user-agreement', pages: ['index'] }, + { root: 'pages/privacy-policy', pages: ['index'] }, + { root: 'pages/invoice-titles', pages: ['index'] }, + { root: 'pages/invoice-apply', pages: ['index'] }, + ], + preloadRule: { + 'pages/home/index': { + network: 'all', + packages: ['pages/product-detail', 'pages/login'], + }, + 'pages/mine/index': { + network: 'all', + packages: ['pages/orders', 'pages/login'], + }, + }, window: { backgroundTextStyle: 'light', navigationBarBackgroundColor: '#FAF9F7', diff --git a/apps/mini-user/src/app.css b/apps/mini-user/src/app.css index bd7b0b3..97fda38 100644 --- a/apps/mini-user/src/app.css +++ b/apps/mini-user/src/app.css @@ -5,13 +5,7 @@ @import './styles/stores.css'; @import './styles/benefit.css'; @import './styles/mine.css'; -@import './styles/product-detail.css'; -@import './styles/store-detail.css'; -@import './styles/login.css'; -@import './styles/legal.css'; -@import './styles/order.css'; @import './styles/address.css'; -@import './styles/redeem.css'; page, body { diff --git a/apps/mini-user/src/app.tsx b/apps/mini-user/src/app.tsx index 30c1ea7..74ecf6e 100644 --- a/apps/mini-user/src/app.tsx +++ b/apps/mini-user/src/app.tsx @@ -1,5 +1,4 @@ import './lib/intl-polyfill'; -import './lib/text-encoding-polyfill'; import { PropsWithChildren, useRef } from 'react'; import Taro, { useDidShow } from '@tarojs/taro'; import WechatShareBootstrap from './components/WechatShareBootstrap'; diff --git a/apps/mini-user/src/app.weapp.tsx b/apps/mini-user/src/app.weapp.tsx new file mode 100644 index 0000000..830fc66 --- /dev/null +++ b/apps/mini-user/src/app.weapp.tsx @@ -0,0 +1,73 @@ +import './lib/intl-polyfill'; +import { PropsWithChildren, useEffect, useRef } from 'react'; +import Taro, { useDidShow } from '@tarojs/taro'; +import { handleWechatOrderConfirmShow } from './lib/wechat-order-confirm'; +import { installClientErrorReporting } from './lib/client-error'; +import { prefetchShareBrandAssets } from './lib/wechat-share'; +import { capturePromoSceneAndTouchScan } from './lib/promo'; +import { initClientVersionChecks } from './lib/client-version'; +import './app.css'; + +installClientErrorReporting(); +prefetchShareBrandAssets(); + +function App({ children }: PropsWithChildren) { + const handlingRef = useRef(false); + + useEffect(() => { + void capturePromoSceneAndTouchScan(); + initClientVersionChecks(); + }, []); + + useDidShow((options?: { + referrerInfo?: { + appId?: string; + extraData?: { status?: string; errormsg?: string; req_extradata?: Record }; + }; + }) => { + if (handlingRef.current) return; + + const referrerInfo = + options?.referrerInfo || + (typeof Taro.getEnterOptionsSync === 'function' + ? ( + Taro.getEnterOptionsSync() as { + referrerInfo?: { + appId?: string; + extraData?: { + status?: string; + errormsg?: string; + req_extradata?: Record; + }; + }; + } + ).referrerInfo + : undefined); + if (!referrerInfo?.appId) return; + + handlingRef.current = true; + void handleWechatOrderConfirmShow({ referrerInfo }) + .then((result) => { + if (result.redirectUrl) { + Taro.redirectTo({ url: result.redirectUrl }).catch(() => { + Taro.reLaunch({ url: result.redirectUrl! }); + }); + return; + } + if (!result.handled || !result.orderId) return; + const pages = Taro.getCurrentPages(); + const cur = pages[pages.length - 1] as { route?: string } | undefined; + const route = cur?.route || ''; + if (route.includes('pickup-receive')) { + Taro.redirectTo({ url: '/pages/orders/index?tab=all' }).catch(() => {}); + } + }) + .finally(() => { + handlingRef.current = false; + }); + }); + + return <>{children}>; +} + +export default App; diff --git a/apps/mini-user/src/assets/icons/store-open-badge.png b/apps/mini-user/src/assets/icons/store-open-badge.png index 79eabd6404edf3c80d3c81da47418bea3461fded..13d0e668b7720c37e43ad24e5e905fdcaa3a3abe 100644 GIT binary patch delta 816 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 at$zWuE}!@wYJFz_0000er`MayD z0Ax?MhYpVc0<@WTJe{fs4cs%jX_vnUY^2QjhGsL_3qX!E#10gfb!;F@5gBpE(y73$ zqlH1L00W>bkVY(%biNgU?5TJK|9u5tp1wUg5|zS12&xrs2~K~YU2Cv>0$4ap_9rJ4K9Ky!Mg7nKAu!emw0G9xxS~GB6{Q8i zESbZUw2xOlhTO-c{Ez^l-`xNMs_DxIM^$6my;WIb3K{xZjEVD(FAg_T@xe+~eKX!Qep(0o)tkN}pBW*8Kwih=)?{$|RaNHz+ zo;0tMTszUPPTY5gBqBegx9wvB<*Wg+LGbNeDY+9&aZ0C~dqn5QVxfM;_qFf%?C|&3 z|M+=-Tc;oRM*92lA3y(w#W>9nXWU^NyDzR`Mfqz-lu2!LUUjtWcgaDmQ$%MOh19!GW&52AYj@BS9N04TIj zT?0n32!L4i*A3I38d>3xHtsn$w-)XqHBYt^x%+)6LI^%5_Rp?(n4$EOY~Je%?2(*b-bN z0!syyv$7_m2MEA{Sc6sr&D?tTz__VF!OqmW$czi1d~^|SYOsLSBtUT@OK(laADfI8 zAR7dR>uMETI08z$%~clTrUpj4vc{R4V7aM*;*!KFv?k+^O-2b2SdGf1LRXw4wbKq{!VN&e)#Sj8vo|qOx&7QTdITFIh_T)_~-yMLR}U9+feBfHc84q>EH4f#IzN zM?;iT_DBs-f1LGFtfiocNVkh1ao^}Fqm1nLtN}uBaD4+>j0A`LxG4cR)R%TAP;TIM z(Or!zxdO?TF@PjnfIxZ8OjT4Hu<_W4QJG67lLmIy#Jzjt<=X-YlKf}5vIK|+N9^LC zL#!dy9kg#7rJPBv0a_Dn5t}&48zk8Qq#Zb(U8+d`ICb~=808Tp-kL~M0G~5RvI2;Y zIpQowaj9hR&4XlnAraHTxq>7cfOv3x{ua~907r4DVieaw9$FKH%Oz1Dan*Z_6R?%6 zh-?6Y*(!o#9x7Q4j^a{&p+Lq@i3X8iZ4tHru{euaOOBX=t9!2gC&FrA8j1It`Rzfec&X`lZK1iD)w z&1FPeEJ#)uB!(38EkJtW#-Y)}s&a@qs%NRgvJFJN14Zh$!)x{Yw-dQr!_u$=jR!2- zf1^2qEI$W{6)Y(74YCgckTph9@uQ?zHz;ZpF~N6`hh^T~(D$?VtaKq_+ zMWD|)l4)0wWv+2Y-NEK2LEa~-{x`&7Fo4W_8N!RdGT2`5Tzzec4iPZIo~*cfvG+-e z0WQ+j(&`RiYvq+yTv(~w&~*+F4Rb}ZjXTK1*v7#t9o*pTcj zKKcIw!TH2x*l>hvMrDYL_1ap>BSb91=5sRpYfRfu#7kkE!uzld~{ z*%KE!y@ZBXpn}N8a1}6a{QYC-?0-dB19l*SsR4_MEG57#kr$haX7}6$*`s{;HqTnR zu)!Bahwq&M1f8n7m&nSJqQTh-tn_`+Q4R;*V(Ozz4KQNzAIn2M(XuGq64r5y?$mk8 z1lbm+Xok3^L4#!X*03{xpaB+k1-nN!xShTqN^~Hsb4bio?vER|QC-Wl1IqRSqiL{Z zLLOR@c|Y2;)k2v1FXHc&0iMRh2v-_yiC;7DKilXy9i%XjQpAv0w^c72HR9_Y?E`9Lf3r@7s%@+1YwQ^3fp=vY=J`=oOL@e}yU zc3~5|Vc#Oy6|-dvlwJDRLR@f_r$uU>k^)3A3RxM1k9ljQ?TfA+LFd-`G{6P0mYI@{ zBXA&(8O9=i^T8@3$kSVqWB^&s?B-2HmXhK2Bz8ZXGOz=-5~GLAX00iiszsofUz&KXT^RpgcP1HC8LK#Ruw&bmdGfkO7#$+8V zrJkH9XXOkr0kW!sb2YgpB9s3$NH-9Po`DQI)gAgZ8K8q5;v@Flq>80%xt|gR z>l0gbr>LIH<~Uc^#Dn~ljJs>O%CO_`)UT~6P(M||kk@DhQNPK}QW29^Bkydj0ivQN za}2X>GVky3JLu)H%MjARplI{J2io3t6}h!lmd4F$1(1-DcVag0Ht|zZO~n1Tr98+m z>JgYSqJx=6VAAH9f~;U`kWczjLOl!7S9L-4Jc*lHGGM0b|15Ml(^zG&>ZEU3X$7s8 z9CRk{=9CPr0HVe~2#jX!Ua4`47nWx97Q`yU37wqkPrY25n7t7-4Sc7Vo}9X9xHdP? zfF$SHE3jv@ARM#OYWf1WT!0}v010*E=828LiymCvXpdasUm%*l!p){c)CV+s>=;g@4EgB%`_+Ji| zILedG6kD`4*Ey(W56j$xw(_}%caaUDnrXN-rtU4J|OcgN!#EBTKro7pr0Af}0o7yrxF%dNZq>Z9; z5goHSQwuLvomk51kj8lPt24=bh|kHPlkc6gDp^Jme^k+8$vfK=w*GayTL-ACchg=`mYR zEAI%yUz*b}rRGw#@+N#R^-npF= z6XOKSllgwTUD^CK;YSxK0NGtsA5o??4iQn~^Xrn)7Q*w$)~-wwENTo3_M0piAl50~ zi4ocR3=MTmcMza9x)!t|ml^)A#$oMYVRs?M4r14VWU|=@wit#dhD;xZWMY2KKww2= zzA@j|B!g~FWGTiiLOY<{@1!Y*P~#7oU0-lxm4t~`EB@y6}f`@VxSy=#Jg597vmNvyRp=6$>ze)*W%Lq+t)i6aRqJ>{@}_Gq)bvkBg{iWJLfH zm({<;*5C+ntt3?Dyjsk4*4GBMAbF{|;f7Yki8Ib z@O$Rg0}^82L`_)M`4=+Hk%D&0Mj3-L zWl8LeUQIaj5daCVWZXHn|7J%DmqD>kLThsQi=8+;|LGho6IR1Hk)_0Kj5|W6wBu?S zd9L#XNTPhb>{Ec z+3uH;idES%9*G1A`PHe4Rx?cN+2t>SWrZ0hCUkl%IQm!9Y%tT})75;1>$tXHTFttonuh0<8!f|jO!(>+PcTgJCL{p1B6y!QOr0oIZVqkj@W^q0>WK=ZHenG zLD49R;CQ%bj>`A@8VI%^labw}`@Rb76dokMueJ3kZm%;TCETj>1IGpy*QO&EHLy)= zg@;pNCEfID((sap%|Vc0=I3@yAR(_GG3H3oQ#u1k3g&VxgM1MrPPk6uqDCf`(S34{ z0LL|X?Y^#|YOpRRXjD4|0|c>!>2)wpWG-jE@yR=tJY6moS>F77xBxg>Of2Nzfas4? z3zsf(aw!-faGi`ubSB0v!sSf!!sW{5b`5~z%&o?*N1#7;>dFTLM9$(*WOfQ}^NRsu zJq3H`Fca0Ltdx1l%NkS38$I+6cG_1P$ZID5bo^|CIDzWl#7Kk&G|vl2Ivr^8y$mGAiDs)mB-RyEUu|+^^BdZJoh#c8}+c79#;-eOgeb zZ)(iOA{SW4|%R1r)fwCNNKo9?!lucs$`pmnr8FiNFAV3&t4Gfl1k*OT0U*D>X^z z3e<_`B;giPlm`lR6OwBHT2q^0G10WReTe@kfYbpG8}d+@ug)P3`PZuxnH-?;=LCim zSxTpy0|4ZQq8=pP=!mqvxcPanK0V-flkTr^u1-96U(u*+FMN_~C;AoTkY|(rrN!pJ z^V+*zix$Onl67T|KV%X)gGI)p0K$xDBvS){Zch4K(&pKn3V!p4Q3S{PpO%mti9o12 zdbP66+dh2yo1ih4C&B^Ar~4ngy#;05)<9APcpO0E{99N|ZDOvtBCM=Q@6Xv+RiF3> zh(EqlcPENEc_|toDAg3G3#LZdDJ6rgu^M0{DQF1>c2aa&jQ9_{|LK;UxJ|==N7K$a z2%3NXeE5p`E9*pFkU2G2U~&6-&K|tKyE~DjZ74^!Xn>#t1T=v4j>{ulCO8dnAl67} zHC$yW&?yzVxMe3zz-H?r8o+?B3M>S#w3x+t&5*Yy)aC2*gB%$F5_gM9BT+O!>HPvXs`F2Zh3|x$$?(-nK5X!vY8vf>-?=$B18Cz{~KCGv=gu8HImLSdNo+ za%B||f3zLAS^)&3lL;W8n|GqAcM9Fi{+Kcl2U*MdU2QEMYWFEDhCuy;?ln*lzdRto zXTUEB1`Apfx?Dqm#P(l{&c|iaW@`ly@o)Pu)ZhP&iz|#WH8>3X9V2-SjAK+|I$wk3 zR$&D(a4p;Mt{8v_l78QCucD?E^ht~Lk47((=10som5qERE8;{JpzUQ}%`U&GxWHF% zzGhA3`GKRX-Kf`G+mG0G-u>EMxK<;r0wmJg8}2#q*`*ZYMAGpRTLFZ{q9d6ABI2e9 z?&i$XW%A%q(+G2f53E^iD_82s^|Lxnpl}9EVNoEMu`NNlw_^ZYQulkOlOL)$^ST-a zfM|Id##;kK0^BTA`aejW?Q9@5n%}ofIK~;(A{{%;+w13jhB5;rU!5r5{}m-Hb}F-W}i(5aznaRL8U{9buU077M=B9og1x;aLdIlf!(@!*i+QW>@H zL9&f@pZ68ZeMz5KL-4sH~&_@m9nc?-kUV!N! zaKOBO=ctE#Wly95wzFV?m;+Bpkt#}8i*0Di7G^!%V;6&9Qh-qEkOdkQF^WOn(t`FGJ-kkbnGF3}Uh4n4-;A<-M08ys^VSN;W!tl2xp`&x2obRw&TIfmR z01no}-z5#N0fK~WV&z0dxW*MUjo;T4e&+z8lDygFFI#dVW^jl|=YA;aD0`p=7>^)} zafH_?XwAFBfM_OeN!SZOLPwMknN*~6KQx4&Lc7yIM{U#VfY=K_sIp05z|K5|6ms{b zp}0blQUkTyYqTP^nmYpB(aL)R2(5?)E+!r2y1vl2vg&HfSAYgmwh_wWTk?|v?mba@ z0|*%*NK*NaPRg1Gb((uhXhjC`7J3B;8w;p-2V0^|r7PB>i$>|JOz%0k=oN46an@>I34;KH3Trc}OtP~c`)V!6`x*$H z>TmL^Nbhk+Q#ZdS{1_q;Bra-XaE}u9f`}o+D|PN^AoLF1I{P4TM_qUIH5foxdt5xC zQzxJ9R{pL}7E@Bj8raPKnAZ1L%>&u|F;v{~lFvZ_LPjvlaSJoLia`*)=n~H0T4G=h4x&9GNlGq zv&-nezRM9D)J;|ZAwwP{^g&%PNJO-n;ev@@NZESR00*V@?CMTMzr<9k8Cs4;j_d$J z#@d6V#3j^YA8A#&RG%4d%wy`y861=+OMsBE9Y`cNCJ}5-WVtRb7c_BvZ*ye>SJqpN zxR+9kILuZJyGm}6KU;v1c@L89SBx@&>mF~9)n8FW4SuQRIaOZP z03qW9iC_x29Y`8$aPYTwsAXdvK83>;Xb12@)tYV#S@go1_Tf z8=(9#ZO)c&n+7=XQLk;xZ8;87{kZx0aB=WTrYA=MkVbdyLBf&8g->$_0_gqrps*aE>mD|O;gV`ZA1t>y2tN{#H zSqyFIiaN|xZATMt9O_4-1PBEoNW3+XmLL&qJD{wv8jMad$H@<~Z!j=G=EZt;Rl8Dc zfg$25mx{so-z_Zt@J%pUfHbP}AZhDzHKplPu^Q||?$#JZ*=d?9=lH#;fx+M#GB4A} z=wLNuv@X@Y4n_|U3Pfw7Nn9?L)+BFL)&R;1R%L}?wYf6p?@bMgb!9C+|8gRUfFazf zSt<-#qnN@a!|$cD00@O7NYF5t3f^95(ni)St?Z5<9;>(X>_&&id>7h#Qv`bi>qC*b*6yXJOknit|H@#1{B&d=x(&U`&N2=;eFhBOF@lD{?;2KyX@xijpjoWYnVIl= zzDs{hH#L~}y-QaW&1#otfjoOa`24G`kFi9TfT#s_&+ZiUTc14Jud@b7(`sx;Sd8mF@q2*yLjk0bzW}At#L4d}#`tI!V_zd55+IEdUIN9z zeZcv%oQZ*4#@*3czzy79-2A-1rhbeW&z9^%1EgtHb_BW)>=c}tQIVyHd=RiSppfeu zKV5rEeMs3V4HSS>YS?|Sb1SEIWd;`Q?Fe^9+jn4>BNxHDCeA34JwS@j!W= zDjsP^@_>MKgr&IG1{f#AFPET!Q~*Iy=ev8L{QbCRS(@AJGX=~uAh6QC0|aEql;1r2 zPXS0oyLiCd^VR&fH#=AC+9A+);=Vg16x&lrbiADgGfslwx=ODs1ORc?E8WuZRsfPf z!3|&-=<~@rrX6s$7p?-1R&Qq^c$$Q&2_htiPR@ig)%|1q=UV%A0002WNklPh%ERwxAh0e1p-#*rWlN)h0+2L%JXnec&fkw7IDdU-2PSx$#E$LL1Ey7( zyeo8rz}csJf}nb~f_a#qiRIzD0O6q4)1E8u!1OPcRjTdo7rGWyFQ8ia# zwr>p-fb^~LQs1aFPyjNj<|@qgt$_lNzBOLz8(n!!=G^X^i-~#qTP6OXGK5hKmWjj58fxr62#n#IW&!9mpLJ@W6gU iIWxnB#{T?T1?HTmZzLkG@0a)rlJj)+b6Mw<&;$T-!#(!^ literal 0 HcmV?d00001 diff --git a/apps/mini-user/src/assets/icons/可用门店.png b/apps/mini-user/src/assets/icons/可用门店.png index 85cab48f6c6785c1c9f6e6d400d83377e6c4b755..8ea8057b1e1a4a5ed01d671bda84a178c82af651 100644 GIT binary patch delta 1068 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
总部审核已通过,可将门店设为营业中。
+ 基础信息变更审核中 +
+ 已提交的资料变更正在等待总部审核,审核通过后才会覆盖门店线上信息。审核期间可继续修改并重新提交。 +
hDWjB?xQUR45zVRcp3{f upDBZpU^s-7l$4Z|l$4Z|l$4bJA%6ir3MxNlQ$KqE00007f_3WyJCzQuq0%G5R!&iAm9cXB|s1nLoz@#o5>&n#3IE7rB?lb z@KC8dp5lW0Q?VArwYVTI6i^gJQ9xRDL|pJq0O5kzY2T-RPClPx4)^}fId{J2+{^qk zae@W2hZ|2Yh9GG8+&TQk=vAcu4jF|0u1ciYp_ifRIlfv5GBMMC4WN|W;~>akx=biS zL>}%OiArH3mZ}0_8=XRpsv(FwOQ#k~R>BA&5Du0p9f@`4FAxbbsUy*c=|S^QyTBo` zIT0GzGh%^I60uUkmJ(<2jJY}v8bARfVuDT~S86#rM`A}@4r=R%sYF7D1X<}wbkZjz zh&%)Y7nKGkFm3E961uGefyK6=GuaLdJ2HVmquWzyY%1N3LZfqNYz~c1==uB zNP{?w`EFh5(7zmsAqb-8P^n>IVK!m5HY!apmCk0fsWb+a!JwcDiZ)z{h;1+7Q(jQg%;&F)>;b50CEL{jOJ`=r^?%ab1lf z=tA1Br&buQhN+8TttwO_fn8Ulw=%82yGLX}J;mu2Nk8+&wZl5u7u@tSoo*ei&{-ia zdaoQ84J<}f8lg%h=XG|O;1fcEi;KRiSOhB{nNq3>)6V2l`?~bhyC)jV7b7r_L1Wlc zXbu#by^!v}Vc2q*w$?NU4vhu`=~VWK;h~bsg2H>pU!YQ;36Ms#+P$rS=R0%I>b>xTxeR4Z19tXUnDbHw<`nbQ))_ zQj3U{5_m43hYr}tWKs@;#$-tYgJ=|nZ6J#xrQ0zmY$iiYVLH%QL1M9l&SHo=AbNO! z?w^I`t0bZN-O?3W`Zq%Z?w^HTsF9&3omdWN^sE27Df$WXS*kfQE!v;qK;NR>+i{k8 z!mE0ZewvWWI?g1uSfhpYJI;~#Y0GsVV%=wy-lt>da>Nq-X~vW2Hv}x@QhSZ|EUVkI z%T4zG7O*ou;Qr+tVIi>c&o)$Ns1DVagJ@MjNSIgyI|ZXX@mKbGXVl(qeZzC9`qN)7 z>s^S>(cbm>)Ult}ldC_}IA|}R>k@a=fX=0UHrA85Q!mojR36%)XEA8#hf3G~cDaJn zeO-P3+!dVe>)PY#rIaB&Mpw2z!+@9mCyB}0~7rA>Q{KH1i9sR?B z!EksIkOroWuDae*{2Z5$USB2a+i0%>5{ zI4(>?pa91O(!jKFT$qSJ0gel#fobEoFcEZ1PX9m zAPr0#$AyUq6yUf(8kjbY3lkA2z;S^zFl`(cCL&OP;{s`5+BhyuM4$l21=7H@aa@>) zKmm>mq=9MUxG)ic0vs1e1JlNFVIl$rI4+O|rj6smL<9L08`-}ehcU+imBh6vG@0tu2ii#;GHVg>|7e-A-zAJJ{sO;q^$6iNLHX8AH!2i*Ih(bR^g-b}XIEZWqzqF}_L zsFt@e@0NOG=g=YkhJ?e6DJBjR+U-q_E+ef_#^;wh zwz!#jC#I}wdE-<4gg=lp-Yl$r4NpAdr>{$o*ISF+a_HA$4kzW;I2PylnrJ<3&6iBJ zo5ZTD86Q1_v`W)-&DZ*0ltPO&5%;f+|2W2b#nl+Ub^oo)xbsR-c6TV0Re|iyJmSxL z`S1+$NaTj(Ax3^NduHWlR%9MpKGW#z0C$o1w%08+HLqT*@IQNOj8p1H=fjr|6ePWN z^dh?OcVCICOdWZuc50GoxclQ-ldfrr{zFEFaZp%`^njOOsCeh;(d2^k=Vs)8-*M3!0d)Vknsp0Tn zr{*;=GE0?)KE81~etygLsc%jtZ{0}C5mJI2X^_>WMPu?8wp*L~W(q<=Hw}DW&zVe1 zNP#OZ+Kg>>GjogLsS^{e%DjHaxi%=ix%EkaiP?Bla{_no=u;NsphgnO*N)n7N=$H^3%wI#~-!MQmZ#CDD4hGpS8l(l|*_l8BM1y zRjkTeQ^(Hw!@l0p5mloDja55uKbuxwXv>XpHJB8+WLov0TaWYZ87|}$6_-TcU01?g z`pfwVUKwkn(+bHy1)%8HdnXlDF0spzy(7E-_S-hm8nLID&{=<{qyYv?d2hoXH9UL#8;SvKo4l-aLms-Q z%wvZ)mPwsk%Tjg^&apgMTsz7)r*lkN`4-i!guEuJx~kZ+keCh61=16wE0a@Fc2&05=il3>*_;bS zd%_cUwC}iQzkkE?!1F5&dCkn)jpt^bQI*RSPTML^C<7?N_5~qzN8%zKUdoN;-_33u z6|~FdKV^|^RU;ElM@=ud@neqMwJmth9rb#&fQ{k8i}$}C2d$OQB5aMSxg<{{pEg*y z(gZE&&WRr5xX&*MlD52j8u?=V219xE>qEZQ;YjYrIk{iuWDH)GVOV=szA7sseJFZI zRwqS6brFZkqJBEKEYtm?XBPQ5>}t1j+Qan_Vnm%+jBmmYeRcC=)~BY{sQ zYyP{5Q9levyMcXT$1Y~+tT(Yyty}$f|Ndb{dBa_UfJY85&y*fNR2aYG=ZM%0!oG74 z1S{OOU!72VOgm;Aw0cd+#RaSq{@tjl`aSm-%*Q=t5b^TFS) zAIqp+E1Q?=`JkZ}Hin06dr5YJnUay%Pa8e~_ z2DTr&V9DhbzKF?fYW!}JFg88Q_B65}_Iy>+jcU^3lWs!YvHY9aI|YwPB}w(mB;}S< zET6i&wUtgGOCw^VZO13pQSEc~Z$qt?(_#|$HNha5Vf0=5<=BnG2ku@}abb3H{hfIO zZd*0B_>o0fF{m!TUO^g%4BUNpo<&1OynAlz_rC?t zMjt=jZUoAH=EubqoxiFb;$>W2(btVbJg(7;+Aw7)Lkd_=JhB@{ne9VRl+eMhF#1+x}Dfgvh79ONh`x)=v?S|6IS zB_~#Nt--y}j93zk!m+go*2>-z65y|FPdc98*W6j|4}VVexjxjkKyu#ODaJzM>1 zW>U5HjXluMcvfg9QW+V5pZ9OB{L!aZZ&cXuxj_(Tr(2vVK*kJ5iqSoto1`Y} zLBw{C_kXi^BL@=JyI4nh>#^x)tSbY7+43Y9wASsZwY~`-aj49s3yl(|0f{zU62An} zlp#>j%YpLSpc4~T9EA^7g`|JGZrI2+smVu`2DT7d+}@jPl7DRkmSjN&MG^| zFb%_wX6YZ6)n_}rr%1?oFNqTD=a?%#YriJwwSP&~=P@q*n6+PM3l7EQ%z1d=+$Wp> z6U5vhZEFv)K9R2_C%{vrq7Ss4TLS6=rX;lNiYTM$iE`KP?e0M3ojB7EFL@JLH~s z(1x4Pa^++hNF@TQoEb2uz>^$P1b}+YGd@5zeTR6> zfqLCii|{3SEtKkYTdj;!lxr-Azb!4{(`y#5k4$GI)oX_hpCK!4;r=p9Dk!X zV#VIXAP!EPb{NSctlEqTNnpUu{Gtt_pE~5Hl!LTTnmggj0)$fdj9NP&ZFAUyP*V>i zO-zS$Hn-raTK83f@A5_EzE<5;7bGhdbcvcKJbtSR!jda%qYa6_g_iszJV>uvsmq#J zm$iZ9J@a#~T)ttNEQEB;`0C`Ue}DS@w!3@rj4P^PJ>isbRqn0UQ!O13mj@xL!ipjw zWxHHegNdA8;cCn#ARU5WY?Fm>T7ly5B*C~%QNDJfEaT@b&V0?)t%a#9I?v_nrRGEw zA+I}%tF0GBl-r}${ zQ*=}uBYP)HCMRSTROrct6-Q8UI0q;gX-90*3LdVe%McWBY}D{iYTa!!ZjQ=lsCR@&b)D4!(bmX$5vsY{b> z;UJEkQFW@W%~mSkGwC2s7LxAv^LY2U#Ud+u!vCZd9-z= zmNJ6%OW(RjA8B{J%$SlY`-3H1ZpnSMU=CJ-Pk$Tm*HVyj0vSL` z+eJqEn!}TJsYmN$D$G`o3CDG+T-iqx@IYxGr(-p0+nVQpOZWVM6k{u;l zS#PkJT%g(plYMFEG%bDyGUd_xOk%bRz@%1>^lGth=ffbr$<$pZJAS}QeN1N>h zYjSi*~`Yc`{pFnl>tNM<^0q-VC)9D5XV-OpkSq)LUk zI-+umg()siAH$js@hdnv@3 zi_DxEOY*lpk(txKfKe1LwPd;)cN~BQsP(vEeqAYLXe4;jHGdpN&pC1;KXYhoRXq8j z^^X$h2a%5qj*-H=C18eqtL9~2d@JFcJ@c$hEc@u@+bPwD@#yT+msguX*skr`uI>82 at$zWuE}!@wYJFz_0000er`MayD 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 literal 0 HcmV?d00001 diff --git a/apps/mini-user/src/assets/icons/可用门店.png b/apps/mini-user/src/assets/icons/可用门店.png index 85cab48f6c6785c1c9f6e6d400d83377e6c4b755..8ea8057b1e1a4a5ed01d671bda84a178c82af651 100644 GIT binary patch delta 1068 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
cXuxj_(Tr(2vVK*kJ5iqSoto1`Y} zLBw{C_kXi^BL@=JyI4nh>#^x)tSbY7+43Y9wASsZwY~`-aj49s3yl(|0f{zU62An} zlp#>j%YpLSpc4~T9EA^7g`|JGZrI2+smVu`2DT7d+}@jPl7DRkmSjN&MG^| zFb%_wX6YZ6)n_}rr%1?oFNqTD=a?%#YriJwwSP&~=P@q*n6+PM3l7EQ%z1d=+$Wp> z6U5vhZEFv)K9R2_C%{vrq7Ss4TLS6=rX;lNiYTM$iE`KP?e0M3ojB7EFL@JLH~s z(1x4Pa^++hNF@TQoEb2uz>^$P1b}+YGd@5zeTR6> zfqLCii|{3SEtKkYTdj;!lxr-Azb!4{(`y#5k4$GI)oX_hpCK!4;r=p9Dk!X zV#VIXAP!EPb{NSctlEqTNnpUu{Gtt_pE~5Hl!LTTnmggj0)$fdj9NP&ZFAUyP*V>i zO-zS$Hn-raTK83f@A5_EzE<5;7bGhdbcvcKJbtSR!jda%qYa6_g_iszJV>uvsmq#J zm$iZ9J@a#~T)ttNEQEB;`0C`Ue}DS@w!3@rj4P^PJ>isbRqn0UQ!O13mj@xL!ipjw zWxHHegNdA8;cCn#ARU5WY?Fm>T7ly5B*C~%QNDJfEaT@b&V0?)t%a#9I?v_nrRGEw zA+I}%tF0GBl-r}${ zQ*=}uBYP)HCMRSTROrct6-Q8UI0q;gX-90*3LdVe%McWBY}D{iYTa!!ZjQ=lsCR@&b)D4!(bmX$5vsY{b> z;UJEkQFW@W%~mSkGwC2s7LxAv^LY2U#Ud+u!vCZd9-z= zmNJ6%OW(RjA8B{J%$SlY`-3H1ZpnSMU=CJ-Pk$Tm*HVyj0vSL` z+eJqEn!}TJsYmN$D$G`o3CDG+T-iqx@IYxGr(-p0+nVQpOZWVM6k{u;l zS#PkJT%g(plYMFEG%bDyGUd_xOk%bRz@%1>^lGth=ffbr$<$pZJAS}QeN1N>h zYjSi*~`Yc`{pFnl>tNM<^0q-VC)9D5XV-OpkSq)LUk zI-+umg()siAH$js@hdnv@3 zi_DxEOY*lpk(txKfKe1LwPd;)cN~BQsP(vEeqAYLXe4;jHGdpN&pC1;KXYhoRXq8j z^^X$h2a%5qj*-H=C18eqtL9~2d@JFcJ@c$hEc@u@+bPwD@#yT+msguX*skr`uI>82 at$zWuE}!@wYJFz_0000er`MayD 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 literal 0 HcmV?d00001 diff --git a/apps/mini-user/src/assets/icons/可用门店.png b/apps/mini-user/src/assets/icons/可用门店.png index 85cab48f6c6785c1c9f6e6d400d83377e6c4b755..8ea8057b1e1a4a5ed01d671bda84a178c82af651 100644 GIT binary patch delta 1068 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