diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.class b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.class index 9ece925..656c031 100644 Binary files a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.class and b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/classes/java/main/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.class differ diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin index 7d31936..05ae81e 100644 Binary files a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin and b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/build/tmp/compileJava/previous-compilation-data.bin differ diff --git a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java index a32b224..260e66d 100644 --- a/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java +++ b/com.awspaas.user.apps.bnbm.datalinkup/com.awspaas.user.apps.bnbm.datalinkup/src/main/java/com/awspaas/user/apps/bnbm/datalinkup/service/impl/SaleDataSyncServiceImpl.java @@ -1093,63 +1093,142 @@ public class SaleDataSyncServiceImpl implements DataSyncService { LocalDate now = LocalDate.now(); int dayOfMonth = now.getDayOfMonth(); - if (dayOfMonth == 1) { +// if (dayOfMonth == 1) { +// try { +// LOGGER.info("开始执行每月1号的特殊数据处理任务"); +// +// // 计算时间范围 +// LocalDate lastYearMonthDate = now.minusYears(1).minusMonths(1); +// int lastYearMonthValue = lastYearMonthDate.getMonthValue(); +// int lastyear = lastYearMonthDate.getYear(); +// +// // 1. 删除当月去年同期全量数据 +// String deleteCurrentMonthLastYearSql = "DELETE FROM " + hzb + +// " WHERE YEAR = " + lastyear + +// " AND MONTH = " + lastYearMonthValue; +// int update = DBSql.update(deleteCurrentMonthLastYearSql); +// LOGGER.info("已删除去年同期({}-{})的全量数据,删除了{}条数据", lastyear, lastYearMonthValue,update); +// +// // 2. 新增当月去年同期数据 +// // 去年日期 +// LocalDate minusYears = now.minusYears(1); +// // 计算去年同期第一天(当月第一天) +// LocalDate firstDayOfLastYearMonth = minusYears.withDayOfMonth(1); +// // 计算去年下个月第一天 +// LocalDate firstDayOfNextMonthLastYear = minusYears.plusMonths(1).withDayOfMonth(1); +// // 格式化日期为字符串(根据数据库格式要求调整) +// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); +// String lastYearFirstDayStr = firstDayOfLastYearMonth.format(formatter); +// String lastYearNextMonthFirstDayStr = firstDayOfNextMonthLastYear.format(formatter); +// //删除清空去年同期数据 +// int update1 = DBSql.update("DELETE FROM " + hzb + +// " WHERE YEAR = " + firstDayOfLastYearMonth.getYear() + +// " AND MONTH = " + firstDayOfLastYearMonth.getMonthValue()); +// LOGGER.info("先清空{}去年同期数{}",lastYearFirstDayStr,update1); +// // 构建插入SQL(注意:需确保字段匹配且处理可能的主键冲突) +// +//// String insertCurrentMonthLastYearSql = "INSERT INTO " + targetTable + +//// " SELECT * FROM " + targetTable + +//// " WHERE " + targetTimeField + " >= '" + lastYearFirstDayStr + +//// "' AND " + targetTimeField + " < '" + lastYearNextMonthFirstDayStr + "'"; +//// DBSql.update(insertCurrentMonthLastYearSql); +// +// String CurrentMonthLastYearSql = "SELECT * FROM " + targetTable + +// " WHERE " +targetTimeField+">='"+lastYearFirstDayStr+"' AND "+ +// targetTimeField+"<'"+lastYearNextMonthFirstDayStr+"'"; +// LOGGER.info("查询去年同期sql:{}",CurrentMonthLastYearSql); +// ArrayList bos = new ArrayList<>(); +// List maps = DBSql.getMaps(CurrentMonthLastYearSql); +// for (RowMap map : maps) { +// map.remove("ID"); +// map.remove("ORGID"); +// map.remove("CREATEDATE"); +// map.remove("CREATEUSER"); +// map.remove("UPDATEDATE"); +// map.remove("UPDATEUSER"); +// map.remove("ISEND"); +// map.remove("BINDID"); +// BO bo = new BO().setAll(map); +// bos.add(bo); +// } +// // 执行插入操作 +// SDK.getBOAPI().createDataBO(hzb, bos, UserContext.fromUID("admin")); +// LOGGER.info("{}已新增当月去年同期数据",lastYearFirstDayStr); +// +// } catch (Exception e) { +// LOGGER.error("每月1号任务执行失败: {}", e.getMessage(), e); +// } +// } + + + // 修改为每天执行的任务:删除endDated的去年同期上一天的数据,新增endDated的去年同期当天数据 + if (endDated != null) { try { - LOGGER.info("开始执行每月1号的特殊数据处理任务"); + LOGGER.info("开始执行每天的特殊数据处理任务"); - // 计算时间范围 - LocalDate lastYearMonthDate = now.minusYears(1).minusMonths(1); - int lastYearMonthValue = lastYearMonthDate.getMonthValue(); - int lastyear = lastYearMonthDate.getYear(); + // 计算endDated的去年同期日期 + Calendar cal = Calendar.getInstance(); + cal.setTime(endDated); + cal.add(Calendar.YEAR, -1); + Date lastYearEndDate = cal.getTime(); - // 1. 删除当月去年同期全量数据 - String deleteCurrentMonthLastYearSql = "DELETE FROM " + hzb + - " WHERE YEAR = " + lastyear + - " AND MONTH = " + lastYearMonthValue; - int update = DBSql.update(deleteCurrentMonthLastYearSql); - LOGGER.info("已删除去年同期({}-{})的全量数据,删除了{}条数据", lastyear, lastYearMonthValue,update); + // 计算去年同期的上一天 + cal.setTime(lastYearEndDate); + cal.add(Calendar.DAY_OF_MONTH, -1); + Date lastYearEndDateMinusOneDay = cal.getTime(); - // 2. 新增当月去年同期数据 - // 去年日期 - LocalDate minusYears = now.minusYears(1); - // 计算去年同期第一天(当月第一天) - LocalDate firstDayOfLastYearMonth = minusYears.withDayOfMonth(1); - // 计算去年下个月第一天 - LocalDate firstDayOfNextMonthLastYear = minusYears.plusMonths(1).withDayOfMonth(1); - // 格式化日期为字符串(根据数据库格式要求调整) - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - String lastYearFirstDayStr = firstDayOfLastYearMonth.format(formatter); - String lastYearNextMonthFirstDayStr = firstDayOfNextMonthLastYear.format(formatter); - //删除清空去年同期数据 - int update1 = DBSql.update("DELETE FROM " + hzb + - " WHERE YEAR = " + firstDayOfLastYearMonth.getYear() + - " AND MONTH = " + firstDayOfLastYearMonth.getMonthValue()); - LOGGER.info("先清空{}去年同期数{}",lastYearFirstDayStr,update1); - // 构建插入SQL(注意:需确保字段匹配且处理可能的主键冲突) + // 格式化日期 + String endDateStr = simpleDateFormat.format(endDated); + String lastYearEndDateStr = simpleDateFormat.format(lastYearEndDate); + String lastYearEndDateMinusOneDayStr = simpleDateFormat.format(lastYearEndDateMinusOneDay); - String CurrentMonthLastYearSql = "SELECT * FROM " + targetTable + - " WHERE " +targetTimeField+">='"+lastYearFirstDayStr+"' AND "+ - targetTimeField+"<'"+lastYearNextMonthFirstDayStr+"'"; - ArrayList bos = new ArrayList<>(); - List maps = DBSql.getMaps(CurrentMonthLastYearSql); - for (RowMap map : maps) { - map.remove("ID"); - map.remove("ORGID"); - map.remove("CREATEDATE"); - map.remove("CREATEUSER"); - map.remove("UPDATEDATE"); - map.remove("UPDATEUSER"); - map.remove("ISEND"); - map.remove("BINDID"); - BO bo = new BO().setAll(map); - bos.add(bo); + // 1. 删除去年同期上一天的数据 + String deleteLastYearMinusOneDaySql = "DELETE FROM " + hzb + + " WHERE " + targetTimeField + " = '" + lastYearEndDateMinusOneDayStr + "'"; + int deleteCount = DBSql.update(deleteLastYearMinusOneDaySql); + LOGGER.info("已删除去年同期上一天({})的数据,删除了{}条数据", lastYearEndDateMinusOneDayStr, deleteCount); + + // 2. 新增去年同期当天的数据 + // 查询原表中去年同期的数据 + String selectLastYearSql = "SELECT * FROM " + targetTable + + " WHERE " + targetTimeField + " = '" + lastYearEndDateStr + "'"; + List lastYearData = DBSql.getMaps(selectLastYearSql); + + List lastYearBos = new ArrayList<>(); + for (RowMap map : lastYearData) { + BO bo = new BO(); + // 复制所有字段(排除系统字段) + for (String key : map.keySet()) { + if (!key.equalsIgnoreCase("ID") && + !key.equalsIgnoreCase("ORGID") && + !key.equalsIgnoreCase("CREATEDATE") && + !key.equalsIgnoreCase("CREATEUSER") && + !key.equalsIgnoreCase("UPDATEDATE") && + !key.equalsIgnoreCase("UPDATEUSER") && + !key.equalsIgnoreCase("ISEND") && + !key.equalsIgnoreCase("BINDID")) { + if (StringUtils.isNotBlank(targetTimeField)) { + String targetTimeField1 = map.getString(targetTimeField); + Date parse = UtilDate.parse(targetTimeField1); + int year = UtilDate.getYear(parse); + String monthFormat = UtilDate.monthFormat(parse); + int day = UtilDate.getDay(parse); + bo.set("YEARMONTH", year + monthFormat); + bo.set("YEAR", year); + bo.set("MONTH", monthFormat); + bo.set("DAY", day); + } + bo.set(key, map.get(key)); + } + } + lastYearBos.add(bo); } - // 执行插入操作 - SDK.getBOAPI().createDataBO(hzb, bos, UserContext.fromUID("admin")); - LOGGER.info("{}已新增当月去年同期数据",lastYearFirstDayStr); + // 执行插入操作 + SDK.getBOAPI().createDataBO(hzb, lastYearBos, UserContext.fromUID("admin")); + LOGGER.info("已新增去年同期当天({})的数据,新增了{}条数据", lastYearEndDateStr, lastYearBos.size()); } catch (Exception e) { - LOGGER.error("每月1号任务执行失败: {}", e.getMessage(), e); + LOGGER.error("每天任务执行失败: {}", e.getMessage(), e); } } }catch (Exception e){ @@ -1315,75 +1394,52 @@ public class SaleDataSyncServiceImpl implements DataSyncService { } } while (hasMore); - //每月1号删除上月去年同期去除每月最后一天的数据,删除当月去年同期全量数据后新增当月去年同期全量数据, - // 每月1号执行的任务 - LocalDate now = LocalDate.now(); - int dayOfMonth = now.getDayOfMonth(); - - if (dayOfMonth == 1) { + // 每天执行的任务:删除去年同期上一天的数据,新增去年同期当天的数据 try { - LOGGER.info("开始执行每月1号的特殊数据处理任务"); + LOGGER.info("开始执行每天的特殊数据处理任务"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - // 计算时间范围 - LocalDate lastYearMonthDate = now.minusYears(1).minusMonths(1); - // 计算去年上月期第一天(当月第一天) - LocalDate firstDayOfLastYearLastMonth = lastYearMonthDate.withDayOfMonth(1); - // 计算去年上月个月最后一天 - LocalDate firstDayOfLastMonthLastYear = lastYearMonthDate.plusMonths(1).withDayOfMonth(1); - String lastYearLastMonthFirstDayStr = firstDayOfLastYearLastMonth.format(formatter); - String lastYearLastMonthEndDayStr = firstDayOfLastMonthLastYear.format(formatter); + // 获取结束日期 + String currentDateStr = simpleDateFormat2.format(endDated); + LocalDate currentDate = LocalDate.parse(currentDateStr, formatter); - // 1. 删除当月去年同期全量数据 - String deleteCurrentMonthLastYearSql = "DELETE FROM " + targetTable + - " WHERE RQ >= '" + lastYearLastMonthFirstDayStr + - "' AND RQ < '" + lastYearLastMonthEndDayStr+"'"; - int update = DBSql.update(deleteCurrentMonthLastYearSql); - LOGGER.info("已删除去年同期({}-{})的全量数据,删除了{}条数据", lastYearLastMonthFirstDayStr, lastYearLastMonthEndDayStr,update); + // 计算去年同期日期 + LocalDate lastYearSameDay = currentDate.minusYears(1); + // 计算去年同期前一天 + LocalDate lastYearPreviousDay = lastYearSameDay.minusDays(1); - // 2. 新增当月去年同期数据 - // 去年日期 - LocalDate minusYears = now.minusYears(1); - // 计算去年同期第一天(当月第一天) - LocalDate firstDayOfLastYearMonth = minusYears.withDayOfMonth(1); - // 计算去年下个月第一天 - LocalDate firstDayOfNextMonthLastYear = minusYears.plusMonths(1).withDayOfMonth(1); - // 格式化日期为字符串(根据数据库格式要求调整) + String lastYearSameDayStr = lastYearSameDay.format(formatter); + String lastYearPreviousDayStr = lastYearPreviousDay.format(formatter); - String lastYearFirstDayStr = firstDayOfLastYearMonth.format(formatter); - String lastYearNextMonthFirstDayStr = firstDayOfNextMonthLastYear.format(formatter); + // 1. 删除去年同期前一天的数据 + String deleteLastYearPreviousDaySql = "DELETE FROM " + targetTable + + " WHERE RQ = '" + lastYearPreviousDayStr + "'"; + int deletedCount = DBSql.update(deleteLastYearPreviousDaySql); + LOGGER.info("已删除去年同期前一天({})的数据,删除了{}条数据", lastYearPreviousDayStr, deletedCount); - //删除清空去年同期数据 - int update1 = DBSql.update("DELETE FROM " + targetTable + - " WHERE RQ = '" + lastYearNextMonthFirstDayStr+"'"); - LOGGER.info("先清空{}去年同期数{}",lastYearFirstDayStr,update1); - - // 构建查询去年同期全部数据的SQL + // 2. 新增去年同期当天数据 + // 构建查询去年同期当天数据的SQL String lastYearQuerySql; List lastYearParams = new ArrayList<>(); // 根据不同的数据库类型构建查询语句 if ("ORACLE".equalsIgnoreCase(DBname)) { lastYearQuerySql = "SELECT * FROM " + tableName + - " WHERE TO_DATE(" + timeField + ", 'YYYY-MM-DD') BETWEEN TO_DATE(?, 'YYYY-MM-DD') AND TO_DATE(?, 'YYYY-MM-DD')"; - lastYearParams.add(lastYearFirstDayStr); - lastYearParams.add(lastYearNextMonthFirstDayStr); + " WHERE TO_DATE(" + timeField + ", 'YYYY-MM-DD') = TO_DATE(?, 'YYYY-MM-DD')"; + lastYearParams.add(lastYearSameDayStr); } else if ("POSTGRESQL".equalsIgnoreCase(DBname) || "GAUSS".equalsIgnoreCase(DBname)) { lastYearQuerySql = "SELECT * FROM " + tableName + - " WHERE " + timeField + "::DATE BETWEEN ?::DATE AND ?::DATE"; - lastYearParams.add(lastYearFirstDayStr); - lastYearParams.add(lastYearNextMonthFirstDayStr); + " WHERE " + timeField + "::DATE = ?::DATE"; + lastYearParams.add(lastYearSameDayStr); } else if ("SQLSERVER".equalsIgnoreCase(DBname)) { lastYearQuerySql = "SELECT * FROM " + tableName + - " WHERE CONVERT(DATE, " + timeField + ") BETWEEN CONVERT(DATE, ?) AND CONVERT(DATE, ?)"; - lastYearParams.add(lastYearFirstDayStr); - lastYearParams.add(lastYearNextMonthFirstDayStr); + " WHERE CONVERT(DATE, " + timeField + ") = CONVERT(DATE, ?)"; + lastYearParams.add(lastYearSameDayStr); } else { // 默认处理(如MySQL) lastYearQuerySql = "SELECT * FROM " + tableName + - " WHERE STR_TO_DATE(" + timeField + ", '%Y-%m-%d') BETWEEN STR_TO_DATE(?, '%Y-%m-%d') AND STR_TO_DATE(?, '%Y-%m-%d')"; - lastYearParams.add(lastYearFirstDayStr); - lastYearParams.add(lastYearNextMonthFirstDayStr); + " WHERE STR_TO_DATE(" + timeField + ", '%Y-%m-%d') = STR_TO_DATE(?, '%Y-%m-%d')"; + lastYearParams.add(lastYearSameDayStr); } // 添加分区条件(如果存在) @@ -1395,32 +1451,29 @@ public class SaleDataSyncServiceImpl implements DataSyncService { } } - LOGGER.info("查询去年同期数据SQL: {}", lastYearQuerySql); - LOGGER.info("查询参数: 开始日期={}, 结束日期={}", lastYearFirstDayStr, lastYearNextMonthFirstDayStr); + LOGGER.info("查询去年同期当天数据SQL: {}", lastYearQuerySql); + LOGGER.info("查询参数: 日期={}", lastYearSameDayStr); - // 执行查询去年同期数据 + // 执行查询去年同期当天数据 List lastYearData; if (lastYearParams.isEmpty()) { lastYearData = rdsapi.getMaps(lastYearQuerySql); } else { // 这里需要根据您的rdsapi接口调整参数传递方式 - lastYearData = rdsapi.getMaps(lastYearQuerySql,lastYearFirstDayStr,lastYearNextMonthFirstDayStr); + lastYearData = rdsapi.getMaps(lastYearQuerySql, lastYearSameDayStr); } if (lastYearData != null && !lastYearData.isEmpty()) { - // 批量插入去年同期数据 + // 批量插入去年同期当天数据 int lastYearSuccessCount = this.processAndInsertData(lastYearData, fieldMappings, targetTable); - LOGGER.info("成功插入去年同期数据{}条,时间范围: {}-{}", - lastYearSuccessCount, lastYearFirstDayStr, lastYearNextMonthFirstDayStr); + LOGGER.info("成功插入去年同期当天数据{}条,日期: {}", + lastYearSuccessCount, lastYearSameDayStr); } else { - LOGGER.warn("未查询到去年同期数据,时间范围: {}-{}", - lastYearFirstDayStr, lastYearNextMonthFirstDayStr); + LOGGER.warn("未查询到去年同期当天数据,日期: {}", lastYearSameDayStr); } } catch (Exception e) { - LOGGER.error("每月1号任务执行失败: {}", e.getMessage(), e); - } - + LOGGER.error("每天任务执行失败: {}", e.getMessage(), e); } LOGGER.info("从表[{}]共查询到{}条数据,成功同步{}条数据",