import 'package:dio/dio.dart'; import '../core/api/api_client.dart'; import '../core/exceptions.dart'; import '../core/models/page_result.dart'; import '../models/finance.dart'; class FinanceRepository { final ApiClient _client; const FinanceRepository(this._client); Future> listRecords({ String? type, String? month, String? startDate, String? endDate, int? partnerId, int page = 1, int pageSize = 50, }) async { try { final params = { 'page': page, 'page_size': pageSize, if (type != null && type.isNotEmpty) 'type': type, if (month != null && month.isNotEmpty) 'month': month, if (startDate != null && startDate.isNotEmpty) 'start_date': startDate, if (endDate != null && endDate.isNotEmpty) 'end_date': endDate, if (partnerId != null) 'partner_id': partnerId, }; final resp = await _client.get('/finance/records', params: params); return PageResult.fromJson( resp.data as Map, FinanceRecord.fromJson, ); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '获取财务记录失败', statusCode: e.response?.statusCode, ); } } /// 按往来单位汇总未结清应收/应付(GET /finance/summary) Future> partnerSummary() async { try { final resp = await _client.get('/finance/summary'); final data = (resp.data as Map)['data']; return [ for (final row in (data as List? ?? const [])) PartnerFinanceSummary.fromJson(row as Map), ]; } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '获取往来汇总失败', statusCode: e.response?.statusCode, ); } } /// 近 N 个自然月收支趋势(GET /finance/trend):in=当月销售额、out=当月采购额。 Future> trend({int months = 6}) async { try { final resp = await _client.get('/finance/trend', params: {'months': months}); final data = (resp.data as Map)['data']; return [ for (final row in (data as List? ?? const [])) TrendPoint.fromJson(row as Map), ]; } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '获取收支趋势失败', statusCode: e.response?.statusCode, ); } } Future create(Map body) async { try { await _client.post('/finance/records', data: body); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '创建记录失败', statusCode: e.response?.statusCode, ); } } Future close(int id) async { try { await _client.put('/finance/records/$id/close'); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '操作失败', statusCode: e.response?.statusCode, ); } } Future closeByRef(String refType, int refId) async { try { await _client .put('/finance/records/close-by-ref?ref_type=$refType&ref_id=$refId'); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '结清失败', statusCode: e.response?.statusCode, ); } } }