From cbbf2db4ebcaec8342583b6526505e13fa06ca00 Mon Sep 17 00:00:00 2001 From: caozehui <2427765068@qq.com> Date: Mon, 24 Feb 2025 16:31:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E8=AE=A1=E5=88=92-=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E4=B8=AD=E3=80=81=E6=A3=80=E6=B5=8B=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E4=BF=AE=E6=94=B9=E8=84=9A=E6=9C=AC=E3=80=81?= =?UTF-8?q?=E8=AF=AF=E5=B7=AE=E4=BD=93=E7=B3=BB=EF=BC=8C=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=88=86=E6=9E=90=E5=BE=AE=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../plan/pojo/enums/PlanResponseEnum.java | 4 +- .../plan/service/impl/AdPlanServiceImpl.java | 104 ++++++++++++++---- 2 files changed, 87 insertions(+), 21 deletions(-) diff --git a/detection/src/main/java/com/njcn/gather/plan/pojo/enums/PlanResponseEnum.java b/detection/src/main/java/com/njcn/gather/plan/pojo/enums/PlanResponseEnum.java index ba3db274..ea5c84ab 100644 --- a/detection/src/main/java/com/njcn/gather/plan/pojo/enums/PlanResponseEnum.java +++ b/detection/src/main/java/com/njcn/gather/plan/pojo/enums/PlanResponseEnum.java @@ -11,7 +11,9 @@ public enum PlanResponseEnum { PLAN_REPEATED("A003014", "当前模式下,该计划已存在"), PLAN_NOT_EXIST("A003015", "该计划不存在"), SCRIPT_RELATE_DICT_NOT_EXIST("A003016","脚本关联的字典不存在"), - NOT_CHECKED_PLAN_CANNOT_ANALYSE("A003017","只有检测状态为检测完成的计划才能进行统计分析" ); + NOT_CHECKED_PLAN_CANNOT_ANALYSE("A003017","只有检测状态为检测完成的计划才能进行统计分析" ), + CANNOT_CHANGE_SCRIPT_WHEN_CHECKING("A003018","只有检测状态为未检时,才能修改检测脚本" ), + CANNOT_CHANGE_ERROR_SYS_WHEN_CHECKING("A003019","只有检测状态为未检时,才能修改误差体系" ); private final String message; private final String code; diff --git a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java index 153e0c12..1716c3ea 100644 --- a/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java +++ b/detection/src/main/java/com/njcn/gather/plan/service/impl/AdPlanServiceImpl.java @@ -20,6 +20,7 @@ import com.njcn.gather.device.pojo.param.PqDevParam; import com.njcn.gather.device.pojo.po.PqDev; import com.njcn.gather.device.pojo.vo.CNDevExcel; import com.njcn.gather.device.service.IPqDevService; +import com.njcn.gather.err.pojo.po.PqErrSys; import com.njcn.gather.err.service.IPqErrSysService; import com.njcn.gather.plan.mapper.AdPlanMapper; import com.njcn.gather.plan.pojo.enums.DataSourceEnum; @@ -159,17 +160,24 @@ public class AdPlanServiceImpl extends ServiceImpl impleme @Transactional(rollbackFor = {Exception.class}) public boolean updateAdPlan(AdPlanParam.UpdateParam param) { this.checkRepeat(param, true); - AdPlan adPlan = new AdPlan(); - BeanUtil.copyProperties(param, adPlan); - - adPlan.setDatasourceId(String.join(StrUtil.COMMA, param.getDatasourceIds())); + AdPlan plan1 = this.getById(param.getId()); + AdPlan plan2 = new AdPlan(); + if (plan1.getTestState() != CheckStateEnum.UNCHECKED.getValue()) { + if (!plan1.getScriptId().equals(param.getScriptId())){ + throw new BusinessException(PlanResponseEnum.CANNOT_CHANGE_SCRIPT_WHEN_CHECKING); + } + if (!plan1.getErrorSysId().equals(param.getErrorSysId())) { + throw new BusinessException(PlanResponseEnum.CANNOT_CHANGE_ERROR_SYS_WHEN_CHECKING); + } + } + BeanUtil.copyProperties(param, plan2); + plan2.setDatasourceId(String.join(StrUtil.COMMA, param.getDatasourceIds())); // 修改检测计划、检测源关联 adPlanSourceService.updateAdPlanSource(param.getId(), param.getSourceIds()); + plan2.setTestState(pqDevService.bind(param.getId(), param.getDevIds())); - adPlan.setTestState(pqDevService.bind(param.getId(), param.getDevIds())); - - return this.updateById(adPlan); + return this.updateById(plan2); } @Override @@ -432,9 +440,19 @@ public class AdPlanServiceImpl extends ServiceImpl impleme } }); - Map> sheets = new HashMap<>(); + Map> sheets = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if (o1.equals("概览")) { + return -1; + } else { + return o1.compareTo(o2); + } + } + }); if (planList.size() > 1) { + StringBuffer allNote = new StringBuffer(); List allDevList = new ArrayList<>(); for (AdPlan plan : planList) { PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); @@ -442,22 +460,58 @@ public class AdPlanServiceImpl extends ServiceImpl impleme List devList = pqDevService.listByPlanId(queryParam); devList = devList.stream().filter(x -> !x.getCheckResult().equals(CheckResultEnum.UNCHECKED.getValue())).collect(Collectors.toList()); allDevList.addAll(devList); - sheets.put(plan.getName(), getRows(plan.getName(), devList, maxTime)); + + allNote.append(plan.getName() + "计划" + devList.size() + "台,"); + if (plan.getName().equals("概览")) { + sheets.put(plan.getName() + "检测计划", getRows(plan.getName(), devList, maxTime, getNote(plan, devList))); + } else { + sheets.put(plan.getName(), getRows(plan.getName(), devList, maxTime, getNote(plan, devList))); + } } - sheets.put("All", getRows("数据分析结果-所有计划", allDevList, maxTime)); + allNote.insert(0, "说明:总计" + allDevList.size() + "台设备,"); + allNote.replace(allNote.length() - 1, allNote.length(), "。"); + sheets.put("概览", getRows("数据分析结果-所有计划", allDevList, maxTime, allNote.toString())); } else { AdPlan plan = planList.get(0); PqDevParam.QueryParam queryParam = new PqDevParam.QueryParam(); queryParam.setPlanId(plan.getId()); List devList = pqDevService.listByPlanId(queryParam); devList = devList.stream().filter(x -> !x.getCheckResult().equals(CheckResultEnum.UNCHECKED.getValue())).collect(Collectors.toList()); - sheets.put(plan.getName(), getRows(plan.getName(), devList, maxTime)); + + sheets.put(plan.getName(), getRows(plan.getName(), devList, maxTime, getNote(plan, devList))); } exportPassRateExcel("数据分析结果.xlsx", maxTime, sheets); } } + /** + * 获取备注信息 + * + * @param plan 检测计划 + * @param devList 设备列表 + * @return 备注信息 + */ + private String getNote(AdPlan plan, List devList) { + StringBuffer note = new StringBuffer(); + note.append("说明:本计划共有" + devList.size() + "台设备,"); + Map> devTypeMap = devList.stream().collect(Collectors.groupingBy(PqDev::getDevType, Collectors.toList())); + devTypeMap.forEach((key, value) -> { + DevType devType = devTypeService.getById(key); + if (ObjectUtil.isNotNull(devType)) { + note.append(devType.getName() + "型号" + value.size() + "台,"); + } + }); + PqErrSys errSys = pqErrSysService.getById(plan.getErrorSysId()); + SysTestConfig config1 = sysTestConfigService.getConfig(); + if (ObjectUtil.isNotNull(config1)) { + DictData dictData = dictDataService.getDictDataById(config1.getDataRule()); + if (ObjectUtil.isNotNull(errSys) && ObjectUtil.isNotNull(dictData)) { + note.append("测试结果采用\"" + errSys.getName() + "\"误差体系结合\"" + dictData.getName() + "\"数据原则计算得出。"); + } + } + return note.toString(); + } /** * 获取行数据 @@ -465,9 +519,10 @@ public class AdPlanServiceImpl extends ServiceImpl impleme * @param header 表头 * @param devList 设备列表 * @param maxTime 最大复检次数 + * @param note 备注 * @return */ - private List getRows(String header, List devList, Integer maxTime) { + private List getRows(String header, List devList, Integer maxTime, String note) { List rows = new ArrayList<>(); String[] row1 = new String[]{header}; @@ -476,9 +531,11 @@ public class AdPlanServiceImpl extends ServiceImpl impleme String[] row3 = new String[maxTime + 1]; row3[0] = "合格数量"; String[] row4 = new String[maxTime + 1]; - row4[0] = "已检数量"; + row4[0] = "总数量"; String[] row5 = new String[maxTime + 1]; row5[0] = "合格率"; + String[] row6 = new String[maxTime + 1]; + row6[0] = note; long total = devList.size(); @@ -501,6 +558,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme rows.add(row3); rows.add(row4); rows.add(row5); + rows.add(row6); return rows; } @@ -591,17 +649,14 @@ public class AdPlanServiceImpl extends ServiceImpl impleme Cell row0Cell0 = row0.createCell(0); row0Cell0.setCellStyle(cellStyle); row0Cell0.setCellValue(rows.get(0)[0]); - for (int i = 1; i < maxTime + 1; i++) { - row0.createCell(i); - } - CellRangeAddress mergedRegion = new CellRangeAddress(0, 0, 0, maxTime); + CellRangeAddress mergedRegion = new CellRangeAddress(0, 0, 0, 2 * maxTime + 1); sheet.addMergedRegion(mergedRegion); CellStyle commoncellStyle = wb.createCellStyle(); commoncellStyle.setAlignment(HorizontalAlignment.CENTER); commoncellStyle.setVerticalAlignment(VerticalAlignment.CENTER); - for (int i = 1; i < rows.size(); i++) { + for (int i = 1; i < rows.size() - 1; i++) { String[] row = rows.get(i); Row createRow = sheet.createRow(i); for (int j = 0; j < row.length; j++) { @@ -638,11 +693,20 @@ public class AdPlanServiceImpl extends ServiceImpl impleme } } + Row note = sheet.createRow(rows.size() - 1); + Cell noteCell0 = note.createCell(0); + commoncellStyle.setWrapText(true); + noteCell0.setCellStyle(commoncellStyle); + noteCell0.setCellValue(rows.get(rows.size() - 1)[0]); + + mergedRegion = new CellRangeAddress(rows.size() - 1, rows.size() + 2, 0, maxTime); + sheet.addMergedRegion(mergedRegion); + // 条形图 XSSFDrawing drawing = sheet.createDrawingPatriarch(); // 前四个默认0,[0,5]:从0列5行开始;[6,16]:到6列16行结束 // 默认宽度(14-8)*12 - XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, 0, 5, maxTime + 1, 25); + XSSFClientAnchor anchor = drawing.createAnchor(0, 0, 0, 0, maxTime + 1, 1, 2 * maxTime + 2, 25); // 创建一个chart对象 XSSFChart chart = drawing.createChart(anchor); // 标题 @@ -663,7 +727,7 @@ public class AdPlanServiceImpl extends ServiceImpl impleme // 分类轴标(X轴)数据,单元格范围位置[1, 1]到[1, maxTime] XDDFDataSource checkTimes = XDDFDataSourcesFactory.fromStringCellRange(sheet, new CellRangeAddress(1, 1, 1, maxTime)); // 数据 - String[] rateStrArr = rows.get(rows.size() - 1); + String[] rateStrArr = rows.get(rows.size() - 2); Double[] rateArr = new Double[maxTime]; for (int i = 1; i < rateStrArr.length; i++) { if ("/".equals(rateStrArr[i])) {