diff --git a/src/controllers/KpiEvaluationController.ts b/src/controllers/KpiEvaluationController.ts index bb263a0..057b6f7 100644 --- a/src/controllers/KpiEvaluationController.ts +++ b/src/controllers/KpiEvaluationController.ts @@ -70,27 +70,23 @@ async updateKpiEvaluations( */ @Get() async listKpiEvaluation( - // @Query("page") page: number = 1, - // @Query("pageSize") pageSize: number = 10, - // @Query("keyword") keyword?: string, + @Query("page") page: number = 1, + @Query("pageSize") pageSize: number = 10, + @Query("keyword") keyword?: string, ) { let whereClause: any = {}; - // if (keyword !== undefined && keyword !== "") { - // whereClause = { - // where: [{ description: Like(`%${keyword}%`) }], - // }; - // whereClause.where.push({ level: Like(`%${keyword}%`) }); + if (keyword !== undefined && keyword !== "") { + whereClause = { + where: [{ description: Like(`%${keyword}%`) }], + }; + whereClause.where.push({ level: Like(`%${keyword}%`) }); - // } + } - // const [kpiEvaluation, total] = await this.kpiEvaluationRepository.findAndCount({ - // ...whereClause, - // ...(keyword ? {} : { skip: (page - 1) * pageSize, take: pageSize }), - // order:{ - // level: "DESC"} - // }); - const kpiEvaluation = await this.kpiEvaluationRepository.find({ + const [kpiEvaluation, total] = await this.kpiEvaluationRepository.findAndCount({ + ...whereClause, + ...(keyword ? {} : { skip: (page - 1) * pageSize, take: pageSize }), order:{ level: "DESC"} }); @@ -100,6 +96,6 @@ async updateKpiEvaluations( level: item.level, description: item.description })); - return new HttpSuccess(formatted); + return new HttpSuccess({ data: formatted, total }); } } diff --git a/src/controllers/KpiLinkController.ts b/src/controllers/KpiLinkController.ts index 39c0d57..c2ceb7c 100644 --- a/src/controllers/KpiLinkController.ts +++ b/src/controllers/KpiLinkController.ts @@ -1,159 +1,285 @@ -// import { -// Controller, -// Get, -// Post, -// Put, -// Delete, -// Route, -// Security, -// Tags, -// Body, -// Path, -// Request, -// Example, -// SuccessResponse, -// Response, -// Query, -// } from "tsoa"; -// import { AppDataSource } from "../database/data-source"; -// import HttpSuccess from "../interfaces/http-success"; -// import HttpError from "../interfaces/http-error"; -// import { Like, Not } from "typeorm"; -// import HttpStatusCode from "../interfaces/http-status"; -// import { KpiLink, createKpiLink, updateKpiLink } from "../entities/kpiLink"; -// @Route("api/v1/kpi/link") -// @Tags("kpiLink") -// @Security("bearerAuth") -// @Response( -// HttpStatusCode.INTERNAL_SERVER_ERROR, -// "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", -// ) -// @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") -// export class kpiLinkController extends Controller { -// private kpiLinkRepository = AppDataSource.getRepository(KpiLink); +import { + Controller, + Get, + Post, + Put, + Delete, + Route, + Security, + Tags, + Body, + Path, + Request, + Example, + SuccessResponse, + Response, + Query, +} from "tsoa"; +import { AppDataSource } from "../database/data-source"; +import HttpSuccess from "../interfaces/http-success"; +import HttpError from "../interfaces/http-error"; +import { Like, Not, In, Brackets } from "typeorm"; +import HttpStatusCode from "../interfaces/http-status"; +import { KpiLink, createKpiLink, updateKpiLink } from "../entities/kpiLink"; +import { KpiGroup } from "../entities/kpiGroup"; +import { KpiCapacity } from "../entities/kpiCapacity"; +import { Position } from "../entities/position"; +@Route("api/v1/kpi/link") +@Tags("kpiLink") +@Security("bearerAuth") +@Response( + HttpStatusCode.INTERNAL_SERVER_ERROR, + "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", +) +@SuccessResponse(HttpStatusCode.OK, "สำเร็จ") +export class kpiLinkController extends Controller { + private kpiGroupRepository = AppDataSource.getRepository(KpiGroup); + private kpiLinkRepository = AppDataSource.getRepository(KpiLink); + private kpiCapacityRepository = AppDataSource.getRepository(KpiCapacity); + private positionRepository = AppDataSource.getRepository(Position); -// /** -// * API สร้างเชื่อมโยง -// * @param requestBody -// * @returns -// */ -// @Post() -// @Example({ -// nameLinkKPI: "string", //ชื่อเชื่อมโยง -// }) -// async createKpiLink( -// @Body() requestBody: createKpiLink, -// @Request() request: { user: Record }, -// ) { -// const kpiLink = Object.assign(new KpiLink(), requestBody); -// const chkkpinameLink = await this.kpiLinkRepository.findOne({ -// where: { -// nameLinkKPI: requestBody.nameLinkKPI, -// }, -// }); -// if (chkkpinameLink) { -// throw new HttpError(HttpStatusCode.NOT_FOUND, "ชื่อเชื่อมโยงนี้มีอยู่ในระบบแล้ว"); -// } -// kpiLink.createdUserId = request.user.sub; -// kpiLink.createdFullName = request.user.name; -// kpiLink.lastUpdateUserId = request.user.sub; -// kpiLink.lastUpdateFullName = request.user.name; -// await this.kpiLinkRepository.save(kpiLink); -// return new HttpSuccess(kpiLink.id); -// } + /** + * API สร้างเชื่อมโยง + * @param requestBody + * @returns + */ + @Post() + async createKpiLink( + @Body() requestBody: createKpiLink, + @Request() request: { user: Record }, + ) { + const chkkpiGroup = await this.kpiGroupRepository.findOne({ + where: { + id: requestBody.kpiGroupId, + }, + }); + + if (!chkkpiGroup) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการเชื่อมโยง"); + } + + const kpiLink = Object.assign(new KpiLink(), requestBody, { + createdUserId: request.user.sub, + createdFullName: request.user.name, + lastUpdateUserId: request.user.sub, + lastUpdateFullName: request.user.name, + kpiGroup: chkkpiGroup, + }); + await this.kpiLinkRepository.save(kpiLink); + + if (requestBody.positions != null) { + Promise.all( + requestBody.positions.map(async (positionName) => { + let position = new Position(); + position.name = positionName; + position.kpiLinkId = kpiLink.id; + position.createdUserId = request.user.sub; + position.createdFullName = request.user.name; + position.lastUpdateUserId = request.user.sub; + position.lastUpdateFullName = request.user.name; + await this.positionRepository.save(position); + }), + ); + } -// /** -// * API แก้ไขชื่อเชื่อมโยง -// * @param id ไอดีของเชื่อมโยง -// */ -// @Put("{id}") -// async updateKpiLink( -// @Path() id: string, -// @Body() requestBody: updateKpiLink, -// @Request() request: { user: Record }, -// ) { -// const kpiLink = await this.kpiLinkRepository.findOne({ -// where: { id: id }, -// }); -// if (!kpiLink) { -// throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลเชื่อมโยงนี้"); -// } + const chkCapacity = await this.kpiCapacityRepository.find({ + where: { + id: In(requestBody.kpiCapacityIds), + }, + }); + if (!chkCapacity) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการเชื่อมโยง"); + } + kpiLink.kpiCapacitys = chkCapacity; + + await this.kpiLinkRepository.save(kpiLink); -// const chkkpinameLink = await this.kpiLinkRepository.findOne({ -// where: { -// nameLinkKPI: requestBody.nameLinkKPI, -// }, -// }); -// if (chkkpinameLink) { -// throw new HttpError(HttpStatusCode.NOT_FOUND, "ชื่อเชื่อมโยงนี้มีอยู่ในระบบแล้ว"); -// } -// this.kpiLinkRepository.merge(kpiLink, requestBody); -// kpiLink.lastUpdateUserId = request.user.sub; -// kpiLink.lastUpdateFullName = request.user.name; -// await this.kpiLinkRepository.save(kpiLink); -// return new HttpSuccess(id); -// } + return new HttpSuccess(kpiLink.id); + } + -// /** -// * API ชื่อเชื่อมโยง -// * @param id -// */ -// @Get("{id}") -// @Example({ -// nameLinkKPI: "string", //ชื่อเชื่อมโยง -// }) -// async KpiLinkById(@Path() id: string) { -// const kpiLink = await this.kpiLinkRepository.findOne({ -// where: { id: id }, -// select: ["nameLinkKPI"], -// }); -// if (!kpiLink) { -// throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลเชื่อมโยงนี้"); -// } -// return new HttpSuccess(kpiLink); -// } + /** + * API แก้ไขเชื่อมโยง + * @param id ไอดีของเชื่อมโยง + */ + @Put("{id}") + async updateKpiLink( + @Path() id: string, + @Body() requestBody: createKpiLink, + @Request() request: { user: Record }, + ) { + const chkKpiLink = await this.kpiLinkRepository.findOne({ + where: { + id: id, + }, + relations: { + positions: true, + kpiCapacitys: true, + }, + }) + if (!chkKpiLink) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการเชื่อมโยง"); + } -// /** -// * API ลบเชื่อมโยง -// * @param id -// */ -// @Delete("{id}") -// async deleteKpiLink(@Path() id: string) { -// const kpiLink = await this.kpiLinkRepository.findOne({ -// where: { id: id }, -// }); -// if (!kpiLink) { -// throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลเชื่อมโยงนี้"); -// } + await this.positionRepository.remove(chkKpiLink.positions); + Object.assign(chkKpiLink, { + ...requestBody, + kpiCapacitys: [], + }); + chkKpiLink.kpiGroupId = requestBody.kpiGroupId, + chkKpiLink.lastUpdateUserId = request.user.sub; + chkKpiLink.lastUpdateFullName = request.user.name; + + if (requestBody.positions != null) { + Promise.all( + requestBody.positions.map(async (positionName) => { + let position = new Position(); + position.name = positionName; + position.kpiLinkId = chkKpiLink.id; + position.createdUserId = request.user.sub; + position.createdFullName = request.user.name; + position.lastUpdateUserId = request.user.sub; + position.lastUpdateFullName = request.user.name; + await this.positionRepository.save(position); + }), + ); + } -// await this.kpiLinkRepository.remove(kpiLink); -// return new HttpSuccess(); -// } + const chkCapacity = await this.kpiCapacityRepository.find({ + where: { + id: In(requestBody.kpiCapacityIds), + }, + }); + if (!chkCapacity) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการเชื่อมโยง"); + } + chkKpiLink.kpiCapacitys = chkCapacity; + + await this.kpiLinkRepository.save(chkKpiLink); -// /** -// * API list เชื่อมโยง -// * @param page -// * @param pageSize -// */ -// @Get() -// async listKpiLink( -// @Query("page") page: number = 1, -// @Query("pageSize") pageSize: number = 10, -// @Query("keyword") keyword?: string, -// ) { -// let whereClause: any = {}; + return new HttpSuccess(chkKpiLink.id); + } -// if (keyword !== undefined && keyword !== "") { -// whereClause = { -// where: [{ nameLinkKPI: Like(`%${keyword}%`) }], -// }; -// } + /** + * API เชื่อมโยง + * @param id + */ + @Get("{id}") + async KpiLinkById(@Path() id: string) { + const kpiLink = await this.kpiLinkRepository.findOne({ + where: { id: id }, + relations:["positions","kpiCapacitys","kpiGroup"], + order:{ + createdAt: "ASC" + } + }); + if (!kpiLink) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการเชื่อมโยง"); + } + const formattedResponse = { + id: kpiLink.id, + groupName: kpiLink.kpiGroup.nameGroupKPI, + positions: kpiLink.positions.map(position => ({ + id: position.id, + name: position.name + })), + capacitys: kpiLink.kpiCapacitys.map(capacity => ({ + id: capacity.id , + name: capacity.name, + type: capacity.type, + description: capacity.description + })) + }; + return new HttpSuccess(formattedResponse); + } -// const [kpiLink, total] = await this.kpiLinkRepository.findAndCount({ -// ...whereClause, -// ...(keyword ? {} : { skip: (page - 1) * pageSize, take: pageSize }), -// }); + /** + * API ลบเชื่อมโยง + * @param id + */ + @Delete("{id}") + async deleteKpiLink(@Path() id: string) { + const kpiLink = await this.kpiLinkRepository.findOne({ + where: { id: id }, + relations: ["kpiCapacitys"], + }); + if (!kpiLink) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการเชื่อมโยง"); + } + kpiLink.kpiCapacitys = []; + await this.kpiLinkRepository.save(kpiLink); -// return new HttpSuccess({ data: kpiLink, total }); -// } -// } + await this.positionRepository.delete({ kpiLinkId: id }); + await this.kpiLinkRepository.delete({ id: id }); + + return new HttpSuccess(); + } + + /** + * API list เชื่อมโยง + * @param page + * @param pageSize + */ + @Get() + async listKpiLink( + @Query("page") page: number = 1, + @Query("pageSize") pageSize: number = 10, + @Query("keyword") keyword?: string, + ) { + const [kpiLink , total] = await AppDataSource.getRepository(KpiLink) + .createQueryBuilder("kpiLink") + .leftJoinAndSelect("kpiLink.kpiGroup", "kpiGroup") + .leftJoinAndSelect("kpiLink.positions", "positions") + .leftJoinAndSelect("kpiLink.kpiCapacitys", "kpiCapacitys") + .andWhere( + new Brackets((qb) => { + qb.where( + keyword != null && keyword != "" + ? "kpiGroup.nameGroupKPI LIKE :keyword" + : "1=1", + { + keyword: `%${keyword}%`, + }, + ) + .orWhere( + keyword != null && keyword != "" + ? "positions.name LIKE :keyword" + : "1=1", + { + keyword: `%${keyword}%`, + }, + ) + .orWhere( + keyword != null && keyword != "" + ? "kpiCapacitys.name LIKE :keyword" + : "1=1", + { + keyword: `%${keyword}%`, + }, + ) + }), + ) + .skip((page - 1) * pageSize) + .take(pageSize) + .getManyAndCount(); + + if (!kpiLink) { + throw new HttpError(HttpStatusCode.NOT_FOUND, "ไม่พบข้อมูลการเชื่อมโยง"); + } + const formattedResponse = kpiLink.map((item) => ({ + id: item.id, + groupName: item.kpiGroup.nameGroupKPI, + positions: item.positions.map(position => ({ + id: position.id, + name: position.name + })), + capacitys: item.kpiCapacitys.map(capacity => ({ + id: capacity.id , + name: capacity.name, + type: capacity.type, + description: capacity.description + })) + })); + return new HttpSuccess({ data: formattedResponse, total }); + } +} diff --git a/src/controllers/KpiPlanController.ts b/src/controllers/KpiPlanController.ts index 7136b3e..128022b 100644 --- a/src/controllers/KpiPlanController.ts +++ b/src/controllers/KpiPlanController.ts @@ -274,9 +274,6 @@ export class kpiPlanController extends Controller { round: `${round?.trim().toUpperCase()}`, }, ) - .andWhere(keyword != undefined ? "kpiPlan.projectName LIKE :keyword" : "1=1", { - keyword: `%${keyword}%`, - }) .select([ "kpiPlan.id", "kpiPlan.year", diff --git a/src/controllers/KpiRoleController.ts b/src/controllers/KpiRoleController.ts index 406d7c2..0dfa513 100644 --- a/src/controllers/KpiRoleController.ts +++ b/src/controllers/KpiRoleController.ts @@ -193,6 +193,7 @@ export class kpiRoleController extends Controller { @Query("nodeId") nodeId?: string | null, @Query("node") node?: number | null, @Query("keyword") keyword?: string, + @Query("position") position?: string, ) { const [kpiRole, total] = await AppDataSource.getRepository(KpiRole) .createQueryBuilder("kpiRole") @@ -218,8 +219,8 @@ export class kpiRoleController extends Controller { round: `${round?.trim().toUpperCase()}`, }, ) - .andWhere(keyword != undefined ? "kpiRole.projectName LIKE :keyword" : "1=1", { - keyword: `%${keyword}%`, + .andWhere(position != undefined ? "kpiRole.position LIKE :position" : "1=1", { + position: `%${position}%`, }) .select([ "kpiRole.id", diff --git a/src/entities/kpiLink.ts b/src/entities/kpiLink.ts index 4741c86..d680b3c 100644 --- a/src/entities/kpiLink.ts +++ b/src/entities/kpiLink.ts @@ -23,3 +23,24 @@ export class KpiLink extends EntityBase { @OneToMany(() => Position, (position) => position.kpiLink) positions: Position[]; } +export class createKpiLink { + @Column() + kpiGroupId: string; + + @Column() + positions: string[]; + + @Column() + kpiCapacityIds: string[]; +} + +export class updateKpiLink { + @Column() + kpiGroupId: string; + + @Column() + positions: string[]; + + @Column() + kpiCapacityIds: string[]; +}