From cb4df5a1c9cda76e828fa202990df33be0735105 Mon Sep 17 00:00:00 2001
From: 许鹏程 <1821349743@qq.com>
Date: 星期四, 29 六月 2023 09:32:34 +0800
Subject: [PATCH] poi、easyexcel、poi-tl升级 ,合并空调中的报表、数据源模块

---
 src/main/java/com/product/server/report/service/ReportDatasourceService.java       |   88 
 /dev/null                                                                          |    0 
 src/main/java/com/product/server/report/config/CmnConst.java                       |  464 ++++----
 src/main/java/com/product/server/report/controller/DataListReportController.java   |   20 
 src/main/java/com/product/server/report/controller/ReportDatasourceController.java |    2 
 src/main/java/com/product/server/report/config/SystemCode.java                     |    4 
 src/main/java/com/product/server/report/service/GroupReportService.java            |  572 +--------
 pom.xml                                                                            |   12 
 src/main/java/com/product/server/report/service/CommonReportService.java           |  635 ++--------
 src/main/java/com/product/server/report/service/DataListReportService.java         |  477 ++++----
 src/main/java/com/product/server/report/entity/ReportColumn.java                   |   53 
 src/main/java/com/product/server/report/service/ReportConfigService.java           | 1038 ++++++++---------
 12 files changed, 1,334 insertions(+), 2,031 deletions(-)

diff --git "a/DOC/\346\212\245\350\241\250\350\256\276\350\256\241.docx" "b/DOC/\346\212\245\350\241\250\350\256\276\350\256\241.docx"
deleted file mode 100644
index 3c1fe00..0000000
--- "a/DOC/\346\212\245\350\241\250\350\256\276\350\256\241.docx"
+++ /dev/null
Binary files differ
diff --git a/pom.xml b/pom.xml
index 263bc90..5a3cae0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,5 @@
 <?xml version="1.0"?>
-<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
-         xmlns="http://maven.apache.org/POM/4.0.0"
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
     <modelVersion>4.0.0</modelVersion>
     <parent>
@@ -19,7 +18,6 @@
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
-            <version>3.8.1</version>
             <scope>test</scope>
         </dependency>
         <dependency>
@@ -42,5 +40,13 @@
             <groupId>com.lx</groupId>
             <artifactId>product-server-data-export-import</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.lx</groupId>
+            <artifactId>product-server-datasource</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+        </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/com/product/server/report/config/CmnConst.java b/src/main/java/com/product/server/report/config/CmnConst.java
index eec4861..aa1d57c 100644
--- a/src/main/java/com/product/server/report/config/CmnConst.java
+++ b/src/main/java/com/product/server/report/config/CmnConst.java
@@ -1,260 +1,264 @@
 package com.product.server.report.config;
 
-public class CmnConst {
+import com.product.core.config.CoreConst;
 
-    // 琛ㄥ悕甯搁噺瀹氫箟
-    public static final String PRODUCT_SYS_PRODUCTS = "product_sys_products"; // 浜у搧琛ㄥ悕
-    public static final String PRODUCT_SYS_REPORT_TYPE_CONFIG = "product_sys_report_type_config";
-    public static final String PRODUCT_SYS_REPORT_TYPE_ATTRIBUTE = "product_sys_report_type_attribute";
-    public static final String PRODUCT_SYS_REPORT_DATASOURCE_CONFIG = "product_sys_report_datasource_config";
-    public static final String PRODUCT_SYS_REPORT_DATASOURCE_CONFIG_FIELD = "product_sys_report_datasource_config_field";
-    public static final String PRODUCT_SYS_REPORT_CONFIG = "product_sys_report_config";
-    public static final String PRODUCT_SYS_REPORT_CONFIG_CHARTS = "product_sys_report_config_charts";
-    public static final String PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE = "product_sys_report_config_attribute";
-    public static final String PRODUCT_SYS_DATAMODEL_FIELD = "product_sys_datamodel_field";
-    public static final String PRODUCT_SYS_FUNCTIONS = "product_sys_functions";
-    public static final String PRODUCT_SYS_FUNCTION_BUTTONS = "product_sys_function_buttons";
-    public static final String PRODUCT_SYS_MVC_PAGE = "product_sys_mvc_page";
-    public static final String PRODUCT_SYS_LINK = "product_sys_link";
-    public static final String PRODUCT_SYS_FUNCTION_PERMISSION = "product_sys_function_permission";
-    public static final String PRODUCT_SYS_MENUS = "product_sys_menus";
-    public static final String PRODUCT_SYS_DATAMODEL_TABLE = "product_sys_datamodel_table";
+public class CmnConst extends CoreConst {
 
-    //鍒嗛〉甯搁噺瀹氫箟
-    public static final String CPAGE = "cpage";        //椤垫暟
-    public static final String PAGESIZE = "pagesize";    //姣忛〉鏉℃暟
+	// 琛ㄥ悕甯搁噺瀹氫箟
+	public static final String PRODUCT_SYS_PRODUCTS = "product_sys_products"; // 浜у搧琛ㄥ悕
+	public static final String PRODUCT_SYS_REPORT_TYPE_CONFIG = "product_sys_report_type_config";
+	public static final String PRODUCT_SYS_REPORT_TYPE_ATTRIBUTE = "product_sys_report_type_attribute";
+	public static final String PRODUCT_SYS_REPORT_DATASOURCE_CONFIG = "product_sys_report_datasource_config";
+	public static final String PRODUCT_SYS_REPORT_DATASOURCE_CONFIG_FIELD = "product_sys_report_datasource_config_field";
+	public static final String PRODUCT_SYS_REPORT_CONFIG = "product_sys_report_config";
+	public static final String PRODUCT_SYS_REPORT_CONFIG_CHARTS = "product_sys_report_config_charts";
+	public static final String PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE = "product_sys_report_config_attribute";
+	public static final String PRODUCT_SYS_DATAMODEL_FIELD = "product_sys_datamodel_field";
+	public static final String PRODUCT_SYS_FUNCTIONS = "product_sys_functions";
+	public static final String PRODUCT_SYS_FUNCTION_BUTTONS = "product_sys_function_buttons";
+	public static final String PRODUCT_SYS_MVC_PAGE = "product_sys_mvc_page";
+	public static final String PRODUCT_SYS_LINK = "product_sys_link";
+	public static final String PRODUCT_SYS_FUNCTION_PERMISSION = "product_sys_function_permission";
+	public static final String PRODUCT_SYS_MENUS = "product_sys_menus";
+	public static final String PRODUCT_SYS_DATAMODEL_TABLE = "product_sys_datamodel_table";
+
+	//鍒嗛〉甯搁噺瀹氫箟
+	public static final String CPAGE = "cpage";        //椤垫暟
+	public static final String PAGESIZE = "pagesize";    //姣忛〉鏉℃暟
 
 
-    //鐗规畩甯搁噺瀹氫箟
-    public static final String TYPE = "~type~";
-    public static final String DEL = "del";
-    public static final String UUID = "uuid";
-    public static final String ID = "id";
-    public static final String OPTION = "option";
-    //鏁版嵁搴撶被鍨�
-    public static final String MYSQL = "mysql";
+	//鐗规畩甯搁噺瀹氫箟
+	public static final String TYPE = "~type~";
+	public static final String DEL = "del";
+	public static final String UUID = "uuid";
+	public static final String ID = "id";
+	public static final String OPTION = "option";
+	public static final String TABLE_NAME = "table_name";
+	//鏁版嵁搴撶被鍨�
+	public static final String MYSQL = "mysql";
 
-    //甯搁噺瀛楁瀹氫箟
-    public static final String RELATED_TABLE = "related_table";
-    public static final String TYPE_GROUP = "type_group";
-    public static final String TYPE_UUID = "type_uuid";
-    public static final String FIELD_TYPE = "field_type";
-    public static final String FIELD_LENGTH = "field_length";
-    public static final String FIELD_UNIT = "field_unit";
-    public static final String FIELD_DESCRIPTION = "field_description";
-    public static final String FIELD_TEXT = "field_text";
-    public static final String IS_VALID = "is_valid";
-    public static final String CREATED_BY = "created_by";
-    public static final String UPDATED_BY = "updated_by";
-    public static final String CREATED_UTC_DATETIME = "created_utc_dateime";
-    public static final String UPDATED_UTC_DATETIME = "updated_utc_datetime";
-    public static final String NAME = "name";
-    public static final String VALUE = "value";
-    public static final String TRICODE = "tricode";
-    public static final String MODULE_UUID = "module_uuid";
-    public static final String TABLE_UUID = "table_uuid";
-    public static final String FUNCTION_NAME = "function_name";
-    public static final String FUNCTION_DESCRIPTION = "function_description";
-    public static final String REPORT_NAME = "report_name";
-    public static final String STATUS_UUID = "status_uuid";
-    public static final String FUNCTION_TYPE_UUID = "function_type_uuid";
-    public static final String CLIENT_TYPE_UUID = "client_type_uuid";
-    public static final String BUTTON_NAME = "button_name";
-    public static final String BUTTON_TITLE = "button_title";
-    public static final String BUTTON_TYPE = "button_type";
-    public static final String BUTTON_CATEGORY_UUID = "button_category_uuid";
-    public static final String ROUTE_NAME = "route_name";
-    public static final String IS_MAIN = "is_main";
-    public static final String PAGE_NAME = "page_name";
-    public static final String LINK_TYPE = "link_type";
-    public static final String FUNCTION_UUID = "function_uuid";
-    public static final String SUB_REPORT = "sub_report";
-    public static final String LINE_FROM = "line_from";
-    public static final String FROM_TYPE = "from_type";
-    public static final String LINE_TO = "line_to";
-    public static final String TO_TYPE = "to_type";
-    public static final String BUTTON_UUID = "button_uuid";
-    public static final String ROLE_UUID = "role_uuid";
-    public static final String MENU_NAME = "menu_name";
-    public static final String MENU_ICON = "menu_icon";
-    public static final String TRICODE_PARENT = "tricode_parent";
-    public static final String IS_CATALOG = "is_catalog";
-    public static final String IS_SHOW = "is_show";
-    public static final String TOP_LOCATION = "top_location";
-    public static final String LEFT_LOCATION = "left_location";
-    public static final String VERSION_UUID = "version_uuid";
-    public static final String PAGE_TYPE = "page_type";
-    public static final String PAGE_URL = "page_url";
-    public static final String UPLOAD_API_URL = "upload_api_url";
-    public static final String PARAMS = "params";
-    public static final String SEQUENCE = "sequence";
-    public static final String REPORT_WIDTH_TYPE = "report_width_type";
-    public static final String REPORT_WIDTH_VALUE = "report_width_value";
-    public static final String DATA_TYPE = "data_type";
-    public static final String PAGE_OPEN_WITH = "page_open_with";
-    public static final String RELATE_FLAG = "relate_flag";
-    public static final String LOGICAL_OPERATOR = "logical_operator";
-    public static final String LOGICAL_VALUE = "logical_value";
-    public static final String FIRST_LOAD = "first_load";
+	//甯搁噺瀛楁瀹氫箟
+	public static final String RELATED_TABLE = "related_table";
+	public static final String TYPE_GROUP = "type_group";
+	public static final String TYPE_UUID = "type_uuid";
+	public static final String FIELD_TYPE = "field_type";
+	public static final String FIELD_LENGTH = "field_length";
+	public static final String FIELD_UNIT = "field_unit";
+	public static final String FIELD_DESCRIPTION = "field_description";
+	public static final String FIELD_TEXT = "field_text";
+	public static final String IS_VALID = "is_valid";
+	public static final String CREATED_BY = "created_by";
+	public static final String UPDATED_BY = "updated_by";
+	public static final String CREATED_UTC_DATETIME = "created_utc_dateime";
+	public static final String UPDATED_UTC_DATETIME = "updated_utc_datetime";
+	public static final String NAME = "name";
+	public static final String VALUE = "value";
+	public static final String TRICODE = "tricode";
+	public static final String MODULE_UUID = "module_uuid";
+	public static final String TABLE_UUID = "table_uuid";
+	public static final String FUNCTION_NAME = "function_name";
+	public static final String FUNCTION_DESCRIPTION = "function_description";
+	public static final String REPORT_NAME = "report_name";
+	public static final String STATUS_UUID = "status_uuid";
+	public static final String FUNCTION_TYPE_UUID = "function_type_uuid";
+	public static final String CLIENT_TYPE_UUID = "client_type_uuid";
+	public static final String BUTTON_NAME = "button_name";
+	public static final String BUTTON_TITLE = "button_title";
+	public static final String BUTTON_TYPE = "button_type";
+	public static final String BUTTON_CATEGORY_UUID = "button_category_uuid";
+	public static final String ROUTE_NAME = "route_name";
+	public static final String IS_MAIN = "is_main";
+	public static final String PAGE_NAME = "page_name";
+	public static final String LINK_TYPE = "link_type";
+	public static final String FUNCTION_UUID = "function_uuid";
+	public static final String SUB_REPORT = "sub_report";
+	public static final String LINE_FROM = "line_from";
+	public static final String FROM_TYPE = "from_type";
+	public static final String LINE_TO = "line_to";
+	public static final String TO_TYPE = "to_type";
+	public static final String BUTTON_UUID = "button_uuid";
+	public static final String ROLE_UUID = "role_uuid";
+	public static final String MENU_NAME = "menu_name";
+	public static final String MENU_ICON = "menu_icon";
+	public static final String TRICODE_PARENT = "tricode_parent";
+	public static final String IS_CATALOG = "is_catalog";
+	public static final String IS_SHOW = "is_show";
+	public static final String TOP_LOCATION = "top_location";
+	public static final String LEFT_LOCATION = "left_location";
+	public static final String VERSION_UUID = "version_uuid";
+	public static final String PAGE_TYPE = "page_type";
+	public static final String PAGE_URL = "page_url";
+	public static final String UPLOAD_API_URL = "upload_api_url";
+	public static final String PARAMS = "params";
+	public static final String SEQUENCE = "sequence";
+	public static final String REPORT_WIDTH_TYPE = "report_width_type";
+	public static final String REPORT_WIDTH_VALUE = "report_width_value";
+	public static final String DATA_TYPE = "data_type";
+	public static final String PAGE_OPEN_WITH = "page_open_with";
+	public static final String RELATE_FLAG = "relate_flag";
+	public static final String LOGICAL_OPERATOR = "logical_operator";
+	public static final String LOGICAL_VALUE = "logical_value";
+	public static final String FIRST_LOAD = "first_load";
 
-    //PRODUCT_SYS_report_config  閰嶇疆涓昏〃瀛楁
-    public static final String DATASOURCE_UUID = "datasource_uuid";
-    //鏁版嵁婧恥uid
-    public static final String REPORT_DATASOURCE_UUID = "report_datasource_uuid";
-    //琛ㄧ被鍨媢uid
-    public static final String REPORT_TYPE_CONFIG_UUID = "report_type_config_uuid";
-    //PRODUCT_SYS_report_datasource_config 鎶ヨ〃鏁版嵁婧愰厤缃〃瀛楁
-    public static final String SQL_TEXT = "sql_text";
-    //PRODUCT_SYS_report_datasource_config_field 鎶ヨ〃鏁版嵁婧愬瓧娈典俊鎭〃瀛楁
-    public static final String FIELD_NAME = "field_name";
-    public static final String FIELD_FORMAT = "field_format";
-    public static final String FIELD_PROMPT = "field_prompt";
-    public static final String SEARCH_TYPE = "search_type";
-    public static final String TABLE_NAME = "table_name";
-    //PRODUCT_SYS_report_type_attribute 鎶ヨ〃閰嶇疆灞炴�ц〃瀛楁
-    public static final String REPORT_TYPE_ATTR = "report_type_attr";
-    public static final String ATTRIBUTE_NAME = "attribute_name";
+	//PRODUCT_SYS_report_config  閰嶇疆涓昏〃瀛楁
+	public static final String DATASOURCE_UUID = "datasource_uuid";
+	//鏁版嵁婧恥uid
+	public static final String REPORT_DATASOURCE_UUID = "report_datasource_uuid";
+	//琛ㄧ被鍨媢uid
+	public static final String REPORT_TYPE_CONFIG_UUID = "report_type_config_uuid";
+	//PRODUCT_SYS_report_datasource_config 鎶ヨ〃鏁版嵁婧愰厤缃〃瀛楁
+	public static final String SQL_TEXT = "sql_text";
+	//PRODUCT_SYS_report_datasource_config_field 鎶ヨ〃鏁版嵁婧愬瓧娈典俊鎭〃瀛楁
+	public static final String FIELD_NAME = "field_name";
+	public static final String FIELD_FORMAT = "field_format";
+	public static final String FIELD_PROMPT = "field_prompt";
+	public static final String SEARCH_TYPE = "search_type";
+	//PRODUCT_SYS_report_type_attribute 鎶ヨ〃閰嶇疆灞炴�ц〃瀛楁
+	public static final String REPORT_TYPE_ATTR = "report_type_attr";
+	public static final String ATTRIBUTE_NAME = "attribute_name";
+	public static final String UNPIVOT_INFO = "unpivot_info";
+	public static final String IS_UNPIVOT = "is_unpivot";
 
-    public static final String REPORT_TYPE = "report_type";
-    public static final String REPORT_TYPE_COMMON = "鏅�氭暟鎹垪琛�";
-    public static final String REPORT_TYPE_GROUP = "鍒嗙粍鎶ヨ〃";
-    public static final String REPORT_TYPE_CROSS = "浜ゅ弶鎶ヨ〃";
+	public static final String REPORT_TYPE = "report_type";
+	public static final String REPORT_TYPE_COMMON = "鏅�氭暟鎹垪琛�";
+	public static final String REPORT_TYPE_GROUP = "鍒嗙粍鎶ヨ〃";
+	public static final String REPORT_TYPE_CROSS = "浜ゅ弶鎶ヨ〃";
 
 
-    // 缂撳瓨
-    public static final String CACHE_REPORT_CONFIG = "鎶ヨ〃閰嶇疆";
-    public static final String CACHE_REPORT_DATASOURCE_CONFIG = "鏁版嵁婧愰厤缃�";
-    public static final String CACHE_REPORT_DATASOURCE_FIELD_CONFIG = "鏁版嵁婧愬瓧娈甸厤缃�";
-    public static final String CACHE_REPORT_TYPE = "鎶ヨ〃绫诲瀷";
-    public static final String CACHE_REPORT_TYPE_ATTR = "鎶ヨ〃绫诲瀷灞炴�ц〃";
+	// 缂撳瓨
+	public static final String CACHE_REPORT_CONFIG = "鎶ヨ〃閰嶇疆";
+	public static final String CACHE_REPORT_DATASOURCE_CONFIG = "鏁版嵁婧愰厤缃�";
+	public static final String CACHE_REPORT_DATASOURCE_FIELD_CONFIG = "鏁版嵁婧愬瓧娈甸厤缃�";
+	public static final String CACHE_REPORT_TYPE = "鎶ヨ〃绫诲瀷";
+	public static final String CACHE_REPORT_TYPE_ATTR = "鎶ヨ〃绫诲瀷灞炴�ц〃";
 
-    // 瀛楁
-    public static final String REPORT_TYPE_ATTR_VALUE = "report_type_attr_value";
-    public static final String CELL_POSITION_X = "cell_position_x";
-    public static final String CELL_POSITION_Y = "cell_position_y";
-    public static final String REPORT_AREA = "report_area";
-    public static final String LAST_TOTAL = "last_total";
-    public static final String TOTAL_NAME = "total_name";
-    public static final String IS_PAGE = "is_page";
-    public static final String PAGE_SIZE = "page_size";
-    public static final String TYPE_NAME = "type_name";
-    public static final String SYSTEM_SENIOR_QUERY_STRING = "systemSeniorQueryString";
-    public static final String REPORT_DATASOURCE_NAME = "report_datasource_name";
+	// 瀛楁
+	public static final String REPORT_TYPE_ATTR_VALUE = "report_type_attr_value";
+	public static final String CELL_POSITION_X = "cell_position_x";
+	public static final String CELL_POSITION_Y = "cell_position_y";
+	public static final String REPORT_AREA = "report_area";
+	public static final String LAST_TOTAL = "last_total";
+	public static final String TOTAL_NAME = "total_name";
+	public static final String IS_PAGE = "is_page";
+	public static final String PAGE_SIZE = "page_size";
+	public static final String TYPE_NAME = "type_name";
+	public static final String SYSTEM_SENIOR_QUERY_STRING = "systemSeniorQueryString";
+	public static final String REPORT_DATASOURCE_NAME = "report_datasource_name";
 
-    // 灞炴��-label
-    public static final String ATTR_COLSPAN = "colspan";
-    public static final String ATTR_ROWSPAN = "rowspan";
-    public static final String ATTR_FIELD_INFO = "field_info";
-    public static final String ATTR_DATA_AREA_GROUP_FIELD = "data_area_group_field";
-    public static final String ATTR_GROUP_AREA_GROUP_FIELD = "group_area_group_field";
-    public static final String ATTR_STATISTICS = "statistics";
-    public static final String ATTR_X = "x";
-    public static final String ATTR_Y = "y";
-    public static final String ATTR_SORT = "sort";
-    public static final String ATTR_SHOW_NAME = "show_name";
-    public static final String ATTR_IS_GROUP = "is_group";
-    public static final String ATTR_IS_CUSTOM_FIELD = "is_custom_field";
-    public static final String ATTR_SP_TIME_STATISTICS_WAY = "sp_time_statistics_way";
-    public static final String ATTR_RELATE_TIME_FIELD = "relate_time_field";
-    public static final String ATTR_RELATE_COMMON_FIELD = "relate_common_field";
-    public static final String ATTR_HEAD_LAST_YEAR = "last_year__";
-    public static final String ATTR_HEAD_PRE_PERIOD = "pre_period__";
+	// 灞炴��-label
+	public static final String ATTR_COLSPAN = "colspan";
+	public static final String ATTR_ROWSPAN = "rowspan";
+	public static final String ATTR_FIELD_INFO = "field_info";
+	public static final String ATTR_DATA_AREA_GROUP_FIELD = "data_area_group_field";
+	public static final String ATTR_GROUP_AREA_GROUP_FIELD = "group_area_group_field";
+	public static final String ATTR_STATISTICS = "statistics";
+	public static final String ATTR_X = "x";
+	public static final String ATTR_Y = "y";
+	public static final String ATTR_SORT = "sort";
+	public static final String ATTR_SHOW_NAME = "show_name";
+	public static final String ATTR_IS_GROUP = "is_group";
+	public static final String ATTR_IS_CUSTOM_FIELD = "is_custom_field";
+	public static final String ATTR_SP_TIME_STATISTICS_WAY = "sp_time_statistics_way";
+	public static final String ATTR_RELATE_TIME_FIELD = "relate_time_field";
+	public static final String ATTR_RELATE_COMMON_FIELD = "relate_common_field";
+	public static final String ATTR_HEAD_LAST_YEAR = "last_year__";
+	public static final String ATTR_HEAD_PRE_PERIOD = "pre_period__";
 
-    public static final String ATTR_FORMULA = "formula";
-    public static final String ATTR_IS_STATISTICS = "is_statistics";
-    public static final String ATTR_IS_STATISTICS_FIELD = "is_statistics_field";
-    public static final String ATTR_DECIMAL_DIGITS = "decimal_digits";
-    public static final String ATTR_AVG_TYPE = "avg_type";
-    public static final String ATTR_ENUM_TYPE = "enum_type";
-    public static final String ATTR_IS_TOTAL_STATISTICS = "is_total_statistics";
-    public static final String ATTR_IS_TITLE = "is_title";
-    public static final String ATTR_GROUP_AREA_SUB_CNT = "group_area_sub_cnt";
-    public static final String ATTR_DATA_AREA_SUB_CNT = "data_area_sub_cnt";
-    public static final String ATTR_SIZE = "size";
-    public static final String ATTR_STATISTICS_FIELD = "statistics_field";
-    public static final String ATTR_ORDER_BY = "order_by";
-    public static final String ATTR_DATE_FORMAT = "date_format";
-    public static final String ATTR_NUM_FORMAT = "num_format";
-    public static final String ATTR_DATA_TYPE = "data_type";
-    public static final String ATTR_WIDTH = "width";
-    public static final String ATTR_URL = "url";
-    public static final String ATTR_REAL_VALUE = "real_value";
-    public static final String ATTR_TOTAL_COUNT = "total_count";
-    public static final String ATTR_TOTAL_PAGE = "total_page";
-    public static final String ATTR_URL_PARAM = "url_param";
+	public static final String ATTR_FORMULA = "formula";
+	public static final String ATTR_IS_STATISTICS = "is_statistics";
+	public static final String ATTR_IS_STATISTICS_FIELD = "is_statistics_field";
+	public static final String ATTR_DECIMAL_DIGITS = "decimal_digits";
+	public static final String ATTR_AVG_TYPE = "avg_type";
+	public static final String ATTR_ENUM_TYPE = "enum_type";
+	public static final String ATTR_IS_TOTAL_STATISTICS = "is_total_statistics";
+	public static final String ATTR_IS_TITLE = "is_title";
+	public static final String ATTR_GROUP_AREA_SUB_CNT = "group_area_sub_cnt";
+	public static final String ATTR_DATA_AREA_SUB_CNT = "data_area_sub_cnt";
+	public static final String ATTR_SIZE = "size";
+	public static final String ATTR_STATISTICS_FIELD = "statistics_field";
+	public static final String ATTR_ORDER_BY = "order_by";
+	public static final String ATTR_DATE_FORMAT = "date_format";
+	public static final String ATTR_NUM_FORMAT = "num_format";
+	public static final String ATTR_DATA_TYPE = "data_type";
+	public static final String ATTR_WIDTH = "width";
+	public static final String ATTR_URL = "url";
+	public static final String ATTR_REAL_VALUE = "real_value";
+	public static final String ATTR_TOTAL_COUNT = "total_count";
+	public static final String ATTR_TOTAL_PAGE = "total_page";
+	public static final String ATTR_URL_PARAM = "url_param";
 
-    public static final String ATTR_REPORT_AREA = "report_area";
-    public static final String ATTR_NAME = "name";
-    public static final String ATTR_VALUE = "value";
-    public static final String ATTR_FINAL_VALUE = "final_value";
+	public static final String ATTR_REPORT_AREA = "report_area";
+	public static final String ATTR_NAME = "name";
+	public static final String ATTR_VALUE = "value";
+	public static final String ATTR_FINAL_VALUE = "final_value";
 
-    public static final String ATTR_STATISTICS_DEFAULT = "default";
-    public static final String ATTR_STATISTICS_SUM = "sum";
-    public static final String ATTR_STATISTICS_MAX = "max";
-    public static final String ATTR_STATISTICS_MIN = "min";
-    public static final String ATTR_STATISTICS_CNT = "cnt";
-    public static final String ATTR_STATISTICS_AVG = "avg";
-    public static final String ATTR_STATISTICS_ENUM = "enum";
-    public static final String ATTR_STATISTICS_FINAL_STATISTICS = "final_statistics";
-    public static final String ATTR_STATISTICS_SUB_CNT = "sub_cnt";
-    public static final String ATTR_STATISTICS_GROUP_AREA_AVG = "group_area_avg";
-    public static final String ATTR_STATISTICS_DATA_AREA_AVG = "data_area_avg";
+	public static final String ATTR_STATISTICS_DEFAULT = "default";
+	public static final String ATTR_STATISTICS_SUM = "sum";
+	public static final String ATTR_STATISTICS_MAX = "max";
+	public static final String ATTR_STATISTICS_MIN = "min";
+	public static final String ATTR_STATISTICS_CNT = "cnt";
+	public static final String ATTR_STATISTICS_AVG = "avg";
+	public static final String ATTR_STATISTICS_ENUM = "enum";
+	public static final String ATTR_STATISTICS_FINAL_STATISTICS = "final_statistics";
+	public static final String ATTR_STATISTICS_SUB_CNT = "sub_cnt";
+	public static final String ATTR_STATISTICS_GROUP_AREA_AVG = "group_area_avg";
+	public static final String ATTR_STATISTICS_DATA_AREA_AVG = "data_area_avg";
 
-    public static final String ATTR_DATA_TYPE_STRING = "string";
-    public static final String ATTR_DATA_TYPE_NUM = "num";
-    public static final String ATTR_DATA_TYPE_DATE = "date";
+	public static final String ATTR_DATA_TYPE_STRING = "string";
+	public static final String ATTR_DATA_TYPE_NUM = "num";
+	public static final String ATTR_DATA_TYPE_DATE = "date";
 
-    public static final String STATISTICS_NAME = "缁熻";
+	public static final String STATISTICS_NAME = "缁熻";
 
-    public static final String ONCLICK_FUNC_NAME = "turn_2_other_page";
+	public static final String ONCLICK_FUNC_NAME = "turn_2_other_page";
 
-    public static final String RETURN_ATTR_RESULT = "result";
-    public static final String RETURN_ATTR_MESSAGE = "message";
-    public static final String RETURN_ATTR_HTML = "html";
+	public static final String RETURN_ATTR_RESULT = "result";
+	public static final String RETURN_ATTR_MESSAGE = "message";
+	public static final String RETURN_ATTR_HTML = "html";
 
-    public static final String REGEXP_FORM_FIELD = "\\{#\\w+#}";
-    public static final String REGEXP_SYS_FIELD = "\\{%\\w+%}";
-    public static final String REGEXP_NUMBER = "-?[0-9]+\\.?[0-9]*";
+	public static final String REGEXP_FORM_FIELD = "\\{#\\w+#}";
+	public static final String REGEXP_SYS_FIELD = "\\{%\\w+%}";
+	public static final String REGEXP_NUMBER = "-?[0-9]+\\.?[0-9]*";
 
-    public static final String FALSE = "false";
-    public static final String TRUE = "true";
+	public static final String FALSE = "false";
+	public static final String TRUE = "true";
 
-    public static final String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
+	public static final String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
 
-    public static final String MIN_X = "min_x";
-    public static final String MAX_X = "max_x";
-    public static final String MAX_Y = "max_y";
+	public static final String MIN_X = "min_x";
+	public static final String MAX_X = "max_x";
+	public static final String MAX_Y = "max_y";
 
-    public static final String CLASS_TR_REPORT_TITLE = "report_title";
-    public static final String CLASS_TR_HEAD = "head";
-    public static final String CLASS_TR_DATA_TITLE = "data_title";
-    public static final String CLASS_TR_DATA_STATISTICS = "data_statistics";
-    public static final String CLASS_TR_DATA_COMMON = "data_common";
-    public static final String CLASS_TR_TAIL = "tail";
-    public static final String CLASS_TD_CAN_TURN = "can_turn";
-    
-    public static final String PROMPT_REAL_VALUE_TAIL = "_save_value";
+	public static final String CLASS_TR_REPORT_TITLE = "report_title";
+	public static final String CLASS_TR_HEAD = "head";
+	public static final String CLASS_TR_DATA_TITLE = "data_title";
+	public static final String CLASS_TR_DATA_STATISTICS = "data_statistics";
+	public static final String CLASS_TR_DATA_COMMON = "data_common";
+	public static final String CLASS_TR_TAIL = "tail";
+	public static final String CLASS_TD_CAN_TURN = "can_turn";
 
-    public static final String REGEXP_FILTER_AREA = "\\[\\[((?!\\[).)+\\]\\]";
-    public static final String REGEXP_ALL_AREA = "(\\[\\[((?!\\[).)+\\]\\])|(\\{\\$((?!\\$).)+\\$\\})|(\\{\\^((?!\\^).)+\\^\\})|(\\{\\&((?!\\&).)+\\&\\})";
-    public static final String REGEXP_SP_SIGN_AREA = "(\\{\\$((?!\\$).)+\\$\\})|(\\{\\^((?!\\^).)+\\^\\})|(\\{\\&((?!\\&).)+\\&\\})";
-    public static final String REGEXP_ONLY_VALUE = "\\{\\$((?!\\$).)+\\$\\}";
-    public static final String REGEXP_EXCEPT_FIELD = "\\{\\^((?!\\^).)+\\^\\}";
-    public static final String REGEXP_FULL_CONTENT = "\\{\\&((?!\\&).)+\\&\\}";
-    public static final String REGEXP_ALL_TERNARY_OPERATOR = "\\{@((?!(\\{@)|(@\\})|(\\[\\[)|(\\]\\])).)+@\\}";
-    public static final String REGEXP_TERNARY_OPERATOR = "((?!\\?|(\\[)).)+\\?((?!:).)+:((?!(\\]\\])).)+";
-    public static final String REGEXP_ALL_TYPE = "(\\{\\$((?!(\\{\\$)).)+\\$\\})|(\\{\\^((?!(\\{\\^)).)+\\^\\})|(\\{\\&((?!(\\{\\&)).)+\\&\\})";
-    public static final String REGEXP_ALWAYS_TRUE = "and\\s+1\\s*=\\s*1";
+	public static final String PROMPT_REAL_VALUE_TAIL = "_save_value";
 
-    public static final String TERNARY_OPERATOR_LEFT = "{@";
-    public static final String TERNARY_OPERATOR_RIGHT = "@}";
-    public static final String CONTENT_PAGE_AREA = "[[page_area]]";
+	public static final String REGEXP_FILTER_AREA = "\\[\\[((?!\\[).)+\\]\\]";
+	public static final String REGEXP_ALL_AREA = "(\\[\\[((?!\\[).)+\\]\\])|(\\{\\$((?!\\$).)+\\$\\})|(\\{\\^((?!\\^).)+\\^\\})|(\\{\\&((?!\\&).)+\\&\\})";
+	public static final String REGEXP_SP_SIGN_AREA = "(\\{\\$((?!\\$).)+\\$\\})|(\\{\\^((?!\\^).)+\\^\\})|(\\{\\&((?!\\&).)+\\&\\})";
+	public static final String REGEXP_ONLY_VALUE = "\\{\\$((?!\\$).)+\\$\\}";
+	public static final String REGEXP_EXCEPT_FIELD = "\\{\\^((?!\\^).)+\\^\\}";
+	public static final String REGEXP_FULL_CONTENT = "\\{\\&((?!\\&).)+\\&\\}";
+	public static final String REGEXP_ALL_TERNARY_OPERATOR = "\\{@((?!(\\{@)|(@\\})|(\\[\\[)|(\\]\\])).)+@\\}";
+	public static final String REGEXP_TERNARY_OPERATOR = "((?!\\?|(\\[)).)+\\?((?!:).)+:((?!(\\]\\])).)+";
+	public static final String REGEXP_ALL_TYPE = "(\\{\\$((?!(\\{\\$)).)+\\$\\})|(\\{\\^((?!(\\{\\^)).)+\\^\\})|(\\{\\&((?!(\\{\\&)).)+\\&\\})";
+	public static final String REGEXP_ALWAYS_TRUE = "and\\s+1\\s*=\\s*1";
 
-    public static final String ADDRESS_INIT_INTERFENCE = "api/report/data-list/get-report";
-    public static final String ADDRESS_REPORT_SHOW = "system/reportForms/dataReport/preview";
-    public static final String ADDRESS_INIT_CHART = "/api/report/EChart/generatePieEChart";
-    public static final String ADDRESS_CHART_VIEW = "system/reportForms/chartReport/previewTwo";
+	public static final String TERNARY_OPERATOR_LEFT = "{@";
+	public static final String TERNARY_OPERATOR_RIGHT = "@}";
+	public static final String CONTENT_PAGE_AREA = "[[page_area]]";
 
-    public static final String FIELD_TYPE_NUM_STR = "bigint,decimal,double,float,int,integer,tinyint";
-    public static final String FIELD_TYPE_DATE_STR = "date,datetime,time,timestamp";
+	public static final String ADDRESS_INIT_INTERFENCE = "api/report/data-list/get-report";
+	public static final String ADDRESS_REPORT_SHOW = "system/reportForms/dataReport/preview";
+	public static final String ADDRESS_INIT_CHART = "/api/report/EChart/generatePieEChart";
+	public static final String ADDRESS_CHART_VIEW = "system/reportForms/chartReport/previewTwo";
+
+	public static final String FIELD_TYPE_NUM_STR = "bigint,decimal,double,float,int,integer,tinyint";
+	public static final String FIELD_TYPE_DATE_STR = "date,datetime,time,timestamp";
 }
diff --git a/src/main/java/com/product/server/report/config/SystemCode.java b/src/main/java/com/product/server/report/config/SystemCode.java
index 8a3eca1..8b6ab2b 100644
--- a/src/main/java/com/product/server/report/config/SystemCode.java
+++ b/src/main/java/com/product/server/report/config/SystemCode.java
@@ -26,8 +26,8 @@
 	SYTEM_REPORT_DATASOURCE_UPDATE_ERROR("鎶ヨ〃鏁版嵁婧愪慨鏀瑰け璐ワ紒",ModuleEnum.REPORT.getValue()+"003"),
 	SYTEM_REPORT_DATASOURCE_DELETE_ERROR("鎶ヨ〃鏁版嵁婧愬垹闄ゅけ璐ワ紒",ModuleEnum.REPORT.getValue()+"004"),
 	SYTEM_REPORT_DATA_PROCESS_ERROR("鎶ヨ〃鏁版嵁澶勭悊澶辫触",ModuleEnum.REPORT.getValue()+"005"),
-	
-	PUBLISH_REPORT_FAIL_MODULE_NO_EXIST("鍥炬爣鍙戝竷澶辫触锛屾寚瀹氭ā鍧椾笉瀛樺湪", ModuleEnum.REPORT.getValue()+"005"),
+	NO_MATCH_TABLE("鏈尮閰嶅埌琛ㄥ悕",ModuleEnum.REPORT.getValue()+"006"),
+	PUBLISH_REPORT_FAIL_MODULE_NO_EXIST("鍥炬爣鍙戝竷澶辫触锛屾寚瀹氭ā鍧椾笉瀛樺湪", ModuleEnum.REPORT.getValue()+"007"),
 	;
 
 	private String text;
diff --git a/src/main/java/com/product/server/report/controller/DataListReportController.java b/src/main/java/com/product/server/report/controller/DataListReportController.java
index 50fab3c..9b0cbaf 100644
--- a/src/main/java/com/product/server/report/controller/DataListReportController.java
+++ b/src/main/java/com/product/server/report/controller/DataListReportController.java
@@ -1,7 +1,5 @@
 package com.product.server.report.controller;
 
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.date.DateUtil;
 import com.product.core.config.CoreConst;
 import com.product.core.controller.support.AbstractBaseController;
 import com.product.core.entity.FieldSetEntity;
@@ -9,13 +7,10 @@
 import com.product.core.exception.BaseException;
 import com.product.core.spring.context.SpringMVCContextHolder;
 import com.product.module.data.config.CmnCode;
-import com.product.module.data.config.CmnConst;
-import com.product.module.data.service.SystemDataExportService;
 import com.product.module.sys.version.ApiVersion;
+import com.product.server.report.config.CmnConst;
 import com.product.server.report.config.ReportCode;
 import com.product.server.report.config.SystemCode;
-import com.product.server.report.entity.ReportColumn;
-import com.product.server.report.entity.ReportEntity;
 import com.product.server.report.service.DataListReportService;
 import com.product.util.BaseUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,12 +19,8 @@
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
 
-import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.util.List;
-import java.util.TimeZone;
-import java.util.stream.Collectors;
 
 /**
  * Copyright 漏 6c
@@ -89,7 +80,7 @@
 	 */
 	@RequestMapping(value = "/get-report/{version}", method = RequestMethod.POST)
 	@ApiVersion(1)
-	public String getReport(HttpServletRequest request) {
+	public String getTableInfo(HttpServletRequest request) {
 		try {
 			FieldSetEntity fse = null;
 			Object bean = request.getAttribute(CoreConst.API_POST_REQUEST_DATA);
@@ -101,7 +92,7 @@
 				SpringMVCContextHolder.getSystemLogger().error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
 				return this.error(SystemCode.SYSTEM_FORM_NODATA.getValue(), SystemCode.SYSTEM_FORM_NODATA.getText());
 			}
-			return BaseUtil.success(dataListReportService.getReportEntity(fse));
+			return BaseUtil.success(dataListReportService.getReport(fse));
 		} catch (BaseException e) {
 			SpringMVCContextHolder.getSystemLogger().error(e);
 			return this.error(e.getCode(), e.getMessageInfo());
@@ -128,8 +119,8 @@
 				fse.setValue(CmnConst.CPAGE, 1);
 				fse.setValue(CmnConst.PAGESIZE, Integer.MAX_VALUE);
 			}
-			 dataListReportService.outReportExcel(response,fse);
-				return OK();
+			dataListReportService.outReportExcel(response, fse);
+			return OK();
 		} catch (BaseException e) {
 			e.printStackTrace();
 			SpringMVCContextHolder.getSystemLogger().error(e);
@@ -140,5 +131,4 @@
 			return error(CmnCode.EXPORT_GENERAL_LIST_DATA_IMPORT_FIAL.getValue(), CmnCode.EXPORT_GENERAL_LIST_DATA_IMPORT_FIAL.getText() + e.getMessage());
 		}
 	}
