feat: add list order queue
continuous-integration/drone/push Build is passing Details

pull/115/head
shancheas 2024-10-29 14:15:37 +07:00
parent 93b1208278
commit c8d0b32cc6
6 changed files with 79 additions and 1 deletions

View File

@ -4,7 +4,11 @@ import { InjectRepository } from '@nestjs/typeorm';
import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants'; import { CONNECTION_NAME } from 'src/core/strings/constants/base.constants';
import { Repository } from 'typeorm'; import { Repository } from 'typeorm';
import { QueueTicket } from '../../domain/entities/ticket.entity'; import { QueueTicket } from '../../domain/entities/ticket.entity';
import { QueueOrderModel, QueueTicketModel } from '../models/queue.model'; import {
QueueItemModel,
QueueOrderModel,
QueueTicketModel,
} from '../models/queue.model';
import { QueueOrder } from '../../domain/entities/order.entity'; import { QueueOrder } from '../../domain/entities/order.entity';
@Injectable() @Injectable()
@ -15,6 +19,9 @@ export class TicketDataService extends BaseDataService<QueueTicket> {
@InjectRepository(QueueOrderModel, CONNECTION_NAME.DEFAULT) @InjectRepository(QueueOrderModel, CONNECTION_NAME.DEFAULT)
private order: Repository<QueueOrderModel>, private order: Repository<QueueOrderModel>,
@InjectRepository(QueueItemModel, CONNECTION_NAME.DEFAULT)
private item: Repository<QueueItemModel>,
) { ) {
super(repo); super(repo);
} }
@ -81,4 +88,15 @@ export class TicketDataService extends BaseDataService<QueueTicket> {
}, },
}); });
} }
async queueItems(order_id: string): Promise<QueueItemModel[]> {
return this.item.find({
relations: ['queue', 'ticket'],
where: {
ticket: {
order_id,
},
},
});
}
} }

View File

@ -10,6 +10,7 @@ import { CustomerQueueSummaryManager } from './usecases/queue/customer-queue-sum
import { CustomerQueueDetailManager } from './usecases/queue/customer-queue-detail.manager'; import { CustomerQueueDetailManager } from './usecases/queue/customer-queue-detail.manager';
import { CustomerQueueItemManager } from './usecases/queue/customer-queue-item.manager'; import { CustomerQueueItemManager } from './usecases/queue/customer-queue-item.manager';
import { CustomerQueueItemListManager } from './usecases/queue/customer-queue-item-list.manager'; import { CustomerQueueItemListManager } from './usecases/queue/customer-queue-item-list.manager';
import { CustomerQueueListManager } from './usecases/queue/customer-queue-list.manager';
@Injectable() @Injectable()
export class QueueOrchestrator { export class QueueOrchestrator {
@ -71,4 +72,10 @@ export class QueueOrchestrator {
const manager = new CustomerQueueItemListManager(tickets); const manager = new CustomerQueueItemListManager(tickets);
return manager.data; return manager.data;
} }
async queueOrderItems(order_id: string): Promise<any> {
const tickets = await this.dataService.queueTickets(order_id);
const manager = new CustomerQueueListManager(tickets);
return manager.data;
}
} }

View File

@ -28,6 +28,7 @@ export class CustomerQueueItemListManager extends CustomerQueueManager {
nearest: '13:10', nearest: '13:10',
crowded_level: 20, crowded_level: 20,
available_time: '15:00', available_time: '15:00',
queue_condition: { queue_condition: {
available: true, available: true,
average: 12, average: 12,

View File

@ -10,6 +10,7 @@ export class CustomerQueueItemManager extends CustomerQueueManager {
customer: ticket.customer, customer: ticket.customer,
phone: ticket.phone, phone: ticket.phone,
date: ticket.date, date: ticket.date,
image_url: item.item.image_url,
summary: { summary: {
total_activities: this.totalActivities(ticket), total_activities: this.totalActivities(ticket),
total_tickets: this.totalTickets(ticket), total_tickets: this.totalTickets(ticket),

View File

@ -0,0 +1,46 @@
import { QueueItemModel } from 'src/modules/queue/data/models/queue.model';
import { CustomerQueueManager } from './customer-queue.manager';
export class CustomerQueueListManager extends CustomerQueueManager {
get data() {
const tickets = this.tickets;
const ticketItems = {};
tickets.forEach((ticket) => {
ticket.items.forEach((item) => {
const item_id = item.item.item_queue?.id ?? item.item.id;
const currentItem = ticketItems[item_id];
item.ticket = ticket;
ticketItems[item_id] = currentItem ? [...currentItem, item] : [item];
});
});
return Object.values<QueueItemModel[]>(ticketItems).map((items) => {
const item = items[0];
const item_qty = items.reduce((acc, item) => acc + item.qty, 0);
return {
id: item.item_id,
title: item.item.item_queue?.name ?? item.item.name,
image_url: item.item.image_url,
qty: item_qty,
items: items.map((item) => {
return {
code: item.ticket.code,
customer: item.ticket.customer,
phone: item.ticket.phone,
id: item.ticket.id,
queue: item.queue.map((q) => {
return {
code: q.code,
qty: q.qty,
time: this.toTime(q.time),
status: q.status,
};
}),
};
}),
};
});
}
}

View File

@ -44,6 +44,11 @@ export class QueueController {
return await this.orchestrator.queueItems(id); return await this.orchestrator.queueItems(id);
} }
@Get(':id/queue')
async queueOrderItems(@Param('id') id: string): Promise<void> {
return await this.orchestrator.queueOrderItems(id);
}
@Get(':id/items/:item_id') @Get(':id/items/:item_id')
async queueItemTickets( async queueItemTickets(
@Param('id') id: string, @Param('id') id: string,