feat(@vben/web-antd): implement new customer gift page and drawers

This commit is contained in:
2026-03-02 15:58:53 +08:00
parent 9920f2e32c
commit 0e043ddd79
22 changed files with 2674 additions and 0 deletions

View File

@@ -185,4 +185,5 @@ export async function deleteMarketingCouponApi(data: DeleteMarketingCouponDto) {
export * from './flash-sale';
export * from './full-reduction';
export * from './new-customer';
export * from './seckill';

View File

@@ -0,0 +1,213 @@
/**
* 文件职责:营销中心新客有礼 API 与 DTO 定义。
* 1. 维护新客有礼详情、配置保存、邀请记录分页与写入契约。
*/
import { requestClient } from '#/api/request';
/** 礼包类型。 */
export type MarketingNewCustomerGiftType = 'coupon' | 'direct';
/** 券场景。 */
export type MarketingNewCustomerCouponScene = 'invitee' | 'inviter' | 'welcome';
/** 券类型。 */
export type MarketingNewCustomerCouponType =
| 'amount_off'
| 'discount'
| 'free_shipping';
/** 分享渠道。 */
export type MarketingNewCustomerShareChannel =
| 'moments'
| 'sms'
| 'wechat_friend';
/** 邀请订单状态。 */
export type MarketingNewCustomerInviteOrderStatus = 'ordered' | 'pending_order';
/** 邀请奖励状态。 */
export type MarketingNewCustomerInviteRewardStatus = 'issued' | 'pending';
/** 优惠券规则。 */
export interface MarketingNewCustomerCouponRuleDto {
couponType: MarketingNewCustomerCouponType;
id: string;
minimumSpend: null | number;
scene: MarketingNewCustomerCouponScene;
sortOrder: number;
validDays: number;
value: null | number;
}
/** 新客有礼设置。 */
export interface MarketingNewCustomerSettingsDto {
directMinimumSpend: null | number;
directReduceAmount: null | number;
giftEnabled: boolean;
giftType: MarketingNewCustomerGiftType;
inviteEnabled: boolean;
inviteeCoupons: MarketingNewCustomerCouponRuleDto[];
inviterCoupons: MarketingNewCustomerCouponRuleDto[];
shareChannels: MarketingNewCustomerShareChannel[];
storeId: string;
updatedAt: string;
welcomeCoupons: MarketingNewCustomerCouponRuleDto[];
}
/** 统计数据。 */
export interface MarketingNewCustomerStatsDto {
firstOrderConversionRate: number;
firstOrderedCount: number;
giftClaimRate: number;
giftClaimedCount: number;
monthlyGrowthCount: number;
monthlyGrowthRatePercent: number;
monthlyNewCustomers: number;
}
/** 邀请记录。 */
export interface MarketingNewCustomerInviteRecordDto {
id: string;
inviteeName: string;
inviteTime: string;
inviterName: string;
orderStatus: MarketingNewCustomerInviteOrderStatus;
rewardIssuedAt: null | string;
rewardStatus: MarketingNewCustomerInviteRewardStatus;
sourceChannel?: string;
}
/** 邀请记录分页。 */
export interface MarketingNewCustomerInviteRecordListResultDto {
items: MarketingNewCustomerInviteRecordDto[];
page: number;
pageSize: number;
totalCount: number;
}
/** 新客有礼详情。 */
export interface MarketingNewCustomerDetailDto {
inviteRecords: MarketingNewCustomerInviteRecordListResultDto;
settings: MarketingNewCustomerSettingsDto;
stats: MarketingNewCustomerStatsDto;
}
/** 新客有礼详情查询。 */
export interface MarketingNewCustomerDetailQuery {
recordPage?: number;
recordPageSize?: number;
storeId: string;
}
/** 邀请记录查询。 */
export interface MarketingNewCustomerInviteRecordListQuery {
page: number;
pageSize: number;
storeId: string;
}
/** 保存券规则项。 */
export interface SaveMarketingNewCustomerCouponRuleDto {
couponType: MarketingNewCustomerCouponType;
minimumSpend: null | number;
validDays: number;
value: null | number;
}
/** 保存新客有礼配置请求。 */
export interface SaveMarketingNewCustomerSettingsDto {
directMinimumSpend: null | number;
directReduceAmount: null | number;
giftEnabled: boolean;
giftType: MarketingNewCustomerGiftType;
inviteEnabled: boolean;
inviteeCoupons: SaveMarketingNewCustomerCouponRuleDto[];
inviterCoupons: SaveMarketingNewCustomerCouponRuleDto[];
shareChannels: MarketingNewCustomerShareChannel[];
storeId: string;
welcomeCoupons: SaveMarketingNewCustomerCouponRuleDto[];
}
/** 写入邀请记录请求。 */
export interface WriteMarketingNewCustomerInviteRecordDto {
inviteeName: string;
inviteTime: string;
inviterName: string;
orderStatus: MarketingNewCustomerInviteOrderStatus;
rewardIssuedAt: null | string;
rewardStatus: MarketingNewCustomerInviteRewardStatus;
sourceChannel?: string;
storeId: string;
}
/** 新客成长记录。 */
export interface MarketingNewCustomerGrowthRecordDto {
customerKey: string;
customerName?: string;
firstOrderAt: null | string;
giftClaimedAt: null | string;
id: string;
registeredAt: string;
sourceChannel?: string;
}
/** 写入成长记录请求。 */
export interface WriteMarketingNewCustomerGrowthRecordDto {
customerKey: string;
customerName?: string;
firstOrderAt: null | string;
giftClaimedAt: null | string;
registeredAt: string;
sourceChannel?: string;
storeId: string;
}
/** 获取新客有礼详情。 */
export async function getMarketingNewCustomerDetailApi(
params: MarketingNewCustomerDetailQuery,
) {
return requestClient.get<MarketingNewCustomerDetailDto>(
'/marketing/new-customer/detail',
{ params },
);
}
/** 保存新客有礼配置。 */
export async function saveMarketingNewCustomerSettingsApi(
data: SaveMarketingNewCustomerSettingsDto,
) {
return requestClient.post<MarketingNewCustomerSettingsDto>(
'/marketing/new-customer/save',
data,
);
}
/** 获取邀请记录分页。 */
export async function getMarketingNewCustomerInviteRecordListApi(
params: MarketingNewCustomerInviteRecordListQuery,
) {
return requestClient.get<MarketingNewCustomerInviteRecordListResultDto>(
'/marketing/new-customer/invite-record/list',
{ params },
);
}
/** 写入邀请记录。 */
export async function writeMarketingNewCustomerInviteRecordApi(
data: WriteMarketingNewCustomerInviteRecordDto,
) {
return requestClient.post<MarketingNewCustomerInviteRecordDto>(
'/marketing/new-customer/invite-record/write',
data,
);
}
/** 写入成长记录。 */
export async function writeMarketingNewCustomerGrowthRecordApi(
data: WriteMarketingNewCustomerGrowthRecordDto,
) {
return requestClient.post<MarketingNewCustomerGrowthRecordDto>(
'/marketing/new-customer/growth-record/write',
data,
);
}