xpc
2024-01-30 cc9ebffc57e6343745cb1eadc47360d6107936bc
commit
已修改10个文件
已删除60个文件
23106 ■■■■■ 文件已修改
README.md 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-data-center/src/main/java/com/product/data/center/service/DataArchivingQueue.java 745 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-data-center/src/main/java/com/product/data/center/service/DataArchivingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-datasource/src/main/java/com/product/datasource/connection/ConnectionManager.java 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/pom.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/config/CmnConst.java 262 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/config/ReportCode.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/config/SystemCode.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/config/SystemParamSet.java 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/ChartPropertyConfigController.java 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/DataListReportController.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/EChartsReportConfigController.java 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/GenerateEChartController.java 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/ListReportConfigController.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/ReportConfigController.java 541 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/ReportDatasourceController.java 398 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/ReportTypeController.java 551 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/controller/TestDao.java 463 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/patch/PatchService.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/quartz/ReportDataProcessQuartz.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/quartz/ViewDataConvertService.java 120 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/ChartPropertyConfigService.java 430 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/CommonReportService.java 622 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/DataListReportService.java 1852 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/EChartsReportConfigServiceimple.java 309 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/GenerateEChartService.java 746 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/GroupReportService.java 1017 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/ListReportConfigService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/ListReportServer.java 947 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/Report.java 276 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/ReportConfigService.java 599 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/ReportDatasourceService.java 390 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/ReportServerNew.java 800 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/ReportTypeService.java 515 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/idel/EChartsReportConfigService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IChartPropertyConfigService.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IGenerateEChartService.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IReportConfigService.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IReportDatasourceService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IReportTypeService.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IViewDataConvertService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/main/java/com/product/server/report/service/idel/ListReportConfigService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/test/java/com/product/server/report/AppTest.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/test/java/com/product/server/report/GenerateEChartTest.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/test/java/com/product/server/report/ReportConfigTest.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/test/java/com/product/server/report/ReportDatasourceTest.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-report_v2/src/test/java/com/product/server/report/ReportTypeTest.java 324 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/doc/系统设计 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/doc/系统部署.docx 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/doc/错误代码详细说明.docx 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/imp_temp/国际化Label模板.xls 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/imp_temp/岗位模板.xls 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/imp_temp/岗位等级模板.xls 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/imp_temp/成本中心模板.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/imp_temp/用户信息.xls 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/imp_temp/组织机构模板.xls 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix.tar 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix/doc/install.txt 338 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix/doc/jdbcrel.htm 490 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix/doc/patchinfo.htm 8117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix/setup.jar 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/lib/mrc-ess-server-util-1.0.0-SNAPSHOT.jar 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/resources/LicenseKey.dat 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/sql_patch/update_sql20220107_001.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/sql_patch/update_sql20220107_002.sql 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/sql_patch/update_sql20220108_001.sql 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/src/main/resources/application-dev.properties 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/src/main/resources/application.properties 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
product-server-web/src/main/resources/logback-spring.xml 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
README.md
@@ -4,8 +4,3 @@
    ## ä¾èµ–于标准产品版本v1.0.0
    ## å‰ç«¯é¡¹ç›®ç‰ˆæœ¬ä¸ºv2.0.0
### æ›´æ–°æ—¥å¿—
#### 2023å¹´6月30日
    1.新增日志监控接口
product-server-data-center/src/main/java/com/product/data/center/service/DataArchivingQueue.java
@@ -1,5 +1,6 @@
package com.product.data.center.service;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.RandomUtil;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
@@ -34,385 +35,399 @@
 */