-
 }
diff --git a/src/main/java/com/product/server/report/controller/ReportDatasourceController.java b/src/main/java/com/product/server/report/controller/ReportDatasourceController.java
index 02395f1..e321469 100644
--- a/src/main/java/com/product/server/report/controller/ReportDatasourceController.java
+++ b/src/main/java/com/product/server/report/controller/ReportDatasourceController.java
@@ -257,7 +257,7 @@
 			return OK_List(dt);
 		} catch (BaseException e) {
 			e.printStackTrace();
-			return this.error(e.getCode());
+			return this.error(e);
 		}  catch (Exception e) {
 			e.printStackTrace();
 			return this.error("", ReportCode.REPORT_DATASOURCE_ERROR.getText()+e.getMessage());
diff --git a/src/main/java/com/product/server/report/entity/ReportColumn.java b/src/main/java/com/product/server/report/entity/ReportColumn.java
index 94e1471..b904b74 100644
--- a/src/main/java/com/product/server/report/entity/ReportColumn.java
+++ b/src/main/java/com/product/server/report/entity/ReportColumn.java
@@ -13,9 +13,9 @@
  */
 public class ReportColumn {
 	//璺ㄥ垪
-	private int colspan = 1;
+	private String colspan = "1";
 	//璺ㄨ
-	private int rowspan = 1;
+	private String rowspan = "1";
 	//鍗曞厓鏍煎唴瀹�
 	private String content;
 	//绌块�忓瓧娈�
@@ -31,14 +31,30 @@
 
 	private Map<String, String> otherParams = new HashMap<>();
 
+	public ReportColumn() {
+	}
+
+	public ReportColumn(String content) {
+		this.content = content;
+	}
+
+	public ReportColumn(int colspan, int rowspan) {
+		this.colspan = String.valueOf(colspan);
+		this.rowspan = String.valueOf(rowspan);
+	}
+
+	public ReportColumn(String content, int colspan, int rowspan) {
+		this.content = content;
+		this.colspan = String.valueOf(colspan);
+		this.rowspan = String.valueOf(rowspan);
+	}
+
 	public void replace(String key, String value) {
 		if (!otherParams.isEmpty()) {
 			Map<String, String> otherParams = this.otherParams;
 			this.otherParams = new HashMap<>();
+
 			otherParams.forEach((k, v) -> {
-				if ("rowspan".equals(v) && NumberUtil.isNumber(value) && k.equals(key)) {
-					this.rowspan = NumberUtil.parseInt(value);
-				}
 				this.otherParams.put(k.replace(key, value), v.replace(key, value));
 			});
 		}
@@ -51,28 +67,49 @@
 		if (!StringUtils.isEmpty(content)) {
 			content = content.replace(key, value);
 		}
+		if (key.equals(this.colspan)) {
+			this.colspan = value;
+		}
+		if (key.equals(this.rowspan)) {
+			this.rowspan = value;
+		}
 	}
 
 	public void addProperty(String key, String value) {
 		otherParams.put(key, value);
 	}
 
-	public int getColspan() {
+	public String getColspan() {
 		return colspan;
 	}
 
 	public void setColspan(int colspan) {
+		this.colspan = String.valueOf(colspan);
+	}
+
+	public void setColspan(String colspan) {
 		this.colspan = colspan;
 	}
 
-	public int getRowspan() {
+	public String getRowspan() {
 		return rowspan;
 	}
 
-	public void setRowspan(int rowspan) {
+	public int getRowspanInt() {
+		return NumberUtil.parseInt(rowspan);
+	}
+	public int getColspanInt() {
+		return NumberUtil.parseInt(colspan);
+	}
+
+	public void setRowspan(String rowspan) {
 		this.rowspan = rowspan;
 	}
 
+	public void setRowspan(int rowspan) {
+		this.rowspan = String.valueOf(rowspan);
+	}
+
 	public String getContent() {
 		return getContent(false);
 	}
diff --git a/src/main/java/com/product/server/report/service/CommonReportService.java b/src/main/java/com/product/server/report/service/CommonReportService.java
index d5a3ac0..9415869 100644
--- a/src/main/java/com/product/server/report/service/CommonReportService.java
+++ b/src/main/java/com/product/server/report/service/CommonReportService.java
@@ -1,6 +1,5 @@
 package com.product.server.report.service;
 
-import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONObject;
@@ -14,9 +13,7 @@
 import com.product.core.spring.context.SpringMVCContextHolder;
 import com.product.server.report.config.CmnConst;
 import com.product.server.report.entity.ReportColumn;
-import com.product.server.report.entity.ReportEntity;
 import com.product.util.BaseUtil;
-import com.product.util.SystemParamReplace;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -34,92 +31,49 @@
 	@Autowired
 	private DataListReportService dataListReportService;
 
-	/**
-	 * 鎶ヨ〃-瑙f瀽
-	 *
-	 * @param recordDte           涓氬姟鏁版嵁dte
-	 * @param totalStatisticsFlag 鏄惁鍚堣鏍囪瘑
-	 * @param reportConfigMap     鎶ヨ〃閰嶇疆缂撳瓨map
-	 * @return
-	 */
-	public ReportEntity getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) {
-		ReportEntity report = null;
-		Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
-		// 鏁版嵁鍖�
-		report = getDataArea(reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
-
-		int totalColCount = reportConfigMap.get(0).size();
-
-		// 澶撮儴鏍囬鍖�
-		List<List<ReportColumn>> headTitleRows = null;
-		if (!reportConfigMap.get(1).isEmpty()) {
-			headTitleRows = dataListReportService.getTitle(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
-		}
-		// 搴曢儴鏍囬鍖�
-		List<List<ReportColumn>> tailTitleRows = null;
-		if (!reportConfigMap.get(3).isEmpty()) {
-			tailTitleRows = dataListReportService.getTitle(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
-		}
-
-		if (!CollectionUtil.isEmpty(headTitleRows)) {
-			List<List<ReportColumn>> reportHeader = report.getReportHeader();
-			if (reportHeader != null) {
-				headTitleRows.addAll(reportHeader);
-			}
-			report.setReportHeader(headTitleRows);
-		}
-		if (!CollectionUtil.isEmpty(tailTitleRows)) {
-			report.setReportTail(tailTitleRows);
-		}
-
-
-		return report;
-	}
 
 	/**
 	 * 鎶ヨ〃-瑙f瀽
 	 *
-	 * @param recordDte           涓氬姟鏁版嵁dte
-	 * @param totalStatisticsFlag 鏄惁鍚堣鏍囪瘑
-	 * @param reportConfigMap     鎶ヨ〃閰嶇疆缂撳瓨map
-	 * @param tableStyle
+	 * @param recordDte            涓氬姟鏁版嵁dte
+	 * @param totalName            鎬昏鍚嶇О
+	 * @param reportConfigMap      鎶ヨ〃閰嶇疆缂撳瓨map
+	 * @param unpivotInfoContainer 琛屽垪杞崲淇℃伅
 	 * @return
 	 */
-	public JSONObject getReport(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, StringBuilder tableStyle) {
-		StringBuilder reportHtml = new StringBuilder(4096);
-
-		// css
-		StringBuilder cssHtml = dataListReportService.getCssHtml();
+	public List<List<ReportColumn>>[] getReport(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, Collection<String> unpivotInfoContainer) {
+		List<List<ReportColumn>>[] reportColumnList = new List[]{new ArrayList(), new ArrayList(), new ArrayList()};
 
 		// 鏁版嵁鍖�
 		Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
-		String dataAreaHtml = getDataAreaHtml(reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
-
-		int totalColCount = reportConfigMap.get(0).size();
+		List<List<ReportColumn>> reportRows = getDataArea(reportConfigMap, headAndTailTitleDataMap, recordDte, totalName, unpivotInfoContainer);
+		int totalColCount = reportConfigMap.get(0).size() + unpivotInfoContainer.size() - 1;
 		// 澶撮儴鏍囬鍖�
-		StringBuilder headTitleHtml = null;
 		if (!reportConfigMap.get(1).isEmpty()) {
-			headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
+			reportColumnList[0] = (dataListReportService.getTitleRows(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head"));
 		}
-
+		//濡傛灉reportRows 琛屾暟澶т簬0灏嗙涓�琛岀殑鏁版嵁鏀惧叆澶撮儴鏍囬鍖�
+		if (reportRows.size() >= 0) {
+			reportColumnList[0].add(reportRows.get(0));
+			reportRows.remove(0);
+		}
+		reportColumnList[1] = reportRows;
 		// 搴曢儴鏍囬鍖�
-		StringBuilder tailTitleHtml = null;
 		if (!reportConfigMap.get(3).isEmpty()) {
-			tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
+			reportColumnList[2] = (dataListReportService.getTitleRows(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail"));
 		}
 
-		reportHtml.append("\n<body>\n<table class=\"report_main\"").append(tableStyle).append(">")
-				.append(cssHtml)
-				.append(headTitleHtml == null ? "" : headTitleHtml)
-				.append(dataAreaHtml)
-				.append(tailTitleHtml == null ? "" : tailTitleHtml)
-				.append("\n</table>\n</body>");
-
-		JSONObject resultObj = new JSONObject();
-		resultObj.put(CmnConst.RETURN_ATTR_RESULT, true);
-		resultObj.put(CmnConst.RETURN_ATTR_MESSAGE, "鑾峰彇鎶ヨ〃鎴愬姛锛�");
-		resultObj.put(CmnConst.RETURN_ATTR_HTML, reportHtml);
-		return resultObj;
+//		reportHtml.append("\n<body>\n<table class=\"report_main\"").append(tableStyle).append(">")
+//				.append(headTitleHtml == null ? "" : headTitleHtml)
+//				.append(dataAreaHtml)
+//				.append(tailTitleHtml == null ? "" : tailTitleHtml)
+//				.append("\n</table>\n</body>");
+//
+//		JSONObject resultObj = new JSONObject();
+//		resultObj.put(CmnConst.RETURN_ATTR_RESULT, true);
+//		resultObj.put(CmnConst.RETURN_ATTR_MESSAGE, "鑾峰彇鎶ヨ〃鎴愬姛锛�");
+//		resultObj.put(CmnConst.RETURN_ATTR_HTML, reportHtml);
+		return reportColumnList;
 	}
 
 	/**
@@ -131,7 +85,8 @@
 	 * @param totalName               鎬昏鍚嶇О锛岄潪绌�-闇�瑕佹�昏
 	 * @return
 	 */
-	private String getDataAreaHtml(Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
+	private List<List<ReportColumn>> getDataArea(Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName, Collection<String> unpivotInfoContainer) {
+		List<List<ReportColumn>> reportColumnList = Lists.newArrayList();
 		// 鏁版嵁鍖哄瓧娈电紦瀛榤ap
 		Map<String, JSONObject> dataAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(0));
 		// 鑾峰彇鎸囧畾鏁版嵁闆嗕腑鍖呭惈鐨勬暟鎹尯瀛楁闆嗗悎
@@ -141,358 +96,42 @@
 		// 缁熻map
 		Map<JSONObject, JSONObject> statisticsMap = Maps.newLinkedHashMap();
 
-		StringBuilder dataAreaHtml = new StringBuilder(1024);
-		// 鏍囬
-		dataAreaHtml.append(getDataAreaTitleHtml(dataAreaFieldConfigMap));
-		// 鍐呭
-		dataAreaHtml.append(getDataAreaDataHtml(dataAreaFieldConfigMap, recordDte, headAndTailTitleDataMap, headAndTailFieldSet, statisticsMap, totalName));
-		return dataAreaHtml.toString();
-	}
-
-	private ReportEntity getDataArea(Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
-		// 鏁版嵁鍖哄瓧娈电紦瀛榤ap
-		Map<String, JSONObject> dataAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(0));
-		// 鑾峰彇鎸囧畾鏁版嵁闆嗕腑鍖呭惈鐨勬暟鎹尯瀛楁闆嗗悎
-		Set<String> headAndTailFieldSet = Sets.newHashSet();
-		headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(1)));
-		headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(3)));
-		// 缁熻map
-		Map<JSONObject, JSONObject> statisticsMap = Maps.newLinkedHashMap();
-		List<ReportColumn> reportHeader = getReportHeader(dataAreaFieldConfigMap);
-		List<List<ReportColumn>> reportData = getReportData(dataAreaFieldConfigMap, recordDte, headAndTailTitleDataMap, headAndTailFieldSet, statisticsMap, totalName);
-		ReportEntity report = new ReportEntity();
-		report.addReportHeader(reportHeader);
-		report.setReportData(reportData);
-		return report;
-	}
-
-	private List<ReportColumn> getReportHeader(Map<String, JSONObject> dataAreaFieldConfigMap) {
-		if (CollectionUtil.isEmpty(dataAreaFieldConfigMap)) {
-			return null;
+		// 灏嗚鍒楄浆鎹㈢殑淇℃伅娣诲姞鍒版暟鎹尯瀛楁缂撳瓨map閲岄潰
+		Map<String, JSONObject> newDataAreaFieldConfigMap = Maps.newLinkedHashMap();
+		int x = 0;
+		if (!unpivotInfoContainer.isEmpty()) {
+			for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
+				String fieldName = entry.getKey();
+				JSONObject fieldConfigObj = entry.getValue();
+				if (fieldConfigObj.getIntValue(CmnConst.IS_UNPIVOT) == 1) {
+					x = fieldConfigObj.getIntValue(CmnConst.ATTR_X);
+					fieldConfigObj.put(CmnConst.IS_UNPIVOT, 0);
+					fieldConfigObj.put(CmnConst.ATTR_IS_CUSTOM_FIELD, 0);
+					for (String unpivotField : unpivotInfoContainer) {
+						JSONObject newFieldConfigObj = new JSONObject();
+						newFieldConfigObj.putAll(fieldConfigObj);
+						newFieldConfigObj.put(CmnConst.ATTR_X, ++x);
+						newFieldConfigObj.put(CmnConst.ATTR_SHOW_NAME, newFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME).replace("{#unpivot_name#}", unpivotField));
+						newDataAreaFieldConfigMap.put(unpivotField, newFieldConfigObj);
+					}
+				} else {
+					if (x > fieldConfigObj.getIntValue(CmnConst.ATTR_X)) {
+						fieldConfigObj.put(CmnConst.ATTR_X, ++x);
+					}
+					newDataAreaFieldConfigMap.put(fieldName, fieldConfigObj);
+				}
+			}
+		} else {
+			newDataAreaFieldConfigMap = dataAreaFieldConfigMap;
 		}
-		List<ReportColumn> reportColumnList = new ArrayList<>();
-		dataAreaFieldConfigMap.forEach((k, v) -> {
-			ReportColumn column = new ReportColumn();
-			column.setContent(v.getString(CmnConst.ATTR_SHOW_NAME));
-			column.setColumnWidth(NumberUtil.isNumber(v.getString(CmnConst.ATTR_WIDTH)) ? NumberUtil.parseInt(v.getString(CmnConst.ATTR_WIDTH)) : 0);
-			reportColumnList.add(column);
-		});
+
+		// 鏍囬
+		reportColumnList.add(getDataAreaTitle(newDataAreaFieldConfigMap));
+		// 鍐呭
+		List<List<ReportColumn>> dataAreaData = getDataAreaData(newDataAreaFieldConfigMap, recordDte, headAndTailTitleDataMap, headAndTailFieldSet, statisticsMap, totalName);
+		reportColumnList.addAll(dataAreaData);
 		return reportColumnList;
 	}
-
-	private List<List<ReportColumn>> getReportData(Map<String, JSONObject> dataAreaFieldConfigMap, DataTableEntity recordDte, Map<String, Set<String>> headAndTailTitleDataMap, Set<String> headAndTailFieldSet, Map<JSONObject, JSONObject> statisticsMap, String totalName) {
-		List<List<ReportColumn>> reportData = new ArrayList<>();
-		// 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist
-		List<String> dataAreaGroupStatisticsFieldNameList = Lists.newArrayList();
-		// 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
-		List<String> dataAreaGroupFieldNameList = Lists.newArrayList();
-		dataAreaFieldConfigMap.forEach((dataAreaFieldName, dataAreaFieldConfigObj) -> {
-			if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) {
-				dataAreaGroupFieldNameList.add(dataAreaFieldName);
-				if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) {
-					dataAreaGroupStatisticsFieldNameList.add(dataAreaFieldName);
-				}
-			}
-		});
-
-		FieldSetEntity recordFse;
-		FieldSetEntity preFse = null;
-		String dataAreaFieldName;
-		JSONObject dataAreaFieldConfigObj;
-		String value;
-		JSONObject keyObj;
-		Map<String, String> replaceMap = Maps.newHashMap();
-		Map<String, String> dataAreaClosestGroupStatisticsFieldValueMap = Maps.newHashMap();
-		Map<String, String> dataAreaClosestGroupFieldValueMap = Maps.newHashMap();
-		String closestGroupStatisticsFieldName = null;
-		String closestGroupFieldName = null;
-		String tempFieldName;
-		String paramKey;
-		boolean combineFlag;
-		JSONObject dataAreaGroupFieldRecordObj = new JSONObject();
-		for (int i = 0; i < recordDte.getRows(); i++) {
-			recordFse = recordDte.getFieldSetEntity(i);
-			// 鑾峰彇澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁
-			dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse);
-
-			combineFlag = true;
-
-			List<ReportColumn> columns = new ArrayList<>();
-			for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
-				ReportColumn column = new ReportColumn();
-				dataAreaFieldName = entry.getKey();
-				dataAreaFieldConfigObj = entry.getValue();
-				value = dataListReportService.getValue(dataAreaFieldConfigObj, recordFse, dataAreaFieldName);
-				// 鑻ユ槸鑷畾涔夊瓧娈碉紝鍒欐斁鍏ヤ笟鍔℃暟鎹褰曚腑
-				if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD))) {
-					recordFse.setValue(dataAreaFieldName, value);
-				}
-				if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) {
-					int curFieldIndex = dataAreaGroupFieldNameList.indexOf(dataAreaFieldName);
-					// 璁板綍鍒嗙粍瀛楁
-					recordDataAreaGroupField(dataAreaGroupFieldRecordObj, dataAreaGroupFieldNameList, curFieldIndex, recordFse);
-
-					// 鍒嗙粍鍚堝瓧娈靛苟
-					closestGroupFieldName = dataAreaFieldName;
-					if (preFse != null && combineFlag) {
-						if (value.equals(dataAreaClosestGroupFieldValueMap.get(closestGroupFieldName))) {
-							dealReplaceMapAddRowspan(replaceMap, dataAreaGroupFieldNameList.subList(0, curFieldIndex + 1), preFse, true);
-							continue;
-						} else {
-							combineFlag = false;
-						}
-					}
-					dataAreaClosestGroupFieldValueMap.put(dataAreaFieldName, value);
-				}
-				// 鍒嗙粍缁熻
-				if (dataAreaGroupStatisticsFieldNameList.contains(dataAreaFieldName)) {
-					int minK = dataAreaGroupStatisticsFieldNameList.size();
-					for (int j = 0; j < dataAreaGroupStatisticsFieldNameList.size(); j++) {
-						tempFieldName = dataAreaGroupStatisticsFieldNameList.get(j);
-						if (!StringUtils.isEmpty(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName)) && !recordFse.getString(tempFieldName).equals(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName))) {
-							minK = j;
-							break;
-						}
-					}
-					for (int k = dataAreaGroupStatisticsFieldNameList.size() - 1; k >= minK; k--) {
-						tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k);
-						if (preFse != null && dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName) != null) {
-							reportData.add(getDataAreaGroupStatisticsFieldStatisticsRow(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj));
-							dataAreaClosestGroupStatisticsFieldValueMap.remove(tempFieldName);
-						}
-					}
-					closestGroupStatisticsFieldName = dataAreaFieldName;
-					dataAreaClosestGroupStatisticsFieldValueMap.put(dataAreaFieldName, value);
-				}
-				// 闈炲垎缁勭粺璁″瓧娈碉紙鏅��+鑷畾涔夛級
-				if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP)) && !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS))) {
-					addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value);
-				}
-				// 鑷畾涔夌粺璁″瓧娈碉紙鏈寚瀹氱粺璁$被鍨嬶紝浣跨敤鍩虹瀛楁鍏紡杩涜璁$畻锛�
-				if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD))
-						&& StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS))
-						&& !StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA))) {
-					String formula = dataAreaFieldConfigObj.getString(CmnConst.ATTR_FORMULA);
-					List<String> formFieldList = dataListReportService.getSuitContent(formula, CmnConst.REGEXP_FORM_FIELD);
-					Map<String, String> formulaMap = Maps.newHashMap();
-					boolean statisticsFlag = true;
-					JSONObject tempObj;
-					for (String formFieldInfo : formFieldList) {
-						tempObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(formFieldInfo));
-						if (tempObj == null || StringUtils.isEmpty(tempObj.getString(CmnConst.ATTR_STATISTICS))) {
-							statisticsFlag = false;
-							break;
-						}
-						formulaMap.put(formFieldInfo, tempObj.getString(CmnConst.ATTR_STATISTICS));
-					}
-					if (statisticsFlag) {
-						addStatisticsRowInfo(statisticsMap, dataAreaGroupStatisticsFieldNameList, recordFse, dataAreaFieldConfigObj, dataAreaFieldName, value, formulaMap);
-					}
-				}
-				if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) {
-					keyObj = new JSONObject();
-					for (String dataAreaGroupFieldName : dataAreaGroupFieldNameList) {
-						keyObj.put(dataAreaGroupFieldName, recordFse.getString(dataAreaGroupFieldName));
-						if (dataAreaGroupFieldName.equals(dataAreaFieldName)) {
-							keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaGroupFieldName));
-							break;
-						}
-					}
-					paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN);
-					if (NumberUtil.isNumber(paramKey)) {
-						column.setRowspan(NumberUtil.parseInt(paramKey));
-					} else {
-						column.addProperty(paramKey, "rowspan");
-					}
-					replaceMap.put(paramKey, "1");
-				}
-				// class
-				if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
-					//瀛愭姤琛�
-					String url = dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL);
-					url = SystemParamReplace.replaceParams(url, recordFse);
-					column.setSubReport("true".equals(dataAreaFieldConfigObj.getString("~isSubReport~")));
-					if (!column.isSubReport()) {
-						column.setPenetrate(true);
-						column.setPenetrateProperty(url);
-					} else {
-						column.setSubReportProperty(url);
-					}
-				}
-				String attrValue = recordFse.getString(dataAreaFieldName + CmnConst.PROMPT_REAL_VALUE_TAIL);
-				if (StringUtils.isEmpty(attrValue)) {
-					attrValue = recordFse.getString(dataAreaFieldName);
-				}
-				column.addProperty(dataAreaFieldName, attrValue);
-				// 鏍煎紡
-				value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
-				column.setContent(value);
-				columns.add(column);
-			}
-			reportData.add(columns);
-			preFse = recordFse;
-		}
-
-		// 琛ュ叏鏈熬缁熻
-		if (!StringUtils.isEmpty(closestGroupStatisticsFieldName)) {
-			int maxK = -1;
-			for (int j = 0; j < dataAreaGroupStatisticsFieldNameList.size(); j++) {
-				tempFieldName = dataAreaGroupStatisticsFieldNameList.get(j);
-				if (closestGroupStatisticsFieldName.equals(tempFieldName)) {
-					maxK = j;
-				}
-			}
-			for (int k = maxK; k >= 0; k--) {
-				tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k);
-				if (preFse != null) {
-					reportData.add(getDataAreaGroupStatisticsFieldStatisticsRow(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj));
-				}
-			}
-		}
-
-		// 鎬昏
-		if (!StringUtils.isEmpty(totalName)) {
-			reportData.add(getDataAreaTotalStatistics(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName));
-		}
-		reportData.stream().forEach(item -> {
-			item.stream().forEach(column -> {
-				for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
-					column.replace(entry.getKey(), entry.getValue());
-				}
-			});
-		});
-
-
-		return reportData;
-	}
-
-	/**
-	 * 鑾峰彇鎬昏琛�
-	 *
-	 * @param statisticsMap               缁熻map
-	 * @param dataAreaFieldConfigMap      鏁版嵁鍖哄瓧娈电紦瀛榤ap
-	 * @param dataAreaGroupFieldNameList  鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
-	 * @param preFse                      鏈�杩戞搷浣滅殑鏁版嵁fse
-	 * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj
-	 * @param totalName                   鎬昏鍚嶇О
-	 * @return
-	 */
-	private List<ReportColumn> getDataAreaTotalStatistics(Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, List<String> dataAreaGroupFieldNameList, FieldSetEntity preFse, JSONObject dataAreaGroupFieldRecordObj, String totalName) {
-		List<ReportColumn> columns = new ArrayList<>();
-//		StringBuilder html = new StringBuilder(512);
-		String dataAreaFieldName;
-		JSONObject dataAreaFieldConfigObj;
-		String value;
-		JSONObject keyObj = new JSONObject();
-		String statisticsType;
-//		html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
-		if (preFse == null) {
-			return null;
-		}
-		int index = 0;
-		for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
-			ReportColumn column = new ReportColumn();
-			index++;
-			dataAreaFieldName = entry.getKey();
-			if (!dataAreaGroupFieldNameList.contains(dataAreaFieldName)) {
-				dataAreaFieldConfigObj = entry.getValue();
-				statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS);
-				keyObj.put(CmnConst.ATTR_FIELD_INFO, dataAreaFieldConfigObj.getString(CmnConst.ATTR_FIELD_INFO));
-				if ((!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) || statisticsMap.get(keyObj) == null) {
-					value = "";
-				} else {
-					JSONObject valueObj = statisticsMap.get(keyObj);
-					if (StringUtils.isEmpty(statisticsType)) {
-						statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT;
-					}
-					if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) {
-						int subCnt = dataAreaGroupFieldRecordObj.size();
-						valueObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt);
-						dataListReportService.getAvgValue(valueObj, dataAreaFieldConfigObj, false);
-					}
-					value = valueObj.getString(statisticsType);
-				}
-				// 鏍煎紡
-				value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
-				column.setContent(value);
-//				html.append("<td>").append(value == null ? "" : value).append("</td>");
-			} else {
-				if (index == 1) {
-					column.setColspan(dataAreaGroupFieldNameList.size());
-					column.setContent(totalName);
-//					html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size()).append("\">").append(totalName).append("</td>");
-				}
-			}
-			columns.add(column);
-		}
-//		html.append("\n</tr>");
-		return columns;
-	}
-
-	private List<ReportColumn> getDataAreaGroupStatisticsFieldStatisticsRow(String waitStatisticsValue, Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap,
-																			String tempFieldName, FieldSetEntity recordFse, List<String> dataAreaGroupFieldNameList, Map<String, String> replaceMap, JSONObject dataAreaGroupFieldRecordObj) {
-		List<ReportColumn> columns = new ArrayList<>();
-//		StringBuilder html = new StringBuilder();
-//		html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
-		String dataAreaFieldName;
-		JSONObject dataAreaFieldConfigObj;
-		boolean flag = false;
-		JSONObject keyObj = new JSONObject();
-		String value;
-		String statisticsType;
-		int index = 0;
-		List<String> needAddRowspanDataAreaGroupFieldNameList = Lists.newArrayList();
-		for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
-			ReportColumn column = new ReportColumn();
-			index++;
-			dataAreaFieldName = entry.getKey();
-			if (!flag) {
-				if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) {
-					keyObj.put(dataAreaFieldName, recordFse.getString(dataAreaFieldName));
-					if (dataAreaFieldName.equals(tempFieldName)) {
-						column.setColspan(dataAreaGroupFieldNameList.size() - index + 1);
-						column.setContent(waitStatisticsValue + CmnConst.STATISTICS_NAME);
-					}
-					if (!flag) {
-						needAddRowspanDataAreaGroupFieldNameList.add(dataAreaFieldName);
-					}
-				}
-			} else {
-				dataAreaFieldConfigObj = entry.getValue();
-				statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS);
-				if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) {
-					if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) {
-//						html.append("<td></td>");
-					}
-				} else {
-					keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName));
-					if (statisticsMap.get(keyObj) == null) {
-						value = "";
-					} else {
-						JSONObject valueObj = statisticsMap.get(keyObj);
-						if (StringUtils.isEmpty(statisticsType)) {
-							statisticsType = CmnConst.ATTR_STATISTICS_DEFAULT;
-						}
-						if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) {
-							int subCnt = getAimSubCnt(keyObj, dataAreaGroupFieldNameList, dataAreaGroupFieldRecordObj);
-							valueObj.put(CmnConst.ATTR_STATISTICS_SUB_CNT, subCnt);
-							dataListReportService.getAvgValue(valueObj, dataAreaFieldConfigObj, false);
-						}
-						value = valueObj.getString(statisticsType);
-					}
-					// 鏍煎紡
-					value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
-					column.setContent(value);
-//					html.append("<td>").append(value == null ? "" : value).append("</td>");
-				}
-			}
-			columns.add(column);
-		}
-//		html.append("\n</tr>");
-		dealReplaceMapAddRowspan(replaceMap, needAddRowspanDataAreaGroupFieldNameList, recordFse, false);
-		return null;
-	}
-
 
 	/**
 	 * 鑾峰彇鏍囬
@@ -500,14 +139,20 @@
 	 * @param dataAreaFieldConfigMap 鏁版嵁鍖哄瓧娈电紦瀛榤ap
 	 * @return
 	 */
