From 8ad863082097ffdcab4a8e7f426d344a1fe6f892 Mon Sep 17 00:00:00 2001
From: 吴羡 <16976746+Xian-TT3@user.noreply.gitee.com>
Date: 星期六, 07 十一月 2026 00:27:02 +0800
Subject: [PATCH] 修复人员管理接口校验与导出,完善设备保养计划与文件受控功能

---
 cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java |  151 ++++++++++++++++++++++---------------------------
 1 files changed, 68 insertions(+), 83 deletions(-)

diff --git a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java
index d4fc412..a554c43 100644
--- a/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java
+++ b/cnas-device/src/main/java/com/ruoyi/device/service/impl/DeviceRecordServiceImpl.java
@@ -11,6 +11,7 @@
 import com.ruoyi.device.service.DeviceRecordService;
 import com.ruoyi.system.domain.vo.SysRoleVo;
 import com.ruoyi.system.mapper.SysRoleMenuMapper;
+import org.apache.poi.xwpf.usermodel.BreakType;
 import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
 import org.apache.poi.xwpf.usermodel.TableRowAlign;
 import org.apache.poi.xwpf.usermodel.UnderlinePatterns;
@@ -71,11 +72,9 @@
     private static final String RECORD_NUMBER = "LMSY-CX07-JL03";
     private static final String FONT_NAME = "瀹嬩綋";
     private static final int[] COLUMN_WIDTHS = {1622, 4168, 1288, 1107, 1137, 1076, 940, 1182, 1288, 1350};
-    private static final String[] HEADER_FIRST_ROW = {"浣跨敤鏃ユ湡", "鏍峰搧缂栧彿", "鏃堕棿 24 灏忔椂鍒�", "", "璁惧鐘跺喌", "", "鐜鏉′欢", "", "浣跨敤浜�", "澶囨敞"};
+    private static final String[] HEADER_FIRST_ROW = {"浣跨敤鏃ユ湡", "鏍峰搧鍚嶇О", "鏃堕棿 24 灏忔椂鍒�", "", "璁惧鐘跺喌", "", "鐜鏉′欢", "", "浣跨敤浜�", "澶囨敞"};
     private static final String[] HEADER_SECOND_ROW = {"", "", "寮�濮�", "缁撴潫", "浣跨敤鍓�", "浣跨敤鍚�", "鈩�", "%RH", "", ""};
-    private static final int[] COMBINED_COLUMN_WIDTHS = {1300, 2000, 1500, 1600, 2000, 900, 900, 800, 800, 650, 750, 950, 1008};
-    private static final String[] COMBINED_HEADER_FIRST_ROW = {"浣跨敤鏃ユ湡", "璁惧鍚嶇О", "璁惧鍨嬪彿", "璁惧缂栧彿", "鏍峰搧缂栧彿", "鏃堕棿 24 灏忔椂鍒�", "", "璁惧鐘跺喌", "", "鐜鏉′欢", "", "浣跨敤浜�", "澶囨敞"};
-    private static final String[] COMBINED_HEADER_SECOND_ROW = {"", "", "", "", "", "寮�濮�", "缁撴潫", "浣跨敤鍓�", "浣跨敤鍚�", "鈩�", "%RH", "", ""};
+    private static final String FOOTNOTE = "娉細璁惧浣跨敤鍓嶅悗涓�鏍忥紝姝e父鍒掆�溾垰鈥濓紱涓嶆甯稿垝鈥溍椻�濆苟鍐欐槑鎯呭喌銆�";
     private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
     private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
 
@@ -83,7 +82,9 @@
     private SysRoleMenuMapper sysRoleMenuMapper;
 
     @Override
-    public IPage<DeviceRecordDto> deviceRecordPage(Integer deviceId, Page page, String sampleCode, String managementNumber) {
+    public IPage<DeviceRecordDto> deviceRecordPage(Integer deviceId, Page page, String deviceName,
+                                                   String specificationModel, String sampleCode,
+                                                   String managementNumber) {
         // todo:浠呯湅鑷繁
         Long userId = SecurityUtils.getUserId();
         // 鑾峰彇鏉冮檺鍒ゆ柇鏄惁鏄粎鐪嬫垜
@@ -95,19 +96,20 @@
             testUserId = SecurityUtils.getUserId().intValue();
         }
 
-        return baseMapper.deviceRecordPage(deviceId, page, sampleCode, managementNumber, testUserId);
+        return baseMapper.deviceRecordPage(deviceId, page, deviceName, specificationModel,
+                sampleCode, managementNumber, testUserId);
     }
 
     @Override
