Преглед изворни кода

漏点图页,excel导出优化

17491 пре 2 недеља
родитељ
комит
afec7676b4

+ 55 - 10
src/main/java/com/jeesite/modules/mes/web/MesProductLeakagePointStatController.java

@@ -70,7 +70,7 @@ public class MesProductLeakagePointStatController extends BaseController {
     @ResponseBody
     public Page<MesProductLeakagePointStat> listData(String leakagePoint, String sn, Date startDate,
             Date endDate, HttpServletRequest request, HttpServletResponse response) {
-        List<MesProductLeakagePointStat> rows = buildStatistics(leakagePoint, sn, startDate, endDate);
+        List<MesProductLeakagePointStat> rows = buildStatistics(leakagePoint, sn, startDate, endDate, "all");
         Page<MesProductLeakagePointStat> page = new Page<>(request, response);
         page.setCount(rows.size());
         int from = Math.max(0, (page.getPageNo() - 1) * page.getPageSize());
@@ -275,11 +275,13 @@ public class MesProductLeakagePointStatController extends BaseController {
 
     @RequiresPermissions("mes:mesProductQm:view")
     @RequestMapping(value = "chartExport")
-    public void chartExport(String sn, Date startDate, Date endDate, HttpServletResponse response) throws Exception {
-        List<MesProductLeakagePointStat> rows = buildStatistics("", sn, startDate, endDate);
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+    public void chartExport(String sn, String dataType, Date startDate, Date endDate, HttpServletResponse response) throws Exception {
+        List<MesProductLeakagePointStat> rows = buildChartStatistics(sn, startDate, endDate, dataType);
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
         String start = startDate == null ? "全部" : dateFormat.format(startDate);
         String end = endDate == null ? "全部" : dateFormat.format(endDate);
+        String stationResult = dataTypeLabel(dataType);
+        String timeRange = start + " 至 " + end;
         String fileName = "气密泄露点位汇总_" + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + ".xlsx";
 
         response.reset();
@@ -288,7 +290,7 @@ public class MesProductLeakagePointStatController extends BaseController {
                 + URLEncoder.encode(fileName, "UTF-8").replace("+", "%20"));
         try (Workbook workbook = new XSSFWorkbook(); ServletOutputStream output = response.getOutputStream()) {
             Sheet sheet = workbook.createSheet("泄露点位汇总");
-            int[] widths = {14, 34, 12, 22, 22};
+            int[] widths = {16, 38, 14, 36, 4, 22, 22};
             for (int i = 0; i < widths.length; i++) sheet.setColumnWidth(i, widths[i] * 256);
 
             CellStyle titleStyle = workbook.createCellStyle();
@@ -308,11 +310,11 @@ public class MesProductLeakagePointStatController extends BaseController {
             Row titleRow = sheet.createRow(0);
             titleRow.setHeightInPoints(24);
             Cell titleCell = titleRow.createCell(0);
-            titleCell.setCellValue("气密泄露点位汇总(统计范围:" + start + " 至 " + end + ")");
+            titleCell.setCellValue("气密泄露点位汇总(工位结果:" + stationResult + ";统计范围:" + timeRange + ")");
             titleCell.setCellStyle(titleStyle);
             sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, widths.length - 1));
 
-            String[] headers = {"泄露点位", "工件号", "出现次数", "首次上报时间", "最近上报时间"};
+            String[] headers = {"工位结果", "统计时间段", "泄露点位", "工件号", "出现次数", "首次上报时间", "最近上报时间"};
             Row headerRow = sheet.createRow(2);
             headerRow.setHeightInPoints(21);
             for (int i = 0; i < headers.length; i++) {
@@ -324,7 +326,7 @@ public class MesProductLeakagePointStatController extends BaseController {
             int rowIndex = 3;
             for (MesProductLeakagePointStat stat : rows) {
                 Row row = sheet.createRow(rowIndex++);
-                String[] values = {stat.getLeakagePoint(), stat.getSn(), String.valueOf(stat.getOccurrenceCount()),
+                String[] values = {stationResult, timeRange, stat.getLeakagePoint(), stat.getSn(), String.valueOf(stat.getOccurrenceCount()),
                         formatDateTime(stat.getFirstOccurrenceTime(), dateTimeFormat), formatDateTime(stat.getLastOccurrenceTime(), dateTimeFormat)};
                 for (int i = 0; i < values.length; i++) {
                     Cell cell = row.createCell(i);
@@ -343,9 +345,45 @@ public class MesProductLeakagePointStatController extends BaseController {
         return date == null ? "" : format.format(date);
     }
 
-    private List<MesProductLeakagePointStat> buildStatistics(String leakagePoint, String sn, Date startDate, Date endDate) {
+    /** Uses the same NG leakage-point events as the chart and its workpiece details. */
+    @SuppressWarnings("unchecked")
+    private List<MesProductLeakagePointStat> buildChartStatistics(String sn, Date startDate, Date endDate, String dataType) {
+        List<MesProductHf> hfRecords = findRecords(sn, startDate, endDate, dataType);
+        Map<String, Object> qualityData = buildQualityData(hfRecords, startDate, endDate, dataType);
+        List<Map<String, Object>> occurrences = (List<Map<String, Object>>) qualityData.get("defectOccurrences");
         Map<String, MesProductLeakagePointStat> statistics = new LinkedHashMap<>();
-        for (MesProductHf record : findRecords(sn, startDate, endDate, "all")) {
+        for (Map<String, Object> occurrence : occurrences) {
+            String point = (String) occurrence.get("point");
+            String occurrenceSn = (String) occurrence.get("sn");
+            if (StringUtils.isBlank(point) || StringUtils.isBlank(occurrenceSn)) continue;
+            Date occurrenceTime = (Date) occurrence.get("time");
+            String key = point + "\u0000" + occurrenceSn;
+            MesProductLeakagePointStat stat = statistics.get(key);
+            if (stat == null) {
+                stat = new MesProductLeakagePointStat();
+                stat.setLeakagePoint(point);
+                stat.setSn(occurrenceSn);
+                stat.setFirstOccurrenceTime(occurrenceTime);
+                statistics.put(key, stat);
+            }
+            stat.setOccurrenceCount(stat.getOccurrenceCount() + 1);
+            if (occurrenceTime != null && (stat.getFirstOccurrenceTime() == null || occurrenceTime.before(stat.getFirstOccurrenceTime()))) {
+                stat.setFirstOccurrenceTime(occurrenceTime);
+            }
+            if (occurrenceTime != null && (stat.getLastOccurrenceTime() == null || occurrenceTime.after(stat.getLastOccurrenceTime()))) {
+                stat.setLastOccurrenceTime(occurrenceTime);
+            }
+        }
+        List<MesProductLeakagePointStat> rows = new ArrayList<>(statistics.values());
+        rows.sort(Comparator.comparing(MesProductLeakagePointStat::getLeakagePoint)
+                .thenComparing(MesProductLeakagePointStat::getOccurrenceCount, Comparator.reverseOrder())
+                .thenComparing(MesProductLeakagePointStat::getSn));
+        return rows;
+    }
+
+    private List<MesProductLeakagePointStat> buildStatistics(String leakagePoint, String sn, Date startDate, Date endDate, String dataType) {
+        Map<String, MesProductLeakagePointStat> statistics = new LinkedHashMap<>();
+        for (MesProductHf record : findRecords(sn, startDate, endDate, dataType)) {
             if (StringUtils.isBlank(record.getSn()) || StringUtils.isBlank(record.getHfFlag())) continue;
             for (String item : record.getHfFlag().split(",")) {
                 String point = normalizeLeakPoint(item);
@@ -403,6 +441,13 @@ public class MesProductLeakagePointStatController extends BaseController {
         return false;
     }
 
+    private String dataTypeLabel(String dataType) {
+        if ("framework".equals(dataType)) return "框架气密";
+        if ("semiFinished".equals(dataType)) return "半成品气密";
+        if ("finishedPackage".equals(dataType)) return "整包气密";
+        return "全部";
+    }
+
     private String normalizeLeakPoint(String value) {
         String point = value == null ? "" : value.trim();
         if (!point.matches("\\d+")) return point;

Разлика између датотеке није приказан због своје велике величине
+ 1 - 1
src/main/resources/views/modules/mes/mesProductLeakagePointStatChart.html