expense_list_controller.dart 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import 'expense_model.dart';
  3. final expenseStatusFilterProvider = StateProvider<String>((ref) => '');
  4. final expensePageProvider = StateProvider<int>((ref) => 1);
  5. final expenseDateStartProvider = StateProvider<DateTime?>((ref) => null);
  6. final expenseDateEndProvider = StateProvider<DateTime?>((ref) => null);
  7. final expenseKeywordProvider = StateProvider<String>((ref) => '');
  8. final expenseRefreshProvider = StateProvider<int>((ref) => 0);
  9. final expenseSortDirProvider = StateProvider<String>((ref) => 'DESC');
  10. final now = DateTime.now();
  11. final mockExpenses = <ExpenseModel>[
  12. ExpenseModel(
  13. id: 'EXP001', expenseNo: 'BX202606001', expenseDate: DateTime(2026, 6, 29),
  14. applicantId: 'U001', applicantName: '张三', deptId: 'D001', deptName: '销售部',
  15. currencyCode: 'CNY', totalAmount: 2380.0, approvedAmount: 2380.0,
  16. purpose: '上海出差拜访客户', paymentMethod: 'bankTransfer',
  17. paymentStatus: 'unpaid', status: 'pending', version: 1,
  18. isInvoiceVerified: false, isTaxIdMatched: false, isCategoryCompliant: false,
  19. createTime: DateTime(2026, 6, 29, 10, 0), updateTime: DateTime(2026, 6, 29, 10, 0),
  20. details: [
  21. ExpenseDetailModel(id: 'ED001', expenseId: 'EXP001', expenseApplyNo: 'BXSQ-20240501-001',
  22. expenseCategory: 'transport', categoryName: '交通费', priority: '2', purpose: '往返机票',
  23. projectId: 'P001', projectName: '华东销售项目', costDeptId: 'D001', costDeptName: '销售部',
  24. acctSubjectId: '550201', acctSubjectName: '差旅费-交通',
  25. amount: 1200, taxRate: 0.09, taxAmount: 108, totalAmount: 1308, currencyCode: 'CNY',
  26. exchangeRate: 1.0, baseAmount: 1308, approvedAmount: 1308,
  27. bankName: '招商银行', bankAccountName: '张三', bankAccount: '6222 0212 3456 7890',
  28. remark: '经济舱', createTime: now, updateTime: now),
  29. ExpenseDetailModel(id: 'ED002', expenseId: 'EXP001',
  30. expenseCategory: 'hotel', categoryName: '住宿费', priority: '2', purpose: '酒店住宿',
  31. projectId: 'P001', projectName: '华东销售项目', costDeptId: 'D001', costDeptName: '销售部',
  32. acctSubjectId: '550202', acctSubjectName: '差旅费-住宿',
  33. amount: 984, taxRate: 0.09, taxAmount: 88, totalAmount: 1072, currencyCode: 'CNY',
  34. exchangeRate: 1.0, baseAmount: 1072, approvedAmount: 1072,
  35. bankName: '招商银行', bankAccountName: '张三', bankAccount: '6222 0212 3456 7890',
  36. remark: '3晚', createTime: now, updateTime: now),
  37. ],
  38. attachments: ['发票_机票.pdf', '发票_酒店.pdf'],
  39. currentApproverId: 'M001',
  40. ),
  41. ExpenseModel(
  42. id: 'EXP002', expenseNo: 'BX202606002', expenseDate: DateTime(2026, 6, 25),
  43. applicantId: 'U001', applicantName: '张三', deptId: 'D001', deptName: '销售部',
  44. currencyCode: 'CNY', totalAmount: 156.0, approvedAmount: 156.0,
  45. purpose: '办公用品报销', paymentMethod: 'alipay',
  46. paymentStatus: 'paid', status: 'approved', version: 1,
  47. isInvoiceVerified: true, isTaxIdMatched: true, isCategoryCompliant: true,
  48. voucherNo: 'JZ-202606-025', bankTransferNo: '20260628001',
  49. createTime: DateTime(2026, 6, 25, 14, 30), updateTime: DateTime(2026, 6, 28, 9, 0),
  50. details: [
  51. ExpenseDetailModel(id: 'ED003', expenseId: 'EXP002',
  52. expenseCategory: 'office', categoryName: '办公费', priority: '1', purpose: 'A4打印纸+墨盒',
  53. costDeptId: 'D001', costDeptName: '销售部',
  54. acctSubjectId: '550601', acctSubjectName: '办公费',
  55. amount: 156, taxRate: 0.13, taxAmount: 20, totalAmount: 176, currencyCode: 'CNY',
  56. exchangeRate: 1.0, baseAmount: 176, approvedAmount: 156,
  57. bankName: '支付宝', bankAccountName: '张三', bankAccount: 'zhangsan@alipay',
  58. createTime: now, updateTime: now),
  59. ],
  60. attachments: ['发票_办公用品.pdf'],
  61. ),
  62. ExpenseModel(
  63. id: 'EXP003', expenseNo: 'BX202606003', expenseDate: DateTime(2026, 6, 20),
  64. applicantId: 'U002', applicantName: '李四', deptId: 'D002', deptName: '技术部',
  65. currencyCode: 'CNY', totalAmount: 890.0, approvedAmount: 0.0,
  66. purpose: '服务器配件采购', paymentMethod: 'bankTransfer',
  67. paymentStatus: 'unpaid', status: 'rejected', version: 1,
  68. isInvoiceVerified: false, isTaxIdMatched: false, isCategoryCompliant: false,
  69. createTime: DateTime(2026, 6, 20, 9, 0), updateTime: DateTime(2026, 6, 21, 16, 0),
  70. details: [
  71. ExpenseDetailModel(id: 'ED004', expenseId: 'EXP003',
  72. expenseCategory: 'equipment', categoryName: '设备费', priority: '3', purpose: 'SSD硬盘×2',
  73. projectId: 'P002', projectName: '智能硬件研发', costDeptId: 'D002', costDeptName: '技术部',
  74. acctSubjectId: '550301', acctSubjectName: '研发费用-设备',
  75. amount: 890, taxRate: 0.13, taxAmount: 116, totalAmount: 1006, currencyCode: 'CNY',
  76. exchangeRate: 1.0, baseAmount: 1006, approvedAmount: 0,
  77. customerVendorName: 'XX电子科技有限公司',
  78. bankName: '工商银行', bankAccountName: '李四', bankAccount: '6212 3456 7890 1234',
  79. remark: '已收到货物但审批未通过', createTime: now, updateTime: now),
  80. ],
  81. attachments: ['报价单.pdf', '入库单.pdf'],
  82. ),
  83. ExpenseModel(
  84. id: 'EXP004', expenseNo: 'BX202606004', expenseDate: DateTime(2026, 6, 28),
  85. applicantId: 'U003', applicantName: '王五', deptId: 'D003', deptName: '市场部',
  86. currencyCode: 'USD', totalAmount: 820.0, approvedAmount: 800.0,
  87. purpose: '海外广告投放素材采购', paymentMethod: 'bankTransfer',
  88. paymentStatus: 'unpaid', status: 'approved', version: 1,
  89. isInvoiceVerified: true, isTaxIdMatched: true, isCategoryCompliant: false,
  90. createTime: DateTime(2026, 6, 28, 11, 0), updateTime: DateTime(2026, 6, 28, 18, 0),
  91. details: [
  92. ExpenseDetailModel(id: 'ED005', expenseId: 'EXP004',
  93. expenseCategory: 'service', categoryName: '服务费', priority: '2', purpose: '设计外包',
  94. projectId: 'P003', projectName: '品牌推广', costDeptId: 'D003', costDeptName: '市场部',
  95. acctSubjectId: '550701', acctSubjectName: '广告费',
  96. amount: 800, taxRate: 0, taxAmount: 0, totalAmount: 800,
  97. currencyCode: 'USD', exchangeRate: 7.25, baseAmount: 5800, approvedAmount: 800,
  98. customerVendorName: 'Global Media Ltd.',
  99. bankName: '中国银行', bankAccountName: '王五', bankAccount: '6217 8901 2345 6789',
  100. createTime: now, updateTime: now),
  101. ExpenseDetailModel(id: 'ED006', expenseId: 'EXP004',
  102. expenseCategory: 'office', categoryName: '办公费', priority: '1', purpose: '印刷物料',
  103. projectId: 'P003', projectName: '品牌推广', costDeptId: 'D003', costDeptName: '市场部',
  104. acctSubjectId: '550701', acctSubjectName: '广告费',
  105. amount: 20, taxRate: 0, taxAmount: 0, totalAmount: 20,
  106. currencyCode: 'USD', exchangeRate: 7.25, baseAmount: 145, approvedAmount: 0,
  107. bankName: '中国银行', bankAccountName: '王五', bankAccount: '6217 8901 2345 6789',
  108. createTime: now, updateTime: now),
  109. ],
  110. attachments: ['合同_设计外包.pdf', 'invoice.pdf'],
  111. ),
  112. ];
  113. final expenseListProvider = FutureProvider.autoDispose
  114. .family<List<ExpenseModel>, String>((ref, status) async {
  115. ref.watch(expensePageProvider);
  116. ref.watch(expenseRefreshProvider);
  117. ref.watch(expenseDateStartProvider);
  118. ref.watch(expenseDateEndProvider);
  119. await Future.delayed(const Duration(milliseconds: 500));
  120. if (status.isEmpty) return mockExpenses;
  121. return mockExpenses.where((e) => e.status == status).toList();
  122. });