feat: 完成条件

This commit is contained in:
ccnetcore
2026-01-03 16:00:18 +08:00
parent a3259ad36f
commit 12878ba022
6 changed files with 95 additions and 44 deletions

View File

@@ -1,24 +1,26 @@
using Volo.Abp.Application.Dtos;
using Yi.Framework.AiHub.Domain.Shared.Enums; using Yi.Framework.AiHub.Domain.Shared.Enums;
using Yi.Framework.Ddd.Application.Contracts;
namespace Yi.Framework.AiHub.Application.Contracts.Dtos.Chat; namespace Yi.Framework.AiHub.Application.Contracts.Dtos.Chat;
/// <summary> /// <summary>
/// 图片任务分页查询输入 /// 图片任务分页查询输入
/// </summary> /// </summary>
public class ImageTaskPageInput public class ImageMyTaskPageInput: PagedAllResultRequestDto
{ {
/// <summary> /// <summary>
/// 页码从1开始 /// 提示词
/// </summary> /// </summary>
public int PageIndex { get; set; } = 1; public string? Prompt { get; set; }
/// <summary>
/// 每页数量
/// </summary>
public int PageSize { get; set; } = 10;
/// <summary> /// <summary>
/// 任务状态筛选(可选) /// 任务状态筛选(可选)
/// </summary> /// </summary>
public TaskStatusEnum? TaskStatus { get; set; } public TaskStatusEnum? TaskStatus { get; set; }
/// <summary>
/// 发布状态
/// </summary>
public PublishStatusEnum? PublishStatus { get; set; }
} }

View File

@@ -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;
/// <summary>
/// 图片任务分页查询输入
/// </summary>
public class ImagePlazaPageInput: PagedAllResultRequestDto
{
/// <summary>
/// 分类
/// </summary>
public string? Categories { get; set; }
/// <summary>
/// 提示词
/// </summary>
public string? Prompt { get; set; }
/// <summary>
/// 任务状态筛选(可选)
/// </summary>
public TaskStatusEnum? TaskStatus { get; set; }
/// <summary>
/// 用户名
/// </summary>
public string? UserName{ get; set; }
}

View File

@@ -61,4 +61,14 @@ public class ImageTaskOutput
/// 错误信息 /// 错误信息
/// </summary> /// </summary>
public string? ErrorInfo { get; set; } public string? ErrorInfo { get; set; }
/// <summary>
/// 用户名称
/// </summary>
public string? UserName { get; set; }
/// <summary>
/// 用户名称Id
/// </summary>
public Guid UserId { get; set; }
} }

View File

@@ -43,7 +43,7 @@ public class ImageGenerationJob : AsyncBackgroundJob<ImageGenerationJobArgs>, IT
// 构建 Gemini API 请求对象 // 构建 Gemini API 请求对象
var parts = new List<object> var parts = new List<object>
{ {
new { role="user",text = task.Prompt } new { text = task.Prompt }
}; };
// 添加参考图(如果有) // 添加参考图(如果有)
@@ -64,7 +64,7 @@ public class ImageGenerationJob : AsyncBackgroundJob<ImageGenerationJobArgs>, IT
{ {
contents = new[] contents = new[]
{ {
new { parts } new { role = "user", parts }
} }
}; };
@@ -77,7 +77,7 @@ public class ImageGenerationJob : AsyncBackgroundJob<ImageGenerationJobArgs>, IT
task.ModelId, task.ModelId,
request, request,
task.UserId, task.UserId,
tokenId:task.TokenId); tokenId: task.TokenId);
_logger.LogInformation("图片生成任务完成TaskId: {TaskId}", args.TaskId); _logger.LogInformation("图片生成任务完成TaskId: {TaskId}", args.TaskId);

View File

