first commit
This commit is contained in:
@@ -0,0 +1,41 @@
|
||||
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, '识别失败,请重试');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user