1、同步应收数据修改为每次更新去年同期上一天的数据

This commit is contained in:
llllon 2025-10-20 14:46:02 +08:00
parent 2748b84363
commit 3b5a1fad2c
3 changed files with 163 additions and 110 deletions

View File

@ -1093,63 +1093,142 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
LocalDate now = LocalDate.now(); LocalDate now = LocalDate.now();
int dayOfMonth = now.getDayOfMonth(); 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<BO> bos = new ArrayList<>();
// List<RowMap> 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 { try {
LOGGER.info("开始执行每月1号的特殊数据处理任务"); LOGGER.info("开始执行每的特殊数据处理任务");
// 计算时间范围 // 计算endDated的去年同期日期
LocalDate lastYearMonthDate = now.minusYears(1).minusMonths(1); Calendar cal = Calendar.getInstance();
int lastYearMonthValue = lastYearMonthDate.getMonthValue(); cal.setTime(endDated);
int lastyear = lastYearMonthDate.getYear(); cal.add(Calendar.YEAR, -1);
Date lastYearEndDate = cal.getTime();
// 1. 删除当月去年同期全量数据 // 计算去年同期的上一天
String deleteCurrentMonthLastYearSql = "DELETE FROM " + hzb + cal.setTime(lastYearEndDate);
" WHERE YEAR = " + lastyear + cal.add(Calendar.DAY_OF_MONTH, -1);
" AND MONTH = " + lastYearMonthValue; Date lastYearEndDateMinusOneDay = cal.getTime();
int update = DBSql.update(deleteCurrentMonthLastYearSql);
LOGGER.info("已删除去年同期({}-{})的全量数据,删除了{}条数据", lastyear, lastYearMonthValue,update);
// 2. 新增当月去年同期数据 // 格式化日期
// 去年日期 String endDateStr = simpleDateFormat.format(endDated);
LocalDate minusYears = now.minusYears(1); String lastYearEndDateStr = simpleDateFormat.format(lastYearEndDate);
// 计算去年同期第一天当月第一天 String lastYearEndDateMinusOneDayStr = simpleDateFormat.format(lastYearEndDateMinusOneDay);
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 CurrentMonthLastYearSql = "SELECT * FROM " + targetTable + // 1. 删除去年同期上一天的数据
" WHERE " +targetTimeField+">='"+lastYearFirstDayStr+"' AND "+ String deleteLastYearMinusOneDaySql = "DELETE FROM " + hzb +
targetTimeField+"<'"+lastYearNextMonthFirstDayStr+"'"; " WHERE " + targetTimeField + " = '" + lastYearEndDateMinusOneDayStr + "'";
ArrayList<BO> bos = new ArrayList<>(); int deleteCount = DBSql.update(deleteLastYearMinusOneDaySql);
List<RowMap> maps = DBSql.getMaps(CurrentMonthLastYearSql); LOGGER.info("已删除去年同期上一天({})的数据,删除了{}条数据", lastYearEndDateMinusOneDayStr, deleteCount);
for (RowMap map : maps) {
map.remove("ID"); // 2. 新增去年同期当天的数据
map.remove("ORGID"); // 查询原表中去年同期的数据
map.remove("CREATEDATE"); String selectLastYearSql = "SELECT * FROM " + targetTable +
map.remove("CREATEUSER"); " WHERE " + targetTimeField + " = '" + lastYearEndDateStr + "'";
map.remove("UPDATEDATE"); List<RowMap> lastYearData = DBSql.getMaps(selectLastYearSql);
map.remove("UPDATEUSER");
map.remove("ISEND"); List<BO> lastYearBos = new ArrayList<>();
map.remove("BINDID"); for (RowMap map : lastYearData) {
BO bo = new BO().setAll(map); BO bo = new BO();
bos.add(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) { } catch (Exception e) {
LOGGER.error("每月1号任务执行失败: {}", e.getMessage(), e); LOGGER.error("任务执行失败: {}", e.getMessage(), e);
} }
} }
}catch (Exception e){ }catch (Exception e){
@ -1315,75 +1394,52 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
} }
} while (hasMore); } while (hasMore);
//每月1号删除上月去年同期去除每月最后一天的数据删除当月去年同期全量数据后新增当月去年同期全量数据 // 每天执行的任务删除去年同期上一天的数据新增去年同期当天的数据
// 每月1号执行的任务
LocalDate now = LocalDate.now();
int dayOfMonth = now.getDayOfMonth();
if (dayOfMonth == 1) {
try { try {
LOGGER.info("开始执行每月1号的特殊数据处理任务"); LOGGER.info("开始执行每天的特殊数据处理任务");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 计算时间范围 // 获取结束日期
LocalDate lastYearMonthDate = now.minusYears(1).minusMonths(1); String currentDateStr = simpleDateFormat2.format(endDated);
// 计算去年上月期第一天当月第一天 LocalDate currentDate = LocalDate.parse(currentDateStr, formatter);
LocalDate firstDayOfLastYearLastMonth = lastYearMonthDate.withDayOfMonth(1);
// 计算去年上月个月最后一天
LocalDate firstDayOfLastMonthLastYear = lastYearMonthDate.plusMonths(1).withDayOfMonth(1);
String lastYearLastMonthFirstDayStr = firstDayOfLastYearLastMonth.format(formatter);
String lastYearLastMonthEndDayStr = firstDayOfLastMonthLastYear.format(formatter);
// 1. 删除当月去年同期全量数据 // 计算去年同期日期
String deleteCurrentMonthLastYearSql = "DELETE FROM " + targetTable + LocalDate lastYearSameDay = currentDate.minusYears(1);
" WHERE RQ >= '" + lastYearLastMonthFirstDayStr + // 计算去年同期前一天
"' AND RQ < '" + lastYearLastMonthEndDayStr+"'"; LocalDate lastYearPreviousDay = lastYearSameDay.minusDays(1);
int update = DBSql.update(deleteCurrentMonthLastYearSql);
LOGGER.info("已删除去年同期({}-{})的全量数据,删除了{}条数据", lastYearLastMonthFirstDayStr, lastYearLastMonthEndDayStr,update);
// 2. 新增当月去年同期数据 String lastYearSameDayStr = lastYearSameDay.format(formatter);
// 去年日期 String lastYearPreviousDayStr = lastYearPreviousDay.format(formatter);
LocalDate minusYears = now.minusYears(1);
// 计算去年同期第一天当月第一天
LocalDate firstDayOfLastYearMonth = minusYears.withDayOfMonth(1);
// 计算去年下个月第一天
LocalDate firstDayOfNextMonthLastYear = minusYears.plusMonths(1).withDayOfMonth(1);
// 格式化日期为字符串根据数据库格式要求调整
String lastYearFirstDayStr = firstDayOfLastYearMonth.format(formatter); // 1. 删除去年同期前一天的数据
String lastYearNextMonthFirstDayStr = firstDayOfNextMonthLastYear.format(formatter); String deleteLastYearPreviousDaySql = "DELETE FROM " + targetTable +
" WHERE RQ = '" + lastYearPreviousDayStr + "'";
int deletedCount = DBSql.update(deleteLastYearPreviousDaySql);
LOGGER.info("已删除去年同期前一天({})的数据,删除了{}条数据", lastYearPreviousDayStr, deletedCount);
//删除清空去年同期数据 // 2. 新增去年同期当天数据
int update1 = DBSql.update("DELETE FROM " + targetTable + // 构建查询去年同期当天数据的SQL
" WHERE RQ = '" + lastYearNextMonthFirstDayStr+"'");
LOGGER.info("先清空{}去年同期数{}",lastYearFirstDayStr,update1);
// 构建查询去年同期全部数据的SQL
String lastYearQuerySql; String lastYearQuerySql;
List<Object> lastYearParams = new ArrayList<>(); List<Object> lastYearParams = new ArrayList<>();
// 根据不同的数据库类型构建查询语句 // 根据不同的数据库类型构建查询语句
if ("ORACLE".equalsIgnoreCase(DBname)) { if ("ORACLE".equalsIgnoreCase(DBname)) {
lastYearQuerySql = "SELECT * FROM " + tableName + lastYearQuerySql = "SELECT * FROM " + tableName +
" WHERE TO_DATE(" + timeField + ", 'YYYY-MM-DD') BETWEEN TO_DATE(?, 'YYYY-MM-DD') AND TO_DATE(?, 'YYYY-MM-DD')"; " WHERE TO_DATE(" + timeField + ", 'YYYY-MM-DD') = TO_DATE(?, 'YYYY-MM-DD')";
lastYearParams.add(lastYearFirstDayStr); lastYearParams.add(lastYearSameDayStr);
lastYearParams.add(lastYearNextMonthFirstDayStr);
} else if ("POSTGRESQL".equalsIgnoreCase(DBname) || "GAUSS".equalsIgnoreCase(DBname)) { } else if ("POSTGRESQL".equalsIgnoreCase(DBname) || "GAUSS".equalsIgnoreCase(DBname)) {
lastYearQuerySql = "SELECT * FROM " + tableName + lastYearQuerySql = "SELECT * FROM " + tableName +
" WHERE " + timeField + "::DATE BETWEEN ?::DATE AND ?::DATE"; " WHERE " + timeField + "::DATE = ?::DATE";
lastYearParams.add(lastYearFirstDayStr); lastYearParams.add(lastYearSameDayStr);
lastYearParams.add(lastYearNextMonthFirstDayStr);
} else if ("SQLSERVER".equalsIgnoreCase(DBname)) { } else if ("SQLSERVER".equalsIgnoreCase(DBname)) {
lastYearQuerySql = "SELECT * FROM " + tableName + lastYearQuerySql = "SELECT * FROM " + tableName +
" WHERE CONVERT(DATE, " + timeField + ") BETWEEN CONVERT(DATE, ?) AND CONVERT(DATE, ?)"; " WHERE CONVERT(DATE, " + timeField + ") = CONVERT(DATE, ?)";
lastYearParams.add(lastYearFirstDayStr); lastYearParams.add(lastYearSameDayStr);
lastYearParams.add(lastYearNextMonthFirstDayStr);
} else { } else {
// 默认处理如MySQL // 默认处理如MySQL
lastYearQuerySql = "SELECT * FROM " + tableName + 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')"; " WHERE STR_TO_DATE(" + timeField + ", '%Y-%m-%d') = STR_TO_DATE(?, '%Y-%m-%d')";
lastYearParams.add(lastYearFirstDayStr); lastYearParams.add(lastYearSameDayStr);
lastYearParams.add(lastYearNextMonthFirstDayStr);
} }
// 添加分区条件如果存在 // 添加分区条件如果存在
@ -1395,32 +1451,29 @@ public class SaleDataSyncServiceImpl implements DataSyncService {
} }
} }
LOGGER.info("查询去年同期数据SQL: {}", lastYearQuerySql); LOGGER.info("查询去年同期当天数据SQL: {}", lastYearQuerySql);
LOGGER.info("查询参数: 开始日期={}, 结束日期={}", lastYearFirstDayStr, lastYearNextMonthFirstDayStr); LOGGER.info("查询参数: 日期={}", lastYearSameDayStr);
// 执行查询去年同期数据 // 执行查询去年同期当天数据
List<RowMap> lastYearData; List<RowMap> lastYearData;
if (lastYearParams.isEmpty()) { if (lastYearParams.isEmpty()) {
lastYearData = rdsapi.getMaps(lastYearQuerySql); lastYearData = rdsapi.getMaps(lastYearQuerySql);
} else { } else {
// 这里需要根据您的rdsapi接口调整参数传递方式 // 这里需要根据您的rdsapi接口调整参数传递方式
lastYearData = rdsapi.getMaps(lastYearQuerySql,lastYearFirstDayStr,lastYearNextMonthFirstDayStr); lastYearData = rdsapi.getMaps(lastYearQuerySql, lastYearSameDayStr);
} }
if (lastYearData != null && !lastYearData.isEmpty()) { if (lastYearData != null && !lastYearData.isEmpty()) {
// 批量插入去年同期数据 // 批量插入去年同期当天数据
int lastYearSuccessCount = this.processAndInsertData(lastYearData, fieldMappings, targetTable); int lastYearSuccessCount = this.processAndInsertData(lastYearData, fieldMappings, targetTable);
LOGGER.info("成功插入去年同期数据{}条,时间范围: {}-{}", LOGGER.info("成功插入去年同期当天数据{}条,日期: {}",
lastYearSuccessCount, lastYearFirstDayStr, lastYearNextMonthFirstDayStr); lastYearSuccessCount, lastYearSameDayStr);
} else { } else {
LOGGER.warn("未查询到去年同期数据,时间范围: {}-{}", LOGGER.warn("未查询到去年同期当天数据,日期: {}", lastYearSameDayStr);
lastYearFirstDayStr, lastYearNextMonthFirstDayStr);
} }
} catch (Exception e) { } catch (Exception e) {
LOGGER.error("每月1号任务执行失败: {}", e.getMessage(), e); LOGGER.error("每天任务执行失败: {}", e.getMessage(), e);
}
} }
LOGGER.info("从表[{}]共查询到{}条数据,成功同步{}条数据", LOGGER.info("从表[{}]共查询到{}条数据,成功同步{}条数据",