From 12878ba02243ad781cc010e09a5d82ef5075814d Mon Sep 17 00:00:00 2001 From: ccnetcore Date: Sat, 3 Jan 2026 16:00:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E6=9D=A1=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...skPageInput.cs => ImageMyTaskPageInput.cs} | 20 ++++--- .../Dtos/Chat/ImagePlazaPageInput.cs | 31 ++++++++++ .../Dtos/Chat/ImageTaskOutput.cs | 10 ++++ .../Jobs/ImageGenerationJob.cs | 8 +-- .../Services/Chat/AiImageService.cs | 59 ++++++++++--------- .../Chat/ImageStoreTaskAggregateRoot.cs | 11 +++- 6 files changed, 95 insertions(+), 44 deletions(-) rename Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/{ImageTaskPageInput.cs => ImageMyTaskPageInput.cs} (57%) create mode 100644 Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImagePlazaPageInput.cs diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageTaskPageInput.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageMyTaskPageInput.cs similarity index 57% rename from Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageTaskPageInput.cs rename to Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageMyTaskPageInput.cs index c42985d5..1f977cbf 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageTaskPageInput.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImageMyTaskPageInput.cs @@ -1,24 +1,26 @@ +using Volo.Abp.Application.Dtos; using Yi.Framework.AiHub.Domain.Shared.Enums; +using Yi.Framework.Ddd.Application.Contracts; namespace Yi.Framework.AiHub.Application.Contracts.Dtos.Chat; /// /// 图片任务分页查询输入 /// -public class ImageTaskPageInput +public class ImageMyTaskPageInput: PagedAllResultRequestDto { /// - /// 页码(从1开始) + /// 提示词 /// - public int PageIndex { get; set; } = 1; - - /// - /// 每页数量 - /// - public int PageSize { get; set; } = 10; - + public string? Prompt { get; set; } + /// /// 任务状态筛选(可选) /// public TaskStatusEnum? TaskStatus { get; set; } + + /// + /// 发布状态 + /// + public PublishStatusEnum? PublishStatus { get; set; } } diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImagePlazaPageInput.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImagePlazaPageInput.cs new file mode 100644 index 00000000..184e75d7 --- /dev/null +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application.Contracts/Dtos/Chat/ImagePlazaPageInput.cs @@ -0,0 +1,31 @@ +using Volo.Abp.Application.Dtos; +using Yi.Framework.AiHub.Domain.Shared.Enums; +using Yi.Framework.Ddd.Application.Contracts; + +namespace Yi.Framework.AiHub.Application.Contracts.Dtos.Chat; + +/// +/// 图片任务分页查询输入 +/// +public class ImagePlazaPageInput: PagedAllResultRequestDto +{ + /// + /// 分类 + /// + public string? Categories { get; set; } + + /// + /// 提示词 + /// + public string? Prompt { get; set; } + + /// + /// 任务状态筛选(可选) + /// + public TaskStatusEnum? TaskStatus { get; set; } + + /// + /// 用户名 + /// + public string? UserName{ get; set; } +} 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 8ed9083b..ffd3fdbd 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 @@ -61,4 +61,14 @@ public class ImageTaskOutput /// 错误信息 /// public string? ErrorInfo { get; set; } + + /// + /// 用户名称 + /// + public string? UserName { get; set; } + + /// + /// 用户名称Id + /// + public Guid UserId { get; set; } } diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Jobs/ImageGenerationJob.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Jobs/ImageGenerationJob.cs index d0912fe2..67f9856d 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Jobs/ImageGenerationJob.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Application/Jobs/ImageGenerationJob.cs @@ -43,7 +43,7 @@ public class ImageGenerationJob : AsyncBackgroundJob, IT // 构建 Gemini API 请求对象 var parts = new List { - new { role="user",text = task.Prompt } + new { text = task.Prompt } }; // 添加参考图(如果有) @@ -64,7 +64,7 @@ public class ImageGenerationJob : AsyncBackgroundJob, IT { contents = new[] { - new { parts } + new { role = "user", parts } } }; @@ -77,9 +77,9 @@ public class ImageGenerationJob : AsyncBackgroundJob, IT task.ModelId, request, task.UserId, - tokenId:task.TokenId); + tokenId: task.TokenId); + - _logger.LogInformation("图片生成任务完成,TaskId: {TaskId}", args.TaskId); } catch (Exception ex) 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 bf0a1a9d..b4bb6155 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 @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using SqlSugar; using Volo.Abp; using Volo.Abp.Application.Services; using Volo.Abp.BackgroundJobs; @@ -104,6 +105,7 @@ public class AiImageService : ApplicationService ReferenceImagesUrl = new List(), TaskStatus = TaskStatusEnum.Processing, UserId = userId, + UserName = CurrentUser.UserName, TokenId = input.TokenId, ModelId = input.ModelId }; @@ -147,7 +149,6 @@ public class AiImageService : ApplicationService Categories = task.Categories, CreationTime = task.CreationTime, ErrorInfo = task.ErrorInfo, - }; } @@ -238,26 +239,23 @@ public class AiImageService : ApplicationService /// 分页查询我的任务列表 /// [HttpGet("ai-image/my-tasks")] - public async Task> GetMyTaskPageAsync([FromQuery] ImageTaskPageInput input) + public async Task> GetMyTaskPageAsync([FromQuery] ImageMyTaskPageInput input) { var userId = CurrentUser.GetId(); - var query = _imageTaskRepository._DbQueryable + RefAsync total = 0; + var output = await _imageTaskRepository._DbQueryable .Where(x => x.UserId == userId) - .WhereIF(input.TaskStatus.HasValue, x => x.TaskStatus == input.TaskStatus!.Value) - .OrderByDescending(x => x.CreationTime); - - var total = await query.CountAsync(); - var items = await query - .Skip((input.PageIndex - 1) * input.PageSize) - .Take(input.PageSize) + .WhereIF(input.TaskStatus is not null, x => x.TaskStatus == input.TaskStatus) + .WhereIF(!string.IsNullOrWhiteSpace(input.Prompt), x => x.Prompt.Contains(input.Prompt)) + .WhereIF(input.PublishStatus is not null, x => x.PublishStatus == input.PublishStatus) + .WhereIF(input.StartTime is not null && input.EndTime is not null, + x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime) + .OrderByDescending(x => x.CreationTime) .Select(x => new ImageTaskOutput { Id = x.Id, Prompt = x.Prompt, - // ReferenceImagesBase64 = x.ReferenceImagesBase64, - // ReferenceImagesUrl = x.ReferenceImagesUrl, - // StoreBase64 = x.StoreBase64, StoreUrl = x.StoreUrl, TaskStatus = x.TaskStatus, PublishStatus = x.PublishStatus, @@ -265,9 +263,10 @@ public class AiImageService : ApplicationService CreationTime = x.CreationTime, ErrorInfo = x.ErrorInfo }) - .ToListAsync(); + .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); - return new PagedResult(total, items); + + return new PagedResult(total, output); } /// @@ -275,32 +274,36 @@ public class AiImageService : ApplicationService /// [HttpGet("ai-image/plaza")] [AllowAnonymous] - public async Task> GetPlazaPageAsync([FromQuery] ImageTaskPageInput input) + public async Task> GetPlazaPageAsync([FromQuery] ImagePlazaPageInput input) { - var query = _imageTaskRepository._DbQueryable + RefAsync total = 0; + var output = await _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) + .WhereIF(input.TaskStatus is not null, x => x.TaskStatus == input.TaskStatus) + .WhereIF(!string.IsNullOrWhiteSpace(input.Prompt), x => x.Prompt.Contains(input.Prompt)) + .WhereIF(!string.IsNullOrWhiteSpace(input.Categories), x => SqlFunc.JsonLike(x.Categories, input.Categories)) + .WhereIF(!string.IsNullOrWhiteSpace(input.UserName),x=>x.UserName.Contains(input.UserName) ) + .WhereIF(input.StartTime is not null && input.EndTime is not null, + x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime) + .OrderByDescending(x => x.CreationTime) .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 + CreationTime = x.CreationTime, + UserName = x.UserName, + UserId = x.UserId, }) - .ToListAsync(); + .ToPageListAsync(input.SkipCount, input.MaxResultCount, total); + ; - return new PagedResult(total, items); + + return new PagedResult(total, output); } /// diff --git a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Chat/ImageStoreTaskAggregateRoot.cs b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Chat/ImageStoreTaskAggregateRoot.cs index 37fe666b..76fdde14 100644 --- a/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Chat/ImageStoreTaskAggregateRoot.cs +++ b/Yi.Abp.Net8/module/ai-hub/Yi.Framework.AiHub.Domain/Entities/Chat/ImageStoreTaskAggregateRoot.cs @@ -16,16 +16,16 @@ public class ImageStoreTaskAggregateRoot : FullAuditedAggregateRoot /// /// 参考图PrefixBase64(带前缀,如 data:image/png;base64,xxx) /// - [SugarColumn(IsJson = true,ColumnDataType = StaticConfig.CodeFirst_BigString)] + [SugarColumn(IsJson = true, ColumnDataType = StaticConfig.CodeFirst_BigString)] public List ReferenceImagesPrefixBase64 { get; set; } - + /// /// 参考图url /// [SugarColumn(IsJson = true)] public List ReferenceImagesUrl { get; set; } - + /// /// 图片绝对路径 /// @@ -41,6 +41,11 @@ public class ImageStoreTaskAggregateRoot : FullAuditedAggregateRoot /// public Guid UserId { get; set; } + /// + /// 用户名称 + /// + public string? UserName { get; set; } + /// /// 模型id ///