expense_apply_approval_api.dart 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import '../../core/network/api_client.dart';
  3. import '../../core/navigation/host_app_channel.dart';
  4. import '../../core/utils/date_utils.dart' as du;
  5. import '../../app.dart';
  6. import 'expense_apply_model.dart';
  7. import 'expense_apply_api.dart';
  8. import 'expense_apply_list_controller.dart';
  9. final expenseApplyApprovalApiProvider = Provider<ExpenseApplyApprovalApi>(
  10. (ref) => ExpenseApplyApprovalApi(ref.read(apiClientProvider)),
  11. );
  12. class ApprovalListItem {
  13. final String bilId;
  14. final String bilNo;
  15. final String bilDate;
  16. final String applicant;
  17. final String dept;
  18. final double amount;
  19. final String remark;
  20. final String status;
  21. const ApprovalListItem({
  22. required this.bilId,
  23. required this.bilNo,
  24. required this.bilDate,
  25. required this.applicant,
  26. required this.dept,
  27. required this.amount,
  28. required this.remark,
  29. required this.status,
  30. });
  31. factory ApprovalListItem.fromJson(Map<String, dynamic> json) =>
  32. ApprovalListItem(
  33. bilId: json['bilId'] as String? ?? '',
  34. bilNo: json['bilNo'] as String? ?? '',
  35. bilDate: json['bilDate'] as String? ?? '',
  36. applicant: json['applicant'] as String? ?? '',
  37. dept: json['dept'] as String? ?? '',
  38. amount: (json['amount'] as num?)?.toDouble() ?? 0,
  39. remark: json['remark'] as String? ?? '',
  40. status: json['status'] as String? ?? 'pending',
  41. );
  42. ExpenseApplyModel toExpenseApplyModel() => ExpenseApplyModel(
  43. id: bilNo,
  44. expenseApplyNo: bilNo,
  45. expenseApplyDate:
  46. bilDate.isNotEmpty ? DateTime.tryParse(bilDate) : null,
  47. applicantId: applicant,
  48. applicantName: applicant,
  49. deptId: dept,
  50. deptName: dept,
  51. estimatedAmount: amount,
  52. purpose: remark,
  53. remark: '',
  54. status: status == 'approved' ? 'approved' : 'pending',
  55. createTime: DateTime.now(),
  56. updateTime: DateTime.now(),
  57. );
  58. }
  59. class ExpenseApplyApprovalApi {
  60. final ApiClient _client;
  61. ExpenseApplyApprovalApi(this._client);
  62. Future<Map<String, dynamic>> fetchApprovalList({
  63. required String bilId,
  64. required String status,
  65. String erpCategory = 'MasterService',
  66. String keyword = '',
  67. String startDate = '',
  68. String endDate = '',
  69. int page = 1,
  70. int size = 20,
  71. }) async {
  72. final response = await _client.get<Map<String, dynamic>>(
  73. '/OA/GetApprovalList',
  74. queryParameters: {
  75. 'bilId': bilId,
  76. 'status': status,
  77. 'erpCategory': erpCategory,
  78. 'keyword': keyword,
  79. 'startDate': startDate,
  80. 'endDate': endDate,
  81. 'page': page,
  82. 'size': size,
  83. },
  84. );
  85. return response.data!;
  86. }
  87. }
  88. final expenseApplyApprovalListProvider =
  89. FutureProvider.autoDispose.family<List<ExpenseApplyModel>, String>(
  90. (ref, status) async {
  91. ref.watch(expenseApplyRefreshProvider);
  92. ref.watch(expenseApplyDateStartProvider);
  93. ref.watch(expenseApplyDateEndProvider);
  94. ref.watch(expenseApplyKeywordProvider);
  95. final api = ref.read(expenseApplyApprovalApiProvider);
  96. final dateStart = ref.read(expenseApplyDateStartProvider);
  97. final dateEnd = ref.read(expenseApplyDateEndProvider);
  98. final keyword = ref.read(expenseApplyKeywordProvider);
  99. final response = await api.fetchApprovalList(
  100. bilId: 'AE',
  101. keyword: keyword,
  102. status: status.isEmpty ? '' : status,
  103. startDate: dateStart != null ? du.DateUtils.formatDate(dateStart) : '',
  104. endDate: dateEnd != null ? du.DateUtils.formatDate(dateEnd) : '',
  105. );
  106. final list = (response['list'] as List<dynamic>?) ?? [];
  107. return list
  108. .map((e) =>
  109. ApprovalListItem.fromJson(e as Map<String, dynamic>)
  110. .toExpenseApplyModel())
  111. .toList();
  112. },
  113. );
  114. /// "我的申请单" 列表(制单人=当前用户,非审批流)
  115. final expenseApplyMyListProvider =
  116. FutureProvider.autoDispose.family<List<ExpenseApplyModel>, String>(
  117. (ref, status) async {
  118. ref.watch(expenseApplyRefreshProvider);
  119. ref.watch(expenseApplyDateStartProvider);
  120. ref.watch(expenseApplyDateEndProvider);
  121. ref.watch(expenseApplyKeywordProvider);
  122. final api = ref.read(expenseApplyApiProvider);
  123. final dateStart = ref.read(expenseApplyDateStartProvider);
  124. final dateEnd = ref.read(expenseApplyDateEndProvider);
  125. final keyword = ref.read(expenseApplyKeywordProvider);
  126. final result = await api.fetchList(
  127. keyword: keyword,
  128. startDate: dateStart != null ? du.DateUtils.formatDate(dateStart) : '',
  129. endDate: dateEnd != null ? du.DateUtils.formatDate(dateEnd) : '',
  130. usr: HostAppChannel.usr,
  131. sortDir: ref.watch(expenseApplySortDirProvider),
  132. );
  133. return result.list;
  134. },
  135. );