From 6785e797a5965a1e6546bfa75fb454d733307e6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Mon, 10 Nov 2025 10:23:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20bug-762=20=E9=92=A2=E6=9E=84=E4=BB=B6?= =?UTF-8?q?=E8=AE=A2=E5=8D=95=E5=88=9B=E5=BB=BA=E9=83=A8=E5=88=86=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E4=BF=A1=E6=81=AF=E8=87=AA=E5=8A=A8=E5=B8=A6=E5=87=BA?= =?UTF-8?q?=E4=B8=8A=E4=B8=80=E6=AC=A1=E7=9A=84=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nflg-wms-admin/.apifox-helper.properties | 1 + .../StructuralPackageOrderController.java | 189 ++++++++++++++++++ .../dto/StructuralPackageOrderImportDTO.java | 74 +++++++ .../nflg/wms/admin/service/SapService.java | 5 +- .../nflg/wms/common/util/EecExcelUtil.java | 11 +- 5 files changed, 276 insertions(+), 4 deletions(-) create mode 100644 nflg-wms-admin/.apifox-helper.properties create mode 100644 nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/StructuralPackageOrderImportDTO.java diff --git a/nflg-wms-admin/.apifox-helper.properties b/nflg-wms-admin/.apifox-helper.properties new file mode 100644 index 00000000..2538d9f3 --- /dev/null +++ b/nflg-wms-admin/.apifox-helper.properties @@ -0,0 +1 @@ +method.return[#response]=groovy: "com.nflg.wms.common.pojo.ApiResult<" + helper.resolveLink(it.doc("response")) +">" \ No newline at end of file diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java index 88336c65..e096bea0 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/controller/StructuralPackageOrderController.java @@ -2,6 +2,7 @@ package com.nflg.wms.admin.controller; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; +import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.RandomUtil; @@ -18,6 +19,7 @@ import com.alibaba.excel.write.metadata.fill.FillConfig; import com.nflg.wms.admin.pojo.document.PackageMaterialScanRecord; import com.nflg.wms.admin.pojo.dto.PdfPageDTO; import com.nflg.wms.admin.pojo.dto.SAPMaterialInfoInOrderDTO; +import com.nflg.wms.admin.pojo.dto.StructuralPackageOrderImportDTO; import com.nflg.wms.admin.repository.PackageMaterialScanRecordRepository; import com.nflg.wms.admin.service.BasdeSerialNumberControllerService; import com.nflg.wms.admin.service.BinService; @@ -28,6 +30,8 @@ import com.nflg.wms.admin.util.PdfGeneratorUtil; import com.nflg.wms.admin.util.QRCodeUtil; import com.nflg.wms.admin.util.ThymeleafUtil; import com.nflg.wms.common.constant.OrderState; +import com.nflg.wms.common.constant.STATE; +import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.common.pojo.ApiResult; import com.nflg.wms.common.pojo.PageData; import com.nflg.wms.common.pojo.dto.PackageMaterialDTO; @@ -48,11 +52,15 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.math.NumberUtils; import org.springframework.core.io.ClassPathResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.ttzero.excel.entity.ListMapSheet; +import org.ttzero.excel.entity.Workbook; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -65,6 +73,8 @@ import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; import java.util.*; import java.util.stream.Collectors; @@ -124,6 +134,185 @@ public class StructuralPackageOrderController extends BaseController { @Resource private BasdeSerialNumberControllerService serialNumberControllerService; + @Resource + private IWmsModelService modelService; + + @Resource + private IWmsWorkbenchService workbenchService; + + /** + * 导出订单创建模板 + */ + @GetMapping("exportOrderTemplate") + public void exportOrderTemplate(HttpServletResponse response) throws IOException { + List> datas = new LinkedList<>(); + Map map = new LinkedHashMap<>(); + map.put("*钢构包料号", "必填"); + map.put("*供应商编号", "必填"); + map.put("*机型", "必填"); + map.put("*机台序号", "必填"); + map.put("*期望交期", "必填,格式2025-10-01"); + map.put("采购单号", ""); + map.put("采购单行号", ""); + map.put("数量", ""); + datas.add(map); + EecExcelUtil.eecExcel("钢构件订单创建模板", new ListMapSheet<>(datas), response); + } + + /** + * 导入订单创建数据 + * @param file excel文件 + * @response {@link List} + */ + @PostMapping(value = "importForOrder") + public ApiResult importForOrder(HttpServletResponse response, @RequestParam(name = "file") MultipartFile file) throws IOException { + List datas = new ArrayList<>(); + List> maps = EecExcelUtil.handlerExcel(file.getInputStream()); + maps.forEach(map -> { + StructuralPackageOrderImportDTO dto = new StructuralPackageOrderImportDTO(); + StringBuilder sb = new StringBuilder(); + String data = StrUtil.trim(map.get("*钢构包料号").toString()); + if (StrUtil.isBlank(data)) { + sb.append("钢构包料号不能为空;"); + } else { + PackageVO packageVO = structuralPackageService.getCurrent(data); + if (Objects.isNull(packageVO)) { + sb.append("钢构包不存在;"); + } else { + dto.setMaterialNo(data); + dto.setPackageId(packageVO.getId()); + } + } + data = StrUtil.trim(map.get("*供应商编号").toString()); + if (StrUtil.isBlank(data)) { + sb.append("供应商编号不能为空;"); + } else { + UserSupplier supplier = userSupplierService.getByCode(data); + if (Objects.isNull(supplier)) { + sb.append("供应商不存在;"); + } else { + dto.setSupplierId(supplier.getId()); + dto.setSupplierCode(supplier.getSupplierCode()); + dto.setSupplierName(supplier.getSupplierName()); + } + } + data = StrUtil.trim(map.get("*机型").toString()); + if (StrUtil.isBlank(data)) { + sb.append("机型不能为空;"); + } else { + WmsModel model = modelService.lambdaQuery().eq(WmsModel::getNo, data).eq(WmsModel::getEnable, true).one(); + if (Objects.isNull(model)) { + sb.append("机型不存在;"); + } else { + dto.setModelId(model.getId()); + dto.setModelNo(model.getNo()); + } + } + data = StrUtil.trim(map.get("*机台序号").toString()); + if (StrUtil.isBlank(data)) { + sb.append("机台序号不能为空;"); + } else { + WmsWorkbench workbench = workbenchService.lambdaQuery().eq(WmsWorkbench::getNo, data).eq(WmsWorkbench::getEnable, true).one(); + if (Objects.isNull(workbench)) { + sb.append("机台不存在;"); + } else { + dto.setWorkbenchId(workbench.getId()); + dto.setWorkbenchNo(workbench.getNo()); + } + } + data = StrUtil.trim(map.get("*期望交期").toString()); + if (StrUtil.isBlank(data)) { + sb.append("期望交期不能为空;"); + } else { + try { + if (data.contains(" ")) { + data = data.split(" ")[0]; + } + LocalDate date = LocalDate.parse(data, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + dto.setDeliveryDate(LocalDateTimeUtil.formatNormal(date)); + } catch (DateTimeParseException e) { + log.error("期望交期格式错误", e); + map.put("*期望交期", data); + sb.append("期望交期格式错误;"); + } + } + if (StrUtil.isBlank(sb.toString())) { + data = StrUtil.trim(map.get("采购单号").toString()); + if (StrUtil.isNotBlank(data)) { + try { + List orders = sapService.zim004(data, dto.getSupplierCode(), dto.getMaterialNo()); + if (CollectionUtil.isEmpty(orders)) { + sb.append("采购单号无效;"); + } else { + dto.setExternalOrderNo(data); + data = getData(map, "采购单行号"); + if (StrUtil.isNotBlank(data)) { + String finalData = data; + SAPMaterialInfoInOrderDTO order = orders.stream() + .filter(it -> StrUtil.equals(it.getEbelp(), finalData)) + .findFirst() + .orElse(null); + if (Objects.isNull(order)) { + sb.append("采购单行号无效;"); + } else { + dto.setRowNo(data); + data = getData(map, "数量"); + if (StrUtil.isNotBlank(data)) { + if (!NumberUtils.isCreatable(data)) { + sb.append("数量无效;"); + } else { + BigDecimal num = new BigDecimal(data); + if (order.getTransportNum().compareTo(num) < 0) { + sb.append("数量不能大于未收货数量(").append(order.getTransportNum()).append(");"); + } else { + dto.setNum(num); + } + } + } + } + } + } + } catch (NflgException e) { + sb.append(e.getMsg()).append(";"); + } + } + } + if (StrUtil.isBlank(sb.toString())) { + datas.add(dto); + } else { + map.put("错误信息", sb.toString()); + } + }); + if (datas.size() != maps.size()) { + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode(getResultName(file.getOriginalFilename()), StandardCharsets.UTF_8)); + try (ByteArrayOutputStream osOut = new ByteArrayOutputStream()) { + new Workbook() + .addSheet(new ListMapSheet<>(maps)) + .writeTo(osOut); + try (ByteArrayInputStream isIn = new ByteArrayInputStream(osOut.toByteArray())) { + return ApiResult.error(STATE.DataNoCheckPass, "导入文件失败" + , fileUploadService.upload("temp/" + DateTimeUtil.format(LocalDate.now(), "yyyyMMdd") + "/" + IdUtil.fastUUID() + ".xlsx" + , isIn + , "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")); + } + } catch (Exception e) { + return ApiResult.error(STATE.BusinessError, "保存文件出错"); + } + } else { + return ApiResult.success(datas); + } + } + + private String getData(Map map, String key) { + return StrUtil.trim(Optional.ofNullable(map.get(key)).orElse("").toString()); + } + + private String getResultName(String name) { + int index = name.lastIndexOf("."); + return name.substring(0, index) + "_结果" + "." + name.substring(index + 1); + } + /** * 搜索SAP订单 * @param request 请求参数 diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/StructuralPackageOrderImportDTO.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/StructuralPackageOrderImportDTO.java new file mode 100644 index 00000000..8a4d0994 --- /dev/null +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/pojo/dto/StructuralPackageOrderImportDTO.java @@ -0,0 +1,74 @@ +package com.nflg.wms.admin.pojo.dto; + +import lombok.Data; + +import java.math.BigDecimal; + +@Data +public class StructuralPackageOrderImportDTO { + + /** + * 钢构包料号 + */ + private String materialNo; + + /** + * 钢构包id + */ + private Long packageId; + + /** + * 供应商id + */ + private Long supplierId; + + /** + * 供应商编号 + */ + private String supplierCode; + + /** + * 供应商名称 + */ + private String supplierName; + + /** + * 机型id + */ + private Long modelId; + + /** + * 机型编号 + */ + private String modelNo; + + /** + * 机台id + */ + private Long workbenchId; + + /** + * 机台编号 + */ + private String workbenchNo; + + /** + * 期望交期 + */ + private String deliveryDate; + + /** + * 采购单订单号 + */ + private String externalOrderNo; + + /** + * 采购单订单行号 + */ + private String rowNo; + + /** + * 数量 + */ + private BigDecimal num; +} diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java index bf23fa2b..7e15b84e 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/SapService.java @@ -10,6 +10,7 @@ import com.nflg.wms.admin.pojo.dto.SAPMaterialInfoInOrderDTO; import com.nflg.wms.admin.pojo.dto.ZWM3A17DTO; import com.nflg.wms.admin.pojo.dto.ZWM3A18DTO; import com.nflg.wms.admin.util.JCoUtil; +import com.nflg.wms.common.constant.STATE; import com.nflg.wms.common.exception.SAPException; import com.nflg.wms.common.pojo.dto.*; import com.nflg.wms.common.pojo.qo.*; @@ -332,8 +333,8 @@ public class SapService { JCoFunction function = exec("ZIM_004", parameters); JCoStructure structure = function.getExportParameterList().getStructure("E_RETURN"); - VUtil.trueThrowBusinessError(!StrUtil.equals(structure.getString("TYPE"), "S")) - .throwMessage("SAP错误:" + structure.getString("MSG")); + VUtil.trueThrow(!StrUtil.equals(structure.getString("TYPE"), "S")) + .throwMessage(STATE.SAPErr, "SAP错误:" + structure.getString("MSG")); JCoTable table = function.getTableParameterList().getTable("T_OUT"); log.info("SAP返回: {}", table); diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/util/EecExcelUtil.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/util/EecExcelUtil.java index c88808b2..27118b62 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/util/EecExcelUtil.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/util/EecExcelUtil.java @@ -26,7 +26,6 @@ import java.util.stream.Collectors; /** * eecExcel - * * @Author 大米 */ public class EecExcelUtil { @@ -102,7 +101,6 @@ public class EecExcelUtil { /** * 行读取excel sheet 0 - * * @param hanlder * @param inputStream */ @@ -169,4 +167,13 @@ public class EecExcelUtil { return result; } + + public static List> handlerExcel(InputStream inputStream) throws IOException { + try (ExcelReader reader = ExcelReader.read(inputStream)) { + return reader.sheet(0) + .dataRows() + .map(Row::toMap) + .toList(); + } + } }