出库单导入;

This commit is contained in:
王奎兴
2026-01-22 17:30:25 +08:00
parent fa650c7ef7
commit bf4b1d9568
4 changed files with 14 additions and 29 deletions
@@ -21,8 +21,6 @@ import java.util.Map;
@Service
public class ExcelParseService {
@Autowired
private IStockOutOrderService stockOutOrderService;
@Autowired
private StockOutOrderApplicationService stockOutOrderApplicationService;
/**
@@ -31,47 +29,39 @@ public class ExcelParseService {
* @return 解析后的出仓委托单对象
*/
public StockOutOrderDO parseOutboundOrderExcel(MultipartFile file) throws IOException {
// 1. 解析表头信息(前11行)
HeaderListener headerListener = new HeaderListener();
// 读取前11行表头
// 读取第一个sheet,只读前11行
ReadSheet headerSheet = EasyExcel.readSheet(0)
.headRowNumber(0)
.build();
ExcelReader headerReader = EasyExcel.read(file.getInputStream())
.autoCloseStream(false) // 不自动关闭流,因为后面还需要使用
.autoCloseStream(false)
.registerReadListener(headerListener)
.registerConverter(new NoConvertConverter()) // 注册自定义转换器
.headRowNumber(0) // 从第0行开始读取表头
.registerConverter(new NoConvertConverter())
.headRowNumber(0)
.build();
// 通过监听器控制只读取前11行
headerReader.read(headerSheet);
// 注意:这里不能关闭reader,因为后面还要用输入流
// 2. 解析商品明细(从第12行开始)
// 重新获取输入流
InputStream itemInputStream = file.getInputStream();
ItemListener itemListener = new ItemListener();
// 商品明细需要跳过前11行,从第12行开始读取
ExcelReader itemReader = EasyExcel.read(itemInputStream)
.autoCloseStream(false) // 不自动关闭流
.autoCloseStream(false)
.registerReadListener(itemListener)
.registerConverter(new NoConvertConverter()) // 注册自定义转换器
.headRowNumber(12) // 关键:设置headRowNumber为11,表示前11行是表头,从第12行开始读取数据
.registerConverter(new NoConvertConverter())
.headRowNumber(12)
.build();
ReadSheet itemSheet = EasyExcel.readSheet(0).build();
itemReader.read(itemSheet);
// 关闭读取器
itemReader.finish();
// 3. 组装完整的出仓委托单
StockOutOrderDO stockOutOrder = headerListener.getStockOutOrder();
stockOutOrder.setMaterialDetailList(itemListener.getItemList());
stockOutOrderApplicationService.insert(stockOutOrder);
@@ -45,11 +45,10 @@ public class HeaderListener extends AnalysisEventListener<Map<Integer, Object>>
case 5: // 第6行:承运方、tel、柜号、司机签名
stockOutOrder.setCarrier(getStringValue(rowData[2]));
stockOutOrder.setTel(getStringValue(rowData[5]));
stockOutOrder.setContainerNo(getStringValue(rowData[12]));
stockOutOrder.setContainerNoName(getStringValue(rowData[12]));
stockOutOrder.setDriverSign(getStringValue(rowData[16]));
break;
case 6: // 第7行:出仓日期、fax、运输方式、申报地关区
// 将LocalDate转换为Date
LocalDate localDate = parseDate(getStringValue(rowData[2]));
if (localDate != null) {
Date date = Date.from(localDate.atStartOfDay(ZoneId.of("UTC")).toInstant());
@@ -161,7 +160,6 @@ public class HeaderListener extends AnalysisEventListener<Map<Integer, Object>>
return null;
}
try {
// 处理Excel中的日期格式(如"2026-01-05 00:00:00"
if (dateStr.contains(" ")) {
dateStr = dateStr.split(" ")[0];
}
@@ -2,8 +2,6 @@ package com.mhd.wms.domain.stockOutOrder.repository.listener;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.metadata.data.ReadCellData;
import com.mhd.wms.domain.outMaterialDetail.entity.OutMaterialDetail;
import com.mhd.wms.domain.outMaterialDetail.repository.todo.OutMaterialDetailDO;
import lombok.Getter;
import java.math.BigDecimal;
@@ -11,7 +9,6 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Collections;
import java.util.stream.Collectors;
/**
* 解析商品明细的监听器(从第12行开始)
@@ -38,7 +35,7 @@ public class ItemListener extends AnalysisEventListener<Map<Integer, Object>> {
OutMaterialDetailDO item = new OutMaterialDetailDO();
// 填充商品明细数据
//商品名称 规格型号/ITEM 商品SKU码 Invoice No. 申报数量 申报单位 升 箱数 件数 尺寸 仓库数量 "总净重
//商品名称 料号 规格型号/ITEM 商品SKU码 Invoice No. 申报数量 申报单位 升 箱数 件数 尺寸 仓库数量 "总净重
//(KG)" 总毛重 (KG) "总体积
//(CBM)" 总面积(SQM) Batch Ref NO's Sheet Ref NO's 原产国 箱号/卡板号 总价 币制 备注
item.setCommodityName(getStringValue(rowData[1]));
@@ -57,26 +57,26 @@ public class StockOutOrderApi extends BaseController {
* 上传并解析出仓委托单Excel
*/
@PostMapping("/import")
public ResponseEntity<StockOutOrderDO> parseOutboundOrder(
public AjaxResult parseOutboundOrder(
@RequestParam("file") MultipartFile file) {
// 验证文件
if (file.isEmpty()) {
return ResponseEntity.badRequest().body(null);
return error("文件为空");
}
// 验证文件类型
String fileName = file.getOriginalFilename();
if (fileName == null || !fileName.endsWith(".xls") && !fileName.endsWith(".xlsx")) {
return ResponseEntity.status(HttpStatus.UNSUPPORTED_MEDIA_TYPE).body(null);
return error("文件类型错误");
}
try {
// 解析Excel并返回结果
StockOutOrderDO result = excelParseService.parseOutboundOrderExcel(file);
return ResponseEntity.ok(result);
return AjaxResult.success(result);
} catch (IOException e) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(null);
return error("解析失败");
}
}