gongchunyi
21 小时以前 e9b4ceeea014f9d81263672f3d9c46a567c39591
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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);
}