1. รวม query_employeePosMaster กับ query_employeeTempPosMaster ให้ดึงแบบขนานด้วย Promise.all

2. ตัด full-table scan ของ ProfileEmployee ออก โดยเปลี่ยนจาก find({ select: ["id"] }) ทั้งตาราง มาเป็น query เฉพาะ current_holderId ที่อ้างถึงจริงในชุดข้อมูล publish
3. เก็บ normalization ของ _orgemployeePosMaster และ _orgemployeeTempPosMaster ไว้หลัง query ชุดเดียวกัน ทำให้ block นี้กระชับขึ้นและลด read cost ที่ไม่จำเป็น
This commit is contained in:
Warunee Tamkoo 2026-05-05 16:25:06 +07:00
parent b5c75379ff
commit e7e4e2075b

View file

@ -1161,21 +1161,38 @@ async function handler_org(msg: amqp.ConsumeMessage): Promise<boolean> {
}
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<string>();
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<boolean> {
? 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<boolean> {
.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 = <T extends { id: string }>(
items: T[],
getParentId: (item: T) => string | null | undefined,