package com.ruoyi.energymeter.mapper;
|
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.ruoyi.energymeter.dto.TaskStatusCount;
|
import com.ruoyi.energymeter.pojo.EnergyMeterSyncTask;
|
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Param;
|
import org.apache.ibatis.annotations.Update;
|
|
import java.time.LocalDateTime;
|
import java.util.Collection;
|
import java.util.List;
|
|
/**
|
* 单设备同步任务 Mapper。
|
*/
|
@Mapper
|
public interface EnergyMeterSyncTaskMapper extends BaseMapper<EnergyMeterSyncTask> {
|
|
/**
|
* 按唯一键幂等插入任务。
|
*/
|
int insertIgnore(@Param("task") EnergyMeterSyncTask task);
|
|
/**
|
* 条件领取任务:只有把状态从 PENDING/RETRY 更新为 RUNNING 成功的执行者才发请求。
|
*/
|
int claim(@Param("id") Long id, @Param("now") LocalDateTime now);
|
|
/**
|
* 到期待重试任务。
|
*/
|
List<EnergyMeterSyncTask> selectDueRetry(@Param("now") LocalDateTime now, @Param("limit") int limit);
|
|
/**
|
* 超时仍处于 RUNNING 的任务。
|
*/
|
List<EnergyMeterSyncTask> selectStaleRunning(@Param("deadline") LocalDateTime deadline, @Param("limit") int limit);
|
|
/**
|
* 把超时任务重置为待重试。
|
*/
|
int resetToRetry(@Param("id") Long id,
|
@Param("now") LocalDateTime now,
|
@Param("nextRetryAt") LocalDateTime nextRetryAt,
|
@Param("reason") String reason);
|
|
List<EnergyMeterSyncTask> selectByRunId(@Param("runId") Long runId);
|
|
List<EnergyMeterSyncTask> selectLatestByMeterIds(@Param("meterIds") Collection<Long> meterIds);
|
|
TaskStatusCount countByRunId(@Param("runId") Long runId);
|
|
/**
|
* 标记任务成功/空结果,并清空错误与重试信息。
|
*/
|
@Update("UPDATE energy_meter_sync_task SET status = #{status}, fetched_count = #{fetched}, "
|
+ "inserted_count = #{inserted}, updated_count = #{updated}, finished_at = #{now}, "
|
+ "error_code = NULL, error_message = NULL, next_retry_at = NULL WHERE id = #{id}")
|
int markFinished(@Param("id") Long id,
|
@Param("status") String status,
|
@Param("fetched") int fetched,
|
@Param("inserted") int inserted,
|
@Param("updated") int updated,
|
@Param("now") LocalDateTime now);
|
|
/**
|
* 标记任务失败或转入重试。
|
*/
|
@Update("UPDATE energy_meter_sync_task SET status = #{status}, error_code = #{code}, "
|
+ "error_message = #{message}, next_retry_at = #{nextRetryAt}, finished_at = #{now} WHERE id = #{id}")
|
int markFailed(@Param("id") Long id,
|
@Param("status") String status,
|
@Param("code") String code,
|
@Param("message") String message,
|
@Param("nextRetryAt") LocalDateTime nextRetryAt,
|
@Param("now") LocalDateTime now);
|
}
|