@Service
public class DataArchivingQueue extends AbstractBaseService {
    // æŸ¥è¯¢é˜Ÿåˆ—map:map<表名,dte队列>
    private static Map<String, LinkedBlockingQueue<DataTableEntity>> queryMap = new ConcurrentHashMap<>();
    // æŸ¥è¯¢å­˜æ´»map:正在执行查询的表,对应的值为执行的线程数,为0标识已经执行完成
    private static Map<String, Set<String>> existsQueryMap = Maps.newHashMap();
    // æŸ¥è¯¢çº¿ç¨‹map
    private static Map<String, ExecutorService> queryThreadMap = Maps.newHashMap();
    // é”™è¯¯æ—¥å¿—map
    private static Map<String, StringBuilder> errorLogMap = Maps.newHashMap();
    // å•表查询最大线程数
    private static final int QUERY_THREAD_COUNT = 3;
    // å•表验证查询最大批次(单表查询最大批次=单表验证查询最大批次 + å•表查询最大线程数)
    private static final int QUERY_MAX_BATCH_COUNT = 4;
    // æŸ¥è¯¢æ¯é¡µå¤§å°
    private static final int QUERY_PAGE_SIZE = 50000;
    // æ’入每页大小
    public static final int INSERT_PAGE_SIZE = 5000;
    // æŸ¥è¯¢é˜Ÿåˆ—map:map<表名,dte队列>
    private static Map<String, LinkedBlockingQueue<DataTableEntity>> queryMap = new ConcurrentHashMap<>();
    // æŸ¥è¯¢å­˜æ´»map:正在执行查询的表,对应的值为执行的线程数,为0标识已经执行完成
    private static Map<String, Set<String>> existsQueryMap = Maps.newHashMap();
    // æŸ¥è¯¢çº¿ç¨‹map
    private static Map<String, ExecutorService> queryThreadMap = Maps.newHashMap();
    // é”™è¯¯æ—¥å¿—map
    private static Map<String, StringBuilder> errorLogMap = Maps.newHashMap();
    // å•表查询最大线程数
    private static final int QUERY_THREAD_COUNT = 3;
    // å•表验证查询最大批次(单表查询最大批次=单表验证查询最大批次 + å•表查询最大线程数)
    private static final int QUERY_MAX_BATCH_COUNT = 4;
    // æŸ¥è¯¢æ¯é¡µå¤§å°
    private static final int QUERY_PAGE_SIZE = 50000;
    // æ’入每页大小
    public static final int INSERT_PAGE_SIZE = 5000;
    /**
     * æŸ¥è¯¢
     *
     * @param sourceDbe
     * @param sourceTable
     * @param filter
     * @param params
     * @param uniqueField ä¸»é”®ï¼Œä¸ä»…会用于识别还会用于排序防止oracle分页获取到重复数据
     * @param minID
     */
    public void query(DataBaseEntity sourceDbe, String sourceTable, String filter, Object[] params, String uniqueField, String minID) {
        Dao sourceDao = null;
        try {
            StringBuilder countSql = new StringBuilder(128);
            countSql.append("select count(*) count_value from ").append(sourceTable);
            if (!StringUtils.isEmpty(filter)) {
                countSql.append(" where ").append(filter);
            }
            sourceDao = sourceDbe.newDao();
            FieldSetEntity countFse = sourceDao.getOne(countSql.toString(), params);
            int totalCount = StringUtils.isEmpty(countFse.getString("count_value")) ? 0 : countFse.getInteger("count_value");
            int partCount = getPartCount(totalCount);
            shutdownQueryThread(sourceTable);
            ExecutorService executorService = Executors.newWorkStealingPool(QUERY_THREAD_COUNT);
            queryThreadMap.put(sourceTable, executorService);
            StringBuilder rangeSql = new StringBuilder(128);
            String tempPartMinID = minID;
            int partSize = partCount * QUERY_PAGE_SIZE;
            int count = ceilPage(totalCount, partSize);
            for (int i = 1; i <= count; i++) {
                rangeSql.setLength(0);
                if (!StringUtils.isEmpty(filter)) {
                    rangeSql.append(filter).append(" and ");
                }
                rangeSql.append(uniqueField).append(">='").append(tempPartMinID).append("'");
                DataTableEntity rangeDte = sourceDao.getList(getSql(uniqueField, sourceTable, rangeSql.toString(), sourceDbe.getDbType().getValue(), 1, partSize), params);
                if (DataTableEntity.isEmpty(rangeDte)) {
                    continue;
                }
                FieldSetEntity rangeFse = rangeDte.getFieldSetEntity(0);
                String curPartMaxID = rangeFse.getString("max_id");
                String curPartMinID = tempPartMinID;
                executorService.submit(() -> {
                    String threadInfo = String.valueOf(Thread.currentThread().getId());
                    Dao threadSourceDao = null;
                    String thisPartMinID = curPartMinID;
                    try {
                        threadSourceDao = sourceDbe.newDao();
                        startQuery(sourceTable, threadInfo);
                        int totalPage = ceilPage(partSize, QUERY_PAGE_SIZE);
                        StringBuilder tempFilter = new StringBuilder(128);
                        for (int j = 0; j < totalPage; j++) {
                            while (!allowQuery(sourceTable)) {
                                Thread.sleep(RandomUtil.randomInt(800, 1200));
                            }
                            tempFilter.setLength(0);
                            tempFilter.append(uniqueField);
                            WriteUtil.append("DA-threadInfo:" + threadInfo + "-thisPartMinID:" + thisPartMinID);
                            if (minID.equals(thisPartMinID)) {
                                tempFilter.append(">=");
                            } else {
                                tempFilter.append(">");
                            }
                            tempFilter.append("'").append(thisPartMinID).append("'").append(" and ").append(uniqueField).append("<='").append(curPartMaxID).append("'");
                            if (!StringUtils.isEmpty(filter)) {
                                tempFilter.append(" and ").append(filter);
                            }
                            WriteUtil.append("DA-threadInfo:" + threadInfo + "-currentPage:" + (j + 1) + "-pageSize:" + QUERY_PAGE_SIZE + "-filter:" + tempFilter);
                            DataTableEntity allDte = threadSourceDao.getList(sourceTable, tempFilter.toString(), params, uniqueField, 1, QUERY_PAGE_SIZE);
                            if (!DataTableEntity.isEmpty(allDte)) {
                                add(sourceTable, allDte);
                                thisPartMinID = allDte.getFieldSetEntity(allDte.getRows() - 1).getString(uniqueField);
                            } else {
                                break;
                            }
                        }
                    } catch (Exception e) {
                        appendErrorLog(sourceTable, SpringUtils.getBean(JournalManagerService.class).getStackTrace(e).trim());
                        SpringMVCContextHolder.getSystemLogger().error(e);
                        clear(sourceTable);
                    } finally {
                        if (threadSourceDao != null) {
                            threadSourceDao.closeConnection();
                        }
                        finalQuery(sourceTable, threadInfo);
                    }
                });
                tempPartMinID = curPartMaxID;
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (sourceDao != null) {
                sourceDao.closeConnection();
            }
        }
    }
    /**
     * æŸ¥è¯¢
     *
     * @param sourceDbe
     * @param sourceTable
     * @param filter
     * @param params
     * @param uniqueField ä¸»é”®ï¼Œä¸ä»…会用于识别还会用于排序防止oracle分页获取到重复数据
     * @param minID
     */
    public void query(DataBaseEntity sourceDbe, String sourceTable, String filter, Object[] params, String uniqueField, String minID) {
        Dao sourceDao = null;
        try {
            StringBuilder countSql = new StringBuilder(128);
            countSql.append("select count(*) count_value from ").append(sourceTable);
            if (!StringUtils.isEmpty(filter)) {
                countSql.append(" where ").append(filter);
            }
            sourceDao = sourceDbe.newDao();
            FieldSetEntity countFse = sourceDao.getOne(countSql.toString(), params);
            int totalCount = StringUtils.isEmpty(countFse.getString("count_value")) ? 0 : countFse.getInteger("count_value");
            int partCount = getPartCount(totalCount);
            shutdownQueryThread(sourceTable);
            ExecutorService executorService = Executors.newWorkStealingPool(QUERY_THREAD_COUNT);
            queryThreadMap.put(sourceTable, executorService);
            StringBuilder rangeSql = new StringBuilder(128);
            String tempPartMinID = minID;
            int partSize = partCount * QUERY_PAGE_SIZE;
            int count = ceilPage(totalCount, partSize);
            for (int i = 1; i <= count; i++) {
                rangeSql.setLength(0);
                if (!StringUtils.isEmpty(filter)) {
                    rangeSql.append(filter).append(" and ");
                }
                rangeSql.append(uniqueField).append(">='").append(tempPartMinID).append("'");
                DataTableEntity rangeDte = sourceDao.getList(getSql(uniqueField, sourceTable, rangeSql.toString(), sourceDbe.getDbType().getValue(), 1, partSize), params);
                if (DataTableEntity.isEmpty(rangeDte)) {
                    continue;
                }
                FieldSetEntity rangeFse = rangeDte.getFieldSetEntity(0);
                String curPartMaxID = rangeFse.getString("max_id");
                String curPartMinID = tempPartMinID;
                executorService.submit(() -> {
                    String threadInfo = String.valueOf(Thread.currentThread().getId());
                    Dao threadSourceDao = null;
                    String thisPartMinID = curPartMinID;
                    try {
                        threadSourceDao = sourceDbe.newDao();
                        startQuery(sourceTable, threadInfo);
                        int totalPage = ceilPage(partSize, QUERY_PAGE_SIZE);
                        StringBuilder tempFilter = new StringBuilder(128);
                        for (int j = 0; j < totalPage; j++) {
                            //查询时检查队列数量,如果超过最大值则等待
                            checkQueueCount(sourceTable);
                            while (!allowQuery(sourceTable)) {
                                Thread.sleep(RandomUtil.randomInt(800, 1200));
                            }
                            tempFilter.setLength(0);
                            tempFilter.append(uniqueField);
                            WriteUtil.append("DA-threadInfo:" + threadInfo + "-thisPartMinID:" + thisPartMinID);
                            if (minID.equals(thisPartMinID)) {
                                tempFilter.append(">=");
                            } else {
                                tempFilter.append(">");
                            }
                            tempFilter.append("'").append(thisPartMinID).append("'").append(" and ").append(uniqueField).append("<='").append(curPartMaxID).append("'");
                            if (!StringUtils.isEmpty(filter)) {
                                tempFilter.append(" and ").append(filter);
                            }
                            WriteUtil.append("DA-threadInfo:" + threadInfo + "-currentPage:" + (j + 1) + "-pageSize:" + QUERY_PAGE_SIZE + "-filter:" + tempFilter);
                            DataTableEntity allDte = threadSourceDao.getList(sourceTable, tempFilter.toString(), params, uniqueField, 1, QUERY_PAGE_SIZE);
                            if (!DataTableEntity.isEmpty(allDte)) {
                                add(sourceTable, allDte);
                                thisPartMinID = allDte.getFieldSetEntity(allDte.getRows() - 1).getString(uniqueField);
                            } else {
                                break;
                            }
                        }
                    } catch (Exception e) {
                        appendErrorLog(sourceTable, SpringUtils.getBean(JournalManagerService.class).getStackTrace(e).trim());
                        SpringMVCContextHolder.getSystemLogger().error(e);
                        clear(sourceTable);
                    } finally {
                        if (threadSourceDao != null) {
                            threadSourceDao.closeConnection();
                        }
                        finalQuery(sourceTable, threadInfo);
                    }
                });
                tempPartMinID = curPartMaxID;
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (sourceDao != null) {
                sourceDao.closeConnection();
            }
        }
    }
    /**
     * ä»Žé˜Ÿåˆ—中获取
     *
     * @param tableName
     * @return
     */
    public DataTableEntity get(String tableName) {
        WriteUtil.append("DA-从队列中获取-表名:" + tableName);
        synchronized (tableName.intern()) {
            LinkedBlockingQueue<DataTableEntity> queryQueue = queryMap.get(tableName);
            if (queryQueue == null) {
                return null;
            }
            return queryQueue.poll();
        }
    }
    /**
     * ä»Žé˜Ÿåˆ—中获取
     *
     * @param tableName
     * @return
     */
    public DataTableEntity get(String tableName) {
        WriteUtil.append("DA-从队列中获取-表名:" + tableName);
        synchronized (tableName.intern()) {
            LinkedBlockingQueue<DataTableEntity> queryQueue = queryMap.get(tableName);
            if (queryQueue == null) {
                return null;
            }
            return queryQueue.poll();
        }
    }
    /**
     * åˆ¤å®šæ˜¯å¦æŸ¥è¯¢å®Œæ¯•
     *
     * @param tableName
     * @return
     */
    public boolean checkQueryFinish(String tableName) {
        WriteUtil.append("DA-判定是否查询完毕");
        Set<String> set = existsQueryMap.get(tableName);
        return set == null || set.isEmpty();
    }
    /**
     * åˆ¤å®šæ˜¯å¦æŸ¥è¯¢å®Œæ¯•
     *
     * @param tableName
     * @return
     */
    public boolean checkQueryFinish(String tableName) {
        WriteUtil.append("DA-判定是否查询完毕");
        Set<String> set = existsQueryMap.get(tableName);
        return set == null || set.isEmpty();
    }
    /**
     * åˆ¤å®šæ’入队列(查询完成后放入的队列)是否为空
     *
     * @param tableName
     * @return
     */
    public boolean checkInsertQueueEmpty(String tableName) {
        WriteUtil.append("DA-判定插入队列(查询完成后放入的队列)是否为空");
        return queryMap == null || queryMap.get(tableName) == null || queryMap.get(tableName).isEmpty();
    }
    /**
     * åˆ¤å®šæ’入队列(查询完成后放入的队列)是否为空
     *
     * @param tableName
     * @return
     */
    public boolean checkInsertQueueEmpty(String tableName) {
        WriteUtil.append("DA-判定插入队列(查询完成后放入的队列)是否为空");
        return queryMap == null || queryMap.get(tableName) == null || queryMap.get(tableName).isEmpty();
    }
    /**
     * å…³é—­æŸ¥è¯¢çº¿ç¨‹
     *
     * @param tableName
     */
    public void shutdownQueryThread(String tableName) {
        synchronized (tableName.intern()) {
            ExecutorService executorService = queryThreadMap.get(tableName);
            if (executorService != null) {
                if (!executorService.isShutdown()) {
                    executorService.shutdown();
                }
                queryThreadMap.remove(tableName);
            }
        }
    }
    /**
     * å…³é—­æŸ¥è¯¢çº¿ç¨‹
     *
     * @param tableName
     */
    public void shutdownQueryThread(String tableName) {
        synchronized (tableName.intern()) {
            ExecutorService executorService = queryThreadMap.get(tableName);
            if (executorService != null) {
                if (!executorService.isShutdown()) {
                    executorService.shutdown();
                }
                queryThreadMap.remove(tableName);
            }
        }
    }
    /**
     * æ¸…理
     *
     * @param tableName
     */
    public void clear(String tableName) {
        synchronized (tableName.intern()) {
            queryMap.remove(tableName);
            shutdownQueryThread(tableName);
        }
    }
    /**
     * æ¸…理
     *
     * @param tableName
     */
    public void clear(String tableName) {
        synchronized (tableName.intern()) {
            queryMap.remove(tableName);
            shutdownQueryThread(tableName);
        }
    }
    /**
     * æå–错误日志,只能提取一次,提取后会直接清空
     *
     * @param tableName
     * @return
     */
    public String getErrorLog(String tableName) {
        synchronized (tableName.intern()) {
            if (errorLogMap == null) {
                return null;
            } else {
                StringBuilder result = errorLogMap.get(tableName);
                errorLogMap.remove(tableName);
                return result == null ? null : result.toString();
            }
        }
    }
    /**
     * æå–错误日志,只能提取一次,提取后会直接清空
     *
     * @param tableName
     * @return
     */
    public String getErrorLog(String tableName) {
        synchronized (tableName.intern()) {
            if (errorLogMap == null) {
                return null;
            } else {
                StringBuilder result = errorLogMap.get(tableName);
                errorLogMap.remove(tableName);
                return result == null ? null : result.toString();
            }
        }
    }
    /**
     * èŽ·å–åˆ†æ®µçš„æ•°é‡ï¼Œæœ€å¤š16,最小为0,为0表示用不上所有的线程
     *
     * @param totalCount
     * @return
     */
    private int getPartCount(int totalCount) {
        int num = QUERY_THREAD_COUNT * QUERY_PAGE_SIZE;
        int partCount = totalCount / num + (totalCount % num == 0 ? 0 : 1);
        if (partCount >= 16) {
            return 16;
        } else if (partCount >= 8) {
            return 8;
        } else if (partCount >= 4) {
            return 4;
        } else if (partCount >= 2) {
            return 2;
        } else if (partCount >= 1) {
            return 1;
        } else {
            return 0;
        }
    }
    /**
     * èŽ·å–åˆ†æ®µçš„æ•°é‡ï¼Œæœ€å¤š16,最小为0,为0表示用不上所有的线程
     *
     * @param totalCount
     * @return
     */
    private int getPartCount(int totalCount) {
        int num = QUERY_THREAD_COUNT * QUERY_PAGE_SIZE;
        int partCount = totalCount / num + (totalCount % num == 0 ? 0 : 1);
        if (partCount >= 16) {
            return 16;
        } else if (partCount >= 8) {
            return 8;
        } else if (partCount >= 4) {
            return 4;
        } else if (partCount >= 2) {
            return 2;
        } else if (partCount >= 1) {
            return 1;
        } else {
            return 0;
        }
    }
    /**
     * èŽ·å–sql:查询范围内的最大id值
     *
     * @param uniqueField
     * @param sourceTable
     * @param filter
     * @param dbType
     * @param pageIndex
     * @param pageSize
     * @return
     */
    private String getSql(String uniqueField, String sourceTable, String filter, int dbType, int pageIndex, int pageSize) {
        int startIndex = (Math.max(pageIndex, 1) - 1) * pageSize;
        int finalIndex = startIndex + pageSize;
        StringBuilder sql = new StringBuilder(128);
        if (DataBaseType.MYSQL.getValue() == dbType) {
            sql.append("select max(").append(uniqueField).append(") max_id from (");
            sql.append("\n    select ").append(uniqueField).append(" from ").append(sourceTable);
            if (!StringUtils.isEmpty(filter)) {
                sql.append("\n    where ").append(filter);
            }
            sql.append("\n    order by ").append(uniqueField);
            sql.append("\n    limit ").append(startIndex).append(",").append(pageSize);
            sql.append("\n) t");
        } else if (DataBaseType.ORACLE.getValue() == dbType) {
            sql.append("SELECT MAX(").append(uniqueField).append(") max_id FROM (");
            sql.append("\n    SELECT ").append(uniqueField).append(",ROWNUM R FROM (");
            sql.append("\n        SELECT ").append(uniqueField).append(" FROM ").append(sourceTable);
            if (!StringUtils.isEmpty(filter)) {
                sql.append("\n        WHERE ").append(filter);
            }
            sql.append("\n        ORDER BY ").append(uniqueField);
            sql.append("\n    ) T1");
            sql.append("\n    WHERE ROWNUM<=").append(finalIndex);
            sql.append("\n) T2");
            sql.append("\nWHERE R>").append(startIndex);
        }
        return sql.toString();
    }
    /**
     * èŽ·å–sql:查询范围内的最大id值
     *
     * @param uniqueField
     * @param sourceTable
     * @param filter
     * @param dbType
     * @param pageIndex
     * @param pageSize
     * @return
     */
    private String getSql(String uniqueField, String sourceTable, String filter, int dbType, int pageIndex, int pageSize) {
        int startIndex = (Math.max(pageIndex, 1) - 1) * pageSize;
        int finalIndex = startIndex + pageSize;
        StringBuilder sql = new StringBuilder(128);
        if (DataBaseType.MYSQL.getValue() == dbType) {
            sql.append("select max(").append(uniqueField).append(") max_id from (");
            sql.append("\n    select ").append(uniqueField).append(" from ").append(sourceTable);
            if (!StringUtils.isEmpty(filter)) {
                sql.append("\n    where ").append(filter);
            }
            sql.append("\n    order by ").append(uniqueField);
            sql.append("\n    limit ").append(startIndex).append(",").append(pageSize);
            sql.append("\n) t");
        } else if (DataBaseType.ORACLE.getValue() == dbType) {
            sql.append("SELECT MAX(").append(uniqueField).append(") max_id FROM (");
            sql.append("\n    SELECT ").append(uniqueField).append(",ROWNUM R FROM (");
            sql.append("\n        SELECT ").append(uniqueField).append(" FROM ").append(sourceTable);
            if (!StringUtils.isEmpty(filter)) {
                sql.append("\n        WHERE ").append(filter);
            }
            sql.append("\n        ORDER BY ").append(uniqueField);
            sql.append("\n    ) T1");
            sql.append("\n    WHERE ROWNUM<=").append(finalIndex);
            sql.append("\n) T2");
            sql.append("\nWHERE R>").append(startIndex);
        }
        return sql.toString();
    }
    /**
     * æ”¾å…¥é˜Ÿåˆ—
     *
     * @param tableName
     * @param dte
     */
    private void add(String tableName, DataTableEntity dte) {
        synchronized (tableName.intern()) {
            LinkedBlockingQueue<DataTableEntity> queryQueue = queryMap.get(tableName);
            if (queryQueue == null) {
                queryQueue = new LinkedBlockingQueue<>();
                queryMap.put(tableName, queryQueue);
            }
            if (tableName.endsWith("BAK20230823")) {
                //检查dte中的source_info å’Œ pre_master_key æ˜¯å¦ä¸ºç©º
                for (int i = 0; i < dte.getRows(); i++) {
                    String sourceInfo = dte.getString(i, "source_info");
                    String preMasterKey = dte.getString(i, "pre_master_key");
                    if (StringUtils.isEmpty(sourceInfo) || StringUtils.isEmpty(preMasterKey)) {
                        dte.setFieldValue(i, "source_info", "ch-kt");
                        String idFiledName = tableName.toLowerCase(Locale.ROOT).startsWith("t_wip_detail") ? "wip_detail_id" : tableName.toLowerCase(Locale.ROOT).startsWith("t_wip_product_keyp") ? "pk_id" : "wip_id";
                        dte.setFieldValue(i, "pre_master_key", dte.getString(i, idFiledName));
                    }
                }
            }
    /**
     * æ£€æŸ¥é˜Ÿåˆ—数量
     */
    private void checkQueueCount(String tableName) {
        //初始时间
        long startTime = System.currentTimeMillis();
        while (queryMap.get(tableName) != null && queryMap.get(tableName).size() >= 10) {
            //与初始时间比较,如果超过10分钟则打印
            if (System.currentTimeMillis() - startTime > 600000) {
                WriteUtil.append("DA-队列数量超过10,当前数量:" + queryMap.get(tableName).size());
                startTime = System.currentTimeMillis();
            }
            ThreadUtil.sleep(10000);
        }
    }
            queryQueue.add(dte);
            WriteUtil.append("DA-成功放入队列-" + tableName + "-当前剩余队列数:" + queryQueue.size());
            while (queryQueue.size() >= 10) {
                SpringMVCContextHolder.getSystemLogger().error("DA-队列已满-" + tableName + "-当前剩余队列数:" + queryQueue.size());
            }
        }
    }
    /**
     * æ”¾å…¥é˜Ÿåˆ—
     *
     * @param tableName
     * @param dte
     */
    private void add(String tableName, DataTableEntity dte) {
        synchronized (tableName.intern()) {
            LinkedBlockingQueue<DataTableEntity> queryQueue = queryMap.get(tableName);
            if (queryQueue == null) {
                queryQueue = new LinkedBlockingQueue<>();
                queryMap.put(tableName, queryQueue);
            }
            if (tableName.endsWith("BAK20230823")) {
                //检查dte中的source_info å’Œ pre_master_key æ˜¯å¦ä¸ºç©º
                for (int i = 0; i < dte.getRows(); i++) {
                    String sourceInfo = dte.getString(i, "source_info");
                    String preMasterKey = dte.getString(i, "pre_master_key");
                    if (StringUtils.isEmpty(sourceInfo) || StringUtils.isEmpty(preMasterKey)) {
                        dte.setFieldValue(i, "source_info", "ch-kt");
                        String idFiledName = tableName.toLowerCase(Locale.ROOT).startsWith("t_wip_detail") ? "wip_detail_id" : tableName.toLowerCase(Locale.ROOT).startsWith("t_wip_product_keyp") ? "pk_id" : "wip_id";
                        dte.setFieldValue(i, "pre_master_key", dte.getString(i, idFiledName));
                    }
                }
            }
            queryQueue.add(dte);
            WriteUtil.append("DA-成功放入队列-" + tableName + "-当前剩余队列数:" + queryQueue.size());
        }
    }
    /**
     * æŸ¥è¯¢å¼€å§‹ï¼Œå‘存活map中添加1
     *
     * @param tableName
     */
    private void startQuery(String tableName, String threadInfo) {
        synchronized (tableName.intern()) {
            Set<String> set = existsQueryMap.computeIfAbsent(tableName, k -> Sets.newLinkedHashSet());
            set.add(threadInfo);
        }
    }
    /**
     * æŸ¥è¯¢å¼€å§‹ï¼Œå‘存活map中添加1
     *
     * @param tableName
     */
    private void startQuery(String tableName, String threadInfo) {
        synchronized (tableName.intern()) {
            Set<String> set = existsQueryMap.computeIfAbsent(tableName, k -> Sets.newLinkedHashSet());
            set.add(threadInfo);
        }
    }
    /**
     * æŸ¥è¯¢ç»“束,向存活map中减少1
     *
     * @param tableName
     */
    private void finalQuery(String tableName, String threadInfo) {
        synchronized (tableName.intern()) {
            Set<String> set = existsQueryMap.get(tableName);
            if (set == null || !set.contains(threadInfo)) {
                throw new BaseException(ErrorCode.DATA_ARCHIVE_QUERY_THREAD_COUNT_ERROR.getValue(), ErrorCode.DATA_ARCHIVE_QUERY_THREAD_COUNT_ERROR.getText() + " table_name: " + tableName);
            }
            set.remove(threadInfo);
            if (set.isEmpty()) {
                existsQueryMap.remove(tableName);
            }
        }
    }
    /**
     * æŸ¥è¯¢ç»“束,向存活map中减少1
     *
     * @param tableName
     */
    private void finalQuery(String tableName, String threadInfo) {
        synchronized (tableName.intern()) {
            Set<String> set = existsQueryMap.get(tableName);
            if (set == null || !set.contains(threadInfo)) {
                throw new BaseException(ErrorCode.DATA_ARCHIVE_QUERY_THREAD_COUNT_ERROR.getValue(), ErrorCode.DATA_ARCHIVE_QUERY_THREAD_COUNT_ERROR.getText() + " table_name: " + tableName);
            }
            set.remove(threadInfo);
            if (set.isEmpty()) {
                existsQueryMap.remove(tableName);
            }
        }
    }
    /**
     * å…è®¸æ‰§è¡ŒæŸ¥è¯¢ï¼ˆé¿å…é˜Ÿåˆ—中等待插入的太多,导致内存溢出)
     *
     * @param tableName
     * @return
     */
    private boolean allowQuery(String tableName) {
        synchronized (tableName.intern()) {
            return queryMap.get(tableName) == null || queryMap.get(tableName).size() <= QUERY_MAX_BATCH_COUNT;
        }
    }
    /**
     * å…è®¸æ‰§è¡ŒæŸ¥è¯¢ï¼ˆé¿å…é˜Ÿåˆ—中等待插入的太多,导致内存溢出)
     *
     * @param tableName
     * @return
     */
    private boolean allowQuery(String tableName) {
        synchronized (tableName.intern()) {
            return queryMap.get(tableName) == null || queryMap.get(tableName).size() <= QUERY_MAX_BATCH_COUNT;
        }
    }
    /**
     * æ’入错误日志
     *
     * @param tableName
     * @param error
     */
    private void appendErrorLog(String tableName, String error) {
        synchronized (tableName.intern()) {
            StringBuilder errorSb = errorLogMap.get(tableName);
            if (errorSb == null) {
                errorSb = new StringBuilder(128);
                errorLogMap.put(tableName, errorSb);
            }
            if (errorSb.length() > 0) {
                errorSb.append("\n");
            }
            if (errorSb.length() < 2000) {
                errorSb.append(error);
            }
        }
    }
    /**
     * æ’入错误日志
     *
     * @param tableName
     * @param error
     */
    private void appendErrorLog(String tableName, String error) {
        synchronized (tableName.intern()) {
            StringBuilder errorSb = errorLogMap.get(tableName);
            if (errorSb == null) {
                errorSb = new StringBuilder(128);
                errorLogMap.put(tableName, errorSb);
            }
            if (errorSb.length() > 0) {
                errorSb.append("\n");
            }
            if (errorSb.length() < 2000) {
                errorSb.append(error);
            }
        }
    }
    /**
     * èŽ·å–é¡µæ•°ï¼Œå‘ä¸Šå–æ•´
     *
     * @param count
     * @param size
     * @return
     */
    private int ceilPage(int count, int size) {
        if (size == 0) {
            if (count == 0) {
                return 0;
            } else {
                throw new BaseException(ErrorCode.ARCHIVE_PAGE_CALCULATE_ERROR);
            }
        }
        return count / size + (count % size == 0 ? 0 : 1);
    }
    /**
     * èŽ·å–é¡µæ•°ï¼Œå‘ä¸Šå–æ•´
     *
     * @param count
     * @param size
     * @return
     */
    private int ceilPage(int count, int size) {
        if (size == 0) {
            if (count == 0) {
                return 0;
            } else {
                throw new BaseException(ErrorCode.ARCHIVE_PAGE_CALCULATE_ERROR);
            }
        }
        return count / size + (count % size == 0 ? 0 : 1);
    }
}
product-server-data-center/src/main/java/com/product/data/center/service/DataArchivingService.java
@@ -390,6 +390,8 @@
                String maxID = paramFse.getString("max_id");
                String minID = paramFse.getString("min_id");
                String splitTableType = "1".equals(configFse.getString("split_table_type")) ? "1" : "0";
                //开启队列查询时,先清空队列防止上次未处理完的数据占用内存
                dataArchivingQueue.clear(sourceTable);
                dataArchivingQueue.query(sourceDbe, sourceTable, filterSb.toString(), null, uniqueField, minID);
                DataTableEntity allDte;
                Map<String, List<DataTableEntity>> groupDteMap;
product-server-datasource/src/main/java/com/product/datasource/connection/ConnectionManager.java
@@ -200,46 +200,48 @@
        }
        Boolean enabling = Global.getPropertyToBoolean("data.system.oracle.connection-pool.enabling", "false");
        if (enabling) {
            DruidDataSource druidDataSource = DB_DRUID_DATA_SOURCE_MAP.get(ArrayUtil.join(params, ","));
            if (druidDataSource == null || druidDataSource.isClosed()) {
                druidDataSource = new DruidDataSource();
                druidDataSource.setUrl(url);
                druidDataSource.setUsername(dbe.getUserName());
                druidDataSource.setPassword(dbe.getPassWord());
                // åˆå§‹åŒ–时建立物理连接的个数
                druidDataSource.setInitialSize(getProperty("data.system.oracle.connection-pool.initial-size", 10));
                // æœ€å¤§æ´»åŠ¨è¿žæŽ¥æ•°
                druidDataSource.setMaxActive(getProperty("data.system.oracle.connection-pool.max-active", 100));
                // æœ€å°ç©ºé—²è¿žæŽ¥æ•°
                druidDataSource.setMinIdle(getProperty("data.system.oracle.connection-pool.min-idle", 20));
                // æ ¡éªŒæŸ¥è¯¢è¯­å¥
                druidDataSource.setValidationQuery(dbe.getDataBaseType().getValidationQuery());
                // å½“连接空闲时是否测试连接有效性
                druidDataSource.setTestWhileIdle(true);
                // ä¸¤æ¬¡ç©ºé—²è¿žæŽ¥æ¸…除之间的时间间隔
                druidDataSource.setTimeBetweenEvictionRunsMillis(60000);
                druidDataSource.setMaxWait(60 * 1000);
                druidDataSource.setPoolPreparedStatements(true);
                druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(100);
                druidDataSource.setRemoveAbandoned(true);
                //半小时强制归还连接
                druidDataSource.setRemoveAbandonedTimeout(60 * 30);
                DB_DRUID_DATA_SOURCE_MAP.put(ArrayUtil.join(params, ","), druidDataSource);
                try {
                    //获获取连接
                    Connection connection = druidDataSource.getConnection();
                    //测试连接
                    if (!connectionValidity(connection, dbe.getDataBaseType())) {
            synchronized (url.intern()){
                DruidDataSource druidDataSource = DB_DRUID_DATA_SOURCE_MAP.get(ArrayUtil.join(params, ","));
                if (druidDataSource == null || druidDataSource.isClosed()) {
                    druidDataSource = new DruidDataSource();
                    druidDataSource.setUrl(url);
                    druidDataSource.setUsername(dbe.getUserName());
                    druidDataSource.setPassword(dbe.getPassWord());
                    // åˆå§‹åŒ–时建立物理连接的个数
                    druidDataSource.setInitialSize(getProperty("data.system.oracle.connection-pool.initial-size", 10));
                    // æœ€å¤§æ´»åŠ¨è¿žæŽ¥æ•°
                    druidDataSource.setMaxActive(getProperty("data.system.oracle.connection-pool.max-active", 100));
                    // æœ€å°ç©ºé—²è¿žæŽ¥æ•°
                    druidDataSource.setMinIdle(getProperty("data.system.oracle.connection-pool.min-idle", 20));
                    // æ ¡éªŒæŸ¥è¯¢è¯­å¥
                    druidDataSource.setValidationQuery(dbe.getDataBaseType().getValidationQuery());
                    // å½“连接空闲时是否测试连接有效性
                    druidDataSource.setTestWhileIdle(true);
                    // ä¸¤æ¬¡ç©ºé—²è¿žæŽ¥æ¸…除之间的时间间隔
                    druidDataSource.setTimeBetweenEvictionRunsMillis(60000);
                    druidDataSource.setMaxWait(60 * 1000);
                    druidDataSource.setPoolPreparedStatements(true);
                    druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(100);
                    druidDataSource.setRemoveAbandoned(true);
                    //半小时强制归还连接
                    druidDataSource.setRemoveAbandonedTimeout(60 * 30);
                    DB_DRUID_DATA_SOURCE_MAP.put(ArrayUtil.join(params, ","), druidDataSource);
                    try {
                        //获获取连接
                        Connection connection = druidDataSource.getConnection();
                        //测试连接
                        if (!connectionValidity(connection, dbe.getDataBaseType())) {
                            throw new BaseException(ErrorCode.GET_CONNECTION_FAIL);
                        }
                        return connection;
                    } catch (BaseException e) {
                        throw e;
                    } catch (Exception e) {
                        e.printStackTrace();
                        log.error("获取链接失败", e);
                        log.error(url);
                        throw new BaseException(ErrorCode.GET_CONNECTION_FAIL);
                    }
                    return connection;
                } catch (BaseException e) {
                    throw e;
                } catch (Exception e) {
                    e.printStackTrace();
                    log.error("获取链接失败", e);
                    log.error(url);
                    throw new BaseException(ErrorCode.GET_CONNECTION_FAIL);
                }
            }
        }
product-server-report_v2/pom.xml
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/config/CmnConst.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/config/ReportCode.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/config/SystemCode.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/config/SystemParamSet.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/ChartPropertyConfigController.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/DataListReportController.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/EChartsReportConfigController.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/GenerateEChartController.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/ListReportConfigController.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/ReportConfigController.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/ReportDatasourceController.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/ReportTypeController.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/controller/TestDao.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/patch/PatchService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/quartz/ReportDataProcessQuartz.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/quartz/ViewDataConvertService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/ChartPropertyConfigService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/CommonReportService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/DataListReportService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/EChartsReportConfigServiceimple.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/GenerateEChartService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/GroupReportService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/ListReportConfigService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/ListReportConfigServiceImple.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/ListReportServer.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/Report.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/ReportConfigService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/ReportDatasourceService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/ReportServerNew.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/ReportTypeService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/idel/EChartsReportConfigService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IChartPropertyConfigService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IGenerateEChartService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IReportConfigService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IReportDatasourceService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IReportTypeService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/idel/IViewDataConvertService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/main/java/com/product/server/report/service/idel/ListReportConfigService.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/test/java/com/product/server/report/AppTest.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/test/java/com/product/server/report/GenerateEChartTest.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/test/java/com/product/server/report/ReportConfigTest.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/test/java/com/product/server/report/ReportDatasourceTest.java
ÎļþÒÑɾ³ý
product-server-report_v2/src/test/java/com/product/server/report/ReportTypeTest.java
ÎļþÒÑɾ³ý
product-server-web/doc/ϵͳÉè¼Æ
@@ -1,8 +1,5 @@
版本控制:
    å½“前产品版本1.0.0
    è¡ç”Ÿé¡¹ç›®ç‰ˆæœ¬
        1.1.0       picc(绵阳人保)
        1.2.0       xn
    è¯¦ç»†è§£é‡Š
        ï¼ˆ1)目前的版本号共有3级,标准版按照1.0.0
        ï¼ˆ2)第一位作为产品大版本
@@ -16,7 +13,7 @@
    å¿…须配置默认的数据源,名称必须为default,见application.properties
    sourceName=default
2.表设计
    id字段: ç±»åž‹=bigint ï¼Œé•¿åº¦11
    id字段: ç±»åž‹=bigint ï¼Œé•¿åº¦11
    uuid字段、uuid引用字段:,长度都是80
    å­—段类型除了通用String...外,还有一个类型:parentuuid,用此字段表示主子表的关系,
    åŒæ—¶è¿˜å¿…须配关联的父表名称,同一个关联父表,只能配一个parentuuid类型的字段,如果是普通主外键关联,就不用parentuuid
@@ -27,13 +24,13 @@
    ......
    function_uuid      parentuuid     mrbase_sys_datamodel_table(保存表的uuid,显示表的名称,默认关联主表的uuid)
    å­—段的长度为下拉选择,根据不同的数据类型,定义不同的长度选项,如:10、20、50、100等
    å­—段类型:
    é™¤æ ‡å‡†çš„string datetime int double ,还有特殊:parentuuid(主子表关系,记录父表uuid)、code(编码字段 000-000-002)、serialNumber(GXD201209020001)
    å­—段类型=parentuuid时,必须field_relation_table字段填写父表的uuid否则也不能作为主子表保存
    æ‰€æœ‰ç±»åž‹ï¼šstring、int、number(小数)、datetime、parentuuid、code、serialNumber、idcard、url、ip、mac、email、userid、orgUuid、file、flowStatus、table_name
3.缓存数据
 *     ç¼“存配置表:SYS_CACHE_CONFIG
 *     å­—段:ID、uuid、cache_name、TABLENAME(S200)、CACHEFIELD(分级缓存字段,逗号分隔),FIELDS(S4000,字段名,逗号分隔)、filter(S4000)、备注说明....
@@ -50,10 +47,10 @@
    table_name=mrbase_sys_datamodel_field |  cache_fields=*  |  group_field=table_uuid
    table_name=mrbase_sys_datamodel_field        |  cache_fields=*  |  filter=field_type='parentUuid'
    table_name=mrbase_function_permission |  cache_fields=role_uuid,function_uuid,button_uuid | group_field=role_uuid
*缓存刷新,数据新增、修改、删除时都会刷新对应的该表的所有缓存配置,还可以调自定义的代码进行刷新(bean_name、bean_method(String uuid) å‚数是操作数据的uuid ,bean_method() å¯åŠ¨æ—¶ä¼šè°ƒæ­¤æ–¹æ³•ï¼Œå¿…é¡»å®šä¹‰ä¸¤ä¸ªæ–¹æ³•       ï¼‰
*缓存的使用查询方法:
    æœ‰åˆ†ç»„,分组字段,对应值
    æœ‰åˆ†ç»„,分组字段,对应值
     å¯¹åº”缓存中对应的分组字段,整个参数为这,表示没有分组,只能后面不为空,不能前面为空,例如:
    ç¼“存的分组字段:field1、field2、field3 ,获取时参数值,只能三种情况:{value1,null,null}、{value1,value2,null}、{value1,value2,value2},
    ä¸èƒ½å‡ºçް {value1,null,value3} ã€{null,null,value3}  ã€{null,value2,value3} ç­‰æƒ…况
@@ -87,7 +84,7 @@
    åªæœ‰åˆ é™¤æ—¶ç”¨è¿™ä¸ªå­—段来区分,即~type~=del
    ä¿®æ”¹ä¸»å­è¡¨æ•°æ® ä¸»è¡¨å¿…须有uuid字段,子表数据中三个种情况:新增 ~type~="",uuid="",修改:~type~="",uuid="不为空",删除:~type~="del",uuid="不为空"
    å­è¡¨åˆ—数要一致
5.所有实体类型,都必须有个字段 table_name,存表名称 ,可以实体类中定义成常量
6.API请求参数
@@ -95,7 +92,7 @@
    RequestParameterEntity å°è£…所有参数请求,详细见该类
    Object bean=request.getAttribute("requestPara");
    String accessToken = null;
    if(bean !=null)    {
    if(bean !=null)    {
        RequestParameterEntity reqp=(RequestParameterEntity)bean;
        accessToken=reqp.getToken();
    }
@@ -114,7 +111,7 @@
    æŸ¥è¯¢è¿”回
    OK_List(FieldSetEntity fs)
    OK_List(DataTableEntity dt)
    é€šç”¨é”™è¯¯è¿”回, æ–°å¢žã€ä¿®æ”¹ã€åˆ é™¤ã€æŸ¥è¯¢å¤±è´¥
    public String error(String code,String msg )
@@ -124,8 +121,8 @@
     */
    @Autowired
    public BaseDao baseDao = null;
10.~table~ å‚数在新增、修改接口时必须放到数据的前面,以此来首先获取到
10.~table~ å‚数在新增、修改接口时必须放到数据的前面,以此来首先获取到
13.高级参照下拉框接口数据
{
@@ -158,16 +155,16 @@
    å…¶ä¸­filter字段,是配置人员手写的sql条件,字符串中可能配置动态参数,格式为:~参数名称~,前端调用此参照时,也必须传对应的参数值 ï¼Œä¾‹å¦‚:
    é…ç½®filter: uuid=~cust_uuid~ and name like '%~cust_name~%'
    å‰ç«¯å‚数:{cust_uuid="sdgeasge",cust_name="中国"}
    filter字段中还可以配置系统变量,如:is_used=1 and uuid in (select  language_uuid from mrbase_sys_company_language where org_level_uuid='{{COMPANY_UUID}}')
    filter字段中还可以配置系统变量,如:is_used=1 and uuid in (select  language_uuid from mrbase_sys_company_language where org_level_uuid='{{COMPANY_UUID}}')
    {{COMPANY_UUID}}:当前登录人员的公司UUID.
    display_type: 1:列表  2:树结构,当等于2表示此参照数据显示树型,同时  code_field、parent_code_field ã€delay_load要必填,
    code_field:上下级关系表中的 ç¼–码字段:001,此字段也处理后放到select_fields字段中去:生成   xxxxx  code,此前端在点击一个节点时,取code的值传给接口,接返回其下面的子数据
    parent_code_field:父编码字段:001
    org_filter_field:根据表中的公司字段进行数据过滤,多个以逗号分隔
    usr_filter_field:人员数据过滤条件字段,必须是数据源表中的人员字段,可以多个,逗号分隔,
14.1 ä¸‹æ‹‰å‚ç…§(高级参照、数据字典)在列表中显示:
    é…ç½®mrbase_sys_datamodel_field.field_reference字段,配参照名称或数据字典名称,如果是数据字典名称加书名号括起来,如:《gender》
    åœ¨åˆ—表的查询方法,对列表数据进行封装一次:baseDao.loadPromptData(dt);
@@ -198,8 +195,8 @@
    SystemUser user = SpringMVCContextHolder.getCurrentUser();
25.获取当前request、reponse、session等
    SpringMVCContextHolder.getHttpxxxx()
26.对数据的操作,可以参考代码:JsonUtil,如何生成的 FieldSetEnttiy,如何在fs中获取子表(DataTableEntity),如何获取fs中的字段值,如何在DataTableEntity中获取一条记录,和一条记录中的字段值
26.对数据的操作,可以参考代码:JsonUtil,如何生成的 FieldSetEnttiy,如何在fs中获取子表(DataTableEntity),如何获取fs中的字段值,如何在DataTableEntity中获取一条记录,和一条记录中的字段值
27.对一条记录的读写操作
@@ -242,18 +239,18 @@
       -----------------------------------------------------------------
       controller中的具体调用:
       æŠŠ systemClientsService.addClient(fse); æ”¹æˆä»¥ä¸‹ä»£ç 
        /**事务处理实现**/
        ISystemClientsService service=(ISystemClientsService)getProxyInstance(systemClientsService);
        String uuid = service.addClient(fse);
      ISystemClientsService ï¼šservice类的接口类
      systemClientsService:spring注入的serviceç±»
    -------------------------------------------------------------------
    -------------------------------------------------------------------
30.查询列表中包含子表数据
    /**
     *
     *
     * @param tableName
     * @param filter
     * @param para
@@ -269,7 +266,7 @@
    /**
     * @ æŸ¥è¯¢åˆ—表数据的所有子表数据 String 1=每条记录uuid,String 2= å­è¡¨åç§°
     * @ æŸ¥è¯¢åˆ—表数据的所有子表数据 String 1=每条记录uuid,String 2= å­è¡¨åç§°
     * @param uuids é€—号分隔 çˆ¶åˆ—表uuids
     * @param table_name
     * @return
@@ -278,18 +275,18 @@
31.关于附件获取操作
    RequestParameterEntity.getFormData().getString(附件字段);//上传的原始文件名,多个以逗号分隔
    RequestParameterEntity.getFiles().get(原始文件名); //对应的文件,文件名:uuid+"_"+文件的原始名称  ï¼Œä¸€æ¬¡åªèƒ½èŽ·å–ä¸€ä¸ª
32.关于手写sql语句查询和分页的要求
     select TIMESTAMPDIFF(YEAR,aciwe.start_datetime,aciwe.end_datetime) AS start_datetime from a,b where f1=f2 æˆ– a left join b on f1=f2
         å­—段别名必须是表中的字段,否则无法获取到对应字段的表名和字段信息定义,如:
   start_datetime å¿…须是 a表或b表中的一个字段
         å¤šè¡¨å…³è”查询,表定义:a,b æˆ– a left join b on f1=f2 æ•´ä¸ªåšä¸ºè¡¨
                                    æ¡ä»¶å®šä¹‰ï¼Œwhere åŽé¢ ï¼š f1=f2
 33.如查sql语句中没有uuid字段,无法查询出子表
                                    æ¡ä»¶å®šä¹‰ï¼Œwhere åŽé¢ ï¼š f1=f2
 33.如查sql语句中没有uuid字段,无法查询出子表
 34.系统错误说明
       ç³»ç»Ÿé”™è¯¯åˆ†ä¸ºä¸¤ç§ï¼šä¸»åŠ¨æŠ›å‡ºé”™è¯¯ã€æ•èŽ·é”™è¯¯
       ä¸»åŠ¨æŠ›å‡ºï¼š
       /**
@@ -300,7 +297,7 @@
     * @param method é”™è¯¯å‘生方法
     */
    public  BaseException(String code,String error,Class c,String method);
       æ•获错误:
       /**
     * æž„造函数,记录错误到库---捕获的错误
@@ -308,7 +305,7 @@
     * @param exc   æ•获的错误
     */
    public  BaseException(String code,String error,Class c,String method,Exception sysExc)
35.licese支持
      ç¡¬ä»¶ä¿¡æ¯è¯»å–库文件,下载地址:http://sigar.hyperic.com/
        windows版                                                                  mac版                                                            linux版
@@ -323,7 +320,7 @@
    String code=codeService.createCode(fse.getString("table_name"), fse.getString("field_name"), fse.getString("parentCode")==null?"":fse.getString("parentCode"));
    åœ¨æ–°å¢žçš„controller中调用,在底层Dao中的保存方法中获取获取的临时编码去验证是否被占用,占用则重新生成,保证唯一性
    è¿”回json值中code的值即为生成的编码值
37.通用参数验证、数据保存验证
    å‚数验证:com.lx..module.sys.config.RegistValidateç±»
    åœ¨registValidateParameter方法中添加验证代码,如:
@@ -334,7 +331,7 @@
    æ•°æ®ä¿å­˜éªŒè¯ï¼Œåœ¨core包中的dao中自动根据数据表字段的配置验证,通常不用配,但如果有其它验证,也可以在保存和修改接口中配置,否则保存和修改接口不用配
    æ ¹æ®å­—段类型进行验证,如:字段是mail,mrbase_sys_datamodel_field.field_type=email,现只支持:
    int、number(小数)、idcard、url、ip、mac、datetime、length、email
38.properties配置文件参数获取
    è°ƒç”¨ï¼š
    Global.getPropertyToBoolean("druid.datasource.testOnBorrow", "false")
@@ -365,7 +362,7 @@
    /**
     * èŽ·å–äººå‘˜çš„æ•°æ®æƒé™ï¼Œæ€»å…¥å£ ï¼Œè¿‡æ»¤æŒ‡å®šäººå‘˜å­—段,使用默认公司字段进行过滤-org_level_uuid
     * @tableName äººå‘˜è¿‡æ»¤çš„表
     * @param staff_fields
     * @param staff_fields
     * @return
     */
    public  String getDataFilter(String tableName,String staff_fields)
@@ -377,8 +374,8 @@
     * @return
     */
    public  String getDataFilter(String tableName,String staff_fields,String org_fields)
 40.关于流水号
 40.关于流水号
     åªéœ€è¦åœ¨é…ç½®ä¸­é…ç½®æµæ°´å·,见表mrbase_sys_swift_config
    è¡¨ä¸­å­˜æ”¾æµæ°´å·çš„字段,必须在mrbase_sys_datamodel_field表中该字段的field_type=serialNumber ï¼Œç¤ºä¾‹è§test表
    ç•Œé¢è°ƒç”¨æŽ¥å£èŽ·å–ç¼–ç ï¼š/api/common/createSerialNumber,见测试类CodeTest,必传参数:serialNumberName,对应表流水号配置表中的swift_config_name字段值
@@ -426,7 +423,7 @@
        /api/language/load-international-info/{version}
        åŠ è½½æŒ‡å®šå®¢æˆ·ç«¯ã€ç‰ˆæœ¬å·ã€é»˜è®¤è¯­è¨€çš„æ‰€æœ‰å›½é™…åŒ–æ•°æ®
        å®¢æˆ·ç«¯ã€ç‰ˆæœ¬å·ã€é»˜è®¤è¯­è¨€æŽ¥å£å‚数上传
    value:
        1、首先配置表、字段为国际化字段
        2、前端调接口获取哪些表有哪些国际化字段,在界面的中对应元素后面添加地球图标,点图标弹出国际化录入
@@ -486,17 +483,17 @@
        /**
         * ä¸šåŠ¡ä»£ç å±‚è°ƒç”¨
         * èŽ·å–ä¸šåŠ¡å¯¹åº”å­—æ®µçš„å›½é™…åŒ–æ•°æ®,如果language_code不为空,表明是手机端
         * @param dt ä¸šåŠ¡è¡¨æ•°æ®
         * @param dt ä¸šåŠ¡è¡¨æ•°æ®
         * @param language_code ä¸ä¸ºç©ºåˆ™ä¸ºæ‰‹æœºç«¯
         * @return
         */
        DataTableEntity baseDao.listInternationDataTable(DataTableEntity dt,String language_code ) å°è£…国际化数据到每条记录的每个国际化字段。
        FieldSetEntity  baseDao.listInternationDataTable(FieldSetEntity fs,String language_code )  å°è£…国际化数据到单条记录的每个国际化字段。
        //baseDao.processInternationDataTable(DataTableEntity dt,String language_code ),国际化字段不是数组格式
        //baseDao.processInternationDataTable(FieldSetEntity fs,String language_code ) å›½é™…化字段不是数组格式
        è¿”回json格式:
        {
        Â Â Â Â "code":"200",
        Â Â Â Â "data":[
@@ -528,7 +525,7 @@
        Â Â Â Â "msg":"成功",
        Â Â Â Â "status":"success"
        }
        5、修改保存数据json格式:
        {
        Â Â Â Â "token":"11111-新增提交数据",
@@ -562,7 +559,7 @@
        Â Â Â Â ],
        Â Â Â Â "phone":"18123938722"
        }
        6.不能国际化的表:
        mrbase_sys_cache_config ç¼“存配置
        mrbase_sys_data_sources æ•°æ®åº“连接配置
@@ -649,7 +646,7 @@
    æ ¸å¿ƒï¼šéœ€è¦sigar-amd64-winnt.dll或者sigar-x86-winnt.dll文件置于jdk的bin中或者c盘windows/system32
    ä¸Šä¼ ç›®å½•配置,见properties文件中的upload.file。xxxx å‡ ä¸ªç›¸å…³å‚æ•°
    ä¸Šä¼ æ–‡ä»¶è‡ªåŠ¨å­˜åˆ°ç›®å½•ä¸‹ï¼Œåœ¨controller或service层中读取操作。
46.消息服务
    1.新建队列
     public static void createQueue(String queue_name)
@@ -694,9 +691,9 @@
    language:value    //国际化语言
    }
    è¿”回值:list<String> uuids
    å½“查询语名,使用多表联合查询,并使用了别名时,需要添加表别名、字段别名设置,并把sql语句使用select * from (查询语句+数据权限条件+高级查询条件)  b æ‹¬èµ·æ¥ï¼Œæ³¨æ„
 48.以下内容变更
 48.以下内容变更
 1.core包引入变更
<dependency>
    <groupId>com.lx</groupId>
@@ -728,13 +725,13 @@
    public String DataTableEntity.getUuids()  åŽŸ ï¼Œæ”¹ä¸ºä»¥ä¸‹
    æŒ‡å®šè¡¨çš„æ‰€æœ‰uuid,返回数组
    -> public Object[] getUuids(Object tableName)
    -> public Object[] getUuids(Object tableName)
    æŒ‡å®šè¡¨çš„æ‰€æœ‰uuid,返回逗号分隔的字符串
    -> public String getUuidsToString(Object tableName)
    -> public String getUuidsToString(Object tableName)
    è¿”回默认表的所有uuid,返回数组
    -> public Object[] getUuids()
    è¿”回默认表的所有uuid,返回逗号分隔的字符串
    -> public String getUuidsToString()
    -> public String getUuidsToString()
8.登录上传固定参数
    system_language_code è¯­è¨€ç¼–码 zh en
    system_client_type   å®¢æˆ·ç±»åž‹
@@ -781,7 +778,7 @@
        baseDao.update(DataTableEntity fs,String language_code)
       æ•°æ®æŸ¥è¯¢ï¼š
           FieldSetEntity listInternationDataTable(FieldSetEntity fs,String language_code )
           DataTableEntity listInternationDataTable(DataTableEntity dt,String language_code )
           DataTableEntity listInternationDataTable(DataTableEntity dt,String language_code )
49.后端错误信息国际化
    1)错误信息枚举类注入,启动类中添加注入代码:
    DataPoolCacheImpl.getInstance()
@@ -790,11 +787,11 @@
            .appendErrorEnumClass("com.lx.base.module.sys.config.SystemErrorCode");
    2)特殊情况调用(AbstractBaseController.error()、BaseException.getMessage()、getMessageInfo()已实现)
    String message=DataPoolCacheImpl.getInstance().getErrorLanguageInternation(code, language_code);
50.高级参照数据返回规则
    1)所有单位高级参照数据 f1 å…¨ç§° f2 çŸ­ç¼–码
    2)所有部门高级参照数据 f1 å…¨ç§° f2 çŸ­ç¼–码
    3)所有岗位高级参照数据 f1 å…¨ç§°
    3)所有岗位高级参照数据 f1 å…¨ç§°
    4)所有岗位等级高级参照数据 f1 ç­‰çº§çº§åˆ« f2 ç»„名
    5)所有模块高级参照数据 f1 çŸ­ç¼–码
    6)所有功能高级参照数据 f1 çŸ­ç¼–码
