Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

zhangcl 6 órája
szülő
commit
b76a54b78c

+ 38 - 24
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/util/SafetyObservationCardGenerator.java

@@ -47,19 +47,19 @@ class CheckItem {
 
 public class SafetyObservationCardGenerator {
 
-    // 主入口:生成包含中文+英文表格的文档
-    public static void generateCard(List<CheckItem> checkItems) {
+    // 新增入参:person(实施观察人员)、date(日期)、remark(观察描述)
+    public static void generateCard(List<CheckItem> checkItems, String person, String date, String remark) {
         try (XWPFDocument document = new XWPFDocument();
              FileOutputStream out = new FileOutputStream("行为安全观察与沟通卡-中英双语.docx")) {
 
             // ========== 1. 生成中文表格 ==========
-            generateChineseTable(document, checkItems);
+            generateChineseTable(document, checkItems, person, date, remark);
 
             // 换行分隔中英文表格
             document.createParagraph();
 
             // ========== 2. 生成英文表格 ==========
-            generateEnglishTable(document, checkItems);
+            generateEnglishTable(document, checkItems, person, date, remark);
 
             document.write(out);
             System.out.println("中英双语版安全观察卡生成成功!");
@@ -69,8 +69,8 @@ public class SafetyObservationCardGenerator {
         }
     }
 
-    // 生成中文表格(复用之前的逻辑,无调整)
-    private static void generateChineseTable(XWPFDocument document, List<CheckItem> checkItems) throws IOException, InvalidFormatException {
+    // 中文表格新增入参:person、date、remark
+    private static void generateChineseTable(XWPFDocument document, List<CheckItem> checkItems, String person, String date, String remark) throws IOException, InvalidFormatException {
         // 1. 中文标题图片(保持原有逻辑)
         XWPFParagraph logoPara = document.createParagraph();
         logoPara.setAlignment(ParagraphAlignment.CENTER);
@@ -107,9 +107,10 @@ public class SafetyObservationCardGenerator {
 
         // 行3:个人防护 | 规范操作 | 观察描述
         XWPFTableRow headerRow1 = table.createRow();
-        setTipTextStyle(headerRow1.getCell(0), "个人防护□", true, ParagraphAlignment.LEFT, "DCE6F1");
-        setTipTextStyle(headerRow1.getCell(1), "规范操作□", true, ParagraphAlignment.LEFT, "DCE6F1");
-        setTipTextStyle(headerRow1.getCell(2), "观察描述:", true, ParagraphAlignment.LEFT, "DCE6F1");
+        setCellStyle(headerRow1.getCell(0), "个人防护□", true, ParagraphAlignment.LEFT, "DCE6F1");
+        setCellStyle(headerRow1.getCell(1), "规范操作□", true, ParagraphAlignment.LEFT, "DCE6F1");
+        // 渲染remark到观察描述后
+        setCellStyle(headerRow1.getCell(2), "观察描述:" + (remark == null ? "" : remark), true, ParagraphAlignment.LEFT, "DCE6F1");
 
         // 行4:个人防护明细 | 规范操作明细 | 空
         XWPFTableRow row4 = table.createRow();
@@ -135,7 +136,7 @@ public class SafetyObservationCardGenerator {
         XWPFTableRow headerRow2 = table.createRow();
         setCellStyle(headerRow2.getCell(0), "规范指挥□", true, ParagraphAlignment.LEFT, "DCE6F1");
         setCellStyle(headerRow2.getCell(1), "人员位置□", true, ParagraphAlignment.LEFT, "DCE6F1");
-        setCellStyle(headerRow2.getCell(2), "", false, ParagraphAlignment.LEFT, "E6EBF5");
+        setCellStyle(headerRow2.getCell(2), "", false, ParagraphAlignment.LEFT, "DCE6F1");
 
         // 行6:规范指挥明细 | 人员位置明细 | 安全行为描述
         XWPFTableRow row10 = table.createRow();
@@ -183,10 +184,15 @@ public class SafetyObservationCardGenerator {
         setCellStyle(row8.getCell(1), secondText, false, ParagraphAlignment.LEFT, "FFFFFF");
         setCellStyle(row8.getCell(2), "", false, ParagraphAlignment.LEFT, "FFFFFF");
 
-        // 底部信息行
+        // 底部信息行 - 渲染person和date
         XWPFTableRow footerRow = table.createRow();
         mergeCellsHorizontally(footerRow, 0, 2);
-        String footerText = "观察区域: ____________  实施观察人员: ____________  被观察岗位:____________  \n被观察人员:□员工 □承包商 □供应商 日期: __________ 时间:___点___分到___点___分";
+        // 替换实施观察人员和日期的占位符
+        String footerText = String.format(
+                "观察区域: ____________  实施观察人员: %s  被观察岗位:____________  \n被观察人员:□员工 □承包商 □供应商 日期: %s 时间:___点___分到___点___分",
+                (person == null ? "____________" : person),
+                (date == null ? "__________" : date)
+        );
         setCellStyle(footerRow.getCell(0), footerText, true, ParagraphAlignment.LEFT, "FFFFFF");
 
         // 垂直合并单元格
@@ -196,8 +202,8 @@ public class SafetyObservationCardGenerator {
         mergeCellsVertically(table, 7, 8, 2);
     }
 
-    // 生成英文表格(调整:将标题移入表格内,中文表格逻辑不变)
-    private static void generateEnglishTable(XWPFDocument document, List<CheckItem> checkItems) {
+    // 英文表格新增入参:person、date、remark
+    private static void generateEnglishTable(XWPFDocument document, List<CheckItem> checkItems, String person, String date, String remark) {
         // 移除独立的英文标题段落,直接在表格内创建标题行
         document.createParagraph(); // 仅保留空行分隔
 
@@ -222,11 +228,11 @@ public class SafetyObservationCardGenerator {
         XWPFTableCell tipCell = tipRow.getCell(0);
         setTipTextStyle(tipCell, "Please mark \"√\" if any unsafe behavior or conditions", true, ParagraphAlignment.LEFT, "FFFF00");
 
-        // 行2:Personal Protection Equipment | Tools and Equipment | Observation Description
+        // 行2:Personal Protection Equipment | Tools and Equipment | Observation Description - 渲染remark
         XWPFTableRow headerRow1 = table.createRow();
-        setTipTextStyle(headerRow1.getCell(0), "Personal Protection Equipment □", true, ParagraphAlignment.LEFT, "DCE6F1");
-        setTipTextStyle(headerRow1.getCell(1), "Tools and Equipment □", true, ParagraphAlignment.LEFT, "DCE6F1");
-        setTipTextStyle(headerRow1.getCell(2), "Observation Description:", true, ParagraphAlignment.LEFT, "DCE6F1");
+        setCellStyle(headerRow1.getCell(0), "Personal Protection Equipment □", true, ParagraphAlignment.LEFT, "DCE6F1");
+        setCellStyle(headerRow1.getCell(1), "Tools and Equipment □", true, ParagraphAlignment.LEFT, "DCE6F1");
+        setCellStyle(headerRow1.getCell(2), "Observation Description: " + (remark == null ? "" : remark), true, ParagraphAlignment.LEFT, "DCE6F1");
 
         // 行3:个人防护英文明细 | 工具设备明细 | 空
         XWPFTableRow row3 = table.createRow();
@@ -288,7 +294,7 @@ public class SafetyObservationCardGenerator {
         setRowHeight(row6, 1900);
         setCellStyle(row6.getCell(0), "", false, ParagraphAlignment.LEFT, "FFFFFF");
         setCellStyle(row6.getCell(1), "", false, ParagraphAlignment.LEFT, "FFFFFF");
-        setCellStyle(row6.getCell(2), "", true, ParagraphAlignment.LEFT, "E6EBF5");
+        setCellStyle(row6.getCell(2), "", false, ParagraphAlignment.LEFT, "FFFFFF");
 
         // 行7:空 | 空 | 纠正措施明细
         XWPFTableRow row7 = table.createRow();
@@ -328,10 +334,14 @@ public class SafetyObservationCardGenerator {
         setCellStyle(row8.getCell(1), houseEnglishText2, false, ParagraphAlignment.LEFT, "FFFFFF");
         setCellStyle(row8.getCell(2), "", false, ParagraphAlignment.LEFT, "E6EBF5");
 
-        // 底部信息行(英文)
+        // 底部信息行(英文)- 渲染person和date
         XWPFTableRow footerRow = table.createRow();
         mergeCellsHorizontally(footerRow, 0, 2);
-        String footerEnglishText = "Observation Location: ____________  Observer: ____________  \nDate: __________  Time: __________\nReporting helps to protect Health, Safety and Environment, reporting is aimed at identifying corrective actions.";
+        String footerEnglishText = String.format(
+                "Observation Location: ____________  Observer: %s  \nDate: %s  Time: __________\nReporting helps to protect Health, Safety and Environment, reporting is aimed at identifying corrective actions.",
+                (person == null ? "____________" : person),
+                (date == null ? "__________" : date)
+        );
         setCellStyle(footerRow.getCell(0), footerEnglishText, true, ParagraphAlignment.LEFT, "FFFFFF");
 
         // 垂直合并单元格(与中文表格对齐)
@@ -376,7 +386,7 @@ public class SafetyObservationCardGenerator {
         return text;
     }
 
-    // 测试方法
+    // 测试方法 - 新增person、date、remark参数示例
     public static void main(String[] args) {
         // 示例:勾选 个人防护-头部(对应英文Head)、规范操作-其他(对应英文Other)、作业场所-地面滑(对应英文Slippery floor)
         List<CheckItem> checkItems = ImmutableList.of(
@@ -384,7 +394,11 @@ public class SafetyObservationCardGenerator {
                 new CheckItem("规范操作", "其他", "Tools and Equipment", "Other"),
                 new CheckItem("作业场所", "地面滑(水/雨/雪/油污等)", "Housekeeping", "Slippery floor (Water / Rain / Snow / Oil etc.)")
         );
-        generateCard(checkItems);
+        // 测试参数
+        String person = "张三";
+        String date = "2024-05-20";
+        String remark = "\n现场作业人员防护措施到位,操作规范,无安全隐患";
+        generateCard(checkItems, person, date, remark);
     }
 
     // ========== 以下工具方法保持不变(仅适配英文字体) ==========
@@ -452,7 +466,7 @@ public class SafetyObservationCardGenerator {
             paragraph.setSpacingAfter(50);
             paragraph.setSpacingBefore(0);
 
-            if (line.startsWith("□")) {
+            if (line.startsWith("□")||line.startsWith("☑")) {
                 paragraph.setIndentationFirstLine(288);
             } else {
                 paragraph.setIndentationFirstLine(144);