diff --git a/WebApi/Controllers/AuthController.cs b/WebApi/Controllers/AuthController.cs index e6578e4..1bdacf5 100644 --- a/WebApi/Controllers/AuthController.cs +++ b/WebApi/Controllers/AuthController.cs @@ -36,11 +36,7 @@ public class AuthController : ControllerBase if (string.IsNullOrEmpty(request.Password) || request.Password != _authSettings.Password) { _logger.LogWarning("登录失败: 密码错误"); - return new BaseResponse - { - Success = false, - Message = "密码错误" - }; + return "密码错误".Fail(); } // 生成JWT Token @@ -49,15 +45,11 @@ public class AuthController : ControllerBase _logger.LogInformation("用户登录成功"); - return new BaseResponse + return new LoginResponse { - Success = true, - Data = new LoginResponse - { - Token = token, - ExpiresAt = expiresAt - } - }; + Token = token, + ExpiresAt = expiresAt + }.Ok(); } private string GenerateJwtToken() diff --git a/WebApi/Controllers/BillImportController.cs b/WebApi/Controllers/BillImportController.cs index 86f94b9..4adf0fb 100644 --- a/WebApi/Controllers/BillImportController.cs +++ b/WebApi/Controllers/BillImportController.cs @@ -17,7 +17,7 @@ public class BillImportController( /// 账单类型(Alipay | WeChat) /// [HttpPost] - public async Task> UploadFile( + public async Task UploadFile( [FromForm] IFormFile file, [FromForm] string type ) @@ -27,12 +27,12 @@ public class BillImportController( // 验证参数 if (file.Length == 0) { - return BaseResponse.Fail("请选择要上传的文件"); + return "请选择要上传的文件".Fail(); } if (string.IsNullOrWhiteSpace(type) || (type != "Alipay" && type != "WeChat")) { - return BaseResponse.Fail("账单类型参数错误,必须是 Alipay 或 WeChat"); + return "账单类型参数错误,必须是 Alipay 或 WeChat".Fail(); } // 验证文件类型 @@ -40,14 +40,14 @@ public class BillImportController( var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant(); if (!allowedExtensions.Contains(fileExtension)) { - return BaseResponse.Fail("只支持 CSV 或 Excel 文件格式"); + return "只支持 CSV 或 Excel 文件格式".Fail(); } // 验证文件大小(10MB限制) const long maxFileSize = 10 * 1024 * 1024; if (file.Length > maxFileSize) { - return BaseResponse.Fail("文件大小不能超过 10MB"); + return "文件大小不能超过 10MB".Fail(); } // 生成唯一文件名 @@ -69,16 +69,12 @@ public class BillImportController( } } - return new BaseResponse - { - Success = ok, - Message = message - }; + return message.Ok(); } catch (Exception ex) { logger.LogError(ex, "文件上传失败,类型: {Type}", type); - return BaseResponse.Fail($"文件上传失败: {ex.Message}"); + return $"文件上传失败: {ex.Message}".Fail(); } } } diff --git a/WebApi/Controllers/Dto/BaseResponse.cs b/WebApi/Controllers/Dto/BaseResponse.cs index ab47912..b0fae8c 100644 --- a/WebApi/Controllers/Dto/BaseResponse.cs +++ b/WebApi/Controllers/Dto/BaseResponse.cs @@ -1,5 +1,54 @@ namespace WebApi.Controllers.Dto; +public static class BaseResponseExtensions +{ + public static BaseResponse Ok(this T response) + { + return new BaseResponse + { + Success = true, + Data = response + }; + } + + public static BaseResponse Ok(this T response, string message) + { + return new BaseResponse + { + Success = true, + Data = response, + Message = message + }; + } + + public static BaseResponse Ok(this string message) + { + return new BaseResponse + { + Success = true, + Message = message + }; + } + + public static BaseResponse Fail(this string message) + { + return new BaseResponse + { + Success = false, + Message = message + }; + } + + public static BaseResponse Fail(this string message) + { + return new BaseResponse + { + Success = false, + Message = message + }; + } +} + public class BaseResponse { /// @@ -28,6 +77,15 @@ public class BaseResponse Success = true }; } + + public static BaseResponse Done(string message) + { + return new BaseResponse + { + Success = true, + Message = message + }; + } } public class BaseResponse : BaseResponse diff --git a/WebApi/Controllers/EmailMessageController.cs b/WebApi/Controllers/EmailMessageController.cs index 481adc4..9ccafb5 100644 --- a/WebApi/Controllers/EmailMessageController.cs +++ b/WebApi/Controllers/EmailMessageController.cs @@ -61,23 +61,19 @@ public class EmailMessageController( var email = await emailRepository.GetByIdAsync(id); if (email == null) { - return BaseResponse.Fail("邮件不存在"); + return "邮件不存在".Fail(); } // 获取账单数量 var transactionCount = await transactionRepository.GetCountByEmailIdAsync(id); var emailDto = EmailMessageDto.FromEntity(email, transactionCount); - return new BaseResponse - { - Success = true, - Data = emailDto - }; + return emailDto.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取邮件详情失败,邮件ID: {EmailId}", id); - return BaseResponse.Fail($"获取邮件详情失败: {ex.Message}"); + return $"获取邮件详情失败: {ex.Message}".Fail(); } } @@ -88,20 +84,17 @@ public class EmailMessageController( var success = await emailRepository.DeleteAsync(id); if (success) { - return new BaseResponse - { - Success = true - }; + return BaseResponse.Done(); } else { - return BaseResponse.Fail("删除邮件失败,邮件不存在"); + return "删除邮件失败,邮件不存在".Fail(); } } catch (Exception ex) { logger.LogError(ex, "删除邮件失败,邮件ID: {EmailId}", id); - return BaseResponse.Fail($"删除邮件失败: {ex.Message}"); + return $"删除邮件失败: {ex.Message}".Fail(); } } @@ -116,26 +109,23 @@ public class EmailMessageController( var email = await emailRepository.GetByIdAsync(id); if (email == null) { - return BaseResponse.Fail("邮件不存在"); + return "邮件不存在".Fail(); } var success = await emailHandleService.RefreshTransactionRecordsAsync(id); if (success) { - return new BaseResponse - { - Success = true - }; + return BaseResponse.Done(); } else { - return BaseResponse.Fail("重新分析失败"); + return "重新分析失败".Fail(); } } catch (Exception ex) { logger.LogError(ex, "重新分析邮件失败,邮件ID: {EmailId}", id); - return BaseResponse.Fail($"重新分析失败: {ex.Message}"); + return $"重新分析失败: {ex.Message}".Fail(); } } @@ -148,16 +138,12 @@ public class EmailMessageController( try { await emailBackgroundService.SyncEmailsAsync(); - return new BaseResponse - { - Success = true, - Message = "同步成功" - }; + return "邮件同步成功".Ok(); } catch (Exception ex) { logger.LogError(ex, "同步邮件失败"); - return BaseResponse.Fail($"同步邮件失败: {ex.Message}"); + return $"同步邮件失败: {ex.Message}".Fail(); } } } diff --git a/WebApi/Controllers/JobController.cs b/WebApi/Controllers/JobController.cs deleted file mode 100644 index e34f949..0000000 --- a/WebApi/Controllers/JobController.cs +++ /dev/null @@ -1,174 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Quartz; - -namespace WebApi.Controllers; - -/// -/// 定时任务管理控制器 -/// -[ApiController] -[Route("api/[controller]")] -public class JobController( - ISchedulerFactory schedulerFactory, - ILogger logger) : ControllerBase -{ - /// - /// 手动触发邮件同步任务 - /// - [HttpPost("sync-email")] - [Authorize] - public async Task TriggerEmailSync() - { - try - { - var scheduler = await schedulerFactory.GetScheduler(); - var jobKey = new JobKey("EmailSyncJob"); - - // 立即触发任务 - await scheduler.TriggerJob(jobKey); - - logger.LogInformation("手动触发邮件同步任务成功"); - return Ok(new { message = "邮件同步任务已触发" }); - } - catch (Exception ex) - { - logger.LogError(ex, "触发邮件同步任务失败"); - return StatusCode(500, new { message = "触发任务失败", error = ex.Message }); - } - } - - /// - /// 手动触发周期性账单任务 - /// - [HttpPost("periodic-bill")] - [Authorize] - public async Task TriggerPeriodicBill() - { - try - { - var scheduler = await schedulerFactory.GetScheduler(); - var jobKey = new JobKey("PeriodicBillJob"); - - // 立即触发任务 - await scheduler.TriggerJob(jobKey); - - logger.LogInformation("手动触发周期性账单任务成功"); - return Ok(new { message = "周期性账单任务已触发" }); - } - catch (Exception ex) - { - logger.LogError(ex, "触发周期性账单任务失败"); - return StatusCode(500, new { message = "触发任务失败", error = ex.Message }); - } - } - - /// - /// 获取所有任务的状态 - /// - [HttpGet("status")] - [Authorize] - public async Task GetJobStatus() - { - try - { - var scheduler = await schedulerFactory.GetScheduler(); - var jobGroups = await scheduler.GetJobGroupNames(); - var jobStatuses = new List(); - - foreach (var group in jobGroups) - { - var jobKeys = await scheduler.GetJobKeys(Quartz.Impl.Matchers.GroupMatcher.GroupEquals(group)); - - foreach (var jobKey in jobKeys) - { - var triggers = await scheduler.GetTriggersOfJob(jobKey); - var jobDetail = await scheduler.GetJobDetail(jobKey); - - foreach (var trigger in triggers) - { - var triggerState = await scheduler.GetTriggerState(trigger.Key); - var nextFireTime = trigger.GetNextFireTimeUtc(); - var previousFireTime = trigger.GetPreviousFireTimeUtc(); - - jobStatuses.Add(new - { - jobName = jobKey.Name, - jobGroup = jobKey.Group, - triggerName = trigger.Key.Name, - triggerState = triggerState.ToString(), - nextFireTime = nextFireTime?.LocalDateTime, - previousFireTime = previousFireTime?.LocalDateTime, - description = trigger.Description, - jobType = jobDetail?.JobType.Name - }); - } - } - } - - return Ok(jobStatuses); - } - catch (Exception ex) - { - logger.LogError(ex, "获取任务状态失败"); - return StatusCode(500, new { message = "获取任务状态失败", error = ex.Message }); - } - } - - /// - /// 暂停指定任务 - /// - [HttpPost("pause/{jobName}")] - [Authorize] - public async Task PauseJob(string jobName) - { - try - { - var scheduler = await schedulerFactory.GetScheduler(); - var jobKey = new JobKey(jobName); - - if (!await scheduler.CheckExists(jobKey)) - { - return NotFound(new { message = $"任务 {jobName} 不存在" }); - } - - await scheduler.PauseJob(jobKey); - logger.LogInformation("任务 {JobName} 已暂停", jobName); - - return Ok(new { message = $"任务 {jobName} 已暂停" }); - } - catch (Exception ex) - { - logger.LogError(ex, "暂停任务 {JobName} 失败", jobName); - return StatusCode(500, new { message = "暂停任务失败", error = ex.Message }); - } - } - - /// - /// 恢复指定任务 - /// - [HttpPost("resume/{jobName}")] - [Authorize] - public async Task ResumeJob(string jobName) - { - try - { - var scheduler = await schedulerFactory.GetScheduler(); - var jobKey = new JobKey(jobName); - - if (!await scheduler.CheckExists(jobKey)) - { - return NotFound(new { message = $"任务 {jobName} 不存在" }); - } - - await scheduler.ResumeJob(jobKey); - logger.LogInformation("任务 {JobName} 已恢复", jobName); - - return Ok(new { message = $"任务 {jobName} 已恢复" }); - } - catch (Exception ex) - { - logger.LogError(ex, "恢复任务 {JobName} 失败", jobName); - return StatusCode(500, new { message = "恢复任务失败", error = ex.Message }); - } - } -} diff --git a/WebApi/Controllers/LogController.cs b/WebApi/Controllers/LogController.cs index 1639c44..0fb21b6 100644 --- a/WebApi/Controllers/LogController.cs +++ b/WebApi/Controllers/LogController.cs @@ -22,13 +22,7 @@ public class LogController(ILogger logger) : ControllerBase var logDirectory = Path.Combine(Directory.GetCurrentDirectory(), "logs"); if (!Directory.Exists(logDirectory)) { - return new PagedResponse - { - Success = true, - Data = [], - Total = 0, - Message = "日志目录不存在" - }; + return PagedResponse.Fail("日志目录不存在"); } // 确定要读取的日志文件 @@ -47,43 +41,25 @@ public class LogController(ILogger logger) : ControllerBase // 检查文件是否存在 if (!System.IO.File.Exists(logFilePath)) { - return new PagedResponse - { - Success = true, - Data = [], - Total = 0, - Message = "日志文件不存在" - }; + return PagedResponse.Done([], 0); } // 流式读取日志(边读边过滤,满足条件后停止) - var (logEntries, total) = await ReadLogsStreamAsync( - logFilePath, - pageIndex, - pageSize, - searchKeyword, + var (logEntries, total) = await ReadLogsAsync( + logFilePath, + pageIndex, + pageSize, + searchKeyword, logLevel); var pagedData = logEntries; - return new PagedResponse - { - Success = true, - Data = pagedData.ToArray(), - Total = total, - Message = "获取日志成功" - }; + return PagedResponse.Done(pagedData.ToArray(), total); } catch (Exception ex) { logger.LogError(ex, "获取日志失败"); - return new PagedResponse - { - Success = false, - Data = [], - Total = 0, - Message = $"获取日志失败: {ex.Message}" - }; + return PagedResponse.Fail($"获取日志失败: {ex.Message}"); } } @@ -91,14 +67,14 @@ public class LogController(ILogger logger) : ControllerBase /// 获取可用的日志日期列表 /// [HttpGet] - public IActionResult GetAvailableDates() + public BaseResponse GetAvailableDates() { try { var logDirectory = Path.Combine(Directory.GetCurrentDirectory(), "logs"); if (!Directory.Exists(logDirectory)) { - return Ok(new { success = true, data = new List() }); + return ((string[])[]).Ok(); } var logFiles = Directory.GetFiles(logDirectory, "log-*.txt"); @@ -108,12 +84,12 @@ public class LogController(ILogger logger) : ControllerBase .OrderByDescending(d => d) .ToList(); - return Ok(new { success = true, data = dates }); + return dates.ToArray().Ok(); } catch (Exception ex) { logger.LogError(ex, "获取日志日期列表失败"); - return Ok(new { success = false, message = $"获取日志日期列表失败: {ex.Message}" }); + return $"获取日志日期列表失败: {ex.Message}".Fail(); } } @@ -124,7 +100,7 @@ public class LogController(ILogger logger) : ControllerBase { var mergedLines = new List(); var currentLog = new StringBuilder(); - + // 日志行开始的正则表达式 var logStartPattern = new System.Text.RegularExpressions.Regex( @"^\[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} [+-]\d{2}:\d{2}\]" @@ -206,19 +182,17 @@ public class LogController(ILogger logger) : ControllerBase } /// - /// 流式读取日志(真正的流式:只读取需要的数据,满足后立即停止) + /// 读取日志 /// - private async Task<(List entries, int total)> ReadLogsStreamAsync( + private async Task<(List entries, int total)> ReadLogsAsync( string path, int pageIndex, int pageSize, string? searchKeyword, string? logLevel) { - // 简化:一次性读取所有行,合并多行日志,过滤并在内存中分页 var allLines = await ReadAllLinesAsync(path); - // 合并多行日志为独立条目 var merged = MergeMultiLineLog(allLines); var parsed = new List(); @@ -231,7 +205,6 @@ public class LogController(ILogger logger) : ControllerBase } } - // 倒序(最新在前) parsed.Reverse(); var total = parsed.Count; @@ -267,11 +240,11 @@ public class LogController(ILogger logger) : ControllerBase private async Task ReadAllLinesAsync(string path) { var lines = new List(); - + using (var fileStream = new FileStream( - path, - FileMode.Open, - FileAccess.Read, + path, + FileMode.Open, + FileAccess.Read, FileShare.ReadWrite)) using (var streamReader = new StreamReader(fileStream)) { @@ -281,7 +254,7 @@ public class LogController(ILogger logger) : ControllerBase lines.Add(line); } } - + return lines.ToArray(); } } diff --git a/WebApi/Controllers/MessageRecordController.cs b/WebApi/Controllers/MessageRecordController.cs index 75c16cc..07142ad 100644 --- a/WebApi/Controllers/MessageRecordController.cs +++ b/WebApi/Controllers/MessageRecordController.cs @@ -34,12 +34,12 @@ public class MessageRecordController(IMessageRecordService messageService, ILogg try { var count = await messageService.GetUnreadCountAsync(); - return BaseResponse.Done(count); + return count.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取未读消息数量失败"); - return BaseResponse.Fail($"获取未读消息数量失败: {ex.Message}"); + return $"获取未读消息数量失败: {ex.Message}".Fail(); } } @@ -52,12 +52,12 @@ public class MessageRecordController(IMessageRecordService messageService, ILogg try { var result = await messageService.MarkAsReadAsync(id); - return BaseResponse.Done(result); + return result.Ok(); } catch (Exception ex) { logger.LogError(ex, "标记消息已读失败,ID: {Id}", id); - return BaseResponse.Fail($"标记消息已读失败: {ex.Message}"); + return $"标记消息已读失败: {ex.Message}".Fail(); } } @@ -70,12 +70,12 @@ public class MessageRecordController(IMessageRecordService messageService, ILogg try { var result = await messageService.MarkAllAsReadAsync(); - return BaseResponse.Done(result); + return result.Ok(); } catch (Exception ex) { logger.LogError(ex, "全部标记已读失败"); - return BaseResponse.Fail($"全部标记已读失败: {ex.Message}"); + return $"全部标记已读失败: {ex.Message}".Fail(); } } @@ -88,12 +88,12 @@ public class MessageRecordController(IMessageRecordService messageService, ILogg try { var result = await messageService.DeleteAsync(id); - return BaseResponse.Done(result); + return result.Ok(); } catch (Exception ex) { logger.LogError(ex, "删除消息失败,ID: {Id}", id); - return BaseResponse.Fail($"删除消息失败: {ex.Message}"); + return $"删除消息失败: {ex.Message}".Fail(); } } @@ -106,12 +106,12 @@ public class MessageRecordController(IMessageRecordService messageService, ILogg try { var result = await messageService.AddAsync(message); - return BaseResponse.Done(result); + return result.Ok(); } catch (Exception ex) { logger.LogError(ex, "新增消息失败"); - return BaseResponse.Fail($"新增消息失败: {ex.Message}"); + return $"新增消息失败: {ex.Message}".Fail(); } } } diff --git a/WebApi/Controllers/NotificationController.cs b/WebApi/Controllers/NotificationController.cs index 4c719f5..a5ff1b7 100644 --- a/WebApi/Controllers/NotificationController.cs +++ b/WebApi/Controllers/NotificationController.cs @@ -10,11 +10,11 @@ public class NotificationController(INotificationService notificationService) : try { var key = await notificationService.GetVapidPublicKeyAsync(); - return BaseResponse.Done(key); + return key.Ok(); } catch (Exception ex) { - return BaseResponse.Fail(ex.Message); + return ex.Message.Fail(); } } @@ -27,7 +27,7 @@ public class NotificationController(INotificationService notificationService) : } catch (Exception ex) { - return BaseResponse.Fail(ex.Message); + return ex.Message.Fail(); } } @@ -40,7 +40,7 @@ public class NotificationController(INotificationService notificationService) : } catch (Exception ex) { - return BaseResponse.Fail(ex.Message); + return ex.Message.Fail(); } } } diff --git a/WebApi/Controllers/TransactionCategoryController.cs b/WebApi/Controllers/TransactionCategoryController.cs index 19a9345..2bedc18 100644 --- a/WebApi/Controllers/TransactionCategoryController.cs +++ b/WebApi/Controllers/TransactionCategoryController.cs @@ -26,16 +26,12 @@ public class TransactionCategoryController( categories = (await categoryRepository.GetAllAsync()).ToList(); } - return new BaseResponse> - { - Success = true, - Data = categories - }; + return categories.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取分类列表失败"); - return BaseResponse>.Fail($"获取分类列表失败: {ex.Message}"); + return $"获取分类列表失败: {ex.Message}".Fail>(); } } @@ -50,19 +46,15 @@ public class TransactionCategoryController( var category = await categoryRepository.GetByIdAsync(id); if (category == null) { - return BaseResponse.Fail("分类不存在"); + return "分类不存在".Fail(); } - return new BaseResponse - { - Success = true, - Data = category - }; + return category.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取分类详情失败, Id: {Id}", id); - return BaseResponse.Fail($"获取分类详情失败: {ex.Message}"); + return $"获取分类详情失败: {ex.Message}".Fail(); } } @@ -78,7 +70,7 @@ public class TransactionCategoryController( var existing = await categoryRepository.GetByNameAndTypeAsync(dto.Name, dto.Type); if (existing != null) { - return BaseResponse.Fail("已存在相同名称的分类"); + return "已存在相同名称的分类".Fail(); } var category = new TransactionCategory @@ -90,21 +82,17 @@ public class TransactionCategoryController( var result = await categoryRepository.AddAsync(category); if (result) { - return new BaseResponse - { - Success = true, - Data = category.Id - }; + return category.Id.Ok(); } else { - return BaseResponse.Fail("创建分类失败"); + return "创建分类失败".Fail(); } } catch (Exception ex) { logger.LogError(ex, "创建分类失败, Dto: {@Dto}", dto); - return BaseResponse.Fail($"创建分类失败: {ex.Message}"); + return $"创建分类失败: {ex.Message}".Fail(); } } @@ -119,7 +107,7 @@ public class TransactionCategoryController( var category = await categoryRepository.GetByIdAsync(dto.Id); if (category == null) { - return BaseResponse.Fail("分类不存在"); + return "分类不存在".Fail(); } // 如果修改了名称,检查同名 @@ -128,7 +116,7 @@ public class TransactionCategoryController( var existing = await categoryRepository.GetByNameAndTypeAsync(dto.Name, category.Type); if (existing != null && existing.Id != dto.Id) { - return BaseResponse.Fail("已存在相同名称的分类"); + return "已存在相同名称的分类".Fail(); } // 同步更新交易记录中的分类名称 @@ -141,17 +129,17 @@ public class TransactionCategoryController( var success = await categoryRepository.UpdateAsync(category); if (success) { - return new BaseResponse { Success = true }; + return "更新分类成功".Ok(); } else { - return BaseResponse.Fail("更新分类失败"); + return "更新分类失败".Fail(); } } catch (Exception ex) { logger.LogError(ex, "更新分类失败, Dto: {@Dto}", dto); - return BaseResponse.Fail($"更新分类失败: {ex.Message}"); + return $"更新分类失败: {ex.Message}".Fail(); } } @@ -167,23 +155,23 @@ public class TransactionCategoryController( var inUse = await categoryRepository.IsCategoryInUseAsync(id); if (inUse) { - return BaseResponse.Fail("该分类已被使用,无法删除"); + return "该分类已被使用,无法删除".Fail(); } var success = await categoryRepository.DeleteAsync(id); if (success) { - return new BaseResponse { Success = true }; + return BaseResponse.Done(); } else { - return BaseResponse.Fail("删除分类失败,分类不存在"); + return "删除分类失败,分类不存在".Fail(); } } catch (Exception ex) { logger.LogError(ex, "删除分类失败, Id: {Id}", id); - return BaseResponse.Fail($"删除分类失败: {ex.Message}"); + return $"删除分类失败: {ex.Message}".Fail(); } } @@ -204,21 +192,17 @@ public class TransactionCategoryController( var result = await categoryRepository.AddRangeAsync(categories); if (result) { - return new BaseResponse - { - Success = true, - Data = categories.Count - }; + return categories.Count.Ok(); } else { - return BaseResponse.Fail("批量创建分类失败"); + return "批量创建分类失败".Fail(); } } catch (Exception ex) { logger.LogError(ex, "批量创建分类失败, Count: {Count}", dtoList.Count); - return BaseResponse.Fail($"批量创建分类失败: {ex.Message}"); + return $"批量创建分类失败: {ex.Message}".Fail(); } } } diff --git a/WebApi/Controllers/TransactionPeriodicController.cs b/WebApi/Controllers/TransactionPeriodicController.cs index c7a135a..5fdad73 100644 --- a/WebApi/Controllers/TransactionPeriodicController.cs +++ b/WebApi/Controllers/TransactionPeriodicController.cs @@ -53,19 +53,15 @@ public class TransactionPeriodicController( var periodic = await periodicRepository.GetByIdAsync(id); if (periodic == null) { - return BaseResponse.Fail("周期性账单不存在"); + return "周期性账单不存在".Fail(); } - return new BaseResponse - { - Success = true, - Data = periodic - }; + return periodic.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取周期性账单详情失败,ID: {Id}", id); - return BaseResponse.Fail($"获取详情失败: {ex.Message}"); + return $"获取详情失败: {ex.Message}".Fail(); } } @@ -94,20 +90,15 @@ public class TransactionPeriodicController( var success = await periodicRepository.AddAsync(periodic); if (!success) { - return BaseResponse.Fail("创建周期性账单失败"); + return "创建周期性账单失败".Fail(); } - return new BaseResponse - { - Success = true, - Data = periodic, - Message = "创建成功" - }; + return periodic.Ok("创建成功"); } catch (Exception ex) { logger.LogError(ex, "创建周期性账单失败"); - return BaseResponse.Fail($"创建失败: {ex.Message}"); + return $"创建失败: {ex.Message}".Fail(); } } @@ -115,14 +106,14 @@ public class TransactionPeriodicController( /// 更新周期性账单 /// [HttpPost] - public async Task> UpdateAsync([FromBody] UpdatePeriodicRequest request) + public async Task UpdateAsync([FromBody] UpdatePeriodicRequest request) { try { var periodic = await periodicRepository.GetByIdAsync(request.Id); if (periodic == null) { - return BaseResponse.Fail("周期性账单不存在"); + return "周期性账单不存在".Fail(); } periodic.PeriodicType = request.PeriodicType; @@ -140,19 +131,15 @@ public class TransactionPeriodicController( var success = await periodicRepository.UpdateAsync(periodic); if (!success) { - return BaseResponse.Fail("更新周期性账单失败"); + return "更新周期性账单失败".Fail(); } - return new BaseResponse - { - Success = true, - Message = "更新成功" - }; + return "更新成功".Ok(); } catch (Exception ex) { logger.LogError(ex, "更新周期性账单失败,ID: {Id}", request.Id); - return BaseResponse.Fail($"更新失败: {ex.Message}"); + return $"更新失败: {ex.Message}".Fail(); } } @@ -160,26 +147,22 @@ public class TransactionPeriodicController( /// 删除周期性账单 /// [HttpPost] - public async Task> DeleteByIdAsync([FromQuery] long id) + public async Task DeleteByIdAsync([FromQuery] long id) { try { var success = await periodicRepository.DeleteAsync(id); if (!success) { - return BaseResponse.Fail("删除周期性账单失败"); + return "删除周期性账单失败".Fail(); } - return new BaseResponse - { - Success = true, - Message = "删除成功" - }; + return "删除成功".Ok(); } catch (Exception ex) { logger.LogError(ex, "删除周期性账单失败,ID: {Id}", id); - return BaseResponse.Fail($"删除失败: {ex.Message}"); + return $"删除失败: {ex.Message}".Fail(); } } @@ -187,14 +170,14 @@ public class TransactionPeriodicController( /// 启用/禁用周期性账单 /// [HttpPost] - public async Task> ToggleEnabledAsync([FromQuery] long id, [FromQuery] bool enabled) + public async Task ToggleEnabledAsync([FromQuery] long id, [FromQuery] bool enabled) { try { var periodic = await periodicRepository.GetByIdAsync(id); if (periodic == null) { - return BaseResponse.Fail("周期性账单不存在"); + return "周期性账单不存在".Fail(); } periodic.IsEnabled = enabled; @@ -203,19 +186,15 @@ public class TransactionPeriodicController( var success = await periodicRepository.UpdateAsync(periodic); if (!success) { - return BaseResponse.Fail("操作失败"); + return "操作失败".Fail(); } - return new BaseResponse - { - Success = true, - Message = enabled ? "已启用" : "已禁用" - }; + return (enabled ? "已启用" : "已禁用").Ok(); } catch (Exception ex) { logger.LogError(ex, "启用/禁用周期性账单失败,ID: {Id}", id); - return BaseResponse.Fail($"操作失败: {ex.Message}"); + return $"操作失败: {ex.Message}".Fail(); } } } diff --git a/WebApi/Controllers/TransactionRecordController.cs b/WebApi/Controllers/TransactionRecordController.cs index 45546a3..94234de 100644 --- a/WebApi/Controllers/TransactionRecordController.cs +++ b/WebApi/Controllers/TransactionRecordController.cs @@ -72,19 +72,15 @@ public class TransactionRecordController( var transaction = await transactionRepository.GetByIdAsync(id); if (transaction == null) { - return BaseResponse.Fail("交易记录不存在"); + return "交易记录不存在".Fail(); } - return new BaseResponse - { - Success = true, - Data = transaction - }; + return transaction.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取交易记录详情失败,交易ID: {TransactionId}", id); - return BaseResponse.Fail($"获取交易记录详情失败: {ex.Message}"); + return $"获取交易记录详情失败: {ex.Message}".Fail(); } } @@ -97,16 +93,12 @@ public class TransactionRecordController( try { var transactions = await transactionRepository.GetByEmailIdAsync(emailId); - return new BaseResponse> - { - Success = true, - Data = transactions - }; + return transactions.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取邮件交易记录失败,邮件ID: {EmailId}", emailId); - return BaseResponse>.Fail($"获取邮件交易记录失败: {ex.Message}"); + return $"获取邮件交易记录失败: {ex.Message}".Fail>(); } } @@ -121,7 +113,7 @@ public class TransactionRecordController( // 解析日期字符串 if (!DateTime.TryParse(dto.OccurredAt, out var occurredAt)) { - return BaseResponse.Fail("交易时间格式不正确"); + return "交易时间格式不正确".Fail(); } var transaction = new TransactionRecord @@ -140,20 +132,17 @@ public class TransactionRecordController( var result = await transactionRepository.AddAsync(transaction); if (result) { - return new BaseResponse - { - Success = true - }; + return BaseResponse.Done(); } else { - return BaseResponse.Fail("创建交易记录失败"); + return "创建交易记录失败".Fail(); } } catch (Exception ex) { logger.LogError(ex, "创建交易记录失败,交易信息: {@TransactionDto}", dto); - return BaseResponse.Fail($"创建交易记录失败: {ex.Message}"); + return $"创建交易记录失败: {ex.Message}".Fail(); } } @@ -168,7 +157,7 @@ public class TransactionRecordController( var transaction = await transactionRepository.GetByIdAsync(dto.Id); if (transaction == null) { - return BaseResponse.Fail("交易记录不存在"); + return "交易记录不存在".Fail(); } // 更新可编辑字段 @@ -181,20 +170,17 @@ public class TransactionRecordController( var success = await transactionRepository.UpdateAsync(transaction); if (success) { - return new BaseResponse - { - Success = true - }; + return BaseResponse.Done(); } else { - return BaseResponse.Fail("更新交易记录失败"); + return "更新交易记录失败".Fail(); } } catch (Exception ex) { logger.LogError(ex, "更新交易记录失败,交易ID: {TransactionId}, 交易信息: {@TransactionDto}", dto.Id, dto); - return BaseResponse.Fail($"更新交易记录失败: {ex.Message}"); + return $"更新交易记录失败: {ex.Message}".Fail(); } } @@ -209,20 +195,17 @@ public class TransactionRecordController( var success = await transactionRepository.DeleteAsync(id); if (success) { - return new BaseResponse - { - Success = true - }; + return BaseResponse.Done(); } else { - return BaseResponse.Fail("删除交易记录失败,记录不存在"); + return "删除交易记录失败,记录不存在".Fail(); } } catch (Exception ex) { logger.LogError(ex, "删除交易记录失败,交易ID: {TransactionId}", id); - return BaseResponse.Fail($"删除交易记录失败: {ex.Message}"); + return $"删除交易记录失败: {ex.Message}".Fail(); } } @@ -240,16 +223,12 @@ public class TransactionRecordController( var statistics = await transactionRepository.GetDailyStatisticsAsync(year, month); var result = statistics.Select(s => new DailyStatisticsDto(s.Key, s.Value.count, s.Value.amount)).ToList(); - return new BaseResponse> - { - Success = true, - Data = result - }; + return result.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取日历统计数据失败,年份: {Year}, 月份: {Month}", year, month); - return BaseResponse>.Fail($"获取日历统计数据失败: {ex.Message}"); + return $"获取日历统计数据失败: {ex.Message}".Fail>(); } } @@ -265,16 +244,12 @@ public class TransactionRecordController( try { var statistics = await transactionRepository.GetMonthlyStatisticsAsync(year, month); - return new BaseResponse - { - Success = true, - Data = statistics - }; + return statistics.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取月度统计数据失败,年份: {Year}, 月份: {Month}", year, month); - return BaseResponse.Fail($"获取月度统计数据失败: {ex.Message}"); + return $"获取月度统计数据失败: {ex.Message}".Fail(); } } @@ -291,16 +266,12 @@ public class TransactionRecordController( try { var statistics = await transactionRepository.GetCategoryStatisticsAsync(year, month, type); - return new BaseResponse> - { - Success = true, - Data = statistics - }; + return statistics.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取分类统计数据失败,年份: {Year}, 月份: {Month}, 类型: {Type}", year, month, type); - return BaseResponse>.Fail($"获取分类统计数据失败: {ex.Message}"); + return $"获取分类统计数据失败: {ex.Message}".Fail>(); } } @@ -317,16 +288,12 @@ public class TransactionRecordController( try { var statistics = await transactionRepository.GetTrendStatisticsAsync(startYear, startMonth, monthCount); - return new BaseResponse> - { - Success = true, - Data = statistics - }; + return statistics.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取趋势统计数据失败,开始年份: {Year}, 开始月份: {Month}, 月份数: {Count}", startYear, startMonth, monthCount); - return BaseResponse>.Fail($"获取趋势统计数据失败: {ex.Message}"); + return $"获取趋势统计数据失败: {ex.Message}".Fail>(); } } @@ -361,7 +328,7 @@ public class TransactionRecordController( { if (!DateTime.TryParse(date, out var targetDate)) { - return BaseResponse>.Fail("日期格式不正确"); + return "日期格式不正确".Fail>(); } // 获取当天的开始和结束时间 @@ -370,16 +337,12 @@ public class TransactionRecordController( var records = await transactionRepository.GetByDateRangeAsync(startDate, endDate); - return new BaseResponse> - { - Success = true, - Data = records - }; + return records.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取指定日期的交易记录失败,日期: {Date}", date); - return BaseResponse>.Fail($"获取指定日期的交易记录失败: {ex.Message}"); + return $"获取指定日期的交易记录失败: {ex.Message}".Fail>(); } } @@ -392,16 +355,12 @@ public class TransactionRecordController( try { var count = await transactionRepository.GetUnclassifiedCountAsync(); - return new BaseResponse - { - Success = true, - Data = count - }; + return count.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取未分类账单数量失败"); - return BaseResponse.Fail($"获取未分类账单数量失败: {ex.Message}"); + return $"获取未分类账单数量失败: {ex.Message}".Fail(); } } @@ -414,16 +373,12 @@ public class TransactionRecordController( try { var records = await transactionRepository.GetUnclassifiedAsync(pageSize); - return new BaseResponse> - { - Success = true, - Data = records - }; + return records.Ok(); } catch (Exception ex) { logger.LogError(ex, "获取未分类账单列表失败"); - return BaseResponse>.Fail($"获取未分类账单列表失败: {ex.Message}"); + return $"获取未分类账单列表失败: {ex.Message}".Fail>(); } } @@ -487,16 +442,12 @@ public class TransactionRecordController( } } - return new BaseResponse - { - Success = true, - Message = $"批量更新完成,成功 {successCount} 条,失败 {failCount} 条" - }; + return $"批量更新完成,成功 {successCount} 条,失败 {failCount} 条".Ok(); } catch (Exception ex) { logger.LogError(ex, "批量更新分类失败"); - return BaseResponse.Fail($"批量更新分类失败: {ex.Message}"); + return $"批量更新分类失败: {ex.Message}".Fail(); } } @@ -534,17 +485,12 @@ public class TransactionRecordController( try { var count = await transactionRepository.BatchUpdateByReasonAsync(dto.Reason, dto.Type, dto.Classify); - return new BaseResponse - { - Success = true, - Data = count, - Message = $"成功更新 {count} 条记录" - }; + return count.Ok($"成功更新 {count} 条记录"); } catch (Exception ex) { logger.LogError(ex, "按摘要批量更新分类失败,摘要: {Reason}", dto.Reason); - return BaseResponse.Fail($"按摘要批量更新分类失败: {ex.Message}"); + return $"按摘要批量更新分类失败: {ex.Message}".Fail(); } } @@ -556,7 +502,7 @@ public class TransactionRecordController( { if (string.IsNullOrEmpty(request.Text)) { - return BaseResponse.Fail("请求参数缺失:text"); + return "请求参数缺失:text".Fail(); } try @@ -565,15 +511,15 @@ public class TransactionRecordController( if (result == null) { - return BaseResponse.Fail("AI解析失败"); + return "AI解析失败".Fail(); } - return BaseResponse.Done(result); + return result.Ok(); } catch (Exception ex) { logger.LogError(ex, "一句话录账解析失败,文本: {Text}", request.Text); - return BaseResponse.Fail("AI解析失败: " + ex.Message); + return ("AI解析失败: " + ex.Message).Fail(); } } @@ -588,17 +534,17 @@ public class TransactionRecordController( var current = await transactionRepository.GetByIdAsync(id); if (current == null) { - return BaseResponse.Done([]); + return ((TransactionRecord[])[]).Ok(); } var list = await transactionRepository.GetCandidatesForOffsetAsync(id, current.Amount, current.Type); - return BaseResponse.Done(list.ToArray()); + return list.ToArray().Ok(); } catch (Exception ex) { logger.LogError(ex, "获取抵账候选列表失败,交易ID: {TransactionId}", id); - return BaseResponse.Fail($"获取抵账候选列表失败: {ex.Message}"); + return $"获取抵账候选列表失败: {ex.Message}".Fail(); } }