1、同步应收数据修改为每次更新去年同期上一天的数据
This commit is contained in:
parent
2748b84363
commit
3b5a1fad2c
Binary file not shown.
Binary file not shown.
@ -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("从表[{}]共查询到{}条数据,成功同步{}条数据",
|
||||
|
||||
Loading…
Reference in New Issue
Block a user