| | |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.text.SimpleDateFormat; |
| | | import java.util.*; |
| | | |
| | |
| | | // 检查是否所有表都存在,若是不存在,那么创建 |
| | | 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()) { |
| | |
| | | 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; |
| | | } |
| | | } |
| | | |
| | |
| | | * @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(); |
| | | } |