refactor(notifications): 重构通知系统使用统一的微信订阅通知触发服务

- 移除 UserNotificationAuthController 中的 getScenicTemplatesWithAuth 方法
- 从 ScenicRepository 中删除微信模板ID相关方法和配置
- 重命名 WechatSubscribeNotifyTriggerService 为 notifyTriggerService
- 更新 TaskTaskServiceImpl 中的视频生成通知逻辑
- 重构 DownloadNotificationTasker 中的通知发送方式
- 统一使用 WechatSubscribeNotifyTriggerRequest 和 WechatSubscribeNotifyTriggerResult
- 移除 ZT 消息服务相关代码
- 简化变量传递和通知模板逻辑
This commit is contained in:
2026-01-06 15:35:09 +08:00
parent 95e86fb996
commit 123a081eab
4 changed files with 61 additions and 405 deletions

View File

@@ -8,7 +8,6 @@ import com.ycwl.basic.enums.TemplateRenderStatus;
import com.ycwl.basic.integration.common.manager.DeviceConfigManager;
import com.ycwl.basic.integration.common.manager.RenderWorkerConfigManager;
import com.ycwl.basic.integration.common.manager.ScenicConfigManager;
import com.ycwl.basic.integration.message.dto.ZtMessage;
import com.ycwl.basic.integration.message.service.ZtMessageProducerService;
import com.ycwl.basic.repository.MemberRelationRepository;
import com.ycwl.basic.repository.SourceRepository;
@@ -16,10 +15,7 @@ import com.ycwl.basic.utils.JacksonUtil;
import com.ycwl.basic.biz.OrderBiz;
import com.ycwl.basic.biz.TemplateBiz;
import com.ycwl.basic.constant.StorageConstant;
import com.ycwl.basic.mapper.FaceMapper;
import com.ycwl.basic.mapper.FaceSampleMapper;
import com.ycwl.basic.mapper.MemberMapper;
import com.ycwl.basic.mapper.SourceMapper;
import com.ycwl.basic.mapper.TaskMapper;
import com.ycwl.basic.mapper.VideoMapper;
import com.ycwl.basic.model.mobile.order.IsBuyRespVO;
@@ -28,7 +24,6 @@ import com.ycwl.basic.model.pc.faceSample.entity.FaceSampleEntity;
import com.ycwl.basic.model.pc.member.resp.MemberRespVO;
import com.ycwl.basic.model.pc.mp.MpConfigEntity;
import com.ycwl.basic.model.pc.renderWorker.entity.RenderWorkerEntity;
import com.ycwl.basic.model.pc.scenic.entity.ScenicConfigEntity;
import com.ycwl.basic.integration.scenic.dto.scenic.ScenicV2DTO;
import com.ycwl.basic.model.pc.source.entity.SourceEntity;
import com.ycwl.basic.model.pc.task.entity.TaskEntity;
@@ -124,7 +119,7 @@ public class TaskTaskServiceImpl implements TaskService {
@Autowired
private NotificationAuthUtils notificationAuthUtils;
@Autowired
private WechatSubscribeNotifyTriggerService wechatSubscribeNotifyTriggerService;
private WechatSubscribeNotifyTriggerService notifyTriggerService;
@Autowired
private FaceStatusManager faceStatusManager;
@@ -636,93 +631,26 @@ public class TaskTaskServiceImpl implements TaskService {
return;
}
String openId = member.getOpenId();
ScenicV2DTO scenic = scenicRepository.getScenicBasic(item.getScenicId());
MpConfigEntity scenicMp = scenicRepository.getScenicMpConfig(member.getScenicId());
if (StringUtils.isNotBlank(openId) && scenicMp != null) {
// 发送模板消息
Map<String, Object> variables = new HashMap<>();
variables.put("taskId", taskId);
variables.put("scenicId", scenic.getId());
variables.put("scenicName", scenic.getName());
variables.put("faceId", item.getFaceId());
variables.put("videoId", item.getVideoId());
variables.put("nowTime", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm"));
try {
ScenicV2DTO scenicBasic = scenicRepository.getScenicBasic(item.getScenicId());
if (scenicBasic != null && StringUtils.isNotBlank(scenicBasic.getName())) {
variables.put("scenicName", scenicBasic.getName());
}
} catch (Exception e) {
log.debug("获取景区名称失败: scenicId={}, error={}", item.getScenicId(), e.getMessage());
}
variables.put("videoCreateTime", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm"));
WechatSubscribeNotifyTriggerResult triggerResult = wechatSubscribeNotifyTriggerService.trigger(
"VIDEO_GENERATED",
WechatSubscribeNotifyTriggerRequest.builder()
.scenicId(item.getScenicId())
.memberId(memberId)
.openId(openId)
.bizId(String.valueOf(taskId))
.variables(variables)
.build()
);
if (triggerResult.isConfigFound()) {
log.info("memberId:{} VIDEO_GENERATED订阅消息触发完成 sentCount={}, skippedCount={}",
memberId, triggerResult.getSentCount(), triggerResult.getSkippedCount());
return;
}
String templateId = scenicRepository.getVideoGeneratedTemplateId(item.getScenicId());
if (StringUtils.isBlank(templateId)) {
log.warn("未配置视频生成通知模板");
return;
}
// 检查并消费通知授权
if (!notificationAuthUtils.checkAndConsumeAuthorization(memberId, templateId, item.getScenicId())) {
log.debug("用户[memberId={}]对模板[templateId={}]授权不足,跳过视频生成通知", memberId, templateId);
return;
}
ScenicV2DTO scenic = scenicRepository.getScenicBasic(item.getScenicId());
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(item.getScenicId());
String configTitle = configManager.getString("first_notification_title");
String configContent = configManager.getString("first_notification_content");
if (StringUtils.isBlank(configTitle) || StringUtils.isBlank(configContent)) {
log.info("景区[{}]未配置第一次通知内容,跳过发送通知", scenic.getName());
return;
}
String title = configTitle.replace("【景区】", scenic.getName());
String page;
if (configManager.getBoolean("grouping_enable", false)) {
page = "pages/travelVideoCenter/index?type=1&scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId();
} else {
page = "pages/videoSynthesis/index?type=1&scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId();
}
/**
* 视频名称 {{thing1.DATA}}
* 生成时间 {{time4.DATA}}
* 备注 {{thing3.DATA}}
*/
Map<String, Object> dataParam = new HashMap<>();
dataParam.put("thing1", title);
dataParam.put("time4", DateUtil.format(new Date(), "yyyy-MM-dd HH:mm"));
dataParam.put("thing3", configContent);
// 构建extra,只包含data和page
Map<String, Object> extra = new HashMap<>();
extra.put("data", dataParam);
extra.put("page", page);
// 使用ZT消息服务发送通知(第一次通知)
ZtMessage msg = new ZtMessage();
msg.setChannelId(templateId);
msg.setTitle(title);
msg.setContent("" + item.getFaceId() + "/" + item.getVideoId() + ""+configContent);
msg.setTarget(openId);
msg.setExtra(extra);
msg.setSendReason("视频生成通知");
msg.setSendBiz("视频生成");
ztMessageProducerService.send(msg);
log.info("memberId:{} 视频生成通知发送成功", memberId);
WechatSubscribeNotifyTriggerRequest request = WechatSubscribeNotifyTriggerRequest.builder()
.scenicId(item.getScenicId())
.memberId(item.getMemberId())
.openId(member.getOpenId())
.bizId(String.valueOf(item.getId()))
.variables(variables)
.build();
WechatSubscribeNotifyTriggerResult triggerResult = notifyTriggerService.trigger("VIDEO_GENERATED", request);
}
}