一、系统设计目标
1. 记录商品全生命周期变更历史
2. 支持商品信息的版本对比与回滚
3. 提供审计追踪能力
4. 满足合规性要求(如食品安全法规)
二、核心功能模块
1. 商品变更记录模块
- 变更类型定义:
- 基础信息变更(名称、规格、产地等)
- 价格变更(原价、促销价、会员价)
- 库存变更(总库存、区域库存)
- 状态变更(上架/下架/售罄)
- 图片/描述等多媒体内容变更
- 数据结构设计:
```json
{
"change_id": "CH20230615-001",
"item_id": "IT100123",
"change_type": "price_update",
"old_value": {"price": 29.9, "currency": "CNY"},
"new_value": {"price": 25.9, "currency": "CNY"},
"changed_fields": ["price"],
"operator": "user123",
"change_time": "2023-06-15T14:30:22Z",
"reason": "618促销活动",
"related_campaign": "CAM20230615"
}
```
2. 版本管理模块
- 版本快照:每次重大变更生成完整版本快照
- 版本对比:支持任意两个版本间的差异对比
- 版本回滚:支持恢复到指定版本
3. 审计追踪模块
- 操作日志记录所有变更操作
- 支持按时间、操作人、商品ID等多维度查询
- 导出审计报告功能
三、技术实现方案
1. 数据库设计
```sql
CREATE TABLE item_change_log (
id BIGSERIAL PRIMARY KEY,
item_id VARCHAR(32) NOT NULL,
change_type VARCHAR(32) NOT NULL,
change_data JSONB NOT NULL,
operator_id VARCHAR(32) NOT NULL,
operator_type VARCHAR(16) NOT NULL, -- SYSTEM/USER
change_time TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
reason TEXT,
related_campaign_id VARCHAR(32)
);
CREATE INDEX idx_item_change_log_item ON item_change_log(item_id);
CREATE INDEX idx_item_change_log_time ON item_change_log(change_time);
```
2. 实现方式选择
方案A:事件溯源(Event Sourcing)
- 优点:完整的变更历史,支持时间旅行查询
- 挑战:实现复杂,需要处理事件版本兼容性
方案B:快照+增量日志
- 优点:实现简单,查询效率高
- 实现示例:
```java
// 商品服务变更拦截器示例
@Aspect
@Component
public class ItemChangeAspect {
@Autowired
private ChangeLogService changeLogService;
@AfterReturning(
pointcut = "execution(* com.meituan.buyer.service.ItemService.update*(..))",
returning = "result"
)
public void logItemChange(JoinPoint joinPoint, Object result) {
Object[] args = joinPoint.getArgs();
// 提取变更前后的数据
// 构建变更记录
ChangeLog log = buildChangeLog(args, joinPoint.getSignature().getName());
changeLogService.save(log);
}
}
```
3. 版本控制实现
```java
public class ItemVersionManager {
public Item getItemVersion(String itemId, long version) {
// 从版本库获取指定版本
}
public List
compareVersions(String itemId, long version1, long version2) { // 对比两个版本的差异 } public boolean rollbackToVersion(String itemId, long version) { // 版本回滚实现 } } ``` 四、业务场景实现 1. 商品上下架记录 ```java public class ItemStatusChangeHandler { @Transactional public void changeStatus(String itemId, ItemStatus newStatus, String operator) { // 1. 获取当前商品状态 Item item = itemRepository.findById(itemId); ItemStatus oldStatus = item.getStatus(); // 2. 更新商品状态 item.setStatus(newStatus); itemRepository.save(item); // 3. 记录变更 changeLogService.record( itemId, ChangeType.STATUS_CHANGE, Map.of("from", oldStatus, "to", newStatus), operator, "商品状态变更" ); } } ``` 2. 价格变更记录 ```java public class PriceUpdateService { public void updatePrice(String itemId, BigDecimal newPrice, String campaignId) { // 获取当前价格 ItemPrice currentPrice = priceRepository.findCurrentPrice(itemId); // 更新价格 ItemPrice updatedPrice = new ItemPrice( itemId, newPrice, currentPrice.getCurrency(), LocalDateTime.now() ); priceRepository.save(updatedPrice); // 记录变更 ChangeLog log = new ChangeLog( itemId, ChangeType.PRICE_UPDATE, Map.of( "old_price", currentPrice.getPrice(), "new_price", newPrice ), "system", "价格更新" ); if (StringUtils.isNotBlank(campaignId)) { log.setRelatedCampaign(campaignId); } changeLogRepository.save(log); } } ``` 五、前端展示方案 1. 商品详情页历史版本: - 添加"历史版本"标签页 - 展示版本时间线 - 支持版本对比查看差异 2. 管理后台审计视图: ```javascript // 示例:变更记录表格组件 const ChangeLogTable = ({itemId}) => { const [logs, setLogs] = useState([]); useEffect(() => { api.getChangeLogs(itemId).then(setLogs); }, [itemId]); return ( title="变更内容" render={(text, record) => ( }> 查看详情 )} />
); }; ``` 六、扩展功能考虑 1. 自动变更检测:通过对比算法自动识别显著变更 2. 变更影响分析:分析价格变更对销售的影响 3. 合规性检查:自动检查变更是否符合法规要求 4. 多级审批流程:对关键变更实施审批机制 七、部署与监控 1. 变更记录存储: - 主存储:业务数据库 - 归档存储:对象存储(长期保存) 2. 监控指标: - 每日变更次数 - 平均变更处理时间 - 异常变更报警 3. 备份策略: - 每日全量备份 - 实时变更日志同步到冷存储 该实现方案可根据美团买菜的实际业务规模和技术栈进行调整,核心思想是通过完整的变更记录实现商品信息的可追溯性,支持业务运营和合规需求。