@@ -820,7 +817,7 @@
52.功能权限验证
    å¿…须配置mrbase_sys_function_buttons.api_url配置按钮对应后端接口地址,多个逗号分隔,不能含版本号,如:
    æŽ¥å£åœ°å€ï¼š/api/management/delete-user/v1 é…ç½®åœ°å€ï¼š/api/management/delete-user
53.数据操作权限验证
    ä¸»è¦é’ˆå¯¹å•条数据的删 ã€æ”¹ ã€æŸ¥æ“ä½œï¼Œåœ¨åˆ  ã€æ”¹ ã€æŸ¥çš„相应接口调用
    å¿…须设置mrbase_sys_datamodel_field.field_type,userid:存放人员的字段类型,orgUuid:存放组织机构的字段类型
@@ -837,7 +834,7 @@
        /**
         * å¯¹å•条数据进行操作的权限验证
         * @param fs  ä¸Šä¼ æ•°æ®ï¼Œå¿…须包含表名 uuid ,否一律通过
         * @param type éªŒè¯ç±»åž‹ 1=人员验证 2= çº§ç»‡æœºæž„验证 3 ä¸¤è€…都验证
         * @param type éªŒè¯ç±»åž‹ 1=人员验证 2= çº§ç»‡æœºæž„验证 3 ä¸¤è€…都验证
         * @return
         */
        public boolean validDataPermission(FieldSetEntity fs ,int type)
