一、系统设计目标
1. 记录商品全生命周期变更历史
2. 支持商品信息版本对比与回滚
3. 提供商品变更审计追踪能力
4. 满足合规性要求(如食品安全追溯)
二、核心功能模块
1. 商品变更记录模块
```
// 商品变更记录实体示例
public class ProductChangeLog {
private Long id;
private Long productId; // 商品ID
private String changeType; // 变更类型(新增/修改/删除/上下架)
private String fieldChanged; // 变更字段(名称/价格/库存等)
private String oldValue; // 旧值
private String newValue; // 新值
private Long operatorId; // 操作人ID
private String operatorName; // 操作人姓名
private Date changeTime; // 变更时间
private String changeReason; // 变更原因
// getters & setters
}
```
2. 版本控制模块
- 实现商品快照机制,每次重大变更生成版本快照
- 支持版本回滚功能
3. 审计追踪模块
- 记录所有商品相关操作日志
- 支持按时间、操作人、商品ID等维度查询
三、技术实现方案
1. 数据库设计
```sql
CREATE TABLE product_change_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
change_type VARCHAR(20) NOT NULL COMMENT ADD/UPDATE/DELETE/STATUS_CHANGE,
field_changed VARCHAR(50) COMMENT 变更字段,
old_value TEXT,
new_value TEXT,
operator_id BIGINT,
operator_name VARCHAR(50),
change_time DATETIME NOT NULL,
change_reason VARCHAR(255),
INDEX idx_product_id (product_id),
INDEX idx_change_time (change_time)
);
CREATE TABLE product_version (
version_id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
version_number INT NOT NULL,
snapshot_data JSON NOT NULL,
create_time DATETIME NOT NULL,
operator_id BIGINT,
operator_name VARCHAR(50),
UNIQUE KEY uk_product_version (product_id, version_number)
);
```
2. 关键实现代码
商品变更记录拦截器
```java
@Aspect
@Component
public class ProductChangeAspect {
@Autowired
private ProductChangeLogService changeLogService;
@AfterReturning(pointcut = "execution(* com.meituan.buyer.service.ProductService.update*(..))",
returning = "result")
public void afterProductUpdate(JoinPoint joinPoint, Object result) {
Object[] args = joinPoint.getArgs();
Long productId = (Long) args[0]; // 假设第一个参数是productId
// 获取修改前数据(可通过缓存或数据库查询)
Product oldProduct = getOldProductData(productId);
// 获取修改后数据(result或参数)
Product newProduct = extractNewProduct(args);
// 比较差异并记录
List
changes = compareProductFields(oldProduct, newProduct);
for (FieldChange change : changes) {
ProductChangeLog log = new ProductChangeLog();
log.setProductId(productId);
log.setChangeType("UPDATE");
log.setFieldChanged(change.getFieldName());
log.setOldValue(change.getOldValue());
log.setNewValue(change.getNewValue());
log.setOperatorId(getCurrentUserId());
log.setOperatorName(getCurrentUserName());
log.setChangeTime(new Date());
changeLogService.save(log);
}
// 创建版本快照
if (isMajorChange(changes)) {
createProductVersionSnapshot(productId, newProduct);
}
}
// 其他方法实现...
}
```
版本控制服务
```java
@Service
public class ProductVersionService {
@Autowired
private ProductVersionRepository versionRepository;
public void createVersionSnapshot(Long productId, Product product) {
// 查询当前最大版本号
Integer maxVersion = versionRepository.findMaxVersionByProductId(productId);
int newVersion = maxVersion == null ? 1 : maxVersion + 1;
// 创建版本快照
ProductVersion version = new ProductVersion();
version.setProductId(productId);
version.setVersionNumber(newVersion);
version.setSnapshotData(convertToJson(product));
version.setCreateTime(new Date());
version.setOperatorId(getCurrentUserId());
version.setOperatorName(getCurrentUserName());
versionRepository.save(version);
}
public Product rollbackToVersion(Long productId, Integer versionNumber) {
ProductVersion version = versionRepository.findByProductIdAndVersionNumber(productId, versionNumber);
if (version == null) {
throw new RuntimeException("版本不存在");
}
Product product = convertFromJson(version.getSnapshotData());
// 执行回滚操作...
// 记录回滚日志
recordRollbackLog(productId, versionNumber);
return product;
}
}
```
四、业务场景实现
1. 商品信息修改流程
1. 运营人员在后台修改商品信息
2. 系统自动拦截修改操作
3. 比较修改前后的差异
4. 生成变更记录并存储
5. 如果是重大变更,创建版本快照
2. 商品信息追溯
```java
public List traceProductChanges(Long productId, Date startTime, Date endTime) {
return changeLogService.findByProductIdAndTimeRange(productId, startTime, endTime);
}
```
3. 商品版本对比
```java
public List compareVersions(Long productId, Integer version1, Integer version2) {
ProductVersion v1 = versionService.findByProductIdAndVersionNumber(productId, version1);
ProductVersion v2 = versionService.findByProductIdAndVersionNumber(productId, version2);
Product p1 = convertFromJson(v1.getSnapshotData());
Product p2 = convertFromJson(v2.getSnapshotData());
return compareProductFields(p1, p2);
}
```
五、高级功能扩展
1. 变更通知系统:当重要商品信息变更时,自动通知相关人员
2. 变更影响分析:分析商品变更对订单、库存等系统的影响
3. 自动化测试集成:商品变更后自动触发相关测试用例
4. 数据可视化:展示商品变更趋势和热点字段
六、部署与监控
1. 变更记录表按时间分区存储
2. 定期归档历史变更记录
3. 监控变更记录写入延迟
4. 设置变更记录异常报警
七、合规性考虑
1. 变更记录不可篡改(考虑使用区块链技术增强可信度)
2. 保留足够长的历史记录(根据法规要求)
3. 支持监管机构的数据调取需求
该实现方案可帮助美团买菜系统建立完善的商品迭代记录体系,既满足业务运营需求,又符合合规性要求,同时为数据分析提供基础支持。