pos-be/src/modules/queue/domain/usecases/formula/queue-time.formula.ts

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