refactor: 统一业务异常处理,标准化结果码和错误响应
1. 新增并完善ResultCode枚举,补充标准HTTP状态码对应的业务状态码 2. 重构BusinessException,新增基于ResultCode的构造函数和ThrowIf扩展方法 3. 替换所有硬编码的HTTP状态码为统一的ResultCode枚举 4. 优化全局异常中间件,根据业务状态码映射对应HTTP状态码并规范化JSON响应 5. 修复OssImageHelper和AutoDotCodeConsumer中的OSS文件处理逻辑 6. 新增用户答题快照实体类 7. 清理废弃的宠物模块迁移脚本
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
using Newtonsoft.Json;
|
||||
using QYZH.InteractiveMagazine.Common.Extensions;
|
||||
using QYZH.InteractiveMagazine.Infrastructure.OSS;
|
||||
using QYZH.InteractiveMagazine.Models.Dto.Journal;
|
||||
using QYZH.InteractiveMagazine.Models.Entity;
|
||||
@ -65,7 +66,19 @@ public class AutoDotCodeConsumer(IConfiguration configuration,
|
||||
var uploadFilePath = uploadPdfDic + uploadFileName;
|
||||
|
||||
// 获取上传成功的书籍页码pdf文件
|
||||
var pdfSteam = await httpClientFactory.CreateClient().GetStreamAsync(journalPagePrintDtoMessage.JournalPdfUrl, cancellationToken);
|
||||
var journalPdfKey = journalPagePrintDtoMessage.JournalPdfUrl?.RemoveDomain();
|
||||
if (string.IsNullOrWhiteSpace(journalPdfKey))
|
||||
{
|
||||
logger.LogError("书籍上传的PDF文件地址为空,JournalId: {JournalId}", journalPagePrintDtoMessage.JournalId);
|
||||
return;
|
||||
}
|
||||
|
||||
await using var pdfSteam = ossService.GetObjectStream(journalPdfKey);
|
||||
if (pdfSteam == null)
|
||||
{
|
||||
logger.LogError("获取书籍上传的PDF文件失败,OSS Key: {OssKey}", journalPdfKey);
|
||||
return;
|
||||
}
|
||||
|
||||
await using (var fs = new FileStream(uploadFilePath, FileMode.CreateNew, FileAccess.Write))
|
||||
{
|
||||
|
||||
@ -1,18 +1,21 @@
|
||||
using Newtonsoft.Json;
|
||||
using QYZH.InteractiveMagazine.Infrastructure.OSS;
|
||||
using SqlSugar;
|
||||
using System.Text;
|
||||
using System.Threading.Channels;
|
||||
using Yitter.IdGenerator;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.WorkService.Consumers;
|
||||
|
||||
/// <summary>
|
||||
/// 期刊任务接收消费者(示例)
|
||||
/// </summary>
|
||||
public class JournalTaskReceiveConsumer : IQueueConsumer
|
||||
public class JournalTaskReceiveConsumer(ILogger<JournalTaskReceiveConsumer> logger, IConfiguration configuration,
|
||||
IServiceScopeFactory scopeFactory,
|
||||
IWebHostEnvironment webHostEnvironment,
|
||||
IHttpClientFactory httpClientFactory,
|
||||
OssService ossService) : IQueueConsumer
|
||||
{
|
||||
private readonly ILogger<JournalTaskReceiveConsumer> _logger;
|
||||
|
||||
public JournalTaskReceiveConsumer(ILogger<JournalTaskReceiveConsumer> logger)
|
||||
{
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public string Exchange => "ex.journal";
|
||||
|
||||
@ -20,20 +23,63 @@ public class JournalTaskReceiveConsumer : IQueueConsumer
|
||||
|
||||
public string RoutingKey => "rk.journal.task.receive";
|
||||
|
||||
public async Task HandleAsync(byte[] message, CancellationToken cancellationToken = default)
|
||||
public async Task HandleAsync(byte[] body, CancellationToken cancellationToken = default)
|
||||
{
|
||||
var body = Encoding.UTF8.GetString(message);
|
||||
_logger.LogInformation("收到期刊任务消息: {Message}", body);
|
||||
var message = Encoding.UTF8.GetString(body);
|
||||
logger.LogInformation("收到期刊任务消息: {Message}", message);
|
||||
|
||||
using var scope = scopeFactory.CreateScope();
|
||||
var client = scope.ServiceProvider.GetRequiredService<ISqlSugarClient>();
|
||||
// TODO: 在此编写具体的消息处理逻辑
|
||||
try
|
||||
{
|
||||
var data = System.Text.Json.JsonSerializer.Deserialize<QuestionData>(message);
|
||||
|
||||
|
||||
|
||||
client.Ado.CommitTran();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
client.Ado.RollbackTran();
|
||||
logger.LogError(ex.Message + ex.StackTrace);
|
||||
}
|
||||
await Task.CompletedTask;
|
||||
}
|
||||
|
||||
public Task OnErrorAsync(byte[] message, Exception exception)
|
||||
public Task OnErrorAsync(byte[] body, Exception exception)
|
||||
{
|
||||
var body = Encoding.UTF8.GetString(message);
|
||||
_logger.LogError(exception, "处理期刊任务消息失败: {Message}", body);
|
||||
var message = Encoding.UTF8.GetString(body);
|
||||
logger.LogError(exception, "处理期刊任务消息失败: {Message}", message);
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class QuestionData
|
||||
{
|
||||
public long UserId { get; set; }
|
||||
public long JournalId { get; set; }
|
||||
public long PageId { get; set; }
|
||||
public string PageAnswerUrl { get; set; }
|
||||
public Question[] Questions { get; set; }
|
||||
public DateTime CreatedTime { get; set; }
|
||||
}
|
||||
|
||||
public class Question
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public string Url { get; set; }
|
||||
public string[] AnswerUrl { get; set; }
|
||||
public DateTime AnswerStartTime { get; set; }
|
||||
public DateTime AnswerEndTime { get; set; }
|
||||
public int AnswerTime { get; set; }
|
||||
public int BreakCount { get; set; }
|
||||
public List<BreakTime> BreakTimes { get; set; }
|
||||
}
|
||||
public class BreakTime
|
||||
{
|
||||
public DateTime Time { get; set; }
|
||||
public long WaitTime { get; set; }
|
||||
}
|
||||
Reference in New Issue
Block a user