fix: change queue time formula to manager
continuous-integration/drone/push Build is passing Details
continuous-integration/drone/tag Build is passing Details

pull/115/head 1.2.5-alpha.1
shancheas 2024-11-15 12:37:43 +07:00
parent ec916ab574
commit 53ef4656eb
4 changed files with 111 additions and 2 deletions

View File

@ -10,8 +10,8 @@ import {
} from '../models/queue.model';
import { BaseReadService } from 'src/core/modules/data/service/base-read.service';
import { BaseDataService } from 'src/core/modules/data/service/base-data.service';
import * as moment from 'moment';
import { ItemQueueModel } from 'src/modules/item-related/item-queue/data/models/item-queue.model';
import * as moment from 'moment';
import * as math from 'mathjs';
@Injectable()
@ -26,6 +26,39 @@ export class QueueDataService extends BaseReadService<QueueModel> {
super(repo);
}
async waitingQueue(item_queue_id: string) {
const start = moment().startOf('day').valueOf();
const end = moment().endOf('day').valueOf();
return this.repo.find({
where: {
time: Between(start, end),
item_queue_id,
status: 'waiting',
},
});
}
async lastQueue(item_queue_id: string) {
const start = moment().startOf('day').valueOf();
const end = moment().endOf('day').valueOf();
return this.repo.findOne({
where: {
time: Between(start, end),
item_queue_id,
status: 'called',
},
order: {
call_time: 'DESC',
},
});
}
/**
* @deprecated
* Change to QueueTimeFormula (queue-time.formula.ts)
* @param item_queue_id
* @returns
*/
async queueTimes(item_queue_id: string): Promise<any> {
const queueTimes = {};
let now = moment().valueOf();
@ -62,6 +95,18 @@ export class QueueDataService extends BaseReadService<QueueModel> {
return queueTimes;
}
async queueItems(item_queue_id: string[]): Promise<QueueModel[]> {
return this.repo.find({
relations: ['item', 'item.item', 'item.item.item_queue'],
where: {
item: { item: { item_queue: { id: In(item_queue_id) } } },
},
order: {
time: 'DESC',
},
});
}
}
@Injectable()

View File

@ -0,0 +1,56 @@
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 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 queues = await this.queueDataService.waitingQueue(item_queue_id);
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;
}
}

View File

@ -8,9 +8,14 @@ import {
import { Queue } from '../entities/queue.entity';
import * as moment from 'moment';
import { PaginationResponse } from 'src/core/response/domain/ok-response.interface';
import { QueueTimeFormula } from './formula/queue-time.formula';
@Injectable()
export class IndexQueueManager extends BaseIndexManager<Queue> {
constructor(private readonly queueTimeFormula: QueueTimeFormula) {
super();
}
private queueTimes = {};
async prepareData(): Promise<void> {
return;
@ -21,7 +26,7 @@ export class IndexQueueManager extends BaseIndexManager<Queue> {
}
async afterProcess(): Promise<void> {
this.queueTimes = await this.dataService.queueTimes(
this.queueTimes = await this.queueTimeFormula.items(
this.filterParam.queue_id,
);
return;

View File

@ -33,6 +33,7 @@ import { QueueBucketReadService } from './data/services/queue-bucket';
import { SplitQueueManager } from './domain/usecases/split-queue.manager';
import { QueueTransactionCancelHandler } from './infrastructure/handlers/cancel-transaction.handler';
import { ItemQueueModel } from '../item-related/item-queue/data/models/item-queue.model';
import { QueueTimeFormula } from './domain/usecases/formula/queue-time.formula';
@Module({
imports: [
@ -71,6 +72,8 @@ import { ItemQueueModel } from '../item-related/item-queue/data/models/item-queu
CallQueueManager,
RegisterQueueManager,
SplitQueueManager,
QueueTimeFormula,
],
})
export class QueueModule {}