order-api.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482
  1. /**
  2. * 订单管理API接口系统
  3. * 为后台管理系统提供订单查询、管理功能
  4. * 确保数据一致性和完整性
  5. */
  6. class OrderApiService {
  7. constructor() {
  8. this.listeners = []; // 订单数据变化监听器
  9. this.initOrderData();
  10. }
  11. // 初始化订单数据
  12. initOrderData() {
  13. const orders = this.getAllOrders();
  14. if (orders.length === 0) {
  15. // 初始化示例订单数据
  16. const sampleOrders = [
  17. {
  18. id: 'ORDER_1705123456789_001',
  19. orderNo: 'ORD20240115001',
  20. status: '待出发',
  21. statusCode: 1,
  22. activity: '北京到上海商务出行',
  23. schedule: {
  24. date: '2024-03-15',
  25. time: '09:00',
  26. fromLoc: '北京东直门地铁站A口',
  27. toLoc: '上海体育馆',
  28. model: '宇通大巴',
  29. type: 'bus',
  30. price: 88,
  31. duration: '约5小时',
  32. left: 12
  33. },
  34. passengers: [
  35. {
  36. name: '张三',
  37. idtype: '身份证',
  38. idcard: '110101199001011234',
  39. phone: '13800138001'
  40. }
  41. ],
  42. totalPrice: 88,
  43. createTime: '2024-01-15 10:30:00',
  44. updateTime: '2024-01-15 10:30:00',
  45. paymentTime: '2024-01-15 10:32:00',
  46. driver: {
  47. id: 'driver_001',
  48. name: '张师傅',
  49. phone: '13800138001',
  50. carNumber: '京A12345',
  51. carModel: '宇通大巴',
  52. location: {
  53. lng: 116.404,
  54. lat: 39.915,
  55. address: '北京市东城区东直门'
  56. }
  57. },
  58. contactInfo: {
  59. phone: '138****8001',
  60. email: 'user@example.com'
  61. },
  62. notes: '请准时到达上车点',
  63. tags: ['商务出行', '热门路线']
  64. },
  65. {
  66. id: 'ORDER_1705123456790_002',
  67. orderNo: 'ORD20240115002',
  68. status: '行程中',
  69. statusCode: 2,
  70. activity: '北京到天津短途游',
  71. schedule: {
  72. date: '2024-01-16',
  73. time: '14:00',
  74. fromLoc: '北京朝阳区',
  75. toLoc: '天津滨海新区',
  76. model: '奔驰V级商务车',
  77. type: 'business-charter',
  78. price: 1200,
  79. duration: '约1.5小时',
  80. left: 6
  81. },
  82. passengers: [
  83. {
  84. name: '李四',
  85. idtype: '身份证',
  86. idcard: '110101199002021234',
  87. phone: '13800138002'
  88. },
  89. {
  90. name: '王五',
  91. idtype: '身份证',
  92. idcard: '110101199003031234',
  93. phone: '13800138003'
  94. }
  95. ],
  96. totalPrice: 1200,
  97. createTime: '2024-01-15 14:20:00',
  98. updateTime: '2024-01-16 14:05:00',
  99. paymentTime: '2024-01-15 14:25:00',
  100. driver: {
  101. id: 'driver_002',
  102. name: '李师傅',
  103. phone: '13800138002',
  104. carNumber: '京B67890',
  105. carModel: '奔驰V级商务车',
  106. location: {
  107. lng: 121.473,
  108. lat: 31.230,
  109. address: '天津市滨海新区'
  110. }
  111. },
  112. contactInfo: {
  113. phone: '138****8002',
  114. email: 'user2@example.com'
  115. },
  116. notes: '包车服务,已确认上车',
  117. tags: ['包车', '商务']
  118. }
  119. ];
  120. this.saveOrders(sampleOrders);
  121. }
  122. }
  123. // 获取所有订单
  124. getAllOrders() {
  125. try {
  126. return wx.getStorageSync('orders') || [];
  127. } catch (error) {
  128. console.error('获取订单数据失败:', error);
  129. return [];
  130. }
  131. }
  132. // 保存订单数据
  133. saveOrders(orders) {
  134. try {
  135. wx.setStorageSync('orders', orders);
  136. this.notifyListeners(orders);
  137. return true;
  138. } catch (error) {
  139. console.error('保存订单数据失败:', error);
  140. return false;
  141. }
  142. }
  143. // 根据ID获取订单
  144. getOrderById(orderId) {
  145. const orders = this.getAllOrders();
  146. return orders.find(order => order.id === orderId);
  147. }
  148. // 根据订单号获取订单
  149. getOrderByOrderNo(orderNo) {
  150. const orders = this.getAllOrders();
  151. return orders.find(order => order.orderNo === orderNo);
  152. }
  153. // 创建新订单
  154. createOrder(orderData) {
  155. const orders = this.getAllOrders();
  156. const newOrder = {
  157. ...orderData,
  158. id: this.generateOrderId(),
  159. orderNo: this.generateOrderNo(),
  160. createTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
  161. updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19),
  162. status: '待出发',
  163. statusCode: 1
  164. };
  165. orders.push(newOrder);
  166. this.saveOrders(orders);
  167. return newOrder;
  168. }
  169. // 更新订单
  170. updateOrder(orderId, updateData) {
  171. const orders = this.getAllOrders();
  172. const orderIndex = orders.findIndex(order => order.id === orderId);
  173. if (orderIndex === -1) {
  174. throw new Error('订单不存在');
  175. }
  176. orders[orderIndex] = {
  177. ...orders[orderIndex],
  178. ...updateData,
  179. updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
  180. };
  181. this.saveOrders(orders);
  182. return orders[orderIndex];
  183. }
  184. // 删除订单
  185. deleteOrder(orderId) {
  186. const orders = this.getAllOrders();
  187. const filteredOrders = orders.filter(order => order.id !== orderId);
  188. if (filteredOrders.length === orders.length) {
  189. throw new Error('订单不存在');
  190. }
  191. this.saveOrders(filteredOrders);
  192. return true;
  193. }
  194. // 订单查询功能
  195. searchOrders(searchParams) {
  196. const orders = this.getAllOrders();
  197. let filteredOrders = [...orders];
  198. // 按订单号查询
  199. if (searchParams.orderNo) {
  200. filteredOrders = filteredOrders.filter(order =>
  201. order.orderNo.toLowerCase().includes(searchParams.orderNo.toLowerCase())
  202. );
  203. }
  204. // 按日期查询
  205. if (searchParams.date) {
  206. filteredOrders = filteredOrders.filter(order =>
  207. order.schedule.date === searchParams.date
  208. );
  209. }
  210. // 按到达城市查询
  211. if (searchParams.toCity) {
  212. filteredOrders = filteredOrders.filter(order =>
  213. order.schedule.toLoc.includes(searchParams.toCity)
  214. );
  215. }
  216. // 按手机号查询
  217. if (searchParams.phone) {
  218. filteredOrders = filteredOrders.filter(order =>
  219. order.passengers.some(passenger =>
  220. passenger.phone.includes(searchParams.phone)
  221. ) ||
  222. order.contactInfo.phone.includes(searchParams.phone)
  223. );
  224. }
  225. // 按状态查询
  226. if (searchParams.status) {
  227. filteredOrders = filteredOrders.filter(order =>
  228. order.status === searchParams.status
  229. );
  230. }
  231. // 按创建时间范围查询
  232. if (searchParams.startDate && searchParams.endDate) {
  233. filteredOrders = filteredOrders.filter(order => {
  234. const orderDate = new Date(order.createTime);
  235. const startDate = new Date(searchParams.startDate);
  236. const endDate = new Date(searchParams.endDate);
  237. return orderDate >= startDate && orderDate <= endDate;
  238. });
  239. }
  240. // 排序
  241. const sortBy = searchParams.sortBy || 'createTime';
  242. const sortOrder = searchParams.sortOrder || 'desc';
  243. filteredOrders.sort((a, b) => {
  244. let aValue = a[sortBy];
  245. let bValue = b[sortBy];
  246. if (sortBy === 'createTime' || sortBy === 'updateTime') {
  247. aValue = new Date(aValue);
  248. bValue = new Date(bValue);
  249. }
  250. if (sortOrder === 'asc') {
  251. return aValue > bValue ? 1 : -1;
  252. } else {
  253. return aValue < bValue ? 1 : -1;
  254. }
  255. });
  256. return {
  257. orders: filteredOrders,
  258. total: filteredOrders.length,
  259. page: searchParams.page || 1,
  260. pageSize: searchParams.pageSize || 20
  261. };
  262. }
  263. // 获取订单统计信息
  264. getOrderStatistics() {
  265. const orders = this.getAllOrders();
  266. const stats = {
  267. total: orders.length,
  268. byStatus: {},
  269. byDate: {},
  270. revenue: 0,
  271. averageOrderValue: 0
  272. };
  273. orders.forEach(order => {
  274. // 按状态统计
  275. stats.byStatus[order.status] = (stats.byStatus[order.status] || 0) + 1;
  276. // 按日期统计
  277. const date = order.schedule.date;
  278. stats.byDate[date] = (stats.byDate[date] || 0) + 1;
  279. // 收入统计
  280. if (order.status !== '已取消') {
  281. stats.revenue += order.totalPrice;
  282. }
  283. });
  284. // 计算平均订单价值
  285. const paidOrders = orders.filter(order => order.status !== '已取消');
  286. stats.averageOrderValue = paidOrders.length > 0 ?
  287. (stats.revenue / paidOrders.length).toFixed(2) : 0;
  288. return stats;
  289. }
  290. // 批量更新订单状态
  291. batchUpdateOrderStatus(orderIds, status, statusCode) {
  292. const orders = this.getAllOrders();
  293. const updatedOrders = orders.map(order => {
  294. if (orderIds.includes(order.id)) {
  295. return {
  296. ...order,
  297. status,
  298. statusCode,
  299. updateTime: new Date().toISOString().replace('T', ' ').substring(0, 19)
  300. };
  301. }
  302. return order;
  303. });
  304. this.saveOrders(updatedOrders);
  305. return true;
  306. }
  307. // 导出订单数据
  308. exportOrders(searchParams = {}) {
  309. const result = this.searchOrders(searchParams);
  310. return {
  311. orders: result.orders,
  312. exportTime: new Date().toISOString(),
  313. total: result.total,
  314. searchParams
  315. };
  316. }
  317. // 生成订单ID
  318. generateOrderId() {
  319. const timestamp = Date.now();
  320. const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0');
  321. return `ORDER_${timestamp}_${random}`;
  322. }
  323. // 生成订单号
  324. generateOrderNo() {
  325. const now = new Date();
  326. const year = now.getFullYear();
  327. const month = (now.getMonth() + 1).toString().padStart(2, '0');
  328. const day = now.getDate().toString().padStart(2, '0');
  329. const random = Math.floor(Math.random() * 1000).toString().padStart(3, '0');
  330. return `ORD${year}${month}${day}${random}`;
  331. }
  332. // 监听器管理
  333. addListener(callback) {
  334. this.listeners.push(callback);
  335. }
  336. removeListener(callback) {
  337. const index = this.listeners.indexOf(callback);
  338. if (index > -1) {
  339. this.listeners.splice(index, 1);
  340. }
  341. }
  342. notifyListeners(orders) {
  343. this.listeners.forEach(callback => {
  344. try {
  345. callback(orders);
  346. } catch (error) {
  347. console.error('订单数据监听器回调执行失败:', error);
  348. }
  349. });
  350. }
  351. // 同步订单数据(确保一致性)
  352. syncOrderData() {
  353. const orders = this.getAllOrders();
  354. this.notifyListeners(orders);
  355. return orders;
  356. }
  357. // 获取订单详情(包含完整信息)
  358. getOrderDetails(orderId) {
  359. const order = this.getOrderById(orderId);
  360. if (!order) {
  361. return null;
  362. }
  363. // 添加额外的详情信息
  364. return {
  365. ...order,
  366. timeline: this.getOrderTimeline(orderId),
  367. driverInfo: this.getDriverInfo(order.driver?.id),
  368. passengerCount: order.passengers.length,
  369. isCharter: order.schedule.type === 'business-charter'
  370. };
  371. }
  372. // 获取订单时间线
  373. getOrderTimeline(orderId) {
  374. const order = this.getOrderById(orderId);
  375. if (!order) return [];
  376. const timeline = [
  377. {
  378. time: order.createTime,
  379. event: '订单创建',
  380. description: '用户提交订单'
  381. },
  382. {
  383. time: order.paymentTime,
  384. event: '支付完成',
  385. description: '订单支付成功'
  386. }
  387. ];
  388. if (order.driver) {
  389. timeline.push({
  390. time: order.updateTime,
  391. event: '司机分配',
  392. description: `司机:${order.driver.name}`
  393. });
  394. }
  395. if (order.statusCode >= 2) {
  396. timeline.push({
  397. time: order.updateTime,
  398. event: '行程开始',
  399. description: '乘客已上车'
  400. });
  401. }
  402. if (order.statusCode >= 3) {
  403. timeline.push({
  404. time: order.updateTime,
  405. event: '行程完成',
  406. description: '已到达目的地'
  407. });
  408. }
  409. return timeline;
  410. }
  411. // 获取司机信息
  412. getDriverInfo(driverId) {
  413. if (!driverId) return null;
  414. // 这里可以集成司机API服务
  415. try {
  416. const driverApiService = require('./driver-api.js').default;
  417. return driverApiService.getDriverById(driverId);
  418. } catch (error) {
  419. console.error('获取司机信息失败:', error);
  420. return null;
  421. }
  422. }
  423. }
  424. // 创建单例实例
  425. const orderApiService = new OrderApiService();
  426. export default orderApiService;