package com.youlai.boot.mini.controller; import com.youlai.boot.common.annotation.Log; import com.youlai.boot.common.annotation.RepeatSubmit; import com.youlai.boot.common.enums.ActionTypeEnum; import com.youlai.boot.common.enums.LogModuleEnum; import com.youlai.boot.common.result.Result; import com.youlai.boot.framework.security.util.SecurityUtils; import com.youlai.boot.mini.model.entity.MiniAiTaskMedia; import com.youlai.boot.mini.model.form.*; import com.youlai.boot.mini.model.vo.AiVideoCallbackVO; import com.youlai.boot.mini.service.AiGenerationService; import com.youlai.boot.mini.service.WxSubscribeService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.enums.ParameterIn; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; import com.youlai.boot.mini.model.vo.UserUploadMediaVO; @Tag(name = "AI生成相关接口") @RestController @RequestMapping("/api/v1/mini/ai/generation") @RequiredArgsConstructor @Valid public class AiGenerationController { private final AiGenerationService aiGenerationService; private final WxSubscribeService wxSubscribeService; @Operation(summary = "上传AI生成参考文件") @PostMapping(value = "/upload/reference", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @RepeatSubmit @Log(module = LogModuleEnum.AI_TASK_MEDIA, value = ActionTypeEnum.INSERT) public Result> uploadReferenceFile( @RequestParam(name = "images", required = false) List images, @RequestParam(name = "videos", required = false) List videos ) { Long userId = SecurityUtils.getUserId(); List urlList = aiGenerationService.uploadReferenceFile(images, videos, userId); return Result.success(urlList); } @Operation(summary = "提交单图生成任务") @PostMapping("/generate-single-image") @Log(module = LogModuleEnum.AI_GENERATION_TASK, value = ActionTypeEnum.INSERT) public Result generateSingleImage(@Valid @RequestBody AiSingleImageGenerateForm form) { Long userId = SecurityUtils.getUserId(); String taskUuid = aiGenerationService.createAndGenerateImage(form, userId); return Result.success(taskUuid); } @Operation(summary = "单图任务回调接口") @PostMapping("/single-image/task/callback") @Log(module = LogModuleEnum.AI_GENERATION_TASK, value = ActionTypeEnum.UPDATE) public Result singleImageTaskCallback(@Valid @RequestBody AiSingleImageCallbackForm form) { boolean success = aiGenerationService.handleTaskCallback(form); return Result.success(success); } @Operation(summary = "提交四宫格漫画生成任务") @PostMapping("/generate-four-panel") @Log(module = LogModuleEnum.AI_GENERATION_TASK, value = ActionTypeEnum.INSERT) public Result generateFourPanelImage(@Valid @RequestBody AiFourPanelGenerateForm form) { Long userId = SecurityUtils.getUserId(); String taskUuid = aiGenerationService.createAndGenerateFourPanel(form, userId); return Result.success(taskUuid); } @Operation(summary = "四宫格漫画任务回调接口") @PostMapping("/four-panel/task/callback") @Log(module = LogModuleEnum.AI_GENERATION_TASK, value = ActionTypeEnum.UPDATE) public Result fourPanelTaskCallback(@Valid @RequestBody AiFourPanelCallbackForm form) { boolean success = aiGenerationService.handleFourPanelCallback(form); return Result.success(success); } @Operation(summary = "提交视频生成任务") @PostMapping("/generate-video") @Log(module = LogModuleEnum.AI_GENERATION_TASK, value = ActionTypeEnum.INSERT) public Result generateVideo(@Valid @RequestBody AiVideoGenerateForm form) { Long userId = SecurityUtils.getUserId(); String taskUuid = aiGenerationService.createAndGenerateVideo(form, userId); return Result.success(taskUuid); } @Operation(summary = "视频任务回调接口") @PostMapping("/video/task/callback") @Log(module = LogModuleEnum.AI_GENERATION_TASK, value = ActionTypeEnum.UPDATE) public Result videoTaskCallback(@Valid @RequestBody AiVideoCallbackVO vo) { boolean success = aiGenerationService.handleVideoTaskCallback(vo); return Result.success(success); } @Operation(summary = "上报微信订阅消息授权状态") @PostMapping("/subscribe/auth/report") @Log(module = LogModuleEnum.USER_SUBSCRIBE, value = ActionTypeEnum.UPDATE) public Result reportSubscribeAuth(@Valid @RequestBody WxSubscribeAuthForm form) { form.setUserId(SecurityUtils.getUserId()); wxSubscribeService.reportAuth(form); return Result.success(); } @Operation(summary = "发送微信订阅消息") @PostMapping("/subscribe/send") @Log(module = LogModuleEnum.AI_GENERATION_TASK, value = ActionTypeEnum.INSERT) public Result sendSubscribeMessage(@Valid @RequestBody WxSubscribeSendForm form) { form.setUserId(SecurityUtils.getUserId()); Boolean result = wxSubscribeService.sendMessage(form); return Result.success(result); } @Operation(summary = "查询当前用户最近上传的图片视频") @GetMapping("/my/recent-upload") public Result> getMyRecentUpload() { Long userId = SecurityUtils.getUserId(); List voList = aiGenerationService.getRecentUploadVO(userId); return Result.success(voList); } @Operation(summary = "删除用户上传的图片/视频") @DeleteMapping("/my/upload/delete") @Log(module = LogModuleEnum.AI_TASK_MEDIA, value = ActionTypeEnum.DELETE) public Result deleteMyUpload(@RequestParam String uuid) { Long userId = SecurityUtils.getUserId(); boolean success = aiGenerationService.deleteUploadMedia(userId, uuid); return Result.success(success); } }