提交 f2e4a02b authored 作者: douxy's avatar douxy

新增xxl-job执行配置

上级 5fadb284
...@@ -292,7 +292,7 @@ public class QinceUserStatisticServiceImpl implements IQinceUserStatisticService ...@@ -292,7 +292,7 @@ public class QinceUserStatisticServiceImpl implements IQinceUserStatisticService
// 2. 拆分新增/更新列表 // 2. 拆分新增/更新列表
List<QinceUserStatisticDTO> insertList = new ArrayList<>(); List<QinceUserStatisticDTO> insertList = new ArrayList<>();
List<QinceUserStatisticDTO> updateList = new ArrayList<>(); List<QinceUserStatisticDTO> updateList = new ArrayList<>();
LocalDateTime now = LocalDateTime.now(); // 当前时间,用于更新 modifyTime LocalDateTime now = LocalDateTime.now();
for (QinceUserStatisticDTO dto : attendanceDtoList) { for (QinceUserStatisticDTO dto : attendanceDtoList) {
LocalDate attLocalDate = dto.getAttDate(); LocalDate attLocalDate = dto.getAttDate();
...@@ -304,11 +304,10 @@ public class QinceUserStatisticServiceImpl implements IQinceUserStatisticService ...@@ -304,11 +304,10 @@ public class QinceUserStatisticServiceImpl implements IQinceUserStatisticService
String uniqueKey = dto.getQcUserId() + "_" + targetDateStr; String uniqueKey = dto.getQcUserId() + "_" + targetDateStr;
if (existDtoMap.containsKey(uniqueKey)) { if (existDtoMap.containsKey(uniqueKey)) {
// 已存在:从 DTO 映射中获取数据,更新字段(全程操作 DTO)
QinceUserStatisticDTO existDto = existDtoMap.get(uniqueKey); QinceUserStatisticDTO existDto = existDtoMap.get(uniqueKey);
dto.setId(existDto.getId()); // 主键 ID 从 DTO 中获取 dto.setId(existDto.getId());
dto.setCreateTime(existDto.getCreateTime()); // 保留原有创建时间 dto.setCreateTime(existDto.getCreateTime());
dto.setModifyTime(now); // 更新修改时间 dto.setModifyTime(now);
updateList.add(dto); updateList.add(dto);
} else { } else {
// 不存在:直接新增(createTime/modifyTime 已赋值) // 不存在:直接新增(createTime/modifyTime 已赋值)
...@@ -316,7 +315,7 @@ public class QinceUserStatisticServiceImpl implements IQinceUserStatisticService ...@@ -316,7 +315,7 @@ public class QinceUserStatisticServiceImpl implements IQinceUserStatisticService
} }
} }
// 3. 调用 DAO 层执行批量操作(纯 DTO 入参,无需关心持久化细节) // 调用 DAO 层执行批量操作(纯 DTO 入参,无需关心持久化细节)
int insertCount = qinceUserStatisticDao.batchInsert(insertList); int insertCount = qinceUserStatisticDao.batchInsert(insertList);
int updateCount = qinceUserStatisticDao.batchUpdate(updateList); int updateCount = qinceUserStatisticDao.batchUpdate(updateList);
int totalCount = insertCount + updateCount; int totalCount = insertCount + updateCount;
......
package com.sfa.job.xxljob.feishu;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.sfa.job.service.feishu.IFeishuLeaveInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
* 飞书请假数据XXL-JOB定时任务类(适配实际Service:syncFeishuLeaveData(String syncDate))
* 任务:每天00:02同步前一天的请假数据
*/
@Slf4j
@Component
public class FeiShuLeaveXxlJob {
@Autowired
private IFeishuLeaveInfoService feishuLeaveInfoService;
// 日期格式化器(与勤策保持一致,适配 syncDate 入参:yyyy-MM-dd)
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
/**
* 飞书请假数据同步任务(XXL-JOB核心方法)
* 调度配置:每天00:02执行(Cron表达式:0 2 0 * * ?)
*/
@XxlJob("feiShuLeaveSyncJob")
public void feiShuLeaveSyncJob() {
// 任务日志记录(XXL-JOB控制台可见)
XxlJobHelper.log("===== 开始执行飞书请假数据同步任务(同步前一天数据) =====");
// 获取前一天日期(格式:yyyy-MM-dd),适配Service入参要求
LocalDate yesterday = LocalDate.now().minusDays(1);
String syncDate = yesterday.format(DATE_FORMATTER);
XxlJobHelper.log("===== 本次同步目标日期:{} =====", syncDate);
try {
// 调用你实际的飞书请假同步方法(入参:前一天日期字符串)
String syncResult = feishuLeaveInfoService.syncFeishuLeaveData(syncDate);
// 任务结果日志(适配Service返回的字符串结果)
XxlJobHelper.log("===== 飞书请假数据同步任务执行完成,同步结果:{} =====", syncResult);
// 标记任务执行成功(XXL-JOB状态回调)
XxlJobHelper.handleSuccess("飞书请假数据同步成功,同步结果:" + syncResult);
} catch (Exception e) {
// 异常处理与日志记录
log.error("===== 飞书请假数据同步任务执行失败 =====", e);
XxlJobHelper.log("===== 飞书请假数据同步任务执行失败,异常信息:{} =====", e.getMessage());
// 标记任务执行失败(XXL-JOB状态回调)
XxlJobHelper.handleFail("飞书请假数据同步失败,异常信息:" + e.getMessage());
}
}
}
\ No newline at end of file
package com.sfa.job.xxljob.qince;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.sfa.job.service.qince.IQinceUserStatisticService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 勤策考勤数据XXL-JOB定时任务类
*/
@Slf4j
@Component
public class QinCeAttendanceXxlJob {
@Autowired
private IQinceUserStatisticService qinceUserStatisticService;
/**
* 勤策考勤数据同步任务(XXL-JOB核心方法)
* 调度配置:每天123:00执行(Cron表达式:0 0 23 * * ?)
*/
@XxlJob("qinCeAttendanceSyncTodayJob")
public void qinCeAttendanceSyncTodayJob() {
XxlJobHelper.log("===== 开始执行勤策考勤数据同步任务(同步当天数据) =====");
try {
// 调用已实现的同步当天考勤数据方法
int syncCount = qinceUserStatisticService.queryAndSaveTodayAttendance();
// 任务结果日志
XxlJobHelper.log("===== 勤策考勤数据同步任务执行完成,总计同步/更新{}条记录 =====", syncCount);
// 标记任务执行成功(XXL-JOB状态回调)
XxlJobHelper.handleSuccess("勤策考勤数据同步成功,总计同步/更新" + syncCount + "条记录");
} catch (Exception e) {
log.error("===== 勤策考勤数据同步任务执行失败 =====", e);
XxlJobHelper.log("===== 勤策考勤数据同步任务执行失败,异常信息:{} =====", e.getMessage());
XxlJobHelper.handleFail("勤策考勤数据同步失败,异常信息:" + e.getMessage());
}
}
/**
* 勤策考勤数据同步任务(XXL-JOB核心方法)
* 调度配置:每天123:00执行(Cron表达式:0 0 23 * * ?)
*/
@XxlJob("qinCeAttendanceSyncYesterdayJob")
public void qinCeAttendanceSyncYesterdayJob() {
// 1. 任务日志记录(XXL-JOB控制台可见)
XxlJobHelper.log("===== 开始执行勤策考勤数据同步任务(同步当天数据) =====");
try {
// 2. 调用已实现的同步前一天考勤数据方法
int syncCount = qinceUserStatisticService.queryAndSaveTodayAttendance();
// 3. 任务结果日志
XxlJobHelper.log("===== 勤策考勤数据同步任务执行完成,总计同步/更新{}条记录 =====", syncCount);
// 4. 标记任务执行成功(XXL-JOB状态回调)
XxlJobHelper.handleSuccess("勤策考勤数据同步成功,总计同步/更新" + syncCount + "条记录");
} catch (Exception e) {
// 5. 异常处理与日志记录
log.error("===== 勤策考勤数据同步任务执行失败 =====", e);
XxlJobHelper.log("===== 勤策考勤数据同步任务执行失败,异常信息:{} =====", e.getMessage());
// 6. 标记任务执行失败(XXL-JOB状态回调)
XxlJobHelper.handleFail("勤策考勤数据同步失败,异常信息:" + e.getMessage());
}
}
}
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论