预约单老系统数据导入;

This commit is contained in:
王奎兴
2026-07-31 15:47:20 +08:00
parent d4ba4f0c0b
commit f6ee1a3eee
14 changed files with 1168 additions and 0 deletions
@@ -15,6 +15,8 @@ import com.mhd.oms.domain.reserveStockOutOrder.repository.facade.IReserveStockOu
import com.mhd.oms.domain.reserveStockOutOrder.repository.po.ReserveStockOutOrderPO;
import com.mhd.oms.domain.reserveStockOutOrder.repository.todo.ReserveStockOutOrderDO;
import com.mhd.oms.domain.reserveStockOutOrder.repository.todo.ReserveStockOutOrderDTO;
import com.mhd.oms.domain.reserveStockOutOrder.repository.vo.LegacyReserveOutDetailVO;
import com.mhd.oms.domain.reserveStockOutOrder.repository.vo.LegacyReserveOutOrderVO;
import com.mhd.oms.domain.reserveStockOutOrder.repository.vo.ReservedInventoryOut;
import com.mhd.oms.domain.reserveStockOutOrder.service.ReserveStockOutOrderApplicationService;
import com.mhd.oms.domain.reserveStockOutOrder.service.ReserveStockOutOrderAssembler;
@@ -303,4 +305,59 @@ public class ReserveStockOutOrderApi extends BaseController {
return AjaxResult.success(stockOutOrderApplicationService.generateReserveOrderNumber());
}
/**
* 老系统出库预约单数据导入(两个文件:主表+明细)
* 通过货主名称、仓库类型、物料名称等匹配基础数据,id类字段不使用
* 仓库类型:1=干仓 2=冬仓
* 明细物料名称:取物料名称1和物料名称2中有值的那一个
*/
@ApiOperation("老系统出库预约单数据导入")
@PostMapping("/importLegacy")
public ResponseEntity<Map<String, Object>> importLegacyData(
@RequestParam("orderFile") MultipartFile orderFile,
@RequestParam("detailFile") MultipartFile detailFile) {
try {
// 1. 解析两个Excel文件
List<LegacyReserveOutOrderVO> orderList = ExcelParseUtil.parseLegacyOrderExcel(orderFile);
List<LegacyReserveOutDetailVO> detailList = ExcelParseUtil.parseLegacyDetailExcel(detailFile);
// 2. 调用应用服务执行导入
Map<String, Object> result = stockOutOrderApplicationService.importLegacyData(orderList, detailList);
Map<String, Object> successResponse = new HashMap<>();
successResponse.put("code", 200);
successResponse.put("message", "老系统出库预约单数据导入成功");
successResponse.put("orderCount", result.get("orderCount"));
successResponse.put("detailCount", result.get("detailCount"));
if (result.containsKey("warnings")) {
successResponse.put("warnings", result.get("warnings"));
}
return ResponseEntity.ok(successResponse);
} catch (ValidationException e) {
log.error("老系统出库预约单数据验证失败: {}", e.getMessage(), e);
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("code", 400);
errorResponse.put("message", "数据验证失败");
errorResponse.put("errorDetails", e.getMessage());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
} catch (IOException e) {
log.error("老系统出库预约单文件处理失败: {}", e.getMessage(), e);
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("code", 500);
errorResponse.put("message", "文件处理失败");
errorResponse.put("errorDetails", e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);
} catch (Exception e) {
log.error("老系统出库预约单导入失败: {}", e.getMessage(), e);
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("code", 500);
errorResponse.put("message", "导入失败");
errorResponse.put("errorDetails", e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);
}
}
}
@@ -10,12 +10,15 @@ import com.mhd.oms.domain.reserveStockInOrder.repository.todo.ReserveStockInOrde
import com.mhd.oms.domain.reserveStockInOrder.repository.todo.ReserveStockInOrderDTO;
import com.mhd.oms.domain.reserveStockInOrder.repository.util.ExcelParseUtil;
import com.mhd.oms.domain.reserveStockInOrder.repository.vo.InAndOutListVo;
import com.mhd.oms.domain.reserveStockInOrder.repository.vo.LegacyReserveInDetailVO;
import com.mhd.oms.domain.reserveStockInOrder.repository.vo.LegacyReserveInOrderVO;
import com.mhd.oms.domain.reserveStockInOrder.repository.vo.ReservedInventory;
import com.mhd.oms.domain.reserveStockInOrder.service.ReserveStockInOrderApplicationService;
import com.mhd.oms.domain.reserveStockInOrder.service.ReserveStockInOrderAssembler;
import com.mhd.system.api.domain.InMaterialDetailTZPD;
import com.mhd.system.api.domain.StockInOrderTZPD;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
@@ -34,6 +37,7 @@ import java.util.Map;
* @author gen
* @date 2024-05-21
*/
@Slf4j
@RestController
@RequestMapping("/reserveStockInOrderApi")
public class ReserveStockInOrderApi extends BaseController {
@@ -256,6 +260,68 @@ public class ReserveStockInOrderApi extends BaseController {
}
}
/**
* 老系统入库预约单数据导入(主表+明细两个Excel文件批量导入,按名称匹配基础数据)
*/
@ApiOperation("老系统入库预约单数据导入")
@PostMapping("/importLegacy")
public ResponseEntity<Map<String, Object>> importLegacyExcel(
@RequestParam("orderFile") MultipartFile orderFile,
@RequestParam("detailFile") MultipartFile detailFile) {
try {
List<LegacyReserveInOrderVO> orderList = ExcelParseUtil.parseLegacyOrderExcel(orderFile);
List<LegacyReserveInDetailVO> detailList = ExcelParseUtil.parseLegacyDetailExcel(detailFile);
Map<String, Object> importResult = stockInOrderApplicationService.importLegacyData(orderList, detailList);
Map<String, Object> successResponse = new HashMap<>();
successResponse.put("code", 200);
successResponse.put("message", "老系统数据导入成功");
successResponse.put("orderCount", importResult.get("orderCount"));
successResponse.put("detailCount", importResult.get("detailCount"));
if (importResult.containsKey("warnings")) {
successResponse.put("warnings", importResult.get("warnings"));
}
return ResponseEntity.ok(successResponse);
} catch (ValidationException e) {
// 数据验证失败响应
log.warn("老系统数据导入校验失败: {}", e.getMessage());
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("code", 400);
errorResponse.put("message", "数据验证失败");
errorResponse.put("errorDetails", e.getMessage());
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
} catch (IOException e) {
// 文件处理失败响应
log.error("老系统数据导入文件处理失败", e);
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("code", 500);
errorResponse.put("message", "文件处理失败");
errorResponse.put("errorDetails", e.getClass().getSimpleName() + ": " + e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);
} catch (Exception e) {
// 其他未知错误响应:打印完整堆栈,把真正的报错信息报出来
log.error("老系统数据导入发生未知异常", e);
String errorType = e.getClass().getSimpleName();
String errorMsg = e.getMessage() != null ? e.getMessage() : "无详细信息";
// 如果异常带有 cause,则再追加 cause 信息,方便定位根因
Throwable cause = e.getCause();
StringBuilder detail = new StringBuilder();
detail.append(errorType).append(": ").append(errorMsg);
if (cause != null && cause != e) {
detail.append(" | 根因: ").append(cause.getClass().getSimpleName()).append(": ").append(cause.getMessage());
}
Map<String, Object> errorResponse = new HashMap<>();
errorResponse.put("code", 500);
errorResponse.put("message", detail.toString());
errorResponse.put("errorDetails", detail.toString());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);
}
}
/**
* 生成入库预约单号
*/