-	private StringBuilder getDataAreaTitleHtml(Map<String, JSONObject> dataAreaFieldConfigMap) {
-		StringBuilder html = new StringBuilder(256);
-		html.append("<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">");
+	private List<ReportColumn> getDataAreaTitle(Map<String, JSONObject> dataAreaFieldConfigMap) {
+		List<ReportColumn> columnRow = new ArrayList<>();
 		dataAreaFieldConfigMap.forEach((dataAreaFieldName, dataAreaFieldConfigObj) -> {
-			html.append("<td>").append(dataListReportService.dealTdWidth(dataAreaFieldConfigObj, dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME))).append("</td>");
+			ReportColumn column = new ReportColumn();
+			column.setContent(dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME));
+			String width = dataAreaFieldConfigObj.getString(CmnConst.ATTR_WIDTH);
+			//鍒ゆ柇瀹藉害鏄惁涓虹┖骞朵笖鏄暟瀛楋紙姝f暣鏁板拰灏忔暟閮藉彲浠ワ級
+			if (StringUtils.isNotBlank(width) && width.matches("^[0-9]+(.[0-9]+)?$")) {
+				//灏嗗搴﹁浆鎹负double绫诲瀷
+				column.setColumnWidth(NumberUtil.parseInt(width));
+			}
+			columnRow.add(column);
 		});
-		html.append("</tr>");
-		return html;
+		return columnRow;
 	}
 
 	/**
@@ -520,7 +165,8 @@
 	 * @param totalName              鎬昏鍚嶇О
 	 * @return
 	 */
-	private String getDataAreaDataHtml(Map<String, JSONObject> dataAreaFieldConfigMap, DataTableEntity recordDte, Map<String, Set<String>> headAndTailTitleDataMap, Set<String> headAndTailFieldSet, Map<JSONObject, JSONObject> statisticsMap, String totalName) {
+	private List<List<ReportColumn>> getDataAreaData(Map<String, JSONObject> dataAreaFieldConfigMap, DataTableEntity recordDte, Map<String, Set<String>> headAndTailTitleDataMap, Set<String> headAndTailFieldSet, Map<JSONObject, JSONObject> statisticsMap, String totalName) {
+		List<List<ReportColumn>> reportColumnList = Lists.newArrayList();
 		// 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist
 		List<String> dataAreaGroupStatisticsFieldNameList = Lists.newArrayList();
 		// 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
@@ -534,8 +180,9 @@
 			}
 		});
 
-		StringBuilder dataAreaDataHtml = new StringBuilder(1024);
-		StringBuilder curRowHtml = new StringBuilder(256);
+//		StringBuilder dataAreaDataHtml = new StringBuilder(1024);
+//		StringBuilder curRowHtml = new StringBuilder(256);
+		List<ReportColumn> curRowColumn = new ArrayList<>();
 		FieldSetEntity recordFse;
 		FieldSetEntity preFse = null;
 		String dataAreaFieldName;
@@ -550,15 +197,18 @@
 		String tempFieldName;
 		String paramKey;
 		boolean combineFlag;
+		ReportColumn currentColumn = new ReportColumn();
 		JSONObject dataAreaGroupFieldRecordObj = new JSONObject();
 		for (int i = 0; i < recordDte.getRows(); i++) {
 			recordFse = recordDte.getFieldSetEntity(i);
 			// 鑾峰彇澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁
 			dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse);
 
-			curRowHtml.setLength(0);
+//			curRowHtml.setLength(0);
+			curRowColumn = new ArrayList<>();
+
 			String rowUuid = IdUtil.simpleUUID();
-			curRowHtml.append("\n<tr rowIndex=\"" + (i + 1) + "\" id=\"" + rowUuid + "\" class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
+//			curRowHtml.append("\n<tr rowIndex=\"" + (i + 1) + "\" id=\"" + rowUuid + "\" class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
 			combineFlag = true;
 			for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
 				dataAreaFieldName = entry.getKey();
@@ -598,7 +248,7 @@
 					for (int k = dataAreaGroupStatisticsFieldNameList.size() - 1; k >= minK; k--) {
 						tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k);
 						if (preFse != null && dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName) != null) {
-							dataAreaDataHtml.append(getDataAreaGroupStatisticsFieldStatisticsRowHtml(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj));
+							reportColumnList.add(getDataAreaGroupStatisticsFieldStatisticsRow(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj));
 							dataAreaClosestGroupStatisticsFieldValueMap.remove(tempFieldName);
 						}
 					}
@@ -640,28 +290,55 @@
 						}
 					}
 					paramKey = dataListReportService.concat(keyObj, CmnConst.ATTR_ROWSPAN);
-					curRowHtml.append("<td rowspan=\"").append(paramKey).append("\"");
+//					curRowHtml.append("<td rowspan=\"").append(paramKey).append("\"");
+					currentColumn.setRowspan(paramKey);
 					replaceMap.put(paramKey, "1");
-				} else {
-					curRowHtml.append("<td");
 				}
+//				else {
+//					curRowHtml.append("<td");
+//				}
 				// class
 				if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
-					curRowHtml.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("true".equals(dataAreaFieldConfigObj.getString("~isSubReport~")) ? "\"skipSubReport=true" : "\"").append(" router=\"").append(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL)).append("\"");
+					currentColumn.setSubReport("true".equals(dataAreaFieldConfigObj.getString("~isSubReport~")));
+					if (!currentColumn.isSubReport()) {
+						currentColumn.setPenetrate(true);
+						currentColumn.setPenetrateProperty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL));
+					} else {
+						currentColumn.setSubReportProperty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL));
+					}
+//					curRowHtml.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("true".equals(dataAreaFieldConfigObj.getString("~isSubReport~")) ? "\"skipSubReport=true" : "\"").append(" router=\"").append(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL)).append("\"");
 				}
 				String attrValue = recordFse.getString(dataAreaFieldName + CmnConst.PROMPT_REAL_VALUE_TAIL);
 				if (StringUtils.isEmpty(attrValue)) {
 					attrValue = recordFse.getString(dataAreaFieldName);
 				}
-				curRowHtml.append(" ").append(dataAreaFieldName).append("=\"").append(attrValue).append("\"");
-				curRowHtml.append(">");
+				if (!dataAreaFieldName.matches("\\d+")) {
+					currentColumn.addProperty(dataAreaFieldName, attrValue);
+//					curRowHtml.append(" ").append(dataAreaFieldName).append("=\"").append(attrValue).append("\"");
+				}
+				// 瑙f瀽绌块�忓弬鏁�
+				String urlParam = dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL_PARAM);
+				String attrParam;
+				if (!StringUtils.isEmpty(urlParam)) {
+					List<String> suitFieldList = BaseUtil.getSuitContent(urlParam, "\\{#\\w+#\\}");
+					for (String singleSuitFieldName : suitFieldList) {
+						attrParam = singleSuitFieldName.substring(2, singleSuitFieldName.length() - 2);
+						currentColumn.addProperty(attrParam, recordFse.getString(attrParam));
+//						curRowHtml.append(" ").append(attrParam).append("=\"").append(recordFse.getString(attrParam)).append("\"");
+					}
+				}
+//				curRowHtml.append(">");
 				// 鏍煎紡
 				value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
-				curRowHtml.append(value == null ? "" : value);
-				curRowHtml.append("</td>");
+//				curRowHtml.append(value == null ? "" : value);
+//				curRowHtml.append("</td>");
+				currentColumn.setContent(value);
+				curRowColumn.add(currentColumn);
+				currentColumn = new ReportColumn();
 			}
-			curRowHtml.append("\n</tr>");
-			dataAreaDataHtml.append(curRowHtml);
+//			curRowHtml.append("\n</tr>");
+//			dataAreaDataHtml.append(curRowHtml);
+			reportColumnList.add(curRowColumn);
 			preFse = recordFse;
 		}
 
@@ -677,22 +354,34 @@
 			for (int k = maxK; k >= 0; k--) {
 				tempFieldName = dataAreaGroupStatisticsFieldNameList.get(k);
 				if (preFse != null) {
-					dataAreaDataHtml.append(getDataAreaGroupStatisticsFieldStatisticsRowHtml(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj));
+					reportColumnList.add(getDataAreaGroupStatisticsFieldStatisticsRow(dataAreaClosestGroupStatisticsFieldValueMap.get(tempFieldName), statisticsMap, dataAreaFieldConfigMap, tempFieldName, preFse, dataAreaGroupFieldNameList, replaceMap, dataAreaGroupFieldRecordObj));
 				}
 			}
 		}
 
 		// 鎬昏
 		if (!StringUtils.isEmpty(totalName)) {
-			dataAreaDataHtml.append(getDataAreaTotalStatisticsHtml(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName));
+			List<ReportColumn> reportColumns = getDataAreaTotalStatisticsRow(statisticsMap, dataAreaFieldConfigMap, dataAreaGroupFieldNameList, preFse, dataAreaGroupFieldRecordObj, totalName);
+			if (reportColumns != null && reportColumns.size() > 0) {
+				reportColumnList.add(reportColumns);
+			}
+		}
+		//寰幆鎵�鏈夌殑column杩涜鍙傛暟鏇挎崲
+		for (List<ReportColumn> reportColumns : reportColumnList) {
+			if (reportColumns != null) {
+				for (ReportColumn reportColumn : reportColumns) {
+					if (reportColumn != null) {
+
+						for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
+							reportColumn.replace(entry.getKey(), entry.getValue());
+						}
+					}
+				}
+
+			}
 		}
 
-		String str = dataAreaDataHtml.toString();
-		for (Map.Entry<String, String> entry : replaceMap.entrySet()) {
-			str = str.replace(entry.getKey(), entry.getValue());
-		}
-
-		return str;
+		return reportColumnList;
 	}
 
 	/**
@@ -781,10 +470,9 @@
 	 * @param dataAreaGroupFieldRecordObj 鏁版嵁鍖哄垎缁勫瓧娈佃褰昽bj
 	 * @return
 	 */
-	private StringBuilder getDataAreaGroupStatisticsFieldStatisticsRowHtml(String waitStatisticsValue, Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap,
-																		   String tempFieldName, FieldSetEntity recordFse, List<String> dataAreaGroupFieldNameList, Map<String, String> replaceMap, JSONObject dataAreaGroupFieldRecordObj) {
-		StringBuilder html = new StringBuilder();
-		html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
+	private List<ReportColumn> getDataAreaGroupStatisticsFieldStatisticsRow(String waitStatisticsValue, Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap,
+																			String tempFieldName, FieldSetEntity recordFse, List<String> dataAreaGroupFieldNameList, Map<String, String> replaceMap, JSONObject dataAreaGroupFieldRecordObj) {
+		List<ReportColumn> columnRow = new ArrayList<>();
 		String dataAreaFieldName;
 		JSONObject dataAreaFieldConfigObj;
 		boolean flag = false;
@@ -800,8 +488,12 @@
 				if (dataAreaGroupFieldNameList.contains(dataAreaFieldName)) {
 					keyObj.put(dataAreaFieldName, recordFse.getString(dataAreaFieldName));
 					if (dataAreaFieldName.equals(tempFieldName)) {
-						html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size() - index + 1).append("\">").append(waitStatisticsValue).append(CmnConst.STATISTICS_NAME).append("</td>");
+						ReportColumn column = new ReportColumn();
+						column.setColspan(dataAreaGroupFieldNameList.size() - index + 1);
+						column.setContent(waitStatisticsValue);
+//						html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size() - index + 1).append("\">").append(waitStatisticsValue).append(CmnConst.STATISTICS_NAME).append("</td>");
 						flag = true;
+						columnRow.add(column);
 					}
 					if (!flag) {
 						needAddRowspanDataAreaGroupFieldNameList.add(dataAreaFieldName);
@@ -812,7 +504,8 @@
 				statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS);
 				if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_CUSTOM_FIELD)) && StringUtils.isEmpty(statisticsType)) {
 					if (!"1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) {
-						html.append("<td></td>");
+//						html.append("<td></td>");
+						columnRow.add(new ReportColumn());
 					}
 				} else {
 					keyObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName));
@@ -832,13 +525,13 @@
 					}
 					// 鏍煎紡
 					value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
-					html.append("<td>").append(value == null ? "" : value).append("</td>");
+//					html.append("<td>").append(value == null ? "" : value).append("</td>");
+					columnRow.add(new ReportColumn(value == null ? "" : value));
 				}
 			}
 		}
-		html.append("\n</tr>");
 		dealReplaceMapAddRowspan(replaceMap, needAddRowspanDataAreaGroupFieldNameList, recordFse, false);
-		return html;
+		return columnRow;
 	}
 
 	/**
@@ -852,16 +545,16 @@
 	 * @param totalName                   鎬昏鍚嶇О
 	 * @return
 	 */
-	private String getDataAreaTotalStatisticsHtml(Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, List<String> dataAreaGroupFieldNameList, FieldSetEntity preFse, JSONObject dataAreaGroupFieldRecordObj, String totalName) {
-		StringBuilder html = new StringBuilder(512);
+	private List<ReportColumn> getDataAreaTotalStatisticsRow(Map<JSONObject, JSONObject> statisticsMap, Map<String, JSONObject> dataAreaFieldConfigMap, List<String> dataAreaGroupFieldNameList, FieldSetEntity preFse, JSONObject dataAreaGroupFieldRecordObj, String totalName) {
+		List<ReportColumn> reportColumns = new ArrayList<>();
 		String dataAreaFieldName;
 		JSONObject dataAreaFieldConfigObj;
 		String value;
 		JSONObject keyObj = new JSONObject();
 		String statisticsType;
-		html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
+//		html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
 		if (preFse == null) {
-			return html.toString();
+			return null;
 		}
 		int index = 0;
 		for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
@@ -887,15 +580,17 @@
 				}
 				// 鏍煎紡
 				value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
-				html.append("<td>").append(value == null ? "" : value).append("</td>");
+				reportColumns.add(new ReportColumn(value == null ? "" : value));
 			} else {
 				if (index == 1) {
-					html.append("<td colspan=\"").append(dataAreaGroupFieldNameList.size()).append("\">").append(totalName).append("</td>");
+					ReportColumn column = new ReportColumn();
+					column.setColspan(dataAreaGroupFieldNameList.size());
+					column.setContent(totalName);
+					reportColumns.add(column);
 				}
 			}
 		}
-		html.append("\n</tr>");
-		return html.toString();
+		return reportColumns;
 	}
 
 	/**
diff --git a/src/main/java/com/product/server/report/service/DataListReportService.java b/src/main/java/com/product/server/report/service/DataListReportService.java
index e8f226b..adc1c2b 100644
--- a/src/main/java/com/product/server/report/service/DataListReportService.java
+++ b/src/main/java/com/product/server/report/service/DataListReportService.java
@@ -1,8 +1,6 @@
 package com.product.server.report.service;
 
 import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DateTime;
-import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
@@ -26,8 +24,13 @@
 import com.product.server.report.config.ReportCode;
 import com.product.server.report.entity.ReportColumn;
 import com.product.server.report.entity.ReportEntity;
+import com.product.server.report.util.QuerySqlParseUtil;
 import com.product.util.BaseUtil;
 import com.product.util.SystemParamReplace;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -66,7 +69,7 @@
 	private SystemDataExportService exportService;
 
 	public void outReportExcel(HttpServletResponse response, FieldSetEntity fse) throws BaseException, IOException {
-		ReportEntity reportEntity = getReportEntity(fse);
+		ReportEntity reportEntity = getReport(fse);
 		List<List<ReportColumn>> reportHeader = reportEntity.getReportHeader();
 
 		List<List<String>> headerTemp = processingMergeData(reportHeader);
@@ -97,9 +100,9 @@
 			List<ReportColumn> columns = data.get(i);
 			for (ReportColumn column : columns) {
 				//璺ㄨ
-				int rowspan = column.getRowspan() < 1 ? 1 : column.getRowspan();
+				int rowspan = column.getRowspanInt() < 1 ? 1 : column.getRowspanInt();
 				//璺ㄥ垪
-				int colspan = column.getColspan() < 1 ? 1 : column.getColspan();
+				int colspan = column.getColspanInt() < 1 ? 1 : column.getColspanInt();
 				List<String> currentCell = new ArrayList<>();
 				for (int k = 0; k < colspan; k++) {
 					currentCell.add(column.getContent(true));
@@ -107,7 +110,6 @@
 				for (int j = 0; j < rowspan; j++) {
 					resultData.get(j + i).addAll(currentCell);
 				}
-				System.out.println(resultData);
 			}
 		}
 		return resultData;
@@ -133,36 +135,7 @@
 	}
 
 
-	/**
-	 * @param target
-	 * @param content
-	 * @param colspan
-	 * @param rowspan
-	 * @param currentColspan
-	 * @param currentRowsSpan
-	 */
-	private void rowspanAndColspan(String[][] target, String content, int colspan, int rowspan, int currentColspan, int currentRowsSpan) {
-		int k = currentColspan;
-		int i = currentRowsSpan;
-		if (colspan > 1) {
-			for (int j = 1; j < colspan; j++) {
-				int index = j + k;
-				while (target[i][index] != null) {
-					index++;
-				}
-				target[i][index] = content;
-			}
-		}
-		if (rowspan > 1) {
-			for (int j = 1; j < rowspan; j++) {
-				int index = i + k;
-				while (target[index][k] != null) {
-					index++;
-				}
-				target[index][k] = content;
-			}
-		}
-	}
+
 
 	/**
 	 * 鍔犺浇鎵�鏈夌紦瀛�
@@ -244,8 +217,8 @@
 				fieldConfigObj = new JSONObject();
 				areaList.add(fieldConfigObj);
 			} else {
-                fieldConfigObj = areaList.get(areaList.size() - 1);
-            }
+				fieldConfigObj = areaList.get(areaList.size() - 1);
+			}
 			fieldConfigObj.put(attrFse.getString(CmnConst.ATTR_NAME), attrFse.getString(CmnConst.ATTR_VALUE));
 			fieldConfigObj.put(CmnConst.ATTR_X, x);
 			fieldConfigObj.put(CmnConst.ATTR_Y, y);
@@ -360,14 +333,13 @@
 		}
 	}
 
-
 	/**
 	 * 鑾峰彇鎶ヨ〃
 	 *
 	 * @return
 	 */
