vehicle_list_controller.dart 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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 vehicleDateStartProvider = StateProvider<DateTime?>((ref) => null);
  6. final vehicleDateEndProvider = StateProvider<DateTime?>((ref) => null);
  7. final vehicleKeywordProvider = StateProvider<String>((ref) => '');
  8. final vehicleRefreshProvider = StateProvider<int>((ref) => 0);
  9. final vehicleSortDirProvider = StateProvider<String>((ref) => 'DESC');
  10. final now = DateTime.now();
  11. final mockVehicles = <VehicleModel>[
  12. VehicleModel(
  13. ycNo: 'YC20260520001',
  14. ycDd: DateTime(2026, 5, 20),
  15. salNo: 'U001',
  16. dep: 'D001',
  17. purpose: 'reception',
  18. reason: '拜访重要客户,需前往深圳分公司洽谈合作',
  19. origin: '公司总部',
  20. destinAdr: '深圳分公司',
  21. passengerCount: 3,
  22. passengerName: '王五,赵六',
  23. licensePlate: '京A88888',
  24. vehicleType: 'sedan',
  25. brand: '丰田凯美瑞',
  26. seats: 5,
  27. driverName: '张师傅',
  28. startTime: DateTime(2026, 5, 22, 8, 0),
  29. endTime: DateTime(2026, 5, 22, 18, 0),
  30. recordDd: DateTime(2026, 5, 20),
  31. usr: 'U001',
  32. chkMan: '',
  33. clsDate: null,
  34. isReturn: false,
  35. applicantName: '张三',
  36. deptName: '市场部',
  37. isAuditApproved: false,
  38. ),
  39. VehicleModel(
  40. ycNo: 'YC20260601002',
  41. ycDd: DateTime(2026, 6, 1),
  42. salNo: 'U002',
  43. dep: 'D002',
  44. purpose: 'business',
  45. reason: '运送服务器设备至数据中心',
  46. origin: '公司仓库',
  47. destinAdr: '数据中心',
  48. passengerCount: 2,
  49. passengerName: '钱七',
  50. licensePlate: '京B66666',
  51. vehicleType: 'van',
  52. brand: '福特全顺',
  53. seats: 7,
  54. driverName: '李师傅',
  55. startTime: DateTime(2026, 6, 2, 9, 0),
  56. endTime: DateTime(2026, 6, 2, 17, 0),
  57. recordDd: DateTime(2026, 6, 1),
  58. usr: 'U002',
  59. chkMan: 'MGR001',
  60. clsDate: DateTime(2026, 6, 2),
  61. isReturn: false,
  62. applicantName: '李四',
  63. deptName: '技术部',
  64. isAuditApproved: true,
  65. ),
  66. VehicleModel(
  67. ycNo: 'YC20260615003',
  68. ycDd: DateTime(2026, 6, 15),
  69. salNo: 'U003',
  70. dep: 'D003',
  71. purpose: 'official',
  72. reason: '前往税务局办理税务登记',
  73. origin: '公司总部',
  74. destinAdr: '税务局',
  75. passengerCount: 1,
  76. passengerName: '',
  77. licensePlate: '京C12345',
  78. vehicleType: 'sedan',
  79. brand: '大众帕萨特',
  80. seats: 5,
  81. driverName: '王师傅',
  82. startTime: DateTime(2026, 6, 16, 9, 0),
  83. endTime: DateTime(2026, 6, 16, 12, 0),
  84. recordDd: DateTime(2026, 6, 15),
  85. usr: 'U003',
  86. chkMan: 'MGR001',
  87. clsDate: DateTime(2026, 6, 16),
  88. isReturn: true,
  89. returnTime: DateTime(2026, 6, 16, 11, 45),
  90. odometer: 25680.0,
  91. amtn: 35.0,
  92. remark: '停车费35元',
  93. applicantName: '赵六',
  94. deptName: '财务部',
  95. isAuditApproved: true,
  96. ),
  97. VehicleModel(
  98. ycNo: 'YC20260701004',
  99. ycDd: DateTime(2026, 7, 1),
  100. salNo: 'U001',
  101. dep: 'D001',
  102. purpose: 'reception',
  103. reason: '接待审计团队,需前往机场接机',
  104. origin: '公司总部',
  105. destinAdr: '机场T3航站楼',
  106. passengerCount: 4,
  107. passengerName: '孙八,周九,吴十',
  108. licensePlate: '京D99999',
  109. vehicleType: 'mpv',
  110. brand: '别克GL8',
  111. seats: 7,
  112. driverName: '刘师傅',
  113. startTime: DateTime(2026, 7, 5, 14, 0),
  114. endTime: DateTime(2026, 7, 5, 17, 0),
  115. recordDd: DateTime(2026, 7, 1),
  116. usr: 'U001',
  117. chkMan: '',
  118. clsDate: null,
  119. isReturn: false,
  120. applicantName: '张三',
  121. deptName: '市场部',
  122. isAuditApproved: false,
  123. ),
  124. VehicleModel(
  125. ycNo: 'YC20260710005',
  126. ycDd: DateTime(2026, 7, 10),
  127. salNo: 'U004',
  128. dep: 'D004',
  129. purpose: 'business',
  130. reason: '参加行业技术交流大会',
  131. origin: '公司总部',
  132. destinAdr: '国际会展中心',
  133. passengerCount: 2,
  134. passengerName: '郑十一',
  135. licensePlate: '京E55555',
  136. vehicleType: 'suv',
  137. brand: '本田CR-V',
  138. seats: 5,
  139. driverName: '陈师傅',
  140. startTime: DateTime(2026, 7, 12, 8, 0),
  141. endTime: DateTime(2026, 7, 12, 18, 0),
  142. recordDd: DateTime(2026, 7, 10),
  143. usr: 'U004',
  144. chkMan: 'MGR001',
  145. clsDate: DateTime(2026, 7, 11),
  146. isReturn: true,
  147. returnTime: DateTime(2026, 7, 12, 17, 30),
  148. odometer: 12350.0,
  149. amtn: 120.0,
  150. remark: '路桥费60元,停车费60元',
  151. applicantName: '周七',
  152. deptName: '研发部',
  153. isAuditApproved: true,
  154. ),
  155. VehicleModel(
  156. ycNo: 'YC20260715006',
  157. ycDd: DateTime(2026, 7, 15),
  158. salNo: 'U002',
  159. dep: 'D002',
  160. purpose: 'other',
  161. reason: '运送活动物资至年会会场',
  162. origin: '公司仓库',
  163. destinAdr: '年会会场',
  164. passengerCount: 3,
  165. passengerName: '王十二,冯十三',
  166. licensePlate: '京B66666',
  167. vehicleType: 'van',
  168. brand: '福特全顺',
  169. seats: 7,
  170. driverName: '李师傅',
  171. startTime: DateTime(2026, 7, 18, 7, 0),
  172. endTime: DateTime(2026, 7, 18, 10, 0),
  173. recordDd: DateTime(2026, 7, 15),
  174. usr: 'U002',
  175. chkMan: '',
  176. clsDate: null,
  177. isReturn: false,
  178. applicantName: '李四',
  179. deptName: '技术部',
  180. isAuditApproved: false,
  181. ),
  182. ];
  183. final vehicleListProvider = FutureProvider.family<List<VehicleModel>, String>(
  184. (ref, status) async {
  185. ref.watch(vehiclePageProvider);
  186. ref.watch(vehicleRefreshProvider);
  187. ref.watch(vehicleDateStartProvider);
  188. ref.watch(vehicleDateEndProvider);
  189. ref.watch(vehicleKeywordProvider);
  190. ref.watch(vehicleSortDirProvider);
  191. await Future.delayed(const Duration(milliseconds: 1000));
  192. var list = status.isEmpty
  193. ? mockVehicles
  194. : mockVehicles
  195. .where((e) {
  196. // 状态匹配:通过 clsDate 和 isReturn 判断
  197. if (status == 'approved') return e.isAuditApproved;
  198. if (status == 'pending') return !e.isAuditApproved;
  199. if (status == 'returned') return e.isReturn;
  200. return false;
  201. })
  202. .toList();
  203. final dateStart = ref.read(vehicleDateStartProvider);
  204. final dateEnd = ref.read(vehicleDateEndProvider);
  205. if (dateStart != null) {
  206. list = list
  207. .where((e) =>
  208. e.recordDd != null &&
  209. e.recordDd!.isAfter(dateStart.subtract(const Duration(days: 1))))
  210. .toList();
  211. }
  212. if (dateEnd != null) {
  213. list = list
  214. .where((e) =>
  215. e.recordDd != null &&
  216. e.recordDd!.isBefore(dateEnd.add(const Duration(days: 1))))
  217. .toList();
  218. }
  219. final keyword = ref.read(vehicleKeywordProvider);
  220. if (keyword.isNotEmpty) {
  221. final kw = keyword.toLowerCase();
  222. list = list.where((e) {
  223. return e.ycNo.toLowerCase().contains(kw) ||
  224. e.driverName.toLowerCase().contains(kw) ||
  225. e.licensePlate.toLowerCase().contains(kw) ||
  226. (e.applicantName).toLowerCase().contains(kw) ||
  227. e.reason.toLowerCase().contains(kw);
  228. }).toList();
  229. }
  230. final sortDir = ref.read(vehicleSortDirProvider);
  231. if (sortDir == 'ASC') {
  232. list.sort((a, b) => (a.recordDd ?? DateTime(2000)).compareTo(b.recordDd ?? DateTime(2000)));
  233. } else {
  234. list.sort((a, b) => (b.recordDd ?? DateTime(2000)).compareTo(a.recordDd ?? DateTime(2000)));
  235. }
  236. return list;
  237. },
  238. );