浏览代码

报表定义功能提交

username 7 月之前
父节点
当前提交
97f522089a

+ 8 - 0
Procedure/backend/project/.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,8 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="JavadocDeclaration" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="ADDITIONAL_TAGS" value="author:,methodsName:,description:,param:,return:,throws:" />
+    </inspection_tool>
+  </profile>
+</component>

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

@@ -6,12 +6,11 @@ import com.sundata.common.exception.BusinessException;
 import com.sundata.common.util.FileUtil;
 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 jakarta.servlet.http.HttpServletResponse;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.Cell;
-import org.apache.poi.ss.usermodel.CellType;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.jxls.builder.JxlsOutputFile;
 import org.jxls.transform.poi.JxlsPoiTemplateFillerBuilder;
@@ -22,7 +21,6 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -273,4 +271,66 @@ public class FilesValueCheckUtils {
         FileUtil.getContent(fileName + XLSX, response, templatePathName.toString());
     }
 
+    public static void analyseReportFile(Workbook book,ReportDefinitionModel defineModel, List<ReportCalculationModel> modelFillInList,
+                                         List<ReportCalculationModel> modelCalcList) {
+        // 读取文件sheet页数
+        int sheetNum = book.getNumberOfSheets();
+        // 遍历每一个sheet页
+        ReportCalculationModel model = null;
+        for (int i =0;i<sheetNum;i++){
+            int reportNo = 0;
+            // 读取第i个sheet页
+            Sheet sheet = book.getSheetAt(i);
+            // 当前sheet页的数据总行数
+            int dataRows = sheet.getLastRowNum();
+            // 判断是否有数据
+            if (dataRows == 0) {
+                String err = "文件内容为空!,请检查导入数据是否正确";
+                log.error(err);
+                throw new BusinessException(err);
+            }
+            // 记录空值列
+            StringBuilder cellNullMessage = null;
+            // 遍历当前sheet页每一行
+            for (int rowNum=0;rowNum<=dataRows;rowNum++){
+                Row row = sheet.getRow(rowNum);
+                // 获取当前行的列数
+                int cellNums = row.getLastCellNum();
+
+                // 遍历当前行的每一列
+                for (int cellNum = 0; cellNum<cellNums; cellNum++){
+                    Cell cellData = row.getCell(cellNum);
+                    model = new ReportCalculationModel();
+                    model.setReportno(defineModel.getReportNo());
+                    // sheet页记入
+                    model.setReportUnitSheet(String.valueOf(i+1));
+                    // 当前sheet页当前行记入
+                    model.setReportUnitRow(String.valueOf(rowNum+1));
+                    // 当前sheet页当前行的当前列记入
+                    model.setReportUnitCell(String.valueOf(cellNum+1));
+                    if (cellData.getCellType().equals(CellType.FORMULA)) {
+                        if (cellData.getCellFormula().equals("ROW()&\"-\"&COLUMN()")) {
+                            // 序号记录
+                            reportNo = reportNo + 1;
+                            model.setId(String.valueOf(reportNo));
+                            model.setExcelFormula(cellData.getCellFormula());
+                            // 需填报的单元详情列表
+                            modelFillInList.add(model);
+                        } else {
+                            // 序号记录
+                            reportNo = reportNo + 1;
+                            model.setId(String.valueOf(reportNo));
+                            // 需计算的单元详情列表计
+                            model.setExcelFormula(cellData.getCellFormula());
+                            modelCalcList.add(model);
+                        }
+
+                    }
+                }
+            }
+
+        }
+
+    }
+
 }

+ 170 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/action/ReportFillingConfigAction.java

@@ -0,0 +1,170 @@
+package com.sundata.product.rwa.reportformconfigreportcreater.action;
+
+import com.sundata.common.base.BaseAction;
+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 jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction")
+public class ReportFillingConfigAction extends BaseAction {
+
+    @Autowired
+    ReportFillingConfigService reportFillingConfigService;
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: getDataList
+     * @description: 获取当前数据列表
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody ReportDefinitionModel model
+     * @return: List<ReportDefinitionModel>
+     * @throws:
+     */
+    @RequestMapping({"getDataList"})
+    public void getDataList(HttpServletRequest request, HttpServletResponse response,
+                            @RequestBody ReportDefinitionModel model) {
+        sendData(response, reportFillingConfigService.getDataList(model));
+    }
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: createReportData
+     * @description: 获取当前树节点数据
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody ReportDefinitionModel model
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"createReportData"})
+    public void createReportData(HttpServletRequest request, HttpServletResponse response,
+                            @RequestBody ReportDefinitionModel model) {
+        reportFillingConfigService.createReportData(model);
+    }
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: updateReportData
+     * @description: 获取当前树节点数据
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody ReportDefinitionModel model
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"updateReportData"})
+    public void updateReportData(HttpServletRequest request, HttpServletResponse response,
+                                 @RequestBody ReportDefinitionModel model) {
+       reportFillingConfigService.updateReportData(model);
+    }
+
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: deleteReportData
+     * @description: 获取当前树节点数据
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody ReportDefinitionModel model
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"deleteReportData"})
+    public void deleteReportData(HttpServletRequest request, HttpServletResponse response,
+                                 @RequestBody ReportDefinitionModel model) {
+        reportFillingConfigService.deleteReportData(model);
+    }
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: selectReportData
+     * @description: 获取当前树节点数据
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody ReportDefinitionModel model
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"selectReportData"})
+    public void selectReportData(HttpServletRequest request, HttpServletResponse response,
+                                 @RequestBody ReportDefinitionModel model) {
+        sendData(response, reportFillingConfigService.selectReportData(model));
+    }
+
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: analyseReportFile
+     * @description: 解析模板文件
+     * @param: HttpServletRequest request, HttpServletResponse response
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"analyseReportFile"})
+    public void analyseReportFile(HttpServletRequest request, HttpServletResponse response,
+                                  @RequestBody ReportDefinitionModel model,@RequestParam String key ) {
+        sendData(response,reportFillingConfigService.analyseReportFile(model,key));
+    }
+
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: updateCalcReportData
+     * @description: 获取当前树节点数据
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody List<ReportCalculationModel> modelList
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"updateCalcReportData"})
+    public void updateCalcReportData(HttpServletRequest request, HttpServletResponse response,
+                                     @RequestBody List<ReportCalculationModel> modelList,@RequestParam String keys) {
+        reportFillingConfigService.updateCalcReportData(modelList,keys);
+    }
+
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: createCalcReportData
+     * @description: 获取当前树节点数据
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody List<ReportCalculationModel> modelList
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"createCalcReportData"})
+    public void createCalcReportData(HttpServletRequest request, HttpServletResponse response,
+                                 @RequestBody List<ReportCalculationModel> modelList) {
+        reportFillingConfigService.createCalcReportData(modelList);
+    }
+
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: deleteReportData
+     * @description: 获取当前树节点数据
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody ReportDefinitionModel model
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"deleteCalcReportData"})
+    public void deleteCalcReportData(HttpServletRequest request, HttpServletResponse response,
+                                 @RequestBody ReportCalculationModel model) {
+        reportFillingConfigService.deleteCalcReportData(model);
+    }
+
+
+    /**
+     * @author: 张艳杰
+     * @methodsName: selectCalcReportData
+     * @description: 获取当前树节点数据
+     * @param: HttpServletRequest request, HttpServletResponse response, @RequestBody ReportDefinitionModel model
+     * @return:
+     * @throws:
+     */
+    @RequestMapping({"selectCalcReportData"})
+    public void selectCalcReportData(HttpServletRequest request, HttpServletResponse response,
+                                     @RequestParam String reportNo) {
+        sendData(response,reportFillingConfigService.selectCalcReportData(reportNo));
+    }
+
+}

