| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- <?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="cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper">
- <!-- ResultMap -->
- <resultMap id="BaseResultMap" type="cn.sciento.farm.automationv2.domain.entity.TaskExecution">
- <id column="id" property="id"/>
- <result column="task_id" property="taskId"/>
- <result column="task_name" property="taskName"/>
- <result column="trigger_type" property="triggerType" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
- <result column="execution_plan" property="executionPlan" typeHandler="cn.sciento.mybatis.handler.JSONHandler" jdbcType="VARCHAR"/>
- <result column="current_index" property="currentIndex"/>
- <result column="status" property="status" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
- <result column="version" property="version"/>
- <result column="started_at" property="startedAt"/>
- <result column="finished_at" property="finishedAt"/>
- <result column="expected_finish_at" property="expectedFinishAt"/>
- <result column="last_heartbeat_at" property="lastHeartbeatAt"/>
- <result column="fail_reason" property="failReason"/>
- <result column="safe_close_status" property="safeCloseStatus"/>
- <result column="safe_close_details" property="safeCloseDetails"/>
- <result column="tenant_id" property="tenantId"/>
- <result column="created_at" property="createdAt"/>
- <result column="updated_at" property="updatedAt"/>
- </resultMap>
- <!-- 插入 -->
- <insert id="insert" parameterType="cn.sciento.farm.automationv2.domain.entity.TaskExecution" useGeneratedKeys="true" keyProperty="id">
- INSERT INTO task_execution (
- task_id, task_name, trigger_type, execution_plan, current_index,
- status, version, started_at, expected_finish_at, last_heartbeat_at,
- tenant_id, created_at
- ) VALUES (
- #{taskId}, #{taskName}, #{triggerType}, #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler}, #{currentIndex},
- #{status}, #{version}, #{startedAt}, #{expectedFinishAt}, #{lastHeartbeatAt},
- #{tenantId}, NOW()
- )
- </insert>
- <!-- 根据ID查询 -->
- <select id="selectById" resultMap="BaseResultMap">
- SELECT * FROM task_execution WHERE id = #{id}
- </select>
- <!-- 根据任务ID查询执行历史 -->
- <select id="selectByTaskId" resultMap="BaseResultMap">
- SELECT * FROM task_execution
- WHERE task_id = #{taskId}
- ORDER BY created_at DESC
- LIMIT #{offset}, #{limit}
- </select>
- <!-- 根据状态查询 -->
- <select id="selectByStatus" resultMap="BaseResultMap">
- SELECT * FROM task_execution
- WHERE status = #{status}
- ORDER BY created_at DESC
- <if test="limit != null">
- LIMIT #{limit}
- </if>
- </select>
- <!-- 普通更新 -->
- <update id="updateById">
- UPDATE task_execution
- <set>
- <if test="executionPlan != null">execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},</if>
- <if test="currentIndex != null">current_index = #{currentIndex},</if>
- <if test="status != null">status = #{status},</if>
- <if test="startedAt != null">started_at = #{startedAt},</if>
- <if test="finishedAt != null">finished_at = #{finishedAt},</if>
- <if test="expectedFinishAt != null">expected_finish_at = #{expectedFinishAt},</if>
- <if test="lastHeartbeatAt != null">last_heartbeat_at = #{lastHeartbeatAt},</if>
- <if test="failReason != null">fail_reason = #{failReason},</if>
- <if test="safeCloseStatus != null">safe_close_status = #{safeCloseStatus},</if>
- <if test="safeCloseDetails != null">safe_close_details = #{safeCloseDetails},</if>
- updated_at = NOW()
- </set>
- WHERE id = #{id}
- </update>
- <!-- 乐观锁更新(核心方法) -->
- <update id="updateByVersion">
- UPDATE task_execution
- <set>
- <if test="executionPlan != null">execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},</if>
- <if test="currentIndex != null">current_index = #{currentIndex},</if>
- <if test="status != null">status = #{status},</if>
- <if test="startedAt != null">started_at = #{startedAt},</if>
- <if test="finishedAt != null">finished_at = #{finishedAt},</if>
- <if test="expectedFinishAt != null">expected_finish_at = #{expectedFinishAt},</if>
- <if test="failReason != null">fail_reason = #{failReason},</if>
- <if test="safeCloseStatus != null">safe_close_status = #{safeCloseStatus},</if>
- version = version + 1,
- updated_at = NOW()
- </set>
- WHERE id = #{id} AND version = #{version}
- </update>
- <!-- 更新当前节点索引(乐观锁) -->
- <update id="updateCurrentIndex">
- UPDATE task_execution
- SET current_index = #{currentIndex},
- version = version + 1,
- updated_at = NOW()
- WHERE id = #{id} AND version = #{version}
- </update>
- <!-- 更新execution_plan(乐观锁) -->
- <update id="updateExecutionPlan">
- UPDATE task_execution
- SET execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},
- version = version + 1,
- updated_at = NOW()
- WHERE id = #{id} AND version = #{version}
- </update>
- <!-- 更新心跳时间 -->
- <update id="updateHeartbeat">
- UPDATE task_execution
- SET last_heartbeat_at = NOW()
- WHERE id = #{id}
- </update>
- <!-- 查询卡住的执行实例(看门狗用) -->
- <select id="selectStuckExecutions" resultMap="BaseResultMap">
- SELECT * FROM task_execution
- WHERE status = 'RUNNING'
- AND last_heartbeat_at < DATE_SUB(NOW(), INTERVAL #{thresholdMinutes} MINUTE)
- ORDER BY last_heartbeat_at ASC
- LIMIT 100
- </select>
- <!-- 根据租户和状态查询 -->
- <select id="selectByTenantAndStatus" resultMap="BaseResultMap">
- SELECT * FROM task_execution
- WHERE tenant_id = #{tenantId}
- AND status = #{status}
- ORDER BY created_at DESC
- LIMIT #{offset}, #{limit}
- </select>
- <!-- 根据租户ID查询正在执行的任务 -->
- <select id="selectRunningByTenant" resultMap="BaseResultMap">
- SELECT * FROM task_execution
- WHERE tenant_id = #{tenantId}
- AND status = 'RUNNING'
- ORDER BY created_at DESC
- </select>
- <!-- 根据租户ID分页查询执行历史 -->
- <select id="selectByTenant" resultMap="BaseResultMap">
- SELECT * FROM task_execution
- WHERE tenant_id = #{tenantId}
- ORDER BY created_at DESC
- LIMIT #{offset}, #{limit}
- </select>
- <!-- 统计任务的执行次数 -->
- <select id="countByTaskId" resultType="int">
- SELECT COUNT(*) FROM task_execution WHERE task_id = #{taskId}
- </select>
- <!-- 删除 -->
- <delete id="deleteById">
- DELETE FROM task_execution WHERE id = #{id}
- </delete>
- </mapper>
|