一、模块概述
价格管理模块是生鲜电商系统的核心功能之一,负责管理商品价格策略、促销活动、价格计算和展示等业务逻辑。针对生鲜行业特点,该模块需支持多维度价格体系、动态调价、促销活动管理等功能。
二、核心功能设计
1. 基础价格管理
- 商品基础价格:设置商品的标准售价、进货价、成本价
- 多规格价格:支持同一商品不同规格(如不同重量、包装)的差异化定价
- 区域价格:根据不同配送区域设置差异化价格
- 价格有效期:支持价格生效和失效时间设置
2. 动态调价机制
- 时间维度调价:按时间段自动调整价格(如早晚市不同价)
- 库存维度调价:根据库存量自动调整价格(如清仓促销)
- 市场行情调价:对接市场价格指数自动调整参考价
- 手动调价:管理员手动调整价格的审批流程
3. 促销活动管理
- 满减活动:满X元减Y元
- 折扣活动:按比例或固定金额折扣
- 买赠活动:买A送B
- 第二件半价:多件优惠组合
- 限时秒杀:特定时间段超低折扣
- 会员专享价:不同会员等级差异化定价
4. 价格计算引擎
- 最终价格计算:综合考虑基础价、促销价、会员价等
- 运费计算:根据配送区域和重量计算运费
- 税费计算:自动计算增值税等税费
- 组合优惠计算:多商品组合购买的优惠计算
三、技术实现方案
1. 数据库设计
```sql
-- 商品价格表
CREATE TABLE product_price (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
sku_id BIGINT,
region_id BIGINT,
base_price DECIMAL(10,2) NOT NULL,
cost_price DECIMAL(10,2),
market_price DECIMAL(10,2),
status TINYINT DEFAULT 1 COMMENT 1-有效 0-无效,
create_time DATETIME,
update_time DATETIME,
UNIQUE KEY uk_product_region_sku (product_id, region_id, sku_id)
);
-- 促销活动表
CREATE TABLE promotion (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
type TINYINT NOT NULL COMMENT 1-满减 2-折扣 3-买赠 4-秒杀,
start_time DATETIME NOT NULL,
end_time DATETIME NOT NULL,
status TINYINT DEFAULT 0 COMMENT 0-未开始 1-进行中 2-已结束,
create_time DATETIME,
update_time DATETIME
);
-- 促销规则表
CREATE TABLE promotion_rule (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
promotion_id BIGINT NOT NULL,
rule_type TINYINT NOT NULL COMMENT 1-商品级 2-品类级 3-全店级,
rule_value TEXT COMMENT JSON格式规则,
discount_value DECIMAL(10,2) COMMENT 折扣值或减免金额,
min_amount DECIMAL(10,2) COMMENT 满减门槛金额,
max_discount DECIMAL(10,2) COMMENT 最大优惠金额,
limit_count INT COMMENT 限购数量,
FOREIGN KEY (promotion_id) REFERENCES promotion(id)
);
```
2. 核心类设计
```java
// 价格服务接口
public interface PriceService {
// 获取商品最终价格
PriceDTO getFinalPrice(Long productId, Long skuId, Long regionId, Long userId);
// 创建促销活动
boolean createPromotion(PromotionDTO promotion);
// 更新商品价格
boolean updateProductPrice(PriceUpdateDTO updateDTO);
// 计算购物车总价
CartPriceResult calculateCartPrice(List
cartItems, Long userId);
}
// 价格计算上下文
public class PriceCalculationContext {
private Product product;
private Sku sku;
private Region region;
private User user;
private List promotions;
// 其他上下文信息...
}
// 价格计算策略接口
public interface PriceCalculationStrategy {
PriceResult calculate(PriceCalculationContext context);
}
// 具体策略实现
public class NormalPriceStrategy implements PriceCalculationStrategy {
@Override
public PriceResult calculate(PriceCalculationContext context) {
// 常规价格计算逻辑
}
}
public class PromotionPriceStrategy implements PriceCalculationStrategy {
@Override
public PriceResult calculate(PriceCalculationContext context) {
// 促销价格计算逻辑
}
}
```
3. 价格计算流程
1. 初始化上下文:加载商品、SKU、区域、用户等信息
2. 加载适用促销:查询当前有效的促销活动
3. 策略选择:根据业务规则选择价格计算策略
4. 执行计算:调用选定的策略进行价格计算
5. 结果合并:合并基础价、促销价、运费等计算最终价格
6. 返回结果:返回包含各项价格明细的结果对象
四、关键业务逻辑实现
1. 促销活动匹配逻辑
```java
public List findApplicablePromotions(PriceCalculationContext context) {
// 1. 查询所有有效促销
List allPromotions = promotionRepository.findValidPromotions();
// 2. 过滤符合条件的促销
List applicable = allPromotions.stream()
.filter(p -> {
// 检查时间范围
if (LocalDateTime.now().isBefore(p.getStartTime()) ||
LocalDateTime.now().isAfter(p.getEndTime())) {
return false;
}
// 检查商品范围
boolean containsProduct = promotionRuleService.checkProductInPromotion(
p.getId(), context.getProductId(), context.getSkuId());
if (!containsProduct) {
return false;
}
// 检查用户范围(如会员等级)
if (p.getUserLevelLimit() != null &&
context.getUserLevel() < p.getUserLevelLimit()) {
return false;
}
return true;
})
.collect(Collectors.toList());
return applicable;
}
```
2. 价格计算引擎实现
```java
public class PriceCalculator {
private Map strategies;
public PriceCalculator() {
strategies = new HashMap<>();
strategies.put("normal", new NormalPriceStrategy());
strategies.put("promotion", new PromotionPriceStrategy());
// 添加更多策略...
}
public PriceResult calculate(PriceCalculationContext context) {
// 1. 确定使用哪种策略
String strategyKey = determineStrategy(context);
// 2. 执行计算
PriceCalculationStrategy strategy = strategies.get(strategyKey);
return strategy.calculate(context);
}
private String determineStrategy(PriceCalculationContext context) {
// 检查是否有适用促销
boolean hasPromotion = promotionService.hasApplicablePromotion(context);
if (hasPromotion) {
return "promotion";
} else {
return "normal";
}
}
}
```
五、系统优化考虑
1. 缓存策略:
- 商品基础价格缓存(Redis)
- 促销活动缓存
- 区域价格映射缓存
2. 并发控制:
- 价格修改使用乐观锁或分布式锁
- 促销活动修改使用版本控制
3. 性能优化:
- 价格计算结果缓存
- 异步计算复杂价格场景
- 预计算常用组合价格
4. 数据一致性:
- 最终一致性设计
- 补偿机制处理价格更新失败情况
六、测试用例设计
1. 基础价格测试:
- 验证不同区域显示正确价格
- 验证不同规格商品显示正确价格
- 验证价格有效期控制
2. 促销活动测试:
- 验证满减活动正确计算
- 验证折扣活动正确应用
- 验证多促销叠加时的优先级处理
3. 边界条件测试:
- 促销活动开始/结束时间边界
- 库存为0时的价格显示
- 极值价格测试(0元、负数价格处理)
4. 并发测试:
- 多个用户同时修改价格
- 高并发场景下的价格计算性能
七、部署与监控
1. 部署方案:
- 价格服务独立部署,与商品服务解耦
- 使用容器化部署(Docker + Kubernetes)
2. 监控指标:
- 价格计算响应时间
- 促销活动查询次数
- 价格修改频率
- 缓存命中率
3. 告警机制:
- 价格计算超时告警
- 价格不一致告警
- 促销活动异常告警
通过以上设计,美菜生鲜系统的价格管理模块能够实现灵活的价格策略管理、高效的促销活动支持,同时保证系统的高可用性和性能。