@@ -845,14 +842,14 @@
         * å¯¹å•条数据进行操作的权限验证 ,特殊权限条件 ï¼Œä¸æ ¹æ®äºº ç»„织机构过滤
         * @param tableName è¡¨å
         * @param uuid uuid
         * @param filter ç‰¹æ®Šæƒé™æ¡ä»¶
         * @param filter ç‰¹æ®Šæƒé™æ¡ä»¶
         * @return
         */
        public boolean validDataPermission(String tableName,String uuid,String filter)
        /**
         * å¯¹å•条数据进行操作的权限验证 ,特殊权限条件 ï¼Œä¸æ ¹æ®äºº ç»„织机构过滤
         * @param fs  ä¸Šä¼ æ•°æ®ï¼Œå¿…须包含表名 uuid ,否一律通过
         * @param filter ç‰¹æ®Šæƒé™æ¡ä»¶
         * @param filter ç‰¹æ®Šæƒé™æ¡ä»¶
         * @return
         */
        public boolean validDataPermission(FieldSetEntity fs ,String filter)
@@ -863,7 +860,7 @@
                SystemErrorCode.SYSTEM_NOT_OPER_PERMISSION.getText());
        return this.error(SystemErrorCode.SYSTEM_NOT_OPER_PERMISSION.getValue(), SystemErrorCode.SYSTEM_NOT_OPER_PERMISSION.getText());
    }
    4)按人员、组织机构验证数据权限调用示例
        å¿…须设置mrbase_sys_datamodel_field.field_type,userid:存放人员的字段类型,orgUuid:存放组织机构的字段类型
        if(!permissionService.validDataPermission(fse,CoreConst.DATA_PERMISSION_VALID_TYPE_ALL)) {
@@ -879,7 +876,7 @@
    this.staffBusinessService.addBalance(fs);
    this.logger.info(" ");
  }
