From eabaf79d53852a68d030b94d0997210fa77ce284 Mon Sep 17 00:00:00 2001 From: funny <834502597@qq.com> Date: Thu, 7 May 2026 09:31:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(qms):=20=E6=94=AF=E6=8C=81=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E9=A1=B9=E5=AF=BC=E5=85=A5=E6=97=B6=E7=89=A9=E6=96=99?= =?UTF-8?q?=E7=B1=BB=E5=88=AB=E7=BC=96=E5=8F=B7=E5=92=8C=E6=8E=92=E5=BA=8F?= =?UTF-8?q?=E5=8F=B7=E6=A0=A1=E9=AA=8C=E5=8F=8A=E6=8E=92=E5=BA=8F=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 统一检测项导入文件中的物料类别编号格式,并校验物料类别存在性 - 实现导入时图片单元格嵌入解析并上传替换图例字段 - 新增检测项明细排序号字段,支持不传则默认插最前面,已有排序号整体+1 - 排序号超出范围自动修正,重复排序号会抛出业务异常 - 导入时校验同一物料类别内排序号不允许重复,并标记错误信息 - 新增保存检测项明细排序号处理的服务方法,替换原先简单保存调用 - 导入时检测类型和判定类型支持文字(定向/定量,目视/量具)转数字映射 - 导入后根据物料类别编号自动生成检测项编号和名称,按物料类别分组合并导入 - 查询检测项明细时按排序号升序返回 - 导入模板示例数据更新为物料类别编号和示例文字,导入接口支持错误提示文件返回 - 优化检测项导入导出Excel响应设置,提高导入导出用户体验 --- .../QmsInspectionItemController.java | 118 ++++++++++++------ .../QmsPdiStatusItemControllerService.java | 7 +- .../pojo/dto/QmsInspectionItemImportDTO.java | 34 +++-- .../pojo/dto/QmsPdiStatusItemExportDTO.java | 2 + .../pojo/qo/QmsInspectionItemAddQO.java | 5 + .../pojo/qo/QmsInspectionItemDetailAddQO.java | 5 + .../pojo/qo/QmsInspectionItemUpdateQO.java | 5 + .../pojo/vo/QmsInspectionItemDetailsVO.java | 5 + .../entity/QmsInspectionItemDetails.java | 5 + .../IQmsInspectionItemDetailsService.java | 8 ++ .../QmsInspectionItemDetailsServiceImpl.java | 41 ++++++ .../impl/QmsInspectionItemServiceImpl.java | 68 +++++++--- 12 files changed, 231 insertions(+), 72 deletions(-) diff --git a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsInspectionItemController.java b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsInspectionItemController.java index ccd90a90..f9fb237a 100644 --- a/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsInspectionItemController.java +++ b/nflg-qms-admin/src/main/java/com/nflg/qms/admin/controller/QmsInspectionItemController.java @@ -12,11 +12,12 @@ import com.nflg.wms.common.pojo.dto.QmsInspectionItemImportDTO; import com.nflg.wms.common.pojo.qo.QmsInspectionItemAddQO; import com.nflg.wms.common.pojo.qo.QmsInspectionItemSearchQO; import com.nflg.wms.common.pojo.qo.QmsInspectionItemUpdateQO; -import com.nflg.wms.common.pojo.vo.QmsInspectionItemDetailsVO; import com.nflg.wms.common.pojo.vo.QmsInspectionItemVO; import com.nflg.wms.common.util.DateTimeUtil; import com.nflg.wms.common.util.EecExcelUtil; +import com.nflg.wms.repository.entity.QmsQcMaterialCategory; import com.nflg.wms.repository.service.IQmsInspectionItemService; +import com.nflg.wms.repository.service.IQmsQcMaterialCategoryService; import com.nflg.wms.starter.BaseController; import com.nflg.wms.starter.service.FileUploadService; import jakarta.annotation.Resource; @@ -37,6 +38,10 @@ import java.io.FileInputStream; import java.io.IOException; import java.time.LocalDate; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.HashSet; +import java.util.stream.Collectors; /** * 检测项管理 @@ -48,6 +53,9 @@ public class QmsInspectionItemController extends BaseController { @Resource private IQmsInspectionItemService inspectionItemService; + @Resource + private IQmsQcMaterialCategoryService materialCategoryService; + @Resource private FileUploadService fileUploadService; @@ -131,14 +139,13 @@ public class QmsInspectionItemController extends BaseController { @GetMapping("template") public void template(HttpServletResponse response) throws IOException { // 构造一行示例数据 - QmsInspectionItemExportDTO example = new QmsInspectionItemExportDTO(); - example.setMaterialTypeId(1001L); - example.setDetectionType(0); - example.setInspectionItemName("示例检测项名称"); - example.setInspectionNo("示例检测项编号"); - example.setTestStandard("示例检测标准内容"); - example.setLegend("示例图例URL(可不填)"); - example.setDeterminationType(0); + QmsInspectionItemImportDTO example = new QmsInspectionItemImportDTO(); + example.setCategoryCode("物料类别编号"); + example.setSerialNo("数字1、2、3、4"); + example.setTestStandard("检测标准内容"); + example.setLegend("在此单元格嵌入图片"); + example.setDetectionType("定向/定量"); + example.setDeterminationType("目视/量具"); EecExcelUtil.export("检测项导入模板", "检测项导入模板", List.of(example), response); } @@ -148,59 +155,100 @@ public class QmsInspectionItemController extends BaseController { /** * 导入检测项 * 校验失败时返回带错误信息的文件URL - * 图例字段支持:图片URL + * 图例字段支持:单元格嵌入图片 * * @param file 导入文件 */ @Transactional @PostMapping("import") public ApiResult importFromExcel(@RequestParam("file") MultipartFile file) throws Exception { - List data = EecExcelUtil.getExcelContext(file.getInputStream(), QmsInspectionItemImportDTO.class); + byte[] fileBytes = file.getBytes(); + + List data = EecExcelUtil.getExcelContext( + new ByteArrayInputStream(fileBytes), QmsInspectionItemImportDTO.class); if (CollectionUtil.isEmpty(data)) { throw new NflgException(STATE.BusinessError, "导入文件内容为空"); } + // 读取 Excel 里的所有图片 + List pictures = new ExcelReader(new ByteArrayInputStream(fileBytes)).listPictures(); - // 2. 读取 Excel 里的所有图片(EEC 标准方式) - List pictures = new ExcelReader(file.getInputStream()).listPictures(); - - // 3. 遍历 DTO,遇到 DISPIMG 就上传图片并替换地址 + // 遍历 DTO,遇到 DISPIMG 就上传图片并替换地址 for (int i = 0; i < data.size(); i++) { QmsInspectionItemImportDTO dto = data.get(i); String legend = dto.getLegend(); - - // 如果是图片公式,就取图片上传,把地址填回去 if (StrUtil.isNotBlank(legend) && legend.startsWith("=DISPIMG(")) { if (i < pictures.size()) { Drawings.Picture pic = pictures.get(i); - FileInputStream fis = new FileInputStream(pic.getLocalPath().toFile()); - // 上传图片 → 获取地址 - String imageUrl = fileUploadService.upload( - "image/" + IdUtil.fastUUID() + ".png", - fis, - "image/png" - ); - dto.setLegend(imageUrl); // 把地址塞回去 + try (FileInputStream fis = new FileInputStream(pic.getLocalPath().toFile())) { + String imageUrl = fileUploadService.upload( + "image/" + IdUtil.fastUUID() + ".png", + fis, + "image/png" + ); + dto.setLegend(imageUrl); + } } else { dto.setLegend(null); } } } - // 校验必填字段 + // 校验必填字段 & 文字转数字 boolean hasError = false; for (QmsInspectionItemImportDTO dto : data) { StringBuilder sb = new StringBuilder(); - if (dto.getMaterialTypeId() == null) sb.append("物料类别ID不能为空;"); - if (dto.getDetectionType() == null) sb.append("检测类型不能为空;"); - if (dto.getInspectionItemName() == null || dto.getInspectionItemName().isBlank()) - sb.append("检测项名称不能为空;"); - if (dto.getInspectionNo() == null || dto.getInspectionNo().isBlank()) - sb.append("检测项编号不能为空;"); - if (dto.getTestStandard() == null || dto.getTestStandard().isBlank()) sb.append("检测标准不能为空;"); - if (dto.getDeterminationType() == null) sb.append("判定类型不能为空;"); + if (StrUtil.isBlank(dto.getCategoryCode())) { + sb.append("物料类别编号不能为空;"); + } else { + // 校验物料类别编号是否存在 + QmsQcMaterialCategory category = materialCategoryService.lambdaQuery() + .eq(QmsQcMaterialCategory::getCategoryCode, dto.getCategoryCode()) + .one(); + if (category == null) { + sb.append("物料类别编号[" + dto.getCategoryCode() + "]不存在;"); + } + } + if (StrUtil.isBlank(dto.getTestStandard())) sb.append("检测标准不能为空;"); + if (StrUtil.isBlank(dto.getDetectionType())) { + sb.append("检测类型不能为空;"); + } else if (!"定向".equals(dto.getDetectionType()) && !"定量".equals(dto.getDetectionType()) + && !"0".equals(dto.getDetectionType()) && !"1".equals(dto.getDetectionType())) { + sb.append("检测类型须为'定向'或'定量';"); + } + if (StrUtil.isBlank(dto.getDeterminationType())) { + sb.append("判定类型不能为空;"); + } else if (!"目视".equals(dto.getDeterminationType()) && !"量具".equals(dto.getDeterminationType()) + && !"0".equals(dto.getDeterminationType()) && !"1".equals(dto.getDeterminationType())) { + sb.append("判定类型须为'目视'或'量具';"); + } dto.setError(sb.toString()); - if (sb.length() > 0) hasError = true; + if (!sb.isEmpty()) hasError = true; + } + + // 校验同一物料类别编号内排序号不重复 + Map> grouped = data.stream() + .filter(dto -> StrUtil.isNotBlank(dto.getCategoryCode())) + .collect(Collectors.groupingBy(QmsInspectionItemImportDTO::getCategoryCode)); + for (List group : grouped.values()) { + List sortNos = group.stream() + .map(QmsInspectionItemImportDTO::getSerialNo) + .filter(StrUtil::isNotBlank) + .collect(Collectors.toList()); + Set unique = new HashSet<>(sortNos); + if (unique.size() < sortNos.size()) { + // 标记重复的行 + Set seen = new HashSet<>(); + for (QmsInspectionItemImportDTO dto : group) { + if (StrUtil.isNotBlank(dto.getSerialNo())) { + if (!seen.add(dto.getSerialNo().trim())) { + String err = dto.getError() == null ? "" : dto.getError(); + dto.setError(err + "同一物料类别内排序号重复;"); + hasError = true; + } + } + } + } } if (!hasError) { 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 e88d68f0..435c5398 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 @@ -30,6 +30,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import org.ttzero.excel.entity.ListSheet; +import org.ttzero.excel.entity.Workbook; import org.ttzero.excel.reader.Drawings; import org.ttzero.excel.reader.ExcelReader; @@ -168,7 +170,10 @@ public class QmsPdiStatusItemControllerService { } statusName.append("检测项"); - EecExcelUtil.export(statusName.toString(), statusName.toString(), data, response); + EecExcelUtil.setResponseExcelHeader(response, statusName.toString()); + new Workbook() + .addSheet(new ListSheet<>(statusName.toString(), data).setRowHeight(60)) + .writeTo(response.getOutputStream()); } // ========================= 下载导入模板 ========================= diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsInspectionItemImportDTO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsInspectionItemImportDTO.java index 4bbf730f..918008e5 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsInspectionItemImportDTO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/dto/QmsInspectionItemImportDTO.java @@ -10,28 +10,16 @@ import org.ttzero.excel.annotation.ExcelColumn; public class QmsInspectionItemImportDTO { /** - * 物料类别ID + * 物料类别编号(用户填写 category_code) */ - @ExcelColumn("物料类别ID*") - private Long materialTypeId; + @ExcelColumn("物料类别编号*") + private String categoryCode; /** - * 检测类型:0=定向,1=定量 + * 检测项序号(数字1、2、3、4...) */ - @ExcelColumn("检测类型(0定向/1定量)*") - private Integer detectionType; - - /** - * 检测项名称 - */ - @ExcelColumn("检测项名称*") - private String inspectionItemName; - - /** - * 检测项编号 - */ - @ExcelColumn("检测项编号*") - private String inspectionNo; + @ExcelColumn("检测项序号*") + private String serialNo; /** * 检测标准 @@ -46,10 +34,16 @@ public class QmsInspectionItemImportDTO { private String legend; /** - * 判定类型:0=目视,1=量具 + * 检测类型:用户输入"定向"/"定量",后端匹配为0/1 + */ + @ExcelColumn("检测类型(0定向/1定量)*") + private String detectionType; + + /** + * 判定类型:用户输入"目视"/"量具",后端匹配为0/1 */ @ExcelColumn("判定类型(0目视/1量具)*") - private Integer determinationType; + private String determinationType; /** * 错误信息(导入校验结果) 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 5890f0aa..57f63302 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 @@ -3,6 +3,7 @@ package com.nflg.wms.common.pojo.dto; import lombok.Data; import lombok.experimental.Accessors; import org.ttzero.excel.annotation.ExcelColumn; +import org.ttzero.excel.annotation.MediaColumn; import java.time.LocalDateTime; @@ -20,6 +21,7 @@ public class QmsPdiStatusItemExportDTO { private String inspectionContent; @ExcelColumn("检测示例图") + @MediaColumn private String inspectionImage; @ExcelColumn("状态") diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemAddQO.java index ccfc1764..16bf339c 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemAddQO.java @@ -48,6 +48,11 @@ public class QmsInspectionItemAddQO { */ @Data public static class DetailQO { + /** + * 排序号(可选,不传则默认插到最前面,已有记录+1) + */ + private Integer sortNo; + /** * 检测标准(必传) */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemDetailAddQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemDetailAddQO.java index 1d60b5be..e0c921e2 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemDetailAddQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemDetailAddQO.java @@ -16,6 +16,11 @@ public class QmsInspectionItemDetailAddQO { @NotNull(message = "检测项ID不能为空") private Long inspectionItemId; + /** + * 排序号(可选,不传则默认插到最前面,已有记录+1) + */ + private Integer sortNo; + /** * 检测标准(必传) */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemUpdateQO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemUpdateQO.java index d29c6310..0534b855 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemUpdateQO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/qo/QmsInspectionItemUpdateQO.java @@ -50,6 +50,11 @@ public class QmsInspectionItemUpdateQO { */ @Data public static class DetailQO { + /** + * 排序号(可选) + */ + private Integer sortNo; + /** * 检测标准(必传) */ diff --git a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionItemDetailsVO.java b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionItemDetailsVO.java index ca0f36b2..4cfa2524 100644 --- a/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionItemDetailsVO.java +++ b/nflg-wms-common/src/main/java/com/nflg/wms/common/pojo/vo/QmsInspectionItemDetailsVO.java @@ -15,6 +15,11 @@ public class QmsInspectionItemDetailsVO { */ private Long inspectionItemId; + /** + * 排序号 + */ + private Integer sortNo; + /** * 检测标准 */ diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectionItemDetails.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectionItemDetails.java index a92c1550..98729bf0 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectionItemDetails.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/entity/QmsInspectionItemDetails.java @@ -35,6 +35,11 @@ public class QmsInspectionItemDetails implements Serializable { */ private Long inspectionItemId; + /** + * 检测项序号 + */ + private Integer sortNo; + /** * 检测标准 */ diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectionItemDetailsService.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectionItemDetailsService.java index e472b33d..761f8ae9 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectionItemDetailsService.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/IQmsInspectionItemDetailsService.java @@ -19,4 +19,12 @@ public interface IQmsInspectionItemDetailsService extends IService ids); + + /** + * 保存明细并处理排序号逻辑: + * - sortNo为null → 默认1,已有记录全部+1 + * - sortNo已存在 → 报错 + * - sortNo超出max+1 → 自动修正为max+1 + */ + void saveDetailWithSortNo(QmsInspectionItemDetails detail); } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectionItemDetailsServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectionItemDetailsServiceImpl.java index 8d314750..0575172d 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectionItemDetailsServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectionItemDetailsServiceImpl.java @@ -1,6 +1,8 @@ package com.nflg.wms.repository.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.nflg.wms.common.constant.STATE; +import com.nflg.wms.common.exception.NflgException; import com.nflg.wms.repository.entity.QmsInspectionItemDetails; import com.nflg.wms.repository.mapper.QmsInspectionItemDetailsMapper; import com.nflg.wms.repository.service.IQmsInspectionItemDetailsService; @@ -21,6 +23,7 @@ public class QmsInspectionItemDetailsServiceImpl public List listByItemId(Long inspectionItemId) { return lambdaQuery() .eq(QmsInspectionItemDetails::getInspectionItemId, inspectionItemId) + .orderByAsc(QmsInspectionItemDetails::getSortNo) .list(); } @@ -31,4 +34,42 @@ public class QmsInspectionItemDetailsServiceImpl removeByIds(ids); } } + + @Transactional + @Override + public void saveDetailWithSortNo(QmsInspectionItemDetails detail) { + Long itemId = detail.getInspectionItemId(); + Integer sortNo = detail.getSortNo(); + + // 获取当前最大排序号 + QmsInspectionItemDetails maxRecord = lambdaQuery() + .eq(QmsInspectionItemDetails::getInspectionItemId, itemId) + .orderByDesc(QmsInspectionItemDetails::getSortNo) + .last("LIMIT 1") + .one(); + int maxSortNo = (maxRecord != null && maxRecord.getSortNo() != null) ? maxRecord.getSortNo() : 0; + + if (sortNo == null) { + // 未传排序号 → 插到最前面(1),已有记录全部+1 + lambdaUpdate() + .eq(QmsInspectionItemDetails::getInspectionItemId, itemId) + .setSql("sort_no = sort_no + 1") + .update(); + detail.setSortNo(1); + } else { + // 检查重复 + boolean exists = lambdaQuery() + .eq(QmsInspectionItemDetails::getInspectionItemId, itemId) + .eq(QmsInspectionItemDetails::getSortNo, sortNo) + .exists(); + if (exists) { + throw new NflgException(STATE.BusinessError, "排序号[" + sortNo + "]已存在"); + } + // 超出范围则修正为 max+1 + if (sortNo > maxSortNo + 1) { + detail.setSortNo(maxSortNo + 1); + } + } + save(detail); + } } diff --git a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectionItemServiceImpl.java b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectionItemServiceImpl.java index b845b6b6..14e200ab 100644 --- a/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectionItemServiceImpl.java +++ b/nflg-wms-repository/src/main/java/com/nflg/wms/repository/service/impl/QmsInspectionItemServiceImpl.java @@ -82,10 +82,11 @@ public class QmsInspectionItemServiceImpl extends ServiceImpl detailsList = detailsService.lambdaQuery() .eq(QmsInspectionItemDetails::getInspectionItemId, id) + .orderByAsc(QmsInspectionItemDetails::getSortNo) .list() .stream() .map(this::toDetailsVO) @@ -269,29 +272,40 @@ public class QmsInspectionItemServiceImpl extends ServiceImpl> grouped = dtos.stream() - .filter(dto -> Objects.nonNull(dto.getMaterialTypeId()) - && Objects.nonNull(dto.getDetectionType()) - && StrUtil.isNotBlank(dto.getInspectionItemName()) - && StrUtil.isNotBlank(dto.getInspectionNo()) + .filter(dto -> StrUtil.isNotBlank(dto.getCategoryCode()) && StrUtil.isNotBlank(dto.getTestStandard()) - && Objects.nonNull(dto.getDeterminationType())) - .collect(Collectors.groupingBy(dto -> dto.getInspectionNo() + "|" + dto.getInspectionItemName())); + && StrUtil.isNotBlank(dto.getDetectionType()) + && StrUtil.isNotBlank(dto.getDeterminationType())) + .collect(Collectors.groupingBy(QmsInspectionItemImportDTO::getCategoryCode)); for (Map.Entry> entry : grouped.entrySet()) { List list = entry.getValue(); if (list.isEmpty()) continue; - // 取第一行作为主表数据 + String categoryCode = entry.getKey(); QmsInspectionItemImportDTO first = list.get(0); + // 查找物料类别 + QmsQcMaterialCategory category = materialCategoryService.lambdaQuery() + .eq(QmsQcMaterialCategory::getCategoryCode, categoryCode) + .one(); + if (category == null) continue; + + // 自动生成编号和名称 + String inspectionNo = "CATD_" + categoryCode; + String inspectionItemName = buildCategoryFullPath(category.getId()); + + // 检测类型文字转数字 + Integer detectionType = parseDetectionType(first.getDetectionType()); + // 创建主表记录 QmsInspectionItem item = new QmsInspectionItem() - .setMaterialTypeId(first.getMaterialTypeId()) - .setDetectionType(first.getDetectionType()) - .setInspectionItemName(first.getInspectionItemName()) - .setInspectionNo(first.getInspectionNo()) + .setMaterialTypeId(category.getId()) + .setDetectionType(detectionType) + .setInspectionItemName(inspectionItemName) + .setInspectionNo(inspectionNo) .setCreateBy(operator) .setCreateTime(now) .setUpdateBy(operator) @@ -300,16 +314,37 @@ public class QmsInspectionItemServiceImpl extends ServiceImpl