一、模块概述
价格管理模块是生鲜电商系统的核心功能之一,负责处理商品定价、促销活动、价格策略、成本核算等业务逻辑。对于美菜这样的生鲜B2B平台,价格管理需要支持多层级价格体系、动态调价、区域定价等复杂场景。
二、核心功能设计
1. 基础价格管理
- 商品基础定价:支持单品定价、批量定价、按规格定价
- 价格有效期:设置价格生效和失效时间
- 价格单位:支持按重量(kg/g)、按件、按箱等不同计量单位
- 成本价管理:记录采购成本、运输成本、损耗成本等
2. 动态定价策略
- 市场价跟踪:自动抓取竞品价格进行比对
- 智能调价引擎:
- 基于库存水平的自动调价
- 基于销售速度的动态调价
- 基于时间段的时段定价(如早晚市不同价)
- 季节性调价:支持按季节设置价格浮动规则
3. 促销管理
- 促销活动类型:
- 满减活动
- 折扣活动
- 买赠活动
- 第二件半价等组合促销
- 促销规则引擎:支持复杂条件组合(如特定商品、特定客户、特定时间段)
- 促销优先级:设置多个促销活动的叠加规则
4. 客户定价体系
- 客户分级定价:为不同等级客户设置不同价格
- 合同价管理:支持大客户长期合同价格
- 区域定价:按配送区域设置差异化价格
- 批量采购价:根据采购量设置阶梯价格
5. 价格监控与预警
- 价格波动监控:实时监控市场价格变化
- 异常价格预警:当价格偏离成本或市场价时预警
- 价格审批流程:重要价格变动需审批
三、技术实现方案
1. 数据库设计
```sql
-- 商品价格表
CREATE TABLE product_price (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
price_type TINYINT NOT NULL COMMENT 1-基础价,2-促销价,3-会员价,
price DECIMAL(10,2) NOT NULL,
cost_price DECIMAL(10,2) NOT NULL,
market_price DECIMAL(10,2),
start_time DATETIME,
end_time DATETIME,
region_id BIGINT COMMENT 区域ID,
customer_level_id INT COMMENT 客户等级ID,
min_order_quantity INT COMMENT 最小起订量,
status TINYINT DEFAULT 1 COMMENT 1-有效,0-无效,
create_time DATETIME,
update_time DATETIME,
INDEX idx_product (product_id),
INDEX idx_time (start_time, end_time)
);
-- 促销活动表
CREATE TABLE promotion (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
type TINYINT NOT NULL COMMENT 1-满减,2-折扣,3-买赠,
start_time DATETIME NOT NULL,
end_time DATETIME NOT NULL,
status TINYINT DEFAULT 1 COMMENT 1-进行中,0-已结束,
create_time DATETIME,
update_time DATETIME
);
-- 促销规则表
CREATE TABLE promotion_rule (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
promotion_id BIGINT NOT NULL,
product_id BIGINT,
category_id BIGINT COMMENT 分类ID,为空表示全部分类,
condition_type TINYINT COMMENT 1-金额条件,2-数量条件,
condition_value DECIMAL(10,2),
discount_type TINYINT COMMENT 1-金额减免,2-百分比折扣,
discount_value DECIMAL(10,2),
max_discount DECIMAL(10,2) COMMENT 最大优惠金额,
priority INT COMMENT 规则优先级,
FOREIGN KEY (promotion_id) REFERENCES promotion(id)
);
```
2. 核心服务实现
```java
// 价格计算服务接口
public interface PriceCalculationService {
/
* 获取商品最终价格
* @param productId 商品ID
* @param customerId 客户ID
* @param regionId 区域ID
* @param quantity 购买数量
* @param isPromotion 是否参与促销
* @return 价格计算结果
*/
PriceCalculationResult calculatePrice(Long productId, Long customerId,
Long regionId, Integer quantity,
boolean isPromotion);
/
* 创建促销活动
*/
PromotionResult createPromotion(PromotionCreateRequest request);
/
* 更新商品基础价格
*/
boolean updateBasePrice(PriceUpdateRequest request);
}
// 价格计算服务实现
@Service
public class PriceCalculationServiceImpl implements PriceCalculationService {
@Autowired
private ProductPriceRepository productPriceRepository;
@Autowired
private PromotionRuleRepository promotionRuleRepository;
@Autowired
private CustomerLevelService customerLevelService;
@Override
public PriceCalculationResult calculatePrice(Long productId, Long customerId,
Long regionId, Integer quantity,
boolean isPromotion) {
// 1. 获取基础价格
ProductPrice basePrice = productPriceRepository.findActivePrice(productId, regionId);
// 2. 获取客户等级折扣
CustomerLevel level = customerLevelService.getLevel(customerId);
BigDecimal customerDiscount = level.getDiscount();
// 3. 计算客户价
BigDecimal customerPrice = basePrice.getPrice().multiply(customerDiscount);
// 4. 应用促销规则(如果启用)
if (isPromotion) {
List
applicableRules = promotionRuleRepository.findApplicableRules(
productId, regionId, LocalDateTime.now());
// 按优先级应用促销规则
for (PromotionRule rule : applicableRules) {
if (rule.matchesCondition(quantity)) {
customerPrice = applyPromotionRule(customerPrice, rule);
break; // 通常只应用一个最高优先级促销
}
}
}
return new PriceCalculationResult(
basePrice.getPrice(),
customerPrice,
applicablePromotionRules
);
}
private BigDecimal applyPromotionRule(BigDecimal price, PromotionRule rule) {
switch (rule.getDiscountType()) {
case AMOUNT_DISCOUNT:
return price.subtract(rule.getDiscountValue());
case PERCENTAGE_DISCOUNT:
return price.multiply(BigDecimal.ONE.subtract(rule.getDiscountValue()));
default:
return price;
}
}
}
```
3. 动态调价算法实现
```java
public class DynamicPricingEngine {
// 基于库存水平的调价
public BigDecimal adjustPriceByInventory(BigDecimal basePrice, Integer currentInventory,
Integer minInventory, Integer maxInventory) {
if (currentInventory <= minInventory) {
// 库存过低,适当提高价格
return basePrice.multiply(BigDecimal.ONE.add(new BigDecimal("0.1"))); // 涨价10%
} else if (currentInventory >= maxInventory) {
// 库存过高,适当降低价格
return basePrice.multiply(BigDecimal.ONE.subtract(new BigDecimal("0.05"))); // 降价5%
}
return basePrice;
}
// 基于市场竞争的调价
public BigDecimal adjustPriceByMarket(BigDecimal basePrice, BigDecimal competitorPrice,
BigDecimal marketAverage) {
if (competitorPrice.compareTo(basePrice) < 0) {
// 竞争对手价格更低,需要调整
BigDecimal difference = basePrice.subtract(competitorPrice);
BigDecimal adjustment = difference.multiply(new BigDecimal("0.7")); // 调整70%的差价
return basePrice.subtract(adjustment);
}
return basePrice;
}
// 基于时间段的调价(如早晚市)
public BigDecimal adjustPriceByTime(BigDecimal basePrice, LocalTime currentTime,
LocalTime morningStart, LocalTime morningEnd) {
if (currentTime.isAfter(morningStart) && currentTime.isBefore(morningEnd)) {
return basePrice.multiply(new BigDecimal("0.9")); // 早市9折
}
return basePrice;
}
}
```
四、系统集成与扩展
1. 与其他模块集成
- 采购模块:获取最新采购成本用于定价
- 库存模块:根据库存水平触发动态调价
- 销售模块:应用计算后的价格生成订单
- 财务模块:记录价格变动历史用于成本核算
2. 扩展功能
- 价格预测:基于历史数据和机器学习预测未来价格走势
- 价格对比:与市场竞品价格进行可视化对比
- 价格策略模拟:模拟不同定价策略对销售和利润的影响
- 多货币支持:支持不同地区的货币定价
五、实施建议
1. 分阶段实施:
- 第一阶段:实现基础定价和简单促销
- 第二阶段:添加动态调价和复杂促销规则
- 第三阶段:实现智能定价策略和预测功能
2. 性能优化:
- 对价格查询使用缓存(如Redis)
- 对促销规则使用规则引擎(如Drools)
- 对批量调价操作使用异步处理
3. 数据安全:
- 价格变动记录完整审计日志
- 敏感价格操作需要二次验证
- 定期备份价格数据
4. 测试策略:
- 单元测试覆盖所有定价计算逻辑
- 集成测试验证模块间交互
- 性能测试确保高峰期定价响应速度
该价格管理模块设计可满足生鲜电商复杂多变的定价需求,同时保持系统扩展性和性能。实际开发中应根据美菜具体业务需求进行调整和优化。