-	public ReportEntity getReportEntity(FieldSetEntity fse) {
-		ReportEntity report = null;
+	public ReportEntity getReport(FieldSetEntity fse) {
+		ReportEntity reportEntity = new ReportEntity();
 		String reportConfigUUID = fse.getUUID();
 		if (!StringUtils.isEmpty(fse.getString("~report_config_uuid~"))) {
 			//瀛愭姤琛ㄤ細浼犲叆姝ey浣滀负鎶ヨ〃鐨剈uid 瑙勯伩鍙傛暟涓湁uuid鐨刱ey
@@ -439,9 +411,8 @@
 		FieldSetEntity reportSourceFse = reportSourceDte.getFieldSetEntity(0);
 		int curPage = fse.getInteger(CmnConst.CPAGE) == null ? 1 : fse.getInteger(CmnConst.CPAGE);
 
-		JSONObject resultObj = new JSONObject();
+//		JSONObject resultObj = new JSONObject();
 		// 棣栨鍔犺浇锛岄粯璁ゆ坊鍔犳潯浠�
-		Map<String, Map<String, String>> outerMap = Maps.newHashMap();
 		if (fse.getBoolean(CmnConst.FIRST_LOAD)) {
 			DataTableEntity allFilterDte = getDefaultSearchFilter(reportSourceFse.getUUID());
 			Map<String, DataTableEntity> subMap = Maps.newHashMap();
@@ -451,7 +422,7 @@
 			DataTableEntity defaultFilterDte = new DataTableEntity();
 
 			FieldSetEntity tempFse;
-
+			Map<String, Map<String, String>> outerMap = Maps.newHashMap();
 			Map<String, String> innerMap;
 			for (int i = 0; i < allFilterDte.getRows(); i++) {
 				tempFse = allFilterDte.getFieldSetEntity(i);
@@ -466,22 +437,18 @@
 				outerMap.put(tempFse.getString(CmnConst.FIELD_NAME), innerMap);
 			}
 //			resultObj.put("filterInfo", outerMap);
-
+			reportEntity.setFilterInfo(outerMap);
 			if (!DataTableEntity.isEmpty(defaultFilterDte)) {
 				subMap.put("systemSeniorQueryString", defaultFilterDte);
 			}
 			fse.setSubData(subMap);
 		}
 
-		DataTableEntity recordDte = getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, null);
+		List<String> unpivotInfoContainer = Lists.newArrayList();
+		DataTableEntity recordDte = getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, null, unpivotInfoContainer);
 		// 鏄惁娣诲姞鎬诲悎璁�
 		boolean totalStatisticsFlag = "1".equalsIgnoreCase(reportConfigFse.getString(CmnConst.LAST_TOTAL));
 		String totalName = totalStatisticsFlag ? (StringUtils.isEmpty(reportConfigFse.getString(CmnConst.TOTAL_NAME)) ? "鎬昏" : reportConfigFse.getString(CmnConst.TOTAL_NAME)) : "";
-
-//        JSONObject checkObj = checkRecordDte(recordDte);
-//        if (CmnConst.FALSE.equals(checkObj.getString(CmnConst.RETURN_ATTR_RESULT))) {
-//            return checkObj;
-//        }
 
 //		StringBuilder tableStyle = new StringBuilder(32);
 //		String widthType = reportConfigFse.getString(CmnConst.REPORT_WIDTH_TYPE);
@@ -493,50 +460,46 @@
 //				tableStyle.append(" style=\"width:").append(width).append("px\"");
 //			}
 //		}
-
+		List<List<ReportColumn>>[] report = null;
 		if (CmnConst.REPORT_TYPE_COMMON.equals(reportType)) {
-			report = commonReportService.getReportEntity(recordDte, totalName, reportConfigMap);
-			report.setFilterInfo(outerMap);
+			report = commonReportService.getReport(recordDte, totalName, reportConfigMap, unpivotInfoContainer);
+
 		} else if (CmnConst.REPORT_TYPE_GROUP.equals(reportType)) {
 			// 鐗规畩澶勭悊棰濆鏌ヨ鍐呭
-			recordDte.addFieldSetEntity(getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, reportConfigMap));
-			report = groupReportService.getReportEntity(recordDte, totalName, reportConfigMap);
-//			resultObj.putAll(groupReportService.getReport(recordDte, totalName, reportConfigMap, tableStyle));
+			recordDte.addFieldSetEntity(getRecordDte(sort, curPage, reportSourceFse, fse, reportConfigFse, reportConfigMap, null));
+			report = groupReportService.getReport(recordDte, totalName, reportConfigMap);
 		}
-		report.setReportConfigUid(reportConfigFse.getUUID());
-		report.setReportName(reportConfigFse.getString(CmnConst.REPORT_NAME));
-//		report.setFilterInfo(outerMap);
-		if (CmnConst.FALSE.equals(resultObj.getString(CmnConst.RETURN_ATTR_RESULT))) {
-			resultObj.put(CmnConst.RETURN_ATTR_RESULT, true);
-			resultObj.put(CmnConst.RETURN_ATTR_MESSAGE, "鑾峰彇鎶ヨ〃澶辫触锛�");
+		if (report != null) {
+			List<List<ReportColumn>> head = report[0];
+			List<List<ReportColumn>> data = report[1];
+			List<List<ReportColumn>> tail = report[2];
+			reportEntity.setReportHeader(head);
+			reportEntity.setReportData(data);
+			reportEntity.setReportTail(tail);
+		}
+
+
+		reportEntity.setReportConfigUid(reportConfigFse.getUUID());
+		reportEntity.setReportName(reportConfigFse.getString(CmnConst.REPORT_NAME));
+
+		// 鍒嗛〉鍙傛暟
+		SQLEntity sqlEntity = recordDte.getSqle();
+		if ("1".equals(reportConfigFse.getString(CmnConst.IS_PAGE)) && sqlEntity != null) {
+			reportEntity.setPage(true);
+			reportEntity.setPageIndex(curPage);
+			reportEntity.setTotalCount(sqlEntity.getTotalCount());
+			reportEntity.setPageSize(StringUtils.isEmpty(reportConfigFse.getString(CmnConst.PAGE_SIZE)) ? 0 : reportConfigFse.getInteger(CmnConst.PAGE_SIZE));
 		} else {
-			// 鍒嗛〉鍙傛暟
-			SQLEntity sqlEntity = recordDte.getSqle();
-			if ("1".equals(reportConfigFse.getString(CmnConst.IS_PAGE)) && sqlEntity != null) {
-				report.setPage(true);
-				report.setTotalCount(sqlEntity.getTotalCount());
-				report.setPageSize(StringUtils.isEmpty(reportConfigFse.getString(CmnConst.PAGE_SIZE)) ? 0 : reportConfigFse.getInteger(CmnConst.PAGE_SIZE));
-				report.setPageIndex(curPage);
-//				resultObj.put(CmnConst.IS_PAGE, 1);
-//				resultObj.put(CmnConst.CPAGE, curPage);
-//				resultObj.put("totalCount", sqlEntity.getTotalCount());
-//				resultObj.put("totalpage", sqlEntity.getTotalpage());
-//				resultObj.put("pagesize", StringUtils.isEmpty(reportConfigFse.getString(CmnConst.PAGE_SIZE)) ? 0 : reportConfigFse.getInteger(CmnConst.PAGE_SIZE));
-			}
+			reportEntity.setPage(false);
 		}
 //		if (!DataTableEntity.isEmpty(recordDte)) {
 //			resultObj.put("current_page_count", recordDte.getRows());
+//
 //		}
-		report.setSystemFieldMeta(getSearchInfo(reportSourceFse.getUUID()));
-		report.setReportType(reportConfigFse.getString("type_uuid"));
-//		resultObj.put("systemFieldMeta", );
-//		resultObj.put("report_type", reportConfigFse.getString("type_uuid"));
-//        System.out.println(resultObj.getString("html"));
-
-		return report;
+		reportEntity.setReportType(reportConfigFse.getString("type_uuid"));
+		reportEntity.setSystemFieldMeta(getSearchInfo(reportSourceFse.getUUID()));
+		return reportEntity;
 	}
-
-
 
 	/**
 	 * 鑾峰彇鎶ヨ〃缂撳瓨淇℃伅
@@ -578,12 +541,17 @@
 	 * @param reportConfigFse
 	 * @return
 	 */
-	private DataTableEntity getRecordDte(StringBuilder sort, int curPage, FieldSetEntity
-			reportSourceFse, FieldSetEntity fse, FieldSetEntity
-												 reportConfigFse, Map<Integer, List<JSONObject>> reportConfigMap) {
+	private DataTableEntity getRecordDte(StringBuilder sort, int curPage, FieldSetEntity reportSourceFse, FieldSetEntity fse, FieldSetEntity reportConfigFse, Map<Integer, List<JSONObject>> reportConfigMap, Collection<String> unpivotInfoContainer) {
 		boolean spTimeFlag = reportConfigMap != null;
 		String sql;
 		String sqlText = reportSourceFse.getString(CmnConst.SQL_TEXT);
+		Map<String, List<String>> queryFilterMap = queryFilterService.getQueryFilterMore(fse);
+		// [=table_name=]鍐欐硶澶勭悊鈥斺�旀浛鎹负瀵瑰簲鐨剋ith璇彞,0-杩戞湡锛�1-鎵�鏈�
+		int year = queryFilterMap == null || queryFilterMap.get("query_time") == null || "0".equals(queryFilterMap.get("query_time").get(0)) ? 2 : 0;
+		sqlText = QuerySqlParseUtil.parseSplitTableSql(baseDao, sqlText, year);
+		// {==}鍐欐硶澶勭悊-鏇挎崲涓哄搴旂殑琛屽垪杞崲璇彞
+		sqlText = dealUnpivot(sqlText, queryFilterMap, unpivotInfoContainer);
+
 		DataTableEntity recordDte = new DataTableEntity();
 
 		if (spTimeFlag) {
@@ -593,7 +561,6 @@
 			Set<String> spTimeStatisticsTypeSet = Sets.newHashSet();
 			spTimeStatisticsTypeSet.addAll(getFieldAndSpTimeStatisticsTypeSet(baseFieldSet, spTimeStatisticsFieldMap, reportConfigMap.get(0)));
 			spTimeStatisticsTypeSet.addAll(getFieldAndSpTimeStatisticsTypeSet(baseFieldSet, spTimeStatisticsFieldMap, reportConfigMap.get(2)));
-			Map<String, List<String>> queryFilterMap = queryFilterService.getQueryFilterMore(fse);
 			Set<String> selectedFieldSet;
 			String headContent;
 			DataTableEntity tempDte;
@@ -678,6 +645,154 @@
 	}
 
 	/**
+	 * 瀛愭柟娉�-澶勭悊琛屽垪杞崲鐨勮鍙�
+	 *
+	 * @param sql                  寰呭鐞嗙殑sql
+	 * @param queryFilterMap       杩囨护鏉′欢map
+	 * @param unpivotInfoContainer 琛屽垪杞崲瀹瑰櫒锛岃鏂规硶浼氬皢澶勭悊濂戒簡鐨勫唴瀹圭洿鎺ユ斁鍏ヨ瀹瑰櫒涓�
+	 * @return
+	 */
+	private String dealUnpivot(String sql, Map<String, List<String>> queryFilterMap, Collection<String> unpivotInfoContainer) {
+		String regexp = "\\{=.+=\\}";
+		List<String> suitList = getSuitContent(sql, regexp);
+		String tempStr;
+		List<String> fieldInfoList;
+		String[] fieldArr;
+		String filter;
+		String startTimeStr;
+		String finalTimeStr;
+		int beginIndex;
+		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		List<String> timeList;
+		for (String content : suitList) {
+			tempStr = content.substring(2, content.length() - 2).trim();
+			fieldInfoList = getSuitContent(tempStr, "\\{\\$((?!\\{\\$).)+\\$\\}");
+			for (String fieldInfo : fieldInfoList) {
+				fieldArr = fieldInfo.substring(2, fieldInfo.length() - 2).trim().split(" ");
+				if (fieldArr.length != 3) {
+					continue;
+				}
+				if ("date".equalsIgnoreCase(fieldArr[1])) {
+					if (queryFilterMap == null || queryFilterMap.isEmpty()) {
+						return sql.replaceAll(regexp, "");
+					}
+					filter = queryFilterMap.get(fieldArr[0]).get(0);
+					beginIndex = filter.indexOf("str_to_date('") + "str_to_date('".length();
+					startTimeStr = filter.substring(beginIndex, beginIndex + 19);
+					beginIndex = filter.lastIndexOf("str_to_date('") + "str_to_date('".length();
+					finalTimeStr = filter.substring(beginIndex, beginIndex + 19);
+					try {
+						timeList = enumTime(dateFormat.parse(startTimeStr), dateFormat.parse(finalTimeStr), fieldArr[2]);
+					} catch (Exception e) {
+						SpringMVCContextHolder.getSystemLogger().error("transfer error: " + filter);
+						timeList = Lists.newArrayList();
+					}
+					unpivotInfoContainer.addAll(timeList);
+					tempStr = joinSql(timeList, tempStr, fieldInfo);
+				} else if ("prompt".equalsIgnoreCase(fieldArr[1])) {
+					String promptName = fieldArr[2];
+					DataTableEntity dte;
+					StringBuilder promptSql = new StringBuilder();
+					FieldSetEntity fse;
+					if (promptName.startsWith("銆�")) {
+						promptSql.append("select dict_label show_value,dict_value real_value from product_sys_dict where is_used=1 and dict_name=?");
+						if (queryFilterMap != null && !queryFilterMap.isEmpty() && queryFilterMap.get(fieldArr[0]) != null && !StringUtils.isEmpty(queryFilterMap.get(fieldArr[0]).get(1))) {
+							promptSql.append(" and (dict_value").append(queryFilterMap.get(fieldArr[0]).get(1)).append(")");
+						}
+						dte = baseDao.listTable(promptSql.toString(), new Object[]{promptName.substring(1, promptName.length() - 1)});
+					} else {
+						fse = baseDao.getFieldSetEntityByFilter("product_sys_prompt", "prompt_name=?", new Object[]{promptName}, false);
+						promptSql.append("select ").append(fse.getString("view_fields")).append(" show_value,").append(fse.getString("value_field")).append(" real_value from ").append(fse.getString("source_table"));
+						if (!StringUtils.isEmpty(fse.getString("filter"))) {
+							promptSql.append(" where (").append(fse.getString("filter")).append(")");
+						}
+						if (queryFilterMap != null && !queryFilterMap.isEmpty() && queryFilterMap.get(fieldArr[0]) != null && !StringUtils.isEmpty(queryFilterMap.get(fieldArr[0]).get(1))) {
+							if (!StringUtils.isEmpty(fse.getString("filter"))) {
+								promptSql.append(" and");
+							} else {
+								promptSql.append(" where");
+							}
+							promptSql.append(" (").append(fse.getString("value_field")).append(queryFilterMap.get(fieldArr[0]).get(1)).append(")");
+						}
+						dte = baseDao.listTable(promptSql.toString(), new Object[]{});
+					}
+					for (int i = 0; i < dte.getRows(); i++) {
+						fse = dte.getFieldSetEntity(i);
+						unpivotInfoContainer.add(fse.getString("show_value"));
+					}
+					tempStr = joinSql(dte, tempStr, fieldInfo);
+				}
+			}
+			sql = sql.replace(content, tempStr.contains("{$") ? "" : tempStr);
+		}
+		return sql;
+	}
+
+	private String joinSql(Collection<String> collection, String unpivotContent, String fieldInfo) {
+		StringBuilder unpivotSb = new StringBuilder(128);
+		for (String singleStr : collection) {
+			if (unpivotSb.length() > 0) {
+				unpivotSb.append("\n    ");
+			}
+			unpivotSb.append(unpivotContent.replace(fieldInfo, singleStr)).append(" '").append(singleStr).append("'");
+		}
+		return unpivotSb.toString();
+	}
+
+	private String joinSql(DataTableEntity dte, String unpivotContent, String fieldInfo) {
+		StringBuilder unpivotSb = new StringBuilder(128);
+		for (int i = 0; i < dte.getRows(); i++) {
+			FieldSetEntity fse = dte.getFieldSetEntity(i);
+			if (unpivotSb.length() > 0) {
+				unpivotSb.append("\n    ");
+			}
+			unpivotSb.append(unpivotContent.replace(fieldInfo, fse.getString("real_value"))).append(" '").append(fse.getString("show_value")).append("'");
+		}
+		return unpivotSb.toString();
+	}
+
+	/**
+	 * 鎸夌収鏃堕棿姝ラ暱鏋氫妇鏃堕棿鑼冨洿涔嬪唴鐨勬椂闂�
+	 *
+	 * @param startTime
+	 * @param finalTime
+	 * @param formatInfo
+	 * @return
+	 */
+	public static List<String> enumTime(Date startTime, Date finalTime, String formatInfo) {
+		Calendar c1 = Calendar.getInstance();
+		Calendar c2 = Calendar.getInstance();
+		c1.setTime(startTime);
+		c2.setTime(finalTime);
+		int step = 1;
+		String format = formatInfo;
+		if (formatInfo.contains("[")) {
+			step = Integer.parseInt(formatInfo.substring(formatInfo.indexOf("[") + 1, formatInfo.indexOf("]")));
+			format = formatInfo.substring(0, formatInfo.indexOf("["));
+		}
+		SimpleDateFormat dateFormat = new SimpleDateFormat(format);
+		List<String> timeList = Lists.newArrayList();
+		if (formatInfo.contains("H")) {
+			enumTime(c1, c2, timeList, dateFormat, step, Calendar.HOUR);
+		} else if (formatInfo.contains("d")) {
+			enumTime(c1, c2, timeList, dateFormat, step, Calendar.DATE);
+		} else if (formatInfo.contains("M")) {
+			enumTime(c1, c2, timeList, dateFormat, step, Calendar.MONTH);
+		} else if (formatInfo.contains("y")) {
+			enumTime(c1, c2, timeList, dateFormat, step, Calendar.YEAR);
+		}
+		return timeList;
+	}
+
+	private static void enumTime(Calendar c1, Calendar c2, List<String> timeList, SimpleDateFormat dateFormat, int step, int param) {
+		if (c1.compareTo(c2) <= 0) {
+			timeList.add(dateFormat.format(c1.getTime()));
+			c1.add(param, step);
+			enumTime(c1, c2, timeList, dateFormat, step, param);
+		}
+	}
+
+	/**
 	 * 瀛愭柟娉�-getRecordDte-鍔犺浇鍙傜収
 	 *
 	 * @param recordDte
@@ -718,9 +833,10 @@
 	 * @param sort
 	 * @return
 	 */
-	private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity
-			reportConfigFse, int curPage, String selectedFields, Map<String, List<String>> queryFilterMap) {
+	private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity reportConfigFse, int curPage, String selectedFields, Map<String, List<String>> queryFilterMap) {
 		queryFilterMap = queryFilterMap == null ? queryFilterService.getQueryFilterMore(fse) : queryFilterMap;
+		// 澶勭悊鎺夎繎鏈熷拰鎵�鏈夌殑杩囨护鏉′欢
+		queryFilterMap.remove("query_time");
 		selectedFields = StringUtils.isEmpty(selectedFields) ? "*" : selectedFields;
 		// 鏇挎崲sql涓殑绯荤粺鍙傛暟
 		sqlText = SystemParamReplace.replaceParams(sqlText, fse);
@@ -765,7 +881,7 @@
 			}
 		}
 		// 鍓旈櫎寮傚父鍖哄煙
-		sqlText = sqlText.replaceAll(CmnConst.REGEXP_FILTER_AREA, "").replaceAll(CmnConst.REGEXP_ALL_TYPE, "null").replaceAll(CmnConst.REGEXP_ALWAYS_TRUE, "");
+		sqlText = sqlText.replaceAll(CmnConst.REGEXP_FILTER_AREA, "").replaceAll(CmnConst.REGEXP_ALL_TYPE, "null").replaceAll(CmnConst.REGEXP_ALWAYS_TRUE, "").replaceAll("(\\t*\\n){2,}", "\n");
 		String queryFilter = "";
 		if (signCount > 0) {
 			for (Map.Entry<String, List<String>> entry : residueQueryFilterMap.entrySet()) {
@@ -778,7 +894,7 @@
 				queryFilter += " (" + entry.getValue().get(2) + ") ";
 			}
 		} else {
-			queryFilter = queryFilterMap.isEmpty() ? queryFilterService.getQueryFilter(fse) : queryFilterMap.get(CmnConst.SYSTEM_SENIOR_QUERY_STRING).get(0);
+			queryFilter = queryFilterMap.isEmpty() || queryFilterMap.size() == 1 ? queryFilterService.getQueryFilter(fse) : queryFilterMap.get(CmnConst.SYSTEM_SENIOR_QUERY_STRING).get(0);
 		}
 
 		StringBuilder sql = new StringBuilder(1024);
@@ -794,8 +910,7 @@
 		return sql.toString();
 	}
 
