feat: 完成门店配置拆分并新增配送与自提设置页面

This commit is contained in:
2026-02-16 14:39:11 +08:00
parent 07495f8c35
commit 8d1325edf0
63 changed files with 6827 additions and 368 deletions

View File

@@ -0,0 +1,82 @@
/**
* 文件职责:配送设置模块 API 与 DTO 定义。
* 1. 维护配送模式、梯度、区域、通用设置类型。
* 2. 提供查询/保存/复制配送设置接口。
*/
import { requestClient } from '#/api/request';
/** 配送模式 */
export type DeliveryMode = 'polygon' | 'radius';
/** 半径梯度配置 */
export interface RadiusTierDto {
color: string;
deliveryFee: number;
etaMinutes: number;
id: string;
maxDistance: number;
minDistance: number;
minOrderAmount: number;
}
/** 多边形区域配置 */
export interface PolygonZoneDto {
color: string;
deliveryFee: number;
etaMinutes: number;
id: string;
minOrderAmount: number;
name: string;
priority: number;
}
/** 通用配送配置 */
export interface DeliveryGeneralSettingsDto {
/** 配送时间加成(分钟) */
etaAdjustmentMinutes: number;
/** 免配送费门槛(元),空值表示不启用 */
freeDeliveryThreshold: null | number;
/** 每小时配送上限(单) */
hourlyCapacityLimit: number;
/** 最大配送距离(公里) */
maxDeliveryDistance: number;
}
/** 门店配送设置聚合 */
export interface StoreDeliverySettingsDto {
generalSettings: DeliveryGeneralSettingsDto;
mode: DeliveryMode;
polygonZones: PolygonZoneDto[];
radiusTiers: RadiusTierDto[];
storeId: string;
}
/** 保存配送设置参数 */
export type SaveStoreDeliverySettingsParams = StoreDeliverySettingsDto;
/** 复制配送设置参数 */
export interface CopyStoreDeliverySettingsParams {
sourceStoreId: string;
targetStoreIds: string[];
}
/** 获取门店配送设置 */
export async function getStoreDeliverySettingsApi(storeId: string) {
return requestClient.get<StoreDeliverySettingsDto>('/store/delivery', {
params: { storeId },
});
}
/** 保存门店配送设置 */
export async function saveStoreDeliverySettingsApi(
data: SaveStoreDeliverySettingsParams,
) {
return requestClient.post('/store/delivery/save', data);
}
/** 复制配送设置到其他门店 */
export async function copyStoreDeliverySettingsApi(
data: CopyStoreDeliverySettingsParams,
) {
return requestClient.post('/store/delivery/copy', data);
}

View File

@@ -0,0 +1,138 @@
/**
* 文件职责:自提设置模块 API 与 DTO 定义。
* 1. 维护基本设置、大时段、精细规则与预览类型。
* 2. 提供查询、保存与复制自提设置接口。
*/
import { requestClient } from '#/api/request';
/** 自提模式 */
export type PickupMode = 'big' | 'fine';
/** 可选星期0=周一6=周日) */
export type PickupWeekDay = 0 | 1 | 2 | 3 | 4 | 5 | 6;
/** 自提基本设置 */
export interface PickupBasicSettingsDto {
/** 是否允许当天自提 */
allowSameDayPickup: boolean;
/** 可预约天数 */
bookingDays: number;
/** 单笔最大数量null 代表不限制 */
maxItemsPerOrder: null | number;
}
/** 大时段模式单条配置 */
export interface PickupSlotDto {
capacity: number;
cutoffMinutes: number;
dayOfWeeks: PickupWeekDay[];
enabled: boolean;
endTime: string;
id: string;
name: string;
/** 当前已预约数量(用于展示进度) */
reservedCount: number;
startTime: string;
}
/** 精细时段规则 */
export interface PickupFineRuleDto {
/** 适用星期 */
dayOfWeeks: PickupWeekDay[];
/** 每日结束时间 HH:mm */
dayEndTime: string;
/** 每日开始时间 HH:mm */
dayStartTime: string;
/** 时间间隔(分钟) */
intervalMinutes: number;
/** 最少提前预约小时数 */
minAdvanceHours: number;
/** 每个窗口容量 */
slotCapacity: number;
}
/** 预览时段状态 */
export type PickupPreviewStatus = 'almost' | 'available' | 'expired' | 'full';
/** 预览时段 */
export interface PickupPreviewSlotDto {
remainingCount: number;
status: PickupPreviewStatus;
time: string;
}
/** 预览日 */
export interface PickupPreviewDayDto {
date: string;
label: string;
slots: PickupPreviewSlotDto[];
subLabel: string;
}
/** 门店自提设置聚合 */
export interface StorePickupSettingsDto {
basicSettings: PickupBasicSettingsDto;
bigSlots: PickupSlotDto[];
fineRule: PickupFineRuleDto;
mode: PickupMode;
previewDays: PickupPreviewDayDto[];
storeId: string;
}
/** 保存基本设置参数 */
export interface SavePickupBasicSettingsParams {
basicSettings: PickupBasicSettingsDto;
mode?: PickupMode;
storeId: string;
}
/** 保存大时段参数 */
export interface SavePickupSlotsParams {
mode?: PickupMode;
slots: PickupSlotDto[];
storeId: string;
}
/** 保存精细规则参数 */
export interface SavePickupFineRuleParams {
fineRule: PickupFineRuleDto;
mode?: PickupMode;
storeId: string;
}
/** 复制自提设置参数 */
export interface CopyStorePickupSettingsParams {
sourceStoreId: string;
targetStoreIds: string[];
}
/** 获取门店自提设置 */
export async function getStorePickupSettingsApi(storeId: string) {
return requestClient.get<StorePickupSettingsDto>('/store/pickup', {
params: { storeId },
});
}
/** 保存基本设置 */
export async function savePickupBasicSettingsApi(
data: SavePickupBasicSettingsParams,
) {
return requestClient.post('/store/pickup/basic/save', data);
}
/** 保存大时段配置 */
export async function savePickupSlotsApi(data: SavePickupSlotsParams) {
return requestClient.post('/store/pickup/slots/save', data);
}
/** 保存精细规则 */
export async function savePickupFineRuleApi(data: SavePickupFineRuleParams) {
return requestClient.post('/store/pickup/fine-rule/save', data);
}
/** 复制到其他门店 */
export async function copyStorePickupSettingsApi(
data: CopyStorePickupSettingsParams,
) {
return requestClient.post('/store/pickup/copy', data);
}