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 { /** * 按唯一键幂等插入任务。 */ int insertIgnore(@Param("task") EnergyMeterSyncTask task); /** * 条件领取任务:只有把状态从 PENDING/RETRY 更新为 RUNNING 成功的执行者才发请求。 */ int claim(@Param("id") Long id, @Param("now") LocalDateTime now); /** * 到期待重试任务。 */ List selectDueRetry(@Param("now") LocalDateTime now, @Param("limit") int limit); /** * 超时仍处于 RUNNING 的任务。 */ List 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 selectByRunId(@Param("runId") Long runId); List selectLatestByMeterIds(@Param("meterIds") Collection 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); }