出库单导入;
This commit is contained in:
+7
-17
@@ -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);
|
||||
|
||||
+1
-3
@@ -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];
|
||||
}
|
||||
|
||||
+1
-4
@@ -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]));
|
||||
|
||||
+5
-5
@@ -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("解析失败");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user