Browse Source

增加订阅消息版本管理接口

glx
glx 4 days ago
parent
commit
e76df77ce5
  1. 15
      src/main/java/com/youlai/boot/mini/controller/AiGenerationController.java
  2. 2
      src/main/java/com/youlai/boot/mini/model/form/WxSubscribeSendForm.java
  3. 2
      src/main/java/com/youlai/boot/mini/service/AiGenerationService.java
  4. 74
      src/main/java/com/youlai/boot/mini/service/impl/AiGenerationServiceImpl.java
  5. 2
      src/main/resources/application-dev.yml

15
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<Void> 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();
}
}

2
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)

2
src/main/java/com/youlai/boot/mini/service/AiGenerationService.java

@ -40,4 +40,6 @@ public interface AiGenerationService {
IPage<AiGenerationTaskVO> getMyAiGenerateHistory(AiTaskMediaQuery query, Long userId);
void setMiniProgramState(String miniProgramState);
}

74
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);
}
}

2
src/main/resources/application-dev.yml

@ -248,5 +248,7 @@ ai:
# 订阅模板配置
subscribe:
template: "7m5Vu4gaCo2zY6hzID4yqEv94y1guuOGxdPOJYV_xHE"
# developer=开发版 trial=体验版 formal=正式版
miniProgramState: "developer"

Loading…
Cancel
Save