diff --git a/src/modules/queue/data/services/queue.service.ts b/src/modules/queue/data/services/queue.service.ts index a67f0c6..bb03a82 100644 --- a/src/modules/queue/data/services/queue.service.ts +++ b/src/modules/queue/data/services/queue.service.ts @@ -169,9 +169,12 @@ export class QueueService extends BaseDataService { const start = moment().startOf('day').valueOf(); const end = moment().endOf('day').valueOf(); const playEstimations = {}; + const queuePeakLevel = {}; for (const id of ids) { - playEstimations[id] = await this.itemAverageTimeEstimation(id); + const est = await this.itemAverageTimeEstimation(id); + playEstimations[id] = est.average; + queuePeakLevel[id] = est.peakLevel; } const queues = await this.repo.find({ @@ -186,6 +189,7 @@ export class QueueService extends BaseDataService { queues.forEach((queue) => { queue.average = playEstimations[queue.item_queue_id]; + queue.peak_level = queuePeakLevel[queue.item_queue_id]; }); return queues; @@ -193,6 +197,7 @@ export class QueueService extends BaseDataService { async itemAverageTimeEstimation(item_queue_id: string) { const items = await this.itemMaster.find({ + relations: ['item_queue'], where: { item_queue_id, }, @@ -200,7 +205,8 @@ export class QueueService extends BaseDataService { const times = items.map((item) => item.play_estimation ?? 0); const average = times.length > 0 ? math.mean(times) * 60 * 1000 : 0; // change average minute to milliseconds - return average; + const peakLevel = items[0]?.item_queue?.max_peak_level ?? 100; + return { average, peakLevel }; } async getTicketItems(ticket_id: string, item_id: string) { diff --git a/src/modules/queue/domain/usecases/formula/queue-condition.formula.ts b/src/modules/queue/domain/usecases/formula/queue-condition.formula.ts index ce3d387..c3599c6 100644 --- a/src/modules/queue/domain/usecases/formula/queue-condition.formula.ts +++ b/src/modules/queue/domain/usecases/formula/queue-condition.formula.ts @@ -17,11 +17,12 @@ export class QueueCondition { condition(item_id: string) { const queues: QueueModel[] = this.ticketItems[item_id] ?? []; const playEstimation = queues[0]?.average ?? 0; + const peakLevel = queues[0]?.peak_level ?? 100; const [time, last] = this.queueTime(queues, playEstimation); const nearest = time ? toTime(time) : 0; const lastTime = last ? toTime(last + playEstimation) : 0; - const queuePeople = this.queuePeople(queues); + const queuePeople = this.queuePeople(queues, peakLevel); return { available: queuePeople == 0, @@ -32,12 +33,13 @@ export class QueueCondition { }; } - queuePeople(queues: QueueModel[]): number { + queuePeople(queues: QueueModel[], peakLevel): number { const queue = this.activeQueue(queues); + const level = peakLevel / 100; const queuePeople = queue.reduce((acc, q) => { return acc + q.qty; }, 0); - return queuePeople; + return queuePeople * level; } activeQueue(queues: QueueModel[]) { @@ -76,6 +78,7 @@ export class QueueCondition { return (queue.call_time - queue.time) / 1000; }); - return Math.ceil(math.mean(times)); + const avg = Math.ceil(math.mean(times)); + return Math.max(0, avg); } }