一、系统概述 小象买菜系统的动态价格展示功能旨在根据市场行情、库存情况、促销活动等因素实时调整商品价格,为用户提供最准确的价格信息,同时支持商家灵活定价策略。 二、核心功能需求 1.实时价格更新:价格能根据预设规则自动或手动调整 2.多维度定价:支持按地区、时间、用户等级
一、系统概述
小象买菜系统的动态价格展示功能旨在根据市场行情、库存情况、促销活动等因素实时调整商品价格,为用户提供最准确的价格信息,同时支持商家灵活定价策略。
二、核心功能需求
1. 实时价格更新:价格能根据预设规则自动或手动调整
2. 多维度定价:支持按地区、时间、用户等级等维度差异化定价
3. 价格历史记录:记录价格变更历史供查询和审计
4. 促销活动集成:与满减、折扣等促销活动无缝衔接
5. 价格缓存机制:平衡实时性与系统性能
三、技术实现方案
1. 数据库设计
```sql
-- 商品基础表
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
base_price DECIMAL(10,2) NOT NULL COMMENT 基础价格,
status TINYINT DEFAULT 1 COMMENT 1-上架 0-下架
);
-- 价格规则表
CREATE TABLE price_rules (
id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
rule_type TINYINT NOT NULL COMMENT 1-地区 2-时间 3-用户等级 4-促销,
rule_value VARCHAR(100) NOT NULL COMMENT 规则值(如地区代码、时间段等),
price DECIMAL(10,2) NOT NULL,
start_time DATETIME,
end_time DATETIME,
priority INT DEFAULT 0 COMMENT 规则优先级,
FOREIGN KEY (product_id) REFERENCES products(id)
);
-- 价格历史表
CREATE TABLE price_history (
id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
old_price DECIMAL(10,2) NOT NULL,
new_price DECIMAL(10,2) NOT NULL,
change_reason VARCHAR(255),
operator VARCHAR(50) COMMENT 操作人(系统或人工),
change_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(id)
);
```
2. 价格计算服务
```java
public class PriceCalculator {
@Autowired
private PriceRuleRepository priceRuleRepository;
/
* 获取商品当前有效价格
* @param productId 商品ID
* @param region 地区
* @param userId 用户ID
* @return 当前有效价格
*/
public BigDecimal getCurrentPrice(Long productId, String region, Long userId) {
// 1. 获取基础价格
Product product = productRepository.findById(productId)
.orElseThrow(() -> new RuntimeException("商品不存在"));
BigDecimal basePrice = product.getBasePrice();
// 2. 查询所有适用规则并按优先级排序
List
applicableRules = priceRuleRepository.findByProductIdAndApplicableConditions(
productId, region, userId, LocalDateTime.now());
applicableRules.sort(Comparator.comparingInt(PriceRule::getPriority).reversed());
// 3. 应用最高优先级规则
if (!applicableRules.isEmpty()) {
return applicableRules.get(0).getPrice();
}
// 4. 返回基础价格
return basePrice;
}
/
* 更新价格并记录历史
*/
public void updatePrice(Long productId, BigDecimal newPrice, String changeReason, String operator) {
Product product = productRepository.findById(productId)
.orElseThrow(() -> new RuntimeException("商品不存在"));
BigDecimal oldPrice = product.getBasePrice();
// 更新基础价格
product.setBasePrice(newPrice);
productRepository.save(product);
// 记录价格变更历史
PriceHistory history = new PriceHistory();
history.setProductId(productId);
history.setOldPrice(oldPrice);
history.setNewPrice(newPrice);
history.setChangeReason(changeReason);
history.setOperator(operator);
priceHistoryRepository.save(history);
}
}
```
3. 缓存策略
```java
@Service
public class CachedPriceService {
@Autowired
private PriceCalculator priceCalculator;
@Autowired
private CacheManager cacheManager;
private static final String PRICE_CACHE_NAME = "productPriceCache";
/
* 获取带缓存的商品价格
*/
public BigDecimal getCachedPrice(Long productId, String region, Long userId) {
Cache cache = cacheManager.getCache(PRICE_CACHE_NAME);
String cacheKey = productId + "_" + region + "_" + userId;
// 尝试从缓存获取
Cache.ValueWrapper valueWrapper = cache.get(cacheKey);
if (valueWrapper != null) {
return (BigDecimal) valueWrapper.get();
}
// 缓存未命中,计算新价格
BigDecimal price = priceCalculator.getCurrentPrice(productId, region, userId);
// 存入缓存,设置5分钟过期
cache.put(cacheKey, price);
return price;
}
/
* 价格变更时清除相关缓存
*/
public void evictPriceCache(Long productId) {
Cache cache = cacheManager.getCache(PRICE_CACHE_NAME);
// 清除该商品所有地区和用户类型的价格缓存
// 实际应用中可根据region和userId精确清除
cache.clear();
}
}
```
4. 前端展示方案
```javascript
// Vue组件示例
¥{{ currentPrice.toFixed(2) }}
¥{{ originalPrice.toFixed(2) }}
{{ priceTrend }}
<script>
export default {
props: {
productId: Number,
region: String,
userId: Number
},
data() {
return {
currentPrice: 0,
originalPrice: null,
priceTrend: null,
pollingInterval: null
}
},
created() {
this.fetchPrice();
// 每30秒刷新一次价格
this.pollingInterval = setInterval(this.fetchPrice, 30000);
},
beforeDestroy() {
clearInterval(this.pollingInterval);
},
methods: {
async fetchPrice() {
try {
const response = await this.$http.get(`/api/products/${this.productId}/price`, {
params: {
region: this.region,
userId: this.userId
}
});
this.currentPrice = response.data.currentPrice;
this.originalPrice = response.data.originalPrice;
this.priceTrend = response.data.trend; // 如"较昨日上涨0.5元"
} catch (error) {
console.error(获取价格失败:, error);
}
}
}
}
```
四、高级功能实现
1. 动态定价算法集成
```java
public class DynamicPricingEngine {
/
* 基于市场数据的动态定价
*/
public BigDecimal calculateDynamicPrice(Product product, MarketData marketData) {
// 示例算法:基础价 * (1 + 供需系数) + 竞争对手价差
double supplyDemandFactor = calculateSupplyDemandFactor(marketData);
double competitorDiff = calculateCompetitorDifference(product, marketData);
return product.getBasePrice()
.multiply(BigDecimal.valueOf(1 + supplyDemandFactor))
.add(BigDecimal.valueOf(competitorDiff))
.setScale(2, RoundingMode.HALF_UP);
}
private double calculateSupplyDemandFactor(MarketData data) {
// 根据库存、销量等计算供需系数
// 示例逻辑,实际应根据业务调整
return (data.getStock() < 100 ? 0.2 : 0) -
(data.getSalesLast24h() > 1000 ? 0.1 : 0);
}
}
```
2. 价格变更通知系统
```java
@Service
public class PriceChangeNotifier {
@Autowired
private UserService userService;
@Autowired
private MessageTemplateRepository templateRepository;
@Async
public void notifyUsersAboutPriceChange(Long productId, BigDecimal oldPrice, BigDecimal newPrice) {
// 获取关注该商品的用户
List interestedUsers = userService.getUsersInterestedInProduct(productId);
// 计算价格变化百分比
BigDecimal changePercent = newPrice.subtract(oldPrice)
.divide(oldPrice, 4, RoundingMode.HALF_UP)
.multiply(BigDecimal.valueOf(100));
// 获取通知模板
MessageTemplate template = templateRepository.findByName("PRICE_CHANGE");
// 发送通知(示例为发送站内信,实际可扩展短信、推送等)
interestedUsers.forEach(user -> {
String messageContent = String.format(
template.getContent(),
productId,
oldPrice,
newPrice,
changePercent.setScale(2, RoundingMode.HALF_UP)
);
// 保存站内信
userService.sendSystemMessage(user.getId(), "价格变动通知", messageContent);
});
}
}
```
五、系统优化建议
1. 价格计算性能优化:
- 对高频访问商品的价格计算结果进行本地缓存
- 使用Redis等分布式缓存存储价格数据
- 对复杂定价规则进行预计算
2. 数据一致性保障:
- 使用数据库事务确保价格变更和历史记录的原子性
- 实现缓存与数据库的最终一致性策略
3. 监控与告警:
- 监控价格计算服务的响应时间和错误率
- 对异常价格变动设置告警阈值
4. AB测试支持:
- 实现多套定价策略并行测试
- 跟踪不同策略对销量和利润的影响
六、部署方案
1. 微服务架构:
- 将价格服务拆分为独立微服务
- 使用服务发现和负载均衡
2. 多区域部署:
- 在主要销售区域部署价格服务节点
- 使用CDN缓存静态价格数据
3. 灾备方案:
- 价格数据多副本存储
- 降级策略:当价格服务不可用时显示最近有效价格
通过以上方案,小象买菜系统可以实现灵活、准确、高效的动态价格展示功能,满足电商业务对价格管理的复杂需求。