一、需求分析
快驴生鲜系统作为B2B生鲜供应链平台,批量处理功能主要满足以下需求:
1. 商品信息的批量导入/导出
2. 订单的批量处理(审核、发货、取消等)
3. 库存的批量调整
4. 供应商信息的批量管理
5. 价格策略的批量更新
二、技术架构设计
1. 前端实现
- 组件选择:使用Ant Design Vue/Element UI的上传组件和表格组件
- 批量操作控件:
```javascript
// 示例:批量操作按钮组
批量导入
批量导出
批量编辑
```
2. 后端实现
- 技术栈:Spring Boot + MyBatis Plus(或JPA)
- 核心接口设计:
```java
// 批量导入接口示例
@PostMapping("/api/products/batch-import")
public Result
batchImportProducts(
@RequestParam("file") MultipartFile file) {
// 实现逻辑
}
// 批量更新接口示例
@PostMapping("/api/products/batch-update")
public Result batchUpdateProducts(
@RequestBody List productList) {
// 实现逻辑
}
```
3. 数据库设计
- 批量操作记录表:
```sql
CREATE TABLE batch_operation_log (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
operation_type VARCHAR(50) NOT NULL,
operator_id BIGINT NOT NULL,
operation_time DATETIME NOT NULL,
status TINYINT NOT NULL COMMENT 0-进行中 1-成功 2-失败,
total_count INT NOT NULL,
success_count INT DEFAULT 0,
fail_count INT DEFAULT 0,
error_message TEXT,
create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
```
三、核心功能实现
1. 批量导入实现
```java
// 服务层实现
@Transactional
public BatchImportResult batchImportProducts(MultipartFile file) {
// 1. 解析Excel文件
List productList = excelReader.readProducts(file);
// 2. 验证数据
List validProducts = validator.validate(productList);
// 3. 批量插入数据库
List products = converter.convert(validProducts);
productMapper.batchInsert(products);
// 4. 记录操作日志
BatchOperationLog log = new BatchOperationLog();
log.setOperationType("PRODUCT_IMPORT");
log.setTotalCount(products.size());
log.setSuccessCount(products.size());
logMapper.insert(log);
return new BatchImportResult(true, "导入成功", products.size());
}
```
2. 批量更新实现
```java
// 使用MyBatis Plus的批量更新
public void batchUpdateProducts(List updateList) {
// 分批处理,避免一次性更新过多数据
int batchSize = 500;
for (int i = 0; i < updateList.size(); i += batchSize) {
List subList = updateList.subList(
i, Math.min(i + batchSize, updateList.size()));
// 构建更新条件
List products = subList.stream()
.map(dto -> {
Product product = new Product();
product.setId(dto.getId());
// 设置其他需要更新的字段
return product;
}).collect(Collectors.toList());
productMapper.updateBatchById(products);
}
}
```
3. 批量导出实现
```java
// 使用EasyExcel导出
public void batchExportProducts(HttpServletResponse response) throws IOException {
// 查询需要导出的数据
List dataList = productMapper.selectExportData();
// 设置响应头
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
String fileName = URLEncoder.encode("商品列表", "UTF-8").replaceAll("\\+", "%20");
response.setHeader("Content-disposition", "attachment;filename*=utf-8" + fileName + ".xlsx");
// 写入Excel
EasyExcel.write(response.getOutputStream(), ProductExportDTO.class)
.sheet("商品列表")
.doWrite(dataList);
}
```
四、性能优化策略
1. 分批处理:对于大数据量操作,采用分批处理机制
```java
// 分批处理示例
public void batchProcessWithRetry(List dataList, int batchSize) {
int total = dataList.size();
for (int i = 0; i < total; i += batchSize) {
int end = Math.min(i + batchSize, total);
List subList = dataList.subList(i, end);
processBatch(subList);
}
}
```
2. 异步处理:对于耗时操作使用消息队列
```java
// 发送批量处理任务到RabbitMQ
@Autowired
private RabbitTemplate rabbitTemplate;
public void asyncBatchProcess(List dataList) {
BatchProcessMessage message = new BatchProcessMessage();
message.setDataList(dataList);
rabbitTemplate.convertAndSend("batch.process.queue", message);
}
```
3. 事务管理:确保批量操作的原子性
```java
@Transactional(rollbackFor = Exception.class)
public void transactionalBatchUpdate(List products) {
for (Product product : products) {
// 更新逻辑
productMapper.updateById(product);
}
}
```
五、错误处理与日志
1. 批量操作错误处理:
```java
public BatchResult batchProcessWithExceptionHandling(List dataList) {
BatchResult result = new BatchResult();
List successList = new ArrayList<>();
List failList = new ArrayList<>();
for (Data data : dataList) {
try {
processSingle(data);
successList.add(data);
} catch (Exception e) {
log.error("批量处理失败: {}", data.getId(), e);
failList.add(data);
}
}
result.setSuccessCount(successList.size());
result.setFailCount(failList.size());
result.setFailItems(failList);
return result;
}
```
2. 操作日志记录:
```java
@Aspect
@Component
public class BatchOperationAspect {
@Autowired
private OperationLogMapper logMapper;
@AfterReturning(pointcut = "execution(* com.kuailv..service.*.batch*(..))",
returning = "result")
public void logBatchOperation(JoinPoint joinPoint, Object result) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
OperationLog log = new OperationLog();
log.setOperationType("BATCH_" + method.getName().toUpperCase());
log.setOperator(SecurityUtils.getCurrentUserId());
// 其他日志字段设置
logMapper.insert(log);
}
}
```
六、测试方案
1. 单元测试:
```java
@Test
public void testBatchInsert() {
List products = Arrays.asList(
new Product("1", "苹果"),
new Product("2", "香蕉")
);
productService.batchInsert(products);
Assertions.assertEquals(2, productMapper.selectCount(null));
}
```
2. 压力测试:
```java
@Test
public void stressTestBatchUpdate() {
List products = IntStream.rangeClosed(1, 10000)
.mapToObj(i -> new Product(String.valueOf(i), "商品"+i))
.collect(Collectors.toList());
long start = System.currentTimeMillis();
productService.batchUpdate(products);
long duration = System.currentTimeMillis() - start;
System.out.println("批量更新10000条数据耗时: " + duration + "ms");
}
```
七、部署与监控
1. 监控指标:
- 批量操作成功率
- 平均处理时间
- 失败率
- 队列积压量(异步处理时)
2. 告警规则:
- 批量操作失败率 > 5%
- 单次批量操作耗时 > 60秒
- 队列积压量 > 1000
八、实施路线图
1. 第一阶段(2周):实现基础批量导入/导出功能
2. 第二阶段(3周):开发批量更新和删除功能
3. 第三阶段(2周):优化性能,添加异步处理和分批机制
4. 第四阶段(1周):完善监控和告警系统
通过以上方案,快驴生鲜系统可以实现高效、稳定的批量处理功能,显著提升B端用户的操作效率,特别是在处理大量商品、订单和库存数据时。