vehicle-api.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. /**
  2. * 车辆管理API接口系统
  3. * 支持车辆型号、车牌号码、司机信息管理
  4. */
  5. class VehicleApiService {
  6. constructor() {
  7. this.listeners = []; // 数据变化监听器
  8. this.initVehicleData();
  9. }
  10. // 初始化车辆数据
  11. initVehicleData() {
  12. const vehicles = this.getAllVehicles();
  13. if (vehicles.length === 0) {
  14. const sampleVehicles = [
  15. {
  16. id: 'vehicle_001',
  17. activityId: 'activity_001',
  18. activityName: '北京春季音乐节',
  19. vehicleModel: '宇通ZK6127H',
  20. licensePlate: '京A12345',
  21. capacity: 50,
  22. type: 'bus', // bus, business, charter
  23. status: 'active', // active, inactive, maintenance, retired
  24. driver: {
  25. id: 'driver_001',
  26. name: '张师傅',
  27. phone: '13800138001',
  28. licenseNumber: 'A123456789',
  29. licenseType: 'A1',
  30. experience: '5年',
  31. rating: 4.8,
  32. status: 'active'
  33. },
  34. features: ['空调', 'WiFi', '充电插座', '安全带'],
  35. insurance: {
  36. company: '中国人民保险公司',
  37. policyNumber: 'PIC2024001',
  38. expiryDate: '2025-01-15'
  39. },
  40. maintenance: {
  41. lastService: '2024-01-10',
  42. nextService: '2024-04-10',
  43. mileage: 150000
  44. },
  45. createTime: '2024-01-15 10:00:00',
  46. updateTime: '2024-01-15 10:00:00'
  47. },
  48. {
  49. id: 'vehicle_002',
  50. activityId: 'activity_001',
  51. activityName: '北京春季音乐节',
  52. vehicleModel: '奔驰V级',
  53. licensePlate: '京B67890',
  54. capacity: 20,
  55. type: 'business',
  56. status: 'active',
  57. driver: {
  58. id: 'driver_002',
  59. name: '李师傅',
  60. phone: '13800138002',
  61. licenseNumber: 'A987654321',
  62. licenseType: 'A2',
  63. experience: '8年',
  64. rating: 4.9,
  65. status: 'active'
  66. },
  67. features: ['真皮座椅', '独立空调', 'WiFi', '充电插座', '小冰箱'],
  68. insurance: {
  69. company: '太平洋保险公司',
  70. policyNumber: 'TPI2024002',
  71. expiryDate: '2025-02-20'
  72. },
  73. maintenance: {
  74. lastService: '2024-01-05',
  75. nextService: '2024-04-05',
  76. mileage: 80000
  77. },
  78. createTime: '2024-01-15 10:00:00',
  79. updateTime: '2024-01-15 10:00:00'
  80. },
  81. {
  82. id: 'vehicle_003',
  83. activityId: 'activity_001',
  84. activityName: '北京春季音乐节',
  85. vehicleModel: '奔驰V级豪华版',
  86. licensePlate: '京C11111',
  87. capacity: 6,
  88. type: 'charter',
  89. status: 'active',
  90. driver: {
  91. id: 'driver_003',
  92. name: '王师傅',
  93. phone: '13800138003',
  94. licenseNumber: 'A555666777',
  95. licenseType: 'A1',
  96. experience: '10年',
  97. rating: 5.0,
  98. status: 'active'
  99. },
  100. features: ['豪华真皮座椅', '独立空调', 'WiFi', '充电插座', '小冰箱', '娱乐系统'],
  101. insurance: {
  102. company: '中国平安保险公司',
  103. policyNumber: 'PAI2024003',
  104. expiryDate: '2025-03-10'
  105. },
  106. maintenance: {
  107. lastService: '2024-01-01',
  108. nextService: '2024-04-01',
  109. mileage: 50000
  110. },
  111. createTime: '2024-01-15 10:00:00',
  112. updateTime: '2024-01-15 10:00:00'
  113. }
  114. ];
  115. this.saveVehicles(sampleVehicles);
  116. }
  117. }
  118. // 获取所有车辆
  119. getAllVehicles() {
  120. try {
  121. return wx.getStorageSync('vehicles') || [];
  122. } catch (error) {
  123. console.error('获取车辆数据失败:', error);
  124. return [];
  125. }
  126. }
  127. // 保存车辆数据
  128. saveVehicles(vehicles) {
  129. try {
  130. wx.setStorageSync('vehicles', vehicles);
  131. this.notifyListeners(vehicles);
  132. return true;
  133. } catch (error) {
  134. console.error('保存车辆数据失败:', error);
  135. return false;
  136. }
  137. }
  138. // 根据ID获取车辆
  139. getVehicleById(vehicleId) {
  140. const vehicles = this.getAllVehicles();
  141. return vehicles.find(vehicle => vehicle.id === vehicleId);
  142. }
  143. // 根据活动ID获取车辆
  144. getVehiclesByActivityId(activityId) {
  145. const vehicles = this.getAllVehicles();
  146. return vehicles.filter(vehicle => vehicle.activityId === activityId);
  147. }
  148. // 根据车牌号获取车辆
  149. getVehicleByLicensePlate(licensePlate) {
  150. const vehicles = this.getAllVehicles();
  151. return vehicles.find(vehicle => vehicle.licensePlate === licensePlate);
  152. }
  153. // 创建车辆
  154. createVehicle(vehicleData) {
  155. const vehicles = this.getAllVehicles();
  156. const newVehicle = {
  157. ...vehicleData,
  158. id: this.generateVehicleId(),
  159. createTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
  160. updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
  161. status: vehicleData.status || 'active'
  162. };
  163. vehicles.push(newVehicle);
  164. this.saveVehicles(vehicles);
  165. return newVehicle;
  166. }
  167. // 更新车辆
  168. updateVehicle(vehicleId, updateData) {
  169. const vehicles = this.getAllVehicles();
  170. const vehicleIndex = vehicles.findIndex(vehicle => vehicle.id === vehicleId);
  171. if (vehicleIndex === -1) {
  172. throw new Error('车辆不存在');
  173. }
  174. vehicles[vehicleIndex] = {
  175. ...vehicles[vehicleIndex],
  176. ...updateData,
  177. updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
  178. };
  179. this.saveVehicles(vehicles);
  180. return vehicles[vehicleIndex];
  181. }
  182. // 删除车辆
  183. deleteVehicle(vehicleId) {
  184. const vehicles = this.getAllVehicles();
  185. const filteredVehicles = vehicles.filter(vehicle => vehicle.id !== vehicleId);
  186. if (filteredVehicles.length === vehicles.length) {
  187. throw new Error('车辆不存在');
  188. }
  189. this.saveVehicles(filteredVehicles);
  190. return true;
  191. }
  192. // 更新车辆司机信息
  193. updateVehicleDriver(vehicleId, driverData) {
  194. const vehicles = this.getAllVehicles();
  195. const vehicleIndex = vehicles.findIndex(vehicle => vehicle.id === vehicleId);
  196. if (vehicleIndex === -1) {
  197. throw new Error('车辆不存在');
  198. }
  199. vehicles[vehicleIndex].driver = {
  200. ...vehicles[vehicleIndex].driver,
  201. ...driverData
  202. };
  203. vehicles[vehicleIndex].updateTime = new Date().toISOString().replace('T', ' ').substring(0, 19);
  204. this.saveVehicles(vehicles);
  205. return vehicles[vehicleIndex];
  206. }
  207. // 搜索车辆
  208. searchVehicles(searchParams) {
  209. const vehicles = this.getAllVehicles();
  210. let filteredVehicles = [...vehicles];
  211. // 按活动ID搜索
  212. if (searchParams.activityId) {
  213. filteredVehicles = filteredVehicles.filter(vehicle =>
  214. vehicle.activityId === searchParams.activityId
  215. );
  216. }
  217. // 按车辆型号搜索
  218. if (searchParams.vehicleModel) {
  219. filteredVehicles = filteredVehicles.filter(vehicle =>
  220. vehicle.vehicleModel.toLowerCase().includes(searchParams.vehicleModel.toLowerCase())
  221. );
  222. }
  223. // 按车牌号搜索
  224. if (searchParams.licensePlate) {
  225. filteredVehicles = filteredVehicles.filter(vehicle =>
  226. vehicle.licensePlate.includes(searchParams.licensePlate)
  227. );
  228. }
  229. // 按车辆类型搜索
  230. if (searchParams.type) {
  231. filteredVehicles = filteredVehicles.filter(vehicle =>
  232. vehicle.type === searchParams.type
  233. );
  234. }
  235. // 按状态搜索
  236. if (searchParams.status) {
  237. filteredVehicles = filteredVehicles.filter(vehicle =>
  238. vehicle.status === searchParams.status
  239. );
  240. }
  241. // 按司机姓名搜索
  242. if (searchParams.driverName) {
  243. filteredVehicles = filteredVehicles.filter(vehicle =>
  244. vehicle.driver.name.toLowerCase().includes(searchParams.driverName.toLowerCase())
  245. );
  246. }
  247. // 按司机电话搜索
  248. if (searchParams.driverPhone) {
  249. filteredVehicles = filteredVehicles.filter(vehicle =>
  250. vehicle.driver.phone.includes(searchParams.driverPhone)
  251. );
  252. }
  253. // 排序
  254. const sortBy = searchParams.sortBy || 'createTime';
  255. const sortOrder = searchParams.sortOrder || 'desc';
  256. filteredVehicles.sort((a, b) => {
  257. let aValue = a[sortBy];
  258. let bValue = b[sortBy];
  259. if (sortBy === 'createTime' || sortBy === 'updateTime') {
  260. aValue = new Date(aValue);
  261. bValue = new Date(bValue);
  262. }
  263. if (sortOrder === 'asc') {
  264. return aValue > bValue ? 1 : -1;
  265. } else {
  266. return aValue < bValue ? 1 : -1;
  267. }
  268. });
  269. return {
  270. vehicles: filteredVehicles,
  271. total: filteredVehicles.length,
  272. page: searchParams.page || 1,
  273. pageSize: searchParams.pageSize || 20
  274. };
  275. }
  276. // 获取车辆统计信息
  277. getVehicleStatistics() {
  278. const vehicles = this.getAllVehicles();
  279. const stats = {
  280. total: vehicles.length,
  281. byType: {},
  282. byStatus: {},
  283. byActivity: {},
  284. totalCapacity: 0,
  285. activeDrivers: 0
  286. };
  287. vehicles.forEach(vehicle => {
  288. // 按类型统计
  289. stats.byType[vehicle.type] = (stats.byType[vehicle.type] || 0) + 1;
  290. // 按状态统计
  291. stats.byStatus[vehicle.status] = (stats.byStatus[vehicle.status] || 0) + 1;
  292. // 按活动统计
  293. stats.byActivity[vehicle.activityId] = (stats.byActivity[vehicle.activityId] || 0) + 1;
  294. // 总容量统计
  295. stats.totalCapacity += vehicle.capacity;
  296. // 活跃司机统计
  297. if (vehicle.driver.status === 'active') {
  298. stats.activeDrivers++;
  299. }
  300. });
  301. return stats;
  302. }
  303. // 批量更新车辆状态
  304. batchUpdateVehicleStatus(vehicleIds, status) {
  305. const vehicles = this.getAllVehicles();
  306. const updatedVehicles = vehicles.map(vehicle => {
  307. if (vehicleIds.includes(vehicle.id)) {
  308. return {
  309. ...vehicle,
  310. status,
  311. updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
  312. };
  313. }
  314. return vehicle;
  315. });
  316. this.saveVehicles(updatedVehicles);
  317. return true;
  318. }
  319. // 获取可用车辆(用于订单分配)
  320. getAvailableVehicles(activityId, type = null, capacity = null) {
  321. const vehicles = this.getVehiclesByActivityId(activityId);
  322. return vehicles.filter(vehicle => {
  323. // 状态检查
  324. if (vehicle.status !== 'active') return false;
  325. if (vehicle.driver.status !== 'active') return false;
  326. // 类型检查
  327. if (type && vehicle.type !== type) return false;
  328. // 容量检查
  329. if (capacity && vehicle.capacity < capacity) return false;
  330. return true;
  331. });
  332. }
  333. // 分配车辆到订单
  334. assignVehicleToOrder(orderId, vehicleId) {
  335. const vehicles = this.getAllVehicles();
  336. const vehicleIndex = vehicles.findIndex(vehicle => vehicle.id === vehicleId);
  337. if (vehicleIndex === -1) {
  338. throw new Error('车辆不存在');
  339. }
  340. // 更新车辆状态为已分配
  341. vehicles[vehicleIndex].currentOrder = orderId;
  342. vehicles[vehicleIndex].updateTime = new Date().toISOString().replace('T', ' ').substring(0, 19);
  343. this.saveVehicles(vehicles);
  344. return vehicles[vehicleIndex];
  345. }
  346. // 释放车辆(订单完成后)
  347. releaseVehicle(vehicleId) {
  348. const vehicles = this.getAllVehicles();
  349. const vehicleIndex = vehicles.findIndex(vehicle => vehicle.id === vehicleId);
  350. if (vehicleIndex === -1) {
  351. throw new Error('车辆不存在');
  352. }
  353. // 清除当前订单
  354. delete vehicles[vehicleIndex].currentOrder;
  355. vehicles[vehicleIndex].updateTime = new Date().toISOString().replace('T', ' ').substring(0, 19);
  356. this.saveVehicles(vehicles);
  357. return vehicles[vehicleIndex];
  358. }
  359. // 导出车辆数据
  360. exportVehicles(searchParams = {}) {
  361. const result = this.searchVehicles(searchParams);
  362. return {
  363. vehicles: result.vehicles,
  364. exportTime: new Date().toISOString(),
  365. total: result.total,
  366. searchParams
  367. };
  368. }
  369. // 生成车辆ID
  370. generateVehicleId() {
  371. const timestamp = Date.now();
  372. const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0');
  373. return `vehicle_${timestamp}_${random}`;
  374. }
  375. // 监听器管理
  376. addListener(callback) {
  377. this.listeners.push(callback);
  378. }
  379. removeListener(callback) {
  380. const index = this.listeners.indexOf(callback);
  381. if (index > -1) {
  382. this.listeners.splice(index, 1);
  383. }
  384. }
  385. notifyListeners(vehicles) {
  386. this.listeners.forEach(callback => {
  387. try {
  388. callback(vehicles);
  389. } catch (error) {
  390. console.error('车辆数据监听器回调执行失败:', error);
  391. }
  392. });
  393. }
  394. // 同步车辆数据
  395. syncVehicleData() {
  396. const vehicles = this.getAllVehicles();
  397. this.notifyListeners(vehicles);
  398. return vehicles;
  399. }
  400. }
  401. // 创建单例实例
  402. const vehicleApiService = new VehicleApiService();
  403. export default vehicleApiService;