From e7e4e2075b71d7b65f271605b2b35456ee23c6b1 Mon Sep 17 00:00:00 2001 From: waruneeauy Date: Tue, 5 May 2026 16:25:06 +0700 Subject: [PATCH] =?UTF-8?q?1.=20=E0=B8=A3=E0=B8=A7=E0=B8=A1=20query=5Fempl?= =?UTF-8?q?oyeePosMaster=20=E0=B8=81=E0=B8=B1=E0=B8=9A=20query=5FemployeeT?= =?UTF-8?q?empPosMaster=20=E0=B9=83=E0=B8=AB=E0=B9=89=E0=B8=94=E0=B8=B6?= =?UTF-8?q?=E0=B8=87=E0=B9=81=E0=B8=9A=E0=B8=9A=E0=B8=82=E0=B8=99=E0=B8=B2?= =?UTF-8?q?=E0=B8=99=E0=B8=94=E0=B9=89=E0=B8=A7=E0=B8=A2=20Promise.all=202?= =?UTF-8?q?.=20=E0=B8=95=E0=B8=B1=E0=B8=94=20full-table=20scan=20=E0=B8=82?= =?UTF-8?q?=E0=B8=AD=E0=B8=87=20ProfileEmployee=20=E0=B8=AD=E0=B8=AD?= =?UTF-8?q?=E0=B8=81=20=E0=B9=82=E0=B8=94=E0=B8=A2=E0=B9=80=E0=B8=9B?= =?UTF-8?q?=E0=B8=A5=E0=B8=B5=E0=B9=88=E0=B8=A2=E0=B8=99=E0=B8=88=E0=B8=B2?= =?UTF-8?q?=E0=B8=81=20find({=20select:=20["id"]=20})=20=E0=B8=97=E0=B8=B1?= =?UTF-8?q?=E0=B9=89=E0=B8=87=E0=B8=95=E0=B8=B2=E0=B8=A3=E0=B8=B2=E0=B8=87?= =?UTF-8?q?=20=E0=B8=A1=E0=B8=B2=E0=B9=80=E0=B8=9B=E0=B9=87=E0=B8=99=20que?= =?UTF-8?q?ry=20=E0=B9=80=E0=B8=89=E0=B8=9E=E0=B8=B2=E0=B8=B0=20current=5F?= =?UTF-8?q?holderId=20=E0=B8=97=E0=B8=B5=E0=B9=88=E0=B8=AD=E0=B9=89?= =?UTF-8?q?=E0=B8=B2=E0=B8=87=E0=B8=96=E0=B8=B6=E0=B8=87=E0=B8=88=E0=B8=A3?= =?UTF-8?q?=E0=B8=B4=E0=B8=87=E0=B9=83=E0=B8=99=E0=B8=8A=E0=B8=B8=E0=B8=94?= =?UTF-8?q?=E0=B8=82=E0=B9=89=E0=B8=AD=E0=B8=A1=E0=B8=B9=E0=B8=A5=20publis?= =?UTF-8?q?h=203.=20=E0=B9=80=E0=B8=81=E0=B9=87=E0=B8=9A=20normalization?= =?UTF-8?q?=20=E0=B8=82=E0=B8=AD=E0=B8=87=20=5ForgemployeePosMaster=20?= =?UTF-8?q?=E0=B9=81=E0=B8=A5=E0=B8=B0=20=5ForgemployeeTempPosMaster=20?= =?UTF-8?q?=E0=B9=84=E0=B8=A7=E0=B9=89=E0=B8=AB=E0=B8=A5=E0=B8=B1=E0=B8=87?= =?UTF-8?q?=20query=20=E0=B8=8A=E0=B8=B8=E0=B8=94=E0=B9=80=E0=B8=94?= =?UTF-8?q?=E0=B8=B5=E0=B8=A2=E0=B8=A7=E0=B8=81=E0=B8=B1=E0=B8=99=20?= =?UTF-8?q?=E0=B8=97=E0=B8=B3=E0=B9=83=E0=B8=AB=E0=B9=89=20block=20?= =?UTF-8?q?=E0=B8=99=E0=B8=B5=E0=B9=89=E0=B8=81=E0=B8=A3=E0=B8=B0=E0=B8=8A?= =?UTF-8?q?=E0=B8=B1=E0=B8=9A=E0=B8=82=E0=B8=B6=E0=B9=89=E0=B8=99=E0=B9=81?= =?UTF-8?q?=E0=B8=A5=E0=B8=B0=E0=B8=A5=E0=B8=94=20read=20cost=20=E0=B8=97?= =?UTF-8?q?=E0=B8=B5=E0=B9=88=E0=B9=84=E0=B8=A1=E0=B9=88=E0=B8=88=E0=B8=B3?= =?UTF-8?q?=E0=B9=80=E0=B8=9B=E0=B9=87=E0=B8=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/services/rabbitmq.ts | 64 ++++++++++++++++++++++------------------ 1 file changed, 35 insertions(+), 29 deletions(-) diff --git a/src/services/rabbitmq.ts b/src/services/rabbitmq.ts index 097473f8..da93d32f 100644 --- a/src/services/rabbitmq.ts +++ b/src/services/rabbitmq.ts @@ -1161,21 +1161,38 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise { } console.timeEnd("[AMQ] clone_permissionProfiles"); - //หา dna posmaster ถ้าไม่มีให้เอาตัวเองเป็น dna - console.time("[AMQ] query_employeePosMaster"); - const orgemployeePosMaster = await repoEmployeePosmaster.find({ - where: { orgRevisionId: orgRevisionPublish.id }, - relations: ["positions"], - }); - console.timeEnd("[AMQ] query_employeePosMaster"); + console.time("[AMQ] query_employee_org_structures"); + const [orgemployeePosMaster, orgemployeeTempPosMaster] = await Promise.all([ + repoEmployeePosmaster.find({ + where: { orgRevisionId: orgRevisionPublish.id }, + relations: ["positions"], + }), + repoEmployeeTempPosmaster.find({ + where: { orgRevisionId: orgRevisionPublish.id }, + relations: ["positions"], + }), + ]); + console.timeEnd("[AMQ] query_employee_org_structures"); console.log(`[AMQ] orgemployeePosMaster count: ${orgemployeePosMaster.length}`); + console.log(`[AMQ] orgemployeeTempPosMaster count: ${orgemployeeTempPosMaster.length}`); - let _orgemployeePosMaster: EmployeePosMaster[]; - const validProfileIds = new Set( - (await repoProfileEmployee.find({ select: ["id"] })).map((p) => p.id), + const currentHolderIds = Array.from( + new Set( + orgemployeePosMaster + .map((item) => item.current_holderId) + .filter((holderId): holderId is string => !!holderId), + ), ); + const validProfileIds = new Set(); + if (currentHolderIds.length > 0) { + const profiles = await repoProfileEmployee.find({ + select: ["id"], + where: { id: In(currentHolderIds) }, + }); + profiles.forEach((profile) => validProfileIds.add(profile.id)); + } - _orgemployeePosMaster = orgemployeePosMaster.map((x) => ({ + const _orgemployeePosMaster: EmployeePosMaster[] = orgemployeePosMaster.map((x) => ({ ...x, current_holderId: x.current_holderId && validProfileIds.has(x.current_holderId) ? x.current_holderId : null, @@ -1184,6 +1201,13 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise { ? x.id : x.ancestorDNA, })); + const _orgemployeeTempPosMaster: EmployeeTempPosMaster[] = orgemployeeTempPosMaster.map((x) => ({ + ...x, + ancestorDNA: + x.ancestorDNA == null || x.ancestorDNA == "00000000-0000-0000-0000-000000000000" + ? x.id + : x.ancestorDNA, + })); console.time("[AMQ] insert_employeePosMaster"); await repoEmployeePosmaster @@ -1198,24 +1222,6 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise { .execute(); console.timeEnd("[AMQ] insert_employeePosMaster"); - //หา dna posmaster ถ้าไม่มีให้เอาตัวเองเป็น dna - console.time("[AMQ] query_employeeTempPosMaster"); - const orgemployeeTempPosMaster = await repoEmployeeTempPosmaster.find({ - where: { orgRevisionId: orgRevisionPublish.id }, - relations: ["positions"], - }); - console.timeEnd("[AMQ] query_employeeTempPosMaster"); - console.log(`[AMQ] orgemployeeTempPosMaster count: ${orgemployeeTempPosMaster.length}`); - - let _orgemployeeTempPosMaster: EmployeeTempPosMaster[]; - _orgemployeeTempPosMaster = orgemployeeTempPosMaster.map((x) => ({ - ...x, - ancestorDNA: - x.ancestorDNA == null || x.ancestorDNA == "00000000-0000-0000-0000-000000000000" - ? x.id - : x.ancestorDNA, - })); - const groupByParentId = ( items: T[], getParentId: (item: T) => string | null | undefined,