Merge branch 'task/173' into develop

This commit is contained in:
mamoss 2025-10-09 23:24:59 +07:00
commit a4f7b021a0
7 changed files with 403 additions and 629 deletions

View file

@ -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
*

View file

@ -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 = {

View file

@ -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,

View file

@ -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) => {

View file

@ -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

View file

@ -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,

View file

@ -56,7 +56,7 @@ export async function getToken() {
if (data && data.access_token) {
token = data.access_token;
}
console.log(`token: ${token}`);
return token;
}