vehicle_list_controller.dart 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import 'package:flutter_riverpod/flutter_riverpod.dart';
  2. import 'vehicle_model.dart';
  3. final vehicleStatusFilterProvider = StateProvider<String>((ref) => '');
  4. final vehiclePageProvider = StateProvider<int>((ref) => 1);
  5. final mockVehicles = <VehicleModel>[
  6. VehicleModel(
  7. id: 'veh-001',
  8. applicationNo: 'YC-20260520-001',
  9. applicantId: 'u-001',
  10. applicantName: '张三',
  11. deptId: 'dept-001',
  12. deptName: '市场部',
  13. vehicleId: '京A88888',
  14. purpose: 'reception',
  15. reason: '拜访重要客户,需前往深圳',
  16. origin: '公司总部',
  17. destination: '深圳分公司',
  18. passengerCount: 3,
  19. startTime: DateTime(2026, 5, 22, 8, 0),
  20. endTime: DateTime(2026, 5, 22, 18, 0),
  21. status: 'pending',
  22. approvalInstanceId: 'apr-v-001',
  23. createTime: DateTime(2026, 5, 20),
  24. updateTime: DateTime(2026, 5, 20),
  25. ),
  26. VehicleModel(
  27. id: 'veh-002',
  28. applicationNo: 'YC-20260525-002',
  29. applicantId: 'u-002',
  30. applicantName: '王五',
  31. deptId: 'dept-002',
  32. deptName: '技术部',
  33. vehicleId: '京B66666',
  34. purpose: 'business',
  35. reason: '运送服务器设备至数据中心',
  36. origin: '公司仓库',
  37. destination: '数据中心',
  38. passengerCount: 2,
  39. startTime: DateTime(2026, 5, 25, 9, 0),
  40. endTime: DateTime(2026, 5, 25, 17, 0),
  41. status: 'approved',
  42. approvalInstanceId: 'apr-v-002',
  43. createTime: DateTime(2026, 5, 23),
  44. updateTime: DateTime(2026, 5, 24),
  45. ),
  46. VehicleModel(
  47. id: 'veh-003',
  48. applicationNo: 'YC-20260601-003',
  49. applicantId: 'u-001',
  50. applicantName: '张三',
  51. deptId: 'dept-001',
  52. deptName: '市场部',
  53. vehicleId: '京C12345',
  54. purpose: 'official',
  55. reason: '前往税务局办理业务',
  56. origin: '公司总部',
  57. destination: '税务局',
  58. passengerCount: 1,
  59. startTime: DateTime(2026, 6, 1, 9, 0),
  60. endTime: DateTime(2026, 6, 1, 12, 0),
  61. status: 'draft',
  62. approvalInstanceId: '',
  63. createTime: DateTime(2026, 5, 31),
  64. updateTime: DateTime(2026, 5, 31),
  65. ),
  66. VehicleModel(
  67. id: 'veh-004',
  68. applicationNo: 'YC-20260528-004',
  69. applicantId: 'u-003',
  70. applicantName: '赵六',
  71. deptId: 'dept-003',
  72. deptName: '财务部',
  73. vehicleId: '京D99999',
  74. purpose: 'reception',
  75. reason: '接待审计团队',
  76. origin: '公司总部',
  77. destination: '机场',
  78. passengerCount: 4,
  79. startTime: DateTime(2026, 5, 28, 14, 0),
  80. endTime: DateTime(2026, 5, 28, 17, 0),
  81. status: 'returned',
  82. approvalInstanceId: 'apr-v-004',
  83. actualReturnTime: DateTime(2026, 5, 28, 16, 45),
  84. startOdometer: 12500.0,
  85. endOdometer: 12680.0,
  86. actualCost: 85.0,
  87. costRemark: '路桥费35元,停车费50元',
  88. createTime: DateTime(2026, 5, 27),
  89. updateTime: DateTime(2026, 5, 28),
  90. ),
  91. VehicleModel(
  92. id: 'veh-005',
  93. applicationNo: 'YC-20260515-005',
  94. applicantId: 'u-002',
  95. applicantName: '王五',
  96. deptId: 'dept-002',
  97. deptName: '技术部',
  98. vehicleId: '京E55555',
  99. purpose: 'business',
  100. reason: '参加技术交流会',
  101. origin: '公司总部',
  102. destination: '国际会展中心',
  103. passengerCount: 1,
  104. startTime: DateTime(2026, 5, 15, 8, 0),
  105. endTime: DateTime(2026, 5, 15, 18, 0),
  106. status: 'withdrawn',
  107. approvalInstanceId: '',
  108. createTime: DateTime(2026, 5, 14),
  109. updateTime: DateTime(2026, 5, 15),
  110. ),
  111. VehicleModel(
  112. id: 'veh-006',
  113. applicationNo: 'YC-20260510-006',
  114. applicantId: 'u-001',
  115. applicantName: '张三',
  116. deptId: 'dept-001',
  117. deptName: '市场部',
  118. vehicleId: '京A88888',
  119. purpose: 'reception',
  120. reason: '拜访客户',
  121. origin: '公司总部',
  122. destination: '客户公司',
  123. passengerCount: 2,
  124. startTime: DateTime(2026, 5, 10, 10, 0),
  125. endTime: DateTime(2026, 5, 10, 16, 0),
  126. status: 'rejected',
  127. approvalInstanceId: '',
  128. createTime: DateTime(2026, 5, 9),
  129. updateTime: DateTime(2026, 5, 10),
  130. ),
  131. ];
  132. final vehicleDateStartProvider = StateProvider<DateTime?>((ref) => null);
  133. final vehicleDateEndProvider = StateProvider<DateTime?>((ref) => null);
  134. final vehiclePurposeFilterProvider = StateProvider<String?>((ref) => null);
  135. final vehicleRefreshProvider = StateProvider<int>((ref) => 0);
  136. final vehicleListProvider = FutureProvider.autoDispose.family<List<VehicleModel>, String>((ref, status) async {
  137. ref.watch(vehiclePageProvider);
  138. ref.watch(vehicleDateStartProvider);
  139. ref.watch(vehicleDateEndProvider);
  140. ref.watch(vehiclePurposeFilterProvider);
  141. ref.watch(vehicleRefreshProvider);
  142. // 模拟网络延迟,使骨架屏可见
  143. await Future.delayed(const Duration(milliseconds: 1000));
  144. var list = status.isEmpty
  145. ? mockVehicles
  146. : mockVehicles.where((e) => e.status == status).toList();
  147. final dateStart = ref.read(vehicleDateStartProvider);
  148. final dateEnd = ref.read(vehicleDateEndProvider);
  149. if (dateStart != null) {
  150. list = list.where((e) =>
  151. e.createTime.isAfter(dateStart.subtract(const Duration(days: 1)))).toList();
  152. }
  153. if (dateEnd != null) {
  154. list = list.where((e) =>
  155. e.createTime.isBefore(dateEnd.add(const Duration(days: 1)))).toList();
  156. }
  157. final purposeFilter = ref.read(vehiclePurposeFilterProvider);
  158. if (purposeFilter != null && purposeFilter.isNotEmpty) {
  159. list = list.where((e) => e.purpose == purposeFilter).toList();
  160. }
  161. return list;
  162. });