UNPKG

dqm-api-client

Version:

A Node.js client library for court booking API services including authentication, SMS verification, and court management

87 lines (81 loc) 2.66 kB
const ApiService = require('./ApiService'); const { findAvailableSlots, generateOrderTimestamp, } = require('../utils/common'); const AppError = require('../errors/AppError'); const { ERROR_CODES } = require('../constants/errorCodes'); /** * 场地服务类 - 处理场地相关的业务逻辑 * 继承自 ApiService 以直接使用 API 调用功能 */ class CourtService extends ApiService { constructor(openid) { super(openid); // 调用父类构造函数 } /** * 查询场地并获取可用时间段 * @param {string} dateStr - 日期字符串,格式为 'MM-DD' * @param {Array<string>} courtNos - 场地编号数组,如 ['13', '14'] * @param {number} startHour - 开始时间(小时) * @param {number} endHour - 结束时间(小时) * @returns {Object} 包含多个场地可用时间段的对象 */ async getCourt(dateStr, courtNos, startHour, endHour) { const timestamp = generateOrderTimestamp(dateStr); const courtData = await this.getCourtByDate(timestamp); // 新结构:数组,每个元素包含 courtNo 和 slots const result = courtNos.map(courtNo => { const fieldName = `羽毛球${courtNo}`; const slots = findAvailableSlots( courtData, fieldName, startHour, endHour ); return { courtNo, slots, }; }); return { courts: result, orderDate: timestamp, }; } /** * 创建订单(预定场地) * @param {string} dateStr - 日期字符串,格式为 'MM-DD' * @param {Array<string>} courts - 场地编号数组,如 ['13', '14'] * @param {[number, number]} time - 时间区间,如 [9, 17] * @param {string} smscode - 短信验证码(可选) * @returns {Promise<Object>} 订单创建结果 */ async bookCourt(dateStr, courts, time, smscode = '') { const [startHour, endHour] = time; const { courts: availableSlots, orderDate } = await this.getCourt( dateStr, courts, startHour, endHour ); const orderArr = availableSlots.map(court => court.slots).flat(); if (orderArr.length === 0) { throw new AppError('No available slots', { name: 'NoAvailableSlotsError', code: ERROR_CODES.NO_AVAILABLE_SLOTS, data: { orderDate, courts, time: [startHour, endHour], orderArrLength: orderArr.length, }, isOperational: true }); } const response = await this.createOrder(orderDate, orderArr, smscode); // 直接调用父类方法 return response; } } // 导出类和便捷函数 module.exports = CourtService;