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:
glz
2026-06-29 16:34:26 +08:00
parent 4579fefef9
commit bdaa6a0dc8
35 changed files with 693 additions and 364 deletions

View File

@ -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; }
}