一、模块概述
价格管理模块是生鲜电商系统的核心功能之一,负责处理商品价格的定义、调整、展示和策略执行。针对生鲜行业特点,该模块需支持多维度定价、动态调价、促销策略等功能。
二、核心功能设计
1. 价格体系设计
- 基础价格:商品的标准售价
- 会员价格:不同会员等级的差异化价格
- 渠道价格:不同销售渠道(APP/小程序/PC)的定价
- 区域价格:不同配送区域的定价策略
- 时效价格:分时段定价(如早市/晚市不同价)
2. 价格计算引擎
```java
public class PriceCalculator {
public BigDecimal calculateFinalPrice(
Item item,
User user,
Channel channel,
Location location,
DateTime orderTime) {
// 1. 获取基础价格
BigDecimal basePrice = item.getBasePrice();
// 2. 应用会员折扣
BigDecimal memberDiscount = applyMemberDiscount(user, basePrice);
// 3. 应用渠道加价/减价
BigDecimal channelPrice = applyChannelPrice(channel, memberDiscount);
// 4. 应用区域定价
BigDecimal regionalPrice = applyRegionalPrice(location, channelPrice);
// 5. 应用时效定价
BigDecimal finalPrice = applyTimeBasedPrice(orderTime, regionalPrice);
return finalPrice;
}
// 其他辅助方法...
}
```
3. 动态调价机制
- 定时调价:支持按预设时间自动调整价格
- 库存触发调价:当库存低于阈值时自动提价
- 竞品对标调价:根据竞品价格自动调整
- 手动调价:运营人员即时调整价格
4. 促销策略管理
- 满减活动:满X元减Y元
- 折扣活动:X折优惠
- 买赠活动:买X送Y
- 第二件半价:多件优惠组合
- 限时秒杀:特定时段超低价
三、数据库设计
核心表结构
```sql
-- 商品基础表
CREATE TABLE item (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
base_price DECIMAL(10,2),
cost_price DECIMAL(10,2),
status TINYINT,
create_time DATETIME,
update_time DATETIME
);
-- 价格策略表
CREATE TABLE price_strategy (
id BIGINT PRIMARY KEY,
item_id BIGINT,
strategy_type TINYINT, -- 1:会员价 2:渠道价 3:区域价 4:时效价
priority INT, -- 策略优先级
start_time DATETIME,
end_time DATETIME,
condition_json TEXT, -- 策略条件JSON
adjustment_json TEXT, -- 调整规则JSON
status TINYINT,
create_time DATETIME,
update_time DATETIME
);
-- 促销活动表
CREATE TABLE promotion (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
promo_type TINYINT, -- 1:满减 2:折扣 3:买赠 4:秒杀
start_time DATETIME,
end_time DATETIME,
status TINYINT,
create_time DATETIME,
update_time DATETIME
);
-- 促销商品关联表
CREATE TABLE promotion_item (
id BIGINT PRIMARY KEY,
promotion_id BIGINT,
item_id BIGINT,
promo_price DECIMAL(10,2),
quota INT, -- 限购数量
remaining_quota INT, -- 剩余名额
create_time DATETIME,
update_time DATETIME
);
```
四、关键实现技术
1. 价格计算缓存策略
```java
@Cacheable(value = "priceCache", key = " itemId + _ + userId + _ + channel + _ + locationCode + _ + orderTime.toString()")
public BigDecimal getCachedPrice(Long itemId, Long userId, String channel,
String locationCode, DateTime orderTime) {
// 实际价格计算逻辑
return calculateFinalPrice(...);
}
```
2. 价格变更历史追踪
```java
@Aspect
@Component
public class PriceChangeAspect {
@AfterReturning(
pointcut = "execution(* com.meicai.price.service.PriceService.updatePrice(..))",
returning = "result")
public void afterPriceChange(JoinPoint joinPoint, Object result) {
// 获取价格变更前后的值
Object[] args = joinPoint.getArgs();
// 记录价格变更日志
priceChangeLogger.log((PriceChangeDTO)args[0]);
}
}
```
3. 价格规则引擎实现
```java
public class PriceRuleEngine {
private List
rules;
public void loadRules() {
// 从数据库加载所有价格规则
rules = priceRuleRepository.findAllActiveRules();
}
public BigDecimal applyRules(PriceContext context) {
// 按优先级排序规则
rules.stream()
.sorted(Comparator.comparingInt(PriceRule::getPriority))
.forEach(rule -> {
if (rule.match(context)) {
context.setPrice(rule.apply(context.getPrice()));
}
});
return context.getPrice();
}
}
```
五、生鲜行业特殊处理
1. 损耗率定价:根据商品损耗率自动调整售价
```java
public BigDecimal adjustForSpoilage(Item item, BigDecimal basePrice) {
double spoilageRate = item.getSpoilageRate(); // 损耗率
double markupFactor = 1 / (1 - spoilageRate);
return basePrice.multiply(BigDecimal.valueOf(markupFactor));
}
```
2. 季节性定价:根据季节自动调整价格
```java
public BigDecimal adjustForSeason(Item item, BigDecimal basePrice) {
LocalDate now = LocalDate.now();
Season season = SeasonDetector.detect(now);
return basePrice.multiply(item.getSeasonalFactors().get(season));
}
```
3. 品质分级定价:不同品质等级不同价格
```java
public BigDecimal getPriceByGrade(Item item, QualityGrade grade) {
return item.getPriceByGrade().getOrDefault(grade, item.getBasePrice());
}
```
六、系统集成与接口
1. 价格查询API
```
GET /api/price?itemId=123&userId=456&channel=APP&location=110101
响应:
{
"itemId": 123,
"basePrice": 29.9,
"memberPrice": 26.9,
"channelPrice": 28.9,
"regionalPrice": 27.9,
"finalPrice": 25.9,
"promotions": [
{
"id": 1,
"name": "限时折扣",
"discount": 0.9
}
]
}
```
2. 价格变更事件推送
```java
@TransactionalEventListener
public void handlePriceChangeEvent(PriceChangeEvent event) {
// 通知相关系统(库存、订单、营销等)价格已变更
priceChangeNotifier.notify(event);
}
```
七、测试与验证
1. 单元测试用例
```java
@Test
public void testMemberPriceCalculation() {
Item item = new Item(1L, "苹果", BigDecimal.valueOf(10.0));
User user = new User(1L, MemberLevel.GOLD);
BigDecimal price = priceCalculator.calculateFinalPrice(item, user, Channel.APP,
new Location("110101"), DateTime.now());
assertEquals(BigDecimal.valueOf(8.5), price); // 假设金卡会员85折
}
```
2. 压力测试场景
- 模拟1000并发用户查询不同商品价格
- 测试促销活动开始/结束时的价格切换
- 验证库存变化触发的价格调整
八、部署与监控
1. 价格服务监控指标
- 价格计算响应时间(P99 < 200ms)
- 价格缓存命中率(>95%)
- 价格变更通知延迟(<1s)
2. 告警规则
- 连续5分钟价格计算错误率>1%
- 价格缓存雪崩事件
- 促销活动价格未正确生效
九、优化方向
1. 性能优化
- 引入Redis作为价格计算的一级缓存
- 对高频查询商品实施本地缓存
- 实现价格计算的异步批处理
2. 功能扩展
- 支持AI预测的动态定价
- 增加竞争对手价格监控功能
- 实现更复杂的组合定价策略
3. 用户体验
- 价格变动历史记录展示
- 价格预警功能(如价格即将上涨/下跌)
- 多维度价格对比工具
该价格管理模块设计充分考虑了生鲜行业的特殊性,通过灵活的规则引擎和高效的计算架构,能够满足美菜生鲜业务复杂多变的价格管理需求。