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