| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502 |
- /**
- * 司机端API接口模拟系统
- * 模拟后台司机管理、订单状态更新和位置共享功能
- */
- class DriverApiService {
- constructor() {
- this.listeners = []; // 订单状态变化监听器
- this.locationListeners = []; // 位置更新监听器
- this.initDriverData();
-
- // 模拟司机位置更新
- this.startLocationSimulation();
- }
- // 初始化司机数据
- initDriverData() {
- const drivers = this.getAllDrivers();
- if (drivers.length === 0) {
- // 初始化示例司机数据
- const sampleDrivers = [
- {
- id: 'driver_001',
- name: '张师傅',
- phone: '13800138001',
- carNumber: '京A12345',
- carModel: '宇通大巴',
- avatar: '/images/avatar-default.png',
- rating: 4.8,
- completedOrders: 1250,
- status: 'available', // available, busy, offline
- currentLocation: {
- lng: 116.404,
- lat: 39.915,
- address: '北京市东城区东直门',
- updateTime: new Date().toISOString()
- },
- certification: {
- driverLicense: '11010119800101****',
- vehicleLicense: '京A12345',
- verified: true
- }
- },
- {
- id: 'driver_002',
- name: '李师傅',
- phone: '13800138002',
- carNumber: '京B67890',
- carModel: '奔驰V级商务车',
- avatar: '/images/avatar-default.png',
- rating: 4.9,
- completedOrders: 890,
- status: 'available',
- currentLocation: {
- lng: 121.473,
- lat: 31.230,
- address: '上海市黄浦区人民广场',
- updateTime: new Date().toISOString()
- },
- certification: {
- driverLicense: '31010219850301****',
- vehicleLicense: '京B67890',
- verified: true
- }
- }
- ];
- this.saveDrivers(sampleDrivers);
- }
- }
- // 获取所有司机
- getAllDrivers() {
- try {
- return wx.getStorageSync('drivers') || [];
- } catch (error) {
- console.error('获取司机数据失败:', error);
- return [];
- }
- }
- // 保存司机数据
- saveDrivers(drivers) {
- try {
- wx.setStorageSync('drivers', drivers);
- return true;
- } catch (error) {
- console.error('保存司机数据失败:', error);
- return false;
- }
- }
- // 根据ID获取司机信息
- getDriverById(driverId) {
- const drivers = this.getAllDrivers();
- return drivers.find(driver => driver.id === driverId);
- }
- // 为订单分配司机(模拟后台API)
- async assignDriverToOrder(orderId, orderType = 'bus') {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- try {
- const drivers = this.getAllDrivers();
- const availableDrivers = drivers.filter(driver =>
- driver.status === 'available' &&
- this.isDriverSuitableForOrder(driver, orderType)
- );
- if (availableDrivers.length === 0) {
- reject(new Error('暂无可用司机'));
- return;
- }
- // 随机选择一个可用司机
- const selectedDriver = availableDrivers[Math.floor(Math.random() * availableDrivers.length)];
-
- // 更新司机状态为忙碌
- const updatedDrivers = drivers.map(driver =>
- driver.id === selectedDriver.id
- ? { ...driver, status: 'busy', currentOrderId: orderId }
- : driver
- );
- this.saveDrivers(updatedDrivers);
- // 创建司机订单关联
- this.createDriverOrderRelation(selectedDriver.id, orderId);
- resolve({
- success: true,
- data: {
- driverId: selectedDriver.id,
- driverName: selectedDriver.name,
- driverPhone: selectedDriver.phone,
- carNumber: selectedDriver.carNumber,
- carModel: selectedDriver.carModel,
- rating: selectedDriver.rating,
- estimatedArrival: this.calculateEstimatedArrival(),
- assignTime: new Date().toISOString()
- }
- });
- } catch (error) {
- reject(error);
- }
- }, 2000); // 模拟API延迟
- });
- }
- // 判断司机是否适合订单类型
- isDriverSuitableForOrder(driver, orderType) {
- if (orderType === 'business-charter') {
- return driver.carModel.includes('商务车') || driver.carModel.includes('奔驰') || driver.carModel.includes('宝马');
- }
- return true; // 大巴司机可以接所有订单
- }
- // 计算预计到达时间
- calculateEstimatedArrival() {
- const now = new Date();
- const estimatedMinutes = Math.floor(Math.random() * 20) + 10; // 10-30分钟
- const estimatedTime = new Date(now.getTime() + estimatedMinutes * 60000);
- return {
- minutes: estimatedMinutes,
- time: estimatedTime.toISOString(),
- display: `约${estimatedMinutes}分钟后到达`
- };
- }
- // 创建司机订单关联
- createDriverOrderRelation(driverId, orderId) {
- try {
- const relations = wx.getStorageSync('driver_order_relations') || [];
- const newRelation = {
- id: `relation_${Date.now()}`,
- driverId,
- orderId,
- createTime: new Date().toISOString(),
- status: 'assigned', // assigned, picked_up, in_transit, completed
- events: [
- {
- type: 'assigned',
- time: new Date().toISOString(),
- description: '司机已分配'
- }
- ]
- };
- relations.push(newRelation);
- wx.setStorageSync('driver_order_relations', relations);
- return newRelation;
- } catch (error) {
- console.error('创建司机订单关联失败:', error);
- return null;
- }
- }
- // 获取订单的司机信息
- getOrderDriverInfo(orderId) {
- try {
- const relations = wx.getStorageSync('driver_order_relations') || [];
- const relation = relations.find(r => r.orderId === orderId);
-
- if (!relation) {
- return null;
- }
- const driver = this.getDriverById(relation.driverId);
- if (!driver) {
- return null;
- }
- return {
- relation,
- driver,
- status: relation.status,
- events: relation.events,
- currentLocation: driver.currentLocation
- };
- } catch (error) {
- console.error('获取订单司机信息失败:', error);
- return null;
- }
- }
- // 司机确认乘客上车(模拟司机端操作)
- async confirmPickup(orderId, driverId) {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- try {
- const relations = wx.getStorageSync('driver_order_relations') || [];
- const relationIndex = relations.findIndex(r => r.orderId === orderId && r.driverId === driverId);
-
- if (relationIndex === -1) {
- reject(new Error('订单司机关联不存在'));
- return;
- }
- // 更新关联状态
- relations[relationIndex].status = 'picked_up';
- relations[relationIndex].events.push({
- type: 'picked_up',
- time: new Date().toISOString(),
- description: '乘客已上车',
- location: this.getDriverById(driverId)?.currentLocation
- });
- wx.setStorageSync('driver_order_relations', relations);
- // 通知监听器
- this.notifyOrderStatusChange(orderId, 'picked_up', '乘客已上车');
- resolve({
- success: true,
- message: '确认上车成功',
- status: 'picked_up',
- time: new Date().toISOString()
- });
- } catch (error) {
- reject(error);
- }
- }, 1000);
- });
- }
- // 司机开始行程(模拟司机端操作)
- async startTrip(orderId, driverId) {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- try {
- const relations = wx.getStorageSync('driver_order_relations') || [];
- const relationIndex = relations.findIndex(r => r.orderId === orderId && r.driverId === driverId);
-
- if (relationIndex === -1) {
- reject(new Error('订单司机关联不存在'));
- return;
- }
- relations[relationIndex].status = 'in_transit';
- relations[relationIndex].events.push({
- type: 'in_transit',
- time: new Date().toISOString(),
- description: '行程已开始',
- location: this.getDriverById(driverId)?.currentLocation
- });
- wx.setStorageSync('driver_order_relations', relations);
- this.notifyOrderStatusChange(orderId, 'in_transit', '行程中');
- resolve({
- success: true,
- message: '行程开始',
- status: 'in_transit',
- time: new Date().toISOString()
- });
- } catch (error) {
- reject(error);
- }
- }, 1000);
- });
- }
- // 司机确认到达(模拟司机端操作)
- async confirmArrival(orderId, driverId) {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- try {
- const relations = wx.getStorageSync('driver_order_relations') || [];
- const relationIndex = relations.findIndex(r => r.orderId === orderId && r.driverId === driverId);
-
- if (relationIndex === -1) {
- reject(new Error('订单司机关联不存在'));
- return;
- }
- relations[relationIndex].status = 'completed';
- relations[relationIndex].events.push({
- type: 'completed',
- time: new Date().toISOString(),
- description: '已到达目的地',
- location: this.getDriverById(driverId)?.currentLocation
- });
- wx.setStorageSync('driver_order_relations', relations);
- // 释放司机
- const drivers = this.getAllDrivers();
- const updatedDrivers = drivers.map(driver =>
- driver.id === driverId
- ? { ...driver, status: 'available', currentOrderId: null }
- : driver
- );
- this.saveDrivers(updatedDrivers);
- this.notifyOrderStatusChange(orderId, 'completed', '已完成');
- resolve({
- success: true,
- message: '行程完成',
- status: 'completed',
- time: new Date().toISOString()
- });
- } catch (error) {
- reject(error);
- }
- }, 1000);
- });
- }
- // 更新司机位置(模拟司机端定位)
- updateDriverLocation(driverId, location) {
- try {
- const drivers = this.getAllDrivers();
- const updatedDrivers = drivers.map(driver =>
- driver.id === driverId
- ? {
- ...driver,
- currentLocation: {
- ...location,
- updateTime: new Date().toISOString()
- }
- }
- : driver
- );
-
- this.saveDrivers(updatedDrivers);
- this.notifyLocationUpdate(driverId, location);
-
- return true;
- } catch (error) {
- console.error('更新司机位置失败:', error);
- return false;
- }
- }
- // 获取司机实时位置
- getDriverLocation(driverId) {
- const driver = this.getDriverById(driverId);
- return driver ? driver.currentLocation : null;
- }
- // 模拟司机位置移动
- startLocationSimulation() {
- // 清除之前的定时器
- if (this.locationTimer) {
- clearInterval(this.locationTimer);
- }
-
- this.locationTimer = setInterval(() => {
- const drivers = this.getAllDrivers();
- const busyDrivers = drivers.filter(driver => driver.status === 'busy');
-
- busyDrivers.forEach(driver => {
- // 模拟位置变化
- const currentLoc = driver.currentLocation;
- const newLocation = {
- lng: currentLoc.lng + (Math.random() - 0.5) * 0.01, // 随机移动
- lat: currentLoc.lat + (Math.random() - 0.5) * 0.01,
- address: this.generateRandomAddress(),
- updateTime: new Date().toISOString()
- };
-
- this.updateDriverLocation(driver.id, newLocation);
- });
- }, 10000); // 每10秒更新一次位置
- }
-
- // 停止位置模拟
- stopLocationSimulation() {
- if (this.locationTimer) {
- clearInterval(this.locationTimer);
- this.locationTimer = null;
- }
- }
- // 生成随机地址(模拟)
- generateRandomAddress() {
- const addresses = [
- '北京市朝阳区建国门外大街',
- '北京市海淀区中关村大街',
- '北京市东城区王府井大街',
- '北京市西城区金融街',
- '上海市黄浦区南京东路',
- '上海市浦东新区陆家嘴'
- ];
- return addresses[Math.floor(Math.random() * addresses.length)];
- }
- // 监听器管理
- addOrderStatusListener(callback) {
- this.listeners.push(callback);
- }
- removeOrderStatusListener(callback) {
- const index = this.listeners.indexOf(callback);
- if (index > -1) {
- this.listeners.splice(index, 1);
- }
- }
- notifyOrderStatusChange(orderId, status, statusText) {
- this.listeners.forEach(callback => {
- try {
- callback({ orderId, status, statusText, time: new Date().toISOString() });
- } catch (error) {
- console.error('订单状态监听器回调执行失败:', error);
- }
- });
- }
- addLocationListener(callback) {
- this.locationListeners.push(callback);
- }
- removeLocationListener(callback) {
- const index = this.locationListeners.indexOf(callback);
- if (index > -1) {
- this.locationListeners.splice(index, 1);
- }
- }
- notifyLocationUpdate(driverId, location) {
- this.locationListeners.forEach(callback => {
- try {
- callback({ driverId, location, time: new Date().toISOString() });
- } catch (error) {
- console.error('位置监听器回调执行失败:', error);
- }
- });
- }
- // 模拟司机端操作API(供测试使用)
- async simulateDriverActions(orderId, driverId) {
- try {
- console.log('开始模拟司机操作流程...');
-
- // 5秒后确认上车
- setTimeout(async () => {
- await this.confirmPickup(orderId, driverId);
- console.log('司机已确认乘客上车');
- }, 5000);
- // 10秒后开始行程
- setTimeout(async () => {
- await this.startTrip(orderId, driverId);
- console.log('司机已开始行程');
- }, 10000);
- // 60秒后确认到达(模拟1分钟行程)
- setTimeout(async () => {
- await this.confirmArrival(orderId, driverId);
- console.log('司机已确认到达');
- }, 60000);
- } catch (error) {
- console.error('模拟司机操作失败:', error);
- }
- }
- }
- // 创建单例实例
- const driverApiService = new DriverApiService();
- export default driverApiService;
|