@@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using SqlSugar;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundJobs;
@@ -104,6 +105,7 @@ public class AiImageService : ApplicationService
ReferenceImagesUrl = new List<string>(), ReferenceImagesUrl = new List<string>(),
TaskStatus = TaskStatusEnum.Processing, TaskStatus = TaskStatusEnum.Processing,
UserId = userId, UserId = userId,
UserName = CurrentUser.UserName,
TokenId = input.TokenId, TokenId = input.TokenId,
ModelId = input.ModelId ModelId = input.ModelId
}; };
@@ -147,7 +149,6 @@ public class AiImageService : ApplicationService
Categories = task.Categories, Categories = task.Categories,
CreationTime = task.CreationTime, CreationTime = task.CreationTime,
ErrorInfo = task.ErrorInfo, ErrorInfo = task.ErrorInfo,
}; };
} }
@@ -238,26 +239,23 @@ public class AiImageService : ApplicationService
/// 分页查询我的任务列表 /// 分页查询我的任务列表
/// </summary> /// </summary>
[HttpGet("ai-image/my-tasks")] [HttpGet("ai-image/my-tasks")]
public async Task<PagedResult<ImageTaskOutput>> GetMyTaskPageAsync([FromQuery] ImageTaskPageInput input) public async Task<PagedResult<ImageTaskOutput>> GetMyTaskPageAsync([FromQuery] ImageMyTaskPageInput input)
{ {
var userId = CurrentUser.GetId(); var userId = CurrentUser.GetId();
var query = _imageTaskRepository._DbQueryable RefAsync<int> total = 0;
var output = await _imageTaskRepository._DbQueryable
.Where(x => x.UserId == userId) .Where(x => x.UserId == userId)
.WhereIF(input.TaskStatus.HasValue, x => x.TaskStatus == input.TaskStatus!.Value) .WhereIF(input.TaskStatus is not null, x => x.TaskStatus == input.TaskStatus)
.OrderByDescending(x => x.CreationTime); .WhereIF(!string.IsNullOrWhiteSpace(input.Prompt), x => x.Prompt.Contains(input.Prompt))
.WhereIF(input.PublishStatus is not null, x => x.PublishStatus == input.PublishStatus)
var total = await query.CountAsync(); .WhereIF(input.StartTime is not null && input.EndTime is not null,
var items = await query x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime)
.Skip((input.PageIndex - 1) * input.PageSize) .OrderByDescending(x => x.CreationTime)
.Take(input.PageSize)
.Select(x => new ImageTaskOutput .Select(x => new ImageTaskOutput
{ {
Id = x.Id, Id = x.Id,
Prompt = x.Prompt, Prompt = x.Prompt,
// ReferenceImagesBase64 = x.ReferenceImagesBase64,
// ReferenceImagesUrl = x.ReferenceImagesUrl,
// StoreBase64 = x.StoreBase64,
StoreUrl = x.StoreUrl, StoreUrl = x.StoreUrl,
TaskStatus = x.TaskStatus, TaskStatus = x.TaskStatus,
PublishStatus = x.PublishStatus, PublishStatus = x.PublishStatus,
@@ -265,9 +263,10 @@ public class AiImageService : ApplicationService
CreationTime = x.CreationTime, CreationTime = x.CreationTime,
ErrorInfo = x.ErrorInfo ErrorInfo = x.ErrorInfo
}) })
.ToListAsync(); .ToPageListAsync(input.SkipCount, input.MaxResultCount, total);
return new PagedResult<ImageTaskOutput>(total, items);
return new PagedResult<ImageTaskOutput>(total, output);
} }
/// <summary> /// <summary>
@@ -275,32 +274,36 @@ public class AiImageService : ApplicationService
/// </summary> /// </summary>
[HttpGet("ai-image/plaza")] [HttpGet("ai-image/plaza")]
[AllowAnonymous] [AllowAnonymous]
public async Task<PagedResult<ImageTaskOutput>> GetPlazaPageAsync([FromQuery] ImageTaskPageInput input) public async Task<PagedResult<ImageTaskOutput>> GetPlazaPageAsync([FromQuery] ImagePlazaPageInput input)
{ {
var query = _imageTaskRepository._DbQueryable RefAsync<int> total = 0;
var output = await _imageTaskRepository._DbQueryable
.Where(x => x.PublishStatus == PublishStatusEnum.Published) .Where(x => x.PublishStatus == PublishStatusEnum.Published)
.Where(x => x.TaskStatus == TaskStatusEnum.Success) .Where(x => x.TaskStatus == TaskStatusEnum.Success)
.OrderByDescending(x => x.CreationTime); .WhereIF(input.TaskStatus is not null, x => x.TaskStatus == input.TaskStatus)
.WhereIF(!string.IsNullOrWhiteSpace(input.Prompt), x => x.Prompt.Contains(input.Prompt))
var total = await query.CountAsync(); .WhereIF(!string.IsNullOrWhiteSpace(input.Categories), x => SqlFunc.JsonLike(x.Categories, input.Categories))
var items = await query .WhereIF(!string.IsNullOrWhiteSpace(input.UserName),x=>x.UserName.Contains(input.UserName) )
.Skip((input.PageIndex - 1) * input.PageSize) .WhereIF(input.StartTime is not null && input.EndTime is not null,
.Take(input.PageSize) x => x.CreationTime >= input.StartTime && x.CreationTime <= input.EndTime)
.OrderByDescending(x => x.CreationTime)
.Select(x => new ImageTaskOutput .Select(x => new ImageTaskOutput
{ {
Id = x.Id, Id = x.Id,
Prompt = x.Prompt, Prompt = x.Prompt,
// ReferenceImagesPrefixBase64 = x.ReferenceImagesPrefixBase64,
// ReferenceImagesUrl = x.ReferenceImagesUrl,
StoreUrl = x.StoreUrl, StoreUrl = x.StoreUrl,
TaskStatus = x.TaskStatus, TaskStatus = x.TaskStatus,
PublishStatus = x.PublishStatus, PublishStatus = x.PublishStatus,
Categories = x.Categories, 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<ImageTaskOutput>(total, items);
return new PagedResult<ImageTaskOutput>(total, output);
} }
/// <summary> /// <summary>

View File

@@ -16,7 +16,7 @@ public class ImageStoreTaskAggregateRoot : FullAuditedAggregateRoot<Guid>
/// <summary> /// <summary>
/// 参考图PrefixBase64带前缀如 data:image/png;base64,xxx /// 参考图PrefixBase64带前缀如 data:image/png;base64,xxx
/// </summary> /// </summary>
[SugarColumn(IsJson = true,ColumnDataType = StaticConfig.CodeFirst_BigString)] [SugarColumn(IsJson = true, ColumnDataType = StaticConfig.CodeFirst_BigString)]
public List<string> ReferenceImagesPrefixBase64 { get; set; } public List<string> ReferenceImagesPrefixBase64 { get; set; }
/// <summary> /// <summary>
@@ -41,6 +41,11 @@ public class ImageStoreTaskAggregateRoot : FullAuditedAggregateRoot<Guid>
/// </summary> /// </summary>
public Guid UserId { get; set; } public Guid UserId { get; set; }
/// <summary>
/// 用户名称
/// </summary>
public string? UserName { get; set; }
/// <summary> /// <summary>
/// 模型id /// 模型id
/// </summary> /// </summary>