54.消息生成
    /**
     * æ‰€æœ‰åº”用服务生成消息调些方法去添加消息
@@ -890,30 +887,30 @@
     * @param content      æ¶ˆæ¯å†…容                 ä¸å¿…å¡«
     * @param title        æ¶ˆæ¯æ ‡é¢˜                 å¿…å¡«
     * @param send_user_id æ¶ˆæ¯å‘送人               å¿…å¡«
     * @param message_type æ¶ˆæ¯ç±»åž‹                 å¿…å¡«
     * @param message_type æ¶ˆæ¯ç±»åž‹                 å¿…å¡«
     * @param url           æ¶ˆæ¯é“¾æŽ¥åœ°å€             ä¸å¿…å¡«
     * @param source_table ä¸šåŠ¡æ•°æ®è¡¨               ä¸å¿…å¡«
     * @param source_uuid  ä¸šåŠ¡æ•°æ®è¡¨uuid           ä¸å¿…å¡«
     * @param create_by    åˆ›å»ºäºº       userid      å¿…å¡«
     * @param create_by    åˆ›å»ºäºº       userid      å¿…å¡«
     * @param is_send_mail æ˜¯å¦å‘送邮件 0:否 1:是   å¿…å¡«
     * @param is_send_sms  æ˜¯å¦å‘送短信 0:否 1:是   å¿…å¡«
     */
    WebsocketMesssageServiceThread.getInstance().appendMessage(String ....);
    WebsocketMesssageServiceThread.getInstance().appendMessage(String ....);
    //消息类型
    //表名常量定义
    public static final int MESSAGE_TOP_TYPE_SYSTEM =1; //"系统消息";
    public static final int MESSAGE_TOP_TYPE_SYSTEM =1; //"系统消息";
    public static final int MESSAGE_TYPE_ANNOUNCEMENT =11; //"公告消息";
    public static final int MESSAGE_TOP_TYPE_TASK =2; //"任务消息";
    public static final int MESSAGE_TYPE_APPROVE =21; //"待办消息";
    public static final int MESSAGE_TYPE_APPROVE =21; //"待办消息";
    public static final int MESSAGE_TYPE_COORDINATION =22; //"协同消息";
    public static final int MESSAGE_TYPE_TASK = 23;// "任务模块消息";
    public static final int MESSAGE_TOP_TYPE_WARNING =3; //"预警消息";
    public static final int MESSAGE_TYPE_WARNING =31; //"预警消息";
