From e76df77ce5c0d761cb1dd65a5a1a8c7081848b02 Mon Sep 17 00:00:00 2001 From: glx <783262171@qq.com> Date: Tue, 26 May 2026 15:56:32 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=A2=E9=98=85=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E7=89=88=E6=9C=AC=E7=AE=A1=E7=90=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AiGenerationController.java | 15 ++++ .../mini/model/form/WxSubscribeSendForm.java | 2 +- .../mini/service/AiGenerationService.java | 2 + .../service/impl/AiGenerationServiceImpl.java | 74 ++++++++++--------- src/main/resources/application-dev.yml | 2 + 5 files changed, 58 insertions(+), 37 deletions(-) diff --git a/src/main/java/com/youlai/boot/mini/controller/AiGenerationController.java b/src/main/java/com/youlai/boot/mini/controller/AiGenerationController.java index 1b6277c..9b554a1 100644 --- a/src/main/java/com/youlai/boot/mini/controller/AiGenerationController.java +++ b/src/main/java/com/youlai/boot/mini/controller/AiGenerationController.java @@ -18,10 +18,14 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Pattern; +import org.springframework.security.access.prepost.PreAuthorize; import com.baomidou.mybatisplus.core.metadata.IPage; import com.youlai.boot.mini.model.query.AiTaskMediaQuery; import com.youlai.boot.mini.model.vo.AiGenerationTaskVO; +import cn.hutool.core.util.StrUtil; import java.util.List; import com.youlai.boot.mini.model.vo.UserUploadMediaVO; @@ -144,4 +148,15 @@ public class AiGenerationController { return Result.success(result); } + @Operation(summary = "设置微信订阅消息跳转版本") + @PostMapping("/subscribe/mini-program-state/set") + @Log(module = LogModuleEnum.AI_GENERATION_TASK, value = ActionTypeEnum.UPDATE) + public Result setMiniProgramState( + @Schema(description = "跳转版本:developer=开发版 trial=体验版 formal=正式版,为空时删除配置") + @Pattern(regexp = "^(developer|trial|formal|)$", message = "参数只能是developer/trial/formal或为空") + @RequestParam(required = false) String miniProgramState + ) { + aiGenerationService.setMiniProgramState(miniProgramState); + return Result.success(); + } } diff --git a/src/main/java/com/youlai/boot/mini/model/form/WxSubscribeSendForm.java b/src/main/java/com/youlai/boot/mini/model/form/WxSubscribeSendForm.java index 04b11aa..468861b 100644 --- a/src/main/java/com/youlai/boot/mini/model/form/WxSubscribeSendForm.java +++ b/src/main/java/com/youlai/boot/mini/model/form/WxSubscribeSendForm.java @@ -25,7 +25,7 @@ public class WxSubscribeSendForm { private String page; @Schema(description = "跳转版本:developer=开发版 trial=体验版 formal=正式版,默认formal") - private String miniProgramState = "developer"; + private String miniProgramState; @NotNull(message = "模板参数不能为空") @Schema(description = "模板参数,key是模板字段名,value是对应的值", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/src/main/java/com/youlai/boot/mini/service/AiGenerationService.java b/src/main/java/com/youlai/boot/mini/service/AiGenerationService.java index f2f971e..d429011 100644 --- a/src/main/java/com/youlai/boot/mini/service/AiGenerationService.java +++ b/src/main/java/com/youlai/boot/mini/service/AiGenerationService.java @@ -40,4 +40,6 @@ public interface AiGenerationService { IPage getMyAiGenerateHistory(AiTaskMediaQuery query, Long userId); + void setMiniProgramState(String miniProgramState); + } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/AiGenerationServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/AiGenerationServiceImpl.java index 3099ef4..7e4bb17 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/AiGenerationServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/AiGenerationServiceImpl.java @@ -37,6 +37,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -65,6 +66,10 @@ public class AiGenerationServiceImpl implements AiGenerationService { private final AliyunFileService aliyunFileService; private final MiniPointRecordService pointRecordService; private final WxSubscribeService wxSubscribeService; + private final StringRedisTemplate stringRedisTemplate; + + // Redis key 存储微信订阅消息跳转版本 + private static final String WX_MINI_PROGRAM_STATE_KEY = "wx:subscribe:mini_program_state"; //OSS存储目录配置 private static final String OSS_IMAGE_DIR = "ai/image/"; @@ -101,6 +106,9 @@ public class AiGenerationServiceImpl implements AiGenerationService { @Value("${subscribe.template}") private String subscribeTemplate; + @Value("${subscribe.miniProgramState}") + private String miniProgramState; + //AI单图生成积分规则编码 private static final String AI_GENERATE_SINGLE_IMAGE_RULE = "AI_GENERATE_SINGLE_IMAGE"; //AI四宫格生成积分规则编码 @@ -549,22 +557,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { aiTaskMediaMapper.update(null, updateMediaWrapper); // 同步发送订阅消息通知 - if (StrUtil.isNotBlank(subscribeTemplate)) { - try { - WxSubscribeSendForm sendForm = new WxSubscribeSendForm(); - sendForm.setUserId(task.getMiniUserId()); - sendForm.setTemplateId(subscribeTemplate); - sendForm.setPage("pages/creation/list"); - sendForm.setTemplateParams(Map.of( - "thing5", "您的AI视频作品已完成", - "time3", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm")), - "phrase4", "待查看" - )); - wxSubscribeService.sendMessage(sendForm); - } catch (Exception e) { - log.error("视频任务{}发送订阅消息失败", task.getId(), e); - } - } + sendAiGenerateSuccessNotify(task.getMiniUserId(), subscribeTemplate, task.getId()); } success = true; @@ -744,23 +737,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { aiTaskMediaMapper.update(null, updateMediaWrapper); // 同步发送订阅消息通知 - if (StrUtil.isNotBlank(subscribeTemplate)) { - try { - WxSubscribeSendForm sendForm = new WxSubscribeSendForm(); - sendForm.setUserId(task.getMiniUserId()); - sendForm.setTemplateId(subscribeTemplate); - sendForm.setPage("pages/creation/list"); - // 根据实际模板字段调整参数 - sendForm.setTemplateParams(Map.of( - "thing5", "您的AI绘画作品已完成", - "time3", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm")), - "phrase4", "待查看" - )); - wxSubscribeService.sendMessage(sendForm); - } catch (Exception e) { - log.error("单图任务{}发送订阅消息失败", task.getId(), e); - } - } + sendAiGenerateSuccessNotify(task.getMiniUserId(), subscribeTemplate, task.getId()); } // 更新任务状态 @@ -794,6 +771,30 @@ public class AiGenerationServiceImpl implements AiGenerationService { return aiGenerationTaskMapper.update(null, updateWrapper) > 0; } + /** + * 获取微信订阅消息跳转版本 + * 优先级: 配置文件配置 > Redis配置 > 默认formal + */ + private String getMiniProgramState() { + if (StrUtil.isNotBlank(miniProgramState)) { + return miniProgramState; + } + String redisState = stringRedisTemplate.opsForValue().get(WX_MINI_PROGRAM_STATE_KEY); + if (StrUtil.isNotBlank(redisState)) { + return redisState; + } + return "formal"; + } + + @Override + public void setMiniProgramState(String miniProgramState) { + if (StrUtil.isBlank(miniProgramState)) { + stringRedisTemplate.delete(WX_MINI_PROGRAM_STATE_KEY); + } else { + stringRedisTemplate.opsForValue().set(WX_MINI_PROGRAM_STATE_KEY, miniProgramState); + } + } + /** * 下载外部URL到OSS,返回OSS访问地址 */ @@ -960,7 +961,7 @@ public class AiGenerationServiceImpl implements AiGenerationService { } /** - * 发送AI绘画完成订阅消息通知 + * 发送AI作品完成订阅消息通知 * @param userId 接收用户ID * @param templateId 订阅消息模板ID * @param taskId 任务ID(仅用于日志) @@ -974,14 +975,15 @@ public class AiGenerationServiceImpl implements AiGenerationService { sendForm.setUserId(userId); sendForm.setTemplateId(templateId); sendForm.setPage("pages/creation/list"); + sendForm.setMiniProgramState(getMiniProgramState()); sendForm.setTemplateParams(Map.of( - "thing5", "您的AI绘画作品已完成", + "thing5", "您的AI作品已完成", "time3", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm")), "phrase4", "待查看" )); wxSubscribeService.sendMessage(sendForm); } catch (Exception e) { - log.error("四宫格图片任务{}发送订阅消息失败", taskId, e); + log.error("AI任务{}发送订阅消息失败", taskId, e); } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index b20e303..4b44a9c 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -248,5 +248,7 @@ ai: # 订阅模板配置 subscribe: template: "7m5Vu4gaCo2zY6hzID4yqEv94y1guuOGxdPOJYV_xHE" + # developer=开发版 trial=体验版 formal=正式版 + miniProgramState: "developer"