passenger.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. /**
  2. * 乘车人管理工具类
  3. * 实现乘车人数据的增删改查和数据同步
  4. */
  5. class PassengerService {
  6. constructor() {
  7. this.listeners = []; // 数据变化监听器
  8. this.initPassengerData();
  9. }
  10. // 初始化乘车人数据
  11. initPassengerData() {
  12. const passengers = this.getAllPassengers();
  13. if (passengers.length === 0) {
  14. // 初始化示例数据
  15. const samplePassengers = [];
  16. this.savePassengers(samplePassengers);
  17. }
  18. }
  19. // 获取所有乘车人
  20. getAllPassengers() {
  21. try {
  22. return wx.getStorageSync('passengers') || [];
  23. } catch (error) {
  24. console.error('获取乘车人数据失败:', error);
  25. return [];
  26. }
  27. }
  28. // 保存乘车人列表
  29. savePassengers(passengers) {
  30. try {
  31. wx.setStorageSync('passengers', passengers);
  32. this.notifyListeners(passengers);
  33. return true;
  34. } catch (error) {
  35. console.error('保存乘车人数据失败:', error);
  36. return false;
  37. }
  38. }
  39. // 添加乘车人
  40. addPassenger(passenger) {
  41. // 验证必填字段
  42. if (!passenger.name || !passenger.idcard || !passenger.phone) {
  43. throw new Error('姓名、证件号码和手机号不能为空');
  44. }
  45. // 验证手机号格式
  46. if (!/^1[3-9]\d{9}$/.test(passenger.phone)) {
  47. throw new Error('请输入正确的手机号码');
  48. }
  49. // 验证身份证号格式(简单验证)
  50. 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)) {
  51. throw new Error('请输入正确的身份证号码');
  52. }
  53. const passengers = this.getAllPassengers();
  54. // 检查是否已存在相同证件号的乘车人
  55. const existingPassenger = passengers.find(p => p.idcard === passenger.idcard);
  56. if (existingPassenger) {
  57. throw new Error('该证件号码已存在');
  58. }
  59. // 生成唯一ID
  60. const newPassenger = {
  61. ...passenger,
  62. id: this.generateId(),
  63. createTime: new Date().toISOString(),
  64. updateTime: new Date().toISOString()
  65. };
  66. passengers.push(newPassenger);
  67. if (this.savePassengers(passengers)) {
  68. return newPassenger;
  69. } else {
  70. throw new Error('保存乘车人失败');
  71. }
  72. }
  73. // 更新乘车人
  74. updatePassenger(id, updatedData) {
  75. const passengers = this.getAllPassengers();
  76. const index = passengers.findIndex(p => p.id === id);
  77. if (index === -1) {
  78. throw new Error('乘车人不存在');
  79. }
  80. // 验证必填字段
  81. if (!updatedData.name || !updatedData.idcard || !updatedData.phone) {
  82. throw new Error('姓名、证件号码和手机号不能为空');
  83. }
  84. // 验证手机号格式
  85. if (!/^1[3-9]\d{9}$/.test(updatedData.phone)) {
  86. throw new Error('请输入正确的手机号码');
  87. }
  88. // 检查证件号是否与其他乘车人重复
  89. const existingPassenger = passengers.find(p => p.id !== id && p.idcard === updatedData.idcard);
  90. if (existingPassenger) {
  91. throw new Error('该证件号码已存在');
  92. }
  93. passengers[index] = {
  94. ...passengers[index],
  95. ...updatedData,
  96. updateTime: new Date().toISOString()
  97. };
  98. if (this.savePassengers(passengers)) {
  99. return passengers[index];
  100. } else {
  101. throw new Error('更新乘车人失败');
  102. }
  103. }
  104. // 删除乘车人
  105. deletePassenger(id) {
  106. const passengers = this.getAllPassengers();
  107. const filteredPassengers = passengers.filter(p => p.id !== id);
  108. if (filteredPassengers.length === passengers.length) {
  109. throw new Error('乘车人不存在');
  110. }
  111. if (this.savePassengers(filteredPassengers)) {
  112. return true;
  113. } else {
  114. throw new Error('删除乘车人失败');
  115. }
  116. }
  117. // 根据ID获取乘车人
  118. getPassengerById(id) {
  119. const passengers = this.getAllPassengers();
  120. return passengers.find(p => p.id === id) || null;
  121. }
  122. // 搜索乘车人
  123. searchPassengers(keyword) {
  124. const passengers = this.getAllPassengers();
  125. if (!keyword) return passengers;
  126. const lowerKeyword = keyword.toLowerCase();
  127. return passengers.filter(p =>
  128. p.name.toLowerCase().includes(lowerKeyword) ||
  129. p.phone.includes(keyword) ||
  130. p.idcard.includes(keyword)
  131. );
  132. }
  133. // 获取常用乘车人(按使用频率排序)
  134. getFrequentPassengers(limit = 5) {
  135. const passengers = this.getAllPassengers();
  136. // 按创建时间倒序,实际项目中可以按使用频率排序
  137. return passengers
  138. .sort((a, b) => new Date(b.updateTime) - new Date(a.updateTime))
  139. .slice(0, limit);
  140. }
  141. // 批量选择乘车人(用于购票)
  142. selectPassengersForBooking(passengerIds) {
  143. const passengers = this.getAllPassengers();
  144. const selectedPassengers = passengers.filter(p => passengerIds.includes(p.id));
  145. // 验证所有ID都找到了对应的乘车人
  146. if (selectedPassengers.length !== passengerIds.length) {
  147. throw new Error('部分乘车人不存在');
  148. }
  149. return selectedPassengers;
  150. }
  151. // 生成唯一ID
  152. generateId() {
  153. return 'passenger_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
  154. }
  155. // 数据监听器管理
  156. addListener(callback) {
  157. this.listeners.push(callback);
  158. }
  159. removeListener(callback) {
  160. const index = this.listeners.indexOf(callback);
  161. if (index > -1) {
  162. this.listeners.splice(index, 1);
  163. }
  164. }
  165. notifyListeners(passengers) {
  166. this.listeners.forEach(callback => {
  167. try {
  168. callback(passengers);
  169. } catch (error) {
  170. console.error('乘车人数据监听器回调执行失败:', error);
  171. }
  172. });
  173. }
  174. // 导出乘车人数据(用于备份)
  175. exportPassengers() {
  176. return {
  177. passengers: this.getAllPassengers(),
  178. exportTime: new Date().toISOString(),
  179. version: '1.0.0'
  180. };
  181. }
  182. // 导入乘车人数据(用于恢复)
  183. importPassengers(data) {
  184. if (!data || !Array.isArray(data.passengers)) {
  185. throw new Error('导入数据格式错误');
  186. }
  187. try {
  188. this.savePassengers(data.passengers);
  189. return true;
  190. } catch (error) {
  191. console.error('导入乘车人数据失败:', error);
  192. throw new Error('导入乘车人数据失败');
  193. }
  194. }
  195. }
  196. // 创建单例实例
  197. const passengerService = new PassengerService();
  198. export default passengerService;