55.子表排序规则,中括号内表示子表排序 æ”¾åˆ°orderby参数中
55.子表排序规则,中括号内表示子表排序 æ”¾åˆ°orderby参数中
String s="main_field1,main_field2,{sub_table1:sub_table1_field1 desc,sub_table1_field2},{sub_table2:sub_table2_field1 desc,sub_table2_field2}"
56.错误信息中的动态变量替换
替则使用{}把变量名括起来,此变量名将在Exception中获取:DATA_VERIFY_UNIQUE_ERROR("数据不是唯一:{value}", ModuleEnum.CORE.getValue() + "097"),
@@ -924,7 +921,7 @@
56.反射引用bean :com.product.core.util.ReflectUtil
    /**
     *
     *
     * @param beanName è¢«ä»£ç†å¯¹åƒbean åç§°
     * @param methodName æ–¹æ³•名称
     * @param objects  å‚æ•°
@@ -961,7 +958,7 @@
    jar部署:打开工程的pom.mxl,右键->Run as -> Maven install->进入工程目录->target目录->copy æŠŠå®ŒåŒ…的工程jar,放到服务器的运行目录下的lib目录下(例如200上:D:\LXServer\product-server\lib)
    å‰ç«¯æ–‡ä»¶éƒ¨ç½²ï¼šè¿›å…¥lx-web并运行packed.bat,重新生成dist目录->进入dist目录copy除baseUrl.js以外的所有文件,放到服务器的运行目录下的web目录下。
    é‡å¯ï¼ˆè¿è¡Œæ¡Œé¢å¿«æ·é”®ï¼‰
60.分页查询sql
    select  '6973' as staff_uuid  è¿™ç§æ²¡æœ‰from的语句,要添加 from dual,否则分页查询会出错
product-server-web/doc/ϵͳ²¿Êð.docx
Binary files differ
product-server-web/doc/´íÎó´úÂëÏêϸ˵Ã÷.docx
Binary files differ
product-server-web/imp_temp/¹ú¼Ê»¯LabelÄ£°å.xls
Binary files differ
product-server-web/imp_temp/¸Úλģ°å.xls
Binary files differ
product-server-web/imp_temp/¸ÚλµÈ¼¶Ä£°å.xls
Binary files differ
product-server-web/imp_temp/³É±¾ÖÐÐÄÄ£°å.xlsx
Binary files differ
product-server-web/imp_temp/Óû§ÐÅÏ¢.xls
Binary files differ
product-server-web/imp_temp/×éÖ¯»ú¹¹Ä£°å.xls
Binary files differ
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix.tar
Binary files differ
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix/doc/install.txt
ÎļþÒÑɾ³ý
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix/doc/jdbcrel.htm
ÎļþÒÑɾ³ý
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix/doc/patchinfo.htm
ÎļþÒÑɾ³ý
product-server-web/jdbcDriver/JDBC.3.50.JCinfomix/setup.jar
Binary files differ
product-server-web/lib/mrc-ess-server-util-1.0.0-SNAPSHOT.jar
Binary files differ
product-server-web/resources/LicenseKey.dat
@@ -1 +1 @@
7B6D2332DBB13421010AC91951B73AEE393AA4F5E45D8A81A6572ED29A0FB4447DF3FE2BEC7CD96B066B1AE8A658B97478DCAB2B59F0971241263C69679C721A8AF5514BD65B339FAA7B3034926730E3C0A10BE750BEFD02EF5E6D69BC6C0FB8C1C348F8AC9A60FC4AB8FB2FEA42C50CAB06A195F98259C08B6C31D545887F18799794981CB48507331CED6BEB79F5906E4004B0AC2F98E0EFD14C077055804FC7CEC36666395AD381078F5E8FB364798D6C34BDEA2C8A6093268E09421A203464C23223A30D8931DBC483E47344CF423031D5AF976CDB0FFA21F5B6B628B6849AF9155D68993343EC171BCAADEDBAABE9D583A4A011414F37B7AA8E1D4A6430845B63042C6A1344FBBEB1A94FB4011BB62C489CBCD7701D080AB8E175C45B74DB215C8C4DB5DC38B302550F805E6D3F9C86C247339259CBE2CF1AB21F676ED7BCFE01765BFC566E1A297633E94FF59CF3EAC9D0F54C6CB7BC55018A276886773A9FEB7C620BF276B43B068619ACB745A41F663CDCAF8EFF977E29E4FBCA0F18
704F16B1D215BC04042005365EB2001E3324D7BEEBA9206CA1F670D493A7874D7C65C473EBDEBD0C0EF47C7DAA7F2BF77CAEEAD85E4F681748A2D3CD6A86DF628FF6A90AD4E28B7DA66B8EA0915E4F4DC5DAAC065A7B746CEE1E7533BE0918A4C79FBCDEA24B82014A01B6D8E3A52BBDAC3DAA66FE9FDE3E8D92ACB54DA1746779BBD63F16726C6330140ED5EF0D1974692C5AABA9DBB6BFE742983374187BC2C0BF118861E3A0D68EF1CCBA87CA33988FB2F40FEE7ACFF8952DDCAC47AD42976792F264AC0C6C90D698959D70638E1C38307B559BB540F0F978D3F8B663E7D59E4143B96D5A6C02E5D5086BA3858386E638D338AA4353193CF6FDCC122CF6D68768ACF82104FB2AFF7BC993427E0A2CBD0DD5F1BF735AAC085FB9987E6CA983DB4C45064137A400B6F3DA128276ED819B65241830F4C8B5E849C75F16C93A17B11FE7195A7DF875199562CBE01186A6F4E87FFFF487D09BB4D1887F23C681DB31D998DB659BD4CAB381937A188CEF2DAA2F7065D5A5D42D9697A6E6F00BA3E9
product-server-web/sql_patch/update_sql20220107_001.sql
ÎļþÒÑɾ³ý
product-server-web/sql_patch/update_sql20220107_002.sql
ÎļþÒÑɾ³ý
product-server-web/sql_patch/update_sql20220108_001.sql
ÎļþÒÑɾ³ý
product-server-web/src/main/resources/application-dev.properties
@@ -76,19 +76,8 @@
data.source.type=mysql
data.source.driver=com.mysql.cj.jdbc.Driver
#################local###############################
#data.source.url=jdbc:mysql://110.185.195.204:9092/ch_kt_mes_apply?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useNewIO=true&useSSL=false&serverTimezone=Asia/Shanghai
#data.source.url=jdbc:mysql://192.168.137.1:3306/ch_kt_mes_apply?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useNewIO=true&useSSL=false&serverTimezone=Asia/Shanghai
# \u672C\u5730mysql8
#data.source.url=jdbc:mysql://127.0.0.1:3308/ch_kt_mes_apply?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useNewIO=true&useSSL=false&serverTimezone=Asia/Shanghai
# \u6D4B\u8BD5\u670D\u52A1\u5668
#data.source.url=jdbc:mysql://10.4.69.68:3306/ch_kt_mes_apply?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useNewIO=true&useSSL=false&serverTimezone=Asia/Shanghai
# \u6B63\u5F0F\u670D\u52A1\u5668-\u91C7\u96C6
#data.source.url=jdbc:mysql://10.13.1.39:3306/ch_kt_mes_apply?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useNewIO=true&useSSL=false&serverTimezone=Asia/Shanghai
# \u6B63\u5F0F\u670D\u52A1\u5668-\u62A5\u8868
data.source.url=jdbc:mysql://10.13.1.39:3306/ch_kt_mes_apply?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useNewIO=true&useSSL=false&serverTimezone=Asia/Shanghai
data.source.user=root
#data.source.password=root123
#data.source.password=a123
data.source.password=CHKTADMIN
##################local###############################
#-------------------------druid\u8FDE\u63A5\u6C60\u7684\u914D\u7F6E\u4FE1\u606F------------------------
product-server-web/src/main/resources/application.properties
@@ -1,5 +1,5 @@
# dev prod
spring.profiles.active=dev
spring.profiles.active=prod
# *********server log start **************
server.tomcat.access-log-pattern=%h %D %m %l %u %t "%r" %s %b
product-server-web/src/main/resources/logback-spring.xml
@@ -1,8 +1,9 @@
<configuration>
    <property name="LOG_HOME" value="./logs/backend" />
    <property name="LOG_HOME" value="./logs/backend"/>
    <timestamp key="byDate" datePattern="yyyy-MM-dd"/>
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
    <property name="MESSAGE_FILE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}.%M - %msg%n" />
    <property name="MESSAGE_FILE_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}.%M - %msg%n"/>
    <!-- æ—¥å¿—文件保留时长 -->
    <property name="maxhistory" value="60"/>
    <!-- æ—¥å¿—文件分割大小 -->
@@ -81,12 +82,12 @@
    <logger name="java.sql.Statement" level="INFO"/>
    <logger name="java.sql.PreparedStatement" level="INFO"/>
    <logger name="org.springframework" level="INFO"/>
    <!-- ç”Ÿäº§çŽ¯å¢ƒ -->
    <springProfile name="prod">
        <root level="info">
            <appender-ref ref="consoleAppender"/>
            <!--            ç¦ç”¨æŽ§åˆ¶å°æ‰“印-->
            <appender-ref ref="errorAppender"/>
            <appender-ref ref="infoAppender"/>
        </root>
@@ -110,5 +111,5 @@
            <appender-ref ref="debugAppender"/>
        </root>
    </springProfile>
    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
    <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
</configuration>