From c27770ef0233ccbf4db84f4de93a55debeacc3aa Mon Sep 17 00:00:00 2001 From: adriano Date: Thu, 28 Mar 2024 12:20:55 -0300 Subject: [PATCH] fix: Improve ticket query in backend to resolve high delay issue --- backend/src/controllers/ReportController.ts | 4 +- .../TicketServices/ShowTicketReport.ts | 110 ++++++++++-------- frontend/src/pages/Report/index.js | 2 +- 3 files changed, 63 insertions(+), 53 deletions(-) diff --git a/backend/src/controllers/ReportController.ts b/backend/src/controllers/ReportController.ts index a2956f0..d7d70b3 100644 --- a/backend/src/controllers/ReportController.ts +++ b/backend/src/controllers/ReportController.ts @@ -262,9 +262,7 @@ export const reportMessagesUserByDateStartDateEnd = async ( data_query_messages[i].fromMe = "Cliente"; } - data_query_messages[i].id = i + 1; - - console.log("data_query_messages: ", data_query_messages[i]); + data_query_messages[i].id = i + 1; } return res.status(200).json(data_query_messages); diff --git a/backend/src/services/TicketServices/ShowTicketReport.ts b/backend/src/services/TicketServices/ShowTicketReport.ts index f26919a..1c4b1ea 100644 --- a/backend/src/services/TicketServices/ShowTicketReport.ts +++ b/backend/src/services/TicketServices/ShowTicketReport.ts @@ -18,6 +18,7 @@ import { startOfDay, endOfDay, parseISO, getDate } from "date-fns"; import { string } from "yup/lib/locale"; import Whatsapp from "../../models/Whatsapp"; import Query from "mysql2/typings/mysql/lib/protocol/sequences/Query"; +import { te } from "date-fns/locale"; interface Request { userId: string | number; @@ -43,43 +44,56 @@ const ShowTicketReport = async ({ createdOrUpdated = "created", queueId }: Request): Promise => { - let where_clause: any = {}; - let query = ""; + // let where_clause: any = {}; + // let query = ""; - if (userId !== "0") { - where_clause.userid = userId; - query = `AND t.userId = ${userId}`; - } + // if (userId !== "0") { + // where_clause.userid = userId; + // query = `AND t.userId = ${userId}`; + // } + + // if (queueId) { + // where_clause.queueId = queueId; + // query = `AND t.queueId = ${queueId}`; + // } + + const createdAtOrUpdatedAt = + createdOrUpdated == "created" ? "createdAt" : "updatedAt"; + + let where_clause = {}; if (queueId) { - where_clause.queueId = queueId; - query = `AND t.queueId = ${queueId}`; + where_clause = { + queueId: queueId, + [createdAtOrUpdatedAt]: { + [Op.gte]: startDate + " 00:00:00.000000", + [Op.lte]: endDate + " 23:59:59.999999" + } + }; + } else if (userId == "0") { + where_clause = { + [createdAtOrUpdatedAt]: { + [Op.gte]: startDate + " 00:00:00.000000", + [Op.lte]: endDate + " 23:59:59.999999" + } + }; + } else if (userId != "0") { + where_clause = { + userid: userId, + [createdAtOrUpdatedAt]: { + [Op.gte]: startDate + " 00:00:00.000000", + [Op.lte]: endDate + " 23:59:59.999999" + } + }; } const limit = 40; const offset = limit * (+pageNumber - 1); - const createdAtOrUpdatedAt = - createdOrUpdated == "created" ? "createdAt" : "updatedAt"; - - const _ticketsId = await sequelize.query( - `SELECT t.id - FROM Tickets t - INNER JOIN ( - SELECT DISTINCT ticketId - FROM Messages - WHERE ${createdAtOrUpdatedAt} >= '${startDate} 00:00:00' AND ${createdAtOrUpdatedAt} <= '${endDate} 23:59:59' - ) AS m ON m.ticketId = t.id ${query};`, - { type: QueryTypes.SELECT } - ); - let { count, rows: tickets }: any = await Ticket.findAndCountAll({ - where: { - id: { [Op.in]: _ticketsId.map((t: any) => t.id) } - }, + where: where_clause, limit, offset, - attributes: [ "id", "status", @@ -151,43 +165,41 @@ const ShowTicketReport = async ({ throw new AppError("ERR_NO_TICKET_FOUND", 404); } - const ticketIds = tickets.map((t: any) => t.id); - - if (ticketIds.length > 0) { + if (tickets.length > 0) { const waiting_time: any = await sequelize.query( `SELECT t.id as ticketId, t.status, TIME_FORMAT( - SEC_TO_TIME( + SEC_TO_TIME( TIMESTAMPDIFF( SECOND, ( - SELECT createdAt - FROM Messages - WHERE ticketId = m.ticketId - AND fromMe = 0 - ORDER BY createdAt ASC + SELECT createdAt + FROM Messages + WHERE ticketId = m.ticketId + AND fromMe = 0 + ORDER BY createdAt ASC LIMIT 1 - ), + ), ( - SELECT createdAt - FROM Messages - WHERE ticketId = m.ticketId - AND fromAgent = 1 - ORDER BY createdAt ASC + SELECT createdAt + FROM Messages + WHERE ticketId = m.ticketId + AND fromAgent = 1 + ORDER BY createdAt ASC LIMIT 1 ) - ) - ), '%H:%i:%s') AS WAITING_TIME - FROM Tickets t + ) + ), '%H:%i:%s') AS WAITING_TIME + FROM Tickets t JOIN Messages m ON t.id = m.ticketId JOIN Whatsapps w ON t.whatsappId = w.id JOIN Queues q ON q.id = t.queueId - WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999' - AND t.id IN (${ticketIds.join()}) - AND m.createdAt = (SELECT MIN(createdAt) FROM Messages WHERE ticketId = t.id) - AND m.fromMe = 0 + WHERE DATE(m.createdAt) BETWEEN '${startDate} 00:00:00.000000' AND '${endDate} 23:59:59.999999' + AND t.id IN (${tickets.map((t: any) => t.id).join()}) + AND m.createdAt = (SELECT MIN(createdAt) FROM Messages WHERE ticketId = t.id) + AND m.fromMe = 0 AND t.status IN ('open', 'closed') HAVING WAITING_TIME IS NOT NULL - ORDER BY + ORDER BY WAITING_TIME;`, { type: QueryTypes.SELECT } ); diff --git a/frontend/src/pages/Report/index.js b/frontend/src/pages/Report/index.js index d3b97fa..1724682 100644 --- a/frontend/src/pages/Report/index.js +++ b/frontend/src/pages/Report/index.js @@ -363,7 +363,7 @@ const Report = () => { if (reportOption === '1') { const { data } = await api.get("/reports/", { params: { userId, startDate, endDate, pageNumber: pageNumberTickets, createdOrUpdated: selectedValue, queueId }, userQueues: userA.queues }) - + let ticketsQueue = data.tickets let userQueues = userA.queues let filterQueuesTickets = []