一、模块概述
价格管理模块是生鲜电商系统的核心功能之一,负责处理商品定价、促销活动、价格策略执行等业务逻辑。针对生鲜行业特点,该模块需支持动态定价、多维度价格体系、促销活动管理等功能。
二、核心功能设计
1. 基础价格管理
- 商品基准价设置:支持按商品SKU设置基准价格
- 多级价格体系:
- 会员价(普通会员/VIP会员等)
- 渠道价(线上/线下/批发)
- 区域价(不同配送区域差异化定价)
- 批量采购价(阶梯定价)
2. 动态定价引擎
- 成本加成定价:基于采购成本+毛利率自动计算
- 市场竞价:对接第三方价格数据实现竞品比价
- 智能调价:
- 根据库存周转率自动调整
- 根据保质期剩余天数动态降价
- 销售高峰期/低谷期自动调价
3. 促销活动管理
- 促销类型支持:
- 满减/满折
- 限时特价
- 买赠活动
- 第二件半价
- 新人专享价
- 活动规则配置:
- 适用商品范围
- 适用用户群体
- 活动时间范围
- 限购数量
4. 价格计算服务
- 实时价格计算:根据用户身份、购买数量、活动规则等实时计算最终价格
- 价格快照:订单生成时记录商品价格快照,防止后续价格变动影响订单
- 价格追溯:支持查看商品历史价格变动记录
三、技术实现方案
1. 数据库设计
```sql
-- 商品价格表
CREATE TABLE product_price (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_sku VARCHAR(50) NOT NULL,
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_sku (product_sku)
);
-- 区域价格表
CREATE TABLE region_price (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_sku VARCHAR(50) NOT NULL,
region_code VARCHAR(20) NOT NULL,
region_price DECIMAL(10,2) NOT NULL,
status TINYINT DEFAULT 1,
create_time DATETIME,
update_time DATETIME,
UNIQUE KEY uk_sku_region (product_sku, region_code)
);
-- 促销活动表
CREATE TABLE promotion (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
promo_name VARCHAR(100) NOT NULL,
promo_type TINYINT NOT NULL COMMENT 1-满减 2-折扣 3-特价,
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,
promo_id BIGINT NOT NULL,
rule_type TINYINT NOT NULL COMMENT 1-商品范围 2-用户范围,
rule_value TEXT COMMENT JSON格式规则,
create_time DATETIME,
FOREIGN KEY (promo_id) REFERENCES promotion(id)
);
-- 促销商品关联表
CREATE TABLE promo_product_rel (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
promo_id BIGINT NOT NULL,
product_sku VARCHAR(50) NOT NULL,
promo_price DECIMAL(10,2),
min_quantity INT DEFAULT 1,
max_quantity INT,
FOREIGN KEY (promo_id) REFERENCES promotion(id)
);
```
2. 核心服务实现
```java
// 价格计算服务接口
public interface PriceCalculationService {
/
* 计算商品最终价格
* @param sku 商品SKU
* @param quantity 购买数量
* @param userId 用户ID
* @param regionCode 区域编码
* @return 价格计算结果
*/
PriceCalculationResult calculatePrice(String sku, int quantity,
Long userId, String regionCode);
/
* 获取商品当前有效价格
* @param sku 商品SKU
* @param regionCode 区域编码
* @return 商品价格信息
*/
ProductPriceInfo getEffectivePrice(String sku, String regionCode);
}
// 价格计算结果
@Data
public class PriceCalculationResult {
private String sku;
private BigDecimal finalPrice;
private BigDecimal originalPrice;
private BigDecimal discountAmount;
private String promoInfo; // 促销信息
private boolean isPromo; // 是否促销价
}
// 价格计算服务实现
@Service
public class PriceCalculationServiceImpl implements PriceCalculationService {
@Autowired
private ProductPriceMapper productPriceMapper;
@Autowired
private RegionPriceMapper regionPriceMapper;
@Autowired
private PromotionService promotionService;
@Override
public PriceCalculationResult calculatePrice(String sku, int quantity,
Long userId, String regionCode) {
// 1. 获取基础价格
ProductPrice basePrice = productPriceMapper.selectBySku(sku);
// 2. 获取区域价格(如果有)
RegionPrice regionPrice = regionPriceMapper.selectBySkuAndRegion(sku, regionCode);
BigDecimal currentPrice = regionPrice != null ? regionPrice.getRegionPrice()
: basePrice.getBasePrice();
// 3. 检查适用促销活动
List
activePromos = promotionService.getActivePromos(sku,
userId, regionCode, LocalDateTime.now());
// 4. 应用最优促销(如果有)
Optional bestPromo = findBestPromo(activePromos, currentPrice, quantity);
PriceCalculationResult result = new PriceCalculationResult();
result.setSku(sku);
result.setOriginalPrice(currentPrice);
if (bestPromo.isPresent()) {
Promotion promo = bestPromo.get();
// 根据促销类型计算最终价格
BigDecimal promoPrice = calculatePromoPrice(promo, currentPrice, quantity);
result.setFinalPrice(promoPrice);
result.setDiscountAmount(currentPrice.subtract(promoPrice));
result.setPromoInfo(promo.getPromoName());
result.setIsPromo(true);
} else {
result.setFinalPrice(currentPrice);
result.setIsPromo(false);
}
return result;
}
private Optional findBestPromo(List promos,
BigDecimal currentPrice, int quantity) {
// 实现促销活动优先级判断逻辑
// 返回最优促销活动
// ...
}
private BigDecimal calculatePromoPrice(Promotion promo, BigDecimal basePrice,
int quantity) {
// 根据促销类型计算价格
// ...
}
}
```
3. 动态定价实现
```java
// 动态定价服务
@Service
public class DynamicPricingService {
@Autowired
private ProductPriceMapper productPriceMapper;
@Autowired
private InventoryService inventoryService;
@Autowired
private MarketPriceService marketPriceService;
@Scheduled(cron = "0 0 */6 * * ?") // 每6小时执行一次
public void adjustPricesBasedOnInventory() {
List inventories = inventoryService.getLowStockProducts();
for (ProductInventory inventory : inventories) {
ProductPrice price = productPriceMapper.selectBySku(inventory.getSku());
if (price != null) {
// 根据库存周转率调整价格
BigDecimal newPrice = adjustPriceByTurnover(price.getBasePrice(),
inventory.getTurnoverRate());
// 更新价格
productPriceMapper.updatePrice(inventory.getSku(), newPrice);
}
}
}
@Scheduled(cron = "0 0 8 * * ?") // 每天8点执行
public void adjustPricesBasedOnMarket() {
List prices = productPriceMapper.selectAll();
for (ProductPrice price : prices) {
MarketPriceData marketData = marketPriceService.getMarketPrice(price.getProductSku());
if (marketData != null) {
// 根据市场价格调整
BigDecimal newPrice = adjustPriceByMarket(price.getBasePrice(),
marketData.getCompetitorPrice());
productPriceMapper.updatePrice(price.getProductSku(), newPrice);
}
}
}
private BigDecimal adjustPriceByTurnover(BigDecimal basePrice, double turnoverRate) {
// 实现基于库存周转率的调价逻辑
// ...
}
private BigDecimal adjustPriceByMarket(BigDecimal basePrice, BigDecimal competitorPrice) {
// 实现基于市场价格的调价逻辑
// ...
}
}
```
四、关键业务逻辑实现
1. 价格计算流程
1. 获取商品基准价
2. 检查是否有区域价格覆盖
3. 检查用户会员等级是否有专属价格
4. 检查是否有适用的促销活动
5. 应用最优促销规则计算最终价格
6. 考虑批量购买折扣
7. 返回最终价格及促销信息
2. 促销活动优先级规则
1. 限时特价 > 会员专享价 > 满减活动 > 普通折扣
2. 相同类型促销按创建时间倒序(新活动优先)
3. 专属促销(如新人专享)优先于普通促销
3. 价格变动处理
- 订单生成时记录价格快照
- 支持价格变动历史查询
- 价格变动预警(如成本价变动超过阈值)
五、系统集成考虑
1. 与库存系统集成:价格调整需考虑库存状态
2. 与会员系统集成:获取用户会员等级信息
3. 与订单系统集成:订单价格锁定机制
4. 与财务系统集成:价格变动对利润的影响分析
5. 与数据分析系统集成:价格弹性分析、促销效果评估
六、性能优化方案
1. 缓存策略:
- 热点商品价格缓存(Redis)
- 促销活动规则缓存
- 多级缓存(本地缓存+分布式缓存)
2. 异步处理:
- 价格变动通知异步发送
- 批量价格更新异步处理
3. 数据库优化:
- 价格表按SKU分区
- 促销活动表按时间范围分区
- 读写分离架构
4. 计算优化:
- 促销规则预编译
- 价格计算结果复用
七、测试用例示例
1. 基础价格测试:
- 验证不同区域价格是否正确应用
- 验证会员价格是否正确应用
2. 促销活动测试:
- 验证满减活动计算是否正确
- 验证限时特价是否在有效期内
- 验证多个促销叠加时的优先级
3. 动态定价测试:
- 验证库存不足时价格是否自动上调
- 验证保质期临近时价格是否自动下调
4. 并发测试:
- 高并发场景下价格计算是否准确
- 价格变动时订单锁价是否正确
八、部署与监控
1. 部署方案:
- 价格服务独立部署,可横向扩展
- 促销规则引擎单独部署
2. 监控指标:
- 价格计算响应时间
- 促销活动匹配率
- 价格变动频率
- 缓存命中率
3. 告警机制:
- 价格计算超时告警
- 促销活动配置错误告警
- 价格异常波动告警
通过以上方案实现,美菜生鲜系统的价格管理模块将能够支持复杂的生鲜定价场景,满足动态定价、多维度价格体系和灵活促销活动的业务需求。