-	private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity
-			reportConfigFse, int curPage) {
+	private String replaceSqlContent(String sqlText, FieldSetEntity fse, StringBuilder sort, FieldSetEntity reportConfigFse, int curPage) {
 		return replaceSqlContent(sqlText, fse, sort, reportConfigFse, curPage, null, null);
 	}
 
@@ -808,8 +923,7 @@
 	 * @param queryFilterMap
 	 * @return
 	 */
-	private String spReplaceSqlContent(String suitContent, String regexp, int num, Map<
-			String, List<String>> queryFilterMap, Map<String, List<String>> residueQueryFilterMap) {
+	private String spReplaceSqlContent(String suitContent, String regexp, int num, Map<String, List<String>> queryFilterMap, Map<String, List<String>> residueQueryFilterMap) {
 		List<String> innerSuitList = getSuitContent(suitContent, regexp);
 		String curField;
 		String filter;
@@ -844,9 +958,17 @@
 						// 涓婃湡
 						spDealFilterForPrePeriod(tempQueryFilterMap, queryFilterMap, curField);
 					}
+					filter = tempQueryFilterMap.get(curField).get(num);
+					suitContent = suitContent.replace(innerSuitContent, filter);
+				} else if ("split".equals(spStatisticsWay)) {
+					// 鍙槸鎷嗗垎骞舵彁鍙栧尯鍩熺殑鍊硷紝鍙湁鑾峰彇鑼冨洿鐨勫�肩殑鏃跺�欏彲浠ヨ繖鏍锋搷浣�
+					List<String> paramList = tempQueryFilterMap.get(curField);
+					String[] timeArr = paramList.get(0).split("~");
+					suitContent = suitContent.replace(innerSuitContent, timeArr[Integer.parseInt(spStatisticsWayValue)]);
+				} else {
+					filter = tempQueryFilterMap.get(curField).get(num);
+					suitContent = suitContent.replace(innerSuitContent, filter);
 				}
-				filter = tempQueryFilterMap.get(curField).get(num);
-				suitContent = suitContent.replace(innerSuitContent, filter);
 				residueQueryFilterMap.remove(curField);
 				if (getSuitContent(suitContent, CmnConst.REGEXP_ALL_TYPE).isEmpty() && suitContent.matches(CmnConst.REGEXP_FILTER_AREA)) {
 					suitContent = suitContent.substring(2, suitContent.length() - 2);
@@ -888,9 +1010,7 @@
 	 * @param queryFilterMap
 	 * @param curFieldName
 	 */
-	private void spDealFilterForLastYear
-	(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String
-			curFieldName) {
+	private void spDealFilterForLastYear(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String curFieldName) {
 		List<String> paramList = tempQueryFilterMap.get(curFieldName);
 		for (int i = 0; i < paramList.size(); i++) {
 			paramList.set(i, paramList.get(i).replace("str_to_date(", "date_add(str_to_date(")
@@ -911,9 +1031,7 @@
 	 * @param queryFilterMap
 	 * @param curFieldName
 	 */
-	private void spDealFilterForPrePeriod
-	(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String
-			curFieldName) {
+	private void spDealFilterForPrePeriod(Map<String, List<String>> tempQueryFilterMap, Map<String, List<String>> queryFilterMap, String curFieldName) {
 		List<String> paramList = tempQueryFilterMap.get(curFieldName);
 		String[] timeArr = paramList.get(0).split("~");
 		try {
@@ -946,8 +1064,7 @@
 	 * @param dataList
 	 * @return
 	 */
-	private Set<String> getFieldAndSpTimeStatisticsTypeSet
-	(Set<String> baseFieldSet, Map<String, Map<String, JSONObject>> spTimeStatisticsFieldMap, List<JSONObject> dataList) {
+	private Set<String> getFieldAndSpTimeStatisticsTypeSet(Set<String> baseFieldSet, Map<String, Map<String, JSONObject>> spTimeStatisticsFieldMap, List<JSONObject> dataList) {
 		Set<String> spTimeStatisticsTypeSet = Sets.newHashSet();
 		JSONObject curFieldObj;
 		String fieldName;
@@ -1029,6 +1146,7 @@
 					tempObj.put("table_name", reportSourceFieldFse.getString(CmnConst.TABLE_NAME));
 					tempObj.put(CmnConst.SEARCH_TYPE, reportSourceFieldFse.getObject(CmnConst.SEARCH_TYPE));
 					tempObj.put("is_multiple", "2".equals(reportSourceFieldFse.getString(CmnConst.SEARCH_TYPE)));
+					tempObj.put("field_prompt_filter", reportSourceFieldFse.getString("field_prompt_filter"));
 				}
 			}
 		}
@@ -1093,8 +1211,8 @@
 	 * @param locationType            浣嶇疆绫诲瀷锛宧ead-澶撮儴锛宼ail-灏鹃儴
 	 * @return
 	 */
-	public StringBuilder getTitleHtml(List<JSONObject> list, int totalColCount, Map<
-			String, Set<String>> headAndTailTitleDataMap, String locationType) {
+	public List<List<ReportColumn>> getTitleRows(List<JSONObject> list, int totalColCount, Map<String, Set<String>> headAndTailTitleDataMap, String locationType) {
+		List<List<ReportColumn>> reportColumnList = new ArrayList<>();
 		StringBuilder html = new StringBuilder(1024);
 		int colspan;
 		int preRow = 0;
@@ -1102,7 +1220,6 @@
 		int curRow;
 		int curCol;
 		String value;
-		String style;
 		for (JSONObject singleObj : list) {
 			curRow = singleObj.getIntValue(CmnConst.ATTR_Y);
 			curCol = singleObj.getIntValue(CmnConst.ATTR_X);
@@ -1110,15 +1227,6 @@
 			colspan = colspan < 0 ? totalColCount : Math.max(1, colspan);
 			value = replaceFormDataAndSysData(singleObj.getString(CmnConst.ATTR_SHOW_NAME), headAndTailTitleDataMap, singleObj);
 			value = value == null ? "" : value;
-			if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
-				style = " class=\"" + CmnConst.CLASS_TR_REPORT_TITLE + "\"";
-			} else {
-				if ("head".equals(locationType)) {
-					style = " class=\"" + CmnConst.CLASS_TR_HEAD + "\"";
-				} else {
-					style = " class=\"" + CmnConst.CLASS_TR_TAIL + "\"";
-				}
-			}
 			if (preRow < curRow) {
 				if (preRow == 0) {
 					html.append("\n<tr ");
@@ -1126,7 +1234,7 @@
 					html.append(getAimNumTdPlaceholder(totalColCount - preCol, 1));
 					html.append("\n</tr>\n<tr ");
 				}
-				html.append(style).append(">\n    ");
+				html.append(">\n    ");
 				if (preRow == 0 && preCol == 0 && preCol < curCol - 1) {
 					html.append(getAimNumTdPlaceholder(curCol - preCol - 1, 1));
 				}
@@ -1150,80 +1258,25 @@
 		}
 		html.append(getAimNumTdPlaceholder(totalColCount - preCol, 1));
 		html.append("\n</tr>");
-		return html;
-	}
-
-	/**
-	 * 鎶ヨ〃-瑙f瀽-鑾峰彇澶撮儴鎴栬�呭熬閮ㄦ爣棰楬tml
-	 *
-	 * @param list                    鎶ヨ〃閰嶇疆淇℃伅锛岀紦瀛榣ist
-	 * @param totalColCount           鎬诲垪鏁�
-	 * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map
-	 * @param locationType            浣嶇疆绫诲瀷锛宧ead-澶撮儴锛宼ail-灏鹃儴
-	 * @return
-	 */
-	public List<List<ReportColumn>> getTitle(List<JSONObject> list, int totalColCount, Map<
-			String, Set<String>> headAndTailTitleDataMap, String locationType) {
-		List<List<ReportColumn>> row = new ArrayList<>();
-//		StringBuilder html = new StringBuilder(1024);
-		int colspan;
-		int preRow = 0;
-		int preCol = 0;
-		int curRow;
-		int curCol;
-		String value;
-//		String style;
-
-		List<ReportColumn> reportColumns = new ArrayList<>();
-		for (JSONObject singleObj : list) {
-			curRow = singleObj.getIntValue(CmnConst.ATTR_Y);
-			curCol = singleObj.getIntValue(CmnConst.ATTR_X);
-			colspan = singleObj.getIntValue(CmnConst.ATTR_COLSPAN);
-			colspan = colspan < 0 ? totalColCount : Math.max(1, colspan);
-			value = replaceFormDataAndSysData(singleObj.getString(CmnConst.ATTR_SHOW_NAME), headAndTailTitleDataMap, singleObj);
-			value = value == null ? "" : value;
-//			if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
-//				style = " class=\"" + CmnConst.CLASS_TR_REPORT_TITLE + "\"";
-//			} else {
-//				if ("head".equals(locationType)) {
-//					style = " class=\"" + CmnConst.CLASS_TR_HEAD + "\"";
-//				} else {
-//					style = " class=\"" + CmnConst.CLASS_TR_TAIL + "\"";
-//				}
-//			}
-			if (preRow < curRow) {
-				if(!reportColumns.isEmpty()){
-					row.add(reportColumns);
-					reportColumns=new ArrayList<>();
-				}
-//				if (preRow != 0) {
-//					row.add(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
-//				}
-//				if (preRow == 0 && preCol == 0 && preCol < curCol - 1) {
-//					row.add(getAimNumTdPlaceholderColumn(curCol - preCol - 1, 1));
-//				}
-				preCol = curCol;
+		// 瑙f瀽html
+		Document doc = Jsoup.parse(html.toString());
+		Elements trs = doc.select("tr");
+		Elements tds;
+		List<ReportColumn> reportColumn;
+		ReportColumn column;
+		for (Element tr : trs) {
+			tds = tr.select("td");
+			reportColumn = new ArrayList<>();
+			for (Element td : tds) {
+				column = new ReportColumn();
+				column.setColspan(Integer.parseInt(BaseUtil.ifNull(td.attr("colspan"), "1")));
+				column.setRowspan(Integer.parseInt(BaseUtil.ifNull(td.attr("rowspan"), "1")));
+				column.setContent(td.text());
+				reportColumn.add(column);
 			}
-			if (preCol < curCol - 1) {
-				row.add(getAimNumTdPlaceholderColumn(curCol - preCol - 1, 1));
-			}
-			if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
-				colspan = totalColCount;
-			}
-			ReportColumn column = new ReportColumn();
-			column.setColspan(colspan);
-			column.setContent(value);
-			reportColumns.add(column);
-			preRow = curRow;
-			preCol = curCol + singleObj.getIntValue(CmnConst.ATTR_COLSPAN) - 1;
-			if ("1".equals(singleObj.getString(CmnConst.ATTR_IS_TITLE))) {
-				preCol = totalColCount;
-			}
+			reportColumnList.add(reportColumn);
 		}
-		row.add(reportColumns);
-//		reportColumns.addAll(getAimNumTdPlaceholderColumn(totalColCount - preCol, 1));
-//		row.add();
-		return row;
+		return reportColumnList;
 	}
 
 	/**
@@ -1261,8 +1314,7 @@
 	 * @param lastStageFlag          鏄惁鏈骇锛堟暟鎹尯鍒嗙粍瀛楁鏈骇鍜屽垎缁勮〃澶村尯瀛楁閮芥槸鏈骇鎵嶄负鏈骇锛�
 	 * @return
 	 */
-	public JSONObject getStatisticsValueObj(JSONObject valueJsonObject, JSONObject dataAreaFieldConfigObj, String
-			actualValue, String type, boolean lastStageFlag) {
+	public JSONObject getStatisticsValueObj(JSONObject valueJsonObject, JSONObject dataAreaFieldConfigObj, String actualValue, String type, boolean lastStageFlag) {
 		if (valueJsonObject == null) {
 			valueJsonObject = new JSONObject();
 		}
@@ -1323,8 +1375,7 @@
 	 * @param set
 	 * @param recordFse
 	 */
-	public void getHeadAndTailTitleDataMap
-	(Map<String, Set<String>> headAndTailTitleDataMap, Set<String> set, FieldSetEntity recordFse) {
+	public void getHeadAndTailTitleDataMap(Map<String, Set<String>> headAndTailTitleDataMap, Set<String> set, FieldSetEntity recordFse) {
 		for (String fieldName : set) {
 			headAndTailTitleDataMap.computeIfAbsent(fieldName, k -> Sets.newLinkedHashSet()).add(recordFse.getString(fieldName));
 		}
@@ -1466,10 +1517,6 @@
 		return dealedValueSb.toString();
 	}
 
-	public int dealColumnWidth(JSONObject dataAreaFieldConfigObj) {
-		return NumberUtil.isNumber(dataAreaFieldConfigObj.getString(CmnConst.ATTR_WIDTH)) ? NumberUtil.parseInt(dataAreaFieldConfigObj.getString(CmnConst.ATTR_WIDTH)) : 0;
-	}
-
 	/**
 	 * 鑾峰彇td鐨勫睘鎬�
 	 *
@@ -1549,8 +1596,7 @@
 	 * @param singleObj
 	 * @return
 	 */
-	public String replaceFormDataAndSysData(String
-													str, Map<String, Set<String>> headAndTailTitleDataMap, JSONObject singleObj) {
+	public String replaceFormDataAndSysData(String str, Map<String, Set<String>> headAndTailTitleDataMap, JSONObject singleObj) {
 		if (StringUtils.isEmpty(str)) {
 			return "";
 		}
@@ -1717,30 +1763,6 @@
 	 * @param num
 	 * @return
 	 */
-	public List<ReportColumn> getAimNumTdPlaceholderColumn(int num, int type) {
-		List<ReportColumn> columns = new ArrayList<>();
-		if (num <= 0) {
-			return columns;
-		}
-		if (type == 0) {
-			for (int i = 0; i < num; i++) {
-				columns.add(new ReportColumn());
-			}
-		} else {
-
-			ReportColumn column = new ReportColumn();
-			column.setColspan(num);
-			columns.add(column);
-		}
-		return columns;
-	}
-
-	/**
-	 * 鑾峰彇鎸囧畾涓暟鐨則d鍗犱綅
-	 *
-	 * @param num
-	 * @return
-	 */
 	public String getAimNumTdPlaceholder(int num, int type) {
 		StringBuilder result = new StringBuilder(64);
 		if (num <= 0) {
@@ -1798,8 +1820,7 @@
 	 * @param type      绫诲瀷锛�1-鑾峰彇鐩爣灞炴�э紝鍏朵粬-鎺掗櫎鐩爣灞炴��
 	 * @return
 	 */
-	public JSONObject extendJSONObject(JSONObject aimObj, JSONObject sourceObj, Collection<String> aimAttr,
-									   int type) {
+	public JSONObject extendJSONObject(JSONObject aimObj, JSONObject sourceObj, Collection<String> aimAttr, int type) {
 		if (aimObj == null) {
 			aimObj = new JSONObject();
 		}
diff --git a/src/main/java/com/product/server/report/service/GroupReportService.java b/src/main/java/com/product/server/report/service/GroupReportService.java
index 6caf017..df67eb8 100644
--- a/src/main/java/com/product/server/report/service/GroupReportService.java
+++ b/src/main/java/com/product/server/report/service/GroupReportService.java
@@ -1,5 +1,6 @@
 package com.product.server.report.service;
 
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -11,8 +12,11 @@
 import com.product.core.spring.context.SpringMVCContextHolder;
 import com.product.server.report.config.CmnConst;
 import com.product.server.report.entity.ReportColumn;
-import com.product.server.report.entity.ReportEntity;
 import com.product.util.BaseUtil;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -38,112 +42,54 @@
 	 * @param reportConfigMap 鎶ヨ〃閰嶇疆缂撳瓨map
 	 * @return 鑾峰彇鍒嗙粍鎶ヨ〃鐨勮鎯�
 	 */
-	public ReportEntity getReportEntity(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) {
+	public List<List<ReportColumn>>[] getReport(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap) {
 //		StringBuilder reportHtml = new StringBuilder(4096);
-		ReportEntity report = new ReportEntity();
+		List<List<ReportColumn>>[] reportColumnList = new List[]{new ArrayList(), new ArrayList(), new ArrayList()};
 		// css
-//        StringBuilder cssHtml = dataListReportService.getCssHtml();
+//		StringBuilder cssHtml = dataListReportService.getCssHtml();
 
 		// 鍒嗙粍琛ㄥご鍖哄拰鏁版嵁鍖�
 //		StringBuilder groupAndDataAreaHtml = new StringBuilder(1024);
-		List<List<ReportColumn>>[] rows = new List[2];
 		Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
 		int totalColCount = reportConfigMap.get(0).size();
-		int dataAreaColCount = getGroupAndDataAreaAndReturnDataAreaColCount(rows, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
+		//鏁版嵁鍖哄煙鏁版嵁
+		List<List<ReportColumn>> dataAreaList = new ArrayList<>();
+		int[] number = getGroupAndDataAreaHtmlAndReturnDataAreaColCount(dataAreaList, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
+		int dataAreaColCount = number[0];
+		//鏍囬琛屾暟
+		int titleAreaRow = number[1];
 		totalColCount = Math.max(totalColCount, dataAreaColCount);
-
+		reportColumnList[1] = dataAreaList;
 		// 澶撮儴鏍囬鍖�
-
-		List<List<ReportColumn>> headTitle = null;
 		if (!reportConfigMap.get(1).isEmpty()) {
-			headTitle = dataListReportService.getTitle(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
+			reportColumnList[0] = dataListReportService.getTitleRows(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
 		}
-
-		// 搴曢儴鏍囬鍖�
-		List<List<ReportColumn>> tailTitle = null;
-		if (!reportConfigMap.get(3).isEmpty()) {
-			tailTitle = dataListReportService.getTitle(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
-		}
-
-//        reportHtml.append("\n<body>\n<table").append(tableStyle).append(">")
-//                .append(cssHtml)
-//                .append(headTitleHtml == null ? "" : headTitleHtml)
-//                .append(groupAndDataAreaHtml)
-//                .append(tailTitleHtml == null ? "" : tailTitleHtml)
-//                .append("\n</table>\n</body>");
-
-		if (rows[0] != null) {
-			if (headTitle == null) {
-				headTitle = new ArrayList<>();
+		//浠庢暟鎹尯鍩熷彇鍑烘爣棰樿鏀惧叆澶撮儴鏍囬鍖哄苟灏嗘爣棰樿浠庢暟鎹尯鍩熷垹闄�
+		if (titleAreaRow > 0) {
+			for (int i = 0; i < titleAreaRow; i++) {
+				reportColumnList[0].add(dataAreaList.get(0));
+				dataAreaList.remove(0);
 			}
-			headTitle.addAll(rows[0]);
 		}
-		report.setReportHeader(headTitle);
-
-		report.setReportData(rows[1]);
-		report.setReportTail(tailTitle);
-		return report;
-	}
-
-	/**
-	 * 鎶ヨ〃-瑙f瀽
-	 *
-	 * @param recordDte       涓氬姟鏁版嵁dte
-	 * @param totalName       鎬昏鍚嶇О
-	 * @param reportConfigMap 鎶ヨ〃閰嶇疆缂撳瓨map
-	 * @param tableStyle
-	 * @return 鑾峰彇鍒嗙粍鎶ヨ〃鐨勮鎯�
-	 */
-	public JSONObject getReport(DataTableEntity recordDte, String totalName, Map<Integer, List<JSONObject>> reportConfigMap, StringBuilder tableStyle) {
-		StringBuilder reportHtml = new StringBuilder(4096);
-
-		// css
-		StringBuilder cssHtml = dataListReportService.getCssHtml();
-
-		// 鍒嗙粍琛ㄥご鍖哄拰鏁版嵁鍖�
-		StringBuilder groupAndDataAreaHtml = new StringBuilder(1024);
-		Map<String, Set<String>> headAndTailTitleDataMap = Maps.newHashMap();
-		int totalColCount = reportConfigMap.get(0).size();
-		int dataAreaColCount = getGroupAndDataAreaHtmlAndReturnDataAreaColCount(groupAndDataAreaHtml, reportConfigMap, headAndTailTitleDataMap, recordDte, totalName);
-		totalColCount = Math.max(totalColCount, dataAreaColCount);
-
-		// 澶撮儴鏍囬鍖�
-		StringBuilder headTitleHtml = null;
-		if (!reportConfigMap.get(1).isEmpty()) {
-			headTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(1), totalColCount, headAndTailTitleDataMap, "head");
-		}
-
 		// 搴曢儴鏍囬鍖�
-		StringBuilder tailTitleHtml = null;
 		if (!reportConfigMap.get(3).isEmpty()) {
-			tailTitleHtml = dataListReportService.getTitleHtml(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
+			reportColumnList[2] = dataListReportService.getTitleRows(reportConfigMap.get(3), totalColCount, headAndTailTitleDataMap, "tail");
 		}
 
-		reportHtml.append("\n<body>\n<table").append(tableStyle).append(">")
-				.append(cssHtml)
-				.append(headTitleHtml == null ? "" : headTitleHtml)
-				.append(groupAndDataAreaHtml)
-				.append(tailTitleHtml == null ? "" : tailTitleHtml)
-				.append("\n</table>\n</body>");
-
-		JSONObject resultObj = new JSONObject();
-		resultObj.put(CmnConst.RETURN_ATTR_RESULT, true);
-		resultObj.put(CmnConst.RETURN_ATTR_MESSAGE, "鑾峰彇鎶ヨ〃鎴愬姛锛�");
-		resultObj.put(CmnConst.RETURN_ATTR_HTML, reportHtml);
-		return resultObj;
+		return reportColumnList;
 	}
 
 	/**
 	 * 鎶ヨ〃-瑙f瀽-鏀惧叆鍒嗙粍琛ㄥご鍖哄拰鏁版嵁Html锛岃繑鍥炲垪鏁�
 	 *
-	 * @param groupAndDataAreaHtml    html瀹瑰櫒
+	 * @param dataAreaList            鏁版嵁鍖哄煙鏁版嵁
 	 * @param reportConfigMap         鎶ヨ〃缂撳瓨鏁版嵁map
 	 * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map瀹瑰櫒
 	 * @param recordDte               鏁版嵁婧愰泦鍚�
 	 * @param totalName               鎬昏鍚嶇О
 	 * @return 鏁版嵁鍖烘�诲垪鏁�
 	 */
-	private int getGroupAndDataAreaHtmlAndReturnDataAreaColCount(StringBuilder groupAndDataAreaHtml, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
+	private int[] getGroupAndDataAreaHtmlAndReturnDataAreaColCount(List<List<ReportColumn>> dataAreaList, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
 		// 鍒嗙粍琛ㄥご鍖哄瓧娈电紦瀛榤ap
 		Map<String, JSONObject> groupAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(2));
 		// 鏁版嵁鍖哄瓧娈电紦瀛榤ap
@@ -235,120 +181,13 @@
 		// 鏁版嵁鏍囬list
 		List<JSONObject> dataTitleList = Lists.newArrayList();
 		// 鑾峰彇鏍囬html
-		groupAndDataAreaHtml.append(getDataAreaTitleHtml(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList));
+		List<List<ReportColumn>> dataAreaTitleRows = getDataAreaTitleRows(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList);
+		dataAreaList.addAll(dataAreaTitleRows);
 		// 鑾峰彇鍐呭html
-		groupAndDataAreaHtml.append(getDataAreaDataHtml(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap));
+		List<List<ReportColumn>> dataAreaDataRows = getDataAreaDataRows(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap);
+		dataAreaList.addAll(dataAreaDataRows);
 
-		return totalColCount;
-	}
-
-	/**
-	 * 鎶ヨ〃-瑙f瀽-鏀惧叆鍒嗙粍琛ㄥご鍖哄拰鏁版嵁锛岃繑鍥炲垪鏁�
-	 *
-	 * @param groupAndDataArea        瀹瑰櫒
-	 * @param reportConfigMap         鎶ヨ〃缂撳瓨鏁版嵁map
-	 * @param headAndTailTitleDataMap 澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁map瀹瑰櫒
-	 * @param recordDte               鏁版嵁婧愰泦鍚�
-	 * @param totalName               鎬昏鍚嶇О
-	 * @return 鏁版嵁鍖烘�诲垪鏁�
-	 */
-	private int getGroupAndDataAreaAndReturnDataAreaColCount(List<List<ReportColumn>>[] groupAndDataArea, Map<Integer, List<JSONObject>> reportConfigMap, Map<String, Set<String>> headAndTailTitleDataMap, DataTableEntity recordDte, String totalName) {
-		// 鍒嗙粍琛ㄥご鍖哄瓧娈电紦瀛榤ap
-		Map<String, JSONObject> groupAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(2));
-		// 鏁版嵁鍖哄瓧娈电紦瀛榤ap
-		Map<String, JSONObject> dataAreaFieldConfigMap = dataListReportService.groupAndDataJSONObject2Map(reportConfigMap.get(0));
-
-		// 鍒嗙粍琛ㄥご鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist
-		List<String> groupAreaGroupStatisticsFieldNameList = Lists.newArrayList();
-		// 鍒嗙粍琛ㄥご鍖哄垎缁勫瓧娈靛悕绉發ist
-		List<String> groupAreaGroupFieldNameList = Lists.newArrayList();
-		// 鍒嗙粍琛ㄥご鍖哄尯鍩熻寖鍥磑bj
-		JSONObject groupAreaRangeObj = new JSONObject();
-		groupAreaFieldConfigMap.forEach((fieldName, fieldConfigObj) -> {
-			groupAreaGroupFieldNameList.add(fieldName);
-			if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) {
-				groupAreaGroupStatisticsFieldNameList.add(fieldName);
-			}
-			if (groupAreaRangeObj.getIntValue(CmnConst.MIN_X) == 0) {
-				groupAreaRangeObj.put(CmnConst.MIN_X, fieldConfigObj.getIntValue(CmnConst.ATTR_X));
-			} else {
-				groupAreaRangeObj.put(CmnConst.MIN_X, Math.min(groupAreaRangeObj.getIntValue(CmnConst.MIN_X), fieldConfigObj.getIntValue(CmnConst.ATTR_X)));
-			}
-			groupAreaRangeObj.put(CmnConst.MAX_X, Math.max(groupAreaRangeObj.getIntValue(CmnConst.MAX_X), fieldConfigObj.getIntValue(CmnConst.ATTR_X) + Math.max(1, fieldConfigObj.getIntValue(CmnConst.ATTR_COLSPAN)) - 1));
-			groupAreaRangeObj.put(CmnConst.MAX_Y, Math.max(groupAreaRangeObj.getIntValue(CmnConst.MAX_Y), fieldConfigObj.getIntValue(CmnConst.ATTR_Y) + Math.max(1, fieldConfigObj.getIntValue(CmnConst.ATTR_ROWSPAN)) - 1));
-		});
-
-		// 鏁版嵁鍖哄垎缁勭粺璁″瓧娈靛悕绉發ist
-		List<String> dataAreaGroupStatisticsFieldNameList = Lists.newArrayList();
-		// 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
-		List<String> dataAreaGroupFieldNameList = Lists.newArrayList();
-		// 鏁版嵁鍖虹壒娈婄粺璁″瓧娈靛悕绉發ist-鍒嗙粍琛ㄥご鍖轰笅缁熻瀛楁
-		List<String> dataAreaSpStatisticsFieldNameList = Lists.newArrayList();
-		// 鏁版嵁鍖烘櫘閫氱粺璁″瓧娈靛悕绉發ist-闈炴暟鎹尯鍒嗙粍瀛楁锛岄潪鍒嗙粍琛ㄥご鍖轰笅缁熻瀛楁
-		List<String> dataAreaCommonStatisticsFieldNameList = Lists.newArrayList();
-		dataAreaFieldConfigMap.forEach((fieldName, fieldConfigObj) -> {
-			if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) {
-				dataAreaGroupFieldNameList.add(fieldName);
-				if ("1".equals(fieldConfigObj.getString(CmnConst.ATTR_IS_STATISTICS))) {
-					dataAreaGroupStatisticsFieldNameList.add(fieldName);
-				}
-			} else {
-				if (fieldConfigObj.getIntValue(CmnConst.ATTR_X) < groupAreaRangeObj.getIntValue(CmnConst.MIN_X) || fieldConfigObj.getIntValue(CmnConst.ATTR_X) > groupAreaRangeObj.getIntValue(CmnConst.MAX_X)) {
-					dataAreaCommonStatisticsFieldNameList.add(fieldName);
-				} else {
-					dataAreaSpStatisticsFieldNameList.add(fieldName);
-				}
-			}
-		});
-
-		// 鑾峰彇鍒嗙粍琛ㄥご缁熻瀛楁瀵瑰簲鐨勬暟鎹尯瀛楁map
-		Map<String, List<String>> groupAreaStatisticsField2DataAreaFieldMap = getGroupAreaStatisticsField2DataAreaFieldMap(groupAreaFieldConfigMap, dataAreaFieldConfigMap);
-		// 鑾峰彇鍒嗙粍琛ㄥご鍖烘湯琛屽垎缁勫瓧娈靛搴旀暟鎹尯瀛楁map
-		Map<String, List<String>> groupAreaLastStageField2DataAreaFieldMap = getGroupAreaLastStageField2DataAreaFieldMap(groupAreaFieldConfigMap, dataAreaFieldConfigMap, groupAreaRangeObj);
-
-		// 鑾峰彇鎸囧畾鏁版嵁闆嗕腑鍖呭惈鐨勬暟鎹尯瀛楁闆嗗悎
-		Set<String> headAndTailFieldSet = Sets.newHashSet();
-		headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(1)));
-		headAndTailFieldSet.addAll(dataListReportService.getDataFields(reportConfigMap.get(3)));
-
-		// 缁熻map
-		Map<JSONObject, JSONObject> statisticsMap = Maps.newLinkedHashMap();
-		// 鍒嗙粍琛ㄥご鍖烘暟鎹畂bj
-		JSONObject groupAreaFieldRecordObj = new JSONObject(Maps.newTreeMap((o1, o2) -> dataListReportService.compare(o1, o2)));
-		// 鏁版嵁鍖哄垎缁勫瓧娈祇bj
-		JSONObject dataAreaFieldRecordObj = new JSONObject(Maps.newLinkedHashMap());
-
-		FieldSetEntity recordFse;
-		for (int i = 0; i < recordDte.getRows(); i++) {
-			recordFse = recordDte.getFieldSetEntity(i);
-
-			// 鑾峰彇澶撮儴銆佸熬閮ㄦ爣棰樺尯鏁版嵁瀛楁
-			dataListReportService.getHeadAndTailTitleDataMap(headAndTailTitleDataMap, headAndTailFieldSet, recordFse);
-
-			// 鑾峰彇鍒嗙粍琛ㄥご鍖烘暟鎹畂bj
-			getGroupAreaFieldRecordObj(groupAreaFieldRecordObj, groupAreaFieldConfigMap, recordFse, groupAreaStatisticsField2DataAreaFieldMap, groupAreaLastStageField2DataAreaFieldMap);
-
-			// 鑾峰彇鏁版嵁鍖哄垎缁勫瓧娈祇bj
-			getDataAreaGroupFieldRecordObj(dataAreaFieldRecordObj, dataAreaFieldConfigMap, recordFse);
-
-			// 鑾峰彇鏁版嵁鍖虹壒娈婂瓧娈电殑缁熻
-			statisticsDataAreaSpField(statisticsMap, dataAreaFieldConfigMap, dataAreaSpStatisticsFieldNameList, recordFse);
-
-			// 鑾峰彇鏁版嵁鍖烘櫘閫氬瓧娈电殑缁熻
-			statisticsDataAreaCommonField(statisticsMap, dataAreaFieldConfigMap, dataAreaCommonStatisticsFieldNameList, recordFse);
-		}
-
-		// 鑾峰彇鍒嗙粍琛ㄥご鍖哄拰鏁版嵁鍖烘�诲垪鏁�
-		int totalColCount = getTotalColCount(groupAreaFieldRecordObj, dataAreaGroupFieldNameList.size(), dataAreaCommonStatisticsFieldNameList.size());
-
-		// 鏁版嵁鏍囬list
-		List<JSONObject> dataTitleList = Lists.newArrayList();
-		// 鑾峰彇鏍囬html
-		groupAndDataArea[0] = (getDataAreaTitle(dataTitleList, groupAreaFieldRecordObj, dataAreaFieldConfigMap, groupAreaRangeObj, dataAreaCommonStatisticsFieldNameList));
-		// 鑾峰彇鍐呭html
-		groupAndDataArea[1] = (getDataAreaData(dataTitleList, dataAreaFieldRecordObj, statisticsMap, totalName, dataAreaGroupFieldNameList, dataAreaFieldConfigMap));
-
-		return totalColCount;
+		return new int[]{totalColCount, dataAreaTitleRows.size()};
 	}
 
 	/**
@@ -664,95 +503,6 @@
 	}
 
 	/**
-	 * 鑾峰彇鏍囬
-	 *
-	 * @param dataTitleList                         鏁版嵁鏍囬list
-	 * @param groupAreaFieldRecordObj               鍒嗙粍琛ㄥご鍖哄瓧娈佃褰昽bj
-	 * @param dataAreaFieldConfigMap                鏁版嵁鍖哄瓧娈电紦瀛榤ap
-	 * @param groupAreaRangeObj                     鍒嗙粍琛ㄥご鍘昏寖鍥磑bj
-	 * @param dataAreaCommonStatisticsFieldNameList 鏁版嵁鍖烘櫘閫氱粺璁″瓧娈靛悕绉發ist
-	 * @return 鏁版嵁鏍囬html
-	 */
-	private List<List<ReportColumn>> getDataAreaTitle(List<JSONObject> dataTitleList, JSONObject groupAreaFieldRecordObj, Map<String, JSONObject> dataAreaFieldConfigMap, JSONObject groupAreaRangeObj, List<String> dataAreaCommonStatisticsFieldNameList) {
-		int maxRow = groupAreaRangeObj.getIntValue(CmnConst.MAX_Y);
-		List<List<JSONObject>> groupAreaRangeTitleList = Lists.newArrayList();
-		for (int i = 0; i <= maxRow; i++) {
-			groupAreaRangeTitleList.add(Lists.newArrayList());
-		}
-		getGroupAreaRangeTitleList(dataAreaFieldConfigMap, groupAreaFieldRecordObj, groupAreaRangeTitleList, new JSONObject(), 0, maxRow, null);
-
-		List<JSONObject> beforeGroupAreaTitleList = Lists.newArrayList();
-		List<JSONObject> afterGroupAreaTitleList = Lists.newArrayList();
-
-		String dataAreaFieldName;
-		JSONObject dataAreaFieldConfigObj;
-		JSONObject titleObj;
-		for (Map.Entry<String, JSONObject> entry : dataAreaFieldConfigMap.entrySet()) {
-			dataAreaFieldName = entry.getKey();
-			dataAreaFieldConfigObj = entry.getValue();
-			titleObj = new JSONObject();
-//            titleObj.put(CmnConst.ATTR_FIELD_INFO, getFieldInfo(dataAreaFieldConfigObj));
-			titleObj.put(CmnConst.ATTR_FIELD_INFO, dataListReportService.fieldName2FieldInfo(dataAreaFieldName));
-			if (dataAreaCommonStatisticsFieldNameList.contains(dataAreaFieldName)) {
-				titleObj.put(CmnConst.ATTR_SHOW_NAME, dataListReportService.getStatisticsDesc(dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS), dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME)));
-			} else {
-				titleObj.put(CmnConst.ATTR_SHOW_NAME, dataAreaFieldConfigObj.getString(CmnConst.ATTR_SHOW_NAME));
-			}
-			titleObj.put(CmnConst.ATTR_ROWSPAN, maxRow + 1);
-			titleObj.put(CmnConst.ATTR_COLSPAN, 1);
-			if (dataAreaFieldConfigObj.getIntValue(CmnConst.ATTR_X) < groupAreaRangeObj.getIntValue(CmnConst.MIN_X)) {
-				beforeGroupAreaTitleList.add(titleObj);
-			}
-			if (dataAreaFieldConfigObj.getIntValue(CmnConst.ATTR_X) > groupAreaRangeObj.getIntValue(CmnConst.MAX_X)) {
-				if ("1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_IS_GROUP))) {
-					beforeGroupAreaTitleList.add(titleObj);
-				} else {
-					afterGroupAreaTitleList.add(titleObj);
-				}
-			}
-		}
-
-		dataTitleList.addAll(groupAreaRangeTitleList.get(maxRow));
-		dataTitleList.addAll(afterGroupAreaTitleList);
-
-		List<JSONObject> firstList = Lists.newArrayList();
-		firstList.addAll(beforeGroupAreaTitleList);
-		firstList.addAll(groupAreaRangeTitleList.get(0));
-		firstList.addAll(afterGroupAreaTitleList);
-
-		groupAreaRangeTitleList.set(0, firstList);
-
-//		StringBuilder html = new StringBuilder(1024);
-		int rowspan;
-		int colspan;
-		String value;
-		List<List<ReportColumn>> rowColumn = new ArrayList<>();
-		for (List<JSONObject> rowList : groupAreaRangeTitleList) {
-			List<ReportColumn> columns = new ArrayList<>();
-//			html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">\n    ");
-			for (JSONObject dataTitleObj : rowList) {
-				ReportColumn column = new ReportColumn();
-				rowspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_ROWSPAN));
-				colspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_COLSPAN));
-				value = dataTitleObj.getString(CmnConst.ATTR_SHOW_NAME);
-				if (!StringUtils.isEmpty(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO))) {
-					dataAreaFieldName = dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO));
-					column.setColumnWidth(dataListReportService.dealColumnWidth(dataAreaFieldConfigMap.get(dataAreaFieldName)));
-//					value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value);
-				}
-				column.setRowspan(rowspan);
-				column.setColspan(colspan);
-				column.setContent(value);
-				columns.add(column);
-//				html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>");
-			}
-			rowColumn.add(columns);
-//			html.append("\n</tr>");
-		}
-		return rowColumn;
-	}
-
-	/**
 	 * 鑾峰彇鏍囬html
 	 *
 	 * @param dataTitleList                         鏁版嵁鏍囬list
@@ -762,7 +512,8 @@
 	 * @param dataAreaCommonStatisticsFieldNameList 鏁版嵁鍖烘櫘閫氱粺璁″瓧娈靛悕绉發ist
 	 * @return 鏁版嵁鏍囬html
 	 */
-	private StringBuilder getDataAreaTitleHtml(List<JSONObject> dataTitleList, JSONObject groupAreaFieldRecordObj, Map<String, JSONObject> dataAreaFieldConfigMap, JSONObject groupAreaRangeObj, List<String> dataAreaCommonStatisticsFieldNameList) {
+	private List<List<ReportColumn>> getDataAreaTitleRows(List<JSONObject> dataTitleList, JSONObject groupAreaFieldRecordObj, Map<String, JSONObject> dataAreaFieldConfigMap, JSONObject groupAreaRangeObj, List<String> dataAreaCommonStatisticsFieldNameList) {
+		List<List<ReportColumn>> reportColumnList = Lists.newArrayList();
 		int maxRow = groupAreaRangeObj.getIntValue(CmnConst.MAX_Y);
 		List<List<JSONObject>> groupAreaRangeTitleList = Lists.newArrayList();
 		for (int i = 0; i <= maxRow; i++) {
@@ -816,20 +567,27 @@
 		int colspan;
 		String value;
 		for (List<JSONObject> rowList : groupAreaRangeTitleList) {
-			html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">\n    ");
+			List<ReportColumn> reportColumns = new ArrayList<>();
+//			html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_TITLE).append("\">\n    ");
 			for (JSONObject dataTitleObj : rowList) {
 				rowspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_ROWSPAN));
 				colspan = Math.max(1, dataTitleObj.getIntValue(CmnConst.ATTR_COLSPAN));
 				value = dataTitleObj.getString(CmnConst.ATTR_SHOW_NAME);
+				ReportColumn column = new ReportColumn(colspan, rowspan);
 				if (!StringUtils.isEmpty(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO))) {
 					dataAreaFieldName = dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO));
-					value = dataListReportService.dealTdWidth(dataAreaFieldConfigMap.get(dataAreaFieldName), value);
+					JSONObject dataAreaFieldConfigObjTemp = dataAreaFieldConfigMap.get(dataAreaFieldName);
+					String width = dataAreaFieldConfigObjTemp == null ? null : dataAreaFieldConfigObjTemp.getString(CmnConst.ATTR_WIDTH);
+					if (!StringUtils.isEmpty(width) && NumberUtil.isNumber(width)) {
+						column.setColumnWidth(NumberUtil.parseInt(width));
+					}
 				}
-				html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>");
+				column.setContent(value);
+				reportColumns.add(column);
 			}
-			html.append("\n</tr>");
+			reportColumnList.add(reportColumns);
 		}
-		return html;
+		return reportColumnList;
 	}
 
 	/**
@@ -935,7 +693,7 @@
 	 * @param dataAreaFieldConfigMap     鏁版嵁鍖哄瓧娈电紦瀛榤ap
 	 * @return 涓氬姟鏁版嵁鍐呭html
 	 */
-	private StringBuilder getDataAreaDataHtml(List<JSONObject> dataTitleList, JSONObject dataAreaFieldRecordObj, Map<JSONObject, JSONObject> statisticsMap, String totalName, List<String> dataAreaGroupFieldNameList, Map<String, JSONObject> dataAreaFieldConfigMap) {
+	private List<List<ReportColumn>> getDataAreaDataRows(List<JSONObject> dataTitleList, JSONObject dataAreaFieldRecordObj, Map<JSONObject, JSONObject> statisticsMap, String totalName, List<String> dataAreaGroupFieldNameList, Map<String, JSONObject> dataAreaFieldConfigMap) {
 		List<List<JSONObject>> dataAreaGroupFieldDataList = Lists.newArrayList();
 		getDataAreaGroupFieldDataList(dataAreaFieldRecordObj, dataAreaGroupFieldDataList, new JSONObject(), 1, 1, dataAreaGroupFieldNameList.size(), null);
 
@@ -1037,144 +795,34 @@
 		if (!StringUtils.isEmpty(totalName)) {
 			html.append(getTotalStatisticsHtml(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName));
 		}
-
-		return html;
-	}
-
-	/**
-	 * 鑾峰彇鍐呭html
-	 *
-	 * @param dataTitleList              鏁版嵁鏍囬list
-	 * @param dataAreaFieldRecordObj     鏁版嵁鍖哄瓧娈佃褰昽bj
-	 * @param statisticsMap              缁熻map
-	 * @param totalName                  鎬昏鍚嶇О锛岄潪绌�-闇�瑕佹�昏
-	 * @param dataAreaGroupFieldNameList 鏁版嵁鍖哄垎缁勫瓧娈靛悕绉發ist
-	 * @param dataAreaFieldConfigMap     鏁版嵁鍖哄瓧娈电紦瀛榤ap
-	 * @return 涓氬姟鏁版嵁鍐呭html
-	 */
-	private List<List<ReportColumn>> getDataAreaData(List<JSONObject> dataTitleList, JSONObject dataAreaFieldRecordObj, Map<JSONObject, JSONObject> statisticsMap, String totalName, List<String> dataAreaGroupFieldNameList, Map<String, JSONObject> dataAreaFieldConfigMap) {
-		List<List<JSONObject>> dataAreaGroupFieldDataList = Lists.newArrayList();
-		getDataAreaGroupFieldDataList(dataAreaFieldRecordObj, dataAreaGroupFieldDataList, new JSONObject(), 1, 1, dataAreaGroupFieldNameList.size(), null);
-		List<List<ReportColumn>> dataRows = new ArrayList<>();
-		List<JSONObject> groupTitleList = Lists.newArrayList();
-		JSONObject obj;
-		for (List<JSONObject> rowList : dataAreaGroupFieldDataList) {
-			obj = dataListReportService.extendJSONObject(null, rowList.get(rowList.size() - 1), Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD), -1);
-			groupTitleList.add(obj);
-		}
-
-//		StringBuilder html = new StringBuilder(1024);
-		JSONObject dataAreaGroupFieldObj;
-		int rowspan;
-		int colspan;
-		String value;
-		JSONObject groupTitleObj;
-		JSONObject keyObj;
-		JSONObject valueObj;
-		String statisticsType;
-		JSONObject dataAreaFieldConfigObj;
-		int groupAreaSubCnt;
-		int dataAreaSubCnt;
-		List<JSONObject> curRowList;
-		int index;
-		for (int i = 0; i < dataAreaGroupFieldDataList.size(); i++) {
-			List<ReportColumn> columns = new ArrayList<>();
-			index = 0;
-			curRowList = dataAreaGroupFieldDataList.get(i);
-			if (!curRowList.isEmpty()) {
-				for (int j = 0; j < curRowList.size(); j++) {
-					dataAreaGroupFieldObj = curRowList.get(j);
-					if (dataAreaGroupFieldObj.isEmpty()) {
-						continue;
-					}
-//					if (index == 0) {
-//						if ("1".equals(dataAreaGroupFieldObj.getString(CmnConst.ATTR_IS_STATISTICS_FIELD))) {
-//							html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
-//						} else {
-//							html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
-//						}
-//					}
-					rowspan = Math.max(1, dataAreaGroupFieldObj.getIntValue(CmnConst.ATTR_ROWSPAN));
-					colspan = Math.max(1, dataAreaGroupFieldObj.getIntValue(CmnConst.ATTR_COLSPAN));
-					value = dataAreaGroupFieldObj.getString(CmnConst.ATTR_SHOW_NAME);
-					ReportColumn column = new ReportColumn();
-					column.setRowspan(rowspan);
-					column.setColspan(colspan);
-					column.setContent(value);
-					columns.add(column);
-//					html.append("<td rowspan=\"").append(rowspan).append("\" colspan=\"").append(colspan).append("\">").append(value == null ? "" : value).append("</td>");
-					index++;
+		List<List<ReportColumn>> reportColumnList = new ArrayList<>();
+		//瑙f瀽html
+		//鍦╤tml鍓嶉潰鎷兼帴涓�涓猼able鏍囩鍜宼body锛屽惁鍒橨soup瑙f瀽浼氭姤閿�
+		html.insert(0, "<table><tbody>");
+		html.append("</tbody></table>");
+		Document doc = Jsoup.parse(html.toString());
+		Elements trs = doc.select("tr");
+		Elements tds;
+		List<ReportColumn> reportColumn;
+		ReportColumn column;
+		for (Element tr : trs) {
+			tds = tr.select("td");
+			reportColumn = new ArrayList<>();
+			for (Element td : tds) {
+				column = new ReportColumn();
+				column.setColspan(Integer.parseInt(BaseUtil.ifNull(td.attr("colspan"), "1")));
+				column.setRowspan(Integer.parseInt(BaseUtil.ifNull(td.attr("rowspan"), "1")));
+				Set<String> classNames = td.classNames();
+				if (classNames.contains(CmnConst.CLASS_TD_CAN_TURN)) {
+					column.setPenetrate(true);
+					column.setPenetrateProperty(td.attr("router"));
 				}
+				column.setContent(td.text());
+				reportColumn.add(column);
 			}
-//			else {
-//				html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_COMMON).append("\">\n    ");
-//			}
-			groupTitleObj = groupTitleList.get(i);
-			for (JSONObject dataTitleObj : dataTitleList) {
-				keyObj = dataListReportService.extendJSONObject((JSONObject) groupTitleObj.clone(), dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1);
-				dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO)));
-				if (dataAreaFieldConfigObj != null) {
-					groupAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
-					dataAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_DATA_AREA_SUB_CNT);
-					keyObj.remove(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
-					keyObj.remove(CmnConst.ATTR_DATA_AREA_SUB_CNT);
-					keyObj.remove(CmnConst.ATTR_REAL_VALUE);
-					statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS);
-					valueObj = statisticsMap.get(keyObj);
-					if (valueObj == null || valueObj.isEmpty()) {
-						value = getFinalValue(keyObj, dataAreaFieldConfigObj, statisticsMap);
-					} else {
-						if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) {
-							if (dataAreaSubCnt == 0 && groupAreaSubCnt == 0) {
-								value = valueObj.getString(statisticsType);
-							} else {
-								value = getTwoTypesGroupAvgStatisticsValue(dataAreaSubCnt, groupAreaSubCnt, valueObj, dataAreaFieldConfigObj, statisticsType);
-							}
-						} else {
-							value = valueObj.getString(statisticsType);
-						}
-						valueObj.put(CmnConst.ATTR_FINAL_VALUE, value);
-					}
-				} else {
-					value = "";
-				}
-//				html.append("<td");
-				ReportColumn column = new ReportColumn();
-				if (!StringUtils.isEmpty(value)) {
-					// class
-					if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
-						dataListReportService.extendJSONObject(keyObj, dataAreaFieldConfigObj, Collections.singletonList(CmnConst.ATTR_URL));
-//						html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\"");
-					}
-					// 瀛楁灞炴��
-					dataListReportService.getTdAttrObj(keyObj, groupTitleObj);
-					dataListReportService.getTdAttrObj(keyObj, dataTitleObj);
-					String attrUrL = keyObj.getString(CmnConst.ATTR_URL);
-					if (!StringUtils.isEmpty(attrUrL)) {
-						column.setPenetrateProperty(attrUrL.toString());
-						column.setPenetrate(true);
-					}
-					for (String key : keyObj.keySet()) {
-						column.addProperty(key, keyObj.getString(key));
-					}
-//					html.append(dataListReportService.getTdAttrByObj(keyObj));
-					// 鏍煎紡
-					value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
-				}
-//				html.append(">").append(value == null ? "" : value).append("</td>");
-				column.setContent(value);
-				columns.add(column);
-			}
-//			html.append("\n</tr>");
-			dataRows.add(columns);
+			reportColumnList.add(reportColumn);
 		}
-
-		// 鎬昏
-		if (!StringUtils.isEmpty(totalName)) {
-			dataRows.add(getTotalStatistics(statisticsMap, dataTitleList, dataAreaFieldConfigMap, dataAreaGroupFieldNameList.size(), getSubCnt(dataAreaFieldRecordObj), totalName));
-		}
-
-		return dataRows;
+		return reportColumnList;
 	}
 
 	/**
@@ -1275,86 +923,6 @@
 			}
 		}
 		return row;
-	}
-
-	/**
-	 * 鑾峰彇鎬昏html
-	 *
-	 * @param statisticsMap           缁熻map
-	 * @param dataTitleList           鏁版嵁鏍囬list
-	 * @param dataAreaFieldConfigMap  鏁版嵁鍖哄瓧娈电紦瀛榤ap
-	 * @param dataAreaGroupFieldCount 鏁版嵁鍖哄垎缁勫瓧娈典釜鏁�
-	 * @param dataAreaSubCnt          鏁版嵁鍖轰笅绾у垎缁勯」鏁�
-	 * @param totalName               鎬昏鍚嶇О
-	 * @return
-	 */
-	private List<ReportColumn> getTotalStatistics(Map<JSONObject, JSONObject> statisticsMap, List<JSONObject> dataTitleList, Map<String, JSONObject> dataAreaFieldConfigMap, int dataAreaGroupFieldCount, int dataAreaSubCnt, String totalName) {
-		List<ReportColumn> columns = new ArrayList<>();
-//		StringBuilder html = new StringBuilder(256);
-//		html.append("\n<tr class=\"").append(CmnConst.CLASS_TR_DATA_STATISTICS).append("\">\n    ");
-//		html.append("<td colspan=\"").append(dataAreaGroupFieldCount).append("\">").append(totalName).append("</td>");
-		ReportColumn column = new ReportColumn();
-		columns.add(column);
-		column.setColspan(dataAreaGroupFieldCount);
-		column.setContent(totalName);
-		JSONObject dataTitleObj;
-		JSONObject keyObj;
-		JSONObject dataAreaFieldConfigObj;
-		String statisticsType;
-		JSONObject valueObj;
-		String value;
-		int groupAreaSubCnt;
-		for (int i = 0; i < dataTitleList.size(); i++) {
-			column = new ReportColumn();
-			columns.add(column);
-			dataTitleObj = dataTitleList.get(i);
-			keyObj = dataListReportService.extendJSONObject(null, dataTitleObj, Arrays.asList(CmnConst.ATTR_ROWSPAN, CmnConst.ATTR_COLSPAN, CmnConst.ATTR_SHOW_NAME, CmnConst.ATTR_IS_STATISTICS_FIELD, CmnConst.ATTR_REAL_VALUE), -1);
-			dataAreaFieldConfigObj = dataAreaFieldConfigMap.get(dataListReportService.fieldInfo2FieldName(dataTitleObj.getString(CmnConst.ATTR_FIELD_INFO)));
-			if (dataAreaFieldConfigObj != null) {
-				groupAreaSubCnt = keyObj.getIntValue(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
-				keyObj.remove(CmnConst.ATTR_GROUP_AREA_SUB_CNT);
-				statisticsType = dataAreaFieldConfigObj.getString(CmnConst.ATTR_STATISTICS);
-				valueObj = statisticsMap.get(keyObj);
-				if (valueObj == null || valueObj.isEmpty()) {
-					value = getFinalValue(keyObj, dataAreaFieldConfigObj, statisticsMap);
-				} else {
-					if (CmnConst.ATTR_STATISTICS_AVG.equals(statisticsType) && "1".equals(dataAreaFieldConfigObj.getString(CmnConst.ATTR_AVG_TYPE))) {
-						value = getTwoTypesGroupAvgStatisticsValue(dataAreaSubCnt, groupAreaSubCnt, valueObj, dataAreaFieldConfigObj, statisticsType);
-					} else {
-						value = valueObj.getString(statisticsType);
-					}
-					valueObj.put(CmnConst.ATTR_FINAL_VALUE, value);
-				}
-			} else {
-				value = "";
-			}
-//			html.append("<td");
-			if (!StringUtils.isEmpty(value)) {
-				// class
-				if (!StringUtils.isEmpty(dataAreaFieldConfigObj.getString(CmnConst.ATTR_URL))) {
-					dataListReportService.extendJSONObject(keyObj, dataAreaFieldConfigObj, Collections.singletonList(CmnConst.ATTR_URL));
-//					html.append(" class=\"").append(CmnConst.CLASS_TD_CAN_TURN).append("\"");
-				}
-				// 瀛楁灞炴��
-				dataListReportService.getTdAttrObj(keyObj, dataTitleObj);
-				String attrUrL = keyObj.getString(CmnConst.ATTR_URL);
-				if (!StringUtils.isEmpty(attrUrL)) {
-					column.setPenetrateProperty(attrUrL.toString());
-					column.setPenetrate(true);
-				}
-				for (String key : keyObj.keySet()) {
-					column.addProperty(key, keyObj.getString(key));
-				}
-//				html.append(dataListReportService.getTdAttrByObj(keyObj));
-				// 鏍煎紡
-				value = dataListReportService.formatValue(dataAreaFieldConfigObj, value);
-
-			}
-			column.setContent(value);
-//			html.append(">").append(value == null ? "" : value).append("</td>");
-		}
-//		html.append("\n</tr>");
-		return columns;
 	}
 
 	/**
diff --git a/src/main/java/com/product/server/report/service/ReportConfigService.java b/src/main/java/com/product/server/report/service/ReportConfigService.java
index aa28e6a..45c1bda 100644
--- a/src/main/java/com/product/server/report/service/ReportConfigService.java
+++ b/src/main/java/com/product/server/report/service/ReportConfigService.java
@@ -8,7 +8,6 @@
 import com.product.admin.service.UpdateLoginUserInfoService;
 import com.product.common.lang.StringUtils;
 import com.product.core.cache.DataPoolCacheImpl;
-import com.product.core.config.CoreConst;
 import com.product.core.dao.BaseDao;
 import com.product.core.entity.DataTableEntity;
 import com.product.core.entity.FieldSetEntity;
@@ -24,595 +23,576 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import javax.xml.crypto.Data;
-import java.util.*;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 @Component
 public class ReportConfigService extends AbstractBaseService implements IReportConfigService {
-	@Autowired
-	BaseDao baseDao;
-	@Autowired
-	CodeService codeService;
-	@Autowired
-	public QueryFilterService queryFilterService;
-	@Autowired
-	public DataListReportService dataListReportService;
+    @Autowired
+    BaseDao baseDao;
+    @Autowired
+    CodeService codeService;
+    @Autowired
+    public QueryFilterService queryFilterService;
+    @Autowired
+    public DataListReportService dataListReportService;
 
-	/**
-	 * 鎶ヨ〃鍒楄〃
-	 *
-	 * @param cpage
-	 * @param pageSize
-	 * @return
-	 */
-	public DataTableEntity listReportConfig(Integer cpage, Integer pageSize, FieldSetEntity fse) {
-		cpage = cpage == null ? 1 : cpage;
-		pageSize = pageSize == null ? 20 : pageSize;
+    /**
+     * 鎶ヨ〃鍒楄〃
+     *
+     * @param cpage
+     * @param pageSize
+     * @return
+     */
+    public DataTableEntity listReportConfig(Integer cpage, Integer pageSize, FieldSetEntity fse) {
+        cpage = cpage == null ? 1 : cpage;
+        pageSize = pageSize == null ? 20 : pageSize;
 
-		List<Object> paramList = Lists.newArrayList();
-		StringBuilder sql = new StringBuilder(512);
-		String queryFilter = " ";
-		if(!BaseUtil.dataTableIsEmpty(fse.getSubDataTable("systemSeniorQueryString"))){
-			queryFilter ="AND"+ queryFilterService.getQueryFilter(fse);
-		}
-		sql.append("\nSELECT a.uuid,a.type_uuid,a.is_valid,a.org_level_uuid,a.report_name,b.type_name,b.type_group")
-				.append("\nFROM product_sys_report_config a")
-				.append("\nLEFT JOIN product_sys_report_type_config b ON a.type_uuid = b.uuid")
-				.append("\nwhere (function_uuid is null or function_uuid='') ")
-		        .append(queryFilter);
+        List<Object> paramList = Lists.newArrayList();
+        StringBuilder sql = new StringBuilder(512);
+        sql.append("\nSELECT a.uuid,a.type_uuid,a.is_valid,a.org_level_uuid,a.report_name,b.type_name,b.type_group")
+                .append("\nFROM product_sys_report_config a")
+                .append("\nLEFT JOIN product_sys_report_type_config b ON a.type_uuid = b.uuid")
+                .append("\nwhere (function_uuid is null or function_uuid='') ");
+        if (!StringUtils.isEmpty(fse.getString(CmnConst.TYPE_UUID))) {
+            sql.append("\nand b.type_group=?");
+            paramList.add(fse.getString(CmnConst.TYPE_UUID));
+        }
+        return baseDao.listTable(sql.toString(), paramList.toArray(), pageSize, cpage);
+    }
 
-		if (!StringUtils.isEmpty(fse.getString(CmnConst.TYPE_UUID))) {
-			sql.append("\nand b.type_group=? ");
-			paramList.add(fse.getString(CmnConst.TYPE_UUID));
-		}
-		return baseDao.listTable(sql.toString(), paramList.toArray(), pageSize, cpage);
-	}
+    /**
+     * 鎶ヨ〃璇︽儏
+     *
+     * @param uuid
+     * @return
+     */
+    public FieldSetEntity findReportConfig(String uuid) {
+        StringBuilder sql = new StringBuilder(256);
+        sql.append("\nselect report_area,cell_position_y,cell_position_x,attribute_name,report_type_attr_value")
+                .append("\nfrom (")
+                .append("\n    select report_area,cell_position_y,cell_position_x,report_type_attr_value,report_type_attr FROM product_sys_report_config_attribute ca")
+                .append("\n    where report_config_uuid=?")
+                .append("\n) ca")
+                .append("\nleft join (")
+                .append("\n    select uuid,attribute_name FROM product_sys_report_type_attribute where type_group='DataList'")
+                .append("\n) ta on ca.report_type_attr=ta.uuid")
+                .append("\nwhere attribute_name is not null ")
+                .append("\norder by report_area,cell_position_y,cell_position_x");
+        DataTableEntity tempDte = baseDao.listTable(sql.toString(), new Object[]{uuid});
+        DataTableEntity reportConfigAttrDte = new DataTableEntity();
+        FieldSetEntity tempFse;
+        FieldSetEntity reportConfigAttrFse = new FieldSetEntity();
+        String curReportArea;
+        String curX;
+        String curY;
+        String preReportArea = "";
+        String preX = "";
+        String preY = "";
+        for (int i = 0; i < tempDte.getRows(); i++) {
+            tempFse = tempDte.getFieldSetEntity(i);
+            curReportArea = tempFse.getString(CmnConst.ATTR_REPORT_AREA);
+            curX = tempFse.getString(CmnConst.CELL_POSITION_X);
+            curY = tempFse.getString(CmnConst.CELL_POSITION_Y);
+            if (curReportArea == null || curX == null || curY == null) {
+                continue;
+            }
+            if (!preReportArea.equals(curReportArea) || !preX.equals(curX) || !preY.equals(curY)) {
+                reportConfigAttrFse = new FieldSetEntity();
+                reportConfigAttrDte.addFieldSetEntity(reportConfigAttrFse);
+                reportConfigAttrFse.setTableName(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE);
+                reportConfigAttrFse.setValue(CmnConst.ATTR_X, curX);
+                reportConfigAttrFse.setValue(CmnConst.ATTR_Y, curY);
+                reportConfigAttrFse.setValue(CmnConst.ATTR_REPORT_AREA, curReportArea);
+            }
+            reportConfigAttrFse.setValue(tempFse.getString(CmnConst.ATTRIBUTE_NAME), tempFse.getString(CmnConst.REPORT_TYPE_ATTR_VALUE));
+            preReportArea = curReportArea;
+            preX = curX;
+            preY = curY;
+        }
 
-	/**
-	 * 鎶ヨ〃璇︽儏
-	 *
-	 * @param uuid
-	 * @return
-	 */
-	public FieldSetEntity findReportConfig(String uuid) {
-		StringBuilder sql = new StringBuilder(256);
-		sql.append("\nselect report_area,cell_position_y,cell_position_x,attribute_name,report_type_attr_value")
-				.append("\nfrom (")
-				.append("\n    select report_area,cell_position_y,cell_position_x,report_type_attr_value,report_type_attr FROM product_sys_report_config_attribute ca")
-				.append("\n    where report_config_uuid=?")
-				.append("\n) ca")
-				.append("\nleft join (")
-				.append("\n    select uuid,attribute_name FROM product_sys_report_type_attribute where type_group='DataList'")
-				.append("\n) ta on ca.report_type_attr=ta.uuid")
-				.append("\nwhere attribute_name is not null ")
-				.append("\norder by report_area,cell_position_y,cell_position_x");
-		DataTableEntity tempDte = baseDao.listTable(sql.toString(), new Object[]{uuid});
-		DataTableEntity reportConfigAttrDte = new DataTableEntity();
-		FieldSetEntity tempFse;
-		FieldSetEntity reportConfigAttrFse = new FieldSetEntity();
-		String curReportArea;
-		String curX;
-		String curY;
-		String preReportArea = "";
-		String preX = "";
-		String preY = "";
-		for (int i = 0; i < tempDte.getRows(); i++) {
-			tempFse = tempDte.getFieldSetEntity(i);
-			curReportArea = tempFse.getString(CmnConst.ATTR_REPORT_AREA);
-			curX = tempFse.getString(CmnConst.CELL_POSITION_X);
-			curY = tempFse.getString(CmnConst.CELL_POSITION_Y);
-			if (curReportArea == null || curX == null || curY == null) {
-				continue;
-			}
-			if (!preReportArea.equals(curReportArea) || !preX.equals(curX) || !preY.equals(curY)) {
-				reportConfigAttrFse = new FieldSetEntity();
-				reportConfigAttrDte.addFieldSetEntity(reportConfigAttrFse);
-				reportConfigAttrFse.setTableName(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE);
-				reportConfigAttrFse.setValue(CmnConst.ATTR_X, curX);
-				reportConfigAttrFse.setValue(CmnConst.ATTR_Y, curY);
-				reportConfigAttrFse.setValue(CmnConst.ATTR_REPORT_AREA, curReportArea);
-			}
-			reportConfigAttrFse.setValue(tempFse.getString(CmnConst.ATTRIBUTE_NAME), tempFse.getString(CmnConst.REPORT_TYPE_ATTR_VALUE));
-			preReportArea = curReportArea;
-			preX = curX;
-			preY = curY;
-		}
+        FieldSetEntity reportConfigFse = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_REPORT_CONFIG, uuid, false);
+        reportConfigFse.addSubDataTable(reportConfigAttrDte);
 
-		FieldSetEntity reportConfigFse = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_REPORT_CONFIG, uuid, false);
-		reportConfigFse.addSubDataTable(reportConfigAttrDte);
+        return reportConfigFse;
+    }
 
-		return reportConfigFse;
-	}
+    /**
+     * 鎶ヨ〃鏂板
+     *
+     * @param fse
+     * @return
+     */
+    @Transactional
+    public String addReportConfig(FieldSetEntity fse) {
+        fse.setValue(CmnConst.CREATED_BY, SpringMVCContextHolder.getCurrentUserId());
+        fse.setValue(CmnConst.CREATED_UTC_DATETIME, new Date());
+        fse.setValue(CmnConst.IS_VALID, 1);
 
-	/**
-	 * 鎶ヨ〃鏂板
-	 *
-	 * @param fse
-	 * @return
-	 */
-	@Transactional
-	public String addReportConfig(FieldSetEntity fse) {
-		fse.setValue(CmnConst.CREATED_BY, SpringMVCContextHolder.getCurrentUserId());
-		fse.setValue(CmnConst.CREATED_UTC_DATETIME, new Date());
-		fse.setValue(CmnConst.IS_VALID, 1);
+        replaceAttrName2UUID(fse);
 
-		replaceAttrName2UUID(fse);
+        if (StringUtils.isEmpty(fse.getString(CmnConst.PAGE_SIZE))) {
+            fse.setValue(CmnConst.PAGE_SIZE, null);
+        }
 
-		if (StringUtils.isEmpty(fse.getString(CmnConst.PAGE_SIZE))) {
-			fse.setValue(CmnConst.PAGE_SIZE, null);
-		}
-		System.out.println(System.currentTimeMillis());
-		String uuid = baseDao.add(fse);
-		System.out.println(System.currentTimeMillis());
+        String uuid = baseDao.add(fse);
 
-		if ("1".equals(fse.getString(CmnConst.RELATE_FLAG))) {
-			// 閲嶆柊璁剧疆缂撳瓨
-			dataListReportService.setConfig(fse.getUUID());
-		}
+        if ("1".equals(fse.getString(CmnConst.RELATE_FLAG))) {
+            // 閲嶆柊璁剧疆缂撳瓨
+            dataListReportService.setConfig(fse.getUUID());
+        }
 
-		return uuid;
-	}
+        return uuid;
+    }
 
-	/**
-	 * 鎶ヨ〃淇敼
-	 *
-	 * @param fse
-	 * @return
-	 */
-	@Transactional
-	public boolean updateReportConfig(FieldSetEntity fse) {
-		fse.setValue(CmnConst.UPDATED_BY, SpringMVCContextHolder.getCurrentUserId());
-		fse.setValue(CmnConst.UPDATED_UTC_DATETIME, new Date());
+    /**
+     * 鎶ヨ〃淇敼
+     *
+     * @param fse
+     * @return
+     */
+    @Transactional
+    public boolean updateReportConfig(FieldSetEntity fse) {
+        fse.setValue(CmnConst.UPDATED_BY, SpringMVCContextHolder.getCurrentUserId());
+        fse.setValue(CmnConst.UPDATED_UTC_DATETIME, new Date());
 
-		replaceAttrName2UUID(fse);
+        replaceAttrName2UUID(fse);
 
-		if (StringUtils.isEmpty(fse.getString(CmnConst.PAGE_SIZE))) {
-			fse.setValue(CmnConst.PAGE_SIZE, null);
-		}
+        if (StringUtils.isEmpty(fse.getString(CmnConst.PAGE_SIZE))) {
+            fse.setValue(CmnConst.PAGE_SIZE, null);
+        }
 
-		boolean result = baseDao.update(fse);
+        boolean result = baseDao.update(fse);
 
-		if ("1".equals(fse.getString(CmnConst.RELATE_FLAG)) || !StringUtils.isEmpty(fse.getString(CmnConst.FUNCTION_UUID))) {
-			// 閲嶆柊璁剧疆缂撳瓨
-			dataListReportService.setConfig(fse.getUUID());
-		}
+        if ("1".equals(fse.getString(CmnConst.RELATE_FLAG)) || !StringUtils.isEmpty(fse.getString(CmnConst.FUNCTION_UUID))) {
+            // 閲嶆柊璁剧疆缂撳瓨
+            dataListReportService.setConfig(fse.getUUID());
+        }
 
-		return result;
-	}
+        return result;
+    }
 
-	/**
-	 * 鏇挎崲灞炴�у悕绉颁负uuid
-	 *
-	 * @param fse
-	 */
-	private void replaceAttrName2UUID(FieldSetEntity fse) {
-		DataTableEntity reportTypeAttrDte = baseDao.listTable(CmnConst.PRODUCT_SYS_REPORT_TYPE_ATTRIBUTE, "type_group='DataList'", new Object[]{}, new Object[]{CmnConst.ATTRIBUTE_NAME, CmnConst.UUID});
-		if (!BaseUtil.dataTableIsEmpty(reportTypeAttrDte)) {
-			Map<String, String> reportTypeAttrMap = Maps.newHashMap();
-			FieldSetEntity tempFse;
-			for (int i = 0; i < reportTypeAttrDte.getRows(); i++) {
-				tempFse = reportTypeAttrDte.getFieldSetEntity(i);
-				reportTypeAttrMap.put(tempFse.getString(CmnConst.ATTRIBUTE_NAME), tempFse.getUUID());
-			}
-			DataTableEntity preReportAttrDte = baseDao.listTable(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE, "report_config_uuid=?", new Object[]{fse.getUUID()});
-			Map<JSONObject, String> preReportAttrMap = Maps.newHashMap();
-			JSONObject tempObj;
-			if (!BaseUtil.dataTableIsEmpty(preReportAttrDte)) {
-				for (int i = 0; i < preReportAttrDte.getRows(); i++) {
-					tempFse = preReportAttrDte.getFieldSetEntity(i);
-					tempObj = new JSONObject();
-					tempObj.put(CmnConst.ATTR_REPORT_AREA, tempFse.getString(CmnConst.ATTR_REPORT_AREA));
-					tempObj.put(CmnConst.CELL_POSITION_X, tempFse.getString(CmnConst.CELL_POSITION_X));
-					tempObj.put(CmnConst.CELL_POSITION_Y, tempFse.getString(CmnConst.CELL_POSITION_Y));
-					tempObj.put(CmnConst.REPORT_TYPE_ATTR, tempFse.getString(CmnConst.REPORT_TYPE_ATTR));
-					preReportAttrMap.put(tempObj, tempFse.getUUID());
-				}
-			}
-			DataTableEntity reportAttrDte = fse.getSubDataTable(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE);
-			if (!BaseUtil.dataTableIsEmpty(reportAttrDte)) {
-				String tempUUID;
-				for (int i = 0; i < reportAttrDte.getRows(); i++) {
-					tempFse = reportAttrDte.getFieldSetEntity(i);
-					tempFse.setValue("report_type_attr_show_name", tempFse.getString(CmnConst.REPORT_TYPE_ATTR));
-					tempFse.setValue(CmnConst.REPORT_TYPE_ATTR, reportTypeAttrMap.get(tempFse.getString(CmnConst.REPORT_TYPE_ATTR)));
-					tempFse.setValue(CmnConst.CELL_POSITION_X, tempFse.getString(CmnConst.ATTR_X));
-					tempFse.setValue(CmnConst.CELL_POSITION_Y, tempFse.getString(CmnConst.ATTR_Y));
-					String x = tempFse.getString(CmnConst.ATTR_X);
-					tempObj = new JSONObject();
-					tempObj.put(CmnConst.ATTR_REPORT_AREA, tempFse.getString(CmnConst.ATTR_REPORT_AREA));
-					tempObj.put(CmnConst.CELL_POSITION_X, tempFse.getString(CmnConst.CELL_POSITION_X));
-					tempObj.put(CmnConst.CELL_POSITION_Y, tempFse.getString(CmnConst.CELL_POSITION_Y));
-					tempObj.put(CmnConst.REPORT_TYPE_ATTR, tempFse.getString(CmnConst.REPORT_TYPE_ATTR));
+    /**
+     * 鏇挎崲灞炴�у悕绉颁负uuid
+     *
+     * @param fse
+     */
+    private void replaceAttrName2UUID(FieldSetEntity fse) {
+        DataTableEntity reportTypeAttrDte = baseDao.listTable(CmnConst.PRODUCT_SYS_REPORT_TYPE_ATTRIBUTE, "type_group='DataList'", new Object[]{}, new Object[]{CmnConst.ATTRIBUTE_NAME, CmnConst.UUID});
+        if (!BaseUtil.dataTableIsEmpty(reportTypeAttrDte)) {
+            Map<String, String> reportTypeAttrMap = Maps.newHashMap();
+            FieldSetEntity tempFse;
+            for (int i = 0; i < reportTypeAttrDte.getRows(); i++) {
+                tempFse = reportTypeAttrDte.getFieldSetEntity(i);
+                reportTypeAttrMap.put(tempFse.getString(CmnConst.ATTRIBUTE_NAME), tempFse.getUUID());
+            }
+            DataTableEntity preReportAttrDte = baseDao.listTable(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE, "report_config_uuid=?", new Object[]{fse.getUUID()});
+            Map<JSONObject, String> preReportAttrMap = Maps.newHashMap();
+            JSONObject tempObj;
+            if (!BaseUtil.dataTableIsEmpty(preReportAttrDte)) {
+                for (int i = 0; i < preReportAttrDte.getRows(); i++) {
+                    tempFse = preReportAttrDte.getFieldSetEntity(i);
+                    tempObj = new JSONObject();
+                    tempObj.put(CmnConst.ATTR_REPORT_AREA, tempFse.getString(CmnConst.ATTR_REPORT_AREA));
+                    tempObj.put(CmnConst.CELL_POSITION_X, tempFse.getString(CmnConst.CELL_POSITION_X));
+                    tempObj.put(CmnConst.CELL_POSITION_Y, tempFse.getString(CmnConst.CELL_POSITION_Y));
+                    tempObj.put(CmnConst.REPORT_TYPE_ATTR, tempFse.getString(CmnConst.REPORT_TYPE_ATTR));
+                    preReportAttrMap.put(tempObj, tempFse.getUUID());
+                }
+            }
+            DataTableEntity reportAttrDte = fse.getSubDataTable(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE);
+            if (!BaseUtil.dataTableIsEmpty(reportAttrDte)) {
+                String tempUUID;
+                for (int i = 0; i < reportAttrDte.getRows(); i++) {
+                    tempFse = reportAttrDte.getFieldSetEntity(i);
+                    tempFse.setValue(CmnConst.REPORT_TYPE_ATTR, reportTypeAttrMap.get(tempFse.getString(CmnConst.REPORT_TYPE_ATTR)));
+                    tempFse.setValue(CmnConst.CELL_POSITION_X, tempFse.getString(CmnConst.ATTR_X));
+                    tempFse.setValue(CmnConst.CELL_POSITION_Y, tempFse.getString(CmnConst.ATTR_Y));
 
-					tempUUID = preReportAttrMap.get(tempObj);
-					if (!StringUtils.isEmpty(tempUUID)) {
-						tempFse.setValue(CmnConst.UUID, tempUUID);
-					}
-					if (StringUtils.isEmpty(tempFse.getString(CmnConst.REPORT_TYPE_ATTR_VALUE))) {
-						//灞炴�у�兼槸鍚︿负绌�
-						if (StringUtils.isEmpty(tempFse.getUUID())) {
-							//娌℃湁淇濆瓨杩囩殑灞炴��
-							reportAttrDte.removeFieldSetEntity(i);
-							i--;
-						} else {
-							//鏍囪涓哄垹闄�
-							tempFse.setValue(CoreConst.SYSTEM_DATA_OPERATE_TYPE, "del");
-						}
-						continue;
-					}
-				}
-			}
-		}
-	}
+                    tempObj = new JSONObject();
+                    tempObj.put(CmnConst.ATTR_REPORT_AREA, tempFse.getString(CmnConst.ATTR_REPORT_AREA));
+                    tempObj.put(CmnConst.CELL_POSITION_X, tempFse.getString(CmnConst.CELL_POSITION_X));
+                    tempObj.put(CmnConst.CELL_POSITION_Y, tempFse.getString(CmnConst.CELL_POSITION_Y));
+                    tempObj.put(CmnConst.REPORT_TYPE_ATTR, tempFse.getString(CmnConst.REPORT_TYPE_ATTR));
 
-	/**
-	 * 鎶ヨ〃鍒犻櫎
-	 *
-	 * @param uuid
-	 * @return
-	 */
-	@Transactional
-	public boolean deleteReportConfig(String uuid) {
-		return baseDao.delete(CmnConst.PRODUCT_SYS_REPORT_CONFIG, "uuid=?", new Object[]{uuid});
-	}
+                    tempUUID = preReportAttrMap.get(tempObj);
+                    if (!StringUtils.isEmpty(tempUUID)) {
+                        tempFse.setValue(CmnConst.UUID, tempUUID);
+                    }
+                }
+            }
+        }
+    }
 
-	@Autowired
-	UpdateLoginUserInfoService updateLoginUserInfoService;
+    /**
+     * 鎶ヨ〃鍒犻櫎
+     *
+     * @param uuid
+     * @return
+     */
+    @Transactional
+    public boolean deleteReportConfig(String uuid) {
+        return baseDao.delete(CmnConst.PRODUCT_SYS_REPORT_CONFIG, "uuid=?", new Object[]{uuid});
+    }
 
-	/**
-	 * 鍙栨秷鎶ヨ〃鍙戝竷
-	 *
-	 * @param fse
-	 * @return
-	 */
-	@Transactional
-	public boolean cancelRelease(FieldSetEntity fse) {
-		DataTableEntity reportConfigDte = DataPoolCacheImpl.getInstance().getCacheData(CmnConst.CACHE_REPORT_CONFIG, new String[]{fse.getUUID()});
-		if (BaseUtil.dataTableIsEmpty(reportConfigDte)) {
-			throw new BaseException(ReportCode.GET_REPORT_CONFIG_FIAL.getValue(), ReportCode.GET_REPORT_CONFIG_FIAL.getText());
-		}
-		FieldSetEntity reportConfigFse = reportConfigDte.getFieldSetEntity(0);
-		String functionUUID = reportConfigFse.getString(CmnConst.FUNCTION_UUID);
-		if (StringUtils.isEmpty(functionUUID)) {
-			return false;
-		}
+    @Autowired
+    UpdateLoginUserInfoService updateLoginUserInfoService;
 
-		DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_SYS_FUNCTION_PERMISSION, "function_uuid=?", new Object[]{functionUUID}, new Object[]{"role_uuid uuid"});
-		//浠庤鑹叉潈闄愪腑绉婚櫎
-		baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTION_PERMISSION, "function_uuid=?", new Object[]{functionUUID});
-		//鍒犻櫎杩炵嚎
-		baseDao.delete(CmnConst.PRODUCT_SYS_LINK, "function_uuid=?", new Object[]{functionUUID});
-		//鍒犻櫎鎸夐挳
-		baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS, "function_uuid=?", new Object[]{functionUUID});
-		//鍒犻櫎椤甸潰
-		baseDao.delete(CmnConst.PRODUCT_SYS_MVC_PAGE, "function_uuid=?", new Object[]{functionUUID});
+    /**
+     * 鍙栨秷鎶ヨ〃鍙戝竷
+     *
+     * @param fse
+     * @return
+     */
+    @Transactional
+    public boolean cancelRelease(FieldSetEntity fse) {
+        DataTableEntity reportConfigDte = DataPoolCacheImpl.getInstance().getCacheData(CmnConst.CACHE_REPORT_CONFIG, new String[]{fse.getUUID()});
+        if (BaseUtil.dataTableIsEmpty(reportConfigDte)) {
+            throw new BaseException(ReportCode.GET_REPORT_CONFIG_FIAL.getValue(), ReportCode.GET_REPORT_CONFIG_FIAL.getText());
+        }
+        FieldSetEntity reportConfigFse = reportConfigDte.getFieldSetEntity(0);
+        String functionUUID = reportConfigFse.getString(CmnConst.FUNCTION_UUID);
+        if (StringUtils.isEmpty(functionUUID)) {
+            return false;
+        }
 
-		//鍒犻櫎鑿滃崟
-		baseDao.delete(CmnConst.PRODUCT_SYS_MENUS, "function_uuid=?", new Object[]{functionUUID});
-		//鍒犻櫎鍔熻兘
-		baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTIONS, "uuid=?", new Object[]{functionUUID});
+        DataTableEntity dt = baseDao.listTable(CmnConst.PRODUCT_SYS_FUNCTION_PERMISSION, "function_uuid=?", new Object[]{functionUUID}, new Object[]{"role_uuid uuid"});
+        //浠庤鑹叉潈闄愪腑绉婚櫎
+        baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTION_PERMISSION, "function_uuid=?", new Object[]{functionUUID});
+        //鍒犻櫎杩炵嚎
+        baseDao.delete(CmnConst.PRODUCT_SYS_LINK, "function_uuid=?", new Object[]{functionUUID});
+        //鍒犻櫎鎸夐挳
+        baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS, "function_uuid=?", new Object[]{functionUUID});
+        //鍒犻櫎椤甸潰
+        baseDao.delete(CmnConst.PRODUCT_SYS_MVC_PAGE, "function_uuid=?", new Object[]{functionUUID});
 
-		//鏁版嵁鍥炲啓
-		fse.setValue(CmnConst.FUNCTION_UUID, "");
+        //鍒犻櫎鑿滃崟
+        baseDao.delete(CmnConst.PRODUCT_SYS_MENUS, "function_uuid=?", new Object[]{functionUUID});
+        //鍒犻櫎鍔熻兘
+        baseDao.delete(CmnConst.PRODUCT_SYS_FUNCTIONS, "uuid=?", new Object[]{functionUUID});
 
-		if (!DataTableEntity.isEmpty(dt)) {
-			updateLoginUserInfoService.updateUserInfoByUpdateRole(dt.getUuids(), true);
-		}
-		return baseDao.update(fse);
-	}
+        //鏁版嵁鍥炲啓
+        fse.setValue(CmnConst.FUNCTION_UUID, "");
 