+ 28 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/mapper/ReportFillingConfigMapper.java

@@ -0,0 +1,28 @@
+package com.sundata.product.rwa.reportformconfigreportcreater.mapper;
+
+import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportCalculationModel;
+import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportDefinitionModel;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface ReportFillingConfigMapper {
+
+    List<ReportDefinitionModel> getDataList(@Param("model") ReportDefinitionModel model);
+
+    void createReportData(@Param("model") ReportDefinitionModel model);
+
+    void updateReportData(@Param("model") ReportDefinitionModel model);
+
+    boolean deleteReportData(@Param("model") ReportDefinitionModel model);
+
+    ReportDefinitionModel selectReportData(@Param("model") ReportDefinitionModel model);
+
+    void createCalcReportData(@Param("model") ReportCalculationModel model);
+
+    void deleteCalcReportData(@Param("model") ReportCalculationModel model);
+
+    List<ReportCalculationModel> selectCalcReportData(@Param("reportNo") String reportNo);
+
+    void updateCalcReportData(@Param("model") ReportCalculationModel model);
+}

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

@@ -0,0 +1,195 @@
+package com.sundata.product.rwa.reportformconfigreportcreater.model;
+
+public class ReportCalculationModel {
+
+    // 计算实例号
+    private String calcindex;
+    // 起始数据日期
+    private String startDate;
+    // 截止数据日期
+    private String endDate;
+    // 年月
+    private String term;
+    // 数据日期
+    private String dataDate;
+    // 序号
+    private String id;
+    // 报表编号
+    private String reportno;
+    // 报表计算单元编号
+    private String reportUnitNo;
+    // sheet页位置
+    private String reportUnitSheet;
+    // 行位置
+    private String reportUnitRow;
+    // 列位置
+    private String reportUnitCell;
+    // 单元格样式类型
+    private String unitStyleType;
+    // 计算过程类型
+    private String unitCalcType;
+    // 计算对象名称
+    private String unitCalcObjectName;
+    // 计算对象配置
+    private String unitCalcInfo;
+    // 单元格数据类型
+    private String unitDataType;
+    // 单元格类型
+    private String unitType;
+    // 是否包含下钻功能
+    private String isHasurl;
+    // Excel公式
+    private String excelFormula;
+
+    public String getCalcindex() {
+        return calcindex;
+    }
+
+    public void setCalcindex(String calcindex) {
+        this.calcindex = calcindex;
+    }
+
+    public String getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+
+    public String getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(String endDate) {
+        this.endDate = endDate;
+    }
+
+    public String getTerm() {
+        return term;
+    }
+
+    public void setTerm(String term) {
+        this.term = term;
+    }
+
+    public String getDataDate() {
+        return dataDate;
+    }
+
+    public void setDataDate(String dataDate) {
+        this.dataDate = dataDate;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getReportno() {
+        return reportno;
+    }
+
+    public void setReportno(String reportno) {
+        this.reportno = reportno;
+    }
+
+    public String getReportUnitNo() {
+        return reportUnitNo;
+    }
+
+    public void setReportUnitNo(String reportUnitNo) {
+        this.reportUnitNo = reportUnitNo;
+    }
+
+    public String getReportUnitSheet() {
+        return reportUnitSheet;
+    }
+
+    public void setReportUnitSheet(String reportUnitSheet) {
+        this.reportUnitSheet = reportUnitSheet;
+    }
+
+    public String getReportUnitRow() {
+        return reportUnitRow;
+    }
+
+    public void setReportUnitRow(String reportUnitRow) {
+        this.reportUnitRow = reportUnitRow;
+    }
+
+    public String getReportUnitCell() {
+        return reportUnitCell;
+    }
+
+    public void setReportUnitCell(String reportUnitCell) {
+        this.reportUnitCell = reportUnitCell;
+    }
+
+    public String getUnitStyleType() {
+        return unitStyleType;
+    }
+
+    public void setUnitStyleType(String unitStyleType) {
+        this.unitStyleType = unitStyleType;
+    }
+
+    public String getUnitCalcType() {
+        return unitCalcType;
+    }
+
+    public void setUnitCalcType(String unitCalcType) {
+        this.unitCalcType = unitCalcType;
+    }
+
+    public String getUnitCalcObjectName() {
+        return unitCalcObjectName;
+    }
+
+    public void setUnitCalcObjectName(String unitCalcObjectName) {
+        this.unitCalcObjectName = unitCalcObjectName;
+    }
+
+    public String getUnitCalcInfo() {
+        return unitCalcInfo;
+    }
+
+    public void setUnitCalcInfo(String unitCalcInfo) {
+        this.unitCalcInfo = unitCalcInfo;
+    }
+
+    public String getUnitDataType() {
+        return unitDataType;
+    }
+
+    public void setUnitDataType(String unitDataType) {
+        this.unitDataType = unitDataType;
+    }
+
+    public String getUnitType() {
+        return unitType;
+    }
+
+    public void setUnitType(String unitType) {
+        this.unitType = unitType;
+    }
+
+    public String getIsHasurl() {
+        return isHasurl;
+    }
+
+    public void setIsHasurl(String isHasurl) {
+        this.isHasurl = isHasurl;
+    }
+
+    public String getExcelFormula() {
+        return excelFormula;
+    }
+
+    public void setExcelFormula(String excelFormula) {
+        this.excelFormula = excelFormula;
+    }
+}

+ 114 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/model/ReportDefinitionModel.java

@@ -0,0 +1,114 @@
+package com.sundata.product.rwa.reportformconfigreportcreater.model;
+
+public class ReportDefinitionModel {
+    // 计算实例号
+    private String calcindex;
+    // 起始数据日期
+    private String startDate;
+    // 截止数据日期
+    private String endDate;
+    // 年月
+    private String term;
+    // 数据日期
+    private String dataDate;
+    // 报表编号
+    private String reportNo;
+    // 报表名称
+    private String reportName;
+    // 报表版本号
+    private String reportVersion;
+    // 所属机构
+    private String reportOrgcode;
+    // 报表类型
+    private String reportType;
+    // 模板文件
+    private String reportFile;
+
+    public String getCalcindex() {
+        return calcindex;
+    }
+
+    public void setCalcindex(String calcindex) {
+        this.calcindex = calcindex;
+    }
+
+    public String getStartDate() {
+        return startDate;
+    }
+
+    public void setStartDate(String startDate) {
+        this.startDate = startDate;
+    }
+
+    public String getEndDate() {
+        return endDate;
+    }
+
+    public void setEndDate(String endDate) {
+        this.endDate = endDate;
+    }
+
+    public String getTerm() {
+        return term;
+    }
+
+    public void setTerm(String term) {
+        this.term = term;
+    }
+
+    public String getDataDate() {
+        return dataDate;
+    }
+
+    public void setDataDate(String dataDate) {
+        this.dataDate = dataDate;
+    }
+
+    public String getReportNo() {
+        return reportNo;
+    }
+
+    public void setReportNo(String reportNo) {
+        this.reportNo = reportNo;
+    }
+
+    public String getReportName() {
+        return reportName;
+    }
+
+    public void setReportName(String reportName) {
+        this.reportName = reportName;
+    }
+
+    public String getReportVersion() {
+        return reportVersion;
+    }
+
+    public void setReportVersion(String reportVersion) {
+        this.reportVersion = reportVersion;
+    }
+
+    public String getReportOrgcode() {
+        return reportOrgcode;
+    }
+
+    public void setReportOrgcode(String reportOrgcode) {
+        this.reportOrgcode = reportOrgcode;
+    }
+
+    public String getReportType() {
+        return reportType;
+    }
+
+    public void setReportType(String reportType) {
+        this.reportType = reportType;
+    }
+
+    public String getReportFile() {
+        return reportFile;
+    }
+
+    public void setReportFile(String reportFile) {
+        this.reportFile = reportFile;
+    }
+}

+ 275 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/reportformconfigreportcreater/mybatis/ReportFillingConfigMapper.xml

@@ -0,0 +1,275 @@
+<?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.sundata.product.rwa.reportformconfigreportcreater.mapper.ReportFillingConfigMapper">
+
+
+    <!-- 报表的初始化 -->
+    <select id="getDataList" resultType="com.sundata.product.rwa.reportformconfigreportcreater.model.ReportDefinitionModel">
+        SELECT
+        CALCINDEX             AS   calcindex,
+        SDATE                 AS   startDate,
+        EDATE                 AS   endDate,
+        TERM                  AS   term,
+        DATA_DATE             AS   dataDate,
+        REPORT_NO             AS   reportNo,
+        REPORT_NAME           AS   reportName,
+        REPORT_VERSION        AS   reportVersion,
+        REPORT_ORGCODE	      AS   reportOrgcode,
+        REPORT_TYPE	          AS   reportType,
+        REPORT_FILE	          AS   reportFile
+        FROM RWA_SYSTEM_REPORT_CONF_INFO
+        <where>
+            <if test="model.reportNo != null and model.reportNo !=''">
+                REPORT_NO like concat(concat('%',#{model.reportNo}),'%')
+            </if>
+            <if test="model.reportName != null and model.reportName !=''">
+                and REPORT_NAME like concat(concat('%', #{model.reportName}),'%')
+            </if>
+            <if test="model.reportType != null and model.reportType !=''">
+                and REPORT_TYPE like concat(concat('%', #{model.reportType}),'%')
+            </if>
+            <if test="model.reportOrgcode != null and model.reportOrgcode !=''">
+                and REPORT_ORGCODE like concat(concat('%', #{model.reportOrgcode}),'%')
+            </if>
+        </where>
+    </select>
+
+    <!-- 报表的新增 -->
+    <insert id="createReportData" parameterType="com.sundata.product.rwa.reportformconfigreportcreater.model.ReportDefinitionModel">
+        insert into RWA_SYSTEM_REPORT_CONF_INFO
+        (CALCINDEX,
+        SDATE,
+        EDATE,
+        TERM,
+        DATA_DATE,
+        REPORT_NO,
+        REPORT_NAME,
+        REPORT_VERSION,
+        REPORT_ORGCODE,
+        REPORT_TYPE,
+        REPORT_FILE
+        )
+        values(
+        #{model.calcindex},
+        #{model.startDate},
+        #{model.endDate},
+        #{model.term},
+        #{model.dataDate},
+        #{model.reportNo},
+        #{model.reportName},
+        #{model.reportVersion},
+        #{model.reportOrgcode},
+        #{model.reportType},
+        #{model.reportFile}
+        )
+    </insert>
+
+    <!-- 报表的更新 -->
+    <update id="updateReportData">
+        update RWA_SYSTEM_REPORT_CONF_INFO
+        <trim suffixOverrides=",">
+            <set>
+                <if test="model.reportNo != null and model.reportNo != ''">
+                    REPORT_NO = #{model.reportNo},
+                </if>
+                <if test="model.reportName != null and model.reportName != ''">
+                    REPORT_NAME = #{model.reportName},
+                </if>
+                <if test="model.reportType != null and model.reportType != ''">
+                    REPORT_TYPE = #{model.reportType},
+                </if>
+                <if test="model.reportOrgcode != null and model.reportOrgcode != ''">
+                    REPORT_ORGCODE = #{model.reportOrgcode},
+                </if>
+                <if test="model.reportFile != null and model.reportFile != ''">
+                    REPORT_FILE = #{model.reportFile},
+                </if>
+                <if test="model.reportVersion != null and model.reportVersion != ''">
+                    REPORT_VERSION = #{model.reportVersion},
+                </if>
+            </set>
+        </trim>
+        <where>
+            REPORT_NO = #{model.reportNo}
+        </where>
+    </update>
+
+    <!-- 报表的删除 -->
+    <delete id="deleteReportData">
+        delete from RWA_SYSTEM_REPORT_CONF_INFO
+        <where>
+            <if test="model.reportNo != null and model.reportNo !=''">
+                REPORT_NO = #{model.reportNo}
+            </if>
+        </where>
+    </delete>
+
+    <!-- 报表查询当前行 -->
+    <select id="selectReportData" resultType="com.sundata.product.rwa.reportformconfigreportcreater.model.ReportDefinitionModel">
+        SELECT
+        CALCINDEX             AS   calcindex,
+        SDATE                 AS   startDate,
+        EDATE                 AS   endDate,
+        TERM                  AS   term,
+        DATA_DATE             AS   dataDate,
+        REPORT_NO             AS   reportNo,
+        REPORT_NAME           AS   reportName,
+        REPORT_VERSION        AS   reportVersion,
+        REPORT_ORGCODE	      AS   reportOrgcode,
+        REPORT_TYPE	          AS   reportType,
+        REPORT_FILE	          AS   reportFile
+        FROM RWA_SYSTEM_REPORT_CONF_INFO
+        <where>
+            <if test="model.reportNo != null and model.reportNo !=''">
+                REPORT_NO = #{model.reportNo}
+            </if>
+        </where>
+    </select>
+
+
+
+    <!-- 报表的新增 -->
+    <insert id="createCalcReportData" parameterType="com.sundata.product.rwa.reportformconfigreportcreater.model.ReportCalculationModel">
+        insert into RWA_SYSTEM_REPORT_CONF_CALCUNIT
+        (CALCINDEX,
+        SDATE,
+        EDATE,
+        TERM,
+        DATA_DATE,
+        ID,
+        REPORT_NO,
+        REPORT_UNIT_NO,
+        REPORT_UNIT_SHEET,
+        REPORT_UNIT_ROW,
+        REPORT_UNIT_CELL,
+        UNIT_STYLE_TYPE,
+        UNIT_CALC_TYPE,
+        UNIT_CALC_OBJECT_NAME,
+        UNIT_CALC_INFO,
+        UNIT_DATA_TYPE,
+        UNIT_TYPE,
+        EXCEL_FORMULA,
+        ISHASURL
+        )
+        values(
+        #{model.calcindex},
+        #{model.startDate},
+        #{model.endDate},
+        #{model.term},
+        #{model.dataDate},
+        #{model.id},
+        #{model.reportno},
+        #{model.reportUnitNo},
+        #{model.reportUnitSheet},
+        #{model.reportUnitRow},
+        #{model.reportUnitCell},
+        #{model.unitStyleType},
+        #{model.unitCalcType},
+        #{model.unitCalcObjectName},
+        #{model.unitCalcInfo},
+        #{model.unitDataType},
+        #{model.unitType},
+        #{model.excelFormula},
+        #{model.isHasurl}
+        )
+    </insert>
+
+    <!-- 报表的删除 -->
+    <delete id="deleteCalcReportData">
+        delete from RWA_SYSTEM_REPORT_CONF_CALCUNIT
+        <where>
+            <if test="model.reportno != null and model.reportno !=''">
+                REPORT_NO = #{model.reportno}
+            </if>
+            <if test="model.excelFormula != null and model.excelFormula !=''">
+                and EXCEL_FORMULA = #{model.excelFormula}
+            </if>
+        </where>
+    </delete>
+
+    <update id="updateCalcReportData">
+        update RWA_SYSTEM_REPORT_CONF_CALCUNIT
+        <trim suffixOverrides=",">
+            <set>
+                <if test="model.reportUnitNo != null and model.reportUnitNo != ''">
+                    REPORT_UNIT_NO = #{model.reportUnitNo},
+                </if>
+                <if test="model.reportUnitSheet != null and model.reportUnitSheet != ''">
+                    REPORT_UNIT_SHEET = #{model.reportUnitSheet},
+                </if>
+                <if test="model.reportUnitRow != null and model.reportUnitRow != ''">
+                    REPORT_UNIT_ROW = #{model.reportUnitRow},
+                </if>
+                <if test="model.reportUnitCell != null and model.reportUnitCell != ''">
+                    REPORT_UNIT_CELL = #{model.reportUnitCell},
+                </if>
+                <if test="model.unitStyleType != null and model.unitStyleType != ''">
+                    UNIT_STYLE_TYPE = #{model.unitStyleType},
+                </if>
+                <if test="model.unitCalcType != null and model.unitCalcType != ''">
+                    UNIT_CALC_TYPE = #{model.unitCalcType},
+                </if>
+                <if test="model.unitCalcObjectName != null and model.unitCalcObjectName != ''">
+                    UNIT_CALC_OBJECT_NAME = #{model.unitCalcObjectName},
+                </if>
+                <if test="model.unitCalcInfo != null and model.unitCalcInfo != ''">
+                    UNIT_CALC_INFO = #{model.unitCalcInfo},
+                </if>
+                <if test="model.unitDataType != null and model.unitDataType != ''">
+                    UNIT_DATA_TYPE = #{model.unitDataType},
+                </if>
+                <if test="model.isHasurl != null and model.isHasurl != ''">
+                    ISHASURL = #{model.isHasurl},
+                </if>
+            </set>
+        </trim>
+        <where>
+            <if test="model.id != null and model.id != ''">
+                ID = #{model.id}
+            </if>
+            <if test="model.reportno != null and model.reportno != ''">
+                and REPORT_NO = #{model.reportno}
+            </if>
+            <if test="model.excelFormula != null and model.excelFormula != ''">
+                and EXCEL_FORMULA = #{model.excelFormula}
+            </if>
+        </where>
+    </update>
+
+
+    <!-- 报表的初始化 -->
+    <select id="selectCalcReportData" resultType="com.sundata.product.rwa.reportformconfigreportcreater.model.ReportCalculationModel">
+        SELECT
+        CALCINDEX               AS   calcindex,
+        SDATE                   AS   startDate,
+        EDATE                   AS   endDate,
+        TERM                    AS   term,
+        DATA_DATE               AS   dataDate,
+        ID                      AS   id,
+        REPORT_NO               AS   reportno,
+        REPORT_UNIT_NO          AS   reportUnitNo,
+        REPORT_UNIT_SHEET       AS   reportUnitSheet,
+        REPORT_UNIT_ROW         AS   reportUnitRow,
+        REPORT_UNIT_CELL        AS   reportUnitCell,
+        UNIT_STYLE_TYPE         AS   unitStyleType,
+        UNIT_CALC_TYPE          AS   unitCalcType,
+        UNIT_CALC_OBJECT_NAME   AS   unitCalcObjectName,
+        UNIT_CALC_INFO	        AS   unitCalcInfo,
+        UNIT_DATA_TYPE          AS   unitDataType,
+        UNIT_TYPE               AS   unitType,
+        EXCEL_FORMULA	        AS   excelFormula,
+        ISHASURL	            AS   isHasurl
+        FROM RWA_SYSTEM_REPORT_CONF_CALCUNIT
+        <where>
+            <if test="reportNo != null and reportNo !=''">
+                REPORT_NO = #{reportNo}
+            </if>
+        </where>
+    </select>
+
+
+
+
+</mapper>

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

@@ -0,0 +1,190 @@
+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.reportformconfigreportcreater.mapper.ReportFillingConfigMapper;
+import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportCalculationModel;
+import com.sundata.product.rwa.reportformconfigreportcreater.model.ReportDefinitionModel;
+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;
+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.stereotype.Service;
+
+import java.io.*;
+import java.lang.reflect.Array;
+import java.util.*;
+
+@Service
+public class ReportFillingConfigService {
+
+    // 日志
+    static final Logger log = LoggerFactory.getLogger(ReportFillingConfigService.class);
+
+    @Autowired
+    ReportFillingConfigMapper reportFillingConfigMapper;
+
+    public List<ReportDefinitionModel> getDataList(ReportDefinitionModel model) {
+        return reportFillingConfigMapper.getDataList(model);
+    }
+
+    public void createReportData(ReportDefinitionModel model) {
+        reportFillingConfigMapper.createReportData(model);
+    }
+
+    public void updateReportData(ReportDefinitionModel model) {
+        reportFillingConfigMapper.updateReportData(model);
+    }
+
+    public void deleteReportData(ReportDefinitionModel model) {
+        boolean flag = reportFillingConfigMapper.deleteReportData(model);
+        if (flag){
+            ReportCalculationModel calcModel = new ReportCalculationModel();
+            calcModel.setReportno(model.getReportNo());
+            reportFillingConfigMapper.deleteCalcReportData(calcModel);
+        }
+    }
+
+    public ReportDefinitionModel selectReportData(ReportDefinitionModel model) {
+        return reportFillingConfigMapper.selectReportData(model);
+    }
+
+
+    public Map<String,List<ReportCalculationModel>> analyseReportFile(ReportDefinitionModel model,String key) {
+
+        List<ReportCalculationModel> modelFillInList = new ArrayList<ReportCalculationModel>();
+        List<ReportCalculationModel> modelCalcList = new ArrayList<ReportCalculationModel>();
+        Map<String,List<ReportCalculationModel>> resMap = new HashMap<>();
+        // 字典里获取附件路径
+        String templatePath = DBExecutor.doQuery("select NOUNVALUE from sys_noun where NOUNITEM = 'ATTACHPATH'");
+        //
+        File file = new File(templatePath+"/"+key+"/"+model.getReportNo()+"/"+"default");
+        String[] fileNameLists = file.list();
+        if (null != fileNameLists) {
+            File templatefile = new File(templatePath+"/"+key+"/"+model.getReportNo()+"/"+"default/"+fileNameLists[0]);
+            // 导入文件流转换为poi对象
+            Workbook book = null;
+            if (fileNameLists[0].endsWith(".xlsx")) {
+                try {
+                    book = new XSSFWorkbook(templatefile);
+                } catch (IOException | InvalidFormatException e) {
+                    String err = "文件创建excel实例时发生异常,文件无法正常读取!";
+                    log.error(err, e);
+                    throw new BusinessException(err, e);
+                }
+            } else if (fileNameLists[0].endsWith(".xls")) {
+                try {
+                    book = new HSSFWorkbook(new FileInputStream(templatefile));
+                } catch (IOException e) {
+                    String err = "文件创建excel实例时发生异常,文件无法正常读取!";
+                    log.error(err, e);
+                    throw new BusinessException(err, e);
+                }
+            } else {
+                String err = "文件类型有误!";
+                log.error(err);
+                throw new BusinessException(err);
+            }
+            // 解析报表文件
+
+            FilesValueCheckUtils.analyseReportFile(book,model,modelFillInList,modelCalcList);
+
+            resMap.put("FillIn",modelFillInList);
+            resMap.put("Calc",modelCalcList);
+
+        }
+
+        // AdminUtil.queryParamValue("ATTACHPATH") + File.separator + entity.getFunctype() + File.separator + entity.getBusiid() + File.separator + entity.getBusiType();
+        return resMap;
+    }
+
+    public void createCalcReportData(List<ReportCalculationModel> modelList) {
+        for(ReportCalculationModel model:modelList) {
+            reportFillingConfigMapper.createCalcReportData(model);
+        }
+    }
+
+    public void deleteCalcReportData(ReportCalculationModel model) {
+        reportFillingConfigMapper.deleteCalcReportData(model);
+    }
+
+    public Map<String,List<ReportCalculationModel>> selectCalcReportData(String reportNo) {
+        Map<String,List<ReportCalculationModel>> resMap = new HashMap<>();
+        List<ReportCalculationModel> modelFillInList = new ArrayList<ReportCalculationModel>();
+        List<ReportCalculationModel> modelCalcList = new ArrayList<ReportCalculationModel>();
+        List<ReportCalculationModel> listModel = reportFillingConfigMapper.selectCalcReportData(reportNo);
+        for(ReportCalculationModel model :listModel) {
+            if (model.getExcelFormula().equals("ROW()&\"-\"&COLUMN()")) {
+                modelFillInList.add(model);
+            } else {
+                modelCalcList.add(model);
+            }
+
+        }
+        resMap.put("FillIn",modelFillInList);
+        resMap.put("Calc",modelCalcList);
+         return resMap;
+    }
+
+    public void updateCalcReportData(List<ReportCalculationModel> modelList, String keys) {
+        // 记载老数据列表的序号
+        String[] values = keys.split(",");
+        // 存放老列表
+        List<ReportCalculationModel> oldList = new ArrayList<ReportCalculationModel>();
+        // 存放新列表
+        List<ReportCalculationModel> newList = new ArrayList<ReportCalculationModel>();
+        // 循环整个列表,根据values分别老列表和新加列表
+        for(ReportCalculationModel model:modelList) {
+            if (Arrays.asList(values).contains(model.getId())) {
+                oldList.add(model);
+            } else {
+                newList.add(model);
+            }
+        }
+
+        // 判断是否有新加列表
+        if (newList.isEmpty()) {
+            // 老列表数据变少,将少的数据清除
+            if (values.length > oldList.size()) {
+                // 提前将数据库内老数据删除
+                reportFillingConfigMapper.deleteCalcReportData(oldList.get(0));
+                // 没有新加列表(但是老数据列表进行了删除),将老列表需要更新的数据更新,
+                for (ReportCalculationModel model:oldList){
+                    // 更新
+                    reportFillingConfigMapper.createCalcReportData(model);
+                }
+            } else {
+                // 没有新加列表(老数据列表没变,或者老数据列表进行了编辑更改),将老列表需要更新的数据更新,
+                for (ReportCalculationModel model:oldList){
+                    // 更新
+                    reportFillingConfigMapper.updateCalcReportData(model);
+                }
+            }
+        } else {
+            // 提前将需填报列表在数据库内的数据删除
+            reportFillingConfigMapper.deleteCalcReportData(oldList.get(0));
+            // 有新列表加入,将新列表中与老列表重复的数据按新列表为准存进数据库
+            for(ReportCalculationModel model:newList){
+                model.setReportno(modelList.get(0).getReportno());
+                model.setExcelFormula("ROW()&\"-\"&COLUMN()");
+                for (ReportCalculationModel oldModel:oldList){
+                    if (!oldModel.getReportUnitSheet().equals(model.getReportUnitSheet())
+                            || !oldModel.getReportUnitRow().equals(model.getReportUnitRow())
+                            || !oldModel.getReportUnitCell().equals(model.getReportUnitCell())) {
+                        // 老数据插入
+                        reportFillingConfigMapper.createCalcReportData(oldModel);
+                    }
+                }
+                // 新数据插入
+                reportFillingConfigMapper.createCalcReportData(model);
+            }
+        }
+    }
+}

+ 2 - 0
Procedure/frontend/projectb/config/config.ts

@@ -164,6 +164,8 @@ export default defineConfig({
     { path: '/meteringparamdefine' , component: './product/rwa_calc_config_004rwa/meteringparamdefine'},
     { path: '/meteringtaskexecute' , component: './product/rwa_calc_config_004rwa/meteringtaskexecute'},
 
+    // 报表定义
+    { path: '/reportfillingconfig' , component: './product/report_form_config_reportcreater/reportfillingconfig'},
 
 
   ],

+ 588 - 0
Procedure/frontend/projectb/src/pages/product/report_form_config_reportcreater/reportfillingconfig.tsx

@@ -0,0 +1,588 @@
+import React, { useEffect, useRef, useState } from "react";
+import { type ProColumns, type ActionType, type ProFormInstance, ProTable, EditableProTable } from '@ant-design/pro-components';
+import type {FormInstance} from 'antd'
+import  {Table, Upload} from 'antd'
+import { SDPage,SDFormText,SDModalForm,SDTable,SDFormItem,SDButton,SDSubmitButton,EditType, SDAreaTtile, SDOperate, baseFun,SDModal, validateFun, SDEditableTable, SDFormDict, SDLayout, SDFormAttach, } from "@sundata/ui-frame";
+import type { ReportDefinitionModel,ReportCalculationModel } from "@/services/rwa/product/report_form_config_reportcreater/reportfillingconfig";
+import {getDataList,createReportData,updateReportData,deleteReportData,selectReportData,updateCalcReportData,
+  analyseReportFile,createCalcReportData,selectCalcReportData} from "@/services/rwa/product/report_form_config_reportcreater/reportfillingconfig";
+import { PlusSquareTwoTone, WomanOutlined } from "@ant-design/icons";
+import { ProductProps } from "@/sundataImport";
+import { useModel } from '@umijs/max';
+import { toNumber } from "lodash";
+
+type widowRush = {
+  onCancel:  () => void;
+  onChangeVisible(visible: boolean, type: string): unknown;
+  onChangeVisdible:(visible:boolean,type ?: 'none' | 'raload' )=>void;
+}& ProductProps;
+const reportfillingconfig : React.FC<widowRush> = (prop:widowRush) => {
+
+    /** 编辑方式,查看、修改、新增按钮时设置,详细信息表单中使用 */
+    const [editType, setEditType] = useState<EditType>(prop.editType || 'display');
+    /** 是否显示详细信息窗口 */
+    const [detailVisible, setDetailVisible] = useState<boolean>(false);
+
+    const [currentRow, setCurrentRow] = useState<ReportDefinitionModel>();
+    /** 表格引用对象,刷新表格使用   */
+    const actionRef = useRef<ActionType>();
+    const fillInActionRef = useRef<ActionType>();
+    const calculateActionRef = useRef<ActionType>();
+    const formRef = useRef<FormInstance<any>>();
+    const templateRef = useRef<FormInstance<any>>();
+    const { fetchDict } = useModel('dict');
+    const [fillInFormData,setFillInFormData] = useState<ReportCalculationModel[]>([]);
+    const [calculateFormData,setCalculateFormData] = useState<ReportCalculationModel[]>([]);
+
+    const [oldRowKeys, setOldRowKeys] = useState<React.Key[]>();
+
+    const [fillInFormDataBk,setFillInFormDataBk] = useState<ReportCalculationModel[]>([]);
+    const [calculateFormDataBk,setCalculateFormDataBk] = useState<ReportCalculationModel[]>([]);
+
+    const [selectRowData,setSelectRowData] = useState<any>();
+
+    /** 附件上传组件主键 */
+    const [busiPk, setBusiPk] = useState<string>('');
+
+    /** 需要被覆盖数据的序号 */
+    const [coverId, setCoverId] = useState<string>('');
+
+    /** 序号值 */
+    var reptId = 0;
+
+    // 页面数据
+    var formDataList = new Array<ReportDefinitionModel>;
+    /**上传文件 */
+    const [fileData, setFileData] = useState<File>();
+    // 导入窗口显示
+    const [importVisible, setImportVisible] = useState<boolean>(false);
+ 
+    useEffect(() => {
+      }, []);
+    
+    // 修改查询查询
+    const selectData = async (formdata : ReportDefinitionModel) => {
+      const data = await selectReportData(formdata);
+      formRef.current?.setFieldsValue(data);
+      if (formdata && formdata.reportNo) {
+        const listData = await selectCalcReportData(formdata.reportNo);
+        if (listData) {
+          setFillInFormData(listData.FillIn);
+          setFillInFormDataBk(listData.FillIn);
+          setCalculateFormData(listData.Calc);
+         }
+      }
+     
+     }
+
+    // 删除
+    const delRows =async(record:any)=>{ 
+       baseFun.confirm('确认删除?',async() =>{
+        await deleteReportData(record);
+        baseFun.info("删除成功");
+        closeAndRefresh();
+       });
+       
+     }
+
+    //关闭窗口刷新父页面
+    const closeAndRefresh = ()=>{
+    actionRef.current?.reloadAndRest?.();
+    }
+
+  // 插入或者更新数据
+  const handleSave = async(data: ReportDefinitionModel) => {
+    
+    if (editType == 'update' ) {
+      let keys ='';
+       await updateReportData(data);
+       fillInFormDataBk.forEach((items)=>{
+        keys = keys+items.id+","
+       });
+       await updateCalcReportData(fillInFormData,keys);
+       closeAndRefresh();
+    } else if (editType == 'create' ) {
+      fillInFormData.push(...calculateFormData);
+      await createReportData(data);
+      await createCalcReportData(fillInFormData);
+      closeAndRefresh();
+    }
+    setDetailVisible(false);
+  }
+
+// 显示解析文件
+const analyseFile = async (data: ReportDefinitionModel) => {
+  if (data.reportNo) {
+    setBusiPk(data.reportNo);
+  }
+}
+
+     
+    // 报表定义页面展示元素
+    const reportDefineColumns: ProColumns<ReportDefinitionModel>[] = [
+        {
+          title: '计算实例号',
+          dataIndex: 'calcindex',
+          search: false,
+          hideInTable: true,
+        },
+        {
+          title: '起始数据日期',
+          dataIndex: 'startDate',
+          search: false,
+          hideInTable: true,
+        },
+        {
+          title: '截止数据日期',
+          dataIndex: 'endDate',
+          search: false,
+          hideInTable: true,
+        },
+        {
+          title: '报表编号', 
+          dataIndex: 'reportNo',
+          hideInTable: false,
+        },
+        {
+          title: '报表名称', 
+          dataIndex: 'reportName',
+          hideInTable: false,
+        },
+        {
+          title: '报表类型', 
+          dataIndex: 'reportType',
+          hideInTable: false,
+          valueType: 'treeSelect',
+          request: () => fetchDict('customerTypeCd'),
+          fieldProps: {
+           treeDefaultExpandAll: true,
+           treeCheckable:true,
+        },
+        },
+        {
+          title: '所属机构', 
+          dataIndex: 'reportOrgcode',
+          hideInTable: false,
+          valueType: 'treeSelect',
+          request: () => fetchDict('customerTypeCd'),
+          fieldProps: {
+           treeDefaultExpandAll: true,
+           treeCheckable:true,
+        },
+        },
+        {
+          title: '报表版本号', 
+          dataIndex: 'reportVersion',
+          search: false,
+          hideInTable: false,
+        },
+        {
+          title: '操作',
+          dataIndex: 'operate',
+          valueType: 'option',
+          render: (_, record) => [
+            <SDOperate
+              key="roleCfg"
+              icon={<WomanOutlined />}
+              successMessage=""
+              onClick={
+                ()=>{ 
+                selectData(record);
+                setDetailVisible(true);
+                setEditType('update')
+               } }
+            >
+              修改
+            </SDOperate>,
+            <SDOperate
+            key="roleCfg"
+            icon={<WomanOutlined />}
+            successMessage=""
+            onClick={()=>{delRows(record) } }
+          >
+            删除
+          </SDOperate>,
+
+          <SDOperate
+            key="roleCfg"
+            icon={<WomanOutlined />}
+            successMessage=""
+            onClick={()=>{
+              selectData(record);
+              setEditType('display');
+              setDetailVisible(true); } }
+          >
+            查看
+          </SDOperate>,
+           
+          ],
+        },
+
+      ];
+
+
+
+  // 需填报的单元详情页面展示元素
+  const reportCalculateColumns: ProColumns<ReportCalculationModel>[] = [
+    {
+      title: '计算实例号',
+      dataIndex: 'calcindex',
+      search: false,
+      hideInTable: true,
+    },
+    {
+      title: '起始数据日期',
+      dataIndex: 'startDate',
+      search: false,
+      hideInTable: true,
+    },
+    {
+      title: '截止数据日期',
+      dataIndex: 'endDate',
+      search: false,
+      hideInTable: true,
+    },
+    {
+      title: '序号', 
+      dataIndex: 'id',
+      search: false,
+      hideInTable: false,
+      editable:false
+    },
+    {
+      title: '所在sheet页位置', 
+      dataIndex: 'reportUnitSheet',
+      hideInTable: false,
+    },
+    {
+      title: '所在行位置', 
+      dataIndex: 'reportUnitRow',
+      search: false,
+      hideInTable: false,
+    },
+    {
+      title: '所在列位置', 
+      dataIndex: 'reportUnitCell',
+      search: false,
+      hideInTable: false,
+    },
+    {
+      title: '单元格样式类型', 
+      dataIndex: 'unitStyleType',
+      search: false,
+      hideInTable: false,
+      valueType: 'treeSelect',
+          request: () => fetchDict('customerTypeCd'),
+          fieldProps: {
+           treeDefaultExpandAll: true,
+           treeCheckable:true,
+        },
+    },
+    {
+      title: '单元格数据类型', 
+      dataIndex: 'unitDataType',
+      search: false,
+      hideInTable: false,
+      valueType: 'treeSelect',
+          request: () => fetchDict('customerTypeCd'),
+          fieldProps: {
+           treeDefaultExpandAll: true,
+           treeCheckable:true,
+        },
+    },
+    {
+      title: '计算过程类型', 
+      dataIndex: 'unitCalcType',
+      search: false,
+      hideInTable: false,
+    },
+    {
+      title: '计算对象名称', 
+      dataIndex: 'unitCalcObjectName',
+      search: false,
+      hideInTable: false,
+    },
+    {
+      title: '计算对象配置', 
+      dataIndex: 'unitCalcInfo',
+      search: false,
+      hideInTable: false,
+    },
+    {
+      title: '是否包含下钻功能', 
+      dataIndex: 'isHasurl',
+      search: false,
+      hideInTable: false,
+      valueType: 'treeSelect',
+          request: () => fetchDict('YESORNO'),
+          fieldProps: {
+           treeDefaultExpandAll: true,
+        },
+    },
+
+    {
+      title: '操作',
+      dataIndex: 'operate',
+      valueType: 'option',
+      render: (_, record) => [
+        <SDOperate
+          key="roleCfg"
+          icon={<WomanOutlined />}
+          successMessage=""
+          onClick={
+            ()=>{ 
+              fillInActionRef.current?.startEditable(record.id);
+           } }
+        >
+          编辑
+        </SDOperate>,
+      ],
+    },
+
+  ];
+
+
+
+
+  // 需计算的单元详情页面展示元素
+  const reportCalculateOtherColumns: ProColumns<ReportCalculationModel>[] = [
+    {
+      title: '序号', 
+      dataIndex: 'id',
+      search: false,
+      hideInTable: false,
+      editable:false
+    },
+    {
+      title: '所在sheet页位置', 
+      dataIndex: 'reportUnitSheet',
+      hideInTable: false,
+    },
+    {
+      title: '所在行位置', 
+      dataIndex: 'reportUnitRow',
+      search: false,
+      hideInTable: false,
+    },
+    {
+      title: '所在列位置', 
+      dataIndex: 'reportUnitCell',
+      search: false,
+      hideInTable: false,
+    },
+    {
+      title: '单元格样式类型', 
+      dataIndex: 'unitStyleType',
+      search: false,
+      hideInTable: false,
+      valueType: 'treeSelect',
+          request: () => fetchDict('YESORNO'),
+          fieldProps: {
+           treeDefaultExpandAll: true,
+        },
+    },
+    {
+      title: 'Excel公式', 
+      dataIndex: 'excelFormula',
+      search: false,
+      hideInTable: false,
+    },
+
+    {
+      title: '操作',
+      dataIndex: 'operate',
+      valueType: 'option',
+      render: (_, record) => [
+        <SDOperate
+          key="roleCfg"
+          icon={<WomanOutlined />}
+          successMessage=""
+          onClick={
+            ()=>{ 
+              calculateActionRef.current?.startEditable(record.id);
+           } }
+        >
+          编辑
+        </SDOperate>,
+      ],
+    },
+  ];
+
+
+  function setIntoRestId() {
+
+           
+      let fillId ='0';
+      let calcId ='0';
+        
+        if (fillInFormData.length>=1) {
+          fillId = fillInFormData[fillInFormData.length-1].id;
+        }
+        
+        if (calculateFormData.length >=1) {
+          calcId = calculateFormData[calculateFormData.length-1].id;
+        }
+
+      if (toNumber(fillId) > toNumber(calcId)) {
+        reptId=toNumber(fillId);
+      } else {
+        reptId=toNumber(calcId);
+      }
+  }
+
+  const handanalyseReportFile = async (record:any,) => {
+    const data = await analyseReportFile(record,"reportuploadconfig");
+    setFillInFormData(data.FillIn);
+    setCalculateFormData(data.Calc);
+    setFillInFormDataBk(data.FillIn);
+    setCalculateFormDataBk(data.Calc);
+    setIntoRestId();
+  }
+
+
+
+    return (
+        <SDPage>
+        <SDTable
+         title="查询表格"
+         rowKey="customerName"
+         request={async (formdata:ReportDefinitionModel) =>{
+           const formDatas = await getDataList(formdata);
+           // 解构数组(导出用)
+           formDataList=[...formDatas];
+           return {data: formDatas}
+         }  }
+         columns={reportDefineColumns}
+         toolBarRender={(_, { selectedRows }) => [
+          <SDButton
+            key="create"
+            successMessage=''
+            onClick={() => {
+              setEditType('create');
+              setDetailVisible(true);
+              setFillInFormData([]);
+              setCalculateFormData([]);
+            }}
+          >
+            新增
+          </SDButton>,
+        ]}
+         actionRef={actionRef}
+         formRef={formRef}
+         setDetailVisible={() => {setDetailVisible(true)}}
+         setEditType={setEditType}
+         setCurrentRow={setCurrentRow}
+         />
+
+
+
+
+        {detailVisible && (
+        <SDModalForm          
+          title={'详细信息'}
+          editType={editType}
+          params={currentRow}
+          visible={detailVisible}
+          onVisibleChange={() => {setDetailVisible(false)}}
+          footer={[
+          <SDSubmitButton  editType={editType}   formRef={formRef} doSubmit={handleSave} >保存</SDSubmitButton>,
+          <SDButton
+            key="closeUpdate"
+            successMessage=''
+            onClick={() => {
+               setDetailVisible(false);
+            }}>关闭</SDButton>
+          ]}
+          tableRef={actionRef}
+          formRef={formRef}
+          onValuesChange={(changeValues)=>{
+            if (changeValues.reportNo == '') {
+              setBusiPk('');
+              setFillInFormData([]);
+              setCalculateFormData([]);
+            }
+          }}
+          initialValues={
+            {
+              reportNo:busiPk
+            }
+          }
+        >
+            <SDAreaTtile title='报表信息'/>
+            <SDFormText name="reportNo" readonlyCond="update" required={true} label="报表编号"/>
+            <SDFormText name="reportName" label="报表名称"/>
+            <SDFormDict dictKey='' name="reportType"  label="报表类型" />
+            <SDFormDict dictKey='' name="reportOrgcode" label="所属机构"/>
+            {busiPk && editType !== 'update' && (<SDFormAttach name={"reportFile"}   label="模板文件"  funcType={"reportuploadconfig"} filetype="" maxFileNum={1} busiPkId={busiPk}/>)}
+            {editType == 'update' && (<SDFormText name="reportFile" label="模板文件"/>)}
+            <SDFormText name="reportVersion"  label="报表版本号"/>
+            <SDLayout footer={
+              [ !busiPk && (<SDSubmitButton  editType={editType}   formRef={formRef} doSubmit={analyseFile} >显示模板文件</SDSubmitButton>),
+                busiPk && (<SDSubmitButton  editType={editType}   formRef={formRef}  doSubmit={ 
+                   handanalyseReportFile
+                  } >解析模板文件</SDSubmitButton>)
+              ]
+            }/>
+            <SDAreaTtile title='需填报的单元详情'/>
+            <EditableProTable
+              rowKey="id"
+              columns={reportCalculateColumns}
+              recordCreatorProps={false}
+              actionRef={fillInActionRef}
+              value={fillInFormData}
+              rowSelection={{
+                type:'radio',
+                selectedRowKeys:oldRowKeys,
+                onSelect:(selectedRowKeys, selectedRows) => {
+                  setSelectRowData(selectedRowKeys);
+                }
+              }}
+              toolBarRender={(_, { selectedRowKeys }) => editType == 'create' || editType == 'update' ? [
+                <SDButton
+                  key="export"
+                  successMessage=''
+                  onClick={() => {
+                    setIntoRestId();
+                    fillInActionRef.current?.addEditRecord?.({
+                      id: reptId+1,
+                      title: '新的一行',
+                    });
+                  }}
+                >
+                  新增
+                </SDButton>,
+                <SDButton
+                key="import"
+                successMessage=''
+                onClick={() => {
+                  if (selectRowData.id) {
+                    setFillInFormData(...[fillInFormData.filter((item)=>{return item.id !== selectRowData.id})]);
+                    fillInActionRef.current?.reload();
+                  }
+                }}
+              >
+                删除
+              </SDButton>,
+              ]:[]}
+              onChange={ (value: readonly ReportCalculationModel[]) => {
+                setFillInFormData([...value]);
+              } }
+           />
+
+          <SDAreaTtile title='需计算的单元详情'/>
+          <EditableProTable
+              rowKey="id"
+              columns={reportCalculateOtherColumns}
+              recordCreatorProps={false}
+              actionRef={calculateActionRef}
+              value={calculateFormData}
+           />
+        </SDModalForm>
+      )}
+
+
+        </SDPage>
+        
+    );
+}
+export default reportfillingconfig;

+ 135 - 0
Procedure/frontend/projectb/src/services/rwa/product/report_form_config_reportcreater/reportfillingconfig.ts

@@ -0,0 +1,135 @@
+import type { BasePageModel, TableData } from '@sundata/ui-frame';
+import { baseFun } from '@sundata/ui-frame';
+
+// 报表定义基本信息表
+export type ReportDefinitionModel = {
+    // 计算实例号
+    calcindex?: string;
+    // 起始数据日期
+    startDate?: string;
+    // 截止数据日期
+    endDate?: string;
+    // 年月
+    term: string;
+    // 数据日期
+    dataDate: string;
+    // 报表编号
+    reportNo?: string;
+    // 报表名称
+    reportName?: string;
+    // 报表版本号
+    reportVersion?: string;
+    // 所属机构
+    reportOrgcode?: string;
+    // 报表类型
+    reportType?: string;
+    // 模板文件
+    reportFile?: File;
+  } & BasePageModel;
+
+
+  export type ReportCalculationModel = {
+    // 计算实例号
+    calcindex?: string;
+    // 起始数据日期
+    startDate?: string;
+    // 截止数据日期
+    endDate?: string;
+    // 年月
+    term: string;
+    // 数据日期
+    dataDate: string;
+    // 序号
+    id: string;
+    // 报表编号
+    reportno?: string;
+    // 报表计算单元编号
+    reportUnitNo?: string;
+    // sheet页位置
+    reportUnitSheet?: string;
+    // 行位置
+    reportUnitRow?: string;
+    // 列位置
+    reportUnitCell?: string;
+    // 单元格样式类型
+    unitStyleType?: string;
+    // 计算过程类型
+    unitCalcType?: string;
+    // 计算对象名称
+    unitCalcObjectName?: string;
+    // 计算对象配置
+    unitCalcInfo?: string;
+    // 单元格数据类型
+    unitDataType?: string;
+    // 单元格类型
+    unitType?: string;
+    // 是否包含下钻功能
+    isHasurl?: string;
+    // Excel公式
+    excelFormula?: string;
+  } & BasePageModel;
+
+
+  export type resMapModel = {
+    // 需填报的单元详情列表
+    FillIn: ReportCalculationModel[];
+    // 需填报的单元详情列表
+    Calc: ReportCalculationModel[];
+  };
+
+
+
+
+  /** 获取页面初始化查询 POST*/
+export async function getDataList(body:ReportDefinitionModel) {
+    return baseFun.request<ReportDefinitionModel[]>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/getDataList.do',{data: body});
+  }
+
+  /** 新建数据 POST*/
+export async function createReportData(body: ReportDefinitionModel) {
+    return baseFun.request<TableData<ReportDefinitionModel>>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/createReportData.do',{data: body});
+  }
+
+  /** 更新数据 POST*/
+export async function updateReportData(body: ReportDefinitionModel) {
+    return baseFun.request<TableData<ReportDefinitionModel>>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/updateReportData.do',{data: body});
+  }
+
+  /** 删除当前行数据 POST*/
+export async function deleteReportData(body: ReportDefinitionModel) {
+    return baseFun.request<void>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/deleteReportData.do',{data: body});
+  }
+
+  /** 查询当前行详细数据 POST*/
+export async function selectReportData(body: any) {
+    return baseFun.request<ReportDefinitionModel>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/selectReportData.do',{data: body});
+  }
+
+    /** 查询当前行详细数据 POST*/
+export async function analyseReportFile(body: ReportDefinitionModel,key:string) {
+  return baseFun.request<resMapModel>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/analyseReportFile.do',{data: body,
+    params:{key}
+  });
+}
+
+  
+  /** 更新数据 POST*/
+  export async function updateCalcReportData(body: ReportCalculationModel[],keys: string) {
+    return baseFun.request<void>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/updateCalcReportData.do',{data: body,
+      params:{keys}
+    });
+  }
+
+
+  /** 新建数据 POST*/
+  export async function createCalcReportData(body: ReportCalculationModel[]) {
+    return baseFun.request<TableData<void>>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/createCalcReportData.do',{data: body});
+  }
+
+
+  /** 查询数据 POST*/
+  export async function selectCalcReportData(reportNo:string) {
+    return baseFun.request<resMapModel>('/api/product/rwa/reportformconfigreportcreater/ReportFillingConfigAction/selectCalcReportData.do',{params: {reportNo}});
+  }
+
+