42 lines
1.3 KiB
Dart
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, '识别失败,请重试');
|
|
}
|
|
}
|
|
}
|