-	/**
-	 * 鎶ヨ〃鍙戝竷
-	 *
-	 * @param fse
-	 * @return
-	 */
-	@Transactional
-	public boolean releaseConfig(FieldSetEntity fse) {
+        if (!DataTableEntity.isEmpty(dt)) {
+            updateLoginUserInfoService.updateUserInfoByUpdateRole(dt.getUuids(), true);
+        }
+        return baseDao.update(fse);
+    }
 
-		FieldSetEntity fseReport = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_REPORT_CONFIG, fse.getUUID(), false);
+    /**
+     * 鎶ヨ〃鍙戝竷
+     *
+     * @param fse
+     * @return
+     */
+    @Transactional
+    public boolean releaseConfig(FieldSetEntity fse) {
 
-		//鍒涘缓MVCC淇濆瓨瀵硅薄
-		FieldSetEntity fseFunction = new FieldSetEntity();
-		//1.鍒涘缓MVC(绯荤粺MVC鐩綍涓�)
-		//鐢熸垚鍔熻兘缂栫爜
-		String defaultCode = "001-005";
-		fseFunction.setTableName(CmnConst.PRODUCT_SYS_FUNCTIONS);
-		codeService.createCode(fseFunction, CmnConst.PRODUCT_SYS_FUNCTIONS, CmnConst.TRICODE, defaultCode);
-		fseFunction.setValue(CmnConst.TABLE_UUID, CmnConst.PRODUCT_SYS_REPORT_CONFIG);            //鍔熻兘鍏宠仈琛�
-		fseFunction.setValue(CmnConst.FUNCTION_NAME, fseReport.getString(CmnConst.REPORT_NAME));    //鍔熻兘鍚嶇О
-		fseFunction.setValue(CmnConst.FUNCTION_DESCRIPTION, fseReport.getString(CmnConst.REPORT_NAME));    //鍔熻兘鎻忚堪
-		fseFunction.setValue(CmnConst.STATUS_UUID, 1);            //鏄惁鍚敤
-		fseFunction.setValue(CmnConst.FUNCTION_TYPE_UUID, 5);    //鍔熻兘绫诲瀷-涓氬姟鍚庡彴绠$悊 绠$悊鍛樺拰鏅�氱敤鎴烽兘鑳藉垎閰嶈鎶ヨ〃鐨勬潈闄�
-		fseFunction.setValue(CmnConst.CLIENT_TYPE_UUID, "Web");        //瀹㈡埛绔被鍨�
-		fseFunction.setValue(CmnConst.VERSION_UUID, "001");
-		fseFunction.setValue(CmnConst.DATA_TYPE, 1);// 鏁版嵁绫诲瀷
-		fseFunction.setValue(CmnConst.TRICODE_PARENT, defaultCode);// 涓婄骇妯″潡code
-		fseFunction.setValue("terminal_type", 1);
-		BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fseFunction);
+        FieldSetEntity fseReport = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_REPORT_CONFIG, fse.getUUID(), false);
 
