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();
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 {
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<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);
// 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<RowMap> lastYearData = DBSql.getMaps(selectLastYearSql);
List<BO> 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<Object> 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<RowMap> 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("从表[{}]共查询到{}条数据,成功同步{}条数据",