89 lines
3.1 KiB
JavaScript
89 lines
3.1 KiB
JavaScript
/**
|
||
* 应用场景说明
|
||
* 震元下单分为 门店端(使用平板下单)和 支付宝小程序(使用手机下单)
|
||
* 门店店下单流程:
|
||
* 1.直营门店his系统挂号(社会门店在我们网页挂号),挂号时调用获取推荐医生接口,挂号完成就确定医生
|
||
* 2.用户在平板上填写资料,然后提交资料进而完成下单操作
|
||
* 支付宝小程序下单流程:
|
||
* 1.用户在支付宝小程序上填写资料下单
|
||
* 2. 调用下单接口,下单接口会调用获取推荐医生接口,下单完成就确定医生
|
||
*
|
||
* 由于门店段挂号完成到填写资料下单期间 存在时间差(填写资料过程中,未被计入进行中的订单数),导致实时统计医生进行中的订单数不准确,从而导致个别医生短时间内被推荐次数过多,进而某一刻接到大量咨询订单,而其他医生则空闲
|
||
* 因此需要记录一分钟内获取推荐医生的数量,辅助统计医生进行中的订单数,从而保证医生接单的公平性
|
||
*/
|
||
|
||
// 用于记录一分钟内获取推荐医生的数量
|
||
// 数据结构:Map<doctorNo: string, timestamps: number[]>
|
||
const doctorCountInOneMinute = new Map();
|
||
|
||
/**
|
||
* 清理过期的医生推荐记录(超过一分钟的数据)
|
||
*/
|
||
function cleanExpiredDoctorRecords() {
|
||
const oneMinuteAgo = Date.now() - 60 * 1000;
|
||
for (const [doctorNo, timestamps] of doctorCountInOneMinute.entries()) {
|
||
// 过滤掉超过一分钟的时间戳
|
||
const validTimestamps = timestamps.filter(timestamp => timestamp > oneMinuteAgo);
|
||
if (validTimestamps.length === 0) {
|
||
// 如果没有有效的时间戳,删除该医生的记录
|
||
doctorCountInOneMinute.delete(doctorNo);
|
||
} else {
|
||
// 更新为有效的时间戳
|
||
doctorCountInOneMinute.set(doctorNo, validTimestamps);
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 记录医生被推荐的情况
|
||
* @param {string} doctorNo - 医生工号
|
||
*/
|
||
function recordDoctorRecommendation(doctorNo) {
|
||
const currentTime = Date.now();
|
||
|
||
// 先清理过期数据
|
||
cleanExpiredDoctorRecords();
|
||
|
||
// 记录当前医生的推荐时间
|
||
if (doctorCountInOneMinute.has(doctorNo)) {
|
||
doctorCountInOneMinute.get(doctorNo).push(currentTime);
|
||
} else {
|
||
doctorCountInOneMinute.set(doctorNo, [currentTime]);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 根据医生工号查询一分钟内的推荐次数
|
||
* @param {string} doctorNo - 医生工号
|
||
* @returns {number} 推荐次数
|
||
*/
|
||
function getDoctorRecommendationCount(doctorNo) {
|
||
// 先清理过期数据
|
||
cleanExpiredDoctorRecords();
|
||
|
||
return doctorCountInOneMinute.has(doctorNo) ? doctorCountInOneMinute.get(doctorNo).length : 0;
|
||
}
|
||
|
||
/**
|
||
* 获取所有医生一分钟内的推荐统计
|
||
* @returns {Object} 统计信息
|
||
*/
|
||
function getAllDoctorRecommendationStats() {
|
||
// 先清理过期数据
|
||
cleanExpiredDoctorRecords();
|
||
|
||
const stats = {};
|
||
for (const [doctorNo, timestamps] of doctorCountInOneMinute.entries()) {
|
||
stats[doctorNo] = {
|
||
count: timestamps.length,
|
||
timestamps: [...timestamps] // 返回副本
|
||
};
|
||
}
|
||
return stats;
|
||
}
|
||
|
||
module.exports = {
|
||
recordDoctorRecommendation,
|
||
getDoctorRecommendationCount,
|
||
getAllDoctorRecommendationStats
|
||
}; |