-		//鍒涘缓鎸夐挳淇濆瓨瀵硅薄
-		DataTableEntity dtButton = new DataTableEntity();
-		FieldSetEntity fseButton = new FieldSetEntity();
-		fseButton.setTableName(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS);
-		fseButton.setValue(CmnConst.IS_MAIN, 1);        //鏄惁鍏ュ彛
-		fseButton.setValue(CmnConst.STATUS_UUID, 1);    //鏄惁鍚敤
-		fseButton.setValue(CmnConst.CLIENT_TYPE_UUID, "Web");    //瀹㈡埛绔被鍨�
-		fseButton.setValue(CmnConst.BUTTON_NAME, "鍏ュ彛");    //鎸夐挳鍚嶇О
-		fseButton.setValue(CmnConst.BUTTON_TITLE, "entrance");    //鎸夐挳鏍囬
-		fseButton.setValue(CmnConst.BUTTON_TYPE, 1);            //鎸夐挳绫诲瀷
-		fseButton.setValue(CmnConst.BUTTON_CATEGORY_UUID, "main");    //鎸夐挳鍒嗙被
-		fseButton.setValue(CmnConst.ROUTE_NAME, BaseUtil.getPageCode());    //璺敱鍚嶇О
-		fseButton.setValue(CmnConst.UPLOAD_API_URL, CmnConst.ADDRESS_INIT_INTERFENCE);// 鍏ュ彛鎺ュ彛鍦板潃
-		fseButton.setValue("terminal_type", 1);
-		JSONObject paramObj = new JSONObject();
-		paramObj.put(CmnConst.UUID, fse.getUUID());
-		fseButton.setValue(CmnConst.PARAMS, paramObj.toString());// 鎺ュ彛鍙傛暟
-		fseButton.setValue(CmnConst.TOP_LOCATION, "100px");
-		fseButton.setValue(CmnConst.LEFT_LOCATION, "100px");
-		dtButton.setMeta(fseButton.getMeta());
-		dtButton.addFieldSetEntity(fseButton);
+        //鍒涘缓MVCC淇濆瓨瀵硅薄
+        FieldSetEntity fseFunction = new FieldSetEntity();
+        //1.鍒涘缓MVC(绯荤粺MVC鐩綍涓�)
+        //鐢熸垚鍔熻兘缂栫爜
+        String defaultCode = "001-005";
+        fseFunction.setTableName(CmnConst.PRODUCT_SYS_FUNCTIONS);
+        codeService.createCode(fseFunction, CmnConst.PRODUCT_SYS_FUNCTIONS, CmnConst.TRICODE, defaultCode);
+        fseFunction.setValue(CmnConst.TABLE_UUID, CmnConst.PRODUCT_SYS_REPORT_CONFIG);            //鍔熻兘鍏宠仈琛�
+        fseFunction.setValue(CmnConst.FUNCTION_NAME, fseReport.getString(CmnConst.REPORT_NAME));    //鍔熻兘鍚嶇О
+        fseFunction.setValue(CmnConst.FUNCTION_DESCRIPTION, fseReport.getString(CmnConst.REPORT_NAME));    //鍔熻兘鎻忚堪
+        fseFunction.setValue(CmnConst.STATUS_UUID, 1);            //鏄惁鍚敤
+        fseFunction.setValue(CmnConst.FUNCTION_TYPE_UUID, 5);    //鍔熻兘绫诲瀷-涓氬姟鍚庡彴绠$悊 绠$悊鍛樺拰鏅�氱敤鎴烽兘鑳藉垎閰嶈鎶ヨ〃鐨勬潈闄�
+        fseFunction.setValue(CmnConst.CLIENT_TYPE_UUID, "Web");        //瀹㈡埛绔被鍨�
+        fseFunction.setValue(CmnConst.VERSION_UUID, "001");
+        fseFunction.setValue(CmnConst.DATA_TYPE, 1);// 鏁版嵁绫诲瀷
+        fseFunction.setValue(CmnConst.TRICODE_PARENT, defaultCode);// 涓婄骇妯″潡code
+        fseFunction.setValue("terminal_type", 1);
+        BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fseFunction);
 
-		//鍒涘缓椤甸潰淇濆瓨瀵硅薄
-		DataTableEntity dtPage = new DataTableEntity();
-		FieldSetEntity fsePage = new FieldSetEntity();
-		fsePage.setTableName(CmnConst.PRODUCT_SYS_MVC_PAGE);
+        //鍒涘缓鎸夐挳淇濆瓨瀵硅薄
+        DataTableEntity dtButton = new DataTableEntity();
+        FieldSetEntity fseButton = new FieldSetEntity();
+        fseButton.setTableName(CmnConst.PRODUCT_SYS_FUNCTION_BUTTONS);
+        fseButton.setValue(CmnConst.IS_MAIN, 1);        //鏄惁鍏ュ彛
+        fseButton.setValue(CmnConst.STATUS_UUID, 1);    //鏄惁鍚敤
+        fseButton.setValue(CmnConst.CLIENT_TYPE_UUID, "Web");    //瀹㈡埛绔被鍨�
+        fseButton.setValue(CmnConst.BUTTON_NAME, "鍏ュ彛");    //鎸夐挳鍚嶇О
+        fseButton.setValue(CmnConst.BUTTON_TITLE, "entrance");    //鎸夐挳鏍囬
+        fseButton.setValue(CmnConst.BUTTON_TYPE, 1);            //鎸夐挳绫诲瀷
+        fseButton.setValue(CmnConst.BUTTON_CATEGORY_UUID, "main");    //鎸夐挳鍒嗙被
+        fseButton.setValue(CmnConst.ROUTE_NAME, BaseUtil.getPageCode());    //璺敱鍚嶇О
+        fseButton.setValue(CmnConst.UPLOAD_API_URL, CmnConst.ADDRESS_INIT_INTERFENCE);// 鍏ュ彛鎺ュ彛鍦板潃
+        fseButton.setValue("terminal_type", 1);
+        JSONObject paramObj = new JSONObject();
+        paramObj.put(CmnConst.UUID, fse.getUUID());
+        fseButton.setValue(CmnConst.PARAMS, paramObj.toString());// 鎺ュ彛鍙傛暟
+        fseButton.setValue(CmnConst.TOP_LOCATION, "100px");
+        fseButton.setValue(CmnConst.LEFT_LOCATION, "100px");
+        dtButton.setMeta(fseButton.getMeta());
+        dtButton.addFieldSetEntity(fseButton);
+
+        //鍒涘缓椤甸潰淇濆瓨瀵硅薄
+        DataTableEntity dtPage = new DataTableEntity();
+        FieldSetEntity fsePage = new FieldSetEntity();
+        fsePage.setTableName(CmnConst.PRODUCT_SYS_MVC_PAGE);
 //        fsePage.setValue(CmnConst.PAGE_NAME, "鎶ヨ〃灞曠ず");
-		fsePage.setValue(CmnConst.PAGE_NAME, fse.getString(CmnConst.MENU_NAME));
-		fsePage.setValue(CmnConst.PAGE_TYPE, 2);
-		fsePage.setValue(CmnConst.PAGE_URL, CmnConst.ADDRESS_REPORT_SHOW);
-		fsePage.setValue(CmnConst.TOP_LOCATION, "300px");
-		fsePage.setValue(CmnConst.LEFT_LOCATION, "100px");
-		fsePage.setValue(CmnConst.PAGE_OPEN_WITH, 0);
-		fsePage.setValue(CmnConst.PAGE_TYPE, 0);
-		fsePage.setValue("terminal_type", 1);
-		dtPage.addFieldSetEntity(fsePage);
+        fsePage.setValue(CmnConst.PAGE_NAME, fse.getString(CmnConst.MENU_NAME));
+        fsePage.setValue(CmnConst.PAGE_TYPE, 2);
+        fsePage.setValue(CmnConst.PAGE_URL, CmnConst.ADDRESS_REPORT_SHOW);
+        fsePage.setValue(CmnConst.TOP_LOCATION, "300px");
+        fsePage.setValue(CmnConst.LEFT_LOCATION, "100px");
+        fsePage.setValue(CmnConst.PAGE_OPEN_WITH, 0);
+        fsePage.setValue(CmnConst.PAGE_TYPE, 0);
+        fsePage.setValue("terminal_type", 1);
+        dtPage.addFieldSetEntity(fsePage);
 
-		fseFunction.addSubDataTable(dtButton);
-		fseFunction.addSubDataTable(dtPage);
+        fseFunction.addSubDataTable(dtButton);
+        fseFunction.addSubDataTable(dtPage);
 
-		String functionUUID = baseDao.add(fseFunction);
+        String functionUUID = baseDao.add(fseFunction);
 
-		//鍒涘缓杩炵嚎淇濆瓨瀵硅薄
-		FieldSetEntity fseLink = new FieldSetEntity();
-		fseLink.setTableName(CmnConst.PRODUCT_SYS_LINK);
-		fseLink.setValue(CmnConst.LINK_TYPE, 0);        //杩炵嚎绫诲瀷
-		fseLink.setValue(CmnConst.FUNCTION_UUID, functionUUID);    //鎵�灞炲姛鑳経UID
-		fseLink.setValue(CmnConst.LINE_FROM, fseButton.getUUID());    //璧峰绔�
-		fseLink.setValue(CmnConst.FROM_TYPE, 0);                    //璧峰绔被鍨�
-		fseLink.setValue(CmnConst.LINE_TO, fsePage.getUUID());        //缁撴潫绔�
-		fseLink.setValue(CmnConst.TO_TYPE, 2);                        //缁撴潫绔被鍨�
-		fseLink.setValue("terminal_type", 1);
-		BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fseLink);
+        //鍒涘缓杩炵嚎淇濆瓨瀵硅薄
+        FieldSetEntity fseLink = new FieldSetEntity();
+        fseLink.setTableName(CmnConst.PRODUCT_SYS_LINK);
+        fseLink.setValue(CmnConst.LINK_TYPE, 0);        //杩炵嚎绫诲瀷
+        fseLink.setValue(CmnConst.FUNCTION_UUID, functionUUID);    //鎵�灞炲姛鑳経UID
+        fseLink.setValue(CmnConst.LINE_FROM, fseButton.getUUID());    //璧峰绔�
+        fseLink.setValue(CmnConst.FROM_TYPE, 0);                    //璧峰绔被鍨�
+        fseLink.setValue(CmnConst.LINE_TO, fsePage.getUUID());        //缁撴潫绔�
+        fseLink.setValue(CmnConst.TO_TYPE, 2);                        //缁撴潫绔被鍨�
+        fseLink.setValue("terminal_type", 1);
+        BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fseLink);
 
-		baseDao.add(fseLink);
+        baseDao.add(fseLink);
 
-		// 鎻愬彇鍙戝竷鐨勮鑹茬浉鍏虫暟鎹�
-		List<String> roleUUIDList = Lists.newArrayList();
-		List<String> clientUUIDList = Lists.newArrayList();
-		clientUUIDList.add(SpringMVCContextHolder.getCurrentUser().getClientUuid());
-//		String[] singleRoleInfoArr;
-		for (String singleRoleInfo : fse.getString(CmnConst.ROLE_UUID).split("#")) {
-//			singleRoleInfoArr = singleRoleInfo.split(",");
-			roleUUIDList.add(singleRoleInfo);
-		}
+        // 鎻愬彇鍙戝竷鐨勮鑹茬浉鍏虫暟鎹�
+        List<String> roleUUIDList = Lists.newArrayList();
+        List<String> clientUUIDList = Lists.newArrayList();
+        clientUUIDList.add(SpringMVCContextHolder.getCurrentUser().getClientUuid());
+//        String[] singleRoleInfoArr;
+        for (String singleRoleInfo : fse.getString(CmnConst.ROLE_UUID).split("#")) {
+//            singleRoleInfoArr = singleRoleInfo.split(",");
+            roleUUIDList.add(singleRoleInfo);
+        }
 
-		// 2.缁戝畾瑙掕壊(缁欐煇涓�瑙掕壊璧嬩簣璇ュ姛鑳�)
-		for (String roleUUID : roleUUIDList) {
-			FieldSetEntity fseFunctionButton = new FieldSetEntity();
-			fseFunctionButton.setTableName(CmnConst.PRODUCT_SYS_FUNCTION_PERMISSION);
-			fseFunctionButton.setValue(CmnConst.FUNCTION_UUID, functionUUID);// 鎵�灞炲姛鑳経UID
-			fseFunctionButton.setValue(CmnConst.BUTTON_UUID, fseButton.getUUID());// 鎸夐挳UUID
-			fseFunctionButton.setValue(CmnConst.ROLE_UUID, roleUUID);// 鎵�灞炶鑹睻UID
-			baseDao.add(fseFunctionButton);
-		}
+        // 2.缁戝畾瑙掕壊(缁欐煇涓�瑙掕壊璧嬩簣璇ュ姛鑳�)
+        for (String roleUUID : roleUUIDList) {
+            FieldSetEntity fseFunctionButton = new FieldSetEntity();
+            fseFunctionButton.setTableName(CmnConst.PRODUCT_SYS_FUNCTION_PERMISSION);
+            fseFunctionButton.setValue(CmnConst.FUNCTION_UUID, functionUUID);// 鎵�灞炲姛鑳経UID
+            fseFunctionButton.setValue(CmnConst.BUTTON_UUID, fseButton.getUUID());// 鎸夐挳UUID
+            fseFunctionButton.setValue(CmnConst.ROLE_UUID, roleUUID);// 鎵�灞炶鑹睻UID
+            baseDao.add(fseFunctionButton);
+        }
 
-		// 3.缁戝畾瀹㈡埛瑙掕壊(缁欐煇涓�瀹㈡埛瑙掕壊璧嬩簣璇ュ姛鑳�)
-		for (String clientUUID : clientUUIDList) {
-			DataTableEntity clientDte = DataPoolCacheImpl.getInstance().getCacheData("瀹㈡埛淇℃伅", new String[]{clientUUID});
-			if (BaseUtil.dataTableIsEmpty(clientDte)) {
-				continue;
-			}
-			FieldSetEntity clientFse = clientDte.getFieldSetEntity(0);
-			FieldSetEntity fseClientFunctionButton = new FieldSetEntity();
-			fseClientFunctionButton.setTableName(CmnConst.PRODUCT_SYS_FUNCTION_PERMISSION);
-			fseClientFunctionButton.setValue(CmnConst.FUNCTION_UUID, functionUUID);// 鎵�灞炲姛鑳経UID
-			fseClientFunctionButton.setValue(CmnConst.BUTTON_UUID, fseButton.getUUID());// 鎸夐挳UUID
-			fseClientFunctionButton.setValue(CmnConst.ROLE_UUID, clientFse.getString(CmnConst.ROLE_UUID));// 鎵�灞炶鑹睻UID
-			baseDao.add(fseClientFunctionButton);
-		}
+        // 3.缁戝畾瀹㈡埛瑙掕壊(缁欐煇涓�瀹㈡埛瑙掕壊璧嬩簣璇ュ姛鑳�)
+        for (String clientUUID : clientUUIDList) {
+            DataTableEntity clientDte = DataPoolCacheImpl.getInstance().getCacheData("瀹㈡埛淇℃伅", new String[]{clientUUID});
+            if (BaseUtil.dataTableIsEmpty(clientDte)) {
+                continue;
+            }
+            FieldSetEntity clientFse = clientDte.getFieldSetEntity(0);
+            FieldSetEntity fseClientFunctionButton = new FieldSetEntity();
+            fseClientFunctionButton.setTableName(CmnConst.PRODUCT_SYS_FUNCTION_PERMISSION);
+            fseClientFunctionButton.setValue(CmnConst.FUNCTION_UUID, functionUUID);// 鎵�灞炲姛鑳経UID
+            fseClientFunctionButton.setValue(CmnConst.BUTTON_UUID, fseButton.getUUID());// 鎸夐挳UUID
+            fseClientFunctionButton.setValue(CmnConst.ROLE_UUID, clientFse.getString(CmnConst.ROLE_UUID));// 鎵�灞炶鑹睻UID
+            baseDao.add(fseClientFunctionButton);
+        }
 
