Files
Aq-Accounting-Flutter/lib/api/ocr_api.dart
T
2026-09-21 17:37:53 +08:00

42 lines
1.3 KiB
Dart

import 'package:dio/dio.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../core/network/api_exception.dart';
import '../core/network/dio_client.dart';
import '../models/ocr_result.dart';
final ocrApiProvider = Provider<OcrApi>((ref) => OcrApi(ref.watch(dioProvider)));
class OcrApi {
final Dio _dio;
OcrApi(this._dio);
/// 上传图片识别账单,字段名固定为 file(与 uniApp upload 对齐)。
/// 后端可能返回裸数组或 {code, data:[...]},两种都兼容。
Future<List<OcrResult>> recognize(String filePath) async {
try {
final formData = FormData.fromMap({
'file': await MultipartFile.fromFile(filePath, filename: 'receipt.jpg'),
});
final res = await _dio.post('/ocr/recognize', data: formData);
final data = res.data;
List<dynamic> list;
if (data is List) {
list = data;
} else if (data is Map && data['data'] is List) {
list = data['data'] as List;
} else {
throw ApiException(-1, '未识别到账单信息');
}
return list
.whereType<Map<String, dynamic>>()
.map(OcrResult.fromJson)
.toList();
} on DioException catch (e) {
final err = e.error;
throw err is ApiException ? err : ApiException(-1, '识别失败,请重试');
}
}
}