/** * 乘车人管理工具类 * 实现乘车人数据的增删改查和数据同步 */ class PassengerService { constructor() { this.listeners = []; // 数据变化监听器 this.initPassengerData(); } // 初始化乘车人数据 initPassengerData() { const passengers = this.getAllPassengers(); if (passengers.length === 0) { // 初始化示例数据 const samplePassengers = []; this.savePassengers(samplePassengers); } } // 获取所有乘车人 getAllPassengers() { try { return wx.getStorageSync('passengers') || []; } catch (error) { console.error('获取乘车人数据失败:', error); return []; } } // 保存乘车人列表 savePassengers(passengers) { try { wx.setStorageSync('passengers', passengers); this.notifyListeners(passengers); return true; } catch (error) { console.error('保存乘车人数据失败:', error); return false; } } // 添加乘车人 addPassenger(passenger) { // 验证必填字段 if (!passenger.name || !passenger.idcard || !passenger.phone) { throw new Error('姓名、证件号码和手机号不能为空'); } // 验证手机号格式 if (!/^1[3-9]\d{9}$/.test(passenger.phone)) { throw new Error('请输入正确的手机号码'); } // 验证身份证号格式(简单验证) if (passenger.idtype === '身份证' && !/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(passenger.idcard)) { throw new Error('请输入正确的身份证号码'); } const passengers = this.getAllPassengers(); // 检查是否已存在相同证件号的乘车人 const existingPassenger = passengers.find(p => p.idcard === passenger.idcard); if (existingPassenger) { throw new Error('该证件号码已存在'); } // 生成唯一ID const newPassenger = { ...passenger, id: this.generateId(), createTime: new Date().toISOString(), updateTime: new Date().toISOString() }; passengers.push(newPassenger); if (this.savePassengers(passengers)) { return newPassenger; } else { throw new Error('保存乘车人失败'); } } // 更新乘车人 updatePassenger(id, updatedData) { const passengers = this.getAllPassengers(); const index = passengers.findIndex(p => p.id === id); if (index === -1) { throw new Error('乘车人不存在'); } // 验证必填字段 if (!updatedData.name || !updatedData.idcard || !updatedData.phone) { throw new Error('姓名、证件号码和手机号不能为空'); } // 验证手机号格式 if (!/^1[3-9]\d{9}$/.test(updatedData.phone)) { throw new Error('请输入正确的手机号码'); } // 检查证件号是否与其他乘车人重复 const existingPassenger = passengers.find(p => p.id !== id && p.idcard === updatedData.idcard); if (existingPassenger) { throw new Error('该证件号码已存在'); } passengers[index] = { ...passengers[index], ...updatedData, updateTime: new Date().toISOString() }; if (this.savePassengers(passengers)) { return passengers[index]; } else { throw new Error('更新乘车人失败'); } } // 删除乘车人 deletePassenger(id) { const passengers = this.getAllPassengers(); const filteredPassengers = passengers.filter(p => p.id !== id); if (filteredPassengers.length === passengers.length) { throw new Error('乘车人不存在'); } if (this.savePassengers(filteredPassengers)) { return true; } else { throw new Error('删除乘车人失败'); } } // 根据ID获取乘车人 getPassengerById(id) { const passengers = this.getAllPassengers(); return passengers.find(p => p.id === id) || null; } // 搜索乘车人 searchPassengers(keyword) { const passengers = this.getAllPassengers(); if (!keyword) return passengers; const lowerKeyword = keyword.toLowerCase(); return passengers.filter(p => p.name.toLowerCase().includes(lowerKeyword) || p.phone.includes(keyword) || p.idcard.includes(keyword) ); } // 获取常用乘车人(按使用频率排序) getFrequentPassengers(limit = 5) { const passengers = this.getAllPassengers(); // 按创建时间倒序,实际项目中可以按使用频率排序 return passengers .sort((a, b) => new Date(b.updateTime) - new Date(a.updateTime)) .slice(0, limit); } // 批量选择乘车人(用于购票) selectPassengersForBooking(passengerIds) { const passengers = this.getAllPassengers(); const selectedPassengers = passengers.filter(p => passengerIds.includes(p.id)); // 验证所有ID都找到了对应的乘车人 if (selectedPassengers.length !== passengerIds.length) { throw new Error('部分乘车人不存在'); } return selectedPassengers; } // 生成唯一ID generateId() { return 'passenger_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9); } // 数据监听器管理 addListener(callback) { this.listeners.push(callback); } removeListener(callback) { const index = this.listeners.indexOf(callback); if (index > -1) { this.listeners.splice(index, 1); } } notifyListeners(passengers) { this.listeners.forEach(callback => { try { callback(passengers); } catch (error) { console.error('乘车人数据监听器回调执行失败:', error); } }); } // 导出乘车人数据(用于备份) exportPassengers() { return { passengers: this.getAllPassengers(), exportTime: new Date().toISOString(), version: '1.0.0' }; } // 导入乘车人数据(用于恢复) importPassengers(data) { if (!data || !Array.isArray(data.passengers)) { throw new Error('导入数据格式错误'); } try { this.savePassengers(data.passengers); return true; } catch (error) { console.error('导入乘车人数据失败:', error); throw new Error('导入乘车人数据失败'); } } } // 创建单例实例 const passengerService = new PassengerService(); export default passengerService;