From 5ab59e93d1f37c0083c629231814023731747172 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Thu, 12 Feb 2026 11:30:21 +0800 Subject: [PATCH] =?UTF-8?q?2026-02-12=20=E7=89=B9=E6=AE=8A=E5=B7=A1?= =?UTF-8?q?=E6=A3=80=E9=85=8D=E7=BD=AE=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/pms/controller/QcController.java | 9 + .../modules/pms/data/GetParamInData.java | 10 ++ .../service/Impl/QcBaseInfoServiceImpl.java | 156 ++++++++++++++++++ .../pms/service/QcBaseInfoService.java | 3 + 4 files changed, 178 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 bd9e932..033077e 100644 --- a/src/main/java/com/gaotao/modules/pms/controller/QcController.java +++ b/src/main/java/com/gaotao/modules/pms/controller/QcController.java @@ -1996,6 +1996,15 @@ public class QcController { return R.ok().put("rows", list); } + /** + * 巡检配置批量导入 + **/ + @PostMapping("/patrolConfigUpload") + public R patrolConfigUpload(@RequestParam(value = "file") MultipartFile file, @ModelAttribute GetParamInData data){ + qcBaseInfoService.patrolConfigUpload(file, data); + return R.ok().put("msg", "导入成功"); + } + } diff --git a/src/main/java/com/gaotao/modules/pms/data/GetParamInData.java b/src/main/java/com/gaotao/modules/pms/data/GetParamInData.java index 723017d..adf5699 100644 --- a/src/main/java/com/gaotao/modules/pms/data/GetParamInData.java +++ b/src/main/java/com/gaotao/modules/pms/data/GetParamInData.java @@ -54,6 +54,16 @@ public class GetParamInData { private String status; + private String partNo; + + public String getPartNo() { + return partNo; + } + + public void setPartNo(String partNo) { + this.partNo = partNo; + } + public String getBuNo() { return buNo; } 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 df2099d..e34b64c 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 @@ -1458,4 +1458,160 @@ public class QcBaseInfoServiceImpl implements QcBaseInfoService { return qcBaseInfoMapper.getAllOperationDescList(params); } + /** + * 巡检配置批量导入 + **/ + @Override + @Transactional + public void patrolConfigUpload(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; + + // 记录是否有默认配置 + boolean hasDefault = false; + String defaultOperationDesc = null; + + // 遍历每一行, 从第二行开始(第一行是列名) + 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); + + // 读取工序 + if (row.getCell(0) == null || StringUtils.isBlank(row.getCell(0).getStringCellValue())) { + errInfo.append("第").append(j + 1).append("行工序不能为空;"); + errorCount++; + continue; + } + String operationDesc = row.getCell(0).getStringCellValue().trim(); + + // 读取首次巡检时长 + Double firstInspectionDuration = null; + if (row.getCell(1) != null) { + try { + firstInspectionDuration = row.getCell(1).getNumericCellValue(); + } catch (Exception e) { + errInfo.append("第").append(j + 1).append("行首次巡检时长格式错误;"); + errorCount++; + continue; + } + } + + // 读取下次巡检时长 + Double nextInspectionDuration = null; + if (row.getCell(2) != null) { + try { + nextInspectionDuration = row.getCell(2).getNumericCellValue(); + } catch (Exception e) { + errInfo.append("第").append(j + 1).append("行下次巡检时长格式错误;"); + errorCount++; + continue; + } + } + + // 读取累计巡检时长 + Double totalInspectionDuration = null; + if (row.getCell(3) != null) { + try { + totalInspectionDuration = row.getCell(3).getNumericCellValue(); + } catch (Exception e) { + errInfo.append("第").append(j + 1).append("行累计巡检时长格式错误;"); + errorCount++; + continue; + } + } + + // 读取是否默认 + String defaultFlag = "N"; + if (row.getCell(4) != null) { + String defaultStr = row.getCell(4).getStringCellValue().trim(); + if ("是".equals(defaultStr) || "Y".equalsIgnoreCase(defaultStr)) { + defaultFlag = "Y"; + if (hasDefault) { + errInfo.append("第").append(j + 1).append("行设置为默认,但已存在默认配置(").append(defaultOperationDesc).append(");"); + errorCount++; + continue; + } + hasDefault = true; + defaultOperationDesc = operationDesc; + } + } + + // 构建参数 + Map params = new HashMap<>(); + params.put("site", data.getSite()); + params.put("buNo", data.getBuNo()); + params.put("partNo", data.getPartNo()); + params.put("operationDesc", operationDesc); + params.put("firstInspectionDuration", firstInspectionDuration); + params.put("nextInspectionDuration", nextInspectionDuration); + params.put("totalInspectionDuration", totalInspectionDuration); + params.put("defaultFlag", defaultFlag); + + // 检查是否已存在该工序的配置 + Map checkParams = new HashMap<>(); + checkParams.put("site", data.getSite()); + checkParams.put("buNo", data.getBuNo()); + checkParams.put("partNo", data.getPartNo()); + List> existList = qcBaseInfoMapper.getPatrolConfigList(checkParams); + + boolean exists = false; + for (Map exist : existList) { + if (operationDesc.equals(exist.get("operationDesc"))) { + exists = true; + break; + } + } + + // 如果设置为默认,先清除其他默认标识 + if ("Y".equals(defaultFlag)) { + qcBaseInfoMapper.clearPatrolConfigDefaultFlag(params); + } + + if (exists) { + // 更新 + qcBaseInfoMapper.updatePatrolConfig(params); + } else { + // 新增 + qcBaseInfoMapper.savePatrolConfig(params); + } + + 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 d89bb03..96a386f 100644 --- a/src/main/java/com/gaotao/modules/pms/service/QcBaseInfoService.java +++ b/src/main/java/com/gaotao/modules/pms/service/QcBaseInfoService.java @@ -164,4 +164,7 @@ public interface QcBaseInfoService { // 查询所有工序列表 List getAllOperationDescList(Map params); + + // 巡检配置批量导入 + void patrolConfigUpload(MultipartFile file, GetParamInData data); }