一、系统设计目标
1. 实现商品全生命周期管理记录
2. 支持商品信息的历史版本追溯
3. 提供商品变更的审计追踪能力
4. 确保商品数据变更的可解释性和可回溯性
二、核心功能模块设计
1. 商品基础信息管理
- 商品ID生成策略(唯一性、可读性)
- 商品分类体系(多级分类管理)
- 商品基础属性(名称、规格、单位等)
2. 商品迭代记录模块
```mermaid
classDiagram
class Commodity {
+String commodityId
+String name
+String categoryId
+String specification
+String unit
+BigDecimal price
+String status
+Date createTime
+Date updateTime
}
class CommodityVersion {
+String versionId
+String commodityId
+Integer versionNumber
+String changeContent
+String operator
+Date changeTime
+String changeType
+JSONObject beforeSnapshot
+JSONObject afterSnapshot
}
Commodity "1" -- "0..*" CommodityVersion : has
```
3. 版本控制实现方案
方案一:数据库快照表
```sql
CREATE TABLE commodity_version (
version_id VARCHAR(32) PRIMARY KEY,
commodity_id VARCHAR(32) NOT NULL,
version_number INT NOT NULL,
change_content TEXT,
operator VARCHAR(32),
change_time DATETIME,
change_type VARCHAR(16), -- CREATE/UPDATE/DELETE/STATUS_CHANGE
before_snapshot JSON,
after_snapshot JSON,
INDEX idx_commodity_id (commodity_id),
INDEX idx_change_time (change_time)
);
```
方案二:事件溯源模式
```java
public class CommodityChangeEvent {
private String eventId;
private String commodityId;
private EventType eventType; // CREATE/UPDATE/DELETE等
private LocalDateTime eventTime;
private String operator;
private Map
changes; // 变更字段映射 private Map previousState; // 变更前状态 } ``` 三、关键实现技术 1. 变更检测机制 ```java // 使用AOP实现变更检测示例 @Aspect @Component public class CommodityChangeAspect { @Autowired private CommodityVersionService versionService; @AfterReturning( pointcut = "execution(* com.dingdong.service.CommodityService.update*(..)) && args(commodity)", returning = "result") public void afterUpdate(JoinPoint joinPoint, Commodity commodity, Object result) { // 获取变更前数据(可从缓存或数据库查询) Commodity oldCommodity = getOldCommodity(commodity.getCommodityId()); // 构建变更记录 CommodityVersion version = new CommodityVersion(); version.setCommodityId(commodity.getCommodityId()); version.setChangeType(ChangeType.UPDATE); version.setBeforeSnapshot(objectToMap(oldCommodity)); version.setAfterSnapshot(objectToMap(commodity)); version.setOperator(getOperator()); // 保存版本记录 versionService.save(version); } } ``` 2. 差异计算算法 ```python def calculate_diff(old_data, new_data): diff = {} for key in set(old_data.keys()).union(set(new_data.keys())): if key not in old_data or old_data[key] != new_data[key]: diff[key] = { old_value: old_data.get(key), new_value: new_data.get(key) } return diff ``` 3. 版本回滚实现 ```java public class CommodityRollbackService { public boolean rollback(String commodityId, int versionNumber) { // 1. 查询指定版本 CommodityVersion version = versionRepository.findByCommodityIdAndVersionNumber(commodityId, versionNumber); if (version == null) { throw new RuntimeException("版本不存在"); } // 2. 恢复数据 Commodity commodity = jsonToCommodity(version.getBeforeSnapshot()); commodityRepository.save(commodity); // 3. 创建回滚记录 CommodityVersion rollbackVersion = new CommodityVersion(); rollbackVersion.setCommodityId(commodityId); rollbackVersion.setChangeType(ChangeType.ROLLBACK); rollbackVersion.setChangeContent("回滚到版本" + versionNumber); // ...其他字段设置 versionRepository.save(rollbackVersion); return true; } } ``` 四、前端展示方案 1. 商品变更历史页面 ```javascript // 伪代码示例 function renderChangeHistory(commodityId) { fetch(`/api/commodities/${commodityId}/versions`) .then(response => response.json()) .then(versions => { const timeline = document.getElementById(change-timeline); versions.forEach(version => { const item = document.createElement(div); item.className = timeline-item; item.innerHTML = ` ${formatDate(version.changeTime)}
${version.operator}
${version.changeType}
查看变更 `; timeline.appendChild(item); }); }); } ``` 2. 变更差异对比视图 ``` +---------------------+---------------------+ | 字段名 | 变更内容 | +---------------------+---------------------+ | 商品名称 | 旧: 苹果 → 新: 红富士| | 价格 | 旧: 5.99 → 新: 6.99 | | 库存状态 | 旧: 有货 → 新: 缺货 | +---------------------+---------------------+ ``` 五、性能优化策略 1. 增量存储:只存储变更的字段而非整个对象快照 2. 异步记录:使用消息队列异步处理版本记录 3. 归档策略:对历史版本进行冷热数据分离 4. 缓存机制:缓存最新版本减少数据库查询 六、安全考虑 1. 操作日志不可篡改(使用区块链技术或数字签名) 2. 细粒度权限控制(谁可以查看/修改历史记录) 3. 数据加密存储(特别是价格等敏感信息) 4. 操作审计追踪(记录谁在何时查看了哪些历史记录) 七、扩展功能建议 1. 商品变更通知系统(当关键字段变更时通知相关人员) 2. 变更影响分析(分析变更对订单、库存等的影响) 3. 自动化的变更审批流程 4. 商品变更趋势分析(哪些字段最常变更) 此方案可根据叮咚买菜的实际业务需求和技术栈进行调整,核心是要确保商品信息的每一次变更都有完整记录,并能方便地进行追溯和审计。