Browse Source

每天凌晨备份打印历史数据

master
han\hanst 2 months ago
parent
commit
49d5a09620
  1. 16
      src/main/java/com/gaotao/modules/base/dao/PrintTaskDao.java
  2. 45
      src/main/java/com/gaotao/modules/base/service/Impl/PrintTaskServiceImpl.java
  3. 14
      src/main/java/com/gaotao/modules/base/service/PrintTaskService.java
  4. 33
      src/main/java/com/gaotao/modules/base/task/PrintTaskScheduler.java
  5. 50
      src/main/resources/mapper/base/PrintTaskDao.xml

16
src/main/java/com/gaotao/modules/base/dao/PrintTaskDao.java

@ -24,5 +24,21 @@ public interface PrintTaskDao extends BaseMapper<PrintTask> {
"WHERE task_status = 'PENDING' " +
"ORDER BY created_date ASC")
List<PrintTask> selectPendingTasksWithReadPast(@Param("limit") int limit);
/**
* 将已完成的打印任务插入到历史表
*
* @param archiveDays 归档天数归档N天之前的数据
* @return 插入的数据量
*/
int insertIntoHistory(@Param("archiveDays") Integer archiveDays);
/**
* 删除已归档的打印任务
*
* @param archiveDays 归档天数删除N天之前的数据
* @return 删除的数据量
*/
int deleteArchivedTasks(@Param("archiveDays") Integer archiveDays);
}

45
src/main/java/com/gaotao/modules/base/service/Impl/PrintTaskServiceImpl.java

@ -22,6 +22,11 @@ public class PrintTaskServiceImpl extends ServiceImpl<PrintTaskDao, PrintTask> i
private static final Gson gson = new Gson();
/**
* 归档天数固定归档10天前的历史数据
*/
private static final int ARCHIVE_DAYS = 10;
@Override
@Transactional
public Long addPrintTask(String printerIp, String zplCode, String rfidFlag,
@ -90,5 +95,45 @@ public class PrintTaskServiceImpl extends ServiceImpl<PrintTaskDao, PrintTask> i
.eq(PrintTask::getId, taskId)
.update();
}
/**
* 归档打印任务历史数据
*
* <p><b>执行步骤</b></p>
* <ol>
* <li>将已完成的打印任务SUCCESS/FAILED状态插入到 print_task_history </li>
* <li>删除 print_task 表中已归档的数据</li>
* <li>固定归档10天之前的历史数据</li>
* </ol>
*
* @return 归档的任务数量
*/
@Override
@Transactional
public int archivePrintTaskHistory() {
log.info("开始归档打印任务历史数据,归档天数: {} 天", ARCHIVE_DAYS);
try {
// 1. 执行归档操作插入到历史表
int insertCount = this.baseMapper.insertIntoHistory(ARCHIVE_DAYS);
log.info("步骤1:插入历史数据完成,插入数量: {}", insertCount);
if (insertCount > 0) {
// 2. 删除已归档的数据
int deleteCount = this.baseMapper.deleteArchivedTasks(ARCHIVE_DAYS);
log.info("步骤2:删除已归档数据完成,删除数量: {}", deleteCount);
if (insertCount != deleteCount) {
log.warn("警告:插入数量({}) 与删除数量({}) 不一致", insertCount, deleteCount);
}
}
return insertCount;
} catch (Exception e) {
log.error("归档打印任务历史数据失败: {}", e.getMessage(), e);
throw new RuntimeException("归档失败: " + e.getMessage(), e);
}
}
}

14
src/main/java/com/gaotao/modules/base/service/PrintTaskService.java

@ -59,5 +59,19 @@ public interface PrintTaskService extends IService<PrintTask> {
* @return 是否成功
*/
boolean markAsFailed(Long taskId, String errorMessage);
/**
* 归档打印任务历史数据
*
* <p><b>功能说明</b></p>
* <ul>
* <li>将已完成的打印任务SUCCESS/FAILED状态备份到 print_task_history </li>
* <li>删除 print_task 表中已归档的数据</li>
* <li>默认归档30天之前的历史数据</li>
* </ul>
*
* @return 归档的任务数量
*/
int archivePrintTaskHistory();
}

33
src/main/java/com/gaotao/modules/base/task/PrintTaskScheduler.java

@ -171,5 +171,38 @@ public class PrintTaskScheduler {
}
}
}
/**
* 归档打印任务历史数据
*
* <p><b>功能说明</b></p>
* <ul>
* <li>每天凌晨5点自动执行</li>
* <li>将已完成的打印任务备份到 print_task_history </li>
* <li>清理10天之前的历史数据</li>
* </ul>
*
* <p><b>执行时间</b>每天凌晨5点固定</p>
* <p><b>归档规则</b>归档10天前的已完成任务固定</p>
*/
@Scheduled(cron = "0 0 5 * * ?")
public void archivePrintTaskHistory() {
// 检查定时任务开关
if (!dashboardPushEnabled) {
return;
}
log.info("=== 开始归档打印任务历史数据 ===");
try {
// 调用Service层执行归档操作
int archivedCount = printTaskService.archivePrintTaskHistory();
log.info("=== 打印任务历史数据归档完成:归档任务数量={} ===", archivedCount);
} catch (Exception e) {
log.error("=== 打印任务历史数据归档失败 ===", e);
}
}
}

50
src/main/resources/mapper/base/PrintTaskDao.xml

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gaotao.modules.base.dao.PrintTaskDao">
<!-- 将已完成的打印任务插入到历史表 -->
<insert id="insertIntoHistory">
INSERT INTO print_task_history (
site,
printer_ip,
zpl_code,
rfid_flag,
copies,
label_data,
task_status,
retry_count,
error_message,
created_by,
created_date,
started_date,
completed_date
)
SELECT
site,
printer_ip,
zpl_code,
rfid_flag,
copies,
label_data,
task_status,
retry_count,
error_message,
created_by,
created_date,
started_date,
completed_date
FROM print_task
WHERE task_status IN ('SUCCESS', 'FAILED')
AND created_date &lt; DATEADD(DAY, -#{archiveDays}, GETDATE())
</insert>
<!-- 删除已归档的打印任务 -->
<delete id="deleteArchivedTasks">
DELETE FROM print_task
WHERE task_status IN ('SUCCESS', 'FAILED')
AND created_date &lt; DATEADD(DAY, -#{archiveDays}, GETDATE())
</delete>
</mapper>
Loading…
Cancel
Save