feat(puzzle): 添加拼图边缘渲染功能

- 集成 PuzzleEdgeWorkerIpInterceptor 拦截器进行 IP 校验
- 添加 PuzzleEdgeWorkerSecurityProperties 配置类
- 创建 PuzzleEdgeRenderTaskController 提供边缘渲染接口
- 添加多种 DTO 类用于边缘渲染任务数据传输
- 创建 PuzzleEdgeRenderTaskEntity 实体和 Mapper 接口
- 实现 PuzzleEdgeRenderTaskService 核心服务逻辑
- 重构 PuzzleGenerateServiceImpl 使用边缘渲染服务
- 移除原有的线程池执行器和同步渲染逻辑
- 添加定时任务处理渲染超时和重试机制
- 实现自动打印队列添加功能
This commit is contained in:
2026-01-03 23:47:37 +08:00
parent 32297dc29c
commit 52ce26e630
19 changed files with 1207 additions and 33 deletions

View File

@@ -0,0 +1,108 @@
<?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="com.ycwl.basic.puzzle.edge.mapper.PuzzleEdgeRenderTaskMapper">
<resultMap id="BaseResultMap" type="com.ycwl.basic.puzzle.edge.entity.PuzzleEdgeRenderTaskEntity">
<id column="id" property="id"/>
<result column="record_id" property="recordId"/>
<result column="template_id" property="templateId"/>
<result column="template_code" property="templateCode"/>
<result column="scenic_id" property="scenicId"/>
<result column="face_id" property="faceId"/>
<result column="content_hash" property="contentHash"/>
<result column="status" property="status"/>
<result column="worker_id" property="workerId"/>
<result column="lease_expire_time" property="leaseExpireTime"/>
<result column="attempt_count" property="attemptCount"/>
<result column="output_format" property="outputFormat"/>
<result column="output_quality" property="outputQuality"/>
<result column="original_object_key" property="originalObjectKey"/>
<result column="cropped_object_key" property="croppedObjectKey"/>
<result column="payload_json" property="payloadJson"/>
<result column="error_message" property="errorMessage"/>
<result column="create_time" property="createTime"/>
<result column="update_time" property="updateTime"/>
</resultMap>
<sql id="Base_Column_List">
id, record_id, template_id, template_code, scenic_id, face_id, content_hash,
status, worker_id, lease_expire_time, attempt_count,
output_format, output_quality,
original_object_key, cropped_object_key,
payload_json, error_message,
create_time, update_time
</sql>
<select id="getById" resultMap="BaseResultMap">
SELECT <include refid="Base_Column_List"/>
FROM puzzle_edge_render_task
WHERE id = #{id}
LIMIT 1
</select>
<insert id="insert" parameterType="com.ycwl.basic.puzzle.edge.entity.PuzzleEdgeRenderTaskEntity"
useGeneratedKeys="true" keyProperty="id">
INSERT INTO puzzle_edge_render_task (
record_id, template_id, template_code, scenic_id, face_id, content_hash,
status, worker_id, lease_expire_time, attempt_count,
output_format, output_quality,
original_object_key, cropped_object_key,
payload_json, error_message,
create_time, update_time
) VALUES (
#{recordId}, #{templateId}, #{templateCode}, #{scenicId}, #{faceId}, #{contentHash},
#{status}, #{workerId}, #{leaseExpireTime}, #{attemptCount},
#{outputFormat}, #{outputQuality},
#{originalObjectKey}, #{croppedObjectKey},
#{payloadJson}, #{errorMessage},
NOW(), NOW()
)
</insert>
<select id="findNextClaimableTaskId" resultType="java.lang.Long">
SELECT id
FROM puzzle_edge_render_task
WHERE status = 0
OR (status = 1 AND lease_expire_time IS NOT NULL AND lease_expire_time &lt; NOW())
ORDER BY id ASC
LIMIT 1
</select>
<update id="claimTask">
UPDATE puzzle_edge_render_task
SET worker_id = #{workerId},
status = 1,
lease_expire_time = #{leaseExpireTime},
attempt_count = attempt_count + 1,
update_time = NOW()
WHERE id = #{taskId}
AND (
status = 0
OR (status = 1 AND lease_expire_time IS NOT NULL AND lease_expire_time &lt; NOW())
)
</update>
<update id="markSuccess">
UPDATE puzzle_edge_render_task
SET status = 2,
lease_expire_time = NULL,
error_message = NULL,
update_time = NOW()
WHERE id = #{taskId}
AND worker_id = #{workerId}
AND status = 1
</update>
<update id="markFail">
UPDATE puzzle_edge_render_task
SET status = 3,
lease_expire_time = NULL,
error_message = #{errorMessage},
update_time = NOW()
WHERE id = #{taskId}
AND worker_id = #{workerId}
AND status = 1
</update>
</mapper>