| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- /**
- * 乘车人管理工具类
- * 实现乘车人数据的增删改查和数据同步
- */
- 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;
|