430 lines
19 KiB
TypeScript
430 lines
19 KiB
TypeScript
/** 商品类型枚举 */
|
||
export enum GoodsType {
|
||
NORMAL = "normal", // 普通商品
|
||
WEIGHT = "weight", // 称重商品
|
||
GIFT = "gift", // 赠菜(继承普通商品逻辑,标记用)
|
||
EMPTY = "", // 空字符串类型(后端未返回时默认归类为普通商品)
|
||
PACKAGE = "package", // 打包商品(如套餐/预打包商品,按普通商品逻辑处理,可扩展特殊规则)
|
||
}
|
||
|
||
/** 优惠券计算结果类型(新增细分字段) */
|
||
export interface CouponResult {
|
||
deductionAmount: number; // 抵扣金额
|
||
excludedProductIds: string[]; // 不适用商品ID列表(注意:是商品ID,非购物车ID)
|
||
usedCoupon: Coupon | undefined; // 实际使用的优惠券
|
||
productCouponDeduction: number; // 新增:商品优惠券抵扣(兑换券等)
|
||
fullCouponDeduction: number; // 新增:满减优惠券抵扣
|
||
}
|
||
|
||
/** 兑换券计算结果类型(新增细分字段) */
|
||
export interface ExchangeCalculationResult {
|
||
deductionAmount: number;
|
||
excludedProductIds: string[]; // 不适用商品ID列表(商品ID)
|
||
productCouponDeduction: number; // 新增:兑换券属于商品券,同步记录
|
||
}
|
||
|
||
export interface CouponTypes {
|
||
1: "满减券";
|
||
2: "商品券";
|
||
3: "折扣券";
|
||
4: "第二件半价券";
|
||
5: "消费送券";
|
||
6: "买一送一券";
|
||
7: "固定价格券";
|
||
8: "免配送费券";
|
||
}
|
||
|
||
/** 优惠券类型枚举 */
|
||
export enum CouponType {
|
||
FULL_REDUCTION = "full_reduction", // 满减券
|
||
DISCOUNT = "discount", // 折扣券
|
||
SECOND_HALF = "second_half", // 第二件半价券
|
||
BUY_ONE_GET_ONE = "buy_one_get_one", // 买一送一券
|
||
EXCHANGE = "exchange", // 商品兑换券
|
||
}
|
||
|
||
/** 后端返回的优惠券原始字段类型 */
|
||
export interface BackendCoupon {
|
||
id?: number; // 自增主键(int64)
|
||
shopId?: number; // 店铺ID(int64)
|
||
syncId?: number; // 同步Id(int64)
|
||
type?: number; // 优惠券类型:1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券,5-消费送券,6-买一送一券,7-固定价格券,8-免配送费券
|
||
name?: string; // 券名称
|
||
useShopType?: string; // 可用门店类型:only-仅本店;all-所有门店,custom-指定门店
|
||
useShops?: string; // 可用门店(逗号分隔字符串,如"1,2,3")
|
||
useType?: string; // 可使用类型:dine堂食/pickup自取/deliv配送/express快递
|
||
validType?: string; // 有效期类型:fixed(固定时间),custom(自定义时间)
|
||
validDays?: number; // 有效期(天)
|
||
validStartTime?: string; // 有效期开始时间(如"2024-01-01 00:00:00")
|
||
validEndTime?: string; // 有效期结束时间
|
||
daysToTakeEffect?: number; // 隔天生效
|
||
useDays?: string; // 可用周期(如"周一,周二")
|
||
useTimeType?: string; // 可用时间段类型:all-全时段,custom-指定时段
|
||
useStartTime?: string; // 可用开始时间(每日)
|
||
useEndTime?: string; // 可用结束时间(每日)
|
||
getType?: string; // 发放设置:不可自行领取/no,可领取/yes
|
||
getMode?: string; // 用户领取方式
|
||
giveNum?: number; // 总发放数量,-10086为不限量
|
||
getUserType?: string; // 可领取用户:全部/all,新用户一次/new,仅会员/vip
|
||
getLimit?: number; // 每人领取限量,-10086为不限量
|
||
useLimit?: number; // 每人每日使用限量,-10086为不限量
|
||
discountShare?: number; // 与限时折扣同享:0-否,1-是
|
||
vipPriceShare?: number; // 与会员价同享:0-否,1-是
|
||
ruleDetails?: string; // 附加规则说明
|
||
status?: number; // 状态:0-禁用,1-启用
|
||
useNum?: number; // 已使用数量
|
||
leftNum?: number; // 剩余数量
|
||
foods?: string; // 指定门槛商品(逗号分隔字符串,如"101,102",此处为商品ID)
|
||
fullAmount?: number; // 使用门槛:满多少金额(元)
|
||
discountAmount?: number; // 使用门槛:减多少金额(元)
|
||
discountRate?: number; // 折扣%(如90=9折)
|
||
maxDiscountAmount?: number; // 可抵扣最大金额(元)
|
||
useRule?: string; // 使用规则:price_asc-价格低到高,price_desc-高到低
|
||
discountNum?: number; // 抵扣数量
|
||
otherCouponShare?: number; // 与其它优惠共享:0-否,1-是
|
||
createTime?: string; // 创建时间
|
||
updateTime?: string; // 更新时间
|
||
}
|
||
|
||
/** 营销活动类型枚举 */
|
||
export enum ActivityType {
|
||
TIME_LIMIT_DISCOUNT = "time_limit_discount", // 限时折扣
|
||
}
|
||
|
||
/** 基础购物车商品项(核心修正:新增product_id,明确各ID含义) */
|
||
export interface BaseCartItem {
|
||
id: string | number; // 购物车ID(唯一标识购物车中的条目,如购物车项主键)
|
||
product_id: string | number; // 商品ID(唯一标识商品,用于优惠券/活动匹配,必选)
|
||
productId?: string | number; // 商品ID
|
||
salePrice: number; // 商品原价(元)
|
||
number: number; // 商品数量
|
||
num?: number; // 商品数量
|
||
isTimeDiscount?: boolean; // 是否限时折扣商品(默认false)
|
||
is_time_discount?: boolean; // 是否限时折扣商品(默认false)
|
||
product_type: GoodsType; // 商品类型
|
||
is_temporary?: boolean; // 是否临时菜(默认false)
|
||
isTemporary?: boolean; // 是否临时菜(默认false)
|
||
is_gift?: boolean; // 是否赠菜(默认false)
|
||
isGift?: boolean; // 是否赠菜(默认false)
|
||
returnNum?: number; // 退货数量(历史订单用,默认0)
|
||
memberPrice: number; // 商品会员价(元,优先级:商品会员价 > 会员折扣)
|
||
discountSaleAmount?: number; // 商家改价后单价(元,优先级最高)
|
||
discount_sale_amount?: number; // 商家改价后单价(元,优先级最高)
|
||
packFee?: number; // 单份打包费(元,默认0)
|
||
packNumber?: number; // 堂食打包数量(默认0)
|
||
activityInfo?: {
|
||
// 商品参与的营销活动(如限时折扣)
|
||
type: ActivityType;
|
||
discountRate: number; // 折扣率(如0.8=8折)
|
||
vipPriceShare: boolean; // 是否与会员优惠同享(默认false)
|
||
};
|
||
skuData?: {
|
||
// SKU扩展数据(可选)
|
||
id: string | number; // SKU ID(唯一标识商品规格,如颜色/尺寸)
|
||
memberPrice: number; // SKU会员价
|
||
salePrice?: number; // SKU原价
|
||
};
|
||
skuId?: string | number; // SKU ID(唯一标识商品规格,如颜色/尺寸)
|
||
couponType?: number; // 优惠券类型:1-满减券,2-商品兑换券,3-折扣券,4-第二件半价券,5-消费送券,6-买一送一券,7-固定价格券,8-免配送费券
|
||
}
|
||
|
||
export interface CouponFoods {
|
||
id: string;
|
||
name: string;
|
||
images: string;
|
||
}
|
||
|
||
/** 基础优惠券接口(所有券类型继承,包含统一门槛商品字段) */
|
||
export interface BaseCoupon {
|
||
otherCouponShare?: number; // 与其它优惠共享:0-否,1-是
|
||
id: string | number; // 优惠券ID
|
||
type: number; // 工具库字符串枚举(由后端couponType转换)
|
||
name: string; // 对应后端title
|
||
available: boolean; // 基于BackendCoupon字段计算的可用性
|
||
useShopType?: string; // only-仅本店;all-所有门店,custom-指定门店
|
||
useShops: string[]; // 可用门店ID列表
|
||
discountShare: boolean; // 与限时折扣同享:0-否,1-是(后端字段转换为布尔值)
|
||
vipPriceShare: boolean; // 与会员价同享:0-否,1-是(后端字段转换为布尔值)
|
||
useType?: string[]; // 可使用类型:dine堂食/pickup自取/deliv配送/express快递
|
||
isValid: boolean; // 是否在有效期内
|
||
discountAmount?: number; // 减免金额 (满减券有)
|
||
fullAmount?: number; // 使用门槛:满多少金额
|
||
maxDiscountAmount?: number; // 可抵扣最大金额 元
|
||
use: boolean;
|
||
discountNum?: number; // 抵扣数量
|
||
useRule?: string; // 使用规则:price_asc-价格低到高,price_desc-高到低
|
||
discountRate?: number; // 折扣%(如90=9折)
|
||
noUseRestrictions?: boolean; // 是不可用原因
|
||
thresholdFoods: CouponFoods[]; // 门槛商品ID列表(空数组=全部商品,非空=指定商品ID)
|
||
useFoods: CouponFoods[]; // 可用商品ID列表(空数组=全部商品,非空=指定商品ID)
|
||
}
|
||
export interface couponDiscount {
|
||
discountPrice: number;
|
||
hasDiscountGoodsArr: BaseCartItem[];
|
||
}
|
||
/** 满减券(适配后端字段) */
|
||
export interface FullReductionCoupon extends BaseCoupon {
|
||
fullAmount: number; // 对应后端fullAmount(满减门槛)
|
||
discountAmount: number; // 对应后端discountAmount(减免金额)
|
||
maxDiscountAmount?: number; // 对应后端maxDiscountAmount(最大减免)
|
||
discount?: couponDiscount;
|
||
}
|
||
|
||
/** 折扣券(适配后端字段) */
|
||
export interface DiscountCoupon extends BaseCoupon {
|
||
discountRate: number; // 后端discountRate(%)转小数(如90→0.9)
|
||
maxDiscountAmount: number; // 对应后端maxDiscountAmount(最大减免)
|
||
discount?: couponDiscount;
|
||
}
|
||
|
||
/** 第二件半价券(适配后端字段) */
|
||
export interface SecondHalfPriceCoupon extends BaseCoupon {
|
||
maxUseCountPerOrder?: number; // 对应后端useLimit(-10086=不限)
|
||
discount?: couponDiscount;
|
||
}
|
||
|
||
/** 买一送一券(适配后端字段) */
|
||
export interface BuyOneGetOneCoupon extends BaseCoupon {
|
||
maxUseCountPerOrder?: number; // 对应后端useLimit(-10086=不限)
|
||
discount?: couponDiscount;
|
||
}
|
||
|
||
/** 商品兑换券(适配后端字段) */
|
||
export interface ExchangeCoupon extends BaseCoupon {
|
||
deductCount: number; // 对应后端discountNum(抵扣数量)
|
||
sortRule: "low_price_first" | "high_price_first"; // 后端useRule转换
|
||
discount?: couponDiscount;
|
||
}
|
||
|
||
/** 所有优惠券类型联合 */
|
||
export type Coupon =
|
||
| FullReductionCoupon
|
||
| DiscountCoupon
|
||
| SecondHalfPriceCoupon
|
||
| BuyOneGetOneCoupon
|
||
| ExchangeCoupon;
|
||
|
||
/** 营销活动配置(如限时折扣,applicableProductIds为商品ID列表) */
|
||
export interface ActivityConfig {
|
||
type: ActivityType;
|
||
applicableProductIds?: string[]; // 适用商品ID列表(与BaseCartItem.product_id匹配)
|
||
discountRate: number; // 折扣率(如0.8=8折)
|
||
vipPriceShare: boolean; // 是否与会员优惠同享
|
||
}
|
||
|
||
/** 积分抵扣规则 */
|
||
export interface PointDeductionRule {
|
||
pointsPerYuan: number; // X积分=1元(如100=100积分抵1元)
|
||
maxDeductionAmount?: number; // 最大抵扣金额(元,默认不限)
|
||
}
|
||
|
||
/** 餐位费配置 */
|
||
export interface SeatFeeConfig {
|
||
pricePerPerson: number; // 每人餐位费(元)
|
||
personCount: number; // 用餐人数(默认1)
|
||
isEnabled: boolean; // 是否启用餐位费(默认false)
|
||
}
|
||
/** 商家减免类型枚举 */
|
||
export enum MerchantReductionType {
|
||
FIXED_AMOUNT = "fixed_amount", // 固定金额减免(如直接减 10 元)
|
||
DISCOUNT_RATE = "discount_rate", // 比例折扣减免(如打 9 折,即减免 10%)
|
||
}
|
||
|
||
/** 商家减免配置(新增,替代原单一金额字段) */
|
||
export interface MerchantReductionConfig {
|
||
type: MerchantReductionType; // 减免类型(二选一)
|
||
fixedAmount?: number; // 固定减免金额(元,仅 FIXED_AMOUNT 生效,≥0)
|
||
discountRate?: number; // 折扣率(%,仅 DISCOUNT_RATE 生效,0-100,如 90 代表 9 折)
|
||
}
|
||
/**商家霸王餐配置 */
|
||
export interface FreeDineConfig {
|
||
enable: boolean; //是否开启
|
||
rechargeThreshold: number; //订单满多少元可以使用
|
||
rechargeTimes: number; //充值多少倍免单
|
||
withCoupon: boolean; //与优惠券同享
|
||
withPoints: boolean; //与积分同享
|
||
useType?: string[]; //使用类型 dine-in店内 takeout 自取 post快递,takeaway外卖
|
||
useShopType?: string; //all 全部 part部分
|
||
shopIdList?: number[]; //可用门店id
|
||
}
|
||
|
||
//限时折扣配置
|
||
export interface TimeLimitDiscountConfig {
|
||
/**
|
||
* 折扣优先级 limit-time/vip-price
|
||
*/
|
||
discountPriority: string;
|
||
/**
|
||
* 折扣% 范围1-99
|
||
*/
|
||
discountRate: number;
|
||
/**
|
||
* 参与商品
|
||
*/
|
||
foods: string;
|
||
/**
|
||
* 参与商品 1全部 2部分
|
||
*/
|
||
foodType: number;
|
||
/**
|
||
* 自增主键
|
||
*/
|
||
id: number;
|
||
/**
|
||
* 店铺ID
|
||
*/
|
||
shopId: number;
|
||
/**
|
||
* 可使用类型:堂食 dine-in 外带 take-out 外卖 take-away 配送 post
|
||
*/
|
||
useType: string;
|
||
[property: string]: any;
|
||
}
|
||
|
||
//用户信息
|
||
export interface ShopUserInfo {
|
||
isVip: number | null; //是否会员
|
||
discount: number | null; //用户折扣
|
||
isMemberPrice: number | null; //会员折扣与会员价是否同时使用
|
||
}
|
||
/** 订单额外费用配置 */
|
||
export interface OrderExtraConfig {
|
||
// merchantReduction: number; // 商家减免金额(元,默认0)
|
||
// 替换原单一金额字段,支持两种减免形式
|
||
merchantReduction: MerchantReductionConfig;
|
||
additionalFee: number; // 附加费(元,如余额充值、券包,默认0)
|
||
pointDeductionRule: PointDeductionRule; // 积分抵扣规则
|
||
seatFeeConfig: SeatFeeConfig; // 餐位费配置
|
||
currentStoreId: string; // 当前门店ID(用于验证优惠券适用门店)
|
||
userPoints: number; // 用户当前积分(用于积分抵扣)
|
||
isMember: boolean; // 用户是否会员(用于会员优惠)
|
||
memberDiscountRate?: number; // 会员折扣率(如0.95=95折,无会员价时用)
|
||
newUserDiscount?: number; // 新用户减免金额(元,默认0)
|
||
fullReductionActivities: FullReductionActivity[]; // 当前店铺的满减活动列表(后端返回结构)
|
||
currentDinnerType: "dine-in" | "take-out" | "take-away" | "post"; // 当前就餐类型(匹配useType)
|
||
isFreeDine?: boolean; //是否霸王餐
|
||
freeDineConfig?: FreeDineConfig;
|
||
limitTimeDiscount?: TimeLimitDiscountConfig; //限时折扣
|
||
shopUserInfo: ShopUserInfo; // 用户信息
|
||
}
|
||
|
||
/** 订单费用汇总(修改:补充商家减免类型和明细) */
|
||
export interface OrderCostSummary {
|
||
goodsList: BaseCartItem[];
|
||
// 商品总件数
|
||
goodsTotal: number;
|
||
totalDiscountAmount: number;
|
||
goodsRealAmount: number; // 商品真实原价总和
|
||
goodsOriginalAmount: number; // 商品原价总和
|
||
goodsDiscountAmount: number; // 商品折扣金额
|
||
couponDeductionAmount: number; // 优惠券总抵扣
|
||
productCouponDeduction: number; // 商品优惠券抵扣
|
||
fullCouponDeduction: number; // 满减优惠券抵扣
|
||
pointDeductionAmount: number; // 积分抵扣金额
|
||
seatFee: number; // 餐位费
|
||
packFee: number; // 打包费
|
||
scoreMaxMoney: number; // 积分最大可抵扣金额
|
||
// 新增:商家减免明细
|
||
merchantReduction: {
|
||
type: MerchantReductionType; // 实际使用的减免类型
|
||
originalConfig: MerchantReductionConfig; // 原始配置(便于前端展示)
|
||
actualAmount: number; // 实际减免金额(计算后的值,≥0)
|
||
};
|
||
additionalFee: number; // 附加费
|
||
finalPayAmount: number; // 最终实付金额
|
||
couponUsed?: Coupon; // 实际使用的优惠券
|
||
pointUsed: number; // 实际使用的积分
|
||
newUserDiscount: number; // 新用户减免金额(元,默认0)
|
||
dinnerType?: "dine-in" | "take-out"; // 就餐类型(堂食/自取/配送/快递)
|
||
config: OrderExtraConfig; // 订单额外费用配置
|
||
//满减活动
|
||
fullReduction: {
|
||
usedFullReductionActivityFullAmount: number; // 计算出的满减活动的门槛金额
|
||
usedActivity?: FullReductionActivity; // 实际使用的满减活动
|
||
usedThreshold?: FullReductionThreshold; // 实际使用的满减阈值(多门槛中选最优)
|
||
actualAmount: number; // 满减实际减免金额(元)
|
||
};
|
||
vipDiscountAmount: number; //会员折扣减免金额
|
||
// 订单原支付金额
|
||
orderOriginFinalPayAmount: number; //订单原金额(包含打包费+餐位费)
|
||
}
|
||
|
||
/** 满减活动阈值(单条满减规则:满X减Y)- 对应 MkDiscountThresholdInsertGroupDefaultGroup */
|
||
export interface FullReductionThreshold {
|
||
activityId?: number; // 关联满减活动ID
|
||
fullAmount?: number; // 满多少金额(元,必填)
|
||
discountAmount?: number; // 减多少金额(元,必填)
|
||
}
|
||
|
||
/** 满减活动主表 - 对应 Request 接口(后端真实字段) */
|
||
export interface FullReductionActivity {
|
||
id?: number; // 自增主键(后端字段:id)
|
||
shopId?: number; // 店铺ID(后端字段:shopId)
|
||
status?: number; // 活动状态:1=未开始,2=进行中,3=已结束(后端字段:status)
|
||
sort?: number; // 排序值(越大优先级越高,后端字段:sort)
|
||
createTime?: string; // 创建时间(后端字段:createTime,格式如"2025-10-14 13:56:07")
|
||
updateTime?: string; // 最新修改时间(后端字段:updateTime,用于优先级排序)
|
||
validStartTime?: string; // 有效期开始时间(后端字段:validStartTime,格式如"2025-10-14")
|
||
validEndTime?: string; // 有效期结束时间(后端字段:validEndTime,格式如"2025-12-14")
|
||
useType?: string; // 可使用类型(后端字段:useType,如"dine,pickup,deliv,express")
|
||
useDays?: string; // 可用周期(后端字段:useDays,如"周一,周二,周三,周四,周五,周六,周日")
|
||
useTimeType?: string; // 可用时间段类型(后端字段:useTimeType,all=全时段,custom=指定时段)
|
||
useStartTime?: string; // 每日可用开始时间(后端字段:useStartTime,如"09:00:00",仅custom时有效)
|
||
useEndTime?: string; // 每日可用结束时间(后端字段:useEndTime,如"22:00:00",仅custom时有效)
|
||
couponShare?: number; // 与优惠券同享:0=否,1=是(后端字段:couponShare)
|
||
discountShare?: number; // 与限时折扣同享:0=否,1=是(后端字段:discountShare)
|
||
vipPriceShare?: number; // 与会员价同享:0=否,1=是(后端字段:vipPriceShare)
|
||
pointsShare?: number; // 与积分抵扣同享:0=否,1=是(后端字段:pointsShare)
|
||
thresholds?: FullReductionThreshold[]; // 满减阈值列表(多门槛,后端字段:thresholds)
|
||
isDel?: boolean; // 是否删除:0=否,1=是(后端字段:isDel,默认false)
|
||
}
|
||
|
||
// 辅助枚举:星期映射(用于useDays校验)
|
||
export const WEEKDAY_MAP = {
|
||
周一: 1,
|
||
周二: 2,
|
||
周三: 3,
|
||
周四: 4,
|
||
周五: 5,
|
||
周六: 6,
|
||
周日: 0, // JS中getDay()返回0=周日
|
||
};
|
||
|
||
export interface ShopInfo {
|
||
isMemberPrice: number; // 是否开启会员价 1是开启
|
||
[property: string]: any;
|
||
}
|
||
|
||
export interface couponCalcParams {
|
||
canDikouGoodsArr: BaseCartItem[];
|
||
coupon: Coupon;
|
||
user: ShopUserInfo;
|
||
shopInfo: ShopInfo;
|
||
selCoupon: Coupon[];
|
||
goodsOrderPrice: number; //商品订单总价
|
||
isMemberPrice: number; // 是否开启会员价 1是开启
|
||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined;
|
||
}
|
||
export interface CanDikouGoodsArrArgs {
|
||
canDikouGoodsArr: BaseCartItem[];
|
||
selCoupon: Coupon[];
|
||
user: ShopUserInfo;
|
||
shopInfo: ShopInfo;
|
||
limitTimeDiscount?: TimeLimitDiscountConfig | null | undefined;
|
||
}
|
||
export interface returnPriceArgs {
|
||
goods: BaseCartItem;
|
||
selCoupon: Coupon[];
|
||
user: ShopUserInfo;
|
||
shopInfo: ShopInfo;
|
||
shopUserInfo: ShopUserInfo;
|
||
limitTimeDiscountRes?: TimeLimitDiscountConfig | null | undefined;
|
||
idKey?: keyof BaseCartItem;
|
||
}
|
||
|
||
|
||
export interface CanReturnMemberPriceArgs {
|
||
shopInfo?: ShopInfo;
|
||
shopUserInfo: ShopUserInfo;
|
||
}
|