-		//4.鍒涘缓鑿滃崟(鏍规嵁鍓嶇鎵�閫夌埗绾ц彍鍗�)
-		FieldSetEntity fseMenu = new FieldSetEntity();
-		fseMenu.setTableName(CmnConst.PRODUCT_SYS_MENUS);
-		codeService.createCode(fseMenu, CmnConst.PRODUCT_SYS_MENUS, CmnConst.TRICODE, fse.getString(CmnConst.TRICODE_PARENT));
-		fseMenu.setValue(CmnConst.TRICODE_PARENT, fse.getString(CmnConst.TRICODE_PARENT));
-		fseMenu.setValue(CmnConst.MENU_NAME, fse.getString(CmnConst.MENU_NAME));
-		fseMenu.setValue(CmnConst.FUNCTION_UUID, functionUUID);
-		fseMenu.setValue(CmnConst.SEQUENCE, fse.getString(CmnConst.SEQUENCE));
-		fseMenu.setValue(CmnConst.IS_CATALOG, 0);
-		fseMenu.setValue(CmnConst.IS_SHOW, StringUtils.isEmpty(fse.getString(CmnConst.IS_SHOW)) ? 1 : fse.getString(CmnConst.IS_SHOW));
-		fseMenu.setValue(CmnConst.MENU_ICON, fse.getString(CmnConst.MENU_ICON));
-		BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fseMenu);
+        //4.鍒涘缓鑿滃崟(鏍规嵁鍓嶇鎵�閫夌埗绾ц彍鍗�)
+        FieldSetEntity fseMenu = new FieldSetEntity();
+        fseMenu.setTableName(CmnConst.PRODUCT_SYS_MENUS);
+        codeService.createCode(fseMenu, CmnConst.PRODUCT_SYS_MENUS, CmnConst.TRICODE, fse.getString(CmnConst.TRICODE_PARENT));
+        fseMenu.setValue(CmnConst.TRICODE_PARENT, fse.getString(CmnConst.TRICODE_PARENT));
+        fseMenu.setValue(CmnConst.MENU_NAME, fse.getString(CmnConst.MENU_NAME));
+        fseMenu.setValue(CmnConst.FUNCTION_UUID, functionUUID);
+        fseMenu.setValue(CmnConst.SEQUENCE, fse.getString(CmnConst.SEQUENCE));
+        fseMenu.setValue(CmnConst.IS_CATALOG, 0);
+        fseMenu.setValue(CmnConst.IS_SHOW, StringUtils.isEmpty(fse.getString(CmnConst.IS_SHOW)) ? 1 : fse.getString(CmnConst.IS_SHOW));
+        fseMenu.setValue(CmnConst.MENU_ICON, fse.getString(CmnConst.MENU_ICON));
+        BaseUtil.createCreatorAndCreationTime(SpringMVCContextHolder.getCurrentUser(), fseMenu);
 
-		baseDao.add(fseMenu);
+        baseDao.add(fseMenu);
 
-		//鏁版嵁鍥炲啓
-		fseReport.setValue(CmnConst.FUNCTION_UUID, functionUUID);
+        //鏁版嵁鍥炲啓
+        fseReport.setValue(CmnConst.FUNCTION_UUID, functionUUID);
 
-		boolean result = baseDao.update(fseReport);
+        boolean result = baseDao.update(fseReport);
 
-		// 閲嶆柊璁剧疆缂撳瓨
-		dataListReportService.setConfig(fseReport.getUUID());
+        // 閲嶆柊璁剧疆缂撳瓨
+        dataListReportService.setConfig(fseReport.getUUID());
 
-		return result;
-	}
+        return result;
+    }
 
-	/**
-	 * 鎶ヨ〃copy
-	 *
-	 * @param uuid
-	 * @return
-	 */
-	public String copyConfig(String uuid) {
-		FieldSetEntity fse = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_REPORT_CONFIG, uuid, true);
-		FieldSetEntity fseCopy = fse;
-		fseCopy.remove(CmnConst.ID);
-		fseCopy.remove(CmnConst.UUID);
-		DataTableEntity dtSub = fseCopy.getSubDataTable(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE);
-		if (dtSub != null && dtSub.getRows() > 0) {
-			for (int i = 0; i < dtSub.getRows(); i++) {
-				FieldSetEntity fseSub = dtSub.getFieldSetEntity(i);
-				fseSub.remove(CmnConst.ID);
-				fseSub.remove(CmnConst.UUID);
-			}
-		}
-		return baseDao.add(fseCopy, true);
-	}
+    /**
+     * 鎶ヨ〃copy
+     *
+     * @param uuid
+     * @return
+     */
+    public String copyConfig(String uuid) {
+        FieldSetEntity fse = baseDao.getFieldSetEntity(CmnConst.PRODUCT_SYS_REPORT_CONFIG, uuid, true);
+        FieldSetEntity fseCopy = fse;
+        fseCopy.remove(CmnConst.ID);
+        fseCopy.remove(CmnConst.UUID);
+        DataTableEntity dtSub = fseCopy.getSubDataTable(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE);
+        if (dtSub != null && dtSub.getRows() > 0) {
+            for (int i = 0; i < dtSub.getRows(); i++) {
+                FieldSetEntity fseSub = dtSub.getFieldSetEntity(i);
+                fseSub.remove(CmnConst.ID);
+                fseSub.remove(CmnConst.UUID);
+            }
+        }
+        return baseDao.add(fseCopy, true);
+    }
 
-	/**
-	 * 閰嶇疆鎶ヨ〃-寮曠敤
-	 *
-	 * @param fse
-	 * @return
-	 */
-	public FieldSetEntity quoteReportConfig(FieldSetEntity fse) {
-		FieldSetEntity sourceFse = findReportConfig(fse.getUUID());
-		sourceFse.setValue(CmnConst.DATASOURCE_UUID, fse.getString(CmnConst.DATASOURCE_UUID));
-		sourceFse.remove(new String[]{CmnConst.ID, CmnConst.UUID, CmnConst.CREATED_BY, CmnConst.CREATED_UTC_DATETIME, CmnConst.UPDATED_BY, CmnConst.CREATED_UTC_DATETIME, CmnConst.REPORT_NAME});
-		DataTableEntity subDte = sourceFse.getSubDataTable(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE);
-		FieldSetEntity subFse;
-		for (int i = 0; i < subDte.getRows(); i++) {
-			subFse = subDte.getFieldSetEntity(i);
-			subFse.remove(new String[]{CmnConst.ID, CmnConst.UUID, CmnConst.CREATED_BY, CmnConst.CREATED_UTC_DATETIME, CmnConst.UPDATED_BY, CmnConst.CREATED_UTC_DATETIME});
-		}
-		return sourceFse;
-	}
+    /**
+     * 閰嶇疆鎶ヨ〃-寮曠敤
+     *
+     * @param fse
+     * @return
+     */
+    public FieldSetEntity quoteReportConfig(FieldSetEntity fse) {
+        FieldSetEntity sourceFse = findReportConfig(fse.getUUID());
+        sourceFse.setValue(CmnConst.DATASOURCE_UUID, fse.getString(CmnConst.DATASOURCE_UUID));
+        sourceFse.remove(new String[]{CmnConst.ID, CmnConst.UUID, CmnConst.CREATED_BY, CmnConst.CREATED_UTC_DATETIME, CmnConst.UPDATED_BY, CmnConst.CREATED_UTC_DATETIME, CmnConst.REPORT_NAME});
+        DataTableEntity subDte = sourceFse.getSubDataTable(CmnConst.PRODUCT_SYS_REPORT_CONFIG_ATTRIBUTE);
+        FieldSetEntity subFse;
+        for (int i = 0; i < subDte.getRows(); i++) {
+            subFse = subDte.getFieldSetEntity(i);
+            subFse.remove(new String[]{CmnConst.ID, CmnConst.UUID, CmnConst.CREATED_BY, CmnConst.CREATED_UTC_DATETIME, CmnConst.UPDATED_BY, CmnConst.CREATED_UTC_DATETIME});
+        }
+        return sourceFse;
+    }
 
-	/**
-	 * 鑾峰彇鎶ヨ〃鍙戝竷淇℃伅-鍙戝竷
-	 *
-	 * @return
-	 */
-	public JSONArray getReportReleaseInfo() {
-		StringBuilder sql = new StringBuilder(256);
-		DataTableEntity aimDte = new DataTableEntity();
-		DataTableEntity dte;
-		Object[] arr;
-		String filter;
-		sql.append("select distinct null pid,uuid sid,client_name name FROM product_sys_clients c")
-				.append("\ninner join (")
-				.append("\n    select client_uuid pid,uuid sid,org_level_name FROM product_sys_org_levels where org_level_status=0 order by org_level_code")
-				.append("\n) o on o.pid=c.uuid")
-				.append("\ninner join (")
-				.append("\n    select org_level_uuid pid,uuid sid,role_name FROM product_sys_role where is_used=1")
-				.append("\n) r on r.pid=o.sid");
-		// 鍘绘帀admin鎵�灞炲鎴�
+    /**
+     * 鑾峰彇鎶ヨ〃鍙戝竷淇℃伅-鍙戝竷
+     *
+     * @return
+     */
+    public JSONArray getReportReleaseInfo() {
+        StringBuilder sql = new StringBuilder(256);
+        DataTableEntity aimDte = new DataTableEntity();
+        DataTableEntity dte;
+        Object[] arr;
+        String filter;
+        sql.append("select distinct null pid,uuid sid,client_name name FROM product_sys_clients c")
+                .append("\ninner join (")
+                .append("\n    select client_uuid pid,uuid sid,org_level_name FROM product_sys_org_levels where org_level_status=0 order by org_level_code")
+                .append("\n) o on o.pid=c.uuid")
+                .append("\ninner join (")
+                .append("\n    select org_level_uuid pid,uuid sid,role_name FROM product_sys_role where is_used=1")
+                .append("\n) r on r.pid=o.sid");
+        // 鍘绘帀admin鎵�灞炲鎴�
 //				.append("\nwhere c.uuid!='4d4679ed-c4c3-41b8-abfe-451a66fd4043'");
-		dte = baseDao.listTable(sql.toString(), new Object[]{});
+        dte = baseDao.listTable(sql.toString(), new Object[]{});
 
-		aimDte.addFieldSetEntity(dte);
+        aimDte.addFieldSetEntity(dte);
 
-		arr = dte.getFieldAllValues("sid");
-		filter = BaseUtil.buildQuestionMarkFilter("client_uuid", arr.length, true);
-		sql.setLength(0);
-		sql.append("\nselect distinct o.* from (")
-				.append("\n    select client_uuid pid,uuid sid,org_level_name name FROM product_sys_org_levels where org_level_status=0")
-				.append("\n    and ").append(filter)
-				.append("\n    order by org_level_code")
-				.append("\n) o")
-				.append("\ninner join (")
-				.append("\n    select org_level_uuid pid,uuid sid,role_name FROM product_sys_role where is_used=1")
-				.append("\n) r on r.pid=o.sid");
-		dte = baseDao.listTable(sql.toString(), arr);
-		aimDte.addFieldSetEntity(dte);
+        arr = dte.getFieldAllValues("sid");
+        filter = BaseUtil.buildQuestionMarkFilter("client_uuid", arr.length, true);
+        sql.setLength(0);
+        sql.append("\nselect distinct o.* from (")
+                .append("\n    select client_uuid pid,uuid sid,org_level_name name FROM product_sys_org_levels where org_level_status=0")
+                .append("\n    and ").append(filter)
+                .append("\n    order by org_level_code")
+                .append("\n) o")
+                .append("\ninner join (")
+                .append("\n    select org_level_uuid pid,uuid sid,role_name FROM product_sys_role where is_used=1")
+                .append("\n) r on r.pid=o.sid");
+        dte = baseDao.listTable(sql.toString(), arr);
+        aimDte.addFieldSetEntity(dte);
 
-		arr = dte.getFieldAllValues("sid");
-		filter = BaseUtil.buildQuestionMarkFilter("org_level_uuid", arr.length, true);
-		sql.setLength(0);
-		sql.append("\nselect org_level_uuid pid,uuid sid,role_name name FROM product_sys_role where is_used=1").append(" and ").append(filter);
-		dte = baseDao.listTable(sql.toString(), arr);
-		aimDte.addFieldSetEntity(dte);
+        arr = dte.getFieldAllValues("sid");
+        filter = BaseUtil.buildQuestionMarkFilter("org_level_uuid", arr.length, true);
+        sql.setLength(0);
+        sql.append("\nselect org_level_uuid pid,uuid sid,role_name name FROM product_sys_role where is_used=1").append(" and ").append(filter);
+        dte = baseDao.listTable(sql.toString(), arr);
+        aimDte.addFieldSetEntity(dte);
 
-		return BaseUtil.dataTableToTreeData(aimDte, "sid", "pid", null, false);
-	}
+        return BaseUtil.dataTableToTreeData(aimDte, "sid", "pid", null, false);
+    }
 
-	/**
-	 * 鑾峰彇鎶ヨ〃鍙戝竷淇℃伅-鍙戝竷鍚庢煡鐪嬩俊鎭�
-	 *
-	 * @return
-	 */
-	public JSONObject viewReportReleaseInfo(FieldSetEntity fse) {
-		DataTableEntity reportConfigDte = DataPoolCacheImpl.getInstance().getCacheData(CmnConst.CACHE_REPORT_CONFIG, new String[]{fse.getUUID()});
-		if (BaseUtil.dataTableIsEmpty(reportConfigDte)) {
-			throw new BaseException(ReportCode.GET_REPORT_RELEASE_INFO_FAIL.getValue(), ReportCode.GET_REPORT_RELEASE_INFO_FAIL.getText());
-		}
-		FieldSetEntity reportConfigFse = reportConfigDte.getFieldSetEntity(0);
-		StringBuilder sql = new StringBuilder(256);
-		sql.append("\nselect group_concat(single_role_uuid separator '#') role_uuid")
-				.append("\nfrom (")
-				.append("\n    select concat(client_uuid,',',uuid,',',role_uuid) single_role_uuid")
-				.append("\n    FROM product_sys_org_levels o")
-				.append("\n    inner join (")
-				.append("\n        select org_level_uuid,uuid role_uuid,role_name")
-				.append("\n        FROM product_sys_role r")
-				.append("\n        inner join (")
-				.append("\n            select role_uuid FROM product_sys_function_permission where function_uuid=?")
-				.append("\n        ) p on r.uuid=p.role_uuid")
-				.append("\n    ) r1 on o.uuid=r1.org_level_uuid")
-				.append("\n) t");
-		String functionUUID = reportConfigFse.getString(CmnConst.FUNCTION_UUID);
-		DataTableEntity dte = baseDao.listTable(sql.toString(), new Object[]{functionUUID});
+    /**
+     * 鑾峰彇鎶ヨ〃鍙戝竷淇℃伅-鍙戝竷鍚庢煡鐪嬩俊鎭�
+     *
+     * @return
+     */
+    public JSONObject viewReportReleaseInfo(FieldSetEntity fse) {
+        DataTableEntity reportConfigDte = DataPoolCacheImpl.getInstance().getCacheData(CmnConst.CACHE_REPORT_CONFIG, new String[]{fse.getUUID()});
+        if (BaseUtil.dataTableIsEmpty(reportConfigDte)) {
+            throw new BaseException(ReportCode.GET_REPORT_RELEASE_INFO_FAIL.getValue(), ReportCode.GET_REPORT_RELEASE_INFO_FAIL.getText());
+        }
+        FieldSetEntity reportConfigFse = reportConfigDte.getFieldSetEntity(0);
+        StringBuilder sql = new StringBuilder(256);
+        sql.append("\nselect group_concat(single_role_uuid separator '#') role_uuid")
+                .append("\nfrom (")
+                .append("\n    select concat(client_uuid,',',uuid,',',role_uuid) single_role_uuid")
+                .append("\n    FROM product_sys_org_levels o")
+                .append("\n    inner join (")
+                .append("\n        select org_level_uuid,uuid role_uuid,role_name")
+                .append("\n        FROM product_sys_role r")
+                .append("\n        inner join (")
+                .append("\n            select role_uuid FROM product_sys_function_permission where function_uuid=?")
+                .append("\n        ) p on r.uuid=p.role_uuid")
+                .append("\n    ) r1 on o.uuid=r1.org_level_uuid")
+                .append("\n) t");
+        String functionUUID = reportConfigFse.getString(CmnConst.FUNCTION_UUID);
+        DataTableEntity dte = baseDao.listTable(sql.toString(), new Object[]{functionUUID});
 
-		FieldSetEntity menuFse = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_MENUS, "function_uuid=?", new Object[]{functionUUID}, false);
+        FieldSetEntity menuFse = baseDao.getFieldSetEntityByFilter(CmnConst.PRODUCT_SYS_MENUS, "function_uuid=?", new Object[]{functionUUID}, false);
 
-		JSONObject resultObj = new JSONObject();
-		resultObj.put(CmnConst.UUID, fse.getUUID());
-		resultObj.put(CmnConst.ROLE_UUID, dte.getFieldSetEntity(0).getString(CmnConst.ROLE_UUID));
-		resultObj.put(CmnConst.TRICODE_PARENT, menuFse.getString(CmnConst.TRICODE_PARENT));
-		resultObj.put(CmnConst.MENU_ICON, menuFse.getString(CmnConst.MENU_ICON));
-		resultObj.put(CmnConst.MENU_NAME, menuFse.getString(CmnConst.MENU_NAME));
+        JSONObject resultObj = new JSONObject();
+        resultObj.put(CmnConst.UUID, fse.getUUID());
+        resultObj.put(CmnConst.ROLE_UUID, dte.getFieldSetEntity(0).getString(CmnConst.ROLE_UUID));
+        resultObj.put(CmnConst.TRICODE_PARENT, menuFse.getString(CmnConst.TRICODE_PARENT));
+        resultObj.put(CmnConst.MENU_ICON, menuFse.getString(CmnConst.MENU_ICON));
+        resultObj.put(CmnConst.MENU_NAME, menuFse.getString(CmnConst.MENU_NAME));
 
-		return resultObj;
-	}
+        return resultObj;
+    }
 
-	/**
-	 * 宸插彂甯冨垪琛ㄧ晫闈�
-	 *
-	 * @param fse
-	 * @return
-	 */
-	public DataTableEntity releasedListReportConfig(FieldSetEntity fse) {
-		String filter = queryFilterService.getQueryFilter(fse);
-		StringBuilder sql = new StringBuilder(256);
+    /**
+     * 宸插彂甯冨垪琛ㄧ晫闈�
+     *
+     * @param fse
+     * @return
+     */
+    public DataTableEntity releasedListReportConfig(FieldSetEntity fse) {
+        String filter = queryFilterService.getQueryFilter(fse);
+        StringBuilder sql = new StringBuilder(256);
 //        sql.append("select * from ( ");
-		sql.append("\n    select rc.uuid,rc.report_name,rtc.type_name,t1.role_info,mp.menu_name tricode_parent,m.menu_icon,m.menu_name ");
-		sql.append("\n    FROM product_sys_report_config rc ");
-		sql.append("\n    inner join ( ");
-		sql.append("\n        select function_uuid,group_concat(role_info separator ',') role_info ");
-		sql.append("\n        from ( ");
-		sql.append("\n            select function_uuid,concat(c.client_name,'/',o.org_level_name,'/',role_name) role_info ");
-		sql.append("\n						FROM product_sys_clients c ");
-		sql.append("\n						inner join product_sys_org_levels o on o.client_uuid=c.uuid ");
-		sql.append("\n						inner join ( ");
-		sql.append("\n								select function_uuid,org_level_uuid,uuid role_uuid,role_name ");
-		sql.append("\n								FROM product_sys_role r ");
-		sql.append("\n								inner join ( ");
-		sql.append("\n										select function_uuid,role_uuid FROM product_sys_function_permission ");
-		sql.append("\n								) p on r.uuid=p.role_uuid ");
-		sql.append("\n						) r1 on o.uuid=r1.org_level_uuid ");
-		sql.append("\n        ) t ");
-		sql.append("\n        group by function_uuid ");
-		sql.append("\n    ) t1 on rc.function_uuid=t1.function_uuid ");
-		sql.append("\n    inner join product_sys_menus m on rc.function_uuid=m.function_uuid ");
-		sql.append("\n    inner join product_sys_report_type_config rtc on rc.type_uuid=rtc.uuid ");
-		sql.append("\n    inner join product_sys_menus mp on m.tricode_parent=mp.tricode ");
+        sql.append("\n    select rc.uuid,rc.report_name,rtc.type_name,t1.role_info,mp.menu_name tricode_parent,m.menu_icon,m.menu_name ");
+        sql.append("\n    FROM product_sys_report_config rc ");
+        sql.append("\n    inner join ( ");
+        sql.append("\n        select function_uuid,group_concat(role_info separator ',') role_info ");
+        sql.append("\n        from ( ");
+        sql.append("\n            select function_uuid,concat(c.client_name,'/',o.org_level_name,'/',role_name) role_info ");
+        sql.append("\n						FROM product_sys_clients c ");
+        sql.append("\n						inner join product_sys_org_levels o on o.client_uuid=c.uuid ");
+        sql.append("\n						inner join ( ");
+        sql.append("\n								select function_uuid,org_level_uuid,uuid role_uuid,role_name ");
+        sql.append("\n								FROM product_sys_role r ");
+        sql.append("\n								inner join ( ");
+        sql.append("\n										select function_uuid,role_uuid FROM product_sys_function_permission ");
+        sql.append("\n								) p on r.uuid=p.role_uuid ");
+        sql.append("\n						) r1 on o.uuid=r1.org_level_uuid ");
+        sql.append("\n        ) t ");
+        sql.append("\n        group by function_uuid ");
+        sql.append("\n    ) t1 on rc.function_uuid=t1.function_uuid ");
+        sql.append("\n    inner join product_sys_menus m on rc.function_uuid=m.function_uuid ");
+        sql.append("\n    inner join product_sys_report_type_config rtc on rc.type_uuid=rtc.uuid ");
+        sql.append("\n    inner join product_sys_menus mp on m.tricode_parent=mp.tricode ");
 //        sql.append("\n) t2 ");
-		if (!StringUtils.isEmpty(filter)) {
-			sql.append(" WHERE " + filter);
-		}
-		Integer curPage = fse.getInteger(CmnConst.CPAGE);
-		Integer pageSize = fse.getInteger(CmnConst.PAGESIZE);
-		return baseDao.listTable(sql.toString(), new Object[]{}, pageSize == null ? Integer.MAX_VALUE : pageSize, curPage == null ? 1 : curPage);
-	}
+        if (!StringUtils.isEmpty(filter)) {
+            sql.append(" WHERE " + filter);
+        }
+        Integer curPage = fse.getInteger(CmnConst.CPAGE);
+        Integer pageSize = fse.getInteger(CmnConst.PAGESIZE);
+        return baseDao.listTable(sql.toString(), new Object[]{}, pageSize == null ? Integer.MAX_VALUE : pageSize, curPage == null ? 1 : curPage);
+    }
 }
diff --git a/src/main/java/com/product/server/report/service/ReportDatasourceService.java b/src/main/java/com/product/server/report/service/ReportDatasourceService.java
index 88c2149..3c0490e 100644
--- a/src/main/java/com/product/server/report/service/ReportDatasourceService.java
+++ b/src/main/java/com/product/server/report/service/ReportDatasourceService.java
@@ -1,18 +1,16 @@
 package com.product.server.report.service;
 
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSetMetaData;
-import java.sql.SQLException;
+import java.sql.*;
 import java.util.*;
+import java.util.Date;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import com.product.core.entity.RequestParameterEntity;
 import com.product.core.service.support.QueryFilterService;
+import com.product.server.report.util.QuerySqlParseUtil;
 import com.product.util.BaseUtil;
 import com.product.util.CallBack;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -148,7 +146,7 @@
     /**
      * sql瑙f瀽涓庨獙璇�
      *
-     * @param sqlText
+     * @param fse
      * @return
      */
     public DataTableEntity sqlVerify(FieldSetEntity fse) throws SQLException {
@@ -266,47 +264,51 @@
                 sql = sql.replace(ternaryOperator, "");
             }
         }
-        sql = sql.replaceAll("\\[\\[((?!\\[).)+\\]\\]", "");
+        sql = sql.replaceAll("\\[\\[((?!\\[).)+\\]\\]", "")
+                .replaceAll("and\\s+1\\s*=\\s*1", "")
+                .replaceAll("\\{=.+=\\}", "")
+                .replaceAll("(\\t*\\n){2,}", "\n");
+        sql = QuerySqlParseUtil.parseSplitTableSql(baseDao, sql, true);
+        SpringMVCContextHolder.getSystemLogger().info(sql);
         //涓庢暟鎹簱鐨勮繛鎺�
-        PreparedStatement ps = null;
-        Connection con = null;
-        con = ConnectionManager.getConnection();
-        sql = sql.replaceAll("and\\s+1\\s*=\\s*1", "");
-        ps = con.prepareStatement(sql);
-        //缁撴灉闆嗗厓鏁版嵁
-        ResultSetMetaData rsmd = ps.getMetaData();
-        //琛ㄥ垪鏁�
-        int size = rsmd.getColumnCount();
-        Set<String> fieldNameSet = Sets.newHashSet();
-        for (int i = 1; i <= size; i++) {
-            FieldSetEntity fieldSetEntity = new FieldSetEntity();
-            FieldMetaEntity f = new FieldMetaEntity();
-            f.setTableName(new Object[]{CmnConst.PRODUCT_SYS_DATAMODEL_FIELD});
-            fieldSetEntity.setMeta(f);
-            fieldSetEntity.setValue(CmnConst.TABLE_NAME, rsmd.getTableName(i));//鑾峰彇琛ㄥ悕
-            //瀛楁鍚嶆垨鍒悕
-            fieldSetEntity.setValue(CmnConst.FIELD_NAME, rsmd.getColumnLabel(i));
-            //瀛楁绫诲瀷
-            fieldSetEntity.setValue(CmnConst.FIELD_FORMAT, "string");
-            // 鏌ヨ绫诲瀷
-            fieldSetEntity.setValue(CmnConst.SEARCH_TYPE, -1);
-            //鑾峰彇鎸囧畾鍒楃殑鎸囧畾鍒楀ぇ灏�
+        try (Connection con = ConnectionManager.getConnection();
+            PreparedStatement ps = con.prepareStatement(sql);
+            ResultSet rs = ps.executeQuery()) {
+            //缁撴灉闆嗗厓鏁版嵁
+            ResultSetMetaData rsmd = rs.getMetaData();
+            //琛ㄥ垪鏁�
+            int size = rsmd.getColumnCount();
+            Set<String> fieldNameSet = Sets.newHashSet();
+            for (int i = 1; i <= size; i++) {
+                FieldSetEntity fieldSetEntity = new FieldSetEntity();
+                FieldMetaEntity f = new FieldMetaEntity();
+                f.setTableName(new Object[]{CmnConst.PRODUCT_SYS_DATAMODEL_FIELD});
+                fieldSetEntity.setMeta(f);
+                fieldSetEntity.setValue(CmnConst.TABLE_NAME, rsmd.getTableName(i));//鑾峰彇琛ㄥ悕
+                //瀛楁鍚嶆垨鍒悕
+                fieldSetEntity.setValue(CmnConst.FIELD_NAME, rsmd.getColumnLabel(i));
+                //瀛楁绫诲瀷
+                fieldSetEntity.setValue(CmnConst.FIELD_FORMAT, "string");
+                // 鏌ヨ绫诲瀷
+                fieldSetEntity.setValue(CmnConst.SEARCH_TYPE, -1);
+                //鑾峰彇鎸囧畾鍒楃殑鎸囧畾鍒楀ぇ灏�
 //            fieldSetEntity.setValue(CmnConst.FIELD_LENGTH, rsmd.getPrecision(i));
-            dataTableEntity.addFieldSetEntity(fieldSetEntity);
-            fieldNameSet.add(fieldSetEntity.getString(CmnConst.FIELD_NAME));
-        }
-        for (String columnName : customColumnName) {
-            if (fieldNameSet.contains(columnName)) {
-                continue;
+                dataTableEntity.addFieldSetEntity(fieldSetEntity);
+                fieldNameSet.add(fieldSetEntity.getString(CmnConst.FIELD_NAME));
             }
-            FieldSetEntity fs = new FieldSetEntity();
-            fs.setTableName(CmnConst.PRODUCT_SYS_DATAMODEL_FIELD);
-            fs.setValue(CmnConst.FIELD_NAME, columnName);
-            fs.setValue(CmnConst.FIELD_FORMAT, "string");
-            fs.setValue(CmnConst.SEARCH_TYPE, -1);
-            dataTableEntity.addFieldSetEntity(fs);
+            for (String columnName : customColumnName) {
+                if (fieldNameSet.contains(columnName)) {
+                    continue;
+                }
+                FieldSetEntity fs = new FieldSetEntity();
+                fs.setTableName(CmnConst.PRODUCT_SYS_DATAMODEL_FIELD);
+                fs.setValue(CmnConst.FIELD_NAME, columnName);
+                fs.setValue(CmnConst.FIELD_FORMAT, "string");
+                fs.setValue(CmnConst.SEARCH_TYPE, -1);
+                dataTableEntity.addFieldSetEntity(fs);
+            }
+            return dataTableEntity;
         }
-        return dataTableEntity;
     }
 
     /**

--
Gitblit v1.9.2