import 'dart:convert'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../core/data/api_cache.dart'; import '../../core/navigation/host_app_channel.dart'; import '../../core/network/api_client.dart'; import '../../shared/models/pagination_model.dart'; import '../../app.dart'; import '../expense_apply/expense_apply_api.dart'; export '../expense_apply/expense_apply_api.dart' show DepartmentItem, EmployeeItem; import 'vehicle_apply_model.dart'; final vehicleApplyApiProvider = Provider( (ref) => VehicleApplyApi(ref.read(apiClientProvider)), ); class VehicleApplyApi { final ApiClient _client; final _cache = ApiCache( keyPrefix: '${HostAppChannel.sn}_${HostAppChannel.compNo}_${HostAppChannel.usr}', ); VehicleApplyApi(this._client); /// 清除所有基础资料缓存(picker 下拉刷新时调用)。 void clearRefCache() => _cache.clear(); /// 用车申请列表(分页) Future> fetchList({ String status = '', String keyword = '', String startDate = '', String endDate = '', String usr = '', String sortDir = 'DESC', int page = 1, int size = 20, }) async { final response = await _client.get>( '/OA/GetVehicleApplyList', queryParameters: { 'status': status, 'keyword': keyword, 'startDate': startDate, 'endDate': endDate, 'usr': usr, 'sortDir': sortDir, 'page': page, 'size': size, }, ); return PaginatedData.fromJson(response.data!, VehicleApplyModel.fromJson); } /// 用车申请详情 Future fetchDetail(String billNo) async { final response = await _client.get>( '/OA/GetVehicleApplyDetail', queryParameters: {'billNo': billNo}, ); return VehicleApplyModel.fromJson(response.data!); } /// 提交/保存,返回申请单号 Future submit(Map data) async { final response = await _client.post>( '/OA/BillSave', data: { 'erpCategory': 'MasterService', 'billId': 'YC', 'procId': '', 'data': data, }, ); final resData = response.data; if (resData == null) return null; final resultData = resData['resultData']; if (resultData is Map) { final bilNo = resultData['BIL_NO'] as String?; if (bilNo != null && bilNo.isNotEmpty) return bilNo; } if (resultData is String && resultData.isNotEmpty) { try { final parsed = json.decode(resultData) as Map; final bilNo = parsed['BIL_NO'] as String?; if (bilNo != null && bilNo.isNotEmpty) return bilNo; } catch (_) {} } final rootBilNo = resData['BIL_NO'] as String?; if (rootBilNo != null && rootBilNo.isNotEmpty) return rootBilNo; return null; } /// 还车登记(billId="YC",IS_RETURN="T") Future submitReturn( String billNo, Map returnData, ) async { final response = await _client.post>( '/OA/BillSave', data: { 'erpCategory': 'MasterService', 'billId': 'YC', 'procId': '', 'data': { 'HeadData': { 'YC_NO': billNo, 'IS_RETURN': 'T', 'RETURN_TIME': returnData['returnTime'], 'ODOMETER_END': returnData['odometerEnd'], 'AMTN': returnData['amtn'], 'REMARK': returnData['remark'], 'USR_CHECK': returnData['usrCheck'], }, }, }, ); final resData = response.data; if (resData == null) return null; final resultData = resData['resultData']; if (resultData is Map) { final bilNo = resultData['BIL_NO'] as String?; if (bilNo != null && bilNo.isNotEmpty) return bilNo; } if (resultData is String && resultData.isNotEmpty) { try { final parsed = json.decode(resultData) as Map; final bilNo = parsed['BIL_NO'] as String?; if (bilNo != null && bilNo.isNotEmpty) return bilNo; } catch (_) {} } return null; } /// 提交审核流 Future shSubmit({ required String bilId, required String bilNo, required String bilDd, String dep = '', String rem = '', String usr = '', }) async { try { final response = await _client.post>( '/OA/SHSubmit', data: { 'erpCategory': 'MasterService', 'bilId': bilId, 'bilNo': bilNo, 'bilDd': bilDd, 'dep': dep, 'rem': rem, 'usr': usr, }, ); return response.data?['code'] == 0; } catch (_) { return false; } } /// 获取单据状态(billId="YC") Future> getBillStatus(String billNo) async { final response = await _client.get>( '/OA/GetBillStatus', queryParameters: {'billId': 'YC', 'billNo': billNo}, ); return response.data!; } /// 部门查询 Future> getDepartments({ String keyword = '', bool onlyActive = true, int page = 1, int size = 100, }) async { final cacheKey = 'getDepartments_${keyword}_${onlyActive}_$page'; return _cache.getOrFetch(cacheKey, () async { final response = await _client.get>( '/OA/GetDepartments', queryParameters: { 'keyword': keyword, 'onlyActive': onlyActive, 'page': page, 'size': size, }, ); final list = (response.data?['list'] as List?) ?? []; return list .map((e) => DepartmentItem.fromJson(e as Map)) .toList(); }); } /// 员工查询 Future> getEmployees({ String keyword = '', String salNo = '', int page = 1, int size = 100, }) async { final cacheKey = 'getEmployees_${keyword}_${salNo}_$page'; return _cache.getOrFetch(cacheKey, () async { final response = await _client.get>( '/OA/GetEmployees', queryParameters: { 'keyword': keyword, 'salNo': salNo, 'page': page, 'size': size, }, ); final list = (response.data?['list'] as List?) ?? []; return list .map((e) => EmployeeItem.fromJson(e as Map)) .toList(); }); } }