Browse Source

根据模板生成PDF,excel 奖励管理

huangpeng 3 tuần trước cách đây
mục cha
commit
7dd04a3e8e

+ 13 - 0
qhse-common/pom.xml

@@ -95,5 +95,18 @@
             <version>32.1.3-android</version>
             <scope>compile</scope>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>4.1.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>32.1.3-android</version>
+            <scope>compile</scope>
+        </dependency>
     </dependencies>
 </project>

+ 27 - 0
qhse-common/src/main/java/com/rongwei/bscommon/sys/dao/QhseDangerRewardManagementDao.java

@@ -0,0 +1,27 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.rongwei.bsentity.domain.QhseDangerRewardManagementDo;
+import org.apache.ibatis.annotations.MapKey;
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * 隐患奖励管理(QhseDangerRewardManagement)表数据库访问层
+ *
+ * @author makejava
+ * @since 2025-08-22 16:15:53
+ */
+public interface QhseDangerRewardManagementDao extends BaseMapper<QhseDangerRewardManagementDo> {
+
+    @MapKey("SORT")
+    List<Map<String, Object>> getRewardHzData(String id);
+
+    @MapKey("SORT")
+    List<Map<String, Object>> rewardMxData(String id);
+
+    @MapKey("SORT")
+    List<Map<String, String>> getPunishmentData(String id);
+}
+

+ 21 - 0
qhse-common/src/main/java/com/rongwei/bscommon/sys/service/QhseDangerRewardManagementService.java

@@ -0,0 +1,21 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.rongwei.bsentity.domain.QhseDangerRewardManagementDo;
+
+import java.util.HashMap;
+
+/**
+ * 隐患奖励管理(QhseDangerRewardManagement)表服务接口
+ *
+ * @author makejava
+ * @since 2025-08-22 16:15:54
+ */
+public interface QhseDangerRewardManagementService extends IService<QhseDangerRewardManagementDo> {
+
+    void CreatPdfFromWordTemp(String id, String url);
+
+
+    void CreatFromExcelTemp(String id, String url);
+}
+

+ 402 - 0
qhse-common/src/main/java/com/rongwei/bscommon/sys/service/impl/QhseDangerRewardManagementServiceImpl.java

