一、功能概述
商品迭代记录功能旨在跟踪商品从上架到下架的全生命周期变化,包括价格调整、规格变更、描述更新等,为运营团队提供决策支持,同时满足合规审计需求。
二、系统架构设计
1. 数据库设计
```sql
-- 商品主表
CREATE TABLE product (
product_id BIGINT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
category_id BIGINT,
status TINYINT DEFAULT 1 COMMENT 1-上架 0-下架,
create_time DATETIME,
update_time DATETIME
);
-- 商品迭代记录表
CREATE TABLE product_iteration (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT NOT NULL,
iteration_type TINYINT NOT NULL COMMENT 1-价格 2-规格 3-描述 4-库存 5-状态,
old_value TEXT,
new_value TEXT,
change_reason VARCHAR(255),
operator_id BIGINT,
operator_name VARCHAR(50),
change_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES product(product_id)
);
-- 商品快照表(可选)
CREATE TABLE product_snapshot (
snapshot_id BIGINT AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT NOT NULL,
snapshot_data JSON NOT NULL,
snapshot_time DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES product(product_id)
);
```
2. 核心模块划分
1. 数据采集层:监听商品变更事件
2. 处理层:解析变更内容并生成迭代记录
3. 存储层:持久化迭代记录
4. 查询层:提供迭代记录查询接口
5. 展示层:前端展示商品历史变更
三、核心功能实现
1. 变更监听机制
```java
// 使用Spring AOP实现变更监听
@Aspect
@Component
public class ProductChangeAspect {
@Autowired
private ProductIterationService iterationService;
// 监听价格变更
@AfterReturning(
pointcut = "execution(* com.dingdong.service.ProductService.updatePrice(..)) && args(productId, newPrice)",
returning = "result"
)
public void afterPriceUpdate(Long productId, BigDecimal newPrice, Boolean result) {
if (result) {
BigDecimal oldPrice = // 从数据库获取旧价格
iterationService.recordChange(productId,
IterationType.PRICE,
oldPrice.toString(),
newPrice.toString(),
"价格调整");
}
}
// 类似实现其他变更类型的监听...
}
```
2. 迭代记录服务
```java
@Service
public class ProductIterationService {
@Autowired
private ProductIterationRepository iterationRepository;
@Transactional
public void recordChange(Long productId, IterationType type,
String oldValue, String newValue, String reason) {
ProductIteration iteration = new ProductIteration();
iteration.setProductId(productId);
iteration.setIterationType(type.getCode());
iteration.setOldValue(oldValue);
iteration.setNewValue(newValue);
iteration.setChangeReason(reason);
iteration.setOperatorId(SecurityContextHolder.getContext().getAuthentication().getName());
iterationRepository.save(iteration);
// 可选:创建商品快照
if (type == IterationType.MAJOR_CHANGE) {
createProductSnapshot(productId);
}
}
private void createProductSnapshot(Long productId) {
// 实现快照创建逻辑
}
}
```
3. 查询接口实现
```java
@RestController
@RequestMapping("/api/products")
public class ProductIterationController {
@Autowired
private ProductIterationService iterationService;
@GetMapping("/{productId}/iterations")
public ResponseEntity
> getIterations(
@PathVariable Long productId,
@RequestParam(defaultValue = "0") Integer page,
@RequestParam(defaultValue = "20") Integer size) {
Page iterations = iterationService.findByProductId(
productId, PageRequest.of(page, size));
return ResponseEntity.ok(iterations.stream()
.map(this::convertToDTO)
.collect(Collectors.toList()));
}
private ProductIterationDTO convertToDTO(ProductIteration iteration) {
// 转换逻辑
}
}
```
四、前端展示方案
1. 迭代记录时间轴组件
```jsx
function ProductIterationTimeline({ iterations }) {
return (
{iterations.map((item, index) => (
{getChangeTypeLabel(item.iterationType)}
{formatDateTime(item.changeTime)}
{item.operatorName}
{item.changeReason && (
原因: {item.changeReason}
)}
))}
);
}
```
2. 差异对比视图
```jsx
function DiffViewer({ oldData, newData }) {
const diff = calculateDiff(oldData, newData);
return (
规格对比
{diff.specs.map((specDiff, index) => (
{specDiff.name}
{specDiff.oldValue || 无}
{specDiff.newValue || 无}
))}
{/* 其他字段对比... */}
);
}
```
五、高级功能扩展
1. 变更影响分析
```java
public class ChangeImpactAnalyzer {
public ImpactReport analyzePriceChange(Long productId, BigDecimal delta) {
ImpactReport report = new ImpactReport();
// 分析价格变动对销售的影响
List recentSales = salesRepository.findRecentByProduct(productId, 30);
report.setSalesImpact(calculateSalesImpact(recentSales, delta));
// 分析对库存周转的影响
Inventory inventory = inventoryRepository.findByProduct(productId);
report.setInventoryImpact(calculateInventoryImpact(inventory, delta));
// 分析对竞品的影响
List competitors = competitorService.findByCategory(
productRepository.findCategory(productId));
report.setCompetitorImpact(analyzeCompetitorImpact(competitors, delta));
return report;
}
}
```
2. 自动化变更建议
```java
public class AutoChangeSuggester {
public List suggestChanges(Long productId) {
Product product = productRepository.findById(productId).orElseThrow();
List suggestions = new ArrayList<>();
// 价格建议
if (shouldAdjustPrice(product)) {
suggestions.add(new ChangeSuggestion(
IterationType.PRICE,
calculateSuggestedPrice(product),
"基于市场数据和历史销售,建议调整价格"
));
}
// 库存建议
if (shouldAdjustInventory(product)) {
suggestions.add(new ChangeSuggestion(
IterationType.INVENTORY,
calculateSuggestedInventory(product),
"基于销售预测,建议调整库存水平"
));
}
return suggestions;
}
}
```
六、实施路线图
1. 第一阶段(1-2周):
- 完成数据库设计和基础表创建
- 实现核心变更监听和记录功能
- 开发基础查询接口
2. 第二阶段(2-3周):
- 开发前端展示组件
- 实现分页和筛选功能
- 添加操作日志和权限控制
3. 第三阶段(1-2周):
- 实现差异对比视图
- 开发变更影响分析功能
- 添加自动化变更建议
4. 第四阶段(持续):
- 优化性能,处理大数据量场景
- 添加数据导出功能
- 实现与BI系统的集成
七、注意事项
1. 性能考虑:高频变更的商品可能产生大量记录,需考虑分表或归档策略
2. 数据安全:敏感信息变更需额外审计和权限控制
3. 兼容性:确保新功能不影响现有商品管理流程
4. 用户体验:提供清晰的可视化展示和便捷的查询方式
5. 合规性:满足电商行业相关法规对商品变更记录的要求
通过此系统实现,叮咚买菜可以全面掌握商品生命周期变化,为运营决策提供数据支持,同时提升合规性和审计能力。