From 343347ea116da49cf37080c66031841015d4837a Mon Sep 17 00:00:00 2001 From: ccnetcore Date: Sat, 3 Jan 2026 00:00:17 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E5=B9=BF=E5=9C=BA=E3=80=81=E5=8F=91=E5=B8=83=E5=8F=8A=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 图片任务列表区分为“我的任务”和“图片广场(已发布)” - 新增图片发布到广场接口,支持分类 - 新增图片模型列表查询接口 - 注释掉图片 Base64 前缀字段,统一使用 URL - 调整相关依赖注入,支持模型仓储查询 --- .../Dtos/Chat/ImageTaskOutput.cs | 2 +- .../Services/Chat/AiImageService.cs | 100 ++++++++++++++++-- 2 files changed, 95 insertions(+), 7 deletions(-) diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageTaskOutput.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageTaskOutput.cs index aba37169..0f2e5a6f 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageTaskOutput.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageTaskOutput.cs @@ -30,7 +30,7 @@ public class ImageTaskOutput /// /// 生成图片PrefixBase64(包含前缀) /// - public string? StorePrefixBase64 { get; set; } + // public string? StorePrefixBase64 { get; set; } /// /// 生成图片URL diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiImageService.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiImageService.cs index 2be038a6..0297e1c0 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiImageService.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Services/Chat/AiImageService.cs @@ -8,9 +8,11 @@ using Volo.Abp.Application.Services; using Volo.Abp.BackgroundJobs; using Volo.Abp.Guids; using Volo.Abp.Users; +using Yi.Framework.AiHub.Application.Contracts.Dtos; using Yi.Framework.AiHub.Application.Contracts.Dtos.Chat; using Yi.Framework.AiHub.Application.Jobs; using Yi.Framework.AiHub.Domain.Entities.Chat; +using Yi.Framework.AiHub.Domain.Entities.Model; using Yi.Framework.AiHub.Domain.Extensions; using Yi.Framework.AiHub.Domain.Managers; using Yi.Framework.AiHub.Domain.Shared.Consts; @@ -33,6 +35,7 @@ public class AiImageService : ApplicationService private readonly IGuidGenerator _guidGenerator; private readonly IWebHostEnvironment _webHostEnvironment; private readonly TokenManager _tokenManager; + private readonly ISqlSugarRepository _aiModelRepository; public AiImageService( ISqlSugarRepository imageTaskRepository, IBackgroundJobManager backgroundJobManager, @@ -40,7 +43,7 @@ public class AiImageService : ApplicationService PremiumPackageManager premiumPackageManager, ModelManager modelManager, IGuidGenerator guidGenerator, - IWebHostEnvironment webHostEnvironment, TokenManager tokenManager) + IWebHostEnvironment webHostEnvironment, TokenManager tokenManager, ISqlSugarRepository aiModelRepository) { _imageTaskRepository = imageTaskRepository; _backgroundJobManager = backgroundJobManager; @@ -50,6 +53,7 @@ public class AiImageService : ApplicationService _guidGenerator = guidGenerator; _webHostEnvironment = webHostEnvironment; _tokenManager = tokenManager; + _aiModelRepository = aiModelRepository; } /// @@ -224,12 +228,10 @@ public class AiImageService : ApplicationService } /// - /// 分页查询任务列表 + /// 分页查询我的任务列表 /// - /// 分页查询参数 - /// 任务列表 - [HttpGet("ai-image/tasks")] - public async Task> GetTaskPageAsync([FromQuery] ImageTaskPageInput input) + [HttpGet("ai-image/my-tasks")] + public async Task> GetMyTaskPageAsync([FromQuery] ImageTaskPageInput input) { var userId = CurrentUser.GetId(); @@ -257,6 +259,92 @@ public class AiImageService : ApplicationService return new PagedResult(total, items); } + + /// + /// 分页查询图片广场(已发布的图片) + /// + [HttpGet("ai-image/plaza")] + [AllowAnonymous] + public async Task> GetPlazaPageAsync([FromQuery] ImageTaskPageInput input) + { + var query = _imageTaskRepository._DbQueryable + .Where(x => x.PublishStatus == PublishStatusEnum.Published) + .Where(x => x.TaskStatus == TaskStatusEnum.Success) + .OrderByDescending(x => x.CreationTime); + + var total = await query.CountAsync(); + var items = await query + .Skip((input.PageIndex - 1) * input.PageSize) + .Take(input.PageSize) + .Select(x => new ImageTaskOutput + { + Id = x.Id, + Prompt = x.Prompt, + // ReferenceImagesPrefixBase64 = x.ReferenceImagesPrefixBase64, + // ReferenceImagesUrl = x.ReferenceImagesUrl, + StoreUrl = x.StoreUrl, + TaskStatus = x.TaskStatus, + PublishStatus = x.PublishStatus, + Categories = x.Categories, + CreationTime = x.CreationTime + }) + .ToListAsync(); + + return new PagedResult(total, items); + } + + /// + /// 发布图片到广场 + /// + [HttpPost("ai-image/publish")] + public async Task PublishAsync([FromBody] PublishImageInput input) + { + var userId = CurrentUser.GetId(); + + var task = await _imageTaskRepository.GetFirstAsync(x => x.Id == input.TaskId && x.UserId == userId); + if (task == null) + { + throw new UserFriendlyException("任务不存在或无权访问"); + } + + if (task.TaskStatus != TaskStatusEnum.Success) + { + throw new UserFriendlyException("只有已完成的任务才能发布"); + } + + if (task.PublishStatus == PublishStatusEnum.Published) + { + throw new UserFriendlyException("该任务已发布"); + } + + task.PublishStatus = PublishStatusEnum.Published; + task.Categories = input.Categories ?? new List(); + + await _imageTaskRepository.UpdateAsync(task); + } + + /// + /// 获取图片模型列表 + /// + /// + [HttpPost("ai-image/model")] + public async Task> GetModelAsync() + { + var output = await _aiModelRepository._DbQueryable + .Where(x => x.ModelType == ModelTypeEnum.Image) + .Where(x => x.ModelApiType == ModelApiTypeEnum.OpenAi) + .OrderByDescending(x => x.OrderNum) + .Select(x => new ModelGetListOutput + { + Id = x.Id, + ModelId = x.ModelId, + ModelName = x.Name, + ModelDescribe = x.Description, + Remark = x.Description, + IsPremiumPackage = PremiumPackageConst.ModeIds.Contains(x.ModelId) + }).ToListAsync(); + return output; + } } ///