一、系统目标
实现叮咚买菜平台商品信息的完整迭代记录功能,包括商品上架、下架、修改、价格调整等全生命周期的跟踪,为运营决策提供数据支持。
二、核心功能设计
1. 商品版本控制模块
- 版本号管理:为每个商品分配唯一版本号(如V1.0, V1.1等)
- 变更类型标识:
- 新增商品
- 价格调整
- 规格修改
- 描述更新
- 库存变更
- 下架/删除
2. 变更记录存储
```sql
CREATE TABLE product_version_history (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id VARCHAR(32) NOT NULL COMMENT 商品ID,
version VARCHAR(20) NOT NULL COMMENT 版本号,
change_type ENUM(CREATE,UPDATE,DELETE,PRICE_CHANGE,STOCK_CHANGE) NOT NULL,
change_fields JSON COMMENT 变更字段及新旧值,
operator VARCHAR(50) COMMENT 操作人,
change_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT 变更时间,
remark TEXT COMMENT 变更备注
);
```
3. 关键功能实现
3.1 商品新增记录
```java
public void addProduct(Product product, String operator) {
// 保存商品主信息
productRepository.save(product);
// 创建初始版本记录
ProductVersionHistory history = new ProductVersionHistory();
history.setProductId(product.getId());
history.setVersion("V1.0");
history.setChangeType(ChangeType.CREATE);
history.setChangeFields(Map.of(
"name", product.getName(),
"price", product.getPrice(),
"specs", product.getSpecs()
));
history.setOperator(operator);
versionHistoryRepository.save(history);
}
```
3.2 商品修改记录
```java
public void updateProduct(Product updatedProduct, String operator) {
// 获取原商品信息
Product original = productRepository.findById(updatedProduct.getId()).orElseThrow();
// 计算变更字段
Map changes = new HashMap<>();
if (!original.getName().equals(updatedProduct.getName())) {
changes.put("name", Map.of("old", original.getName(), "new", updatedProduct.getName()));
}
// 类似处理其他字段...
// 更新商品
productRepository.save(updatedProduct);
// 创建版本记录
String newVersion = generateNextVersion(original.getVersion());
ProductVersionHistory history = new ProductVersionHistory();
history.setProductId(updatedProduct.getId());
history.setVersion(newVersion);
history.setChangeType(ChangeType.UPDATE);
history.setChangeFields(changes);
history.setOperator(operator);
versionHistoryRepository.save(history);
}
```
3.3 版本回滚功能
```java
public boolean rollbackToVersion(String productId, String targetVersion, String operator) {
// 获取目标版本信息
ProductVersionHistory targetHistory = versionHistoryRepository
.findByProductIdAndVersion(productId, targetVersion)
.orElseThrow();
// 解析变更字段并还原
JSONObject changeFields = new JSONObject(targetHistory.getChangeFields());
// 实际应用中需要更复杂的解析逻辑...
// 创建回滚记录
saveRollbackHistory(productId, targetVersion, operator);
return true;
}
```
三、高级功能实现
1. 变更对比视图
```javascript
// 前端实现商品版本对比
function compareVersions(version1, version2) {
const changes = [];
// 从API获取两个版本的完整数据
const data1 = await getVersionData(version1);
const data2 = await getVersionData(version2);
// 比较各字段
if (data1.price !== data2.price) {
changes.push({
field: 价格,
old: data1.price,
new: data2.price
});
}
// 其他字段比较...
return changes;
}
```
2. 自动化版本号生成
```java
public String generateNextVersion(String currentVersion) {
if (currentVersion == null || currentVersion.isEmpty()) {
return "V1.0";
}
String[] parts = currentVersion.substring(1).split("\\.");
int major = Integer.parseInt(parts[0]);
int minor = parts.length > 1 ? Integer.parseInt(parts[1]) : 0;
// 简单规则:小修改增加minor,重大修改增加major
// 实际应用中可根据变更类型决定
minor++;
return "V" + major + "." + minor;
}
```
四、数据可视化实现
1. 商品变更趋势图
```javascript
// 使用ECharts实现变更趋势
const chart = echarts.init(document.getElementById(change-trend));
const option = {
xAxis: {
type: category,
data: [1月, 2月, 3月, 4月, 5月, 6月]
},
yAxis: {
type: value
},
series: [{
data: [120, 200, 150, 80, 70, 110],
type: line,
name: 商品修改次数
}]
};
chart.setOption(option);
```
2. 变更类型分布
```javascript
const pieChart = echarts.init(document.getElementById(change-type-dist));
const pieOption = {
series: [{
type: pie,
radius: 50%,
data: [
{value: 1048, name: 价格调整},
{value: 735, name: 规格修改},
{value: 580, name: 描述更新}
]
}]
};
pieChart.setOption(pieOption);
```
五、系统优化建议
1. 性能优化:
- 对频繁查询的版本记录建立索引
- 实现历史数据的归档策略
2. 安全考虑:
- 记录操作人IP地址
- 实现敏感操作的二次验证
3. 扩展功能:
- 商品变更审批流程
- 变更影响分析(如价格调整对销量的影响)
4. 数据备份:
- 定期备份版本历史数据
- 实现跨区域数据同步
六、实施路线图
1. 第一阶段(1个月):
- 实现基础版本控制功能
- 完成商品变更记录存储
2. 第二阶段(2个月):
- 开发版本对比和回滚功能
- 实现基础数据可视化
3. 第三阶段(持续):
- 优化性能和用户体验
- 增加高级分析功能
该方案可根据叮咚买菜的实际业务需求和技术栈进行调整,建议采用敏捷开发方式逐步实现和完善。