@@ -0,0 +1,402 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import cn.hutool.core.io.FileUtil;
+import com.aspose.cells.PdfCompliance;
+import com.aspose.cells.PdfSaveOptions;
+import com.aspose.words.Document;
+import com.aspose.words.SaveFormat;
+import com.aspose.words.net.System.Data.DataTable;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.rongwei.bscommon.sys.dao.QhseDangerRewardManagementDao;
+import com.rongwei.bscommon.sys.service.QhseDangerRewardManagementService;
+import com.rongwei.bscommon.system.service.impl.QHSEFileItemServiceImpl;
+import com.rongwei.bscommon.system.utils.WordMergeHandler;
+import com.rongwei.bscommon.system.utils.WordUtils;
+import com.rongwei.bsentity.domain.QhseDangerRewardManagementDo;
+import com.rongwei.bsentity.dto.PunishmentExcelDto;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommon.utils.StringUtils;
+import com.rongwei.rwcommonentity.commonservers.domain.SysFileItemDo;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.util.IOUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+
+/**
+ * 隐患奖励管理(QhseDangerRewardManagement)表服务实现类
+ *
+ * @author makejava
+ * @since 2025-08-22 16:15:54
+ */
+@Service
+public class QhseDangerRewardManagementServiceImpl extends ServiceImpl<QhseDangerRewardManagementDao, QhseDangerRewardManagementDo> implements QhseDangerRewardManagementService {
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private QhseDangerRewardManagementService qhseDangerRewardManagementService;
+
+    @Autowired
+    private QHSEFileItemServiceImpl fileService;
+
+    @Autowired
+    private QhseDangerRewardManagementDao qhseDangerRewardManagementDao;
+
+    public static final PunishmentExcelDto[] PUNISHMENTS = {
+            new PunishmentExcelDto("SORT", "序号"),
+            new PunishmentExcelDto("REGISTERTIME", "检查日期"),
+            new PunishmentExcelDto("INSPECTUSER", "检查人"),
+            new PunishmentExcelDto("RECTIFICATIONDEPT", "整改部门"),
+            new PunishmentExcelDto("RECTIFICATIONWORKSHOP", "整改车间/处室"),
+            new PunishmentExcelDto("RECTIFICATIONWORKSUBCONTRACTOR", "责任分包商"),
+            new PunishmentExcelDto("GRID", "责任班组/网格"),
+            new PunishmentExcelDto("RECTIFICATIONUSER", "整改责任人"),
+            new PunishmentExcelDto("RECTIFICATIONUSERSIGN", "责任人签字"), // 补充字段(如果存在)
+            new PunishmentExcelDto("HDDESC", "隐患描述"),
+            new PunishmentExcelDto("BASISFORRECTIFICATION", "依据"),
+            new PunishmentExcelDto("HDTYPENAME", "隐患类型"),
+            new PunishmentExcelDto("HDLEVELNAME", "隐患等级"),
+            new PunishmentExcelDto("RECTIFICATIONPROPOSAL", "整改建议"),
+            new PunishmentExcelDto("RECTIFICATIONDATE", "整改期限"),
+            new PunishmentExcelDto("RECTIFICATIONPLAN", "整改方案和措施"),
+            new PunishmentExcelDto("RECTIFICATIONTIME", "实际完成整改时间"),
+            new PunishmentExcelDto("STATENAME", "整改结果"),
+            new PunishmentExcelDto("MONEY", "罚款金额"),
+            new PunishmentExcelDto("RPCATEGORYNAME", "罚款类别"),
+            new PunishmentExcelDto("USERNAME", "被罚款人"),
+            new PunishmentExcelDto("VERIFIER", "复查人"),
+            new PunishmentExcelDto("VERIFIERRESULTNAME", "复查结果"),
+            new PunishmentExcelDto("POINT", "安全积分"),
+            new PunishmentExcelDto("HDPHOTO", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("RECTIFICATIONPHOTO", "整改图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+            new PunishmentExcelDto("ZHANWEI", "隐患图片"),
+    };
+
+    private static final int DEFAULT_PICTURE_HEIGHT = 150;
+    private static final int DEFAULT_PICTURE_WIDTH = 200;
+
+    private static final String[] IMAGE_FIELDS ={
+            "RECTIFICATIONUSERSIGN",
+            "RECTIFICATIONPHOTO",
+            "HDPHOTO"
+    };
+
+    private static final SimpleDateFormat formatYmd= new SimpleDateFormat("yyyy-MM-dd");
+
+    @Override
+    public void CreatPdfFromWordTemp(String id, String tempUrl) {
+
+        String uuid = SecurityUtil.getUUID();
+        String outputFile ="/upload_files/rewardPunishment//"+uuid+".pdf";
+
+        //模板数据
+        QhseDangerRewardManagementDo mainData = qhseDangerRewardManagementService.getById(id);
+
+        List<Map<String, Object>> rewardHzData =  qhseDangerRewardManagementDao.getRewardHzData(id);
+
+        List<Map<String, Object>> rewardMxData =  qhseDangerRewardManagementDao.rewardMxData(id);
+
+        HashMap<String, String> objectObjectHashMap = new HashMap<>();
+        //设置主表信息
+        setRewardMainData(objectObjectHashMap,mainData);
+
+        try (InputStream templateStream = Files.newInputStream(Paths.get(tempUrl))) {
+            Document doc = new Document(templateStream);
+            // 设置邮件合并回调
+            doc.getMailMerge().setFieldMergingCallback(new WordMergeHandler());
+
+            DataTable dataTable1 = WordUtils.fillListData(rewardHzData, "list1");
+            DataTable dataTable2 = WordUtils.fillListData(rewardMxData, "list2");
+
+            doc.getMailMerge().executeWithRegions(dataTable1);
+            doc.getMailMerge().executeWithRegions(dataTable2);
+
+
+            WordUtils.MailMergeFill(objectObjectHashMap, doc);
+
+            // 设置 PDF 转换选项
+            PdfSaveOptions options = new PdfSaveOptions();
+            options.setCompliance(PdfCompliance.PDF_A_1_A); // 设置PDF/A-1a标准
+            // 3. 直接输出到响应流(避免中间文件)
+            FileOutputStream out = new FileOutputStream(outputFile);
+            doc.save(out, SaveFormat.PDF);
+            // 4. 强制刷新缓冲区(确保数据完整传输)
+            out.flush();
+
+            //生成附件纪录
+            String fileName ="【"+mainData.getRequestserialnumber()+"】-关于申请安全生产隐患随手拍奖励的请示.pdf";
+            addFileRecord(outputFile,fileName,mainData,"pdf");
+
+
+        } catch (Exception e) {
+            logger.error("excel转pdf失败- 原因: {} | 异常类型: {}", e.getMessage(), e.getClass().getSimpleName(), e);
+            throw new RuntimeException("获取签名责任书失败!请联系系统管理员");
+        }
+    }
+
+    @Override
+    public void CreatFromExcelTemp(String id, String tempUrl) {
+
+        String uuid = SecurityUtil.getUUID();
+        String outputFile ="/upload_files/rewardPunishment//"+uuid+".xlsx";
+
+//
+//       tempUrl ="C:\\Users\\shangmi\\Desktop\\b41c6667749d49429bf82cb9caa27ff2.xlsx";
+//        outputFile="C:\\Users\\shangmi\\Desktop\\11111.xlsx";
+
+        // 使用 try-with-resources 确保资源正确关闭
+        try (FileInputStream fis = new FileInputStream(tempUrl);
+             XSSFWorkbook workbook = new XSSFWorkbook(fis)) {
+
+            Sheet sheet = workbook.getSheetAt(0);
+            int startRow = 2; // 从第三行开始插入数据
+
+            // 获取第一行样式作为模板
+            Row firstRow = sheet.getRow(startRow);
+            CellStyle[] columnStyles = new CellStyle[firstRow.getLastCellNum()];
+            for (int j = 0; j < columnStyles.length; j++) {
+                columnStyles[j] = firstRow.getCell(j).getCellStyle();
+            }
+
+            // 获取数据
+            List<Map<String, String>> data = qhseDangerRewardManagementDao.getPunishmentData(id);
+            Map<String, String> urlMap = setFileUrl(data);// 设置附件路径
+
+            // 4. 插入数据(从第三行开始)
+            for (int i = 0; i < data.size(); i++) {
+                Row row = sheet.createRow(startRow + i);
+                Map<String, String> rowData = data.get(i);
+                for (int j = 0; j < columnStyles.length; j++) {
+                    String field = PUNISHMENTS[j].getField();
+                    Cell cell = row.createCell(j);
+                    // 设置单元格样式和数据
+                    setCellData(cell, field, rowData.get(field), columnStyles[j]);
+                    //处理图片
+                    for (String imageField : IMAGE_FIELDS) {
+                        if (field.equals(imageField)){
+                            processField(rowData, PUNISHMENTS[j].getField(), urlMap, sheet, startRow + i, j);
+                        }
+
+                    }
+                }
+            }
+
+            // 保存工作簿
+            try (FileOutputStream fos = new FileOutputStream(outputFile)) {
+                workbook.write(fos);
+            }
+
+            QhseDangerRewardManagementDo mainData = qhseDangerRewardManagementService.getById(id);
+            String fileName ="【"+ formatYmd.format( mainData.getSubmissiontime())+"】-南通分公司-安全检查或隐患排查治理通报附件.xlsx";
+            addFileRecord(outputFile,fileName,mainData,"xlsx");
+
+        } catch (Exception e) {
+            System.err.println("生成 Excel 失败: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+
+    }
+
+    /**
+     *  gzh.png-;-e91fe56db91b409fa5b3cb4df0f4cf43^_^cb701d2ccb7e4a0fd59b8c9da0d96666_hpic2847_s - 副本 (2).jpg-;-014abcd9d3c54549865ec344cccc7123
+     *  拆解附件 ID ,保存每条信息的 图片 ids
+     * @param idsSet
+     * @param map
+     * @param key
+     * @param builder
+     */
+    private void setPHotoCommon(  Set<String> idsSet ,Map<String, String> map ,String key){
+        if(StringUtils.isNotBlank(map.get(key))){
+            List<String> partsList = new ArrayList<>();
+            for (String photo : map.get(key).split("\\^_\\^")) {
+                String[] parts = photo.split("-;-");
+                partsList.add(parts[1]);
+                idsSet.add(parts[1]);
+            }
+            if (!partsList.isEmpty()) {
+
+                map.put(key, String.join(",", partsList));
+            }
+        }
+    }
+
+
+    /**
+     * 插入图片
+     * @param map
+     * @param urlMap
+     * @param sheet
+     * @param rowNum
+     * @param colNum
+     */
+    private void processField(Map<String, String> map, String field, Map<String, String> urlMap, Sheet sheet, int rowNum, int colNum) {
+        if(map.get(field) !=null ){
+            String[] ids = map.get(field).split(",");
+            for (int i = 0; i < ids.length; i++) {
+                if(urlMap.get(ids[i])!=null ){
+                    String imagePath = urlMap.get(ids[i]);
+//                   imagePath ="C:\\Users\\shangmi\\Desktop\\ceshi.jpg";
+                    try (BufferedInputStream inputStream = FileUtil.getInputStream(imagePath)) {
+                        insertPicture(sheet, rowNum, colNum+i, inputStream);
+                    } catch (Exception e) {
+                        logger.error("插入图片失败 -  行: {}, 列: {}, 路径: {}",
+                                rowNum, colNum, urlMap.get(ids[i]));
+                    }
+                }
+
+            }
+
+        }
+    }
+
+
+    /**
+     * 通过拆解list 中fieLd 查询附件的ID
+     * @param data
+     * @return
+     */
+    private Map<String, String> setFileUrl(List<Map<String, String>> data) {
+        Set<String> fileIds = new HashSet<>();
+        Map<String, String> collect =new HashMap<>();
+
+        for (int i = 0; i < data.size(); i++) {
+            Map<String, String> map = data.get(i);
+            for (String imageField : IMAGE_FIELDS) {
+                setPHotoCommon(fileIds,map,imageField);
+            }
+        }
+
+        if (!fileIds.isEmpty()){
+            collect = fileService.getBaseMapper().selectBatchIds(fileIds).stream().collect(Collectors.toMap(SysFileItemDo::getId, SysFileItemDo::getFullpath));
+        }
+
+        return collect;
+    }
+
+
+
+    public void setCellData(Cell cell,String field, Object value, CellStyle columnStyle){
+        cell.setCellStyle(columnStyle);
+        if(value==null){
+            return;
+        }
+        for (String imageField : IMAGE_FIELDS) {
+            if (field.equals(imageField)){
+              return;
+            }
+        }
+      cell.setCellValue(String.valueOf(value));
+
+
+    }
+
+
+    /**
+     * 设置奖励主表信息 reward
+     * penalty
+     * @param objectObjectHashMap
+     * @param mainData
+     */
+    private void setRewardMainData(HashMap<String, String> objectObjectHashMap, QhseDangerRewardManagementDo mainData) {
+
+        String  YearMonth = formatYmd.format(mainData.getSubmissiontime());
+        //年月
+        objectObjectHashMap.put("YEAR", YearMonth.split("-")[0]);
+        objectObjectHashMap.put("MONTH", Integer.valueOf(YearMonth.split("-")[1])+"");
+        objectObjectHashMap.put("HIDDENDANGERSTOTALNUMBER",mainData.getHiddendangerstotalnumber()+"");
+        objectObjectHashMap.put("HIDDENDANGERSMAJORNUMBER",mainData.getHiddendangersmajornumber()+"");
+        objectObjectHashMap.put("HIDDENDANGERSGENERALNUMBER",mainData.getHiddendangerstotalnumber()+"");
+        objectObjectHashMap.put("REWARDSTOTALAMOUNT",mainData.getRewardstotalamount().toPlainString());
+        objectObjectHashMap.put("RETURNEDNUMBER",mainData.getReturnednumber()+"");
+        objectObjectHashMap.put("COMPLETEDRECTIFICATIONSNUMBER",mainData.getCompletedrectificationsnumber()+"");
+        objectObjectHashMap.put("RECTIFICATIONCOMPLETIONRATE",mainData.getRectificationcompletionrate().toPlainString()+"%");
+        objectObjectHashMap.put("SUBMISSIONTIME",YearMonth);
+    }
+
+
+    private  void insertPicture(Sheet sheet, int rowNum, int colNum, BufferedInputStream resizedInputStream) throws Exception {
+        // 1. 读取图片字节
+        byte[] imageBytes = IOUtils.toByteArray(resizedInputStream);
+
+        // 2. 添加图片到 Workbook
+        Workbook workbook = sheet.getWorkbook();
+        int pictureIndex = workbook.addPicture(imageBytes, Workbook.PICTURE_TYPE_JPEG);
+
+        // 3. 创建 Drawing 和 Anchor
+        CreationHelper helper = workbook.getCreationHelper();
+        Drawing<?> drawing = sheet.createDrawingPatriarch();
+        ClientAnchor anchor = helper.createClientAnchor();
+
+        // 4. 设置图片位置(锚点)
+        anchor.setCol1(colNum); // 起始列(0-based)
+        anchor.setRow1(rowNum); // 起始行(0-based)
+        anchor.setCol2(colNum + 1); // 结束列(可调整)
+        anchor.setRow2(rowNum + 1); // 结束行(可调整)
+
+        // 5. 插入图片
+        Picture picture = drawing.createPicture(anchor, pictureIndex);
+        picture.getImageDimension().setSize(DEFAULT_PICTURE_WIDTH, DEFAULT_PICTURE_HEIGHT); // 宽200px,高150px
+        // 6. 可选:调整图片大小
+       // picture.resize(); // 自动调整大小(POI 4.1.2+)
+    }
+
+
+    /**
+     * 生成附件纪录
+     */
+    public void  addFileRecord(String fullPath, String fileName, QhseDangerRewardManagementDo rewardManagementDo, String filetype){
+        logger.info("生成附件纪录");
+        File file = new File(fullPath);
+        long fileSize = file.length();
+
+        SysFileItemDo sysFileItemDo = new SysFileItemDo();
+        sysFileItemDo.setId(SecurityUtil.getUUID());
+        sysFileItemDo.setFilename(fileName);
+        sysFileItemDo.setFiletype(filetype);
+        sysFileItemDo.setStoragetype("1");
+        sysFileItemDo.setFilefolderid("c248b055d01743bdb485f5114da3e355"); //目录ID
+        sysFileItemDo.setRelationid(rewardManagementDo.getId());
+        sysFileItemDo.setFullpath(fullPath);
+        sysFileItemDo.setFilesize(fileSize);
+        fileService.getBaseMapper().insert(sysFileItemDo);
+
+        QhseDangerRewardManagementDo updateDo = new QhseDangerRewardManagementDo();
+        updateDo.setId(rewardManagementDo.getId());
+        String requestreport = fileName + "-;-" + sysFileItemDo.getId();
+        if(StringUtils.isBlank(rewardManagementDo.getRequestreport())){
+            updateDo.setRequestreport(requestreport);
+        }else {
+            updateDo.setRequestreport(rewardManagementDo.getRequestreport()+"^_^"+requestreport);
+        }
+        qhseDangerRewardManagementService.updateById(updateDo);
+    }
+
+}
+

+ 6 - 2
qhse-common/src/main/java/com/rongwei/bscommon/system/dao/SysPagePartDao.java

@@ -1,8 +1,7 @@
 package com.rongwei.bscommon.system.dao;
-
-
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.rongwei.bsentity.domain.SysPagePartDo;
+import org.apache.ibatis.annotations.Select;
 
 
 /**
@@ -12,7 +11,12 @@ import com.rongwei.bsentity.domain.SysPagePartDo;
  * @since 2025-07-29 14:28:28
  */
 
+
 public interface SysPagePartDao extends BaseMapper<SysPagePartDo> {
 
+
+
+    @Select("select * from sys_page_part where ID = #{id}")
+    SysPagePartDo getDataById(String id);
 }
 

+ 1 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/service/SysPagePartService.java

@@ -13,5 +13,6 @@ import com.rongwei.bsentity.domain.SysPagePartDo;
 public interface SysPagePartService extends IService<SysPagePartDo> {
 
 
+    SysPagePartDo getDataById(String id);
 }
 

+ 9 - 1
qhse-common/src/main/java/com/rongwei/bscommon/system/service/impl/SysPagePartServiceImpl.java

@@ -1,9 +1,9 @@
 package com.rongwei.bscommon.system.service.impl;
-
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.system.dao.SysPagePartDao;
 import com.rongwei.bscommon.system.service.SysPagePartService;
 import com.rongwei.bsentity.domain.SysPagePartDo;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -15,6 +15,14 @@ import org.springframework.stereotype.Service;
 @Service
 public class SysPagePartServiceImpl extends ServiceImpl<SysPagePartDao, SysPagePartDo> implements SysPagePartService {
 
+    @Autowired
+    SysPagePartDao sysPagePartDao;
+
 
+    @Override
+     
+    public SysPagePartDo getDataById(String id) {
+        return sysPagePartDao.getDataById(id);
+    }
 }
 

+ 30 - 0
qhse-common/src/main/java/com/rongwei/bscommon/system/utils/WordUtils.java

@@ -1,10 +1,14 @@
 package com.rongwei.bscommon.system.utils;
 
 import com.aspose.words.*;
+import com.aspose.words.net.System.Data.DataRow;
+import com.aspose.words.net.System.Data.DataTable;
 import lombok.Data;
 import org.springframework.core.io.ClassPathResource;
 
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * WordMailMergeFill class
@@ -47,4 +51,30 @@ public class WordUtils {
             throw new RuntimeException("文件导出异常");
         }
     }
+
+    /**
+     * 封装 list 数据到 word 模板中(word表格)
+     *
+     * @param list 数据
+     * @param tableName 表格列表变量名称
+     * @return word表格数据DataTable
+     */
+    public static DataTable fillListData(List<Map<String,Object>> list, String tableName) {
+        //创建DataTable,并绑定字段
+        DataTable dataTable = new DataTable(tableName);
+        Set<String> allfields = list.listIterator(0).next().keySet();
+        for (String field: allfields) {
+            dataTable.getColumns().add(field);
+        }
+        for (Map<String,Object> obj : list) {
+            //创建DataRow,封装该行数据
+            DataRow dataRow = dataTable.newRow();
+            Set<String> fields = obj.keySet();
+            for (String field: fields) {
+                dataRow.set(field,obj.get(field));
+            }
+            dataTable.getRows().add(dataRow);
+        }
+        return dataTable;
+    }
 }

+ 101 - 0
qhse-common/src/main/resources/mybatis/QhseDangerRewardManagementDao.xml

@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.rongwei.bscommon.sys.dao.QhseDangerRewardManagementDao">
+
+    <select id="getRewardHzData" resultType="java.util.Map">
+        SELECT ROW_NUMBER() OVER (ORDER BY USERNAME DESC) AS SORT,
+               a.REWARDID,
+               a.DEPTID,
+               a.DEPTNAME,
+               a.USERID,
+               a.USERNAME,
+               SUM(MONEY) "AMONUT"
+        FROM qhse_rohh_rp a
+        where a.REWARDID= #{id} AND a.DELETED ='0' GROUP BY a.DEPTID, a.DEPTNAME, a.USERID, a.USERNAME
+    </select>
+
+    <select id="rewardMxData" resultType="java.util.Map">
+        SELECT
+            a.*,
+            ROW_NUMBER () OVER (ORDER BY b.REGISTERTIME DESC) AS SORT,
+            TO_CHAR(b.REGISTERTIME, 'YYYY-MM-DD HH24:MI:SS') AS REGISTERTIME,
+            b.STATE,
+            b.HDTYPE,
+            c.NAME AS HDTYPENAME,
+            b.REGISTERTIME,
+            b.INSPECTTYPE,
+            b.HDLEVEL,
+            d.NAME AS HDLEVELNAME,
+            b.RECTIFICATIONDAYS,
+            b.HDDESC,
+            b.RECTIFICATIONDEPT,
+            b.RECTIFICATIONDEPTID,
+            b.GRIDMANAGER,
+            b.GRIDMANAGERID,
+            TO_CHAR(b.RECTIFICATIONTIME, 'YYYY-MM-DD HH24:MI:SS') AS RECTIFICATIONTIME,
+            b.INSPECTUSERID,
+            b.INSPECTUSER,
+            b.GRID,
+            e.NAME AS REWARDANNOTATIONNAME
+        FROM
+            qhse_rohh_rp a
+            LEFT JOIN "qhse_rohh" b ON b.ID = a.ROHHID
+            LEFT JOIN sys_dict c on c.DICTTYPE ='YHRWYHLX' and c.deleted ='0'  and c.VALUE =b.HDTYPE
+            LEFT JOIN sys_dict d on d.DICTTYPE ='YHRWDJ' and d.deleted ='0'  and d.VALUE =b.HDLEVEL
+            LEFT JOIN sys_dict e on e.DICTTYPE ='reward_annotation' and e.deleted ='0'  and e.VALUE =a.REWARDANNOTATION
+        WHERE
+            a.REWARDID = #{ id }
+          AND a.DELETED = '0'
+    </select>
+
+    <select id="getPunishmentData" resultType="java.util.Map">
+
+        SELECT
+            ROW_NUMBER () OVER (ORDER BY b.REGISTERTIME DESC) AS SORT,
+            TO_CHAR(b.REGISTERTIME, 'YYYY-MM-DD') AS REGISTERTIME,
+            a.MONEY,
+            a.RPCATEGORY,
+            f.NAME AS RPCATEGORYNAME,
+            a.USERNAME,
+            a.POINT,
+            b.REGISTERTIME,
+            b.INSPECTUSER,
+            b.RECTIFICATIONDEPT,
+            b.RECTIFICATIONWORKSHOP,
+            b.RECTIFICATIONWORKSUBCONTRACTOR,
+            b.GRID,
+            b.RECTIFICATIONUSER,
+            b.HDPHOTO,
+            b.HDDESC,
+            b.BASISFORRECTIFICATION,
+            b.HDTYPE,
+            c.NAME AS HDTYPENAME,
+            b.HDLEVEL,
+            d.NAME AS HDLEVELNAME,
+            b.RECTIFICATIONPROPOSAL,
+            b.VERIFIER,
+            b.VERIFIERRESULT,
+            g.NAME AS VERIFIERRESULTNAME,
+            TO_CHAR(b.RECTIFICATIONDATE, 'YYYY-MM-DD') AS RECTIFICATIONDATE,
+            b.RECTIFICATIONPLAN,
+            CAST(b.RECTIFICATIONPHOTO AS VARCHAR(4000)) AS RECTIFICATIONPHOTO,  -- 转换为 VARCHAR
+           TO_CHAR(b.RECTIFICATIONTIME, 'YYYY-MM-DD') AS RECTIFICATIONTIME,
+           b.STATE,
+           e.NAME AS STATENAME,
+            h.SIGNATURE AS RECTIFICATIONUSERSIGN
+        FROM
+            qhse_rohh_rp a
+            LEFT JOIN "qhse_rohh" b ON b.ID = a.ROHHID
+            LEFT JOIN sys_dict c on c.DICTTYPE ='YHRWYHLX' and c.deleted ='0'  and c.VALUE =b.HDTYPE
+            LEFT JOIN sys_dict d on d.DICTTYPE ='YHRWDJ' and d.deleted ='0'  and d.VALUE =b.HDLEVEL
+            LEFT JOIN sys_dict e on e.DICTTYPE ='YHRWZT' and e.deleted ='0'  and e.VALUE =b.STATE
+            LEFT JOIN sys_dict f on f.DICTTYPE ='RPCATEGORY' and f.deleted ='0'  and f.VALUE =a.RPCATEGORY
+            LEFT JOIN sys_dict g on g.DICTTYPE ='ZGYZJG' and g.deleted ='0'  and g.VALUE =b.VERIFIERRESULT
+            LEFT JOIN sys_user h ON h.DELETED ='0' AND h.ID =b.RECTIFICATIONUSERID
+        WHERE
+            a.REWARDID = #{ id }
+          AND a.DELETED = '0'
+
+    </select>
+</mapper>

+ 21 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/Dto/PunishmentExcelDto.java

@@ -0,0 +1,21 @@
+package com.rongwei.bsentity.dto;
+
+import lombok.Data;
+
+
+@Data
+public class PunishmentExcelDto {
+    private String field;
+    private String name;
+
+
+
+    public PunishmentExcelDto(String field, String name) {
+        this.field =field;
+        this.name =name;
+
+    }
+
+
+}
+

+ 170 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhseDangerRewardManagementDo.java

@@ -0,0 +1,170 @@
+package com.rongwei.bsentity.domain;
+
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 隐患奖励管理(QhseDangerRewardManagement)表实体类
+ *
+ * @author makejava
+ * @since 2025-08-22 16:15:53
+ */
+@Data
+@TableName(value = "qhse_danger_reward_management")
+public class QhseDangerRewardManagementDo extends BaseDo implements Serializable {
+
+    /**
+     * 主键
+     **/
+    private String id;
+    
+    /**
+     * 租户ID
+     **/
+    private String tenantid;
+    
+    /**
+     * 扩展json格式配置
+     **/
+    private String roption;
+    
+    /**
+     * 是否删除Y/N
+     **/
+    private String deleted;
+    
+    /**
+     * 备注
+     **/
+    private String remark;
+    
+    /**
+     * 创建时间
+     **/
+    private Date createdate;
+    
+    /**
+     * 创建用户ID
+     **/
+    private String createuserid;
+    
+    /**
+     * 修改日期
+     **/
+    private Date modifydate;
+    
+    /**
+     * 修改用户ID
+     **/
+    private String modifyuserid;
+    
+    /**
+     * 创建人名称
+     **/
+    private String createusername;
+    
+    /**
+     * 修改人名称
+     **/
+    private String modifyusername;
+    
+    /**
+     * 流程ID
+     **/
+    private String processinstid;
+    
+    /**
+     * 统计开始时间
+     **/
+    private Date statisticsstarttime;
+    
+    /**
+     * 统计结束时间
+     **/
+    private Date statisticsendtime;
+    
+    /**
+     * 审批状态
+     **/
+    private String approvalstatus;
+    
+    /**
+     * 通过评审数
+     **/
+    private BigDecimal reviewspassednumber;
+    
+    /**
+     * 整改完成率
+     **/
+    private BigDecimal rectificationcompletionrate;
+    
+    /**
+     * 奖励/罚款总金额
+     **/
+    private BigDecimal rewardstotalamount;
+    
+    /**
+     * 提交人ID
+     **/
+    private String submitterid;
+    
+    /**
+     * 提交人名称
+     **/
+    private String submittername;
+    
+    /**
+     * 提交时间
+     **/
+    private Date submissiontime;
+    
+    /**
+     * 隐患总数
+     **/
+    private Integer hiddendangerstotalnumber;
+    
+    /**
+     * 重大隐患数
+     **/
+    private Integer hiddendangersmajornumber;
+    
+    /**
+     * 一般隐患数
+     **/
+    private Integer hiddendangersgeneralnumber;
+    
+    /**
+     * 整改完成数
+     **/
+    private Integer completedrectificationsnumber;
+    
+    /**
+     * 填报有误退回数 RETURNEDNUMBER
+     **/
+    private Integer returnednumber;
+    
+    /**
+     * 请示报告
+     **/
+    private String requestreport;
+    
+    /**
+     * 奖惩类型 1:奖励 2:惩罚
+     **/
+    private String rptype;
+    
+    /**
+     * 请示序号
+     **/
+    private Integer requestserialnumber;
+    
+}
+
+

+ 161 - 0
qhse-entity/src/main/java/com/rongwei/bsentity/domain/QhseRohhRp.java

@@ -0,0 +1,161 @@
+package com.rongwei.bsentity.domain;
+
+
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.rongwei.rwcommon.base.BaseDo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 隐患任务信息-奖惩(QhseRohhRp)表实体类
+ *
+ * @author makejava
+ * @since 2025-08-23 14:35:46
+ */
+@Data
+@TableName(value = "qhse_rohh_rp")
+public class QhseRohhRp extends BaseDo implements Serializable {
+
+    /**
+     * 主键
+     **/
+    private String id;
+    
+    /**
+     * 租户ID
+     **/
+    private String tenantid;
+    
+    /**
+     * 扩展json格式配置
+     **/
+    private String roption;
+    
+    /**
+     * 是否删除Y/N
+     **/
+    private String deleted;
+    
+    /**
+     * 备注
+     **/
+    private String remark;
+    
+    /**
+     * 创建时间
+     **/
+    private Date createdate;
+    
+    /**
+     * 创建用户ID
+     **/
+    private String createuserid;
+    
+    /**
+     * 修改日期
+     **/
+    private Date modifydate;
+    
+    /**
+     * 修改用户ID
+     **/
+    private String modifyuserid;
+    
+    /**
+     * 创建人名称
+     **/
+    private String createusername;
+    
+    /**
+     * 修改人名称
+     **/
+    private String modifyusername;
+    
+    /**
+     * 奖惩类型
+     **/
+    private String rptype;
+    
+    /**
+     * 分数
+     **/
+    private BigDecimal point;
+    
+    /**
+     * 金额
+     **/
+    private BigDecimal money;
+    
+    /**
+     * 奖惩人员
+     **/
+    private String username;
+    
+    /**
+     * 用户ID
+     **/
+    private String userid;
+    
+    /**
+     * 生效时间
+     **/
+    private Date effectivetime;
+    
+    /**
+     * 隐患任务ID
+     **/
+    private String rohhid;
+    
+    /**
+     * 奖励ID
+     **/
+    private String rewardid;
+    
+    /**
+     * 奖励标注
+     **/
+    private String rewardannotation;
+    
+    /**
+     * 部门ID
+     **/
+    private String deptid;
+    
+    /**
+     * 部门名称
+     **/
+    private String deptname;
+    
+    /**
+     * 奖惩依据
+     **/
+    private String rpmethod;
+    
+    /**
+     * 奖惩类别
+     **/
+    private String rpcategory;
+    
+    /**
+     * 单位ID
+     **/
+    private String unitid;
+    
+    /**
+     * 单位名称
+     **/
+    private String unitname;
+    
+    /**
+     * 处罚标记状态
+     **/
+    private String penaltymarkstatus;
+    
+}
+
+

+ 50 - 0
qhse-server/src/main/java/com/rongwei/controller/QhseDangerRewardManagementController.java

@@ -0,0 +1,50 @@
+package com.rongwei.controller;
+import com.rongwei.bscommon.sys.service.QhseDangerRewardManagementService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+
+/**
+ * 隐患奖励管理(QhseDangerRewardManagement)表控制层
+ *
+ * @author makejava
+ * @since 2025-08-22 16:15:51
+ */
+@RestController
+@RequestMapping("qhseDangerRewardManagement")
+public class QhseDangerRewardManagementController  {
+    /**
+     * 服务对象
+     */
+    @Resource
+    private QhseDangerRewardManagementService qhseDangerRewardManagementService;
+
+    private final Logger logger = LoggerFactory.getLogger(getClass());
+
+
+    /**
+     * 根据模板生成PDF 附件 到奖励附件中
+     * @param id
+     * @param fileName
+     */
+    @GetMapping("/CreatPdfFromWordTemp")
+    public void CreatPdfFromWordTemp(@RequestParam("id") String id,
+                                     @RequestParam("url") String url) {
+        logger.info("根据模板生成PDF 附件 到奖励附件中:id:{},url:{}", id,url);
+        qhseDangerRewardManagementService.CreatPdfFromWordTemp(id,url);
+    }
+
+    @GetMapping("/CreatFromExcelTemp")
+    public void CreatPdfFromExcelTemp( @RequestParam("id") String id,
+                                       @RequestParam("url") String url
+    ) {
+        logger.info("根据模板生成EXCEL 附件 到奖励附件中:id:{},url:{}", id,url);
+        qhseDangerRewardManagementService.CreatFromExcelTemp(id,url);
+    }
+
+
+}
+

+ 3 - 3
qhse-server/src/main/java/com/rongwei/controller/QhseVisitorManagementController.java

@@ -1,5 +1,6 @@
 package com.rongwei.controller;
 
+import com.rongwei.bscommon.system.dao.SysPagePartDao;
 import com.rongwei.bscommon.system.service.QhseVisitorManagementService;
 import com.rongwei.bscommon.system.service.SysPagePartService;
 import com.rongwei.bsentity.domain.SysPagePartDo;
@@ -39,7 +40,7 @@ public class QhseVisitorManagementController  {
     @GetMapping("/getPageInfo/{id}")
     public R getUserById(@PathVariable String id) {
         logger.info("/getPageInfo 入参 id: {}", id);
-        SysPagePartDo sysPagePartDo = sysPagePartService.getById(id);
+        SysPagePartDo sysPagePartDo = sysPagePartService.getDataById(id);
         return R.ok(sysPagePartDo);
 
     }
@@ -54,8 +55,7 @@ public class QhseVisitorManagementController  {
     public R generalMsInsert(@RequestBody MasterSlaveInsertVo masterSlaveInsert) {
         logger.info("/generalMsInsert 入参 masterSlaveInsert: {}", masterSlaveInsert.toString());
         try {
-            qhseVisitorManagementService.generalMsInsert(masterSlaveInsert);
-            return R.ok();
+            return qhseVisitorManagementService.generalMsInsert(masterSlaveInsert);
         } catch (Exception e) {
             logger.error(StringUtils.spliceErrorMsg(e), e.fillInStackTrace());