一、模块概述
价格管理模块是生鲜电商系统的核心功能之一,负责处理商品定价、促销活动、价格调整、价格监控等业务逻辑。针对生鲜行业特点,该模块需要支持动态定价、多维度价格策略、价格历史追踪等功能。
二、核心功能设计
1. 基础价格管理
- 商品基准价设置:支持按商品SKU设置基础采购价、销售价、会员价
- 价格有效期管理:可设置价格生效和失效时间
- 价格批量导入:支持Excel模板批量上传价格信息
- 价格审批流程:设置价格变更审批机制,确保合规性
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,
market_price DECIMAL(10,2),
member_price DECIMAL(10,2),
cost_price DECIMAL(10,2),
currency VARCHAR(10) DEFAULT CNY,
status TINYINT DEFAULT 1 COMMENT 1-有效 0-无效,
create_time DATETIME,
update_time DATETIME,
UNIQUE KEY uk_sku (product_sku)
);
-- 价格历史表
CREATE TABLE price_history (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
price_id BIGINT NOT NULL,
old_price DECIMAL(10,2) NOT NULL,
new_price DECIMAL(10,2) NOT NULL,
change_type TINYINT NOT NULL COMMENT 1-手动调整 2-系统自动 3-促销活动,
operator VARCHAR(50),
remark VARCHAR(500),
create_time DATETIME
);
-- 促销活动表
CREATE TABLE promotion (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
promo_name VARCHAR(100) NOT NULL,
promo_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 promo_product (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
promo_id BIGINT NOT NULL,
product_sku VARCHAR(50) NOT NULL,
promo_price DECIMAL(10,2),
discount_rate DECIMAL(5,2),
min_quantity INT DEFAULT 1,
max_quantity INT,
UNIQUE KEY uk_promo_sku (promo_id, product_sku)
);
```
2. 核心服务实现
```java
// 价格服务接口
public interface PriceService {
// 获取商品当前有效价格
ProductPriceVO getCurrentPrice(String sku);
// 批量获取商品价格
Map
batchGetPrices(List skus);
// 创建/更新基础价格
boolean updateBasePrice(PriceUpdateDTO dto);
// 创建促销活动
PromotionVO createPromotion(PromotionCreateDTO dto);
// 获取商品促销价格
PromoPriceVO getPromoPrice(String sku, LocalDateTime now);
// 价格变更历史查询
PageResult queryPriceHistory(PriceHistoryQueryDTO dto);
}
// 价格计算服务实现
@Service
public class PriceCalculator {
@Autowired
private PriceRepository priceRepository;
@Autowired
private PromotionRepository promotionRepository;
/
* 计算商品最终售价
*/
public BigDecimal calculateFinalPrice(String sku, LocalDateTime requestTime,
String memberLevel, Integer quantity) {
// 1. 获取基础价格
ProductPrice price = priceRepository.findValidPriceBySku(sku);
if (price == null) {
throw new BusinessException("商品价格未设置");
}
BigDecimal finalPrice = price.getBasePrice();
// 2. 应用会员价
if (StringUtils.isNotBlank(memberLevel)) {
BigDecimal memberPrice = getMemberPrice(sku, memberLevel);
if (memberPrice != null && memberPrice.compareTo(finalPrice) < 0) {
finalPrice = memberPrice;
}
}
// 3. 检查促销活动
PromoPriceVO promoPrice = getActivePromoPrice(sku, requestTime, quantity);
if (promoPrice != null && promoPrice.getPromoPrice().compareTo(finalPrice) < 0) {
finalPrice = promoPrice.getPromoPrice();
}
return finalPrice;
}
private BigDecimal getMemberPrice(String sku, String memberLevel) {
// 实现会员价获取逻辑
// ...
}
private PromoPriceVO getActivePromoPrice(String sku, LocalDateTime now, Integer quantity) {
// 实现促销价格获取逻辑
// ...
}
}
```
3. 定时任务实现
```java
// 促销活动状态更新任务
@Component
@Scheduled(cron = "0 0/5 * * * ?") // 每5分钟执行一次
public class PromotionStatusUpdateJob {
@Autowired
private PromotionRepository promotionRepository;
public void updatePromotionStatus() {
LocalDateTime now = LocalDateTime.now();
// 更新未开始的活动状态
promotionRepository.updateStatusToPending(
PromotionStatus.NOT_STARTED.getValue(),
PromotionStatus.PENDING.getValue(),
now
);
// 更新已结束的活动状态
promotionRepository.updateStatusToEnded(
PromotionStatus.PENDING.getValue(),
PromotionStatus.ENDED.getValue(),
now
);
}
}
// 价格监控预警任务
@Component
@Scheduled(cron = "0 0 * * * ?") // 每小时执行一次
public class PriceMonitorJob {
@Autowired
private PriceService priceService;
@Autowired
private AlertService alertService;
public void monitorPriceChanges() {
// 获取所有有效商品
List allSkus = priceService.getAllActiveSkus();
// 分批处理
int batchSize = 100;
for (int i = 0; i < allSkus.size(); i += batchSize) {
List batch = allSkus.subList(i, Math.min(i + batchSize, allSkus.size()));
// 获取价格历史数据
List histories = priceService.getRecentPriceHistory(batch);
// 分析价格波动
for (PriceHistoryVO history : histories) {
if (isPriceAbnormal(history)) {
alertService.sendPriceAlert(history);
}
}
}
}
private boolean isPriceAbnormal(PriceHistoryVO history) {
// 实现价格异常判断逻辑
// ...
}
}
```
四、关键业务逻辑实现
1. 价格计算流程
```
1. 用户访问商品详情页/加入购物车
2. 系统获取商品SKU和当前时间
3. 查询商品基础价格
4. 检查是否有有效的会员价
5. 检查是否有适用的促销活动
6. 应用最低的有效价格
7. 返回最终价格给前端
```
2. 促销活动优先级规则
```
1. 限时特价 > 组合促销 > 满减活动 > 会员价 > 基础价
2. 同类型促销按创建时间倒序,新创建的优先
3. 特定商品促销 > 品类促销 > 全场促销
```
3. 价格变更审批流程
```
1. 提交价格变更申请(包含变更原因、新旧价格对比)
2. 系统自动检查价格变动是否在允许范围内
3. 审批人审核(可配置多级审批)
4. 审批通过后,系统自动更新价格并记录历史
5. 审批拒绝则返回修改
```
五、接口设计
1. 内部服务接口
```
// 获取商品最终价格
GET /api/price/final?sku={sku}&memberLevel={level}&quantity={qty}
// 批量获取商品价格
POST /api/price/batch
Content-Type: application/json
{
"skus": ["SKU001", "SKU002"],
"memberLevel": "GOLD"
}
// 创建促销活动
POST /api/promotion
Content-Type: application/json
{
"name": "夏季清凉促销",
"type": 2, // 折扣
"startTime": "2023-07-01T00:00:00",
"endTime": "2023-07-31T23:59:59",
"products": [
{
"sku": "SKU001",
"promoPrice": 19.90,
"minQuantity": 1
}
]
}
```
2. 第三方系统接口
```
// 对接竞品价格API
GET /external/competitor/price?sku={sku}
// 价格变动通知第三方系统
POST /external/price/notify
Content-Type: application/json
{
"sku": "SKU001",
"oldPrice": 29.90,
"newPrice": 25.90,
"effectiveTime": "2023-07-15T00:00:00"
}
```
六、测试要点
1. 基础功能测试:
- 验证各种价格设置和修改功能
- 测试价格有效期功能
- 验证批量导入功能
2. 促销活动测试:
- 测试各种促销类型的正确应用
- 验证促销活动的时间范围控制
- 测试促销活动的优先级规则
3. 价格计算测试:
- 测试会员价与普通价的正确应用
- 验证促销价格与会员价的优先级
- 测试组合促销的计算逻辑
4. 并发测试:
- 模拟高并发下的价格查询和更新
- 验证价格数据的最终一致性
5. 异常场景测试:
- 测试价格缺失时的处理逻辑
- 验证促销活动冲突时的处理
- 测试价格变更审批流程
七、部署与监控
1. 部署方案:
- 价格服务独立部署,确保高可用
- 使用Redis缓存热点商品价格数据
- 数据库分表设计,按商品类别或时间分区
2. 监控指标:
- 价格查询响应时间
- 价格更新成功率
- 促销活动执行率
- 价格异常报警次数
3. 日志记录:
- 完整记录所有价格变更操作
- 记录促销活动创建和修改历史
- 记录价格计算过程中的关键决策点
八、扩展性考虑
1. 支持多市场定价:为不同地区或渠道设置独立价格体系
2. 支持多货币定价:为跨境业务提供多货币支持
3. 价格预测功能:基于历史数据和市场趋势预测未来价格走势
4. AI定价建议:利用机器学习模型提供最优定价建议
通过以上设计,美菜生鲜系统的价格管理模块将能够满足生鲜电商行业复杂的定价需求,支持动态定价策略,确保价格竞争力和利润率的平衡,同时提供完善的价格监控和预警机制。