diff --git a/src/controllers/OrganizationController.ts b/src/controllers/OrganizationController.ts index 1e087f6d..fdf194f6 100644 --- a/src/controllers/OrganizationController.ts +++ b/src/controllers/OrganizationController.ts @@ -1152,26 +1152,6 @@ export class OrganizationController extends Controller { */ @Get("super-admin/{id}") async detailSuperAdmin(@Path() id: string, @Request() request: RequestWithUser) { - // let _data: any = { - // root: null, - // child1: null, - // child2: null, - // child3: null, - // child4: null, - // }; - - // const orgRevision = await this.orgRevisionRepository.findOne({ where: { id } }); - // if (!orgRevision) { - // throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูล"); - // } - // if (!request.user.role.includes("SUPER_ADMIN")) { - // if (orgRevision.orgRevisionIsDraft == true && orgRevision.orgRevisionIsCurrent == false) { - // _data = await this.listAuthSysOrgFuncByRevisionIdN(request, "SYS_ORG", orgRevision.id); - // } else { - // _data = await this.listAuthSysOrgFuncByRevisionIdC(request, "SYS_ORG", orgRevision.id); - // } - // } - const orgRevision = await this.orgRevisionRepository.findOne({ where: { id: id }, relations: ["posMasters"], @@ -7527,208 +7507,7 @@ export class OrganizationController extends Controller { const check = orgRevision.orgRoots.find((x) => x.isDeputy == true); return new HttpSuccess(check != null); } - public async listAuthSysOrgFuncByRevisionIdN( - request: RequestWithUser, - system: string, - revisionId: string, - ) { - let profile = await this.profileRepo.findOne({ - where: { - keycloak: request.user.sub, - }, - relations: ["next_holders", "next_holders.authRole", "next_holders.authRole.authRoles"], - }); - let data: any = { - root: [null], - child1: [null], - child2: [null], - child3: [null], - child4: [null], - }; - if (!profile) { - return { - root: null, - child1: null, - child2: null, - child3: null, - child4: null, - }; - } - let attrOwnership = - profile?.next_holders - .filter((x) => x.orgRevisionId == revisionId)[0] - ?.authRole?.authRoles?.filter((x) => x.authSysId == system)[0]?.attrOwnership || null; - - let attrPrivilege = - profile?.next_holders - .filter((x) => x.orgRevisionId == revisionId)[0] - ?.authRole?.authRoles?.filter((x) => x.authSysId == system)[0]?.attrPrivilege || null; - - const posMaster = await this.posMasterRepository.findOne({ - where: { - next_holderId: profile.id, - orgRevisionId: revisionId, - }, - }); - if (!posMaster) { - data = { - root: [null], - child1: [null], - child2: [null], - child3: [null], - child4: [null], - }; - } else if (attrOwnership == "OWNER") { - data = { - root: null, - child1: null, - child2: null, - child3: null, - child4: null, - }; - } else if (attrPrivilege == "ROOT") { - data = { - root: [posMaster.orgRootId], - child1: null, - child2: null, - child3: null, - child4: null, - privilege: "ROOT", - }; - } else if (attrPrivilege == "CHILD") { - let node = 4; - if (posMaster.orgChild1Id == null) { - node = 0; - } else if (posMaster.orgChild2Id == null) { - node = 1; - } else if (posMaster.orgChild3Id == null) { - node = 2; - } else if (posMaster.orgChild4Id == null) { - node = 3; - } - data = { - root: node >= 0 ? [posMaster.orgRootId] : null, - child1: node >= 1 ? [posMaster.orgChild1Id] : null, - child2: node >= 2 ? [posMaster.orgChild2Id] : null, - child3: node >= 3 ? [posMaster.orgChild3Id] : null, - child4: node >= 4 ? [posMaster.orgChild4Id] : null, - }; - } else if (attrPrivilege == "NORMAL") { - data = { - root: [posMaster.orgRootId], - child1: [posMaster.orgChild1Id], - child2: [posMaster.orgChild2Id], - child3: [posMaster.orgChild3Id], - child4: [posMaster.orgChild4Id], - }; - } else if (attrPrivilege == "SPECIFIC") { - } - return data; - } - public async listAuthSysOrgFuncByRevisionIdC( - request: RequestWithUser, - system: string, - revisionId: string, - ) { - let profile = await this.profileRepo.findOne({ - where: { - keycloak: request.user.sub, - }, - relations: [ - "current_holders", - "current_holders.authRole", - "current_holders.authRole.authRoles", - ], - }); - let data: any = { - root: [null], - child1: [null], - child2: [null], - child3: [null], - child4: [null], - }; - if (!profile) { - return { - root: null, - child1: null, - child2: null, - child3: null, - child4: null, - }; - } - - let attrOwnership = - profile?.current_holders - .filter((x) => x.orgRevisionId == revisionId)[0] - ?.authRole?.authRoles?.filter((x) => x.authSysId == system)[0]?.attrOwnership || null; - - let attrPrivilege = - profile?.current_holders - .filter((x) => x.orgRevisionId == revisionId)[0] - ?.authRole?.authRoles?.filter((x) => x.authSysId == system)[0]?.attrPrivilege || null; - - const posMaster = await this.posMasterRepository.findOne({ - where: { - next_holderId: profile.id, - orgRevisionId: revisionId, - }, - }); - if (!posMaster) { - data = { - root: [null], - child1: [null], - child2: [null], - child3: [null], - child4: [null], - }; - } else if (attrOwnership == "OWNER") { - data = { - root: null, - child1: null, - child2: null, - child3: null, - child4: null, - }; - } else if (attrPrivilege == "ROOT") { - data = { - root: [posMaster.orgRootId], - child1: null, - child2: null, - child3: null, - child4: null, - privilege: "ROOT", - }; - } else if (attrPrivilege == "CHILD") { - let node = 4; - if (posMaster.orgChild1Id == null) { - node = 0; - } else if (posMaster.orgChild2Id == null) { - node = 1; - } else if (posMaster.orgChild3Id == null) { - node = 2; - } else if (posMaster.orgChild4Id == null) { - node = 3; - } - data = { - root: node >= 0 ? [posMaster.orgRootId] : null, - child1: node >= 1 ? [posMaster.orgChild1Id] : null, - child2: node >= 2 ? [posMaster.orgChild2Id] : null, - child3: node >= 3 ? [posMaster.orgChild3Id] : null, - child4: node >= 4 ? [posMaster.orgChild4Id] : null, - }; - } else if (attrPrivilege == "NORMAL") { - data = { - root: [posMaster.orgRootId], - child1: [posMaster.orgChild1Id], - child2: [posMaster.orgChild2Id], - child3: [posMaster.orgChild3Id], - child4: [posMaster.orgChild4Id], - }; - } else if (attrPrivilege == "SPECIFIC") { - } - return data; - } /** * API หา สกก1 * diff --git a/src/controllers/OrganizationDotnetController.ts b/src/controllers/OrganizationDotnetController.ts index a5e04d3d..cd4bad67 100644 --- a/src/controllers/OrganizationDotnetController.ts +++ b/src/controllers/OrganizationDotnetController.ts @@ -73,29 +73,10 @@ export class OrganizationDotnetController extends Controller { role?: string | null; nodeId?: string | null; node?: number | null; + page: number; + pageSize: number; }, ) { - // const profileRepository = AppDataSource.getRepository(Profile); - // const queryBuilder = profileRepository - // .createQueryBuilder("profile") - // .leftJoinAndSelect("profile.posLevel", "posLevel") - // .leftJoinAndSelect("profile.posType", "posType") - // if (body.citizenId || body.firstName || body.lastName) { - // queryBuilder.where( - // new Brackets((qb) => { - // if (body.citizenId) { - // qb.orWhere("profile.citizenId LIKE :citizenId", { citizenId: `%${body.citizenId}%` }); - // } - // if (body.firstName) { - // qb.orWhere("profile.firstName LIKE :firstName", { firstName: `%${body.firstName}%` }); - // } - // if (body.lastName) { - // qb.orWhere("profile.lastName LIKE :lastName", { lastName: `%${body.lastName}%` }); - // } - // }), - // ); - // } - // const profiles = await queryBuilder.getMany(); let condition = "1=1"; let conditionParams = {}; if (body.role === "CHILD") { @@ -120,12 +101,13 @@ export class OrganizationDotnetController extends Controller { break; } conditionParams = { nodeId: body.nodeId }; - } - else if (body.role === "ROOT") { + } else if (body.role === "ROOT") { condition = "orgRoot.ancestorDNA = :nodeId"; conditionParams = { nodeId: body.nodeId }; - } - else if (body.role === "NORMAL") { + } else if (body.role === "PARENT") { + condition = "orgChild1.ancestorDNA = :nodeId"; + conditionParams = { nodeId: body.nodeId }; + } else if (body.role === "NORMAL") { switch (body.node) { case 0: condition = "orgRoot.ancestorDNA = :nodeId AND current_holders.orgChild1 IS NULL"; @@ -150,12 +132,12 @@ export class OrganizationDotnetController extends Controller { } const findRevision = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false } + where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, }); if (!findRevision) { throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); } - const profiles = await this.profileRepo + const [profiles, total] = await this.profileRepo .createQueryBuilder("profile") .leftJoinAndSelect("profile.posLevel", "posLevel") .leftJoinAndSelect("profile.posType", "posType") @@ -169,20 +151,22 @@ export class OrganizationDotnetController extends Controller { .andWhere( new Brackets((qb) => { if (body.citizenId) { - qb.orWhere("profile.citizenId LIKE :citizenId", { citizenId: `%${body.citizenId}%` }); + qb.andWhere("profile.citizenId LIKE :citizenId", { citizenId: `%${body.citizenId}%` }); } if (body.firstName) { - qb.orWhere("profile.firstName LIKE :firstName", { firstName: `%${body.firstName}%` }); + qb.andWhere("profile.firstName LIKE :firstName", { firstName: `%${body.firstName}%` }); } if (body.lastName) { - qb.orWhere("profile.lastName LIKE :lastName", { lastName: `%${body.lastName}%` }); + qb.andWhere("profile.lastName LIKE :lastName", { lastName: `%${body.lastName}%` }); } }), ) .andWhere(condition, conditionParams) - .getMany() - - return new HttpSuccess(profiles); + .skip((body.page - 1) * body.pageSize) + .take(body.pageSize) + .getManyAndCount(); + + return new HttpSuccess({ data: profiles, total: total }); } /** @@ -201,40 +185,10 @@ export class OrganizationDotnetController extends Controller { role?: string | null; nodeId?: string | null; node?: number | null; + page: number; + pageSize: number; }, ) { - // const profileRepository = AppDataSource.getRepository(ProfileEmployee); - // const queryBuilder = profileRepository - // .createQueryBuilder("profile") - // .leftJoinAndSelect("profile.posLevel", "posLevel") - // .leftJoinAndSelect("profile.posType", "posType") - // .leftJoinAndSelect("profile.profileSalary", "profileSalary") - // .leftJoinAndSelect("profile.current_holders", "current_holders") - // .leftJoinAndSelect("current_holders.orgRoot", "orgRoot") - // .leftJoinAndSelect("current_holders.orgChild1", "orgChild1") - // .leftJoinAndSelect("current_holders.orgChild2", "orgChild2") - // .leftJoinAndSelect("current_holders.orgChild3", "orgChild3") - // .leftJoinAndSelect("current_holders.orgChild4", "orgChild4") - // .orderBy("profileSalary.order", "DESC"); - - // if (body.citizenId || body.firstName || body.lastName) { - // queryBuilder.where( - // new Brackets((qb) => { - // if (body.citizenId) { - // qb.orWhere("profile.citizenId LIKE :citizenId", { citizenId: `%${body.citizenId}%` }); - // } - // if (body.firstName) { - // qb.orWhere("profile.firstName LIKE :firstName", { firstName: `%${body.firstName}%` }); - // } - // if (body.lastName) { - // qb.orWhere("profile.lastName LIKE :lastName", { lastName: `%${body.lastName}%` }); - // } - // }), - // ); - // } - - // const profileEmp = await queryBuilder.getMany(); - let condition = "1=1"; let conditionParams = {}; if (body.role === "CHILD") { @@ -259,12 +213,13 @@ export class OrganizationDotnetController extends Controller { break; } conditionParams = { nodeId: body.nodeId }; - } - else if (body.role === "ROOT") { + } else if (body.role === "ROOT") { condition = "orgRoot.ancestorDNA = :nodeId"; conditionParams = { nodeId: body.nodeId }; - } - else if (body.role === "NORMAL") { + } else if (body.role === "PARENT") { + condition = "orgChild1.ancestorDNA = :nodeId"; + conditionParams = { nodeId: body.nodeId }; + } else if (body.role === "NORMAL") { switch (body.node) { case 0: condition = "orgRoot.ancestorDNA = :nodeId AND current_holders.orgChild1 IS NULL"; @@ -294,7 +249,7 @@ export class OrganizationDotnetController extends Controller { if (!findRevision) { throw new HttpError(HttpStatus.NOT_FOUND, "not found. OrgRevision"); } - const profileEmp = await this.profileEmpRepo + const [profileEmp, total] = await this.profileEmpRepo .createQueryBuilder("profile") .leftJoinAndSelect("profile.posLevel", "posLevel") .leftJoinAndSelect("profile.posType", "posType") @@ -309,110 +264,112 @@ export class OrganizationDotnetController extends Controller { .andWhere( new Brackets((qb) => { if (body.citizenId) { - qb.orWhere("profile.citizenId LIKE :citizenId", { citizenId: `%${body.citizenId}%` }); + qb.andWhere("profile.citizenId LIKE :citizenId", { citizenId: `%${body.citizenId}%` }); } if (body.firstName) { - qb.orWhere("profile.firstName LIKE :firstName", { firstName: `%${body.firstName}%` }); + qb.andWhere("profile.firstName LIKE :firstName", { firstName: `%${body.firstName}%` }); } if (body.lastName) { - qb.orWhere("profile.lastName LIKE :lastName", { lastName: `%${body.lastName}%` }); + qb.andWhere("profile.lastName LIKE :lastName", { lastName: `%${body.lastName}%` }); } }), ) .andWhere(condition, conditionParams) .orderBy("profileSalary.order", "DESC") - .getMany() + .skip((body.page - 1) * body.pageSize) + .take(body.pageSize) + .getManyAndCount(); - const profileEmp_ = await Promise.all( - profileEmp.map((item: ProfileEmployee) => { - const rootName = - item.current_holders.length == 0 - ? null - : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgRoot - ?.orgRootName; - const shortName = - item.current_holders.length == 0 - ? null - : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild4 != - null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) - ?.orgChild3 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) - ?.orgChild2 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != null && - item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) - ?.orgChild1 != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` - : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != - null && - item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) - ?.orgRoot != null - ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` - : null; - return { - oc: rootName, - id: item.id, - createdAt: item.createdAt, - createdUserId: item.createdUserId, - lastUpdatedAt: item.lastUpdatedAt, - lastUpdateUserId: item.lastUpdateUserId, - createdFullName: item.createdFullName, - lastUpdateFullName: item.lastUpdateFullName, - avatar: item.avatar, - avatarName: item.avatarName, - rank: item.rank, - prefix: item.prefix, - firstName: item.firstName, - lastName: item.lastName, - citizenId: item.citizenId, - position: item.position, - posLevelId: item.posLevelId, - posTypeId: item.posTypeId, - email: item.email, - phone: item.phone, - keycloak: item.keycloak, - isProbation: item.isProbation, - isLeave: item.isLeave, - leaveReason: item.leaveReason, - dateLeave: item.dateLeave, - dateRetire: item.dateRetire, - dateAppoint: item.dateAppoint, - dateRetireLaw: item.dateRetireLaw, - dateStart: item.dateStart, - govAgeAbsent: item.govAgeAbsent, - govAgePlus: item.govAgePlus, - birthDate: item.birthDate ?? new Date(), - reasonSameDate: item.reasonSameDate, - ethnicity: item.ethnicity, - telephoneNumber: item.phone, - nationality: item.nationality, - gender: item.gender, - relationship: item.relationship, - religion: item.religion, - bloodGroup: item.bloodGroup, - registrationAddress: item.registrationAddress, - registrationProvinceId: item.registrationProvinceId, - registrationDistrictId: item.registrationDistrictId, - registrationSubDistrictId: item.registrationSubDistrictId, - registrationZipCode: item.registrationZipCode, - currentAddress: item.currentAddress, - currentProvinceId: item.currentProvinceId, - currentDistrictId: item.currentDistrictId, - currentSubDistrictId: item.currentSubDistrictId, - currentZipCode: item.currentZipCode, - posLevel: item.posLevel, - posType: item.posType, - posNo: shortName, - }; - }), - ); - return new HttpSuccess(profileEmp_); + // const profileEmp_ = await Promise.all( + // profileEmp.map((item: ProfileEmployee) => { + // const rootName = + // item.current_holders.length == 0 + // ? null + // : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgRoot + // ?.orgRootName; + // const shortName = + // item.current_holders.length == 0 + // ? null + // : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != null && + // item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild4 != + // null + // ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild4.orgChild4ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` + // : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != null && + // item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) + // ?.orgChild3 != null + // ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild3.orgChild3ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` + // : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != null && + // item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) + // ?.orgChild2 != null + // ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild2.orgChild2ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` + // : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != null && + // item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) + // ?.orgChild1 != null + // ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgChild1.orgChild1ShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` + // : item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) != + // null && + // item.current_holders.find((x) => x.orgRevisionId == findRevision?.id) + // ?.orgRoot != null + // ? `${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.orgRoot.orgRootShortName} ${item.current_holders.find((x) => x.orgRevisionId == findRevision?.id)?.posMasterNo}` + // : null; + // return { + // oc: rootName, + // id: item.id, + // createdAt: item.createdAt, + // createdUserId: item.createdUserId, + // lastUpdatedAt: item.lastUpdatedAt, + // lastUpdateUserId: item.lastUpdateUserId, + // createdFullName: item.createdFullName, + // lastUpdateFullName: item.lastUpdateFullName, + // avatar: item.avatar, + // avatarName: item.avatarName, + // rank: item.rank, + // prefix: item.prefix, + // firstName: item.firstName, + // lastName: item.lastName, + // citizenId: item.citizenId, + // position: item.position, + // posLevelId: item.posLevelId, + // posTypeId: item.posTypeId, + // email: item.email, + // phone: item.phone, + // keycloak: item.keycloak, + // isProbation: item.isProbation, + // isLeave: item.isLeave, + // leaveReason: item.leaveReason, + // dateLeave: item.dateLeave, + // dateRetire: item.dateRetire, + // dateAppoint: item.dateAppoint, + // dateRetireLaw: item.dateRetireLaw, + // dateStart: item.dateStart, + // govAgeAbsent: item.govAgeAbsent, + // govAgePlus: item.govAgePlus, + // birthDate: item.birthDate ?? new Date(), + // reasonSameDate: item.reasonSameDate, + // ethnicity: item.ethnicity, + // telephoneNumber: item.phone, + // nationality: item.nationality, + // gender: item.gender, + // relationship: item.relationship, + // religion: item.religion, + // bloodGroup: item.bloodGroup, + // registrationAddress: item.registrationAddress, + // registrationProvinceId: item.registrationProvinceId, + // registrationDistrictId: item.registrationDistrictId, + // registrationSubDistrictId: item.registrationSubDistrictId, + // registrationZipCode: item.registrationZipCode, + // currentAddress: item.currentAddress, + // currentProvinceId: item.currentProvinceId, + // currentDistrictId: item.currentDistrictId, + // currentSubDistrictId: item.currentSubDistrictId, + // currentZipCode: item.currentZipCode, + // posLevel: item.posLevel, + // posType: item.posType, + // posNo: shortName, + // }; + // }), + // ); + return new HttpSuccess({ data: profileEmp, total: total }); } /** @@ -693,10 +650,10 @@ export class OrganizationDotnetController extends Controller { } } } - let positionLeaveName = + let positionLeaveName = profile.posType == null && profile.posLevel == null - ? "" - : `${profile.posType?.posTypeShortName ?? ""} ${profile.posLevel?.posLevelName ?? ""}` + ? "" + : `${profile.posType?.posTypeShortName ?? ""} ${profile.posLevel?.posLevelName ?? ""}`; const _profileCurrent = profile?.current_holders?.find( (x) => @@ -4077,27 +4034,27 @@ export class OrganizationDotnetController extends Controller { // }; // } // } else { - if (body.node === 0) { - typeCondition = { - orgRootId: body.nodeId, - }; - } else if (body.node === 1) { - typeCondition = { - orgChild1Id: body.nodeId, - }; - } else if (body.node === 2) { - typeCondition = { - orgChild2Id: body.nodeId, - }; - } else if (body.node === 3) { - typeCondition = { - orgChild3Id: body.nodeId, - }; - } else if (body.node === 4) { - typeCondition = { - orgChild4Id: body.nodeId, - }; - } + if (body.node === 0) { + typeCondition = { + orgRootId: body.nodeId, + }; + } else if (body.node === 1) { + typeCondition = { + orgChild1Id: body.nodeId, + }; + } else if (body.node === 2) { + typeCondition = { + orgChild2Id: body.nodeId, + }; + } else if (body.node === 3) { + typeCondition = { + orgChild3Id: body.nodeId, + }; + } else if (body.node === 4) { + typeCondition = { + orgChild4Id: body.nodeId, + }; + } // } let profile = await this.profileRepo.find({ where: { keycloak: Not(IsNull()) || Not(""), isLeave: false, current_holders: typeCondition }, @@ -4123,10 +4080,7 @@ export class OrganizationDotnetController extends Controller { // isLeave: false, current_holders: typeCondition, // isRetirement: true, - dateRetire: And( - Not(IsNull()), - Between(startOfYear, endOfYear) - ) + dateRetire: And(Not(IsNull()), Between(startOfYear, endOfYear)), }, relations: [ "posType", @@ -4397,15 +4351,15 @@ export class OrganizationDotnetController extends Controller { }, ) { let findRevision = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false } + where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, }); switch (body.node) { case 0: let orgRoot = await this.orgRootRepo.findOne({ - where: { + where: { id: body.nodeId, - orgRevisionId: findRevision?.id - } + orgRevisionId: findRevision?.id, + }, }); return new HttpSuccess({ rootName: orgRoot?.orgRootName ?? null, @@ -4418,10 +4372,10 @@ export class OrganizationDotnetController extends Controller { case 1: let orgChild1 = await this.orgChild1Repo.findOne({ relations: ["orgRoot"], - where: { + where: { id: body.nodeId, - orgRevisionId: findRevision?.id - } + orgRevisionId: findRevision?.id, + }, }); return new HttpSuccess({ rootName: orgChild1?.orgRoot.orgRootName ?? null, @@ -4434,10 +4388,10 @@ export class OrganizationDotnetController extends Controller { case 2: let orgChild2 = await this.orgChild2Repo.findOne({ relations: ["orgRoot", "orgChild1"], - where: { + where: { id: body.nodeId, - orgRevisionId: findRevision?.id - } + orgRevisionId: findRevision?.id, + }, }); return new HttpSuccess({ rootName: orgChild2?.orgRoot.orgRootName ?? null, @@ -4450,10 +4404,10 @@ export class OrganizationDotnetController extends Controller { case 3: let orgChild3 = await this.orgChild3Repo.findOne({ relations: ["orgRoot", "orgChild1", "orgChild2"], - where: { + where: { id: body.nodeId, - orgRevisionId: findRevision?.id - } + orgRevisionId: findRevision?.id, + }, }); return new HttpSuccess({ rootName: orgChild3?.orgRoot.orgRootName ?? null, @@ -4466,10 +4420,10 @@ export class OrganizationDotnetController extends Controller { case 4: let orgChild4 = await this.orgChild4Repo.findOne({ relations: ["orgRoot", "orgChild1", "orgChild2", "orgChild3"], - where: { + where: { id: body.nodeId, - orgRevisionId: findRevision?.id - } + orgRevisionId: findRevision?.id, + }, }); return new HttpSuccess({ rootName: orgChild4?.orgRoot.orgRootName ?? null, @@ -4486,7 +4440,7 @@ export class OrganizationDotnetController extends Controller { child2Name: null, child3Name: null, child4Name: null, - });; + }); } } @@ -4506,87 +4460,87 @@ export class OrganizationDotnetController extends Controller { role: string; isRetirement?: boolean; revisionId?: string; - reqNode?: number; + reqNode?: number; reqNodeId?: string; }, ) { let typeCondition: any = {}; - if (body.role === "CHILD") { + if (body.role === "CHILD" || body.role === "PARENT" || body.role === "ROOT") { switch (body.node) { case 0: typeCondition = { orgRoot: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case 1: typeCondition = { orgChild1: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case 2: typeCondition = { orgChild2: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case 3: typeCondition = { orgChild3: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case 4: typeCondition = { orgChild4: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; default: typeCondition = {}; break; } - } else if (body.role === "ROOT" || body.role === "OWNER") { + } else if (body.role === "OWNER") { switch (body.reqNode) { case 0: typeCondition = { orgRoot: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; case 1: typeCondition = { orgChild1: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; case 2: typeCondition = { orgChild2: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; case 3: typeCondition = { orgChild3: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; case 4: typeCondition = { orgChild4: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; default: @@ -4598,39 +4552,39 @@ export class OrganizationDotnetController extends Controller { case 0: typeCondition = { orgRoot: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, - orgChild1: IsNull() + orgChild1: IsNull(), }; break; case 1: typeCondition = { orgChild1: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, - orgChild2: IsNull() + orgChild2: IsNull(), }; break; case 2: typeCondition = { orgChild2: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, - orgChild3: IsNull() + orgChild3: IsNull(), }; break; case 3: typeCondition = { orgChild3: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, - orgChild4: IsNull() + orgChild4: IsNull(), }; break; case 4: typeCondition = { orgChild4: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, }; break; @@ -4670,8 +4624,8 @@ export class OrganizationDotnetController extends Controller { orgChild4Order: "ASC", }, posMasterNo: "ASC", - } - } + }, + }, }); if (body.isRetirement) { profile = await this.profileRepo.find({ @@ -4693,7 +4647,7 @@ export class OrganizationDotnetController extends Controller { }); } let findRevision = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false } + where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, }); if (body.revisionId) { @@ -4703,7 +4657,7 @@ export class OrganizationDotnetController extends Controller { } const profile_ = await Promise.all( - profile.map(async(item: Profile) => { + profile.map(async (item: Profile) => { const shortName = item.current_holders.length == 0 ? null @@ -4747,8 +4701,8 @@ export class OrganizationDotnetController extends Controller { let _posMaster = await this.posMasterRepository.findOne({ where: { orgRevisionId: findRevision?.id, - current_holderId: item.id - } + current_holderId: item.id, + }, }); return { @@ -4769,7 +4723,7 @@ export class OrganizationDotnetController extends Controller { orgChild1Id: _posMaster?.orgChild1Id, orgChild2Id: _posMaster?.orgChild2Id, orgChild3Id: _posMaster?.orgChild3Id, - orgChild4Id: _posMaster?.orgChild4Id + orgChild4Id: _posMaster?.orgChild4Id, }; }), ); @@ -5101,46 +5055,46 @@ export class OrganizationDotnetController extends Controller { role: string; isRetirement?: boolean; revisionId?: string; - reqNode?: number; + reqNode?: number; reqNodeId?: string; }, ) { let typeCondition: any = {}; - if (body.role === "CHILD") { + if (body.role === "CHILD" || body.role === "PARENT" || body.role === "ROOT") { switch (body.node) { case 0: typeCondition = { orgRoot: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case 1: typeCondition = { orgChild1: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case 2: typeCondition = { orgChild2: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case 3: typeCondition = { orgChild3: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case 4: typeCondition = { orgChild4: { - ancestorDNA: body.nodeId - } + ancestorDNA: body.nodeId, + }, }; break; case null: @@ -5150,41 +5104,41 @@ export class OrganizationDotnetController extends Controller { typeCondition = {}; break; } - } else if (body.role === "ROOT" || body.role === "OWNER") { + } else if (body.role === "OWNER") { switch (body.reqNode) { case 0: typeCondition = { orgRoot: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; case 1: typeCondition = { orgChild1: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; case 2: typeCondition = { orgChild2: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; case 3: typeCondition = { orgChild3: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; case 4: typeCondition = { orgChild4: { - id: body.reqNodeId - } + id: body.reqNodeId, + }, }; break; default: @@ -5196,39 +5150,39 @@ export class OrganizationDotnetController extends Controller { case 0: typeCondition = { orgRoot: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, - orgChild1: IsNull() + orgChild1: IsNull(), }; break; case 1: typeCondition = { orgChild1: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, - orgChild2: IsNull() + orgChild2: IsNull(), }; break; case 2: typeCondition = { orgChild2: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, - orgChild3: IsNull() + orgChild3: IsNull(), }; break; case 3: typeCondition = { orgChild3: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, - orgChild4: IsNull() + orgChild4: IsNull(), }; break; case 4: typeCondition = { orgChild4: { - ancestorDNA: body.nodeId + ancestorDNA: body.nodeId, }, }; break; @@ -5268,8 +5222,8 @@ export class OrganizationDotnetController extends Controller { orgChild4Order: "ASC", }, posMasterNo: "ASC", - } - } + }, + }, }); if (body.isRetirement) { profile = await this.profileEmpRepo.find({ @@ -5291,7 +5245,7 @@ export class OrganizationDotnetController extends Controller { }); } let findRevision = await this.orgRevisionRepo.findOne({ - where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false } + where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, }); if (body.revisionId) { @@ -5301,7 +5255,7 @@ export class OrganizationDotnetController extends Controller { } const profile_ = await Promise.all( - profile.map(async(item: ProfileEmployee) => { + profile.map(async (item: ProfileEmployee) => { const shortName = item.current_holders.length == 0 ? null @@ -5345,8 +5299,8 @@ export class OrganizationDotnetController extends Controller { let _posMaster = await this.empPosMasterRepository.findOne({ where: { orgRevisionId: findRevision?.id, - current_holderId: item.id - } + current_holderId: item.id, + }, }); return { @@ -5360,9 +5314,10 @@ export class OrganizationDotnetController extends Controller { keycloak: item.keycloak, posNo: shortName, position: item.position, - positionLevel: item.posType?.posTypeShortName && item.posLevel?.posLevelName - ? `${item.posType?.posTypeShortName} ${item.posLevel?.posLevelName}` - : null, + positionLevel: + item.posType?.posTypeShortName && item.posLevel?.posLevelName + ? `${item.posType?.posTypeShortName} ${item.posLevel?.posLevelName}` + : null, positionType: item.posType?.posTypeName ?? null, oc: Oc, orgRootId: _posMaster?.orgRootId, @@ -5580,7 +5535,7 @@ export class OrganizationDotnetController extends Controller { } const position = await AppDataSource.query("CALL GetProfileEmployeeSalaryPosition(?, ?)", [ profile.id, - _currentDate + _currentDate, ]); const _position = position.length > 0 ? position[0] : []; @@ -5692,11 +5647,13 @@ export class OrganizationDotnetController extends Controller { } } if (profile && profile?.isLeave) { - _currentDate = profile && profile.leaveDate - ? Extension.toDateOnlyString(profile.leaveDate) - : _currentDate + _currentDate = + profile && profile.leaveDate ? Extension.toDateOnlyString(profile.leaveDate) : _currentDate; } - const position = await AppDataSource.query("CALL GetProfileSalaryPosition(?, ?)", [profile.id, _currentDate]); + const position = await AppDataSource.query("CALL GetProfileSalaryPosition(?, ?)", [ + profile.id, + _currentDate, + ]); const _position = position.length > 0 ? position[0] : []; const mapProfile = { diff --git a/src/controllers/PermissionController.ts b/src/controllers/PermissionController.ts index 72b7d671..54dea336 100644 --- a/src/controllers/PermissionController.ts +++ b/src/controllers/PermissionController.ts @@ -732,6 +732,14 @@ export class PermissionController extends Controller { child3: null, child4: null, }; + } else if (privilege == "PARENT") { + data = { + root: [x.orgRootId], + child1: [x.orgChild1Id], + child2: null, + child3: null, + child4: null, + }; } else if (privilege == "CHILD") { data = { root: node >= 0 ? [x.orgRootId] : null, diff --git a/src/controllers/UserController.ts b/src/controllers/UserController.ts index 4f90afeb..6f2fd217 100644 --- a/src/controllers/UserController.ts +++ b/src/controllers/UserController.ts @@ -915,6 +915,7 @@ export class KeycloakController extends Controller { // keycloak: IsNull(), isLeave: false, }, + order: { citizenId: "ASC" }, relations: ["roleKeycloaks"], }); @@ -928,12 +929,11 @@ export class KeycloakController extends Controller { }); // Process แบบ batch เพื่อลดการเรียก API ทีละตัว - const batchSize = 10; + const batchSize = 100; const batches = []; for (let i = 0; i < profiles.length; i += batchSize) { batches.push(profiles.slice(i, i + batchSize)); } - for (const batch of batches) { await Promise.all( batch.map(async (_item) => { diff --git a/src/controllers/WorkflowController.ts b/src/controllers/WorkflowController.ts index 0938b267..e12cdd0a 100644 --- a/src/controllers/WorkflowController.ts +++ b/src/controllers/WorkflowController.ts @@ -55,29 +55,35 @@ export class WorkflowController extends Controller { fullName?: string | null; }, ) { + // ขั้นที่ 1: ทำการค้นหา profile และ metaWorkflow แบบ parallel + const [userProfileOfficer, userProfileEmployee, metaWorkflow] = await Promise.all([ + this.profileRepo.findOne({ + where: { keycloak: req.user.sub }, + select: ["id", "keycloak"], + }), + this.profileEmployeeRepo.findOne({ + where: { keycloak: req.user.sub }, + select: ["id", "keycloak"], + }), + this.metaWorkflowRepo.findOne({ + where: { + sysName: body.sysName, + posLevelName: body.posLevelName, + posTypeName: body.posTypeName, + }, + }), + ]); + + // กำหนด profile type และ profile let profileType = "OFFICER"; - let profile: any = await this.profileRepo.findOne({ - where: { - keycloak: req.user.sub, - }, - }); + let profile: any = userProfileOfficer; + if (!profile) { profileType = "EMPLOYEE"; - profile = await this.profileEmployeeRepo.findOne({ - where: { - keycloak: req.user.sub, - }, - }); + profile = userProfileEmployee; if (!profile) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลผู้ใช้งาน"); } - const metaWorkflow = await this.metaWorkflowRepo.findOne({ - where: { - sysName: body.sysName, - posLevelName: body.posLevelName, - posTypeName: body.posTypeName, - }, - }); if (!metaWorkflow) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบกระบวนการนี้ได้"); const meta = { @@ -88,6 +94,8 @@ export class WorkflowController extends Controller { createdAt: new Date(), lastUpdatedAt: new Date(), }; + + // ขั้นที่ 2: สร้าง workflow และดึง metaState แบบ parallel const workflow = new Workflow(); Object.assign(workflow, { ...metaWorkflow, @@ -97,117 +105,130 @@ export class WorkflowController extends Controller { profileType: profileType, system: body.sysName, }); - await this.workflowRepo.save(workflow); - const metaState = await this.metaStateRepo.find({ - where: { - metaWorkflowId: metaWorkflow.id, - }, - order: { order: "ASC" }, + + const [savedWorkflow, metaStates] = await Promise.all([ + this.workflowRepo.save(workflow), + this.metaStateRepo.find({ + where: { metaWorkflowId: metaWorkflow.id }, + order: { order: "ASC" }, + }), + ]); + + // ขั้นที่ 3: สร้าง states ทั้งหมดในครั้งเดียว + const statesToCreate = metaStates.map((item) => { + const state = new State(); + Object.assign(state, { ...item, id: undefined, workflowId: savedWorkflow.id, ...meta }); + return state; }); - await Promise.all( - metaState.map(async (item) => { - const state = new State(); - Object.assign(state, { ...item, id: undefined, workflowId: workflow.id, ...meta }); - await this.stateRepo.save(state); - if (state.order == 1) { - workflow.stateId = state.id; - await this.workflowRepo.save(workflow); - } - const metaStateOperator = await this.metaStateOperatorRepo.find({ - where: { - metaStateId: item.id, - }, + const savedStates = await this.stateRepo.save(statesToCreate); + + // ขั้นที่ 4: อัปเดต workflow.stateId กับ state แรก + const firstState = savedStates.find((state) => state.order === 1); + if (firstState) { + savedWorkflow.stateId = firstState.id; + await this.workflowRepo.save(savedWorkflow); + } + + // ขั้นที่ 5: ดึง metaStateOperators ทั้งหมดและสร้าง stateOperators + const metaStateIds = metaStates.map((item) => item.id); + const allMetaStateOperators = await this.metaStateOperatorRepo.find({ + where: { metaStateId: In(metaStateIds) }, + }); + + // สร้าง stateOperators ทั้งหมดในครั้งเดียว + const stateOperatorsToCreate: StateOperator[] = []; + allMetaStateOperators.forEach((metaStateOp) => { + const correspondingState = savedStates.find( + (state) => + metaStates.find((metaState) => metaState.id === metaStateOp.metaStateId)?.order === + state.order, + ); + + if (correspondingState) { + const stateOperator = new StateOperator(); + Object.assign(stateOperator, { + ...metaStateOp, + id: undefined, + stateId: correspondingState.id, + ...meta, }); - await Promise.all( - metaStateOperator.map(async (item1) => { - const stateOperator = new StateOperator(); - Object.assign(stateOperator, { ...item1, id: undefined, stateId: state.id, ...meta }); - await this.stateOperatorRepo.save(stateOperator); - }), - ); - }), - ); - let num = 1; - const stateOperatorUser = new StateOperatorUser(); + stateOperatorsToCreate.push(stateOperator); + } + }); + + await this.stateOperatorRepo.save(stateOperatorsToCreate); + // ขั้นที่ 6: สร้าง StateOperatorUsers แบบ bulk + const stateOperatorUsersToCreate: StateOperatorUser[] = []; + let orderNum = 1; + + // เพิ่ม Owner ก่อน if (profile) { - Object.assign(stateOperatorUser, { - profileId: profileType == "OFFICER" ? profile.id : null, - profileEmployeeId: profileType != "OFFICER" ? profile.id : null, + const ownerStateOperatorUser = new StateOperatorUser(); + Object.assign(ownerStateOperatorUser, { + profileId: profileType === "OFFICER" ? profile.id : null, + profileEmployeeId: profileType !== "OFFICER" ? profile.id : null, profileType: profileType, operator: "Owner", - order: num, - workflowId: workflow.id, + order: orderNum, + workflowId: savedWorkflow.id, ...meta, }); + stateOperatorUsersToCreate.push(ownerStateOperatorUser); } - await this.stateOperatorUserRepo.save(stateOperatorUser); - const profileOfficer = await this.posMasterRepo.find({ + // ดึงข้อมูล profileOfficers และสร้าง StateOperatorUsers + const profileOfficers = await this.posMasterRepo.find({ where: { posMasterAssigns: { assignId: body.sysName }, orgRevision: { orgRevisionIsDraft: false, orgRevisionIsCurrent: true }, + current_holderId: Not(IsNull()), // เพิ่มเงื่อนไขนี้เพื่อกรองเฉพาะที่มี current_holder }, relations: ["orgChild1"], + select: ["current_holderId", "orgChild1"], // เลือกเฉพาะ field ที่จำเป็น }); - await Promise.all( - profileOfficer.map(async (item, i) => { - if (item.current_holderId) { - num = num + 1; - if (item.orgChild1 == null || item.orgChild1.isOfficer == false) { - const stateOperatorUser = new StateOperatorUser(); - Object.assign(stateOperatorUser, { - profileId: item.current_holderId, - operator: "Officer", - profileType: "OFFICER", - order: num, - workflowId: workflow.id, - ...meta, - }); - await this.stateOperatorUserRepo.save(stateOperatorUser); - } else { - const stateOperatorUser = new StateOperatorUser(); - Object.assign(stateOperatorUser, { - profileId: item.current_holderId, - operator: "PersonnelOfficer", - profileType: "OFFICER", - order: num, - workflowId: workflow.id, - ...meta, - }); - await this.stateOperatorUserRepo.save(stateOperatorUser); - } - } - }), + + // สร้าง StateOperatorUsers สำหรับ officers + profileOfficers.forEach((item) => { + if (item.current_holderId) { + orderNum += 1; + const isPersonnelOfficer = item.orgChild1?.isOfficer === true; + + const officerStateOperatorUser = new StateOperatorUser(); + Object.assign(officerStateOperatorUser, { + profileId: item.current_holderId, + operator: isPersonnelOfficer ? "PersonnelOfficer" : "Officer", + profileType: "OFFICER", + order: orderNum, + workflowId: savedWorkflow.id, + ...meta, + }); + stateOperatorUsersToCreate.push(officerStateOperatorUser); + } + }); + + // บันทึก StateOperatorUsers ทั้งหมดในครั้งเดียว + await this.stateOperatorUserRepo.save(stateOperatorUsersToCreate); + + // ขั้นที่ 7: ส่ง notification (ใช้ข้อมูลที่มีอยู่แล้วแทนการ query ใหม่) + const firstStateOperators = stateOperatorsToCreate.filter((so) => + savedStates.find((state) => state.id === so.stateId && state.order === 1), ); - const _workflow = await this.workflowRepo.findOne({ - where: { id: workflow.id }, - relations: ["stateOperatorUsers"], - }); - if (!_workflow) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่สามารถดำเนินการกระบวนการนี้ได้"); - - const _state = await this.stateRepo.findOne({ - where: { - id: _workflow.stateId, - }, - relations: ["stateOperators"], - }); - if (!_state) throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลขั้นตอนการอนุมัติ"); - let profileNow = _workflow.stateOperatorUsers - .filter((x) => _state.stateOperators.map((s) => s.operator).includes(x.operator)) - .map((x) => ({ - receiverUserId: x.profileType == "OFFICER" ? x.profileId : x.profileEmployeeId, + const notificationReceivers = stateOperatorUsersToCreate + .filter((user) => firstStateOperators.some((op) => op.operator === user.operator)) + .map((user) => ({ + receiverUserId: user.profileType === "OFFICER" ? user.profileId : user.profileEmployeeId, notiLink: "", })); - await new CallAPI() + + // ส่ง notification แบบ fire-and-forget + new CallAPI() .PostData(req, "/placement/noti/profiles", { - // subject: `รายการถูกส่ง`, - // body: `รายการถูกส่ง`, - subject: `แจ้ง${workflow.name}ของ ${body.fullName}`, - body: `แจ้ง${workflow.name}ของ ${body.fullName}`, - receiverUserIds: profileNow, - payload: "", //แนบไฟล์ + subject: `แจ้ง${savedWorkflow.name}ของ ${body.fullName}`, + body: `แจ้ง${savedWorkflow.name}ของ ${body.fullName}`, + receiverUserIds: notificationReceivers, + payload: "", isSendMail: true, isSendInbox: true, isSendNotification: true, @@ -809,8 +830,8 @@ export class WorkflowController extends Controller { pageSize: number; keycloakId?: string | null; type?: string | null; - sortBy?: string | null, - descending?: boolean, + sortBy?: string | null; + descending?: boolean; }, ) { const userKeycloak = body.keycloakId ?? request.user.sub; @@ -990,10 +1011,10 @@ export class WorkflowController extends Controller { if (body.sortBy) { queryBuilder = queryBuilder.orderBy( `entity.${body.sortBy}`, - body.descending ? "DESC" : "ASC" + body.descending ? "DESC" : "ASC", ); } - + // 7. Execute พร้อมกัน - ใช้ Promise.all const [data, total] = await Promise.all([ queryBuilder diff --git a/src/interfaces/permission.ts b/src/interfaces/permission.ts index cfe76e6d..1fb12f00 100644 --- a/src/interfaces/permission.ts +++ b/src/interfaces/permission.ts @@ -94,6 +94,15 @@ class CheckAuth { child4: null, privilege: "ROOT", }; + } else if (privilege == "PARENT") { + data = { + root: [x.orgRootId], + child1: [x.orgChild1Id], + child2: null, + child3: null, + child4: null, + privilege: "PARENT", + }; } else if (privilege == "CHILD") { data = { root: node >= 0 ? [x.orgRootId] : null, diff --git a/src/keycloak/index.ts b/src/keycloak/index.ts index ec0cd246..c14a6b62 100644 --- a/src/keycloak/index.ts +++ b/src/keycloak/index.ts @@ -56,7 +56,7 @@ export async function getToken() { if (data && data.access_token) { token = data.access_token; } - + console.log(`token: ${token}`); return token; }