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
JavaScript
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;