feat(notification): 添加微信订阅消息配置管理及幂等授权功能

- 新增微信订阅消息配置管理控制器,支持模板、场景、事件映射配置
- 实现用户通知授权服务的幂等控制,避免前端重试导致授权次数虚增
- 添加微信订阅消息发送日志记录,用于幂等与排障
- 新增视频生成完成时的订阅消息触发功能
- 实现场景模板查询接口,返回用户授权余额信息
- 添加模板V2相关数据表映射器和实体类
- 集成微信订阅消息触发服务到任务完成流程中
This commit is contained in:
2026-01-01 17:53:59 +08:00
parent 81dc2f1b86
commit f1a2958251
61 changed files with 3655 additions and 9 deletions

View File

@@ -0,0 +1,72 @@
<?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.mapper.TemplateV2Mapper">
<select id="list" resultType="com.ycwl.basic.template.model.entity.TemplateV2Entity">
select *
from template_v2
<where>
deleted = 0
<if test="scenicId != null">
and scenic_id = #{scenicId}
</if>
<if test="status != null">
and status = #{status}
</if>
<if test="name != null and name != ''">
and locate(#{name}, `name`) &gt; 0
</if>
</where>
order by update_time desc, id desc
</select>
<select id="getById" resultType="com.ycwl.basic.template.model.entity.TemplateV2Entity">
select *
from template_v2
where id = #{id} and deleted = 0
</select>
<insert id="insert">
insert into template_v2(
id, scenic_id, `name`, version, status,
output_width, output_height, output_fps,
bgm_url, total_duration_ms,
deleted, create_time, update_time
)
values (
#{id}, #{scenicId}, #{name}, #{version}, #{status},
#{outputWidth}, #{outputHeight}, #{outputFps},
#{bgmUrl}, #{totalDurationMs},
0, now(), now()
)
</insert>
<update id="updateById">
update template_v2
<set>
update_time = now(),
<if test="scenicId != null">scenic_id = #{scenicId},</if>
<if test="name != null">`name` = #{name},</if>
<if test="version != null">version = #{version},</if>
<if test="status != null">status = #{status},</if>
<if test="outputWidth != null">output_width = #{outputWidth},</if>
<if test="outputHeight != null">output_height = #{outputHeight},</if>
<if test="outputFps != null">output_fps = #{outputFps},</if>
<if test="bgmUrl != null">bgm_url = #{bgmUrl},</if>
<if test="totalDurationMs != null">total_duration_ms = #{totalDurationMs},</if>
</set>
where id = #{id} and deleted = 0
</update>
<update id="updateStatus">
update template_v2
set status = #{status}, update_time = now()
where id = #{id} and deleted = 0
</update>
<update id="softDelete">
update template_v2
set deleted = 1, update_time = now()
where id = #{id} and deleted = 0
</update>
</mapper>

View File

@@ -0,0 +1,35 @@
<?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.mapper.TemplateV2SegmentMapper">
<select id="listByTemplateId" resultType="com.ycwl.basic.template.model.entity.TemplateV2SegmentEntity">
select *
from template_v2_segment
where template_id = #{templateId}
order by segment_index
</select>
<delete id="deleteByTemplateId">
delete from template_v2_segment where template_id = #{templateId}
</delete>
<insert id="batchInsert">
insert into template_v2_segment(
id, template_id, segment_index,
duration_ms, segment_type,
source_type, source_ref,
only_if_expr, render_spec_json, audio_spec_json,
create_time, update_time
)
values
<foreach collection="segments" item="item" separator=",">
(
#{item.id}, #{item.templateId}, #{item.segmentIndex},
#{item.durationMs}, #{item.segmentType},
#{item.sourceType}, #{item.sourceRef},
#{item.onlyIfExpr}, #{item.renderSpecJson}, #{item.audioSpecJson},
now(), now()
)
</foreach>
</insert>
</mapper>