-    public void exportUseRecord(Integer deviceId, String sampleCode, String managementNumber, String exportDate, HttpServletResponse response) {
-        List<DeviceRecordDto> records = baseMapper.selectExportList(deviceId, sampleCode, managementNumber, exportDate);
+    public void exportUseRecord(Integer deviceId, String deviceName, String specificationModel,
+                                String managementNumber, String sampleCode, HttpServletResponse response) {
+        List<DeviceRecordDto> records = baseMapper.selectExportList(deviceId, deviceName,
+                specificationModel, managementNumber, sampleCode);
         if (records == null || records.isEmpty()) {
-            throw new ServiceException(exportDate == null || exportDate.isEmpty()
-                    ? "娌℃湁鍙鍑虹殑浣跨敤璁板綍锛屾棤娉曞鍑�"
-                    : exportDate + " 娌℃湁鍙鍑虹殑浣跨敤璁板綍锛屾棤娉曞鍑�");
+            throw new ServiceException("娌℃湁鍙鍑虹殑浣跨敤璁板綍锛屾棤娉曞鍑�");
         }
 
-        // 鍗曞彴璁惧娌跨敤鎴浘琛ㄥご; 澶氬彴璁惧鍚堝苟鍒颁竴寮犺〃, 姣忚甯﹁澶囦俊鎭�
+        // 涓�鍙拌澶囦竴鏈繍琛岃褰曪紝澶氬彴璁惧鍦ㄥ悓涓� Word 鍐呮寜璁惧鍒嗛〉
         Map<Integer, List<DeviceRecordDto>> deviceRecords = new LinkedHashMap<>();
         for (DeviceRecordDto record : records) {
             deviceRecords.computeIfAbsent(record.getDeviceId(), key -> new ArrayList<>()).add(record);
@@ -115,11 +117,13 @@
 
         try (XWPFDocument document = new XWPFDocument()) {
             setupPage(document);
-            if (deviceRecords.size() == 1) {
-                List<DeviceRecordDto> group = deviceRecords.values().iterator().next();
-                renderForm(document, group.get(0), group);
-            } else {
-                renderCombinedForm(document, records);
+            boolean first = true;
+            for (List<DeviceRecordDto> group : deviceRecords.values()) {
+                if (!first) {
+                    addPageBreak(document);
+                }
+                renderForm(document, group.get(0), mergeSameConditionRecords(group));
+                first = false;
             }
 
             response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
@@ -132,6 +136,49 @@
         } catch (IOException e) {
             throw new RuntimeException("瀵煎嚭澶辫触", e);
         }
+    }
+
+    /**
+     * 鍚屼竴璁惧銆佸悓涓�澶┿�佽捣姝㈡椂闂�/娓╂箍搴�/浣跨敤浜�/浣跨敤鍓嶅悗鐘跺喌鐩稿悓鐨勮褰曞悎骞朵竴琛岋紝鏍峰搧缂栧彿鐢ㄢ�溿�佲�濇嫾鎺ャ��
+     */
+    private List<DeviceRecordDto> mergeSameConditionRecords(List<DeviceRecordDto> records) {
+        Map<String, DeviceRecordDto> merged = new LinkedHashMap<>();
+        for (DeviceRecordDto record : records) {
+            String key = String.join("|",
+                    formatDate(record.getUseStartDate()),
+                    formatTime(record.getUseStartDate()),
+                    formatTime(record.getUseEndDate()),
+                    valueOrEmpty(record.getTemperature()),
+                    valueOrEmpty(record.getHumidity()),
+                    valueOrEmpty(record.getUsePerson()),
+                    String.valueOf(record.getUseBefore()),
+                    String.valueOf(record.getUseAfter()));
+            DeviceRecordDto existing = merged.get(key);
+            if (existing == null) {
+                merged.put(key, record);
+            } else {
+                existing.setSampleCode(appendDistinct(existing.getSampleCode(), record.getSampleCode()));
+                existing.setRemark(appendDistinct(existing.getRemark(), record.getRemark()));
+            }
+        }
+        return new ArrayList<>(merged.values());
+    }
+
+    private String appendDistinct(String existing, String addition) {
+        if (addition == null || addition.trim().isEmpty()) {
+            return existing;
+        }
+        if (existing == null || existing.trim().isEmpty()) {
+            return addition;
+        }
+        List<String> parts = java.util.Arrays.asList(existing.split("銆�"));
+        return parts.contains(addition) ? existing : existing + "銆�" + addition;
+    }
+
+    private void addPageBreak(XWPFDocument document) {
+        XWPFParagraph paragraph = document.createParagraph();
+        paragraph.setSpacingAfter(0);
+        paragraph.createRun().addBreak(BreakType.PAGE);
     }
 
     private void setupPage(XWPFDocument document) {
@@ -198,54 +245,10 @@
                 setCellText(row.getCell(j), values[j]);
             }
         }
-    }
 
-    private void renderCombinedForm(XWPFDocument document, List<DeviceRecordDto> records) {
-        XWPFParagraph recordNumber = addParagraph(document, "璁板綍缂栧彿锛�" + RECORD_NUMBER, 10.5, false, ParagraphAlignment.LEFT);
-        recordNumber.setSpacingAfter(240);
-
-        XWPFParagraph title = addParagraph(document, FORM_TITLE, 22, true, ParagraphAlignment.CENTER);
-        title.setSpacingAfter(240);
-
-        XWPFTable table = document.createTable(2 + records.size(), COMBINED_COLUMN_WIDTHS.length);
-        configureTable(table, COMBINED_COLUMN_WIDTHS);
-
-        for (int i = 0; i < table.getNumberOfRows(); i++) {
-            XWPFTableRow row = table.getRow(i);
-            row.setHeight(i < 2 ? 560 : 520);
-            for (int j = 0; j < COMBINED_COLUMN_WIDTHS.length; j++) {
-                setCellWidth(row.getCell(j), COMBINED_COLUMN_WIDTHS[j]);
-            }
-            setRowProperties(row, i < 2);
-        }
-
-        XWPFTableRow firstHeader = table.getRow(0);
-        for (int i = 0; i < COMBINED_HEADER_FIRST_ROW.length; i++) {
-            setCellText(firstHeader.getCell(i), COMBINED_HEADER_FIRST_ROW[i]);
-        }
-        XWPFTableRow secondHeader = table.getRow(1);
-        for (int i = 0; i < COMBINED_HEADER_SECOND_ROW.length; i++) {
-            setCellText(secondHeader.getCell(i), COMBINED_HEADER_SECOND_ROW[i]);
-        }
-
-        mergeHorizontal(firstHeader, COMBINED_COLUMN_WIDTHS, 9, 2);
-        mergeHorizontal(firstHeader, COMBINED_COLUMN_WIDTHS, 7, 2);
-        mergeHorizontal(firstHeader, COMBINED_COLUMN_WIDTHS, 5, 2);
-        mergeVertical(firstHeader.getCell(0), secondHeader.getCell(0));
-        mergeVertical(firstHeader.getCell(1), secondHeader.getCell(1));
-        mergeVertical(firstHeader.getCell(2), secondHeader.getCell(2));
-        mergeVertical(firstHeader.getCell(3), secondHeader.getCell(3));
-        mergeVertical(firstHeader.getCell(4), secondHeader.getCell(4));
-        mergeVertical(firstHeader.getCell(8), secondHeader.getCell(11));
-        mergeVertical(firstHeader.getCell(9), secondHeader.getCell(12));
-
-        for (int i = 0; i < records.size(); i++) {
-            XWPFTableRow row = table.getRow(2 + i);
-            String[] values = buildCombinedRowValues(records.get(i));
-            for (int j = 0; j < values.length; j++) {
-                setCellText(row.getCell(j), values[j]);
-            }
-        }
+        XWPFParagraph footnote = addParagraph(document, FOOTNOTE, 10.5, false, ParagraphAlignment.LEFT);
+        footnote.setSpacingBefore(120);
+        footnote.setSpacingAfter(0);
     }
 
     private XWPFParagraph addParagraph(XWPFDocument document, String text, double fontSize, boolean bold, ParagraphAlignment alignment) {
@@ -461,24 +464,6 @@
         };
     }
 
-    private String[] buildCombinedRowValues(DeviceRecordDto record) {
-        return new String[]{
-                formatDate(record.getUseStartDate()),
-                valueOrEmpty(record.getDeviceName()),
-                valueOrEmpty(record.getSpecificationModel()),
-                valueOrEmpty(record.getManagementNumber()),
-                valueOrEmpty(record.getSampleCode()),
-                formatTime(record.getUseStartDate()),
-                formatTime(record.getUseEndDate()),
-                statusText(record.getUseBefore()),
-                statusText(record.getUseAfter()),
-                valueOrEmpty(record.getTemperature()),
-                valueOrEmpty(record.getHumidity()),
-                valueOrEmpty(record.getUsePerson()),
-                valueOrEmpty(record.getRemark())
-        };
-    }
-
     private String formatDate(LocalDateTime value) {
         return value == null ? "" : value.format(DATE_FORMATTER);
     }
@@ -491,7 +476,7 @@
         if (value == null) {
             return "";
         }
-        return value == 0 ? "寮傚父" : "鑹ソ";
+        return value == 0 ? "寮傚父" : "姝e父";
     }
 
     private String valueOrEmpty(String value) {

--
Gitblit v1.9.3