|
@@ -10,6 +10,7 @@ import '../../shared/models/bill_attachment.dart';
|
|
|
import '../../shared/models/bill_file_rights.dart';
|
|
import '../../shared/models/bill_file_rights.dart';
|
|
|
import '../../core/navigation/host_app_channel.dart';
|
|
import '../../core/navigation/host_app_channel.dart';
|
|
|
import '../../core/utils/date_utils.dart' as du;
|
|
import '../../core/utils/date_utils.dart' as du;
|
|
|
|
|
+import '../../core/data/api_cache.dart';
|
|
|
import 'expense_model.dart';
|
|
import 'expense_model.dart';
|
|
|
import 'expense_list_controller.dart';
|
|
import 'expense_list_controller.dart';
|
|
|
import '../expense_apply/report_model.dart';
|
|
import '../expense_apply/report_model.dart';
|
|
@@ -133,8 +134,12 @@ class EmployeeItem {
|
|
|
|
|
|
|
|
class ExpenseApi {
|
|
class ExpenseApi {
|
|
|
final ApiClient _client;
|
|
final ApiClient _client;
|
|
|
|
|
+ final _cache = ApiCache(keyPrefix: HostAppChannel.sn);
|
|
|
ExpenseApi(this._client);
|
|
ExpenseApi(this._client);
|
|
|
|
|
|
|
|
|
|
+ /// 清除所有基础资料缓存(picker 下拉刷新时调用)。
|
|
|
|
|
+ void clearRefCache() => _cache.clear();
|
|
|
|
|
+
|
|
|
/// 费用报销列表(分页)
|
|
/// 费用报销列表(分页)
|
|
|
Future<PaginatedData<ExpenseModel>> fetchList({
|
|
Future<PaginatedData<ExpenseModel>> fetchList({
|
|
|
String status = '',
|
|
String status = '',
|
|
@@ -236,19 +241,22 @@ class ExpenseApi {
|
|
|
int page = 1,
|
|
int page = 1,
|
|
|
int size = 100,
|
|
int size = 100,
|
|
|
}) async {
|
|
}) async {
|
|
|
- final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
- '/OA/GetCostTypes',
|
|
|
|
|
- queryParameters: {
|
|
|
|
|
- 'keyword': keyword,
|
|
|
|
|
- 'accNo': accNo,
|
|
|
|
|
- 'page': page,
|
|
|
|
|
- 'size': size,
|
|
|
|
|
- },
|
|
|
|
|
- );
|
|
|
|
|
- final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
- return list
|
|
|
|
|
- .map((e) => CostTypeItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
- .toList();
|
|
|
|
|
|
|
+ final cacheKey = 'getCostTypes_${keyword}_${accNo}_$page';
|
|
|
|
|
+ return _cache.getOrFetch(cacheKey, () async {
|
|
|
|
|
+ final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
+ '/OA/GetCostTypes',
|
|
|
|
|
+ queryParameters: {
|
|
|
|
|
+ 'keyword': keyword,
|
|
|
|
|
+ 'accNo': accNo,
|
|
|
|
|
+ 'page': page,
|
|
|
|
|
+ 'size': size,
|
|
|
|
|
+ },
|
|
|
|
|
+ );
|
|
|
|
|
+ final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
+ return list
|
|
|
|
|
+ .map((e) => CostTypeItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 费用项目字典(分页)
|
|
/// 费用项目字典(分页)
|
|
@@ -259,20 +267,23 @@ class ExpenseApi {
|
|
|
int page = 1,
|
|
int page = 1,
|
|
|
int size = 20,
|
|
int size = 20,
|
|
|
}) async {
|
|
}) async {
|
|
|
- final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
- '/OA/GetCostProjects',
|
|
|
|
|
- queryParameters: {
|
|
|
|
|
- 'keyword': keyword,
|
|
|
|
|
- 'accNo': accNo,
|
|
|
|
|
- 'onlyActive': onlyActive,
|
|
|
|
|
- 'page': page,
|
|
|
|
|
- 'size': size,
|
|
|
|
|
- },
|
|
|
|
|
- );
|
|
|
|
|
- final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
- return list
|
|
|
|
|
- .map((e) => CostProjectItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
- .toList();
|
|
|
|
|
|
|
+ final cacheKey = 'getCostProjects_${keyword}_${accNo}_${onlyActive}_$page';
|
|
|
|
|
+ return _cache.getOrFetch(cacheKey, () async {
|
|
|
|
|
+ final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
+ '/OA/GetCostProjects',
|
|
|
|
|
+ queryParameters: {
|
|
|
|
|
+ 'keyword': keyword,
|
|
|
|
|
+ 'accNo': accNo,
|
|
|
|
|
+ 'onlyActive': onlyActive,
|
|
|
|
|
+ 'page': page,
|
|
|
|
|
+ 'size': size,
|
|
|
|
|
+ },
|
|
|
|
|
+ );
|
|
|
|
|
+ final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
+ return list
|
|
|
|
|
+ .map((e) => CostProjectItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 项目代号
|
|
/// 项目代号
|
|
@@ -282,19 +293,22 @@ class ExpenseApi {
|
|
|
int page = 1,
|
|
int page = 1,
|
|
|
int size = 100,
|
|
int size = 100,
|
|
|
}) async {
|
|
}) async {
|
|
|
- final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
- '/OA/GetProjectCodes',
|
|
|
|
|
- queryParameters: {
|
|
|
|
|
- 'keyword': keyword,
|
|
|
|
|
- 'billDate': billDate,
|
|
|
|
|
- 'page': page,
|
|
|
|
|
- 'size': size,
|
|
|
|
|
- },
|
|
|
|
|
- );
|
|
|
|
|
- final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
- return list
|
|
|
|
|
- .map((e) => ProjectCodeItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
- .toList();
|
|
|
|
|
|
|
+ final cacheKey = 'getProjectCodes_${keyword}_${billDate}_$page';
|
|
|
|
|
+ return _cache.getOrFetch(cacheKey, () async {
|
|
|
|
|
+ final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
+ '/OA/GetProjectCodes',
|
|
|
|
|
+ queryParameters: {
|
|
|
|
|
+ 'keyword': keyword,
|
|
|
|
|
+ 'billDate': billDate,
|
|
|
|
|
+ 'page': page,
|
|
|
|
|
+ 'size': size,
|
|
|
|
|
+ },
|
|
|
|
|
+ );
|
|
|
|
|
+ final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
+ return list
|
|
|
|
|
+ .map((e) => ProjectCodeItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 部门
|
|
/// 部门
|
|
@@ -304,19 +318,22 @@ class ExpenseApi {
|
|
|
int page = 1,
|
|
int page = 1,
|
|
|
int size = 100,
|
|
int size = 100,
|
|
|
}) async {
|
|
}) async {
|
|
|
- final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
- '/OA/GetDepartments',
|
|
|
|
|
- queryParameters: {
|
|
|
|
|
- 'keyword': keyword,
|
|
|
|
|
- 'onlyActive': onlyActive,
|
|
|
|
|
- 'page': page,
|
|
|
|
|
- 'size': size,
|
|
|
|
|
- },
|
|
|
|
|
- );
|
|
|
|
|
- final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
- return list
|
|
|
|
|
- .map((e) => DepartmentItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
- .toList();
|
|
|
|
|
|
|
+ final cacheKey = 'getDepartments_${keyword}_${onlyActive}_$page';
|
|
|
|
|
+ return _cache.getOrFetch(cacheKey, () async {
|
|
|
|
|
+ final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
+ '/OA/GetDepartments',
|
|
|
|
|
+ queryParameters: {
|
|
|
|
|
+ 'keyword': keyword,
|
|
|
|
|
+ 'onlyActive': onlyActive,
|
|
|
|
|
+ 'page': page,
|
|
|
|
|
+ 'size': size,
|
|
|
|
|
+ },
|
|
|
|
|
+ );
|
|
|
|
|
+ final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
+ return list
|
|
|
|
|
+ .map((e) => DepartmentItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 客户/厂商
|
|
/// 客户/厂商
|
|
@@ -325,14 +342,17 @@ class ExpenseApi {
|
|
|
int page = 1,
|
|
int page = 1,
|
|
|
int size = 100,
|
|
int size = 100,
|
|
|
}) async {
|
|
}) async {
|
|
|
- final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
- '/OA/GetCustomers',
|
|
|
|
|
- queryParameters: {'keyword': keyword, 'page': page, 'size': size},
|
|
|
|
|
- );
|
|
|
|
|
- final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
- return list
|
|
|
|
|
- .map((e) => CustomerItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
- .toList();
|
|
|
|
|
|
|
+ final cacheKey = 'getCustomers_${keyword}_$page';
|
|
|
|
|
+ return _cache.getOrFetch(cacheKey, () async {
|
|
|
|
|
+ final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
+ '/OA/GetCustomers',
|
|
|
|
|
+ queryParameters: {'keyword': keyword, 'page': page, 'size': size},
|
|
|
|
|
+ );
|
|
|
|
|
+ final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
+ return list
|
|
|
|
|
+ .map((e) => CustomerItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 员工查询
|
|
/// 员工查询
|
|
@@ -342,19 +362,22 @@ class ExpenseApi {
|
|
|
int page = 1,
|
|
int page = 1,
|
|
|
int size = 100,
|
|
int size = 100,
|
|
|
}) async {
|
|
}) async {
|
|
|
- final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
- '/OA/GetEmployees',
|
|
|
|
|
- queryParameters: {
|
|
|
|
|
- 'keyword': keyword,
|
|
|
|
|
- 'salNo': salNo,
|
|
|
|
|
- 'page': page,
|
|
|
|
|
- 'size': size,
|
|
|
|
|
- },
|
|
|
|
|
- );
|
|
|
|
|
- final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
- return list
|
|
|
|
|
- .map((e) => EmployeeItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
- .toList();
|
|
|
|
|
|
|
+ final cacheKey = 'getEmployees_${keyword}_${salNo}_$page';
|
|
|
|
|
+ return _cache.getOrFetch(cacheKey, () async {
|
|
|
|
|
+ final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
+ '/OA/GetEmployees',
|
|
|
|
|
+ queryParameters: {
|
|
|
|
|
+ 'keyword': keyword,
|
|
|
|
|
+ 'salNo': salNo,
|
|
|
|
|
+ 'page': page,
|
|
|
|
|
+ 'size': size,
|
|
|
|
|
+ },
|
|
|
|
|
+ );
|
|
|
|
|
+ final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
+ return list
|
|
|
|
|
+ .map((e) => EmployeeItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 可转入报销单的费用申请明细(keyword 模糊匹配单号/事由/部门/申请人/费用类型)
|
|
/// 可转入报销单的费用申请明细(keyword 模糊匹配单号/事由/部门/申请人/费用类型)
|
|
@@ -386,14 +409,17 @@ class ExpenseApi {
|
|
|
int page = 1,
|
|
int page = 1,
|
|
|
int size = 50,
|
|
int size = 50,
|
|
|
}) async {
|
|
}) async {
|
|
|
- final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
- '/OA/GetCurrencies',
|
|
|
|
|
- queryParameters: {'keyword': keyword, 'page': page, 'size': size},
|
|
|
|
|
- );
|
|
|
|
|
- final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
- return list
|
|
|
|
|
- .map((e) => CurrencyItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
- .toList();
|
|
|
|
|
|
|
+ final cacheKey = 'getCurrencies_${keyword}_$page';
|
|
|
|
|
+ return _cache.getOrFetch(cacheKey, () async {
|
|
|
|
|
+ final response = await _client.get<Map<String, dynamic>>(
|
|
|
|
|
+ '/OA/GetCurrencies',
|
|
|
|
|
+ queryParameters: {'keyword': keyword, 'page': page, 'size': size},
|
|
|
|
|
+ );
|
|
|
|
|
+ final list = (response.data?['list'] as List<dynamic>?) ?? [];
|
|
|
|
|
+ return list
|
|
|
|
|
+ .map((e) => CurrencyItem.fromJson(e as Map<String, dynamic>))
|
|
|
|
|
+ .toList();
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/// 币别查询(旧版,保留兼容)
|
|
/// 币别查询(旧版,保留兼容)
|