一、系统设计目标
1. 实现商品全生命周期管理
2. 记录商品信息变更历史
3. 支持商品版本回溯与对比
4. 提供商品迭代数据分析
二、核心功能模块
1. 商品信息模型设计
```json
{
"product_id": "P1001",
"base_info": {
"name": "有机菠菜",
"category": "叶菜类",
"barcode": "6901234567890",
"unit": "500g"
},
"price_info": {
"original_price": 9.9,
"current_price": 7.9,
"member_price": 6.9,
"price_history": [
{"version": 1, "price": 9.9, "effective_date": "2023-01-01"},
{"version": 2, "price": 8.9, "effective_date": "2023-03-15"},
{"version": 3, "price": 7.9, "effective_date": "2023-06-01"}
]
},
"stock_info": {
"total_stock": 1000,
"available_stock": 850,
"stock_history": [...]
},
"spec_info": {
"specs": ["新鲜度", "产地"],
"spec_values": {
"新鲜度": ["一级", "二级"],
"产地": ["山东", "河北"]
}
},
"status": "online",
"version": 3,
"create_time": "2023-01-01T00:00:00Z",
"update_time": "2023-06-01T08:00:00Z"
}
```
2. 迭代记录存储方案
方案一:版本快照表
```sql
CREATE TABLE product_version_snapshot (
id BIGSERIAL PRIMARY KEY,
product_id VARCHAR(32) NOT NULL,
version INT NOT NULL,
snapshot JSONB NOT NULL,
operator VARCHAR(32),
operation_type VARCHAR(16), -- CREATE/UPDATE/DELETE
change_reason TEXT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```
方案二:变更日志表
```sql
CREATE TABLE product_change_log (
id BIGSERIAL PRIMARY KEY,
product_id VARCHAR(32) NOT NULL,
field_name VARCHAR(64) NOT NULL,
old_value TEXT,
new_value TEXT,
version INT,
operator VARCHAR(32),
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
change_reason TEXT
);
```
3. 迭代记录查询接口
```java
// 获取商品所有版本
List
getProductVersions(String productId);
// 获取两个版本间的差异
Map getVersionDiff(String productId, int version1, int version2);
// 根据时间范围查询变更
List queryChangesByTimeRange(String productId, Date startTime, Date endTime);
// 获取最近N次变更
List getRecentChanges(String productId, int limit);
```
三、实现关键点
1. 版本控制策略
1. 乐观锁控制:在商品主表中添加version字段,更新时校验版本
2. 变更触发:通过AOP或数据库触发器捕获变更
3. 批量操作处理:对批量更新操作进行特殊处理,生成综合变更记录
2. 数据存储优化
1. 冷热数据分离:历史版本数据定期归档到冷存储
2. 增量存储:对于大字段变更只存储差异部分
3. 压缩存储:对JSON快照使用压缩算法减少存储空间
3. 性能考虑
1. 读写分离:迭代记录查询走从库
2. 异步写入:变更日志异步写入,不影响主交易流程
3. 缓存策略:热门商品版本信息缓存
四、典型迭代场景实现
1. 商品价格调整
```java
public void updateProductPrice(String productId, BigDecimal newPrice, String operator) {
// 1. 查询当前商品信息
Product product = productRepository.findById(productId);
// 2. 创建价格变更记录
PriceChangeLog log = new PriceChangeLog(
productId,
product.getPrice(),
newPrice,
operator,
"促销活动调整"
);
// 3. 更新商品价格
product.setPrice(newPrice);
product.setVersion(product.getVersion() + 1);
productRepository.save(product);
// 4. 保存变更日志
changeLogRepository.save(log);
// 5. 创建版本快照(异步)
asyncService.createVersionSnapshot(productId);
}
```
2. 商品规格变更
```java
public void updateProductSpecs(String productId, List newSpecs, String operator) {
// 1. 获取当前规格
Product product = productRepository.findById(productId);
List oldSpecs = product.getSpecs();
// 2. 计算差异
List changes = specDiffService.diffSpecs(oldSpecs, newSpecs);
// 3. 更新商品规格
product.setSpecs(newSpecs);
product.setVersion(product.getVersion() + 1);
productRepository.save(product);
// 4. 记录规格变更
for (SpecChange change : changes) {
specChangeLogRepository.save(new SpecChangeLog(
productId,
change.getSpecName(),
change.getOldValue(),
change.getNewValue(),
operator
));
}
}
```
五、可视化与数据分析
1. 迭代看板
1. 商品迭代频率统计
2. 常见变更字段分析
3. 变更操作员活跃度
4. 变更原因分布
2. 版本对比工具
```javascript
// 前端版本对比实现
function compareVersions(version1, version2) {
const diffFields = [];
for (const field in version1) {
if (JSON.stringify(version1[field]) !== JSON.stringify(version2[field])) {
diffFields.push({
field: field,
oldValue: version1[field],
newValue: version2[field]
});
}
}
return diffFields;
}
```
六、运维与监控
1. 变更审计:记录所有变更操作及操作人
2. 异常告警:监控异常频繁的商品变更
3. 数据校验:定期校验版本快照与当前数据的一致性
4. 备份恢复:提供基于版本的商品数据恢复能力
七、扩展考虑
1. 多端同步:支持APP、小程序、H5等多端商品信息同步变更
2. 灰度发布:支持商品信息的灰度变更与回滚
3. AB测试:记录不同版本商品对销售的影响
4. 国际化:支持多语言商品信息的版本管理
通过以上方案,美团买菜系统可以实现完善的商品迭代记录管理,为商品运营提供有力的数据支持和操作追溯能力。