/** 商品类型枚举 */ 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; }