Browse Source

完成报表根据模板内容的生成处理。明天完成报表的全部生成与展示。

CodeLife Leno 1 month ago
parent
commit
8aaab972b2
17 changed files with 326 additions and 48 deletions
  1. 5 4
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/businessconfig/utils/FilesValueCheckUtils.java
  2. 12 0
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/model/ParamCalcModel.java
  3. 5 1
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/model/ReportParamCalcModel.java
  4. 1 1
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/ParamCalcDefault.java
  5. 1 1
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/ParamCalcSQL.java
  6. 1 1
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/ParamCalcSQLMap.java
  7. 1 0
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/ParamCalcSQLMapList.java
  8. 1 0
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/interfaces/ParamCalc.java
  9. 10 4
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/ParamCalcService.java
  10. 127 0
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/ReportCalcService.java
  11. 0 18
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/ReportParamCalcService.java
  12. 53 0
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/ReportUnitParamCalcService.java
  13. 2 0
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/utils/FinalStrs.java
  14. 9 9
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/model/ReportCalculationModel.java
  15. 4 9
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/service/ReportFillingConfigService.java
  16. 5 0
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/service/finals/ReportFinalParam.java
  17. 89 0
      Procedure/backend/project/src/main/java/com/sundata/product/rwa/util/CollectionToMapConverter.java

+ 5 - 4
Procedure/backend/project/src/main/java/com/sundata/product/rwa/businessconfig/utils/FilesValueCheckUtils.java

@@ -8,6 +8,7 @@ import com.sundata.common.util.StringUtil;
 import com.sundata.product.rwa.businessconfig.service.SysListOfPublicSectorService;
 import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportCalculationModel;
 import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportDefinitionModel;
+import com.sundata.product.rwa.reportformconfigreportcreater.service.finals.ReportFinalParam;
 import jakarta.servlet.http.HttpServletResponse;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.*;
