diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java index a0d30095..e0522d8b 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsPdiStatusItemController.java @@ -88,7 +88,7 @@ public class QmsPdiStatusItemController extends BaseController { @PostMapping("/import") public ApiResult importData(@RequestParam("file") MultipartFile file, @NotNull(message = "PDI检测规则ID不能为空") @RequestParam Long detectionRulesId, - @NotNull(message = "状态不能为空") @RequestParam Integer status) throws IOException { + @NotNull(message = "状态不能为空") @RequestParam Integer status) throws Exception { statusItemControllerService.importFromExcel(file, detectionRulesId, status); return ApiResult.success(); } diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java index 810fdd06..e88d68f0 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiStatusItemControllerService.java @@ -1,6 +1,7 @@ package com.nflg.qms.admin.service; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.nflg.wms.common.exception.NflgException; @@ -13,20 +14,28 @@ import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemAddQO; import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemSearchQO; import com.nflg.wms.common.pojo.qo.QmsPdiStatusItemUpdateQO; import com.nflg.wms.common.pojo.vo.QmsPdiStatusItemGroupVO; +import com.nflg.wms.common.util.DateTimeUtil; import com.nflg.wms.common.util.EecExcelUtil; import com.nflg.wms.common.util.UserUtil; +import com.nflg.wms.repository.entity.FileUploadRecord; import com.nflg.wms.repository.entity.QmsPdiDetectionRulesStatusItem; import com.nflg.wms.repository.entity.QmsPdiDetectionRules; import com.nflg.wms.repository.mapper.QmsPdiDetectionRulesStatusItemMapper; +import com.nflg.wms.repository.service.IFileUploadRecordService; import com.nflg.wms.repository.service.IQmsPdiDetectionRulesStatusItemService; import com.nflg.wms.repository.service.IQmsPdiDetectionRulesService; +import com.nflg.wms.starter.service.FileUploadService; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import org.ttzero.excel.reader.Drawings; +import org.ttzero.excel.reader.ExcelReader; +import java.io.FileInputStream; import java.io.IOException; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Objects; @@ -42,6 +51,8 @@ public class QmsPdiStatusItemControllerService { private final IQmsPdiDetectionRulesStatusItemService statusItemService; private final QmsPdiDetectionRulesStatusItemMapper statusItemMapper; private final IQmsPdiDetectionRulesService pdiDetectionRulesService; + private final FileUploadService fileUploadService; + private final IFileUploadRecordService fileUploadRecordService; // ========================= 新增 ========================= @@ -143,7 +154,7 @@ public class QmsPdiStatusItemControllerService { */ public void export(HttpServletResponse response, List ids, Long detectionRulesId, List status) throws IOException { List data = statusItemMapper.listForExport(ids, detectionRulesId, status); - + // 根据状态列表生成文件名 StringBuilder statusName = new StringBuilder("PDI"); if (status.contains(0)) { @@ -156,7 +167,7 @@ public class QmsPdiStatusItemControllerService { statusName.append("特殊"); } statusName.append("检测项"); - + EecExcelUtil.export(statusName.toString(), statusName.toString(), data, response); } @@ -169,7 +180,7 @@ public class QmsPdiStatusItemControllerService { QmsPdiStatusItemImportDTO example = new QmsPdiStatusItemImportDTO() .setComponentsDes("示例部件描述") .setInspectionContent("示例检查核实内容") - .setInspectionImage(123456L); + .setInspectionImage("123456"); EecExcelUtil.export("PDI检测项导入模板", "PDI检测项导入模板", List.of(example), response); } @@ -179,11 +190,42 @@ public class QmsPdiStatusItemControllerService { * 导入PDI检测项 */ @Transactional - public void importFromExcel(MultipartFile file, Long detectionRulesId, Integer status) throws IOException { - List data = EecExcelUtil.readTo(file.getInputStream(), QmsPdiStatusItemImportDTO.class); + public void importFromExcel(MultipartFile file, Long detectionRulesId, Integer status) throws Exception { + // 先将文件内容缓存为字节数组,避免流只能读一次 + byte[] fileBytes = file.getBytes(); + + List data = EecExcelUtil.readTo(new java.io.ByteArrayInputStream(fileBytes), QmsPdiStatusItemImportDTO.class); if (CollectionUtil.isEmpty(data)) { throw new NflgException(STATE.BusinessError, "导入文件内容为空"); } + + // 读取 Excel 里的所有图片 + List pictures = new ExcelReader(new java.io.ByteArrayInputStream(fileBytes)).listPictures(); + + // 遍历 DTO,遇到 DISPIMG 就上传图片并替换地址 + for (int i = 0; i < data.size(); i++) { + QmsPdiStatusItemImportDTO dto = data.get(i); + String inspectionImage = dto.getInspectionImage(); + + // 如果是图片公式,就取图片上传,把地址填回去 + if (StrUtil.isNotBlank(inspectionImage) && inspectionImage.startsWith("=DISPIMG(")) { + if (i < pictures.size()) { + Drawings.Picture pic = pictures.get(i); + try (FileInputStream fis = new FileInputStream(pic.getLocalPath().toFile())) { + // 上传图片 → 获取地址 + String imageUrl = fileUploadService.upload( + "image/" + DateTimeUtil.format(LocalDate.now(), "yyyyMMdd") + "/" + IdUtil.fastUUID() + ".png", + fis, + "image/png" + ); + dto.setInspectionImage(imageUrl); + } + } else { + dto.setInspectionImage(null); + } + } + } + String operator = UserUtil.getUserName(); LocalDateTime now = LocalDateTime.now(); List entities = data.stream() diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java index d47d55a7..4d94e525 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/service/QmsPdiTaskRecordControllerService.java @@ -154,21 +154,8 @@ public class QmsPdiTaskRecordControllerService { .collect(Collectors.toMap(QmsPdiDetectionRulesStatusItem::getId, si -> si, (a, b) -> a)); } - // 收集所有示例图ID,批量查询file_upload_record - Set exampleImageIds = statusItemMap.values().stream() - .map(QmsPdiDetectionRulesStatusItem::getInspectionImage) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - Map exampleImageUrlMap = Map.of(); - if (!exampleImageIds.isEmpty()) { - List files = fileUploadRecordService.listByIds(exampleImageIds); - exampleImageUrlMap = files.stream() - .collect(Collectors.toMap(FileUploadRecord::getId, FileUploadRecord::getUrl, (a, b) -> a)); - } - // 映射 Map finalStatusMap = statusItemMap; - Map finalExampleImageUrlMap = exampleImageUrlMap; List voList = records.stream().map(r -> { QmsPdiTaskRecordDetailVO.StatusItemVO vo = new QmsPdiTaskRecordDetailVO.StatusItemVO(); vo.setId(r.getId()); @@ -176,10 +163,8 @@ public class QmsPdiTaskRecordControllerService { if (si != null) { vo.setComponentsDes(si.getComponentsDes()); vo.setInspectionContent(si.getInspectionContent()); - // 示例图ID转URL - if (si.getInspectionImage() != null) { - vo.setInspectionImage(finalExampleImageUrlMap.get(si.getInspectionImage())); - } + // inspectionImage 已经是URL,直接使用 + vo.setInspectionImage(si.getInspectionImage()); } // 现场图已经是List,无需转换(在下一步处理) vo.setInspectionItemImage(convertImageIdsToVO(r.getInspectionItemImage())); @@ -223,21 +208,8 @@ public class QmsPdiTaskRecordControllerService { .collect(Collectors.toMap(QmsPdiDetectionRulesStatusItem::getId, si -> si, (a, b) -> a)); } - // 收集所有示例图ID,批量查询file_upload_record - Set exampleImageIds = statusItemMap.values().stream() - .map(QmsPdiDetectionRulesStatusItem::getInspectionImage) - .filter(Objects::nonNull) - .collect(Collectors.toSet()); - Map exampleImageUrlMap = Map.of(); - if (!exampleImageIds.isEmpty()) { - List files = fileUploadRecordService.listByIds(exampleImageIds); - exampleImageUrlMap = files.stream() - .collect(Collectors.toMap(FileUploadRecord::getId, FileUploadRecord::getUrl, (a, b) -> a)); - } - // 映射 Map finalStatusMap = statusItemMap; - Map finalExampleImageUrlMap = exampleImageUrlMap; return records.stream().map(r -> { QmsPdiTaskRecordDetailVO.StatusItemVO vo = new QmsPdiTaskRecordDetailVO.StatusItemVO(); vo.setId(r.getId()); @@ -245,9 +217,8 @@ public class QmsPdiTaskRecordControllerService { if (si != null) { vo.setComponentsDes(si.getComponentsDes()); vo.setInspectionContent(si.getInspectionContent()); - if (si.getInspectionImage() != null) { - vo.setInspectionImage(finalExampleImageUrlMap.get(si.getInspectionImage())); - } + // inspectionImage 已经是URL,直接使用 + vo.setInspectionImage(si.getInspectionImage()); } vo.setInspectionItemImage(convertImageIdsToVO(r.getInspectionItemImage())); vo.setInspectionBy(r.getInspectionBy()); diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemExportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemExportDTO.java index d27b8809..5890f0aa 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemExportDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemExportDTO.java @@ -19,8 +19,8 @@ public class QmsPdiStatusItemExportDTO { @ExcelColumn("检查核实内容") private String inspectionContent; - @ExcelColumn("检测示例图(文件ID)") - private Long inspectionImage; + @ExcelColumn("检测示例图") + private String inspectionImage; @ExcelColumn("状态") private String statusName; diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemImportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemImportDTO.java index 0879f6ea..8328e394 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemImportDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsPdiStatusItemImportDTO.java @@ -24,10 +24,10 @@ public class QmsPdiStatusItemImportDTO { private String inspectionContent; /** - * 检测示例图(文件记录ID) + * 检测示例图(URL) */ - @ExcelColumn("检测示例图(文件ID)") - private Long inspectionImage; + @ExcelColumn("检测示例图") + private String inspectionImage; /** * 排序 diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java index 0b92db33..b9e18751 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsPdiStatusItemAddQO.java @@ -31,7 +31,7 @@ public class QmsPdiStatusItemAddQO { * 检测示例图(文件记录ID,必传) */ @NotNull(message = "检测示例图不能为空") - private Long inspectionImage; + private String inspectionImage; /** * 状态:0为静态,1为动态,2为特殊(必传) diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiStatusItemGroupVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiStatusItemGroupVO.java index ecdfbf42..a3f26caf 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiStatusItemGroupVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsPdiStatusItemGroupVO.java @@ -50,7 +50,7 @@ public class QmsPdiStatusItemGroupVO { /** * 检测示例图(文件记录ID) */ - private Long inspectionImage; + private String inspectionImage; /** * 状态:0为静态,1为动态,2为特殊 diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiDetectionRulesStatusItem.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiDetectionRulesStatusItem.java index 688f1cfe..f8f00334 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiDetectionRulesStatusItem.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsPdiDetectionRulesStatusItem.java @@ -44,7 +44,7 @@ public class QmsPdiDetectionRulesStatusItem implements Serializable { /** * 检测示例图(文件记录ID) */ - private Long inspectionImage; + private String inspectionImage; /** * 状态:0为静态,1为动态,2为特殊 diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsPdiDetectionRulesStatusItemMapper.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsPdiDetectionRulesStatusItemMapper.java index 52333929..c02eb245 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsPdiDetectionRulesStatusItemMapper.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/mapper/QmsPdiDetectionRulesStatusItemMapper.java @@ -24,4 +24,11 @@ public interface QmsPdiDetectionRulesStatusItemMapper extends BaseMapper listForExport(@Param("ids") List ids, @Param("detectionRulesId") Long detectionRulesId, @Param("status") List status); + + /** + * 导出检测项(返回实体对象) + */ + List listForExportRaw(@Param("ids") List ids, + @Param("detectionRulesId") Long detectionRulesId, + @Param("status") List status); } diff --git a/nflg-wms-repository/src/main/resources/mapper/QmsPdiDetectionRulesStatusItemMapper.xml b/nflg-wms-repository/src/main/resources/mapper/QmsPdiDetectionRulesStatusItemMapper.xml index f84d6b84..a3a575a7 100644 --- a/nflg-wms-repository/src/main/resources/mapper/QmsPdiDetectionRulesStatusItemMapper.xml +++ b/nflg-wms-repository/src/main/resources/mapper/QmsPdiDetectionRulesStatusItemMapper.xml @@ -26,4 +26,31 @@ ORDER BY s.id ASC + + +