fix: change queue time formula to manager
parent
ec916ab574
commit
53ef4656eb
|
@ -10,8 +10,8 @@ import {
|
||||||
} from '../models/queue.model';
|
} from '../models/queue.model';
|
||||||
import { BaseReadService } from 'src/core/modules/data/service/base-read.service';
|
import { BaseReadService } from 'src/core/modules/data/service/base-read.service';
|
||||||
import { BaseDataService } from 'src/core/modules/data/service/base-data.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 { ItemQueueModel } from 'src/modules/item-related/item-queue/data/models/item-queue.model';
|
||||||
|
import * as moment from 'moment';
|
||||||
import * as math from 'mathjs';
|
import * as math from 'mathjs';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -26,6 +26,39 @@ export class QueueDataService extends BaseReadService<QueueModel> {
|
||||||
super(repo);
|
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> {
|
async queueTimes(item_queue_id: string): Promise<any> {
|
||||||
const queueTimes = {};
|
const queueTimes = {};
|
||||||
let now = moment().valueOf();
|
let now = moment().valueOf();
|
||||||
|
@ -62,6 +95,18 @@ export class QueueDataService extends BaseReadService<QueueModel> {
|
||||||
|
|
||||||
return queueTimes;
|
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()
|
@Injectable()
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -8,9 +8,14 @@ import {
|
||||||
import { Queue } from '../entities/queue.entity';
|
import { Queue } from '../entities/queue.entity';
|
||||||
import * as moment from 'moment';
|
import * as moment from 'moment';
|
||||||
import { PaginationResponse } from 'src/core/response/domain/ok-response.interface';
|
import { PaginationResponse } from 'src/core/response/domain/ok-response.interface';
|
||||||
|
import { QueueTimeFormula } from './formula/queue-time.formula';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class IndexQueueManager extends BaseIndexManager<Queue> {
|
export class IndexQueueManager extends BaseIndexManager<Queue> {
|
||||||
|
constructor(private readonly queueTimeFormula: QueueTimeFormula) {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
private queueTimes = {};
|
private queueTimes = {};
|
||||||
async prepareData(): Promise<void> {
|
async prepareData(): Promise<void> {
|
||||||
return;
|
return;
|
||||||
|
@ -21,7 +26,7 @@ export class IndexQueueManager extends BaseIndexManager<Queue> {
|
||||||
}
|
}
|
||||||
|
|
||||||
async afterProcess(): Promise<void> {
|
async afterProcess(): Promise<void> {
|
||||||
this.queueTimes = await this.dataService.queueTimes(
|
this.queueTimes = await this.queueTimeFormula.items(
|
||||||
this.filterParam.queue_id,
|
this.filterParam.queue_id,
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -33,6 +33,7 @@ import { QueueBucketReadService } from './data/services/queue-bucket';
|
||||||
import { SplitQueueManager } from './domain/usecases/split-queue.manager';
|
import { SplitQueueManager } from './domain/usecases/split-queue.manager';
|
||||||
import { QueueTransactionCancelHandler } from './infrastructure/handlers/cancel-transaction.handler';
|
import { QueueTransactionCancelHandler } from './infrastructure/handlers/cancel-transaction.handler';
|
||||||
import { ItemQueueModel } from '../item-related/item-queue/data/models/item-queue.model';
|
import { ItemQueueModel } from '../item-related/item-queue/data/models/item-queue.model';
|
||||||
|
import { QueueTimeFormula } from './domain/usecases/formula/queue-time.formula';
|
||||||
|
|
||||||
@Module({
|
@Module({
|
||||||
imports: [
|
imports: [
|
||||||
|
@ -71,6 +72,8 @@ import { ItemQueueModel } from '../item-related/item-queue/data/models/item-queu
|
||||||
CallQueueManager,
|
CallQueueManager,
|
||||||
RegisterQueueManager,
|
RegisterQueueManager,
|
||||||
SplitQueueManager,
|
SplitQueueManager,
|
||||||
|
|
||||||
|
QueueTimeFormula,
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
export class QueueModule {}
|
export class QueueModule {}
|
||||||
|
|
Loading…
Reference in New Issue