namespace WebApi.Controllers; /// /// 账单导入控制器 /// [ApiController] [Route("api/[controller]/[action]")] public class BillImportController( ILogger logger, IImportService importService ) : ControllerBase { /// /// 上传账单文件 /// /// 账单文件 /// 账单类型(Alipay | WeChat) /// [HttpPost] public async Task> UploadFile( [FromForm] IFormFile file, [FromForm] string type ) { try { // 验证参数 if (file.Length == 0) { return BaseResponse.Fail("请选择要上传的文件"); } if (string.IsNullOrWhiteSpace(type) || (type != "Alipay" && type != "WeChat")) { return BaseResponse.Fail("账单类型参数错误,必须是 Alipay 或 WeChat"); } // 验证文件类型 var allowedExtensions = new[] { ".csv", ".xlsx", ".xls" }; var fileExtension = Path.GetExtension(file.FileName).ToLowerInvariant(); if (!allowedExtensions.Contains(fileExtension)) { return BaseResponse.Fail("只支持 CSV 或 Excel 文件格式"); } // 验证文件大小(10MB限制) const long maxFileSize = 10 * 1024 * 1024; if (file.Length > maxFileSize) { return BaseResponse.Fail("文件大小不能超过 10MB"); } // 生成唯一文件名 var fileName = $"{type}_{DateTime.Now:yyyyMMddHHmmss}_{Guid.NewGuid():N}{fileExtension}"; // 保存文件 var ok = false; var message = string.Empty; await using (var stream = new MemoryStream()) { await file.CopyToAsync(stream); if (type == "Alipay") { (ok, message) = await importService.ImportAlipayAsync(stream, fileExtension); } else if (type == "WeChat") { (ok, message) = await importService.ImportWeChatAsync(stream, fileExtension); } } return new BaseResponse { Success = ok, Message = message }; } catch (Exception ex) { logger.LogError(ex, "文件上传失败,类型: {Type}", type); return BaseResponse.Fail($"文件上传失败: {ex.Message}"); } } }