一、需求分析
针对川味冻品行业特点,批量价格调整功能需满足以下核心需求:
1. 支持按品类(如火锅食材、川味调料、速冻川菜等)批量调整
2. 支持按供应商/品牌批量调整
3. 支持按季节性/促销活动批量调整
4. 支持价格调整历史追溯和回滚
5. 支持不同区域差异化定价策略
二、系统架构设计
1. 数据库设计
```sql
-- 价格调整主表
CREATE TABLE price_adjustment (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
adjustment_name VARCHAR(100) NOT NULL COMMENT 调整名称,
adjustment_type TINYINT NOT NULL COMMENT 1-品类 2-供应商 3-促销 4-区域,
start_time DATETIME NOT NULL COMMENT 生效时间,
end_time DATETIME COMMENT 失效时间,
status TINYINT DEFAULT 0 COMMENT 0-草稿 1-已生效 2-已失效,
creator VARCHAR(50) NOT NULL,
create_time DATETIME NOT NULL,
remark VARCHAR(500)
);
-- 价格调整明细表
CREATE TABLE price_adjustment_detail (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
adjustment_id BIGINT NOT NULL COMMENT 关联主表ID,
product_id BIGINT NOT NULL COMMENT 商品ID,
sku_code VARCHAR(50) NOT NULL COMMENT SKU编码,
original_price DECIMAL(10,2) NOT NULL COMMENT 原价格,
adjusted_price DECIMAL(10,2) NOT NULL COMMENT 调整后价格,
adjustment_rate DECIMAL(5,2) COMMENT 调整比例(%),
region_code VARCHAR(20) COMMENT 区域编码,
FOREIGN KEY (adjustment_id) REFERENCES price_adjustment(id)
);
```
2. 核心功能模块
1. 价格调整策略引擎
- 支持多种调整规则:固定金额调整、百分比调整、阶梯调整
- 支持组合条件:品类+区域+时间范围
2. 批量操作接口
```java
public interface PriceAdjustmentService {
/
* 批量创建价格调整
* @param adjustmentDTO 调整主信息
* @param productIds 商品ID列表
* @param adjustmentType 调整类型
* @param adjustmentValue 调整值(金额或比例)
* @return 调整结果
*/
ResultVO batchCreateAdjustment(PriceAdjustmentDTO adjustmentDTO,
List
productIds,
AdjustmentType adjustmentType,
BigDecimal adjustmentValue);
/
* 执行价格调整
* @param adjustmentId 调整ID
* @return 执行结果
*/
ResultVO executeAdjustment(Long adjustmentId);
/
* 回滚价格调整
* @param adjustmentId 调整ID
* @return 回滚结果
*/
ResultVO rollbackAdjustment(Long adjustmentId);
}
```
3. 价格计算服务
```java
public class PriceCalculator {
public BigDecimal calculateAdjustedPrice(BigDecimal originalPrice,
AdjustmentType type,
BigDecimal adjustmentValue) {
switch (type) {
case FIXED_AMOUNT:
return originalPrice.add(adjustmentValue);
case PERCENTAGE:
return originalPrice.multiply(BigDecimal.ONE.add(
adjustmentValue.divide(new BigDecimal(100))));
// 其他调整类型...
default:
return originalPrice;
}
}
}
```
三、实现方案
1. 前端实现
- 开发批量价格调整页面,包含:
- 调整条件选择区(品类、供应商、区域等)
- 调整方式选择(固定金额/百分比)
- 调整值输入
- 生效时间设置
- 商品列表展示区(支持筛选和批量选择)
2. 后端实现
```java
@Service
public class PriceAdjustmentServiceImpl implements PriceAdjustmentService {
@Autowired
private PriceAdjustmentMapper adjustmentMapper;
@Autowired
private PriceAdjustmentDetailMapper detailMapper;
@Autowired
private ProductService productService;
@Transactional
@Override
public ResultVO batchCreateAdjustment(PriceAdjustmentDTO adjustmentDTO,
List productIds,
AdjustmentType adjustmentType,
BigDecimal adjustmentValue) {
// 1. 验证商品是否存在
List products = productService.getProductsByIds(productIds);
if (products.size() != productIds.size()) {
return ResultVO.error("部分商品不存在");
}
// 2. 保存调整主信息
PriceAdjustment adjustment = new PriceAdjustment();
BeanUtils.copyProperties(adjustmentDTO, adjustment);
adjustment.setStatus(AdjustmentStatus.DRAFT);
adjustmentMapper.insert(adjustment);
// 3. 生成调整明细
List details = new ArrayList<>();
PriceCalculator calculator = new PriceCalculator();
for (Product product : products) {
BigDecimal originalPrice = product.getPrice(); // 实际应从价格表获取
BigDecimal adjustedPrice = calculator.calculateAdjustedPrice(
originalPrice, adjustmentType, adjustmentValue);
PriceAdjustmentDetail detail = new PriceAdjustmentDetail();
detail.setAdjustmentId(adjustment.getId());
detail.setProductId(product.getId());
detail.setSkuCode(product.getSkuCode());
detail.setOriginalPrice(originalPrice);
detail.setAdjustedPrice(adjustedPrice);
detail.setAdjustmentRate(adjustmentType == AdjustmentType.PERCENTAGE ?
adjustmentValue : null);
details.add(detail);
}
// 4. 批量插入明细
detailMapper.batchInsert(details);
return ResultVO.success("批量价格调整创建成功");
}
@Transactional
@Override
public ResultVO executeAdjustment(Long adjustmentId) {
// 1. 获取调整信息
PriceAdjustment adjustment = adjustmentMapper.selectById(adjustmentId);
if (adjustment == null || adjustment.getStatus() != AdjustmentStatus.DRAFT) {
return ResultVO.error("调整不存在或已执行");
}
// 2. 更新状态为执行中
adjustment.setStatus(AdjustmentStatus.EXECUTING);
adjustmentMapper.updateById(adjustment);
try {
// 3. 获取调整明细
List details = detailMapper.selectByAdjustmentId(adjustmentId);
// 4. 批量更新商品价格(实际应调用商品价格服务)
for (PriceAdjustmentDetail detail : details) {
// 这里简化处理,实际应调用商品服务更新价格
// productService.updatePrice(detail.getProductId(), detail.getAdjustedPrice());
// 记录价格变更日志
// priceLogService.logPriceChange(...);
}
// 5. 更新状态为已执行
adjustment.setStatus(AdjustmentStatus.EXECUTED);
adjustmentMapper.updateById(adjustment);
return ResultVO.success("价格调整执行成功");
} catch (Exception e) {
// 6. 异常处理,回滚状态
adjustment.setStatus(AdjustmentStatus.FAILED);
adjustmentMapper.updateById(adjustment);
return ResultVO.error("价格调整执行失败: " + e.getMessage());
}
}
}
```
3. 定时任务实现
```java
@Component
public class PriceAdjustmentScheduler {
@Autowired
private PriceAdjustmentService priceAdjustmentService;
// 每天凌晨1点检查并执行待生效的价格调整
@Scheduled(cron = "0 0 1 * * ?")
public void executePendingAdjustments() {
List pendingAdjustments =
priceAdjustmentService.getPendingAdjustments(LocalDateTime.now());
for (PriceAdjustment adjustment : pendingAdjustments) {
priceAdjustmentService.executeAdjustment(adjustment.getId());
}
}
// 每天凌晨2点检查并失效过期的价格调整
@Scheduled(cron = "0 0 2 * * ?")
public void expireAdjustments() {
List expiredAdjustments =
priceAdjustmentService.getExpiredAdjustments(LocalDateTime.now());
for (PriceAdjustment adjustment : expiredAdjustments) {
// 这里应调用恢复原价的服务
// priceAdjustmentService.rollbackAdjustment(adjustment.getId());
}
}
}
```
四、川味冻品行业特殊考虑
1. 季节性价格调整:
- 针对火锅食材冬季涨价、夏季促销的特点
- 开发季节性价格模板功能
2. 区域差异化定价:
- 支持按省份/城市设置不同价格
- 考虑物流成本对价格的影响
3. 促销活动集成:
- 与满减、折扣等促销活动协同
- 避免价格冲突
4. 供应商协同:
- 支持供应商发起的价格调整申请
- 审批流程设计
五、测试方案
1. 单元测试:
- 价格计算逻辑测试
- 批量操作事务测试
2. 集成测试:
- 前后端联调测试
- 与商品系统、订单系统集成测试
3. 性能测试:
- 批量调整1000+商品的性能测试
- 高并发场景下的稳定性测试
4. 业务场景测试:
- 跨区域价格调整测试
- 促销期价格调整测试
- 价格回滚测试
六、部署与监控
1. 部署方案:
- 独立微服务部署
- 数据库读写分离
2. 监控指标:
- 价格调整执行成功率
- 平均执行时间
- 失败率
3. 告警机制:
- 价格调整失败告警
- 价格异常波动告警
通过以上方案,可实现川味冻品系统高效、灵活的批量价格调整功能,满足行业特有的业务需求。