import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/network/api_client.dart'; import '../../app.dart'; import '../../shared/models/pagination_model.dart'; import 'expense_apply_model.dart'; final expenseApplyApiProvider = Provider( (ref) => ExpenseApplyApi(ref.read(apiClientProvider)), ); // ═══ 参考数据模型(API 返回) ═══ class CostTypeItem { final String typeNo; final String typeName; final String accNo; final String accName; const CostTypeItem({required this.typeNo, required this.typeName, required this.accNo, required this.accName}); factory CostTypeItem.fromJson(Map json) => CostTypeItem( typeNo: json['typeNo'] as String? ?? '', typeName: json['typeName'] as String? ?? '', accNo: json['accNo'] as String? ?? '', accName: json['accName'] as String? ?? '', ); } class ProjectCodeItem { final String objNo; final String name; const ProjectCodeItem({required this.objNo, required this.name}); factory ProjectCodeItem.fromJson(Map json) => ProjectCodeItem( objNo: json['objNo'] as String? ?? '', name: json['name'] as String? ?? '', ); } class DepartmentItem { final String dep; final String name; const DepartmentItem({required this.dep, required this.name}); factory DepartmentItem.fromJson(Map json) => DepartmentItem( dep: json['dep'] as String? ?? '', name: json['name'] as String? ?? '', ); } class ExpenseApplyApi { final ApiClient _client; ExpenseApplyApi(this._client); /// 费用申请列表(分页) Future> fetchList({ String status = '', String keyword = '', String startDate = '', String endDate = '', String usr = '', int page = 1, int size = 20, }) async { final response = await _client.get>( '/OA/GetExpenseApplies', queryParameters: { 'status': status, 'keyword': keyword, 'startDate': startDate, 'endDate': endDate, 'usr': usr, 'page': page, 'size': size, }, ); return PaginatedData.fromJson(response.data!, ExpenseApplyModel.fromJson); } /// 费用申请详情(主表+明细) Future fetchDetail(String billNo) async { final response = await _client.get>( '/OA/GetExpenseApplyDetail', queryParameters: {'billNo': billNo}, ); return ExpenseApplyModel.fromJson(response.data!); } /// 费用类别字典 Future> getCostTypes({String keyword = '', String accNo = ''}) async { final response = await _client.get>( '/OA/GetCostTypes', queryParameters: {'keyword': keyword, 'accNo': accNo, 'page': 1, 'size': 100}, ); final list = (response.data?['list'] as List?) ?? []; return list.map((e) => CostTypeItem.fromJson(e as Map)).toList(); } /// 项目代号 Future> getProjectCodes({String keyword = '', String billDate = ''}) async { final response = await _client.get>( '/OA/GetProjectCodes', queryParameters: {'keyword': keyword, 'billDate': billDate, 'page': 1, 'size': 100}, ); final list = (response.data?['list'] as List?) ?? []; return list.map((e) => ProjectCodeItem.fromJson(e as Map)).toList(); } /// 部门 Future> getDepartments({String keyword = '', bool onlyActive = true}) async { final response = await _client.get>( '/OA/GetDepartments', queryParameters: {'keyword': keyword, 'onlyActive': onlyActive, 'page': 1, 'size': 100}, ); final list = (response.data?['list'] as List?) ?? []; return list.map((e) => DepartmentItem.fromJson(e as Map)).toList(); } /// 提交审批 Future submit(Map data) async { await _client.post('/OA/BillSave', data: { 'erpCategory': 'MasterService', 'billId': 'AE', 'procId': '', 'data': data, }); } }