From 72827aa83e42b1b1a4021860110db22932b3311e Mon Sep 17 00:00:00 2001 From: shancheas Date: Fri, 15 Nov 2024 11:05:34 +0700 Subject: [PATCH] feat: calculate time queue --- .../queue/data/services/queue.service.ts | 40 +++++++++++++++---- .../domain/usecases/index-queue.manager.ts | 19 +++++++++ src/modules/queue/queue.module.ts | 2 + 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/src/modules/queue/data/services/queue.service.ts b/src/modules/queue/data/services/queue.service.ts index fb34c5d..d7d2506 100644 --- a/src/modules/queue/data/services/queue.service.ts +++ b/src/modules/queue/data/services/queue.service.ts @@ -11,26 +11,52 @@ import { 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 math from 'mathjs'; @Injectable() export class QueueDataService extends BaseReadService { constructor( @InjectRepository(QueueModel, CONNECTION_NAME.DEFAULT) private repo: Repository, + + @InjectRepository(ItemQueueModel, CONNECTION_NAME.DEFAULT) + private itemQueueRepo: Repository, ) { super(repo); } - async queueItems(item_queue_id: string[]): Promise { - return this.repo.find({ - relations: ['item', 'item.item', 'item.item.item_queue'], + async queueTimes(item_queue_id: string): Promise { + const queueTimes = {}; + let now = moment().valueOf(); + const itemQueue = await this.itemQueueRepo.findOne({ + relations: ['items'], where: { - item: { item: { item_queue: { id: In(item_queue_id) } } }, - }, - order: { - time: 'DESC', + 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.repo.find({ + where: { + item_queue_id, + }, + }); + + for (const queue of queues) { + // duration will be total qty multiple by average + const duration = queue.qty * average; + + // 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; } } diff --git a/src/modules/queue/domain/usecases/index-queue.manager.ts b/src/modules/queue/domain/usecases/index-queue.manager.ts index 855df51..5afd54c 100644 --- a/src/modules/queue/domain/usecases/index-queue.manager.ts +++ b/src/modules/queue/domain/usecases/index-queue.manager.ts @@ -7,9 +7,11 @@ import { } from 'src/core/modules/domain/entities/base-filter.entity'; import { Queue } from '../entities/queue.entity'; import * as moment from 'moment'; +import { PaginationResponse } from 'src/core/response/domain/ok-response.interface'; @Injectable() export class IndexQueueManager extends BaseIndexManager { + private queueTimes = {}; async prepareData(): Promise { return; } @@ -19,6 +21,9 @@ export class IndexQueueManager extends BaseIndexManager { } async afterProcess(): Promise { + this.queueTimes = await this.dataService.queueTimes( + this.filterParam.queue_id, + ); return; } @@ -30,6 +35,20 @@ export class IndexQueueManager extends BaseIndexManager { }; } + getResult(): PaginationResponse { + const result = this.result; + + return { + total: result.total, + data: result.data.map((queue) => { + return { + ...queue, + time: this.queueTimes[queue.id], + }; + }), + }; + } + get selects(): string[] { return [ `${this.tableName}.id`, diff --git a/src/modules/queue/queue.module.ts b/src/modules/queue/queue.module.ts index d6dee2a..ab95226 100644 --- a/src/modules/queue/queue.module.ts +++ b/src/modules/queue/queue.module.ts @@ -32,6 +32,7 @@ import { QueueBucketModel } from './data/models/queue-bucket.model'; 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'; @Module({ imports: [ @@ -44,6 +45,7 @@ import { QueueTransactionCancelHandler } from './infrastructure/handlers/cancel- QueueModel, QueueBucketModel, ItemModel, + ItemQueueModel, TransactionModel, ], CONNECTION_NAME.DEFAULT,