You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

零售POS系统商品对象设计疑问:如何适配客户专属定价?

嘿,我之前做零售POS系统的时候刚好碰到过几乎一模一样的需求!给你几个实用的设计思路,应该能帮你解决这个商品定价结构的瓶颈:

方案1:拆分基础定价与客户专属定价,引入独立定价类

这种方案遵循单一职责原则,把商品基础信息和定价逻辑拆分开,后续扩展新定价类型(比如会员价、促销价)会更灵活。

首先调整商品类,只保留核心属性,把定价部分抽成独立的类:

// 基础商品类:只负责存储商品核心信息
class Item {
    private String name;
    // 关联基础定价模板
    private BasePricing basePricing;

    // 构造函数、getter、setter 省略
}

// 基础定价模板:存储通用的默认价格
class BasePricing {
    private double storePickupPrice; // 原priceA:到店自提价
    private double deliveryPriceZoneA; // 原priceB:A类地址配送价
    private double deliveryPriceZoneB; // 原priceC:B类地址配送价

    // getter、setter 省略
}

// 客户专属定价:关联特定客户与对应的专属价格
class CustomerSpecificPricing {
    private String customerId; // 客户唯一标识
    private double customStorePickupPrice;
    private double customDeliveryPriceZoneA;
    private double customDeliveryPriceZoneB;
    private Item targetItem; // 关联对应的商品,也可以用itemId做外键

    // getter、setter 省略
}

使用时的逻辑很清晰:查询商品价格时,先找该客户对应的CustomerSpecificPricing,如果存在就用专属价,否则 fallback 到BasePricing的基础价。

方案2:在商品类中嵌入客户专属定价Map(紧凑版)

如果你的系统暂时不需要太复杂的扩展,只想保持代码紧凑,可以直接在Item类里加一个Map来存储客户专属定价,避免拆分过多类:

class Item {
    private String name;
    // 基础定价
    private double baseStorePickupPrice;
    private double baseDeliveryPriceZoneA;
    private double baseDeliveryPriceZoneB;
    // 存储客户专属定价:key为客户ID,value为该客户的专属定价
    private Map<String, CustomerPricing> customerPricingMap = new HashMap<>();

    // 封装价格获取逻辑,对外提供统一接口
    public double getStorePickupPrice(String customerId) {
        CustomerPricing customPricing = customerPricingMap.get(customerId);
        return customPricing != null ? customPricing.getStorePickupPrice() : baseStorePickupPrice;
    }

    // 同理实现getDeliveryPriceZoneA、getDeliveryPriceZoneB方法
}

// 客户专属定价实体
class CustomerPricing {
    private double storePickupPrice;
    private double deliveryPriceZoneA;
    private double deliveryPriceZoneB;

    // getter、setter 省略
}

这种方式的优势是调用起来非常方便,上层代码只需要通过Item的方法就能直接拿到对应客户的价格,不用额外处理多类关联的逻辑。

额外实用建议
  • 一定要封装好定价优先级逻辑:客户专属价 > 基础价,把这个判断逻辑放在底层(比如Item的价格获取方法里),不要让上层业务代码重复处理
  • 如果未来可能新增更多定价类型(比如限时促销价、会员等级价),建议考虑用策略模式,把不同定价规则做成独立的策略类,扩展性会更强
  • 数据库持久化时,客户专属定价建议单独建一张中间表(比如item_customer_pricing),存储item_id、customer_id和对应的三个专属价格,避免数据冗余

内容的提问来源于stack exchange,提问作者cutecutebj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:33:48