@@ -302,11 +303,11 @@ public class FilesValueCheckUtils {
                     model = new ReportCalculationModel();
                     model.setReportno(defineModel.getReportNo());
                     // sheet页记入
-                    model.setReportUnitSheet(String.valueOf(i+1));
+                    model.setReportUnitSheet((i+1));
                     // 当前sheet页当前行记入
-                    model.setReportUnitRow(String.valueOf(rowNum+1));
+                    model.setReportUnitRow((rowNum+1));
                     // 当前sheet页当前行的当前列记入
-                    model.setReportUnitCell(String.valueOf(cellNum+1));
+                    model.setReportUnitCell((cellNum+1));
                     // 报表计算单元编号计入(报表编号+sheet页号+行号+列号)
                     model.setReportUnitNo(defineModel.getReportNo()+
                             String.valueOf(i+1)+String.valueOf(rowNum+1)+String.valueOf(cellNum+1));
@@ -314,7 +315,7 @@ public class FilesValueCheckUtils {
 //                    reportNo = reportNo + 1;
 //                    model.setId(String.valueOf(reportNo));
                     if (cellData.getCellType().equals(CellType.FORMULA)) {
-                        if (cellData.getCellFormula().equals("ROW()&\"-\"&COLUMN()")) {
+                        if (cellData.getCellFormula().equals(ReportFinalParam.EXECUTE_REPORT)) {
                             model.setExcelFormula(cellData.getCellFormula());
                             // 需填报的单元详情列表
                             modelFillInList.add(model);

+ 12 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/model/ParamCalcModel.java

@@ -3,6 +3,8 @@ package com.sundata.product.rwa.calc.model;
 
 import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportParamDefineModel;
 
+import java.util.StringJoiner;
+
 /**
  * 计算参数对象
  */
@@ -69,4 +71,14 @@ public class ParamCalcModel {
     public ReportParamDefineModel getModel() {
         return model;
     }
+
+    @Override
+    public String toString() {
+        return new StringJoiner(", ", ParamCalcModel.class.getSimpleName() + "[", "]")
+                .add("calcindex='" + calcindex + "'")
+                .add("dataDate='" + dataDate + "'")
+                .add("model=" + model)
+                .add("value=" + value)
+                .toString();
+    }
 }

+ 5 - 1
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/model/ReportParamCalcModel.java

@@ -53,10 +53,14 @@ public class ReportParamCalcModel {
         return dataDate;
     }
 
-    private ReportCalculationModel getReportCalcModel() {
+    public ReportCalculationModel getReportCalcModel() {
         return reportCalcModel;
     }
 
+    public String getParamCalcObjectName() {
+        return reportCalcModel.getUnitCalcObjectName();
+    }
+
     public ParamCalcModel getParamCalcModel() {
         return paramCalcModel;
     }

+ 1 - 1
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/ParamCalcDefault.java

@@ -15,6 +15,6 @@ public class ParamCalcDefault implements ParamCalc {
     public void calc(ParamCalcModel model, Map<String, Object> context) {
         StringSubstitutor sub = new StringSubstitutor(context);
         model.setValue(sub.replace(model.getParamCalcGetdata()));
-        log.debug(model.getParamCalcGetdata());
+        log.debug("取默认值:{}",model);
     }
 }

+ 1 - 1
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/ParamCalcSQL.java

@@ -25,6 +25,6 @@ public class ParamCalcSQL implements ParamCalc {
 
         String value = DBExecutor.doQuery(sql);
         model.setValue(value);
-        log.info("数据处理完成:{}", value);
+        log.info("数据获取完成:{}", model);
     }
 }

+ 1 - 1
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/ParamCalcSQLMap.java

@@ -36,7 +36,7 @@ public class ParamCalcSQLMap implements ParamCalc {
             log.error("脚本没有执行结果,请检查SQL逻辑:{}",model.getParamCalcGetdata());
             throw new ArrayIndexOutOfBoundsException("脚本没有执行结果,请检查SQL逻辑");
         }
-
         model.setValue(mapList.get(0));
+        log.info("数据获取完成:{}", model);
     }
 }

+ 1 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/ParamCalcSQLMapList.java

@@ -33,5 +33,6 @@ public class ParamCalcSQLMapList implements ParamCalc {
             throw new ArrayIndexOutOfBoundsException("脚本没有执行结果,请检查SQL逻辑");
         }
         model.setValue(mapList);
+        log.info("数据获取完成,共计:{}条", mapList.size());
     }
 }

+ 1 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/param/interfaces/ParamCalc.java

@@ -13,6 +13,7 @@ public interface ParamCalc {
 
     /**
      * 计算过程,主要用于参数的计算 计算过程应当对 model 中的 value 赋值
+     * 目前没有实现 Java class 的工程
      * @param model 参数对象,参数对象内容,需要处理计算逻辑再对 value 属性赋值
      * @param context 计算用的参数
      */

+ 10 - 4
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/ParamCalcService.java

@@ -5,11 +5,12 @@ import com.sundata.product.rwa.calc.model.ParamCalcType;
 import com.sundata.product.rwa.calc.param.interfaces.ParamCalc;
 import com.sundata.product.rwa.reportformconfigreportcreater.mapper.ReportParamDefineMapper;
 import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportParamDefineModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -19,26 +20,31 @@ import java.util.Map;
 @Service
 public class ParamCalcService {
 
+    private static final Logger log = LoggerFactory.getLogger(ParamCalcService.class);
+
     @Autowired
     ReportParamDefineMapper reportParamDefineMapper;
 
     /**
      * 获取并计算全部报表参数
+     *
      * @param calcindex 计算流水号
-     * @param dataDate 计算数据日期
+     * @param dataDate  计算数据日期
      * @return 全部报表参数配置的报表内容
      */
-    public List<ParamCalcModel> calc(String calcindex, String dataDate , Map<String ,Object> context) {
+    public List<ParamCalcModel> calc(String calcindex, String dataDate, Map<String, Object> context) {
         List<ParamCalcModel> models = new ArrayList<>();
         List<ReportParamDefineModel> paramDefineModels = reportParamDefineMapper.getDataList(new ReportParamDefineModel());
+        log.debug("开始计算报表参数,共计:{}个", paramDefineModels.size());
         for (ReportParamDefineModel paramDefineModel : paramDefineModels) {
             ParamCalcModel model = new ParamCalcModel(calcindex, dataDate, paramDefineModel);
             ParamCalc paramCalc = ParamCalcType.getParamCalcType(model.getValueDataType()).getParamCalc(null);
             if (paramCalc != null) {
-                paramCalc.calc(model,context);
+                paramCalc.calc(model, context);
             }
             models.add(model);
         }
+        log.debug("完成报表计算参数的处理。");
         return models;
     }
 

+ 127 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/ReportCalcService.java

@@ -1,7 +1,134 @@
 package com.sundata.product.rwa.calc.service;
 
+import com.sundata.common.util.DBExecutor;
+import com.sundata.product.rwa.calc.model.ReportParamCalcModel;
+import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportCalculationModel;
+import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportDefinitionModel;
+import com.sundata.product.rwa.reportformconfigreportcreater.service.ReportFillingConfigService;
+import com.sundata.product.rwa.util.CollectionToMapConverter;
+import com.sundata.product.rwa.util.DataUtil;
+import org.apache.poi.ss.usermodel.*;
+import org.jxls.builder.JxlsOutputFile;
+import org.jxls.transform.poi.JxlsPoiTemplateFillerBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 /**
  * 报表计算过程逻辑
  */
+@Service
 public class ReportCalcService {
+
+    private static final Logger log = LoggerFactory.getLogger(ReportCalcService.class);
+
+    /**
+     * 报表配置对象
+     */
+    @Autowired
+    ReportFillingConfigService service;
+
+    /**
+     * 报表计算单元的计算逻辑
+     */
+    @Autowired
+    ReportUnitParamCalcService reportUnitParamCalcService;
+
+    public void createAllReport(String calcIndex, String dataDate, Map<String, String> context, Map<String, Object> reportParam) {
+        List<ReportDefinitionModel> reportParamDefineModels = service.getDataList(new ReportDefinitionModel());
+        log.debug("开始处理报表");
+    }
+
+    /**
+     * 处理报表模板内容,填充基础数据
+     *
+     * @param model
+     * @param calcIndex
+     * @param dataDate
+     * @param context
+     * @param reportParam
+     * @return
+     */
+    public File createTempReport(ReportDefinitionModel model, String calcIndex, String dataDate, Map<String, Object> context, Map<String, Object> reportParam) {
+        String reportno = model.getReportNo();
+        log.debug("处理报表:{}-{}", reportno, model.getReportName());
+        File tempFile = null;
+        String reportType = model.getReportType();
+        List<ReportParamCalcModel> reportParamCalcModels = reportUnitParamCalcService.calc(calcIndex, dataDate, context, reportno);
+        Map<String, Object> reportParamMap = CollectionToMapConverter.toMap(reportParamCalcModels, ReportParamCalcModel::getParamCalcObjectName, ReportParamCalcModel::getValue);
+        // 字典里获取附件路径
+        String templatePath = DBExecutor.doQuery("select NOUNVALUE from sys_noun where NOUNITEM = 'ATTACHPATH'");
+        //
+        File reportTempFileDirPath = new File(templatePath + File.separator + "reportuploadconfig" + File.separator + reportno + File.separator + "default");
+        String[] fileNameLists = reportTempFileDirPath.list();
+        if (fileNameLists == null || fileNameLists.length == 0) {
+            throw new CalcException(calcIndex, "处理报表时,没有发现报表模板");
+        }
+        // 获取模板文件
+        File reportTempFile = new File(reportTempFileDirPath, fileNameLists[0]);
+
+        // 复制为临时文件并修改文件到对应的路径
+        File tempTmpFilePath = new File(templatePath + File.separator + "tempTmp" + File.separator + "reportuploadconfig" + File.separator + calcIndex + File.separator + reportno, fileNameLists[0]);
+        tempTmpFilePath.getParentFile().mkdirs();
+        if (tempTmpFilePath.exists()) {
+            tempTmpFilePath.delete();
+        }
+
+        if ("1".equals(reportType)) {
+            // 固定行列 使用单元格处理的内容逐一覆盖报表计算过程
+            try {
+                Workbook workbook = WorkbookFactory.create(new FileInputStream(reportTempFile));
+                for (int i = 0; i < reportParamCalcModels.size(); i++) {
+                    ReportCalculationModel reportCalculationModel = reportParamCalcModels.get(i).getReportCalcModel();
+                    Sheet sheet = workbook.getSheetAt(reportCalculationModel.getReportUnitSheet());
+                    if (sheet == null) {
+                        sheet = workbook.createSheet();
+                    }
+                    Row row = sheet.getRow(reportCalculationModel.getReportUnitRow());
+                    if (row == null) {
+                        row = sheet.createRow(reportCalculationModel.getReportUnitRow());
+                    }
+                    Cell cell = row.createCell(reportCalculationModel.getReportUnitCell());
+                    if (cell == null) {
+                        cell = row.createCell(reportCalculationModel.getReportUnitCell());
+                    }
+                    if ("1".equals(reportCalculationModel.getUnitType())) {
+                        // 如果单元格类型是公式
+                        cell.setCellFormula(reportCalculationModel.getUnitCalcInfo());
+                    } else if ("2".equals(reportCalculationModel.getUnitType())) {
+                        // 如果单元格类型是字符串
+                        cell.setCellValue(String.valueOf(reportParamCalcModels.get(i).getValue()));
+                    } else if ("3".equals(reportCalculationModel.getUnitType())) {
+                        // 如果单元格类型是数字
+                        cell.setCellValue((Double) DataUtil.getDataDefault(reportParamCalcModels.get(i).getValue(), Double.class));
+                    }
+                }
+                workbook.write(Files.newOutputStream(tempTmpFilePath.toPath()));
+            } catch (IOException e) {
+                log.error("读取文件或写文件失败,请检查路径与文件权限:{}", e.getMessage(), e);
+            }
+        } else if ("2".equals(reportType)) {
+            // 动态行列的报表,使用jxls 完成报表的临时初始化
+            try {
+                JxlsPoiTemplateFillerBuilder.newInstance()
+                        .withTemplate(reportTempFile)
+                        .build()
+                        .fill(reportParamMap, new JxlsOutputFile(tempTmpFilePath));
+            } catch (FileNotFoundException e) {
+                throw new RuntimeException(e);
+            }
+        }
+
+        return tempTmpFilePath;
+    }
 }

+ 0 - 18
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/ReportParamCalcService.java

@@ -1,18 +0,0 @@
-package com.sundata.product.rwa.calc.service;
-
-import com.sundata.product.rwa.reportformconfigreportcreater.mapper.ReportFillingConfigMapper;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-/**
- * 报表参数计算逻辑
- */
-@Service
-public class ReportParamCalcService {
-
-
-    @Autowired
-    ReportFillingConfigMapper reportFillingConfigMapper;
-
-
-}

+ 53 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/ReportUnitParamCalcService.java

@@ -0,0 +1,53 @@
+package com.sundata.product.rwa.calc.service;
+
+import com.sundata.product.rwa.calc.model.ParamCalcModel;
+import com.sundata.product.rwa.calc.model.ParamCalcType;
+import com.sundata.product.rwa.calc.model.ReportParamCalcModel;
+import com.sundata.product.rwa.calc.param.interfaces.ParamCalc;
+import com.sundata.product.rwa.reportformconfigreportcreater.mapper.ReportFillingConfigMapper;
+import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportCalculationModel;
+import com.sundata.product.rwa.reportformconfigreportcreater.service.finals.ReportFinalParam;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 报表计算单元的计算逻辑
+ */
+@Service
+public class ReportUnitParamCalcService {
+
+
+    private static final Logger log = LoggerFactory.getLogger(ReportUnitParamCalcService.class);
+    @Autowired
+    ReportFillingConfigMapper reportFillingConfigMapper;
+
+    public List<ReportParamCalcModel> calc(String calcindex, String dataDate , Map<String ,Object> context , String reportno) {
+        List<ReportCalculationModel> modelList = reportFillingConfigMapper.selectCalcReportData(reportno);
+
+        List<ReportParamCalcModel> models = new ArrayList<>();
+        log.debug("开始报表计算单元的处理,报表编号:{},计算单元条目数:{}",reportno,modelList.size());
+        for (ReportCalculationModel reportCalculationModel : modelList) {
+            // 如果不是 需要被计算的内容或者单元格是公式类型,则跳过
+            if (!ReportFinalParam.EXECUTE_REPORT.equals(reportCalculationModel.getExcelFormula()) || "1".equals(reportCalculationModel.getUnitType())){
+                continue;
+            }
+            ReportParamCalcModel paramCalcModel = new ReportParamCalcModel(calcindex,dataDate,reportCalculationModel);
+            ParamCalcModel model = paramCalcModel.getParamCalcModel();
+            ParamCalc paramCalc = ParamCalcType.getParamCalcType(model.getValueDataType()).getParamCalc(null);
+            // 通过数据计算工具计算实际内容处理过程
+            if (paramCalc != null) {
+                paramCalc.calc(model,context);
+            }
+            paramCalcModel.setValue(model.getValue());
+            models.add(paramCalcModel);
+        }
+        return models;
+    }
+
+}

+ 2 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/utils/FinalStrs.java

@@ -1,5 +1,7 @@
 package com.sundata.product.rwa.calc.utils;
 
+import java.io.File;
+
 public class FinalStrs {
     public static final String _ALLHIS =  "_ALLHIS";
     public static final String _MASTER = "_MASTER";

+ 9 - 9
Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/model/ReportCalculationModel.java

@@ -19,11 +19,11 @@ public class ReportCalculationModel {
     // 报表计算单元编号
     private String reportUnitNo;
     // sheet页位置
-    private String reportUnitSheet;
+    private Integer reportUnitSheet;
     // 行位置
-    private String reportUnitRow;
+    private Integer reportUnitRow;
     // 列位置
-    private String reportUnitCell;
+    private Integer reportUnitCell;
     // 单元格样式类型
     private String unitStyleType;
     // 计算过程类型
@@ -105,27 +105,27 @@ public class ReportCalculationModel {
         this.reportUnitNo = reportUnitNo;
     }
 
-    public String getReportUnitSheet() {
+    public Integer getReportUnitSheet() {
         return reportUnitSheet;
     }
 
-    public void setReportUnitSheet(String reportUnitSheet) {
+    public void setReportUnitSheet(Integer reportUnitSheet) {
         this.reportUnitSheet = reportUnitSheet;
     }
 
-    public String getReportUnitRow() {
+    public Integer getReportUnitRow() {
         return reportUnitRow;
     }
 
-    public void setReportUnitRow(String reportUnitRow) {
+    public void setReportUnitRow(Integer reportUnitRow) {
         this.reportUnitRow = reportUnitRow;
     }
 
-    public String getReportUnitCell() {
+    public Integer getReportUnitCell() {
         return reportUnitCell;
     }
 
-    public void setReportUnitCell(String reportUnitCell) {
+    public void setReportUnitCell(Integer reportUnitCell) {
         this.reportUnitCell = reportUnitCell;
     }
 

+ 4 - 9
Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/service/ReportFillingConfigService.java

@@ -1,16 +1,14 @@
 package com.sundata.product.rwa.reportformconfigreportcreater.service;
 
-import com.sundata.admin.AdminUtil;
 import com.sundata.common.exception.BusinessException;
 import com.sundata.common.util.DBExecutor;
-import com.sundata.product.rwa.businessconfig.service.SysListOfPublicSectorService;
 import com.sundata.product.rwa.businessconfig.utils.FilesValueCheckUtils;
 import com.sundata.product.rwa.datasupplementary.model.DictContentList;
 import com.sundata.product.rwa.reportformconfigreportcreater.mapper.ReportFillingConfigMapper;
 import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportCalculationModel;
 import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportDefinitionModel;
+import com.sundata.product.rwa.reportformconfigreportcreater.service.finals.ReportFinalParam;
 import com.sundata.product.rwa.util.DataUtil;
-import org.apache.commons.collections.map.HashedMap;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
 import org.apache.poi.ss.usermodel.Workbook;
@@ -18,12 +16,9 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.dao.support.DataAccessUtils;
 import org.springframework.stereotype.Service;
 
 import java.io.*;
-import java.lang.reflect.Array;
-import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.util.*;
 
@@ -115,7 +110,7 @@ public class ReportFillingConfigService {
         if (null != modelList && modelList.size() > 0) {
             for(ReportCalculationModel model:modelList) {
                 if (null == model.getExcelFormula()) {
-                    model.setExcelFormula("ROW()&\"-\"&COLUMN()");
+                    model.setExcelFormula(ReportFinalParam.EXECUTE_REPORT);
                     model.setReportno(reportNo);
                     model.setReportUnitNo(reportNo+model.getReportUnitSheet()
                             +model.getReportUnitRow()+model.getReportUnitCell());
@@ -135,7 +130,7 @@ public class ReportFillingConfigService {
         List<ReportCalculationModel> modelCalcList = new ArrayList<ReportCalculationModel>();
         List<ReportCalculationModel> listModel = reportFillingConfigMapper.selectCalcReportData(reportNo);
         for(ReportCalculationModel model :listModel) {
-            if (model.getExcelFormula().equals("ROW()&\"-\"&COLUMN()")) {
+            if (model.getExcelFormula().equals(ReportFinalParam.EXECUTE_REPORT)) {
                 modelFillInList.add(model);
             } else {
                 modelCalcList.add(model);
@@ -187,7 +182,7 @@ public class ReportFillingConfigService {
             // 有新列表加入,将新列表中与老列表重复的数据按新列表为准存进数据库
             for(ReportCalculationModel model:newList){
                 model.setReportno(modelList.get(0).getReportno());
-                model.setExcelFormula("ROW()&\"-\"&COLUMN()");
+                model.setExcelFormula(ReportFinalParam.EXECUTE_REPORT);
                 for (ReportCalculationModel oldModel:oldList){
                     if (!oldModel.getReportUnitSheet().equals(model.getReportUnitSheet())
                             || !oldModel.getReportUnitRow().equals(model.getReportUnitRow())

+ 5 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/service/finals/ReportFinalParam.java

@@ -0,0 +1,5 @@
+package com.sundata.product.rwa.reportformconfigreportcreater.service.finals;
+
+public class ReportFinalParam {
+    public static final String EXECUTE_REPORT = "ROW()&\"-\"&COLUMN()";
+}

+ 89 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/util/CollectionToMapConverter.java

@@ -0,0 +1,89 @@
+package com.sundata.product.rwa.util;
+
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+public class CollectionToMapConverter {
+
+    /**
+     * 将集合转换为Map,使用对象属性作为键
+     *
+     * @param collection   原始集合
+     * @param keyExtractor 键提取函数
+     * @param <T>          集合元素类型
+     * @param <K>          键类型
+     * @return 转换后的Map
+     */
+    public static <T, K> Map<K, T> toMap(
+            Collection<T> collection,
+            Function<T, K> keyExtractor) {
+        return toMap(collection, keyExtractor, (existing, replacement) -> replacement);
+    }
+
+    /**
+     * 带冲突处理的版本
+     *
+     * @param mergeFunction 冲突处理函数,返回最终保留的值
+     */
+    public static <T, K> Map<K, T> toMap(
+            Collection<T> collection,
+            Function<T, K> keyExtractor,
+            MergeFunction<T> mergeFunction) {
+        return collection.stream()
+                .collect(Collectors.toMap(
+                        keyExtractor,
+                        Function.identity(),
+                        mergeFunction::apply,
+                        LinkedHashMap::new // 保持插入顺序
+                ));
+    }
+
+    /**
+     * 将集合转换为Map,使用对象属性作为键和值
+     *
+     * @param collection     原始集合
+     * @param keyExtractor   键提取函数
+     * @param valueExtractor 值提取函数
+     * @param <T>            集合元素类型
+     * @param <K>            键类型
+     * @param <V>            值类型
+     * @return 转换后的Map
+     */
+    public static <T, K, V> Map<K, V> toMap(
+            Collection<T> collection,
+            Function<T, K> keyExtractor,
+            Function<T, V> valueExtractor) {
+        return toMap(collection, keyExtractor, valueExtractor, (e, r) -> r);
+    }
+
+    /**
+     * 带冲突处理的版本
+     *
+     * @param mergeFunction 冲突处理函数,返回最终保留的值
+     */
+    public static <T, K, V> Map<K, V> toMap(
+            Collection<T> collection,
+            Function<T, K> keyExtractor,
+            Function<T, V> valueExtractor,
+            MergeFunction<V> mergeFunction) {
+        return collection.stream()
+                .collect(Collectors.toMap(
+                        keyExtractor,
+                        valueExtractor,
+                        mergeFunction::apply,
+                        LinkedHashMap::new
+                ));
+    }
+
+    /**
+     * 合并函数接口
+     */
+    @FunctionalInterface
+    public interface MergeFunction<T> {
+        T apply(T existing, T replacement);
+    }
+
+}