61 lines
1.9 KiB
TypeScript
61 lines
1.9 KiB
TypeScript
import { InjectRepository } from '@nestjs/typeorm';
|
|
import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants';
|
|
import { ItemQueueModel } from 'src/modules/item-related/item-queue/data/models/item-queue.model';
|
|
import { QueueDataService } from 'src/modules/queue/data/services/queue.service';
|
|
import { Repository } from 'typeorm';
|
|
import * as moment from 'moment';
|
|
import * as math from 'mathjs';
|
|
|
|
export class QueueTimeFormula {
|
|
constructor(
|
|
private readonly queueDataService: QueueDataService,
|
|
@InjectRepository(ItemQueueModel, CONNECTION_NAME.DEFAULT)
|
|
private itemQueueRepo: Repository<ItemQueueModel>,
|
|
) {}
|
|
|
|
async items(item_queue_id: string) {
|
|
const queues = await this.queueDataService.waitingQueue(item_queue_id);
|
|
if (queues.length == 0) {
|
|
return {};
|
|
}
|
|
|
|
const itemQueue = await this.itemQueueRepo.findOne({
|
|
relations: ['items'],
|
|
where: {
|
|
id: item_queue_id,
|
|
},
|
|
});
|
|
|
|
const times = itemQueue.items.map((item) => item.play_estimation ?? 0);
|
|
const average = math.mean(times) * 60 * 1000; // change average minute to milliseconds
|
|
|
|
const calledQueue = await this.queueDataService.lastQueue(item_queue_id);
|
|
|
|
const queueTimes = {};
|
|
const timeNow = moment().valueOf();
|
|
const lastCall = calledQueue?.call_time ?? timeNow - average;
|
|
|
|
const callTime = lastCall + average;
|
|
const currentQueueCallTime = timeNow > callTime ? timeNow : callTime;
|
|
|
|
queueTimes[queues[0].id] = currentQueueCallTime;
|
|
let now = currentQueueCallTime;
|
|
|
|
for (let i = 1; i < queues.length; i++) {
|
|
const before = queues[i - 1];
|
|
// duration will be total qty multiple by average from last queue
|
|
const duration = before.qty * average;
|
|
|
|
const queue = queues[i];
|
|
// time to call will be now + duration
|
|
const time = now + duration;
|
|
queueTimes[queue.id] = time;
|
|
|
|
// update now to last call time
|
|
now = time;
|
|
}
|
|
|
|
return queueTimes;
|
|
}
|
|
}
|