From 247f7ff1e4425fcb651e454e2baa288c136e4bb9 Mon Sep 17 00:00:00 2001 From: 10001392 <1055202292@qq.com> Date: Wed, 20 May 2026 16:23:58 +0800 Subject: [PATCH] =?UTF-8?q?1449=20MPM=E5=90=8C=E6=AD=A5=E7=89=A9=E6=96=99?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=8F=8A=E9=92=A2=E6=9E=84=E5=8C=85=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E7=9A=84=E6=8E=A5=E5=8F=A3=E5=BC=80=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/MaterialControllerService.java | 132 ++++++++++++++++++ 1 file changed, 132 insertions(+) diff --git a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java index 9e1d6408..5823d638 100644 --- a/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java +++ b/nflg-wms-admin/src/main/java/com/nflg/wms/admin/service/MaterialControllerService.java @@ -32,11 +32,16 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.math.NumberUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; import org.ttzero.excel.entity.ListSheet; import org.ttzero.excel.entity.Workbook; @@ -57,6 +62,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; @@ -82,6 +88,12 @@ public class MaterialControllerService { @Resource private IUserSupplierService userSupplierService; + @Resource + private RestTemplate restTemplate; + + @Value("${mpm.download.url}") + private String mpmDownloadUrl; + public void add(@Valid MaterialAddQO request) { WmsMaterial old = materialService.getCurrent(request.getNo()); VUtil.trueThrowBusinessError(Objects.nonNull(old) && !old.getComplete()) @@ -428,11 +440,131 @@ public class MaterialControllerService { wmsMaterial.setCreateTime(LocalDateTime.now()); wmsMaterial.setFromMpm(true); // 标记为来自MPM + // 如果fileindex和filename都不为空,则从MPM下载文件并上传到本系统 + if (StrUtil.isNotBlank(request.getFileindex()) && StrUtil.isNotBlank(request.getFilename())) { + try { + String fileUrl = downloadAndUploadFileFromMpm(request.getFileindex(), request.getFilename()); + if (StrUtil.isNotBlank(fileUrl)) { + wmsMaterial.setImage(fileUrl); + log.info("成功从MPM下载并上传文件: {}, 文件URL: {}", request.getNo(), fileUrl); + } else { + log.warn("从MPM下载文件失败,但继续同步图纸数据: {}", request.getNo()); + } + } catch (Exception e) { + log.error("从MPM下载并上传文件失败: {}, 错误: {}", request.getNo(), e.getMessage(), e); + // 文件下载失败不影响主流程,继续同步其他数据 + } + } + materialService.add(wmsMaterial); log.info("成功从MPM系统同步图纸数据: {}, 版本: {}", request.getNo(), wmsMaterial.getVersion()); } + /** + * 从MPM系统下载文件并上传到本系统 + * + * @param fileindex 文件索引 + * @param filename 文件名 + * @return 上传后的文件URL + */ + private String downloadAndUploadFileFromMpm(String fileindex, String filename) { + try { + // 构建MPM下载请求URL + String mpmRequestUrl = mpmDownloadUrl + "/" + filename + "," + fileindex; + log.info("请求MPM文件下载地址: {}", mpmRequestUrl); + + // 发送GET请求获取文件下载地址 + ResponseEntity> response = restTemplate.exchange( + mpmRequestUrl, + HttpMethod.GET, + null, + new ParameterizedTypeReference>() {} + ); + + Map responseBody = response.getBody(); + if (responseBody != null && Boolean.TRUE.equals(responseBody.get("success"))) { + Map data = (Map) responseBody.get("data"); + if (data != null && data.containsKey(filename)) { + String downloadUrl = data.get(filename); + log.info("获取到MPM文件下载地址: {}", downloadUrl); + + // 下载文件内容 + ResponseEntity fileResponse = restTemplate.exchange( + downloadUrl, + HttpMethod.GET, + null, + byte[].class + ); + + if (fileResponse.getStatusCode().is2xxSuccessful() && fileResponse.getBody() != null) { + byte[] fileContent = fileResponse.getBody(); + + // 生成文件路径 + String filePath = buildFilePathForMpm(filename); + + // 上传到本系统 + String uploadUrl = fileUploadService.upload( + filePath, + new java.io.ByteArrayInputStream(fileContent), + getContentType(filename) + ); + + log.info("文件上传成功,URL: {}", uploadUrl); + return uploadUrl; + } else { + log.error("从MPM下载文件失败,状态码: {}", fileResponse.getStatusCode()); + } + } else { + log.error("MPM响应中未找到文件下载地址: {}", filename); + } + } else { + log.error("MPM请求失败: {}", responseBody != null ? responseBody.get("message") : "未知错误"); + } + } catch (Exception e) { + log.error("从MPM下载并上传文件异常: fileindex={}, filename={}, 错误: {}", fileindex, filename, e.getMessage(), e); + } + + return null; + } + + /** + * 根据文件名生成文件路径 + * + * @param fileName 文件名 + * @return 文件路径 + */ + private String buildFilePathForMpm(String fileName) { + String fileType = "." + FilenameUtils.getExtension(fileName); + return StrUtil.format("admin/{}/{}/{}/{}{}", + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")), + "MPM_SYNC", + RandomUtil.randomString(4), + IdUtil.fastUUID(), + fileType); + } + + /** + * 根据文件扩展名获取Content-Type + * + * @param fileName 文件名 + * @return Content-Type + */ + private String getContentType(String fileName) { + String extension = FilenameUtils.getExtension(fileName).toLowerCase(); + return switch (extension) { + case "pdf" -> "application/pdf"; + case "jpg", "jpeg" -> "image/jpeg"; + case "png" -> "image/png"; + case "gif" -> "image/gif"; + case "doc" -> "application/msword"; + case "docx" -> "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; + case "xls" -> "application/vnd.ms-excel"; + case "xlsx" -> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; + default -> "application/octet-stream"; + }; + } + /** * 递增版本号 * @param currentVersion 当前版本号