From 487c7b1eadb6366abf78b42bba4a652a645ee1a6 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Tue, 14 Apr 2026 14:40:21 +0800 Subject: [PATCH] =?UTF-8?q?2026-04-14=20=E7=89=A9=E6=96=99=E6=A1=A3?= =?UTF-8?q?=E6=A1=88=E7=AE=A1=E7=90=86=E5=A2=9E=E5=8A=A0=E2=80=9C=E6=A3=80?= =?UTF-8?q?=E9=AA=8C=E6=A0=87=E5=87=86=E7=BB=B4=E6=8A=A4=E2=80=9D=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/pms/controller/QcController.java | 6 + .../service/Impl/QcBaseInfoServiceImpl.java | 143 ++++++++++++++++++ .../pms/service/QcBaseInfoService.java | 2 + 3 files changed, 151 insertions(+) diff --git a/src/main/java/com/gaotao/modules/pms/controller/QcController.java b/src/main/java/com/gaotao/modules/pms/controller/QcController.java index d932b65..03a002a 100644 --- a/src/main/java/com/gaotao/modules/pms/controller/QcController.java +++ b/src/main/java/com/gaotao/modules/pms/controller/QcController.java @@ -2054,6 +2054,12 @@ public class QcController { return R.ok().put("msg", "导入成功"); } + @PostMapping("/qcSpecUpload") + public R qcSpecUpload(@RequestParam(value = "file") MultipartFile file, @ModelAttribute GetParamInData data){ + qcBaseInfoService.qcSpecUpload(file, data); + return R.ok().put("msg", "导入成功"); + } + } diff --git a/src/main/java/com/gaotao/modules/pms/service/Impl/QcBaseInfoServiceImpl.java b/src/main/java/com/gaotao/modules/pms/service/Impl/QcBaseInfoServiceImpl.java index 6259656..12b6180 100644 --- a/src/main/java/com/gaotao/modules/pms/service/Impl/QcBaseInfoServiceImpl.java +++ b/src/main/java/com/gaotao/modules/pms/service/Impl/QcBaseInfoServiceImpl.java @@ -1666,4 +1666,147 @@ public class QcBaseInfoServiceImpl implements QcBaseInfoService { } } + @Override + @Transactional + public void qcSpecUpload(MultipartFile file, GetParamInData data) { + try { + InputStream is = file.getInputStream(); + XSSFWorkbook workbook = new XSSFWorkbook(is); + XSSFSheet sheet = workbook.getSheetAt(0); + int rows = sheet.getPhysicalNumberOfRows(); + + StringBuilder errInfo = new StringBuilder(); + int successCount = 0; + int errorCount = 0; + + // 先获取所有检验类型用于匹配 + QcInspectionTypeData searchData = new QcInspectionTypeData(); + searchData.setSite(data.getSite()); + List typeList = qcBaseInfoMapper.inspectionTypeSearch(searchData); + org.apache.poi.ss.usermodel.DataFormatter formatter = new org.apache.poi.ss.usermodel.DataFormatter(); + + for (int j = 1; j < rows; j++) { + try { + if (sheet.getRow(j) == null || sheet.getRow(j).getCell(0) == null) { + continue; + } + + XSSFRow row = sheet.getRow(j); + + // 检验类型 + String inspectionTypeName = formatter.formatCellValue(row.getCell(0)).trim(); + if (StringUtils.isBlank(inspectionTypeName)) { + errInfo.append("第").append(j + 1).append("行检验类型不能为空;"); + errorCount++; + continue; + } + + // 项目编码 + String itemNo = formatter.formatCellValue(row.getCell(1)).trim(); + if (StringUtils.isBlank(itemNo)) { + errInfo.append("第").append(j + 1).append("行项目编码不能为空;"); + errorCount++; + continue; + } + + // 标准值 + String defaultValue = formatter.formatCellValue(row.getCell(2)).trim(); + if (StringUtils.isBlank(defaultValue)) { + defaultValue = null; + } + + // 最大值 + BigDecimal maxValue = null; + String maxStr = formatter.formatCellValue(row.getCell(3)).trim(); + if (StringUtils.isNotBlank(maxStr)) { + try { + maxValue = new BigDecimal(maxStr); + } catch (Exception e) { + errInfo.append("第").append(j + 1).append("行最大值格式错误;"); + errorCount++; + continue; + } + } + + // 最小值 + BigDecimal minValue = null; + String minStr = formatter.formatCellValue(row.getCell(4)).trim(); + if (StringUtils.isNotBlank(minStr)) { + try { + minValue = new BigDecimal(minStr); + } catch (Exception e) { + errInfo.append("第").append(j + 1).append("行最小值格式错误;"); + errorCount++; + continue; + } + } + + if (maxValue != null && minValue != null && maxValue.compareTo(minValue) < 0) { + errInfo.append("第").append(j + 1).append("行最大值不能小于最小值;"); + errorCount++; + continue; + } + + // 查找检验类型编码 + String inspectionTypeNo = null; + if ("IPQC".equalsIgnoreCase(inspectionTypeName)) { + inspectionTypeNo = "101"; + } else if ("IQC".equalsIgnoreCase(inspectionTypeName)) { + inspectionTypeNo = "105"; + } else if ("FQC".equalsIgnoreCase(inspectionTypeName)) { + inspectionTypeNo = "107"; + } else if ("OQC".equalsIgnoreCase(inspectionTypeName)) { + inspectionTypeNo = "109"; + } else { + for (QcInspectionTypeData type : typeList) { + if (inspectionTypeName.equals(type.getInspectionTypeName())) { + inspectionTypeNo = type.getInspectionTypeNo(); + break; + } + } + } + + if (inspectionTypeNo == null) { + errInfo.append("第").append(j + 1).append("行检验类型不存在;"); + errorCount++; + continue; + } + + QcSpecData qcSpecData = new QcSpecData(); + qcSpecData.setSite(data.getSite()); + qcSpecData.setBuNo(data.getBuNo()); + qcSpecData.setPartNo(data.getPartNo()); + qcSpecData.setItemNo(itemNo); + qcSpecData.setInspectionTypeNo(inspectionTypeNo); + qcSpecData.setDefaultValue(defaultValue); + qcSpecData.setMaxValue(maxValue); + qcSpecData.setMinValue(minValue); + qcSpecData.setCreateBy(data.getCreateBy()); + + // 先删除再保存,实现覆盖更新 + qcBaseInfoMapper.qcSpecDelete(qcSpecData); + qcBaseInfoMapper.qcSpecSave(qcSpecData); + + successCount++; + + } catch (Exception e) { + errInfo.append("第").append(j + 1).append("行导入失败:").append(e.getMessage()).append(";"); + errorCount++; + log.error("导入第{}行失败", j + 1, e); + } + } + + workbook.close(); + is.close(); + + if (errorCount > 0) { + throw new RuntimeException("导入完成,成功" + successCount + "条,失败" + errorCount + "条;" + errInfo.toString()); + } + + } catch (Exception e) { + log.error("检验标准导入失败", e); + throw new RuntimeException(e.getMessage()); + } + } + } diff --git a/src/main/java/com/gaotao/modules/pms/service/QcBaseInfoService.java b/src/main/java/com/gaotao/modules/pms/service/QcBaseInfoService.java index 7ec41eb..ac354f9 100644 --- a/src/main/java/com/gaotao/modules/pms/service/QcBaseInfoService.java +++ b/src/main/java/com/gaotao/modules/pms/service/QcBaseInfoService.java @@ -177,4 +177,6 @@ public interface QcBaseInfoService { // 巡检配置批量导入 void patrolConfigUpload(MultipartFile file, GetParamInData data); + + void qcSpecUpload(MultipartFile file, GetParamInData data); }