product-server-data-center/src/main/java/com/product/data/center/service/SpDealService.java
@@ -18,6 +18,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
@@ -172,12 +173,13 @@
                                    // 检查是否所有表都存在,若是不存在,那么创建
                                    checkTableIfNoThenCreate(monthMap.keySet(), reportTableNamePrefix, createTableService);
                                    String querySql = joinReportDbQuerySql(monthMap, reportTableNamePrefix, sourceInfo);
                                    String querySql = joinReportDbQuerySql(monthMap, reportTableNamePrefix, sourceInfo, singleSubDbTableInfoObj.getString("auto_field"));
                                    DataTableEntity reportDbExistsDte = reportDbe.getDao().getList(querySql);
                                    for (int i = 0; i < reportDbExistsDte.getRows(); i++) {
                                        FieldSetEntity reportDbExistsFse = reportDbExistsDte.getFieldSetEntity(i);
                                        for (Map<String, FieldSetEntity> singleMonthMap : monthMap.values()) {
                                            singleMonthMap.remove(reportDbExistsFse.getString("pre_master_key"));
                                            singleMonthMap.remove(formatNumberString(reportDbExistsFse.getString("pre_master_key")));
                                            singleMonthMap.remove(formatNumberString(reportDbExistsFse.getString(singleSubDbTableInfoObj.getString("auto_field"))));
                                        }
                                    }
                                    for (Map.Entry<String, Map<String, FieldSetEntity>> entry : monthMap.entrySet()) {
@@ -206,6 +208,30 @@
                stop(subDbe, reportDbe);
                SpringMVCContextHolder.getSystemLogger().info("[请求历史特殊处理-结束]");
            }
        }
    }
    /**
     * 判断字符串是否为数字(整数或小数),如果是,则去掉末尾多余的0(可能同时去掉小数点)
     * @param str 输入字符串
     * @return 格式化后的字符串,如果不是数字则返回原字符串
     */
    private String formatNumberString(String str) {
        if (str == null) {
            return null;
        }
        try {
            // 使用 BigDecimal 解析,它能处理整数、小数、科学计数法等
            BigDecimal bd = new BigDecimal(str);
            // 去掉末尾的零
            bd = bd.stripTrailingZeros();
            // 转换为字符串(使用 toPlainString 避免科学计数法)
            return bd.toPlainString();
        } catch (NumberFormatException e) {
            // 如果不是有效数字,返回原字符串
            return str;
        }
    }
@@ -357,18 +383,24 @@
     * @param monthMap              月份map
     * @param reportTableNamePrefix 报表库表名前缀
     * @param sourceInfo            采集表id
     * @param primaryKeyField       主键字段
     * @return  报表库查询语句
     */
    private String joinReportDbQuerySql(Map<String, Map<String, FieldSetEntity>> monthMap, String reportTableNamePrefix, String sourceInfo) {
    private String joinReportDbQuerySql(Map<String, Map<String, FieldSetEntity>> monthMap, String reportTableNamePrefix, String sourceInfo, String primaryKeyField) {
        StringBuilder sql = new StringBuilder(128);
        String model = "SELECT * FROM %s_%s WHERE source_info='%s' AND %s";
        String model1 = "SELECT * FROM %s_%s WHERE source_info='%s' AND %s\n";
        String model2 = "SELECT * FROM %s_%s WHERE %s\n";
        for (Map.Entry<String, Map<String, FieldSetEntity>> entry : monthMap.entrySet()) {
            String month = entry.getKey();
            Set<String> masterKeySet = entry.getValue().keySet();
            if (sql.length() > 0) {
                sql.append("\nUNION ALL\n");
                sql.append("UNION ALL\n");
            }
            sql.append(String.format(model, reportTableNamePrefix, month, sourceInfo, BaseUtil.buildQuestionMarkFilter("pre_master_key", masterKeySet.toArray(), true)));
            String checkPreMasterKeyPart = BaseUtil.buildQuestionMarkFilter("pre_master_key", masterKeySet.toArray(), true);
            String checkPrimaryKeyPart =  BaseUtil.buildQuestionMarkFilter(primaryKeyField, masterKeySet.toArray(), true);
            sql.append(String.format(model1, reportTableNamePrefix, month, sourceInfo, checkPreMasterKeyPart));
            sql.append("UNION ALL\n");
            sql.append(String.format(model2, reportTableNamePrefix, month, checkPrimaryKeyPart));
        }
        return sql.toString();
    }