From dc3093201243e3383353a9e4e124e421188db6f6 Mon Sep 17 00:00:00 2001 From: jacy <18049821889@163.com> Date: Mon, 3 Aug 2026 16:21:38 +0800 Subject: [PATCH] =?UTF-8?q?feat(redeem):=20=E6=A0=B8=E9=94=80=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=A0=87=E8=AE=B0=E6=89=AB=E7=A0=81/=E6=89=8B?= =?UTF-8?q?=E6=9C=BA=E5=8F=B7=E5=B9=B6=E6=94=AF=E6=8C=81=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 落库 RedeemChannel,门店记录页增加统计按钮,HQ 可按方式筛选。 Co-authored-by: Cursor --- .../admin-web/src/pages/RedeemRecordsPage.tsx | 100 +++++++-- apps/h5-shop/src/pages/HomePage.tsx | 3 + apps/h5-shop/src/pages/RecordsPage.tsx | 189 +++++++++++++++--- apps/h5-shop/src/styles.css | 168 +++++++++++++++- packages/shared-types/src/redeem.ts | 25 +++ server/dukang-api/prisma/schema.prisma | 25 ++- .../src/modules/ops/admin-redeem.service.ts | 3 + .../src/modules/ops/dto/admin-query.dto.ts | 5 + .../src/modules/redeem/redeem.controller.ts | 10 + .../src/modules/redeem/redeem.service.ts | 51 +++++ 10 files changed, 531 insertions(+), 48 deletions(-) diff --git a/apps/admin-web/src/pages/RedeemRecordsPage.tsx b/apps/admin-web/src/pages/RedeemRecordsPage.tsx index 2f7557d..b0ce8a5 100644 --- a/apps/admin-web/src/pages/RedeemRecordsPage.tsx +++ b/apps/admin-web/src/pages/RedeemRecordsPage.tsx @@ -1,12 +1,18 @@ import { useState } from 'react'; -import { Button, Descriptions, Drawer, Form, Input, Table, Typography } from 'antd'; +import { Button, Descriptions, Drawer, Form, Input, Select, Table, Tag, Typography } from 'antd'; import type { ColumnsType } from 'antd/es/table'; +import { REDEEM_CHANNEL_LABELS, type RedeemChannel } from '@dukang/shared-types'; import { request } from '../lib/api'; import { fmtTime } from '../lib/constants'; import { useAdminList } from '../lib/useAdminList'; type Row = { - id: string; redeemNo: string; amount: number; settleAmount: number; createdAt: string; + id: string; + redeemNo: string; + amount: number; + settleAmount: number; + channel?: RedeemChannel; + createdAt: string; user?: { userNo: string; phone: string | null }; store?: { name: string; cityName: string }; coupon?: { couponNo: string }; @@ -21,6 +27,7 @@ export default function RedeemRecordsPage() { const qs = new URLSearchParams(); if (filters.redeemNo) qs.set('redeemNo', filters.redeemNo); if (filters.storeId) qs.set('storeId', filters.storeId); + if (filters.channel) qs.set('channel', filters.channel); return qs; }, [filters], @@ -30,6 +37,19 @@ export default function RedeemRecordsPage() { const columns: ColumnsType = [ { title: '核销号', dataIndex: 'redeemNo', width: 180 }, + { + title: '方式', + dataIndex: 'channel', + width: 110, + render: (v: RedeemChannel | undefined) => { + const channel = v === 'PHONE' ? 'PHONE' : 'SCAN'; + return ( + + {REDEEM_CHANNEL_LABELS[channel]} + + ); + }, + }, { title: '用户', dataIndex: ['user', 'userNo'], width: 110 }, { title: '门店', dataIndex: ['store', 'name'] }, { title: '核销额', dataIndex: 'amount', width: 90, render: (v) => `¥${v}` }, @@ -37,12 +57,19 @@ export default function RedeemRecordsPage() { { title: '券号', dataIndex: ['coupon', 'couponNo'], width: 160 }, { title: '时间', dataIndex: 'createdAt', width: 160, render: fmtTime }, { - title: '操作', width: 80, + title: '操作', + width: 80, render: (_, row) => ( - + ), }, ]; @@ -50,16 +77,65 @@ export default function RedeemRecordsPage() { return (
核销记录 -
{ setFilters(v); setPage(1); }}> - - + { + setFilters(v); + setPage(1); + }} + > + + + + + + + +