TaskExecutionMapper.xml 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="cn.sciento.farm.automationv2.infra.mapper.TaskExecutionMapper">
  4. <!-- ResultMap -->
  5. <resultMap id="BaseResultMap" type="cn.sciento.farm.automationv2.domain.entity.TaskExecution">
  6. <id column="id" property="id"/>
  7. <result column="task_id" property="taskId"/>
  8. <result column="task_name" property="taskName"/>
  9. <result column="trigger_type" property="triggerType" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
  10. <result column="execution_plan" property="executionPlan" typeHandler="cn.sciento.mybatis.handler.JSONHandler" jdbcType="VARCHAR"/>
  11. <result column="current_index" property="currentIndex"/>
  12. <result column="status" property="status" typeHandler="org.apache.ibatis.type.EnumTypeHandler"/>
  13. <result column="version" property="version"/>
  14. <result column="started_at" property="startedAt"/>
  15. <result column="finished_at" property="finishedAt"/>
  16. <result column="expected_finish_at" property="expectedFinishAt"/>
  17. <result column="last_heartbeat_at" property="lastHeartbeatAt"/>
  18. <result column="fail_reason" property="failReason"/>
  19. <result column="safe_close_status" property="safeCloseStatus"/>
  20. <result column="safe_close_details" property="safeCloseDetails"/>
  21. <result column="tenant_id" property="tenantId"/>
  22. <result column="created_at" property="createdAt"/>
  23. <result column="updated_at" property="updatedAt"/>
  24. </resultMap>
  25. <!-- 插入 -->
  26. <insert id="insert" parameterType="cn.sciento.farm.automationv2.domain.entity.TaskExecution" useGeneratedKeys="true" keyProperty="id">
  27. INSERT INTO task_execution (
  28. task_id, task_name, trigger_type, execution_plan, current_index,
  29. status, version, started_at, expected_finish_at, last_heartbeat_at,
  30. tenant_id, created_at
  31. ) VALUES (
  32. #{taskId}, #{taskName}, #{triggerType}, #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler}, #{currentIndex},
  33. #{status}, #{version}, #{startedAt}, #{expectedFinishAt}, #{lastHeartbeatAt},
  34. #{tenantId}, NOW()
  35. )
  36. </insert>
  37. <!-- 根据ID查询 -->
  38. <select id="selectById" resultMap="BaseResultMap">
  39. SELECT * FROM task_execution WHERE id = #{id}
  40. </select>
  41. <!-- 根据任务ID查询执行历史 -->
  42. <select id="selectByTaskId" resultMap="BaseResultMap">
  43. SELECT * FROM task_execution
  44. WHERE task_id = #{taskId}
  45. ORDER BY created_at DESC
  46. LIMIT #{offset}, #{limit}
  47. </select>
  48. <!-- 根据状态查询 -->
  49. <select id="selectByStatus" resultMap="BaseResultMap">
  50. SELECT * FROM task_execution
  51. WHERE status = #{status}
  52. ORDER BY created_at DESC
  53. <if test="limit != null">
  54. LIMIT #{limit}
  55. </if>
  56. </select>
  57. <!-- 普通更新 -->
  58. <update id="updateById">
  59. UPDATE task_execution
  60. <set>
  61. <if test="executionPlan != null">execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},</if>
  62. <if test="currentIndex != null">current_index = #{currentIndex},</if>
  63. <if test="status != null">status = #{status},</if>
  64. <if test="startedAt != null">started_at = #{startedAt},</if>
  65. <if test="finishedAt != null">finished_at = #{finishedAt},</if>
  66. <if test="expectedFinishAt != null">expected_finish_at = #{expectedFinishAt},</if>
  67. <if test="lastHeartbeatAt != null">last_heartbeat_at = #{lastHeartbeatAt},</if>
  68. <if test="failReason != null">fail_reason = #{failReason},</if>
  69. <if test="safeCloseStatus != null">safe_close_status = #{safeCloseStatus},</if>
  70. <if test="safeCloseDetails != null">safe_close_details = #{safeCloseDetails},</if>
  71. updated_at = NOW()
  72. </set>
  73. WHERE id = #{id}
  74. </update>
  75. <!-- 乐观锁更新(核心方法) -->
  76. <update id="updateByVersion">
  77. UPDATE task_execution
  78. <set>
  79. <if test="executionPlan != null">execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},</if>
  80. <if test="currentIndex != null">current_index = #{currentIndex},</if>
  81. <if test="status != null">status = #{status},</if>
  82. <if test="startedAt != null">started_at = #{startedAt},</if>
  83. <if test="finishedAt != null">finished_at = #{finishedAt},</if>
  84. <if test="expectedFinishAt != null">expected_finish_at = #{expectedFinishAt},</if>
  85. <if test="failReason != null">fail_reason = #{failReason},</if>
  86. <if test="safeCloseStatus != null">safe_close_status = #{safeCloseStatus},</if>
  87. version = version + 1,
  88. updated_at = NOW()
  89. </set>
  90. WHERE id = #{id} AND version = #{version}
  91. </update>
  92. <!-- 更新当前节点索引(乐观锁) -->
  93. <update id="updateCurrentIndex">
  94. UPDATE task_execution
  95. SET current_index = #{currentIndex},
  96. version = version + 1,
  97. updated_at = NOW()
  98. WHERE id = #{id} AND version = #{version}
  99. </update>
  100. <!-- 更新execution_plan(乐观锁) -->
  101. <update id="updateExecutionPlan">
  102. UPDATE task_execution
  103. SET execution_plan = #{executionPlan,typeHandler=cn.sciento.farm.automationv2.infra.typehandler.ExecutionPlanTypeHandler},
  104. version = version + 1,
  105. updated_at = NOW()
  106. WHERE id = #{id} AND version = #{version}
  107. </update>
  108. <!-- 更新心跳时间 -->
  109. <update id="updateHeartbeat">
  110. UPDATE task_execution
  111. SET last_heartbeat_at = NOW()
  112. WHERE id = #{id}
  113. </update>
  114. <!-- 查询卡住的执行实例(看门狗用) -->
  115. <select id="selectStuckExecutions" resultMap="BaseResultMap">
  116. SELECT * FROM task_execution
  117. WHERE status = 'RUNNING'
  118. AND last_heartbeat_at &lt; DATE_SUB(NOW(), INTERVAL #{thresholdMinutes} MINUTE)
  119. ORDER BY last_heartbeat_at ASC
  120. LIMIT 100
  121. </select>
  122. <!-- 根据租户和状态查询 -->
  123. <select id="selectByTenantAndStatus" resultMap="BaseResultMap">
  124. SELECT * FROM task_execution
  125. WHERE tenant_id = #{tenantId}
  126. AND status = #{status}
  127. ORDER BY created_at DESC
  128. LIMIT #{offset}, #{limit}
  129. </select>
  130. <!-- 根据租户ID查询正在执行的任务 -->
  131. <select id="selectRunningByTenant" resultMap="BaseResultMap">
  132. SELECT * FROM task_execution
  133. WHERE tenant_id = #{tenantId}
  134. AND status = 'RUNNING'
  135. ORDER BY created_at DESC
  136. </select>
  137. <!-- 根据租户ID分页查询执行历史 -->
  138. <select id="selectByTenant" resultMap="BaseResultMap">
  139. SELECT * FROM task_execution
  140. WHERE tenant_id = #{tenantId}
  141. ORDER BY created_at DESC
  142. LIMIT #{offset}, #{limit}
  143. </select>
  144. <!-- 统计任务的执行次数 -->
  145. <select id="countByTaskId" resultType="int">
  146. SELECT COUNT(*) FROM task_execution WHERE task_id = #{taskId}
  147. </select>
  148. <!-- 删除 -->
  149. <delete id="deleteById">
  150. DELETE FROM task_execution WHERE id = #{id}
  151. </delete>
  152. </mapper>