提交 84fe610e authored 作者: douxy's avatar douxy

新增xxl-job执行配置

上级 8bf0c38d
...@@ -20,7 +20,7 @@ import java.util.stream.Collectors; ...@@ -20,7 +20,7 @@ import java.util.stream.Collectors;
*/ */
@Slf4j @Slf4j
@Service @Service
@DS("promotion") @DS("bi")
public class QinceUserStatisticDaoImpl implements IQinceUserStatisticDao { public class QinceUserStatisticDaoImpl implements IQinceUserStatisticDao {
@Autowired @Autowired
......
...@@ -19,6 +19,7 @@ import java.time.LocalDateTime; ...@@ -19,6 +19,7 @@ import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException; import java.time.format.DateTimeParseException;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -421,4 +422,47 @@ public class QinceUserStatisticServiceImpl implements IQinceUserStatisticService ...@@ -421,4 +422,47 @@ public class QinceUserStatisticServiceImpl implements IQinceUserStatisticService
} }
return null; return null;
} }
/**
* 测试专用:同步当前年份1月份全量数据(无参快捷调用)
* @return 总计同步记录数
*/
public int testSyncCurrentYearJanuaryAttendance() {
return testSyncJanuaryAttendance(LocalDate.now().getYear());
}
/**
* 测试专用:同步指定年份1月份全量数据
* @param year 目标年份,如2026
* @return 总计同步记录数
*/
public int testSyncJanuaryAttendance(int year) {
log.info("===== 【测试模式】开始同步{}年1月份全量勤策考勤数据 =====", year);
int totalCount = 0;
// 构造1月1日和1月最后一天
LocalDate janFirst = LocalDate.of(year, 1, 1);
LocalDate janLast = janFirst.with(TemporalAdjusters.lastDayOfMonth());
// 遍历1月份所有日期,循环同步(添加休眠避免API限流)
LocalDate currentDate = janFirst;
while (!currentDate.isAfter(janLast)) {
try {
log.info("【测试模式】开始同步{}", currentDate.format(DATE_FORMATTER));
// 复用原有核心同步方法,无需重复写逻辑
int dayCount = syncAttendanceByTargetDate(currentDate);
totalCount += dayCount;
log.info("【测试模式】完成同步{},当日同步{}条,累计{}条",
currentDate.format(DATE_FORMATTER), dayCount, totalCount);
// 休眠1秒,避免触发勤策API限流(可根据实际情况调整)
Thread.sleep(1000);
} catch (Exception e) {
log.error("【测试模式】同步{}失败,跳过该日期", currentDate.format(DATE_FORMATTER), e);
} finally {
// 日期+1,无论当日是否失败,继续下一天
currentDate = currentDate.plusDays(1);
}
}
log.info("===== 【测试模式】{}年1月份全量数据同步完成,总计同步{}条 =====", year, totalCount);
return totalCount;
}
} }
\ No newline at end of file
...@@ -26,7 +26,7 @@ public class FeiShuLeaveXxlJob { ...@@ -26,7 +26,7 @@ public class FeiShuLeaveXxlJob {
/** /**
* 飞书请假数据同步任务(XXL-JOB核心方法) * 飞书请假数据同步任务(XXL-JOB核心方法)
* 调度配置:每天00:02执行(Cron表达式:0 2 0 * * ?) * 调度配置:每天02:00执行(Cron表达式:0 0 2 * * ?)
*/ */
@XxlJob("feiShuLeaveSyncJob") @XxlJob("feiShuLeaveSyncJob")
public void feiShuLeaveSyncJob() { public void feiShuLeaveSyncJob() {
......
...@@ -19,7 +19,7 @@ public class QinCeAttendanceXxlJob { ...@@ -19,7 +19,7 @@ public class QinCeAttendanceXxlJob {
/** /**
* 勤策考勤数据同步任务(XXL-JOB核心方法) * 勤策考勤数据同步任务(XXL-JOB核心方法)
* 调度配置:每天123:00执行(Cron表达式:0 0 23 * * ?) * 调度配置:每天23:00执行(Cron表达式:0 0 23 * * ?)
*/ */
@XxlJob("qinCeAttendanceSyncTodayJob") @XxlJob("qinCeAttendanceSyncTodayJob")
public void qinCeAttendanceSyncTodayJob() { public void qinCeAttendanceSyncTodayJob() {
...@@ -42,25 +42,24 @@ public class QinCeAttendanceXxlJob { ...@@ -42,25 +42,24 @@ public class QinCeAttendanceXxlJob {
/** /**
* 勤策考勤数据同步任务(XXL-JOB核心方法) * 勤策考勤数据同步任务(XXL-JOB核心方法)
* 调度配置:每天123:00执行(Cron表达式:0 0 23 * * ?) * 调度配置:每天00:02执行(Cron表达式:0 2 0 * * ?)
*/ */
@XxlJob("qinCeAttendanceSyncYesterdayJob") @XxlJob("qinCeAttendanceSyncYesterdayJob")
public void qinCeAttendanceSyncYesterdayJob() { public void qinCeAttendanceSyncYesterdayJob() {
// 1. 任务日志记录(XXL-JOB控制台可见) XxlJobHelper.log("===== 开始执行勤策考勤数据同步任务(同步前一天数据) =====");
XxlJobHelper.log("===== 开始执行勤策考勤数据同步任务(同步当天数据) =====");
try { try {
// 2. 调用已实现的同步前一天考勤数据方法 // 调用已实现的同步前一天考勤数据方法
int syncCount = qinceUserStatisticService.queryAndSaveTodayAttendance(); int syncCount = qinceUserStatisticService.queryAndSaveYesterdayAttendance();
// 3. 任务结果日志 // 任务结果日志
XxlJobHelper.log("===== 勤策考勤数据同步任务执行完成,总计同步/更新{}条记录 =====", syncCount); XxlJobHelper.log("===== 勤策考勤数据同步任务执行完成,总计同步/更新{}条记录 =====", syncCount);
// 4. 标记任务执行成功(XXL-JOB状态回调) // 标记任务执行成功(XXL-JOB状态回调)
XxlJobHelper.handleSuccess("勤策考勤数据同步成功,总计同步/更新" + syncCount + "条记录"); XxlJobHelper.handleSuccess("勤策考勤数据同步成功,总计同步/更新" + syncCount + "条记录");
} catch (Exception e) { } catch (Exception e) {
// 5. 异常处理与日志记录 // 异常处理与日志记录
log.error("===== 勤策考勤数据同步任务执行失败 =====", e); log.error("===== 勤策考勤数据同步任务执行失败 =====", e);
XxlJobHelper.log("===== 勤策考勤数据同步任务执行失败,异常信息:{} =====", e.getMessage()); XxlJobHelper.log("===== 勤策考勤数据同步任务执行失败,异常信息:{} =====", e.getMessage());
// 6. 标记任务执行失败(XXL-JOB状态回调) // 标记任务执行失败(XXL-JOB状态回调)
XxlJobHelper.handleFail("勤策考勤数据同步失败,异常信息:" + e.getMessage()); XxlJobHelper.handleFail("勤策考勤数据同步失败,异常信息:" + e.getMessage());
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论