42 lines
1.2 KiB
TypeScript
42 lines
1.2 KiB
TypeScript
import { QueueModel } from 'src/modules/queue/data/models/queue.model';
|
|
import { toTime } from '../../helpers/time.helper';
|
|
import * as math from 'mathjs';
|
|
|
|
export class QueueCondition {
|
|
private ticketItems = {};
|
|
constructor(readonly items: QueueModel[]) {
|
|
items.forEach((item) => {
|
|
const item_id = item.item_queue_id;
|
|
const currentItem = this.ticketItems[item_id];
|
|
this.ticketItems[item_id] = currentItem ? [...currentItem, item] : [item];
|
|
});
|
|
}
|
|
|
|
condition(item_id: string) {
|
|
const queues: QueueModel[] = this.ticketItems[item_id] ?? [];
|
|
const time = queues[0];
|
|
const nearest = time ? toTime(time.time) : 0;
|
|
|
|
const last = [...queues].pop();
|
|
const lastTime = last ? toTime(last.time) : 0;
|
|
return {
|
|
available: queues.length == 0,
|
|
average: this.averageTime(queues),
|
|
nearest: nearest,
|
|
crowded_level: queues.length,
|
|
available_time: lastTime,
|
|
};
|
|
}
|
|
|
|
averageTime(queues: QueueModel[]) {
|
|
if (queues.length == 0) return 0;
|
|
const calledQueue = queues.filter((q) => q.status === 'called');
|
|
|
|
const times = calledQueue.map((queue) => {
|
|
return queue.call_time - queue.time;
|
|
});
|
|
|
|
return math.sum(times) / times.length;
|
|
}
|
|
}
|