diff --git a/src/controllers/ProfileController.ts b/src/controllers/ProfileController.ts index 460ca48f..151472c8 100644 --- a/src/controllers/ProfileController.ts +++ b/src/controllers/ProfileController.ts @@ -6059,6 +6059,7 @@ export class ProfileController extends Controller { total: 1, }, }) + // ...existing code... async listProfile( @Request() request: RequestWithUser, @Query("page") page: number = 1, @@ -6114,16 +6115,20 @@ export class ProfileController extends Controller { nodeCondition = "current_holders.orgChild4Id = :nodeId"; } nodeCondition = nodeCondition + nodeAll; - const findRevision = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true }, - }); - if (!findRevision) { - throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); - } - // 1. เลือกเฉพาะ field ที่จำเป็น + // เลือกเฉพาะฟิลด์ที่จำเป็น const [record, total] = await this.profileRepo .createQueryBuilder("profile") + .leftJoin("profile.posLevel", "posLevel") + .leftJoin("profile.posType", "posType") + .leftJoin("profile.current_holders", "current_holders") + .leftJoin("current_holders.positions", "positions") + .leftJoin("positions.posExecutive", "posExecutive") + .leftJoin("current_holders.orgRoot", "orgRoot") + .leftJoin("current_holders.orgChild1", "orgChild1") + .leftJoin("current_holders.orgChild2", "orgChild2") + .leftJoin("current_holders.orgChild3", "orgChild3") + .leftJoin("current_holders.orgChild4", "orgChild4") .select([ "profile.id", "profile.prefix", @@ -6139,58 +6144,89 @@ export class ProfileController extends Controller { "posLevel.posLevelName", "posType.id", "posType.posTypeName", - "current_holders.id", - "current_holders.posMasterNo", "current_holders.orgRevisionId", - "current_holders.orgRootId", - "current_holders.orgChild1Id", - "current_holders.orgChild2Id", - "current_holders.orgChild3Id", - "current_holders.orgChild4Id", + "current_holders.posMasterNo", "orgRoot.id", "orgRoot.orgRootName", "orgRoot.orgRootShortName", "orgRoot.orgRootOrder", - "orgChild1.id", "orgChild1.orgChild1Name", - "orgChild1.orgChild1ShortName", "orgChild1.orgChild1Order", - "orgChild2.id", "orgChild2.orgChild2Name", - "orgChild2.orgChild2ShortName", "orgChild2.orgChild2Order", - "orgChild3.id", "orgChild3.orgChild3Name", - "orgChild3.orgChild3ShortName", "orgChild3.orgChild3Order", - "orgChild4.id", "orgChild4.orgChild4Name", - "orgChild4.orgChild4ShortName", "orgChild4.orgChild4Order", ]) - .leftJoin("profile.posLevel", "posLevel") - .leftJoin("profile.posType", "posType") - .leftJoin("profile.current_holders", "current_holders") - .leftJoin("current_holders.orgRoot", "orgRoot") - .leftJoin("current_holders.orgChild1", "orgChild1") - .leftJoin("current_holders.orgChild2", "orgChild2") - .leftJoin("current_holders.orgChild3", "orgChild3") - .leftJoin("current_holders.orgChild4", "orgChild4") .where(node && nodeId ? "current_holders.orgRevisionId = :orgRevisionId" : "1=1", { - orgRevisionId: node && nodeId ? findRevision.id : undefined, + orgRevisionId: + node && nodeId + ? (await this.orgRevisionRepo.findOne({ where: { orgRevisionIsCurrent: true } }))?.id + : undefined, }) - // ...existing .andWhere เงื่อนไขเดิม... + .andWhere( + _data.root != undefined && _data.root != null + ? _data.root[0] != null + ? `current_holders.orgRootId IN (:...root)` + : `current_holders.orgRootId is null` + : "1=1", + { root: _data.root }, + ) + .andWhere( + _data.child1 != undefined && _data.child1 != null + ? _data.child1[0] != null + ? `current_holders.orgChild1Id IN (:...child1)` + : `current_holders.orgChild1Id is null` + : "1=1", + { child1: _data.child1 }, + ) + .andWhere( + _data.child2 != undefined && _data.child2 != null + ? _data.child2[0] != null + ? `current_holders.orgChild2Id IN (:...child2)` + : `current_holders.orgChild2Id is null` + : "1=1", + { child2: _data.child2 }, + ) + .andWhere( + _data.child3 != undefined && _data.child3 != null + ? _data.child3[0] != null + ? `current_holders.orgChild3Id IN (:...child3)` + : `current_holders.orgChild3Id is null` + : "1=1", + { child3: _data.child3 }, + ) + .andWhere( + _data.child4 != undefined && _data.child4 != null + ? _data.child4[0] != null + ? `current_holders.orgChild4Id IN (:...child4)` + : `current_holders.orgChild4Id is null` + : "1=1", + { child4: _data.child4 }, + ) + .andWhere(posType ? "posType.posTypeName LIKE :keyword1" : "1=1", { keyword1: `${posType}` }) + .andWhere(posLevel ? "posLevel.posLevelName LIKE :keyword2" : "1=1", { + keyword2: `${posLevel}`, + }) + .andWhere( + isProbation !== undefined && isProbation !== null + ? `profile.isProbation = ${isProbation}` + : "1=1", + ) + .andWhere( + isRetire !== undefined && isRetire !== null + ? isRetire == false + ? `profile.isLeave IS FALSE` + : isRetire == true && retireType + ? `profile.isLeave IS TRUE AND profile.leaveType = '${retireType}'` + : `profile.isLeave IS TRUE` + : "1=1", + ) .andWhere(nodeCondition, { nodeId: nodeId }) .andWhere( new Brackets((qb) => { - qb.orWhere( - searchKeyword != undefined && searchKeyword != null && searchKeyword != "" - ? queryLike - : "1=1", - { - keyword: `%${searchKeyword}%`, - }, - ); + qb.orWhere(searchKeyword ? queryLike : "1=1", { keyword: `%${searchKeyword}%` }); }), ) .addSelect("CASE WHEN current_holders.posMasterNo IS NULL THEN 1 ELSE 0 END", "sort_order") @@ -6205,9 +6241,19 @@ export class ProfileController extends Controller { .take(pageSize) .getManyAndCount(); - // 2. map ข้อมูลแบบ flat ไม่ต้องวนซ้ำซ้อน + // map ข้อมูลแบบเร็วขึ้น const data = record.map((_data) => { - // ...map เฉพาะ field ที่จำเป็น... + const holder = _data.current_holders?.[0]; + const org = [ + holder?.orgChild4?.orgChild4Name, + holder?.orgChild3?.orgChild3Name, + holder?.orgChild2?.orgChild2Name, + holder?.orgChild1?.orgChild1Name, + holder?.orgRoot?.orgRootName, + ] + .filter(Boolean) + .join("\n"); + return { id: _data.id, avatar: _data.avatar, @@ -6223,24 +6269,16 @@ export class ProfileController extends Controller { posLevelId: _data.posLevel?.id ?? null, posTypeId: _data.posType?.id ?? null, position: _data.position, - posNo: _data.current_holders?.[0]?.posMasterNo ?? null, - rootId: _data.current_holders?.[0]?.orgRootId ?? null, - root: _data.current_holders?.[0]?.orgRoot?.orgRootName ?? null, - orgRootShortName: _data.current_holders?.[0]?.orgRoot?.orgRootShortName ?? null, - orgRevisionId: _data.current_holders?.[0]?.orgRevisionId ?? null, - org: [ - _data.current_holders?.[0]?.orgChild4?.orgChild4Name, - _data.current_holders?.[0]?.orgChild3?.orgChild3Name, - _data.current_holders?.[0]?.orgChild2?.orgChild2Name, - _data.current_holders?.[0]?.orgChild1?.orgChild1Name, - _data.current_holders?.[0]?.orgRoot?.orgRootName ?? _data.current_holders?.[0]?.orgRoot, - ] - .filter((name) => !!name) - .join("\n"), + posNo: holder?.posMasterNo ?? null, + rootId: holder?.orgRoot?.id ?? null, + root: holder?.orgRoot?.orgRootName ?? null, + orgRootShortName: holder?.orgRoot?.orgRootShortName ?? null, + orgRevisionId: holder?.orgRoot?.orgRevisionId ?? null, + org, }; }); - return new HttpSuccess({ data: data, total }); + return new HttpSuccess({ data, total }); } /**